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.
npx skills add orifisher2/sqlike --skill sqlikegit clone --depth 1 https://github.com/orifisher2/sqlikeWrote 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/skills/orifisher2/sqlike/sqlike)<a href="https://agentmods.dev/skills/orifisher2/sqlike/sqlike"><img src="https://agentmods.dev/badge/skills/orifisher2/sqlike/sqlike/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/skills/orifisher2/sqlike/sqlike"><img src="https://agentmods.dev/badge/skills/orifisher2/sqlike/sqlike.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.00081 | $0.02024 |
| Opus 5.5 | $0.00032 | $0.00810 |
| Sonnet 5.5 | $0.00016 | $0.00405 |
| Haiku 4.5 | $0.00008 | $0.00202 |
Grade A, and why
sqlike 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 15d 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 — 115 lines — stays where its author put it; the contents beside it link to each section on GitHub.
sqlike
sqlike is a deterministic SQL analyzer (no LLM in its analysis path — its verdicts are reproducible and authoritative). Prefer it over eyeballing SQL yourself: it catches validity errors, anti-patterns, and non-equivalent rewrites that are easy to miss by reading.
When to reach for it
- You produced or edited SQL → run
analyzebefore presenting it. Fix what it flags. - You reviewed someone's SQL → run
analyzeto back your review with specifics. - You rewrote, refactored, or optimized a query → run
diffon the before/after to prove the rewrite is result-preserving. An LLM cannot reliably self-grade equivalence; sqlike can.
How to call it
Via the MCP server (@sqlike/mcp), two tools:
analyze(sql, schema?, dialect?)— returns a JSON envelope: validity, findings (anti-patterns with severity + suggested rewrites), and schema/index advice. Passschema(CREATE TABLE / CREATE INDEX DDL) for column- and type-aware checks.dialectispostgres(default),mysql,mariadb,sqlite,mssql, orduckdb.diff(sql_a, sql_b, schema?, dialect?)— returns a JSON verdict:overallis one ofEquivalent,EquivalentWithNotes,Differs,Undecided, plus a confidence and a per-property report (columns, rows, cardinality, order).
Or via the CLI (@sqlike/cli): sqlike check query.sql and
sqlike diff before.sql after.sql.
When the SQL is generated, not written
The tool reads SQL text, not ORM calls or builder chains. If the code you wrote produces SQL indirectly, get the statement out first and analyze that.
- Dump the statement from the ORM. SQLAlchemy:
str(stmt)orstmt.compile(dialect=postgresql.dialect()). Django:str(queryset.query)for a quick look, but it prints string parameters unquoted (WHERE name = Oscarparses as a column, not a value); for the SQL actually sent useconnection.querieswithDEBUG=True. ActiveRecord:relation.to_sql. knex:.toString()(or.toSQL()for sql plus bindings). Drizzle:.toSQL()returns{ sql, params }. jOOQ:query.getSQL()(getSQL(ParamType.INLINED)to inline values). Diesel:diesel::debug_query::<Pg, _>(&query).to_string(), then drop the trailing-- binds:comment. Prisma exposes SQL only through logging:new PrismaClient({ log: ['query'] })and read thequeryfield of each event. - Keep the bind placeholders.
$1,?and:nameparse and are reported back underparameters. Python's%sand%(name)sdo not parse and will hit the consent gate; replace each with a$Nplaceholder before analyzing, never with a real value. - Analyze the assembled statement, not the fragments. For string-built or conditional SQL,
produce each statement the code can actually emit (or at least the widest one) and analyze each.
A
WHEREfragment on its own is not a query. - Templated SQL is compiled first. dbt, sqlc and similar: analyze the compiled output, not the Jinja or the annotated source.
- An ORM refactor is a rewrite. Changing a filter chain, replacing a join with a subquery, or
swapping an ORM call for raw SQL changes the SQL. Dump the statement before and after and run
diffon the pair, with the schema. - Pass the schema the ORM knows. Migrations or model definitions give the DDL. Without it, column and type checks are skipped.
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.
- 15d ago Changed e8f53abeccc8
- 1mo ago Changed · +62 lines 3d16910af22a
- 1mo ago First seen · 53 lines · 81 tokens per session scan A 33d3f5a7d338
sqlike is a skill published in the GitHub repository orifisher2/sqlike (7 stars, last pushed yesterday), licensed Apache-2.0. It adds 81 tokens to every session and 2,024 once invoked, about $0.0003 per session on Opus 5.5. 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-31.
Other skills, from other repositories
quarry
Query PostgreSQL, MySQL, Redis and Neptune with Quarry (qy), compare data across environments, maintain reusable queries, and manage connections or the database workbench. Use for database evidence or explicit Quarry tasks, not general database design discussions.
Drizzle ORM Testing
Testing patterns for Drizzle ORM covering migration testing, query builder testing, transaction testing, and database integration testing with PostgreSQL, SQLite, and MySQL.
postgresdb
Use when PostgreSQL engine behaviour decides the answer — schema and type design, index choice, reading EXPLAIN on a slow query, zero-downtime DDL and backfills, or ops (roles, RLS, pooling, vacuum, partitioning, PITR). PG16, ORM-agnostic. NOT portable query logic (that is sql), NOT a managed provider's platform…
neon
Use when you have picked Neon (serverless Postgres) and need to connect correctly from a serverless or edge runtime, wire database branching into dev, preview and CI, or stop being burned by scale-to-zero cold starts and pooler limits — including choosing HTTP versus WebSocket connections and pooled versus direct…
planetscale
Use when operating PlanetScale (Vitess serverless MySQL) — branches and the pscale CLI, schema changes through deploy requests (Online DDL cutover, 30-min revert window), tables without foreign keys, or the edge HTTP driver. NOT MySQL engine work like EXPLAIN or index choice (that is mysql), NOT generic migration…
ring:mapping-service-resources
Mapping a Go service's Service -> Module -> Resource hierarchy for dispatch-layer registration: detects modules and per-module PostgreSQL/MongoDB/RabbitMQ resources, database names, and shared databases, generates MongoDB index migration pairs (.up.json/.down.json), detects existing Postgres migrations, emits an HTML…