{ "$schema": "https://biomejs.dev/schemas/2.3.11/schema.json", "css": { "parser": { "tailwindDirectives": true } }, "assist": { "actions": { "source": { "organizeImports": "on" } }, "includes": ["**", "!agents-cli/src/commands/pull-v4/__tests__/__snapshots__/**"] }, "vcs": { "enabled": true, "clientKind": "git", "useIgnoreFile": true }, "files": { "ignoreUnknown": false, "includes": [ "**", "!packages/agents-mcp", "!**/__snapshots__/*.json", // The .agents/skills and .codex/skills entries under // public/agents/ are real directories of per-skill symlinks back into // the repo-root canonical at ../../../.agents/skills/. Without // these excludes, biome traverses through the symlinks and reformats // files at REPO ROOT (outside public/agents/'s scope) — including // team-skills sources (e.g. .agents/skills/brand/scripts/generate-manifest.js) // whose syntax is owned by upstream, not this repo. Skills are // internal-only and their formatting is owned by the // cross-harness-skills-sync workflow, not by biome. "!.agents/skills", "!.codex/skills" ] }, "linter": { "enabled": true, "includes": [ "**", "!**/node_modules/**", "!**/coverage/**", "!**/dist/**", "!**/drizzle/**", "!**/drizzle.config.*", "!**/.next/**", "!**/build/**", "!**/out/**", "!**/*.css", "!**/.source/**", "!**/.vercel/**", "!**/tsconfig.json" ], "rules": { "recommended": true, "suspicious": { "noExplicitAny": "off", "noArrayIndexKey": "off", "noConfusingLabels": "off", "useIterableCallbackReturn": "error", "noDocumentCookie": "off", "noAssignInExpressions": "off" }, "complexity": { "noStaticOnlyClass": "off", "noBannedTypes": "off", "noUselessFragments": "off", "noUselessLoneBlockStatements": "off" }, "style": { "noRestrictedImports": { "level": "error", "options": { "paths": { "react": { "importNames": ["useCallback", "useMemo", "memo"], "message": "The highlighted React API is flagged.\nWe use the React Compiler, which automatically memoizes where needed.\nIn 99% of cases, manual memoization is unnecessary.\nIf you encounter a real issue, please ping Dima in Slack." }, "@hono/zod-openapi": { "importNames": ["createRoute"], "message": "Use createProtectedRoute from @inkeep/agents-core/middleware instead. For intentionally public routes, use createProtectedRoute with noAuth() as the permission. If neither applies, add a biome-ignore comment explaining why." } }, "patterns": [ { "group": "react", "importNamePattern": "useContext", "message": "Use the `use()` hook instead." } ] } }, "noUnusedTemplateLiteral": "off", "noNonNullAssertion": "warn", "noUselessElse": "error", "useSelfClosingElements": "error", "useImportType": "error" }, "performance": { "noImgElement": "warn", "noDynamicNamespaceImportAccess": "off" }, "a11y": { "useSemanticElements": "off", "useValidAriaRole": "error", "useButtonType": "error" }, "correctness": { "noUnusedVariables": "warn", "noUnusedImports": "error", "useExhaustiveDependencies": { "level": "error", "options": { "hooks": [ { "name": "useReactFlow", "stableResult": [ // Based on https://github.com/xyflow/xyflow/blob/3f93f828ec931b6fba639d5a38ffd69eaca29f3a/packages/react/src/hooks/useReactFlow.ts#L67 "getNodes", "getNode", "getInternalNode", "getEdges", "getEdge", "setNodes", "setEdges", "addNodes", "addEdges", "toObject", "deleteElements", "getIntersectingNodes", "isNodeIntersecting", "updateNode", "updateNodeData", "updateEdge", "updateEdgeData", "getNodesBounds", "getHandleConnections", "getNodeConnections", "fitView" ] }, { "name": "useAgentActions", "stableResult": true }, { "name": "useMonacoActions", "stableResult": true }, { "name": "useTheme", "stableResult": ["setTheme"] }, { "name": "useCopilotContext", "stableResult": ["setIsOpen", "setIsStreaming", "openCopilot", "setDynamicHeaders"] }, { "name": "useSidePane", "stableResult": ["setQueryState", "openAgentPane"] } ] } }, "useJsxKeyInIterable": "warn", "useUniqueElementIds": "off", "noNestedComponentDefinitions": "off", "noUnusedFunctionParameters": "error" }, "security": { "noDangerouslySetInnerHtml": "off" }, "nursery": { "useRequiredScripts": { "level": "error", "options": { "requiredScripts": ["knip"] } }, "noReactForwardRef": "error" } } }, "formatter": { "includes": [ "**", "!**/drizzle/**", "!**/__snapshots__/*.json", "!agents-cli/src/commands/pull-v4/__tests__/__snapshots__/**" ], "enabled": true, "lineWidth": 100, "indentStyle": "space", "indentWidth": 2 }, "javascript": { "formatter": { "quoteStyle": "single", "trailingCommas": "es5", "semicolons": "always", "arrowParentheses": "always" } }, "overrides": [ { "includes": ["create-agents-template/apps/*/package.json"], "linter": { "rules": { "nursery": { "useRequiredScripts": "off" } } } } ] }