pi-lens
Version:
Real-time code feedback for pi — LSP, linters, formatters, type-checking, structural analysis & booboo
131 lines (130 loc) • 4.67 kB
JSON
{
"$schema": "http://json-schema.org/draft-07/schema#",
"title": "pi-lens ast-grep rule",
"description": "A single ast-grep rule loaded by pi-lens. Place files under rules/ast-grep-rules/rules/. Supports multiple documents per file separated by ---.",
"type": "object",
"required": ["id", "rule"],
"additionalProperties": false,
"definitions": {
"ruleCondition": {
"type": "object",
"additionalProperties": false,
"properties": {
"pattern": {
"type": "string",
"description": "Ast-grep pattern syntax. Avoid single bare metavariables like '$VAR' (too broad, filtered out)."
},
"kind": {
"type": "string",
"description": "AST node kind name, e.g. 'call_expression', 'import_statement'."
},
"regex": {
"type": "string",
"description": "Regular expression matched against the node's text."
},
"has": {
"$ref": "#/definitions/ruleCondition",
"description": "The node must have a descendant matching this condition."
},
"not": {
"$ref": "#/definitions/ruleCondition",
"description": "Negation — the node must NOT match this condition."
},
"any": {
"type": "array",
"items": { "$ref": "#/definitions/ruleCondition" },
"description": "OR — matches if any item matches. Minimum 1 item."
},
"all": {
"type": "array",
"items": { "$ref": "#/definitions/ruleCondition" },
"description": "AND — matches only if all items match. Minimum 1 item."
},
"inside": {
"$ref": "#/definitions/ruleCondition",
"description": "Ancestor must match. Combined with `stopBy: end` it searches ALL ancestors (default `stopBy: neighbor` = direct parent)."
},
"follows": {
"$ref": "#/definitions/ruleCondition",
"description": "Immediately-preceding sibling must match."
},
"precedes": {
"$ref": "#/definitions/ruleCondition",
"description": "Immediately-following sibling must match."
},
"stopBy": {
"type": "string",
"description": "How `inside`/`has`/`follows`/`precedes` walk the tree. `neighbor` (default) = direct parent/child/sibling; `end` = walk all the way to the root / leaves."
},
"field": {
"type": "string",
"description": "Field name constraint — e.g. `field: name` on an `import_specifier` matches the import's local binding."
},
"nthChild": {
"description": "Match only the Nth child of its parent. Used to disambiguate repeated siblings (e.g. the first vs second argument in a call)."
}
}
}
},
"properties": {
"id": {
"type": "string",
"description": "Unique rule identifier. A project rule with the same id as a built-in overrides the built-in."
},
"language": {
"type": "string",
"description": "Language this rule applies to.",
"enum": [
"TypeScript", "JavaScript",
"Python", "Go", "Rust",
"Java", "C", "Cpp", "CSharp",
"Kotlin", "Ruby", "Php"
]
},
"severity": {
"type": "string",
"enum": ["error", "warning", "info"],
"description": "Diagnostic severity."
},
"message": {
"type": "string",
"description": "Short diagnostic message shown inline."
},
"note": {
"type": "string",
"description": "Extended guidance shown in the detail view. Markdown supported. Supports block scalar (|)."
},
"fix": {
"type": "string",
"description": "Suggested replacement text."
},
"rule": {
"$ref": "#/definitions/ruleCondition",
"description": "The matching condition. Must contain at least one of: pattern, kind, regex, has, any, all, not."
},
"constraints": {
"type": "object",
"description": "Metavariable regex constraints — `KEY: { regex: \"...\" }` narrows what `$KEY` will match. Supported by the napi engine (and the ast-grep CLI/LSP).",
"additionalProperties": {
"type": "object",
"properties": {
"regex": { "type": "string" }
}
}
},
"metadata": {
"type": "object",
"additionalProperties": false,
"properties": {
"weight": {
"type": "number",
"description": "Priority weight for ordering results."
},
"category": {
"type": "string",
"description": "Category label for grouping."
}
}
}
}
}