{
  "version": "act 2.7.0",
  "language_id": "sass",
  "language_name": "Sass (indented syntax)",
  "url": "https://act101.ai/docs/languages/sass",
  "is_premium": false,
  "operations": [
    {
      "anchor": "op-callers",
      "name": "callers",
      "category": "Query",
      "description": "Find every call site of a function or method across the codebase. Use to understand who depends on a function before changing its signature. Requires LSP; the language server starts on the first call, and the answer names it in `resolved_by` (e.g. `lsp:rust-analyzer`). Params: symbol (string) [, file (string)]"
    },
    {
      "anchor": "op-control-flow",
      "name": "control_flow",
      "category": "Query",
      "description": "Get a function's control flow \u2014 branches, loops, early returns, and basic blocks in execution order. Use to understand complex logic without reading the full implementation. Params: target (string), file (string)"
    },
    {
      "anchor": "op-data-flow",
      "name": "data_flow",
      "category": "Query",
      "description": "Intra-procedural def-use \u2014 variable definitions, uses, def\u2192use edges, and which locals flow into the return. The dual of control_flow. Single-file. Params: target (string), file (string)"
    },
    {
      "anchor": "op-definition",
      "name": "definition",
      "category": "Query",
      "description": "Jump to definition \u2014 find where a symbol is defined given a usage location. Uses AST-based parsing by default, no LSP required. Params: symbol (string), file (string), line (u32), column (u32)"
    },
    {
      "anchor": "op-diagnostics",
      "name": "diagnostics",
      "category": "Query",
      "description": "Preflight check: compiler errors and warnings from the language server. Run it once over the change, not once per file per turn \u2014 pass `files` with the paths you edited. `file` scopes to one path or directory; omitting both checks the workspace. Broad scopes list the first `limit` diagnostics (default 20) and summarise the rest as per-file counts, and the response is capped so it always fits in one reply. Requires LSP. Params: none [, files (string[]), file (string), limit (usize, default 20), errors_only (bool, default false)]"
    },
    {
      "anchor": "op-effect-closure",
      "name": "effect_closure",
      "category": "Query",
      "description": "Transitive effect closure of a function across the call graph \u2014 composed reads/writes/raises/allocates/blocks/awaits with provenance, recorded cycles, and the unresolved-call frontier. Params: target (string), file (string) [, max_depth (u32), max_nodes (u32)]"
    },
    {
      "anchor": "op-effect-summary",
      "name": "effect_summary",
      "category": "Query",
      "description": "Get a function's effect signature \u2014 reads, writes, raises, allocates, blocking calls, and awaits \u2014 plus the unresolved-call frontier. Single-file, intra-procedural. Params: target (string), file (string)"
    },
    {
      "anchor": "op-fix-auto",
      "name": "fix_auto",
      "category": "Query",
      "description": "Auto-fix all deterministic issues in a file, directory, or workspace \u2014 missing imports, unused imports, simple type errors. Runs multiple fix-revalidate cycles. Use after making changes to clean up automatically. Requires LSP. Params: none [, file (string), category (string), commit (bool), max_rounds (u32)]"
    },
    {
      "anchor": "op-get-type",
      "name": "get_type",
      "category": "Query",
      "description": "Get the compiler-inferred type of any expression at a position. Use to understand types without reading surrounding code. Requires LSP. Params: file (string), line (u32), column (u32)"
    },
    {
      "anchor": "op-graph",
      "name": "graph",
      "category": "Query",
      "description": "Build a dependency graph from a file \u2014 trace what it imports and what imports it, across multiple hops. Use to understand module relationships and change impact before refactoring. Params: file (string) [, depth (u32), direction (string), leaves (bool), order (string)]"
    },
    {
      "anchor": "op-import-organize",
      "name": "import_organize",
      "category": "Query",
      "description": "Organize, sort, and deduplicate imports in a file. Removes unused imports. Use after adding new code or moving symbols to clean up import blocks automatically. Params: file (string) [, preview (bool)]"
    },
    {
      "anchor": "op-interface",
      "name": "interface",
      "category": "Query",
      "description": "Get a symbol's public API \u2014 signatures, types, and docstrings without implementation bodies. Like skeleton but for a single symbol. Use to understand how to call something without reading its internals. Params: target (string), file (string) [, include_private (bool)]"
    },
    {
      "anchor": "op-mutations",
      "name": "mutations",
      "category": "Query",
      "description": "Identify side effects \u2014 what external state a function reads or writes (globals, file I/O, network, etc.). Use to understand if a function is pure or has hidden dependencies. Params: target (string), file (string)"
    },
    {
      "anchor": "op-references",
      "name": "references",
      "category": "Query",
      "description": "Find every usage of a symbol across the entire codebase \u2014 all files, not just the current one. Use before renaming, refactoring, or deleting to understand full impact. Requires LSP; the language server starts on the first call, and the answer names it in `resolved_by` (e.g. `lsp:rust-analyzer`). Params: symbol (string), file (string)"
    },
    {
      "anchor": "op-repo-outline",
      "name": "repo_outline",
      "category": "Query",
      "description": "Get a compressed overview of the repository \u2014 file tree with languages and line counts. Scope it: unscoped on a medium repo this is ~10,000 tokens that stay in context for the rest of the session, where `depth`, `include` or `max_files` answer the same question for a few hundred. `symbols: true` adds every top-level name and multiplies the size again. Params: none [, path (string), depth (u32), include (glob), exclude (glob), symbols (bool), max_files (u32), relative (bool)]"
    },
    {
      "anchor": "op-skeleton",
      "name": "skeleton",
      "category": "Query",
      "description": "Get a file's structure \u2014 function signatures, class declarations, type definitions \u2014 without implementation bodies. Use INSTEAD of reading the full file to understand its API. Typically 5-10x fewer tokens than reading the raw file. Params: file (string)"
    },
    {
      "anchor": "op-symbols",
      "name": "symbols",
      "category": "Query",
      "description": "List all symbols (functions, classes, variables, types, constants) defined in a file with their locations and kinds. Use INSTEAD of reading a file when you need to know what's defined in it. Much cheaper than reading the full file. IMPORTANT: file must be a path to a single source file \u2014 never a directory or empty string. Params: file (string)"
    },
    {
      "anchor": "op-symbols-batch",
      "name": "symbols_batch",
      "category": "Query",
      "description": "Retrieve symbols from multiple files in a single call, instead of calling symbols() in a loop. Pass `pattern` (name regex) or `kinds` unless you genuinely need every symbol: three medium files unfiltered is ~10,000 tokens and the same query filtered is ~300. If you want one symbol's location, `symbols` on its file with a pattern is cheaper still. Params: none [, files (string[]), ids (string[]), kinds (string[]), pattern (string)] \u2014 provide files or ids"
    }
  ]
}