Skip to content

fix: use XDG-compliant paths for OpenCode user scope installations#155

Open
trevor-vaughan wants to merge 1 commit into
LobsterTrap:mainfrom
trevor-vaughan:fix/opencode_paths
Open

fix: use XDG-compliant paths for OpenCode user scope installations#155
trevor-vaughan wants to merge 1 commit into
LobsterTrap:mainfrom
trevor-vaughan:fix/opencode_paths

Conversation

@trevor-vaughan
Copy link
Copy Markdown
Contributor

@trevor-vaughan trevor-vaughan commented May 21, 2026

Changes:

  • Added get_xdg_config_home() helper to config.py
  • Updated OpenCodeTarget to use XDG paths for user scope:
    • Commands: ~/.config/opencode/commands
    • Agents: ~/.config/opencode/agents
    • Instructions: ~/.config/opencode/AGENTS.md
    • MCP config: ~/.config/opencode/opencode.json
  • Updated tests to verify XDG-compliant paths
  • Project-scope paths unchanged (still use .opencode/ in project dir)

Fixes: #153

Checklist

  • Tests pass (pytest)
  • Linting passes (ruff check src tests)
  • Type checking passes (ty check)

AI Disclosure

AI Usage - Claude Sonnet 4.5 noreply@anthropic.com

Summary by CodeRabbit

  • New Features

    • User-scoped installs now use the platform-specific user config directory (respects XDG_CONFIG_HOME on Linux) instead of a hidden folder in the home directory; CLI supports user-scope install/uninstall.
  • Documentation

    • Installation and “Installation Scopes” docs updated with examples and platform paths for user vs project scope.
  • Tests

    • Added/expanded tests validating user config directory resolution across env/platform scenarios and updated user-scope path expectations.

Review Change Stack

@coderabbitai
Copy link
Copy Markdown

coderabbitai Bot commented May 21, 2026

Note

Reviews paused

It looks like this branch is under active development. To avoid overwhelming you with review comments due to an influx of new commits, CodeRabbit has automatically paused this review. You can configure this behavior by changing the reviews.auto_review.auto_pause_after_reviewed_commits setting.

Use the following commands to manage reviews:

  • @coderabbitai resume to resume automatic reviews.
  • @coderabbitai review to trigger a single review.

Use the checkboxes below for quick actions:

  • ▶️ Resume reviews
  • 🔍 Trigger review
📝 Walkthrough

Walkthrough

Replaces home-directory user paths with a platformdirs-backed user config directory: adds get_user_config_dir(), updates OpenCodeTarget to build user-scope paths from that directory, updates tests to validate custom/default/mocked bases, adds platformdirs dependency, and documents user vs project install scopes.

Changes

User config & OpenCode

Layer / File(s) Summary
PlatformDirs-backed config helper
src/lola/config.py
Adds PlatformDirs import and _PLATFORM_DIRS; exports get_user_config_dir() -> Path that returns the platform-appropriate user config dir.
OpenCodeTarget user-scope path updates
src/lola/targets/opencode.py
User-scoped get_command_path, get_agent_path, get_instructions_path, and get_mcp_path now use config.get_user_config_dir() / "opencode" / ... instead of Path.home() / ".opencode".
Tests: config and OpenCode path expectations
tests/test_opencode_target.py
Adds tests for get_user_config_dir() with and without XDG_CONFIG_HOME, a reload_config fixture, custom/default user-scope path tests, and a cross-platform parametrized test mocking _PLATFORM_DIRS.
Build deps and README updates
pyproject.toml, requirements.txt, requirements-dev.txt, README.md
Adds platformdirs>=4.0.0, pins platformdirs==4.9.2 in requirements, adjusts hatch version table format, updates README to document --scope user install/uninstall and platform user config locations.
sequenceDiagram
  participant CLI
  participant OpenCodeTarget
  participant get_user_config_dir
  participant Filesystem
  CLI->>OpenCodeTarget: request user-scope paths
  OpenCodeTarget->>get_user_config_dir: call get_user_config_dir()
  get_user_config_dir->>get_user_config_dir: read _PLATFORM_DIRS.user_config_dir
  get_user_config_dir-->>OpenCodeTarget: return Path(base)
  OpenCodeTarget->>Filesystem: append "opencode/commands|agents|AGENTS.md|opencode.json"
  OpenCodeTarget-->>CLI: return absolute paths
Loading

🎯 3 (Moderate) | ⏱️ ~20 minutes

"I nibble through env vars by night,
Finding config roots just right.
From hidden dots to platform glow,
I hop where opencode files should go.
A rabbit cheers — tidy flow!"

🚥 Pre-merge checks | ✅ 4 | ❌ 1

❌ Failed checks (1 warning)

Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 71.43% which is insufficient. The required threshold is 80.00%. Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (4 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed The title 'fix: use XDG-compliant paths for OpenCode user scope installations' accurately summarizes the main change: converting OpenCode user-scope paths from ~/.opencode/ to XDG-compliant $XDG_CONFIG_HOME/opencode/ locations.
Linked Issues check ✅ Passed All coding requirements from issue #153 are met: get_user_config_dir() helper added, OpenCodeTarget updated to use XDG paths for user scope (commands, agents, instructions, MCP config), project scope unchanged, and comprehensive test coverage added.
Out of Scope Changes check ✅ Passed All changes are directly related to fixing XDG compliance for OpenCode user-scope paths: config module updates, OpenCodeTarget refactoring, comprehensive tests, documentation (README), and dependency updates (platformdirs). No unrelated changes detected.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.

✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

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

Copy link
Copy Markdown

@coderabbitai coderabbitai Bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🧹 Nitpick comments (2)
src/lola/config.py (1)

34-36: ⚡ Quick win

Verify XDG_CONFIG_HOME is an absolute path.

The XDG Base Directory Specification requires $XDG_CONFIG_HOME to be an absolute path. If a relative path is provided, the current implementation will use it as-is, which violates the spec and could lead to unexpected behavior.

🛡️ Proposed fix to validate absolute path
 def get_xdg_config_home() -> Path:
     """Get XDG config home directory.
 
     Returns $XDG_CONFIG_HOME if set, otherwise $HOME/.config
     """
     xdg_config = os.environ.get("XDG_CONFIG_HOME")
     if xdg_config:
-        return Path(xdg_config)
+        path = Path(xdg_config)
+        if path.is_absolute():
+            return path
     return Path.home() / ".config"

As per coding guidelines, use Python 3.13 with modern type hints and pathlib for file operations.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@src/lola/config.py` around lines 34 - 36, Validate that the XDG_CONFIG_HOME
value is an absolute path before returning it: when reading the xdg_config
environment variable, convert it to a pathlib.Path and check .is_absolute();
only return Path(xdg_config) if it is absolute, otherwise treat it as unset and
fall through to the existing fallback logic (do not return or use a relative
path). Update the code around the xdg_config handling (the xdg_config variable
and its return) to perform this check using pathlib.Path and modern type hints
where appropriate.
tests/test_opencode_target.py (1)

3-3: ⚡ Quick win

Remove unused import.

The os module is imported but never used in this file. All environment variable operations use monkeypatch and all path operations use pathlib.Path.

♻️ Remove unused import
-import os
 from pathlib import Path
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@tests/test_opencode_target.py` at line 3, Remove the unused top-level import
"import os" from the test module — the file only uses monkeypatch and
pathlib.Path for env and path operations, so delete the "import os" line to
eliminate the unused import warning.
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Nitpick comments:
In `@src/lola/config.py`:
- Around line 34-36: Validate that the XDG_CONFIG_HOME value is an absolute path
before returning it: when reading the xdg_config environment variable, convert
it to a pathlib.Path and check .is_absolute(); only return Path(xdg_config) if
it is absolute, otherwise treat it as unset and fall through to the existing
fallback logic (do not return or use a relative path). Update the code around
the xdg_config handling (the xdg_config variable and its return) to perform this
check using pathlib.Path and modern type hints where appropriate.

In `@tests/test_opencode_target.py`:
- Line 3: Remove the unused top-level import "import os" from the test module —
the file only uses monkeypatch and pathlib.Path for env and path operations, so
delete the "import os" line to eliminate the unused import warning.

ℹ️ Review info
⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro

Run ID: 9a8e3d48-d4c2-406d-8fa9-e3e942de8de1

📥 Commits

Reviewing files that changed from the base of the PR and between 560efa3 and 440a4e4.

📒 Files selected for processing (3)
  • src/lola/config.py
  • src/lola/targets/opencode.py
  • tests/test_opencode_target.py

Copy link
Copy Markdown

@coderabbitai coderabbitai Bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 1

🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In `@src/lola/config.py`:
- Around line 29-37: get_xdg_config_home currently accepts any truthy
XDG_CONFIG_HOME (including blank/relative values); update it to only use
XDG_CONFIG_HOME if it's a non-empty, non-whitespace string and represents an
absolute path. In the get_xdg_config_home function, read
os.environ.get("XDG_CONFIG_HOME"), ensure you call .strip() to reject
whitespace-only values and then construct a Path and check .is_absolute(); if
both checks pass return that Path, otherwise fall back to Path.home() /
".config".
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro

Run ID: 34280a46-4b1f-4405-b419-c5893efc00d6

📥 Commits

Reviewing files that changed from the base of the PR and between 440a4e4 and 4d06cca.

📒 Files selected for processing (3)
  • src/lola/config.py
  • src/lola/targets/opencode.py
  • tests/test_opencode_target.py

Comment thread src/lola/config.py Outdated
Copy link
Copy Markdown

@coderabbitai coderabbitai Bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 2

Caution

Some comments are outside the diff and can’t be posted inline due to platform limitations.

⚠️ Outside diff range comments (1)
src/lola/config.py (1)

8-41: ⚠️ Potential issue | 🟡 Minor | ⚡ Quick win

Run Ruff formatting for this file before merge.

CI is currently failing ruff format --check for src/lola/config.py.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@src/lola/config.py` around lines 8 - 41, CI fails ruff format for
src/lola/config.py; run ruff's auto-formatter to fix style issues. Run `ruff
format src/lola/config.py` (or `ruff format .`) and commit the resulting
changes, making sure the module-level constants (LOLA_HOME, MODULES_DIR,
INSTALLED_FILE, MARKET_DIR, CACHE_DIR, SKILL_FILE, MCPS_FILE, _PLATFORM_DIRS)
and the get_user_config_dir function/docstring remain semantically identical
after formatting; then re-run `ruff check` to confirm the file passes.
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In `@src/lola/config.py`:
- Around line 34-39: Update the docstring for the function that returns the user
configuration directory (the one whose docstring begins "Get user configuration
directory using platform conventions") to state that the function returns an
application-specific config path (it appends the app folder "opencode" to the
platform config root), and replace the generic platform root examples with
app-specific examples (e.g., Linux: ~/.config/opencode, macOS:
~/Library/Application Support/opencode, Windows: %APPDATA%\\opencode) so the
description matches the actual return value.

In `@tests/test_opencode_target.py`:
- Around line 4-159: The file tests/test_opencode_target.py fails ruff
formatting; run ruff format (or your project's pre-commit formatter) on that
file to fix style issues and re-run checks. Open tests/test_opencode_target.py
(containing tests like test_get_user_config_dir_with_xdg_env_set, the
reload_config fixture, and the parameterized test_opencode_paths_cross_platform)
and apply ruff format --fix or ruff format tests/test_opencode_target.py, then
commit the reformatted file so Ruff's --check will pass in CI.

---

Outside diff comments:
In `@src/lola/config.py`:
- Around line 8-41: CI fails ruff format for src/lola/config.py; run ruff's
auto-formatter to fix style issues. Run `ruff format src/lola/config.py` (or
`ruff format .`) and commit the resulting changes, making sure the module-level
constants (LOLA_HOME, MODULES_DIR, INSTALLED_FILE, MARKET_DIR, CACHE_DIR,
SKILL_FILE, MCPS_FILE, _PLATFORM_DIRS) and the get_user_config_dir
function/docstring remain semantically identical after formatting; then re-run
`ruff check` to confirm the file passes.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro

Run ID: 83751c98-a30f-4631-8188-ce68d2db1f88

📥 Commits

Reviewing files that changed from the base of the PR and between 4d06cca and da93494.

⛔ Files ignored due to path filters (1)
  • uv.lock is excluded by !**/*.lock
📒 Files selected for processing (5)
  • README.md
  • pyproject.toml
  • src/lola/config.py
  • src/lola/targets/opencode.py
  • tests/test_opencode_target.py
✅ Files skipped from review due to trivial changes (1)
  • README.md

Comment thread src/lola/config.py
Comment on lines +34 to +39
"""Get user configuration directory using platform conventions.

Returns platform-appropriate config directory:
- Linux/Unix: ~/.config
- macOS: ~/Library/Application Support
- Windows: %APPDATA%
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟡 Minor | ⚡ Quick win

Correct the return-path description in this docstring.

The function returns an app-specific directory (includes opencode), but the examples currently describe only parent config roots.

Suggested docstring fix
 def get_user_config_dir() -> Path:
     """Get user configuration directory using platform conventions.
-    
-    Returns platform-appropriate config directory:
-    - Linux/Unix: ~/.config
-    - macOS: ~/Library/Application Support  
-    - Windows: %APPDATA%
+
+    Returns platform-appropriate app config directory for OpenCode:
+    - Linux/Unix: ~/.config/opencode
+    - macOS: ~/Library/Application Support/opencode
+    - Windows: %APPDATA%\\opencode
     """
     return Path(_PLATFORM_DIRS.user_config_dir)
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@src/lola/config.py` around lines 34 - 39, Update the docstring for the
function that returns the user configuration directory (the one whose docstring
begins "Get user configuration directory using platform conventions") to state
that the function returns an application-specific config path (it appends the
app folder "opencode" to the platform config root), and replace the generic
platform root examples with app-specific examples (e.g., Linux:
~/.config/opencode, macOS: ~/Library/Application Support/opencode, Windows:
%APPDATA%\\opencode) so the description matches the actual return value.

Comment thread tests/test_opencode_target.py
Copy link
Copy Markdown

@coderabbitai coderabbitai Bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 1

Caution

Some comments are outside the diff and can’t be posted inline due to platform limitations.

⚠️ Outside diff range comments (1)
requirements.txt (1)

1-3: ⚠️ Potential issue | 🟠 Major | ⚡ Quick win

Regenerate exported requirements artifacts to clear CI blocker.

CI is currently failing because requirements.txt/requirements-dev.txt are not in sync with lock data. Please re-export and commit both generated files.

Regeneration commands
uv export --frozen --no-dev --output-file=requirements.txt
uv export --frozen --output-file=requirements-dev.txt

Also applies to: 32-35

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@requirements.txt` around lines 1 - 3, CI is failing because the committed
requirements artifacts are out of sync with the lockfile; re-export both
dependency artifacts and commit them: run "uv export --frozen --no-dev
--output-file=requirements.txt" to regenerate requirements.txt and "uv export
--frozen --output-file=requirements-dev.txt" to regenerate requirements-dev.txt
(as suggested in the review), verify the diffs, and commit the updated
requirements.txt and requirements-dev.txt so the repo and CI use the updated
lock data.
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In `@tests/test_opencode_target.py`:
- Line 100: The tests use string endswith with forward slashes
(str(path).endswith("opencode/commands")), which breaks on Windows; update the
assertions to be path-separator-agnostic by using Path semantics (e.g., compare
tail segments via path.parts or construct a Path for the suffix). Replace the
current endswith assertion on the variable path with something like
tuple(path.parts[-2:]) == ("opencode", "commands") (and similarly for the other
three occurrences) so the tests pass on all platforms.

---

Outside diff comments:
In `@requirements.txt`:
- Around line 1-3: CI is failing because the committed requirements artifacts
are out of sync with the lockfile; re-export both dependency artifacts and
commit them: run "uv export --frozen --no-dev --output-file=requirements.txt" to
regenerate requirements.txt and "uv export --frozen
--output-file=requirements-dev.txt" to regenerate requirements-dev.txt (as
suggested in the review), verify the diffs, and commit the updated
requirements.txt and requirements-dev.txt so the repo and CI use the updated
lock data.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro

Run ID: a1c26724-30ee-47e9-9e92-aef8ef8b525c

📥 Commits

Reviewing files that changed from the base of the PR and between da93494 and 6f9954e.

⛔ Files ignored due to path filters (1)
  • uv.lock is excluded by !**/*.lock
📒 Files selected for processing (6)
  • README.md
  • pyproject.toml
  • requirements.txt
  • src/lola/config.py
  • src/lola/targets/opencode.py
  • tests/test_opencode_target.py
✅ Files skipped from review due to trivial changes (2)
  • pyproject.toml
  • README.md

path = target.get_command_path("/home/user/project", "user")
assert path == Path.home() / ".opencode" / "commands"
# Should use platformdirs default - ends with opencode/commands
assert str(path).endswith("opencode/commands")
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟡 Minor | ⚡ Quick win

Make platform-default path assertions separator-agnostic.

Using str(path).endswith("opencode/...") is fragile on Windows. Line 100, Line 111, Line 124, and Line 135 should assert with Path semantics instead of hardcoded /.

Suggested test-safe assertion update
-    assert str(path).endswith("opencode/commands")
+    assert path.parts[-2:] == ("opencode", "commands")
@@
-    assert str(path).endswith("opencode/agents")
+    assert path.parts[-2:] == ("opencode", "agents")
@@
-    assert str(path).endswith("opencode/AGENTS.md")
+    assert path.parts[-2:] == ("opencode", "AGENTS.md")
@@
-    assert str(path).endswith("opencode/opencode.json")
+    assert path.parts[-2:] == ("opencode", "opencode.json")

Also applies to: 111-111, 124-124, 135-135

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@tests/test_opencode_target.py` at line 100, The tests use string endswith
with forward slashes (str(path).endswith("opencode/commands")), which breaks on
Windows; update the assertions to be path-separator-agnostic by using Path
semantics (e.g., compare tail segments via path.parts or construct a Path for
the suffix). Replace the current endswith assertion on the variable path with
something like tuple(path.parts[-2:]) == ("opencode", "commands") (and similarly
for the other three occurrences) so the tests pass on all platforms.

Copy link
Copy Markdown

@coderabbitai coderabbitai Bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 1

🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In `@requirements.txt`:
- Around line 32-35: The CI is failing because exported requirements are stale;
re-run the dependency export/update step to regenerate the pinned lockfiles so
requirements.txt (this file) and requirements-dev.txt match the current
pyproject.toml, then commit the updated files; ensure you run the same export
command used by the repo’s check-requirements job (or the project’s export
script) so platformdirs and other hashes are recalculated and the
check-requirements CI job passes.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro

Run ID: 8f0d3813-e58a-4d79-baca-23372ebb707e

📥 Commits

Reviewing files that changed from the base of the PR and between 6f9954e and 42daaec.

⛔ Files ignored due to path filters (1)
  • uv.lock is excluded by !**/*.lock
📒 Files selected for processing (7)
  • README.md
  • pyproject.toml
  • requirements-dev.txt
  • requirements.txt
  • src/lola/config.py
  • src/lola/targets/opencode.py
  • tests/test_opencode_target.py
✅ Files skipped from review due to trivial changes (2)
  • README.md
  • requirements-dev.txt

Comment thread requirements.txt
Replace hardcoded ~/.opencode/ paths with platform-native config
directories. User-scope installations now land in ~/.config/opencode/
on Linux, ~/Library/Application Support/opencode/ on macOS, and
%APPDATA%\opencode\ on Windows.

- Add platformdirs>=4.0.0 dependency and get_user_config_dir() helper
  in config.py
- Update OpenCodeTarget path methods to use platformdirs for user scope
- Fix mod rm not passing scope to get_skill_path(), which made
  user-scope skill uninstalls target the wrong directory
- Rewrite test_opencode_target.py with XDG override, platform default,
  and cross-platform parametrized cases
- Add test verifying mod rm forwards scope correctly

Details:

Build/project config:
- Add build, test, install, uninstall targets to Makefile
- Fix hatch-vcs git_describe_command to match only v*.*.* tags

Documentation:
- Document --scope user flag and platform-specific paths in README
- Add Installation Scopes section with per-platform path table

Fixes: LobsterTrap#153

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
@mrbrandao mrbrandao added documentation Improvements or additions to documentation enhancement New feature or request good first issue Good for newcomers bug Something isn't working and removed enhancement New feature or request labels May 25, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

bug Something isn't working documentation Improvements or additions to documentation good first issue Good for newcomers

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[BUG] - OpenCode Non-XDG-Compliant Installation Paths

2 participants