Getting it into your agent
One page per mod, every tool's command on it. A separate URL per tool would split the same page into five that compete with each other.
git clone --depth 1 https://github.com/coddy-project/coddy-agentWrote this? Show the measurements
A badge with what this costs and how it scanned, read live from this page, so it follows the numbers instead of freezing them. Markdown for a README, HTML for a documentation site or a project page.
[](https://agentmods.dev/rules/coddy-project/coddy-agent/core-modules)<a href="https://agentmods.dev/rules/coddy-project/coddy-agent/core-modules"><img src="https://agentmods.dev/badge/rules/coddy-project/coddy-agent/core-modules/github.svg" alt="Measured on agentmods" height="20"></a>Or the 80×15 button, for a site that already has a row of RSS and ATOM ones. Only the verdict fits; the numbers stay here.
<a href="https://agentmods.dev/rules/coddy-project/coddy-agent/core-modules"><img src="https://agentmods.dev/badge/rules/coddy-project/coddy-agent/core-modules.svg" alt="Reviewed on agentmods" width="80" height="20"></a>What it costs to keep this loaded
Counted locally with the o200k_base tokenizer, which is exact for GPT models; Claude uses its own tokenizer and its counts differ. Treat this as one consistent yardstick across the catalogue rather than a bill. Prices are per million input tokens.
| Model | Per session | Once invoked |
|---|---|---|
| Fable 5.1 | $0.00000 | $0.04077 |
| Opus 5.5 | $0.00000 | $0.01631 |
| Sonnet 5.5 | $0.00000 | $0.00815 |
| Haiku 4.5 | $0.00000 | $0.00408 |
Grade A, and why
core-modules scanned grade A with 0 findings against 26 rules in 11 categories — prompt injection, anti-refusal, data exfiltration, privilege escalation, supply chain, agent snooping, system-prompt leakage, SSRF and excessive agency — measured 7d ago.
A static scan of the body, not an audit. Every finding is printed with the line that produced it so you can judge whether it matters here. A mod is markdown that instructs an agent; that is exactly why what it instructs is worth reading.
Nothing flagged
None of the 26 patterns this scan looks for appear in this file: no shell pipes, no recursive deletes, no credential paths, no hidden text, no instruction-override or anti-refusal phrasing, no agent-config snooping. That is not a guarantee, it is the absence of the things that are checkable.
How it starts
The opening of the file, as written. The whole thing — 28 lines — stays where its author put it; the contents beside it link to each section on GitHub.
Core modules (sketch)
internal/acp- ACP RPC server, session lifecycle from editors.internal/agent- tool loop and LLM turns.internal/session- session manager and mode (agent/plan/ask).internal/config- YAML and flags, plus theFileWatcher(watch.go) that installs aconfig.yamlsomebody else changed into a running process: a stat gate,LoadWithPaths, the process overrides re-applied throughAdjust, and a marshal-comparison against the live document so a save this process made itself, a comment or a reordered key announces nothing.coddy servepoints it atsession.Manager.ReplaceConfig, which is the one choke point every surface already observes.internal/tools- filesystem, shell, todo, MCP merge, etc. Shell also owns the background task family (run_commandbackground: trueplusbackground_list/background_output/background_wait/background_stop), backed byinternal/bgtask. Seedocs/features/background-tasks.md.internal/tools/previewis thepreview_servertool: a static file server over a project directory on a free localhost port, run on goroutines as aKindServertask of the same pool (no hard timeout unless the call names one). Seedocs/features/preview-server.md.internal/mcp- MCP transports (client.go,remote.go,connect.go; every value of a declaration resolves throughconfig.ExpandMCPValue-${CWD},${NAME}from the environment - the same in every file), the merged server list with scope/origin labels (manage.go:<home>/mcp.jsonand the project's.coddy/mcp.json, neverconfig.yaml, whose oldmcp_serverskeyinternal/config/legacy_keys.gomoves into the home file on load;session.Managerwatches the home file and reconciles changed servers throughReloadMCPDeclarations), and the workspace trust gate for project-local.coddy/mcp.json(trust.go,gate.go). That file arrives with the checkout, so its declarations are not started or contacted until the operator approves that exact declaration for that workspace: policymcp.project_trust(askdefault /allow/deny), approvals in<home>/mcp-trust.jsonkeyed by canonical workspace + declaration digest. Every connect or probe of a configured server must go throughTrustGate.Acquire/TrustGate.ProbeShared(sessions, through the manager'sPool) orTrustGate.Connect/TrustGate.Probe(they re-check immediately before the spawn); ACP client-supplied servers are the only ones that skip the gate, and they still go through the pool (Pool.Acquire). Sessions never own a server:pool.goshares one connection per resolved declaration - once per process for a global server, once per workspace for a project server or one naming${CWD}- hands out leases (Clientis a handle on a sharedconn), keeps the global ones up underKeepand stops the rest once unheld; a stdio server runs in its own process group (client.go). Approval surfaces:coddy mcp list|trust|untrust,POST /coddy/mcp/{name}/trust|untrust, Settings → MCP servers. Seedocs/features/mcp.md.internal/bgtask- process-wide, session-scoped pool for work that outlives a tool call. A task is whatever aRunnerstarts (CommandRunnerfor shell commands) or whatever aLaunchFunchands toPool.Launch: that is how a subagent run becomes aKindAgenttask, withSpec.Agent/Snapshot.Agent{name, session_id}naming the child session. One scheduling path (start) servesStart,AdoptandLaunch; do not add a second scheduling mechanism or status surface.internal/subagents- subagent definitions (markdown + YAML frontmatter,definition.go: aliases, bounds, SHA-256 digest,EffectiveTools/NarrowPermissionMode/ResolveTimeoutSeconds), the loader (loader.go: the folders ofconfig.Subagents.SearchDirs-${HOME}/.agents/agents,${CWD}/.agents/agents,${CODDY_HOME}/agents,${CWD}/.coddy/agents, always read, then the extrasubagents.dirs, lowest priority first, a folder named twice read at its last place - canonical scopesbuiltin/user/project,denynever reads project dirs), the trust receipts for project-scope files (trust.go:TrustStoreat<home>/subagents-trust.json,Decide, keyed by canonical workspace + name + digest undersubagents.project_trust), the process-wideLimiter(refuses, never queues), and the catalog (catalog.go:BuildCatalog,PromptBlock,WriteListing). Pure decisions only: no sessions, no loop.internal/agent/subagent.goapplies them (spawn hook, permission relay, report; once the spawning turn has ended the relay hands a detached child's prompt to aDetachedPermissionBroker- the console's modal, or incoddy serveserve.Runtime, which offers it to every surface that is up (the HTTP server: the parent chat and a--remoteconsole; a Telegram bot: the session's chat) and takes the first answer - and refuses with a reason where no broker exists;spawn_agentresumecontinues a finished run of the session in its own child instead of a second child starting over) andinternal/session/subagent.goowns child sessions (ordinarysess_ids, bundles nested under<parent>/subagents/,ErrSubagentReadOnly,DeleteSessionTree, andSubagentSpec.Resume, which reopens a finished child from its bundle for the next run). Approval surfaces:coddy agents list|trust|untrust,POST /coddy/subagents/{name}/trust|untrust(an optionaldigestrefuses a file rewritten since it was listed, 409), and Settings → Subagents in the web UI, where a project definition underaskcarries the MCP shield. Seedocs/features/subagents.md.internal/hooks- operator lifecycle hooks: commands that read one JSON document on stdin at a point of a session and answer with an exit code plus optional JSON (definition.go: Claude Code's file shape, handler fields,Parse;matcher.go: exact-list-or-regex matchers with tool-name aliases such asBash->run_command;loader.go:hooks.files, canonical scopesuser/project,denynever reads project files,Source.Runnable;trust.go:TrustStoreat<home>/hooks-trust.json, receipts keyed by canonical workspace + workspace-relative file + digest underhooks.project_trust,Loader.WithStore;catalog.go:BuildCatalog,FindSource,WriteListing;runner.go: payload, sequential execution, timeouts and process groups viainternal/platform, the exit-code contract,Outcomemerging with the most restrictive decision winning). Pure decisions only: no sessions, no loop.internal/agent/hooks.goapplies them:PreToolUsebefore the permission gate andPostToolUse/PostToolUseFailureafter the tool inexecuteToolCall,UserPromptSubmit(reject, or context into the## Hook contextprompt block) andStop(follow-up submitted as a[Stop hook]user message, capped byhooks.stop_loop_limit) in the loop,PreCompact(veto) /PostCompactinCompactSession,SubagentStart(refuse, or context into the child's task) /SubagentStopinsubagent.go,Notification(permission_prompt) before the permission prompt;internal/session/hooks.gofiresSessionStartfrom the manager and persists its context ashookContext. Project-scope files followhooks.project_trustlike MCP declarations and subagent definitions; a held file is reported once per session as anotice-level UI log row. Approval surfaces:coddy hooks list|trust|untrust,GET /coddy/hooks,POST /coddy/hooks/trust|untrust. Seedocs/features/hooks.md.internal/skills- skill loading, enable/disable (loader.go,disabled.go), and remote install from repos / agents-standard marketplaces (remote.go,manifest.go,plugin.go:Sync/SyncSource(all or one source),AddSource,RemoveRemote/DeleteSkill(delete any on-disk skill; bundled = read-only viaSkillReadonly),ListSources,RemoveSource,CheckUpdates,UpdateSkill; what a workspace may fetch is declared in two files of one shape, never inconfig.yaml(declarations.go:Declarationslists the system source, the operator's<home>/marketplaces.jsonand the project's.coddy/marketplaces.jsonin that order, each entry a source installed whole or a marketplace whose plugins are installed one by one, and every project entry decided by the workspace trust gate underskills.project_trust-askdefault /allow/deny, receipts in<home>/skills-trust.jsonkeyed by canonical workspace + entry digest,trust.go;ApproveShownrefuses an entry rewritten since it was shown,ErrHeldanswers every refusal of a held entry; the oldskills.sourceskey moves into the home file on config load,internal/config/legacy_keys.go); marketplaces inmarketplaces.go(AddMarketplace,InstallFromMarketplaceforplugin install <plugin>@<marketplace>,UpdateMarketplace; the plugin lists read from them cached in${CODDY_HOME}/skills/.marketplaces.json, only installed plugins are updated, while a source keeps having every plugin installed); the system sourceEvilFreelancer/rpa-skillsis always in effect and always trusted, written in no file and refused on removal; git clone viainternal/gitws.Clone/Pull, or, for a marketplace entry{"source":"archive"}, a zip download inarchive.go- https only, every address and redirect through the SSRF guardremoteGuard, a declaredsha256checked, unpacked under size and entry caps with unsafe entries refused, skills taken from the plugin manifest (skillsin.claude-plugin/plugin.json, elseskills/, else a rootSKILL.md, everySKILL.mdonly when there is no manifest), no git; materialized into${CODDY_HOME}/skillswith a.remote.jsonlockfile that records each skill's installedversion, the archive digest for an archive plugin without one). Marketplace pluginversion(andSKILL.mdfrontmatterversion) are surfaced byInstalledVersionand drive update detection (compareVersions). Sources and marketplaces are fetched only on demand, and whatever any of them installs goes to${CODDY_HOME}/skills. Management parity across the CLI (coddy skills add [--project]|sync|remove,coddy plugin marketplace list|add|remove|sync|trust|untrust,coddy plugin install|remove|enable|disable), the built-in/pluginchat command (internal/agent/plugin_command.go, deterministic like/compact; shared dispatcherskills.RunPluginCommand/MarketplaceStatusinplugin.go; only the terminal setsPluginOptions.AllowTrust, so a chat cannot approve a project entry), HTTP (/coddy/skills/*,POST /coddy/skills/sources/trust|untrust), and the Settings → Skills UI (the marketplaces list with the MCP shield). Seedocs/features/skills.md. The folders a workspace reads areconfig.Skills.SearchDirs():DefaultSkillDirs(${HOME}/.agents/skills,${CWD}/.agents/skills,${CODDY_HOME}/skills,${CWD}/.coddy/skills, always read, lowest priority first) and then the extraskills.dirs, which win a name over them; every reader of skills (the session manager, slash commands,GET /coddy/skills, delete,coddy skills list) goes through it, never throughskills.dirsalone. A folder named twice is read once, at its last place;${CWD}and a relative entry expand against the session workspace (expandPath).internal/mention- the one grammar of@mentions (grammar.go: relative, absolute,~and../paths, quoted paths,:N-M/#Lranges, folders,@session:/@rule:/@agent:/@coddy:, web pages; every reading of an ambiguous token, the one that exists on disk winning), path resolution (paths.go), the workspace index for completion (index.go:git ls-filesor a walk, cached per root, rebuilt when a mention starts), fuzzy ranking (fuzzy.go) and the<coddy_attachment>element with its display twinForDisplay(attachment.go). Pure, no sessions.internal/session/mentions.goresolves a prompt's mentions once, into that user message (a mention never fails the prompt and never moves the system prompt);mention_search.goanswers completion for every surface (GET /coddy/mentions);mention_check.goruns the resolver dry for the web composer's highlight (POST /coddy/mentions/check). The SPA twinexternal/ui/src/ui/skills/draftAt.tsand the Go grammar are held to the same cases,internal/mention/testdata/grammar_cases.json- change both or neither. Seedocs/features/mentions.md.internal/docs- the documentation built into the binary:docs/embed.gocarriesnav.yamland its pages in English and in Russian (ru/, the same paths), one library per language (For(lang); a translated heading answers to the anchor of the English heading at its position),internal/docssplits them at headings (GitHub anchors shared withinternal/docsgen), rewrites their links (coddy:<slug>#<anchor>between pages, GitHub at the release tag for images and repository files), ranks sections with BM25F and reads a page or a section under a budget of characters. Pure: it reads only the embedded tree. Every surface goes through it -coddy_docs_search/coddy_docs_read, the@coddy:mention,GET /coddy/docs*, the web reader, the console's F1 help,coddy docs. A new group folder underdocs/must be added to the embed pattern. Seedocs/features/built-in-docs.md.internal/rules- rules catalog: one provider per root (factory.go: a chain of project folders -.coddy/rules, the shared.agents/rulesas systemagents-dir,.cursor/rules,.claude/rules,.codex/rules- of which only the first that holds a rule file is read, so another agent's mirror of the same rules is never loaded next to it; plus the operator's own${CODDY_HOME}/rulesas systemuser, always read -DefaultFactory(home)adds it, andDiscoveraccepts an absolute provider root for it;Inspectalso names the folder read and the ones skipped forcoddy rules list; nestedAGENTS.mdfiles have no provider,agents.goreads them on demand throughAgentsForPathsfor the folders a tool enters and never walks the tree), dedupe by file name with the project folder winning overuser, the dialect picked by extension inmarkdown.go(.mdc= Cursordescription/globs/alwaysApply, default manual;.md= Claude Codepaths, unconditional without them; a header is read as YAML first, then by a lenient line reader because Cursor's ownglobs: **/*.gois not valid YAML), doublestar glob matching anchored atRule.Root(MatchGlob), activation (select.go:AlwaysOnRulesfor the system prompt,MatchAutofor the paths a prompt mentions -@pathor an editor'sfile://attachment;scope.go:MatchScopedfor filesystem tool-call paths against globs and nestedAGENTS.mdsubtrees; a rule a tool call activates rides in that call's result throughinternal/agent/rules_activation.go, and one a mention brings -@name,@rule:name, or one a mentioned path activates - in that user message throughinternal/agent/mentions.go; neither enters{{.Rules}}, and each comes once until a compaction folds it away) and thecoddy rules listtable (list.go:RenderCatalog). TheAGENTS.md/DESIGN.mddocuments are three layers no setting turns off (issue #425):LoadStanding(home, cwd, userPaths)(project_docs.go) reads the agent home's pair, then the workspace's, then the files ofinstructions.files(empty by default; entries resolved byinternal/session/instructions_load.go:${CODDY_HOME},${CWD},~and absolute entries), each file once byDocKey(dockey.go: links resolved, case folded on Windows and macOS), and returns the keys of what it read;AgentsForPathsreads the same pair (preambleFiles) for every folder on the way down to a path a tool or a mention reaches, whateverrules.auto_discoverandrules.systemssay, and the agent drops the ones the system prompt already carries.internal/agent/system_prompt.go(renderWithDocuments) places the layers in whatever template a turn runs on, appending what the template did not print. Seedocs/features/rules.md.
What this file has done since we first saw it
Hashed on every crawl. A supply-chain change to an agent config is a question of when, not whether, so the history is kept rather than the latest state alone.
- 7d ago Changed f92ea8914e13
- 12d ago Changed eb153ee76791
- 17d ago Changed 6d50c7692e31
- 18d ago Changed fc19eb27bb88
- 19d ago Changed a9b8ec56d7a2
- 25d ago Changed 7102f32f3ee1
- 27d ago Changed · +2 lines d301638c934a
- 28d ago Changed 933048fd917f
- 1mo ago Changed cf09c58409d4
- 1mo ago First seen · 26 lines · 0 tokens per session scan A d7a167ecf23a
core-modules is a cursor rule published in the GitHub repository coddy-project/coddy-agent (175 stars, last pushed today), licensed MIT. It costs nothing until one of its globs matches a file; then it loads 4,077 tokens. A static security scan graded it A with 0 findings. No closer match exists in the catalogue, so it is treated as the original; first seen 2026-08-30.
Other cursor rules, from other repositories
sciclaw-papercuts
Papercuts from Sol/ImageMagick/release cycles — release, brew, CI, and workspace hygiene for sciClaw agents.
ponytail
Ponytail, lazy senior dev mode. Always pick the simplest solution that works.
angular-20
This rule provides comprehensive best practices and coding standards for Angular development, focusing on modern TypeScript, standalone components, signals, and performance optimizations.
dev-standard
Apache Superset development standards and guidelines for Cursor IDE.
prefer-assertions-over-defensive-checks
Prefer assertions over defensive checks when data is guaranteed to be valid.
prefer-direct-imports-over-module-mocks
Prefer extracting a testable core over vi.mock / vi.resetModules when unit tests need to reach production logic entangled with config, env, or singletons.