{
  "enabled": {
    "max-file-lines": true,
    "max-folder-items": true,
    "import-cycles": true,
    "no-nested-imports": false,
    "vulture": true,
    "eslint": false,
    "knip": false,
    "endpoints": false,
    "classes": false
  },
  "_notes": {
    "no-nested-imports": "Off on purpose: this codebase uses function-level/lazy imports to break import cycles (400+ sites). Flagging them all is wrong for us.",
    "eslint-knip": "Node tooling deferred to a later pass.",
    "classes": "Placeholder check, not wired up. endpoints: orphaned-endpoint triage deferred.",
    "max-file-lines-exceptions": "Grandfather list of pre-existing >300-line files (existing debt, not new). Paths updated after the folder-tree restructure moved several of them.",
    "max-folder-items-exceptions": "Exact-path allow for folders intentionally over the cap. The rule trips at >7 (7 items is fine, the 8th tips it), so only genuinely 8+ folders are listed. backend/ and backend/apps are FastAPI feature-package registries (each child is an app mounted in main.py); agents/ aggregates agent subsystems; core/, tools_lib/, tests/ are conventionally flat. Frontend: app/pages is the page registry, AgentChat/ChatInput/Settings-sections/Onboarding are organizational parents, and shared/state (Redux slices) plus hooks/steps/mcp-cards/Views are flat peer collections. scripts/, electron/, linter/checks/ are flat tool dirs. These replaced blanket .lintignore-max-folder-items sentinels (backend, frontend, scripts, electron, linter/checks) so the rule still catches NEW unplanned bloat everywhere else. Kept as whole-subtree sentinels on purpose: debugger/ (self-contained injected sub-tool with its own Vite GUI), webapp_template (Vite scaffold payload), and vendored mcp-bundles.",
    "import-cycles": "Flags RUNTIME circular imports only (SCC>1). Skips type-only imports (import type / export type) and dynamic import() since neither runs at module init, which is why the idiomatic Redux store<->hooks type cycle is not flagged. Frontend alias resolution comes from import-cycle-aliases. Zero cycles today; the check keeps it that way."
  },
  "rules": {
    "max-file-lines": 300,
    "max-folder-items": 7,
    "import-cycle-aliases": { "@/": "frontend/src/" },
    "vulture-min-confidence": 1,
    "vulture-error-threshold": 1,
    "no-nested-imports": true,
    "endpoint-ignore-routes": ["*/callback", "*/callback/*"]
  },
  "include_extensions": [".py", ".ts", ".tsx", ".js", ".jsx"],
  "exclude": [
    "node_modules",
    ".venv",
    "dist",
    "build",
    "__pycache__",
    ".git",
    ".cursor",
    ".vscode",
    ".claude",
    ".pytest_cache",
    ".mypy_cache",
    ".ruff_cache",
    ".account-factory",
    ".local-stash",
    ".DS_Store",
    "python-env",
    "build-staging",
    "webapp_template_cache",
    "openswarm-cloud",
    "uv-bin",
    "data",
    "public",
    "openswarm_debug.egg-info"
  ],
  "exceptions": {
    "max-file-lines": [
      "backend/apps/agents/agent_manager.py",
      "backend/apps/agents/agents.py",
      "backend/apps/agents/proxy/anthropic_proxy.py",
      "backend/apps/agents/proxy/anthropic_to_openai.py",
      "backend/apps/agents/browser/browser_agent.py",
      "backend/apps/agents/browser_agent_mcp_server.py",
      "backend/apps/agents/browser/browser_schema.py",
      "backend/apps/agents/manager/prompt/prompt_context.py",
      "backend/apps/agents/providers/pricing.py",
      "backend/apps/agents/providers/registry.py",
      "backend/apps/dashboards/dashboards.py",
      "backend/apps/discord_mcp_shim/server.py",
      "backend/apps/mcp_registry/mcp_registry.py",
      "backend/apps/nine_router/oauth.py",
      "backend/apps/nine_router/process.py",
      "backend/apps/nine_router/sync_custom.py",
      "backend/apps/outputs/outputs.py",
      "backend/apps/outputs/runtime.py",
      "backend/apps/outputs/view_builder_templates.py",
      "backend/apps/outputs/webapp_template/frontend/src/shared/styles/ThemeContext.tsx",
      "backend/apps/service/client.py",
      "backend/apps/service/service.py",
      "backend/apps/settings/settings.py",
      "backend/apps/skills/skills.py",
      "backend/apps/subscription/router.py",
      "backend/apps/tools_lib/tools_lib.py",
      "backend/apps/web/web.py",
      "backend/main.py",
      "backend/tests/test_disconnect_resilience.py",
      "backend/tests/test_outputs_runtime_cleanup.py",
      "backend/tests/test_service.py",
      "backend/tests/test_v2_invariants.py",
      "backend/tests/test_v2_label_logic.py",
      "electron/affiliateTracking.test.js",
      "electron/main.js",
      "frontend/src/app/Main.tsx",
      "frontend/src/app/components/editor/CommandPicker.tsx",
      "frontend/src/app/components/editor/DirectoryBrowser.tsx",
      "frontend/src/app/components/overlays/DynamicIsland.tsx",
      "frontend/src/app/components/overlays/GlobalSearchPalette.tsx",
      "frontend/src/app/components/Layout/AppShell.tsx",
      "frontend/src/app/components/Onboarding/OnboardingPanel.tsx",
      "frontend/src/app/components/Onboarding/ac/AgenticCursor.tsx",
      "frontend/src/app/components/Onboarding/ac/acRuntime.ts",
      "frontend/src/app/components/overlays/PlanPicker.tsx",
      "frontend/src/app/components/editor/RichPromptEditor.tsx",
      "frontend/src/app/components/overlays/SignInGate.tsx",
      "frontend/src/app/components/editor/useDomElementSelector.ts",
      "frontend/src/app/pages/AgentChat/AgentChat.tsx",
      "frontend/src/app/pages/AgentChat/shell/ApprovalBar.tsx",
      "frontend/src/app/pages/AgentChat/shell/BrowserAgentInlineFeed.tsx",
      "frontend/src/app/pages/AgentChat/bubbles/MessageBubble.tsx",
      "frontend/src/app/pages/AgentChat/parsing/toolLabels.ts",
      "frontend/src/app/pages/Analytics/PixelChart.tsx",
      "frontend/src/app/pages/Commands/Commands.tsx",
      "frontend/src/app/pages/Dashboard/cards/AgentCard.tsx",
      "frontend/src/app/pages/Dashboard/cards/BrowserAgentOverlay.tsx",
      "frontend/src/app/pages/Dashboard/cards/BrowserCard.tsx",
      "frontend/src/app/pages/Dashboard/canvas/DashboardHeader.tsx",
      "frontend/src/app/pages/Dashboard/DashboardToolbar.tsx",
      "frontend/src/app/pages/Dashboard/cards/DashboardViewCard.tsx",
      "frontend/src/app/pages/Dashboard/cards/NoteCard.tsx",
      "frontend/src/app/pages/Dashboard/hooks/interaction/useCanvasControls.ts",
      "frontend/src/app/pages/DashboardSelection/DashboardSelection.tsx",
      "frontend/src/app/pages/Modes/Modes.tsx",
      "frontend/src/app/pages/Skills/SkillBuilderChat.tsx",
      "frontend/src/app/pages/Skills/Skills.tsx",
      "frontend/src/app/pages/Views/ViewEditor.tsx",
      "frontend/src/app/pages/Views/ViewPreview.tsx",
      "frontend/src/app/pages/Views/useIframeElementSelector.ts",
      "frontend/src/shared/browserCommandHandler.ts",
      "frontend/src/shared/state/agentsSlice.ts",
      "frontend/src/shared/state/dashboardLayoutSlice.ts",
      "frontend/src/shared/ws/WebSocketManager.ts"
    ],
    "max-folder-items": [
      "backend",
      "backend/apps",
      "backend/apps/agents",
      "backend/apps/agents/core",
      "backend/apps/outputs",
      "backend/apps/tools_lib",
      "backend/tests",
      "frontend/src/shared",
      "frontend/src/shared/state",
      "frontend/src/shared/hooks",
      "frontend/src/app/pages",
      "frontend/src/app/pages/AgentChat",
      "frontend/src/app/pages/AgentChat/ChatInput",
      "frontend/src/app/pages/AgentChat/ChatInput/hooks",
      "frontend/src/app/pages/AgentChat/mcp-cards",
      "frontend/src/app/pages/Settings/sections",
      "frontend/src/app/pages/Views",
      "frontend/src/app/components/Onboarding",
      "frontend/src/app/components/Onboarding/steps",
      "scripts",
      "electron",
      "linter/checks"
    ],
    "no-nested-imports": [],
    "import-cycles": [],
    "vulture": ["backend/tests/*"],
    "endpoints": [],
    "classes": []
  }
}
