blocks-skills
AGENTS.md42 starsChanged 12 days agoMITView on GitHub
Entry point for coding agents. Read this first, match the user's request to a skill in the routing table, load that skill, and follow it. This file is the only source of instructions for this repo — other agent instruction files point here and add nothing of their own. Skills are the ground truth for CLI/SDK usage. This file routes; the skill owns the flow. Don't duplicate a skill's steps here. Never expect the user to name a skill. There…
- Installs packages
- Sends data out
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,774 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 repository27 other files it gives its agents.
- bootstrap/agents.mdAGENTS.md
- CLAUDE.mdCLAUDE.md
- blocks-bootstrapSkill
- blocks-captchaSkill
- blocks-data-gateway-configurationSkill
- blocks-data-gateway-crudSkill
- blocks-data-storageSkill
- blocks-frontend-local-httpsSkill
- blocks-functionsSkill
- blocks-iam-access-controlSkill
- blocks-iam-accountSkill
- blocks-iam-mfaSkill
- blocks-iam-organizationsSkill
- blocks-iam-sso-oidc-configurationSkill
- blocks-iam-sso-oidc-implementationSkill
- blocks-iam-usersSkill
- blocks-localization-configurationSkill
- blocks-localization-implementationSkill
- blocks-mailSkill
- blocks-notificationSkill
- blocks-notifierSkill
- blocks-proxySkill
- blocks-release-deploymentSkill
- blocks-secretsSkill
- blocksSkill
- blocks-storage-configurationSkill
- blocks-workflowSkill
The file
We split this AGENTS.md into the rules it gives an agent
12 rules. About 1 is common, 7 are distinctive, and 4 are very specific to this project.
≈1
Common · estimate
Many files like this have a rule of this kind.
≈7
Distinctive · estimate
This author's own choices. Worth a look.
4
Very specific
Tied to their project's names, files or tools. Probably skip.
- Common
- Distinctive
- Very specific
- Distinctive: line 9
Keep it free of anything true only of this repo or only of a given checkout.
- Distinctive: line 15
Do not ask "which skill should I use?" or list skills for the user to pick from.
- Distinctive: line 16
Do not wait to be told. Once the request matches a row in the routing table, load that skill and proceed.
- Distinctive: line 17
If the request genuinely spans several skills, pick the one that owns the *first* concrete step, run it, then move to the next.
- Distinctive: line 18
If nothing matches, check the installed skills (see Loading a skill) before concluding no skill applies — the table below can lag the …
- Common: line 19
Ask the user only about things the routing table cannot settle: a destructive confirmation, a missing credential, or an ambiguous *goal* — …
- Very specific: line 26
If login/project/app state is unknown, probe (below) and start with blocks-bootstrap.
- Very specific: line 40
Do not install it automatically: If blocks --version fails, ask first.
- Distinctive: line 42
Read-only probe when state is unknown:
- Very specific: line 50
If blocks is missing, stop the probe and ask before installing.
- Very specific: line 95
Read https://seliseblocks.com/api/reports once per session.
- Distinctive: line 97
Read the file back for anything listed under What never goes in a report, then validate and send:
≈ “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
AGENTS.md
Entry point for coding agents. Read this first, match the user's request to a skill in the routing table, load that skill, and follow it. This file is the only source of instructions for this repo — other agent instruction files point here and add nothing of their own.
Skills are the ground truth for CLI/SDK usage. This file routes; the skill owns the flow. Don't duplicate a skill's steps here.
<!-- blocks-skills:distributable:start --><!-- Everything between these markers is what BOOTSTRAP.md vendors into consumer repos.
Keep it free of anything true only of this repo or only of a given checkout. -->Routing is your job, not the user's
Never expect the user to name a skill. There is no /skill invocation, no slash command, no menu. Users describe what they want in plain language — "let users upload a profile picture", "why does login redirect back to the login page", "add German translations" — and you map that to the right skill and execute it.
- Do not ask "which skill should I use?" or list skills for the user to pick from. Reading the request and choosing is your work.
- Do not wait to be told. Once the request matches a row in the routing table, load that skill and proceed.
- If the request genuinely spans several skills, pick the one that owns the first concrete step, run it, then move to the next. Sequence them yourself.
- If nothing matches, check the installed skills (see Loading a skill) before concluding no skill applies — the table below can lag the installed set. The published catalog is
skills/in the blocks-skills repo. - Ask the user only about things the routing table cannot settle: a destructive confirmation, a missing credential, or an ambiguous goal — never about which skill to run.
The routing table exists so you can decide unaided. Treat a request that names no skill as the normal case, because it is.
Workflow
- Understand the objective.
- If login/project/app state is unknown, probe (below) and start with
blocks-bootstrap. - Match the request against the Skill routing table yourself, then load the skill by reading its vendored
SKILL.md(see Loading a skill below). - Inspect the existing implementation before changing it.
- Make the smallest correct change, then verify it.
Prerequisites
The blocks CLI is required for terminal/admin work:
npm install -g @seliseblocks/cli-os@latest
blocks --versionDo not install it automatically. If blocks --version fails, ask first. The SDK for app code is npm install @seliseblocks/client@latest.
Read-only probe when state is unknown:
blocks --version
blocks auth status --json
blocks doctor --jsonIf blocks is missing, stop the probe and ask before installing. Don't claim bootstrap is runnable until the CLI exists.
Never guess a command or a flag — ask the CLI. blocks help <command> prints one command's exact positionals, flags, scope, and whether it mutates; blocks help <family> lists a family; blocks --help --json lists every command. Read that before running anything unfamiliar, and prefer it over any command spelling you remember, including one from this file. Set BLOCKS_STRICT_FLAGS=1 in scripted runs so an unrecognized flag hard-fails instead of being warned and ignored.
Loading a skill
Skills are files, not a CLI command. They reach an agent one of two ways, and a given repo uses one, not both — with both, the agent sees every skill twice:
- Plugin (Claude Code, Cursor). The
selise-blocksplugin installs every skill, and the agent lists and loads them by name like any other plugin skill. - Vendored (every other agent, or any repo set up with
BOOTSTRAP.md). Skills live on disk as.agents/skills/<name>/SKILL.md, the cross-agent location most coding agents read natively. An agent that only reads its own directory (Claude Code reads.claude/skills/, Qwen Code reads.qwen/skills/) finds the same set through a pointer stub there whose body sends you to the.agentscopy. Read the.agentscopy directly.
There is no blocks skill list/show/add command, and the CLI package does not bundle the skill tree. Don't reach for those commands, and don't treat their absence as a broken install.
If a skill named in the routing table isn't installed, the fix is to update the plugin, or re-run the vendoring runbook (BOOTSTRAP.md in the blocks-skills repo) — not to fetch the file ad hoc or write a replacement from memory. The published catalog is skills/ in the blocks-skills repo; read from there only to confirm a name, never as a substitute for installing.
Hard rules
- Never raw
fetch/curlagainstapi.seliseblocks.com. Use theblocksCLI or the@seliseblocks/clientSDK. Every skill states which surface it uses. Bypassing them with raw HTTP is the failure mode these skills exist to prevent. The one sanctioned rawcurlis the anonymous report endpoint atseliseblocks.com/api/reports(see Report what you find), which is not the platform API. - Never send a report to Blocks unless reporting is
opt-inor the user asked for that report, and never put anything identifying or secret in one. The rules are in Report what you find below. --dry-runbefore--yeson every mutating CLI command. Get human confirmation before destructive or cloud-mutating operations.- Never read the CLI's local storage files (config/token/secret files on disk) or print anything inside them — client ids, root tenant id, account names, tokens. Interact only through
blockscommands. To repair broken state useblocks login,blocks auth remove <account>,blocks projects list --json,blocks use <tenantId>. blocks projects createaccepts the Blocks terms on the user's behalf (isAcceptBlocksTerms,isUseBlocksExclusively). Never run it without explicit consent to that, and never to "try something" — it provisions real cloud tenancy. Run--dry-run --jsonfirst, then--yesonly after approval. It creates exactly one app in thedevenvironment; further environments are portal-only.- Never expose secrets or credentials.
blocks secrets getand friends exist for operating the store, not for printing values into a conversation or a file the user did not ask for. Never work around a missing capability with raw HTTP. - Don't attribute work to an AI tool anywhere in this repo — no assistant names in docs, comments, or commit messages.
Report what you find
When something in Blocks does not behave as documented, cannot do what you need, or took real effort to figure out, it is worth a report to the Blocks team: a bug, a quirk, a limitation, a learning, or a suggestion. Reports are anonymous, need no account, and go to https://seliseblocks.com/api/reports — a website endpoint, not the platform API, so the raw-HTTP rule above does not apply to it.
Whether you may send one on your own is the user's choice, recorded once at bootstrap in .agents/skills/.blocks-reporting. Read that file before deciding:
reporting= | What you do |
opt-in | File a report whenever you hit something worth reporting, without asking each time. Tell the user what you sent and the id that came back. |
opt-out, or the file is missing | Never send anything on your own initiative. You may still say that something looks worth reporting and offer to file it. |
A plugin install has no such file until the user asks for one, so it starts as opt-out. Turning reporting on writes .agents/skills/.blocks-reporting in the repo the same way.
Two things hold regardless of the setting:
- The user can ask for a one-off report at any time ("report this to Blocks", "send them this finding"). File it, following the steps below.
- The user can change the setting at any time ("turn Blocks reporting on", "stop sending reports"). Rewrite the file with the new value — the only accepted values are
reporting=opt-inandreporting=opt-out— and confirm what it now says. Nothing else needs to change; the file is the whole preference.
Filing a report
- Read
https://seliseblocks.com/api/reportsonce per session; it explains every field and what the answers mean. - In a temp directory (
mktemp -d), not the repo, writeblocks-report.mdstarting fromhttps://seliseblocks.com/api/reports/template. Fill incli(blocks --version),sdk(the installed@seliseblocks/clientversion, if used),agent(the harness, never a person),model, andplatform. Forskills, usename@<version>. Skills carry no version of their own: when vendored, use the first seven characters ofcommit(skills_commitin an older stamp) from.agents/skills/.blocks-skills-source; when installed as a plugin, useplugin-<version>with the plugin version stated in theblocksskill. Setsecurity: truewhen the finding is a security risk. Say what was run, what came back, what was expected, and how to reproduce it. Read the file back for anything listed under What never goes in a report, then validate and send:
curl -fsS -X POST https://seliseblocks.com/api/reports/validate -H "Content-Type: text/markdown" --data-binary @blocks-report.md curl -fsS -X POST https://seliseblocks.com/api/reports -H "Content-Type: text/markdown" --data-binary @blocks-report.mdFix anything
validatereturns as an error before sending. A201means it is recorded; tell the user theidfrom the answer. On429wait forRetry-After; on503keep the file and retry later rather than dropping the report.
What never goes in a report
Nothing that identifies a person or grants access: no names, emails, tokens, secrets, cookies, or paths under a home directory. Trim logs to the relevant lines and read them for leaks before sending — the endpoint strips some of this as a safety net, but you are the guard, not it. Tenant ids and project keys are public and fine. Keep the user's application code and business data out unless a minimal excerpt is needed to reproduce the finding, and strip anything identifying from that excerpt too.
Skill routing table
Surface: CLI = terminal/admin, project-scoped · SDK = @seliseblocks/client in app code · Both = each surface covers part of the job.
Start here
| Skill | Use when | Surface |
blocks-bootstrap | New user, or not_logged_in / project_not_selected. Detects state via blocks auth status --json / doctor --json, closes install/login/project gaps, resolves the app OIDC client, scaffolds with blocks new web, and runs blocks init inside the app dir only when the work needs project-local Blocks files. Run before any other skill when state is unknown. | CLI |
Data
| Skill | Use when | Surface |
blocks-data-gateway-configuration | Defining, editing, securing, validating, or reloading the data model — schema fields, access policies, validation rules. data config/schema/rules/validation/reload, or the composed data sync. | CLI |
blocks-data-gateway-crud | Reading or writing actual records through a Data schema from app code. data.collection(name) for per-item CRUD, data.graphql() for joins/custom shapes. | SDK |
blocks-data-storage | File and document features: upload/download, directory trees, paginated browse/search, versions, rename/move/copy, trash/restore, sharing, ACLs, inheritance. | Both |
blocks-storage-configuration | Choosing/rotating which provider backs the file tree (Azure Blob, S3-compatible, local/SFTP) — hosts, credentials, region/endpoint, strategy. Not file operations. | CLI |
IAM
| Skill | Use when | Surface |
blocks-iam-account | The signed-in user's own account: activation, forgot/reset/change password, logout(-all), profile bootstrap (iam.me/updateMe), signup, login-options discovery. | SDK |
blocks-iam-users | Managing other users: invite, edit, activate/deactivate, list/search, grant/revoke roles and org access. | Both |
blocks-iam-access-control | RBAC. Two facets: read-only feature-gating by the current user's roles/permissions (common, safe), and creating/editing role & permission definitions (sensitive, human-confirmed only). | Both |
blocks-iam-organizations | Multi-tenant workspaces: org switcher, switching active org context (SDK-only), public signup policy, and — human-confirmed — creating/editing orgs and signup config. | Both |
blocks-iam-mfa | Self-service MFA for the signed-in user (TOTP enroll/verify, OTP, method switch, disable, backup codes) plus tenant-wide MFA policy admin. Not admin-forcing MFA onto another user. | Both |
blocks-iam-sso-oidc-configuration | Enabling SSO: register an OIDC client and identity provider. Portal remains a valid alternative, especially for federated providers (Google/Azure/Okta). Not blocks login — that's the CLI's own login. | CLI |
blocks-iam-sso-oidc-implementation | Extending or debugging the hosted login flow the scaffold already ships: redirectToProvider → /login/callback → session, AuthProvider, RequireAuth guards, token refresh, redirect loops, sessions that don't stick. | SDK |
blocks-captcha | Login CAPTCHA for the project: register a reCAPTCHA or hCaptcha site key and secret, enable/disable, list and inspect configs via captcha list/get/save/enable/disable/delete. Not the frontend widget itself. | CLI |
Localization
| Skill | Use when | Surface |
blocks-localization-configuration | Authoring translations: local i18n JSON dictionaries, validate/push/pull, languages and modules, glossary terms, AI translation suggestions. | CLI |
blocks-localization-implementation | Consuming translations at runtime: language/module discovery, loading dictionaries, t() lookup, a language switcher that reloads and re-renders. | SDK |
Messaging
| Skill | Use when | Surface |
blocks-mail | Transactional email — mail.send()/sendToAny() from app code, or administering SMTP/inbound config, templates, and mailbox history. | Both |
blocks-notifier | Sending real-time/offline notifications and managing a user's own notification inbox (notify, list, unread, mark-read). | Both |
blocks-notification | Configuring tenant notification channels — a different backing service from notifier, and not for sending. No SDK path exists. | CLI |
Backend logic
| Skill | Use when | Surface |
blocks-workflow | Event-driven backend logic without a separate backend: react to Data Gateway inserts/updates/deletes, expose a webhook, run on a schedule, call external APIs. Authors the workflow graph as JSON and loads it with logic workflow import/export/save/publish/unpublish. No SDK path. | CLI |
blocks-functions | Custom backend code: a Node handler the platform runs on demand. Write index.js, then logic function save/test/deploy (plus runs, logs, replay); call it from app code with blocksClient.logic.functions.call()/invoke() or from a workflow function step. Triggers (methods, Public vs Token, sync vs async), variables and {{secret.<id>}} references. | Both |
blocks-proxy | Calling a third-party API without exposing its URL or keys: configure a proxy with logic proxy * (routes, {{$VAR.name}} secret headers, access, timeout/retry/breaker, rate limit, OpenAPI import, versions, request logs), then call it with blocksClient.logic.proxy.request(). | Both |
Platform operations
| Skill | Use when | Surface |
blocks-release-deployment | Triggering and inspecting Release builds/deploys: release deploy, release status, builds get/list. Triggers a configured pipeline only — no artifact upload. | CLI |
blocks-secrets | The project secret store: create named secrets from a value, file or dotenv, rotate, lock/unlock, delete/restore, access checks and audit via secrets *. Values are never echoed back. | CLI |
Local development
| Skill | Use when | Surface |
blocks-frontend-local-https | Running a scaffolded app over HTTPS on its real project domain — required for hosted login, since plain HTTP and localhost never receive the session cookie. Covers npm run cert, trusting the cert, the hosts entry, and "SSO cookie not set" / Vite "Blocked request" errors. | Scaffold |
Routing notes
- Own account vs. other users vs. role definitions —
blocks-iam-account/blocks-iam-users/blocks-iam-access-control. Pick by whose record changes. - Configuration vs. implementation — most areas split in two: a CLI skill that defines the thing and an SDK skill that consumes it at runtime. "Create a schema" is configuration; "fetch products" is implementation.
notifiersends,notificationconfigures. Different services.- Inline call vs. workflow — a single call the app makes itself ("send this email", "save this record") belongs to that service's skill. Reach for
blocks-workflowonly when the logic must run server-side on an event, webhook, or schedule. - Proxy vs. function vs. workflow — forwarding to one third-party API with a hidden key is
blocks-proxy; code you write (validation, computation, several calls, a webhook handler) isblocks-functions; a multi-step graph started by a data event or schedule isblocks-workflow, which can call both as steps. blocks-data-storageoperates on files;blocks-storage-configurationchooses the provider underneath.- Dependencies: schema work must be reloaded before CRUD sees it; SSO implementation needs a registered OIDC client and HTTPS on the real domain to test.
<!-- blocks-skills:distributable:end -->What lives here
This repo is the single source for the SELISE Blocks skills and everything that ships them:
| Change | Where |
A skill's SKILL.md, flows, references, scripts | skills/<name>/ |
| Routing table, hard rules, workflow | AGENTS.md, inside the distributable markers |
The blocks router skill (plugin installs) | generated — edit the distributable region, then npm run generate:router. Never hand-edit skills/blocks/SKILL.md. |
| Plugin manifests | .claude-plugin/ (Claude Code plugin and marketplace), .cursor-plugin/ (Cursor). version follows package.json; npm run generate:router syncs it. |
| The vendoring procedure | BOOTSTRAP.md (entry point and task map) and bootstrap/ (one file per step or task) |
The minimum blocks CLI the skills are checked against | package.json blocksCli.minVersion, restated in skills/blocks-bootstrap/SKILL.md |
A new skill is one PR: its directory under skills/ plus its routing-table row. A skill missing from that table is invisible to agents and is never vendored — the runbook treats the table as its manifest, and npm run lint:router fails on a directory with no row.
Checks. npm test runs both lints. npm run lint checks every skill, including that each blocks … command it cites is registered in the CLI. It asks a real binary: the published blocks on PATH (at least blocksCli.minVersion), or a built blocks-cli checkout named by BLOCKS_CLI_DIR for a command that isn't published yet. Requires Node 20+.
The CLI is a separate repo. Skills depend on SELISEdigitalplatforms/blocks-cli; it never reads them. A CLI change that renames, removes, or changes a command a skill cites needs a matching PR here — nothing in the CLI repo fails when a skill goes stale. The nightly CI run against the latest published CLI is what catches it.
Skills lived in blocks-cli under blocks-skills/ until they moved here with their history (tag skills-last-in-cli there marks the last commit that had them). Installs vendored before the move are stamped with that repo; bootstrap/update.md handles them, so keep that history intact.
Changing the runbook. BOOTSTRAP.md is the only file a consumer's agent is pointed at; it reads a bootstrap/ file only when BOOTSTRAP.md's Pick your task or The full install table names it. So when you add, rename, split, or remove a file under bootstrap/, update both tables in the same change, and fix every link to it from the other bootstrap/ files. Keep each fact in one file — link to it from the others rather than restating it. When an agent's behavior changes, the only file to edit is bootstrap/agents.md.
An older generation of skills lived in this repo's skills/ directory before Aug 2026 and drove api.seliseblocks.com over raw HTTP with manual impersonation (x-blocks-key/PTOK). That generation is superseded — the current skills forbid raw HTTP outright. Never restore anything from a commit before the move.
Skill authoring conventions
These govern every skill under skills/ and the routing-table row that accompanies it:
SKILL.mdfrontmatter isname+ a trigger-rich, third-persondescription. The description is what routes a request — say what the skill does and the phrases and contexts that should invoke it, plus what it is not (name the sibling skill). Lean slightly pushy; under-triggering is the common failure.- Ground every claim in verified behavior. Drive the real command or SDK call before documenting it. Capture real request/response shapes. If you can't verify something, mark it unverified rather than smoothing it over — never fabricate output or invent flags. Honesty beats completeness.
- Style: imperative, concrete, American spelling, tables over prose walls, no marketing language.
- Name the sibling skills a skill borders in its description, so misrouting between neighbors is caught. Do not link across skill directories — vendoring copies each directory independently, so every relative link must resolve inside the skill's own directory.
- Scope: one clear job per skill; split rather than sprawl. One skill per PR where practical.
See CONTRIBUTING.md for the full contribution bar.
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.

