pi-lens
Version:
Real-time code feedback for pi — LSP, linters, formatters, type-checking, structural analysis & booboo
251 lines (250 loc) • 7.68 kB
JavaScript
import { getPrimaryDispatchGroup } from "../language-policy.js";
function primary(kind) {
const group = getPrimaryDispatchGroup(kind, true);
if (!group) {
throw new Error(`Missing primary dispatch group for ${kind}`);
}
return group;
}
export const LANGUAGE_CAPABILITY_MATRIX = {
jsts: {
name: "JavaScript/TypeScript Linting",
capabilities: ["types", "security", "smells", "format", "lint"],
writeGroups: [
primary("jsts"),
{ mode: "all", runnerIds: ["tree-sitter"], filterKinds: ["jsts"] },
{ mode: "all", runnerIds: ["fact-rules"], filterKinds: ["jsts"] },
{ mode: "all", runnerIds: ["ast-grep-napi"], filterKinds: ["jsts"] },
{
mode: "fallback",
runnerIds: ["eslint", "oxlint", "biome-check-json"],
filterKinds: ["jsts"],
},
],
},
python: {
name: "Python Linting",
capabilities: ["types", "lint", "smells"],
writeGroups: [
primary("python"),
{ mode: "fallback", runnerIds: ["ruff-lint"], filterKinds: ["python"] },
{ mode: "fallback", runnerIds: ["mypy"], filterKinds: ["python"] },
{ mode: "all", runnerIds: ["tree-sitter"], filterKinds: ["python"] },
{ mode: "all", runnerIds: ["fact-rules"], filterKinds: ["python"] },
],
},
go: {
name: "Go Linting",
capabilities: ["types", "lint", "smells"],
writeGroups: [
primary("go"),
{ mode: "fallback", runnerIds: ["golangci-lint"], filterKinds: ["go"] },
{ mode: "all", runnerIds: ["tree-sitter"], filterKinds: ["go"] },
{ mode: "all", runnerIds: ["fact-rules"], filterKinds: ["go"] },
],
},
rust: {
name: "Rust Linting",
capabilities: ["types", "lint", "smells"],
writeGroups: [
primary("rust"),
{ mode: "all", runnerIds: ["tree-sitter"], filterKinds: ["rust"] },
{ mode: "all", runnerIds: ["fact-rules"], filterKinds: ["rust"] },
],
},
ruby: {
name: "Ruby Linting",
capabilities: ["types", "lint", "smells"],
writeGroups: [
primary("ruby"),
{ mode: "fallback", runnerIds: ["rubocop"], filterKinds: ["ruby"] },
{ mode: "all", runnerIds: ["tree-sitter"], filterKinds: ["ruby"] },
{ mode: "all", runnerIds: ["fact-rules"], filterKinds: ["ruby"] },
],
},
cxx: {
name: "C/C++ Linting",
capabilities: ["types", "lint", "smells"],
writeGroups: [
primary("cxx"),
{ mode: "all", runnerIds: ["tree-sitter"], filterKinds: ["cxx"] },
],
},
cmake: {
name: "CMake Processing",
capabilities: ["lint"],
writeGroups: [
primary("cmake"),
{ mode: "all", runnerIds: ["fact-rules"], filterKinds: ["cmake"] },
],
},
fish: {
name: "Fish Script Formatting",
capabilities: ["format"],
writeGroups: [primary("fish")],
},
shell: {
name: "Shell Script Linting",
capabilities: ["lint", "security", "format"],
writeGroups: [
primary("shell"),
{ mode: "all", runnerIds: ["shfmt"], filterKinds: ["shell"] },
{ mode: "all", runnerIds: ["fact-rules"], filterKinds: ["shell"] },
],
},
json: {
name: "JSON Processing",
capabilities: ["format", "lint"],
writeGroups: [primary("json")],
},
markdown: {
name: "Markdown Processing",
capabilities: ["docs", "format", "lint"],
writeGroups: [
primary("markdown"),
{ mode: "all", runnerIds: ["markdownlint"], filterKinds: ["markdown"] },
],
},
css: {
name: "CSS Processing",
capabilities: ["format", "lint"],
writeGroups: [primary("css")],
},
yaml: {
name: "YAML Processing",
capabilities: ["format", "lint"],
writeGroups: [
primary("yaml"),
{ mode: "all", runnerIds: ["actionlint"], filterKinds: ["yaml"] },
],
},
sql: {
name: "SQL Processing",
capabilities: ["format", "lint"],
writeGroups: [primary("sql")],
},
html: {
name: "HTML Linting",
capabilities: ["lint"],
writeGroups: [primary("html")],
},
docker: {
name: "Dockerfile Linting",
capabilities: ["lint"],
writeGroups: [primary("docker")],
},
php: {
name: "PHP Linting",
capabilities: ["types", "lint"],
writeGroups: [primary("php")],
},
powershell: {
name: "PowerShell Linting",
capabilities: ["lint"],
writeGroups: [primary("powershell")],
},
prisma: {
name: "Prisma Schema Linting",
capabilities: ["types", "lint"],
writeGroups: [primary("prisma")],
},
csharp: {
name: "C# Linting",
capabilities: ["types", "lint"],
writeGroups: [primary("csharp")],
},
fsharp: {
name: "F# Linting",
capabilities: ["types", "lint"],
writeGroups: [primary("fsharp")],
},
java: {
name: "Java Linting",
capabilities: ["types", "lint"],
writeGroups: [primary("java")],
},
kotlin: {
name: "Kotlin Linting",
capabilities: ["types", "lint", "format", "smells"],
writeGroups: [
primary("kotlin"),
{ mode: "fallback", runnerIds: ["detekt"], filterKinds: ["kotlin"] },
],
},
swift: {
name: "Swift Linting",
capabilities: ["types", "lint"],
writeGroups: [primary("swift")],
},
dart: {
name: "Dart Linting",
capabilities: ["types", "lint"],
writeGroups: [primary("dart")],
},
lua: {
name: "Lua Linting",
capabilities: ["types", "lint"],
writeGroups: [primary("lua")],
},
zig: {
name: "Zig Linting",
capabilities: ["types", "lint"],
writeGroups: [primary("zig")],
},
haskell: {
name: "Haskell Linting",
capabilities: ["types", "lint"],
writeGroups: [primary("haskell")],
},
elixir: {
name: "Elixir Linting",
capabilities: ["types", "lint"],
writeGroups: [primary("elixir")],
},
gleam: {
name: "Gleam Linting",
capabilities: ["types", "lint"],
writeGroups: [primary("gleam")],
},
ocaml: {
name: "OCaml Linting",
capabilities: ["types", "lint"],
writeGroups: [primary("ocaml")],
},
clojure: {
name: "Clojure Linting",
capabilities: ["types", "lint"],
writeGroups: [primary("clojure")],
},
terraform: {
name: "Terraform Linting",
capabilities: ["types", "lint"],
writeGroups: [primary("terraform")],
},
nix: {
name: "Nix Linting",
capabilities: ["types", "lint"],
writeGroups: [primary("nix")],
},
toml: {
name: "TOML Linting",
capabilities: ["lint", "format"],
writeGroups: [primary("toml")],
},
};
function toWritePlan(entry) {
return {
name: entry.name,
groups: [...entry.writeGroups],
};
}
export const TOOL_PLANS = Object.fromEntries(Object.entries(LANGUAGE_CAPABILITY_MATRIX).map(([kind, entry]) => [
kind,
toWritePlan(entry),
]));
export function getToolPlan(kind) {
return TOOL_PLANS[kind];
}
export function getAllToolPlans() {
return TOOL_PLANS;
}