lintbase — independently scanned and version-tracked by SaferSkills.
SaferSkills independently audited lintbase (Agent Skill) and scored it 100/100 (green). The audit ran 55 deterministic rules across Security, Supply Chain, Maintenance, Transparency, and Community; it found 0 high-severity and 0 lower-severity findings. The full rule-by-rule trace and per-finding evidence are below. Free, methodology-open.
Findings & checks · 0 flagged
Every scanned point with the score it earned and what moved between them.
First recorded scan — no prior version to compare against.
The primary manifest — the file an agent reads to learn what this artifact does.
LintBase gives you real-time, ground-truth Firestore schema context so you write code that matches what is actually in production — not what you assume is there.
NEVER write Firestore code (reads, writes, queries, rules) without first calling `lintbase_get_schema` for the relevant collection.
This is not optional. Firestore is schemaless — documents in the same collection can have completely different fields. If you do not check first, you WILL hallucinate field names and cause silent bugs or schema drift.
lintbase_get_schema — Use this first, alwaysCall this before writing ANY database-related code.
lintbase_get_schema({
keyPath: "./service-account.json", // ask user if not specified
collection: "users", // omit to get ALL collections
sampleSize: 50 // default is fine
})Optional: persist schema to disk as Markdown (great for Obsidian, team docs, or permanent AI context):
lintbase_get_schema({
keyPath: "./service-account.json",
format: "md",
outPath: "./.lintbase/schema" // directory — one .md file per collection + README.md index
})
// Or for a single collection:
lintbase_get_schema({
keyPath: "./service-account.json",
collection: "users",
format: "md",
outPath: "./docs/schema/users.md" // full file path
})The output is Obsidian-compatible (YAML frontmatter, callouts, wikilinks between collections). Commit .lintbase/schema/ to your repo to give every team member and AI agent instant schema context.
Read the output carefully:
100% presence and a single type are stable — safe to use<80% presence should be treated as optional — always use null checkslintbase_get_issues — Use before any major changeCall this before a refactor, deploy, or when the user reports unexpected behavior.
lintbase_get_issues({
keyPath: "./service-account.json",
severity: "error", // start with errors only
collection: "users" // scope to relevant collection
})Filter options:
severity: "error" | "warning" | "info"collection: any collection namerule: "schema/" | "security/" | "perf/" | "cost/"lintbase_scan — Use for full auditsCall this when the user wants a complete database health check.
lintbase_scan({
keyPath: "./service-account.json",
sampleSize: 100
})Returns a risk score (0-100) and all issues across schema, security, performance, and cost analyzers.
Follow this sequence every time you touch Firestore code:
1. Call lintbase_get_schema for the target collection(s)
2. Read the field list — note presence rates and types
3. Write code using ONLY the fields that appear in the output
4. Mark optional fields (<80% presence) with null checks
5. If making structural changes, run lintbase_get_issues firstExample output:
## users (47 docs sampled)
| Field | Type | Presence | Stable |
|-------------|-----------|----------|--------|
| uid | string | 100% | ✅ |
| email | string | 100% | ✅ |
| createdAt | timestamp | 100% | ✅ |
| plan | string | 95% | ✅ |
| displayName | string | 62% | ⚠️ |
| legacyRole | string | 18% | ⚠️ |How to write this in code:
// ✅ Safe — 100% presence
const { uid, email, createdAt, plan } = userData;
// ✅ Correct — optional field, null check required
const displayName = userData.displayName ?? userData.email;
// ✅ Correct — sparse legacy field, guard it
if (userData.legacyRole) {
// handle legacy role migration
}
// ❌ Wrong — "name" does not exist in this schema
const name = userData.name;service-account.json to git — always check .gitignoreservice-account.json in project root.gitignore includes service-account.jsonIf the MCP tools are not available, help the user set up lintbase-mcp:
For Cursor — add to .cursor/mcp.json:
{
"mcpServers": {
"lintbase": {
"command": "npx",
"args": ["-y", "lintbase-mcp"]
}
}
}For Claude Desktop — add to ~/Library/Application Support/Claude/claude_desktop_config.json:
{
"mcpServers": {
"lintbase": {
"command": "npx",
"args": ["-y", "lintbase-mcp"]
}
}
}Restart the IDE after adding, then verify with: npx lintbase-mcp --help
| ❌ Wrong | ✅ Right |
|---|---|
| Writing code before checking schema | Always call lintbase_get_schema first |
| Using a field not in the output | Only use fields that appear in the schema report |
| Treating all fields as required | Fields with <80% presence MUST have null checks |
| Assuming type consistency | Fields with multiple types need type guards |
| Skipping the audit before deploy | Run lintbase_get_issues with severity: "error" first |
~30 seconds. Free. No account. Every finding cites a rule and a line of evidence.