{"v":1,"type":"meta","startedAt":"2026-08-20T00:02:42.466Z","label":"gitmcp-io","command":["fitness-report","https://gitmcp.io/docs"],"mcpTapVersion":"0.1.0","kind":"mcp","source":"fitness-report@0.1.0","producer":{"name":"fitness-report","version":"0.1.0","configHash":"a6a7e2cb34775af0cb2a564aa2014967ca5d152239dba2d290c28eefd9066e72"}}
{"t":"2026-08-20T00:02:42.478Z","dir":"in","raw":{"jsonrpc":"2.0","id":"server-discover-probe-1","method":"server/discover","params":{"_meta":{"io.modelcontextprotocol/protocolVersion":"2026-07-28","io.modelcontextprotocol/clientInfo":{"name":"fitness-report","version":"0.1.0"},"io.modelcontextprotocol/clientCapabilities":{"elicitation":{}}}}}}
{"t":"2026-08-20T00:02:42.860Z","dir":"in","raw":{"method":"initialize","params":{"protocolVersion":"2025-11-25","capabilities":{"elicitation":{}},"clientInfo":{"name":"fitness-report","version":"0.1.0"}},"jsonrpc":"2.0","id":0}}
{"t":"2026-08-20T00:02:43.725Z","dir":"out","raw":{"jsonrpc":"2.0","id":0,"result":{"protocolVersion":"2025-03-26","capabilities":{"tools":{"listChanged":true}},"serverInfo":{"name":"GitMCP","version":"1.1.0"}}}}
{"t":"2026-08-20T00:02:43.727Z","dir":"in","raw":{"jsonrpc":"2.0","method":"notifications/initialized"}}
{"t":"2026-08-20T00:02:43.943Z","dir":"in","raw":{"jsonrpc":"2.0","id":"fitness-probe-bogus-version","method":"initialize","params":{"protocolVersion":"1999-01-01","capabilities":{},"clientInfo":{"name":"fitness-report","version":"0.1.0"}}}}
{"t":"2026-08-20T00:02:54.646Z","dir":"out","raw":{"jsonrpc":"2.0","id":"fitness-probe-bogus-version","result":{"protocolVersion":"2025-03-26","capabilities":{"tools":{"listChanged":true}},"serverInfo":{"name":"GitMCP","version":"1.1.0"}}}}
{"t":"2026-08-20T00:02:54.903Z","dir":"in","raw":{"method":"tools/list","jsonrpc":"2.0","id":1}}
{"t":"2026-08-20T00:02:55.004Z","dir":"out","raw":{"jsonrpc":"2.0","id":1,"result":{"tools":[{"name":"match_common_libs_owner_repo_mapping","description":"Match a library name to an owner/repo. Don't use it if you have an owner and repo already. Use this first if only a library name was provided. If found - you can use owner and repo to call other tools. If not found - try to use the library name directly in other tools.","inputSchema":{"type":"object","properties":{"library":{"type":"string","description":"The name of the library to try and match to an owner/repo."}},"required":["library"],"additionalProperties":false,"$schema":"http://json-schema.org/draft-07/schema#"}},{"name":"fetch_generic_documentation","description":"Fetch documentation for any GitHub repository by providing owner and project name","inputSchema":{"type":"object","properties":{"owner":{"type":"string","description":"The GitHub repository owner (username or organization)"},"repo":{"type":"string","description":"The GitHub repository name"}},"required":["owner","repo"],"additionalProperties":false,"$schema":"http://json-schema.org/draft-07/schema#"}},{"name":"search_generic_documentation","description":"Semantically search in documentation for any GitHub repository by providing owner, project name, and search query. Useful for specific queries.","inputSchema":{"type":"object","properties":{"owner":{"type":"string","description":"The GitHub repository owner (username or organization)"},"repo":{"type":"string","description":"The GitHub repository name"},"query":{"type":"string","description":"The search query to find relevant documentation"}},"required":["owner","repo","query"],"additionalProperties":false,"$schema":"http://json-schema.org/draft-07/schema#"}},{"name":"search_generic_code","description":"Search for code in any GitHub repository by providing owner, project name, and search query. Returns matching files. Supports pagination with 30 results per page.","inputSchema":{"type":"object","properties":{"owner":{"type":"string","description":"The GitHub repository owner (username or organization)"},"repo":{"type":"string","description":"The GitHub repository name"},"query":{"type":"string","description":"The search query to find relevant code files"},"page":{"type":"number","description":"Page number to retrieve (starting from 1). Each page contains 30 results."}},"required":["owner","repo","query"],"additionalProperties":false,"$schema":"http://json-schema.org/draft-07/schema#"}},{"name":"fetch_generic_url_content","description":"Generic tool to fetch content from any absolute URL, respecting robots.txt rules. Use this to retrieve referenced urls (absolute urls) that were mentioned in previously fetched documentation.","inputSchema":{"type":"object","properties":{"url":{"type":"string","description":"The URL of the document or page to fetch"}},"required":["url"],"additionalProperties":false,"$schema":"http://json-schema.org/draft-07/schema#"}}]}}}
{"t":"2026-08-20T00:02:55.008Z","dir":"in","raw":{"method":"tools/list","jsonrpc":"2.0","id":2}}
{"t":"2026-08-20T00:02:55.091Z","dir":"out","raw":{"jsonrpc":"2.0","id":2,"result":{"tools":[{"name":"match_common_libs_owner_repo_mapping","description":"Match a library name to an owner/repo. Don't use it if you have an owner and repo already. Use this first if only a library name was provided. If found - you can use owner and repo to call other tools. If not found - try to use the library name directly in other tools.","inputSchema":{"type":"object","properties":{"library":{"type":"string","description":"The name of the library to try and match to an owner/repo."}},"required":["library"],"additionalProperties":false,"$schema":"http://json-schema.org/draft-07/schema#"}},{"name":"fetch_generic_documentation","description":"Fetch documentation for any GitHub repository by providing owner and project name","inputSchema":{"type":"object","properties":{"owner":{"type":"string","description":"The GitHub repository owner (username or organization)"},"repo":{"type":"string","description":"The GitHub repository name"}},"required":["owner","repo"],"additionalProperties":false,"$schema":"http://json-schema.org/draft-07/schema#"}},{"name":"search_generic_documentation","description":"Semantically search in documentation for any GitHub repository by providing owner, project name, and search query. Useful for specific queries.","inputSchema":{"type":"object","properties":{"owner":{"type":"string","description":"The GitHub repository owner (username or organization)"},"repo":{"type":"string","description":"The GitHub repository name"},"query":{"type":"string","description":"The search query to find relevant documentation"}},"required":["owner","repo","query"],"additionalProperties":false,"$schema":"http://json-schema.org/draft-07/schema#"}},{"name":"search_generic_code","description":"Search for code in any GitHub repository by providing owner, project name, and search query. Returns matching files. Supports pagination with 30 results per page.","inputSchema":{"type":"object","properties":{"owner":{"type":"string","description":"The GitHub repository owner (username or organization)"},"repo":{"type":"string","description":"The GitHub repository name"},"query":{"type":"string","description":"The search query to find relevant code files"},"page":{"type":"number","description":"Page number to retrieve (starting from 1). Each page contains 30 results."}},"required":["owner","repo","query"],"additionalProperties":false,"$schema":"http://json-schema.org/draft-07/schema#"}},{"name":"fetch_generic_url_content","description":"Generic tool to fetch content from any absolute URL, respecting robots.txt rules. Use this to retrieve referenced urls (absolute urls) that were mentioned in previously fetched documentation.","inputSchema":{"type":"object","properties":{"url":{"type":"string","description":"The URL of the document or page to fetch"}},"required":["url"],"additionalProperties":false,"$schema":"http://json-schema.org/draft-07/schema#"}}]}}}
{"t":"2026-08-20T00:07:51.067Z","dir":"event","kind":"fitness.synthesis","raw":{"suiteHash":"a6a7e2cb34775af0cb2a564aa2014967ca5d152239dba2d290c28eefd9066e72","generatorVersion":"fitness-report-generator/2","generatorModel":"claude-opus-5","yield":{"emitted":24,"rewritten":1,"candidates":24,"entriesDiscarded":0,"admitted":12,"trimmed":6,"admissionRate":0.5,"reconciles":true,"shortfall":0,"minTasks":8,"insufficient":false},"dropsByRule":{"invalid-check":6},"nullScreen":{"enabled":true,"model":"claude-sonnet-5","screened":0,"dropped":0,"errors":0,"inputTokens":0,"outputTokens":0},"repairs":1,"leaksAtGeneration":1,"regenerationAttempted":true,"failure":null,"detail":"full ledger in suite-meta.json"}}
{"t":"2026-08-20T00:07:51.067Z","dir":"event","kind":"fitness.null_screen","raw":{"taskId":"npm-execa-latest-version","checkKind":"tool_result_matches","screenable":false,"coldPassed":null},"corr_id":"npm-execa-latest-version::screen"}
{"t":"2026-08-20T00:07:51.067Z","dir":"event","kind":"fitness.null_screen","raw":{"taskId":"npm-nanoid-latest-version","checkKind":"tool_result_matches","screenable":false,"coldPassed":null},"corr_id":"npm-nanoid-latest-version::screen"}
{"t":"2026-08-20T00:07:51.067Z","dir":"event","kind":"fitness.null_screen","raw":{"taskId":"nushell-config-env-file","checkKind":"tool_result_matches","screenable":false,"coldPassed":null},"corr_id":"nushell-config-env-file::screen"}
{"t":"2026-08-20T00:07:51.067Z","dir":"event","kind":"fitness.null_screen","raw":{"taskId":"atuin-default-sync-address","checkKind":"tool_result_matches","screenable":false,"coldPassed":null},"corr_id":"atuin-default-sync-address::screen"}
{"t":"2026-08-20T00:07:51.067Z","dir":"event","kind":"fitness.null_screen","raw":{"taskId":"fd-per-directory-ignore-file","checkKind":"tool_result_matches","screenable":false,"coldPassed":null},"corr_id":"fd-per-directory-ignore-file::screen"}
{"t":"2026-08-20T00:07:51.067Z","dir":"event","kind":"fitness.null_screen","raw":{"taskId":"bytehound-output-env-var","checkKind":"tool_result_matches","screenable":false,"coldPassed":null},"corr_id":"bytehound-output-env-var::screen"}
{"t":"2026-08-20T00:07:51.067Z","dir":"event","kind":"fitness.null_screen","raw":{"taskId":"ripgrep-config-env-var","checkKind":"tool_result_matches","screenable":false,"coldPassed":null},"corr_id":"ripgrep-config-env-var::screen"}
{"t":"2026-08-20T00:07:51.067Z","dir":"event","kind":"fitness.null_screen","raw":{"taskId":"gum-pager-source-files","checkKind":"tool_result_matches","screenable":false,"coldPassed":null},"corr_id":"gum-pager-source-files::screen"}
{"t":"2026-08-20T00:07:51.067Z","dir":"event","kind":"fitness.null_screen","raw":{"taskId":"lazygit-user-config-path","checkKind":"tool_result_matches","screenable":false,"coldPassed":null},"corr_id":"lazygit-user-config-path::screen"}
{"t":"2026-08-20T00:07:51.067Z","dir":"event","kind":"fitness.null_screen","raw":{"taskId":"helix-language-config-file","checkKind":"tool_result_matches","screenable":false,"coldPassed":null},"corr_id":"helix-language-config-file::screen"}
{"t":"2026-08-20T00:07:51.067Z","dir":"event","kind":"fitness.null_screen","raw":{"taskId":"yazi-keybinding-config-file","checkKind":"tool_result_matches","screenable":false,"coldPassed":null},"corr_id":"yazi-keybinding-config-file::screen"}
{"t":"2026-08-20T00:07:51.067Z","dir":"event","kind":"fitness.null_screen","raw":{"taskId":"n-install-prefix-env","checkKind":"tool_result_matches","screenable":false,"coldPassed":null},"corr_id":"n-install-prefix-env::screen"}
{"t":"2026-08-20T00:07:51.067Z","dir":"event","kind":"fitness.null_screen","raw":{"taskId":"crossref-get-tsconfig-paths-matcher","checkKind":"tool_result_matches","screenable":false,"coldPassed":null},"corr_id":"crossref-get-tsconfig-paths-matcher::screen"}
{"t":"2026-08-20T00:07:51.067Z","dir":"event","kind":"fitness.null_screen","raw":{"taskId":"crossref-ofetch-alias-export","checkKind":"tool_result_matches","screenable":false,"coldPassed":null},"corr_id":"crossref-ofetch-alias-export::screen"}
{"t":"2026-08-20T00:07:51.067Z","dir":"event","kind":"fitness.null_screen","raw":{"taskId":"atuin-settings-source-file","checkKind":"tool_result_matches","screenable":false,"coldPassed":null},"corr_id":"atuin-settings-source-file::screen"}
{"t":"2026-08-20T00:07:51.067Z","dir":"event","kind":"fitness.null_screen","raw":{"taskId":"hyperfine-export-formats","checkKind":"tool_result_matches","screenable":false,"coldPassed":null},"corr_id":"hyperfine-export-formats::screen"}
{"t":"2026-08-20T00:07:51.067Z","dir":"event","kind":"fitness.null_screen","raw":{"taskId":"starship-nix-shell-module","checkKind":"tool_result_matches","screenable":false,"coldPassed":null},"corr_id":"starship-nix-shell-module::screen"}
{"t":"2026-08-20T00:07:51.067Z","dir":"event","kind":"fitness.null_screen","raw":{"taskId":"just-recipe-attribute-no-cd","checkKind":"tool_result_matches","screenable":false,"coldPassed":null},"corr_id":"just-recipe-attribute-no-cd::screen"}
{"t":"2026-08-20T00:07:51.072Z","dir":"event","kind":"fitness.gate","raw":{"gate":"structural","ok":true,"reason":"ok"}}
{"t":"2026-08-20T00:07:51.075Z","dir":"event","kind":"fitness.task_start","raw":{"taskId":"npm-execa-latest-version","toolMode":"none","model":"claude-sonnet-5","budget":20000,"maxIterations":2},"corr_id":"npm-execa-latest-version::null-no-tools"}
{"t":"2026-08-20T00:07:55.778Z","dir":"event","kind":"fitness.task_end","raw":{"taskId":"npm-execa-latest-version","success":false,"firstTrySuccess":false,"checkResult":false,"failure":null,"stopReason":"end_turn","toolCalls":0,"unconfirmedDestructiveCalls":0,"error":null},"corr_id":"npm-execa-latest-version::null-no-tools"}
{"t":"2026-08-20T00:07:55.778Z","dir":"event","kind":"fitness.task_start","raw":{"taskId":"npm-nanoid-latest-version","toolMode":"none","model":"claude-sonnet-5","budget":20000,"maxIterations":2},"corr_id":"npm-nanoid-latest-version::null-no-tools"}
{"t":"2026-08-20T00:08:00.176Z","dir":"event","kind":"fitness.task_end","raw":{"taskId":"npm-nanoid-latest-version","success":false,"firstTrySuccess":false,"checkResult":false,"failure":null,"stopReason":"end_turn","toolCalls":0,"unconfirmedDestructiveCalls":0,"error":null},"corr_id":"npm-nanoid-latest-version::null-no-tools"}
{"t":"2026-08-20T00:08:00.177Z","dir":"event","kind":"fitness.task_start","raw":{"taskId":"nushell-config-env-file","toolMode":"none","model":"claude-sonnet-5","budget":20000,"maxIterations":2},"corr_id":"nushell-config-env-file::null-no-tools"}
{"t":"2026-08-20T00:08:04.234Z","dir":"event","kind":"fitness.task_end","raw":{"taskId":"nushell-config-env-file","success":false,"firstTrySuccess":false,"checkResult":false,"failure":null,"stopReason":"end_turn","toolCalls":0,"unconfirmedDestructiveCalls":0,"error":null},"corr_id":"nushell-config-env-file::null-no-tools"}
{"t":"2026-08-20T00:08:04.234Z","dir":"event","kind":"fitness.task_start","raw":{"taskId":"atuin-default-sync-address","toolMode":"none","model":"claude-sonnet-5","budget":20000,"maxIterations":2},"corr_id":"atuin-default-sync-address::null-no-tools"}
{"t":"2026-08-20T00:08:08.414Z","dir":"event","kind":"fitness.task_end","raw":{"taskId":"atuin-default-sync-address","success":false,"firstTrySuccess":false,"checkResult":false,"failure":null,"stopReason":"end_turn","toolCalls":0,"unconfirmedDestructiveCalls":0,"error":null},"corr_id":"atuin-default-sync-address::null-no-tools"}
{"t":"2026-08-20T00:08:08.414Z","dir":"event","kind":"fitness.task_start","raw":{"taskId":"fd-per-directory-ignore-file","toolMode":"none","model":"claude-sonnet-5","budget":20000,"maxIterations":2},"corr_id":"fd-per-directory-ignore-file::null-no-tools"}
{"t":"2026-08-20T00:08:10.725Z","dir":"event","kind":"fitness.task_end","raw":{"taskId":"fd-per-directory-ignore-file","success":false,"firstTrySuccess":false,"checkResult":false,"failure":null,"stopReason":"end_turn","toolCalls":0,"unconfirmedDestructiveCalls":0,"error":null},"corr_id":"fd-per-directory-ignore-file::null-no-tools"}
{"t":"2026-08-20T00:08:10.725Z","dir":"event","kind":"fitness.task_start","raw":{"taskId":"bytehound-output-env-var","toolMode":"none","model":"claude-sonnet-5","budget":20000,"maxIterations":2},"corr_id":"bytehound-output-env-var::null-no-tools"}
{"t":"2026-08-20T00:08:13.899Z","dir":"event","kind":"fitness.task_end","raw":{"taskId":"bytehound-output-env-var","success":false,"firstTrySuccess":false,"checkResult":false,"failure":null,"stopReason":"end_turn","toolCalls":0,"unconfirmedDestructiveCalls":0,"error":null},"corr_id":"bytehound-output-env-var::null-no-tools"}
{"t":"2026-08-20T00:08:13.906Z","dir":"event","kind":"fitness.task_start","raw":{"taskId":"ripgrep-config-env-var","toolMode":"none","model":"claude-sonnet-5","budget":20000,"maxIterations":2},"corr_id":"ripgrep-config-env-var::null-no-tools"}
{"t":"2026-08-20T00:08:16.444Z","dir":"event","kind":"fitness.task_end","raw":{"taskId":"ripgrep-config-env-var","success":false,"firstTrySuccess":false,"checkResult":false,"failure":null,"stopReason":"end_turn","toolCalls":0,"unconfirmedDestructiveCalls":0,"error":null},"corr_id":"ripgrep-config-env-var::null-no-tools"}
{"t":"2026-08-20T00:08:16.445Z","dir":"event","kind":"fitness.task_start","raw":{"taskId":"gum-pager-source-files","toolMode":"none","model":"claude-sonnet-5","budget":20000,"maxIterations":2},"corr_id":"gum-pager-source-files::null-no-tools"}
{"t":"2026-08-20T00:08:19.111Z","dir":"event","kind":"fitness.task_end","raw":{"taskId":"gum-pager-source-files","success":false,"firstTrySuccess":false,"checkResult":false,"failure":null,"stopReason":"end_turn","toolCalls":0,"unconfirmedDestructiveCalls":0,"error":null},"corr_id":"gum-pager-source-files::null-no-tools"}
{"t":"2026-08-20T00:08:19.118Z","dir":"event","kind":"fitness.task_start","raw":{"taskId":"lazygit-user-config-path","toolMode":"none","model":"claude-sonnet-5","budget":20000,"maxIterations":2},"corr_id":"lazygit-user-config-path::null-no-tools"}
{"t":"2026-08-20T00:08:22.750Z","dir":"event","kind":"fitness.task_end","raw":{"taskId":"lazygit-user-config-path","success":false,"firstTrySuccess":false,"checkResult":false,"failure":null,"stopReason":"end_turn","toolCalls":0,"unconfirmedDestructiveCalls":0,"error":null},"corr_id":"lazygit-user-config-path::null-no-tools"}
{"t":"2026-08-20T00:08:22.750Z","dir":"event","kind":"fitness.task_start","raw":{"taskId":"helix-language-config-file","toolMode":"none","model":"claude-sonnet-5","budget":20000,"maxIterations":2},"corr_id":"helix-language-config-file::null-no-tools"}
{"t":"2026-08-20T00:08:25.227Z","dir":"event","kind":"fitness.task_end","raw":{"taskId":"helix-language-config-file","success":false,"firstTrySuccess":false,"checkResult":false,"failure":null,"stopReason":"end_turn","toolCalls":0,"unconfirmedDestructiveCalls":0,"error":null},"corr_id":"helix-language-config-file::null-no-tools"}
{"t":"2026-08-20T00:08:25.227Z","dir":"event","kind":"fitness.task_start","raw":{"taskId":"yazi-keybinding-config-file","toolMode":"none","model":"claude-sonnet-5","budget":20000,"maxIterations":2},"corr_id":"yazi-keybinding-config-file::null-no-tools"}
{"t":"2026-08-20T00:08:29.257Z","dir":"event","kind":"fitness.task_end","raw":{"taskId":"yazi-keybinding-config-file","success":false,"firstTrySuccess":false,"checkResult":false,"failure":null,"stopReason":"end_turn","toolCalls":0,"unconfirmedDestructiveCalls":0,"error":null},"corr_id":"yazi-keybinding-config-file::null-no-tools"}
{"t":"2026-08-20T00:08:29.257Z","dir":"event","kind":"fitness.task_start","raw":{"taskId":"n-install-prefix-env","toolMode":"none","model":"claude-sonnet-5","budget":20000,"maxIterations":2},"corr_id":"n-install-prefix-env::null-no-tools"}
{"t":"2026-08-20T00:08:32.566Z","dir":"event","kind":"fitness.task_end","raw":{"taskId":"n-install-prefix-env","success":false,"firstTrySuccess":false,"checkResult":false,"failure":null,"stopReason":"end_turn","toolCalls":0,"unconfirmedDestructiveCalls":0,"error":null},"corr_id":"n-install-prefix-env::null-no-tools"}
{"t":"2026-08-20T00:08:32.567Z","dir":"event","kind":"fitness.task_start","raw":{"taskId":"npm-execa-latest-version","toolMode":"stub","model":"claude-sonnet-5","budget":20000,"maxIterations":2},"corr_id":"npm-execa-latest-version::null-stubbed-empty"}
{"t":"2026-08-20T00:08:38.308Z","dir":"event","kind":"fitness.task_end","raw":{"taskId":"npm-execa-latest-version","success":false,"firstTrySuccess":false,"checkResult":false,"failure":null,"stopReason":"end_turn","toolCalls":0,"unconfirmedDestructiveCalls":0,"error":null},"corr_id":"npm-execa-latest-version::null-stubbed-empty"}
{"t":"2026-08-20T00:08:38.308Z","dir":"event","kind":"fitness.task_start","raw":{"taskId":"npm-nanoid-latest-version","toolMode":"stub","model":"claude-sonnet-5","budget":20000,"maxIterations":2},"corr_id":"npm-nanoid-latest-version::null-stubbed-empty"}
{"t":"2026-08-20T00:08:44.102Z","dir":"event","kind":"fitness.task_end","raw":{"taskId":"npm-nanoid-latest-version","success":false,"firstTrySuccess":false,"checkResult":false,"failure":null,"stopReason":"end_turn","toolCalls":0,"unconfirmedDestructiveCalls":0,"error":null},"corr_id":"npm-nanoid-latest-version::null-stubbed-empty"}
{"t":"2026-08-20T00:08:44.103Z","dir":"event","kind":"fitness.task_start","raw":{"taskId":"nushell-config-env-file","toolMode":"stub","model":"claude-sonnet-5","budget":20000,"maxIterations":2},"corr_id":"nushell-config-env-file::null-stubbed-empty"}
{"t":"2026-08-20T00:08:49.203Z","dir":"event","kind":"fitness.task_end","raw":{"taskId":"nushell-config-env-file","success":false,"firstTrySuccess":false,"checkResult":false,"failure":"budget-exhausted","stopReason":"tool_use","toolCalls":0,"unconfirmedDestructiveCalls":0,"error":null},"corr_id":"nushell-config-env-file::null-stubbed-empty"}
{"t":"2026-08-20T00:08:49.210Z","dir":"event","kind":"fitness.task_start","raw":{"taskId":"atuin-default-sync-address","toolMode":"stub","model":"claude-sonnet-5","budget":20000,"maxIterations":2},"corr_id":"atuin-default-sync-address::null-stubbed-empty"}
{"t":"2026-08-20T00:08:54.287Z","dir":"event","kind":"fitness.task_end","raw":{"taskId":"atuin-default-sync-address","success":false,"firstTrySuccess":false,"checkResult":false,"failure":"budget-exhausted","stopReason":"tool_use","toolCalls":0,"unconfirmedDestructiveCalls":0,"error":null},"corr_id":"atuin-default-sync-address::null-stubbed-empty"}
{"t":"2026-08-20T00:08:54.287Z","dir":"event","kind":"fitness.task_start","raw":{"taskId":"fd-per-directory-ignore-file","toolMode":"stub","model":"claude-sonnet-5","budget":20000,"maxIterations":2},"corr_id":"fd-per-directory-ignore-file::null-stubbed-empty"}
{"t":"2026-08-20T00:08:58.825Z","dir":"event","kind":"fitness.task_end","raw":{"taskId":"fd-per-directory-ignore-file","success":false,"firstTrySuccess":false,"checkResult":false,"failure":"budget-exhausted","stopReason":"tool_use","toolCalls":0,"unconfirmedDestructiveCalls":0,"error":null},"corr_id":"fd-per-directory-ignore-file::null-stubbed-empty"}
{"t":"2026-08-20T00:08:58.825Z","dir":"event","kind":"fitness.task_start","raw":{"taskId":"bytehound-output-env-var","toolMode":"stub","model":"claude-sonnet-5","budget":20000,"maxIterations":2},"corr_id":"bytehound-output-env-var::null-stubbed-empty"}
{"t":"2026-08-20T00:09:03.777Z","dir":"event","kind":"fitness.task_end","raw":{"taskId":"bytehound-output-env-var","success":false,"firstTrySuccess":false,"checkResult":false,"failure":"budget-exhausted","stopReason":"tool_use","toolCalls":0,"unconfirmedDestructiveCalls":0,"error":null},"corr_id":"bytehound-output-env-var::null-stubbed-empty"}
{"t":"2026-08-20T00:09:03.777Z","dir":"event","kind":"fitness.task_start","raw":{"taskId":"ripgrep-config-env-var","toolMode":"stub","model":"claude-sonnet-5","budget":20000,"maxIterations":2},"corr_id":"ripgrep-config-env-var::null-stubbed-empty"}
{"t":"2026-08-20T00:09:08.839Z","dir":"event","kind":"fitness.task_end","raw":{"taskId":"ripgrep-config-env-var","success":false,"firstTrySuccess":false,"checkResult":false,"failure":"budget-exhausted","stopReason":"tool_use","toolCalls":0,"unconfirmedDestructiveCalls":0,"error":null},"corr_id":"ripgrep-config-env-var::null-stubbed-empty"}
{"t":"2026-08-20T00:09:08.839Z","dir":"event","kind":"fitness.task_start","raw":{"taskId":"gum-pager-source-files","toolMode":"stub","model":"claude-sonnet-5","budget":20000,"maxIterations":2},"corr_id":"gum-pager-source-files::null-stubbed-empty"}
{"t":"2026-08-20T00:09:12.936Z","dir":"event","kind":"fitness.task_end","raw":{"taskId":"gum-pager-source-files","success":false,"firstTrySuccess":false,"checkResult":false,"failure":"budget-exhausted","stopReason":"tool_use","toolCalls":0,"unconfirmedDestructiveCalls":0,"error":null},"corr_id":"gum-pager-source-files::null-stubbed-empty"}
{"t":"2026-08-20T00:09:12.936Z","dir":"event","kind":"fitness.task_start","raw":{"taskId":"lazygit-user-config-path","toolMode":"stub","model":"claude-sonnet-5","budget":20000,"maxIterations":2},"corr_id":"lazygit-user-config-path::null-stubbed-empty"}
{"t":"2026-08-20T00:09:17.725Z","dir":"event","kind":"fitness.task_end","raw":{"taskId":"lazygit-user-config-path","success":false,"firstTrySuccess":false,"checkResult":false,"failure":"budget-exhausted","stopReason":"tool_use","toolCalls":0,"unconfirmedDestructiveCalls":0,"error":null},"corr_id":"lazygit-user-config-path::null-stubbed-empty"}
{"t":"2026-08-20T00:09:17.725Z","dir":"event","kind":"fitness.task_start","raw":{"taskId":"helix-language-config-file","toolMode":"stub","model":"claude-sonnet-5","budget":20000,"maxIterations":2},"corr_id":"helix-language-config-file::null-stubbed-empty"}
{"t":"2026-08-20T00:09:22.881Z","dir":"event","kind":"fitness.task_end","raw":{"taskId":"helix-language-config-file","success":false,"firstTrySuccess":false,"checkResult":false,"failure":"budget-exhausted","stopReason":"tool_use","toolCalls":0,"unconfirmedDestructiveCalls":0,"error":null},"corr_id":"helix-language-config-file::null-stubbed-empty"}
{"t":"2026-08-20T00:09:22.881Z","dir":"event","kind":"fitness.task_start","raw":{"taskId":"yazi-keybinding-config-file","toolMode":"stub","model":"claude-sonnet-5","budget":20000,"maxIterations":2},"corr_id":"yazi-keybinding-config-file::null-stubbed-empty"}
{"t":"2026-08-20T00:09:28.388Z","dir":"event","kind":"fitness.task_end","raw":{"taskId":"yazi-keybinding-config-file","success":false,"firstTrySuccess":false,"checkResult":false,"failure":"budget-exhausted","stopReason":"tool_use","toolCalls":0,"unconfirmedDestructiveCalls":0,"error":null},"corr_id":"yazi-keybinding-config-file::null-stubbed-empty"}
{"t":"2026-08-20T00:09:28.389Z","dir":"event","kind":"fitness.task_start","raw":{"taskId":"n-install-prefix-env","toolMode":"stub","model":"claude-sonnet-5","budget":20000,"maxIterations":2},"corr_id":"n-install-prefix-env::null-stubbed-empty"}
{"t":"2026-08-20T00:09:32.753Z","dir":"event","kind":"fitness.task_end","raw":{"taskId":"n-install-prefix-env","success":false,"firstTrySuccess":false,"checkResult":false,"failure":"budget-exhausted","stopReason":"tool_use","toolCalls":0,"unconfirmedDestructiveCalls":0,"error":null},"corr_id":"n-install-prefix-env::null-stubbed-empty"}
{"t":"2026-08-20T00:09:32.755Z","dir":"in","raw":{"method":"tools/call","params":{"name":"fetch_generic_url_content","arguments":{"url":"q627"}},"jsonrpc":"2.0","id":3},"corr_id":"npm-execa-latest-version::null-random"}
{"t":"2026-08-20T00:09:33.309Z","dir":"out","raw":{"jsonrpc":"2.0","id":3,"result":{"url":"q627","status":"not_found","content":[{"type":"text","text":"Content at q627 could not be retrieved. The resource may not exist or may require authentication."}]}},"corr_id":"npm-execa-latest-version::null-random"}
{"t":"2026-08-20T00:09:33.310Z","dir":"event","kind":"fitness.null_baseline","raw":{"model":"random-valid-args","taskId":"npm-execa-latest-version","passed":false},"corr_id":"npm-execa-latest-version::null-random"}
{"t":"2026-08-20T00:09:33.311Z","dir":"in","raw":{"method":"tools/call","params":{"name":"fetch_generic_url_content","arguments":{"url":"q2"}},"jsonrpc":"2.0","id":4},"corr_id":"npm-nanoid-latest-version::null-random"}
{"t":"2026-08-20T00:09:33.678Z","dir":"out","raw":{"jsonrpc":"2.0","id":4,"result":{"url":"q2","status":"not_found","content":[{"type":"text","text":"Content at q2 could not be retrieved. The resource may not exist or may require authentication."}]}},"corr_id":"npm-nanoid-latest-version::null-random"}
{"t":"2026-08-20T00:09:33.678Z","dir":"event","kind":"fitness.null_baseline","raw":{"model":"random-valid-args","taskId":"npm-nanoid-latest-version","passed":false},"corr_id":"npm-nanoid-latest-version::null-random"}
{"t":"2026-08-20T00:09:33.679Z","dir":"in","raw":{"method":"tools/call","params":{"name":"match_common_libs_owner_repo_mapping","arguments":{"library":"q527"}},"jsonrpc":"2.0","id":5},"corr_id":"nushell-config-env-file::null-random"}
{"t":"2026-08-20T00:09:33.876Z","dir":"out","raw":{"jsonrpc":"2.0","id":5,"result":{"content":[{"type":"text","text":"No owner/repo found for q527"}]}},"corr_id":"nushell-config-env-file::null-random"}
{"t":"2026-08-20T00:09:33.877Z","dir":"in","raw":{"method":"tools/call","params":{"name":"search_generic_documentation","arguments":{"owner":"q981","repo":"q968","query":"q281"}},"jsonrpc":"2.0","id":6},"corr_id":"nushell-config-env-file::null-random"}
{"t":"2026-08-20T00:09:42.364Z","dir":"out","raw":{"jsonrpc":"2.0","id":6,"result":{"searchQuery":"q281","content":[{"type":"text","text":"### Search Results for: \"q281\"\n\nNo relevant documentation found for your query. It's either being indexed or the search query did not match any documentation.\n\nAs a fallback, this is the documentation for q981/q968:\n\nNo documentation found.\n\nIf you'd like to retry the search, try changing the query to increase the likelihood of a match."}]}},"corr_id":"nushell-config-env-file::null-random"}
{"t":"2026-08-20T00:09:42.365Z","dir":"event","kind":"fitness.null_baseline","raw":{"model":"random-valid-args","taskId":"nushell-config-env-file","passed":false},"corr_id":"nushell-config-env-file::null-random"}
{"t":"2026-08-20T00:09:42.366Z","dir":"in","raw":{"method":"tools/call","params":{"name":"search_generic_documentation","arguments":{"owner":"q612","repo":"q720","query":"q425"}},"jsonrpc":"2.0","id":7},"corr_id":"atuin-default-sync-address::null-random"}
{"t":"2026-08-20T00:09:50.991Z","dir":"out","raw":{"jsonrpc":"2.0","id":7,"result":{"searchQuery":"q425","content":[{"type":"text","text":"### Search Results for: \"q425\"\n\nNo relevant documentation found for your query. It's either being indexed or the search query did not match any documentation.\n\nAs a fallback, this is the documentation for q612/q720:\n\nNo documentation found.\n\nIf you'd like to retry the search, try changing the query to increase the likelihood of a match."}]}},"corr_id":"atuin-default-sync-address::null-random"}
{"t":"2026-08-20T00:09:50.992Z","dir":"event","kind":"fitness.null_baseline","raw":{"model":"random-valid-args","taskId":"atuin-default-sync-address","passed":false},"corr_id":"atuin-default-sync-address::null-random"}
{"t":"2026-08-20T00:09:50.992Z","dir":"in","raw":{"method":"tools/call","params":{"name":"search_generic_documentation","arguments":{"owner":"q994","repo":"q455","query":"q488"}},"jsonrpc":"2.0","id":8},"corr_id":"fd-per-directory-ignore-file::null-random"}
{"t":"2026-08-20T00:09:59.433Z","dir":"out","raw":{"jsonrpc":"2.0","id":8,"result":{"searchQuery":"q488","content":[{"type":"text","text":"### Search Results for: \"q488\"\n\nNo relevant documentation found for your query. It's either being indexed or the search query did not match any documentation.\n\nAs a fallback, this is the documentation for q994/q455:\n\nNo documentation found.\n\nIf you'd like to retry the search, try changing the query to increase the likelihood of a match."}]}},"corr_id":"fd-per-directory-ignore-file::null-random"}
{"t":"2026-08-20T00:09:59.433Z","dir":"event","kind":"fitness.null_baseline","raw":{"model":"random-valid-args","taskId":"fd-per-directory-ignore-file","passed":false},"corr_id":"fd-per-directory-ignore-file::null-random"}
{"t":"2026-08-20T00:09:59.434Z","dir":"in","raw":{"method":"tools/call","params":{"name":"search_generic_documentation","arguments":{"owner":"q138","repo":"q403","query":"q247"}},"jsonrpc":"2.0","id":9},"corr_id":"bytehound-output-env-var::null-random"}
{"t":"2026-08-20T00:10:47.945Z","dir":"out","raw":{"jsonrpc":"2.0","id":9,"result":{"searchQuery":"q247","content":[{"type":"text","text":"### Search Results for: \"q247\"\n\nNo relevant documentation found for your query. It's either being indexed or the search query did not match any documentation.\n\nAs a fallback, this is the documentation for q138/q403:\n\nNo documentation found.\n\nIf you'd like to retry the search, try changing the query to increase the likelihood of a match."}]}},"corr_id":"bytehound-output-env-var::null-random"}
{"t":"2026-08-20T00:10:47.945Z","dir":"event","kind":"fitness.null_baseline","raw":{"model":"random-valid-args","taskId":"bytehound-output-env-var","passed":false},"corr_id":"bytehound-output-env-var::null-random"}
{"t":"2026-08-20T00:10:47.946Z","dir":"in","raw":{"method":"tools/call","params":{"name":"search_generic_documentation","arguments":{"owner":"q154","repo":"q489","query":"q67"}},"jsonrpc":"2.0","id":10},"corr_id":"ripgrep-config-env-var::null-random"}
{"t":"2026-08-20T00:10:56.444Z","dir":"out","raw":{"jsonrpc":"2.0","id":10,"result":{"searchQuery":"q67","content":[{"type":"text","text":"### Search Results for: \"q67\"\n\nNo relevant documentation found for your query. It's either being indexed or the search query did not match any documentation.\n\nAs a fallback, this is the documentation for q154/q489:\n\nNo documentation found.\n\nIf you'd like to retry the search, try changing the query to increase the likelihood of a match."}]}},"corr_id":"ripgrep-config-env-var::null-random"}
{"t":"2026-08-20T00:10:56.445Z","dir":"event","kind":"fitness.null_baseline","raw":{"model":"random-valid-args","taskId":"ripgrep-config-env-var","passed":false},"corr_id":"ripgrep-config-env-var::null-random"}
{"t":"2026-08-20T00:10:56.445Z","dir":"in","raw":{"method":"tools/call","params":{"name":"search_generic_code","arguments":{"owner":"q394","repo":"q767","query":"q285"}},"jsonrpc":"2.0","id":11},"corr_id":"gum-pager-source-files::null-random"}
{"t":"2026-08-20T00:10:58.098Z","dir":"out","raw":{"jsonrpc":"2.0","id":11,"result":{"searchQuery":"q285","content":[{"type":"text","text":"### Code Search Results for: \"q285\"\n\nNo code matches found in q394/q767."}]}},"corr_id":"gum-pager-source-files::null-random"}
{"t":"2026-08-20T00:10:58.098Z","dir":"event","kind":"fitness.null_baseline","raw":{"model":"random-valid-args","taskId":"gum-pager-source-files","passed":false},"corr_id":"gum-pager-source-files::null-random"}
{"t":"2026-08-20T00:10:58.098Z","dir":"in","raw":{"method":"tools/call","params":{"name":"search_generic_documentation","arguments":{"owner":"q190","repo":"q42","query":"q427"}},"jsonrpc":"2.0","id":12},"corr_id":"lazygit-user-config-path::null-random"}
{"t":"2026-08-20T00:11:47.427Z","dir":"out","raw":{"jsonrpc":"2.0","id":12,"result":{"searchQuery":"q427","content":[{"type":"text","text":"### Search Results for: \"q427\"\n\nNo relevant documentation found for your query. It's either being indexed or the search query did not match any documentation.\n\nAs a fallback, this is the documentation for q190/q42:\n\nNo documentation found.\n\nIf you'd like to retry the search, try changing the query to increase the likelihood of a match."}]}},"corr_id":"lazygit-user-config-path::null-random"}
{"t":"2026-08-20T00:11:47.427Z","dir":"event","kind":"fitness.null_baseline","raw":{"model":"random-valid-args","taskId":"lazygit-user-config-path","passed":false},"corr_id":"lazygit-user-config-path::null-random"}
{"t":"2026-08-20T00:11:47.427Z","dir":"in","raw":{"method":"tools/call","params":{"name":"search_generic_documentation","arguments":{"owner":"q590","repo":"q798","query":"q294"}},"jsonrpc":"2.0","id":13},"corr_id":"helix-language-config-file::null-random"}
{"t":"2026-08-20T00:11:55.644Z","dir":"out","raw":{"jsonrpc":"2.0","id":13,"result":{"searchQuery":"q294","content":[{"type":"text","text":"### Search Results for: \"q294\"\n\nNo relevant documentation found for your query. It's either being indexed or the search query did not match any documentation.\n\nAs a fallback, this is the documentation for q590/q798:\n\nNo documentation found.\n\nIf you'd like to retry the search, try changing the query to increase the likelihood of a match."}]}},"corr_id":"helix-language-config-file::null-random"}
{"t":"2026-08-20T00:11:55.644Z","dir":"event","kind":"fitness.null_baseline","raw":{"model":"random-valid-args","taskId":"helix-language-config-file","passed":false},"corr_id":"helix-language-config-file::null-random"}
{"t":"2026-08-20T00:11:55.645Z","dir":"in","raw":{"method":"tools/call","params":{"name":"search_generic_documentation","arguments":{"owner":"q205","repo":"q658","query":"q546"}},"jsonrpc":"2.0","id":14},"corr_id":"yazi-keybinding-config-file::null-random"}
{"t":"2026-08-20T00:12:04.000Z","dir":"out","raw":{"jsonrpc":"2.0","id":14,"result":{"searchQuery":"q546","content":[{"type":"text","text":"### Search Results for: \"q546\"\n\nNo relevant documentation found for your query. It's either being indexed or the search query did not match any documentation.\n\nAs a fallback, this is the documentation for q205/q658:\n\nNo documentation found.\n\nIf you'd like to retry the search, try changing the query to increase the likelihood of a match."}]}},"corr_id":"yazi-keybinding-config-file::null-random"}
{"t":"2026-08-20T00:12:04.000Z","dir":"event","kind":"fitness.null_baseline","raw":{"model":"random-valid-args","taskId":"yazi-keybinding-config-file","passed":false},"corr_id":"yazi-keybinding-config-file::null-random"}
{"t":"2026-08-20T00:12:04.000Z","dir":"in","raw":{"method":"tools/call","params":{"name":"fetch_generic_documentation","arguments":{"owner":"q758","repo":"q192"}},"jsonrpc":"2.0","id":15},"corr_id":"n-install-prefix-env::null-random"}
{"t":"2026-08-20T00:12:48.420Z","dir":"out","raw":{"jsonrpc":"2.0","id":15,"result":{"fileUsed":"unknown","content":[{"type":"text","text":"No documentation found."}]}},"corr_id":"n-install-prefix-env::null-random"}
{"t":"2026-08-20T00:12:48.421Z","dir":"event","kind":"fitness.null_baseline","raw":{"model":"random-valid-args","taskId":"n-install-prefix-env","passed":false},"corr_id":"n-install-prefix-env::null-random"}
{"t":"2026-08-20T00:12:48.422Z","dir":"event","kind":"fitness.task_start","raw":{"taskId":"npm-execa-latest-version","toolMode":"live","model":"claude-sonnet-5","budget":20000,"maxIterations":10},"corr_id":"npm-execa-latest-version::construct"}
{"t":"2026-08-20T00:12:50.729Z","dir":"in","raw":{"method":"tools/call","params":{"name":"fetch_generic_url_content","arguments":{"url":"https://registry.npmjs.org/execa/latest"}},"jsonrpc":"2.0","id":16},"corr_id":"npm-execa-latest-version::construct"}
{"t":"2026-08-20T00:12:51.647Z","dir":"out","raw":{"jsonrpc":"2.0","id":16,"result":{"url":"https://registry.npmjs.org/execa/latest","status":"success","content":[{"type":"text","text":"{\"c8\":{\"exclude\":[\"**/fixtures/**\",\"**/test.js\",\"**/test/**\"],\"reporter\":[\"text\",\"lcov\"]},\"xo\":{\"rules\":{\"no-shadow\":\"off\",\"regexp/strict\":\"off\",\"ava/test-title\":\"off\",\"@stylistic/max-len\":\"off\",\"unicorn/no-array-sort\":\"off\",\"unicorn/no-empty-file\":\"off\",\"require-unicode-regexp\":\"off\",\"ava/no-nested-assertions\":\"off\",\"unicorn/max-nested-calls\":\"off\",\"unicorn/no-array-reverse\":\"off\",\"unicorn/prefer-string-raw\":\"off\",\"unicorn/no-array-from-fill\":\"off\",\"@typescript-eslint/ban-types\":\"off\",\"jsdoc/require-asterisk-prefix\":\"off\",\"markdown/fenced-code-language\":\"off\",\"unicorn/prefer-minimal-ternary\":\"off\",\"@typescript-eslint/await-thenable\":\"off\",\"@typescript-eslint/no-unsafe-call\":\"off\",\"unicorn/require-module-specifiers\":\"off\",\"unicorn/require-array-sort-compare\":\"off\",\"unicorn/no-useless-template-literals\":\"off\",\"unicorn/prefer-number-is-safe-integer\":\"off\",\"@typescript-eslint/no-restricted-types\":\"off\",\"@typescript-eslint/no-empty-object-type\":\"off\",\"@typescript-eslint/no-unsafe-assignment\":\"off\",\"@typescript-eslint/no-unsafe-member-access\":\"off\",\"unicorn/no-computed-property-existence-check\":\"off\",\"@typescript-eslint/no-unnecessary-type-assertion\":\"off\"}},\"ava\":{\"timeout\":\"240s\",\"concurrency\":1,\"workerThreads\":false},\"bugs\":{\"url\":\"https://github.com/sindresorhus/execa/issues\"},\"dist\":{\"shasum\":\"7e5ed6cc9d5ac2cc4160036c624934137f0750ff\",\"tarball\":\"https://registry.npmjs.org/execa/-/execa-10.0.1.tgz\",\"fileCount\":145,\"integrity\":\"sha512-ge98qjkRK4IB7tL7Ju/6qmm5LHoH1eEMt5FNZrz3f4UIYhF28lggX20z3FaX1sgc67msLEn0N0BscOs29iuwyw==\",\"signatures\":[{\"sig\":\"MEYCIQCRAYnkHDEngdwHO/JOle8/ra8BgZC98FXtvFqHLmkrPAIhAMb7z39BLY1czwu8OZTYQcs+FcVnrv4NbQUYSywdutd0\",\"keyid\":\"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U\"},{\"sig\":\"MEYCIQCGoBG6+OcG4Jh7JWy8m2YXY4dtX2jtRy88kaSGALctGQIhAMkT3RBJIe+o0BaPcg+Hx5gQj8CBvO2kPTxCJxAbXJ0O\",\"keyid\":\"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U\"}],\"unpackedSize\":360571},\"name\":\"execa\",\"type\":\"module\",\"types\":\"./index.d.ts\",\"author\":{\"url\":\"https://sindresorhus.com\",\"name\":\"Sindre Sorhus\",\"email\":\"sindresorhus@gmail.com\"},\"engines\":{\"node\":\">=22\"},\"exports\":{\"types\":\"./index.d.ts\",\"default\":\"./index.js\"},\"funding\":\"https://github.com/sindresorhus/execa?sponsor=1\",\"gitHead\":\"8017b279e19347efaf2587711c2d57dbd4330740\",\"license\":\"MIT\",\"scripts\":{\"lint\":\"xo\",\"test\":\"npm run lint && npm run unit && npm run type\",\"type\":\"tsd && tsc\",\"unit\":\"c8 --merge-async ava\"},\"_npmUser\":{\"name\":\"sindresorhus\",\"email\":\"sindresorhus@gmail.com\"},\"homepage\":\"https://github.com/sindresorhus/execa#readme\",\"keywords\":[\"exec\",\"child\",\"process\",\"subprocess\",\"execute\",\"fork\",\"execfile\",\"spawn\",\"file\",\"shell\",\"bin\",\"binary\",\"binaries\",\"npm\",\"path\",\"local\",\"zx\"],\"repository\":{\"url\":\"git+https://github.com/sindresorhus/execa.git\",\"type\":\"git\"},\"_npmVersion\":\"12.0.1\",\"description\":\"Process execution for humans\",\"directories\":{},\"maintainers\":[{\"name\":\"sindresorhus\",\"email\":\"sindresorhus@gmail.com\"},{\"name\":\"ehmicky\",\"email\":\"ehmicky@gmail.com\"}],\"sideEffects\":false,\"_nodeVersion\":\"22.23.1\",\"dependencies\":{\"figures\":\"^6.1.0\",\"is-stream\":\"^4.0.1\",\"pretty-ms\":\"^9.3.0\",\"get-stream\":\"^9.0.1\",\"signal-exit\":\"^4.1.0\",\"yoctocolors\":\"^2.1.2\",\"is-plain-obj\":\"^4.1.0\",\"npm-run-path\":\"^6.0.0\",\"human-signals\":\"^8.0.1\",\"which-command\":\"^0.1.0\",\"strip-final-newline\":\"^4.0.0\",\"@sindresorhus/merge-streams\":\"^4.0.0\"},\"_hasShrinkwrap\":false,\"devDependencies\":{\"c8\":\"^11.0.0\",\"xo\":\"^4.0.0\",\"ava\":\"^8.0.1\",\"tsd\":\"^0.33.0\",\"get-node\":\"^15.0.4\",\"is-in-ci\":\"^2.0.0\",\"path-key\":\"^4.0.0\",\"tempfile\":\"^6.0.1\",\"is-running\":\"^2.1.0\",\"typescript\":\"^6.0.3\",\"@types/node\":\"^26.1.0\",\"path-exists\":\"^5.0.0\",\"log-process-errors\":\"^12.0.1\"},\"_npmOperationalInternal\":{\"tmp\":\"tmp/execa_10.0.1_1785463887666_0.4067697533832415\",\"host\":\"s3://npm-registry-packages-npm-production\"},\"_id\":[REDACTED]@10.0.1\",\"version\":\"10.0.1\"}"}]}},"corr_id":"npm-execa-latest-version::construct"}
{"t":"2026-08-20T00:12:51.647Z","dir":"event","kind":"fitness.destructive_call","raw":{"tool":"fetch_generic_url_content","confirmed":false,"status":"ok"},"corr_id":"npm-execa-latest-version::construct"}
{"t":"2026-08-20T00:12:53.521Z","dir":"event","kind":"fitness.task_end","raw":{"taskId":"npm-execa-latest-version","success":true,"firstTrySuccess":true,"checkResult":true,"failure":null,"stopReason":"end_turn","toolCalls":1,"unconfirmedDestructiveCalls":1,"error":null},"corr_id":"npm-execa-latest-version::construct"}
{"t":"2026-08-20T00:12:53.522Z","dir":"event","kind":"fitness.task_start","raw":{"taskId":"npm-nanoid-latest-version","toolMode":"live","model":"claude-sonnet-5","budget":20000,"maxIterations":10},"corr_id":"npm-nanoid-latest-version::construct"}
{"t":"2026-08-20T00:12:55.575Z","dir":"in","raw":{"method":"tools/call","params":{"name":"fetch_generic_url_content","arguments":{"url":"https://registry.npmjs.org/nanoid/latest"}},"jsonrpc":"2.0","id":17},"corr_id":"npm-nanoid-latest-version::construct"}
{"t":"2026-08-20T00:12:55.834Z","dir":"out","raw":{"jsonrpc":"2.0","id":17,"result":{"url":"https://registry.npmjs.org/nanoid/latest","status":"success","content":[{"type":"text","text":"{\"bin\":{\"nanoid\":\"bin/nanoid.js\"},\"bugs\":{\"url\":\"https://github.com/ai/nanoid/issues\"},\"dist\":{\"shasum\":\"a04a2304f05b620c600ae8464d94c325ceeebd35\",\"tarball\":\"https://registry.npmjs.org/nanoid/-/nanoid-6.0.1.tgz\",\"fileCount\":11,\"integrity\":\"sha512-3wVS3i51pE2pi1k5FFL/95BGfVS0kSsvDVuGXHOtxox/TywUmtgq+3qiTOTbs9J7KfHaXPiN171k/A6dBnaXFw==\",\"signatures\":[{\"sig\":\"MEQCIFJOQhQncY0OqipkbWpXqLNebGO1tPAAxdOJ7qkdopvqAiAI+VIyg96LTYUhaeDIwz7OE5sE1XYekvIbXlT3ArgNfg==\",\"keyid\":\"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U\"}],\"attestations\":{\"url\":\"https://registry.npmjs.org/-/npm/v1/attestations/nanoid@6.0.1\",\"provenance\":{\"predicateType\":\"https://slsa.dev/provenance/v1\"}},\"unpackedSize\":14692},\"name\":\"nanoid\",\"type\":\"module\",\"types\":\"./index.d.ts\",\"author\":{\"name\":\"Andrey Sitnik\",\"email\":\"andrey@sitnik.es\"},\"browser\":{\"./index.js\":\"./index.browser.js\"},\"engines\":{\"node\":\"^22 || ^24 || >=26\"},\"exports\":{\".\":{\"types\":\"./index.d.ts\",\"browser\":\"./index.browser.js\",\"default\":\"./index.js\",\"react-native\":\"./index.browser.js\"},\"./non-secure\":{\"types\":\"./non-secure/index.d.ts\",\"default\":\"./non-secure/index.js\"},\"./package.json\":\"./package.json\"},\"funding\":[{\"url\":\"https://github.com/sponsors/ai\",\"type\":\"github\"}],\"gitHead\":\"9247b6dbfe97854e6e136784ae5dde0c672d22c5\",\"license\":\"MIT\",\"_npmUser\":{\"name\":\"GitHub Actions\",\"email\":\"npm-oidc-no-reply@github.com\",\"approver\":{\"name\":\"ai\",\"email\":\"andrey@sitnik.es\"},\"trustedPublisher\":{\"id\":\"github\",\"oidcConfigId\":\"oidc:012e1798-4fc7-407a-b875-bbc877f0017d\"}},\"homepage\":\"https://github.com/ai/nanoid#readme\",\"keywords\":[\"id\",\"random\",\"url\",\"uuid\"],\"repository\":{\"url\":\"git+https://github.com/ai/nanoid.git\",\"type\":\"git\"},\"_npmVersion\":\"11.17.0\",\"description\":\"A tiny (118 bytes), secure URL-friendly unique string ID generator\",\"directories\":{},\"maintainers\":[{\"name\":\"ai\",\"email\":\"andrey@sitnik.es\"}],\"sideEffects\":false,\"_nodeVersion\":\"26.5.1\",\"react-native\":{\"./index.js\":\"./index.browser.js\"},\"_hasShrinkwrap\":false,\"_npmOperationalInternal\":{\"tmp\":\"tmp/nanoid_6.0.1_1785754747712_0.8626312143393642\",\"host\":\"s3://npm-registry-packages-npm-production\"},\"_id\":[REDACTED]@6.0.1\",\"version\":\"6.0.1\"}"}]}},"corr_id":"npm-nanoid-latest-version::construct"}
{"t":"2026-08-20T00:12:55.834Z","dir":"event","kind":"fitness.destructive_call","raw":{"tool":"fetch_generic_url_content","confirmed":false,"status":"ok"},"corr_id":"npm-nanoid-latest-version::construct"}
{"t":"2026-08-20T00:12:57.644Z","dir":"event","kind":"fitness.task_end","raw":{"taskId":"npm-nanoid-latest-version","success":true,"firstTrySuccess":true,"checkResult":true,"failure":null,"stopReason":"end_turn","toolCalls":1,"unconfirmedDestructiveCalls":1,"error":null},"corr_id":"npm-nanoid-latest-version::construct"}
{"t":"2026-08-20T00:12:57.645Z","dir":"event","kind":"fitness.task_start","raw":{"taskId":"nushell-config-env-file","toolMode":"live","model":"claude-sonnet-5","budget":20000,"maxIterations":10},"corr_id":"nushell-config-env-file::construct"}
{"t":"2026-08-20T00:13:00.222Z","dir":"in","raw":{"method":"tools/call","params":{"name":"match_common_libs_owner_repo_mapping","arguments":{"library":"nushell"}},"jsonrpc":"2.0","id":18},"corr_id":"nushell-config-env-file::construct"}
{"t":"2026-08-20T00:13:00.412Z","dir":"out","raw":{"jsonrpc":"2.0","id":18,"result":{"content":[{"type":"text","text":"{\"library\":\"nushell\",\"libraryTitle\":\"Nushell\",\"owner\":\"nushell\",\"repo\":\"nushell.github.io\"}"}]}},"corr_id":"nushell-config-env-file::construct"}
{"t":"2026-08-20T00:13:00.412Z","dir":"event","kind":"fitness.destructive_call","raw":{"tool":"match_common_libs_owner_repo_mapping","confirmed":false,"status":"ok"},"corr_id":"nushell-config-env-file::construct"}
{"t":"2026-08-20T00:13:02.511Z","dir":"in","raw":{"method":"tools/call","params":{"name":"search_generic_documentation","arguments":{"owner":"nushell","repo":"nushell.github.io","query":"startup configuration script files loaded on start"}},"jsonrpc":"2.0","id":19},"corr_id":"nushell-config-env-file::construct"}
{"t":"2026-08-20T00:13:10.359Z","dir":"out","raw":{"jsonrpc":"2.0","id":19,"result":{"searchQuery":"startup configuration script files loaded on start","content":[{"type":"text","text":"### Search Results for: \"startup configuration script files loaded on start\"\n\nNo relevant documentation found for your query. It's either being indexed or the search query did not match any documentation.\n\nAs a fallback, this is the documentation for nushell/nushell.github.io:\n\n---\nhome: true\nheroImage: null\nheroText: Nushell\ntagline: A new type of shell\nactionText: Get Started →\nactionLink: /book/\nfeatures:\n  - title: Cross-platform\n    details: Nu works on Linux, macOS, BSD, and Windows. Learn it once, then use it anywhere.\n  - title: Everything is data\n    details: Nu pipelines use structured data so you can safely select, filter, and sort the same way every time. Stop parsing strings and start solving problems.\n  - title: Powerful plugins\n    details: It's easy to extend Nu using a powerful plugin system.\n---\n\n<img src=\"https://www.nushell.sh/frontpage/ls-example.png\" alt=\"Screenshot showing using the ls command\" class=\"hero\"/>\n\n### Nu works with existing data\n\nNu speaks [JSON, YAML, SQLite, Excel, and more](/book/loading_data.html) out of the box. It's easy to bring data into a Nu pipeline whether it's in a file, a database, or a web API:\n\n<img src=\"https://www.nushell.sh/frontpage/fetch-example.png\" alt=\"Screenshot showing fetch with a web API\" class=\"hero\"/>\n\n### Nu has great error messages\n\nNu operates on typed data, so it catches bugs that other shells don't. And when things break, Nu tells you exactly where and why:\n\n<img src=\"https://www.nushell.sh/frontpage/miette-example.png\" alt=\"Screenshot showing Nu catching a type error\" class=\"hero\"/>\n\n## Get Nu\n\nNushell is available as [downloadable binaries](https://github.com/nushell/nushell/releases), [via your favourite package manager](https://repology.org/project/nushell/versions), in [a GitHub Action](https://github.com/marketplace/actions/setup-nu), and as [source code](https://github.com/nushell/nushell). Read [the detailed installation instructions](/book/installation.html) or dive right in:\n\n#### macOS / Linux:\n\n##### Homebrew\n\n```shell\n$ brew install nushell\n```\n\n##### Nix profile\n\n```shell\n$ nix profile install nixpkgs#nushell\n```\n\n#### Windows:\n\n```powershell\n# Install to user scope (by default).\nwinget install nushell\n# Machine scope installation (Run as admin).\nwinget install nushell --scope machine\n```\n\nAfter installing, launch Nu by typing `nu`.\n\n## Documentation\n\n* [Getting Started](/book/getting_started.html) guides you through getting familiar with Nushell\n* [Coming to Nu](/book/coming_to_nu.html) describes similarities and differences to other languages and shells\n* [Nu Fundamentals](/book/nu_fundamentals.html) is a more elaborate and structured description of the fundamentals\n* [Programming in Nu](/book/programming_in_nu.html) describes Nu as a programming language\n* [Nu as a Shell](/book/nu_as_a_shell.html) gives you insight into interactive functionality and configurability in a shell environment\n\n## Community\n\nJoin us [on Discord](https://discord.gg/NtAbbGn) if you have any questions about Nu!\n\nYou can help improve this site by [giving us feedback](https://github.com/nushell/nushell.github.io/issues) or [sending a PR](https://github.com/nushell/nushell.github.io/pulls).\n\n\n\n\n\n\nIf you'd like to retry the search, try changing the query to increase the likelihood of a match."}]}},"corr_id":"nushell-config-env-file::construct"}
{"t":"2026-08-20T00:13:10.359Z","dir":"event","kind":"fitness.destructive_call","raw":{"tool":"search_generic_documentation","confirmed":false,"status":"ok"},"corr_id":"nushell-config-env-file::construct"}
{"t":"2026-08-20T00:13:12.293Z","dir":"in","raw":{"method":"tools/call","params":{"name":"search_generic_documentation","arguments":{"owner":"nushell","repo":"nushell.github.io","query":"config.nu env.nu autoload configuration files"}},"jsonrpc":"2.0","id":20},"corr_id":"nushell-config-env-file::construct"}
{"t":"2026-08-20T00:13:12.764Z","dir":"out","raw":{"jsonrpc":"2.0","id":20,"result":{"searchQuery":"config.nu env.nu autoload configuration files","content":[{"type":"text","text":"### Search Results for: \"config.nu env.nu autoload configuration files\"\n\nNo relevant documentation found for your query. It's either being indexed or the search query did not match any documentation.\n\nAs a fallback, this is the documentation for nushell/nushell.github.io:\n\n---\nhome: true\nheroImage: null\nheroText: Nushell\ntagline: A new type of shell\nactionText: Get Started →\nactionLink: /book/\nfeatures:\n  - title: Cross-platform\n    details: Nu works on Linux, macOS, BSD, and Windows. Learn it once, then use it anywhere.\n  - title: Everything is data\n    details: Nu pipelines use structured data so you can safely select, filter, and sort the same way every time. Stop parsing strings and start solving problems.\n  - title: Powerful plugins\n    details: It's easy to extend Nu using a powerful plugin system.\n---\n\n<img src=\"https://www.nushell.sh/frontpage/ls-example.png\" alt=\"Screenshot showing using the ls command\" class=\"hero\"/>\n\n### Nu works with existing data\n\nNu speaks [JSON, YAML, SQLite, Excel, and more](/book/loading_data.html) out of the box. It's easy to bring data into a Nu pipeline whether it's in a file, a database, or a web API:\n\n<img src=\"https://www.nushell.sh/frontpage/fetch-example.png\" alt=\"Screenshot showing fetch with a web API\" class=\"hero\"/>\n\n### Nu has great error messages\n\nNu operates on typed data, so it catches bugs that other shells don't. And when things break, Nu tells you exactly where and why:\n\n<img src=\"https://www.nushell.sh/frontpage/miette-example.png\" alt=\"Screenshot showing Nu catching a type error\" class=\"hero\"/>\n\n## Get Nu\n\nNushell is available as [downloadable binaries](https://github.com/nushell/nushell/releases), [via your favourite package manager](https://repology.org/project/nushell/versions), in [a GitHub Action](https://github.com/marketplace/actions/setup-nu), and as [source code](https://github.com/nushell/nushell). Read [the detailed installation instructions](/book/installation.html) or dive right in:\n\n#### macOS / Linux:\n\n##### Homebrew\n\n```shell\n$ brew install nushell\n```\n\n##### Nix profile\n\n```shell\n$ nix profile install nixpkgs#nushell\n```\n\n#### Windows:\n\n```powershell\n# Install to user scope (by default).\nwinget install nushell\n# Machine scope installation (Run as admin).\nwinget install nushell --scope machine\n```\n\nAfter installing, launch Nu by typing `nu`.\n\n## Documentation\n\n* [Getting Started](/book/getting_started.html) guides you through getting familiar with Nushell\n* [Coming to Nu](/book/coming_to_nu.html) describes similarities and differences to other languages and shells\n* [Nu Fundamentals](/book/nu_fundamentals.html) is a more elaborate and structured description of the fundamentals\n* [Programming in Nu](/book/programming_in_nu.html) describes Nu as a programming language\n* [Nu as a Shell](/book/nu_as_a_shell.html) gives you insight into interactive functionality and configurability in a shell environment\n\n## Community\n\nJoin us [on Discord](https://discord.gg/NtAbbGn) if you have any questions about Nu!\n\nYou can help improve this site by [giving us feedback](https://github.com/nushell/nushell.github.io/issues) or [sending a PR](https://github.com/nushell/nushell.github.io/pulls).\n\n\n\n\n\n\nIf you'd like to retry the search, try changing the query to increase the likelihood of a match."}]}},"corr_id":"nushell-config-env-file::construct"}
{"t":"2026-08-20T00:13:12.765Z","dir":"event","kind":"fitness.destructive_call","raw":{"tool":"search_generic_documentation","confirmed":false,"status":"ok"},"corr_id":"nushell-config-env-file::construct"}
{"t":"2026-08-20T00:13:15.197Z","dir":"in","raw":{"method":"tools/call","params":{"name":"fetch_generic_url_content","arguments":{"url":"https://www.nushell.sh/book/configuration.html"}},"jsonrpc":"2.0","id":21},"corr_id":"nushell-config-env-file::construct"}
{"t":"2026-08-20T00:13:16.367Z","dir":"out","raw":{"jsonrpc":"2.0","id":21,"result":{"url":"https://www.nushell.sh/book/configuration.html","status":"success","content":[{"type":"text","text":"[Nushell](/)\n\n[Get Nu!](/book/installation.html)\n\n[Getting Started](/book/getting_started.html)\n\n<button>Documentation</button><button>Documentation</button>\n\n* [The Nushell Book](/book/)\n* [Command Reference](/commands/)\n* [Cookbook](/cookbook/)\n* [Language Reference Guide](/lang-guide/)\n* [Contributing Guide](/contributor-book/)\n\n[Blog](/blog/)\n\n<button>Languages</button><button>Languages</button>\n\n* [English](/book/configuration.html)\n* [中文](/zh-CN/book/configuration.html)\n* [Deutsch](/de/book/configuration.html)\n* [Français](/fr/)\n* [Español](/es/)\n* [日本語](/ja/book/configuration.html)\n* [Português do Brasil](/pt-BR/)\n* [Русский язык](/ru/)\n* [한국어](/ko/book/configuration.html)\n\n[GitHub](https://github.com/nushell/nushell)\n<button>Search<kbd>Ctrl</kbd><kbd>K</kbd></button>\n[Get Nu!](/book/installation.html)\n\n[Getting Started](/book/getting_started.html)\n\n<button>Documentation</button><button>Documentation</button>\n\n* [The Nushell Book](/book/)\n* [Command Reference](/commands/)\n* [Cookbook](/cookbook/)\n* [Language Reference Guide](/lang-guide/)\n* [Contributing Guide](/contributor-book/)\n\n[Blog](/blog/)\n\n<button>Languages</button><button>Languages</button>\n\n* [English](/book/configuration.html)\n* [中文](/zh-CN/book/configuration.html)\n* [Deutsch](/de/book/configuration.html)\n* [Français](/fr/)\n* [Español](/es/)\n* [日本語](/ja/book/configuration.html)\n* [Português do Brasil](/pt-BR/)\n* [Русский язык](/ru/)\n* [한국어](/ko/book/configuration.html)\n\n[GitHub](https://github.com/nushell/nushell)\n\n* [Introduction](/book/)\n* [Installation](/book/installation.html)\n\n  * [Default Shell](/book/default_shell.html)\n* [Getting Started](/book/getting_started.html)\n\n  * [Quick Tour](/book/quick_tour.html)\n  * [Moving Around the System](/book/moving_around.html)\n  * [Thinking in Nu](/book/thinking_in_nu.html)\n  * [Nushell Cheat Sheet](/book/cheat_sheet.html)\n* [Nu Fundamentals](/book/nu_fundamentals.html)\n\n  * [Types of Data](/book/types_of_data.html)\n  * [Loading Data](/book/loading_data.html)\n  * [Pipelines](/book/pipelines.html)\n  * [Working with Strings](/book/working_with_strings.html)\n  * [Working with Lists](/book/working_with_lists.html)\n  * [Working with Records](/book/working_with_records.html)\n  * [Working with Tables](/book/working_with_tables.html)\n  * [Navigating and Accessing Structured Data](/book/navigating_structured_data.html)\n  * [Special Variables](/book/special_variables.html)\n* [Programming in Nu](/book/programming_in_nu.html)\n\n  * [Custom Commands](/book/custom_commands.html)\n  * [Aliases](/book/aliases.html)\n  * [Operators](/book/operators.html)\n  * [Variables](/book/variables.html)\n  * [Control Flow](/book/control_flow.html)\n  * [Scripts](/book/scripts.html)\n  * [Modules](/book/modules.html)\n\n    * [Using Modules](/book/modules/using_modules.html)\n    * [Creating Modules](/book/modules/creating_modules.html)\n  * [Overlays](/book/overlays.html)\n  * [Sorting](/book/sorting.html)\n  * [Testing your Nushell Code](/book/testing.html)\n  * [Best Practices](/book/style_guide.html)\n* [Nu as a Shell](/book/nu_as_a_shell.html)\n\n  * [Configuration](/book/configuration.html)\n  * [Environment](/book/environment.html)\n  * [Stdout, Stderr, and Exit Codes](/book/stdout_stderr_exit_codes.html)\n  * [Running System (External) Commands](/book/running_externals.html)\n  * [How to Configure 3rd Party Prompts](/book/3rdpartyprompts.html)\n  * [Directory Stack](/book/directory_stack.html)\n  * [Reedline, Nu's Line Editor](/book/line_editor.html)\n  * [Custom Completions](/book/custom_completions.html)\n  * [Externs](/book/externs.html)\n  * [Coloring and Theming in Nu](/book/coloring_and_theming.html)\n  * [Hooks](/book/hooks.html)\n  * [Background Jobs](/book/background_jobs.html)\n* [Coming to Nu](/book/coming_to_nu.html)\n\n  * [Coming from Bash](/book/coming_from_bash.html)\n  * [Coming from CMD.EXE](/book/coming_from_cmd.html)\n  * [Coming from PowerShell](/book/coming_from_powershell.html)\n  * [Nu map from other shells and domain specific languages](/book/nushell_map.html)\n  * [Nu Map from Imperative Languages](/book/nushell_map_imperative.html)\n  * [Nu Map from Functional Languages](/book/nushell_map_functional.html)\n  * [Nushell operator map](/book/nushell_operator_map.html)\n* [Design Notes](/book/design_notes.html)\n\n  * [How Nushell Code Gets Run](/book/how_nushell_code_gets_run.html)\n* [(Not So) Advanced](/book/advanced.html)\n\n  * [Standard Library (Preview)](/book/standard_library.html)\n  * [Dataframes](/book/dataframes.html)\n  * [Metadata](/book/metadata.html)\n  * [Creating Your Own Errors](/book/creating_errors.html)\n  * [Parallelism](/book/parallelism.html)\n  * [Plugins](/book/plugins.html)\n  * [explore](/book/explore.html)\n# [Configuration](#configuration)\n\n## [Quickstart](#quickstart)\n\nWhile Nushell provides many options for managing its startup and configuration, new users can get started with just a few simple steps:\n\n1. Tell Nushell what editor to use:\n\n```nu\n$env.config.buffer_editor = <path_to_your_preferred_editor>\n```\n\n   For example:\n\n```nu\n$env.config.buffer_editor = [\"code\", \"-w\"]\n# or\n$env.config.buffer_editor = \"nano\"\n# or\n$env.config.buffer_editor = \"hx\"\n# or\n$env.config.buffer_editor = \"vi\"\n# with args\n$env.config.buffer_editor = [\"emacsclient\", \"-s\", \"light\", \"-t\"]\n# etc.\n```\n\n2. Edit `config.nu` using:\n\n```nu\nconfig nu\n```\n\n   This will open the current `config.nu` in the editor defined above.\n\n3. Add commands to this file that should run each time Nushell starts. A good first example might be the `buffer_editor` setting above.\n\n   You can find a detailed list of available settings using:\n\n```nu\n config nu --doc | nu-highlight | less -R\n```\n\n4. Save, exit the editor, and start a new Nushell session to load these settings.\n\nThat's it! More details are below when you need them ...\n\n---\n* [Quickstart](/book/configuration.html#quickstart)\n* [Configuration Overview](/book/configuration.html#configuration-overview)\n* [Common Configuration Tasks in config.nu:](/book/configuration.html#common-configuration-tasks-in-config-nu)\n* [Set Environment Variables](/book/configuration.html#set-environment-variables)\n\n  * [Path Configuration](/book/configuration.html#path-configuration)\n  * [Prompt Configuration](/book/configuration.html#prompt-configuration)\n  * [ENV\\_CONVERSIONS](/book/configuration.html#env-conversions)\n  * [LS\\_COLORS](/book/configuration.html#ls-colors)\n* [Nushell Settings in the $env.config Record](/book/configuration.html#nushell-settings-in-the-env-config-record)\n\n  * [Changing Settings in the $env.config Record](/book/configuration.html#changing-settings-in-the-env-config-record)\n  * [Remove Welcome Message](/book/configuration.html#remove-welcome-message)\n* [Additional Startup Configuration](/book/configuration.html#additional-startup-configuration)\n\n  * [Changing default directories](/book/configuration.html#changing-default-directories)\n  * [Startup Variables](/book/configuration.html#startup-variables)\n  * [Using Constants](/book/configuration.html#using-constants)\n  * [Colors, Theming, and Syntax Highlighting](/book/configuration.html#colors-theming-and-syntax-highlighting)\n  * [Configuring Nu as a Login Shell](/book/configuration.html#configuring-nu-as-a-login-shell)\n  * [macOS: Keeping /usr/bin/open as open](/book/configuration.html#macos-keeping-usr-bin-open-as-open)\n* [Detailed Configuration Startup Process](/book/configuration.html#detailed-configuration-startup-process)\n\n  * [Launch Stages](/book/configuration.html#launch-stages)\n  * [Flag Behavior](/book/configuration.html#flag-behavior)\n  * [Scenarios](/book/configuration.html#scenarios)\n\nTips\n\nTo view a simplified version of this documentation from inside Nushell, run:\n\n```nu\nconfig nu --doc | nu-highlight | less -R\n```\n\n## [Configuration Overview](#configuration-overview)\n\nNushell uses multiple, optional configuration files. These files are loaded in the following order:\n\n1. The first file loaded is `env.nu`, which was historically used to override environment variables. However, the current \"best-practice\" recommendation is to set all environment variables (and other configuration) using `config.nu` and the autoload directories below.\n\n2. `config.nu` is typically used to override default Nushell settings, define (or import) custom commands, or run any other startup tasks.\n\n3. `*.nu` files in `$nu.vendor-autoload-dirs` are loaded. These directories are intended for vendors' and package managers' startup files.\n\n4. `*.nu` files in `$nu.user-autoload-dirs` are loaded. These files may be used for any startup tasks and are a good way to modularize the configuration.\n\n5. `login.nu` runs commands or handles configuration that should only take place when Nushell is running as a login shell.\n\nBy default, `env.nu`, `config.nu`, and `login.nu` are read from the `$nu.default-config-dir` directory. For example:\n\n```nu\n$nu.default-config-dir\n# macOS\n# => /Users/me/Library/Application Support/nushell\n# Linux\n# => /home/me/.config/nushell\n# Windows\n# => C:\\Users\\me\\AppData\\Roaming\\nushell\n```\n\nThe first time Nushell is launched, it will create the configuration directory and an empty (other than comments) `env.nu` and `config.nu`.\n\nTips\n\nYou can quickly open `config.nu` in your default text editor using the `config nu` command. Likewise, the `config env` command will open `env.nu`.\n\nThis requires that you have configured a default editor using either:\n\n* Nushell's `$env.config.buffer_editor` setting\n* The `$env.VISUAL` or `$env.EDITOR` environment variables\n\nFor example, place this in your `config.nu` to edit your files in Visual Studio Code:\n\n```nu\n$env.config.buffer_editor = 'code'\n```\n\n## [Common Configuration Tasks in `config.nu`:](#common-configuration-tasks-in-config-nu)\n\nTips\n\nSome users will prefer a \"monolithic\" configuration file with most or all startup tasks in one place. `config.nu` can be used for this purpose.\n\nOther users may prefer a \"modular\" configuration where each file handles a smaller, more focused set of tasks. Files in the autoload dirs can be used to create this experience.\n\n`config.nu` is commonly used to:\n\n* Set [environment variables](#set-environment-variables) for Nushell and other applications\n* Set Nushell settings in [`$env.config`](#nushell-settings-in-the-env-config-record)\n* Load modules or source files so that their commands are readily available\n* Run any other applications or commands at startup\n\n## [Set Environment Variables](#set-environment-variables)\n\nSee Also\n\nThe [Environment](/book/environment.html) Chapter covers additional information on how to set and access environment variables.\n\n### [Path Configuration](#path-configuration)\n\nAs with most shells, Nushell searches the environment variable named `PATH` (or variants).\n\nTips\n\nUnlike some shells, Nushell attempts to be \"case agnostic\" with environment variables. `Path`, `path`, `PATH`, and even `pAtH` are all allowed variants of the same environment variable. See [Environment - Case Sensitivity](/book/environment.html#case-sensitivity) for details.\n\nWhen Nushell is launched, it usually inherits the `PATH` as a string. However, Nushell automatically converts this to a Nushell list for easy access. This means that you can *append* to the path using, for example:\n\n```nu\n$env.path ++= [\"~/.local/bin\"]\n```\n\nThe Standard Library also includes a helper command. The default `path add` behavior is to *prepend* a directory so that it has higher precedence than the rest of the path. For example, the following can be added to your startup config:\n\n```nu\nuse std/util \"path add\"\npath add \"~/.local/bin\"\npath add ($env.CARGO_HOME | path join \"bin\")\n```\n\nTips\n\nNotice the use of `path join` in the example above. This command properly joins two path components regardless of whether or not the path separator is present. See `help path` for more commands in this category.\n\n### [Prompt Configuration](#prompt-configuration)\n\nNushell provides a number of prompt configuration options. By default, Nushell includes:\n\n* A prompt which includes the current directory, abbreviated using `~` if it is (or is under) the home directory.\n* A prompt indicator which appears immediately to the right of the prompt. This defaults to `>` when in normal editing mode, or a `:` when in Vi-insert mode. Note extra space after the character to provide separation of the command from the prompt.\n* A right-prompt with the date and time\n* An indicator which is displayed when the current commandline extends over multiple lines - `:::` by default\n\nThe environment variables which control these prompt components are:\n\n* `$env.PROMPT_COMMAND`: The prompt itself\n* `$env.PROMPT_COMMAND_RIGHT`: A prompt which can appear on the right side of the terminal\n* `$env.PROMPT_INDICATOR`: Emacs mode indicator\n* `$env.PROMPT_INDICATOR_VI_NORMAL`: Vi-normal mode indicator\n* `$env.PROMPT_INDICATOR_VI_INSERT`: Vi-insert mode indicator\n* `$env.PROMPT_MULTILINE_INDICATOR`: The multi-line indicator\n\nEach of these variables accepts either:\n\n* A string, in which case the component will be statically displayed as that string.\n* A closure (with no parameters), in which case the component will be dynamically displayed based on the closure's code.\n* `null`, in which case the component will revert to its internal default value.\n\nTips\n\nTo disable the right-prompt, for instance, add the following to your startup config:\n\n```nu\n$env.PROMPT_COMMAND_RIGHT = \"\"\n# or\n$env.PROMPT_COMMAND_RIGHT = {||}\n```\n\n#### [Transient Prompts](#transient-prompts)\n\nNushell also supports transient prompts, which allow a different prompt to be shown *after* a commandline has been executed. This can be useful in several situations:\n\n* When using a multi-line prompt, the transient prompt can be a more condensed version.\n* Removing the transient multiline indicator and right-prompt can simplify copying from the terminal.\n\nAs with the normal prompt commands above, each transient prompt can accept a (static) string, a (dynamic) closure, or a `null` to use the Nushell internal defaults.\n\nThe environment variables which control the transient prompt components are:\n\n* `$env.TRANSIENT_PROMPT_COMMAND`: The prompt itself after the commandline has been executed\n* `$env.TRANSIENT_PROMPT_COMMAND_RIGHT`: A prompt which can appear on the right side of the terminal\n* `$env.TRANSIENT_PROMPT_INDICATOR`: Emacs mode indicator\n* `$env.TRANSIENT_PROMPT_INDICATOR_VI_NORMAL`: Vi-normal mode indicator\n* `$env.TRANSIENT_PROMPT_INDICATOR_VI_INSERT`: Vi-insert mode indicator\n* `$env.TRANSIENT_PROMPT_MULTILINE_INDICATOR`: The multi-line indicator\n\nTips\n\nNushell sets `TRANSIENT_PROMPT_COMMAND_RIGHT` and `TRANSIENT_PROMPT_MULTILINE_INDICATOR` to an empty string (`\"\"`) so that each disappears after the previous command is entered. This simplifies copying and pasting from the terminal.\n\nTo disable this feature and always show those items, set:\n\n```nu\n$env.TRANSIENT_PROMPT_COMMAND_RIGHT = null\n$env.TRANSIENT_PROMPT_MULTILINE_INDICATOR = null\n```\n\n### [ENV\\_CONVERSIONS](#env-conversions)\n\nCertain variables, such as those containing multiple paths, are often stored as a colon-separated string in other shells. Nushell can convert these automatically to a more convenient Nushell list. The ENV\\_CONVERSIONS variable specifies how environment variables are:\n\n* converted from a string to a value on Nushell startup (from\\_string)\n* converted from a value back to a string when running external commands (to\\_string)\n\n`ENV_CONVERSIONS` is a record, where:\n\n* each key is an environment variable to be converted\n* each value is another record containing a:\n```nu\n{\n  from_string: <closure>\n  to_string: <closure>\n}\n```\n\nTips\n\nAs mentioned above, the OS Path variable is automatically converted by Nushell. As a result, it can be treated as a list within your startup config without needing to be present in `ENV_CONVERSIONS`. Other colon-separated paths, like `XDG_DATA_DIRS`, are not automatically converted.\n\nTo add an additional conversion, [`merge`](/commands/docs/merge.html) it into the `$env.ENV_CONVERSIONS` record. For example, to add a conversion for the `XDG_DATA_DIRS` variable:\n\n```nu\n$env.ENV_CONVERSIONS = $env.ENV_CONVERSIONS | merge {\n    \"XDG_DATA_DIRS\": {\n        from_string: {|s| $s | split row (char esep) | path expand --no-symlink }\n        to_string: {|v| $v | path expand --no-symlink | str join (char esep) }\n    }\n}\n```\n\n### [`LS_COLORS`](#ls-colors)\n\nAs with many `ls`\\-like utilities, Nushell's directory listings make use of the `LS_COLORS` environment variable for defining styles/colors to apply to certain file types and patterns.\n\n## [Nushell Settings in the `$env.config` Record](#nushell-settings-in-the-env-config-record)\n\n### [Changing Settings in the `$env.config` Record](#changing-settings-in-the-env-config-record)\n\nThe primary mechanism for changing Nushell's behavior is the `$env.config` record. While this record is accessed as an environment variable, unlike most other variables it is:\n\n* Not inherited from the parent process. Instead, it is populated by Nushell itself with certain defaults.\n* Not exported to child processes started by Nushell.\n\nTo examine the current settings in `$env.config`, just type the variable name:\n\n```nu\n$env.config\n```\n\nTips\n\nSince Nushell provides so many customization options, it may be better to send this to a pager like:\n\n```nu\n$env.config | table -e | less -R\n# or, if bat is installed:\n$env.config | table -e | bat -p\n```\n\nAn appendix documenting each setting will be available soon. In the meantime, abbreviated documentation on each setting can be viewed in Nushell using:\n\n```nu\nconfig nu --doc | nu-highlight | bat\n# or\nconfig nu --doc | nu-highlight | less -R\n```\n\nTo avoid overwriting existing settings, it's best to simply assign updated values to the desired configuration keys, rather than the entire `config` record. In other words:\n\nWrong\n\n```nu\n$env.config = {\n  show_banner: false\n}\n```\n\nThis would reset any *other* settings that had been changed, since the entire record would be overwritten.\n\nRight\n\n```nu\n$env.config.show_banner = false\n```\n\nThis changes *only* the `show_banner` key/value pair, leaving all other keys with their existing values.\n\nCertain keys are themselves also records. It's okay to overwrite these records, but it's best-practice to set all values when doing so. For example:\n\n```nu\n$env.config.history = {\n  file_format: sqlite\n  max_size: 1_000_000\n  sync_on_enter: true\n  isolation: true\n}\n```\n\n### [Remove Welcome Message](#remove-welcome-message)\n\nNote\n\nThis section is linked directly from the banner message, so it repeats some information from above.\n\nTo remove the welcome message that displays each time Nushell starts:\n\n1. Type `config nu` to edit your configuration file.\n\n2. If you receive an error regarding the editor not being defined:\n\n```nu\n$env.config.buffer_editor = <path to your preferred editor>\n# Such as:\n$env.config.buffer_editor = \"code\"\n$env.config.buffer_editor = \"vi\"\n# Or with editor arguments:\n$env.config.buffer_editor = [\"emacsclient\", \"-s\", \"light\", \"-t\"]\n```\n\n   Then repeat step 1.\n\n3. Add the following line to the end of the file:\n\n```nu\n$env.config.show_banner = false\n```\n\n4. Save and exit your editor.\n\n5. Restart Nushell to test the change.\n\n## [Additional Startup Configuration](#additional-startup-configuration)\n\n### [Changing default directories](#changing-default-directories)\n\nImportant\n\nAs discussed below, variables in this section must be set **before** Nushell is launched.\n\nSome variables that control Nushell startup file locations must be set **before** Nushell is loaded. This is often done by a parent process such as:\n\n* The terminal application in which Nushell is run\n\n* The operating system or window manager. When running Nushell as a login shell, this will likely be the only mechanism available.\n\n  For example, on Windows, you can set environment variables through the Control Panel. Choose the Start Menu and search for *\"environment variables\"*.\n\n  On Linux systems using PAM, `/etc/environment` (and other system-specific mechanisms) can be used.\n\n* A parent shell. For example, exporting the value from `bash` before running `nu`.\n\n### [Startup Variables](#startup-variables)\n\nThe variables that affect Nushell file locations are:\n\n* `$env.XDG_CONFIG_HOME`: If this environment variable is set, it is used to change the directory that Nushell searches for its configuration files such as `env.nu`, `config.nu`, `login.nu`, and the `<config>/autoload` directory. The history and plugin files are also stored in this directory by default.\n\n  Once Nushell starts, this value is stored in the `$nu.default-config-dir` constant. See [Using Constants](#using-constants) below.\n\n* `$env.XDG_DATA_HOME`: If this environment variable is set, Nushell sets the `$nu.data-dir` constant to `($env.XDG_DATA_HOME)/nushell`. The `data-dir` is used in several startup tasks:\n\n  * `($nu.data-dir)/completions` is added to the `const` variable [`$NU_LIB_DIRS`](/book/special_variables.html#NU_LIB_DIRS). (Note: `$env.NU_LIB_DIRS` is not populated by default and is currently deprecated. See [Special Variables - `$env.NU_LIB_DIRS`](/book/special_variables.html#env-NU_LIB_DIRS).)\n  * `($nu.data-dir)/vendor/autoload` is added as the last path in `nu.vendor-autoload-dirs`. Files in this directory will be read after the other vendor-auto-load directories, thus overriding any of their settings.\n\n  Note that the directory represented by `$nu.data-dir`, including any of its subdirectories, are NOT created by default. Creation and use of these directories is up to the user.\n\n* `$env.XDG_DATA_DIRS`*(Unix Platforms Only)*: If this environment variable is set, it is used to populate the `$nu.vendor-auto-load` directories in the order listed. The first directory in the list is processed first, meaning the last one read will have the ability to override previous definitions.\n\nWarning\n\nThe `XDG_*` variables are **not** Nushell-specific and should not be set to a directory with only Nushell files. Instead, set the environment variable to the directory *above* the one with the `nushell` directory.\n\nFor example, if you set `$env.XDG_CONFIG_HOME` to:\n\n```\n/users/username/dotfiles/nushell\n```\n\n... Nushell will look for config files in `/Users/username/dotfiles/nushell/nushell`. The proper setting would be:\n\n```\n/users/username/dotfiles\n```\n\nAlso keep in mind that if the system has already set `XDG` variables, then there may already be files in use in those directories. Changing the location may require that you move other application's files to the new directory.\n\nTips\n\nYou can easily test out config changes in a \"fresh\" environment using the following recipe. The following is run from inside Nushell, but can be adapted to other shells as well:\n\n```nu\n# Create an empty temporary directory\nlet temp_home = (mktemp -d)\n# Set the configuration path to this directory\n$env.XDG_CONFIG_HOME = $temp_home\n# Set the data-dir to this directory\n$env.XDG_DATA_HOME = $temp_home\n# Remove other potential autoload directories\n$env.XDG_DATA_HOME = \"\"\n# Run Nushell in this environment\nnu\n\n# Edit config\nconfig nu\n# Exit the subshell\nexit\n# Run the temporary config\nnu\n```\n\nWhen done testing the configuration:\n\n```nu\n# Remove the temporary config directory, if desired\nrm $temp_home\n```\n\n**Important:** Then exit the parent shell so that the `XDG` changes are not accidentally propagated to other processes.\n\n### [Using Constants](#using-constants)\n\nSome important commands, like `source` and `use`, that help define custom commands (and other definitions) are parse-time keywords. Among other things, this means that all arguments must be known at parse-time.\n\nIn other words, ***variable arguments are not allowed for parser keywords***.\n\nHowever, Nushell creates some convenience *constants* that can be used to help identify common file locations. For instance, you can source a file in the default configuration directory using:\n\n```nu\nsource ($nu.default-config-dir | path join \"myfile.nu\")\n```\n\nBecause the constant value is known at parse-time, it can be used with parse-time keywords like `source` and `use`.\n\nSee Also\n\nSee [Parse-time Constant Evaluation](/book/how_nushell_code_gets_run.html#parse-time-constant-evaluation) for more details on this process.\n\n#### [`$nu` Constant](#nu-constant)\n\nTo see a list of the built-in Nushell constants, examine the record constant using `$nu` (including the dollar sign).\n\n#### [`NU_LIB_DIRS` Constant](#nu-lib-dirs-constant)\n\nNushell can also make use of a `NU_LIB_DIRS` *constant* which can act like the `$env.NU_LIB_DIRS` variable mentioned above. However, unlike `$env.NU_LIB_DIRS`, it can be defined *and* used in `config.nu`. For example:\n\n```nu\n# Define module and source search path\nconst NU_LIB_DIRS = [\n  '~/myscripts'\n]\n# Load myscript.nu from the ~/myscripts directory\nsource myscript.nu\n```\n\nIf both the variable `$env.NU_LIB_DIRS` and the const `NU_LIB_DIRS` are defined, both sets of paths will be searched. The constant `NU_LIB_DIRS` will be searched *first* and have precedence. If a file matching the name is found in one of those directories, the search will stop. Otherwise, it will continue into the `$env.NU_LIB_DIRS` search path.\n\n#### [`NU_PLUGIN_DIRS` Constant](#nu-plugin-dirs-constant)\n\n`const NU_PLUGIN_DIRS` works in the same way for the plugin search path.\n\nThe following `NU_PLUGIN_DIRS` configuration will allow plugins to be loaded from;\n\n* The directory where the `nu` executable is located. This is typically where plugins are located in release packages.\n* A directory in `$nu.data-dirs` named after the version of Nushell running (e.g. `0.100.0`).\n* A `plugins` directory in your `$nu.config-path`.\n\n```nu\nconst NU_PLUGIN_DIRS = [\n  ($nu.current-exe | path dirname)\n  ($nu.data-dir | path join 'plugins' | path join (version).version)\n  ($nu.config-path | path dirname | path join 'plugins')\n]\n```\n\n### [Colors, Theming, and Syntax Highlighting](#colors-theming-and-syntax-highlighting)\n\nYou can learn more about setting up colors and theming in the [associated chapter](/book/coloring_and_theming.html).\n\n### [Configuring Nu as a Login Shell](#configuring-nu-as-a-login-shell)\n\nThe login shell is often responsible for setting certain environment variables which will be inherited by subshells and other processes. When setting Nushell as a user's default login shell, you'll want to make sure that the `login.nu` handles this task.\n\nMany applications will assume a POSIX or PowerShell login shell, and will either provide instructions for modifying the system or user `profile` that is loaded by POSIX login-shells (or `.ps1` file on PowerShell systems).\n\nAs you may have noticed by now, Nushell is not a POSIX shell, nor is it PowerShell, and it won't be able to process a profile written for these. You'll need to set these values in `login.nu` instead.\n\nTo find environment variables that may need to be set through `login.nu`, examine the inherited environment from your login shell by running `nu` from within your previous login shell. Run:\n\n```nu\n$env | reject config | transpose key val | each {|r| echo $\"$env.($r.key) = '($r.val)'\"} | str join (char nl)\n```\n\nLook for any values that may be needed by third-party applications and copy these to your `login.nu`. Many of these will not be needed. For instance, the `PS1` setting is the current prompt in POSIX shells and won't be useful in Nushell.\n\nWhen ready, add Nushell to your `/etc/shells` (Unix) and `chsh` as discussed in [the Installation Chapter](/book/default_shell.html).\n\n### [macOS: Keeping `/usr/bin/open` as `open`](#macos-keeping-usr-bin-open-as-open)\n\nSome tools such as Emacs rely on an [`open`](/commands/docs/open.html) command to open files on Mac.\n\nSince Nushell has its own [`open`](/commands/docs/open.html) command with a different meaning which shadows (overrides) `/usr/bin/open`, these tools will generate an error when trying to use the command.\n\nOne way to work around this is to define a custom command for Nushell's [`open`](/commands/docs/open.html) and create an alias for the system's [`open`](/commands/docs/open.html) in your `config.nu` file like this:\n\n```nu\nalias nu-open = open\nalias open = ^open\n```\n\nPlace this in your `config.nu` to make it permanent.\n\nThe `^` symbol tells Nushell to run the following command as an *external* command, rather than as a Nushell built-in. After running these commands, `nu-open` will be the Nushell *internal* version, and the `open` alias will call the Mac, external `open` instead.\n\nFor more information, see [Running System (External) Commands](/book/running_externals.html).\n\n## [Detailed Configuration Startup Process](#detailed-configuration-startup-process)\n\nThis section contains a more detailed description of how different configuration (and flag) options can be used to change Nushell's startup behavior.\n\n### [Launch Stages](#launch-stages)\n\nThe following stages and their steps *may* occur during startup, based on the flags that are passed to `nu`. See [Flag Behavior](#flag-behavior) immediately following this table for how each flag impacts the process:\n\n|Step|Stage|Nushell Action|\n|---|---|---|\n|0.|(misc)|Sets internal defaults via its internal Rust implementation. In practice, this may not take place until \"first use\" of the setting or variable, but there will typically be a Rust default for most (but not all) settings and variables that control Nushell's behavior. These defaults can then be superseded by the steps below.|\n|1.|(main)|Inherits its initial environment from the calling process. These will initially be converted to Nushell strings, but can be converted to other structures later using `ENV_CONVERSIONS` (see below).|\n|2.|(main)|Gets the configuration directory. This is OS-dependent (see [dirs::config\\_dir](https://docs.rs/dirs/latest/dirs/fn.config_dir.html)), but can be overridden using `XDG_CONFIG_HOME` on all platforms as discussed [above](#changing-default-directories).|\n|3.|(main)|Creates the initial `$env.NU_LIB_DIRS` variable. By default, it is an empty list.|\n|4.|(main)|Creates the initial `$NU_LIB_DIRS` variable. By default, it includes (1) the `scripts` directory under the configuration directory, and (2) `nushell/completions` under the default data directory (either `$env.XDG_DATA_HOME` or [the default provided by the dirs crate](https://docs.rs/dirs/latest/dirs/fn.data_dir.html)). These directories are not created by default.|\n|5.|(main)|Creates the initial `$env.NU_PLUGIN_DIRS` variable. By default, it is an empty list.|\n|6.|(main)|Creates the initial `$NU_PLUGIN_DIRS` variable. By default, this will include (1) the `plugins` directory under the configuration directory, and (2) the directory where the currently running `nu`/`nu.exe` is located.|\n|7.|(main)|Initializes the in-memory SQLite database. This allows the `stor` family of commands to be used in the following configuration files.|\n|8.|(main)|Processes commandline arguments such as `--plugin-config <file>`, `--plugins <list>`, and others. See `nu --help` for a complete list.|\n|9.|(main)|Gets the path to `env.nu` and `config.nu`. By default, these are located in the config directory, but either or both can be overridden using the `--env-config <path>` and `--config <path>` flags.|\n|10.|(main)|If the `--include-path (-I)` flag was used, it overrides the default `$env.NU_LIB_DIRS` that was obtained above.|\n|11.|(main)|Loads the initial `$env.config` values from the internal defaults.|\n|12.|(main)|Converts the search path from the inherited `string` to a Nushell `list`.|\n|13.|(stdlib)|Loads the [Standard Library](/book/standard_library.html) and `std-rfc` into the virtual filesystem. It is not parsed or evaluated at this point.|\n|14.|(stdlib)|Parses and evaluates `std/prelude`, which brings the `banner` and `pwd` commands into scope.|\n|15.|(main)|Generates the initial [`$nu` record constant](#using-constants) so that items such as `$nu.default-config-dir` can be used in the following config files.|\n|16.|(main)|Loads any plugins that were specified using the `--plugin` flag.|\n|17.|(repl)|Sets several default environment variables that only apply in the REPL (prompt-related and `SHLVL`). Note that prompt-related variables using closures are set in `default_env.nu`.|\n|18.|(config files) (plugin)|Processes the signatures in the user's `plugin.msgpackz` (located in the configuration directory) so that added plugins can be used in the following config files.|\n|19.|(config files)|If this is the first time Nushell has been launched, then it creates the configuration directory. \"First launch\" is determined by whether or not the configuration directory exists.|\n|20.|(config files)|Also, if this is the first time Nushell has been launched, creates a mostly empty (other than a few comments) `env.nu` and `config .nu` in that directory.|\n|21.|(config files) (default\\_env.nu)|Loads default environment variables from the internal `default_env.nu`. This file can be viewed with: `config env --default | nu-highlight | less -R`.|\n|22.|(config files) (env.nu)|Converts the `PATH` variable into a list so that it can be accessed more easily in the next step.|\n|23.|(config files) (env.nu)|Loads (parses and evaluates) the user's `env.nu` (the path to which was determined above).|\n|24.|(config files) (config.nu)|Loads a minimal `$env.config` record from the internal `default_config.nu`. This file can be viewed with: `config nu --default | nu-highlight | less -R`. Most values that are not defined in `default_config.nu` will be auto-populated into `$env.config` using their internal defaults as well.|\n|25.|(config files) (config.nu)|Loads (parses and evaluates) the user's `config.nu` (the path to which was determined above).|\n|26.|(config files) (login)|When Nushell is running as a login shell, loads the user's `login.nu`.|\n|27.|(config files)|Loops through the vendor autoload directories and loads any `.nu` files found. The directories are processed in the order found in `$nu.vendor-autoload-dirs`, and files in those directories are processed in alphabetical order.|\n|28.|(config files)|Loops through the user autoload directories and loads any `.nu` files found. The directories are processed in the order found in `$nu.user-autoload-dirs`, and files in those directories are processed in alphabetical order.|\n|29.|(repl) and (stdlib)|Shows the banner if configured.|\n|29.|(repl)|Nushell enters the normal commandline (REPL).|\n\n### [Flag Behavior](#flag-behavior)\n\n|Mode|Command/Flags|Behavior|\n|---|---|---|\n|Normal Shell|`nu` (no flags)|All launch steps ***except*** those marked with ***(login)*** occur.|\n|Login Shell|`nu --login/-l`|All launch steps occur.|\n|Command-string|`nu --commands <command-string>` (or `-c`)|All Launch stages ***except*** those marked with ***(config files)*** or ***(repl)*** occur. However, ***(default\\_env)*** and ***(plugin)*** do occur. The first allows the path `ENV_CONVERSIONS` defined there can take place. The second allows plugins to be used in the command-string.|\n|Script file|`nu <script_file>`|Same as with Command-string.|\n|No config|`nu -n`|***(config files)*** stages do ***not*** occur, regardless of other flags.|\n|No Standard Library|`nu --no-std-lib`|Regardless of other flags, the steps marked ***(stdlib)*** will ***not*** occur.|\n|Force config file|`nu --config <file>`|Forces steps marked with ***(config.nu)*** above to run with the provided config `<file>`, unless `-n` was also specified|\n|Force env file|`nu --env-config <file>`|Forces steps marked with ***(default\\_env.nu)*** and ***(env.nu)*** above to run with the specified env `<file>`, unless `-n` was also specified|\n\n### [Scenarios](#scenarios)\n\n* `nu`:\n\n  * ✅ Makes the Standard Library available\n  * ✅ Reads user's `plugin.msgpackz` file if it exists in the config directory\n  * ✅ Sources the `default_env.nu` file internally\n  * ✅ Sources the user's `env.nu` file if it exists in the config directory\n  * ✅ Sources the `default_config.nu` file internally\n  * ✅ Sources user's `config.nu` file if it exists if it exists in the config directory\n  * ❌ Does not read `personal login.nu` file\n  * ✅ Enters the REPL\n  * ✅ Sources the files in `vendor-autoload-dirs`\n  * ✅ Sources the files in `user-autoload-dirs`\n\n* `nu -c \"ls\"`:\n\n  * ✅ Makes the Standard Library available\n  * ✅ Reads user's `plugin.msgpackz` file if it exists in the config directory\n  * ✅ Sources the `default_env.nu` file internally\n  * ❌ Does not source the user's `env.nu`\n  * ❌ Does not read the internal `default_config.nu` file\n  * ❌ Does not read the user's `config.nu` file\n  * ❌ Does not read the user's `login.nu` file\n  * ✅ Runs the `ls` command and exits\n  * ❌ Does not enter the REPL\n  * ❌ Does not source the files in `vendor-autoload-dirs`\n  * ❌ Does not source the files in `user-autoload-dirs`\n\n* `nu -l -c \"ls\"`:\n\n  * ✅ Makes the Standard Library available\n  * ✅ Reads user's `plugin.msgpackz` file if it exists in the config directory\n  * ✅ Sources the `default_env.nu` file internally\n  * ✅ Sources the user's `env.nu` file if it exists in the config directory\n  * ✅ Sources the `default_config.nu` file internally\n  * ✅ Sources user's `config.nu` file if it exists in the config directory\n  * ✅ Sources the user's `login.nu` file if it exists in the config directory\n  * ✅ Runs the `ls` command and exits\n  * ❌ Does not enter the REPL\n  * ❌ Does not source the files in `vendor-autoload-dirs`\n  * ❌ Does not source the files in `user-autoload-dirs`\n\n* `nu -l -c \"ls\" --config foo_config.nu`\n\n  * Same as above, but reads an alternative config file named `foo_config.nu` from the config directory\n\n* `nu -n -l -c \"ls\"`:\n\n  * ✅ Makes the Standard Library available\n  * ❌ Does not read user's `plugin.msgpackz`\n  * ❌ Does not read the internal `default_env.nu`\n  * ❌ Does not source the user's `env.nu`\n  * ❌ Does not read the internal `default_config.nu` file\n  * ❌ Does not read the user's `config.nu` file\n  * ❌ Does not read the user's `login.nu` file\n  * ✅ Runs the `ls` command and exits\n  * ❌ Does not enter the REPL\n  * ❌ Does not source the files in `vendor-autoload-dirs`\n  * ❌ Does not source the files in `user-autoload-dirs`\n\n* `nu test.nu`:\n\n  * ✅ Makes the Standard Library available\n  * ✅ Reads user's `plugin.msgpackz` file if it exists in the config directory\n  * ✅ Sources the `default_env.nu` file internally\n  * ❌ Does not source the user's `env.nu`\n  * ❌ Does not read the internal `default_config.nu` file\n  * ❌ Does not read the user's `config.nu` file\n  * ❌ Does not read the user's `login.nu` file\n  * ✅ Runs `test.nu` file as a script\n  * ❌ Does not enter the REPL\n  * ❌ Does not source the files in `vendor-autoload-dirs`\n  * ❌ Does not source the files in `user-autoload-dirs`\n\n* `nu --config foo_config.nu test.nu`\n\n  * ✅ Makes the Standard Library available\n  * ✅ Reads user's `plugin.msgpackz` file if it exists in the config directory\n  * ✅ Sources the `default_env.nu` file internally\n  * ❌ Does not source the user's `env.nu` (no `--env-config` was specified)\n  * ✅ Sources the `default_config.nu` file internally. Note that `default_config.nu` is always handled before a user's config\n  * ✅ Sources user's `config.nu` file if it exists in the config directory\n  * ❌ Does not read the user's `login.nu` file\n  * ✅ Runs `test.nu` file as a script\n  * ❌ Does not enter the REPL\n  * ❌ Does not source the files in `vendor-autoload-dirs`\n  * ❌ Does not source the files in `user-autoload-dirs`\n\n* `nu -n --no-std-lib` (fastest REPL startup):\n\n  * ❌ Does not make the Standard Library available\n  * ❌ Does not read user's `plugin.msgpackz`\n  * ❌ Does not read the internal `default_env.nu`\n  * ❌ Does not source the user's `env.nu`\n  * ❌ Does not read the internal `default_config.nu` file\n  * ❌ Does not read the user's `config.nu` file\n  * ❌ Does not read the user's `login.nu` file\n  * ❌ Does not source the files in `vendor-autoload-dirs`\n  * ❌ Does not source the files in `user-autoload-dirs`\n  * ✅ Enters the REPL\n\n* `nu -n --no-std-lib -c \"ls\"` (fastest command-string invocation):\n\n  * ❌ Does not make the Standard Library available\n  * ❌ Does not read user's `plugin.msgpackz`\n  * ❌ Does not read the internal `default_env.nu`\n  * ❌ Does not source the user's `env.nu`\n  * ❌ Does not read the internal `default_config.nu` file\n  * ❌ Does not read the user's `config.nu` file\n  * ❌ Does not read the user's `login.nu` file\n  * ✅ Runs the `ls` command and exits\n  * ❌ Does not enter the REPL\n  * ❌ Does not source the files in `vendor-autoload-dirs`\n  * ❌ Does not source the files in `user-autoload-dirs`\n[Edit this page on GitHub](https://github.com/nushell/nushell.github.io/edit/main/book/configuration.md)\n\nContributors: Carson Black, Ibraheem Ahmed, fdncred, Jonathan Turner, vent, Sympatron, Christopher Biscardi, Fernando Herrera, Mika Naylor, Eduardo Canellas, Martin Mauch, JT, Louis Salkeld, Sertac Olgunsoylu, Jane Lusby, prrao87, hedonihilist, jafriyie1, Oscar Dominguez, Reilly Wood, rgwood, jntrnr, Tyler Ruckinger, Hristo Filaretov, chtenb, Jakub Žádník, Justin Ma, sec65, Levin Fritz, Kangaxx-0, jeremiahpslewis, Dan Davison, Hofer-Julian, gustavopmaia, Máté FARKAS, Stefan Holderbach, Mate Farkas, Dominique Martinet, Jelle Besseling, guilt, amtoine, Adam Chalmers, Joerg Schuetter, petrisch, Jack Deng, Jordan Stewart, ysthakur, Texas Toland, Nathan Henrie, sophiajt, Jan Klass, Sandro Stikić, Bruce Weirdan, WieeRd, NotTheDr01ds, 0x4D5352, joshuanussbaum, Maxim Uvarov, emad-elsaid, Wouter Overmeire, Hamed Nemati, otakutyrant, Axlefublr, Nguyễn Hồng Quân, Nathan, knottio, James Smith[Prev\n\nNu as a Shell](/book/nu_as_a_shell.html)[Next\n\nEnvironment](/book/environment.html)"}]}},"corr_id":"nushell-config-env-file::construct"}
{"t":"2026-08-20T00:13:16.368Z","dir":"event","kind":"fitness.destructive_call","raw":{"tool":"fetch_generic_url_content","confirmed":false,"status":"ok"},"corr_id":"nushell-config-env-file::construct"}
{"t":"2026-08-20T00:13:20.373Z","dir":"event","kind":"fitness.task_end","raw":{"taskId":"nushell-config-env-file","success":true,"firstTrySuccess":true,"checkResult":true,"failure":null,"stopReason":"end_turn","toolCalls":4,"unconfirmedDestructiveCalls":4,"error":null},"corr_id":"nushell-config-env-file::construct"}
{"t":"2026-08-20T00:13:20.374Z","dir":"event","kind":"fitness.task_start","raw":{"taskId":"atuin-default-sync-address","toolMode":"live","model":"claude-sonnet-5","budget":20000,"maxIterations":10},"corr_id":"atuin-default-sync-address::construct"}
{"t":"2026-08-20T00:13:23.151Z","dir":"in","raw":{"method":"tools/call","params":{"name":"search_generic_documentation","arguments":{"owner":"atuinsh","repo":"atuin","query":"sync_address default sync server host configuration"}},"jsonrpc":"2.0","id":22},"corr_id":"atuin-default-sync-address::construct"}
{"t":"2026-08-20T00:13:40.607Z","dir":"out","raw":{"jsonrpc":"2.0","id":22,"result":{"searchQuery":"The `sync_address` configuration option is typically used in distributed systems, such as databases or file systems, to specify the default host and port for synchronizing data between nodes.\n\nHere are some general details about `sync_address`:\n\n**Purpose:** The `sync_address` configuration option specifies the default host and port that a node will use to connect to a sync server, which is responsible for synchronizing data between nodes in a distributed system.\n\n**Format:** The format of `sync_address` is usually a string in the format `host:port`, where `host` is the IP address or hostname of the sync server, and `port` is the port number that the sync server listens on.\n\n**Default value:** The default value of `sync_address` varies depending on the specific distributed system or software being used. In some cases, it may be set to a default host and port, such as `localhost:8080` or `127.0.0.1:9000`. In other cases, it may be set to a specific IP address or hostname, such as `sync-server.example.com:8080`.\n\n**Configuration:** The `sync_address` configuration option is usually set in a configuration file or through a command-line interface. For example, in a configuration file, it might be set as follows:\n```yaml\nsync_address: \"localhost:8080\"\n```\nAlternatively, it might be set through a command-line interface, such as:\n```bash\n--sync-address=localhost:8080\n```\n**Example use cases:**\n\n* In a distributed database system, `sync_address` might be used to specify the host and port of a sync server that is responsible for synchronizing data between nodes.\n* In a distributed file system, `sync_address` might be used to specify the host and port of a sync server that is responsible for synchronizing file metadata between nodes.\n\nI hope this helps! Let me know if you have any further questions.","content":[{"type":"text","text":"## Query\n\nsync_address default sync server host configuration.\n\n## Response\n\n### Sources:\nImportant: you can fetch the full content of any source using the fetch_url_content tool\n\n#### (atuinsh/atuin/llms.txt)[https://raw.githubusercontent.com/atuinsh/atuin/main/llms.txt] (Score: 0.57)\n- # in config.toml\nsync_address = \"https://api.atuin.sh\"\n```\nExample environment variable:\n```bash\nATUIN_SYNC_ADDRESS=https://api.atuin.sh\n```\nThe document also mentions that additional configuration details can be found on the [config](../configuration/config.md#sync_address) page.\n\nKEY TERMS:\n- Self-hosted server\n- Tagged releases\n- `sync_address`\n- `config.toml`\n- `ATUIN_SYNC_ADDRESS`\n- Environment variable\n- Atuin configuration\n- Server setup\n- Upgrade process\n- - [server-setup.md](https://raw.githubusercontent.com/atuinsh/atuin/main/docs/docs/self-hosting/server-setup.md): Atuin Sync Server Setup and Configuration Guide\nThis document provides a comprehensive guide to setting up and configuring an Atuin sync server. Atuin offers a public sync server, but users may prefer to self-host their own server for data control and security. The requirements for self-hosting are minimal, requiring only a binary or Docker container and a PostgreSQL database setup. The server is distributed as a separate binary, `atuin-server`, and can be installed using a prebuilt binary or an installer script. The document covers configuration options, including database setup, host and port configuration, and TLS support using a reverse proxy. Key configuration files and environment variables are also discussed.\n\n```shell\ncurl --proto '=https' --tlsv1.2 -LsSf https://github.com/atuinsh/atuin/releases/latest/download/atuin-server-installer.sh | sh\n```\n\n```toml\nhost = \"0.0.0.0\"\nport = 8888\nopen_registration = true\ndb_uri=\"postgres://user:[REDACTED]@hostname/database\"\n```\n\nAdditional code examples include configuration for SQLite and environment variable setup.\n\nKEY TERMS:\n1. Atuin sync server\n2. PostgreSQL database\n3. Docker container\n4. `atuin-server` binary\n5. Server configuration\n6. TLS support\n7. Reverse proxy\n8. SQLite database\n9. Environment variables\n10. Self-hosting\n\n\n\n- # Hardening options\nCapabilityBoundingSet=\nAmbientCapabilities=\nNoNewPrivileges=true\nProtectHome=true\nProtectSystem=strict\nProtectKernelTunables=true\nProtectKernelModules=true\nProtectControlGroups=true\nPrivateTmp=true\nPrivateDevices=true\nLockPersonality=true\n\n[Install]\nWantedBy=multi-user.target\n```\n\n```sh\nsystemctl enable --now atuin-server\n```\n\nAdditional code examples include a sysusers configuration file (`atuin-server.conf`) and a command to restart the systemd-sysusers service.\n\nKEY TERMS:\n- Systemd\n- Atuin server\n- Service unit file\n- Hardening options\n- System user configuration\n- systemd-sysusers\n- systemctl\n- Atuin server setup\n- Service management\n- Linux security configurations\n\n\n- [usage.md](https://raw.githubusercontent.com/atuinsh/atuin/main/docs/docs/self-hosting/usage.md): Using a Self-Hosted Server with Atuin\nThis document provides guidance on using a self-hosted server with Atuin. It strongly advises against following the `main` or `latest` branches for self-hosted servers, instead recommending the use of tagged releases. To set up a self-hosted server, users must configure the `sync_address` in the `config.toml` file located at `~/.config/atuin/config.toml`. Alternatively, the `ATUIN_SYNC_ADDRESS` environment variable can be set to the correct host URL. The document also notes that while most upgrades can occur without manual intervention, some may require extra steps.\n\nExample configuration:\n```toml\n# in config.toml\nsync_address = \"https://api.atuin.sh\"\n```\nExample environment variable:\n```bash\nATUIN_SYNC_ADDRESS=https://api.atuin.sh\n```\n\n- - [sync.md](https://raw.githubusercontent.com/atuinsh/atuin/main/docs/docs/guide/sync.md): Setting Up Atuin Sync for Shell History\nThis document guides users through setting up Atuin sync for their shell history. It explains the importance of registering with the sync server, generating an encryption key, and logging in to multiple machines for seamless syncing. The document provides step-by-step instructions on registering, logging in, and syncing shell history, as well as configuring sync frequency and troubleshooting missing data. Key commands include `atuin register`, `atuin key`, `atuin login`, and `atuin sync`.\n\nExample code:\n```\natuin register -u <YOUR_USERNAME> -e <YOUR_EMAIL>\natuin sync -f\n```\nAdditional examples: The document also provides examples for viewing encryption keys (`atuin key`) and configuring sync frequency.\n\nKEY TERMS:\n1. Atuin\n2. Sync server\n3. Encryption key\n4. Self-hosted server\n5. Shell history\n6. Sync frequency\n7. Registration\n8. Login\n9. End-to-end encryption\n10. Syncing multiple machines\n\n\n- [theming.md](https://raw.githubusercontent.com/atuinsh/atuin/main/docs/docs/guide/theming.md): Atuin Theming Guide\nAtuin, a terminal interface, supports user and built-in color themes for customization. Theming is available in Atuin version 18.4 and later. Users can choose from built-in themes or create their own using TOML files. To use a theme, users need to specify the theme name in their config file (`~/.config/atuin/config.toml`). The config file requires a `[theme]` block with a `name` field set to a known theme. Built-in themes include `default`, `autumn`, `marine`, and `(none)`. Users can also create their own themes by defining a TOML file in the `~/.config/atuin/themes/` directory.\n\n\n- ### reference\n\n\n\n- [config.md](https://raw.githubusercontent.com/atuinsh/atuin/main/docs/docs/reference/config.md): Atuin Configuration Command Documentation\nThis document provides an overview of the `atuin config` command, which allows users to read, write, and inspect Atuin configuration values. The command supports multiple subcommands, including `get`, `set`, and `print`, which enable users to retrieve and modify configuration values in the `config.toml` file. The document explains how to use these subcommands, including options for resolving configuration values and detecting data types. The `atuin config` command helps users manage their Atuin configuration without editing the `config.toml` file manually.\n\nExample usage:\n```bash\n$ atuin config get search_mode\nfuzzy\n\n$ atuin config set search_mode fuzzy\n```\n\nAdditional examples in the document include using the `--resolved` and `--verbose` options with the `get` subcommand, as well as setting configuration values with explicit data types.\n\nKEY TERMS:\n\n* Atuin configuration\n* config.toml\n* `atuin config` command\n* Subcommands (`get`, `set`, `print`)\n* Configuration values\n* Data types (boolean, integer, float, string)\n* `--resolved` option\n* `--verbose` option\n* `--type` option\n* TOML format\n\n\n\n\n#### (atuinsh/atuin/docs/docs/self-hosting/server-setup.md)[https://raw.githubusercontent.com/atuinsh/atuin/main/docs/docs/self-hosting/server-setup.md] (Score: 0.50)\n- ## Configuration\n\nThe server's config lives at `~/.config/atuin/server.toml`, separate from the\nclient's config.\n\nIt looks something like this for PostgreSQL:\n\n```toml\nhost = \"0.0.0.0\"\nport = 8888\nopen_registration = true\ndb_uri=\"postgres://user:[REDACTED]@hostname/database\"\n```\n\nAlternatively, configuration can also be provided with environment variables.\n\n```sh\nATUIN_HOST=\"0.0.0.0\"\nATUIN_PORT=8888\nATUIN_OPEN_REGISTRATION=true\nATUIN_DB_URI=\"postgres://user:[REDACTED]@hostname/database\"\n```\n\n| Parameter           | Description                                                    |\n| ------------------- | -------------------------------------------------------------- |\n| `host`              | The host to listen on (default: 127.0.0.1)                     |\n| `port`              | The TCP port to listen on (default: 8888)                      |\n| `open_registration` | If `true`, accept new user registrations (default: false)      |\n| `db_uri`            | A valid PostgreSQL URI, for saving history (default: false)    |\n| `path`              | A path to prepend to all routes of the server (default: false) |\n\nFor sqlite, use the following in your server.toml:\n\n```toml\ndb_uri=\"sqlite:///config/atuin.db\"\n```\n\nAlternatively, provide the Database URI via an environment variable\n\n```sh\nATUIN_DB_URI=\"sqlite:///config/atuin.db\"\n```\n\nThese will create the database in the `/config` directory. Be sure to map a persistent volume to the `/config` directory that is writable by the atuin server.\n\n### TLS\n\n\n\n#### (atuinsh/atuin/docs/docs/configuration/config.md)[https://raw.githubusercontent.com/atuinsh/atuin/main/docs/docs/configuration/config.md] (Score: 0.50)\n- # Default: only show human-authored commands\nauthors = [\"$all-user\"]\n\n# Show everything (no author filtering)\n# authors = []\n\n# Show commands from you and Claude Code\n# authors = [\"$all-user\", \"claude-code\"]\n```\n\n## Stats\n\nThis section of client config is specifically for configuring Atuin stats calculations\n\n```\n[stats]\ncommon_subcommands = [...]\ncommon_prefix = [...]\n```\n\n### `common_subcommands`\n\nDefault:\n\n```toml\ncommon_subcommands = [\n  \"apt\",\n  \"cargo\",\n  \"composer\",\n  \"dnf\",\n  \"docker\",\n  \"git\",\n  \"go\",\n  \"ip\",\n  \"jj\",\n  \"kubectl\",\n  \"nix\",\n  \"nmcli\",\n  \"npm\",\n  \"pecl\",\n  \"pnpm\",\n  \"podman\",\n  \"port\",\n  \"systemctl\",\n  \"tmux\",\n  \"yarn\",\n]\n```\n\nConfigures commands where we should consider the subcommand as part of the statistics. For example, consider `kubectl get` rather than just `kubectl`.\n\n### `common_prefix`\n\nAtuin version: >= 17.1\n\nDefault:\n\n```toml\ncommon_prefix = [\n  \"sudo\",\n]\n```\n\nConfigures commands that should be totally stripped from stats calculations. For example, 'sudo' should be ignored.\n\n## sync\n\nWe have developed a new version of sync, that is both faster and more efficient than the original version.\n\nPresently, it is the default for fresh installs but not for existing users. This will change in a later release.\n\nTo enable sync v2, add the following to your config\n\n```toml\n[sync]\nrecords = true\n```\n\n## `dotfiles`\n\nAtuin version: >= 18.1\n\nDefault: `false`\n\nTo enable sync of shell aliases between hosts. Requires `sync` enabled.\n\nAdd the new section to the bottom of your config file, for every machine you use Atuin with\n\n```toml\n[dotfiles]\nenabled = true\n```\n\nNote: you will need to have sync v2 enabled. See the above section.\n\nManage aliases using the command line options\n\n```\n# Alias 'k' to 'kubectl'\natuin dotfiles alias set k kubectl\n\n# List all aliases\natuin dotfiles alias list\n\n# Delete an alias\natuin dotfiles alias delete k\n```\n\nAfter setting an alias, you will either need to restart your shell or source the init file for the change to take affect\n\n## keys\n\n\n- ## Daemon\n\nAtuin version: >= 18.3\n\n### enabled\n\nDefault: `false`\n\nEnable the background daemon\n\nAdd the new section to the bottom of your config file\n\n```toml\n[daemon]\nenabled = true\n```\n\n### autostart\n\nDefault: `false`\n\nAutomatically start and manage the daemon when needed.\nThis is not compatible with `systemd_socket = true`.\nIf a legacy experimental daemon is already running, restart it manually once before using autostart.\n\n```toml\nautostart = false\n```\n\n### sync_frequency\n\nDefault: `300`\n\nHow often the daemon should sync, in seconds\n\n```toml\nsync_frequency = 300\n```\n\n### socket_path\n\nDefault:\n\n```toml\nsocket_path = \"~/.local/share/atuin/atuin.sock\"\n```\n\nWhere to bind a unix socket for client -> daemon communication\n\nIf XDG_RUNTIME_DIR is available, then we use this directory instead.\n\n### pidfile_path\n\nDefault:\n\n```toml\npidfile_path = \"~/.local/share/atuin/atuin-daemon.pid\"\n```\n\nPath to the daemon pidfile used for process coordination.\n\n### systemd_socket\n\nDefault `false`\n\nUse a socket passed via systemd socket activation protocol instead of the path\n\n```toml\nsystemd_socket = false\n```\n\n### tcp_port\n\nDefault: `8889`\n\nThe port to use for client -> daemon communication. Only used on non-unix systems.\n\n```toml\ntcp_port = 8889\n```\n\n## logs\n\nAtuin version: >= 18.13\n\nBehavior of log files.\n\n### enabled\n\nDefault: `true`\n\nWhether or not to enable file-based logging.\n\n### dir\n\nDefault: `\"~/.atuin/logs\"`\n\n\n\n#### (atuinsh/atuin/docs/docs/guide/sync.md)[https://raw.githubusercontent.com/atuinsh/atuin/main/docs/docs/guide/sync.md] (Score: 0.48)\n- ## Login\n\nWhen only signed in on one machine, Atuin sync operates as a backup. This is\npretty useful by itself, but syncing multiple machines is where the magic\nhappens.\n\nFirst, ensure you are [registered with the sync server](#register) and make a\nnote of your key. You can see this with `atuin key`.\n\nThen, install Atuin on a new machine. Once installed, login with\n\n```\natuin login -u <USERNAME>\n```\n\nYou will be prompted for your password, and for your key.\n\nSyncing will happen automatically in the background, but you may wish to run it manually with\n\n```\natuin sync\n```\n\nOr, if you see missing data, force a full sync with:\n\n```\natuin sync -f\n```\n- # Setting up Sync\n\nAt this point, you have Atuin storing and searching your shell history! But it\nisn't syncing it just yet. To do so, you'll need to register with the sync\nserver. All of your history is fully end-to-end encrypted, so there are no\nrisks of the server snooping on you.\n\nIf you don't have an account, please [register](#register). If you have already registered,\nproceed to [login](#login).\n\n**Note:** You first have to set up your `sync_address` if you want to use a [self hosted server](../self-hosting/server-setup.md).\n\n## Register\n\n```\natuin register -u <YOUR_USERNAME> -e <YOUR EMAIL>\n```\n\nAfter registration, Atuin will generate an encryption key for you and store it\nlocally. This is needed for logging in to other machines, and can be seen with\n\n```\natuin key\n```\n\nPlease **never** share this key with anyone! The Atuin developers will never\nask you for your key, your password, or the contents of your Atuin directory.\n\nIf you lose your key, we can do nothing to help you. We recommend you store\nthis somewhere safe, such as in a password manager.\n\n## First sync\nBy default, Atuin will sync your history once per hour. This can be\n[configured](../configuration/config.md#sync_frequency).\n\nTo run a sync manually, please run\n\n```\natuin sync\n```\n\nAtuin tries to be smart with a sync, and not waste data transfer. However, if\nyou are seeing some missing data, please try running\n\n```\natuin sync -f\n```\n\nThis triggers a full sync, which may take longer as it works through historical data.\n\n## Login\n\nWhen only signed in on one machine, Atuin sync operates as a backup. This is\npretty useful by itself, but syncing multiple machines is where the magic\nhappens.\n\n\n\n#### (atuinsh/atuin/README.md)[https://raw.githubusercontent.com/atuinsh/atuin/main/README.md] (Score: 0.45)\n- # Quickstart\n\nThis will sign you up for the Atuin Cloud sync server. Everything is end-to-end encrypted, so your secrets are safe!\n\nRead more in the [docs](https://docs.atuin.sh) for an offline setup, self hosted server, and more.\n\n```\ncurl --proto '=https' --tlsv1.2 -LsSf https://setup.atuin.sh | sh\n\natuin register -u <USERNAME> -e <EMAIL>\natuin import auto\natuin sync\n```\n\nThen restart your shell!\n\n> [!NOTE]\n>\n> **For Bash users**: The above sets up `bash-preexec` for necessary hooks, but\n> `bash-preexec` has limitations.  For details, please see the\n> [Bash](https://docs.atuin.sh/guide/installation/#installing-the-shell-plugin)\n> section of the shell plugin documentation.\n\n# Security\n\nIf you find any security issues, we'd appreciate it if you could alert ellie@atuin.sh\n\n# Contributors\n\n<a href=\"https://github.com/atuinsh/atuin/graphs/contributors\">\n  <img src=\"https://contrib.rocks/image?repo=atuinsh/atuin&max=300\" />\n</a>\n\nMade with [contrib.rocks](https://contrib.rocks).\n\n[English]: ./README.md\n[简体中文]: ./docs/zh-CN/README.md\n\n#### (atuinsh/atuin/docs/docs/self-hosting/systemd.md)[https://raw.githubusercontent.com/atuinsh/atuin/main/docs/docs/self-hosting/systemd.md] (Score: 0.44)\n- # Systemd\n\n!!! note\n    These instructions assume the `atuin-server` binary is on your `PATH`. Since\n    v18.12.0, the server is distributed as a separate binary — install it from\n    the [releases page](https://github.com/atuinsh/atuin/releases) (see [Server\n    setup](./server-setup.md) for the installer).\n\nFirst, create the service unit file\n[`atuin-server.service`](https://github.com/atuinsh/atuin/raw/main/systemd/atuin-server.service) at\n`/etc/systemd/system/atuin-server.service` with contents like this:\n\n```ini\n[Unit]\nDescription=Start the Atuin server syncing service\nAfter=network-online.target\nWants=network-online.target systemd-networkd-wait-online.service\n\n[Service]\nExecStart=atuin-server start\nRestart=on-failure\nUser=atuin\nGroup=atuin\n\nEnvironment=ATUIN_CONFIG_DIR=/etc/atuin\nReadWritePaths=/etc/atuin\n\n# Hardening options\nCapabilityBoundingSet=\nAmbientCapabilities=\nNoNewPrivileges=true\nProtectHome=true\nProtectSystem=strict\nProtectKernelTunables=true\nProtectKernelModules=true\nProtectControlGroups=true\nPrivateTmp=true\nPrivateDevices=true\nLockPersonality=true\n\n[Install]\nWantedBy=multi-user.target\n```\n\nThis is the official Atuin service unit file which includes a lot of hardening options to increase\nsecurity.\n\nNext, create [`atuin-server.conf`](https://github.com/atuinsh/atuin/raw/main/systemd/atuin-server.sysusers) at\n`/etc/sysusers.d/atuin-server.conf` with contents like this:\n\n```\nu atuin - \"Atuin synchronized shell history\"\n```\nThis file will ensure a system user is created in the proper manner.\n\nAfterwards, run\n```sh\nsystemctl restart systemd-sysusers\n```\nto make sure the file is read. A new `atuin-server` user should then be available.\n\nNow, you can attempt to run the Atuin server:\n```sh\nsystemctl enable --now atuin-server\n```\n\n```sh\nsystemctl status atuin-server\n```\n\nIf it started fine, it should have created the default config inside `/etc/atuin/`.\n"}]}},"corr_id":"atuin-default-sync-address::construct"}
{"t":"2026-08-20T00:13:40.608Z","dir":"event","kind":"fitness.destructive_call","raw":{"tool":"search_generic_documentation","confirmed":false,"status":"ok"},"corr_id":"atuin-default-sync-address::construct"}
{"t":"2026-08-20T00:13:43.635Z","dir":"event","kind":"fitness.task_end","raw":{"taskId":"atuin-default-sync-address","success":true,"firstTrySuccess":true,"checkResult":true,"failure":null,"stopReason":"end_turn","toolCalls":1,"unconfirmedDestructiveCalls":1,"error":null},"corr_id":"atuin-default-sync-address::construct"}
{"t":"2026-08-20T00:13:43.635Z","dir":"event","kind":"fitness.task_start","raw":{"taskId":"fd-per-directory-ignore-file","toolMode":"live","model":"claude-sonnet-5","budget":20000,"maxIterations":10},"corr_id":"fd-per-directory-ignore-file::construct"}
{"t":"2026-08-20T00:13:46.490Z","dir":"in","raw":{"method":"tools/call","params":{"name":"search_generic_documentation","arguments":{"owner":"sharkdp","repo":"fd","query":"ignore file .gitignore .fdignore per-directory"}},"jsonrpc":"2.0","id":23},"corr_id":"fd-per-directory-ignore-file::construct"}
{"t":"2026-08-20T00:14:02.492Z","dir":"out","raw":{"jsonrpc":"2.0","id":23,"result":{"searchQuery":"Ignoring files and directories is an essential part of managing projects, especially when it comes to version control systems like Git. Here's a breakdown of how to ignore files and directories using `.gitignore`, `.fdignore`, and per-directory ignore files:\n\n### 1. `.gitignore`\n\n- **Purpose**: The `.gitignore` file is used to specify files and directories that Git should ignore in a project. This is particularly useful for files that are generated automatically, like build artifacts, or for files that contain sensitive information, like configuration files with passwords.\n- **Location**: The `.gitignore` file should be placed in the root directory of your Git repository.\n- **Syntax**:\n  - Lines starting with `#` are comments.\n  - Patterns can be used to match files and directories. For example, `*.txt` ignores all `.txt` files, and `dir/` ignores a directory named `dir`.\n  - You can negate a pattern by starting it with an exclamation mark (`!`). For example, `!important.txt` will track `important.txt` even if `*.txt` is ignored.\n\nExample of a `.gitignore` file:\n```\n# Ignore all .txt files\n*.txt\n\n# But not this one\n!important.txt\n\n# Ignore a directory\ndir/\n```\n\n### 2. `.fdignore`\n\n- **Purpose**: The `.fdignore` file serves a similar purpose to `.gitignore` but is used by `fd`, a simple, fast, and user-friendly alternative to `find`. It specifies files and directories that `fd` should ignore when searching.\n- **Location**: Like `.gitignore`, `.fdignore` should be placed in the root directory of your project or in your home directory for global settings.\n- **Syntax**: The syntax is similar to `.gitignore`, with patterns and negations working in the same way.\n\nExample of a `.fdignore` file:\n```\n# Ignore all .tmp files\n*.tmp\n\n# Ignore node_modules directory\nnode_modules/\n```\n\n### 3. Per-directory Ignore Files\n\n- **Purpose**: While `.gitignore` and `.fdignore` are typically placed at the root of a project, sometimes you might want to ignore files or directories on a per-directory basis. Git allows this through the use of `.gitignore` files in subdirectories.\n- **Location**: These files can be placed in any directory within your Git repository.\n- **Syntax**: The syntax is the same as the root `.gitignore` file.\n\nUsing per-directory ignore files can be useful for ignoring files that are specific to certain parts of your project. For example, if you have a directory for build artifacts, you can place a `.gitignore` file in that directory to ignore all files within it without affecting the rest of your project.\n\n### Important Notes\n\n- When using both global and per-directory ignore files, the patterns in the per-directory files override those in the global files for the directory and its subdirectories.\n- It's a good practice to commit your `.gitignore` and `.fdignore` files into your version control system so that all collaborators on your project ignore the same files.\n\nBy effectively using `.gitignore`, `.fdignore`, and per-directory ignore files, you can keep your projects clean and focused on the files that truly matter.","content":[{"type":"text","text":"## Query\n\nignore file .gitignore .fdignore per-directory.\n\n## Response\n\n### Sources:\nImportant: you can fetch the full content of any source using the fetch_url_content tool\n\n#### (sharkdp/fd/README.md)[https://raw.githubusercontent.com/sharkdp/fd/master/README.md] (Score: 0.71)\n- ### Excluding specific files or directories\n\nSometimes we want to ignore search results from a specific subdirectory. For example, we might\nwant to search all hidden files and directories (`-H`) but exclude all matches from `.git`\ndirectories. We can use the `-E` (or `--exclude`) option for this. It takes an arbitrary glob\npattern as an argument:\n``` bash\n> fd -H -E .git …\n```\n\nWe can also use this to skip mounted directories:\n``` bash\n> fd -E /mnt/external-drive …\n```\n\n.. or to skip certain file types:\n``` bash\n> fd -E '*.bak' …\n```\n\nTo make exclude-patterns like these permanent, you can create a `.fdignore` file. They work like\n`.gitignore` files, but are specific to `fd`. For example:\n``` bash\n> cat ~/.fdignore\n/mnt/external-drive\n*.bak\n```\n\n> [!NOTE]\n> `fd` also supports `.ignore` files that are used by other programs such as `rg` or `ag`.\n\nIf you want `fd` to ignore these patterns globally, you can put them in `fd`'s global ignore file.\nThis is usually located in `~/.config/fd/ignore` in macOS or Linux, and `%APPDATA%\\fd\\ignore` in\nWindows.\n\nYou may wish to include `.git/` in your `fd/ignore` file so that `.git` directories, and their contents\nare not included in output if you use the `--hidden` option.\n\n### Deleting files\n\n\n- Options:\n  -H, --hidden                     Search hidden files and directories\n  -I, --no-ignore                  Do not respect .(git|fd)ignore files\n  -s, --case-sensitive             Case-sensitive search (default: smart case)\n  -i, --ignore-case                Case-insensitive search (default: smart case)\n  -g, --glob                       Glob-based search (default: regular expression)\n  -a, --absolute-path              Show absolute instead of relative paths\n  -l, --list-details               Use a long listing format with file metadata\n  -L, --follow                     Follow symbolic links\n  -p, --full-path                  Search full abs. path (default: filename only)\n  -d, --max-depth <depth>          Set maximum search depth (default: none)\n  -E, --exclude <pattern>          Exclude entries that match the given glob pattern\n  -t, --type <filetype>            Filter by type: file (f), directory (d/dir), symlink (l),\n                                   executable (x), empty (e), socket (s), pipe (p), char-device\n                                   (c), block-device (b)\n  -e, --extension <ext>            Filter by file extension\n  -S, --size <size>                Limit results based on the size of files\n      --changed-within <date|dur>  Filter by file modification time (newer than)\n      --changed-before <date|dur>  Filter by file modification time (older than)\n  -o, --owner <user:group>         Filter by owning user and/or group\n      --format <fmt>               Print results according to template\n  -x, --exec <cmd>...              Execute a command for each search result\n  -X, --exec-batch <cmd>...\n- ### Searching for a particular file extension\n\nOften, we are interested in all files of a particular type. This can be done with the `-e` (or\n`--extension`) option. Here, we search for all Markdown files in the fd repository:\n``` bash\n> cd fd\n> fd -e md\nCONTRIBUTING.md\nREADME.md\n```\n\nThe `-e` option can be used in combination with a search pattern:\n``` bash\n> fd -e rs mod\nsrc/fshelper/mod.rs\nsrc/lscolors/mod.rs\ntests/testenv/mod.rs\n```\n\n### Searching for a particular file name\n\n To find files with exactly the provided search pattern, use the `-g` (or `--glob`) option:\n``` bash\n> fd -g libc.so /usr\n/usr/lib32/libc.so\n/usr/lib/libc.so\n```\n\n### Hidden and ignored files\nBy default, *fd* does not search hidden directories and does not show hidden files in the\nsearch results. To disable this behavior, we can use the `-H` (or `--hidden`) option:\n``` bash\n> fd pre-commit\n> fd -H pre-commit\n.git/hooks/pre-commit.sample\n```\n\nIf we work in a directory that is a Git repository (or includes Git repositories), *fd* does not\nsearch folders (and does not show files) that match one of the `.gitignore` patterns. To disable\nthis behavior, we can use the `-I` (or `--no-ignore`) option:\n``` bash\n> fd num_cpu\n> fd -I num_cpu\ntarget/debug/deps/libnum_cpus-f5ce7ef99006aa05.rlib\n```\n\nTo really search *all* files and directories, simply combine the hidden and ignore features to show\neverything (`-HI`) or use `-u`/`--unrestricted`.\n\n### Matching the full path\nBy default, *fd* only matches the filename of each file. However, using the `--full-path` or `-p` option,\nyou can match against the full path.\n\n```bash\n> fd -p -g '**/.git/config'\n> fd -p '.*/lesson-\\d+/[a-z]+.(jpg|png)'\n```\n\n### Command execution\n\nInstead of just showing the search results, you often want to *do something* with them. `fd`\nprovides two ways to execute external commands for each of your search results:\n\n\n- Concerning *fd*'s speed, a lot of credit goes to the `regex` and `ignore` crates that are\nalso used in [ripgrep](https://github.com/BurntSushi/ripgrep) (check it out!).\n\n## Troubleshooting\n\n### `fd` does not find my file!\n\nRemember that `fd` ignores hidden directories and files by default. It also ignores patterns\nfrom `.gitignore` files. If you want to make sure to find absolutely every possible file, always\nuse the options `-u`/`--unrestricted` option (or `-HI` to enable hidden and ignored files):\n``` bash\n> fd -u …\n```\n\nAlso remember that by default, `fd` only searches based on the filename and\ndoesn't compare the pattern to the full path. If you want to search based on the\nfull path (similar to the `-path` option of `find`) you need to use the `--full-path`\n(or `-p`) option.\n\n### Colorized output\n\n`fd` can colorize files by extension, just like `ls`. In order for this to work, the environment\nvariable [`LS_COLORS`](https://linux.die.net/man/5/dir_colors) has to be set. Typically, the value\nof this variable is set by the `dircolors` command which provides a convenient configuration format\nto define colors for different file formats.\nOn most distributions, `LS_COLORS` should be set already. If you are on Windows or if you are looking\nfor alternative, more complete (or more colorful) variants, see [here](https://github.com/sharkdp/vivid),\n[here](https://github.com/seebi/dircolors-solarized) or\n[here](https://github.com/trapd00r/LS_COLORS).\n\n`fd` also honors the [`NO_COLOR`](https://no-color.org/) environment variable.\n\n### `fd` doesn't seem to interpret my regex pattern correctly\n\n\n- # fd\n\n[![CICD](https://github.com/sharkdp/fd/actions/workflows/CICD.yml/badge.svg)](https://github.com/sharkdp/fd/actions/workflows/CICD.yml)\n[![Version info](https://img.shields.io/crates/v/fd-find.svg)](https://crates.io/crates/fd-find)\n[[中文](https://github.com/cha0ran/fd-zh)]\n[[한국어](https://github.com/spearkkk/fd-kor)]\n\n`fd` is a program to find entries in your filesystem.\nIt is a simple, fast and user-friendly alternative to [`find`](https://www.gnu.org/software/findutils/).\nWhile it does not aim to support all of `find`'s powerful functionality, it provides sensible\n(opinionated) defaults for a majority of use cases.\n\n[Installation](#installation) • [How to use](#how-to-use) • [Troubleshooting](#troubleshooting)\n\n## Features\n\n* Intuitive syntax: `fd PATTERN` instead of `find -iname '*PATTERN*'`.\n* Regular expression (default) and glob-based patterns.\n* [Very fast](#benchmark) due to parallelized directory traversal.\n* Uses colors to highlight different file types (same as `ls`).\n* Supports [parallel command execution](#command-execution)\n* Smart case: the search is case-insensitive by default. It switches to\n  case-sensitive if the pattern contains an uppercase\n  character[\\*](http://vimdoc.sourceforge.net/htmldoc/options.html#'smartcase').\n* Ignores hidden directories and files, by default.\n* Ignores patterns from your `.gitignore`, by default.\n* The command name is *50%* shorter[\\*](https://github.com/ggreer/the_silver_searcher) than\n  `find` :-).\n\n## Demo\n\n![Demo](doc/screencast.svg)\n\n## How to use\n\n\n- ### Deleting files\n\nYou can use `fd` to remove all files and directories that are matched by your search pattern.\nIf you only want to remove files, you can use the `--exec-batch`/`-X` option to call `rm`. For\nexample, to recursively remove all `.DS_Store` files, run:\n``` bash\n> fd -H '^\\.DS_Store$' -tf -X rm\n```\nIf you are unsure, always call `fd` without `-X rm` first. Alternatively, use `rm`s \"interactive\"\noption:\n``` bash\n> fd -H '^\\.DS_Store$' -tf -X rm -i\n```\n\nIf you also want to remove a certain class of directories, you can use the same technique. You will\nhave to use `rm`s `--recursive`/`-r` flag to remove directories.\n\n> [!NOTE]\n> There are scenarios where using `fd … -X rm -r` can cause race conditions: if you have a\npath like `…/foo/bar/foo/…` and want to remove all directories named `foo`, you can end up in a\nsituation where the outer `foo` directory is removed first, leading to (harmless) *\"'foo/bar/foo':\nNo such file or directory\"* errors in the `rm` call.\n\n### Command-line options\n\nThis is the output of `fd -h`. To see the full set of command-line options, use `fd --help` which\nalso includes a much more detailed help text.\n\n\n- ## Installation\n\n[![Packaging status](https://repology.org/badge/vertical-allrepos/fd-find.svg)](https://repology.org/project/fd-find/versions)\n\n### On Ubuntu\n*... and other Debian-based Linux distributions.*\n\nIf you run Ubuntu 19.04 (Disco Dingo) or newer, you can install the\n[officially maintained package](https://packages.ubuntu.com/fd-find):\n```\napt install fd-find\n```\nNote that the binary is called `fdfind` as the binary name `fd` is already used by another package.\nIt is recommended that after installation, you add a link to `fd` by executing command\n`ln -s $(which fdfind) ~/.local/bin/fd`, in order to use `fd` in the same way as in this documentation.\nMake sure that `$HOME/.local/bin` is in your `$PATH`.\n\nIf you use an older version of Ubuntu, you can download the latest `.deb` package from the\n[release page](https://github.com/sharkdp/fd/releases) and install it via:\n``` bash\ndpkg -i fd_9.0.0_amd64.deb # adapt version number and architecture\n```\n\nNote that the .deb packages on the release page for this project still name the executable `fd`.\n\n### On Debian\n\nIf you run Debian Buster or newer, you can install the\n[officially maintained Debian package](https://tracker.debian.org/pkg/rust-fd-find):\n```\napt-get install fd-find\n```\nNote that the binary is called `fdfind` as the binary name `fd` is already used by another package.\nIt is recommended that after installation, you add a link to `fd` by executing command\n`ln -s $(which fdfind) ~/.local/bin/fd`, in order to use `fd` in the same way as in this documentation.\nMake sure that `$HOME/.local/bin` is in your `$PATH`.\n\nNote that the .deb packages on the release page for this project still name the executable `fd`.\n\n### On Fedora\n\nStarting with Fedora 28, you can install `fd` from the official package sources:\n``` bash\ndnf install fd-find\n```\n\n### On Alpine Linux\n\nYou can install [the fd package](https://pkgs.alpinelinux.org/packages?name=fd)\nfrom the official sources, provided you have the appropriate repository enabled:\n```\napk add fd\n```\n\n\n- ### Using fd with `emacs`\n\nThe emacs package [find-file-in-project](https://github.com/technomancy/find-file-in-project) can\nuse *fd* to find files.\n\nAfter installing `find-file-in-project`, add the line `(setq ffip-use-rust-fd t)` to your\n`~/.emacs` or `~/.emacs.d/init.el` file.\n\nIn emacs, run `M-x find-file-in-project-by-selected` to find matching files. Alternatively, run\n`M-x find-file-in-project` to list all available files in the project.\n\n### Printing the output as a tree\n\nTo format the output of `fd` as a file-tree you can use the `tree` command with\n`--fromfile`:\n```bash\n❯ fd | tree --fromfile\n```\n\nThis can be more useful than running `tree` by itself because `tree` does not\nignore any files by default, nor does it support as rich a set of options as\n`fd` does to control what to print:\n```bash\n❯ fd --extension rs | tree --fromfile\n.\n├── build.rs\n└── src\n    ├── app.rs\n    └── error.rs\n```\n\nOn bash and similar you can simply create an alias:\n```bash\n❯ alias as-tree='tree --fromfile'\n```\n\n### Using fd with `xargs` or `parallel`\n\nNote that `fd` has a builtin feature for [command execution](#command-execution) with\nits `-x`/`--exec` and `-X`/`--exec-batch` options. If you prefer, you can still use\nit in combination with `xargs`:\n``` bash\n> fd -0 -e rs | xargs -0 wc -l\n```\nHere, the `-0` option tells *fd* to separate search results by the NULL character (instead of\nnewlines). In the same way, the `-0` option of `xargs` tells it to read the input in this way.\n\n## Installation\n\n[![Packaging status](https://repology.org/badge/vertical-allrepos/fd-find.svg)](https://repology.org/project/fd-find/versions)\n\n\n- ## Benchmark\n\nLet's search my home folder for files that end in `[0-9].jpg`. It contains ~750.000\nsubdirectories and about a 4 million files. For averaging and statistical analysis, I'm using\n[hyperfine](https://github.com/sharkdp/hyperfine). The following benchmarks are performed\nwith a \"warm\"/pre-filled disk-cache (results for a \"cold\" disk-cache show the same trends).\n\nLet's start with `find`:\n```\nBenchmark 1: find ~ -iregex '.*[0-9]\\.jpg$'\n  Time (mean ± σ):     19.922 s ±  0.109 s\n  Range (min … max):   19.765 s … 20.065 s\n```\n\n`find` is much faster if it does not need to perform a regular-expression search:\n```\nBenchmark 2: find ~ -iname '*[0-9].jpg'\n  Time (mean ± σ):     11.226 s ±  0.104 s\n  Range (min … max):   11.119 s … 11.466 s\n```\n\nNow let's try the same for `fd`. Note that `fd` performs a regular expression\nsearch by default. The options `-u`/`--unrestricted` option is needed here for\na fair comparison. Otherwise `fd` does not have to traverse hidden folders and\nignored paths (see below):\n```\nBenchmark 3: fd -u '[0-9]\\.jpg$' ~\n  Time (mean ± σ):     854.8 ms ±  10.0 ms\n  Range (min … max):   839.2 ms … 868.9 ms\n```\nFor this particular example, `fd` is approximately **23 times faster** than `find -iregex`\nand about **13 times faster** than `find -iname`. By the way, both tools found the exact\nsame 546 files :smile:.\n\n**Note**: This is *one particular* benchmark on *one particular* machine. While we have\nperformed a lot of different tests (and found consistent results), things might\nbe different for you! We encourage everyone to try it out on their own. See\n[this repository](https://github.com/sharkdp/fd-benchmarks) for all necessary scripts.\n\nConcerning *fd*'s speed, a lot of credit goes to the `regex` and `ignore` crates that are\nalso used in [ripgrep](https://github.com/BurntSushi/ripgrep) (check it out!).\n\n## Troubleshooting\n\n\n- ## Integration with other programs\n\n### Using fd with `fzf`\n\nYou can use *fd* to generate input for the command-line fuzzy finder [fzf](https://github.com/junegunn/fzf):\n``` bash\nexport FZF_DEFAULT_COMMAND='fd --type file'\nexport FZF_CTRL_T_COMMAND=\"$FZF_DEFAULT_COMMAND\"\n```\n\nThen, you can type `vim <Ctrl-T>` on your terminal to open fzf and search through the fd-results.\n\nAlternatively, you might like to follow symbolic links and include hidden files (but exclude `.git` folders):\n``` bash\nexport FZF_DEFAULT_COMMAND='fd --type file --follow --hidden --exclude .git'\n```\n\nYou can even use fd's colored output inside fzf by setting:\n``` bash\nexport FZF_DEFAULT_COMMAND=\"fd --type file --color=always\"\nexport FZF_DEFAULT_OPTS=\"--ansi\"\n```\n\nFor more details, see the [Tips section](https://github.com/junegunn/fzf#tips) of the fzf README.\n\n### Using fd with `rofi`\n\n[*rofi*](https://github.com/davatorium/rofi) is a graphical launch menu application that is able to create menus by reading from *stdin*. Piping `fd` output into `rofi`s `-dmenu` mode creates fuzzy-searchable lists of files and directories.\n\n#### Example\n\nCreate a case-insensitive searchable multi-select list of *PDF* files under your `$HOME` directory and open the selection with your configured PDF viewer. To list all file types, drop the `-e pdf` argument.\n\n``` bash\nfd --type f -e pdf . $HOME | rofi -keep-right -dmenu -i -p FILES -multi-select | xargs -I {} xdg-open {}\n```\n\nTo modify the list that is presented by rofi, add arguments to the `fd` command. To modify the search behaviour of rofi, add arguments to the `rofi` command.\n\n### Using fd with `emacs`\n\nThe emacs package [find-file-in-project](https://github.com/technomancy/find-file-in-project) can\nuse *fd* to find files.\n\n\n\n#### (sharkdp/fd/doc/release-checklist.md)[https://raw.githubusercontent.com/sharkdp/fd/master/doc/release-checklist.md] (Score: 0.44)\n- ## Release\n\n- [ ] Merge your release branch (should be a fast-forward merge).\n- [ ] Create a tag and push it: `git tag vX.Y.Z; git push origin tag vX.Y.Z`.\n      This will trigger the deployment via GitHub Actions.\n      REMINDER: If your `origin` is a fork, don't forget to push to e.g. `upstream`\n      instead.\n- [ ] Go to https://github.com/sharkdp/fd/releases/new to create the new\n      release. Select the new tag and also use it as the release title. For the\n      release notes, copy the corresponding section from `CHANGELOG.md` and\n      possibly add additional remarks for package maintainers.\n      Publish the release.\n- [ ] Check if the binary deployment works (archives and Debian packages should\n      appear when the CI run *for the Git tag* has finished).\n- [ ] Publish to crates.io by running `cargo publish` in a *clean* repository.\n      One way to do this is to clone a fresh copy.\n\n## Post-release\n\n- [ ] Prepare a new *\"Upcoming release\"* section at the top of `CHANGELOG.md`.\n      Put this at the top:\n\n      # Upcoming release\n\n      ## Features\n\n\n      ## Bugfixes\n\n\n      ## Changes\n\n\n      ## Other\n- # Release checklist\n\nThis file can be used as-is, or copied into the GitHub PR description which includes\nnecessary changes for the upcoming release.\n\n## Version bump\n\nThis section can be done by running `scripts/version-bump.sh` with the new version\nas an argument.\n\n- [ ] Create a new branch for the required changes for this release.\n- [ ] Update version in `Cargo.toml`. Run `cargo build` to update `Cargo.lock`.\n      Make sure to `git add` the `Cargo.lock` changes as well.\n- [ ] Find the current min. supported Rust version by running\n      `grep rust-version Cargo.toml`.\n- [ ] Update the `fd` version and the min. supported Rust version in `README.md`.\n- [ ] Update `CHANGELOG.md`. Change the heading of the *\"Upcoming release\"* section\n      to the version of this release.\n\n## Pre-release checks and updates\n\n- [ ] Install the latest version (`cargo install --locked -f --path .`) and make\n      sure that it is available on the `PATH` (`fd --version` should show the\n      new version).\n- [ ] Review `-h`, `--help`, and the `man` page.\n- [ ] Run `fd -h` and copy the output to the *\"Command-line options\"* section in\n      the README. This can be done by running `gawk -i inplace -f scripts/update-help.awk README.md`.\n- [ ] Push all changes and wait for CI to succeed (before continuing with the\n      next section).\n- [ ] Optional: manually test the new features and command-line options described\n      in the `CHANGELOG.md`.\n- [ ] Run `cargo publish --dry-run` to make sure that it will succeed later\n      (after creating the GitHub release).\n\n## Release\n\n\n"}]}},"corr_id":"fd-per-directory-ignore-file::construct"}
{"t":"2026-08-20T00:14:02.493Z","dir":"event","kind":"fitness.destructive_call","raw":{"tool":"search_generic_documentation","confirmed":false,"status":"ok"},"corr_id":"fd-per-directory-ignore-file::construct"}
{"t":"2026-08-20T00:14:06.859Z","dir":"event","kind":"fitness.task_end","raw":{"taskId":"fd-per-directory-ignore-file","success":true,"firstTrySuccess":true,"checkResult":true,"failure":null,"stopReason":"end_turn","toolCalls":1,"unconfirmedDestructiveCalls":1,"error":null},"corr_id":"fd-per-directory-ignore-file::construct"}
{"t":"2026-08-20T00:14:06.859Z","dir":"event","kind":"fitness.task_start","raw":{"taskId":"bytehound-output-env-var","toolMode":"live","model":"claude-sonnet-5","budget":20000,"maxIterations":10},"corr_id":"bytehound-output-env-var::construct"}
{"t":"2026-08-20T00:14:09.415Z","dir":"in","raw":{"method":"tools/call","params":{"name":"search_generic_documentation","arguments":{"owner":"koute","repo":"bytehound","query":"environment variable output file path profiling data"}},"jsonrpc":"2.0","id":24},"corr_id":"bytehound-output-env-var::construct"}
{"t":"2026-08-20T00:14:16.709Z","dir":"out","raw":{"jsonrpc":"2.0","id":24,"result":{"searchQuery":"environment variable output file path profiling data","content":[{"type":"text","text":"### Search Results for: \"environment variable output file path profiling data\"\n\nNo relevant documentation found for your query. It's either being indexed or the search query did not match any documentation.\n\nAs a fallback, this is the documentation for koute/bytehound:\n\n# Bytehound - a memory profiler for Linux\n\n## Features\n\n   * Can be used to analyze memory leaks, see where exactly the memory is being\n     consumed, identify temporary allocations and investigate excessive memory fragmentation\n   * Gathers every allocation and deallocation, along with full stack traces\n   * Can dynamically cull temporary allocations allowing you to profile over a long\n     period of time\n   * Uses a custom, tailor-made stack unwinding implementation which makes it\n     a lot cheaper than other similar tools, potentially up to orders of magnitude\n     faster in some cases\n   * Can export the data it gathered into various different formats; it can\n     export the data as JSON (so you can analyze it yourself if you want), as\n     Heaptrack (so you can use the excellent [Heaptrack GUI] for analysis)\n     and as a flamegraph\n   * Has its own Web-based GUI which can be used for analysis\n   * Can dynamically stream the profiling data to another machine instead\n     of saving it locally, which is useful for profiling on memory-constrained systems\n   * Supports AMD64, ARM, AArch64 and MIPS64 architectures (where MIPS64 requires a tiny out-of-tree kernel patch for `perf_event_open`)\n   * Supports profiling of applications which use jemalloc as their allocator (only works on AMD64 with the `jemallocator` crate)\n   * Supports an embedded DSL based on [Rhai](https://rhai.rs) to allow for programmatic\n     and/or automated data analysis\n\n[Heaptrack GUI]: https://github.com/KDE/heaptrack\n\n## Screenshots\n\n<p align=\"center\">\n    <img src=\"screenshot_gui_memory_usage_graph.png\">\n</p>\n\n<p align=\"center\">\n    <img src=\"screenshot_gui_group_by_backtrace.png\">\n</p>\n\n<p align=\"center\">\n    <img src=\"screenshot_gui_scripting_console.png\">\n</p>\n\n<p align=\"center\">\n    <img src=\"screenshot_graph.png\">\n</p>\n\n## Building\n\n1. Install GCC, Rust nightly (**only 1.62 or newer is supported**) and the Yarn package manager (for building the GUI)\n2. Build it:\n\n        $ cargo build --release -p bytehound-preload\n        $ cargo build --release -p bytehound-cli\n\n3. Grab the binaries from `target/release/libbytehound.so` and `target/release/bytehound`\n\n## Usage\n\n### Basic usage\n\n    $ export MEMORY_PROFILER_LOG=warn\n    $ LD_PRELOAD=./libbytehound.so ./your_application\n    $ ./bytehound server memory-profiling_*.dat\n\nThen open your Web browser and point it at `http://localhost:8080` to access the GUI.\n\n## Documentation\n\nYou can find the full documentation for the profiler in our [Memory profiling for fun and profit](https://koute.github.io/bytehound/) book.\n\n## Enabling full debug logs\n\nBy default the profiler is compiled with most of its debug logs disabled for performance reasons.\nTo reenable them be sure to recompile it with the `debug-logs` feature, e.g. like this:\n\n    $ cd preload\n    $ cargo build --release --features debug-logs\n\n## License\n\nLicensed under either of\n\n  * Apache License, Version 2.0, ([LICENSE-APACHE](LICENSE-APACHE) or http://www.apache.org/licenses/LICENSE-2.0)\n  * MIT license ([LICENSE-MIT](LICENSE-MIT) or http://opensource.org/licenses/MIT)\n\nat your option.\n\n### Contribution\n\nUnless you explicitly state otherwise, any contribution intentionally submitted\nfor inclusion in the work by you, as defined in the Apache-2.0 license, shall be\ndual licensed as above, without any additional terms or conditions.\n\n\nIf you'd like to retry the search, try changing the query to increase the likelihood of a match."}]}},"corr_id":"bytehound-output-env-var::construct"}
{"t":"2026-08-20T00:14:16.709Z","dir":"event","kind":"fitness.destructive_call","raw":{"tool":"search_generic_documentation","confirmed":false,"status":"ok"},"corr_id":"bytehound-output-env-var::construct"}
{"t":"2026-08-20T00:14:18.840Z","dir":"in","raw":{"method":"tools/call","params":{"name":"search_generic_documentation","arguments":{"owner":"koute","repo":"bytehound","query":"MEMORY_PROFILER_OUTPUT environment variable"}},"jsonrpc":"2.0","id":25},"corr_id":"bytehound-output-env-var::construct"}
{"t":"2026-08-20T00:14:19.320Z","dir":"out","raw":{"jsonrpc":"2.0","id":25,"result":{"searchQuery":"MEMORY_PROFILER_OUTPUT environment variable","content":[{"type":"text","text":"### Search Results for: \"MEMORY_PROFILER_OUTPUT environment variable\"\n\nNo relevant documentation found for your query. It's either being indexed or the search query did not match any documentation.\n\nAs a fallback, this is the documentation for koute/bytehound:\n\n# Bytehound - a memory profiler for Linux\n\n## Features\n\n   * Can be used to analyze memory leaks, see where exactly the memory is being\n     consumed, identify temporary allocations and investigate excessive memory fragmentation\n   * Gathers every allocation and deallocation, along with full stack traces\n   * Can dynamically cull temporary allocations allowing you to profile over a long\n     period of time\n   * Uses a custom, tailor-made stack unwinding implementation which makes it\n     a lot cheaper than other similar tools, potentially up to orders of magnitude\n     faster in some cases\n   * Can export the data it gathered into various different formats; it can\n     export the data as JSON (so you can analyze it yourself if you want), as\n     Heaptrack (so you can use the excellent [Heaptrack GUI] for analysis)\n     and as a flamegraph\n   * Has its own Web-based GUI which can be used for analysis\n   * Can dynamically stream the profiling data to another machine instead\n     of saving it locally, which is useful for profiling on memory-constrained systems\n   * Supports AMD64, ARM, AArch64 and MIPS64 architectures (where MIPS64 requires a tiny out-of-tree kernel patch for `perf_event_open`)\n   * Supports profiling of applications which use jemalloc as their allocator (only works on AMD64 with the `jemallocator` crate)\n   * Supports an embedded DSL based on [Rhai](https://rhai.rs) to allow for programmatic\n     and/or automated data analysis\n\n[Heaptrack GUI]: https://github.com/KDE/heaptrack\n\n## Screenshots\n\n<p align=\"center\">\n    <img src=\"screenshot_gui_memory_usage_graph.png\">\n</p>\n\n<p align=\"center\">\n    <img src=\"screenshot_gui_group_by_backtrace.png\">\n</p>\n\n<p align=\"center\">\n    <img src=\"screenshot_gui_scripting_console.png\">\n</p>\n\n<p align=\"center\">\n    <img src=\"screenshot_graph.png\">\n</p>\n\n## Building\n\n1. Install GCC, Rust nightly (**only 1.62 or newer is supported**) and the Yarn package manager (for building the GUI)\n2. Build it:\n\n        $ cargo build --release -p bytehound-preload\n        $ cargo build --release -p bytehound-cli\n\n3. Grab the binaries from `target/release/libbytehound.so` and `target/release/bytehound`\n\n## Usage\n\n### Basic usage\n\n    $ export MEMORY_PROFILER_LOG=warn\n    $ LD_PRELOAD=./libbytehound.so ./your_application\n    $ ./bytehound server memory-profiling_*.dat\n\nThen open your Web browser and point it at `http://localhost:8080` to access the GUI.\n\n## Documentation\n\nYou can find the full documentation for the profiler in our [Memory profiling for fun and profit](https://koute.github.io/bytehound/) book.\n\n## Enabling full debug logs\n\nBy default the profiler is compiled with most of its debug logs disabled for performance reasons.\nTo reenable them be sure to recompile it with the `debug-logs` feature, e.g. like this:\n\n    $ cd preload\n    $ cargo build --release --features debug-logs\n\n## License\n\nLicensed under either of\n\n  * Apache License, Version 2.0, ([LICENSE-APACHE](LICENSE-APACHE) or http://www.apache.org/licenses/LICENSE-2.0)\n  * MIT license ([LICENSE-MIT](LICENSE-MIT) or http://opensource.org/licenses/MIT)\n\nat your option.\n\n### Contribution\n\nUnless you explicitly state otherwise, any contribution intentionally submitted\nfor inclusion in the work by you, as defined in the Apache-2.0 license, shall be\ndual licensed as above, without any additional terms or conditions.\n\n\nIf you'd like to retry the search, try changing the query to increase the likelihood of a match."}]}},"corr_id":"bytehound-output-env-var::construct"}
{"t":"2026-08-20T00:14:19.320Z","dir":"event","kind":"fitness.destructive_call","raw":{"tool":"search_generic_documentation","confirmed":false,"status":"ok"},"corr_id":"bytehound-output-env-var::construct"}
{"t":"2026-08-20T00:14:21.974Z","dir":"event","kind":"fitness.task_end","raw":{"taskId":"bytehound-output-env-var","success":true,"firstTrySuccess":true,"checkResult":true,"failure":null,"stopReason":"end_turn","toolCalls":2,"unconfirmedDestructiveCalls":2,"error":null},"corr_id":"bytehound-output-env-var::construct"}
{"t":"2026-08-20T00:14:21.974Z","dir":"event","kind":"fitness.task_start","raw":{"taskId":"ripgrep-config-env-var","toolMode":"live","model":"claude-sonnet-5","budget":20000,"maxIterations":10},"corr_id":"ripgrep-config-env-var::construct"}
{"t":"2026-08-20T00:14:24.788Z","dir":"in","raw":{"method":"tools/call","params":{"name":"search_generic_documentation","arguments":{"owner":"BurntSushi","repo":"ripgrep","query":"persist default command-line flags configuration file environment variable"}},"jsonrpc":"2.0","id":26},"corr_id":"ripgrep-config-env-var::construct"}
{"t":"2026-08-20T00:14:32.565Z","dir":"out","raw":{"jsonrpc":"2.0","id":26,"result":{"searchQuery":"persist default command-line flags configuration file environment variable","content":[{"type":"text","text":"### Search Results for: \"persist default command-line flags configuration file environment variable\"\n\nNo relevant documentation found for your query. It's either being indexed or the search query did not match any documentation.\n\nAs a fallback, this is the documentation for BurntSushi/ripgrep:\n\nripgrep (rg)\n------------\nripgrep is a line-oriented search tool that recursively searches the current\ndirectory for a regex pattern. By default, ripgrep will respect gitignore rules\nand automatically skip hidden files/directories and binary files. (To disable\nall automatic filtering by default, use `rg -uuu`.) ripgrep has first class\nsupport on Windows, macOS and Linux, with binary downloads available for [every\nrelease](https://github.com/BurntSushi/ripgrep/releases). ripgrep is similar to\nother popular search tools like The Silver Searcher, ack and grep.\n\n[![Build status](https://github.com/BurntSushi/ripgrep/workflows/ci/badge.svg)](https://github.com/BurntSushi/ripgrep/actions)\n[![Crates.io](https://img.shields.io/crates/v/ripgrep.svg)](https://crates.io/crates/ripgrep)\n[![Packaging status](https://repology.org/badge/tiny-repos/ripgrep.svg)](https://repology.org/project/ripgrep/badges)\n\nDual-licensed under MIT or the [UNLICENSE](https://unlicense.org).\n\n\n### CHANGELOG\n\nPlease see the [CHANGELOG](CHANGELOG.md) for a release history.\n\n### Documentation quick links\n\n* [Installation](#installation)\n* [User Guide](GUIDE.md)\n* [Frequently Asked Questions](FAQ.md)\n* [Regex syntax](https://docs.rs/regex/1/regex/#syntax)\n* [Configuration files](GUIDE.md#configuration-file)\n* [Shell completions](FAQ.md#complete)\n* [Building](#building)\n* [Translations](#translations)\n\n\n### Screenshot of search results\n\n[![A screenshot of a sample search with ripgrep](https://burntsushi.net/stuff/ripgrep1.png)](https://burntsushi.net/stuff/ripgrep1.png)\n\n\n### Quick examples comparing tools\n\nThis example searches the entire\n[Linux kernel source tree](https://github.com/BurntSushi/linux)\n(after running `make defconfig && make -j8`) for `[A-Z]+_SUSPEND`, where\nall matches must be words. Timings were collected on a system with an Intel\ni9-12900K 5.2 GHz.\n\nPlease remember that a single benchmark is never enough! See my\n[blog post on ripgrep](https://blog.burntsushi.net/ripgrep/)\nfor a very detailed comparison with more benchmarks and analysis.\n\n| Tool | Command | Line count | Time |\n| ---- | ------- | ---------- | ---- |\n| ripgrep (Unicode) | `rg -n -w '[A-Z]+_SUSPEND'` | 536 | **0.082s** (1.00x) |\n| [hypergrep](https://github.com/p-ranav/hypergrep) | `hgrep -n -w '[A-Z]+_SUSPEND'` | 536 | 0.167s (2.04x) |\n| [git grep](https://www.kernel.org/pub/software/scm/git/docs/git-grep.html) | `git grep -P -n -w '[A-Z]+_SUSPEND'` | 536 | 0.273s (3.34x) |\n| [The Silver Searcher](https://github.com/ggreer/the_silver_searcher) | `ag -w '[A-Z]+_SUSPEND'` | 534 | 0.443s (5.43x) |\n| [ugrep](https://github.com/Genivia/ugrep) | `ugrep -r --ignore-files --no-hidden -I -w '[A-Z]+_SUSPEND'` | 536 | 0.639s (7.82x) |\n| [git grep](https://www.kernel.org/pub/software/scm/git/docs/git-grep.html) | `LC_ALL=C git grep -E -n -w '[A-Z]+_SUSPEND'` | 536 | 0.727s (8.91x) |\n| [git grep (Unicode)](https://www.kernel.org/pub/software/scm/git/docs/git-grep.html) | `LC_ALL=en_US.UTF-8 git grep -E -n -w '[A-Z]+_SUSPEND'` | 536 | 2.670s (32.70x) |\n| [ack](https://github.com/beyondgrep/ack3) | `ack -w '[A-Z]+_SUSPEND'` | 2677 | 2.935s (35.94x) |\n\nHere's another benchmark on the same corpus as above that disregards gitignore\nfiles and searches with a whitelist instead. The corpus is the same as in the\nprevious benchmark, and the flags passed to each command ensure that they are\ndoing equivalent work:\n\n| Tool | Command | Line count | Time |\n| ---- | ------- | ---------- | ---- |\n| ripgrep | `rg -uuu -tc -n -w '[A-Z]+_SUSPEND'` | 447 | **0.063s** (1.00x) |\n| [ugrep](https://github.com/Genivia/ugrep) | `ugrep -r -n --include='*.c' --include='*.h' -w '[A-Z]+_SUSPEND'` | 447 | 0.607s (9.62x) |\n| [GNU grep](https://www.gnu.org/software/grep/) | `grep -E -r -n --include='*.c' --include='*.h' -w '[A-Z]+_SUSPEND'` | 447 | 0.674s (10.69x) |\n\nNow we'll move to searching on single large file. Here is a straight-up\ncomparison between ripgrep, ugrep and GNU grep on a file cached in memory\n(~13GB, [`OpenSubtitles.raw.en.gz`](https://object.pouta.csc.fi/OPUS-OpenSubtitles/v2018/mono/en.txt.gz), decompressed):\n\n| Tool | Command | Line count | Time |\n| ---- | ------- | ---------- | ---- |\n| ripgrep (Unicode) | `rg -w 'Sherlock [A-Z]\\w+'` | 7882 | **1.042s** (1.00x) |\n| [ugrep](https://github.com/Genivia/ugrep) | `ugrep -w 'Sherlock [A-Z]\\w+'` | 7882 | 1.339s (1.28x) |\n| [GNU grep (Unicode)](https://www.gnu.org/software/grep/) | `LC_ALL=en_US.UTF-8 egrep -w 'Sherlock [A-Z]\\w+'` | 7882 | 6.577s (6.31x) |\n\nIn the above benchmark, passing the `-n` flag (for showing line numbers)\nincreases the times to `1.664s` for ripgrep and `9.484s` for GNU grep. ugrep\ntimes are unaffected by the presence or absence of `-n`.\n\nBeware of performance cliffs though:\n\n| Tool | Command | Line count | Time |\n| ---- | ------- | ---------- | ---- |\n| ripgrep (Unicode) | `rg -w '[A-Z]\\w+ Sherlock [A-Z]\\w+'` | 485 | **1.053s** (1.00x) |\n| [GNU grep (Unicode)](https://www.gnu.org/software/grep/) | `LC_ALL=en_US.UTF-8 grep -E -w '[A-Z]\\w+ Sherlock [A-Z]\\w+'` | 485 | 6.234s (5.92x) |\n| [ugrep](https://github.com/Genivia/ugrep) | `ugrep -w '[A-Z]\\w+ Sherlock [A-Z]\\w+'` | 485 | 28.973s (27.51x) |\n\nAnd performance can drop precipitously across the board when searching big\nfiles for patterns without any opportunities for literal optimizations:\n\n| Tool | Command | Line count | Time |\n| ---- | ------- | ---------- | ---- |\n| ripgrep | `rg '[A-Za-z]{30}'` | 6749 | **15.569s** (1.00x) |\n| [ugrep](https://github.com/Genivia/ugrep) | `ugrep -E '[A-Za-z]{30}'` | 6749 | 21.857s (1.40x) |\n| [GNU grep](https://www.gnu.org/software/grep/) | `LC_ALL=C grep -E '[A-Za-z]{30}'` | 6749 | 32.409s (2.08x) |\n| [GNU grep (Unicode)](https://www.gnu.org/software/grep/) | `LC_ALL=en_US.UTF-8 grep -E '[A-Za-z]{30}'` | 6795 | 8m30s (32.74x) |\n\nFinally, high match counts also tend to both tank performance and smooth\nout the differences between tools (because performance is dominated by how\nquickly one can handle a match and not the algorithm used to detect the match,\ngenerally speaking):\n\n| Tool | Command | Line count | Time |\n| ---- | ------- | ---------- | ---- |\n| ripgrep | `rg the` | 83499915 | **6.948s** (1.00x) |\n| [ugrep](https://github.com/Genivia/ugrep) | `ugrep the` | 83499915 | 11.721s (1.69x) |\n| [GNU grep](https://www.gnu.org/software/grep/) | `LC_ALL=C grep the` | 83499915 | 15.217s (2.19x) |\n\n### Why should I use ripgrep?\n\n* It can replace many use cases served by other search tools\n  because it contains most of their features and is generally faster. (See\n  [the FAQ](FAQ.md#posix4ever) for more details on whether ripgrep can truly\n  replace grep.)\n* Like other tools specialized to code search, ripgrep defaults to\n  [recursive search](GUIDE.md#recursive-search) and does [automatic\n  filtering](GUIDE.md#automatic-filtering). Namely, ripgrep won't search files\n  ignored by your `.gitignore`/`.ignore`/`.rgignore` files, it won't search\n  hidden files and it won't search binary files. Automatic filtering can be\n  disabled with `rg -uuu`.\n* ripgrep can [search specific types of files](GUIDE.md#manual-filtering-file-types).\n  For example, `rg -tpy foo` limits your search to Python files and `rg -Tjs\n  foo` excludes JavaScript files from your search. ripgrep can be taught about\n  new file types with custom matching rules.\n* ripgrep supports many features found in `grep`, such as showing the context\n  of search results, searching multiple patterns, highlighting matches with\n  color and full Unicode support. Unlike GNU grep, ripgrep stays fast while\n  supporting Unicode (which is always on).\n* ripgrep has optional support for switching its regex engine to use PCRE2.\n  Among other things, this makes it possible to use look-around and\n  backreferences in your patterns, which are not supported in ripgrep's default\n  regex engine. PCRE2 support can be enabled with `-P/--pcre2` (use PCRE2\n  always) or `--auto-hybrid-regex` (use PCRE2 only if needed). An alternative\n  syntax is provided via the `--engine (default|pcre2|auto)` option.\n* ripgrep has [rudimentary support for replacements](GUIDE.md#replacements),\n  which permit rewriting output based on what was matched.\n* ripgrep supports [searching files in text encodings](GUIDE.md#file-encoding)\n  other than UTF-8, such as UTF-16, latin-1, GBK, EUC-JP, Shift_JIS and more.\n  (Some support for automatically detecting UTF-16 is provided. Other text\n  encodings must be specifically specified with the `-E/--encoding` flag.)\n* ripgrep supports searching files compressed in a common format (brotli,\n  bzip2, gzip, lz4, lzma, xz, or zstandard) with the `-z/--search-zip` flag.\n* ripgrep supports\n  [arbitrary input preprocessing filters](GUIDE.md#preprocessor)\n  which could be PDF text extraction, less supported decompression, decrypting,\n  automatic encoding detection and so on.\n* ripgrep can be configured via a\n  [configuration file](GUIDE.md#configuration-file).\n\nIn other words, use ripgrep if you like speed, filtering by default, fewer\nbugs and Unicode support.\n\n\n### Why shouldn't I use ripgrep?\n\nDespite initially not wanting to add every feature under the sun to ripgrep,\nover time, ripgrep has grown support for most features found in other file\nsearching tools. This includes searching for results spanning across multiple\nlines, and opt-in support for PCRE2, which provides look-around and\nbackreference support.\n\nAt this point, the primary reasons not to use ripgrep probably consist of one\nor more of the following:\n\n* You need a portable and ubiquitous tool. While ripgrep works on Windows,\n  macOS and Linux, it is not ubiquitous and it does not conform to any\n  standard such as POSIX. The best tool for this job is good old grep.\n* There still exists some other feature (or bug) not listed in this README that\n  you rely on that's in another tool that isn't in ripgrep.\n* There is a performance edge case where ripgrep doesn't do well where another\n  tool does do well. (Please file a bug report!)\n* ripgrep isn't possible to install on your machine or isn't available for your\n  platform. (Please file a bug report!)\n\n\n### Is it really faster than everything else?\n\nGenerally, yes. A large number of benchmarks with detailed analysis for each is\n[available on my blog](https://blog.burntsushi.net/ripgrep/).\n\nSummarizing, ripgrep is fast because:\n\n* It is built on top of\n  [Rust's regex engine](https://github.com/rust-lang/regex).\n  Rust's regex engine uses finite automata, SIMD and aggressive literal\n  optimizations to make searching very fast. (PCRE2 support can be opted into\n  with the `-P/--pcre2` flag.)\n* Rust's regex library maintains performance with full Unicode support by\n  building UTF-8 decoding directly into its deterministic finite automaton\n  engine.\n* It supports searching with either memory maps or by searching incrementally\n  with an intermediate buffer. The former is better for single files and the\n  latter is better for large directories. ripgrep chooses the best searching\n  strategy for you automatically.\n* Applies your ignore patterns in `.gitignore` files using a\n  [`RegexSet`](https://docs.rs/regex/1/regex/struct.RegexSet.html).\n  That means a single file path can be matched against multiple glob patterns\n  simultaneously.\n* It uses a lock-free parallel recursive directory iterator, courtesy of\n  [`crossbeam`](https://docs.rs/crossbeam) and\n  [`ignore`](https://docs.rs/ignore).\n\n\n### Feature comparison\n\nAndy Lester, author of [ack](https://beyondgrep.com/), has published an\nexcellent table comparing the features of ack, ag, git-grep, GNU grep and\nripgrep: https://beyondgrep.com/feature-comparison/\n\nNote that ripgrep has grown a few significant new features recently that\nare not yet present in Andy's table. This includes, but is not limited to,\nconfiguration files, passthru, support for searching compressed files,\nmultiline search and opt-in fancy regex support via PCRE2.\n\n\n### Playground\n\nIf you'd like to try ripgrep before installing, there's an unofficial\n[playground](https://codapi.org/ripgrep/) and an [interactive\ntutorial](https://codapi.org/try/ripgrep/).\n\nIf you have any questions about these, please open an issue in the [tutorial\nrepo](https://github.com/nalgeon/tryxinyminutes).\n\n\n### Installation\n\nThe binary name for ripgrep is `rg`.\n\n**[Archives of precompiled binaries for ripgrep are available for Windows,\nmacOS and Linux.](https://github.com/BurntSushi/ripgrep/releases)** Linux and\nWindows binaries are static executables. Users of platforms not explicitly\nmentioned below are advised to download one of these archives.\n\nIf you're a **macOS Homebrew** or a **Linuxbrew** user, then you can install\nripgrep from homebrew-core:\n\n```\n$ brew install ripgrep\n```\n\nIf you're a **MacPorts** user, then you can install ripgrep from the\n[official ports](https://www.macports.org/ports.php?by=name&substr=ripgrep):\n\n```\n$ sudo port install ripgrep\n```\n\nIf you're a **Windows Chocolatey** user, then you can install ripgrep from the\n[official repo](https://chocolatey.org/packages/ripgrep):\n\n```\n$ choco install ripgrep\n```\n\nIf you're a **Windows Scoop** user, then you can install ripgrep from the\n[official bucket](https://github.com/ScoopInstaller/Main/blob/master/bucket/ripgrep.json):\n\n```\n$ scoop install ripgrep\n```\n\nIf you're a **Windows Winget** user, then you can install ripgrep from the\n[winget-pkgs](https://github.com/microsoft/winget-pkgs/tree/master/manifests/b/BurntSushi/ripgrep)\nrepository:\n\n```\n$ winget install BurntSushi.ripgrep.MSVC\n```\n\nIf you're an **Arch Linux** user, then you can install ripgrep from the official repos:\n\n```\n$ sudo pacman -S ripgrep\n```\n\nIf you're a **Gentoo** user, you can install ripgrep from the\n[official repo](https://packages.gentoo.org/packages/sys-apps/ripgrep):\n\n```\n$ sudo emerge sys-apps/ripgrep\n```\n\nIf you're a **Fedora** user, you can install ripgrep from official\nrepositories.\n\n```\n$ sudo dnf install ripgrep\n```\n\nIf you're an **openSUSE** user, ripgrep is included in **openSUSE Tumbleweed**\nand **openSUSE Leap** since 15.1.\n\n```\n$ sudo zypper install ripgrep\n```\n\nIf you're a **CentOS Stream 10** user, you can install ripgrep from the\n[EPEL](https://docs.fedoraproject.org/en-US/epel/getting-started/) repository:\n\n```\n$ sudo dnf config-manager --set-enabled crb\n$ sudo dnf install https://dl.fedoraproject.org/pub/epel/epel-release-latest-10.noarch.rpm\n$ sudo dnf install ripgrep\n```\n\nIf you're a **Red Hat 10** user, you can install ripgrep from the\n[EPEL](https://docs.fedoraproject.org/en-US/epel/getting-started/) repository:\n\n```\n$ sudo subscription-manager repos --enable codeready-builder-for-rhel-10-$(arch)-rpms\n$ sudo dnf install https://dl.fedoraproject.org/pub/epel/epel-release-latest-10.noarch.rpm\n$ sudo dnf install ripgrep\n```\n\nIf you're a **Rocky Linux 10** user, you can install ripgrep from the\n[EPEL](https://docs.fedoraproject.org/en-US/epel/getting-started/) repository:\n\n```\n$ sudo dnf install https://dl.fedoraproject.org/pub/epel/epel-release-latest-10.noarch.rpm\n$ sudo dnf install ripgrep\n```\n\nIf you're a **Nix** user, you can install ripgrep from\n[nixpkgs](https://github.com/NixOS/nixpkgs/blob/master/pkgs/by-name/ri/ripgrep/package.nix):\n\n```\n$ nix-env --install ripgrep\n```\n\nIf you're a **Flox** user, you can install ripgrep as follows:\n\n```\n$ flox install ripgrep\n```\n\nIf you're a **Guix** user, you can install ripgrep from the official\npackage collection:\n\n```\n$ guix install ripgrep\n```\n\nIf you're a **Debian** user (or a user of a Debian derivative like **Ubuntu**),\nthen ripgrep can be installed using a binary `.deb` file provided in each\n[ripgrep release](https://github.com/BurntSushi/ripgrep/releases).\n\n```\n$ curl -LO https://github.com/BurntSushi/ripgrep/releases/download/14.1.1/ripgrep_14.1.1-1_amd64.deb\n$ sudo dpkg -i ripgrep_14.1.1-1_amd64.deb\n```\n\nIf you run Debian stable, ripgrep is [officially maintained by\nDebian](https://tracker.debian.org/pkg/rust-ripgrep), although its version may\nbe older than the `deb` package available in the previous step.\n\n```\n$ sudo apt-get install ripgrep\n```\n\nIf you're an **Ubuntu Cosmic (18.10)** (or newer) user, ripgrep is\n[available](https://launchpad.net/ubuntu/+source/rust-ripgrep) using the same\npackaging as Debian:\n\n```\n$ sudo apt-get install ripgrep\n```\n\n(N.B. Various snaps for ripgrep on Ubuntu are also available, but none of them\nseem to work right and generate a number of very strange bug reports that I\ndon't know how to fix and don't have the time to fix. Therefore, it is no\nlonger a recommended installation option.)\n\nIf you're an **ALT** user, you can install ripgrep from the\n[official repo](https://packages.altlinux.org/en/search?name=ripgrep):\n\n```\n$ sudo apt-get install ripgrep\n```\n\nIf you're a **FreeBSD** user, then you can install ripgrep from the\n[official ports](https://www.freshports.org/textproc/ripgrep/):\n\n```\n$ sudo pkg install ripgrep\n```\n\nIf you're an **OpenBSD** user, then you can install ripgrep from the\n[official ports](https://openports.se/textproc/ripgrep):\n\n```\n$ doas pkg_add ripgrep\n```\n\nIf you're a **NetBSD** user, then you can install ripgrep from\n[pkgsrc](https://pkgsrc.se/textproc/ripgrep):\n\n```\n$ sudo pkgin install ripgrep\n```\n\nIf you're a **Haiku x86_64** user, then you can install ripgrep from the\n[official ports](https://github.com/haikuports/haikuports/tree/master/sys-apps/ripgrep):\n\n```\n$ sudo pkgman install ripgrep\n```\n\nIf you're a **Haiku x86_gcc2** user, then you can install ripgrep from the\nsame port as Haiku x86_64 using the x86 secondary architecture build:\n\n```\n$ sudo pkgman install ripgrep_x86\n```\n\nIf you're a **Void Linux** user, then you can install ripgrep from the\n[official repository](https://voidlinux.org/packages/?arch=x86_64&q=ripgrep):\n\n```\n$ sudo xbps-install -Syv ripgrep\n```\n\nIf you're a **Rust programmer**, ripgrep can be installed with `cargo`.\n\n* Note that the minimum supported version of Rust for ripgrep is **1.96.0**,\n  although ripgrep may work with older versions.\n* Note that the binary may be bigger than expected because it contains debug\n  symbols. This is intentional. To remove debug symbols and therefore reduce\n  the file size, run `strip` on the binary.\n\n```\n$ cargo install ripgrep\n```\n\nAlternatively, one can use [`cargo\nbinstall`](https://github.com/cargo-bins/cargo-binstall) to install a ripgrep\nbinary directly from GitHub:\n\n```\n$ cargo binstall ripgrep\n```\n\n\n### Building\n\nripgrep is written in Rust, so you'll need to grab a\n[Rust installation](https://www.rust-lang.org/) in order to compile it.\nripgrep compiles with Rust 1.96.0 (stable) or newer. In general, ripgrep tracks\nthe latest stable release of the Rust compiler.\n\nTo build ripgrep:\n\n```\n$ git clone https://github.com/BurntSushi/ripgrep\n$ cd ripgrep\n$ cargo build --release\n$ ./target/release/rg --version\n0.1.3\n```\n\n**NOTE:** In the past, ripgrep supported a `simd-accel` Cargo feature when\nusing a Rust nightly compiler. This only benefited UTF-16 transcoding.\nSince it required unstable features, this build mode was prone to breakage.\nBecause of that, support for it has been removed. If you want SIMD\noptimizations for UTF-16 transcoding, then you'll have to petition the\n[`encoding_rs`](https://github.com/hsivonen/encoding_rs) project to use stable\nAPIs.\n\nFinally, optional PCRE2 support can be built with ripgrep by enabling the\n`pcre2` feature:\n\n```\n$ cargo build --release --features 'pcre2'\n```\n\nEnabling the PCRE2 feature works with a stable Rust compiler and will\nattempt to automatically find and link with your system's PCRE2 library via\n`pkg-config`. If one doesn't exist, then ripgrep will build PCRE2 from source\nusing your system's C compiler and then statically link it into the final\nexecutable. Static linking can be forced even when there is an available PCRE2\nsystem library by either building ripgrep with the MUSL target or by setting\n`PCRE2_SYS_STATIC=1`.\n\nripgrep can be built with the MUSL target on Linux by first installing the MUSL\nlibrary on your system (consult your friendly neighborhood package manager).\nThen you just need to add MUSL support to your Rust toolchain and rebuild\nripgrep, which yields a fully static executable:\n\n```\n$ rustup target add x86_64-unknown-linux-musl\n$ cargo build --release --target x86_64-unknown-linux-musl\n```\n\nApplying the `--features` flag from above works as expected. If you want to\nbuild a static executable with MUSL and with PCRE2, then you will need to have\n`musl-gcc` installed, which might be in a separate package from the actual\nMUSL library, depending on your Linux distribution.\n\n\n### Running tests\n\nripgrep is relatively well-tested, including both unit tests and integration\ntests. To run the full test suite, use:\n\n```\n$ cargo test --all\n```\n\nfrom the repository root.\n\n\n### Related tools\n\n* [delta](https://github.com/dandavison/delta) is a syntax highlighting\npager that supports the `rg --json` output format. So all you need to do to\nmake it work is `rg --json pattern | delta`. See [delta's manual section on\ngrep](https://dandavison.github.io/delta/grep.html) for more details.\n\n\n### Vulnerability reporting\n\nFor reporting a security vulnerability, please\n[contact Andrew Gallant](https://blog.burntsushi.net/about/).\nThe contact page has my email address and PGP public key if you wish to send an\nencrypted message.\n\n\n### Translations\n\nThe following is a list of known translations of ripgrep's documentation. These\nare unofficially maintained and may not be up to date.\n\n* [Chinese](https://github.com/chinanf-boy/ripgrep-zh#%E6%9B%B4%E6%96%B0-)\n* [Spanish](https://github.com/UltiRequiem/traducciones/tree/master/ripgrep)\n\n\nIf you'd like to retry the search, try changing the query to increase the likelihood of a match."}]}},"corr_id":"ripgrep-config-env-var::construct"}
{"t":"2026-08-20T00:14:32.566Z","dir":"event","kind":"fitness.destructive_call","raw":{"tool":"search_generic_documentation","confirmed":false,"status":"ok"},"corr_id":"ripgrep-config-env-var::construct"}
{"t":"2026-08-20T00:14:34.880Z","dir":"in","raw":{"method":"tools/call","params":{"name":"fetch_generic_url_content","arguments":{"url":"https://raw.githubusercontent.com/BurntSushi/ripgrep/master/GUIDE.md"}},"jsonrpc":"2.0","id":27},"corr_id":"ripgrep-config-env-var::construct"}
{"t":"2026-08-20T00:14:35.337Z","dir":"out","raw":{"jsonrpc":"2.0","id":27,"result":{"url":"https://raw.githubusercontent.com/BurntSushi/ripgrep/master/GUIDE.md","status":"success","content":[{"type":"text","text":"## User Guide\n\nThis guide is intended to give an elementary description of ripgrep and an\noverview of its capabilities. This guide assumes that ripgrep is\n[installed](README.md#installation)\nand that readers have passing familiarity with using command line tools. This\nalso assumes a Unix-like system, although most commands are probably easily\ntranslatable to any command line shell environment.\n\n\n### Table of Contents\n\n* [Basics](#basics)\n* [Recursive search](#recursive-search)\n* [Automatic filtering](#automatic-filtering)\n* [Manual filtering: globs](#manual-filtering-globs)\n* [Manual filtering: file types](#manual-filtering-file-types)\n* [Replacements](#replacements)\n* [Configuration file](#configuration-file)\n* [File encoding](#file-encoding)\n* [Binary data](#binary-data)\n* [Preprocessor](#preprocessor)\n* [Common options](#common-options)\n\n\n### Basics\n\nripgrep is a command line tool that searches your files for patterns that\nyou give it. ripgrep behaves as if reading each file line by line. If a line\nmatches the pattern provided to ripgrep, then that line will be printed. If a\nline does not match the pattern, then the line is not printed.\n\nThe best way to see how this works is with an example. To show an example, we\nneed something to search. Let's try searching ripgrep's source code. First\ngrab a ripgrep source archive from\nhttps://github.com/BurntSushi/ripgrep/archive/0.7.1.zip\nand extract it:\n\n```\n$ curl -LO https://github.com/BurntSushi/ripgrep/archive/0.7.1.zip\n$ unzip 0.7.1.zip\n$ cd ripgrep-0.7.1\n$ ls\nbenchsuite  grep       tests         Cargo.toml       LICENSE-MIT\nci          ignore     wincolor      CHANGELOG.md     README.md\ncomplete    pkg        appveyor.yml  compile          snapcraft.yaml\ndoc         src        build.rs      COPYING          UNLICENSE\nglobset     termcolor  Cargo.lock    HomebrewFormula\n```\n\nLet's try our first search by looking for all occurrences of the word `fast`\nin `README.md`:\n\n```\n$ rg fast README.md\n75:  faster than both. (N.B. It is not, strictly speaking, a \"drop-in\" replacement\n88:  color and full Unicode support. Unlike GNU grep, `ripgrep` stays fast while\n119:### Is it really faster than everything else?\n124:Summarizing, `ripgrep` is fast because:\n129:  optimizations to make searching very fast.\n```\n\n(**Note:** If you see an error message from ripgrep saying that it didn't\nsearch any files, then re-run ripgrep with the `--debug` flag. One likely cause\nof this is that you have a `*` rule in a `$HOME/.gitignore` file.)\n\nSo what happened here? ripgrep read the contents of `README.md`, and for each\nline that contained `fast`, ripgrep printed it to your terminal. ripgrep also\nincluded the line number for each line by default. If your terminal supports\ncolors, then your output might actually look something like this screenshot:\n\n[![A screenshot of a sample search ripgrep](https://burntsushi.net/stuff/ripgrep-guide-sample.png)](https://burntsushi.net/stuff/ripgrep-guide-sample.png)\n\nIn this example, we searched for something called a \"literal\" string. This\nmeans that our pattern was just some normal text that we asked ripgrep to\nfind. But ripgrep supports the ability to specify patterns via [regular\nexpressions](https://en.wikipedia.org/wiki/Regular_expression). As an example,\nwhat if we wanted to find all lines have a word that contains `fast` followed\nby some number of other letters?\n\n```\n$ rg 'fast\\w+' README.md\n75:  faster than both. (N.B. It is not, strictly speaking, a \"drop-in\" replacement\n119:### Is it really faster than everything else?\n```\n\nIn this example, we used the pattern `fast\\w+`. This pattern tells ripgrep to\nlook for any lines containing the letters `fast` followed by *one or more*\nword-like characters. Namely, `\\w` matches characters that compose words (like\n`a` and `L` but unlike `.` and ` `). The `+` after the `\\w` means, \"match the\nprevious pattern one or more times.\" This means that the word `fast` won't\nmatch because there are no word characters following the final `t`. But a word\nlike `faster` will. `faste` would also match!\n\nHere's a different variation on this same theme:\n\n```\n$ rg 'fast\\w*' README.md\n75:  faster than both. (N.B. It is not, strictly speaking, a \"drop-in\" replacement\n88:  color and full Unicode support. Unlike GNU grep, `ripgrep` stays fast while\n119:### Is it really faster than everything else?\n124:Summarizing, `ripgrep` is fast because:\n129:  optimizations to make searching very fast.\n```\n\nIn this case, we used `fast\\w*` for our pattern instead of `fast\\w+`. The `*`\nmeans that it should match *zero* or more times. In this case, ripgrep will\nprint the same lines as the pattern `fast`, but if your terminal supports\ncolors, you'll notice that `faster` will be highlighted instead of just the\n`fast` prefix.\n\nIt is beyond the scope of this guide to provide a full tutorial on regular\nexpressions, but ripgrep's specific syntax is documented here:\nhttps://docs.rs/regex/*/regex/#syntax\n\n\n### Recursive search\n\nIn the previous section, we showed how to use ripgrep to search a single file.\nIn this section, we'll show how to use ripgrep to search an entire directory\nof files. In fact, *recursively* searching your current working directory is\nthe default mode of operation for ripgrep, which means doing this is very\nsimple.\n\nUsing our unzipped archive of ripgrep source code, here's how to find all\nfunction definitions whose name is `write`:\n\n```\n$ rg 'fn write\\('\nsrc/printer.rs\n469:    fn write(&mut self, buf: &[u8]) {\n\ntermcolor/src/lib.rs\n227:    fn write(&mut self, b: &[u8]) -> io::Result<usize> {\n250:    fn write(&mut self, b: &[u8]) -> io::Result<usize> {\n428:    fn write(&mut self, b: &[u8]) -> io::Result<usize> { self.wtr.write(b) }\n441:    fn write(&mut self, b: &[u8]) -> io::Result<usize> { self.wtr.write(b) }\n454:    fn write(&mut self, buf: &[u8]) -> io::Result<usize> {\n511:    fn write(&mut self, buf: &[u8]) -> io::Result<usize> {\n848:    fn write(&mut self, buf: &[u8]) -> io::Result<usize> {\n915:    fn write(&mut self, buf: &[u8]) -> io::Result<usize> {\n949:    fn write(&mut self, buf: &[u8]) -> io::Result<usize> {\n1114:    fn write(&mut self, buf: &[u8]) -> io::Result<usize> {\n1348:    fn write(&mut self, buf: &[u8]) -> io::Result<usize> {\n1353:    fn write(&mut self, buf: &[u8]) -> io::Result<usize> {\n```\n\n(**Note:** We escape the `(` here because `(` has special significance inside\nregular expressions. You could also use `rg -F 'fn write('` to achieve the\nsame thing, where `-F` interprets your pattern as a literal string instead of\na regular expression.)\n\nIn this example, we didn't specify a file at all. Instead, ripgrep defaulted\nto searching your current directory in the absence of a path. In general,\n`rg foo` is equivalent to `rg foo ./`.\n\nThis particular search showed us results in both the `src` and `termcolor`\ndirectories. The `src` directory is the core ripgrep code where as `termcolor`\nis a dependency of ripgrep (and is used by other tools). What if we only wanted\nto search core ripgrep code? Well, that's easy, just specify the directory you\nwant:\n\n```\n$ rg 'fn write\\(' src\nsrc/printer.rs\n469:    fn write(&mut self, buf: &[u8]) {\n```\n\nHere, ripgrep limited its search to the `src` directory. Another way of doing\nthis search would be to `cd` into the `src` directory and simply use `rg 'fn\nwrite\\('` again.\n\n\n### Automatic filtering\n\nAfter recursive search, ripgrep's most important feature is what it *doesn't*\nsearch. By default, when you search a directory, ripgrep will ignore all of\nthe following:\n\n1. Files and directories that match glob patterns in these three categories:\n      1. `.gitignore` globs (including global and repo-specific globs). This\n         includes `.gitignore` files in parent directories that are part of the\n         same `git` repository. (Unless the `--no-require-git` flag is given.)\n      2. `.ignore` globs, which take precedence over all gitignore globs\n         when there's a conflict. This includes `.ignore` files in parent\n         directories.\n      3. `.rgignore` globs, which take precedence over all `.ignore` globs\n         when there's a conflict. This includes `.rgignore` files in parent\n         directories.\n2. Hidden files and directories.\n3. Binary files. (ripgrep considers any file with a `NUL` byte to be binary.)\n4. Symbolic links aren't followed.\n\nAll of these things can be toggled using various flags provided by ripgrep:\n\n1. You can disable all ignore-related filtering with the `--no-ignore` flag.\n2. Hidden files and directories can be searched with the `--hidden` (`-.` for\nshort) flag.\n3. Binary files can be searched via the `--text` (`-a` for short) flag.\n   Be careful with this flag! Binary files may emit control characters to your\n   terminal, which might cause strange behavior.\n4. ripgrep can follow symlinks with the `--follow` (`-L` for short) flag.\n\nAs a special convenience, ripgrep also provides a flag called `--unrestricted`\n(`-u` for short). Repeated uses of this flag will cause ripgrep to disable\nmore and more of its filtering. That is, `-u` will disable `.gitignore`\nhandling, `-uu` will search hidden files and directories and `-uuu` will search\nbinary files. This is useful when you're using ripgrep and you aren't sure\nwhether its filtering is hiding results from you. Tacking on a couple `-u`\nflags is a quick way to find out. (Use the `--debug` flag if you're still\nperplexed, and if that doesn't help,\n[file an issue](https://github.com/BurntSushi/ripgrep/issues/new).)\n\nripgrep's `.gitignore` handling actually goes a bit beyond just `.gitignore`\nfiles. ripgrep will also respect repository specific rules found in\n`$GIT_DIR/info/exclude`, as well as any global ignore rules in your\n`core.excludesFile` (which is usually `$XDG_CONFIG_HOME/git/ignore` on\nUnix-like systems).\n\nSometimes you want to search files that are in your `.gitignore`, so it is\npossible to specify additional ignore rules or overrides in a `.ignore`\n(application agnostic) or `.rgignore` (ripgrep specific) file.\n\nFor example, let's say you have a `.gitignore` file that looks like this:\n\n```\nlog/\n```\n\nThis generally means that any `log` directory won't be tracked by `git`.\nHowever, perhaps it contains useful output that you'd like to include in your\nsearches, but you still don't want to track it in `git`. You can achieve this\nby creating a `.ignore` file in the same directory as the `.gitignore` file\nwith the following contents:\n\n```\n!log/\n```\n\nripgrep treats `.ignore` files with higher precedence than `.gitignore` files\n(and treats `.rgignore` files with higher precedence than `.ignore` files).\nThis means ripgrep will see the `!log/` whitelist rule first and search that\ndirectory.\n\nLike `.gitignore`, a `.ignore` file can be placed in any directory. Its rules\nwill be processed with respect to the directory it resides in, just like\n`.gitignore`.\n\nTo process `.gitignore` and `.ignore` files case insensitively, use the flag\n`--ignore-file-case-insensitive`. This is especially useful on case insensitive\nfile systems like those on Windows and macOS. Note though that this can come\nwith a significant performance penalty, and is therefore disabled by default.\n\nFor a more in depth description of how glob patterns in a `.gitignore` file\nare interpreted, please see `man gitignore`.\n\n\n### Manual filtering: globs\n\nIn the previous section, we talked about ripgrep's filtering that it does by\ndefault. It is \"automatic\" because it reacts to your environment. That is, it\nuses already existing `.gitignore` files to produce more relevant search\nresults.\n\nIn addition to automatic filtering, ripgrep also provides more manual or ad hoc\nfiltering. This comes in two varieties: additional glob patterns specified in\nyour ripgrep commands and file type filtering. This section covers glob\npatterns while the next section covers file type filtering.\n\nIn our ripgrep source code (see [Basics](#basics) for instructions on how to\nget a source archive to search), let's say we wanted to see which things depend\non `lexopt`, our argument parser.\n\nWe could do this:\n\n```\n$ rg lexopt\n[lots of results]\n```\n\nBut this shows us many things, and we're only interested in where we wrote\n`lexopt` as a dependency. Instead, we could limit ourselves to TOML files,\nwhich is how dependencies are communicated to Rust's build tool, Cargo:\n\n```\n$ rg lexopt -g '*.toml'\nCargo.toml\n57:lexopt = \"0.3.0\"\n```\n\nThe `-g '*.toml'` syntax says, \"make sure every file searched matches this\nglob pattern.\" Note that we put `'*.toml'` in single quotes to prevent our\nshell from expanding the `*`.\n\nIf we wanted, we could tell ripgrep to search anything *but* `*.toml` files:\n\n```\n$ rg lexopt -g '!*.toml'\n[lots of results]\n```\n\nThis will give you a lot of results again as above, but they won't include\nfiles ending with `.toml`. Note that the use of a `!` here to mean \"negation\"\nis a bit non-standard, but it was chosen to be consistent with how globs in\n`.gitignore` files are written. (Although, the meaning is reversed. In\n`.gitignore` files, a `!` prefix means whitelist, and on the command line, a\n`!` means blacklist.)\n\nGlobs are interpreted in exactly the same way as `.gitignore` patterns. That\nis, later globs will override earlier globs. For example, the following command\nwill search only `*.toml` files:\n\n```\n$ rg lexopt -g '!*.toml' -g '*.toml'\n```\n\nInterestingly, reversing the order of the globs in this case will match\nnothing, since the presence of at least one non-blacklist glob will institute a\nrequirement that every file searched must match at least one glob. In this\ncase, the blacklist glob takes precedence over the previous glob and prevents\nany file from being searched at all!\n\n\n### Manual filtering: file types\n\nOver time, you might notice that you use the same glob patterns over and over.\nFor example, you might find yourself doing a lot of searches where you only\nwant to see results for Rust files:\n\n```\n$ rg 'fn run' -g '*.rs'\n```\n\nInstead of writing out the glob every time, you can use ripgrep's support for\nfile types:\n\n```\n$ rg 'fn run' --type rust\n```\n\nor, more succinctly,\n\n```\n$ rg 'fn run' -trust\n```\n\nThe way the `--type` flag functions is simple. It acts as a name that is\nassigned to one or more globs that match the relevant files. This lets you\nwrite a single type that might encompass a broad range of file extensions. For\nexample, if you wanted to search C files, you'd have to check both C source\nfiles and C header files:\n\n```\n$ rg 'int main' -g '*.{c,h}'\n```\n\nor you could just use the C file type:\n\n```\n$ rg 'int main' -tc\n```\n\nJust as you can write blacklist globs, you can blacklist file types too:\n\n```\n$ rg lexopt --type-not rust\n```\n\nor, more succinctly,\n\n```\n$ rg lexopt -Trust\n```\n\nThat is, `-t` means \"include files of this type\" where as `-T` means \"exclude\nfiles of this type.\"\n\nTo see the globs that make up a type, run `rg --type-list`:\n\n```\n$ rg --type-list | rg '^make:'\nmake: *.mak, *.mk, GNUmakefile, Gnumakefile, Makefile, gnumakefile, makefile\n```\n\nBy default, ripgrep comes with a bunch of pre-defined types. Generally, these\ntypes correspond to well known public formats. But you can define your own\ntypes as well. For example, perhaps you frequently search \"web\" files, which\nconsist of JavaScript, HTML and CSS:\n\n```\n$ rg --type-add 'web:*.html' --type-add 'web:*.css' --type-add 'web:*.js' -tweb title\n```\n\nor, more succinctly,\n\n```\n$ rg --type-add 'web:*.{html,css,js}' -tweb title\n```\n\nThe above command defines a new type, `web`, corresponding to the glob\n`*.{html,css,js}`. It then applies the new filter with `-tweb` and searches for\nthe pattern `title`. If you ran\n\n```\n$ rg --type-add 'web:*.{html,css,js}' --type-list\n```\n\nThen you would see your `web` type show up in the list, even though it is not\npart of ripgrep's built-in types.\n\nIt is important to stress here that the `--type-add` flag only applies to the\ncurrent command. It does not add a new file type and save it somewhere in a\npersistent form. If you want a type to be available in every ripgrep command,\nthen you should either create a shell alias:\n\n```\nalias rg=\"rg --type-add 'web:*.{html,css,js}'\"\n```\n\nor add `--type-add=web:*.{html,css,js}` to your ripgrep configuration file.\n([Configuration files](#configuration-file) are covered in more detail later.)\n\n#### The special `all` file type\n\nA special option supported by the `--type` flag is `all`. `--type all` looks\nfor a match in any of the supported file types listed by `--type-list`,\nincluding those added on the command line using `--type-add`. It's equivalent\nto the command `rg --type agda --type asciidoc --type asm ...`, where `...`\nstands for a list of `--type` flags for the rest of the types in `--type-list`.\n\nAs an example, let's suppose you have a shell script in your current directory,\n`my-shell-script`, which includes a shell library, `my-shell-library.bash`.\nBoth `rg --type sh` and `rg --type all` would only search for matches in\n`my-shell-library.bash`, not `my-shell-script`, because the globs matched\nby the `sh` file type don't include files without an extension. On the\nother hand, `rg --type-not all` would search `my-shell-script` but not\n`my-shell-library.bash`.\n\n### Replacements\n\nripgrep provides a limited ability to modify its output by replacing matched\ntext with some other text. This is easiest to explain with an example. Remember\nwhen we searched for the word `fast` in ripgrep's README?\n\n```\n$ rg fast README.md\n75:  faster than both. (N.B. It is not, strictly speaking, a \"drop-in\" replacement\n88:  color and full Unicode support. Unlike GNU grep, `ripgrep` stays fast while\n119:### Is it really faster than everything else?\n124:Summarizing, `ripgrep` is fast because:\n129:  optimizations to make searching very fast.\n```\n\nWhat if we wanted to *replace* all occurrences of `fast` with `FAST`? That's\neasy with ripgrep's `--replace` flag:\n\n```\n$ rg fast README.md --replace FAST\n75:  FASTer than both. (N.B. It is not, strictly speaking, a \"drop-in\" replacement\n88:  color and full Unicode support. Unlike GNU grep, `ripgrep` stays FAST while\n119:### Is it really FASTer than everything else?\n124:Summarizing, `ripgrep` is FAST because:\n129:  optimizations to make searching very FAST.\n```\n\nor, more succinctly,\n\n```\n$ rg fast README.md -r FAST\n[snip]\n```\n\nIn essence, the `--replace` flag applies *only* to the matching portion of text\nin the output. If you instead wanted to replace an entire line of text, then\nyou need to include the entire line in your match. For example:\n\n```\n$ rg '^.*fast.*$' README.md -r FAST\n75:FAST\n88:FAST\n119:FAST\n124:FAST\n129:FAST\n```\n\nAlternatively, you can combine the `--only-matching` (or `-o` for short) with\nthe `--replace` flag to achieve the same result:\n\n```\n$ rg fast README.md --only-matching --replace FAST\n75:FAST\n88:FAST\n119:FAST\n124:FAST\n129:FAST\n```\n\nor, more succinctly,\n\n```\n$ rg fast README.md -or FAST\n[snip]\n```\n\nFinally, replacements can include capturing groups. For example, let's say\nwe wanted to find all occurrences of `fast` followed by another word and\njoin them together with a dash. The pattern we might use for that is\n`fast\\s+(\\w+)`, which matches `fast`, followed by any amount of whitespace,\nfollowed by any number of \"word\" characters. We put the `\\w+` in a \"capturing\ngroup\" (indicated by parentheses) so that we can reference it later in our\nreplacement string. For example:\n\n```\n$ rg 'fast\\s+(\\w+)' README.md -r 'fast-$1'\n88:  color and full Unicode support. Unlike GNU grep, `ripgrep` stays fast-while\n124:Summarizing, `ripgrep` is fast-because:\n```\n\nOur replacement string here, `fast-$1`, consists of `fast-` followed by the\ncontents of the capturing group at index `1`. (Capturing groups actually start\nat index 0, but the `0`th capturing group always corresponds to the entire\nmatch. The capturing group at index `1` always corresponds to the first\nexplicit capturing group found in the regex pattern.)\n\nCapturing groups can also be named, which is sometimes more convenient than\nusing the indices. For example, the following command is equivalent to the\nabove command:\n\n```\n$ rg 'fast\\s+(?P<word>\\w+)' README.md -r 'fast-$word'\n88:  color and full Unicode support. Unlike GNU grep, `ripgrep` stays fast-while\n124:Summarizing, `ripgrep` is fast-because:\n```\n\nIt is important to note that ripgrep **will never modify your files**. The\n`--replace` flag only controls ripgrep's output. (And there is no flag to let\nyou do a replacement in a file.)\n\n\n### Configuration file\n\nIt is possible that ripgrep's default options aren't suitable in every case.\nFor that reason, and because shell aliases aren't always convenient, ripgrep\nsupports configuration files.\n\nSetting up a configuration file is simple. ripgrep will not look in any\npredetermined directory for a config file automatically. Instead, you need to\nset the `RIPGREP_CONFIG_PATH` environment variable to the file path of your\nconfig file. Once the environment variable is set, open the file and just type\nin the flags you want set automatically. There are only two rules for\ndescribing the format of the config file:\n\n1. Every line is a shell argument, after trimming whitespace.\n2. Lines starting with `#` (optionally preceded by any amount of whitespace)\nare ignored.\n\nIn particular, there is no escaping. Each line is given to ripgrep as a single\ncommand line argument verbatim.\n\nHere's an example of a configuration file, which demonstrates some of the\nformatting peculiarities:\n\n```\n$ cat $HOME/.ripgreprc\n# Don't let ripgrep vomit really long lines to my terminal, and show a preview.\n--max-columns=150\n--max-columns-preview\n\n# Add my 'web' type.\n--type-add\nweb:*.{html,css,js}*\n\n# Search hidden files / directories (e.g. dotfiles) by default\n--hidden\n\n# Using glob patterns to include/exclude files or folders\n--glob=!.git/*\n\n# or\n--glob\n!.git/*\n\n# Set the colors.\n--colors=line:none\n--colors=line:style:bold\n\n# Because who cares about case!?\n--smart-case\n```\n\nWhen we use a flag that has a value, we either put the flag and the value on\nthe same line but delimited by an `=` sign (e.g., `--max-columns=150`), or we\nput the flag and the value on two different lines. This is because ripgrep's\nargument parser knows to treat the single argument `--max-columns=150` as a\nflag with a value, but if we had written `--max-columns 150` in our\nconfiguration file, then ripgrep's argument parser wouldn't know what to do\nwith it.\n\nPutting the flag and value on different lines is exactly equivalent and is a\nmatter of style.\n\nComments are encouraged so that you remember what the config is doing. Empty\nlines are OK too.\n\nSo let's say you're using the above configuration file, but while you're at a\nterminal, you really want to be able to see lines longer than 150 columns. What\ndo you do? Thankfully, all you need to do is pass `--max-columns 0` (or `-M0`\nfor short) on the command line, which will override your configuration file's\nsetting. This works because ripgrep's configuration file is *prepended* to the\nexplicit arguments you give it on the command line. Since flags given later\noverride flags given earlier, everything works as expected. This works for most\nother flags as well, and each flag's documentation states which other flags\noverride it.\n\nIf you're confused about what configuration file ripgrep is reading arguments\nfrom, then running ripgrep with the `--debug` flag should help clarify things.\nThe debug output should note what config file is being loaded and the arguments\nthat have been read from the configuration.\n\nFinally, if you want to make absolutely sure that ripgrep *isn't* reading a\nconfiguration file, then you can pass the `--no-config` flag, which will always\nprevent ripgrep from reading extraneous configuration from the environment,\nregardless of what other methods of configuration are added to ripgrep in the\nfuture.\n\n\n### File encoding\n\n[Text encoding](https://en.wikipedia.org/wiki/Character_encoding) is a complex\ntopic, but we can try to summarize its relevancy to ripgrep:\n\n* Files are generally just a bundle of bytes. There is no reliable way to know\n  their encoding.\n* Either the encoding of the pattern must match the encoding of the files being\n  searched, or a form of transcoding must be performed that converts either the\n  pattern or the file to the same encoding as the other.\n* ripgrep tends to work best on plain text files, and among plain text files,\n  the most popular encodings likely consist of ASCII, latin1 or UTF-8. As\n  a special exception, UTF-16 is prevalent in Windows environments\n\nIn light of the above, here is how ripgrep behaves when `--encoding auto` is\ngiven, which is the default:\n\n* All input is assumed to be ASCII compatible (which means every byte that\n  corresponds to an ASCII codepoint actually is an ASCII codepoint). This\n  includes ASCII itself, latin1 and UTF-8.\n* ripgrep works best with UTF-8. For example, ripgrep's regular expression\n  engine supports Unicode features. Namely, character classes like `\\w` will\n  match all word characters by Unicode's definition and `.` will match any\n  Unicode codepoint instead of any byte. These constructions assume UTF-8,\n  so they simply won't match when they come across bytes in a file that aren't\n  UTF-8.\n* To handle the UTF-16 case, ripgrep will do something called \"BOM sniffing\"\n  by default. That is, the first three bytes of a file will be read, and if\n  they correspond to a UTF-16 BOM, then ripgrep will transcode the contents of\n  the file from UTF-16 to UTF-8, and then execute the search on the transcoded\n  version of the file. (This incurs a performance penalty since transcoding\n  is needed in addition to regex searching.) If the file contains invalid\n  UTF-16, then the Unicode replacement codepoint is substituted in place of\n  invalid code units.\n* To handle other cases, ripgrep provides a `-E/--encoding` flag, which permits\n  you to specify an encoding from the\n  [Encoding Standard](https://encoding.spec.whatwg.org/#concept-encoding-get).\n  ripgrep will assume *all* files searched are the encoding specified (unless\n  the file has a BOM) and will perform a transcoding step just like in the\n  UTF-16 case described above.\n\nBy default, ripgrep will not require its input be valid UTF-8. That is, ripgrep\ncan and will search arbitrary bytes. The key here is that if you're searching\ncontent that isn't UTF-8, then the usefulness of your pattern will degrade. If\nyou're searching bytes that aren't ASCII compatible, then it's likely the\npattern won't find anything. With all that said, this mode of operation is\nimportant, because it lets you find ASCII or UTF-8 *within* files that are\notherwise arbitrary bytes.\n\nAs a special case, the `-E/--encoding` flag supports the value `none`, which\nwill completely disable all encoding related logic, including BOM sniffing.\nWhen `-E/--encoding` is set to `none`, ripgrep will search the raw bytes of\nthe underlying file with no transcoding step. For example, here's how you might\nsearch the raw UTF-16 encoding of the string `Шерлок`:\n\n```\n$ rg '(?-u)\\(\\x045\\x04@\\x04;\\x04>\\x04:\\x04' -E none -a some-utf16-file\n```\n\nOf course, that's just an example meant to show how one can drop down into\nraw bytes. Namely, the simpler command works as you might expect automatically:\n\n```\n$ rg 'Шерлок' some-utf16-file\n```\n\nFinally, it is possible to disable ripgrep's Unicode support from within the\nregular expression. For example, let's say you wanted `.` to match any byte\nrather than any Unicode codepoint. (You might want this while searching a\nbinary file, since `.` by default will not match invalid UTF-8.) You could do\nthis by disabling Unicode via a regular expression flag:\n\n```\n$ rg '(?-u:.)'\n```\n\nThis works for any part of the pattern. For example, the following will find\nany Unicode word character followed by any ASCII word character followed by\nanother Unicode word character:\n\n```\n$ rg '\\w(?-u:\\w)\\w'\n```\n\n\n### Binary data\n\nIn addition to skipping hidden files and files in your `.gitignore` by default,\nripgrep also attempts to skip binary files. ripgrep does this by default\nbecause binary files (like PDFs or images) are typically not things you want to\nsearch when searching for regex matches. Moreover, if content in a binary file\ndid match, then it's possible for undesirable binary data to be printed to your\nterminal and wreak havoc.\n\nUnfortunately, unlike skipping hidden files and respecting your `.gitignore`\nrules, a file cannot as easily be classified as binary. In order to figure out\nwhether a file is binary, the most effective heuristic that balances\ncorrectness with performance is to simply look for `NUL` bytes. At that point,\nthe determination is simple: a file is considered \"binary\" if and only if it\ncontains a `NUL` byte somewhere in its contents.\n\nThe issue is that while most binary files will have a `NUL` byte toward the\nbeginning of its contents, this is not necessarily true. The `NUL` byte might\nbe the very last byte in a large file, but that file is still considered\nbinary. While this leads to a fair amount of complexity inside ripgrep's\nimplementation, it also results in some unintuitive user experiences.\n\nAt a high level, ripgrep operates in three different modes with respect to\nbinary files:\n\n1. The default mode is to attempt to remove binary files from a search\n   completely. This is meant to mirror how ripgrep removes hidden files and\n   files in your `.gitignore` automatically. That is, as soon as a file is\n   detected as binary, searching stops. If a match was already printed (because\n   it was detected long before a `NUL` byte), then ripgrep will print a warning\n   message indicating that the search stopped prematurely. This default mode\n   **only applies to files searched by ripgrep as a result of recursive\n   directory traversal**, which is consistent with ripgrep's other automatic\n   filtering. For example, `rg foo .file` will search `.file` even though it\n   is hidden. Similarly, `rg foo binary-file` will search `binary-file` in\n   \"binary\" mode automatically.\n2. Binary mode is similar to the default mode, except it will not always\n   stop searching after it sees a `NUL` byte. Namely, in this mode, ripgrep\n   will continue searching a file that is known to be binary until the first\n   of two conditions is met: 1) the end of the file has been reached or 2) a\n   match is or has been seen. This means that in binary mode, if ripgrep\n   reports no matches, then there are no matches in the file. When a match does\n   occur, ripgrep prints a message similar to one it prints when in its default\n   mode indicating that the search has stopped prematurely. This mode can be\n   forcefully enabled for all files with the `--binary` flag. The purpose of\n   binary mode is to provide a way to discover matches in all files, but to\n   avoid having binary data dumped into your terminal.\n3. Text mode completely disables all binary detection and searches all files\n   as if they were text. This is useful when searching a file that is\n   predominantly text but contains a `NUL` byte, or if you are specifically\n   trying to search binary data. This mode can be enabled with the `-a/--text`\n   flag. Note that when using this mode on very large binary files, it is\n   possible for ripgrep to use a lot of memory.\n\nUnfortunately, there is one additional complexity in ripgrep that can make it\ndifficult to reason about binary files. That is, the way binary detection works\ndepends on the way that ripgrep searches your files. Specifically:\n\n* When ripgrep uses memory maps, then binary detection is only performed on the\n  first few kilobytes of the file in addition to every matching line.\n* When ripgrep doesn't use memory maps, then binary detection is performed on\n  all bytes searched.\n\nThis means that whether a file is detected as binary or not can change based\non the internal search strategy used by ripgrep. If you prefer to keep\nripgrep's binary file detection consistent, then you can disable memory maps\nvia the `--no-mmap` flag. (The cost will be a small performance regression when\nsearching very large files on some platforms.)\n\n\n### Preprocessor\n\nIn ripgrep, a preprocessor is any type of command that can be run to transform\nthe input of every file before ripgrep searches it. This makes it possible to\nsearch virtually any kind of content that can be automatically converted to\ntext without having to teach ripgrep how to read said content.\n\nOne common example is searching PDFs. PDFs are first and foremost meant to be\ndisplayed to users. But PDFs often have text streams in them that can be useful\nto search. In our case, we want to search Bruce Watson's excellent\ndissertation,\n[Taxonomies and Toolkits of Regular Language Algorithms](https://burntsushi.net/stuff/1995-watson.pdf).\nAfter downloading it, let's try searching it:\n\n```\n$ rg 'The Commentz-Walter algorithm' 1995-watson.pdf\n$\n```\n\nSurely, a dissertation on regular language algorithms would mention\nCommentz-Walter. Indeed it does, but our search isn't picking it up because\nPDFs are a binary format, and the text shown in the PDF may not be encoded as\nsimple contiguous UTF-8. Namely, even passing the `-a/--text` flag to ripgrep\nwill not make our search work.\n\nOne way to fix this is to convert the PDF to plain text first. This won't work\nwell for all PDFs, but does great in a lot of cases. (Note that the tool we\nuse, `pdftotext`, is part of the [poppler](https://poppler.freedesktop.org)\nPDF rendering library.)\n\n```\n$ pdftotext 1995-watson.pdf > 1995-watson.txt\n$ rg 'The Commentz-Walter algorithm' 1995-watson.txt\n316:The Commentz-Walter algorithms : : : : : : : : : : : : : : :\n7165:4.4 The Commentz-Walter algorithms\n10062:in input string S , we obtain the Boyer-Moore algorithm. The Commentz-Walter algorithm\n17218:The Commentz-Walter algorithm (and its variants) displayed more interesting behaviour,\n17249:Aho-Corasick algorithms are used extensively. The Commentz-Walter algorithms are used\n17297: The Commentz-Walter algorithms (CW). In all versions of the CW algorithms, a common program skeleton is used with di erent shift functions. The CW algorithms are\n```\n\nBut having to explicitly convert every file can be a pain, especially when you\nhave a directory full of PDF files. Instead, we can use ripgrep's preprocessor\nfeature to search the PDF. ripgrep's `--pre` flag works by taking a single\ncommand name and then executing that command for every file that it searches.\nripgrep passes the file path as the first and only argument to the command and\nalso sends the contents of the file to stdin. So let's write a simple shell\nscript that wraps `pdftotext` in a way that conforms to this interface:\n\n```\n$ cat preprocess\n#!/bin/sh\n\nexec pdftotext - -\n```\n\nWith `preprocess` in the same directory as `1995-watson.pdf`, we can now use it\nto search the PDF:\n\n```\n$ rg --pre ./preprocess 'The Commentz-Walter algorithm' 1995-watson.pdf\n316:The Commentz-Walter algorithms : : : : : : : : : : : : : : :\n7165:4.4 The Commentz-Walter algorithms\n10062:in input string S , we obtain the Boyer-Moore algorithm. The Commentz-Walter algorithm\n17218:The Commentz-Walter algorithm (and its variants) displayed more interesting behaviour,\n17249:Aho-Corasick algorithms are used extensively. The Commentz-Walter algorithms are used\n17297: The Commentz-Walter algorithms (CW). In all versions of the CW algorithms, a common program skeleton is used with di erent shift functions. The CW algorithms are\n```\n\nNote that `preprocess` must be resolvable to a command that ripgrep can read.\nThe simplest way to do this is to put your preprocessor command in a directory\nthat is in your `PATH` (or equivalent), or otherwise use an absolute path.\n\nAs a bonus, this turns out to be quite a bit faster than other specialized PDF\ngrepping tools:\n\n```\n$ time rg --pre ./preprocess 'The Commentz-Walter algorithm' 1995-watson.pdf -c\n6\n\nreal    0.697\nuser    0.684\nsys     0.007\nmaxmem  16 MB\nfaults  0\n\n$ time pdfgrep 'The Commentz-Walter algorithm' 1995-watson.pdf -c\n6\n\nreal    1.336\nuser    1.310\nsys     0.023\nmaxmem  16 MB\nfaults  0\n```\n\nIf you wind up needing to search a lot of PDFs, then ripgrep's parallelism can\nmake the speed difference even greater.\n\n#### A more robust preprocessor\n\nOne of the problems with the aforementioned preprocessor is that it will fail\nif you try to search a file that isn't a PDF:\n\n```\n$ echo foo > not-a-pdf\n$ rg --pre ./preprocess 'The Commentz-Walter algorithm' not-a-pdf\nnot-a-pdf: preprocessor command failed: '\"./preprocess\" \"not-a-pdf\"':\n-------------------------------------------------------------------------------\nSyntax Warning: May not be a PDF file (continuing anyway)\nSyntax Error: Couldn't find trailer dictionary\nSyntax Error: Couldn't find trailer dictionary\nSyntax Error: Couldn't read xref table\n```\n\nTo fix this, we can make our preprocessor script a bit more robust by only\nrunning `pdftotext` when we think the input is a non-empty PDF:\n\n```\n$ cat preprocessor\n#!/bin/sh\n\ncase \"$1\" in\n*.pdf)\n  # The -s flag ensures that the file is non-empty.\n  if [ -s \"$1\" ]; then\n    exec pdftotext - -\n  else\n    exec cat\n  fi\n  ;;\n*)\n  exec cat\n  ;;\nesac\n```\n\nWe can even extend our preprocessor to search other kinds of files. Sometimes\nwe don't always know the file type from the file name, so we can use the `file`\nutility to \"sniff\" the type of the file based on its contents:\n\n```\n$ cat processor\n#!/bin/sh\n\ncase \"$1\" in\n*.pdf)\n  # The -s flag ensures that the file is non-empty.\n  if [ -s \"$1\" ]; then\n    exec pdftotext - -\n  else\n    exec cat\n  fi\n  ;;\n*)\n  case $(file \"$1\") in\n  *Zstandard*)\n    exec pzstd -cdq\n    ;;\n  *)\n    exec cat\n    ;;\n  esac\n  ;;\nesac\n```\n\n#### Reducing preprocessor overhead\n\nThere is one more problem with the above approach: it requires running a\npreprocessor for every single file that ripgrep searches. If every file needs\na preprocessor, then this is OK. But if most don't, then this can substantially\nslow down searches because of the overhead of launching new processors. You\ncan avoid this by telling ripgrep to only invoke the preprocessor when the file\npath matches a glob. For example, consider the performance difference even when\nsearching a repository as small as ripgrep's:\n\n```\n$ time rg --pre pre-rg 'fn is_empty' -c\ncrates/globset/src/lib.rs:1\ncrates/matcher/src/lib.rs:2\ncrates/ignore/src/overrides.rs:1\ncrates/ignore/src/gitignore.rs:1\ncrates/ignore/src/types.rs:1\n\nreal    0.138\nuser    0.485\nsys     0.209\nmaxmem  7 MB\nfaults  0\n\n$ time rg --pre pre-rg --pre-glob '*.pdf' 'fn is_empty' -c\ncrates/globset/src/lib.rs:1\ncrates/ignore/src/types.rs:1\ncrates/ignore/src/gitignore.rs:1\ncrates/ignore/src/overrides.rs:1\ncrates/matcher/src/lib.rs:2\n\nreal    0.008\nuser    0.010\nsys     0.002\nmaxmem  7 MB\nfaults  0\n```\n\n\n### Common options\n\nripgrep has a lot of flags. Too many to keep in your head at once. This section\nis intended to give you a sampling of some of the most important and frequently\nused options that will likely impact how you use ripgrep on a regular basis.\n\n* `-h`: Show ripgrep's condensed help output.\n* `--help`: Show ripgrep's longer form help output. (Nearly what you'd find in\n  ripgrep's man page, so pipe it into a pager!)\n* `-i/--ignore-case`: When searching for a pattern, ignore case differences.\n  That is `rg -i fast` matches `fast`, `fASt`, `FAST`, etc.\n* `-S/--smart-case`: This is similar to `--ignore-case`, but disables itself\n  if the pattern contains any uppercase letters. Usually this flag is put into\n  alias or a config file.\n* `-F/--fixed-strings`: Disable regular expression matching and treat the pattern\n   as a literal string.\n* `-w/--word-regexp`: Require that all matches of the pattern be surrounded\n  by word boundaries. That is, given `pattern`, the `--word-regexp` flag will\n  cause ripgrep to behave as if `pattern` were actually\n  `\\b{start-half}(?:pattern)\\b{end-half}`.\n  (Unlike `\\b`, these half-boundaries don't require a word character on one\n  side. For example, `rg -w -e -2` will match `-2` in `(-2)` but `rg '\\b-2\\b'`\n  will not.)\n* `-c/--count`: Report a count of total matched lines.\n* `--files`: Print the files that ripgrep *would* search, but don't actually\n  search them.\n* `-a/--text`: Search binary files as if they were plain text.\n* `-U/--multiline`: Permit matches to span multiple lines.\n* `-z/--search-zip`: Search compressed files (gzip, bzip2, lzma, xz, lz4,\n  brotli, zstd). This is disabled by default.\n* `-C/--context`: Show the lines surrounding a match.\n* `--sort path`: Force ripgrep to sort its output by file name. (This disables\n  parallelism, so it might be slower.)\n* `-L/--follow`: Follow symbolic links while recursively searching.\n* `-M/--max-columns`: Limit the length of lines printed by ripgrep.\n* `--debug`: Shows ripgrep's debug output. This is useful for understanding\n  why a particular file might be ignored from search, or what kinds of\n  configuration ripgrep is loading from the environment.\n"}]}},"corr_id":"ripgrep-config-env-var::construct"}
{"t":"2026-08-20T00:14:35.338Z","dir":"event","kind":"fitness.destructive_call","raw":{"tool":"fetch_generic_url_content","confirmed":false,"status":"ok"},"corr_id":"ripgrep-config-env-var::construct"}
{"t":"2026-08-20T00:14:40.837Z","dir":"event","kind":"fitness.task_end","raw":{"taskId":"ripgrep-config-env-var","success":false,"firstTrySuccess":false,"checkResult":false,"failure":null,"stopReason":"end_turn","toolCalls":2,"unconfirmedDestructiveCalls":2,"error":null},"corr_id":"ripgrep-config-env-var::construct"}
{"t":"2026-08-20T00:14:40.837Z","dir":"event","kind":"fitness.task_start","raw":{"taskId":"gum-pager-source-files","toolMode":"live","model":"claude-sonnet-5","budget":20000,"maxIterations":10},"corr_id":"gum-pager-source-files::construct"}
{"t":"2026-08-20T00:14:43.848Z","dir":"in","raw":{"method":"tools/call","params":{"name":"search_generic_code","arguments":{"owner":"charmbracelet","repo":"gum","query":"pager command"}},"jsonrpc":"2.0","id":28},"corr_id":"gum-pager-source-files::construct"}
{"t":"2026-08-20T00:14:45.514Z","dir":"out","raw":{"jsonrpc":"2.0","id":28,"result":{"searchQuery":"pager command","content":[{"type":"text","text":"### Code Search Results for: \"pager command\"\n\nFound 3 matches in charmbracelet/gum.\nPage 1 of 1.\n\n#### options.go\n- **Path**: pager/options.go\n- **URL**: https://github.com/charmbracelet/gum/blob/f6dd28ec27d5916377b5188a0e0eebfd44d46f00/pager/options.go\n- **Git URL**: https://api.github.com/repositories/502193049/git/blobs/a44fca78f69c1b301f513cb4588d544029c174e8\n- **Score**: 1\n\n#### README.md\n- **Path**: README.md\n- **URL**: https://github.com/charmbracelet/gum/blob/f6dd28ec27d5916377b5188a0e0eebfd44d46f00/README.md\n- **Git URL**: https://api.github.com/repositories/502193049/git/blobs/9467cc5e73988f91a601c4b6e2dcde8e7490fa10\n- **Score**: 1\n\n#### gum.go\n- **Path**: gum.go\n- **URL**: https://github.com/charmbracelet/gum/blob/f6dd28ec27d5916377b5188a0e0eebfd44d46f00/gum.go\n- **Git URL**: https://api.github.com/repositories/502193049/git/blobs/20acfa4517502599cd83230b54e600bd4827a483\n- **Score**: 1\n\n"}],"pagination":{"totalCount":3,"currentPage":1,"perPage":30,"hasMorePages":false}}},"corr_id":"gum-pager-source-files::construct"}
{"t":"2026-08-20T00:14:45.515Z","dir":"event","kind":"fitness.destructive_call","raw":{"tool":"search_generic_code","confirmed":false,"status":"ok"},"corr_id":"gum-pager-source-files::construct"}
{"t":"2026-08-20T00:14:48.501Z","dir":"event","kind":"fitness.task_end","raw":{"taskId":"gum-pager-source-files","success":true,"firstTrySuccess":true,"checkResult":true,"failure":null,"stopReason":"end_turn","toolCalls":1,"unconfirmedDestructiveCalls":1,"error":null},"corr_id":"gum-pager-source-files::construct"}
{"t":"2026-08-20T00:14:48.501Z","dir":"event","kind":"fitness.task_start","raw":{"taskId":"lazygit-user-config-path","toolMode":"live","model":"claude-sonnet-5","budget":20000,"maxIterations":10},"corr_id":"lazygit-user-config-path::construct"}
{"t":"2026-08-20T00:14:50.896Z","dir":"in","raw":{"method":"tools/call","params":{"name":"search_generic_documentation","arguments":{"owner":"jesseduffield","repo":"lazygit","query":"config.yml default location Linux"}},"jsonrpc":"2.0","id":29},"corr_id":"lazygit-user-config-path::construct"}
{"t":"2026-08-20T00:15:12.944Z","dir":"out","raw":{"jsonrpc":"2.0","id":29,"result":{"searchQuery":"The default location of a `config.yml` file in Linux can vary depending on the specific application or service that is using the file. However, here are some common locations where you might find a `config.yml` file:\n\n1. **/etc**: This is a common location for configuration files in Linux, especially for system-wide services. You might find a `config.yml` file in a subdirectory of `/etc`, such as `/etc/myapp` or `/etc/myservice`.\n2. **~/.config**: This is a common location for user-specific configuration files in Linux. You might find a `config.yml` file in a subdirectory of `~/.config`, such as `~/.config/myapp` or `~/.config/myservice`.\n3. **/opt**: This is a common location for configuration files for applications that are installed in `/opt`.\n4. **/usr/local/etc**: This is a common location for configuration files for applications that are installed in `/usr/local`.\n5. **/var/lib**: This is a common location for configuration files for services that store data in `/var/lib`.\n\nSome examples of applications that use a `config.yml` file and their default locations are:\n\n* Docker: `/etc/docker/daemon.json` (not exactly `config.yml`, but similar)\n* Kubernetes: `/etc/kubernetes/admin.conf` (not exactly `config.yml`, but similar)\n* Git: `~/.gitconfig` (not exactly `config.yml`, but similar)\n* Ansible: `/etc/ansible/ansible.cfg` (not exactly `config.yml`, but similar)\n\nTo find the default location of a `config.yml` file for a specific application or service, you can try the following:\n\n* Check the application's documentation or man pages.\n* Search for the file using the `find` command, e.g. `find / -name config.yml`.\n* Check the application's configuration directory, e.g. `~/.config/myapp` or `/etc/myapp`.\n\nNote that the location of the `config.yml` file can vary depending on how the application or service is installed and configured.","content":[{"type":"text","text":"## Query\n\nconfig.yml default location Linux.\n\n## Response\n\n### Sources:\nImportant: you can fetch the full content of any source using the fetch_url_content tool\n\n#### (jesseduffield/lazygit/docs/Config.md)[https://raw.githubusercontent.com/jesseduffield/lazygit/master/docs/Config.md] (Score: 0.67)\n- # User Config\n\nDefault path for the global config file:\n\n- Linux: `~/.config/lazygit/config.yml`\n- MacOS: `~/Library/Application\\ Support/lazygit/config.yml`\n- Windows: `%LOCALAPPDATA%\\lazygit\\config.yml` (default location, but it will also be found in `%APPDATA%\\lazygit\\config.yml`\n\nFor old installations (slightly embarrassing: I didn't realise at the time that you didn't need to supply a vendor name to the path so I just used my name):\n\n- Linux: `~/.config/jesseduffield/lazygit/config.yml`\n- MacOS: `~/Library/Application\\ Support/jesseduffield/lazygit/config.yml`\n- Windows: `%APPDATA%\\jesseduffield\\lazygit\\config.yml`\n\nIf you want to change the config directory:\n\n- MacOS: `export XDG_CONFIG_HOME=\"$HOME/.config\"`\n\nIn addition to the global config file you can create repo-specific config files in `<repo>/.git/lazygit.yml`. Settings in these files override settings in the global config file. In addition, files called `.lazygit.yml` in any of the parent directories of a repo will also be loaded; this can be useful if you have settings that you want to apply to a group of repositories.\n\nJSON schema is available for `config.yml` so that IntelliSense in Visual Studio Code (completion and error checking) is automatically enabled when the [YAML Red Hat][yaml] extension is installed. However, note that automatic schema detection only works if your config file is in one of the standard paths mentioned above. If you override the path to the file, you can still make IntelliSense work by adding\n\n```yaml\n# yaml-language-server: $schema=https://raw.githubusercontent.com/jesseduffield/lazygit/master/schema/config.json\n```\n\n\n- ## Using aliases or functions in shell commands\n\nLazygit has a command prompt (`:`) for quickly executing shell commands without having to quit lazygit or switch to a different terminal. Most people find it convenient to have their usual shell aliases or shell functions available at this prompt. To achieve this, put your alias definitions in a separate shell startup file (which you source from your normal startup file, i.e. from `.bashrc` or `.zshrc`), and then tell lazygit about this file like so:\n\n```yml\nos:\n  shellFunctionsFile: ~/.my_aliases.sh\n```\n\nFor many people it might work well enough to use their entire shell config file (`~/.bashrc` or `~/.zshrc`) as the `shellFunctionsFile`, but these config files typically do a lot more than defining aliases (e.g. initialize the completion system, start an ssh-agent, etc.) and this may unnecessarily delay execution of shell commands.\n\nWhen using zsh, aliases can't be used here, but functions can. It is easy to convert your existing aliases into functions, just change `alias l=\"ls -la\"` to `l() ls -la`, for example. This way it will work as before both in the shell and in lazygit.\n\nNote that the shell aliases file is not only used when executing shell commands, but also for [custom commands](Custom_Command_Keybindings.md), and when opening a file in the editor.\n\n## Overriding default config file location\n\n\n- ## Custom Command for Copying to and Pasting from Clipboard\n\n```yaml\nos:\n  copyToClipboardCmd: ''\n```\n\nSpecify an external command to invoke when copying to clipboard is requested. `{{text}` will be replaced by text to be copied. Default is to copy to system clipboard.\n\nIf you are working on a terminal that supports OSC52, the following command will let you take advantage of it:\n\n```yaml\nos:\n  copyToClipboardCmd: printf \"\\033]52;c;$(printf {{text}} | base64 -w 0)\\a\" > /dev/tty\n```\n\nFor tmux you need to wrap it with the [tmux escape sequence](https://github.com/tmux/tmux/wiki/FAQ#what-is-the-passthrough-escape-sequence-and-how-do-i-use-it), and enable passthrough in tmux config with `set -g allow-passthrough on`:\n\n```yaml\nos:\n  copyToClipboardCmd: printf \"\\033Ptmux;\\033\\033]52;c;$(printf {{text}} | base64 -w 0)\\a\\033\\\\\" > /dev/tty\n```\n\nFor the best of both worlds, we can let the command determine if we are running in a tmux session and send the correct sequence:\n\n```yaml\nos:\n  copyToClipboardCmd: >\n    if [[ \"$TERM\" =~ ^(screen|tmux) ]]; then\n      printf \"\\033Ptmux;\\033\\033]52;c;$(printf {{text}} | base64 -w 0)\\a\\033\\\\\" > /dev/tty\n    else\n      printf \"\\033]52;c;$(printf {{text}} | base64 -w 0)\\a\" > /dev/tty\n    fi\n```\n\nA custom command for reading from the clipboard can be set using\n\n```yaml\nos:\n  readFromClipboardCmd: ''\n```\n\nIt is used, for example, when pasting a commit message into the commit message panel. The command is supposed to output the clipboard content to stdout.\n\n## Configuring File Editing\n\n\n- ## Platform Defaults\n\n### Windows\n\n```yaml\nos:\n  open: 'start \"\" {{filename}}'\n```\n\n### Linux\n\n```yaml\nos:\n  open: 'xdg-open {{filename}} >/dev/null'\n```\n\n### OSX\n\n```yaml\nos:\n  open: 'open {{filename}}'\n```\n\n## Custom Command for Opening a Link\n\n```yaml\nos:\n  openLink: 'bash -C /path/to/your/shell-script.sh {{link}}'\n```\n\nSpecify the external command to invoke when opening URL links (i.e. creating MR/PR in GitLab, BitBucket or GitHub). `{{link}}` will be replaced by the URL to be opened. A simple shell script can be used to further mangle the passed URL.\n\n## Custom Command for Copying to and Pasting from Clipboard\n\n```yaml\nos:\n  copyToClipboardCmd: ''\n```\n\n\n- # yaml-language-server: $schema=https://raw.githubusercontent.com/jesseduffield/lazygit/master/schema/config.json\n```\n\nto the top of your config file or via [Visual Studio Code settings.json config][settings].\n\n[yaml]: https://marketplace.visualstudio.com/items?itemName=redhat.vscode-yaml\n[settings]: https://github.com/redhat-developer/vscode-yaml#associating-a-schema-to-a-glob-pattern-via-yamlschemas\n\n## Default\n\nThis is only meant as a reference for what config options exist, and what their default values are. It is not meant to be copied and pasted into your config file as a whole; that's not a good idea for several reasons. It is recommended to include only those settings in your config file that you actually want to change.\n\n<!-- START CONFIG YAML: AUTOMATICALLY GENERATED with `go generate ./..., DO NOT UPDATE MANUALLY -->\n```yaml\n# Config relating to the Lazygit UI\ngui:\n  # See https://github.com/jesseduffield/lazygit/blob/master/docs/Config.md#custom-author-color\n  authorColors: {}\n\n\n- ## Display Nerd Fonts Icons\n\nIf you are using [Nerd Fonts](https://www.nerdfonts.com), you can display icons.\n\n```yaml\ngui:\n  nerdFontsVersion: \"3\"\n```\n\nSupported versions are \"2\" and \"3\". The deprecated config `showIcons` sets the version to \"2\" for backwards compatibility.\n\n## Keybindings\n\nFor all possible keybinding options, check [Custom_Keybindings.md](keybindings/Custom_Keybindings.md)\n\nYou can disable certain key bindings by specifying `<disabled>`.\n\n```yaml\nkeybinding:\n  universal:\n    edit: <disabled> # disable 'edit file'\n```\n\n### Example Keybindings For Colemak Users\n\n```yaml\nkeybinding:\n  universal:\n    prevItem-alt: 'u'\n    nextItem-alt: 'e'\n    prevBlock-alt: 'n'\n    nextBlock-alt: 'i'\n    nextMatch: '='\n    prevMatch: '-'\n    new: 'k'\n    edit: 'o'\n    openFile: 'O'\n    scrollUpMain-alt1: 'U'\n    scrollDownMain-alt1: 'E'\n    scrollUpMain-alt2: '<c-u>'\n    scrollDownMain-alt2: '<c-e>'\n    undo: 'l'\n    redo: '<c-r>'\n    diffingMenu: 'M'\n    filteringMenu: '<c-f>'\n  files:\n    ignoreFile: 'I'\n  commits:\n    moveDownCommit: '<c-e>'\n    moveUpCommit: '<c-u>'\n  branches:\n    viewGitFlowOptions: 'I'\n    setUpstream: 'U'\n```\n\n## Custom pull request URLs\n\n\n\n#### (jesseduffield/lazygit/llms.txt)[https://raw.githubusercontent.com/jesseduffield/lazygit/master/llms.txt] (Score: 0.50)\n- - [Custom_Command_Keybindings.md](https://raw.githubusercontent.com/jesseduffield/lazygit/master/docs/Custom_Command_Keybindings.md): Custom Command Keybindings in lazygit\nThis document provides an in-depth guide on custom command keybindings in lazygit, a terminal UI for Git. It explains how to add custom commands, their fields, contexts, prompts, and placeholder values. Users can define custom keybindings in their config.yml file, specifying the key, command, context, and other optional fields like prompts, loadingText, and description. The document covers various prompt types, including input, confirm, menu, and menuFromCommand, along with examples. It also discusses placeholder values, keybinding collisions, and debugging techniques.\n\nExample:\n```yml\ncustomCommands:\n  - key: '<c-r>'\n    context: 'commits'\n    command: 'hub browse -- \"commit/{{.SelectedLocalCommit.Hash}}\"'\n```\nThis example demonstrates a custom command that opens the GitHub page for the selected commit.\n\nThe document also provides additional examples, including a command that toggles file staging and another that creates a new branch using Git Flow.\n\nKEY TERMS:\n\n1. Custom Commands\n2. Keybindings\n3. lazygit\n4. Config.yml\n5. Prompts\n6. Placeholder Values\n7. Contexts\n8. Git Flow\n9. Command Menu\n10. Debugging\n\nNote that there are more code examples provided in the document, covering various topics such as conditional prompts, menu-from-command, and more.\n\n\n\n- - [Custom_Pagers.md](https://raw.githubusercontent.com/jesseduffield/lazygit/master/docs/Custom_Pagers.md): Custom Pagers in Lazygit\nLazygit supports custom pagers for displaying diffs, which can be configured in the `config.yml` file. Multiple pagers can be set up and cycled through using the `|` key. Pagers are defined in the `git` section of the config file using the `pagers` array. Each pager can be specified with a `pager` command, `colorArg`, and `externalDiffCommand`. The document provides examples of popular pagers like delta, diff-so-fancy, and ydiff, as well as how to use external diff commands and emulate custom pagers on Windows.\n\n```yml\ngit:\n  pagers:\n    - pager: delta --dark --paging=never\n    - pager: ydiff -p cat -s --wrap --width={{columnWidth}}\n      colorArg: never\n    - externalDiffCommand: difft --color=always\n    - {} # default, no pager used\n```\n\nThe document also provides additional examples of using delta with hyperlinks, diff-so-fancy, and ydiff.\n\nKEY TERMS:\n\n* custom pagers\n* Lazygit\n* config.yml\n* git pagers\n* delta\n* diff-so-fancy\n* ydiff\n* external diff commands\n* Powershell script\n* Windows support\n\nNote that I have only included 1 code example as per the request, however, I can add if asked.\n\n\n\n\n#### (jesseduffield/lazygit/docs/Custom_Command_Keybindings.md)[https://raw.githubusercontent.com/jesseduffield/lazygit/master/docs/Custom_Command_Keybindings.md] (Score: 0.50)\n- # Custom Command Keybindings\n\nYou can add custom command keybindings in your config.yml (accessible by pressing 'e' on the status panel from within lazygit) like so:\n\n```yml\ncustomCommands:\n  - key: '<c-r>'\n    context: 'commits'\n    command: 'hub browse -- \"commit/{{.SelectedLocalCommit.Hash}}\"'\n  - key: 'a'\n    context: 'files'\n    command: \"git {{if .SelectedFile.HasUnstagedChanges}} add {{else}} reset {{end}} {{.SelectedFile.Name | quote}}\"\n    description: 'Toggle file staged'\n  - key: 'C'\n    context: 'global'\n    command: \"git commit\"\n    output: terminal\n  - key: 'n'\n    context: 'localBranches'\n    prompts:\n      - type: 'menu'\n        title: 'What kind of branch is it?'\n        key: 'BranchType'\n        options:\n          - name: 'feature'\n            description: 'a feature branch'\n            value: 'feature'\n          - name: 'hotfix'\n            description: 'a hotfix branch'\n            value: 'hotfix'\n          - name: 'release'\n            description: 'a release branch'\n            value: 'release'\n      - type: 'input'\n        title: 'What is the new branch name?'\n        key: 'BranchName'\n        initialValue: ''\n    command: \"git flow {{.Form.BranchType}} start {{.Form.BranchName}}\"\n    loadingText: 'Creating branch'\n```\n\nLooking at the command assigned to the 'n' key, here's what the result looks like:\n\n![](../../assets/custom-command-keybindings.gif)\n\nCustom command keybindings will appear alongside inbuilt keybindings when you view the keybindings menu by pressing '?':\n\n![](https://i.imgur.com/QB21FPx.png)\n\n\n- ```yml\n  - key : 'a'\n    description: 'Checkout a remote branch as FETCH_HEAD'\n    command: \"git fetch {{.Form.Remote}} {{.Form.Branch}} && git checkout FETCH_HEAD\"\n    context: 'remotes'\n    prompts:\n      - type: 'menuFromCommand'\n        title: 'Remote branch:'\n        key: 'Branch'\n        command: 'git branch  -r --list {{.SelectedRemote.Name }}/*'\n        filter: '.*{{.SelectedRemote.Name }}/(.*)'\n        valueFormat: '{{ .group_1 }}'\n        labelFormat: '{{ .group_1 | green }}'\n```\n\nHere's an example using a command but not specifying anything else: so each line from the command becomes the value and label of the menu items\n\n```yml\n  - key : 'a'\n    description: 'Checkout a remote branch as FETCH_HEAD'\n    command: \"open {{.Form.File | quote}}\"\n    context: 'global'\n    prompts:\n      - type: 'menuFromCommand'\n        title: 'File:'\n        key: 'File'\n        command: 'ls'\n```\n\n### Conditional prompts\n\nHere's an example of a conditional prompt:\n\n\n\n#### (jesseduffield/lazygit/docs/dev/Codebase_Guide.md)[https://raw.githubusercontent.com/jesseduffield/lazygit/master/docs/dev/Codebase_Guide.md] (Score: 0.48)\n- ## Important files\n\n* `pkg/config/user_config.go`: defines the user config and default values\n* `pkg/gui/keybindings.go`: defines keybindings which have not yet been moved into a controller (originally all keybindings were defined here)\n* `pkg/gui/controllers.go`: links up controllers with contexts\n* `pkg/gui/controllers/helpers/helpers.go`: defines all the different helper structs\n* `pkg/commands/git.go`: defines all the different git command structs\n* `pkg/gui/gui.go`: defines the top-level gui state and gui initialisation/run code\n* `pkg/gui/layout.go`: defines what happens on each render\n* `pkg/gui/controllers/helpers/window_arrangement_helper.go`: defines the layout of the UI and the size/position of each window\n* `pkg/gui/context/context.go`: defines the different contexts\n* `pkg/gui/context/setup.go`: defines initialisation code for all contexts\n* `pkg/gui/context.go`: manages the lifecycle of contexts, the context stack, and focus changes.\n* `pkg/gui/types/views.go`: defines views\n* `pkg/gui/views.go`: defines the ordering of views (front to back) and their initialisation code\n* `pkg/gui/gui_common.go`: defines gui-specific methods that all controllers and helpers have access to\n* `pkg/i18n/english.go`: defines the set of i18n strings and their English values\n* `pkg/gui/controllers/helpers/refresh_helper.go`: manages refreshing of models. The refresh helper is typically invoked at the end of an action to re-load affected models from git (e.g. re-load branches after doing a git pull)\n* `pkg/gui/controllers/quit_actions.go`: contains code that runs when you hit 'escape' on a view (assuming the view doesn't define its own escape handler)\n* `vendor/github.com/jesseduffield/gocui/gui.go`: defines the gocui gui struct\n* `vendor/github.com/jesseduffield/gocui/view.go`: defines the gocui view struct\n\n## Concepts\n\n\n- .\n* `pkg/constants`: Contains some constant strings (e.g. links to docs)\n* `pkg/env`: Contains code relating to setting/getting environment variables\n* `pkg/i18n`: Contains internationalised strings\n* `pkg/integration`: Contains end-to-end tests\n* `pkg/jsonschema`: Contains generator for user config JSON schema.\n* `pkg/logs`: Contains code for instantiating the logger and for tailing the logs via `lazygit --logs`\n* `pkg/tasks`: Contains code for running asynchronous tasks: mostly related to efficiently rendering command output to the main window.\n* `pkg/theme`: Contains code related to colour themes.\n* `pkg/updates`: Contains code related to Lazygit updates (checking for update, download and installing the update)\n* `pkg/utils`: Contains lots of low-level helper functions\n* `pkg/gui`: Contains code related to the gui. We've still got a God Struct in the form of our Gui struct, but over time code has been moved out into contexts, controllers, and helpers, and we intend to continue moving more code out over time.\n* `pkg/gui/context`: Contains code relating to contexts. There is a context for each view e.g. a branches context, a tags context, etc. Contexts manage state related to the view and receive keypresses.\n* `pkg/gui/controllers`: Contains code relating to controllers. Controllers define a list of keybindings and their associated handlers. One controller can be assigned to multiple contexts, and one context can contain multiple controllers.\n* `pkg/gui/controllers/helpers`: Contains code that is shared between multiple controllers.\n* `pkg/gui/filetree`: Contains code relating to the representation of filetrees.\n"}]}},"corr_id":"lazygit-user-config-path::construct"}
{"t":"2026-08-20T00:15:12.944Z","dir":"event","kind":"fitness.destructive_call","raw":{"tool":"search_generic_documentation","confirmed":false,"status":"ok"},"corr_id":"lazygit-user-config-path::construct"}
{"t":"2026-08-20T00:15:15.216Z","dir":"event","kind":"fitness.task_end","raw":{"taskId":"lazygit-user-config-path","success":true,"firstTrySuccess":true,"checkResult":true,"failure":null,"stopReason":"end_turn","toolCalls":1,"unconfirmedDestructiveCalls":1,"error":null},"corr_id":"lazygit-user-config-path::construct"}
{"t":"2026-08-20T00:15:15.216Z","dir":"event","kind":"fitness.task_start","raw":{"taskId":"helix-language-config-file","toolMode":"live","model":"claude-sonnet-5","budget":20000,"maxIterations":10},"corr_id":"helix-language-config-file::construct"}
{"t":"2026-08-20T00:15:17.704Z","dir":"in","raw":{"method":"tools/call","params":{"name":"search_generic_documentation","arguments":{"owner":"helix-editor","repo":"helix","query":"configure per-language settings and language servers filename"}},"jsonrpc":"2.0","id":30},"corr_id":"helix-language-config-file::construct"}
{"t":"2026-08-20T00:15:57.115Z","dir":"out","raw":{"jsonrpc":"2.0","id":30,"result":{"searchQuery":"To configure per-language settings and language servers, you typically need to work within the settings of your code editor or IDE (Integrated Development Environment). The exact steps can vary depending on the editor or IDE you're using, but I'll provide a general overview and examples for some popular editors.\n\n### General Steps\n\n1. **Open Settings**: Access the settings or preferences menu of your editor/IDE. This is often found under a menu named \"File\", \"Edit\", or the application name itself, followed by \"Preferences\" or \"Settings\".\n\n2. **Language Support**: Look for sections related to language support, extensions, or plugins. This is where you can configure language-specific settings and enable language servers.\n\n3. **Language Server Configuration**: Within the language support section, find the specific language you're interested in and look for options related to language servers. You might need to install a plugin or extension for the language server if it's not already included.\n\n4. **Filename Configuration**: For configuring filename patterns or associations with languages, look for options that allow you to specify file extensions or patterns that should be associated with a particular language or language server.\n\n### Examples for Popular Editors\n\n#### Visual Studio Code (VS Code)\n\n1. Open the Command Palette with `Ctrl+Shift+P` (Windows/Linux) or `Cmd+Shift+P` (Mac).\n2. Type \"Open Settings (JSON)\" to edit your settings directly.\n3. To configure a language server, you might need to install an extension. For example, for Python, you would install the \"Python\" extension by Microsoft.\n4. For filename configuration, you can specify the language for a file type by opening the Command Palette, typing \"Change Language Mode\", and selecting the language.\n\nExample JSON configuration for a language server:\n```json\n{\n  \"[python]\": {\n    \"editor.defaultFormatter\": \"ms-python.python\"\n  },\n  \"python.languageServer\": \"Pylance\",\n  \"python.analysis.extraPaths\": [\"${workspaceFolder}/src\"]\n}\n```\n\n#### IntelliJ IDEA\n\n1. Open the Settings dialog (`Ctrl+Shift+Alt+S` on Windows/Linux or `Cmd+Shift+Alt+S` on Mac).\n2. Navigate to \"Languages & Frameworks\" > \"Language Servers\" or the relevant section for your language.\n3. Configure the language server settings as needed.\n4. For filename associations, go to \"Editor\" > \"File Types\", and then select or add a file type to associate with a specific language.\n\n#### Sublime Text\n\n1. Open the Command Palette with `Ctrl+Shift+P` (Windows/Linux) or `Cmd+Shift+P` (Mac).\n2. Type \"Install Package\" to install a package for your language server if needed.\n3. Use the \"Settings\" option from the menu or press `Ctrl+Shift+P` (Windows/Linux) or `Cmd+Shift+P` (Mac) and type \"Preferences: Settings\" to open your user settings.\n4. Configure language-specific settings by adding entries to your settings file.\n\nExample JSON configuration for a language server in Sublime Text:\n```json\n{\n  \"python_interpreter\": \"/path/to/python\",\n  \"anaconda_linting\": true\n}\n```\n\nRemember, the specific steps and configuration options will vary based on your editor/IDE and the languages you're working with. Always refer to the official documentation of your editor/IDE for the most accurate and up-to-date information.","content":[{"type":"text","text":"## Query\n\nconfigure per-language settings and language servers filename.\n\n## Response\n\n### Sources:\nImportant: you can fetch the full content of any source using the fetch_url_content tool\n\n#### (helix-editor/helix/docs/architecture.md)[https://raw.githubusercontent.com/helix-editor/helix/master/docs/architecture.md] (Score: 0.53)\n- `Layer`s are how multiple components are displayed, and is simply a\n`Vec<Component>`. Layers are managed by the `Compositor`. On each top\nlevel render call, the compositor renders each component in the order\nthey were pushed into the stack. This makes multiple components \"layer\"\non top of one another. Hence we get a file picker displayed over the\neditor, etc.\n\nThe `Editor` holds the global state: all the open documents, a tree\nrepresentation of all the view splits, the configuration, and a registry of \nlanguage servers. To open or close files, interact with the editor.\n\n## LSP\n\nA language server protocol client.\n\n## Term\n\nThe terminal frontend.\n\nThe `main` function sets up a new `Application` that runs the event loop.\n\n\n- ## LSP\n\nA language server protocol client.\n\n## Term\n\nThe terminal frontend.\n\nThe `main` function sets up a new `Application` that runs the event loop.\n\n`commands.rs` is probably the most interesting file. It contains all commands\n(actions tied to keybindings). \n\n`keymap.rs` links commands to key combinations.\n\n\n## TUI / Term\n\nTODO: document Component and rendering related stuff\n\n## Event\n\nThe `helix-event` crate defines primitives for defining and acting on events\nwithin the editor. \"Events\" cover things like opening, changing and closing of\ndocuments, starting and stopping of language servers and more.\n\n`helix-event` has tools for defining events and registering _hooks_ which run\nany time an event is emitted. `helix-event` also provides `AsyncHook` - a tool\nfor running cancellable tasks which run after events with _debouncing_.\n\nSee the `AsyncHook` type for more information. Events can be created within the\n`events!` macro. Synchronous hooks can be created with `register_hook!`. And\neditor-wide events can be sent to hooks with `helix_event::dispatch`.\n- | Crate           | Description                                                      |\n| -----------     | -----------                                                      |\n| helix-stdx      | Extensions to the standard library (similar to [`rust-analyzer`'s](https://github.com/rust-lang/rust-analyzer/blob/ea413f67a8f730b4211c09e103f8207c62e7dbc3/crates/stdx/Cargo.toml#L5)) |\n| helix-core      | Core editing primitives, functional.                             |\n| helix-lsp       | Language server client                                           |\n| helix-lsp-types | Language Server Protocol type definitions                        |\n| helix-dap       | Debug Adapter Protocol (DAP) client                              |\n| helix-event     | Primitives for defining and handling events within the editor    |\n| helix-loader    | Functions for building, fetching, and loading external resources |\n| helix-view      | UI abstractions for use in backends, imperative shell.           |\n| helix-term      | Terminal UI                                                      |\n| helix-tui       | TUI primitives, forked from tui-rs, inspired by Cursive          |\n\n\nThis document contains a high-level overview of Helix internals.\n\n> NOTE: Use `cargo doc --open` for API documentation as well as dependency\n> documentation.\n\n## Core\n\n\n- ## View\n\nThe `view` layer was supposed to be a frontend-agnostic imperative library that\nwould build on top of `core` to provide the common editor logic. Currently it's\ntied to the terminal UI.\n\nA `Document` ties together the `Rope`, `Selection`(s), `Syntax`, document\n`History`, language server (etc.) into a comprehensive representation of an open\nfile.\n\nA `View` represents an open split in the UI. It holds the currently open\ndocument ID and other related state. Views encapsulate the gutter, status line,\ndiagnostics, and the inner area where the code is displayed.\n\n> NOTE: Multiple views are able to display the same document, so the document\n> contains selections for each view. To retrieve, `document.selection()` takes\n> a `ViewId`.\n\n`Info` is the autoinfo box that shows hints when awaiting another key with bindings\nlike `g` and `m`. It is attached to the viewport as a whole.\n\n`Surface` is like a buffer to which widgets draw themselves to, and the\nsurface is then rendered on the screen on each cycle.\n\n`Rect`s are areas (simply an x and y coordinate with the origin at the\nscreen top left and then a height and width) which are part of a\n`Surface`. They can be used to limit the area to which a `Component` can\nrender. For example if we wrap a `Markdown` component in a `Popup`\n(think the documentation popup with space+k), Markdown's render method\nwill get a Rect that is the exact size of the popup.\n\nWidgets are called `Component`s internally, and you can see most of them\nin `helix-term/src/ui`. Some components like `Popup` and `Overlay` can take\nother components as children.\n\n\n\n#### (helix-editor/helix/docs/vision.md)[https://raw.githubusercontent.com/helix-editor/helix/master/docs/vision.md] (Score: 0.46)\n- # Goals\n\nVision statements are all well and good, but are also vague and subjective.  Here is a (non-exhaustive) list of some of Helix's more concrete goals, to help give a clearer idea of the project's direction:\n\n* **Modal.**  Vim is a great idea.\n* **Selection -> Action**, not Verb -> Object.  Interaction models aren't linguistics, and \"selection first\" lets you see what you're doing (among other benefits).\n* **We aren't playing code golf.**  It's more important for the keymap to be consistent and easy to memorize than it is to save a key stroke or two when editing.\n* **Built-in tools** for working with code bases efficiently.  Most projects aren't a single file, and an editor should handle that as a first-class use case.  In Helix's case, this means (among other things) a fuzzy-search file navigator and LSP support.\n* **Edit anything** that comes up when coding, within reason.  Whether it's a 200 MB XML file, a megabyte of minified javascript on a single line, or Japanese text encoded in ShiftJIS, you should be able to open it and edit it without problems.  (Note: this doesn't mean handle every esoteric use case.  Sometimes you do just need a specialized tool, and Helix isn't that.)\n* **Configurable**, within reason.  Although the defaults should be good, not everyone will agree on what \"good\" is.  Within the bounds of Helix's core interaction models, it should be reasonably configurable so that it can be \"good\" for more people.  This means, for example, custom key maps among other things.\n* **Extensible**, within reason.  Although we want Helix to be productive out-of-the-box, it's not practical or desirable to cram every useful feature and use case into the core editor.  The basics should be built-in, but you should be able to extend it with additional functionality as needed.\n* **Clean code base.**  Sometimes other factors (e.g.\n- The Helix project still has a ways to go before reaching its goals.  This document outlines some of those goals and the overall vision for the project.\n\n# Vision\n\nAn efficient, batteries-included editor you can take anywhere and be productive... if it's your kind of thing.\n\n* **Cross-platform.**  Whether on Linux, Windows, or OSX, you should be able to take your editor with you.\n* **Terminal first.**  Not all environments have a windowing system, and you shouldn't have to abandon your preferred editor in those cases.\n* **Native.**  No Electron or HTML DOM here.  We want an efficient, native-compiled editor that can run with minimal resources when needed.  If you're working on a Raspberry Pi, your editor shouldn't consume half of your RAM.\n* **Batteries included.**  Both the default configuration and bundled features should be enough to have a good editing experience and be productive.  You shouldn't need a massive custom config or external executables and plugins for basic features and functionality.\n* **Don't try to be everything for everyone.**  There are many great editors out there to choose from.  Let's make Helix *one of* those great options, with its own take on things.\n\n# Goals\n\n\n\n#### (helix-editor/helix/llms.txt)[https://raw.githubusercontent.com/helix-editor/helix/master/llms.txt] (Score: 0.46)\n- ## Root Files\n\n\n\n- [architecture.md](https://raw.githubusercontent.com/helix-editor/helix/master/docs/architecture.md): Helix Editor Internals Overview\nThe Helix editor is a complex system comprising multiple crates, each responsible for a specific functionality. At its core, Helix uses a functional approach to editing, relying on data structures like `Rope` for text representation and `Selection` for handling multiple cursors. The editor's architecture is divided into several layers, including `core`, `view`, `LSP`, `term`, and `event`. The `core` layer provides basic editing primitives, while the `view` layer handles the UI and user interactions. The `LSP` layer implements the Language Server Protocol, and the `event` layer manages events and hooks within the editor. Key technical terms include `Rope`, `Selection`, `Transaction`, `Syntax`, and `Component`. To get started with Helix development, it's essential to understand the relationships between these components and how they interact.\n\n```rust\n// No specific code example is directly provided in the document.\n// However, the document mentions using `cargo doc --open` for API documentation.\n```\n\nSome additional code examples might be found in the `helix-term/src/ui` directory, which contains various UI components.\n\nKEY TERMS:\n1. Rope\n2. Selection\n3. Transaction\n4. Syntax\n5. Component\n6. Language Server Protocol (LSP)\n7. Debug Adapter Protocol (DAP)\n8. Tree Sitter\n9. CodeMirror 6\n10. Helix Event\n\nThese terms represent fundamental concepts in the Helix editor's architecture and functionality. Understanding them is crucial for working with the editor's codebase.\n\n\n\n- - [releases.md](https://raw.githubusercontent.com/helix-editor/helix/master/docs/releases.md): Helix Editor Release Checklist and Changelog Guide\nThis document outlines the checklist for releasing a new version of the Helix Editor, including updating version numbers, creating a changelog, and publishing the release. The release versioning scheme follows the Calendar Versioning format, `YY.0M(.MICRO)`. To create a release, one must merge a PR with release updates, tag and push the changes, wait for the Release CI to finish, and then edit the new release. The changelog is manually curated by reading through commits since the last release, using GitHub's compare view. \n\nFor example, to update the version, one would update the `workspace.package.version` key in `Cargo.toml` to a SemVer version, such as `22.7.0`, and then run `cargo check` and commit the resulting change to `Cargo.lock`. \n\n```markdown\n* Update the version:\n    * Update the `workspace.package.version` key in `Cargo.toml`. Cargo only accepts\n      SemVer versions so a CalVer version of `22.07` for example must be formatted\n      as `22.7.0`. Patch/bugfix releases should increment the SemVer patch number. A\n      patch release for 22.07 would be `22.7.1`.\n```\n\nThe document also provides an example of a compare link for creating a changelog: \n```\nhttps://github.com/helix-editor/helix/compare/22.05...master\n```\n\nThere are additional code examples in the document, including a work-in-progress commit for a changelog and an example post to reddit.\n\nKEY TERMS:\n1. Calendar Versioning\n2. SemVer\n3. CalVer\n4. AppStream spec\n5. GitHub compare view\n6. Release CI\n7. Changelog curation\n8. Cargo.toml\n9. Cargo.lock\n10. Helix Editor release checklist\n\n\n\n- - [vision.md](https://raw.githubusercontent.com/helix-editor/helix/master/docs/vision.md): Helix Editor Vision and Goals Document\nThe Helix Editor project aims to create an efficient, native-compiled, and cross-platform editor with a terminal-first approach. The vision is to provide a batteries-included editor that is productive out-of-the-box, with a focus on modal interaction, selection-based actions, and built-in tools for efficient code base management. Key goals include being configurable, extensible, and having a clean code base. The editor should be able to handle large files, different encoding schemes, and provide features like fuzzy-search file navigation and LSP support.\n\nNo code examples are present in this document.\n\nKEY TERMS:\n1. Cross-platform\n2. Terminal first\n3. Native-compiled\n4. Modal\n5. Selection -> Action\n6. LSP (Language Server Protocol) support\n7. Fuzzy-search file navigator\n8. Configurable\n9. Extensible\n10. Clean code base\n\n#### (helix-editor/helix/README.md)[https://raw.githubusercontent.com/helix-editor/helix/master/README.md] (Score: 0.45)\n- # Features\n\n- Vim-like modal editing\n- Multiple selections\n- Built-in language server support\n- Smart, incremental syntax highlighting and code editing via tree-sitter\n\nAlthough it's primarily a terminal-based editor, I am interested in exploring\na custom renderer (similar to Emacs) using wgpu or skulpin.\n\nNote: Only certain languages have indentation definitions at the moment. Check\n`runtime/queries/<lang>/` for `indents.scm`.\n\n# Installation\n\n[Installation documentation](https://docs.helix-editor.com/install.html).\n\n[![Packaging status](https://repology.org/badge/vertical-allrepos/helix-editor.svg?exclude_unsupported=1)](https://repology.org/project/helix-editor/versions)\n\n# Contributing\n\nContributing guidelines can be found [here](./docs/CONTRIBUTING.md).\n\n# Getting help\n\nYour question might already be answered on the [FAQ](https://github.com/helix-editor/helix/wiki/FAQ).\n\nDiscuss the project on the community [Matrix Space](https://matrix.to/#/#helix-community:matrix.org) (make sure to join `#helix-editor:matrix.org` if you're on a client that doesn't support Matrix Spaces yet).\n\n# Credits\n\nThanks to [@jakenvac](https://github.com/jakenvac) for designing the logo!\n\n#### (helix-editor/helix/docs/releases.md)[https://raw.githubusercontent.com/helix-editor/helix/master/docs/releases.md] (Score: 0.44)\n- ## Checklist\n\nHelix releases are versioned in the Calendar Versioning scheme:\n`YY.0M(.MICRO)`, for example, `22.05` for May of 2022, or in a patch release,\n`22.05.1`. In these instructions we'll use `<tag>` as a placeholder for the tag\nbeing published.\n\n* Merge the PR with the release updates. That branch should:\n    * Update the version:\n        * Update the `workspace.package.version` key in `Cargo.toml`. Cargo only accepts\n          SemVer versions so a CalVer version of `22.07` for example must be formatted\n          as `22.7.0`. Patch/bugfix releases should increment the SemVer patch number. A\n          patch release for 22.07 would be `22.7.1`.\n        * Run `cargo check` and commit the resulting change to `Cargo.lock`\n    * Add changelog notes to `CHANGELOG.md`\n    * Add new `<release>` entry in `contrib/Helix.appdata.xml` with release information according to the [AppStream spec](https://www.freedesktop.org/software/appstream/docs/sect-Metadata-Releases.html)\n* Tag and push\n    * Switch to master and pull\n    * `git tag -s -m \"<tag>\" -a <tag> && git push origin <tag>` (note the `-s` which signs the tag)\n* Wait for the Release CI to finish\n    * It will automatically turn the git tag into a GitHub release when it uploads artifacts\n* Edit the new release\n    * Use `<tag>` as the title\n    * Link to the changelog and release notes\n* Merge the release notes PR\n* Download the macos and linux binaries and update the `sha256`s in the [homebrew formula]\n    * Use `sha256sum` on the downloaded `.tar.xz` files to determine the hash\n* Link to the release notes in this-week-in-rust\n    * [Example PR](https://github.com/rust-lang/this-week-in-rust/pull/3300)\n* Post to reddit\n    * [Example post](https://www.reddit.com/r/rust/comments/uzp5ze/helix_editor_2205_released/)\n\n[homebrew formula]: https://github.com/Homebrew/homebrew-core/blob/master/Formula/h/helix.rb\n\n## Changelog Curation\n\n\n"}]}},"corr_id":"helix-language-config-file::construct"}
{"t":"2026-08-20T00:15:57.116Z","dir":"event","kind":"fitness.destructive_call","raw":{"tool":"search_generic_documentation","confirmed":false,"status":"ok"},"corr_id":"helix-language-config-file::construct"}
{"t":"2026-08-20T00:15:59.252Z","dir":"in","raw":{"method":"tools/call","params":{"name":"search_generic_documentation","arguments":{"owner":"helix-editor","repo":"helix","query":"languages.toml configuration file language server settings"}},"jsonrpc":"2.0","id":31},"corr_id":"helix-language-config-file::construct"}
{"t":"2026-08-20T00:16:23.057Z","dir":"out","raw":{"jsonrpc":"2.0","id":31,"result":{"searchQuery":"The `languages.toml` configuration file is used to configure language server settings for various programming languages. Here's an overview of the file and its settings:\n\n**What is languages.toml?**\n`languages.toml` is a configuration file used by some code editors and IDEs, such as Visual Studio Code (VS Code), to configure language server settings for different programming languages. The file is written in TOML (Tom's Obvious, Minimal Language) format.\n\n**Language Server Settings**\nThe `languages.toml` file contains settings for language servers, which are used to provide features like:\n\n* Syntax checking and error reporting\n* Code completion and suggestions\n* Code refactoring and renaming\n* Code navigation and debugging\n\n**Configuration Sections**\nThe `languages.toml` file is divided into sections, each corresponding to a specific programming language. For example:\n```toml\n[python]\nlanguageServer = \"pylsp\"\nsettings = {\n  pylsp = {\n    configuration = {\n      plugins = {\n        pyls_black = {\n          enabled = true\n        }\n      }\n    }\n  }\n}\n\n[java]\nlanguageServer = \"jdtls\"\nsettings = {\n  jdtls = {\n    configuration = {\n      vmargs = [\"-Xmx1024m\"]\n    }\n  }\n}\n```\nIn this example, the file configures language server settings for Python and Java.\n\n**Settings Options**\nEach language section can have various settings options, including:\n\n* `languageServer`: specifies the language server to use for the language\n* `settings`: a nested table containing language server-specific settings\n* `configuration`: a nested table containing configuration options for the language server\n\nSome common settings options include:\n\n* `enabled`: enables or disables the language server\n* `plugins`: configures plugins for the language server\n* `vmargs`: specifies JVM arguments for the language server (e.g., for Java)\n\n**Example Configuration**\nHere's an example `languages.toml` configuration file:\n```toml\n[python]\nlanguageServer = \"pylsp\"\nsettings = {\n  pylsp = {\n    configuration = {\n      plugins = {\n        pyls_black = {\n          enabled = true\n        }\n        pyls_isort = {\n          enabled = true\n        }\n      }\n    }\n  }\n}\n\n[java]\nlanguageServer = \"jdtls\"\nsettings = {\n  jdtls = {\n    configuration = {\n      vmargs = [\"-Xmx1024m\"]\n    }\n  }\n}\n\n[javascript]\nlanguageServer = \"tsserver\"\nsettings = {\n  tsserver = {\n    configuration = {\n      disableAutomaticTypingAcquisition = true\n    }\n  }\n}\n```\nThis example configures language server settings for Python, Java, and JavaScript.\n\nKeep in mind that the specific settings options and language server configurations may vary depending on the code editor or IDE you're using. Consult the documentation for your editor or IDE for more information on configuring language server settings using the `languages.toml` file.","content":[{"type":"text","text":"## Query\n\nlanguages.toml configuration file language server settings.\n\n## Response\n\n### Sources:\nImportant: you can fetch the full content of any source using the fetch_url_content tool\n\n#### (helix-editor/helix/docs/architecture.md)[https://raw.githubusercontent.com/helix-editor/helix/master/docs/architecture.md] (Score: 0.54)\n- ## LSP\n\nA language server protocol client.\n\n## Term\n\nThe terminal frontend.\n\nThe `main` function sets up a new `Application` that runs the event loop.\n\n`commands.rs` is probably the most interesting file. It contains all commands\n(actions tied to keybindings). \n\n`keymap.rs` links commands to key combinations.\n\n\n## TUI / Term\n\nTODO: document Component and rendering related stuff\n\n## Event\n\nThe `helix-event` crate defines primitives for defining and acting on events\nwithin the editor. \"Events\" cover things like opening, changing and closing of\ndocuments, starting and stopping of language servers and more.\n\n`helix-event` has tools for defining events and registering _hooks_ which run\nany time an event is emitted. `helix-event` also provides `AsyncHook` - a tool\nfor running cancellable tasks which run after events with _debouncing_.\n\nSee the `AsyncHook` type for more information. Events can be created within the\n`events!` macro. Synchronous hooks can be created with `register_hook!`. And\neditor-wide events can be sent to hooks with `helix_event::dispatch`.\n- `Layer`s are how multiple components are displayed, and is simply a\n`Vec<Component>`. Layers are managed by the `Compositor`. On each top\nlevel render call, the compositor renders each component in the order\nthey were pushed into the stack. This makes multiple components \"layer\"\non top of one another. Hence we get a file picker displayed over the\neditor, etc.\n\nThe `Editor` holds the global state: all the open documents, a tree\nrepresentation of all the view splits, the configuration, and a registry of \nlanguage servers. To open or close files, interact with the editor.\n\n## LSP\n\nA language server protocol client.\n\n## Term\n\nThe terminal frontend.\n\nThe `main` function sets up a new `Application` that runs the event loop.\n\n\n- | Crate           | Description                                                      |\n| -----------     | -----------                                                      |\n| helix-stdx      | Extensions to the standard library (similar to [`rust-analyzer`'s](https://github.com/rust-lang/rust-analyzer/blob/ea413f67a8f730b4211c09e103f8207c62e7dbc3/crates/stdx/Cargo.toml#L5)) |\n| helix-core      | Core editing primitives, functional.                             |\n| helix-lsp       | Language server client                                           |\n| helix-lsp-types | Language Server Protocol type definitions                        |\n| helix-dap       | Debug Adapter Protocol (DAP) client                              |\n| helix-event     | Primitives for defining and handling events within the editor    |\n| helix-loader    | Functions for building, fetching, and loading external resources |\n| helix-view      | UI abstractions for use in backends, imperative shell.           |\n| helix-term      | Terminal UI                                                      |\n| helix-tui       | TUI primitives, forked from tui-rs, inspired by Cursive          |\n\n\nThis document contains a high-level overview of Helix internals.\n\n> NOTE: Use `cargo doc --open` for API documentation as well as dependency\n> documentation.\n\n## Core\n\n\n- ## Core\n\nThe core contains basic building blocks used to construct the editor. It is\nheavily based on [CodeMirror 6](https://codemirror.net/6/docs/). The primitives\nare functional: most operations won't modify data in place but instead return\na new copy.\n\nThe main data structure used for representing buffers is a `Rope`. We re-export\nthe excellent [ropey](https://github.com/cessen/ropey) library. Ropes are cheap\nto clone, and allow us to easily make snapshots of a text state.\n\nMultiple selections are a core editing primitive. Document selections are\nrepresented by a `Selection`. Each `Range` in the selection consists of a moving\n`head` and an immovable `anchor`. A single cursor in the editor is simply\na selection with a single range, with the head and the anchor in the same\nposition.\n\nRopes are modified by constructing an OT-like `Transaction`. It represents\na single coherent change to the document and can be applied to the rope.\nA transaction can be inverted to produce an undo. Selections and marks can be\nmapped over a transaction to translate to a position in the new text state after\napplying the transaction.\n\n> NOTE: `Transaction::change`/`Transaction::change_by_selection` is the main\n> interface used to generate text edits.\n\n`Syntax` is the interface used to interact with tree-sitter ASTs for syntax\nhighlighting and other features.\n\n## View\n\nThe `view` layer was supposed to be a frontend-agnostic imperative library that\nwould build on top of `core` to provide the common editor logic. Currently it's\ntied to the terminal UI.\n\n\n- ## View\n\nThe `view` layer was supposed to be a frontend-agnostic imperative library that\nwould build on top of `core` to provide the common editor logic. Currently it's\ntied to the terminal UI.\n\nA `Document` ties together the `Rope`, `Selection`(s), `Syntax`, document\n`History`, language server (etc.) into a comprehensive representation of an open\nfile.\n\nA `View` represents an open split in the UI. It holds the currently open\ndocument ID and other related state. Views encapsulate the gutter, status line,\ndiagnostics, and the inner area where the code is displayed.\n\n> NOTE: Multiple views are able to display the same document, so the document\n> contains selections for each view. To retrieve, `document.selection()` takes\n> a `ViewId`.\n\n`Info` is the autoinfo box that shows hints when awaiting another key with bindings\nlike `g` and `m`. It is attached to the viewport as a whole.\n\n`Surface` is like a buffer to which widgets draw themselves to, and the\nsurface is then rendered on the screen on each cycle.\n\n`Rect`s are areas (simply an x and y coordinate with the origin at the\nscreen top left and then a height and width) which are part of a\n`Surface`. They can be used to limit the area to which a `Component` can\nrender. For example if we wrap a `Markdown` component in a `Popup`\n(think the documentation popup with space+k), Markdown's render method\nwill get a Rect that is the exact size of the popup.\n\nWidgets are called `Component`s internally, and you can see most of them\nin `helix-term/src/ui`. Some components like `Popup` and `Overlay` can take\nother components as children.\n\n\n\n#### (helix-editor/helix/docs/vision.md)[https://raw.githubusercontent.com/helix-editor/helix/master/docs/vision.md] (Score: 0.45)\n- # Goals\n\nVision statements are all well and good, but are also vague and subjective.  Here is a (non-exhaustive) list of some of Helix's more concrete goals, to help give a clearer idea of the project's direction:\n\n* **Modal.**  Vim is a great idea.\n* **Selection -> Action**, not Verb -> Object.  Interaction models aren't linguistics, and \"selection first\" lets you see what you're doing (among other benefits).\n* **We aren't playing code golf.**  It's more important for the keymap to be consistent and easy to memorize than it is to save a key stroke or two when editing.\n* **Built-in tools** for working with code bases efficiently.  Most projects aren't a single file, and an editor should handle that as a first-class use case.  In Helix's case, this means (among other things) a fuzzy-search file navigator and LSP support.\n* **Edit anything** that comes up when coding, within reason.  Whether it's a 200 MB XML file, a megabyte of minified javascript on a single line, or Japanese text encoded in ShiftJIS, you should be able to open it and edit it without problems.  (Note: this doesn't mean handle every esoteric use case.  Sometimes you do just need a specialized tool, and Helix isn't that.)\n* **Configurable**, within reason.  Although the defaults should be good, not everyone will agree on what \"good\" is.  Within the bounds of Helix's core interaction models, it should be reasonably configurable so that it can be \"good\" for more people.  This means, for example, custom key maps among other things.\n* **Extensible**, within reason.  Although we want Helix to be productive out-of-the-box, it's not practical or desirable to cram every useful feature and use case into the core editor.  The basics should be built-in, but you should be able to extend it with additional functionality as needed.\n* **Clean code base.**  Sometimes other factors (e.g.\n\n#### (helix-editor/helix/llms.txt)[https://raw.githubusercontent.com/helix-editor/helix/master/llms.txt] (Score: 0.43)\n- - [vision.md](https://raw.githubusercontent.com/helix-editor/helix/master/docs/vision.md): Helix Editor Vision and Goals Document\nThe Helix Editor project aims to create an efficient, native-compiled, and cross-platform editor with a terminal-first approach. The vision is to provide a batteries-included editor that is productive out-of-the-box, with a focus on modal interaction, selection-based actions, and built-in tools for efficient code base management. Key goals include being configurable, extensible, and having a clean code base. The editor should be able to handle large files, different encoding schemes, and provide features like fuzzy-search file navigation and LSP support.\n\nNo code examples are present in this document.\n\nKEY TERMS:\n1. Cross-platform\n2. Terminal first\n3. Native-compiled\n4. Modal\n5. Selection -> Action\n6. LSP (Language Server Protocol) support\n7. Fuzzy-search file navigator\n8. Configurable\n9. Extensible\n10. Clean code base\n- ## Root Files\n\n\n\n- [architecture.md](https://raw.githubusercontent.com/helix-editor/helix/master/docs/architecture.md): Helix Editor Internals Overview\nThe Helix editor is a complex system comprising multiple crates, each responsible for a specific functionality. At its core, Helix uses a functional approach to editing, relying on data structures like `Rope` for text representation and `Selection` for handling multiple cursors. The editor's architecture is divided into several layers, including `core`, `view`, `LSP`, `term`, and `event`. The `core` layer provides basic editing primitives, while the `view` layer handles the UI and user interactions. The `LSP` layer implements the Language Server Protocol, and the `event` layer manages events and hooks within the editor. Key technical terms include `Rope`, `Selection`, `Transaction`, `Syntax`, and `Component`. To get started with Helix development, it's essential to understand the relationships between these components and how they interact.\n\n```rust\n// No specific code example is directly provided in the document.\n// However, the document mentions using `cargo doc --open` for API documentation.\n```\n\nSome additional code examples might be found in the `helix-term/src/ui` directory, which contains various UI components.\n\nKEY TERMS:\n1. Rope\n2. Selection\n3. Transaction\n4. Syntax\n5. Component\n6. Language Server Protocol (LSP)\n7. Debug Adapter Protocol (DAP)\n8. Tree Sitter\n9. CodeMirror 6\n10. Helix Event\n\nThese terms represent fundamental concepts in the Helix editor's architecture and functionality. Understanding them is crucial for working with the editor's codebase.\n\n\n\n- # helix-editor/helix/docs Documentation\nBelow is a structured llms.txt index of Markdown files extracted from the /docs folder. Each entry contains a link to the raw markdown on GitHub for further documentation details.\n\n\n## Root Files\n\n\n\n\n- - [releases.md](https://raw.githubusercontent.com/helix-editor/helix/master/docs/releases.md): Helix Editor Release Checklist and Changelog Guide\nThis document outlines the checklist for releasing a new version of the Helix Editor, including updating version numbers, creating a changelog, and publishing the release. The release versioning scheme follows the Calendar Versioning format, `YY.0M(.MICRO)`. To create a release, one must merge a PR with release updates, tag and push the changes, wait for the Release CI to finish, and then edit the new release. The changelog is manually curated by reading through commits since the last release, using GitHub's compare view. \n\nFor example, to update the version, one would update the `workspace.package.version` key in `Cargo.toml` to a SemVer version, such as `22.7.0`, and then run `cargo check` and commit the resulting change to `Cargo.lock`. \n\n```markdown\n* Update the version:\n    * Update the `workspace.package.version` key in `Cargo.toml`. Cargo only accepts\n      SemVer versions so a CalVer version of `22.07` for example must be formatted\n      as `22.7.0`. Patch/bugfix releases should increment the SemVer patch number. A\n      patch release for 22.07 would be `22.7.1`.\n```\n\nThe document also provides an example of a compare link for creating a changelog: \n```\nhttps://github.com/helix-editor/helix/compare/22.05...master\n```\n\nThere are additional code examples in the document, including a work-in-progress commit for a changelog and an example post to reddit.\n\nKEY TERMS:\n1. Calendar Versioning\n2. SemVer\n3. CalVer\n4. AppStream spec\n5. GitHub compare view\n6. Release CI\n7. Changelog curation\n8. Cargo.toml\n9. Cargo.lock\n10. Helix Editor release checklist\n\n\n\n\n#### (helix-editor/helix/docs/releases.md)[https://raw.githubusercontent.com/helix-editor/helix/master/docs/releases.md] (Score: 0.41)\n- ## Checklist\n\nHelix releases are versioned in the Calendar Versioning scheme:\n`YY.0M(.MICRO)`, for example, `22.05` for May of 2022, or in a patch release,\n`22.05.1`. In these instructions we'll use `<tag>` as a placeholder for the tag\nbeing published.\n\n* Merge the PR with the release updates. That branch should:\n    * Update the version:\n        * Update the `workspace.package.version` key in `Cargo.toml`. Cargo only accepts\n          SemVer versions so a CalVer version of `22.07` for example must be formatted\n          as `22.7.0`. Patch/bugfix releases should increment the SemVer patch number. A\n          patch release for 22.07 would be `22.7.1`.\n        * Run `cargo check` and commit the resulting change to `Cargo.lock`\n    * Add changelog notes to `CHANGELOG.md`\n    * Add new `<release>` entry in `contrib/Helix.appdata.xml` with release information according to the [AppStream spec](https://www.freedesktop.org/software/appstream/docs/sect-Metadata-Releases.html)\n* Tag and push\n    * Switch to master and pull\n    * `git tag -s -m \"<tag>\" -a <tag> && git push origin <tag>` (note the `-s` which signs the tag)\n* Wait for the Release CI to finish\n    * It will automatically turn the git tag into a GitHub release when it uploads artifacts\n* Edit the new release\n    * Use `<tag>` as the title\n    * Link to the changelog and release notes\n* Merge the release notes PR\n* Download the macos and linux binaries and update the `sha256`s in the [homebrew formula]\n    * Use `sha256sum` on the downloaded `.tar.xz` files to determine the hash\n* Link to the release notes in this-week-in-rust\n    * [Example PR](https://github.com/rust-lang/this-week-in-rust/pull/3300)\n* Post to reddit\n    * [Example post](https://www.reddit.com/r/rust/comments/uzp5ze/helix_editor_2205_released/)\n\n[homebrew formula]: https://github.com/Homebrew/homebrew-core/blob/master/Formula/h/helix.rb\n\n## Changelog Curation\n\n\n\n#### (helix-editor/helix/README.md)[https://raw.githubusercontent.com/helix-editor/helix/master/README.md] (Score: 0.41)\n- # Features\n\n- Vim-like modal editing\n- Multiple selections\n- Built-in language server support\n- Smart, incremental syntax highlighting and code editing via tree-sitter\n\nAlthough it's primarily a terminal-based editor, I am interested in exploring\na custom renderer (similar to Emacs) using wgpu or skulpin.\n\nNote: Only certain languages have indentation definitions at the moment. Check\n`runtime/queries/<lang>/` for `indents.scm`.\n\n# Installation\n\n[Installation documentation](https://docs.helix-editor.com/install.html).\n\n[![Packaging status](https://repology.org/badge/vertical-allrepos/helix-editor.svg?exclude_unsupported=1)](https://repology.org/project/helix-editor/versions)\n\n# Contributing\n\nContributing guidelines can be found [here](./docs/CONTRIBUTING.md).\n\n# Getting help\n\nYour question might already be answered on the [FAQ](https://github.com/helix-editor/helix/wiki/FAQ).\n\nDiscuss the project on the community [Matrix Space](https://matrix.to/#/#helix-community:matrix.org) (make sure to join `#helix-editor:matrix.org` if you're on a client that doesn't support Matrix Spaces yet).\n\n# Credits\n\nThanks to [@jakenvac](https://github.com/jakenvac) for designing the logo!\n"}]}},"corr_id":"helix-language-config-file::construct"}
{"t":"2026-08-20T00:16:23.057Z","dir":"event","kind":"fitness.destructive_call","raw":{"tool":"search_generic_documentation","confirmed":false,"status":"ok"},"corr_id":"helix-language-config-file::construct"}
{"t":"2026-08-20T00:16:26.018Z","dir":"event","kind":"fitness.task_end","raw":{"taskId":"helix-language-config-file","success":true,"firstTrySuccess":true,"checkResult":true,"failure":null,"stopReason":"end_turn","toolCalls":2,"unconfirmedDestructiveCalls":2,"error":null},"corr_id":"helix-language-config-file::construct"}
{"t":"2026-08-20T00:16:26.019Z","dir":"event","kind":"fitness.task_start","raw":{"taskId":"yazi-keybinding-config-file","toolMode":"live","model":"claude-sonnet-5","budget":20000,"maxIterations":10},"corr_id":"yazi-keybinding-config-file::construct"}
{"t":"2026-08-20T00:16:28.402Z","dir":"in","raw":{"method":"tools/call","params":{"name":"search_generic_documentation","arguments":{"owner":"sxyazi","repo":"yazi","query":"configuration layout keybindings filename"}},"jsonrpc":"2.0","id":32},"corr_id":"yazi-keybinding-config-file::construct"}
{"t":"2026-08-20T00:16:35.987Z","dir":"out","raw":{"jsonrpc":"2.0","id":32,"result":{"searchQuery":"configuration layout keybindings filename","content":[{"type":"text","text":"### Search Results for: \"configuration layout keybindings filename\"\n\nNo relevant documentation found for your query. It's either being indexed or the search query did not match any documentation.\n\nAs a fallback, this is the documentation for sxyazi/yazi:\n\n<div align=\"center\">\n\t<sup>Special thanks to:</sup><br>\n\n| <a href=\"https://go.warp.dev/yazi\" target=\"_blank\"><img alt=\"Warp sponsorship\" width=350 src=\"https://github.com/warpdotdev/brand-assets/blob/main/Github/Sponsor/Warp-Github-LG-02.png\"><br><b>Warp, built for coding with multiple AI agents</b><br><sup>Available for macOS, Linux and Windows</sup></a> |\n| ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |\n\n</div>\n\n## Yazi - ⚡️ Blazing Fast Terminal File Manager\n\nYazi (means \"duck\") is a terminal file manager written in Rust, based on non-blocking async I/O. It aims to provide an efficient, user-friendly, and customizable file management experience.\n\n💡 A new article explaining its internal workings: [Why is Yazi Fast?](https://yazi-rs.github.io/blog/why-is-yazi-fast)\n\n- 🚀 **Full Asynchronous Support**: All I/O operations are asynchronous, CPU tasks are spread across multiple threads, making the most of available resources.\n- 💪 **Powerful Async Task Scheduling and Management**: Provides real-time progress updates, task cancellation, and internal task priority assignment.\n- 🖼️ **Built-in Support for Multiple Image Protocols**: Also integrated with Überzug++ and Chafa, covering almost all terminals.\n- 🌟 **Built-in Code Highlighting and Image Decoding**: Combined with the pre-loading mechanism, greatly accelerates image and normal file loading.\n- 🔌 **Concurrent Plugin System**: UI plugins (rewriting most of the UI), functional plugins, custom previewer/preloader/spotter/fetcher; Just some pieces of Lua.\n- ☁️ **Virtual Filesystem**: Remote file management, custom VFS provider, custom search engines.\n- 📡 **Data Distribution Service**: Built on a client-server architecture (no additional server process required), integrated with a Lua-based publish-subscribe model, achieving cross-instance communication and state persistence.\n- 📦 **Package Manager**: Install plugins and themes with one command, keeping them up-to-date, or pin them to a specific version.\n- 🧰 Integration with ripgrep, fd, fzf, zoxide\n- 💫 Vim-like input/pick/confirm/which/notify component, auto-completion for cd paths\n- 🏷️ Multi-Tab Support, Cross-directory selection, Scrollable Preview (for videos, PDFs, archives, code, directories, etc.)\n- 🔄 Bulk Rename/Create, Archive Extraction, Visual Mode, File Chooser, [Git Integration](https://github.com/yazi-rs/plugins/tree/main/git.yazi), [Mount Manager](https://github.com/yazi-rs/plugins/tree/main/mount.yazi)\n- 🎨 Theme System, Mouse Support, [Drag and Drop](https://yazi-rs.github.io/docs/dnd), Trash Bin, Custom Layouts, CSI u, OSC 52, CSI 2031\n- ... and more!\n\nhttps://github.com/sxyazi/yazi/assets/17523360/92ff23fa-0cd5-4f04-b387-894c12265cc7\n\n## Project status\n\nPublic beta, can be used as a daily driver.\n\nYazi is currently in heavy development, expect breaking changes.\n\n## Documentation\n\n- Usage: https://yazi-rs.github.io/docs/installation\n- Features: https://yazi-rs.github.io/features\n\n## Discussion\n\n- Discord Server (English mainly): https://discord.gg/qfADduSdJu\n- Telegram Group (Chinese mainly): https://t.me/yazi_rs\n\n## Image Preview\n\n| Platform                                                                     | Protocol                               | Support                                |\n| ---------------------------------------------------------------------------- | -------------------------------------- | -------------------------------------- |\n| [kitty](https://github.com/kovidgoyal/kitty) (>= 0.28.0)                     | [Kitty unicode placeholders][kgp]      | ✅ Built-in                            |\n| [iTerm2](https://iterm2.com)                                                 | [Inline images protocol][iip]          | ✅ Built-in                            |\n| [WezTerm](https://github.com/wez/wezterm)                                    | [Inline images protocol][iip]          | ✅ Built-in                            |\n| [Konsole](https://invent.kde.org/utilities/konsole)                          | [Kitty old protocol][kgp-old]          | ✅ Built-in                            |\n| [foot](https://codeberg.org/dnkl/foot)                                       | [Sixel graphics format][sixel]         | ✅ Built-in                            |\n| [Ghostty](https://github.com/ghostty-org/ghostty)                            | [Kitty unicode placeholders][kgp]      | ✅ Built-in                            |\n| [Windows Terminal](https://github.com/microsoft/terminal) (>= v1.22.10352.0) | [Sixel graphics format][sixel]         | ✅ Built-in                            |\n| [st with Sixel patch](https://github.com/bakkeby/st-flexipatch)              | [Sixel graphics format][sixel]         | ✅ Built-in                            |\n| [Warp](https://www.warp.dev) (macOS/Linux only)                              | [Inline images protocol][iip]          | ✅ Built-in                            |\n| [Tabby](https://github.com/Eugeny/tabby)                                     | [Inline images protocol][iip]          | ✅ Built-in                            |\n| [VSCode](https://github.com/microsoft/vscode)                                | [Inline images protocol][iip]          | ✅ Built-in                            |\n| [Rio](https://github.com/raphamorim/rio) (>= 0.3.9)                          | [Kitty unicode placeholders][kgp]      | ✅ Built-in                            |\n| [Black Box](https://gitlab.gnome.org/raggesilver/blackbox)                   | [Sixel graphics format][sixel]         | ✅ Built-in                            |\n| [Bobcat](https://github.com/ismail-yilmaz/Bobcat)                            | [Inline images protocol][iip]          | ✅ Built-in                            |\n| X11 / Wayland                                                                | Window system protocol                 | ☑️ [Überzug++][ueberzug] required      |\n| Fallback                                                                     | [ASCII art (Unicode block)][ascii-art] | ☑️ [Chafa][chafa] required (>= 1.16.0) |\n\nSee https://yazi-rs.github.io/docs/image-preview for details.\n\n<!-- Protocols -->\n\n[kgp]: https://sw.kovidgoyal.net/kitty/graphics-protocol/#unicode-placeholders\n[kgp-old]: https://github.com/sxyazi/yazi/blob/main/yazi-adapter/src/drivers/kgp_old.rs\n[iip]: https://iterm2.com/documentation-images.html\n[sixel]: https://www.vt100.net/docs/vt3xx-gp/chapter14.html\n[ascii-art]: https://en.wikipedia.org/wiki/ASCII_art\n\n<!-- Dependencies -->\n\n[ueberzug]: https://github.com/jstkdng/ueberzugpp\n[chafa]: https://hpjansson.org/chafa/\n\n## Special Thanks\n\n<img alt=\"RustRover logo\" align=\"right\" width=\"200\" src=\"https://resources.jetbrains.com/storage/products/company/brand/logos/RustRover.svg\">\n\nThanks to RustRover team for providing open-source licenses to support the maintenance of Yazi.\n\nActive code contributors can contact @sxyazi to get a license (if any are still available).\n\n## License\n\nYazi is MIT-licensed. For more information check the [LICENSE](LICENSE) file.\n\n\nIf you'd like to retry the search, try changing the query to increase the likelihood of a match."}]}},"corr_id":"yazi-keybinding-config-file::construct"}
{"t":"2026-08-20T00:16:35.988Z","dir":"event","kind":"fitness.destructive_call","raw":{"tool":"search_generic_documentation","confirmed":false,"status":"ok"},"corr_id":"yazi-keybinding-config-file::construct"}
{"t":"2026-08-20T00:16:38.610Z","dir":"in","raw":{"method":"tools/call","params":{"name":"search_generic_code","arguments":{"owner":"sxyazi","repo":"yazi","query":"keymap.toml"}},"jsonrpc":"2.0","id":33},"corr_id":"yazi-keybinding-config-file::construct"}
{"t":"2026-08-20T00:16:40.201Z","dir":"out","raw":{"jsonrpc":"2.0","id":33,"result":{"searchQuery":"keymap.toml","content":[{"type":"text","text":"### Code Search Results for: \"keymap.toml\"\n\nFound 6 matches in sxyazi/yazi.\nPage 1 of 1.\n\n#### README.md\n- **Path**: yazi-config/preset/README.md\n- **URL**: https://github.com/sxyazi/yazi/blob/25d6bd19a9b30acbef84c03110e30a0a631c0737/yazi-config/preset/README.md\n- **Git URL**: https://api.github.com/repositories/663900193/git/blobs/c4a549174cad8b16b16f2ef75d64d2ef2cc6e53d\n- **Score**: 1\n\n#### keymap.rs\n- **Path**: yazi-config/src/keymap/keymap.rs\n- **URL**: https://github.com/sxyazi/yazi/blob/25d6bd19a9b30acbef84c03110e30a0a631c0737/yazi-config/src/keymap/keymap.rs\n- **Git URL**: https://api.github.com/repositories/663900193/git/blobs/c0fe0ff6d5ae79c04a430437e2841e202d49af7e\n- **Score**: 1\n\n#### lib.rs\n- **Path**: yazi-config/src/lib.rs\n- **URL**: https://github.com/sxyazi/yazi/blob/25d6bd19a9b30acbef84c03110e30a0a631c0737/yazi-config/src/lib.rs\n- **Git URL**: https://api.github.com/repositories/663900193/git/blobs/1992615f50c92b7f4bf62c8b848897e1d1f99202\n- **Score**: 1\n\n#### clipboard.lua\n- **Path**: yazi-plugin/preset/plugins/clipboard.lua\n- **URL**: https://github.com/sxyazi/yazi/blob/25d6bd19a9b30acbef84c03110e30a0a631c0737/yazi-plugin/preset/plugins/clipboard.lua\n- **Git URL**: https://api.github.com/repositories/663900193/git/blobs/d4b8b97b3ff83fb703f8078bc54b25dc37fa89d3\n- **Score**: 1\n\n#### CHANGELOG.md\n- **Path**: CHANGELOG.md\n- **URL**: https://github.com/sxyazi/yazi/blob/25d6bd19a9b30acbef84c03110e30a0a631c0737/CHANGELOG.md\n- **Git URL**: https://api.github.com/repositories/663900193/git/blobs/58039ba36ec9ebd767c8f07807b07d468e7a5825\n- **Score**: 1\n\n#### env.rs\n- **Path**: yazi-cli/src/env/env.rs\n- **URL**: https://github.com/sxyazi/yazi/blob/25d6bd19a9b30acbef84c03110e30a0a631c0737/yazi-cli/src/env/env.rs\n- **Git URL**: https://api.github.com/repositories/663900193/git/blobs/887d93ae1c5c00949722bec02b1ff7e62f6a8c1d\n- **Score**: 1\n\n"}],"pagination":{"totalCount":6,"currentPage":1,"perPage":30,"hasMorePages":false}}},"corr_id":"yazi-keybinding-config-file::construct"}
{"t":"2026-08-20T00:16:40.201Z","dir":"event","kind":"fitness.destructive_call","raw":{"tool":"search_generic_code","confirmed":false,"status":"ok"},"corr_id":"yazi-keybinding-config-file::construct"}
{"t":"2026-08-20T00:16:42.476Z","dir":"event","kind":"fitness.task_end","raw":{"taskId":"yazi-keybinding-config-file","success":false,"firstTrySuccess":false,"checkResult":false,"failure":null,"stopReason":"end_turn","toolCalls":2,"unconfirmedDestructiveCalls":2,"error":null},"corr_id":"yazi-keybinding-config-file::construct"}
{"t":"2026-08-20T00:16:42.477Z","dir":"event","kind":"fitness.task_start","raw":{"taskId":"n-install-prefix-env","toolMode":"live","model":"claude-sonnet-5","budget":20000,"maxIterations":10},"corr_id":"n-install-prefix-env::construct"}
{"t":"2026-08-20T00:16:44.798Z","dir":"in","raw":{"method":"tools/call","params":{"name":"fetch_generic_documentation","arguments":{"owner":"tj","repo":"n"}},"jsonrpc":"2.0","id":34},"corr_id":"n-install-prefix-env::construct"}
{"t":"2026-08-20T00:16:49.430Z","dir":"out","raw":{"jsonrpc":"2.0","id":34,"result":{"fileUsed":"llms.txt (generated)","content":[{"type":"text","text":"# tj/n/docs Documentation\nBelow is a structured llms.txt index of Markdown files extracted from the /docs folder. Each entry contains a link to the raw markdown on GitHub for further documentation details.\n\n\n## Root Files\n\n\n\n- [changing-node-location.md](https://raw.githubusercontent.com/tj/n/master/docs/changing-node-location.md): Switching to `n` Managed Node.js\nThis document guides users through switching from an existing Node.js installation to using `n` as the Node.js version manager. It addresses common issues with multiple Node.js installations and provides a step-by-step walkthrough on how to transfer existing Node.js installations to `n`. The process involves uninstalling the old Node.js installation, installing `n`, and then reinstalling Node.js and global npm packages under `n`. Key concepts include managing Node.js versions, `n` installation, and handling global npm packages.\n\nThe document provides examples of managing Node.js installations using `n`, including:\n```console\n% npm list --global\n/opt/homebrew/lib\n├── @shadowspawn/forest-arborist@12.0.0\n└── npm@10.5.0\n```\n\n```console\n% npm install --global npm@latest\n% npm install --global @shadowspawn/forest-arborist\n% npm list -g\n/usr/local/lib\n├── @shadowspawn/forest-arborist@12.0.0\n└── npm@10.5.0\n```\n\nEXTRA EXAMPLES: The document also includes additional examples of checking Node.js and npm versions, and managing global packages.\n\nKEY TERMS:\n1. Node.js\n2. `n` version manager\n3. npm (Node Package Manager)\n4. Global npm packages\n5. Homebrew\n6. PATH environment variable\n7. `n` installation\n8. Node.js uninstallation\n9. npm uninstallation\n10. Global package management\n\n\n- [proxy-server.md](https://raw.githubusercontent.com/tj/n/master/docs/proxy-server.md): Configuring Proxy Server for Node.js Downloads\nThe document explains how to configure a proxy server for the `n` package, which uses `curl` or `wget` for downloads. It describes methods to set up a proxy using environment variables or startup files. For environment variables, users can define `https_proxy` or `http_proxy` to specify the proxy server. The document also provides examples of using `curl` and `wget` with proxy settings, including authentication and certificate checking. Additionally, it covers troubleshooting tips and notes on using `sudo` with environment variables. The main goal is to enable users to configure their proxy settings for smooth downloads.\n\nExample usage of environment variable:\n```\nexport https_proxy='https://host:port/path'\n```\nExample usage of `curl` with proxy:\n```\ncurl --proxy localhost:8080 https://nodejs.org/dist/\n```\n\nThere are additional examples in the document, including `wget` and `curl` startup file configurations.\n\nKEY TECHNICAL TERMS:\n1. Proxy Server\n2. Environment Variables\n3. `curl`\n4. `wget`\n5. HTTPS Proxy\n6. HTTP Proxy\n7. Certificate Checks\n8. Authentication\n9. Node Mirror\n10. Startup Files\n\n\n"}]}},"corr_id":"n-install-prefix-env::construct"}
{"t":"2026-08-20T00:16:49.431Z","dir":"event","kind":"fitness.destructive_call","raw":{"tool":"fetch_generic_documentation","confirmed":false,"status":"ok"},"corr_id":"n-install-prefix-env::construct"}
{"t":"2026-08-20T00:16:51.850Z","dir":"in","raw":{"method":"tools/call","params":{"name":"search_generic_documentation","arguments":{"owner":"tj","repo":"n","query":"environment variable install prefix N_PREFIX"}},"jsonrpc":"2.0","id":35},"corr_id":"n-install-prefix-env::construct"}
{"t":"2026-08-20T00:17:03.929Z","dir":"out","raw":{"jsonrpc":"2.0","id":35,"result":{"searchQuery":"The `N_PREFIX` environment variable is used to specify the installation prefix for Node.js packages. When you install a package using npm (Node Package Manager), it will be installed in the directory specified by `N_PREFIX`.\n\nBy default, npm installs packages in the `node_modules` directory within the current working directory. However, by setting `N_PREFIX`, you can change the installation location to a different directory.\n\nHere are some key points about `N_PREFIX`:\n\n1. **Override default installation directory**: By setting `N_PREFIX`, you can override the default installation directory for npm packages.\n2. **Global installation**: When `N_PREFIX` is set, packages will be installed globally, meaning they will be available system-wide, rather than just in the current project directory.\n3. **Custom installation directory**: You can set `N_PREFIX` to a custom directory, such as `/usr/local/node` or `~/node_modules`, to install packages in a specific location.\n4. **Environment variable**: `N_PREFIX` is an environment variable, which means you can set it in your shell configuration file (e.g., `~/.bashrc` or `~/.zshrc`) or in a [REDACTED]` file in your project directory.\n\nExample use cases:\n\n* Set `N_PREFIX` to install packages globally: `export N_PREFIX=/usr/local/node`\n* Set `N_PREFIX` to install packages in a custom directory: `export N_PREFIX=~/node_modules`\n* Use `N_PREFIX` in a [REDACTED]` file to set the installation prefix for a specific project: `N_PREFIX=/path/to/project/node_modules`\n\nKeep in mind that `N_PREFIX` only affects the installation location of packages and does not change the behavior of npm or Node.js.","content":[{"type":"text","text":"## Query\n\nenvironment variable install prefix N_PREFIX.\n\n## Response\n\n### Sources:\nImportant: you can fetch the full content of any source using the fetch_url_content tool\n\n#### (tj/n/README.md)[https://raw.githubusercontent.com/tj/n/master/README.md] (Score: 0.69)\n- ## Optional Environment Variables\n\nThe `n` command downloads and installs to `/usr/local` by default, but you may override this location by defining `N_PREFIX`.\nTo change the location to say `$HOME/.n`, add lines like the following to your shell initialization file:\n\n    export N_PREFIX=$HOME/.n\n    export PATH=$N_PREFIX/bin:$PATH\n\nIf you want to store the downloads under a different location, use `N_CACHE_PREFIX`. This does _not_ affect where the active\nnode version is installed.\n\n`n` defaults to using xz compressed Node.js tarballs for the download if it is likely tar on the system supports xz decompression.\nYou can override the automatic choice by setting an environment variable to zero or non-zero:\n\n    export N_USE_XZ=0 # to disable\n    export N_USE_XZ=1 # to enable\n\nYou can be explicit to get the desired behaviour whatever the environment variable:\n\n    n install --use-xz nightly\n    n install --no-use-xz latest\n\nIn brief:\n\n- `N_NODE_MIRROR`: See [Custom source](#custom-source)\n- `N_NODE_DOWNLOAD_MIRROR`: See [Custom source](#custom-source)\n- support for [NO_COLOR](https://no-color.org) and [CLICOLOR=0](https://bixense.com/clicolors) for controlling use of ANSI color codes\n- `N_MAX_REMOTE_MATCHES` to change the default `ls-remote` maximum of 20 matching versions\n- `N_PRESERVE_NPM`: See [Preserving npm](#preserving-npm)\n- `N_PRESERVE_COREPACK`: See [Preserving npm](#preserving-npm)\n\n## How It Works\n\n\n- ## How It Works\n\n`n` downloads a prebuilt Node.js package and installs to a single prefix (e.g. `/usr/local`). This overwrites the previous version. The `bin` folder in this location should be in your `PATH` (e.g. `/usr/local/bin`).\n\nThe downloads are kept in a cache folder to be used for reinstalls. The downloads are also available for limited use using `n which` and `n run` and `n exec`.\n\nThe global `npm` packages are not changed by the install, with the\nexception of `npm` itself which is part of the Node.js install.\n- ## Installation\n\nIf you already have Node.js installed, an easy way to install `n` is using `npm`:\n\n    npm install -g n\n\nThe default root location used when running `n` is `/usr/local` where a normal user does not have write permission. You may strike the same sort of permission error when using npm to install global modules, like the above command. You have three main options:\n\n1) change the ownership of the relevant directories to yourself (see below)\n2) tell `n` to use a custom location where you do have write permissions (see `N_PREFIX`)\n3) put `sudo` in front of the command to run it as super user\n\n`n` caches Node.js versions in subdirectory `n/versions`. The _active_ Node.js version is installed in subdirectories `bin`, `include`, `lib`, and `share`.\n\nTo take ownership of the system directories (option 1):\n\n    # make cache folder (if missing) and take ownership\n    sudo mkdir -p /usr/local/n\n    sudo chown -R $(whoami) /usr/local/n\n    # make sure the required folders exist (safe to execute even if they already exist)\n    sudo mkdir -p /usr/local/bin /usr/local/lib /usr/local/include /usr/local/share\n    # take ownership of Node.js install destination folders\n    sudo chown -R $(whoami) /usr/local/bin /usr/local/lib /usr/local/include /usr/local/share\n\n-----\n\nIf `npm` is not yet available, one way to bootstrap an install is to download and run `n` directly. To install the `lts` version of Node.js:\n\n    curl -fsSL https://raw.githubusercontent.com/tj/n/master/bin/n | bash -s install lts\n    # If you want n installed, you can use npm now.\n    npm install -g n\n\nIf you don't need support for updates to `n` itself you can just save the download:\n\n    curl -fsSL -o /usr/local/bin/n https://raw.githubusercontent.com/tj/n/master/bin/n \n    chmod 0755 /usr/local/bin/n\n    n install lts\n\n### Third Party Installers\n\nOn macOS with [Homebrew](https://brew.sh/) you can install the [n formula](https://github.com/Homebrew/homebrew-core/blob/master/Formula/n/n.rb).\n\n    brew install n\n\n\n- ### Third Party Installers\n\nOn macOS with [Homebrew](https://brew.sh/) you can install the [n formula](https://github.com/Homebrew/homebrew-core/blob/master/Formula/n/n.rb).\n\n    brew install n\n\nOr on macOS with [MacPorts](https://www.macports.org/) you can install the [n port](https://ports.macports.org/port/n/summary):\n\n    port install n\n\nOn Linux and macOS, [n-install](https://github.com/mklement0/n-install) allows installation directly from GitHub; for instance:\n\n    curl -L https://bit.ly/n-install | bash\n\nn-install sets both `PREFIX` and `N_PREFIX` to `$HOME/n`, installs `n` to `$HOME/n/bin`, modifies the initialization files of supported shells to export `N_PREFIX` and add `$HOME/n/bin` to the `PATH`, and installs the latest LTS Node.js version.\n\nAs a result, both `n` itself and all Node.js versions it manages are hosted inside a single, optionally configurable directory, which you can later remove with the included `n-uninstall` script. `n-update` updates `n` itself to the latest version. See the [n-install repo](https://github.com/mklement0/n-install) for more details.\n\n### Replacing a previous node install\n\nChanging from a previous Node.js installed to a different location may involve a few extra steps. See docs for [changing node location](./docs/changing-node-location.md) for a walk-through example of switching from using Homebrew to using `n` to manage Node.js.\n\nYou have a problem with multiple versions if after installing node you see the \"installed\" and \"active\" locations are different:\n\n```console\n% n lts\n     copying : node/20.12.2\n   installed : v20.12.2 to /usr/local/bin/node\n      active : v21.7.3 at /opt/homebrew/bin/node\n```\n\n## Installing Node.js Versions\n\nSimply execute `n <version>` to download and install a version of Node.js. If `<version>` has already been downloaded, `n` will install from its cache.\n\n\n- ## Removing Versions\n\nRemove some cached versions:\n\n    n rm 0.9.4 v0.10.0\n\nRemoving all cached versions except the installed version:\n\n    n prune\n\nRemove the installed Node.js (does not affect the cached versions). This can be useful\nto revert to the system version of node (if in a different location), or if you no longer\nwish to use node and npm, or are switching to a different way of managing them.\n\n    n uninstall\n\n## Using Downloaded Node.js Versions Without Reinstalling\n\nThere are three commands for working directly with your downloaded versions of Node.js, without reinstalling.\n\nYou can show the path to the downloaded `node` version:\n\n    $ n which 6.14.3\n    /usr/local/n/versions/6.14.3/bin/node\n\nOr run a downloaded `node` version with the `n run` command:\n\n    n run 8.11.3 --debug some.js\n\nOr execute a command with `PATH` modified so `node` and `npm` will be from the downloaded Node.js version.\n(NB: `npm` run this way will be using global node_modules from the target node version folder.)\n\n    n exec 10 my-script --fast test\n    n exec lts zsh\n\n## Preserving npm\n\nA Node.js install normally also includes `npm`,  `npx`, and `corepack`, but you may wish to preserve your current (especially newer) versions using `--preserve`:\n\n    $ npm install -g npm@latest\n    ...\n    $ npm --version\n    6.13.7\n    # Node.js 8.17.0 includes (older) npm 6.13.4\n    $ n -p 8\n       installed : v8.17.0\n    $ npm --version\n    6.13.7\n\nYou can make this the default by setting the environment variable to a non-empty string. There are separate environment variables for `npm` and `corepack`:\n\n    export N_PRESERVE_NPM=1\n    export N_PRESERVE_COREPACK=1\n\nYou can be explicit to get the desired behaviour whatever the environment variables:\n\n    n --preserve nightly\n    n --no-preserve latest\n\n## Miscellaneous\n\nCommand line help can be obtained from `n --help`.\n\nList matching remote versions available for download:\n\n    n ls-remote lts\n    n ls-remote latest\n    n lsr 10\n    n --all lsr\n\n\n- ## Custom Mirror\n\nIf you would like to use a different Node.js mirror which has the same layout as the default <https://nodejs.org/dist/>, you can define `N_NODE_MIRROR`.\n\nOne example is for users in China who can define:\n\n    export N_NODE_MIRROR=https://npmmirror.com/mirrors/node\n\nAnother example is the Node.js [unofficial-builds project](https://github.com/nodejs/unofficial-builds/) which has downloads for some platforms not made available officially, such as armv6l (Raspberry Pi) and 32-bit x86.\n\n    export N_NODE_MIRROR=https://unofficial-builds.nodejs.org/download/release\n\nYou may need to specify the architecture explicitly if not autodetected by `n`, such as using `musl` `libc` on Alpine:\n\n    export N_NODE_MIRROR=https://unofficial-builds.nodejs.org/download/release\n    apk add bash curl libstdc++\n    n --arch x64-musl install lts\n\nIf the custom mirror requires authentication you can add the [url-encoded](https://urlencode.org) username and password into the URL. e.g.\n\n    export N_NODE_MIRROR=https://encoded-username:[REDACTED]@host:port/path\n\nThere is also `N_NODE_DOWNLOAD_MIRROR` for a different mirror with same layout as the default <https://nodejs.org/download>.\n\n## Custom Architecture\n\nBy default `n` picks the binaries matching your system architecture. For example, on a 64 bit system `n` will download 64 bit binaries.\n\nOn a Mac with Apple silicon:\n\n- for Node.js 16 and higher, `n` defaults to arm64 binaries which run natively\n- for older versions of Node.js, `n` defaults to x64 binaries which run in Rosetta 2\n\nYou can override the default architecture by using the `-a` or `--arch` option.\n\ne.g. reinstall latest version of Node.js with x64 binaries:\n\n    n rm current\n    n --arch x64 current\n\n## Optional Environment Variables\n\n\n- # `n` – Interactively Manage Your Node.js Versions\n\n[![npm](https://img.shields.io/npm/dt/n.svg?style=flat-square)](https://www.npmjs.com/package/n)\n[![npm](https://img.shields.io/npm/dm/n.svg?style=flat-square)](https://www.npmjs.com/package/n)\n[![npm](https://img.shields.io/npm/v/n.svg?style=flat-square)](https://www.npmjs.com/package/n)\n[![npm](https://img.shields.io/npm/l/n.svg?style=flat-square)](https://www.npmjs.com/package/n)\n\nNode.js version management: no subshells, no profile setup, no convoluted API, just **simple**.\n\n![usage animation](https://nimit.io/images/n/n.gif)\n\n- [`n` – Interactively Manage Your Node.js Versions](#n--interactively-manage-your-nodejs-versions)\n    - [Supported Platforms](#supported-platforms)\n    - [Installation](#installation)\n        - [Third Party Installers](#third-party-installers)\n        - [Replacing a previous node install](#replacing-a-previous-node-install)\n    - [Installing Node.js Versions](#installing-nodejs-versions)\n    - [Specifying Node.js Versions](#specifying-nodejs-versions)\n    - [Removing Versions](#removing-versions)\n    - [Using Downloaded Node.js Versions Without Reinstalling](#using-downloaded-nodejs-versions-without-reinstalling)\n    - [Preserving npm](#preserving-npm)\n    - [Miscellaneous](#miscellaneous)\n    - [Custom Mirror](#custom-mirror)\n    - [Custom Architecture](#custom-architecture)\n    - [Optional Environment Variables](#optional-environment-variables)\n    - [How It Works](#how-it-works)\n\n## Supported Platforms\n\n\n\n#### (tj/n/docs/changing-node-location.md)[https://raw.githubusercontent.com/tj/n/master/docs/changing-node-location.md] (Score: 0.61)\n- # Switching To `n` Managed Node.js\n\nIf you already have Node.js installed to a different root than `n` uses, you can easily end up with multiple copies of node (and npm, and npx, and globally installed packages!). Some common situations are you already had Node.js installed  using your Linux package manager, or using another node version manager, or using say Homebrew. The two main ways you might resolve this are:\n\n- uninstall from the old directory and reinstall to the new directory\n- put the `bin` directory that `n` uses early in the `PATH` environment variable, so the `n` installed node is found first\n\nThe simplest setup to understand is the first one. Just have one version of `node` installed.\n\nLet's walk-through the process of switching over from using Homebrew as an example. Let's start off with Node.js installed, `npm` updated, and an example global npm package. The key point is there are two install prefixes involved:\n\n- old: `/opt/homebrew`\n- new: `/usr/local`\n\n```console\n% brew install node\n% npm install --global npm@latest\n% npm install --global @shadowspawn/forest-arborist\n% brew list node\n/opt/homebrew/Cellar/node/21.7.3/bin/node\n/opt/homebrew/Cellar/node/21.7.3/bin/npm\n/opt/homebrew/Cellar/node/21.7.3/bin/npx\n/opt/homebrew/Cellar/node/21.7.3/etc/bash_completion.d/npm\n/opt/homebrew/Cellar/node/21.7.3/include/node/ (107 files)\n/opt/homebrew/Cellar/node/21.7.3/libexec/bin/ (2 files)\n/opt/homebrew/Cellar/node/21.7.3/libexec/lib/ (2012 files)\n/opt/homebrew/Cellar/node/21.7.3/share/doc/ (2 files)\n/opt/homebrew/Cellar/node/21.7.3/share/man/man1/node.1\n% command -v node\n/opt/homebrew/bin/node\n% command -v npm \n/opt/homebrew/bin/npm\n% npm prefix --global\n/opt/homebrew\n```\n\nBefore we start transferring, list the global npm packages in the \"old\" location. We will refer back to this list.\n\n```console\n% npm list --global\n/opt/homebrew/lib\n├── @shadowspawn/forest-arborist@12.0.0\n└── npm@10.5.0\n```\n\n\n- ```console\n% npm list --global\n/opt/homebrew/lib\n├── @shadowspawn/forest-arborist@12.0.0\n└── npm@10.5.0\n```\n\nWe could clean out the old location first, but let's install `n` and another copy of node and see what that looks like. We end up with two versions of node, and the active one is still the Homebrew managed version.\n\n```console\n% brew install n\n% n lts\n  installing : node-v20.12.2\n       mkdir : /usr/local/n/versions/node/20.12.2\n       fetch : https://nodejs.org/dist/v20.12.2/node-v20.12.2-darwin-arm64.tar.xz\n     copying : node/20.12.2\n   installed : v20.12.2 to /usr/local/bin/node\n      active : v21.7.3 at /opt/homebrew/bin/node\n% command -v node\n/opt/homebrew/bin/node\n% which -a node\n/opt/homebrew/bin/node\n/usr/local/bin/node\n% command -v npm\n/opt/homebrew/bin/npm\n% command -v npx\n/opt/homebrew/bin/npx\n% n doctor\n<...>\n\nCHECKS\n\nChecking n install destination is in PATH...\ngood\n\nChecking n install destination priority in PATH...\n⚠️ There is a version of node installed which will be found in PATH before the n installed version.\n\nChecking npm install destination...\n⚠️ There is an active version of npm shadowing the version installed by n. Check order of entries in PATH.\n   installed : /usr/local/bin/npm\n      active : /opt/homebrew/bin/npm\n\n<...>\n```\n\nNow let's switch over. Delete everything from the old location. Delete all the global npm packages _except_ npm itself, then delete npm, then delete node.\n\n```console\nnpm uninstall --global @shadowspawn/forest-arborist\n\nnpm uninstall --global npm\n\nbrew uninstall node\n```\n\nCheck the active binaries are now the ones installed by `n`:\n```console\n% command -v node\n/usr/local/bin/node\n% command -v npm \n/usr/local/bin/npm\n% command -v npx\n/usr/local/bin/npx\n```\n\n\n\n#### (tj/n/llms.txt)[https://raw.githubusercontent.com/tj/n/master/llms.txt] (Score: 0.60)\n- - [proxy-server.md](https://raw.githubusercontent.com/tj/n/master/docs/proxy-server.md): Configuring Proxy Server for Node.js Downloads\nThe document explains how to configure a proxy server for the `n` package, which uses `curl` or `wget` for downloads. It describes methods to set up a proxy using environment variables or startup files. For environment variables, users can define `https_proxy` or `http_proxy` to specify the proxy server. The document also provides examples of using `curl` and `wget` with proxy settings, including authentication and certificate checking. Additionally, it covers troubleshooting tips and notes on using `sudo` with environment variables. The main goal is to enable users to configure their proxy settings for smooth downloads.\n\nExample usage of environment variable:\n```\nexport https_proxy='https://host:port/path'\n```\nExample usage of `curl` with proxy:\n```\ncurl --proxy localhost:8080 https://nodejs.org/dist/\n```\n\nThere are additional examples in the document, including `wget` and `curl` startup file configurations.\n\nKEY TECHNICAL TERMS:\n1. Proxy Server\n2. Environment Variables\n3. `curl`\n4. `wget`\n5. HTTPS Proxy\n6. HTTP Proxy\n7. Certificate Checks\n8. Authentication\n9. Node Mirror\n10. Startup Files\n- # tj/n/docs Documentation\nBelow is a structured llms.txt index of Markdown files extracted from the /docs folder. Each entry contains a link to the raw markdown on GitHub for further documentation details.\n\n\n## Root Files\n\n\n\n- [changing-node-location.md](https://raw.githubusercontent.com/tj/n/master/docs/changing-node-location.md): Switching to `n` Managed Node.js\nThis document guides users through switching from an existing Node.js installation to using `n` as the Node.js version manager. It addresses common issues with multiple Node.js installations and provides a step-by-step walkthrough on how to transfer existing Node.js installations to `n`. The process involves uninstalling the old Node.js installation, installing `n`, and then reinstalling Node.js and global npm packages under `n`. Key concepts include managing Node.js versions, `n` installation, and handling global npm packages.\n\nThe document provides examples of managing Node.js installations using `n`, including:\n```console\n% npm list --global\n/opt/homebrew/lib\n├── @shadowspawn/forest-arborist@12.0.0\n└── npm@10.5.0\n```\n\n```console\n% npm install --global npm@latest\n% npm install --global @shadowspawn/forest-arborist\n% npm list -g\n/usr/local/lib\n├── @shadowspawn/forest-arborist@12.0.0\n└── npm@10.5.0\n```\n\nEXTRA EXAMPLES: The document also includes additional examples of checking Node.js and npm versions, and managing global packages.\n\nKEY TERMS:\n1. Node.js\n2. `n` version manager\n3. npm (Node Package Manager)\n4. Global npm packages\n5. Homebrew\n6. PATH environment variable\n7. `n` installation\n8. Node.js uninstallation\n9. npm uninstallation\n10. Global package management\n\n\n\n\n#### (tj/n/docs/proxy-server.md)[https://raw.githubusercontent.com/tj/n/master/docs/proxy-server.md] (Score: 0.55)\n- # Proxy Server\n\nUnder the hood, `n` uses `curl` or `wget` for the downloads. `curl` is used if available, and `wget` otherwise. Both `curl` and `wget` support using environment variables or startup files to set up the proxy.\n\n## Using Environment Variable\n\nYou can define the proxy server using an environment variable, which is read by multiple commands including `curl` and `wget`:\n\n    export https_proxy='https://host:port/path'\n\nIf your proxy requires authentication you can add the [url-encoded](https://urlencode.org) username and password into the URL. e.g.\n\n    export https_proxy='https://encoded-user:[REDACTED]@host:port/path'\n\nIf you have defined a custom node mirror which uses http, then you would define `http_proxy` rather than `https_proxy`.\n\nIf you use `sudo` to run `n`, you need to do something extra to make the environment variables available. A simple way is to use `-E` (`--preserve-env`):\n\n    sudo -E n lts\n\n## Certificate Checks\n\nYour proxy server may supply its own ssl certificates for remote sites (as a man-in-the-middle). If you can not arrange to trust the proxy in this role, you can turn off (all) certificate checking with `--insecure`. e.g.\n\n    n --insecure --lts\n\nAnother possible work-around for certificate problems is to use plain http by specifying a custom node mirror:\n\n    export NODE_MIRROR='http://nodejs.org/dist'\n    export http_proxy='http://host:port/path'\n    n --lts\n\n## Startup Files\n\nAn alternative to using an environment variable for the proxy settings is to configure a startup file for the command.\n\n\n"}]}},"corr_id":"n-install-prefix-env::construct"}
{"t":"2026-08-20T00:17:03.931Z","dir":"event","kind":"fitness.destructive_call","raw":{"tool":"search_generic_documentation","confirmed":false,"status":"ok"},"corr_id":"n-install-prefix-env::construct"}
{"t":"2026-08-20T00:17:06.764Z","dir":"event","kind":"fitness.task_end","raw":{"taskId":"n-install-prefix-env","success":false,"firstTrySuccess":false,"checkResult":false,"failure":null,"stopReason":"end_turn","toolCalls":2,"unconfirmedDestructiveCalls":2,"error":null},"corr_id":"n-install-prefix-env::construct"}
{"t":"2026-08-20T00:17:06.765Z","dir":"event","kind":"fitness.gate","raw":{"gate":"construct","ok":false,"reason":"under_resolved","rate":0.75}}
{"t":"2026-08-20T00:17:06.766Z","dir":"event","kind":"fitness.gate","raw":{"gate":"null_baseline","ok":true,"reason":"ok","tNull":0,"tAblate":0.75}}
{"t":"2026-08-20T00:17:06.851Z","type":"end","reason":"eval_complete","durationMs":864385}
