OpenLogi macOS Permissions Triage
AprilNEA/OpenLogi
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.
Inspect uniclipboard logs from BOTH the macOS host and the mounted Windows peer when debugging cross-platform sync, pairing, transfer, or daemon issues.
$ npx skills add UniClipboard/UniClipboard --skill dual-side-debug -a claude-codeProject install by default; add -g for ~/.claude/skills/.
$ gh skill install UniClipboard/UniClipboard dual-side-debug --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/UniClipboard/UniClipboard.git skills-src && mkdir -p .claude/skills && cp -r skills-src/.agents/skills/dual-side-debug .claude/skills/dual-side-debug && 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 "dual-side-debug" agent skill from https://github.com/UniClipboard/UniClipboard/tree/main/.agents/skills/dual-side-debug into .claude/skills/dual-side-debug/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "dual-side-debug", 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/UniClipboard/UniClipboard/tree/main/.agents/skills/dual-side-debugType 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 UniClipboard/UniClipboard --skill dual-side-debug -a codexProject install goes to .agents/skills/; add -g for ~/.codex/skills/.
$ gh skill install UniClipboard/UniClipboard dual-side-debug --agent codexProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/UniClipboard/UniClipboard.git skills-src && mkdir -p .agents/skills && cp -r skills-src/.agents/skills/dual-side-debug .agents/skills/dual-side-debug && rm -rf skills-srcUse ~/.agents/skills/ instead of .agents/skills for a personal install.
Codex skills documentation · loads skills from .agents/skills/
Install the "dual-side-debug" agent skill from https://github.com/UniClipboard/UniClipboard/tree/main/.agents/skills/dual-side-debug into .agents/skills/dual-side-debug/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "dual-side-debug", 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 UniClipboard/UniClipboard --skill dual-side-debug -a cursorProject install goes to .agents/skills/; add -g for ~/.cursor/skills/.
$ gh skill install UniClipboard/UniClipboard dual-side-debug --agent cursorProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/UniClipboard/UniClipboard.git skills-src && mkdir -p .cursor/skills && cp -r skills-src/.agents/skills/dual-side-debug .cursor/skills/dual-side-debug && 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 "dual-side-debug" agent skill from https://github.com/UniClipboard/UniClipboard/tree/main/.agents/skills/dual-side-debug into .cursor/skills/dual-side-debug/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "dual-side-debug", 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/UniClipboard/UniClipboard.git --path .agents/skills/dual-side-debug--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 UniClipboard/UniClipboard --skill dual-side-debug -a gemini-cliProject install goes to .agents/skills/; add -g for ~/.gemini/skills/.
$ gh skill install UniClipboard/UniClipboard dual-side-debug --agent gemini-cliProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/UniClipboard/UniClipboard.git skills-src && mkdir -p .gemini/skills && cp -r skills-src/.agents/skills/dual-side-debug .gemini/skills/dual-side-debug && 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 "dual-side-debug" agent skill from https://github.com/UniClipboard/UniClipboard/tree/main/.agents/skills/dual-side-debug into .gemini/skills/dual-side-debug/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "dual-side-debug", 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 UniClipboard/UniClipboard dual-side-debugInstalls 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 UniClipboard/UniClipboard --skill dual-side-debug -a github-copilotProject install goes to .agents/skills/; add -g for ~/.copilot/skills/.
$ git clone --depth 1 https://github.com/UniClipboard/UniClipboard.git skills-src && mkdir -p .github/skills && cp -r skills-src/.agents/skills/dual-side-debug .github/skills/dual-side-debug && 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 "dual-side-debug" agent skill from https://github.com/UniClipboard/UniClipboard/tree/main/.agents/skills/dual-side-debug into .github/skills/dual-side-debug/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "dual-side-debug", 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 UniClipboard/UniClipboard --skill dual-side-debug -a opencodeOpenCode documents no install command of its own. Project install goes to .agents/skills/; add -g for ~/.config/opencode/skills/.
$ gh skill install UniClipboard/UniClipboard dual-side-debug --agent opencodeProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/UniClipboard/UniClipboard.git skills-src && mkdir -p .opencode/skills && cp -r skills-src/.agents/skills/dual-side-debug .opencode/skills/dual-side-debug && 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 "dual-side-debug" agent skill from https://github.com/UniClipboard/UniClipboard/tree/main/.agents/skills/dual-side-debug into .opencode/skills/dual-side-debug/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "dual-side-debug", 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.
dual-side-debugInspect uniclipboard logs from BOTH the macOS host and the mounted Windows peer when debugging cross-platform sync, pairing, transfer, or daemon issues.
Dual Side Debug is an agent skill from UniClipboard/UniClipboard. Inspect uniclipboard logs from BOTH the macOS host and the mounted Windows peer when debugging cross-platform sync, pairing, transfer, or daemon issues. Use whenever the user asks to "check logs", "see what's happening on both sides", or describes a symptom that involves the Windows peer (e.g. "Windows didn't receive...", "Mac sent but...", pairing/transfer/sync failures during dual-side dev).
Its SKILL.md is about 2.6k tokens, which your agent loads only when the skill is triggered. The skill folder holds 2 other files (for example `dual-logs.sh` and `transfer-speed.sh`).
It sits in Development, covering Debugging. It works with macOS. The repository describes itself as: Real-time clipboard sync across all your devices — local-first, peer-to-peer, and end-to-end encrypted. No account. No cloud dependency. No central server. The licence is AGPL-3.0.
3 steps, taken from the first numbered list in SKILL.md.
Read from SKILL.md and the folder at commit 101ffb3. 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 script files (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.
Dual Side Debug loads about 2.6k tokens when it runs. Until then it costs about 103 tokens; SKILL.md has 1,255 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 found no risky patterns in SKILL.md.
Automated 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); files beside SKILL.md are not scanned.
The full file from UniClipboard/UniClipboard at commit 101ffb3, republished under its AGPL-3.0 licence (© UniClipboard). 1,255 words, ~2,650 tokens.
.claude/skills/dual-side-debug/SKILL.md (or your agent's skills folder). This skill also uses 2 other files; get the full folder from GitHub.Inspect logs from the macOS host and the Windows peer in a single, time-aligned view.
This project is a Go/Wails desktop app where two peers (macOS + Windows) sync clipboard / files over an iroh-based network. The Windows machine's AppData/Local is exposed to the Mac via SMB and mounted at /tmp/win-local/, so both sides' JSONL logs are reachable from this host.
The helper script lives at .agents/skills/dual-side-debug/dual-logs.sh. It is the only thing you should need to invoke for log work — do not hand-roll ls/tail/jq pipelines unless the script can't express what you need.
~/Library/Logs/app.uniclipboard.desktop[-<UC_PROFILE>]/uniclipboard-{gui,daemon,cli}.json.YYYY-MM-DD
— Apple convention (~/Library/Logs/<app>); the profile dir is the log dir, there is no logs/ subdir on macOS./tmp/win-local/app.uniclipboard.desktop[-<WIN_PROFILE>]/logs/uniclipboard-{gui,daemon,cli}.json.YYYY-MM-DD
— Windows keeps the logs/ subdir under the data-local app root.gui (Go/Wails host), daemon (uniclipd), cli (uniclip) — daily rotation, 7-day retention. dual-logs.sh picks the newest by mtime per side, i.e. the busiest process (usually the daemon for sync/pairing/transfer). The legacy single-file name uniclipboard.json.YYYY-MM-DD is still matched for old logs. For per-role single-host digging, use the local-log-debug skill instead.timestamp (UTC, ISO-8601 with Z, always the first field), level, target, message, span, device_id, plus structured fields....2026-04-25 can be the live file while it is still 2026-04-24 in PDT.The Windows logs only exist on this Mac because an SMB share is mounted from DESKTOP-HIC7MLI. The mount point is not auto-created — you must mkdir it first (otherwise mount_smbfs fails with No such file or directory), and the mount itself does not survive a reboot or a disconnect.
Before debugging, verify a mount exists:
mount | grep -E 'win-local|win-uniclipboard' || echo "no SMB mount yet"If nothing is mounted, stop and ask the user before running mount_smbfs — it prompts for the Windows password interactively and the agent shouldn't silently do credential prompts. Hand the user the exact commands and let them run via ! <cmd>.
AppData/Local at /tmp/win-localThis is what dual-logs.sh expects out of the box. It exposes every Windows uniclipboard profile dir at once, so you can switch profiles without re-mounting:
mkdir -p /tmp/win-local
mount_smbfs '//DESKTOP-HIC7MLI/Users/mark/AppData/Local' /tmp/win-localAfter mount you'll see dirs like /tmp/win-local/app.uniclipboard.desktop, /tmp/win-local/app.uniclipboard.desktop-dev, plus old version-suffixed ones. The script auto-detects the freshest one (see "Profile resolution" below).
/tmp/win-uniclipboardOlder sessions sometimes still use this — mounting only one profile dir directly. The script supports it via the WIN_LOGS env override (full-path bypass of $WIN_BASE):
mkdir -p /tmp/win-uniclipboard
mount_smbfs '//DESKTOP-HIC7MLI/Users/mark/AppData/Local/app.uniclipboard.desktop-<WIN_PROFILE>' /tmp/win-uniclipboard
# Then for every invocation:
WIN_LOGS=/tmp/win-uniclipboard/logs .agents/skills/dual-side-debug/dual-logs.sh statusPrefer the broad mount unless there's a specific reason — it pins you to one profile and requires re-mounting to switch.
If the mount is wedged (Finder hangs, ls blocks for 30s), unmount cleanly before re-mounting:
umount /tmp/win-local # or /tmp/win-uniclipboardIf umount fails because the path is busy, fall back to diskutil unmount force /tmp/win-local.
Mac and Windows each have their own active profile, and they are not always the same name. The script resolves each side independently.
Default is dev (package.json's wails:dev script sets UC_PROFILE=dev). Treat dev as the assumed Mac profile unless the user said otherwise. The user sometimes runs other profiles (a, b for wails:dev:profile a/b, or ad-hoc names like abc). Override with --profile <name>.
The script auto-detects the Windows profile by scanning $WIN_BASE for the profile dir whose latest log file has the newest mtime. This handles the common case where the Win side is on a different profile than the Mac side, without you having to know which one. Override with --win-profile <name> (or --win-profile default for the no-suffix app.uniclipboard.desktop dir).
status firstBefore answering any question that depends on log content, run:
.agents/skills/dual-side-debug/dual-logs.sh statusThen judge:
mtime close to "now" (live (<2m) or recent (<10m) is good; anything older means the process probably isn't running on that profile)?status output shows which profile was auto-detected and prints the alternatives sorted by mtime — sanity-check that it picked the one the user actually meant.If the assumed profile dir is missing, OR the freshness is stale / old / cold while the user is actively reproducing, stop and ask the user to confirm. Suggest a likely candidate from the available-profiles list. Example:
dev profile dir doesn't exist on Mac. The most recently active Mac profile is
abc(last write 30s ago). Should I useabc, or are you running with a differentUC_PROFILE?
Do not silently fall back. Wrong profile = looking at frozen logs from a previous session.
Always invoke via the script. From the project root:
.agents/skills/dual-side-debug/dual-logs.sh <command> [args]| Command | When to use |
|---|---|
status | First call of any debug session. Confirms profile + freshness on both sides. Shows which Win profile was auto-detected. |
list-profiles | When you suspect the user is on a profile other than dev. Defaults to both sides; use --side win for just the Windows list. |
paths | Just need the resolved file paths (e.g. to feed another tool). |
tail | Quick "what just happened" — defaults to last 50 lines, both sides. |
grep <pat> | Plain string match. Cheap; good first probe (e.g. an error message, a device id). |
query --filter | Structured jq filter against the JSONL. Best for level/target/span filters. |
merge | Time-interleave both sides into a single chronological stream. Use this whenever the question is "what happened between Mac and Windows around time X". |
--profile <name> — Mac profile override (default: dev).--win-profile <name> — Win profile override (default: auto-detected by mtime). Use default for the no-suffix dir.--side mac|win|both — restrict to one side.--lines N — output line cap.--since <ISO8601> (merge only) — drop lines older than this UTC timestamp.status. Confirm both sides are live; resolve any profile mismatch with the user before continuing.--since.merge --since <UTC> --lines 400 to see the cross-peer story.query --filter '. | select(.level=="ERROR" or .level=="WARN")' or filter by target (e.g. iroh::magicsock, pairing, transfer).These plug straight into query --filter '<jq>':
# Errors and warnings only
. | select(.level == "ERROR" or .level == "WARN")
# Restrict to one subsystem (substring match on target)
. | select(.target | test("pairing|setup|transfer"))
# A specific span chain
. | select(.span | test("handle_pong"))
# Around a particular device id
. | select(.device_id == "47a545ac-6d31-413c-b9fe-315ee4be0fb0")
# Compact projection for human reading
. | {ts: .timestamp, lvl: .level, tgt: .target, msg: .message, span}For the merged view (script already injects .side):
{ts: .timestamp, side: .side, lvl: .level, tgt: .target, msg: .message}cat whole log files — they're hundreds of MB.mtime may just mean the Windows app is paused.crates/AGENTS.md changes — fix dual-logs.sh first, then this doc.© UniClipboard, AGPL-3.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 2 other files in .agents/skills/dual-side-debug of UniClipboard/UniClipboard.
Open the folder on GitHubat commit 101ffb3
Dual Side Debug 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 |
|---|---|---|---|---|---|---|
| Dual Side Debug this skillUniClipboard/UniClipboard | 1.9k | — | ~2.6k | Automated safety check: Pass | AGPL-3.0 | |
| OpenLogi macOS Permissions TriageAprilNEA/OpenLogi | 23k | — | ~2.5k | Automated safety check: Notes | Apache-2.0 | |
| Cmux Debugging Guidemanaflow-ai/cmux | 28k | 1 repos | ~1.1k | Automated safety check: Pass | Custom licence | |
| Gearcoleco Debuggingdrhelius/Gearcoleco | 141 | — | ~3.5k | Automated safety check: Pass | GPL-3.0 | |
| OpenLogi Device DiagnosisAprilNEA/OpenLogi | 23k | — | ~1.6k | Automated safety check: Pass | Apache-2.0 | |
| App Screenshot Debugtermio-sh/termio | 540 | — | ~1.2k | Automated safety check: Pass | MIT |
AprilNEA/OpenLogi
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.
manaflow-ai/cmux
Covers debug logging, the Debug menu, profiling rules and runtime pitfalls for working on the cmux macOS terminal app.
drhelius/Gearcoleco
Debug and trace ColecoVision and Super Game Module games using the Gearcoleco emulator MCP server.
AprilNEA/OpenLogi
Finds the first failing layer when an OpenLogi Logitech device is missing or misbehaving across enumeration, open, probe, IPC and UI.
termio-sh/termio
Drive the running termio app via AppleScript / System Events to reach a UI state (focus the window, click a sidebar project, a terminal pane, a control), capture a pixel-accurate screenshot of just…
novotnyllc/dotnet-artisan
Debugs Windows and Linux/macOS applications (native, .NET/CLR, mixed-mode) with WinDbg MCP (crash dumps, !analyze, !syncblk, !dlk, !runaway, !dumpheap, !gcroot, BSOD), dotnet-dump, lldb with SOS…
UniClipboard/UniClipboard
Pick and install beUI (@beui) animated React components from the shadcn registry.
UniClipboard/UniClipboard
Push the current branch and open a GitHub pull request against main.
UniClipboard/UniClipboard
定期审计代码库的工程设计问题(高心智复杂度、单一真相源被破坏、catch-all 胖接口、死代码、散落魔法字面量、泄漏抽象、资源生命周期靠环形缓冲)与可优化点,范围限定为自上次审计以来的 git churn,每条发现都落到 file:line 并对照本项目自己的 VISION.md / 各级 AGENTS.md / memory…
UniClipboard/UniClipboard
Analyze the current branch's diff against main and determine which changes are testable via CLI-based end-to-end tests.
UniClipboard/UniClipboard
Drive the UniClipboard iOS app in a simulator and read its OSLog yourself to diagnose a mobile-sync bug, instead of asking the user to paste logs.
UniClipboard/UniClipboard
Record a lesson learned into crates/AGENTS.md (CONVENTIONS or ANTI-PATTERNS section).
Works with
Categories
Inspect uniclipboard logs from BOTH the macOS host and the mounted Windows peer when debugging cross-platform sync, pairing, transfer, or daemon issues. Dual Side Debug is an agent skill from UniClipboard/UniClipboard. Inspect uniclipboard logs from BOTH the macOS host and the mounted Windows peer when debugging cross-platform sync, pairing, transfer, or daemon issues.
Dual Side Debug fits situations like: the user asks to check logs; see whats happening on both sides; describes a symptom that involves the Windows peer (e.g.
Run `npx skills add UniClipboard/UniClipboard --skill dual-side-debug -a claude-code`. Or copy the skill folder (.agents/skills/dual-side-debug in UniClipboard/UniClipboard) into .claude/skills/dual-side-debug in your project. Claude Code loads it when a task matches its description.
Run `npx skills add UniClipboard/UniClipboard --skill dual-side-debug -a codex`. Or copy the skill folder (.agents/skills/dual-side-debug in UniClipboard/UniClipboard) into .agents/skills/dual-side-debug 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 UniClipboard/UniClipboard --skill dual-side-debug -a cursor` (or -a gemini-cli, github-copilot or opencode for the others). To copy it by hand, put the folder in .cursor/skills/dual-side-debug, .gemini/skills/dual-side-debug, .github/skills/dual-side-debug and .opencode/skills/dual-side-debug in your project.
Going by SKILL.md and its folder, Dual Side Debug needs a shell for the scripts in its folder. Our summary lists: A Bash shell.
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 no risky patterns, such as piping downloads into a shell, reading credential files or hidden Unicode. It is not a guarantee. Review the folder before installing.
Dual Side Debug is published under the AGPL-3.0 licence (the repository's licence). It allows redistribution, so the full SKILL.md is shown on this page.
About 2.6k tokens (SKILL.md is roughly 11k 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 Dual Side Debug: OpenLogi macOS Permissions Triage (AprilNEA/OpenLogi, 23k stars), Cmux Debugging Guide (manaflow-ai/cmux, 28k stars), Gearcoleco Debugging (drhelius/Gearcoleco, 141 stars) and OpenLogi Device Diagnosis (AprilNEA/OpenLogi, 23k stars). The comparison table on this page puts their stars, adoption, token cost, safety result and licence side by side.
UniClipboard (a GitHub organization) maintains it in UniClipboard/UniClipboard, which has 1,856 GitHub stars. The repository holds 24 skills in this directory. The repository was last updated on October 8, 2026.
Source: UniClipboard/UniClipboard on GitHub. Facts on this page come from the repository at the commit we read; the author's words are quoted as theirs.