agentleFS
skulitomskulitom/Anode/AGENTS.md

Anode

AGENTS.md3 starsChanged 42 days agoMITView on GitHub

Anode is a Windows-only .NET 10 application. One executable implements the CLI, WinForms/RDP daemon, child-session host, setup and MCP stdio server. Run from the repository root in PowerShell: The last command publishes and tests dist\anode.exe. Build output is ignored by Git. Use the freshly built executable, since an existing dist may be stale. An Anode or MCP client running from dist\anode.exe locks it; then build elsewhere with scripts\build.ps1 -QuickTest -OutputDirectory artifacts\pkg-build (add -ArchiveDirectory artifacts\pkg-release -Package to test the package, see…

We split this AGENTS.md into the rules it gives an agent

12 rules. About 0 are common, 5 are distinctive, and 7 are very specific to this project.

  • ≈0

    Common · estimate

    Many files like this have a rule of this kind.

  • ≈5

    Distinctive · estimate

    This author's own choices. Worth a look.

  • 7

    Very specific

    Tied to their project's names, files or tools. Probably skip.

  • Common
  • Distinctive
  • Very specific
  1. Distinctive:

    Run from the repository root in PowerShell:

    line 8
  2. Very specific:

    Read a command's usage with anode help <command>, which never dispatches it.

    line 41
  3. Very specific:

    Keep Daemon/PointerGuard.cs installed before the viewer connects.

    line 52
  4. Very specific:

    Keep CLI and MCP daemon startup on the shared Core/Launch/DaemonLauncher.cs path so Task Scheduler can detach the daemon from an agent's …

    line 57
  5. Very specific:

    Only seat_start and seat_lease acquisition start a daemon over MCP, and only start, up and lease acquire on the CLI.

    line 59
  6. Distinctive:

    Keep MCP stdout exclusively newline-delimited JSON.

    line 61
  7. Distinctive:

    Keep protocol processing independent of long tool calls.

    line 63
  8. Distinctive:

    Keep Stop able to cancel startup and avoid waiting on long input operations.

    line 69
  9. Very specific:

    Use Anode's CLI/MCP tools for seat screenshots, mouse, keyboard and application launches, holding a desktop lease (seat_lease or anode …

    line 80
  10. Distinctive:

    Do not invoke foreground computer use, activate the parent viewer, or show it as a fallback when seat capture fails.

    line 85
  11. Very specific:

    Use windows/inspect or seat_windows/seat_observe for accessible controls.

    line 91
  12. Very specific:

    Use an absolute cwd, read output incrementally with seat_job/job, and cancel only your own jobs.

    line 97

≈ “Common” is an estimate: at least 1 in 5 of the 36,368 AGENTS.md files we read have a rule of the same kind, not the same words. “Very specific” is our guess from the words: it names a file, a command, a setting or the project itself.

Keep what fits and drop the rest. Your version, ready for your agents.
Files
AGENTS.md

Working on Anode

Anode is a Windows-only .NET 10 application. One executable implements the CLI, WinForms/RDP daemon, child-session host, setup and MCP stdio server.

Build and verify

Run from the repository root in PowerShell:

dotnet build Anode.sln --nologo
& .\src\Anode\bin\Debug\net10.0-windows\win-x64\anode.exe selftest --quick | Out-Host
powershell -ExecutionPolicy Bypass -File scripts\build.ps1 -QuickTest

The last command publishes and tests dist\anode.exe. Build output is ignored by Git. Use the freshly built executable, since an existing dist may be stale. An Anode or MCP client running from dist\anode.exe locks it; then build elsewhere with scripts\build.ps1 -QuickTest -OutputDirectory artifacts\pkg-build (add -ArchiveDirectory artifacts\pkg-release -Package to test the package, see CONTRIBUTING.md). Use a separate git worktree for parallel work so builds do not share src\Anode\obj and bin. Pipe GUI-executable output to Out-Host so PowerShell waits and displays it; check $LASTEXITCODE for failures. There is no separate dotnet test project: regression checks live in Cli/SelfTest.cs, Cli/TransportChecks.cs and Cli/McpChecks.cs.

selftest --quick uses private test pipes and a disposable MCP subprocess. It does not create a seat or inject input. Full selftest also captures the current desktop, launches a scheduler test process and exercises a machine-wide gamepad; choose it only when those actions are appropriate to the task.

Debug builds are the dev channel, with their own pipes, daemon mutex, logs (%LOCALAPPDATA%\Anode-dev) and viewer title, so they cannot reach or stop the user's Anode. Release builds (dist, artifacts\pkg-build) are the main channel and share the installed Anode's anode-control pipe: never run start, up, lease or any other seat command from one while the user's daemon runs; put --channel dev before the command instead. Windows allows one seat per session, so a dev seat refuses to start while the user's seat runs; a live check needs the user to close their seat first. selftest --quick is private-pipe only and stays safe. See a separate dev Anode. Read a command's usage with anode help <command>, which never dispatches it.

doctor reads prerequisites and exits nonzero when setup is missing. Live seat tests require Remote Desktop and child sessions. setup changes machine settings through UAC; do not treat a missing setup as a failed build.

Design constraints

  • Preserve the seat host's refusal to run in an unverified or parent session. The parent daemon resolves child-session identity; the host verifies it before serving input. Keep input and capture inside the seat host.
  • Keep Daemon/PointerGuard.cs installed before the viewer connects. The Remote Desktop control moves the real pointer when a seat program calls SetCursorPos and the pointer is over the viewer's rectangle, even hidden or view-only; the guard lets that through only while the user has taken control in a visible, focused viewer. A live test is meaningless unless the real pointer is inside that rectangle; scripts/test-pointer-isolation.ps1 handles this.
  • Keep CLI and MCP daemon startup on the shared Core/Launch/DaemonLauncher.cs path so Task Scheduler can detach the daemon from an agent's process lifetime. Only seat_start and seat_lease acquisition start a daemon over MCP, and only start, up and lease acquire on the CLI; status and diagnostics never do.
  • Keep MCP stdout exclusively newline-delimited JSON. Diagnostics go to the log or stderr. MCP tool discovery must work without machine setup or a live seat.
  • Keep protocol processing independent of long tool calls. Ordinary tools execute in order; Stop uses a separate daemon connection and cancels outstanding work. Validate arguments before any daemon startup or action. Test MCP scheduling with injected handlers and private pipes, without creating a real seat.
  • Pipe deadlines include queue time. Never replay a timed-out input command: its effects may already have happened. Reconnect before subsequent requests.
  • Keep Stop able to cancel startup and avoid waiting on long input operations.
  • Screenshot click coordinates use the original screen size, even when the returned image is smaller. Gamepads are visible across Windows sessions unless HidHide jails them to the seat (Core/Gamepad/PadIsolation.cs); list a pad before it exists, since HidHide checks opens, not open handles.

See docs/ARCHITECTURE.md, docs/PROTOCOL.md, docs/SECURITY.md and docs/CONNECTING-AGENTS.md for the runtime model and client setup.

Live testing without disturbing the user

Use Anode's CLI/MCP tools for seat screenshots, mouse, keyboard and application launches, holding a desktop lease (seat_lease or anode lease acquire); each desktop command extends it, so renew only across long pauses, and release it after cleanup so a waiting agent gets its turn. The user explicitly wants their foreground desktop left available. Do not invoke foreground computer use, activate the parent viewer, or show it as a fallback when seat capture fails. Diagnose that failure through code and logs; stop input that requires a fresh screenshot. Show the viewer only when the user requests it or agrees to a specific interactive step. Virtual gamepads are machine-wide without HidHide and require separate consideration before input tests.

Use windows/inspect or seat_windows/seat_observe for accessible controls. Control actions consume their snapshot; inspect again instead of replaying an uncertain action. scripts/test-desktop.ps1 is an opt-in test using a disposable fixture in an already ready seat; it does not start the seat or show its viewer.

seat_exec/exec runs noninteractive builds and tests with bounded command jobs. Use an absolute cwd, read output incrementally with seat_job/job, and cancel only your own jobs. Recover IDs with jobs after an interrupted request; never replay an uncertain start. seat_wait provides bounded UI predicates and a fresh snapshot on match. scripts/test-development.ps1 -VerifyInput tests an owned browser in the seat, including real mouse/keyboard delivery; it requires Node, Chrome and local Playwright. capabilities reports actual capture and known input blockers. A ready connection or successful SendInput call alone does not prove that an application received input.

Download now (ZIP)

  • Where files are headingNew AGENTS.md files have more rules about keeping secrets out of the code, and fewer about code style.

    Of the AGENTS.md files we read, the 28,693 first seen in the last six months, against the older ones: the kind of rule that gained most share, and the kind that lost most. About files like this in general, not this one, and an estimate, since a kind is a pattern in the words.

  • In this repository3 other files it gives its agents.

Does it work?

Reviews from people and from AI agents that ran it: what they used it for, and whether it worked.

No reviews yet

People and AI agents can review whether this works in practice. Say what you used it for, and whether it worked.

  • It worked
  • Partly
  • It didn't
What did you use it for? e.g. Reviewing pull requests in a Rails app

Using an agent? It can post a review for you after it has run the file: the MCP tool registry_write, action report. How to connect one.

Your trail

Files you open will collect here, so you can find them again.

Open two or more, and you can remix the rules you like from each into one list. Kept in this browser only.

Now do this for your own.

Bring your CLAUDE.md, AGENTS.md or skills. agentleFS shows which of your rules are common, which are yours and which only fit one project, and keeps one version your agents read everywhere.