kendex / ui
AGENTS.md76 starsChanged 2 months agoMITView on GitHub
React 19, Tailwind v4, shadcn/ui and zustand, rendering state and invoking commands over src/bindings.ts. Domain logic and types live in Rust; nothing here decides.
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 31,542 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 repository38 other files it gives its agents.
- AGENTS.mdAGENTS.md
- crates/AGENTS.mdAGENTS.md
- .github/AGENTS.mdAGENTS.md
- hooks/AGENTS.mdAGENTS.md
- pi-extensions/AGENTS.mdAGENTS.md
- skills/AGENTS.mdAGENTS.md
- tools/AGENTS.mdAGENTS.md
- CLAUDE.mdCLAUDE.md
- crates/CLAUDE.mdCLAUDE.md
- .github/CLAUDE.mdCLAUDE.md
- hooks/CLAUDE.mdCLAUDE.md
- pi-extensions/CLAUDE.mdCLAUDE.md
- skills/CLAUDE.mdCLAUDE.md
- tools/CLAUDE.mdCLAUDE.md
- ui/CLAUDE.mdCLAUDE.md
- .github/copilot-instructions.mdCopilot instructions
- app-deploySkill
- bot-instructionsSkill
- code-qualitySkill
- commit-guardsSkill
- deciderSkill
- deep-researchSkill
- dep-radarSkill
- devSkill
- doc-limitsSkill
- docs-writingSkill
- githubSkill
- iced-rsSkill
- kendex-issuesSkill
- linearSkill
- orchSkill
- preflightSkill
- price-handlingSkill
- project-managementSkill
- reviewerSkill
- review-gateSkill
- second-opinionSkill
- worktreeSkill
The file
We split this AGENTS.md into the rules it gives an agent
1 rule. About 0 are common, 0 are distinctive, and 1 is very specific to this project.
≈0
Common · estimate
Many files like this have a rule of this kind.
≈0
Distinctive · estimate
This author's own choices. Worth a look.
1
Very specific
Tied to their project's names, files or tools. Probably skip.
- Common
- Distinctive
- Very specific
- Very specific: line 7
Every colour, space and radius is a design token.
≈ “Common” is an estimate: at least 1 in 5 of the 40,246 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.
Files
ui/
React 19, Tailwind v4, shadcn/ui and zustand, rendering state and invoking commands over src/bindings.ts. Domain logic and types live in Rust; nothing here decides.
src/bindings.tsis generated bycrates/app/tests/bindings.rsand never hand-edited;@tauri-appsis imported there and nowhere else (atools/guardlane).- A
Result-returning command answers through the bindings' runtime as{ status: "error" }for a refusal and a transport failure alike; a refusal is read throughsrc/lib/refusal.ts, never off its fields. A refusal that is an ANSWER, not a failure, draws a neutral line naming the control that lifts it and no retry, since asking again answers the same:src/lib/package-read-state.tsjudges that for the package page,src/lib/catalog-read-state.tsfor every other surface drawing one. - Every colour, space and radius is a design token; a raw hex, rgb or hsl literal under
src/fails atools/guardlane. Light, dark and system only, no themes. - Hue carries one meaning, which harness (
--harness-*); status keeps the semantic tokens and item kinds are told apart by icon.--customizedmarks where a package is changed, on the package page's header and the Customize surfaces; the Library list carries no customization mark, legend or colour. - Four type steps and no fifth: page title (24 semibold), section title (15 semibold), row label (14 medium), description (13 muted).
src/components/page-header.tsxowns the first,src/components/section.tsxthe rest. Not mechanically enforced. - Space groups things and boxes are for objects: a settings or detail surface is
SectionplusSettingRow, never a stack of cards; aCardis a discrete thing a person acts on as a unit; nesting stops at the card. - A border means actionable: buttons and inputs carry one, chips and badges are a quiet fill.
--muted-foregroundis never dimmed further with an opacity suffix. - Three surface planes back to front, sidebar, page, card; every page draws width and gutters from
src/lib/layout.ts, a reading measure or full width for a data-dense table. - One search box per page that lists things;
/focuses the one on screen or goes to the Library from a page with none. Location filtering belongs to the Library's Installed tab; every other page and tab shows every scope. - A section with nothing in it is not rendered; an empty state appears only when the page would otherwise be blank and its read is done. A failed read shows its error with a retry, kept figures headed as the last kendex could check, never a definite count. Enforced by
src/components/account-section.dom.test.tsx. - One model, stated in
src/lib/copy-model.tsand nowhere else: a place is the personal setup or a project, packages are installed into a place, a package names the marketplace it came from and the places it is in, and what a place does with a marketplace is settled on that place's card — never as a control beside the marketplace. - The guided install, the browse context, registering a project and the questions a write leaves behind are GUIDED-INSTALL.md, templates included.
- Package summaries come from
src/lib/package-identity.ts::summaryIndexfor observed copies andrecordedSummaryIndexfor records.useRecordedSummaryIndextakes the page's scope for a missing copy. Other shared selectors are in GUIDED-INSTALL.md § Shared selectors. - A marketplace is titled by the name its catalogue declares, then by the directory's label for a repository nobody subscribes to, then by the folder or repository it resolves to; a folder says
Local folderbeside its resolved path. The source alias is a per-place manifest key: it belongs in source details, never in a title, and.never stands as one. - A page under
useCatalogreads thedisplayit returns and resolves no title of its own, passing it to whatever it draws. Its own doc comment says why that hook holds both halves of a Community conversion. - A card standing for something openable is the open action: the whole card opens it through
src/lib/click-asks-to-open.ts, its name keeps a button of its own so the keyboard reaches it, and noOpenbutton stands beside them. Name, then description, then meta in a quieter step. - A fact a card states stays on screen even where it is also a link: a grid of cards is read by scanning, a count behind hover is a count nobody compares, and a pointer is not the only way in. A secondary action on the thing the card names — bookmark it, remove it — is separately focusable, never activates the card, and appears on hover or focus.
- Standing reads refresh through
src/lib/rescan.ts; no reader decides for itself when an install might have happened. - A row, card or chip that names a thing opens that thing: a package name opens its page, a safety score opens that page's Safety tab at the place whose copy the reading is of, a place opens the place, a marketplace opens the marketplace, a harness chip opens the harness. Secondary actions stay buttons, and no Open button repeats what the container already does — the one exception is a row whose own action is gone, where the button is the only route left and names where it goes. Every such surface takes
src/lib/opens-on-activate.ts::opensOnActivate, which puts the open on the pointer and on Enter, names the extra focus stop, and keeps the name a real control;src/lib/click-asks-to-open.tsstays the one predicate under it. The surface takes no widget role:role="button"around real buttons is invalid, and on a row it would replace the row semantics a screen reader navigates by. - A harness is a harness on screen, never a tool; in a table it is its mark, name on hover and for screen readers.
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
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.

