Debug
gnomeria/usbtree
Systematic root-cause debugging — reproduce, isolate, fix at the source, prove the fix.
Decides whether an OpenLogi device problem on macOS is a privacy-permission (TCC) problem, using agent log lines, and says which identity needs which grant.
$ npx skills add AprilNEA/OpenLogi --skill openlogi-macos-permissions -a claude-codeProject install by default; add -g for ~/.claude/skills/.
$ gh skill install AprilNEA/OpenLogi openlogi-macos-permissions --agent claude-codeProject scope by default; add --scope user for a personal install. Needs GitHub CLI 2.90.0 or later (public preview).
$ git clone --depth 1 https://github.com/AprilNEA/OpenLogi.git skills-src && mkdir -p .claude/skills && cp -r skills-src/.claude/skills/openlogi-macos-permissions .claude/skills/openlogi-macos-permissions && rm -rf skills-srcUse ~/.claude/skills/ instead of .claude/skills for a personal install. The folder must contain SKILL.md.
Claude Code skills documentation · loads skills from .claude/skills/
Install the "openlogi-macos-permissions" agent skill from https://github.com/AprilNEA/OpenLogi/tree/master/.claude/skills/openlogi-macos-permissions into .claude/skills/openlogi-macos-permissions/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "openlogi-macos-permissions", then confirm the skill loads.Claude Code copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$skill-installer install https://github.com/AprilNEA/OpenLogi/tree/master/.claude/skills/openlogi-macos-permissionsType this inside Codex. $skill-installer <name> installs a curated skill from openai/skills. The installer writes to $CODEX_HOME/skills (default ~/.codex/skills). Restart Codex if the skill does not show up.
$ npx skills add AprilNEA/OpenLogi --skill openlogi-macos-permissions -a codexProject install goes to .agents/skills/; add -g for ~/.codex/skills/.
$ gh skill install AprilNEA/OpenLogi openlogi-macos-permissions --agent codexProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/AprilNEA/OpenLogi.git skills-src && mkdir -p .agents/skills && cp -r skills-src/.claude/skills/openlogi-macos-permissions .agents/skills/openlogi-macos-permissions && rm -rf skills-srcUse ~/.agents/skills/ instead of .agents/skills for a personal install.
Codex skills documentation · loads skills from .agents/skills/
Install the "openlogi-macos-permissions" agent skill from https://github.com/AprilNEA/OpenLogi/tree/master/.claude/skills/openlogi-macos-permissions into .agents/skills/openlogi-macos-permissions/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "openlogi-macos-permissions", then confirm the skill loads.Codex copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ npx skills add AprilNEA/OpenLogi --skill openlogi-macos-permissions -a cursorProject install goes to .agents/skills/; add -g for ~/.cursor/skills/.
$ gh skill install AprilNEA/OpenLogi openlogi-macos-permissions --agent cursorProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/AprilNEA/OpenLogi.git skills-src && mkdir -p .cursor/skills && cp -r skills-src/.claude/skills/openlogi-macos-permissions .cursor/skills/openlogi-macos-permissions && rm -rf skills-srcUse ~/.cursor/skills/ instead of .cursor/skills for a personal install.
Cursor skills documentation · loads skills from .cursor/skills/, .agents/skills/, .claude/skills/, .codex/skills/
Install the "openlogi-macos-permissions" agent skill from https://github.com/AprilNEA/OpenLogi/tree/master/.claude/skills/openlogi-macos-permissions into .cursor/skills/openlogi-macos-permissions/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "openlogi-macos-permissions", then confirm the skill loads.Cursor copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ gemini skills install https://github.com/AprilNEA/OpenLogi.git --path .claude/skills/openlogi-macos-permissions--scope user (default) or --scope workspace; --path is the subfolder of the repo that holds the skill; --consent skips the security confirmation prompt.
$ npx skills add AprilNEA/OpenLogi --skill openlogi-macos-permissions -a gemini-cliProject install goes to .agents/skills/; add -g for ~/.gemini/skills/.
$ gh skill install AprilNEA/OpenLogi openlogi-macos-permissions --agent gemini-cliProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/AprilNEA/OpenLogi.git skills-src && mkdir -p .gemini/skills && cp -r skills-src/.claude/skills/openlogi-macos-permissions .gemini/skills/openlogi-macos-permissions && rm -rf skills-srcUse ~/.gemini/skills/ instead of .gemini/skills for a personal install, then run /skills reload.
Gemini CLI skills documentation · loads skills from .gemini/skills/, .agents/skills/
Install the "openlogi-macos-permissions" agent skill from https://github.com/AprilNEA/OpenLogi/tree/master/.claude/skills/openlogi-macos-permissions into .gemini/skills/openlogi-macos-permissions/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "openlogi-macos-permissions", then confirm the skill loads.Gemini CLI copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ gh skill install AprilNEA/OpenLogi openlogi-macos-permissionsInstalls for Copilot at project scope by default; add --scope user for a personal install. Preview a skill first with gh skill preview. Needs GitHub CLI 2.90.0 or later (public preview).
$ npx skills add AprilNEA/OpenLogi --skill openlogi-macos-permissions -a github-copilotProject install goes to .agents/skills/; add -g for ~/.copilot/skills/.
$ git clone --depth 1 https://github.com/AprilNEA/OpenLogi.git skills-src && mkdir -p .github/skills && cp -r skills-src/.claude/skills/openlogi-macos-permissions .github/skills/openlogi-macos-permissions && rm -rf skills-srcUse ~/.copilot/skills/ instead of .github/skills for a personal install. Commit .github/skills so cloud agent and code review can use it.
GitHub Copilot skills documentation · loads skills from .github/skills/, .claude/skills/, .agents/skills/
Install the "openlogi-macos-permissions" agent skill from https://github.com/AprilNEA/OpenLogi/tree/master/.claude/skills/openlogi-macos-permissions into .github/skills/openlogi-macos-permissions/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "openlogi-macos-permissions", then confirm the skill loads.GitHub Copilot copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ npx skills add AprilNEA/OpenLogi --skill openlogi-macos-permissions -a opencodeOpenCode documents no install command of its own. Project install goes to .agents/skills/; add -g for ~/.config/opencode/skills/.
$ gh skill install AprilNEA/OpenLogi openlogi-macos-permissions --agent opencodeProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/AprilNEA/OpenLogi.git skills-src && mkdir -p .opencode/skills && cp -r skills-src/.claude/skills/openlogi-macos-permissions .opencode/skills/openlogi-macos-permissions && rm -rf skills-srcUse ~/.config/opencode/skills/ instead of .opencode/skills for a personal install.
OpenCode skills documentation · loads skills from .opencode/skills/, .claude/skills/, .agents/skills/
Install the "openlogi-macos-permissions" agent skill from https://github.com/AprilNEA/OpenLogi/tree/master/.claude/skills/openlogi-macos-permissions into .opencode/skills/openlogi-macos-permissions/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "openlogi-macos-permissions", then confirm the skill loads.OpenCode copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
openlogi-macos-permissionsDecides whether an OpenLogi device problem on macOS is a privacy-permission (TCC) problem, using agent log lines, and says which identity needs which grant.
The guiding idea is that TCC authorizes identities, not processes, so a permission report is a claim rather than a root cause. Before anything else the agent classifies the failure by one question: did the HID++ channel open? A log line with zero candidate interfaces is an enumeration problem, an unsupported or disconnected device, and not TCC. A message that Input Monitoring is not granted is TCC, and the grant goes to the identity the skill names. A message that it is granted but the device cannot open points to another app holding the device, usually Logi Options+, or a stale permission session, and a successful open followed by timeouts is a probe or transport problem.
Most of these log lines are debug-level, so a log captured without `OPENLOGI_LOG=debug` cannot rule anything out, and with no log at all the first job is to get one. The agent also reads the stderr provenance of `openlogi list` to learn whether the result came from the running agent or from the CLI's own code-signing identity and HID stack before treating it as evidence. A bundled `scripts/diagnose.sh` helps collect information, and the skill is meant to be read before changing OpenLogi's permission code, the agent's launch path, the GUI's permission rows or the macOS bundling and signing code.
8 steps, taken from the step headings in SKILL.md.
Read from SKILL.md and the folder at commit ae91d50. It shows what the files ask for, not the result of running them.
Pre-approves nothing: there is no allowed-tools line, so your agent's usual permission prompts apply.
From allowed-tools in the SKILL.md frontmatter.
Ships 1 file in scripts/ (Shell), which the agent can run.
From the folder's file list and the shell code blocks in SKILL.md.
No URLs in SKILL.md.
From URLs in SKILL.md, links to its own repository left out.
Names no API keys, tokens, secrets or passwords.
From names ending in _API_KEY, _TOKEN, _SECRET, _KEY or _PASSWORD in SKILL.md.
OpenLogi macOS Permissions Triage loads about 2.5k tokens when it runs. Until then it costs about 184 tokens; SKILL.md has 1,307 words of instructions outside code blocks.
Estimates: characters ÷ 4, the usual rule of thumb; real counts depend on the model's tokenizer. Scripts and assets cost tokens only if the agent reads them.
The automated check noted patterns worth knowing about, such as sudo or a known installer.
sudo launchctl procinfo $(pgrep -x openlogi-agent) | grep -i responsibleAutomated static check — not a guarantee. Review scripts before installing. It scans the text of SKILL.md for risky patterns (piping downloads into a shell, reading credential files, hidden Unicode, destructive commands); the scripts in this folder are not scanned.
The full file from AprilNEA/OpenLogi at commit ae91d50, republished under its Apache-2.0 licence (© AprilNEA). 1,307 words, ~2,544 tokens.
.claude/skills/openlogi-macos-permissions/SKILL.md (or your agent's skills folder). This skill also uses 1 other file; get the full folder from GitHub.One sentence to keep: TCC does not authorize processes, it authorizes identities. A permission report is a claim, not a root cause. Identify the failing layer and the identity that performed the operation before diagnosing it.
Three unrelated failures reach the user as the same symptom (an empty device list). Classify before doing anything else. The discriminator is one log line: did the channel open?
| Agent log | Layer | TCC? |
|---|---|---|
HID++ candidate interfaces count=0 | enumeration | No. The device's HID++ collection never matched — unsupported device, or not connected. |
failed to open HID++ channel … Failed to open device: Input Monitoring is NOT granted to this process… | open | Yes. The message classifies itself — grant Input Monitoring to the identity named in §2. |
… Failed to open device: Input Monitoring is granted to this process — another app may hold the device exclusively, or macOS is serving a stale permission session (log out and back in) | open | The grant is fine. Quit the other app (usually Logi Options+), or log out and back in. See §5. |
opened HID++ channel … then Device::new failed / enumerate_features failed with Channel(Timeout) or report writer callback error: 0xE00002D6 | probe | No. The open succeeded, so investigate the probe/transport path, including the current status of upstream sidit77/async-hid#45. |
All of these lines are debug-level except the open failure, which is a
warn. A log captured without OPENLOGI_LOG=debug can only ever show the
middle row — in such a log, the absence of the other lines is not evidence
of anything.
Read openlogi list's stderr provenance before using its result:
(inventory read from the running agent) means the HID++ rows came from the
same agent snapshot the GUI consumes.(no agent reachable — reading hardware directly; …) or the protocol-version
note means the CLI used its own code-signing identity and HID stack because no
usable compatible agent snapshot was available.Camera enumeration is direct in both cases. Without the provenance, a device in
openlogi list is not evidence for or against the agent's TCC grant.
If there is no log at all, go to §3 — getting a log is the whole job.
The long-running app's HID and input grants belong to the agent. Direct CLI operations use the CLI's identity instead.
| Identity | Binary | Needs |
|---|---|---|
org.openlogi.agent | …/Contents/Library/LoginItems/OpenLogi Agent.app | Input Monitoring (opens HID) and Accessibility (owns the event tap) |
org.openlogi.openlogi | …/Contents/MacOS/openlogi-desktop | Camera only. It is a pure IPC client and needs neither of the above. |
openlogi | …/Contents/MacOS/openlogi (embedded CLI) | Input Monitoring only when list falls back to direct HID or a hardware diagnostic accesses HID directly |
org.openlogi.overlay | …/LoginItems/OpenLogiOverlay.app | Nothing |
Rules that drive most reports:
OpenLogiAgent.app; both are the same identity (org.openlogi.agent), and
the grant survived the rename because the path is not part of the designated
requirement. The System Settings + picker will not browse into a bundle, so
they have to use Go-to-Folder. Say this explicitly; do not tell someone to
"grant OpenLogi permission".org.openlogi.agent-dev), a
second install, or a bundle still sitting in ~/Downloads each get their own
row. Confirm which binary is actually running before trusting any grant — the
diagnose script warns when the running agent is not the one being inspected.Run scripts/diagnose.sh from this skill, or the same steps by hand. It is
read-only and safe to hand to a reporter.
Ask for the agent's log file first. launchd discards the agent's stderr, so the agent also writes a daily-rotated file (7 kept) a reporter can attach:
case ${XDG_STATE_HOME:-} in
/*) state_home=$XDG_STATE_HOME ;;
*) state_home=$HOME/.local/state ;;
esac
ls "$state_home/openlogi/"It carries panics too. Only when that file is missing or predates the failure is a foreground run worth its cost:
OPENLOGI_LOG=debug \
"/Applications/OpenLogi.app/Contents/Library/LoginItems/OpenLogi Agent.app/Contents/MacOS/openlogi-agent"Note what that costs: run from a terminal, the agent's responsible process becomes the terminal (§4), so the run you are observing is not the run that failed. Compare identities before concluding anything from it — in particular, a successful open under the terminal's grant does not clear the copy launchd runs.
Reading the TCC database directly is not an option for a normal user — it is
itself TCC-protected and returns authorization denied without Full Disk
Access.
macOS attributes a TCC request to the responsible process, which for a plain
child process is the parent. An agent spawned directly by the GUI therefore asks
with the GUI's identity, and the user's grant to OpenLogi Agent appears
to do nothing.
The launch paths that break the chain live in
openlogi-desktop/src/services/ipc/launch.rs and run in this order:
launchctl kickstart gui/<uid>/<service label>
(launchd spawns it directly: its own responsible process, plus crash
respawn from the service plist's KeepAlive). The registration itself is
SMAppService in openlogi-desktop/src/platform/registration/macos.rs, driven by
the launch_at_login setting./usr/bin/open -g -n <bundle>
(LaunchServices parents it under launchd, so it is its own responsible
process — but unsupervised)disclaim::Command (wraps
responsibility_spawnattrs_setdisclaim)Never spawn a helper with plain std::process::Command on macOS. Check with:
sudo launchctl procinfo $(pgrep -x openlogi-agent) | grep -i responsibleIt must name the agent itself. OpenLogi.app or Terminal.app there means
every grant on that machine is being ignored.
IOHIDCheckAccess — queries only. Never prompts, and never registers the
app in System Settings, so an app that only ever calls this cannot be
granted: the user has no row to tick.IOHIDRequestAccess — prompts. Blocks the calling thread until the user
answers, so it must not run on the async runtime. It is also not real-time:
after a grant or revoke the calling process keeps seeing the old answer until
it restarts. That is why the agent calls
binary_watch::relaunch_after_input_monitoring_grant().IOHIDDeviceOpen — denial is silent. There is no TCC-specific error, so
the transport pairs every open failure with
openlogi_hid::permissions::has_access() and says which case it is (§1).
Keep it that way: a bare Failed to open device is not reportable.disclaim leaves the agent
running under the GUI's identity, which is invisible until a user reports it.Verify production bundle identities step in .github/workflows/build.yml
is load-bearing; do not weaken it.--deep cannot give it one. See
xtask/src/commands/macos/bundle/signing.rs.Do not carry a "currently fixed/broken" snapshot in this skill. Query the current tracker and latest release notes, identify the reporter's release, and read the matching report, comments, current code, and logs. Treat the report's diagnosis as a claim until the provenance and direct evidence in §§1–4 establish the root cause. Re-check linked upstream transport issues before attributing a probe timeout to them.
Say so plainly rather than promising a fix:
+ picker not browsing into bundles.IOHIDDeviceOpen's silent denial — we can only infer it by checking access
separately.tccd decision that needs a full logout, or an MDM policy.© AprilNEA, Apache-2.0. Rendered from Markdown: HTML in the file is shown as text, images as links, and headings moved down two levels. Raw file
SKILL.md and 1 other file (scripts) in .claude/skills/openlogi-macos-permissions of AprilNEA/OpenLogi.
Open the folder on GitHubat commit ae91d50
OpenLogi macOS Permissions Triage next to the 5 skills that share the most tags, products or categories with it. Stars are the repository's; “used in” counts other GitHub owners with a copy.
| Skill | Stars | Used in | Tokens | Auto-check | Licence | Repo updated |
|---|---|---|---|---|---|---|
| OpenLogi macOS Permissions Triage this skillAprilNEA/OpenLogi | 23k | — | ~2.5k | Automated safety check: Notes | Apache-2.0 | |
| Debuggnomeria/usbtree | 691 | — | ~715 | Automated safety check: Pass | MIT | |
| Debug Like Expertglittercowboy/taches-cc-resources | 2k | — | ~2.8k | Automated safety check: Pass | MIT | |
| Bug Finder for daisyUIsaadeghi/daisyui | 43k | — | ~2.3k | Automated safety check: Pass | MIT | |
| Root Cause Debugginggarrytan/gstack | 136k | — | ~1.4k | Automated safety check: Pass | MIT | |
| Cmux Debugging Guidemanaflow-ai/cmux | 28k | 1 repos | ~1.1k | Automated safety check: Pass | Custom licence |
gnomeria/usbtree
Systematic root-cause debugging — reproduce, isolate, fix at the source, prove the fix.
glittercowboy/taches-cc-resources
Deep analysis debugging mode for complex issues. An agent skill from glittercowboy/taches-cc-resources.
saadeghi/daisyui
Investigates suspected bugs in the daisyUI monorepo through read-only analysis, then writes a decision-ready fix plan in tmp/bugs without changing any product code.
garrytan/gstack
Investigates bugs, errors and stack traces in phases and requires a root-cause hypothesis to be confirmed before any fix is written.
manaflow-ai/cmux
Covers debug logging, the Debug menu, profiling rules and runtime pitfalls for working on the cmux macOS terminal app.
codewhale-hq/Codewhale
Proves a Codewhale change in the real product: a stamped release build, an atomic local install, fresh-shell verification and manual QA that automated gates cannot cover.
AprilNEA/OpenLogi
Guides recording, privacy review and offline verification of OpenLogi device fixtures with the fixture contribute and verify commands, without treating replay as proof of hardware behavior.
AprilNEA/OpenLogi
Verifies OpenLogi's native GPUI interface with focused tests, the component gallery and a mock agent, choosing the evidence that fits each change.
AprilNEA/OpenLogi
Plans the smallest check that could disprove a code change in the OpenLogi project, then escalates through reproduction, focused tests and a final gate before a push.
AprilNEA/OpenLogi
Finds the first failing layer when an OpenLogi Logitech device is missing or misbehaving across enumeration, open, probe, IPC and UI.
Categories
Decides whether an OpenLogi device problem on macOS is a privacy-permission (TCC) problem, using agent log lines, and says which identity needs which grant. The guiding idea is that TCC authorizes identities, not processes, so a permission report is a claim rather than a root cause. Before anything else the agent classifies the failure by one question: did the HID++ channel open?
OpenLogi macOS Permissions Triage fits situations like: no devices appear in the GUI while `openlogi list` works; triaging a Failed to open device or Pairing failed report on macOS; working out which permission OpenLogi needs or why it never prompted; before changing OpenLogi's permission, launch or signing code.
Run `npx skills add AprilNEA/OpenLogi --skill openlogi-macos-permissions -a claude-code`. Or copy the skill folder (.claude/skills/openlogi-macos-permissions in AprilNEA/OpenLogi) into .claude/skills/openlogi-macos-permissions in your project. Claude Code loads it when a task matches its description.
Run `npx skills add AprilNEA/OpenLogi --skill openlogi-macos-permissions -a codex`. Or copy the skill folder (.claude/skills/openlogi-macos-permissions in AprilNEA/OpenLogi) into .agents/skills/openlogi-macos-permissions in your project. Codex loads it when a task matches its description.
Cursor, Gemini CLI, GitHub Copilot and OpenCode also load SKILL.md folders. With the skills CLI, run `npx skills add AprilNEA/OpenLogi --skill openlogi-macos-permissions -a cursor` (or -a gemini-cli, github-copilot or opencode for the others). To copy it by hand, put the folder in .cursor/skills/openlogi-macos-permissions, .gemini/skills/openlogi-macos-permissions, .github/skills/openlogi-macos-permissions and .opencode/skills/openlogi-macos-permissions in your project.
Going by SKILL.md and its folder, OpenLogi macOS Permissions Triage needs a shell for the scripts in its folder. Our summary lists: macOS, where OpenLogi's permission checks apply; The OpenLogi agent log, ideally captured with `OPENLOGI_LOG=debug`.
SKILL.md contains no URLs. Any network use would come from the scripts or tools the agent runs. This is read from the text; nothing was executed.
Our automated static check of SKILL.md found notes only (runs commands with sudo), nothing it rates as a warning. It is not a guarantee. The check reads SKILL.md only: the scripts in the folder are not scanned, so read them before running anything.
OpenLogi macOS Permissions Triage is published under the Apache-2.0 licence (the repository's licence). It allows redistribution, so the full SKILL.md is shown on this page.
About 2.5k tokens (SKILL.md is roughly 10k characters). Agents keep only the skill's name and description in context until a task matches; then they load SKILL.md in full.
Skills that share tags, products or a category with OpenLogi macOS Permissions Triage: Debug (gnomeria/usbtree, 691 stars), Debug Like Expert (glittercowboy/taches-cc-resources, 2k stars), Bug Finder for daisyUI (saadeghi/daisyui, 43k stars) and Root Cause Debugging (garrytan/gstack, 136k stars). The comparison table on this page puts their stars, adoption, token cost, safety result and licence side by side.
AprilNEA (a GitHub user) maintains it in AprilNEA/OpenLogi, which has 23,278 GitHub stars. The repository holds 5 skills in this directory. The repository was last updated on October 10, 2026.
Source: AprilNEA/OpenLogi on GitHub. Facts on this page come from the repository at the commit we read; the author's words are quoted as theirs.