{"owner":"Automattic","repo":"harper","hasSkills":true,"totalSkillsCount":82,"totalTokensCount":42536,"categories":["anthropic-skill","plugin-manifest","project-spec","root-instruction"],"hasMcp":false,"mcpConfig":null,"found":["packages/web/package.json","packages/wordpress-plugin/package.json","packages/web/demo_wp_blueprint.json","packages/web/README.md","packages/wordpress-plugin/README.md","ARCHITECTURE.md","AGENTS.md","packages/web/tsconfig.json","packages/vscode-plugin/README.md","packages/vscode-plugin/tsconfig.json","packages/vscode-plugin/development-guide.md","packages/vscode-plugin/package.json","packages/obsidian-plugin/package.json","packages/obsidian-plugin/README.md","packages/lint-framework/package.json","packages/lint-framework/README.md","packages/lint-framework/tsconfig.json","packages/harper-editor/package.json","packages/harper-editor/tsconfig.json","packages/harper.js/api-extractor.json","packages/harper.js/package.json","packages/harper.js/README.md","packages/harper.js/tsconfig.json","packages/components/package.json","packages/components/tsconfig.json","packages/chrome-plugin/CHANGELOG.md","packages/chrome-plugin/package.json","packages/chrome-plugin/tsconfig.json","packages/chrome-plugin/tsconfig.node.json","packages/vscode-plugin/.vscode/extensions.json","packages/vscode-plugin/.vscode/launch.json","packages/vscode-plugin/.vscode/settings.json","packages/vscode-plugin/.vscode/tasks.json","packages/wordpress-plugin/src/harper/block.json","packages/web/drizzle/meta/_journal.json","packages/web/drizzle/meta/0000_snapshot.json","packages/web/drizzle/meta/0001_snapshot.json","packages/web/drizzle/meta/0002_snapshot.json","packages/web/drizzle/meta/0003_snapshot.json","packages/lint-framework/src/assets/hints.json","packages/harper.js/examples/raw-web/README.md","packages/harper.js/examples/commonjs-simple/package.json","packages/harper.js/examples/commonjs-simple/README.md","packages/vscode-plugin/src/tests/fixtures/integration.md","packages/web/src/routes/docs/weir/+page.md","packages/web/src/routes/docs/about/+page.md","packages/vscode-plugin/src/tests/fixtures/.vscode/settings.json","packages/web/src/routes/docs/integrations/zed/+page.md","packages/web/src/routes/docs/integrations/wordpress/+page.md","packages/web/src/routes/docs/integrations/visual-studio-code/+page.md","packages/web/src/routes/docs/integrations/sublime-text/+page.md","packages/web/src/routes/docs/integrations/obsidian/+page.md","packages/web/src/routes/docs/integrations/neovim/+page.md","packages/web/src/routes/docs/integrations/language-server/+page.md","packages/web/src/routes/docs/integrations/helix/+page.md","packages/web/src/routes/docs/integrations/firefox-extension/+page.md","packages/web/src/routes/docs/integrations/emacs/+page.md","packages/web/src/routes/docs/integrations/chrome-extension/+page.md","packages/web/src/routes/docs/harperjs/spans/+page.md","packages/web/src/routes/docs/harperjs/node/+page.md","packages/web/src/routes/docs/harperjs/linting/+page.md","packages/web/src/routes/docs/harperjs/introduction/+page.md","packages/web/src/routes/docs/harperjs/configurerules/+page.md","packages/web/src/routes/docs/harperjs/CDN/+page.md","packages/web/src/routes/docs/contributors/wordpress/+page.md","packages/web/src/routes/docs/contributors/website/+page.md","packages/web/src/routes/docs/contributors/visual-studio-code/+page.md","packages/web/src/routes/docs/contributors/testing-strategy/+page.md","packages/web/src/routes/docs/contributors/review/+page.md","packages/web/src/routes/docs/contributors/obsidian/+page.md","packages/web/src/routes/docs/contributors/local-stats/+page.md","packages/web/src/routes/docs/contributors/introduction/+page.md","packages/web/src/routes/docs/contributors/faq/+page.md","packages/web/src/routes/docs/contributors/environment/+page.md","packages/web/src/routes/docs/contributors/dictionary/+page.md","packages/web/src/routes/docs/contributors/desktop/+page.md","packages/web/src/routes/docs/contributors/committing/+page.md","packages/web/src/routes/docs/contributors/committer/+page.md","packages/web/src/routes/docs/contributors/chrome-extension/+page.md","packages/web/src/routes/docs/contributors/brill/+page.md","packages/web/src/routes/docs/contributors/author-a-rule/+page.md","packages/web/src/routes/docs/contributors/architecture/+page.md"],"skills":{"packages/web/package.json":"{\n\t\"name\": \"harper-web\",\n\t\"version\": \"0.0.1\",\n\t\"private\": true,\n\t\"scripts\": {\n\t\t\"dev\": \"vite dev\",\n\t\t\"build\": \"vite build -l warn\",\n\t\t\"preview\": \"vite preview\",\n\t\t\"check\": \"svelte-kit sync && svelte-check --tsconfig ./tsconfig.json\",\n\t\t\"check:watch\": \"svelte-kit sync && svelte-check --tsconfig ./tsconfig.json --watch\",\n\t\t\"start\": \"node build\"\n\t},\n\t\"devDependencies\": {\n\t\t\"@sveltejs/adapter-node\": \"^5.2.12\",\n\t\t\"@sveltejs/kit\": \"^2.37.1\",\n\t\t\"@sveltejs/vite-plugin-svelte\": \"^5.0.3\",\n\t\t\"@tailwindcss/vite\": \"^4.1.4\",\n\t\t\"@types/reveal.js\": \"^5.0.3\",\n\t\t\"autoprefixer\": \"^10.4.21\",\n\t\t\"drizzle-kit\": \"^0.31.5\",\n\t\t\"flowbite\": \"^3.1.2\",\n\t\t\"svelte\": \"^5.15.0\",\n\t\t\"svelte-check\": \"^4.1.5\",\n\t\t\"tailwindcss\": \"^4.1.16\",\n\t\t\"tslib\": \"catalog:\",\n\t\t\"tsx\": \"^4.20.6\",\n\t\t\"typescript\": \"catalog:\",\n\t\t\"vite\": \"^6.1.0\",\n\t\t\"vite-plugin-top-level-await\": \"^1.5.0\",\n\t\t\"vite-plugin-wasm\": \"^3.4.1\"\n\t},\n\t\"type\": \"module\",\n\t\"dependencies\": {\n\t\t\"@docsearch/css\": \"^3.9.0\",\n\t\t\"@docsearch/js\": \"^3.9.0\",\n\t\t\"@sveltepress/theme-default\": \"^5.0.7\",\n\t\t\"@sveltepress/vite\": \"^1.1.5\",\n\t\t\"brace\": \"^0.11.1\",\n\t\t\"chart.js\": \"^4.4.8\",\n\t\t\"components\": \"workspace:*\",\n\t\t\"drizzle-orm\": \"^0.44.6\",\n\t\t\"drizzle-zod\": \"^0.8.3\",\n\t\t\"harper-editor\": \"workspace:*\",\n\t\t\"harper.js\": \"workspace:*\",\n\t\t\"lint-framework\": \"workspace:*\",\n\t\t\"lodash-es\": \"^4.17.21\",\n\t\t\"mysql2\": \"^3.15.2\",\n\t\t\"posthog-js\": \"^1.245.1\",\n\t\t\"reveal.js\": \"^5.1.0\",\n\t\t\"svelte-ace\": \"^1.0.21\",\n\t\t\"svelte-intersection-observer\": \"^1.0.0\",\n\t\t\"typed.js\": \"^2.1.0\",\n\t\t\"zod\": \"^4.1.12\"\n\t}\n}\n","packages/wordpress-plugin/package.json":"{\n\t\"name\": \"wordpress-plugin\",\n\t\"private\": true,\n\t\"version\": \"0.0.1\",\n\t\"description\": \"The grammar checker that respects your privacy.\",\n\t\"main\": \"build/index.js\",\n\t\"scripts\": {\n\t\t\"build\": \"wp-scripts build --webpack-copy-php\",\n\t\t\"check\": \"tsc --noEmit\",\n\t\t\"packages-update\": \"wp-scripts packages-update\",\n\t\t\"plugin-zip\": \"zip harper.zip build harper.php screenshot.png -r\",\n\t\t\"start\": \"wp-scripts start --webpack-copy-php\"\n\t},\n\t\"devDependencies\": {\n\t\t\"@types/lodash-es\": \"^4.17.12\",\n\t\t\"@types/react\": \"^18.3.0\",\n\t\t\"@types/react-dom\": \"^18.3.0\",\n\t\t\"@types/wordpress__edit-post\": \"^8.4.2\",\n\t\t\"@wordpress/scripts\": \"^30.9.0\",\n\t\t\"@wp-now/wp-now\": \"^0.1.74\",\n\t\t\"typescript\": \"catalog:\"\n\t},\n\t\"dependencies\": {\n\t\t\"@wordpress/components\": \"^29.2.0\",\n\t\t\"@wordpress/data\": \"^10.15.1\",\n\t\t\"@wordpress/edit-post\": \"^8.16.0\",\n\t\t\"@wordpress/editor\": \"^14.20.0\",\n\t\t\"@wordpress/plugins\": \"^7.20.0\",\n\t\t\"@wordpress/preferences-persistence\": \"^2.17.0\",\n\t\t\"harper.js\": \"workspace:*\",\n\t\t\"lodash-es\": \"^4.17.21\",\n\t\t\"react\": \"^18.0.0\",\n\t\t\"react-dom\": \"^18.0.0\"\n\t}\n}\n","packages/web/demo_wp_blueprint.json":"{\n\t\"$schema\": \"https://playground.wordpress.net/blueprint-schema.json\",\n\t\"preferredVersions\": {\n\t\t\"php\": \"8.0\",\n\t\t\"wp\": \"6.7\"\n\t},\n\t\"meta\": {\n\t\t\"title\": \"Demo of Harper for WordPress\",\n\t\t\"description\": \"Harper is a grammar checker for people who want to write, without any fuss.\",\n\t\t\"author\": \"elijah-potter\",\n\t\t\"categories\": []\n\t},\n\t\"landingPage\": \"/wp-admin/post.php?post=4&action=edit\",\n\t\"steps\": [\n\t\t{\n\t\t\t\"step\": \"login\",\n\t\t\t\"username\": \"admin\",\n\t\t\t\"password\": \"password\"\n\t\t},\n\t\t{\n\t\t\t\"step\": \"installPlugin\",\n\t\t\t\"pluginData\": {\n\t\t\t\t\"resource\": \"url\",\n\t\t\t\t\"url\": \"https://github.com/Automattic/harper/releases/download/v0.27.0/harper.zip\"\n\t\t\t},\n\t\t\t\"options\": {\n\t\t\t\t\"activate\": true\n\t\t\t}\n\t\t},\n\t\t{\n\t\t\t\"step\": \"installTheme\",\n\t\t\t\"themeData\": {\n\t\t\t\t\"resource\": \"wordpress.org/themes\",\n\t\t\t\t\"slug\": \"twentytwentyfour\"\n\t\t\t}\n\t\t},\n\t\t{\n\t\t\t\"step\": \"runPHP\",\n\t\t\t\"code\": \"<?php require_once 'wordpress/wp-load.php'; wp_insert_post(array('post_title' => 'Harper, in WordPress', 'post_content' => '<!-- wp:paragraph --><p><strong>Click on the Harper button on the top right of this page to get started.</strong></p><!-- /wp:paragraph --><!-- wp:paragraph --><p>Writing on the web can be scary. Theres a lot of competition for traffic and even a small grammatical mstake can be costly to your reputation and search rankings.</p><!-- /wp:paragraph --><!-- wp:paragraph --><p>That\\\\'s why we created Harper: an plugin to save you the embarassment. it can fix typos, serial commas and overall just make your life better.</p><!-- /wp:paragraph --><!-- wp:paragraph --><p>All that while respecting your privacy. You data should never leave Wordpress until you hit \\\"Publish\\\".</p><!-- /wp:paragraph -->'));\"\n\t\t}\n\t]\n}\n","packages/web/README.md":"# Web\n\nThis directory contains the source code for [https://writewithharper.com].\n\n## Building\n\nIn order to build the site, you must first compile `harper-wasm` with:\n\n```bash\nwasm-pack build --target bundler\n```\n","packages/wordpress-plugin/README.md":"# Harper for WordPress\n\n![The early prototype version of the plugin](./screenshot.png)\n\nThis repository contains the WordPress plugin for [Harper](https://writewithharper.com).\nIt is a work-in-progress. Here be dragons!\n\n## Contributing\n\nRefer to [the online documentation](https://writewithharper.com/docs/contributors/wordpress) for instructions to contribute to the plugin.\n","ARCHITECTURE.md":"# Harper's Architecture\n\nThis document has been moved to the [online documentation](https://writewithharper.com/docs/contributors/architecture).\n","AGENTS.md":"# Harper Docs Map for Agents\n\nThis repository’s documentation site is powered by Vite + SvelteKit + SveltePress.\n\nUse `packages/web/vite.config.ts` as the source of truth for documentation scope:\n- Sidebar and important doc routes are defined in `packages/web/vite.config.ts`.\n- Route `/docs/...` maps to `packages/web/src/routes/docs/...`.\n- Most docs are in `+page.md`; some are `+page.svelte` or route helpers.\n\nIf you are working on the Harper repository itself, please pay special attention to the `contributors/*` pages.\nImportantly, all the tools available in this repository are available via `just`. To learn more, run `just --list`.\nWhenever agents are done making changes, they should run `just format` before handing work back to the user.\nIf `just format` fails, you can use `just setup` to prepare the relevant dependencies.\n\nHuman coders should periodically review this file and manually migrate stable, human-facing guidance into the real documentation website under `packages/web` so it is available outside agent workflows.\nAgents should remind humans of this when possible.\n\n## Read First\n\n1. `packages/web/vite.config.ts`: Sidebar source of truth and canonical map of important docs routes.\n2. `packages/web/src/routes/docs/about/+page.md`: High-level product overview, privacy model, versioning policy, and ecosystem context.\n3. `packages/web/src/routes/docs/weir/+page.md`: Weir rule language reference with syntax, expression types, and examples.\n4. `packages/web/src/routes/docs/rules/+page.svelte`: Live/generated rule catalog (rule names, defaults, and descriptions).\n5. `packages/web/src/routes/docs/contributors/introduction/+page.md`: Entry point for contributors and links to deeper contributor docs.\n6. `./AGENT_POLICY.md`: Harper's policy on code generated by large language models. Agents MUST read this before making ANY changes.\n\n## Core Documentation Directories\n\n- `packages/web/src/routes/docs/about`\n- `packages/web/src/routes/docs/weir`\n- `packages/web/src/routes/docs/rules`\n- `packages/web/src/routes/docs/integrations`\n- `packages/web/src/routes/docs/harperjs`\n- `packages/web/src/routes/docs/contributors`\n\n## Route Prefix to File Prefix\n\n- `/docs/about` -> `packages/web/src/routes/docs/about/+page.md`\n- `/docs/weir` -> `packages/web/src/routes/docs/weir/+page.md`\n- `/docs/rules` -> `packages/web/src/routes/docs/rules/+page.svelte`\n- `/docs/integrations/*` -> `packages/web/src/routes/docs/integrations/*/+page.md`\n- `/docs/harperjs/*` -> `packages/web/src/routes/docs/harperjs/*/+page.md`\n- `/docs/contributors/*` -> `packages/web/src/routes/docs/contributors/*/+page.md`\n\n## Files Listed in the Sidebar (Local)\n\n- `packages/web/src/routes/docs/about/+page.md`: High-level product overview, privacy model, versioning policy, and ecosystem context.\n- `packages/web/src/routes/docs/weir/+page.md`: Weir rule language reference with syntax, expression types, and examples. Very important if you're asked to write a Weir rule.\n- `packages/web/src/routes/docs/rules/+page.svelte`: Live/generated rule catalog (rule names, defaults, and descriptions).\n- `packages/web/src/routes/docs/integrations/obsidian/+page.md`: Obsidian plugin overview, privacy/value comparison, installation, and support links.\n- `packages/web/src/routes/docs/integrations/chrome-extension/+page.md`: End-user Chrome extension overview and install link.\n- `packages/web/src/routes/docs/integrations/firefox-extension/+page.md`: End-user Firefox extension overview and install link.\n- `packages/web/src/routes/docs/integrations/wordpress/+page.md`: Current WordPress guidance, including migration recommendation to Chrome extension and legacy plugin status.\n- `packages/web/src/routes/docs/integrations/language-server/+page.md`: `harper-ls` install methods, dictionaries, code actions, ignore comments, and full configuration reference.\n- `packages/web/src/routes/docs/integrations/visual-studio-code/+page.md`: VS Code extension install, command list, and settings reference.\n- `packages/web/src/routes/docs/integrations/neovim/+page.md`: Neovim setup using `harper-ls`, plus optional and common config tweaks.\n- `packages/web/src/routes/docs/integrations/helix/+page.md`: Helix setup using `harper-ls`, plus optional and common config tweaks.\n- `packages/web/src/routes/docs/integrations/emacs/+page.md`: Emacs setup using `harper-ls`, plus optional and common config tweaks.\n- `packages/web/src/routes/docs/integrations/zed/+page.md`: Zed extension entry point and link to canonical extension README.\n- `packages/web/src/routes/docs/integrations/sublime-text/+page.md`: Sublime Text setup with `harper-ls` and LSP package configuration.\n- `packages/web/src/routes/docs/harperjs/introduction/+page.md`: `harper.js` mission, package overview, and installation starting point.\n- `packages/web/src/routes/docs/harperjs/linting/+page.md`: Core `harper.js` lint workflow and linter usage patterns.\n- `packages/web/src/routes/docs/harperjs/spans/+page.md`: Explains span objects and how to use them to locate/handle lint ranges.\n- `packages/web/src/routes/docs/harperjs/configurerules/+page.md`: How to programmatically read and set `LintConfig` to enable/disable rules.\n- `packages/web/src/routes/docs/harperjs/node/+page.md`: Node.js-specific usage notes, especially `LocalLinter` vs `WorkerLinter`.\n- `packages/web/src/routes/docs/harperjs/CDN/+page.md`: Browser/CDN usage via unpkg and ESM import patterns.\n- `packages/web/src/routes/docs/contributors/introduction/+page.md`: Contributor onboarding overview and links to architecture/testing/rule-authoring docs.\n- `packages/web/src/routes/docs/contributors/environment/+page.md`: Local development environment setup across Rust, Node/pnpm, and optional Nix shell.\n- `packages/web/src/routes/docs/contributors/committing/+page.md`: Commit message conventions and commit hygiene requirements.\n- `packages/web/src/routes/docs/contributors/architecture/+page.md`: System architecture and roles of core components like `harper-core`, `harper-ls`, and `harper.js`.\n- `packages/web/src/routes/docs/contributors/dictionary/+page.md`: Process for adding or updating curated dictionary entries.\n- `packages/web/src/routes/docs/contributors/testing-strategy/+page.md`: Harper's risk-driven testing strategy, covering automated checks, production feedback, manual testing, and testability.\n- `packages/web/src/routes/docs/contributors/author-a-rule/+page.md`: Step-by-step workflow for implementing and testing new grammar rules.\n- `packages/web/src/routes/docs/contributors/visual-studio-code/+page.md`: How to run, debug, test, and package the VS Code extension locally.\n- `packages/web/src/routes/docs/contributors/chrome-extension/+page.md`: Internal architecture and local development notes for the browser extensions.\n- `packages/web/src/routes/docs/contributors/desktop/+page.md`: Placeholder for Harper Desktop contributor documentation.\n- `packages/web/src/routes/docs/contributors/website/+page.md`: Local development, preview, and validation for writewithharper.com (SvelteKit/SveltePress).\n- `packages/web/src/routes/docs/contributors/wordpress/+page.md`: How to build and run the WordPress plugin locally.\n- `packages/web/src/routes/docs/contributors/obsidian/+page.md`: Obsidian-plugin contributor workflow and plugin-specific constraints.\n- `packages/web/src/routes/docs/contributors/review/+page.md`: PR reviewer playbook, including ways to fetch artifacts and test patches locally.\n- `packages/web/src/routes/docs/contributors/local-stats/+page.md`: Local stats logging model, `stats.txt` format, locations, and privacy behavior.\n- `packages/web/src/routes/docs/contributors/brill/+page.md`: Brief explanation of Harper’s Brill-tagging approach and further reading link.\n- `packages/web/src/routes/docs/contributors/faq/+page.md`: Contributor FAQ for conceptual distinctions (for example `Linter` vs `PatternLinter`).\n\n## Documentation Route Helpers (Non-`+page.md`)\n\n- `packages/web/src/routes/docs/about/+page.ts`: Route behavior helper (`ssr = false`) for the About page.\n- `packages/web/src/routes/docs/harperjs/CDN/example/+server.ts`: Serves the HTML example used by the `harper.js` CDN documentation page.\n\n## External Sidebar Targets (No Local Source File)\n\n- `https://docs.rs/harper-core/latest/harper_core/`\n- `/docs/harperjs/ref/index.html` (generated API reference target)\n\n## Projects Contained in This Repository\n\n- `harper-core`: The core grammar checking engine. This is a dependency to pretty much everything related to Harper.\n- `harper-ls`: A Language Server compatible with a number of text editors, including Neovim, Zed, and Helix. See above linked documentation for more details.\n- `harper-cli`: A command-line binary for debugging Harper's core engine and markup language support.\n- `harper-comments`: Provides parsers for a number of programming languages to support linting their comments.\n- `harper-wasm`: The WebAssembly build target that powers browser and JavaScript integrations such as `harper.js`.\n- `packages/lint-framework`: A package containing the tooling necessary to read/write/highlight text on the web for the purpose of linting.\n- `packages/components`: Shared Svelte component package used by web-facing packages.\n- `packages/harper-editor`: Shared Svelte editor package used by web-facing packages and Harper Desktop.\n- `packages/web`: The Harper website, including documentation and a live demo that uses the `lint-framework`.\n- `packages/harper.js`: The JavaScript package that uses `harper-wasm` to lint text from websites or Node.js processes.\n- `packages/chrome-plugin`: The Harper Chrome Extension - uses the `lint-framework`. Also support Firefox.\n- `packages/obsidian-plugin`\n- `packages/wordpress-plugin`\n- `packages/vscode-plugin`: The Harper Visual Studio Code plugin. Uses `harper-ls`.\n- `harper-desktop`: The Harper Desktop app. It is a Tauri v2 + SvelteKit SPA with an offline editor, settings UI, tray/service control, and native overlay highlighter.\n\nThere are of course projects in this repository not listed above. If relevant, feel free to poke around.\n\n## Harper Desktop\n\nRead the [Desktop contributor documentation](packages/web/src/routes/docs/contributors/desktop/+page.md) for the app's architecture and its relationship to the Cargo workspace.\n\n### Commands\n\n- Use `pnpm` for frontend packages; `harper-desktop/package.json` pins `pnpm@10.10.0`.\n- Dev app: `just dev-desktop` from repo root. It builds shared web packages, runs `cargo tauri dev`, and Tauri then runs `pnpm dev` on port `1420`.\n- Start the highlighter process directly: `just dev-desktop-highlighter` from repo root.\n- Frontend checks: `pnpm check` from `harper-desktop`.\n- Frontend build only: `pnpm build` from `harper-desktop`.\n- Full desktop checks: `just check-desktop` from repo root.\n- Bundle builds match CI: `just build-desktop-linux` or `just build-desktop-macos`.\n- `just build-desktop-linux` builds deb/rpm/appimage bundles.\n- `just build-desktop-macos` builds app/dmg bundles.\n\n### Architecture\n\n- It is a SvelteKit SPA inside Tauri v2.\n- SSR is disabled in `harper-desktop/src/routes/+layout.ts`.\n- `harper-desktop/svelte.config.js` uses `adapter-static` with `fallback: \"index.html\"`.\n- Main Rust entrypoint is `harper-desktop/src-tauri/src/main.rs`, which calls `harper_desktop_lib::run()`.\n- CLI behavior is in `harper-desktop/src-tauri/src/lib.rs`: no subcommand runs the normal Tauri app; `highlighter` runs the native overlay highlighter.\n- Tauri config lives in `harper-desktop/src-tauri/tauri.conf.json`.\n- Tauri capabilities live in `harper-desktop/src-tauri/capabilities/default.json`.\n- The main Svelte route is `harper-desktop/src/routes/+page.svelte`; it switches between the settings UI and editor UI.\n- The editor UI lives in `harper-desktop/src/lib/EditorView.svelte` and uses workspace dependencies on `harper.js` and `harper-editor`.\n- The settings UI lives under `harper-desktop/src/lib/settings/`.\n- Rust uses local workspace dependencies from `harper-desktop/src-tauri/Cargo.toml`, including `harper-core` and `harper-dictionary-wordlist`.\n- The Tauri app starts a tray/menu-bar controlled highlighter service on launch and can open editor/settings windows from the tray.\n- Editor and settings windows hide on close instead of exiting; quit is handled through the tray menu.\n\n### Highlighter Architecture\n\n- The highlighter is Rust/egui/winit code under `harper-desktop/src-tauri/src/highlighter/`.\n- `Highlighter` is the public entry point for the overlay system.\n- `Window` owns native window/GPU plumbing.\n- `WindowManager` owns the winit event loop, monitor windows, cursor hit-testing, and popup selection.\n- `RenderState` owns highlight rendering, popup drawing, markdown rendering cache, and popup action dispatch.\n- `RenderState` uses `ActionableLint` values from `harper-desktop/src-tauri/src/rect.rs`.\n- `ActionableLint` stores lint geometry, the Harper `Lint`, and source text needed for suggestion application and popup actions.\n- Suggestion popup actions currently include close, apply suggestion, ignore lint, add to dictionary, disable rule, and refresh config.\n- Popup hover text is implemented in `RenderState` button helpers.\n- The highlighter read interval is set in `run_highlighter()` with `with_read_interval(Duration::from_millis(16))`.\n\n### OS Integration\n\n- OS integration is behind `harper-desktop/src-tauri/src/os_broker.rs`.\n- macOS uses `harper-desktop/src-tauri/src/mac_broker.rs`.\n- non-macOS currently uses `NoopBroker`.\n- macOS highlighter focus handling depends on `MacBroker.last_focused`; clicking the overlay can make the highlighter process focused, so accessibility reads fall back to the last non-highlighter PID.\n- macOS integrations are bundle-ID based and controlled by persisted `Integration` entries.\n- Highlighter stdout is reserved for JSON-line IPC. Diagnostics in highlighter paths should use `eprintln!`, not `println!`.\n\n### IPC And App State\n\n- Tauri app state lives in `harper-desktop/src-tauri/src/config.rs`.\n- `Config` currently stores `mutable_dictionary: MutableDictionary`, `dialect: Dialect`, `ignored_lints: IgnoredLints`, `lint_config: FlatConfig`, and `integrations: Vec<Integration>`.\n- `Config::new()` uses `MutableDictionary::new()`, `Dialect::American`, `IgnoredLints::new()`, `FlatConfig::new_curated()`, and curated default integrations.\n- Config is persisted under the system config directory in a `harper-desktop` folder. Main settings are serialized to `config.json`; the mutable dictionary is stored separately as `dictionary.txt`.\n- `Config::load_from_system()` loads the serialized config and then hydrates the mutable dictionary with the selected dialect.\n- The Tauri app owns shared config as `Arc<Mutex<Config>>`.\n- `run_tauri()` loads persisted config, creates `HighlighterService`, starts the highlighter service, and creates the tray/menu-bar UI.\n- The highlighter process is spawned through `harper-desktop/src-tauri/src/highlighter_process.rs`.\n- IPC is implemented under `harper-desktop/src-tauri/src/communication/`.\n- IPC uses newline-delimited JSON over child stdin/stdout.\n- The Tauri app is the protocol server.\n- The highlighter process is the protocol client.\n- Protocol messages live in `harper-desktop/src-tauri/src/communication/message.rs`.\n- Supported requests include `GetLintConfig`, `GetDictionary`, `GetDialect`, `GetIgnoredLints`, `GetIntegrations`, `SetLintConfig`, `IgnoreLint`, `AddToDictionary`, `AddIntegration`, `RemoveIntegration`, and `SetIntegrationEnabled`.\n- Supported responses include `GetLintConfig`, `GetDictionary`, `GetDialect`, `GetIgnoredLints`, `GetIntegrations`, and `Ack`.\n- `IgnoredLints` is transferred as whole serialized state and merged server-side.\n- `AddToDictionary` sends only the word; Rust appends it with `DictWordMetadata::default()`.\n- The highlighter uses a Tokio current-thread runtime to call async IPC client methods from synchronous UI callbacks.\n- That runtime is bridge plumbing only; it is not used for linting or UI rendering.\n\n### Dictionary And Linting Gotchas\n\n- Keep dictionary construction centralized through `Config::dictionary_from_user_dictionary(user_dictionary: MutableDictionary) -> Arc<MergedDictionary>` and `Config::create_dictionary()`.\n- Keep linter construction centralized through `Config::create_linter()`.\n- The same merged dictionary source must be used for both `Document::new_markdown_default(text, &dictionary)` and `LintGroup::new_curated(dictionary, dialect)`.\n- Do not use `Document::new_markdown_default_curated(text)` in the main highlighter lint callback when user dictionary words should suppress spelling lints.\n- Harper spelling lint behavior depends on document token metadata, so a linter with the updated dictionary is not enough if the `Document` was built with the curated dictionary only.\n- `RenderState` may still use curated document construction for localized source extraction where dictionary membership does not matter.\n\n### Frontend Integration\n\n- Tauri commands in `harper-desktop/src-tauri/src/lib.rs` include `get_lint_config`, `get_dialect`, `set_dialect`, `set_lint_config`, `get_dictionary`, `set_dictionary`, `ignore_lint`, `add_to_dictionary`, `get_integrations`, `add_integration`, `remove_integration`, and `set_integration_enabled`.\n- JS helper lives in `harper-desktop/src/lib/client.ts`.\n- JS helper class is named `Client` and exposes static methods for lint config, dialect, dictionary, ignored lints, dictionary additions, and integrations.\n- `Client.ignoreLint(...)` uses Harper JS ignored-lints export data and invokes the Rust command.\n- `Client.addToDictionary(word)` sends only the word to Rust.\n- Vite's dev server must stay on port `1420`; `harper-desktop/vite.config.js` uses `strictPort: true` because Tauri expects that port.\n- Vite intentionally ignores `src-tauri/**` during frontend file watching.\n\n### Repo-Specific Gotchas\n\n- CI installs `wasm-pack`, `tauri-cli`, and `cargo-hack` with `cargo binstall`, then runs the relevant root `just` task.\n- Avoid mixing behavior fixes with structural refactors in the highlighter; popup/UI, IPC, dictionary behavior, config persistence, settings UI, and OS-coordinate fixes are easier to review separately.\n\n### Known Review Findings\n\n- Secondary-monitor highlighter coordinates may be wrong. Accessibility rectangles appear to be global screen coordinates, while each overlay window's egui origin is local to that monitor/window. Translate by monitor/window origin or render through one virtual-desktop-sized overlay.\n- macOS text range lookup may be wrong after emoji or other non-BMP characters. Harper spans are char-based, while macOS accessibility ranges are NSString/UTF-16 based. Convert spans before calling `AXBoundsForRangeParameterizedAttribute`.\n\n## On Writing New Rules\n\nWhen asked to write a new rule, keep these guidelines in mind:\n\n- The user is almost always expecting you to write it to a file. Which file and where is up to you to find out.\n- You should include at least 15 total tests, covering a wide variety of cases. Cover false-positives, false negatives, true positives, and if relevant, true negatives.\n- You should run any and all tests to ensure that you do no break existing behavior and that your new rule runs the way you expect. At minimum, that means `just test-rust`. Make sure to check the snapshots for changes.\n- After adding a new rule, update `harper-core/default_config.json` so it is enabled in the curated default config.\n- Built-in Weir rules can be grouped by putting related `.weir` files in a directory under `harper-core/src/linting/weir_rules`; the directory name becomes the single public rule name.\n- If the rule is related to a closed compound noun, see if you can just add an entry to the existing closed compound linter.\n\nUnless you are specifically requested to write the rule in a specific way, choose the language (Rust or Weir) and methodology that fits the task.\n\nALWAYS run extensive bullet tests with `cargo run --bin harper-cli --release -- lint <TEXT>` to make sure the new rule isn't already covered by Harper.\n\n## Workflow for Writing Weir Rules\n\n1. Draft the core expression\n- Encode the match with `expr main` using words, sequences, alternatives, filters, exceptions, POS tags, wildcards, or punctuation.\n- Keep the expression minimal but precise; avoid overmatching.\n- If a wordlist is needed, include it as its own expression, used with an expression reference.\n\n2. Add rule metadata\n- `let message`, `let description`, `let kind`, `let becomes` (and `let strategy` if needed).\n- Use `strategy \"Exact\"` when casing must be normalized; otherwise default behavior or `MatchCase` as appropriate.\n\n3. Add tests (required)\n- Include at least 15 tests.\n- Tests must cover: true positives, false positives, false negatives, and (if relevant) true negatives.\n- Prefer a mix of casing, punctuation, whitespace, and nearby-token variations.\n\n4. Sanity-check edge cases\n- Ensure exceptions do not block valid matches.\n- Ensure replacements are correct and not destructive.\n\n5. Run the tests.\n- Fix any issues that arise.\n\n### Output Format\n\nWrite a Weir rule to a new file with a name of your choosing, including `expr main`, `let` fields, and tests. Make sure it has the extension `.weir`.\n\n## Tips\n\nBefore finishing your turn, run `just format` or `cargo fmt` if you have made any changes. This can help diffs if a human decides to make a commit.\n\nTry to write in a functional style. Minimize adding state whenever it is possible while also respecting the user's query. If additional state is necessary, please centralize it to increase visibility.\n\n","packages/web/tsconfig.json":"{\n\t\"extends\": \"./.svelte-kit/tsconfig.json\",\n\t\"compilerOptions\": {\n\t\t\"allowJs\": true,\n\t\t\"checkJs\": true,\n\t\t\"esModuleInterop\": true,\n\t\t\"forceConsistentCasingInFileNames\": true,\n\t\t\"resolveJsonModule\": true,\n\t\t\"skipLibCheck\": true,\n\t\t\"sourceMap\": true,\n\t\t\"strict\": true\n\t}\n\t// Path aliases are handled by https://kit.svelte.dev/docs/configuration#alias\n\t//\n\t// If you want to overwrite includes/excludes, make sure to copy over the relevant includes/excludes\n\t// from the referenced tsconfig.json - TypeScript does not merge them in\n}\n","packages/vscode-plugin/README.md":"# Harper for VS Code\n\nHarper is the next-generation grammar checker for your code. You can think of it as an alternative to Grammarly. It catches common stylistic errors, as well as complex grammatical or layout-related problems. It works for almost [all common programming languages](https://writewithharper.com/docs/integrations/language-server#Supported-Languages) and a number of markup formats.\n\nIf you use Rust, Java, JavaScript, or any number of other programming languages, your comments may end up as part of your API's documentation. If that's the case, grammatical mistakes in your code could be down-ranking your site on search results and tarnishing your reputation for quality.\n\nMost importantly, Harper runs on-device and uses barely any memory at all. That means you can get feedback on your work in milliseconds, dramatically increasing your iteration speed.\n\nYou can learn more about [this extension](https://writewithharper.com/docs/integrations/visual-studio-code) and [Harper](https://writewithharper.com/docs/about) over at our [official website](https://writewithharper.com).\n","packages/vscode-plugin/tsconfig.json":"{\n\t\"exclude\": [\"src/tests/fixtures\"],\n\t\"compilerOptions\": {\n\t\t\"module\": \"Node16\",\n\t\t\"target\": \"ES2022\",\n\t\t\"lib\": [\"ES2022\", \"DOM\"],\n\t\t\"sourceMap\": true,\n\t\t\"rootDir\": \"src\",\n\t\t\"outDir\": \"build\",\n\t\t\"strict\": true,\n\t\t\"skipLibCheck\": true\n\t}\n}\n","packages/vscode-plugin/development-guide.md":"# Development Guide\n\nThis document has been moved to the [official documentation](https://writewithharper.com/docs/contributors/visual-studio-code).\n","packages/vscode-plugin/package.json":"{\n\t\"name\": \"harper\",\n\t\"displayName\": \"Harper - Grammar / Spell Checking\",\n\t\"description\": \"The grammar checker for developers\",\n\t\"version\": \"2.13.0\",\n\t\"private\": true,\n\t\"author\": \"Elijah Potter\",\n\t\"publisher\": \"elijah-potter\",\n\t\"license\": \"Apache-2.0\",\n\t\"icon\": \"icon.png\",\n\t\"galleryBanner\": {\n\t\t\"color\": \"#F2F2F2\",\n\t\t\"theme\": \"light\"\n\t},\n\t\"repository\": {\n\t\t\"type\": \"git\",\n\t\t\"url\": \"https://github.com/automattic/harper\"\n\t},\n\t\"bugs\": {\n\t\t\"url\": \"https://github.com/automattic/harper/issues\"\n\t},\n\t\"engines\": {\n\t\t\"vscode\": \"^1.96.2\"\n\t},\n\t\"categories\": [\n\t\t\"Other\"\n\t],\n\t\"keywords\": [\n\t\t\"grammar\",\n\t\t\"spellcheck\",\n\t\t\"writing\"\n\t],\n\t\"activationEvents\": [\n\t\t\"onLanguage:asciidoc\",\n\t\t\"onLanguage:c\",\n\t\t\"onLanguage:clojure\",\n\t\t\"onLanguage:cmake\",\n\t\t\"onLanguage:cpp\",\n\t\t\"onLanguage:csharp\",\n\t\t\"onLanguage:dart\",\n\t\t\"onLanguage:elixir\",\n\t\t\"onLanguage:git-commit\",\n\t\t\"onLanguage:gleam\",\n\t\t\"onLanguage:go\",\n\t\t\"onLanguage:groovy\",\n\t\t\"onLanguage:haskell\",\n\t\t\"onLanguage:html\",\n\t\t\"onLanguage:ink\",\n\t\t\"onLanguage:java\",\n\t\t\"onLanguage:javascript\",\n\t\t\"onLanguage:javascriptreact\",\n\t\t\"onLanguage:jj-commit\",\n\t\t\"onLanguage:kotlin\",\n\t\t\"onLanguage:literate haskell\",\n\t\t\"onLanguage:lua\",\n\t\t\"onLanguage:markdown\",\n\t\t\"onLanguage:nix\",\n\t\t\"onLanguage:org\",\n\t\t\"onLanguage:php\",\n\t\t\"onLanguage:powershell\",\n\t\t\"onLanguage:plaintext\",\n\t\t\"onLanguage:python\",\n\t\t\"onLanguage:quarto\",\n\t\t\"onLanguage:r\",\n\t\t\"onLanguage:rmd\",\n\t\t\"onLanguage:rmarkdown\",\n\t\t\"onLanguage:ruby\",\n\t\t\"onLanguage:rust\",\n\t\t\"onLanguage:scala\",\n\t\t\"onLanguage:scminput\",\n\t\t\"onLanguage:shellscript\",\n\t\t\"onLanguage:solidity\",\n\t\t\"onLanguage:swift\",\n\t\t\"onLanguage:tex\",\n\t\t\"onLanguage:latex\",\n\t\t\"onLanguage:toml\",\n\t\t\"onLanguage:typescript\",\n\t\t\"onLanguage:typescriptreact\",\n\t\t\"onLanguage:typst\",\n\t\t\"onLanguage:zig\"\n\t],\n\t\"main\": \"./build/extension.js\",\n\t\"contributes\": {\n\t\t\"icons\": {\n\t\t\t\"harper-logo\": {\n\t\t\t\t\"description\": \"Harper logo\",\n\t\t\t\t\"default\": {\n\t\t\t\t\t\"fontPath\": \"media/harper.woff\",\n\t\t\t\t\t\"fontCharacter\": \"\\\\e900\"\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\t\t\"languages\": [\n\t\t\t{\n\t\t\t\t\"id\": \"gleam\",\n\t\t\t\t\"aliases\": [\n\t\t\t\t\t\"Gleam\",\n\t\t\t\t\t\"gleam\"\n\t\t\t\t],\n\t\t\t\t\"extensions\": [\n\t\t\t\t\t\".gleam\"\n\t\t\t\t]\n\t\t\t}\n\t\t],\n\t\t\"commands\": [\n\t\t\t{\n\t\t\t\t\"command\": \"harper.languageserver.restart\",\n\t\t\t\t\"title\": \"Harper: Restart Language Server\",\n\t\t\t\t\"description\": \"Restart harper-ls\"\n\t\t\t}\n\t\t],\n\t\t\"configuration\": {\n\t\t\t\"type\": \"object\",\n\t\t\t\"title\": \"Harper\",\n\t\t\t\"properties\": {\n\t\t\t\t\"harper.path\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"string\",\n\t\t\t\t\t\"description\": \"Optional path to a harper-ls executable to use.\"\n\t\t\t\t},\n\t\t\t\t\"harper.codeActions.ForceStable\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": false,\n\t\t\t\t\t\"description\": \"Make code actions appear in \\\"stable\\\" positions by placing code actions that should always be available, like adding misspelled words in the dictionary, first.\"\n\t\t\t\t},\n\t\t\t\t\"harper.dialect\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"string\",\n\t\t\t\t\t\"enum\": [\n\t\t\t\t\t\t\"British\",\n\t\t\t\t\t\t\"American\",\n\t\t\t\t\t\t\"Canadian\",\n\t\t\t\t\t\t\"Australian\"\n\t\t\t\t\t],\n\t\t\t\t\t\"default\": \"American\",\n\t\t\t\t\t\"description\": \"Set which dialect of English Harper should expect.\"\n\t\t\t\t},\n\t\t\t\t\"harper.diagnosticSeverity\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"string\",\n\t\t\t\t\t\"enum\": [\n\t\t\t\t\t\t\"error\",\n\t\t\t\t\t\t\"hint\",\n\t\t\t\t\t\t\"information\",\n\t\t\t\t\t\t\"warning\"\n\t\t\t\t\t],\n\t\t\t\t\t\"default\": \"information\",\n\t\t\t\t\t\"description\": \"How severe do you want diagnostics to appear in the editor?\"\n\t\t\t\t},\n\t\t\t\t\"harper.excludePatterns\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"array\",\n\t\t\t\t\t\"description\": \"A set of globs to ignore. If a file matches any of the globs, it will not be linted.\"\n\t\t\t\t},\n\t\t\t\t\"harper.fileDictPath\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"string\",\n\t\t\t\t\t\"description\": \"Optional path to a file dictionary directory to use.\"\n\t\t\t\t},\n\t\t\t\t\"harper.isolateEnglish\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": false,\n\t\t\t\t\t\"description\": \"Only lint English text in documents that are a mixture of English and another language.\"\n\t\t\t\t},\n\t\t\t\t\"harper.markdown.IgnoreLinkTitle\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": false,\n\t\t\t\t\t\"description\": \"Skip linting link titles.\"\n\t\t\t\t},\n\t\t\t\t\"harper.maxFileLength\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"number\",\n\t\t\t\t\t\"default\": 120000,\n\t\t\t\t\t\"description\": \"Maximum length of file to be linted (in bytes). If a file is larger than this, it will not be linted.\"\n\t\t\t\t},\n\t\t\t\t\"harper.userDictPath\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"string\",\n\t\t\t\t\t\"description\": \"Optional path to a user dictionary file to use.\"\n\t\t\t\t},\n\t\t\t\t\"harper.workspaceDictPath\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"string\",\n\t\t\t\t\t\"description\": \"Optional path to a workspace-local dictionary file to use.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.ACoupleMore\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"Corrects `a couple of more` to `a couple more`.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.ALittleOfPractice\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"Corrects `a little of practice` to `a little practice` or `a bit of practice`.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.ALongTime\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"Corrects `along time` to `a long time`.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.AMeansToAnEnd\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"Corrects `a mean to an end` to `a means to an end`\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.AOkHyphen\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"Replaces the loose article-plus-abbreviation pairing with the standard hyphenated form whenever a linking verb describes readiness or approval.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.APart\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"Finds and corrects common mistakes between 'a part' and 'apart'\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.ASomeTime\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"Removes the redundant/conflicting indefinite article `a` before `some` when followed by time expressions.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.AWaysToGo\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"Corrects the idiom `a ways to go` when the indefinite article is missing.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.AWhile\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"Enforces `awhile` after verbs and `a while` everywhere else.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.AWholeOther\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"Corrects `a whole another`/`a whole 'nother` to `a whole other`.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.AccuseOf\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"Corrects `accuse for` to `accuse of`.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.AdNauseam\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"Corrects `as nauseam` to `ad nauseam`.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.Addicting\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"Replaces `addicting` with `addictive` when used as an adjective.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.AdjectiveDoubleDegree\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"Finds adjectives that are used as double degrees (e.g. `more prettier`).\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.AdjectiveOfA\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"This rule looks for sequences of words of the form `adjective of a`.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.Ado\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"Corrects `adieu` to `ado`.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.AdvantageOf\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"Corrects the missing preposition in the idiom `take advantage of` when `of` is dropped.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.AfterAWhile\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"Corrects the missing article in `after while`, forming `after a while`.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.AfterAll\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"Corrects `afterall` to `after all`.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.AfterLater\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"Checks for the word `later` following `after [a period of time]`.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.AheadAnd\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"Corrects `an` to `and` after `ahead`.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.Ajar\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"Corrects `a jar` to `ajar`.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.Akimbo\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"Corrects `a kimbo` to `akimbo`.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.Albeit\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"Corrects this expression to the standard `albeit`.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.AllHellBreakLoose\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"Corrects forms of `all hell breaks out` to `all hell breaks loose`.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.AllIntentsAndPurposes\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"Finds and corrects common wrong forms of the phrase 'for all intents and purposes' / 'to all intents and purposes'.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.AllOfASudden\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"Guides this expression toward the standard `all of a sudden`.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.AllReady\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"Flags `all ready` when it precedes an adjective so the adverb `already` can take its place.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.AllThough\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"Nobody means to write the two-word phrase `all though` when the single word `although` is intended.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.AllWellAndGood\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"Corrects `all well in good` to `all well and good`.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.AllowTo\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"Flags erroneous usage of `allow to` without a subject.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.Alongside\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"Replaces the spaced form `along side` with `alongside`.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.AlzheimersDisease\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"Fixes the common misnomer `old-timers' disease`, ensuring the correct medical term `Alzheimer’s disease` is used.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.AmInTheMorning\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"Finds redundant am/pm indicators used together with time periods such as 'in the morning' or 'at night'.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.AmazonNames\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"When referring to the various products of Amazon.com, make sure to treat them as a proper noun.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.Americas\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"When referring to North, Central, and South America, make sure to treat them as a proper noun.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.AmountsFor\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"Corrects `amounts for` to either `amounts to` or `accounts for`\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.AnA\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"A rule that looks for incorrect indefinite articles. For example, `this is an mule` would be flagged as incorrect.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.AnAnother\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"Corrects `an another` and `a another`.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.AnalogAcousticBike\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": false,\n\t\t\t\t\t\"description\": \"Suggests more standard terms for `analog/analogue bike` and `acoustic bike`.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.AndIn\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"Fixes the typo `an in` when it stands in for the conjunction `and in`, while avoiding common `in-...` noun phrases and a few attested exceptions.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.AndSuch\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"Corrects `and the such` to `and such`.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.AndTheLike\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"Corrects mistakes in `and the like` and `or the like`.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.AnotherAn\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"Corrects `another an` to `another`.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.AnotherOnes\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"Corrects `another ones`.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.AnotherThingComing\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"Though `another think coming` is the original phrase, `another thing coming` is now more common.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.AnotherThings\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"Corrects `another things`.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.AnotherThinkComing\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": false,\n\t\t\t\t\t\"description\": \"Though `another thing coming` is now more common, `another think coming` is the original phrase.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.Anybody\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"Looks for incorrect spacing inside the closed compound `anybody`.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.Anyhow\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"Looks for incorrect spacing inside the closed compound `anyhow`.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.Anywhere\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"Looks for incorrect spacing inside the closed compound `anywhere`.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.ApartFrom\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"Flags the misspelling `apart form` and suggests `apart from`.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.AppleNames\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"When referring to Apple products and services, make sure to treat them as proper nouns.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.ArgumentToBeMade\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"Corrects `argument to be said` to `argument to be made`.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.ArriveOnWeekday\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"Keeps schedules explicit by preferring the familiar `arrive on Friday` pattern instead of a bare weekday.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.ArriveTo\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"Corrects `arrive to` to `arrive at` or `arrive in`.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.AsComparedTo\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"Corrects `as compare to` to `as compared to`.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.AsEvidentBy\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"Corrects `evident by` to `evidenced by` in passive constructions where `evidence` is used as a verb.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.AsFarAsICanTell\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"Expands an initialism.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.AsFarAsIKnow\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"Expands an initialism.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.AsFarBackAs\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"Corrects nonstandard `as early back as` to `as far back as`.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.AsFollows\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"Corrects the phrase `as follow`, which is sometimes produced by overcorrection. While it appeared briefly in 19th-century English, it is now considered archaic; modern standard usage requires `as follows` regardless of number.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.AsHow\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"Corrects `as how` to `as to how`.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.AsIUnderstandIt\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"Expands an initialism.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.AsIfThough\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"Corrects redundant `as if though`.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.AsIsWithAnything\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"Flags the incorrect idiom blend `as is with anything` and suggests standard alternatives like `as with anything` or `as is the case with anything`.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.AsItHappens\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"Corrects `as it so happens` to `as it happens`.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.AsLongAs\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"Corrects `aslong as` and `as long that` to `as long as`.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.AsMuchAs\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"Corrects `as much than` to `as much as`.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.AsOfCurrently\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"Corrects `as of currently` to `currently` or `as of now`.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.AsOfLately\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"Corrects `as of lately` to `lately` or `as of late`.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.AsOpposedTo\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"Corrects `as oppose to` to `as opposed to`.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.AsSoonAsPossible\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"Expands an initialism.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.AsToInterrogative\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"Corrects `to` to `as to` between certain adjectives and `wh-words`.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.AskNoPreposition\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"Identifies sequences like `ask to us` or `tell to him` and recommends removing the superfluous “to”.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.AspireTo\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"Corrects `aspire for` to `aspire to`.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.AtAllCosts\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"Corrects `at all cost` to `at all costs`.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.AtFaceValue\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"Corrects nonstandard variants of `at face value`.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.AtLeasToLeast\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"Fixes the frequent typo `at leas` when the intended expression is `at least`.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.AtLestToLeast\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"Fixes the mistake `at lest` when the intended expression is `at least`.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.AtTheBestOfTimes\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"Corrects `in the best of times` to `at the best of times`.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.AtTheEndOfTheDay\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"Corrects `in the end of the day` to `at the end of the day`.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.AtTheExpenseOf\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"The correct idiom is `at the expense of`, with singular `expense`. But retain `expanse` if this phrase refers to a wide area.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.AtTheVeryLeast\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"Corrects `in the very least` to `at the very least`.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.Audible\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"Corrects `hearable` to `audible`.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.Australia\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"When referring to states, territories, and cities in Australia, make sure to treat them as a proper noun.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.AvoidAndAlso\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"Reduces redundancy by replacing `and also` with `and`.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.AvoidContractions\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": false,\n\t\t\t\t\t\"description\": \"Suggests expanded forms for common contractions, such as `isn't` → `is not` and `we're` → `we are`.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.AvoidCurses\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"Flags offensive language and offers various ways to censor or replace with euphemisms.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.AwaitFor\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"Suggests using either `await` or `wait for` but not both, as they express the same meaning.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.AwareOf\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"Corrects `aware about` to the standard `aware of`.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.AzureNames\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"When referring to Azure cloud services, make sure to treat them as proper nouns.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.BackInTheDay\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"This linter flags instances of the nonstandard phrase `back in the days`. The correct, more accepted form is `back in the day`\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.BackhandedCompliment\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"Corrects `backhand compliment` to `backhanded compliment`.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.Backplane\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"Looks for incorrect spacing inside the closed compound `backplane`.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.BadRap\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"Changes `bed rap` to the proper idiom `bad rap`.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.BainBane\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"Detects mixing up `bain` and `bane`.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.BanTogether\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"Detects and corrects the common error of using `ban together` instead of the idiom `band together`, which means to unite or join forces.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.BareBones\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"Corrects `bare-bone` to `bare-bones`.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.BareInMind\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"Ensures the phrase `bear in mind` is used correctly instead of `bare in mind`.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.BareWithMe\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"Corrects `bare with` to `bear with`.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.BarelyUn\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"Flags using `barely` with a negative adjective starting with `un-` (`barely unusable`, etc.), which is a kind of double negative.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.BatedBreath\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"Changes `baited breath` to the correct `bated breath`.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.BeAllowed\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"Ensures the passive form uses `be allowed` after future negatives.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.BeBiased\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"Detects incorrect use of 'be + verb' instead of `be + adjective`.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.BeConcerned\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"Detects incorrect use of 'be + verb' instead of `be + adjective`.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.BePrejudiced\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"Detects incorrect use of 'be + verb' instead of `be + adjective`.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.BeRightBack\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"Expands an initialism.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.BeShocked\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"Detects incorrect use of 'be + verb' instead of `be + adjective`.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.BeWorried\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"Detects incorrect use of 'be + verb' instead of `be + adjective`.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.BeckAndCall\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"Fixes eggcorns of `beck and call`.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.BeenThere\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"Corrects the misspelling `bee there` to the proper phrase `been there`.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.Beforehand\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"`Beforehand` functions as a fixed adverb meaning ‘in advance’; writing it as two words or with a hyphen is nonstandard and can jar readers.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.BehindTheScenes\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"Corrects `behind the scene` to `behind the scenes`.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.BellowBelow\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"Looks for `bellow` wrongly used when `below` is intended.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.BesideThePoint\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"Corrects `besides the point` to `beside the point`.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.BestOfAllTime\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"Checks for nonstandard `of all times` in superlatives instead of singular `time`\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.BestRegards\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"In valedictions, `best` expresses your highest regard—avoid the typo `beat regards`.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.BetterOffPhrase\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"Rewrites `better of` to `better off` in common comparative phrasing.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.BetterOffServed\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"Corrects `better off served` to `better off` or `better served`.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.BetterOffWith\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"Corrects `better of with` to `better off with`.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.BewareOf\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"The verb `beware` naturally pairs with `of` before the noun being warned about, so swap other prepositions for clarity.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.BlacklistWhitelist\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"Normalize the two-word sequence `black list`/`white list` so it matches the established compound noun or verb.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.BlanketStatement\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"Corrects common errors in the phrase `blanket statement`.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.BluRayHyphen\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"Joins the two-word spelling of the optical disc format into the standard compound form.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.BoarderBorder\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"Flags the eggcorn `boarder` (a lodger) where `border` (an edge/boundary) is intended.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.Bollocks\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"Corrects `bullocks` to `bollocks` when the meaning is `nonsense`.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.BoringWords\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": false,\n\t\t\t\t\t\"description\": \"This rule looks for particularly boring or overused words. Using varied language is an easy way to keep a reader's attention.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.Bought\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"Replaces the incorrect past-tense spelling `bough` with `bought` after subject pronouns.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.BrandBrandish\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"Looks for `brandish` wrongly used when `brand` is intended.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.Brutality\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"Suggests the more standard and common synonym `brutality`.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.BuiltIn\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"English convention treats `built-in` as a single, attributive adjective—meaning something integrated from the outset—whereas other forms like `in built` are nonstandard and can feel awkward to readers.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.ByAccident\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"Incorrect preposition: `by accident` is the idiomatic expression.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.ByExtension\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"Corrects `by extent` to `by extension`.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.ByOnesOwn\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"Fixes incorrect phrases like `by my own` by suggesting `on my own` or `by myself`.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.ByTheBook\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"Corrects `by the books` to `by the book`.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.ByTheWay\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"Expands an initialism.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.Bypass\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"Looks for incorrect spacing inside the closed compound `bypass`.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.CallItQuits\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"Corrects wrong variants of the idiom 'call it quits'.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.CallThem\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"Addresses the non-idiomatic phrases `call them as`.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.CanBeSeen\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"Corrects `can be seem` to the proper phrase `can be seen`.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.Canada\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"When referring to provinces, territories, and cities in Canada, make sure to treat them as a proper noun.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.Cant\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"Suggests correcting `cant` to `can't`.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.CantWay\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"Corrects `way` to `wait` in high-confidence contexts such as `can't way to` and `doesn't way for`.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.CapitalizeOn\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"A collection of linters that can be run as one.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.CapitalizePersonalPronouns\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"Forgetting to capitalize personal pronouns, like \\\"I\\\" or \\\"I'm\\\" is one of the most common errors. This rule helps with that.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.CaseInPoint\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"Corrects `case and point` to `case in point`.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.CaseSensitive\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"Ensures `case-sensitive` is correctly hyphenated.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.Catch22\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"Corrects mistakenly using similar-sounding words in the idiom `catch 22`.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.CauseItIsBecause\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"Normalizes informal `cause it is` to the standard subordinating form in explanatory clauses.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.CautionaryTale\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"Corrects confusion between `tale` (story) and `tail` (appendage) in common phrases.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.CeaseTo\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"Detects when `seize to` is likely a typo for `cease to`.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.Chalkboard\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"Looks for incorrect spacing inside the closed compound `chalkboard`.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.ChampAtTheBit\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"Corrects `chomp at the bit` to the idiom `champ at the bit`, which has an equestrian origin referring to the way an anxious horse grinds its teeth against the metal part of the bridle.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.ChangeTack\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"Locates errors in the idioms `to change tack` and `change of tack` to convey the correct meaning of altering one's course or strategy.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.ChickenAndEgg\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"Corrects wrong variants of the `chicken-and-egg` idiom.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.ChineseCommunistParty\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"When referring to the political party, make sure to treat them as a proper noun.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.ChockFull\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"Flags common soundalikes of \\\"chock-full\\\" and makes sure they're hyphenated.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.ClaimToFame\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"Corrects `claim for fame` to the idiom `claim to fame`.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.ClicheAccent\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"A collection of linters that can be run as one.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.ClickThroughRate\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"Hyphenates the verb+preposition pair when it directly precedes rate-style nouns, mirroring how these terms are commonly styled in analytics writing.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.ClientOrServerSide\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"Corrects extraneous apostrophe in `client's side` and `server's side`.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.CloseTightKnit\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"Corrects `close-nit` and `tight-nit` to `close-knit` and `tight-knit`.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.CodeInWriteIn\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"Corrects the wrong preposition `on` to `in` when referring to writing code.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.Codebase\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"Looks for incorrect spacing inside the closed compound `codebase`.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.Codebases\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"Looks for incorrect spacing inside the closed compound `codebases`.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.ColdModalTypo\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"Rewrites `cold` to `could` when it appears in common subject-plus-verb modal contexts.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.Combinate\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"Suggests replacing the nonstandard verb `combinate` with the standard `combine`.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.ComfortableWith\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"Corrects `comfortable of` to `comfortable with`.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.CommaFixes\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"Fix common comma errors such as no space after, erroneous space before, etc., Asian commas instead of English commas, etc.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.CommitmentTo\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"Corrects `commitment toward/towards` to `commitment to`.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.CompaniesProductsAndTrademarks\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"Ensure proper capitalization of companies, products, and trademarks.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.ComplainAsNoun\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"Corrects the use of `complain` as a noun.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.CompoundNouns\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"Detects compound nouns split by a space and suggests merging them when both parts form a valid noun.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.CompoundSubjectI\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"Promotes `I` in compound subjects headed by a possessive determiner.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.ComprisesOf\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"`Comprises` already contains the notion of `of`, so following it with another `of` is redundant.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.CompulseToCompel\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"Suggests replacing the obsolete or archaic verb `compulse` with the standard `compel`.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.CondensateVerb\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"Suggests replacing the nonstandard verb `condensate` with the standard `condense`.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.CondenseAllThe\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"Suggests removing `of` in `all of the` for a more concise phrase.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.Confident\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"This linter detects instances where the noun `confidant` is incorrectly used in place of the adjective `confident`. `Confidant` refers to a trusted person, whereas `confident` describes certainty or self-assurance. The rule suggests replacing `confidant` with `confident` when used in an adjectival context.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.ConfirmThat\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"Corrects `conform` typos to `confirm`.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.ConstituteAs\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"Removes extraneous `as` after the verb `constitute`.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.ConvenientStore\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"Attempts to detect when `convenient store` is mistake for `convenience store`.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.Copyright\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"Corrects `copywrite` to `copyright`. `Copywrite` refers to writing copy, while `copyright` is the legal right to creative works.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.CorrectNumberSuffix\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"When making quick edits, it is common for authors to change the value of a number without changing its suffix. This rule looks for these cases, for example: `2st`.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.Countries\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"When referring to Countries, make sure to treat it as a proper noun.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.CoursingThroughVeins\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"In English idioms, `to course` means to flow rapidly—so avoid the eggcorn `cursing through veins.`\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.CraveFor\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"There should be no `for` after the verb `crave`.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.CriteriaPhenomena\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"The words “criteria” and “phenomena” are the plurals of “criterion” and “phenomenon”, respectively. They are often incorrectly used with the wrong number.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.CrossPlatform\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"Unlike some compound modifiers, `cross-platform` should always be hyphenated.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.CureFor\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"Flags `cure against` and prefers the standard `cure for` pairing.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.CuriousAbout\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"Corrects `curious of` and `curious on` to `curious about`.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.CurrencyPlacement\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"The location of currency symbols varies by country. The rule looks for and corrects improper positioning.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.CuttingAgeEggcorn\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"Corrects the eggcorn `cutting age` or `cutting-age` to `cutting-edge` or `cutting edge`.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.Cybersec\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"Expands the informal abbreviation `cybersec` to `cybersecurity`.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.Damages\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"Checks for plural `damages` not in the context of a court case.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.DampSquib\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"Corrects the eggcorn `damp squid` to `damp squib`, ensuring the intended meaning of a failed or underwhelming outcome.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.Dashes\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"Writers often type `--` or `---` expecting their editor to convert them into proper dashes. Replace these sequences with the correct characters: use an en dash (–) for ranges or connections and an em dash (—) for a break in thought.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.DateBackFrom\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"Corrects the blend of `date from` and `date back to` into the nonstandard `date back from`.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.DayAndAge\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"Fixes wrong variants of the idiom `in this day and age`.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.DayOneNames\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"Ensure proper capitalization of Day One and Day One Premium as brand names.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.Deadlift\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"Looks for incorrect spacing inside the closed compound `deadlift`.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.DefiniteArticle\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"The name of the word `the` is `definite article`.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.DegreesKelvin\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"Corrects use of `degrees kelvin` to `kelvins`.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.DegreesKelvinSymbol\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"Corrects use of `°K` to `K`.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.DenyOffer\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"Corrects `deny` when used with `offer` to `decline` or `reject`.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.Dereference\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"A collection of linters that can be run as one.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.Desktop\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"Looks for incorrect spacing inside the closed compound `desktop`.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.DespiteItIs\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"Corrects `despite` being used with the wrong form of `is`.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.DespiteOf\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"Corrects the misuse of `despite of` and suggests the proper alternatives `despite` or `in spite of`.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.Devops\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"Looks for incorrect spacing inside the closed compound `devops`.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.DidPast\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"Corrects past forms of verbs to their base form, when used together with \\\"did\\\".\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.Didnt\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"Corrects `dint` to `didn't` after subject pronouns.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.DigUnderTheHood\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"Detects the mixed metaphor of `digging under the hood/bonnet`.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.DigestiveTract\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"","packages/obsidian-plugin/package.json":"# Obsidian-plugin Skill\n\nPath: `packages/obsidian-plugin/package.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Automattic/harper/HEAD/packages/obsidian-plugin/package.json)","packages/obsidian-plugin/README.md":"# obsidian-plugin Documentation\n\nPath: `packages/obsidian-plugin/README.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Automattic/harper/HEAD/packages/obsidian-plugin/README.md)","packages/lint-framework/package.json":"# Lint-framework Skill\n\nPath: `packages/lint-framework/package.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Automattic/harper/HEAD/packages/lint-framework/package.json)","packages/lint-framework/README.md":"# lint-framework Documentation\n\nPath: `packages/lint-framework/README.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Automattic/harper/HEAD/packages/lint-framework/README.md)","packages/lint-framework/tsconfig.json":"# Lint-framework Skill\n\nPath: `packages/lint-framework/tsconfig.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Automattic/harper/HEAD/packages/lint-framework/tsconfig.json)","packages/harper-editor/package.json":"# Harper-editor Skill\n\nPath: `packages/harper-editor/package.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Automattic/harper/HEAD/packages/harper-editor/package.json)","packages/harper-editor/tsconfig.json":"# Harper-editor Skill\n\nPath: `packages/harper-editor/tsconfig.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Automattic/harper/HEAD/packages/harper-editor/tsconfig.json)","packages/harper.js/api-extractor.json":"# Harper.js Skill\n\nPath: `packages/harper.js/api-extractor.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Automattic/harper/HEAD/packages/harper.js/api-extractor.json)","packages/harper.js/package.json":"# Harper.js Skill\n\nPath: `packages/harper.js/package.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Automattic/harper/HEAD/packages/harper.js/package.json)","packages/harper.js/README.md":"# harper.js Documentation\n\nPath: `packages/harper.js/README.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Automattic/harper/HEAD/packages/harper.js/README.md)","packages/harper.js/tsconfig.json":"# Harper.js Skill\n\nPath: `packages/harper.js/tsconfig.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Automattic/harper/HEAD/packages/harper.js/tsconfig.json)","packages/components/package.json":"# Components Skill\n\nPath: `packages/components/package.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Automattic/harper/HEAD/packages/components/package.json)","packages/components/tsconfig.json":"# Components Skill\n\nPath: `packages/components/tsconfig.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Automattic/harper/HEAD/packages/components/tsconfig.json)","packages/chrome-plugin/CHANGELOG.md":"# Chrome-plugin Skill\n\nPath: `packages/chrome-plugin/CHANGELOG.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Automattic/harper/HEAD/packages/chrome-plugin/CHANGELOG.md)","packages/chrome-plugin/package.json":"# Chrome-plugin Skill\n\nPath: `packages/chrome-plugin/package.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Automattic/harper/HEAD/packages/chrome-plugin/package.json)","packages/chrome-plugin/tsconfig.json":"# Chrome-plugin Skill\n\nPath: `packages/chrome-plugin/tsconfig.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Automattic/harper/HEAD/packages/chrome-plugin/tsconfig.json)","packages/chrome-plugin/tsconfig.node.json":"# Chrome-plugin Skill\n\nPath: `packages/chrome-plugin/tsconfig.node.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Automattic/harper/HEAD/packages/chrome-plugin/tsconfig.node.json)","packages/vscode-plugin/.vscode/extensions.json":"# .vscode Skill\n\nPath: `packages/vscode-plugin/.vscode/extensions.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Automattic/harper/HEAD/packages/vscode-plugin/.vscode/extensions.json)","packages/vscode-plugin/.vscode/launch.json":"# .vscode Skill\n\nPath: `packages/vscode-plugin/.vscode/launch.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Automattic/harper/HEAD/packages/vscode-plugin/.vscode/launch.json)","packages/vscode-plugin/.vscode/settings.json":"# .vscode Skill\n\nPath: `packages/vscode-plugin/.vscode/settings.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Automattic/harper/HEAD/packages/vscode-plugin/.vscode/settings.json)","packages/vscode-plugin/.vscode/tasks.json":"# .vscode Skill\n\nPath: `packages/vscode-plugin/.vscode/tasks.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Automattic/harper/HEAD/packages/vscode-plugin/.vscode/tasks.json)","packages/wordpress-plugin/src/harper/block.json":"# Harper Skill\n\nPath: `packages/wordpress-plugin/src/harper/block.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Automattic/harper/HEAD/packages/wordpress-plugin/src/harper/block.json)","packages/web/drizzle/meta/_journal.json":"# Meta Skill\n\nPath: `packages/web/drizzle/meta/_journal.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Automattic/harper/HEAD/packages/web/drizzle/meta/_journal.json)","packages/web/drizzle/meta/0000_snapshot.json":"# Meta Skill\n\nPath: `packages/web/drizzle/meta/0000_snapshot.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Automattic/harper/HEAD/packages/web/drizzle/meta/0000_snapshot.json)","packages/web/drizzle/meta/0001_snapshot.json":"# Meta Skill\n\nPath: `packages/web/drizzle/meta/0001_snapshot.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Automattic/harper/HEAD/packages/web/drizzle/meta/0001_snapshot.json)","packages/web/drizzle/meta/0002_snapshot.json":"# Meta Skill\n\nPath: `packages/web/drizzle/meta/0002_snapshot.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Automattic/harper/HEAD/packages/web/drizzle/meta/0002_snapshot.json)","packages/web/drizzle/meta/0003_snapshot.json":"# Meta Skill\n\nPath: `packages/web/drizzle/meta/0003_snapshot.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Automattic/harper/HEAD/packages/web/drizzle/meta/0003_snapshot.json)","packages/lint-framework/src/assets/hints.json":"# Assets Skill\n\nPath: `packages/lint-framework/src/assets/hints.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Automattic/harper/HEAD/packages/lint-framework/src/assets/hints.json)","packages/harper.js/examples/raw-web/README.md":"# raw-web Documentation\n\nPath: `packages/harper.js/examples/raw-web/README.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Automattic/harper/HEAD/packages/harper.js/examples/raw-web/README.md)","packages/harper.js/examples/commonjs-simple/package.json":"# Commonjs-simple Skill\n\nPath: `packages/harper.js/examples/commonjs-simple/package.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Automattic/harper/HEAD/packages/harper.js/examples/commonjs-simple/package.json)","packages/harper.js/examples/commonjs-simple/README.md":"# commonjs-simple Documentation\n\nPath: `packages/harper.js/examples/commonjs-simple/README.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Automattic/harper/HEAD/packages/harper.js/examples/commonjs-simple/README.md)","packages/vscode-plugin/src/tests/fixtures/integration.md":"# Fixtures Skill\n\nPath: `packages/vscode-plugin/src/tests/fixtures/integration.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Automattic/harper/HEAD/packages/vscode-plugin/src/tests/fixtures/integration.md)","packages/web/src/routes/docs/weir/+page.md":"# Weir Skill\n\nPath: `packages/web/src/routes/docs/weir/+page.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Automattic/harper/HEAD/packages/web/src/routes/docs/weir/+page.md)","packages/web/src/routes/docs/about/+page.md":"# About Skill\n\nPath: `packages/web/src/routes/docs/about/+page.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Automattic/harper/HEAD/packages/web/src/routes/docs/about/+page.md)","packages/vscode-plugin/src/tests/fixtures/.vscode/settings.json":"# .vscode Skill\n\nPath: `packages/vscode-plugin/src/tests/fixtures/.vscode/settings.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Automattic/harper/HEAD/packages/vscode-plugin/src/tests/fixtures/.vscode/settings.json)","packages/web/src/routes/docs/integrations/zed/+page.md":"# Zed Skill\n\nPath: `packages/web/src/routes/docs/integrations/zed/+page.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Automattic/harper/HEAD/packages/web/src/routes/docs/integrations/zed/+page.md)","packages/web/src/routes/docs/integrations/wordpress/+page.md":"# Wordpress Skill\n\nPath: `packages/web/src/routes/docs/integrations/wordpress/+page.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Automattic/harper/HEAD/packages/web/src/routes/docs/integrations/wordpress/+page.md)","packages/web/src/routes/docs/integrations/visual-studio-code/+page.md":"# Visual-studio-code Skill\n\nPath: `packages/web/src/routes/docs/integrations/visual-studio-code/+page.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Automattic/harper/HEAD/packages/web/src/routes/docs/integrations/visual-studio-code/+page.md)","packages/web/src/routes/docs/integrations/sublime-text/+page.md":"# Sublime-text Skill\n\nPath: `packages/web/src/routes/docs/integrations/sublime-text/+page.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Automattic/harper/HEAD/packages/web/src/routes/docs/integrations/sublime-text/+page.md)","packages/web/src/routes/docs/integrations/obsidian/+page.md":"# Obsidian Skill\n\nPath: `packages/web/src/routes/docs/integrations/obsidian/+page.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Automattic/harper/HEAD/packages/web/src/routes/docs/integrations/obsidian/+page.md)","packages/web/src/routes/docs/integrations/neovim/+page.md":"# Neovim Skill\n\nPath: `packages/web/src/routes/docs/integrations/neovim/+page.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Automattic/harper/HEAD/packages/web/src/routes/docs/integrations/neovim/+page.md)","packages/web/src/routes/docs/integrations/language-server/+page.md":"# Language-server Skill\n\nPath: `packages/web/src/routes/docs/integrations/language-server/+page.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Automattic/harper/HEAD/packages/web/src/routes/docs/integrations/language-server/+page.md)","packages/web/src/routes/docs/integrations/helix/+page.md":"# Helix Skill\n\nPath: `packages/web/src/routes/docs/integrations/helix/+page.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Automattic/harper/HEAD/packages/web/src/routes/docs/integrations/helix/+page.md)","packages/web/src/routes/docs/integrations/firefox-extension/+page.md":"# Firefox-extension Skill\n\nPath: `packages/web/src/routes/docs/integrations/firefox-extension/+page.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Automattic/harper/HEAD/packages/web/src/routes/docs/integrations/firefox-extension/+page.md)","packages/web/src/routes/docs/integrations/emacs/+page.md":"# Emacs Skill\n\nPath: `packages/web/src/routes/docs/integrations/emacs/+page.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Automattic/harper/HEAD/packages/web/src/routes/docs/integrations/emacs/+page.md)","packages/web/src/routes/docs/integrations/chrome-extension/+page.md":"# Chrome-extension Skill\n\nPath: `packages/web/src/routes/docs/integrations/chrome-extension/+page.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Automattic/harper/HEAD/packages/web/src/routes/docs/integrations/chrome-extension/+page.md)","packages/web/src/routes/docs/harperjs/spans/+page.md":"# Spans Skill\n\nPath: `packages/web/src/routes/docs/harperjs/spans/+page.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Automattic/harper/HEAD/packages/web/src/routes/docs/harperjs/spans/+page.md)","packages/web/src/routes/docs/harperjs/node/+page.md":"# Node Skill\n\nPath: `packages/web/src/routes/docs/harperjs/node/+page.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Automattic/harper/HEAD/packages/web/src/routes/docs/harperjs/node/+page.md)","packages/web/src/routes/docs/harperjs/linting/+page.md":"# Linting Skill\n\nPath: `packages/web/src/routes/docs/harperjs/linting/+page.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Automattic/harper/HEAD/packages/web/src/routes/docs/harperjs/linting/+page.md)","packages/web/src/routes/docs/harperjs/introduction/+page.md":"# Introduction Skill\n\nPath: `packages/web/src/routes/docs/harperjs/introduction/+page.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Automattic/harper/HEAD/packages/web/src/routes/docs/harperjs/introduction/+page.md)","packages/web/src/routes/docs/harperjs/configurerules/+page.md":"# Configurerules Skill\n\nPath: `packages/web/src/routes/docs/harperjs/configurerules/+page.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Automattic/harper/HEAD/packages/web/src/routes/docs/harperjs/configurerules/+page.md)","packages/web/src/routes/docs/harperjs/CDN/+page.md":"# CDN Skill\n\nPath: `packages/web/src/routes/docs/harperjs/CDN/+page.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Automattic/harper/HEAD/packages/web/src/routes/docs/harperjs/CDN/+page.md)","packages/web/src/routes/docs/contributors/wordpress/+page.md":"# Wordpress Skill\n\nPath: `packages/web/src/routes/docs/contributors/wordpress/+page.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Automattic/harper/HEAD/packages/web/src/routes/docs/contributors/wordpress/+page.md)","packages/web/src/routes/docs/contributors/website/+page.md":"# Website Skill\n\nPath: `packages/web/src/routes/docs/contributors/website/+page.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Automattic/harper/HEAD/packages/web/src/routes/docs/contributors/website/+page.md)","packages/web/src/routes/docs/contributors/visual-studio-code/+page.md":"# Visual-studio-code Skill\n\nPath: `packages/web/src/routes/docs/contributors/visual-studio-code/+page.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Automattic/harper/HEAD/packages/web/src/routes/docs/contributors/visual-studio-code/+page.md)","packages/web/src/routes/docs/contributors/testing-strategy/+page.md":"# Testing-strategy Skill\n\nPath: `packages/web/src/routes/docs/contributors/testing-strategy/+page.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Automattic/harper/HEAD/packages/web/src/routes/docs/contributors/testing-strategy/+page.md)","packages/web/src/routes/docs/contributors/review/+page.md":"# Review Skill\n\nPath: `packages/web/src/routes/docs/contributors/review/+page.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Automattic/harper/HEAD/packages/web/src/routes/docs/contributors/review/+page.md)","packages/web/src/routes/docs/contributors/obsidian/+page.md":"# Obsidian Skill\n\nPath: `packages/web/src/routes/docs/contributors/obsidian/+page.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Automattic/harper/HEAD/packages/web/src/routes/docs/contributors/obsidian/+page.md)","packages/web/src/routes/docs/contributors/local-stats/+page.md":"# Local-stats Skill\n\nPath: `packages/web/src/routes/docs/contributors/local-stats/+page.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Automattic/harper/HEAD/packages/web/src/routes/docs/contributors/local-stats/+page.md)","packages/web/src/routes/docs/contributors/introduction/+page.md":"# Introduction Skill\n\nPath: `packages/web/src/routes/docs/contributors/introduction/+page.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Automattic/harper/HEAD/packages/web/src/routes/docs/contributors/introduction/+page.md)","packages/web/src/routes/docs/contributors/faq/+page.md":"# Faq Skill\n\nPath: `packages/web/src/routes/docs/contributors/faq/+page.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Automattic/harper/HEAD/packages/web/src/routes/docs/contributors/faq/+page.md)","packages/web/src/routes/docs/contributors/environment/+page.md":"# Environment Skill\n\nPath: `packages/web/src/routes/docs/contributors/environment/+page.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Automattic/harper/HEAD/packages/web/src/routes/docs/contributors/environment/+page.md)","packages/web/src/routes/docs/contributors/dictionary/+page.md":"# Dictionary Skill\n\nPath: `packages/web/src/routes/docs/contributors/dictionary/+page.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Automattic/harper/HEAD/packages/web/src/routes/docs/contributors/dictionary/+page.md)","packages/web/src/routes/docs/contributors/desktop/+page.md":"# Desktop Skill\n\nPath: `packages/web/src/routes/docs/contributors/desktop/+page.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Automattic/harper/HEAD/packages/web/src/routes/docs/contributors/desktop/+page.md)","packages/web/src/routes/docs/contributors/committing/+page.md":"# Committing Skill\n\nPath: `packages/web/src/routes/docs/contributors/committing/+page.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Automattic/harper/HEAD/packages/web/src/routes/docs/contributors/committing/+page.md)","packages/web/src/routes/docs/contributors/committer/+page.md":"# Committer Skill\n\nPath: `packages/web/src/routes/docs/contributors/committer/+page.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Automattic/harper/HEAD/packages/web/src/routes/docs/contributors/committer/+page.md)","packages/web/src/routes/docs/contributors/chrome-extension/+page.md":"# Chrome-extension Skill\n\nPath: `packages/web/src/routes/docs/contributors/chrome-extension/+page.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Automattic/harper/HEAD/packages/web/src/routes/docs/contributors/chrome-extension/+page.md)","packages/web/src/routes/docs/contributors/brill/+page.md":"# Brill Skill\n\nPath: `packages/web/src/routes/docs/contributors/brill/+page.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Automattic/harper/HEAD/packages/web/src/routes/docs/contributors/brill/+page.md)","packages/web/src/routes/docs/contributors/author-a-rule/+page.md":"# Author-a-rule Skill\n\nPath: `packages/web/src/routes/docs/contributors/author-a-rule/+page.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Automattic/harper/HEAD/packages/web/src/routes/docs/contributors/author-a-rule/+page.md)","packages/web/src/routes/docs/contributors/architecture/+page.md":"# Architecture Skill\n\nPath: `packages/web/src/routes/docs/contributors/architecture/+page.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Automattic/harper/HEAD/packages/web/src/routes/docs/contributors/architecture/+page.md)"},"files":{"packages/web/package.json":"{\n\t\"name\": \"harper-web\",\n\t\"version\": \"0.0.1\",\n\t\"private\": true,\n\t\"scripts\": {\n\t\t\"dev\": \"vite dev\",\n\t\t\"build\": \"vite build -l warn\",\n\t\t\"preview\": \"vite preview\",\n\t\t\"check\": \"svelte-kit sync && svelte-check --tsconfig ./tsconfig.json\",\n\t\t\"check:watch\": \"svelte-kit sync && svelte-check --tsconfig ./tsconfig.json --watch\",\n\t\t\"start\": \"node build\"\n\t},\n\t\"devDependencies\": {\n\t\t\"@sveltejs/adapter-node\": \"^5.2.12\",\n\t\t\"@sveltejs/kit\": \"^2.37.1\",\n\t\t\"@sveltejs/vite-plugin-svelte\": \"^5.0.3\",\n\t\t\"@tailwindcss/vite\": \"^4.1.4\",\n\t\t\"@types/reveal.js\": \"^5.0.3\",\n\t\t\"autoprefixer\": \"^10.4.21\",\n\t\t\"drizzle-kit\": \"^0.31.5\",\n\t\t\"flowbite\": \"^3.1.2\",\n\t\t\"svelte\": \"^5.15.0\",\n\t\t\"svelte-check\": \"^4.1.5\",\n\t\t\"tailwindcss\": \"^4.1.16\",\n\t\t\"tslib\": \"catalog:\",\n\t\t\"tsx\": \"^4.20.6\",\n\t\t\"typescript\": \"catalog:\",\n\t\t\"vite\": \"^6.1.0\",\n\t\t\"vite-plugin-top-level-await\": \"^1.5.0\",\n\t\t\"vite-plugin-wasm\": \"^3.4.1\"\n\t},\n\t\"type\": \"module\",\n\t\"dependencies\": {\n\t\t\"@docsearch/css\": \"^3.9.0\",\n\t\t\"@docsearch/js\": \"^3.9.0\",\n\t\t\"@sveltepress/theme-default\": \"^5.0.7\",\n\t\t\"@sveltepress/vite\": \"^1.1.5\",\n\t\t\"brace\": \"^0.11.1\",\n\t\t\"chart.js\": \"^4.4.8\",\n\t\t\"components\": \"workspace:*\",\n\t\t\"drizzle-orm\": \"^0.44.6\",\n\t\t\"drizzle-zod\": \"^0.8.3\",\n\t\t\"harper-editor\": \"workspace:*\",\n\t\t\"harper.js\": \"workspace:*\",\n\t\t\"lint-framework\": \"workspace:*\",\n\t\t\"lodash-es\": \"^4.17.21\",\n\t\t\"mysql2\": \"^3.15.2\",\n\t\t\"posthog-js\": \"^1.245.1\",\n\t\t\"reveal.js\": \"^5.1.0\",\n\t\t\"svelte-ace\": \"^1.0.21\",\n\t\t\"svelte-intersection-observer\": \"^1.0.0\",\n\t\t\"typed.js\": \"^2.1.0\",\n\t\t\"zod\": \"^4.1.12\"\n\t}\n}\n","packages/wordpress-plugin/package.json":"{\n\t\"name\": \"wordpress-plugin\",\n\t\"private\": true,\n\t\"version\": \"0.0.1\",\n\t\"description\": \"The grammar checker that respects your privacy.\",\n\t\"main\": \"build/index.js\",\n\t\"scripts\": {\n\t\t\"build\": \"wp-scripts build --webpack-copy-php\",\n\t\t\"check\": \"tsc --noEmit\",\n\t\t\"packages-update\": \"wp-scripts packages-update\",\n\t\t\"plugin-zip\": \"zip harper.zip build harper.php screenshot.png -r\",\n\t\t\"start\": \"wp-scripts start --webpack-copy-php\"\n\t},\n\t\"devDependencies\": {\n\t\t\"@types/lodash-es\": \"^4.17.12\",\n\t\t\"@types/react\": \"^18.3.0\",\n\t\t\"@types/react-dom\": \"^18.3.0\",\n\t\t\"@types/wordpress__edit-post\": \"^8.4.2\",\n\t\t\"@wordpress/scripts\": \"^30.9.0\",\n\t\t\"@wp-now/wp-now\": \"^0.1.74\",\n\t\t\"typescript\": \"catalog:\"\n\t},\n\t\"dependencies\": {\n\t\t\"@wordpress/components\": \"^29.2.0\",\n\t\t\"@wordpress/data\": \"^10.15.1\",\n\t\t\"@wordpress/edit-post\": \"^8.16.0\",\n\t\t\"@wordpress/editor\": \"^14.20.0\",\n\t\t\"@wordpress/plugins\": \"^7.20.0\",\n\t\t\"@wordpress/preferences-persistence\": \"^2.17.0\",\n\t\t\"harper.js\": \"workspace:*\",\n\t\t\"lodash-es\": \"^4.17.21\",\n\t\t\"react\": \"^18.0.0\",\n\t\t\"react-dom\": \"^18.0.0\"\n\t}\n}\n","packages/web/demo_wp_blueprint.json":"{\n\t\"$schema\": \"https://playground.wordpress.net/blueprint-schema.json\",\n\t\"preferredVersions\": {\n\t\t\"php\": \"8.0\",\n\t\t\"wp\": \"6.7\"\n\t},\n\t\"meta\": {\n\t\t\"title\": \"Demo of Harper for WordPress\",\n\t\t\"description\": \"Harper is a grammar checker for people who want to write, without any fuss.\",\n\t\t\"author\": \"elijah-potter\",\n\t\t\"categories\": []\n\t},\n\t\"landingPage\": \"/wp-admin/post.php?post=4&action=edit\",\n\t\"steps\": [\n\t\t{\n\t\t\t\"step\": \"login\",\n\t\t\t\"username\": \"admin\",\n\t\t\t\"password\": \"password\"\n\t\t},\n\t\t{\n\t\t\t\"step\": \"installPlugin\",\n\t\t\t\"pluginData\": {\n\t\t\t\t\"resource\": \"url\",\n\t\t\t\t\"url\": \"https://github.com/Automattic/harper/releases/download/v0.27.0/harper.zip\"\n\t\t\t},\n\t\t\t\"options\": {\n\t\t\t\t\"activate\": true\n\t\t\t}\n\t\t},\n\t\t{\n\t\t\t\"step\": \"installTheme\",\n\t\t\t\"themeData\": {\n\t\t\t\t\"resource\": \"wordpress.org/themes\",\n\t\t\t\t\"slug\": \"twentytwentyfour\"\n\t\t\t}\n\t\t},\n\t\t{\n\t\t\t\"step\": \"runPHP\",\n\t\t\t\"code\": \"<?php require_once 'wordpress/wp-load.php'; wp_insert_post(array('post_title' => 'Harper, in WordPress', 'post_content' => '<!-- wp:paragraph --><p><strong>Click on the Harper button on the top right of this page to get started.</strong></p><!-- /wp:paragraph --><!-- wp:paragraph --><p>Writing on the web can be scary. Theres a lot of competition for traffic and even a small grammatical mstake can be costly to your reputation and search rankings.</p><!-- /wp:paragraph --><!-- wp:paragraph --><p>That\\\\'s why we created Harper: an plugin to save you the embarassment. it can fix typos, serial commas and overall just make your life better.</p><!-- /wp:paragraph --><!-- wp:paragraph --><p>All that while respecting your privacy. You data should never leave Wordpress until you hit \\\"Publish\\\".</p><!-- /wp:paragraph -->'));\"\n\t\t}\n\t]\n}\n","packages/web/README.md":"# Web\n\nThis directory contains the source code for [https://writewithharper.com].\n\n## Building\n\nIn order to build the site, you must first compile `harper-wasm` with:\n\n```bash\nwasm-pack build --target bundler\n```\n","packages/wordpress-plugin/README.md":"# Harper for WordPress\n\n![The early prototype version of the plugin](./screenshot.png)\n\nThis repository contains the WordPress plugin for [Harper](https://writewithharper.com).\nIt is a work-in-progress. Here be dragons!\n\n## Contributing\n\nRefer to [the online documentation](https://writewithharper.com/docs/contributors/wordpress) for instructions to contribute to the plugin.\n","ARCHITECTURE.md":"# Harper's Architecture\n\nThis document has been moved to the [online documentation](https://writewithharper.com/docs/contributors/architecture).\n","AGENTS.md":"# Harper Docs Map for Agents\n\nThis repository’s documentation site is powered by Vite + SvelteKit + SveltePress.\n\nUse `packages/web/vite.config.ts` as the source of truth for documentation scope:\n- Sidebar and important doc routes are defined in `packages/web/vite.config.ts`.\n- Route `/docs/...` maps to `packages/web/src/routes/docs/...`.\n- Most docs are in `+page.md`; some are `+page.svelte` or route helpers.\n\nIf you are working on the Harper repository itself, please pay special attention to the `contributors/*` pages.\nImportantly, all the tools available in this repository are available via `just`. To learn more, run `just --list`.\nWhenever agents are done making changes, they should run `just format` before handing work back to the user.\nIf `just format` fails, you can use `just setup` to prepare the relevant dependencies.\n\nHuman coders should periodically review this file and manually migrate stable, human-facing guidance into the real documentation website under `packages/web` so it is available outside agent workflows.\nAgents should remind humans of this when possible.\n\n## Read First\n\n1. `packages/web/vite.config.ts`: Sidebar source of truth and canonical map of important docs routes.\n2. `packages/web/src/routes/docs/about/+page.md`: High-level product overview, privacy model, versioning policy, and ecosystem context.\n3. `packages/web/src/routes/docs/weir/+page.md`: Weir rule language reference with syntax, expression types, and examples.\n4. `packages/web/src/routes/docs/rules/+page.svelte`: Live/generated rule catalog (rule names, defaults, and descriptions).\n5. `packages/web/src/routes/docs/contributors/introduction/+page.md`: Entry point for contributors and links to deeper contributor docs.\n6. `./AGENT_POLICY.md`: Harper's policy on code generated by large language models. Agents MUST read this before making ANY changes.\n\n## Core Documentation Directories\n\n- `packages/web/src/routes/docs/about`\n- `packages/web/src/routes/docs/weir`\n- `packages/web/src/routes/docs/rules`\n- `packages/web/src/routes/docs/integrations`\n- `packages/web/src/routes/docs/harperjs`\n- `packages/web/src/routes/docs/contributors`\n\n## Route Prefix to File Prefix\n\n- `/docs/about` -> `packages/web/src/routes/docs/about/+page.md`\n- `/docs/weir` -> `packages/web/src/routes/docs/weir/+page.md`\n- `/docs/rules` -> `packages/web/src/routes/docs/rules/+page.svelte`\n- `/docs/integrations/*` -> `packages/web/src/routes/docs/integrations/*/+page.md`\n- `/docs/harperjs/*` -> `packages/web/src/routes/docs/harperjs/*/+page.md`\n- `/docs/contributors/*` -> `packages/web/src/routes/docs/contributors/*/+page.md`\n\n## Files Listed in the Sidebar (Local)\n\n- `packages/web/src/routes/docs/about/+page.md`: High-level product overview, privacy model, versioning policy, and ecosystem context.\n- `packages/web/src/routes/docs/weir/+page.md`: Weir rule language reference with syntax, expression types, and examples. Very important if you're asked to write a Weir rule.\n- `packages/web/src/routes/docs/rules/+page.svelte`: Live/generated rule catalog (rule names, defaults, and descriptions).\n- `packages/web/src/routes/docs/integrations/obsidian/+page.md`: Obsidian plugin overview, privacy/value comparison, installation, and support links.\n- `packages/web/src/routes/docs/integrations/chrome-extension/+page.md`: End-user Chrome extension overview and install link.\n- `packages/web/src/routes/docs/integrations/firefox-extension/+page.md`: End-user Firefox extension overview and install link.\n- `packages/web/src/routes/docs/integrations/wordpress/+page.md`: Current WordPress guidance, including migration recommendation to Chrome extension and legacy plugin status.\n- `packages/web/src/routes/docs/integrations/language-server/+page.md`: `harper-ls` install methods, dictionaries, code actions, ignore comments, and full configuration reference.\n- `packages/web/src/routes/docs/integrations/visual-studio-code/+page.md`: VS Code extension install, command list, and settings reference.\n- `packages/web/src/routes/docs/integrations/neovim/+page.md`: Neovim setup using `harper-ls`, plus optional and common config tweaks.\n- `packages/web/src/routes/docs/integrations/helix/+page.md`: Helix setup using `harper-ls`, plus optional and common config tweaks.\n- `packages/web/src/routes/docs/integrations/emacs/+page.md`: Emacs setup using `harper-ls`, plus optional and common config tweaks.\n- `packages/web/src/routes/docs/integrations/zed/+page.md`: Zed extension entry point and link to canonical extension README.\n- `packages/web/src/routes/docs/integrations/sublime-text/+page.md`: Sublime Text setup with `harper-ls` and LSP package configuration.\n- `packages/web/src/routes/docs/harperjs/introduction/+page.md`: `harper.js` mission, package overview, and installation starting point.\n- `packages/web/src/routes/docs/harperjs/linting/+page.md`: Core `harper.js` lint workflow and linter usage patterns.\n- `packages/web/src/routes/docs/harperjs/spans/+page.md`: Explains span objects and how to use them to locate/handle lint ranges.\n- `packages/web/src/routes/docs/harperjs/configurerules/+page.md`: How to programmatically read and set `LintConfig` to enable/disable rules.\n- `packages/web/src/routes/docs/harperjs/node/+page.md`: Node.js-specific usage notes, especially `LocalLinter` vs `WorkerLinter`.\n- `packages/web/src/routes/docs/harperjs/CDN/+page.md`: Browser/CDN usage via unpkg and ESM import patterns.\n- `packages/web/src/routes/docs/contributors/introduction/+page.md`: Contributor onboarding overview and links to architecture/testing/rule-authoring docs.\n- `packages/web/src/routes/docs/contributors/environment/+page.md`: Local development environment setup across Rust, Node/pnpm, and optional Nix shell.\n- `packages/web/src/routes/docs/contributors/committing/+page.md`: Commit message conventions and commit hygiene requirements.\n- `packages/web/src/routes/docs/contributors/architecture/+page.md`: System architecture and roles of core components like `harper-core`, `harper-ls`, and `harper.js`.\n- `packages/web/src/routes/docs/contributors/dictionary/+page.md`: Process for adding or updating curated dictionary entries.\n- `packages/web/src/routes/docs/contributors/testing-strategy/+page.md`: Harper's risk-driven testing strategy, covering automated checks, production feedback, manual testing, and testability.\n- `packages/web/src/routes/docs/contributors/author-a-rule/+page.md`: Step-by-step workflow for implementing and testing new grammar rules.\n- `packages/web/src/routes/docs/contributors/visual-studio-code/+page.md`: How to run, debug, test, and package the VS Code extension locally.\n- `packages/web/src/routes/docs/contributors/chrome-extension/+page.md`: Internal architecture and local development notes for the browser extensions.\n- `packages/web/src/routes/docs/contributors/desktop/+page.md`: Placeholder for Harper Desktop contributor documentation.\n- `packages/web/src/routes/docs/contributors/website/+page.md`: Local development, preview, and validation for writewithharper.com (SvelteKit/SveltePress).\n- `packages/web/src/routes/docs/contributors/wordpress/+page.md`: How to build and run the WordPress plugin locally.\n- `packages/web/src/routes/docs/contributors/obsidian/+page.md`: Obsidian-plugin contributor workflow and plugin-specific constraints.\n- `packages/web/src/routes/docs/contributors/review/+page.md`: PR reviewer playbook, including ways to fetch artifacts and test patches locally.\n- `packages/web/src/routes/docs/contributors/local-stats/+page.md`: Local stats logging model, `stats.txt` format, locations, and privacy behavior.\n- `packages/web/src/routes/docs/contributors/brill/+page.md`: Brief explanation of Harper’s Brill-tagging approach and further reading link.\n- `packages/web/src/routes/docs/contributors/faq/+page.md`: Contributor FAQ for conceptual distinctions (for example `Linter` vs `PatternLinter`).\n\n## Documentation Route Helpers (Non-`+page.md`)\n\n- `packages/web/src/routes/docs/about/+page.ts`: Route behavior helper (`ssr = false`) for the About page.\n- `packages/web/src/routes/docs/harperjs/CDN/example/+server.ts`: Serves the HTML example used by the `harper.js` CDN documentation page.\n\n## External Sidebar Targets (No Local Source File)\n\n- `https://docs.rs/harper-core/latest/harper_core/`\n- `/docs/harperjs/ref/index.html` (generated API reference target)\n\n## Projects Contained in This Repository\n\n- `harper-core`: The core grammar checking engine. This is a dependency to pretty much everything related to Harper.\n- `harper-ls`: A Language Server compatible with a number of text editors, including Neovim, Zed, and Helix. See above linked documentation for more details.\n- `harper-cli`: A command-line binary for debugging Harper's core engine and markup language support.\n- `harper-comments`: Provides parsers for a number of programming languages to support linting their comments.\n- `harper-wasm`: The WebAssembly build target that powers browser and JavaScript integrations such as `harper.js`.\n- `packages/lint-framework`: A package containing the tooling necessary to read/write/highlight text on the web for the purpose of linting.\n- `packages/components`: Shared Svelte component package used by web-facing packages.\n- `packages/harper-editor`: Shared Svelte editor package used by web-facing packages and Harper Desktop.\n- `packages/web`: The Harper website, including documentation and a live demo that uses the `lint-framework`.\n- `packages/harper.js`: The JavaScript package that uses `harper-wasm` to lint text from websites or Node.js processes.\n- `packages/chrome-plugin`: The Harper Chrome Extension - uses the `lint-framework`. Also support Firefox.\n- `packages/obsidian-plugin`\n- `packages/wordpress-plugin`\n- `packages/vscode-plugin`: The Harper Visual Studio Code plugin. Uses `harper-ls`.\n- `harper-desktop`: The Harper Desktop app. It is a Tauri v2 + SvelteKit SPA with an offline editor, settings UI, tray/service control, and native overlay highlighter.\n\nThere are of course projects in this repository not listed above. If relevant, feel free to poke around.\n\n## Harper Desktop\n\nRead the [Desktop contributor documentation](packages/web/src/routes/docs/contributors/desktop/+page.md) for the app's architecture and its relationship to the Cargo workspace.\n\n### Commands\n\n- Use `pnpm` for frontend packages; `harper-desktop/package.json` pins `pnpm@10.10.0`.\n- Dev app: `just dev-desktop` from repo root. It builds shared web packages, runs `cargo tauri dev`, and Tauri then runs `pnpm dev` on port `1420`.\n- Start the highlighter process directly: `just dev-desktop-highlighter` from repo root.\n- Frontend checks: `pnpm check` from `harper-desktop`.\n- Frontend build only: `pnpm build` from `harper-desktop`.\n- Full desktop checks: `just check-desktop` from repo root.\n- Bundle builds match CI: `just build-desktop-linux` or `just build-desktop-macos`.\n- `just build-desktop-linux` builds deb/rpm/appimage bundles.\n- `just build-desktop-macos` builds app/dmg bundles.\n\n### Architecture\n\n- It is a SvelteKit SPA inside Tauri v2.\n- SSR is disabled in `harper-desktop/src/routes/+layout.ts`.\n- `harper-desktop/svelte.config.js` uses `adapter-static` with `fallback: \"index.html\"`.\n- Main Rust entrypoint is `harper-desktop/src-tauri/src/main.rs`, which calls `harper_desktop_lib::run()`.\n- CLI behavior is in `harper-desktop/src-tauri/src/lib.rs`: no subcommand runs the normal Tauri app; `highlighter` runs the native overlay highlighter.\n- Tauri config lives in `harper-desktop/src-tauri/tauri.conf.json`.\n- Tauri capabilities live in `harper-desktop/src-tauri/capabilities/default.json`.\n- The main Svelte route is `harper-desktop/src/routes/+page.svelte`; it switches between the settings UI and editor UI.\n- The editor UI lives in `harper-desktop/src/lib/EditorView.svelte` and uses workspace dependencies on `harper.js` and `harper-editor`.\n- The settings UI lives under `harper-desktop/src/lib/settings/`.\n- Rust uses local workspace dependencies from `harper-desktop/src-tauri/Cargo.toml`, including `harper-core` and `harper-dictionary-wordlist`.\n- The Tauri app starts a tray/menu-bar controlled highlighter service on launch and can open editor/settings windows from the tray.\n- Editor and settings windows hide on close instead of exiting; quit is handled through the tray menu.\n\n### Highlighter Architecture\n\n- The highlighter is Rust/egui/winit code under `harper-desktop/src-tauri/src/highlighter/`.\n- `Highlighter` is the public entry point for the overlay system.\n- `Window` owns native window/GPU plumbing.\n- `WindowManager` owns the winit event loop, monitor windows, cursor hit-testing, and popup selection.\n- `RenderState` owns highlight rendering, popup drawing, markdown rendering cache, and popup action dispatch.\n- `RenderState` uses `ActionableLint` values from `harper-desktop/src-tauri/src/rect.rs`.\n- `ActionableLint` stores lint geometry, the Harper `Lint`, and source text needed for suggestion application and popup actions.\n- Suggestion popup actions currently include close, apply suggestion, ignore lint, add to dictionary, disable rule, and refresh config.\n- Popup hover text is implemented in `RenderState` button helpers.\n- The highlighter read interval is set in `run_highlighter()` with `with_read_interval(Duration::from_millis(16))`.\n\n### OS Integration\n\n- OS integration is behind `harper-desktop/src-tauri/src/os_broker.rs`.\n- macOS uses `harper-desktop/src-tauri/src/mac_broker.rs`.\n- non-macOS currently uses `NoopBroker`.\n- macOS highlighter focus handling depends on `MacBroker.last_focused`; clicking the overlay can make the highlighter process focused, so accessibility reads fall back to the last non-highlighter PID.\n- macOS integrations are bundle-ID based and controlled by persisted `Integration` entries.\n- Highlighter stdout is reserved for JSON-line IPC. Diagnostics in highlighter paths should use `eprintln!`, not `println!`.\n\n### IPC And App State\n\n- Tauri app state lives in `harper-desktop/src-tauri/src/config.rs`.\n- `Config` currently stores `mutable_dictionary: MutableDictionary`, `dialect: Dialect`, `ignored_lints: IgnoredLints`, `lint_config: FlatConfig`, and `integrations: Vec<Integration>`.\n- `Config::new()` uses `MutableDictionary::new()`, `Dialect::American`, `IgnoredLints::new()`, `FlatConfig::new_curated()`, and curated default integrations.\n- Config is persisted under the system config directory in a `harper-desktop` folder. Main settings are serialized to `config.json`; the mutable dictionary is stored separately as `dictionary.txt`.\n- `Config::load_from_system()` loads the serialized config and then hydrates the mutable dictionary with the selected dialect.\n- The Tauri app owns shared config as `Arc<Mutex<Config>>`.\n- `run_tauri()` loads persisted config, creates `HighlighterService`, starts the highlighter service, and creates the tray/menu-bar UI.\n- The highlighter process is spawned through `harper-desktop/src-tauri/src/highlighter_process.rs`.\n- IPC is implemented under `harper-desktop/src-tauri/src/communication/`.\n- IPC uses newline-delimited JSON over child stdin/stdout.\n- The Tauri app is the protocol server.\n- The highlighter process is the protocol client.\n- Protocol messages live in `harper-desktop/src-tauri/src/communication/message.rs`.\n- Supported requests include `GetLintConfig`, `GetDictionary`, `GetDialect`, `GetIgnoredLints`, `GetIntegrations`, `SetLintConfig`, `IgnoreLint`, `AddToDictionary`, `AddIntegration`, `RemoveIntegration`, and `SetIntegrationEnabled`.\n- Supported responses include `GetLintConfig`, `GetDictionary`, `GetDialect`, `GetIgnoredLints`, `GetIntegrations`, and `Ack`.\n- `IgnoredLints` is transferred as whole serialized state and merged server-side.\n- `AddToDictionary` sends only the word; Rust appends it with `DictWordMetadata::default()`.\n- The highlighter uses a Tokio current-thread runtime to call async IPC client methods from synchronous UI callbacks.\n- That runtime is bridge plumbing only; it is not used for linting or UI rendering.\n\n### Dictionary And Linting Gotchas\n\n- Keep dictionary construction centralized through `Config::dictionary_from_user_dictionary(user_dictionary: MutableDictionary) -> Arc<MergedDictionary>` and `Config::create_dictionary()`.\n- Keep linter construction centralized through `Config::create_linter()`.\n- The same merged dictionary source must be used for both `Document::new_markdown_default(text, &dictionary)` and `LintGroup::new_curated(dictionary, dialect)`.\n- Do not use `Document::new_markdown_default_curated(text)` in the main highlighter lint callback when user dictionary words should suppress spelling lints.\n- Harper spelling lint behavior depends on document token metadata, so a linter with the updated dictionary is not enough if the `Document` was built with the curated dictionary only.\n- `RenderState` may still use curated document construction for localized source extraction where dictionary membership does not matter.\n\n### Frontend Integration\n\n- Tauri commands in `harper-desktop/src-tauri/src/lib.rs` include `get_lint_config`, `get_dialect`, `set_dialect`, `set_lint_config`, `get_dictionary`, `set_dictionary`, `ignore_lint`, `add_to_dictionary`, `get_integrations`, `add_integration`, `remove_integration`, and `set_integration_enabled`.\n- JS helper lives in `harper-desktop/src/lib/client.ts`.\n- JS helper class is named `Client` and exposes static methods for lint config, dialect, dictionary, ignored lints, dictionary additions, and integrations.\n- `Client.ignoreLint(...)` uses Harper JS ignored-lints export data and invokes the Rust command.\n- `Client.addToDictionary(word)` sends only the word to Rust.\n- Vite's dev server must stay on port `1420`; `harper-desktop/vite.config.js` uses `strictPort: true` because Tauri expects that port.\n- Vite intentionally ignores `src-tauri/**` during frontend file watching.\n\n### Repo-Specific Gotchas\n\n- CI installs `wasm-pack`, `tauri-cli`, and `cargo-hack` with `cargo binstall`, then runs the relevant root `just` task.\n- Avoid mixing behavior fixes with structural refactors in the highlighter; popup/UI, IPC, dictionary behavior, config persistence, settings UI, and OS-coordinate fixes are easier to review separately.\n\n### Known Review Findings\n\n- Secondary-monitor highlighter coordinates may be wrong. Accessibility rectangles appear to be global screen coordinates, while each overlay window's egui origin is local to that monitor/window. Translate by monitor/window origin or render through one virtual-desktop-sized overlay.\n- macOS text range lookup may be wrong after emoji or other non-BMP characters. Harper spans are char-based, while macOS accessibility ranges are NSString/UTF-16 based. Convert spans before calling `AXBoundsForRangeParameterizedAttribute`.\n\n## On Writing New Rules\n\nWhen asked to write a new rule, keep these guidelines in mind:\n\n- The user is almost always expecting you to write it to a file. Which file and where is up to you to find out.\n- You should include at least 15 total tests, covering a wide variety of cases. Cover false-positives, false negatives, true positives, and if relevant, true negatives.\n- You should run any and all tests to ensure that you do no break existing behavior and that your new rule runs the way you expect. At minimum, that means `just test-rust`. Make sure to check the snapshots for changes.\n- After adding a new rule, update `harper-core/default_config.json` so it is enabled in the curated default config.\n- Built-in Weir rules can be grouped by putting related `.weir` files in a directory under `harper-core/src/linting/weir_rules`; the directory name becomes the single public rule name.\n- If the rule is related to a closed compound noun, see if you can just add an entry to the existing closed compound linter.\n\nUnless you are specifically requested to write the rule in a specific way, choose the language (Rust or Weir) and methodology that fits the task.\n\nALWAYS run extensive bullet tests with `cargo run --bin harper-cli --release -- lint <TEXT>` to make sure the new rule isn't already covered by Harper.\n\n## Workflow for Writing Weir Rules\n\n1. Draft the core expression\n- Encode the match with `expr main` using words, sequences, alternatives, filters, exceptions, POS tags, wildcards, or punctuation.\n- Keep the expression minimal but precise; avoid overmatching.\n- If a wordlist is needed, include it as its own expression, used with an expression reference.\n\n2. Add rule metadata\n- `let message`, `let description`, `let kind`, `let becomes` (and `let strategy` if needed).\n- Use `strategy \"Exact\"` when casing must be normalized; otherwise default behavior or `MatchCase` as appropriate.\n\n3. Add tests (required)\n- Include at least 15 tests.\n- Tests must cover: true positives, false positives, false negatives, and (if relevant) true negatives.\n- Prefer a mix of casing, punctuation, whitespace, and nearby-token variations.\n\n4. Sanity-check edge cases\n- Ensure exceptions do not block valid matches.\n- Ensure replacements are correct and not destructive.\n\n5. Run the tests.\n- Fix any issues that arise.\n\n### Output Format\n\nWrite a Weir rule to a new file with a name of your choosing, including `expr main`, `let` fields, and tests. Make sure it has the extension `.weir`.\n\n## Tips\n\nBefore finishing your turn, run `just format` or `cargo fmt` if you have made any changes. This can help diffs if a human decides to make a commit.\n\nTry to write in a functional style. Minimize adding state whenever it is possible while also respecting the user's query. If additional state is necessary, please centralize it to increase visibility.\n\n","packages/web/tsconfig.json":"{\n\t\"extends\": \"./.svelte-kit/tsconfig.json\",\n\t\"compilerOptions\": {\n\t\t\"allowJs\": true,\n\t\t\"checkJs\": true,\n\t\t\"esModuleInterop\": true,\n\t\t\"forceConsistentCasingInFileNames\": true,\n\t\t\"resolveJsonModule\": true,\n\t\t\"skipLibCheck\": true,\n\t\t\"sourceMap\": true,\n\t\t\"strict\": true\n\t}\n\t// Path aliases are handled by https://kit.svelte.dev/docs/configuration#alias\n\t//\n\t// If you want to overwrite includes/excludes, make sure to copy over the relevant includes/excludes\n\t// from the referenced tsconfig.json - TypeScript does not merge them in\n}\n","packages/vscode-plugin/README.md":"# Harper for VS Code\n\nHarper is the next-generation grammar checker for your code. You can think of it as an alternative to Grammarly. It catches common stylistic errors, as well as complex grammatical or layout-related problems. It works for almost [all common programming languages](https://writewithharper.com/docs/integrations/language-server#Supported-Languages) and a number of markup formats.\n\nIf you use Rust, Java, JavaScript, or any number of other programming languages, your comments may end up as part of your API's documentation. If that's the case, grammatical mistakes in your code could be down-ranking your site on search results and tarnishing your reputation for quality.\n\nMost importantly, Harper runs on-device and uses barely any memory at all. That means you can get feedback on your work in milliseconds, dramatically increasing your iteration speed.\n\nYou can learn more about [this extension](https://writewithharper.com/docs/integrations/visual-studio-code) and [Harper](https://writewithharper.com/docs/about) over at our [official website](https://writewithharper.com).\n","packages/vscode-plugin/tsconfig.json":"{\n\t\"exclude\": [\"src/tests/fixtures\"],\n\t\"compilerOptions\": {\n\t\t\"module\": \"Node16\",\n\t\t\"target\": \"ES2022\",\n\t\t\"lib\": [\"ES2022\", \"DOM\"],\n\t\t\"sourceMap\": true,\n\t\t\"rootDir\": \"src\",\n\t\t\"outDir\": \"build\",\n\t\t\"strict\": true,\n\t\t\"skipLibCheck\": true\n\t}\n}\n","packages/vscode-plugin/development-guide.md":"# Development Guide\n\nThis document has been moved to the [official documentation](https://writewithharper.com/docs/contributors/visual-studio-code).\n","packages/vscode-plugin/package.json":"{\n\t\"name\": \"harper\",\n\t\"displayName\": \"Harper - Grammar / Spell Checking\",\n\t\"description\": \"The grammar checker for developers\",\n\t\"version\": \"2.13.0\",\n\t\"private\": true,\n\t\"author\": \"Elijah Potter\",\n\t\"publisher\": \"elijah-potter\",\n\t\"license\": \"Apache-2.0\",\n\t\"icon\": \"icon.png\",\n\t\"galleryBanner\": {\n\t\t\"color\": \"#F2F2F2\",\n\t\t\"theme\": \"light\"\n\t},\n\t\"repository\": {\n\t\t\"type\": \"git\",\n\t\t\"url\": \"https://github.com/automattic/harper\"\n\t},\n\t\"bugs\": {\n\t\t\"url\": \"https://github.com/automattic/harper/issues\"\n\t},\n\t\"engines\": {\n\t\t\"vscode\": \"^1.96.2\"\n\t},\n\t\"categories\": [\n\t\t\"Other\"\n\t],\n\t\"keywords\": [\n\t\t\"grammar\",\n\t\t\"spellcheck\",\n\t\t\"writing\"\n\t],\n\t\"activationEvents\": [\n\t\t\"onLanguage:asciidoc\",\n\t\t\"onLanguage:c\",\n\t\t\"onLanguage:clojure\",\n\t\t\"onLanguage:cmake\",\n\t\t\"onLanguage:cpp\",\n\t\t\"onLanguage:csharp\",\n\t\t\"onLanguage:dart\",\n\t\t\"onLanguage:elixir\",\n\t\t\"onLanguage:git-commit\",\n\t\t\"onLanguage:gleam\",\n\t\t\"onLanguage:go\",\n\t\t\"onLanguage:groovy\",\n\t\t\"onLanguage:haskell\",\n\t\t\"onLanguage:html\",\n\t\t\"onLanguage:ink\",\n\t\t\"onLanguage:java\",\n\t\t\"onLanguage:javascript\",\n\t\t\"onLanguage:javascriptreact\",\n\t\t\"onLanguage:jj-commit\",\n\t\t\"onLanguage:kotlin\",\n\t\t\"onLanguage:literate haskell\",\n\t\t\"onLanguage:lua\",\n\t\t\"onLanguage:markdown\",\n\t\t\"onLanguage:nix\",\n\t\t\"onLanguage:org\",\n\t\t\"onLanguage:php\",\n\t\t\"onLanguage:powershell\",\n\t\t\"onLanguage:plaintext\",\n\t\t\"onLanguage:python\",\n\t\t\"onLanguage:quarto\",\n\t\t\"onLanguage:r\",\n\t\t\"onLanguage:rmd\",\n\t\t\"onLanguage:rmarkdown\",\n\t\t\"onLanguage:ruby\",\n\t\t\"onLanguage:rust\",\n\t\t\"onLanguage:scala\",\n\t\t\"onLanguage:scminput\",\n\t\t\"onLanguage:shellscript\",\n\t\t\"onLanguage:solidity\",\n\t\t\"onLanguage:swift\",\n\t\t\"onLanguage:tex\",\n\t\t\"onLanguage:latex\",\n\t\t\"onLanguage:toml\",\n\t\t\"onLanguage:typescript\",\n\t\t\"onLanguage:typescriptreact\",\n\t\t\"onLanguage:typst\",\n\t\t\"onLanguage:zig\"\n\t],\n\t\"main\": \"./build/extension.js\",\n\t\"contributes\": {\n\t\t\"icons\": {\n\t\t\t\"harper-logo\": {\n\t\t\t\t\"description\": \"Harper logo\",\n\t\t\t\t\"default\": {\n\t\t\t\t\t\"fontPath\": \"media/harper.woff\",\n\t\t\t\t\t\"fontCharacter\": \"\\\\e900\"\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\t\t\"languages\": [\n\t\t\t{\n\t\t\t\t\"id\": \"gleam\",\n\t\t\t\t\"aliases\": [\n\t\t\t\t\t\"Gleam\",\n\t\t\t\t\t\"gleam\"\n\t\t\t\t],\n\t\t\t\t\"extensions\": [\n\t\t\t\t\t\".gleam\"\n\t\t\t\t]\n\t\t\t}\n\t\t],\n\t\t\"commands\": [\n\t\t\t{\n\t\t\t\t\"command\": \"harper.languageserver.restart\",\n\t\t\t\t\"title\": \"Harper: Restart Language Server\",\n\t\t\t\t\"description\": \"Restart harper-ls\"\n\t\t\t}\n\t\t],\n\t\t\"configuration\": {\n\t\t\t\"type\": \"object\",\n\t\t\t\"title\": \"Harper\",\n\t\t\t\"properties\": {\n\t\t\t\t\"harper.path\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"string\",\n\t\t\t\t\t\"description\": \"Optional path to a harper-ls executable to use.\"\n\t\t\t\t},\n\t\t\t\t\"harper.codeActions.ForceStable\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": false,\n\t\t\t\t\t\"description\": \"Make code actions appear in \\\"stable\\\" positions by placing code actions that should always be available, like adding misspelled words in the dictionary, first.\"\n\t\t\t\t},\n\t\t\t\t\"harper.dialect\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"string\",\n\t\t\t\t\t\"enum\": [\n\t\t\t\t\t\t\"British\",\n\t\t\t\t\t\t\"American\",\n\t\t\t\t\t\t\"Canadian\",\n\t\t\t\t\t\t\"Australian\"\n\t\t\t\t\t],\n\t\t\t\t\t\"default\": \"American\",\n\t\t\t\t\t\"description\": \"Set which dialect of English Harper should expect.\"\n\t\t\t\t},\n\t\t\t\t\"harper.diagnosticSeverity\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"string\",\n\t\t\t\t\t\"enum\": [\n\t\t\t\t\t\t\"error\",\n\t\t\t\t\t\t\"hint\",\n\t\t\t\t\t\t\"information\",\n\t\t\t\t\t\t\"warning\"\n\t\t\t\t\t],\n\t\t\t\t\t\"default\": \"information\",\n\t\t\t\t\t\"description\": \"How severe do you want diagnostics to appear in the editor?\"\n\t\t\t\t},\n\t\t\t\t\"harper.excludePatterns\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"array\",\n\t\t\t\t\t\"description\": \"A set of globs to ignore. If a file matches any of the globs, it will not be linted.\"\n\t\t\t\t},\n\t\t\t\t\"harper.fileDictPath\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"string\",\n\t\t\t\t\t\"description\": \"Optional path to a file dictionary directory to use.\"\n\t\t\t\t},\n\t\t\t\t\"harper.isolateEnglish\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": false,\n\t\t\t\t\t\"description\": \"Only lint English text in documents that are a mixture of English and another language.\"\n\t\t\t\t},\n\t\t\t\t\"harper.markdown.IgnoreLinkTitle\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": false,\n\t\t\t\t\t\"description\": \"Skip linting link titles.\"\n\t\t\t\t},\n\t\t\t\t\"harper.maxFileLength\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"number\",\n\t\t\t\t\t\"default\": 120000,\n\t\t\t\t\t\"description\": \"Maximum length of file to be linted (in bytes). If a file is larger than this, it will not be linted.\"\n\t\t\t\t},\n\t\t\t\t\"harper.userDictPath\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"string\",\n\t\t\t\t\t\"description\": \"Optional path to a user dictionary file to use.\"\n\t\t\t\t},\n\t\t\t\t\"harper.workspaceDictPath\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"string\",\n\t\t\t\t\t\"description\": \"Optional path to a workspace-local dictionary file to use.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.ACoupleMore\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"Corrects `a couple of more` to `a couple more`.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.ALittleOfPractice\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"Corrects `a little of practice` to `a little practice` or `a bit of practice`.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.ALongTime\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"Corrects `along time` to `a long time`.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.AMeansToAnEnd\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"Corrects `a mean to an end` to `a means to an end`\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.AOkHyphen\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"Replaces the loose article-plus-abbreviation pairing with the standard hyphenated form whenever a linking verb describes readiness or approval.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.APart\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"Finds and corrects common mistakes between 'a part' and 'apart'\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.ASomeTime\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"Removes the redundant/conflicting indefinite article `a` before `some` when followed by time expressions.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.AWaysToGo\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"Corrects the idiom `a ways to go` when the indefinite article is missing.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.AWhile\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"Enforces `awhile` after verbs and `a while` everywhere else.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.AWholeOther\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"Corrects `a whole another`/`a whole 'nother` to `a whole other`.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.AccuseOf\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"Corrects `accuse for` to `accuse of`.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.AdNauseam\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"Corrects `as nauseam` to `ad nauseam`.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.Addicting\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"Replaces `addicting` with `addictive` when used as an adjective.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.AdjectiveDoubleDegree\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"Finds adjectives that are used as double degrees (e.g. `more prettier`).\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.AdjectiveOfA\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"This rule looks for sequences of words of the form `adjective of a`.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.Ado\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"Corrects `adieu` to `ado`.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.AdvantageOf\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"Corrects the missing preposition in the idiom `take advantage of` when `of` is dropped.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.AfterAWhile\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"Corrects the missing article in `after while`, forming `after a while`.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.AfterAll\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"Corrects `afterall` to `after all`.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.AfterLater\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"Checks for the word `later` following `after [a period of time]`.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.AheadAnd\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"Corrects `an` to `and` after `ahead`.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.Ajar\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"Corrects `a jar` to `ajar`.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.Akimbo\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"Corrects `a kimbo` to `akimbo`.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.Albeit\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"Corrects this expression to the standard `albeit`.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.AllHellBreakLoose\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"Corrects forms of `all hell breaks out` to `all hell breaks loose`.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.AllIntentsAndPurposes\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"Finds and corrects common wrong forms of the phrase 'for all intents and purposes' / 'to all intents and purposes'.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.AllOfASudden\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"Guides this expression toward the standard `all of a sudden`.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.AllReady\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"Flags `all ready` when it precedes an adjective so the adverb `already` can take its place.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.AllThough\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"Nobody means to write the two-word phrase `all though` when the single word `although` is intended.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.AllWellAndGood\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"Corrects `all well in good` to `all well and good`.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.AllowTo\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"Flags erroneous usage of `allow to` without a subject.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.Alongside\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"Replaces the spaced form `along side` with `alongside`.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.AlzheimersDisease\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"Fixes the common misnomer `old-timers' disease`, ensuring the correct medical term `Alzheimer’s disease` is used.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.AmInTheMorning\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"Finds redundant am/pm indicators used together with time periods such as 'in the morning' or 'at night'.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.AmazonNames\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"When referring to the various products of Amazon.com, make sure to treat them as a proper noun.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.Americas\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"When referring to North, Central, and South America, make sure to treat them as a proper noun.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.AmountsFor\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"Corrects `amounts for` to either `amounts to` or `accounts for`\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.AnA\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"A rule that looks for incorrect indefinite articles. For example, `this is an mule` would be flagged as incorrect.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.AnAnother\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"Corrects `an another` and `a another`.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.AnalogAcousticBike\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": false,\n\t\t\t\t\t\"description\": \"Suggests more standard terms for `analog/analogue bike` and `acoustic bike`.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.AndIn\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"Fixes the typo `an in` when it stands in for the conjunction `and in`, while avoiding common `in-...` noun phrases and a few attested exceptions.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.AndSuch\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"Corrects `and the such` to `and such`.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.AndTheLike\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"Corrects mistakes in `and the like` and `or the like`.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.AnotherAn\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"Corrects `another an` to `another`.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.AnotherOnes\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"Corrects `another ones`.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.AnotherThingComing\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"Though `another think coming` is the original phrase, `another thing coming` is now more common.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.AnotherThings\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"Corrects `another things`.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.AnotherThinkComing\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": false,\n\t\t\t\t\t\"description\": \"Though `another thing coming` is now more common, `another think coming` is the original phrase.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.Anybody\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"Looks for incorrect spacing inside the closed compound `anybody`.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.Anyhow\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"Looks for incorrect spacing inside the closed compound `anyhow`.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.Anywhere\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"Looks for incorrect spacing inside the closed compound `anywhere`.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.ApartFrom\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"Flags the misspelling `apart form` and suggests `apart from`.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.AppleNames\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"When referring to Apple products and services, make sure to treat them as proper nouns.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.ArgumentToBeMade\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"Corrects `argument to be said` to `argument to be made`.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.ArriveOnWeekday\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"Keeps schedules explicit by preferring the familiar `arrive on Friday` pattern instead of a bare weekday.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.ArriveTo\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"Corrects `arrive to` to `arrive at` or `arrive in`.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.AsComparedTo\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"Corrects `as compare to` to `as compared to`.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.AsEvidentBy\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"Corrects `evident by` to `evidenced by` in passive constructions where `evidence` is used as a verb.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.AsFarAsICanTell\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"Expands an initialism.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.AsFarAsIKnow\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"Expands an initialism.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.AsFarBackAs\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"Corrects nonstandard `as early back as` to `as far back as`.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.AsFollows\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"Corrects the phrase `as follow`, which is sometimes produced by overcorrection. While it appeared briefly in 19th-century English, it is now considered archaic; modern standard usage requires `as follows` regardless of number.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.AsHow\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"Corrects `as how` to `as to how`.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.AsIUnderstandIt\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"Expands an initialism.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.AsIfThough\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"Corrects redundant `as if though`.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.AsIsWithAnything\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"Flags the incorrect idiom blend `as is with anything` and suggests standard alternatives like `as with anything` or `as is the case with anything`.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.AsItHappens\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"Corrects `as it so happens` to `as it happens`.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.AsLongAs\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"Corrects `aslong as` and `as long that` to `as long as`.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.AsMuchAs\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"Corrects `as much than` to `as much as`.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.AsOfCurrently\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"Corrects `as of currently` to `currently` or `as of now`.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.AsOfLately\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"Corrects `as of lately` to `lately` or `as of late`.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.AsOpposedTo\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"Corrects `as oppose to` to `as opposed to`.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.AsSoonAsPossible\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"Expands an initialism.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.AsToInterrogative\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"Corrects `to` to `as to` between certain adjectives and `wh-words`.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.AskNoPreposition\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"Identifies sequences like `ask to us` or `tell to him` and recommends removing the superfluous “to”.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.AspireTo\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"Corrects `aspire for` to `aspire to`.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.AtAllCosts\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"Corrects `at all cost` to `at all costs`.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.AtFaceValue\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"Corrects nonstandard variants of `at face value`.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.AtLeasToLeast\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"Fixes the frequent typo `at leas` when the intended expression is `at least`.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.AtLestToLeast\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"Fixes the mistake `at lest` when the intended expression is `at least`.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.AtTheBestOfTimes\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"Corrects `in the best of times` to `at the best of times`.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.AtTheEndOfTheDay\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"Corrects `in the end of the day` to `at the end of the day`.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.AtTheExpenseOf\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"The correct idiom is `at the expense of`, with singular `expense`. But retain `expanse` if this phrase refers to a wide area.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.AtTheVeryLeast\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"Corrects `in the very least` to `at the very least`.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.Audible\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"Corrects `hearable` to `audible`.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.Australia\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"When referring to states, territories, and cities in Australia, make sure to treat them as a proper noun.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.AvoidAndAlso\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"Reduces redundancy by replacing `and also` with `and`.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.AvoidContractions\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": false,\n\t\t\t\t\t\"description\": \"Suggests expanded forms for common contractions, such as `isn't` → `is not` and `we're` → `we are`.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.AvoidCurses\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"Flags offensive language and offers various ways to censor or replace with euphemisms.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.AwaitFor\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"Suggests using either `await` or `wait for` but not both, as they express the same meaning.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.AwareOf\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"Corrects `aware about` to the standard `aware of`.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.AzureNames\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"When referring to Azure cloud services, make sure to treat them as proper nouns.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.BackInTheDay\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"This linter flags instances of the nonstandard phrase `back in the days`. The correct, more accepted form is `back in the day`\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.BackhandedCompliment\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"Corrects `backhand compliment` to `backhanded compliment`.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.Backplane\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"Looks for incorrect spacing inside the closed compound `backplane`.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.BadRap\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"Changes `bed rap` to the proper idiom `bad rap`.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.BainBane\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"Detects mixing up `bain` and `bane`.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.BanTogether\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"Detects and corrects the common error of using `ban together` instead of the idiom `band together`, which means to unite or join forces.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.BareBones\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"Corrects `bare-bone` to `bare-bones`.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.BareInMind\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"Ensures the phrase `bear in mind` is used correctly instead of `bare in mind`.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.BareWithMe\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"Corrects `bare with` to `bear with`.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.BarelyUn\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"Flags using `barely` with a negative adjective starting with `un-` (`barely unusable`, etc.), which is a kind of double negative.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.BatedBreath\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"Changes `baited breath` to the correct `bated breath`.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.BeAllowed\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"Ensures the passive form uses `be allowed` after future negatives.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.BeBiased\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"Detects incorrect use of 'be + verb' instead of `be + adjective`.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.BeConcerned\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"Detects incorrect use of 'be + verb' instead of `be + adjective`.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.BePrejudiced\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"Detects incorrect use of 'be + verb' instead of `be + adjective`.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.BeRightBack\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"Expands an initialism.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.BeShocked\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"Detects incorrect use of 'be + verb' instead of `be + adjective`.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.BeWorried\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"Detects incorrect use of 'be + verb' instead of `be + adjective`.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.BeckAndCall\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"Fixes eggcorns of `beck and call`.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.BeenThere\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"Corrects the misspelling `bee there` to the proper phrase `been there`.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.Beforehand\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"`Beforehand` functions as a fixed adverb meaning ‘in advance’; writing it as two words or with a hyphen is nonstandard and can jar readers.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.BehindTheScenes\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"Corrects `behind the scene` to `behind the scenes`.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.BellowBelow\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"Looks for `bellow` wrongly used when `below` is intended.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.BesideThePoint\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"Corrects `besides the point` to `beside the point`.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.BestOfAllTime\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"Checks for nonstandard `of all times` in superlatives instead of singular `time`\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.BestRegards\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"In valedictions, `best` expresses your highest regard—avoid the typo `beat regards`.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.BetterOffPhrase\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"Rewrites `better of` to `better off` in common comparative phrasing.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.BetterOffServed\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"Corrects `better off served` to `better off` or `better served`.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.BetterOffWith\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"Corrects `better of with` to `better off with`.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.BewareOf\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"The verb `beware` naturally pairs with `of` before the noun being warned about, so swap other prepositions for clarity.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.BlacklistWhitelist\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"Normalize the two-word sequence `black list`/`white list` so it matches the established compound noun or verb.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.BlanketStatement\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"Corrects common errors in the phrase `blanket statement`.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.BluRayHyphen\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"Joins the two-word spelling of the optical disc format into the standard compound form.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.BoarderBorder\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"Flags the eggcorn `boarder` (a lodger) where `border` (an edge/boundary) is intended.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.Bollocks\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"Corrects `bullocks` to `bollocks` when the meaning is `nonsense`.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.BoringWords\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": false,\n\t\t\t\t\t\"description\": \"This rule looks for particularly boring or overused words. Using varied language is an easy way to keep a reader's attention.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.Bought\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"Replaces the incorrect past-tense spelling `bough` with `bought` after subject pronouns.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.BrandBrandish\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"Looks for `brandish` wrongly used when `brand` is intended.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.Brutality\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"Suggests the more standard and common synonym `brutality`.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.BuiltIn\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"English convention treats `built-in` as a single, attributive adjective—meaning something integrated from the outset—whereas other forms like `in built` are nonstandard and can feel awkward to readers.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.ByAccident\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"Incorrect preposition: `by accident` is the idiomatic expression.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.ByExtension\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"Corrects `by extent` to `by extension`.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.ByOnesOwn\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"Fixes incorrect phrases like `by my own` by suggesting `on my own` or `by myself`.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.ByTheBook\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"Corrects `by the books` to `by the book`.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.ByTheWay\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"Expands an initialism.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.Bypass\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"Looks for incorrect spacing inside the closed compound `bypass`.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.CallItQuits\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"Corrects wrong variants of the idiom 'call it quits'.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.CallThem\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"Addresses the non-idiomatic phrases `call them as`.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.CanBeSeen\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"Corrects `can be seem` to the proper phrase `can be seen`.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.Canada\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"When referring to provinces, territories, and cities in Canada, make sure to treat them as a proper noun.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.Cant\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"Suggests correcting `cant` to `can't`.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.CantWay\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"Corrects `way` to `wait` in high-confidence contexts such as `can't way to` and `doesn't way for`.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.CapitalizeOn\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"A collection of linters that can be run as one.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.CapitalizePersonalPronouns\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"Forgetting to capitalize personal pronouns, like \\\"I\\\" or \\\"I'm\\\" is one of the most common errors. This rule helps with that.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.CaseInPoint\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"Corrects `case and point` to `case in point`.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.CaseSensitive\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"Ensures `case-sensitive` is correctly hyphenated.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.Catch22\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"Corrects mistakenly using similar-sounding words in the idiom `catch 22`.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.CauseItIsBecause\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"Normalizes informal `cause it is` to the standard subordinating form in explanatory clauses.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.CautionaryTale\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"Corrects confusion between `tale` (story) and `tail` (appendage) in common phrases.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.CeaseTo\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"Detects when `seize to` is likely a typo for `cease to`.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.Chalkboard\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"Looks for incorrect spacing inside the closed compound `chalkboard`.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.ChampAtTheBit\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"Corrects `chomp at the bit` to the idiom `champ at the bit`, which has an equestrian origin referring to the way an anxious horse grinds its teeth against the metal part of the bridle.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.ChangeTack\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"Locates errors in the idioms `to change tack` and `change of tack` to convey the correct meaning of altering one's course or strategy.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.ChickenAndEgg\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"Corrects wrong variants of the `chicken-and-egg` idiom.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.ChineseCommunistParty\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"When referring to the political party, make sure to treat them as a proper noun.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.ChockFull\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"Flags common soundalikes of \\\"chock-full\\\" and makes sure they're hyphenated.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.ClaimToFame\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"Corrects `claim for fame` to the idiom `claim to fame`.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.ClicheAccent\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"A collection of linters that can be run as one.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.ClickThroughRate\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"Hyphenates the verb+preposition pair when it directly precedes rate-style nouns, mirroring how these terms are commonly styled in analytics writing.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.ClientOrServerSide\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"Corrects extraneous apostrophe in `client's side` and `server's side`.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.CloseTightKnit\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"Corrects `close-nit` and `tight-nit` to `close-knit` and `tight-knit`.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.CodeInWriteIn\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"Corrects the wrong preposition `on` to `in` when referring to writing code.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.Codebase\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"Looks for incorrect spacing inside the closed compound `codebase`.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.Codebases\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"Looks for incorrect spacing inside the closed compound `codebases`.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.ColdModalTypo\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"Rewrites `cold` to `could` when it appears in common subject-plus-verb modal contexts.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.Combinate\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"Suggests replacing the nonstandard verb `combinate` with the standard `combine`.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.ComfortableWith\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"Corrects `comfortable of` to `comfortable with`.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.CommaFixes\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"Fix common comma errors such as no space after, erroneous space before, etc., Asian commas instead of English commas, etc.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.CommitmentTo\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"Corrects `commitment toward/towards` to `commitment to`.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.CompaniesProductsAndTrademarks\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"Ensure proper capitalization of companies, products, and trademarks.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.ComplainAsNoun\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"Corrects the use of `complain` as a noun.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.CompoundNouns\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"Detects compound nouns split by a space and suggests merging them when both parts form a valid noun.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.CompoundSubjectI\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"Promotes `I` in compound subjects headed by a possessive determiner.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.ComprisesOf\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"`Comprises` already contains the notion of `of`, so following it with another `of` is redundant.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.CompulseToCompel\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"Suggests replacing the obsolete or archaic verb `compulse` with the standard `compel`.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.CondensateVerb\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"Suggests replacing the nonstandard verb `condensate` with the standard `condense`.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.CondenseAllThe\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"Suggests removing `of` in `all of the` for a more concise phrase.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.Confident\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"This linter detects instances where the noun `confidant` is incorrectly used in place of the adjective `confident`. `Confidant` refers to a trusted person, whereas `confident` describes certainty or self-assurance. The rule suggests replacing `confidant` with `confident` when used in an adjectival context.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.ConfirmThat\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"Corrects `conform` typos to `confirm`.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.ConstituteAs\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"Removes extraneous `as` after the verb `constitute`.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.ConvenientStore\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"Attempts to detect when `convenient store` is mistake for `convenience store`.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.Copyright\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"Corrects `copywrite` to `copyright`. `Copywrite` refers to writing copy, while `copyright` is the legal right to creative works.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.CorrectNumberSuffix\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"When making quick edits, it is common for authors to change the value of a number without changing its suffix. This rule looks for these cases, for example: `2st`.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.Countries\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"When referring to Countries, make sure to treat it as a proper noun.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.CoursingThroughVeins\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"In English idioms, `to course` means to flow rapidly—so avoid the eggcorn `cursing through veins.`\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.CraveFor\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"There should be no `for` after the verb `crave`.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.CriteriaPhenomena\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"The words “criteria” and “phenomena” are the plurals of “criterion” and “phenomenon”, respectively. They are often incorrectly used with the wrong number.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.CrossPlatform\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"Unlike some compound modifiers, `cross-platform` should always be hyphenated.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.CureFor\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"Flags `cure against` and prefers the standard `cure for` pairing.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.CuriousAbout\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"Corrects `curious of` and `curious on` to `curious about`.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.CurrencyPlacement\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"The location of currency symbols varies by country. The rule looks for and corrects improper positioning.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.CuttingAgeEggcorn\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"Corrects the eggcorn `cutting age` or `cutting-age` to `cutting-edge` or `cutting edge`.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.Cybersec\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"Expands the informal abbreviation `cybersec` to `cybersecurity`.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.Damages\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"Checks for plural `damages` not in the context of a court case.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.DampSquib\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"Corrects the eggcorn `damp squid` to `damp squib`, ensuring the intended meaning of a failed or underwhelming outcome.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.Dashes\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"Writers often type `--` or `---` expecting their editor to convert them into proper dashes. Replace these sequences with the correct characters: use an en dash (–) for ranges or connections and an em dash (—) for a break in thought.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.DateBackFrom\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"Corrects the blend of `date from` and `date back to` into the nonstandard `date back from`.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.DayAndAge\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"Fixes wrong variants of the idiom `in this day and age`.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.DayOneNames\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"Ensure proper capitalization of Day One and Day One Premium as brand names.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.Deadlift\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"Looks for incorrect spacing inside the closed compound `deadlift`.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.DefiniteArticle\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"The name of the word `the` is `definite article`.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.DegreesKelvin\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"Corrects use of `degrees kelvin` to `kelvins`.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.DegreesKelvinSymbol\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"Corrects use of `°K` to `K`.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.DenyOffer\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"Corrects `deny` when used with `offer` to `decline` or `reject`.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.Dereference\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"A collection of linters that can be run as one.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.Desktop\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"Looks for incorrect spacing inside the closed compound `desktop`.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.DespiteItIs\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"Corrects `despite` being used with the wrong form of `is`.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.DespiteOf\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"Corrects the misuse of `despite of` and suggests the proper alternatives `despite` or `in spite of`.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.Devops\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"Looks for incorrect spacing inside the closed compound `devops`.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.DidPast\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"Corrects past forms of verbs to their base form, when used together with \\\"did\\\".\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.Didnt\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"Corrects `dint` to `didn't` after subject pronouns.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.DigUnderTheHood\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"Detects the mixed metaphor of `digging under the hood/bonnet`.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.DigestiveTract\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"","packages/obsidian-plugin/package.json":"# Obsidian-plugin Skill\n\nPath: `packages/obsidian-plugin/package.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Automattic/harper/HEAD/packages/obsidian-plugin/package.json)","packages/obsidian-plugin/README.md":"# obsidian-plugin Documentation\n\nPath: `packages/obsidian-plugin/README.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Automattic/harper/HEAD/packages/obsidian-plugin/README.md)","packages/lint-framework/package.json":"# Lint-framework Skill\n\nPath: `packages/lint-framework/package.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Automattic/harper/HEAD/packages/lint-framework/package.json)","packages/lint-framework/README.md":"# lint-framework Documentation\n\nPath: `packages/lint-framework/README.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Automattic/harper/HEAD/packages/lint-framework/README.md)","packages/lint-framework/tsconfig.json":"# Lint-framework Skill\n\nPath: `packages/lint-framework/tsconfig.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Automattic/harper/HEAD/packages/lint-framework/tsconfig.json)","packages/harper-editor/package.json":"# Harper-editor Skill\n\nPath: `packages/harper-editor/package.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Automattic/harper/HEAD/packages/harper-editor/package.json)","packages/harper-editor/tsconfig.json":"# Harper-editor Skill\n\nPath: `packages/harper-editor/tsconfig.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Automattic/harper/HEAD/packages/harper-editor/tsconfig.json)","packages/harper.js/api-extractor.json":"# Harper.js Skill\n\nPath: `packages/harper.js/api-extractor.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Automattic/harper/HEAD/packages/harper.js/api-extractor.json)","packages/harper.js/package.json":"# Harper.js Skill\n\nPath: `packages/harper.js/package.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Automattic/harper/HEAD/packages/harper.js/package.json)","packages/harper.js/README.md":"# harper.js Documentation\n\nPath: `packages/harper.js/README.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Automattic/harper/HEAD/packages/harper.js/README.md)","packages/harper.js/tsconfig.json":"# Harper.js Skill\n\nPath: `packages/harper.js/tsconfig.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Automattic/harper/HEAD/packages/harper.js/tsconfig.json)","packages/components/package.json":"# Components Skill\n\nPath: `packages/components/package.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Automattic/harper/HEAD/packages/components/package.json)","packages/components/tsconfig.json":"# Components Skill\n\nPath: `packages/components/tsconfig.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Automattic/harper/HEAD/packages/components/tsconfig.json)","packages/chrome-plugin/CHANGELOG.md":"# Chrome-plugin Skill\n\nPath: `packages/chrome-plugin/CHANGELOG.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Automattic/harper/HEAD/packages/chrome-plugin/CHANGELOG.md)","packages/chrome-plugin/package.json":"# Chrome-plugin Skill\n\nPath: `packages/chrome-plugin/package.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Automattic/harper/HEAD/packages/chrome-plugin/package.json)","packages/chrome-plugin/tsconfig.json":"# Chrome-plugin Skill\n\nPath: `packages/chrome-plugin/tsconfig.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Automattic/harper/HEAD/packages/chrome-plugin/tsconfig.json)","packages/chrome-plugin/tsconfig.node.json":"# Chrome-plugin Skill\n\nPath: `packages/chrome-plugin/tsconfig.node.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Automattic/harper/HEAD/packages/chrome-plugin/tsconfig.node.json)","packages/vscode-plugin/.vscode/extensions.json":"# .vscode Skill\n\nPath: `packages/vscode-plugin/.vscode/extensions.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Automattic/harper/HEAD/packages/vscode-plugin/.vscode/extensions.json)","packages/vscode-plugin/.vscode/launch.json":"# .vscode Skill\n\nPath: `packages/vscode-plugin/.vscode/launch.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Automattic/harper/HEAD/packages/vscode-plugin/.vscode/launch.json)","packages/vscode-plugin/.vscode/settings.json":"# .vscode Skill\n\nPath: `packages/vscode-plugin/.vscode/settings.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Automattic/harper/HEAD/packages/vscode-plugin/.vscode/settings.json)","packages/vscode-plugin/.vscode/tasks.json":"# .vscode Skill\n\nPath: `packages/vscode-plugin/.vscode/tasks.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Automattic/harper/HEAD/packages/vscode-plugin/.vscode/tasks.json)","packages/wordpress-plugin/src/harper/block.json":"# Harper Skill\n\nPath: `packages/wordpress-plugin/src/harper/block.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Automattic/harper/HEAD/packages/wordpress-plugin/src/harper/block.json)","packages/web/drizzle/meta/_journal.json":"# Meta Skill\n\nPath: `packages/web/drizzle/meta/_journal.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Automattic/harper/HEAD/packages/web/drizzle/meta/_journal.json)","packages/web/drizzle/meta/0000_snapshot.json":"# Meta Skill\n\nPath: `packages/web/drizzle/meta/0000_snapshot.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Automattic/harper/HEAD/packages/web/drizzle/meta/0000_snapshot.json)","packages/web/drizzle/meta/0001_snapshot.json":"# Meta Skill\n\nPath: `packages/web/drizzle/meta/0001_snapshot.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Automattic/harper/HEAD/packages/web/drizzle/meta/0001_snapshot.json)","packages/web/drizzle/meta/0002_snapshot.json":"# Meta Skill\n\nPath: `packages/web/drizzle/meta/0002_snapshot.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Automattic/harper/HEAD/packages/web/drizzle/meta/0002_snapshot.json)","packages/web/drizzle/meta/0003_snapshot.json":"# Meta Skill\n\nPath: `packages/web/drizzle/meta/0003_snapshot.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Automattic/harper/HEAD/packages/web/drizzle/meta/0003_snapshot.json)","packages/lint-framework/src/assets/hints.json":"# Assets Skill\n\nPath: `packages/lint-framework/src/assets/hints.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Automattic/harper/HEAD/packages/lint-framework/src/assets/hints.json)","packages/harper.js/examples/raw-web/README.md":"# raw-web Documentation\n\nPath: `packages/harper.js/examples/raw-web/README.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Automattic/harper/HEAD/packages/harper.js/examples/raw-web/README.md)","packages/harper.js/examples/commonjs-simple/package.json":"# Commonjs-simple Skill\n\nPath: `packages/harper.js/examples/commonjs-simple/package.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Automattic/harper/HEAD/packages/harper.js/examples/commonjs-simple/package.json)","packages/harper.js/examples/commonjs-simple/README.md":"# commonjs-simple Documentation\n\nPath: `packages/harper.js/examples/commonjs-simple/README.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Automattic/harper/HEAD/packages/harper.js/examples/commonjs-simple/README.md)","packages/vscode-plugin/src/tests/fixtures/integration.md":"# Fixtures Skill\n\nPath: `packages/vscode-plugin/src/tests/fixtures/integration.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Automattic/harper/HEAD/packages/vscode-plugin/src/tests/fixtures/integration.md)","packages/web/src/routes/docs/weir/+page.md":"# Weir Skill\n\nPath: `packages/web/src/routes/docs/weir/+page.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Automattic/harper/HEAD/packages/web/src/routes/docs/weir/+page.md)","packages/web/src/routes/docs/about/+page.md":"# About Skill\n\nPath: `packages/web/src/routes/docs/about/+page.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Automattic/harper/HEAD/packages/web/src/routes/docs/about/+page.md)","packages/vscode-plugin/src/tests/fixtures/.vscode/settings.json":"# .vscode Skill\n\nPath: `packages/vscode-plugin/src/tests/fixtures/.vscode/settings.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Automattic/harper/HEAD/packages/vscode-plugin/src/tests/fixtures/.vscode/settings.json)","packages/web/src/routes/docs/integrations/zed/+page.md":"# Zed Skill\n\nPath: `packages/web/src/routes/docs/integrations/zed/+page.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Automattic/harper/HEAD/packages/web/src/routes/docs/integrations/zed/+page.md)","packages/web/src/routes/docs/integrations/wordpress/+page.md":"# Wordpress Skill\n\nPath: `packages/web/src/routes/docs/integrations/wordpress/+page.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Automattic/harper/HEAD/packages/web/src/routes/docs/integrations/wordpress/+page.md)","packages/web/src/routes/docs/integrations/visual-studio-code/+page.md":"# Visual-studio-code Skill\n\nPath: `packages/web/src/routes/docs/integrations/visual-studio-code/+page.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Automattic/harper/HEAD/packages/web/src/routes/docs/integrations/visual-studio-code/+page.md)","packages/web/src/routes/docs/integrations/sublime-text/+page.md":"# Sublime-text Skill\n\nPath: `packages/web/src/routes/docs/integrations/sublime-text/+page.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Automattic/harper/HEAD/packages/web/src/routes/docs/integrations/sublime-text/+page.md)","packages/web/src/routes/docs/integrations/obsidian/+page.md":"# Obsidian Skill\n\nPath: `packages/web/src/routes/docs/integrations/obsidian/+page.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Automattic/harper/HEAD/packages/web/src/routes/docs/integrations/obsidian/+page.md)","packages/web/src/routes/docs/integrations/neovim/+page.md":"# Neovim Skill\n\nPath: `packages/web/src/routes/docs/integrations/neovim/+page.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Automattic/harper/HEAD/packages/web/src/routes/docs/integrations/neovim/+page.md)","packages/web/src/routes/docs/integrations/language-server/+page.md":"# Language-server Skill\n\nPath: `packages/web/src/routes/docs/integrations/language-server/+page.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Automattic/harper/HEAD/packages/web/src/routes/docs/integrations/language-server/+page.md)","packages/web/src/routes/docs/integrations/helix/+page.md":"# Helix Skill\n\nPath: `packages/web/src/routes/docs/integrations/helix/+page.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Automattic/harper/HEAD/packages/web/src/routes/docs/integrations/helix/+page.md)","packages/web/src/routes/docs/integrations/firefox-extension/+page.md":"# Firefox-extension Skill\n\nPath: `packages/web/src/routes/docs/integrations/firefox-extension/+page.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Automattic/harper/HEAD/packages/web/src/routes/docs/integrations/firefox-extension/+page.md)","packages/web/src/routes/docs/integrations/emacs/+page.md":"# Emacs Skill\n\nPath: `packages/web/src/routes/docs/integrations/emacs/+page.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Automattic/harper/HEAD/packages/web/src/routes/docs/integrations/emacs/+page.md)","packages/web/src/routes/docs/integrations/chrome-extension/+page.md":"# Chrome-extension Skill\n\nPath: `packages/web/src/routes/docs/integrations/chrome-extension/+page.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Automattic/harper/HEAD/packages/web/src/routes/docs/integrations/chrome-extension/+page.md)","packages/web/src/routes/docs/harperjs/spans/+page.md":"# Spans Skill\n\nPath: `packages/web/src/routes/docs/harperjs/spans/+page.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Automattic/harper/HEAD/packages/web/src/routes/docs/harperjs/spans/+page.md)","packages/web/src/routes/docs/harperjs/node/+page.md":"# Node Skill\n\nPath: `packages/web/src/routes/docs/harperjs/node/+page.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Automattic/harper/HEAD/packages/web/src/routes/docs/harperjs/node/+page.md)","packages/web/src/routes/docs/harperjs/linting/+page.md":"# Linting Skill\n\nPath: `packages/web/src/routes/docs/harperjs/linting/+page.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Automattic/harper/HEAD/packages/web/src/routes/docs/harperjs/linting/+page.md)","packages/web/src/routes/docs/harperjs/introduction/+page.md":"# Introduction Skill\n\nPath: `packages/web/src/routes/docs/harperjs/introduction/+page.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Automattic/harper/HEAD/packages/web/src/routes/docs/harperjs/introduction/+page.md)","packages/web/src/routes/docs/harperjs/configurerules/+page.md":"# Configurerules Skill\n\nPath: `packages/web/src/routes/docs/harperjs/configurerules/+page.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Automattic/harper/HEAD/packages/web/src/routes/docs/harperjs/configurerules/+page.md)","packages/web/src/routes/docs/harperjs/CDN/+page.md":"# CDN Skill\n\nPath: `packages/web/src/routes/docs/harperjs/CDN/+page.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Automattic/harper/HEAD/packages/web/src/routes/docs/harperjs/CDN/+page.md)","packages/web/src/routes/docs/contributors/wordpress/+page.md":"# Wordpress Skill\n\nPath: `packages/web/src/routes/docs/contributors/wordpress/+page.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Automattic/harper/HEAD/packages/web/src/routes/docs/contributors/wordpress/+page.md)","packages/web/src/routes/docs/contributors/website/+page.md":"# Website Skill\n\nPath: `packages/web/src/routes/docs/contributors/website/+page.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Automattic/harper/HEAD/packages/web/src/routes/docs/contributors/website/+page.md)","packages/web/src/routes/docs/contributors/visual-studio-code/+page.md":"# Visual-studio-code Skill\n\nPath: `packages/web/src/routes/docs/contributors/visual-studio-code/+page.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Automattic/harper/HEAD/packages/web/src/routes/docs/contributors/visual-studio-code/+page.md)","packages/web/src/routes/docs/contributors/testing-strategy/+page.md":"# Testing-strategy Skill\n\nPath: `packages/web/src/routes/docs/contributors/testing-strategy/+page.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Automattic/harper/HEAD/packages/web/src/routes/docs/contributors/testing-strategy/+page.md)","packages/web/src/routes/docs/contributors/review/+page.md":"# Review Skill\n\nPath: `packages/web/src/routes/docs/contributors/review/+page.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Automattic/harper/HEAD/packages/web/src/routes/docs/contributors/review/+page.md)","packages/web/src/routes/docs/contributors/obsidian/+page.md":"# Obsidian Skill\n\nPath: `packages/web/src/routes/docs/contributors/obsidian/+page.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Automattic/harper/HEAD/packages/web/src/routes/docs/contributors/obsidian/+page.md)","packages/web/src/routes/docs/contributors/local-stats/+page.md":"# Local-stats Skill\n\nPath: `packages/web/src/routes/docs/contributors/local-stats/+page.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Automattic/harper/HEAD/packages/web/src/routes/docs/contributors/local-stats/+page.md)","packages/web/src/routes/docs/contributors/introduction/+page.md":"# Introduction Skill\n\nPath: `packages/web/src/routes/docs/contributors/introduction/+page.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Automattic/harper/HEAD/packages/web/src/routes/docs/contributors/introduction/+page.md)","packages/web/src/routes/docs/contributors/faq/+page.md":"# Faq Skill\n\nPath: `packages/web/src/routes/docs/contributors/faq/+page.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Automattic/harper/HEAD/packages/web/src/routes/docs/contributors/faq/+page.md)","packages/web/src/routes/docs/contributors/environment/+page.md":"# Environment Skill\n\nPath: `packages/web/src/routes/docs/contributors/environment/+page.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Automattic/harper/HEAD/packages/web/src/routes/docs/contributors/environment/+page.md)","packages/web/src/routes/docs/contributors/dictionary/+page.md":"# Dictionary Skill\n\nPath: `packages/web/src/routes/docs/contributors/dictionary/+page.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Automattic/harper/HEAD/packages/web/src/routes/docs/contributors/dictionary/+page.md)","packages/web/src/routes/docs/contributors/desktop/+page.md":"# Desktop Skill\n\nPath: `packages/web/src/routes/docs/contributors/desktop/+page.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Automattic/harper/HEAD/packages/web/src/routes/docs/contributors/desktop/+page.md)","packages/web/src/routes/docs/contributors/committing/+page.md":"# Committing Skill\n\nPath: `packages/web/src/routes/docs/contributors/committing/+page.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Automattic/harper/HEAD/packages/web/src/routes/docs/contributors/committing/+page.md)","packages/web/src/routes/docs/contributors/committer/+page.md":"# Committer Skill\n\nPath: `packages/web/src/routes/docs/contributors/committer/+page.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Automattic/harper/HEAD/packages/web/src/routes/docs/contributors/committer/+page.md)","packages/web/src/routes/docs/contributors/chrome-extension/+page.md":"# Chrome-extension Skill\n\nPath: `packages/web/src/routes/docs/contributors/chrome-extension/+page.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Automattic/harper/HEAD/packages/web/src/routes/docs/contributors/chrome-extension/+page.md)","packages/web/src/routes/docs/contributors/brill/+page.md":"# Brill Skill\n\nPath: `packages/web/src/routes/docs/contributors/brill/+page.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Automattic/harper/HEAD/packages/web/src/routes/docs/contributors/brill/+page.md)","packages/web/src/routes/docs/contributors/author-a-rule/+page.md":"# Author-a-rule Skill\n\nPath: `packages/web/src/routes/docs/contributors/author-a-rule/+page.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Automattic/harper/HEAD/packages/web/src/routes/docs/contributors/author-a-rule/+page.md)","packages/web/src/routes/docs/contributors/architecture/+page.md":"# Architecture Skill\n\nPath: `packages/web/src/routes/docs/contributors/architecture/+page.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Automattic/harper/HEAD/packages/web/src/routes/docs/contributors/architecture/+page.md)"},"items":[{"name":"AGENTS.md","path":"AGENTS.md","rawUrl":"https://raw.githubusercontent.com/Automattic/harper/HEAD/AGENTS.md","title":"AI Agent Protocol & Instructions","category":"root-instruction","format":"markdown","content":"# Harper Docs Map for Agents\n\nThis repository’s documentation site is powered by Vite + SvelteKit + SveltePress.\n\nUse `packages/web/vite.config.ts` as the source of truth for documentation scope:\n- Sidebar and important doc routes are defined in `packages/web/vite.config.ts`.\n- Route `/docs/...` maps to `packages/web/src/routes/docs/...`.\n- Most docs are in `+page.md`; some are `+page.svelte` or route helpers.\n\nIf you are working on the Harper repository itself, please pay special attention to the `contributors/*` pages.\nImportantly, all the tools available in this repository are available via `just`. To learn more, run `just --list`.\nWhenever agents are done making changes, they should run `just format` before handing work back to the user.\nIf `just format` fails, you can use `just setup` to prepare the relevant dependencies.\n\nHuman coders should periodically review this file and manually migrate stable, human-facing guidance into the real documentation website under `packages/web` so it is available outside agent workflows.\nAgents should remind humans of this when possible.\n\n## Read First\n\n1. `packages/web/vite.config.ts`: Sidebar source of truth and canonical map of important docs routes.\n2. `packages/web/src/routes/docs/about/+page.md`: High-level product overview, privacy model, versioning policy, and ecosystem context.\n3. `packages/web/src/routes/docs/weir/+page.md`: Weir rule language reference with syntax, expression types, and examples.\n4. `packages/web/src/routes/docs/rules/+page.svelte`: Live/generated rule catalog (rule names, defaults, and descriptions).\n5. `packages/web/src/routes/docs/contributors/introduction/+page.md`: Entry point for contributors and links to deeper contributor docs.\n6. `./AGENT_POLICY.md`: Harper's policy on code generated by large language models. Agents MUST read this before making ANY changes.\n\n## Core Documentation Directories\n\n- `packages/web/src/routes/docs/about`\n- `packages/web/src/routes/docs/weir`\n- `packages/web/src/routes/docs/rules`\n- `packages/web/src/routes/docs/integrations`\n- `packages/web/src/routes/docs/harperjs`\n- `packages/web/src/routes/docs/contributors`\n\n## Route Prefix to File Prefix\n\n- `/docs/about` -> `packages/web/src/routes/docs/about/+page.md`\n- `/docs/weir` -> `packages/web/src/routes/docs/weir/+page.md`\n- `/docs/rules` -> `packages/web/src/routes/docs/rules/+page.svelte`\n- `/docs/integrations/*` -> `packages/web/src/routes/docs/integrations/*/+page.md`\n- `/docs/harperjs/*` -> `packages/web/src/routes/docs/harperjs/*/+page.md`\n- `/docs/contributors/*` -> `packages/web/src/routes/docs/contributors/*/+page.md`\n\n## Files Listed in the Sidebar (Local)\n\n- `packages/web/src/routes/docs/about/+page.md`: High-level product overview, privacy model, versioning policy, and ecosystem context.\n- `packages/web/src/routes/docs/weir/+page.md`: Weir rule language reference with syntax, expression types, and examples. Very important if you're asked to write a Weir rule.\n- `packages/web/src/routes/docs/rules/+page.svelte`: Live/generated rule catalog (rule names, defaults, and descriptions).\n- `packages/web/src/routes/docs/integrations/obsidian/+page.md`: Obsidian plugin overview, privacy/value comparison, installation, and support links.\n- `packages/web/src/routes/docs/integrations/chrome-extension/+page.md`: End-user Chrome extension overview and install link.\n- `packages/web/src/routes/docs/integrations/firefox-extension/+page.md`: End-user Firefox extension overview and install link.\n- `packages/web/src/routes/docs/integrations/wordpress/+page.md`: Current WordPress guidance, including migration recommendation to Chrome extension and legacy plugin status.\n- `packages/web/src/routes/docs/integrations/language-server/+page.md`: `harper-ls` install methods, dictionaries, code actions, ignore comments, and full configuration reference.\n- `packages/web/src/routes/docs/integrations/visual-studio-code/+page.md`: VS Code extension install, command list, and settings reference.\n- `packages/web/src/routes/docs/integrations/neovim/+page.md`: Neovim setup using `harper-ls`, plus optional and common config tweaks.\n- `packages/web/src/routes/docs/integrations/helix/+page.md`: Helix setup using `harper-ls`, plus optional and common config tweaks.\n- `packages/web/src/routes/docs/integrations/emacs/+page.md`: Emacs setup using `harper-ls`, plus optional and common config tweaks.\n- `packages/web/src/routes/docs/integrations/zed/+page.md`: Zed extension entry point and link to canonical extension README.\n- `packages/web/src/routes/docs/integrations/sublime-text/+page.md`: Sublime Text setup with `harper-ls` and LSP package configuration.\n- `packages/web/src/routes/docs/harperjs/introduction/+page.md`: `harper.js` mission, package overview, and installation starting point.\n- `packages/web/src/routes/docs/harperjs/linting/+page.md`: Core `harper.js` lint workflow and linter usage patterns.\n- `packages/web/src/routes/docs/harperjs/spans/+page.md`: Explains span objects and how to use them to locate/handle lint ranges.\n- `packages/web/src/routes/docs/harperjs/configurerules/+page.md`: How to programmatically read and set `LintConfig` to enable/disable rules.\n- `packages/web/src/routes/docs/harperjs/node/+page.md`: Node.js-specific usage notes, especially `LocalLinter` vs `WorkerLinter`.\n- `packages/web/src/routes/docs/harperjs/CDN/+page.md`: Browser/CDN usage via unpkg and ESM import patterns.\n- `packages/web/src/routes/docs/contributors/introduction/+page.md`: Contributor onboarding overview and links to architecture/testing/rule-authoring docs.\n- `packages/web/src/routes/docs/contributors/environment/+page.md`: Local development environment setup across Rust, Node/pnpm, and optional Nix shell.\n- `packages/web/src/routes/docs/contributors/committing/+page.md`: Commit message conventions and commit hygiene requirements.\n- `packages/web/src/routes/docs/contributors/architecture/+page.md`: System architecture and roles of core components like `harper-core`, `harper-ls`, and `harper.js`.\n- `packages/web/src/routes/docs/contributors/dictionary/+page.md`: Process for adding or updating curated dictionary entries.\n- `packages/web/src/routes/docs/contributors/testing-strategy/+page.md`: Harper's risk-driven testing strategy, covering automated checks, production feedback, manual testing, and testability.\n- `packages/web/src/routes/docs/contributors/author-a-rule/+page.md`: Step-by-step workflow for implementing and testing new grammar rules.\n- `packages/web/src/routes/docs/contributors/visual-studio-code/+page.md`: How to run, debug, test, and package the VS Code extension locally.\n- `packages/web/src/routes/docs/contributors/chrome-extension/+page.md`: Internal architecture and local development notes for the browser extensions.\n- `packages/web/src/routes/docs/contributors/desktop/+page.md`: Placeholder for Harper Desktop contributor documentation.\n- `packages/web/src/routes/docs/contributors/website/+page.md`: Local development, preview, and validation for writewithharper.com (SvelteKit/SveltePress).\n- `packages/web/src/routes/docs/contributors/wordpress/+page.md`: How to build and run the WordPress plugin locally.\n- `packages/web/src/routes/docs/contributors/obsidian/+page.md`: Obsidian-plugin contributor workflow and plugin-specific constraints.\n- `packages/web/src/routes/docs/contributors/review/+page.md`: PR reviewer playbook, including ways to fetch artifacts and test patches locally.\n- `packages/web/src/routes/docs/contributors/local-stats/+page.md`: Local stats logging model, `stats.txt` format, locations, and privacy behavior.\n- `packages/web/src/routes/docs/contributors/brill/+page.md`: Brief explanation of Harper’s Brill-tagging approach and further reading link.\n- `packages/web/src/routes/docs/contributors/faq/+page.md`: Contributor FAQ for conceptual distinctions (for example `Linter` vs `PatternLinter`).\n\n## Documentation Route Helpers (Non-`+page.md`)\n\n- `packages/web/src/routes/docs/about/+page.ts`: Route behavior helper (`ssr = false`) for the About page.\n- `packages/web/src/routes/docs/harperjs/CDN/example/+server.ts`: Serves the HTML example used by the `harper.js` CDN documentation page.\n\n## External Sidebar Targets (No Local Source File)\n\n- `https://docs.rs/harper-core/latest/harper_core/`\n- `/docs/harperjs/ref/index.html` (generated API reference target)\n\n## Projects Contained in This Repository\n\n- `harper-core`: The core grammar checking engine. This is a dependency to pretty much everything related to Harper.\n- `harper-ls`: A Language Server compatible with a number of text editors, including Neovim, Zed, and Helix. See above linked documentation for more details.\n- `harper-cli`: A command-line binary for debugging Harper's core engine and markup language support.\n- `harper-comments`: Provides parsers for a number of programming languages to support linting their comments.\n- `harper-wasm`: The WebAssembly build target that powers browser and JavaScript integrations such as `harper.js`.\n- `packages/lint-framework`: A package containing the tooling necessary to read/write/highlight text on the web for the purpose of linting.\n- `packages/components`: Shared Svelte component package used by web-facing packages.\n- `packages/harper-editor`: Shared Svelte editor package used by web-facing packages and Harper Desktop.\n- `packages/web`: The Harper website, including documentation and a live demo that uses the `lint-framework`.\n- `packages/harper.js`: The JavaScript package that uses `harper-wasm` to lint text from websites or Node.js processes.\n- `packages/chrome-plugin`: The Harper Chrome Extension - uses the `lint-framework`. Also support Firefox.\n- `packages/obsidian-plugin`\n- `packages/wordpress-plugin`\n- `packages/vscode-plugin`: The Harper Visual Studio Code plugin. Uses `harper-ls`.\n- `harper-desktop`: The Harper Desktop app. It is a Tauri v2 + SvelteKit SPA with an offline editor, settings UI, tray/service control, and native overlay highlighter.\n\nThere are of course projects in this repository not listed above. If relevant, feel free to poke around.\n\n## Harper Desktop\n\nRead the [Desktop contributor documentation](packages/web/src/routes/docs/contributors/desktop/+page.md) for the app's architecture and its relationship to the Cargo workspace.\n\n### Commands\n\n- Use `pnpm` for frontend packages; `harper-desktop/package.json` pins `pnpm@10.10.0`.\n- Dev app: `just dev-desktop` from repo root. It builds shared web packages, runs `cargo tauri dev`, and Tauri then runs `pnpm dev` on port `1420`.\n- Start the highlighter process directly: `just dev-desktop-highlighter` from repo root.\n- Frontend checks: `pnpm check` from `harper-desktop`.\n- Frontend build only: `pnpm build` from `harper-desktop`.\n- Full desktop checks: `just check-desktop` from repo root.\n- Bundle builds match CI: `just build-desktop-linux` or `just build-desktop-macos`.\n- `just build-desktop-linux` builds deb/rpm/appimage bundles.\n- `just build-desktop-macos` builds app/dmg bundles.\n\n### Architecture\n\n- It is a SvelteKit SPA inside Tauri v2.\n- SSR is disabled in `harper-desktop/src/routes/+layout.ts`.\n- `harper-desktop/svelte.config.js` uses `adapter-static` with `fallback: \"index.html\"`.\n- Main Rust entrypoint is `harper-desktop/src-tauri/src/main.rs`, which calls `harper_desktop_lib::run()`.\n- CLI behavior is in `harper-desktop/src-tauri/src/lib.rs`: no subcommand runs the normal Tauri app; `highlighter` runs the native overlay highlighter.\n- Tauri config lives in `harper-desktop/src-tauri/tauri.conf.json`.\n- Tauri capabilities live in `harper-desktop/src-tauri/capabilities/default.json`.\n- The main Svelte route is `harper-desktop/src/routes/+page.svelte`; it switches between the settings UI and editor UI.\n- The editor UI lives in `harper-desktop/src/lib/EditorView.svelte` and uses workspace dependencies on `harper.js` and `harper-editor`.\n- The settings UI lives under `harper-desktop/src/lib/settings/`.\n- Rust uses local workspace dependencies from `harper-desktop/src-tauri/Cargo.toml`, including `harper-core` and `harper-dictionary-wordlist`.\n- The Tauri app starts a tray/menu-bar controlled highlighter service on launch and can open editor/settings windows from the tray.\n- Editor and settings windows hide on close instead of exiting; quit is handled through the tray menu.\n\n### Highlighter Architecture\n\n- The highlighter is Rust/egui/winit code under `harper-desktop/src-tauri/src/highlighter/`.\n- `Highlighter` is the public entry point for the overlay system.\n- `Window` owns native window/GPU plumbing.\n- `WindowManager` owns the winit event loop, monitor windows, cursor hit-testing, and popup selection.\n- `RenderState` owns highlight rendering, popup drawing, markdown rendering cache, and popup action dispatch.\n- `RenderState` uses `ActionableLint` values from `harper-desktop/src-tauri/src/rect.rs`.\n- `ActionableLint` stores lint geometry, the Harper `Lint`, and source text needed for suggestion application and popup actions.\n- Suggestion popup actions currently include close, apply suggestion, ignore lint, add to dictionary, disable rule, and refresh config.\n- Popup hover text is implemented in `RenderState` button helpers.\n- The highlighter read interval is set in `run_highlighter()` with `with_read_interval(Duration::from_millis(16))`.\n\n### OS Integration\n\n- OS integration is behind `harper-desktop/src-tauri/src/os_broker.rs`.\n- macOS uses `harper-desktop/src-tauri/src/mac_broker.rs`.\n- non-macOS currently uses `NoopBroker`.\n- macOS highlighter focus handling depends on `MacBroker.last_focused`; clicking the overlay can make the highlighter process focused, so accessibility reads fall back to the last non-highlighter PID.\n- macOS integrations are bundle-ID based and controlled by persisted `Integration` entries.\n- Highlighter stdout is reserved for JSON-line IPC. Diagnostics in highlighter paths should use `eprintln!`, not `println!`.\n\n### IPC And App State\n\n- Tauri app state lives in `harper-desktop/src-tauri/src/config.rs`.\n- `Config` currently stores `mutable_dictionary: MutableDictionary`, `dialect: Dialect`, `ignored_lints: IgnoredLints`, `lint_config: FlatConfig`, and `integrations: Vec<Integration>`.\n- `Config::new()` uses `MutableDictionary::new()`, `Dialect::American`, `IgnoredLints::new()`, `FlatConfig::new_curated()`, and curated default integrations.\n- Config is persisted under the system config directory in a `harper-desktop` folder. Main settings are serialized to `config.json`; the mutable dictionary is stored separately as `dictionary.txt`.\n- `Config::load_from_system()` loads the serialized config and then hydrates the mutable dictionary with the selected dialect.\n- The Tauri app owns shared config as `Arc<Mutex<Config>>`.\n- `run_tauri()` loads persisted config, creates `HighlighterService`, starts the highlighter service, and creates the tray/menu-bar UI.\n- The highlighter process is spawned through `harper-desktop/src-tauri/src/highlighter_process.rs`.\n- IPC is implemented under `harper-desktop/src-tauri/src/communication/`.\n- IPC uses newline-delimited JSON over child stdin/stdout.\n- The Tauri app is the protocol server.\n- The highlighter process is the protocol client.\n- Protocol messages live in `harper-desktop/src-tauri/src/communication/message.rs`.\n- Supported requests include `GetLintConfig`, `GetDictionary`, `GetDialect`, `GetIgnoredLints`, `GetIntegrations`, `SetLintConfig`, `IgnoreLint`, `AddToDictionary`, `AddIntegration`, `RemoveIntegration`, and `SetIntegrationEnabled`.\n- Supported responses include `GetLintConfig`, `GetDictionary`, `GetDialect`, `GetIgnoredLints`, `GetIntegrations`, and `Ack`.\n- `IgnoredLints` is transferred as whole serialized state and merged server-side.\n- `AddToDictionary` sends only the word; Rust appends it with `DictWordMetadata::default()`.\n- The highlighter uses a Tokio current-thread runtime to call async IPC client methods from synchronous UI callbacks.\n- That runtime is bridge plumbing only; it is not used for linting or UI rendering.\n\n### Dictionary And Linting Gotchas\n\n- Keep dictionary construction centralized through `Config::dictionary_from_user_dictionary(user_dictionary: MutableDictionary) -> Arc<MergedDictionary>` and `Config::create_dictionary()`.\n- Keep linter construction centralized through `Config::create_linter()`.\n- The same merged dictionary source must be used for both `Document::new_markdown_default(text, &dictionary)` and `LintGroup::new_curated(dictionary, dialect)`.\n- Do not use `Document::new_markdown_default_curated(text)` in the main highlighter lint callback when user dictionary words should suppress spelling lints.\n- Harper spelling lint behavior depends on document token metadata, so a linter with the updated dictionary is not enough if the `Document` was built with the curated dictionary only.\n- `RenderState` may still use curated document construction for localized source extraction where dictionary membership does not matter.\n\n### Frontend Integration\n\n- Tauri commands in `harper-desktop/src-tauri/src/lib.rs` include `get_lint_config`, `get_dialect`, `set_dialect`, `set_lint_config`, `get_dictionary`, `set_dictionary`, `ignore_lint`, `add_to_dictionary`, `get_integrations`, `add_integration`, `remove_integration`, and `set_integration_enabled`.\n- JS helper lives in `harper-desktop/src/lib/client.ts`.\n- JS helper class is named `Client` and exposes static methods for lint config, dialect, dictionary, ignored lints, dictionary additions, and integrations.\n- `Client.ignoreLint(...)` uses Harper JS ignored-lints export data and invokes the Rust command.\n- `Client.addToDictionary(word)` sends only the word to Rust.\n- Vite's dev server must stay on port `1420`; `harper-desktop/vite.config.js` uses `strictPort: true` because Tauri expects that port.\n- Vite intentionally ignores `src-tauri/**` during frontend file watching.\n\n### Repo-Specific Gotchas\n\n- CI installs `wasm-pack`, `tauri-cli`, and `cargo-hack` with `cargo binstall`, then runs the relevant root `just` task.\n- Avoid mixing behavior fixes with structural refactors in the highlighter; popup/UI, IPC, dictionary behavior, config persistence, settings UI, and OS-coordinate fixes are easier to review separately.\n\n### Known Review Findings\n\n- Secondary-monitor highlighter coordinates may be wrong. Accessibility rectangles appear to be global screen coordinates, while each overlay window's egui origin is local to that monitor/window. Translate by monitor/window origin or render through one virtual-desktop-sized overlay.\n- macOS text range lookup may be wrong after emoji or other non-BMP characters. Harper spans are char-based, while macOS accessibility ranges are NSString/UTF-16 based. Convert spans before calling `AXBoundsForRangeParameterizedAttribute`.\n\n## On Writing New Rules\n\nWhen asked to write a new rule, keep these guidelines in mind:\n\n- The user is almost always expecting you to write it to a file. Which file and where is up to you to find out.\n- You should include at least 15 total tests, covering a wide variety of cases. Cover false-positives, false negatives, true positives, and if relevant, true negatives.\n- You should run any and all tests to ensure that you do no break existing behavior and that your new rule runs the way you expect. At minimum, that means `just test-rust`. Make sure to check the snapshots for changes.\n- After adding a new rule, update `harper-core/default_config.json` so it is enabled in the curated default config.\n- Built-in Weir rules can be grouped by putting related `.weir` files in a directory under `harper-core/src/linting/weir_rules`; the directory name becomes the single public rule name.\n- If the rule is related to a closed compound noun, see if you can just add an entry to the existing closed compound linter.\n\nUnless you are specifically requested to write the rule in a specific way, choose the language (Rust or Weir) and methodology that fits the task.\n\nALWAYS run extensive bullet tests with `cargo run --bin harper-cli --release -- lint <TEXT>` to make sure the new rule isn't already covered by Harper.\n\n## Workflow for Writing Weir Rules\n\n1. Draft the core expression\n- Encode the match with `expr main` using words, sequences, alternatives, filters, exceptions, POS tags, wildcards, or punctuation.\n- Keep the expression minimal but precise; avoid overmatching.\n- If a wordlist is needed, include it as its own expression, used with an expression reference.\n\n2. Add rule metadata\n- `let message`, `let description`, `let kind`, `let becomes` (and `let strategy` if needed).\n- Use `strategy \"Exact\"` when casing must be normalized; otherwise default behavior or `MatchCase` as appropriate.\n\n3. Add tests (required)\n- Include at least 15 tests.\n- Tests must cover: true positives, false positives, false negatives, and (if relevant) true negatives.\n- Prefer a mix of casing, punctuation, whitespace, and nearby-token variations.\n\n4. Sanity-check edge cases\n- Ensure exceptions do not block valid matches.\n- Ensure replacements are correct and not destructive.\n\n5. Run the tests.\n- Fix any issues that arise.\n\n### Output Format\n\nWrite a Weir rule to a new file with a name of your choosing, including `expr main`, `let` fields, and tests. Make sure it has the extension `.weir`.\n\n## Tips\n\nBefore finishing your turn, run `just format` or `cargo fmt` if you have made any changes. This can help diffs if a human decides to make a commit.\n\nTry to write in a functional style. Minimize adding state whenever it is possible while also respecting the user's query. If additional state is necessary, please centralize it to increase visibility.\n\n","isInternal":false,"tokens":4902,"sizeBytes":21622},{"name":"ARCHITECTURE.md","path":"ARCHITECTURE.md","rawUrl":"https://raw.githubusercontent.com/Automattic/harper/HEAD/ARCHITECTURE.md","title":"System Architecture & Module Boundaries","category":"project-spec","format":"markdown","content":"# Harper's Architecture\n\nThis document has been moved to the [online documentation](https://writewithharper.com/docs/contributors/architecture).\n","isInternal":false,"tokens":31,"sizeBytes":145},{"name":"CHANGELOG.md","path":"packages/chrome-plugin/CHANGELOG.md","rawUrl":"https://raw.githubusercontent.com/Automattic/harper/HEAD/packages/chrome-plugin/CHANGELOG.md","title":"Chrome-plugin Skill","category":"anthropic-skill","format":"markdown","content":"# Chrome-plugin Skill\n\nPath: `packages/chrome-plugin/CHANGELOG.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Automattic/harper/HEAD/packages/chrome-plugin/CHANGELOG.md)","tokens":300,"sizeBytes":190},{"name":"package.json","path":"packages/chrome-plugin/package.json","rawUrl":"https://raw.githubusercontent.com/Automattic/harper/HEAD/packages/chrome-plugin/package.json","title":"Chrome-plugin Skill","category":"anthropic-skill","format":"json","content":"# Chrome-plugin Skill\n\nPath: `packages/chrome-plugin/package.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Automattic/harper/HEAD/packages/chrome-plugin/package.json)","tokens":300,"sizeBytes":190},{"name":"tsconfig.json","path":"packages/chrome-plugin/tsconfig.json","rawUrl":"https://raw.githubusercontent.com/Automattic/harper/HEAD/packages/chrome-plugin/tsconfig.json","title":"Chrome-plugin Skill","category":"anthropic-skill","format":"json","content":"# Chrome-plugin Skill\n\nPath: `packages/chrome-plugin/tsconfig.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Automattic/harper/HEAD/packages/chrome-plugin/tsconfig.json)","tokens":300,"sizeBytes":192},{"name":"tsconfig.node.json","path":"packages/chrome-plugin/tsconfig.node.json","rawUrl":"https://raw.githubusercontent.com/Automattic/harper/HEAD/packages/chrome-plugin/tsconfig.node.json","title":"Chrome-plugin Skill","category":"anthropic-skill","format":"json","content":"# Chrome-plugin Skill\n\nPath: `packages/chrome-plugin/tsconfig.node.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Automattic/harper/HEAD/packages/chrome-plugin/tsconfig.node.json)","tokens":300,"sizeBytes":202},{"name":"package.json","path":"packages/components/package.json","rawUrl":"https://raw.githubusercontent.com/Automattic/harper/HEAD/packages/components/package.json","title":"Components Skill","category":"anthropic-skill","format":"json","content":"# Components Skill\n\nPath: `packages/components/package.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Automattic/harper/HEAD/packages/components/package.json)","tokens":300,"sizeBytes":181},{"name":"tsconfig.json","path":"packages/components/tsconfig.json","rawUrl":"https://raw.githubusercontent.com/Automattic/harper/HEAD/packages/components/tsconfig.json","title":"Components Skill","category":"anthropic-skill","format":"json","content":"# Components Skill\n\nPath: `packages/components/tsconfig.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Automattic/harper/HEAD/packages/components/tsconfig.json)","tokens":300,"sizeBytes":183},{"name":"package.json","path":"packages/harper-editor/package.json","rawUrl":"https://raw.githubusercontent.com/Automattic/harper/HEAD/packages/harper-editor/package.json","title":"Harper-editor Skill","category":"anthropic-skill","format":"json","content":"# Harper-editor Skill\n\nPath: `packages/harper-editor/package.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Automattic/harper/HEAD/packages/harper-editor/package.json)","tokens":300,"sizeBytes":190},{"name":"tsconfig.json","path":"packages/harper-editor/tsconfig.json","rawUrl":"https://raw.githubusercontent.com/Automattic/harper/HEAD/packages/harper-editor/tsconfig.json","title":"Harper-editor Skill","category":"anthropic-skill","format":"json","content":"# Harper-editor Skill\n\nPath: `packages/harper-editor/tsconfig.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Automattic/harper/HEAD/packages/harper-editor/tsconfig.json)","tokens":300,"sizeBytes":192},{"name":"api-extractor.json","path":"packages/harper.js/api-extractor.json","rawUrl":"https://raw.githubusercontent.com/Automattic/harper/HEAD/packages/harper.js/api-extractor.json","title":"Harper.js Skill","category":"anthropic-skill","format":"json","content":"# Harper.js Skill\n\nPath: `packages/harper.js/api-extractor.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Automattic/harper/HEAD/packages/harper.js/api-extractor.json)","tokens":300,"sizeBytes":190},{"name":"package.json","path":"packages/harper.js/examples/commonjs-simple/package.json","rawUrl":"https://raw.githubusercontent.com/Automattic/harper/HEAD/packages/harper.js/examples/commonjs-simple/package.json","title":"Commonjs-simple Skill","category":"anthropic-skill","format":"json","content":"# Commonjs-simple Skill\n\nPath: `packages/harper.js/examples/commonjs-simple/package.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Automattic/harper/HEAD/packages/harper.js/examples/commonjs-simple/package.json)","tokens":300,"sizeBytes":234},{"name":"package.json","path":"packages/harper.js/package.json","rawUrl":"https://raw.githubusercontent.com/Automattic/harper/HEAD/packages/harper.js/package.json","title":"Harper.js Skill","category":"anthropic-skill","format":"json","content":"# Harper.js Skill\n\nPath: `packages/harper.js/package.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Automattic/harper/HEAD/packages/harper.js/package.json)","tokens":300,"sizeBytes":178},{"name":"tsconfig.json","path":"packages/harper.js/tsconfig.json","rawUrl":"https://raw.githubusercontent.com/Automattic/harper/HEAD/packages/harper.js/tsconfig.json","title":"Harper.js Skill","category":"anthropic-skill","format":"json","content":"# Harper.js Skill\n\nPath: `packages/harper.js/tsconfig.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Automattic/harper/HEAD/packages/harper.js/tsconfig.json)","tokens":300,"sizeBytes":180},{"name":"package.json","path":"packages/lint-framework/package.json","rawUrl":"https://raw.githubusercontent.com/Automattic/harper/HEAD/packages/lint-framework/package.json","title":"Lint-framework Skill","category":"anthropic-skill","format":"json","content":"# Lint-framework Skill\n\nPath: `packages/lint-framework/package.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Automattic/harper/HEAD/packages/lint-framework/package.json)","tokens":300,"sizeBytes":193},{"name":"hints.json","path":"packages/lint-framework/src/assets/hints.json","rawUrl":"https://raw.githubusercontent.com/Automattic/harper/HEAD/packages/lint-framework/src/assets/hints.json","title":"Assets Skill","category":"anthropic-skill","format":"json","content":"# Assets Skill\n\nPath: `packages/lint-framework/src/assets/hints.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Automattic/harper/HEAD/packages/lint-framework/src/assets/hints.json)","tokens":300,"sizeBytes":203},{"name":"tsconfig.json","path":"packages/lint-framework/tsconfig.json","rawUrl":"https://raw.githubusercontent.com/Automattic/harper/HEAD/packages/lint-framework/tsconfig.json","title":"Lint-framework Skill","category":"anthropic-skill","format":"json","content":"# Lint-framework Skill\n\nPath: `packages/lint-framework/tsconfig.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Automattic/harper/HEAD/packages/lint-framework/tsconfig.json)","tokens":300,"sizeBytes":195},{"name":"package.json","path":"packages/obsidian-plugin/package.json","rawUrl":"https://raw.githubusercontent.com/Automattic/harper/HEAD/packages/obsidian-plugin/package.json","title":"Obsidian-plugin Skill","category":"anthropic-skill","format":"json","content":"# Obsidian-plugin Skill\n\nPath: `packages/obsidian-plugin/package.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Automattic/harper/HEAD/packages/obsidian-plugin/package.json)","tokens":300,"sizeBytes":196},{"name":"extensions.json","path":"packages/vscode-plugin/.vscode/extensions.json","rawUrl":"https://raw.githubusercontent.com/Automattic/harper/HEAD/packages/vscode-plugin/.vscode/extensions.json","title":".vscode Skill","category":"anthropic-skill","format":"json","content":"# .vscode Skill\n\nPath: `packages/vscode-plugin/.vscode/extensions.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Automattic/harper/HEAD/packages/vscode-plugin/.vscode/extensions.json)","tokens":300,"sizeBytes":206},{"name":"launch.json","path":"packages/vscode-plugin/.vscode/launch.json","rawUrl":"https://raw.githubusercontent.com/Automattic/harper/HEAD/packages/vscode-plugin/.vscode/launch.json","title":".vscode Skill","category":"anthropic-skill","format":"json","content":"# .vscode Skill\n\nPath: `packages/vscode-plugin/.vscode/launch.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Automattic/harper/HEAD/packages/vscode-plugin/.vscode/launch.json)","tokens":300,"sizeBytes":198},{"name":"settings.json","path":"packages/vscode-plugin/.vscode/settings.json","rawUrl":"https://raw.githubusercontent.com/Automattic/harper/HEAD/packages/vscode-plugin/.vscode/settings.json","title":".vscode Skill","category":"anthropic-skill","format":"json","content":"# .vscode Skill\n\nPath: `packages/vscode-plugin/.vscode/settings.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Automattic/harper/HEAD/packages/vscode-plugin/.vscode/settings.json)","tokens":300,"sizeBytes":202},{"name":"tasks.json","path":"packages/vscode-plugin/.vscode/tasks.json","rawUrl":"https://raw.githubusercontent.com/Automattic/harper/HEAD/packages/vscode-plugin/.vscode/tasks.json","title":".vscode Skill","category":"anthropic-skill","format":"json","content":"# .vscode Skill\n\nPath: `packages/vscode-plugin/.vscode/tasks.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Automattic/harper/HEAD/packages/vscode-plugin/.vscode/tasks.json)","tokens":300,"sizeBytes":196},{"name":"development-guide.md","path":"packages/vscode-plugin/development-guide.md","rawUrl":"https://raw.githubusercontent.com/Automattic/harper/HEAD/packages/vscode-plugin/development-guide.md","title":"Vscode-plugin Skill","category":"anthropic-skill","format":"markdown","content":"# Development Guide\n\nThis document has been moved to the [official documentation](https://writewithharper.com/docs/contributors/visual-studio-code).\n","isInternal":false,"tokens":33,"sizeBytes":149},{"name":"package.json","path":"packages/vscode-plugin/package.json","rawUrl":"https://raw.githubusercontent.com/Automattic/harper/HEAD/packages/vscode-plugin/package.json","title":"Vscode-plugin Skill","category":"anthropic-skill","format":"json","content":"{\n\t\"name\": \"harper\",\n\t\"displayName\": \"Harper - Grammar / Spell Checking\",\n\t\"description\": \"The grammar checker for developers\",\n\t\"version\": \"2.13.0\",\n\t\"private\": true,\n\t\"author\": \"Elijah Potter\",\n\t\"publisher\": \"elijah-potter\",\n\t\"license\": \"Apache-2.0\",\n\t\"icon\": \"icon.png\",\n\t\"galleryBanner\": {\n\t\t\"color\": \"#F2F2F2\",\n\t\t\"theme\": \"light\"\n\t},\n\t\"repository\": {\n\t\t\"type\": \"git\",\n\t\t\"url\": \"https://github.com/automattic/harper\"\n\t},\n\t\"bugs\": {\n\t\t\"url\": \"https://github.com/automattic/harper/issues\"\n\t},\n\t\"engines\": {\n\t\t\"vscode\": \"^1.96.2\"\n\t},\n\t\"categories\": [\n\t\t\"Other\"\n\t],\n\t\"keywords\": [\n\t\t\"grammar\",\n\t\t\"spellcheck\",\n\t\t\"writing\"\n\t],\n\t\"activationEvents\": [\n\t\t\"onLanguage:asciidoc\",\n\t\t\"onLanguage:c\",\n\t\t\"onLanguage:clojure\",\n\t\t\"onLanguage:cmake\",\n\t\t\"onLanguage:cpp\",\n\t\t\"onLanguage:csharp\",\n\t\t\"onLanguage:dart\",\n\t\t\"onLanguage:elixir\",\n\t\t\"onLanguage:git-commit\",\n\t\t\"onLanguage:gleam\",\n\t\t\"onLanguage:go\",\n\t\t\"onLanguage:groovy\",\n\t\t\"onLanguage:haskell\",\n\t\t\"onLanguage:html\",\n\t\t\"onLanguage:ink\",\n\t\t\"onLanguage:java\",\n\t\t\"onLanguage:javascript\",\n\t\t\"onLanguage:javascriptreact\",\n\t\t\"onLanguage:jj-commit\",\n\t\t\"onLanguage:kotlin\",\n\t\t\"onLanguage:literate haskell\",\n\t\t\"onLanguage:lua\",\n\t\t\"onLanguage:markdown\",\n\t\t\"onLanguage:nix\",\n\t\t\"onLanguage:org\",\n\t\t\"onLanguage:php\",\n\t\t\"onLanguage:powershell\",\n\t\t\"onLanguage:plaintext\",\n\t\t\"onLanguage:python\",\n\t\t\"onLanguage:quarto\",\n\t\t\"onLanguage:r\",\n\t\t\"onLanguage:rmd\",\n\t\t\"onLanguage:rmarkdown\",\n\t\t\"onLanguage:ruby\",\n\t\t\"onLanguage:rust\",\n\t\t\"onLanguage:scala\",\n\t\t\"onLanguage:scminput\",\n\t\t\"onLanguage:shellscript\",\n\t\t\"onLanguage:solidity\",\n\t\t\"onLanguage:swift\",\n\t\t\"onLanguage:tex\",\n\t\t\"onLanguage:latex\",\n\t\t\"onLanguage:toml\",\n\t\t\"onLanguage:typescript\",\n\t\t\"onLanguage:typescriptreact\",\n\t\t\"onLanguage:typst\",\n\t\t\"onLanguage:zig\"\n\t],\n\t\"main\": \"./build/extension.js\",\n\t\"contributes\": {\n\t\t\"icons\": {\n\t\t\t\"harper-logo\": {\n\t\t\t\t\"description\": \"Harper logo\",\n\t\t\t\t\"default\": {\n\t\t\t\t\t\"fontPath\": \"media/harper.woff\",\n\t\t\t\t\t\"fontCharacter\": \"\\\\e900\"\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\t\t\"languages\": [\n\t\t\t{\n\t\t\t\t\"id\": \"gleam\",\n\t\t\t\t\"aliases\": [\n\t\t\t\t\t\"Gleam\",\n\t\t\t\t\t\"gleam\"\n\t\t\t\t],\n\t\t\t\t\"extensions\": [\n\t\t\t\t\t\".gleam\"\n\t\t\t\t]\n\t\t\t}\n\t\t],\n\t\t\"commands\": [\n\t\t\t{\n\t\t\t\t\"command\": \"harper.languageserver.restart\",\n\t\t\t\t\"title\": \"Harper: Restart Language Server\",\n\t\t\t\t\"description\": \"Restart harper-ls\"\n\t\t\t}\n\t\t],\n\t\t\"configuration\": {\n\t\t\t\"type\": \"object\",\n\t\t\t\"title\": \"Harper\",\n\t\t\t\"properties\": {\n\t\t\t\t\"harper.path\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"string\",\n\t\t\t\t\t\"description\": \"Optional path to a harper-ls executable to use.\"\n\t\t\t\t},\n\t\t\t\t\"harper.codeActions.ForceStable\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": false,\n\t\t\t\t\t\"description\": \"Make code actions appear in \\\"stable\\\" positions by placing code actions that should always be available, like adding misspelled words in the dictionary, first.\"\n\t\t\t\t},\n\t\t\t\t\"harper.dialect\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"string\",\n\t\t\t\t\t\"enum\": [\n\t\t\t\t\t\t\"British\",\n\t\t\t\t\t\t\"American\",\n\t\t\t\t\t\t\"Canadian\",\n\t\t\t\t\t\t\"Australian\"\n\t\t\t\t\t],\n\t\t\t\t\t\"default\": \"American\",\n\t\t\t\t\t\"description\": \"Set which dialect of English Harper should expect.\"\n\t\t\t\t},\n\t\t\t\t\"harper.diagnosticSeverity\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"string\",\n\t\t\t\t\t\"enum\": [\n\t\t\t\t\t\t\"error\",\n\t\t\t\t\t\t\"hint\",\n\t\t\t\t\t\t\"information\",\n\t\t\t\t\t\t\"warning\"\n\t\t\t\t\t],\n\t\t\t\t\t\"default\": \"information\",\n\t\t\t\t\t\"description\": \"How severe do you want diagnostics to appear in the editor?\"\n\t\t\t\t},\n\t\t\t\t\"harper.excludePatterns\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"array\",\n\t\t\t\t\t\"description\": \"A set of globs to ignore. If a file matches any of the globs, it will not be linted.\"\n\t\t\t\t},\n\t\t\t\t\"harper.fileDictPath\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"string\",\n\t\t\t\t\t\"description\": \"Optional path to a file dictionary directory to use.\"\n\t\t\t\t},\n\t\t\t\t\"harper.isolateEnglish\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": false,\n\t\t\t\t\t\"description\": \"Only lint English text in documents that are a mixture of English and another language.\"\n\t\t\t\t},\n\t\t\t\t\"harper.markdown.IgnoreLinkTitle\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": false,\n\t\t\t\t\t\"description\": \"Skip linting link titles.\"\n\t\t\t\t},\n\t\t\t\t\"harper.maxFileLength\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"number\",\n\t\t\t\t\t\"default\": 120000,\n\t\t\t\t\t\"description\": \"Maximum length of file to be linted (in bytes). If a file is larger than this, it will not be linted.\"\n\t\t\t\t},\n\t\t\t\t\"harper.userDictPath\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"string\",\n\t\t\t\t\t\"description\": \"Optional path to a user dictionary file to use.\"\n\t\t\t\t},\n\t\t\t\t\"harper.workspaceDictPath\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"string\",\n\t\t\t\t\t\"description\": \"Optional path to a workspace-local dictionary file to use.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.ACoupleMore\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"Corrects `a couple of more` to `a couple more`.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.ALittleOfPractice\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"Corrects `a little of practice` to `a little practice` or `a bit of practice`.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.ALongTime\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"Corrects `along time` to `a long time`.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.AMeansToAnEnd\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"Corrects `a mean to an end` to `a means to an end`\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.AOkHyphen\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"Replaces the loose article-plus-abbreviation pairing with the standard hyphenated form whenever a linking verb describes readiness or approval.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.APart\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"Finds and corrects common mistakes between 'a part' and 'apart'\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.ASomeTime\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"Removes the redundant/conflicting indefinite article `a` before `some` when followed by time expressions.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.AWaysToGo\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"Corrects the idiom `a ways to go` when the indefinite article is missing.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.AWhile\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"Enforces `awhile` after verbs and `a while` everywhere else.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.AWholeOther\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"Corrects `a whole another`/`a whole 'nother` to `a whole other`.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.AccuseOf\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"Corrects `accuse for` to `accuse of`.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.AdNauseam\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"Corrects `as nauseam` to `ad nauseam`.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.Addicting\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"Replaces `addicting` with `addictive` when used as an adjective.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.AdjectiveDoubleDegree\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"Finds adjectives that are used as double degrees (e.g. `more prettier`).\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.AdjectiveOfA\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"This rule looks for sequences of words of the form `adjective of a`.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.Ado\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"Corrects `adieu` to `ado`.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.AdvantageOf\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"Corrects the missing preposition in the idiom `take advantage of` when `of` is dropped.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.AfterAWhile\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"Corrects the missing article in `after while`, forming `after a while`.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.AfterAll\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"Corrects `afterall` to `after all`.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.AfterLater\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"Checks for the word `later` following `after [a period of time]`.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.AheadAnd\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"Corrects `an` to `and` after `ahead`.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.Ajar\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"Corrects `a jar` to `ajar`.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.Akimbo\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"Corrects `a kimbo` to `akimbo`.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.Albeit\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"Corrects this expression to the standard `albeit`.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.AllHellBreakLoose\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"Corrects forms of `all hell breaks out` to `all hell breaks loose`.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.AllIntentsAndPurposes\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"Finds and corrects common wrong forms of the phrase 'for all intents and purposes' / 'to all intents and purposes'.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.AllOfASudden\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"Guides this expression toward the standard `all of a sudden`.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.AllReady\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"Flags `all ready` when it precedes an adjective so the adverb `already` can take its place.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.AllThough\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"Nobody means to write the two-word phrase `all though` when the single word `although` is intended.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.AllWellAndGood\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"Corrects `all well in good` to `all well and good`.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.AllowTo\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"Flags erroneous usage of `allow to` without a subject.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.Alongside\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"Replaces the spaced form `along side` with `alongside`.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.AlzheimersDisease\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"Fixes the common misnomer `old-timers' disease`, ensuring the correct medical term `Alzheimer’s disease` is used.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.AmInTheMorning\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"Finds redundant am/pm indicators used together with time periods such as 'in the morning' or 'at night'.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.AmazonNames\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"When referring to the various products of Amazon.com, make sure to treat them as a proper noun.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.Americas\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"When referring to North, Central, and South America, make sure to treat them as a proper noun.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.AmountsFor\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"Corrects `amounts for` to either `amounts to` or `accounts for`\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.AnA\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"A rule that looks for incorrect indefinite articles. For example, `this is an mule` would be flagged as incorrect.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.AnAnother\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"Corrects `an another` and `a another`.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.AnalogAcousticBike\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": false,\n\t\t\t\t\t\"description\": \"Suggests more standard terms for `analog/analogue bike` and `acoustic bike`.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.AndIn\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"Fixes the typo `an in` when it stands in for the conjunction `and in`, while avoiding common `in-...` noun phrases and a few attested exceptions.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.AndSuch\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"Corrects `and the such` to `and such`.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.AndTheLike\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"Corrects mistakes in `and the like` and `or the like`.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.AnotherAn\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"Corrects `another an` to `another`.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.AnotherOnes\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"Corrects `another ones`.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.AnotherThingComing\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"Though `another think coming` is the original phrase, `another thing coming` is now more common.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.AnotherThings\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"Corrects `another things`.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.AnotherThinkComing\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": false,\n\t\t\t\t\t\"description\": \"Though `another thing coming` is now more common, `another think coming` is the original phrase.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.Anybody\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"Looks for incorrect spacing inside the closed compound `anybody`.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.Anyhow\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"Looks for incorrect spacing inside the closed compound `anyhow`.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.Anywhere\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"Looks for incorrect spacing inside the closed compound `anywhere`.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.ApartFrom\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"Flags the misspelling `apart form` and suggests `apart from`.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.AppleNames\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"When referring to Apple products and services, make sure to treat them as proper nouns.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.ArgumentToBeMade\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"Corrects `argument to be said` to `argument to be made`.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.ArriveOnWeekday\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"Keeps schedules explicit by preferring the familiar `arrive on Friday` pattern instead of a bare weekday.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.ArriveTo\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"Corrects `arrive to` to `arrive at` or `arrive in`.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.AsComparedTo\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"Corrects `as compare to` to `as compared to`.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.AsEvidentBy\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"Corrects `evident by` to `evidenced by` in passive constructions where `evidence` is used as a verb.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.AsFarAsICanTell\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"Expands an initialism.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.AsFarAsIKnow\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"Expands an initialism.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.AsFarBackAs\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"Corrects nonstandard `as early back as` to `as far back as`.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.AsFollows\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"Corrects the phrase `as follow`, which is sometimes produced by overcorrection. While it appeared briefly in 19th-century English, it is now considered archaic; modern standard usage requires `as follows` regardless of number.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.AsHow\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"Corrects `as how` to `as to how`.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.AsIUnderstandIt\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"Expands an initialism.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.AsIfThough\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"Corrects redundant `as if though`.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.AsIsWithAnything\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"Flags the incorrect idiom blend `as is with anything` and suggests standard alternatives like `as with anything` or `as is the case with anything`.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.AsItHappens\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"Corrects `as it so happens` to `as it happens`.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.AsLongAs\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"Corrects `aslong as` and `as long that` to `as long as`.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.AsMuchAs\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"Corrects `as much than` to `as much as`.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.AsOfCurrently\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"Corrects `as of currently` to `currently` or `as of now`.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.AsOfLately\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"Corrects `as of lately` to `lately` or `as of late`.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.AsOpposedTo\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"Corrects `as oppose to` to `as opposed to`.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.AsSoonAsPossible\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"Expands an initialism.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.AsToInterrogative\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"Corrects `to` to `as to` between certain adjectives and `wh-words`.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.AskNoPreposition\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"Identifies sequences like `ask to us` or `tell to him` and recommends removing the superfluous “to”.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.AspireTo\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"Corrects `aspire for` to `aspire to`.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.AtAllCosts\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"Corrects `at all cost` to `at all costs`.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.AtFaceValue\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"Corrects nonstandard variants of `at face value`.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.AtLeasToLeast\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"Fixes the frequent typo `at leas` when the intended expression is `at least`.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.AtLestToLeast\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"Fixes the mistake `at lest` when the intended expression is `at least`.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.AtTheBestOfTimes\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"Corrects `in the best of times` to `at the best of times`.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.AtTheEndOfTheDay\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"Corrects `in the end of the day` to `at the end of the day`.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.AtTheExpenseOf\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"The correct idiom is `at the expense of`, with singular `expense`. But retain `expanse` if this phrase refers to a wide area.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.AtTheVeryLeast\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"Corrects `in the very least` to `at the very least`.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.Audible\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"Corrects `hearable` to `audible`.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.Australia\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"When referring to states, territories, and cities in Australia, make sure to treat them as a proper noun.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.AvoidAndAlso\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"Reduces redundancy by replacing `and also` with `and`.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.AvoidContractions\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": false,\n\t\t\t\t\t\"description\": \"Suggests expanded forms for common contractions, such as `isn't` → `is not` and `we're` → `we are`.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.AvoidCurses\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"Flags offensive language and offers various ways to censor or replace with euphemisms.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.AwaitFor\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"Suggests using either `await` or `wait for` but not both, as they express the same meaning.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.AwareOf\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"Corrects `aware about` to the standard `aware of`.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.AzureNames\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"When referring to Azure cloud services, make sure to treat them as proper nouns.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.BackInTheDay\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"This linter flags instances of the nonstandard phrase `back in the days`. The correct, more accepted form is `back in the day`\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.BackhandedCompliment\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"Corrects `backhand compliment` to `backhanded compliment`.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.Backplane\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"Looks for incorrect spacing inside the closed compound `backplane`.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.BadRap\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"Changes `bed rap` to the proper idiom `bad rap`.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.BainBane\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"Detects mixing up `bain` and `bane`.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.BanTogether\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"Detects and corrects the common error of using `ban together` instead of the idiom `band together`, which means to unite or join forces.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.BareBones\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"Corrects `bare-bone` to `bare-bones`.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.BareInMind\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"Ensures the phrase `bear in mind` is used correctly instead of `bare in mind`.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.BareWithMe\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"Corrects `bare with` to `bear with`.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.BarelyUn\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"Flags using `barely` with a negative adjective starting with `un-` (`barely unusable`, etc.), which is a kind of double negative.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.BatedBreath\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"Changes `baited breath` to the correct `bated breath`.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.BeAllowed\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"Ensures the passive form uses `be allowed` after future negatives.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.BeBiased\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"Detects incorrect use of 'be + verb' instead of `be + adjective`.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.BeConcerned\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"Detects incorrect use of 'be + verb' instead of `be + adjective`.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.BePrejudiced\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"Detects incorrect use of 'be + verb' instead of `be + adjective`.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.BeRightBack\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"Expands an initialism.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.BeShocked\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"Detects incorrect use of 'be + verb' instead of `be + adjective`.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.BeWorried\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"Detects incorrect use of 'be + verb' instead of `be + adjective`.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.BeckAndCall\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"Fixes eggcorns of `beck and call`.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.BeenThere\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"Corrects the misspelling `bee there` to the proper phrase `been there`.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.Beforehand\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"`Beforehand` functions as a fixed adverb meaning ‘in advance’; writing it as two words or with a hyphen is nonstandard and can jar readers.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.BehindTheScenes\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"Corrects `behind the scene` to `behind the scenes`.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.BellowBelow\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"Looks for `bellow` wrongly used when `below` is intended.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.BesideThePoint\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"Corrects `besides the point` to `beside the point`.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.BestOfAllTime\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"Checks for nonstandard `of all times` in superlatives instead of singular `time`\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.BestRegards\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"In valedictions, `best` expresses your highest regard—avoid the typo `beat regards`.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.BetterOffPhrase\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"Rewrites `better of` to `better off` in common comparative phrasing.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.BetterOffServed\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"Corrects `better off served` to `better off` or `better served`.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.BetterOffWith\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"Corrects `better of with` to `better off with`.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.BewareOf\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"The verb `beware` naturally pairs with `of` before the noun being warned about, so swap other prepositions for clarity.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.BlacklistWhitelist\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"Normalize the two-word sequence `black list`/`white list` so it matches the established compound noun or verb.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.BlanketStatement\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"Corrects common errors in the phrase `blanket statement`.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.BluRayHyphen\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"Joins the two-word spelling of the optical disc format into the standard compound form.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.BoarderBorder\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"Flags the eggcorn `boarder` (a lodger) where `border` (an edge/boundary) is intended.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.Bollocks\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"Corrects `bullocks` to `bollocks` when the meaning is `nonsense`.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.BoringWords\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": false,\n\t\t\t\t\t\"description\": \"This rule looks for particularly boring or overused words. Using varied language is an easy way to keep a reader's attention.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.Bought\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"Replaces the incorrect past-tense spelling `bough` with `bought` after subject pronouns.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.BrandBrandish\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"Looks for `brandish` wrongly used when `brand` is intended.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.Brutality\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"Suggests the more standard and common synonym `brutality`.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.BuiltIn\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"English convention treats `built-in` as a single, attributive adjective—meaning something integrated from the outset—whereas other forms like `in built` are nonstandard and can feel awkward to readers.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.ByAccident\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"Incorrect preposition: `by accident` is the idiomatic expression.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.ByExtension\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"Corrects `by extent` to `by extension`.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.ByOnesOwn\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"Fixes incorrect phrases like `by my own` by suggesting `on my own` or `by myself`.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.ByTheBook\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"Corrects `by the books` to `by the book`.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.ByTheWay\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"Expands an initialism.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.Bypass\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"Looks for incorrect spacing inside the closed compound `bypass`.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.CallItQuits\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"Corrects wrong variants of the idiom 'call it quits'.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.CallThem\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"Addresses the non-idiomatic phrases `call them as`.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.CanBeSeen\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"Corrects `can be seem` to the proper phrase `can be seen`.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.Canada\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"When referring to provinces, territories, and cities in Canada, make sure to treat them as a proper noun.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.Cant\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"Suggests correcting `cant` to `can't`.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.CantWay\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"Corrects `way` to `wait` in high-confidence contexts such as `can't way to` and `doesn't way for`.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.CapitalizeOn\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"A collection of linters that can be run as one.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.CapitalizePersonalPronouns\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"Forgetting to capitalize personal pronouns, like \\\"I\\\" or \\\"I'm\\\" is one of the most common errors. This rule helps with that.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.CaseInPoint\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"Corrects `case and point` to `case in point`.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.CaseSensitive\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"Ensures `case-sensitive` is correctly hyphenated.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.Catch22\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"Corrects mistakenly using similar-sounding words in the idiom `catch 22`.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.CauseItIsBecause\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"Normalizes informal `cause it is` to the standard subordinating form in explanatory clauses.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.CautionaryTale\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"Corrects confusion between `tale` (story) and `tail` (appendage) in common phrases.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.CeaseTo\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"Detects when `seize to` is likely a typo for `cease to`.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.Chalkboard\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"Looks for incorrect spacing inside the closed compound `chalkboard`.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.ChampAtTheBit\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"Corrects `chomp at the bit` to the idiom `champ at the bit`, which has an equestrian origin referring to the way an anxious horse grinds its teeth against the metal part of the bridle.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.ChangeTack\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"Locates errors in the idioms `to change tack` and `change of tack` to convey the correct meaning of altering one's course or strategy.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.ChickenAndEgg\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"Corrects wrong variants of the `chicken-and-egg` idiom.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.ChineseCommunistParty\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"When referring to the political party, make sure to treat them as a proper noun.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.ChockFull\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"Flags common soundalikes of \\\"chock-full\\\" and makes sure they're hyphenated.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.ClaimToFame\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"Corrects `claim for fame` to the idiom `claim to fame`.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.ClicheAccent\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"A collection of linters that can be run as one.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.ClickThroughRate\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"Hyphenates the verb+preposition pair when it directly precedes rate-style nouns, mirroring how these terms are commonly styled in analytics writing.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.ClientOrServerSide\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"Corrects extraneous apostrophe in `client's side` and `server's side`.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.CloseTightKnit\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"Corrects `close-nit` and `tight-nit` to `close-knit` and `tight-knit`.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.CodeInWriteIn\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"Corrects the wrong preposition `on` to `in` when referring to writing code.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.Codebase\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"Looks for incorrect spacing inside the closed compound `codebase`.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.Codebases\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"Looks for incorrect spacing inside the closed compound `codebases`.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.ColdModalTypo\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"Rewrites `cold` to `could` when it appears in common subject-plus-verb modal contexts.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.Combinate\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"Suggests replacing the nonstandard verb `combinate` with the standard `combine`.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.ComfortableWith\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"Corrects `comfortable of` to `comfortable with`.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.CommaFixes\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"Fix common comma errors such as no space after, erroneous space before, etc., Asian commas instead of English commas, etc.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.CommitmentTo\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"Corrects `commitment toward/towards` to `commitment to`.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.CompaniesProductsAndTrademarks\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"Ensure proper capitalization of companies, products, and trademarks.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.ComplainAsNoun\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"Corrects the use of `complain` as a noun.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.CompoundNouns\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"Detects compound nouns split by a space and suggests merging them when both parts form a valid noun.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.CompoundSubjectI\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"Promotes `I` in compound subjects headed by a possessive determiner.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.ComprisesOf\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"`Comprises` already contains the notion of `of`, so following it with another `of` is redundant.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.CompulseToCompel\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"Suggests replacing the obsolete or archaic verb `compulse` with the standard `compel`.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.CondensateVerb\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"Suggests replacing the nonstandard verb `condensate` with the standard `condense`.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.CondenseAllThe\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"Suggests removing `of` in `all of the` for a more concise phrase.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.Confident\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"This linter detects instances where the noun `confidant` is incorrectly used in place of the adjective `confident`. `Confidant` refers to a trusted person, whereas `confident` describes certainty or self-assurance. The rule suggests replacing `confidant` with `confident` when used in an adjectival context.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.ConfirmThat\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"Corrects `conform` typos to `confirm`.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.ConstituteAs\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"Removes extraneous `as` after the verb `constitute`.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.ConvenientStore\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"Attempts to detect when `convenient store` is mistake for `convenience store`.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.Copyright\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"Corrects `copywrite` to `copyright`. `Copywrite` refers to writing copy, while `copyright` is the legal right to creative works.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.CorrectNumberSuffix\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"When making quick edits, it is common for authors to change the value of a number without changing its suffix. This rule looks for these cases, for example: `2st`.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.Countries\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"When referring to Countries, make sure to treat it as a proper noun.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.CoursingThroughVeins\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"In English idioms, `to course` means to flow rapidly—so avoid the eggcorn `cursing through veins.`\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.CraveFor\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"There should be no `for` after the verb `crave`.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.CriteriaPhenomena\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"The words “criteria” and “phenomena” are the plurals of “criterion” and “phenomenon”, respectively. They are often incorrectly used with the wrong number.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.CrossPlatform\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"Unlike some compound modifiers, `cross-platform` should always be hyphenated.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.CureFor\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"Flags `cure against` and prefers the standard `cure for` pairing.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.CuriousAbout\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"Corrects `curious of` and `curious on` to `curious about`.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.CurrencyPlacement\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"The location of currency symbols varies by country. The rule looks for and corrects improper positioning.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.CuttingAgeEggcorn\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"Corrects the eggcorn `cutting age` or `cutting-age` to `cutting-edge` or `cutting edge`.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.Cybersec\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"Expands the informal abbreviation `cybersec` to `cybersecurity`.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.Damages\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"Checks for plural `damages` not in the context of a court case.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.DampSquib\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"Corrects the eggcorn `damp squid` to `damp squib`, ensuring the intended meaning of a failed or underwhelming outcome.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.Dashes\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"Writers often type `--` or `---` expecting their editor to convert them into proper dashes. Replace these sequences with the correct characters: use an en dash (–) for ranges or connections and an em dash (—) for a break in thought.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.DateBackFrom\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"Corrects the blend of `date from` and `date back to` into the nonstandard `date back from`.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.DayAndAge\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"Fixes wrong variants of the idiom `in this day and age`.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.DayOneNames\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"Ensure proper capitalization of Day One and Day One Premium as brand names.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.Deadlift\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"Looks for incorrect spacing inside the closed compound `deadlift`.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.DefiniteArticle\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"The name of the word `the` is `definite article`.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.DegreesKelvin\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"Corrects use of `degrees kelvin` to `kelvins`.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.DegreesKelvinSymbol\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"Corrects use of `°K` to `K`.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.DenyOffer\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"Corrects `deny` when used with `offer` to `decline` or `reject`.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.Dereference\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"A collection of linters that can be run as one.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.Desktop\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"Looks for incorrect spacing inside the closed compound `desktop`.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.DespiteItIs\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"Corrects `despite` being used with the wrong form of `is`.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.DespiteOf\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"Corrects the misuse of `despite of` and suggests the proper alternatives `despite` or `in spite of`.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.Devops\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"Looks for incorrect spacing inside the closed compound `devops`.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.DidPast\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"Corrects past forms of verbs to their base form, when used together with \\\"did\\\".\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.Didnt\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"Corrects `dint` to `didn't` after subject pronouns.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.DigUnderTheHood\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"Detects the mixed metaphor of `digging under the hood/bonnet`.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.DigestiveTract\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"","isInternal":false,"tokens":14429,"sizeBytes":50043},{"name":"settings.json","path":"packages/vscode-plugin/src/tests/fixtures/.vscode/settings.json","rawUrl":"https://raw.githubusercontent.com/Automattic/harper/HEAD/packages/vscode-plugin/src/tests/fixtures/.vscode/settings.json","title":".vscode Skill","category":"anthropic-skill","format":"json","content":"# .vscode Skill\n\nPath: `packages/vscode-plugin/src/tests/fixtures/.vscode/settings.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Automattic/harper/HEAD/packages/vscode-plugin/src/tests/fixtures/.vscode/settings.json)","tokens":300,"sizeBytes":240},{"name":"integration.md","path":"packages/vscode-plugin/src/tests/fixtures/integration.md","rawUrl":"https://raw.githubusercontent.com/Automattic/harper/HEAD/packages/vscode-plugin/src/tests/fixtures/integration.md","title":"Fixtures Skill","category":"anthropic-skill","format":"markdown","content":"# Fixtures Skill\n\nPath: `packages/vscode-plugin/src/tests/fixtures/integration.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Automattic/harper/HEAD/packages/vscode-plugin/src/tests/fixtures/integration.md)","tokens":300,"sizeBytes":227},{"name":"tsconfig.json","path":"packages/vscode-plugin/tsconfig.json","rawUrl":"https://raw.githubusercontent.com/Automattic/harper/HEAD/packages/vscode-plugin/tsconfig.json","title":"Vscode-plugin Skill","category":"anthropic-skill","format":"json","content":"{\n\t\"exclude\": [\"src/tests/fixtures\"],\n\t\"compilerOptions\": {\n\t\t\"module\": \"Node16\",\n\t\t\"target\": \"ES2022\",\n\t\t\"lib\": [\"ES2022\", \"DOM\"],\n\t\t\"sourceMap\": true,\n\t\t\"rootDir\": \"src\",\n\t\t\"outDir\": \"build\",\n\t\t\"strict\": true,\n\t\t\"skipLibCheck\": true\n\t}\n}\n","frontmatter":{"exclude":["src/tests/fixtures"],"compilerOptions":{"module":"Node16","target":"ES2022","lib":["ES2022","DOM"],"sourceMap":true,"rootDir":"src","outDir":"build","strict":true,"skipLibCheck":true}},"isInternal":false,"tokens":93,"sizeBytes":240},{"name":"demo_wp_blueprint.json","path":"packages/web/demo_wp_blueprint.json","rawUrl":"https://raw.githubusercontent.com/Automattic/harper/HEAD/packages/web/demo_wp_blueprint.json","title":"Web Skill","category":"anthropic-skill","format":"json","content":"{\n\t\"$schema\": \"https://playground.wordpress.net/blueprint-schema.json\",\n\t\"preferredVersions\": {\n\t\t\"php\": \"8.0\",\n\t\t\"wp\": \"6.7\"\n\t},\n\t\"meta\": {\n\t\t\"title\": \"Demo of Harper for WordPress\",\n\t\t\"description\": \"Harper is a grammar checker for people who want to write, without any fuss.\",\n\t\t\"author\": \"elijah-potter\",\n\t\t\"categories\": []\n\t},\n\t\"landingPage\": \"/wp-admin/post.php?post=4&action=edit\",\n\t\"steps\": [\n\t\t{\n\t\t\t\"step\": \"login\",\n\t\t\t\"username\": \"admin\",\n\t\t\t\"password\": \"password\"\n\t\t},\n\t\t{\n\t\t\t\"step\": \"installPlugin\",\n\t\t\t\"pluginData\": {\n\t\t\t\t\"resource\": \"url\",\n\t\t\t\t\"url\": \"https://github.com/Automattic/harper/releases/download/v0.27.0/harper.zip\"\n\t\t\t},\n\t\t\t\"options\": {\n\t\t\t\t\"activate\": true\n\t\t\t}\n\t\t},\n\t\t{\n\t\t\t\"step\": \"installTheme\",\n\t\t\t\"themeData\": {\n\t\t\t\t\"resource\": \"wordpress.org/themes\",\n\t\t\t\t\"slug\": \"twentytwentyfour\"\n\t\t\t}\n\t\t},\n\t\t{\n\t\t\t\"step\": \"runPHP\",\n\t\t\t\"code\": \"<?php require_once 'wordpress/wp-load.php'; wp_insert_post(array('post_title' => 'Harper, in WordPress', 'post_content' => '<!-- wp:paragraph --><p><strong>Click on the Harper button on the top right of this page to get started.</strong></p><!-- /wp:paragraph --><!-- wp:paragraph --><p>Writing on the web can be scary. Theres a lot of competition for traffic and even a small grammatical mstake can be costly to your reputation and search rankings.</p><!-- /wp:paragraph --><!-- wp:paragraph --><p>That\\\\'s why we created Harper: an plugin to save you the embarassment. it can fix typos, serial commas and overall just make your life better.</p><!-- /wp:paragraph --><!-- wp:paragraph --><p>All that while respecting your privacy. You data should never leave Wordpress until you hit \\\"Publish\\\".</p><!-- /wp:paragraph -->'));\"\n\t\t}\n\t]\n}\n","frontmatter":{"$schema":"https://playground.wordpress.net/blueprint-schema.json","preferredVersions":{"php":"8.0","wp":"6.7"},"meta":{"title":"Demo of Harper for WordPress","description":"Harper is a grammar checker for people who want to write, without any fuss.","author":"elijah-potter","categories":[]},"landingPage":"/wp-admin/post.php?post=4&action=edit","steps":[{"step":"login","username":"admin","password":"password"},{"step":"installPlugin","pluginData":{"resource":"url","url":"https://github.com/Automattic/harper/releases/download/v0.27.0/harper.zip"},"options":{"activate":true}},{"step":"installTheme","themeData":{"resource":"wordpress.org/themes","slug":"twentytwentyfour"}},{"step":"runPHP","code":"<?php require_once 'wordpress/wp-load.php'; wp_insert_post(array('post_title' => 'Harper, in WordPress', 'post_content' => '<!-- wp:paragraph --><p><strong>Click on the Harper button on the top right of this page to get started.</strong></p><!-- /wp:paragraph --><!-- wp:paragraph --><p>Writing on the web can be scary. Theres a lot of competition for traffic and even a small grammatical mstake can be costly to your reputation and search rankings.</p><!-- /wp:paragraph --><!-- wp:paragraph --><p>That\\'s why we created Harper: an plugin to save you the embarassment. it can fix typos, serial commas and overall just make your life better.</p><!-- /wp:paragraph --><!-- wp:paragraph --><p>All that while respecting your privacy. You data should never leave Wordpress until you hit \"Publish\".</p><!-- /wp:paragraph -->'));"}]},"isInternal":false,"tokens":506,"sizeBytes":1698},{"name":"_journal.json","path":"packages/web/drizzle/meta/_journal.json","rawUrl":"https://raw.githubusercontent.com/Automattic/harper/HEAD/packages/web/drizzle/meta/_journal.json","title":"Meta Skill","category":"anthropic-skill","format":"json","content":"# Meta Skill\n\nPath: `packages/web/drizzle/meta/_journal.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Automattic/harper/HEAD/packages/web/drizzle/meta/_journal.json)","tokens":300,"sizeBytes":189},{"name":"0000_snapshot.json","path":"packages/web/drizzle/meta/0000_snapshot.json","rawUrl":"https://raw.githubusercontent.com/Automattic/harper/HEAD/packages/web/drizzle/meta/0000_snapshot.json","title":"Meta Skill","category":"anthropic-skill","format":"json","content":"# Meta Skill\n\nPath: `packages/web/drizzle/meta/0000_snapshot.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Automattic/harper/HEAD/packages/web/drizzle/meta/0000_snapshot.json)","tokens":300,"sizeBytes":199},{"name":"0001_snapshot.json","path":"packages/web/drizzle/meta/0001_snapshot.json","rawUrl":"https://raw.githubusercontent.com/Automattic/harper/HEAD/packages/web/drizzle/meta/0001_snapshot.json","title":"Meta Skill","category":"anthropic-skill","format":"json","content":"# Meta Skill\n\nPath: `packages/web/drizzle/meta/0001_snapshot.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Automattic/harper/HEAD/packages/web/drizzle/meta/0001_snapshot.json)","tokens":300,"sizeBytes":199},{"name":"0002_snapshot.json","path":"packages/web/drizzle/meta/0002_snapshot.json","rawUrl":"https://raw.githubusercontent.com/Automattic/harper/HEAD/packages/web/drizzle/meta/0002_snapshot.json","title":"Meta Skill","category":"anthropic-skill","format":"json","content":"# Meta Skill\n\nPath: `packages/web/drizzle/meta/0002_snapshot.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Automattic/harper/HEAD/packages/web/drizzle/meta/0002_snapshot.json)","tokens":300,"sizeBytes":199},{"name":"0003_snapshot.json","path":"packages/web/drizzle/meta/0003_snapshot.json","rawUrl":"https://raw.githubusercontent.com/Automattic/harper/HEAD/packages/web/drizzle/meta/0003_snapshot.json","title":"Meta Skill","category":"anthropic-skill","format":"json","content":"# Meta Skill\n\nPath: `packages/web/drizzle/meta/0003_snapshot.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Automattic/harper/HEAD/packages/web/drizzle/meta/0003_snapshot.json)","tokens":300,"sizeBytes":199},{"name":"package.json","path":"packages/web/package.json","rawUrl":"https://raw.githubusercontent.com/Automattic/harper/HEAD/packages/web/package.json","title":"harper-web","category":"anthropic-skill","format":"json","content":"{\n\t\"name\": \"harper-web\",\n\t\"version\": \"0.0.1\",\n\t\"private\": true,\n\t\"scripts\": {\n\t\t\"dev\": \"vite dev\",\n\t\t\"build\": \"vite build -l warn\",\n\t\t\"preview\": \"vite preview\",\n\t\t\"check\": \"svelte-kit sync && svelte-check --tsconfig ./tsconfig.json\",\n\t\t\"check:watch\": \"svelte-kit sync && svelte-check --tsconfig ./tsconfig.json --watch\",\n\t\t\"start\": \"node build\"\n\t},\n\t\"devDependencies\": {\n\t\t\"@sveltejs/adapter-node\": \"^5.2.12\",\n\t\t\"@sveltejs/kit\": \"^2.37.1\",\n\t\t\"@sveltejs/vite-plugin-svelte\": \"^5.0.3\",\n\t\t\"@tailwindcss/vite\": \"^4.1.4\",\n\t\t\"@types/reveal.js\": \"^5.0.3\",\n\t\t\"autoprefixer\": \"^10.4.21\",\n\t\t\"drizzle-kit\": \"^0.31.5\",\n\t\t\"flowbite\": \"^3.1.2\",\n\t\t\"svelte\": \"^5.15.0\",\n\t\t\"svelte-check\": \"^4.1.5\",\n\t\t\"tailwindcss\": \"^4.1.16\",\n\t\t\"tslib\": \"catalog:\",\n\t\t\"tsx\": \"^4.20.6\",\n\t\t\"typescript\": \"catalog:\",\n\t\t\"vite\": \"^6.1.0\",\n\t\t\"vite-plugin-top-level-await\": \"^1.5.0\",\n\t\t\"vite-plugin-wasm\": \"^3.4.1\"\n\t},\n\t\"type\": \"module\",\n\t\"dependencies\": {\n\t\t\"@docsearch/css\": \"^3.9.0\",\n\t\t\"@docsearch/js\": \"^3.9.0\",\n\t\t\"@sveltepress/theme-default\": \"^5.0.7\",\n\t\t\"@sveltepress/vite\": \"^1.1.5\",\n\t\t\"brace\": \"^0.11.1\",\n\t\t\"chart.js\": \"^4.4.8\",\n\t\t\"components\": \"workspace:*\",\n\t\t\"drizzle-orm\": \"^0.44.6\",\n\t\t\"drizzle-zod\": \"^0.8.3\",\n\t\t\"harper-editor\": \"workspace:*\",\n\t\t\"harper.js\": \"workspace:*\",\n\t\t\"lint-framework\": \"workspace:*\",\n\t\t\"lodash-es\": \"^4.17.21\",\n\t\t\"mysql2\": \"^3.15.2\",\n\t\t\"posthog-js\": \"^1.245.1\",\n\t\t\"reveal.js\": \"^5.1.0\",\n\t\t\"svelte-ace\": \"^1.0.21\",\n\t\t\"svelte-intersection-observer\": \"^1.0.0\",\n\t\t\"typed.js\": \"^2.1.0\",\n\t\t\"zod\": \"^4.1.12\"\n\t}\n}\n","frontmatter":{"name":"harper-web","version":"0.0.1","private":true,"scripts":{"dev":"vite dev","build":"vite build -l warn","preview":"vite preview","check":"svelte-kit sync && svelte-check --tsconfig ./tsconfig.json","check:watch":"svelte-kit sync && svelte-check --tsconfig ./tsconfig.json --watch","start":"node build"},"devDependencies":{"@sveltejs/adapter-node":"^5.2.12","@sveltejs/kit":"^2.37.1","@sveltejs/vite-plugin-svelte":"^5.0.3","@tailwindcss/vite":"^4.1.4","@types/reveal.js":"^5.0.3","autoprefixer":"^10.4.21","drizzle-kit":"^0.31.5","flowbite":"^3.1.2","svelte":"^5.15.0","svelte-check":"^4.1.5","tailwindcss":"^4.1.16","tslib":"catalog:","tsx":"^4.20.6","typescript":"catalog:","vite":"^6.1.0","vite-plugin-top-level-await":"^1.5.0","vite-plugin-wasm":"^3.4.1"},"type":"module","dependencies":{"@docsearch/css":"^3.9.0","@docsearch/js":"^3.9.0","@sveltepress/theme-default":"^5.0.7","@sveltepress/vite":"^1.1.5","brace":"^0.11.1","chart.js":"^4.4.8","components":"workspace:*","drizzle-orm":"^0.44.6","drizzle-zod":"^0.8.3","harper-editor":"workspace:*","harper.js":"workspace:*","lint-framework":"workspace:*","lodash-es":"^4.17.21","mysql2":"^3.15.2","posthog-js":"^1.245.1","reveal.js":"^5.1.0","svelte-ace":"^1.0.21","svelte-intersection-observer":"^1.0.0","typed.js":"^2.1.0","zod":"^4.1.12"}},"isInternal":false,"tokens":647,"sizeBytes":1504},{"name":"+page.md","path":"packages/web/src/routes/docs/about/+page.md","rawUrl":"https://raw.githubusercontent.com/Automattic/harper/HEAD/packages/web/src/routes/docs/about/+page.md","title":"About Skill","category":"anthropic-skill","format":"markdown","content":"# About Skill\n\nPath: `packages/web/src/routes/docs/about/+page.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Automattic/harper/HEAD/packages/web/src/routes/docs/about/+page.md)","tokens":300,"sizeBytes":198},{"name":"+page.md","path":"packages/web/src/routes/docs/contributors/architecture/+page.md","rawUrl":"https://raw.githubusercontent.com/Automattic/harper/HEAD/packages/web/src/routes/docs/contributors/architecture/+page.md","title":"Architecture Skill","category":"anthropic-skill","format":"markdown","content":"# Architecture Skill\n\nPath: `packages/web/src/routes/docs/contributors/architecture/+page.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Automattic/harper/HEAD/packages/web/src/routes/docs/contributors/architecture/+page.md)","tokens":300,"sizeBytes":245},{"name":"+page.md","path":"packages/web/src/routes/docs/contributors/author-a-rule/+page.md","rawUrl":"https://raw.githubusercontent.com/Automattic/harper/HEAD/packages/web/src/routes/docs/contributors/author-a-rule/+page.md","title":"Author-a-rule Skill","category":"anthropic-skill","format":"markdown","content":"# Author-a-rule Skill\n\nPath: `packages/web/src/routes/docs/contributors/author-a-rule/+page.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Automattic/harper/HEAD/packages/web/src/routes/docs/contributors/author-a-rule/+page.md)","tokens":300,"sizeBytes":248},{"name":"+page.md","path":"packages/web/src/routes/docs/contributors/brill/+page.md","rawUrl":"https://raw.githubusercontent.com/Automattic/harper/HEAD/packages/web/src/routes/docs/contributors/brill/+page.md","title":"Brill Skill","category":"anthropic-skill","format":"markdown","content":"# Brill Skill\n\nPath: `packages/web/src/routes/docs/contributors/brill/+page.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Automattic/harper/HEAD/packages/web/src/routes/docs/contributors/brill/+page.md)","tokens":300,"sizeBytes":224},{"name":"+page.md","path":"packages/web/src/routes/docs/contributors/chrome-extension/+page.md","rawUrl":"https://raw.githubusercontent.com/Automattic/harper/HEAD/packages/web/src/routes/docs/contributors/chrome-extension/+page.md","title":"Chrome-extension Skill","category":"anthropic-skill","format":"markdown","content":"# Chrome-extension Skill\n\nPath: `packages/web/src/routes/docs/contributors/chrome-extension/+page.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Automattic/harper/HEAD/packages/web/src/routes/docs/contributors/chrome-extension/+page.md)","tokens":300,"sizeBytes":257},{"name":"+page.md","path":"packages/web/src/routes/docs/contributors/committer/+page.md","rawUrl":"https://raw.githubusercontent.com/Automattic/harper/HEAD/packages/web/src/routes/docs/contributors/committer/+page.md","title":"Committer Skill","category":"anthropic-skill","format":"markdown","content":"# Committer Skill\n\nPath: `packages/web/src/routes/docs/contributors/committer/+page.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Automattic/harper/HEAD/packages/web/src/routes/docs/contributors/committer/+page.md)","tokens":300,"sizeBytes":236},{"name":"+page.md","path":"packages/web/src/routes/docs/contributors/committing/+page.md","rawUrl":"https://raw.githubusercontent.com/Automattic/harper/HEAD/packages/web/src/routes/docs/contributors/committing/+page.md","title":"Committing Skill","category":"anthropic-skill","format":"markdown","content":"# Committing Skill\n\nPath: `packages/web/src/routes/docs/contributors/committing/+page.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Automattic/harper/HEAD/packages/web/src/routes/docs/contributors/committing/+page.md)","tokens":300,"sizeBytes":239},{"name":"+page.md","path":"packages/web/src/routes/docs/contributors/desktop/+page.md","rawUrl":"https://raw.githubusercontent.com/Automattic/harper/HEAD/packages/web/src/routes/docs/contributors/desktop/+page.md","title":"Desktop Skill","category":"anthropic-skill","format":"markdown","content":"# Desktop Skill\n\nPath: `packages/web/src/routes/docs/contributors/desktop/+page.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Automattic/harper/HEAD/packages/web/src/routes/docs/contributors/desktop/+page.md)","tokens":300,"sizeBytes":230},{"name":"+page.md","path":"packages/web/src/routes/docs/contributors/dictionary/+page.md","rawUrl":"https://raw.githubusercontent.com/Automattic/harper/HEAD/packages/web/src/routes/docs/contributors/dictionary/+page.md","title":"Dictionary Skill","category":"anthropic-skill","format":"markdown","content":"# Dictionary Skill\n\nPath: `packages/web/src/routes/docs/contributors/dictionary/+page.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Automattic/harper/HEAD/packages/web/src/routes/docs/contributors/dictionary/+page.md)","tokens":300,"sizeBytes":239},{"name":"+page.md","path":"packages/web/src/routes/docs/contributors/environment/+page.md","rawUrl":"https://raw.githubusercontent.com/Automattic/harper/HEAD/packages/web/src/routes/docs/contributors/environment/+page.md","title":"Environment Skill","category":"anthropic-skill","format":"markdown","content":"# Environment Skill\n\nPath: `packages/web/src/routes/docs/contributors/environment/+page.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Automattic/harper/HEAD/packages/web/src/routes/docs/contributors/environment/+page.md)","tokens":300,"sizeBytes":242},{"name":"+page.md","path":"packages/web/src/routes/docs/contributors/faq/+page.md","rawUrl":"https://raw.githubusercontent.com/Automattic/harper/HEAD/packages/web/src/routes/docs/contributors/faq/+page.md","title":"Faq Skill","category":"anthropic-skill","format":"markdown","content":"# Faq Skill\n\nPath: `packages/web/src/routes/docs/contributors/faq/+page.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Automattic/harper/HEAD/packages/web/src/routes/docs/contributors/faq/+page.md)","tokens":300,"sizeBytes":218},{"name":"+page.md","path":"packages/web/src/routes/docs/contributors/introduction/+page.md","rawUrl":"https://raw.githubusercontent.com/Automattic/harper/HEAD/packages/web/src/routes/docs/contributors/introduction/+page.md","title":"Introduction Skill","category":"anthropic-skill","format":"markdown","content":"# Introduction Skill\n\nPath: `packages/web/src/routes/docs/contributors/introduction/+page.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Automattic/harper/HEAD/packages/web/src/routes/docs/contributors/introduction/+page.md)","tokens":300,"sizeBytes":245},{"name":"+page.md","path":"packages/web/src/routes/docs/contributors/local-stats/+page.md","rawUrl":"https://raw.githubusercontent.com/Automattic/harper/HEAD/packages/web/src/routes/docs/contributors/local-stats/+page.md","title":"Local-stats Skill","category":"anthropic-skill","format":"markdown","content":"# Local-stats Skill\n\nPath: `packages/web/src/routes/docs/contributors/local-stats/+page.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Automattic/harper/HEAD/packages/web/src/routes/docs/contributors/local-stats/+page.md)","tokens":300,"sizeBytes":242},{"name":"+page.md","path":"packages/web/src/routes/docs/contributors/obsidian/+page.md","rawUrl":"https://raw.githubusercontent.com/Automattic/harper/HEAD/packages/web/src/routes/docs/contributors/obsidian/+page.md","title":"Obsidian Skill","category":"anthropic-skill","format":"markdown","content":"# Obsidian Skill\n\nPath: `packages/web/src/routes/docs/contributors/obsidian/+page.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Automattic/harper/HEAD/packages/web/src/routes/docs/contributors/obsidian/+page.md)","tokens":300,"sizeBytes":233},{"name":"+page.md","path":"packages/web/src/routes/docs/contributors/review/+page.md","rawUrl":"https://raw.githubusercontent.com/Automattic/harper/HEAD/packages/web/src/routes/docs/contributors/review/+page.md","title":"Review Skill","category":"anthropic-skill","format":"markdown","content":"# Review Skill\n\nPath: `packages/web/src/routes/docs/contributors/review/+page.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Automattic/harper/HEAD/packages/web/src/routes/docs/contributors/review/+page.md)","tokens":300,"sizeBytes":227},{"name":"+page.md","path":"packages/web/src/routes/docs/contributors/testing-strategy/+page.md","rawUrl":"https://raw.githubusercontent.com/Automattic/harper/HEAD/packages/web/src/routes/docs/contributors/testing-strategy/+page.md","title":"Testing-strategy Skill","category":"anthropic-skill","format":"markdown","content":"# Testing-strategy Skill\n\nPath: `packages/web/src/routes/docs/contributors/testing-strategy/+page.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Automattic/harper/HEAD/packages/web/src/routes/docs/contributors/testing-strategy/+page.md)","tokens":300,"sizeBytes":257},{"name":"+page.md","path":"packages/web/src/routes/docs/contributors/visual-studio-code/+page.md","rawUrl":"https://raw.githubusercontent.com/Automattic/harper/HEAD/packages/web/src/routes/docs/contributors/visual-studio-code/+page.md","title":"Visual-studio-code Skill","category":"anthropic-skill","format":"markdown","content":"# Visual-studio-code Skill\n\nPath: `packages/web/src/routes/docs/contributors/visual-studio-code/+page.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Automattic/harper/HEAD/packages/web/src/routes/docs/contributors/visual-studio-code/+page.md)","tokens":300,"sizeBytes":263},{"name":"+page.md","path":"packages/web/src/routes/docs/contributors/website/+page.md","rawUrl":"https://raw.githubusercontent.com/Automattic/harper/HEAD/packages/web/src/routes/docs/contributors/website/+page.md","title":"Website Skill","category":"anthropic-skill","format":"markdown","content":"# Website Skill\n\nPath: `packages/web/src/routes/docs/contributors/website/+page.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Automattic/harper/HEAD/packages/web/src/routes/docs/contributors/website/+page.md)","tokens":300,"sizeBytes":230},{"name":"+page.md","path":"packages/web/src/routes/docs/contributors/wordpress/+page.md","rawUrl":"https://raw.githubusercontent.com/Automattic/harper/HEAD/packages/web/src/routes/docs/contributors/wordpress/+page.md","title":"Wordpress Skill","category":"anthropic-skill","format":"markdown","content":"# Wordpress Skill\n\nPath: `packages/web/src/routes/docs/contributors/wordpress/+page.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Automattic/harper/HEAD/packages/web/src/routes/docs/contributors/wordpress/+page.md)","tokens":300,"sizeBytes":236},{"name":"+page.md","path":"packages/web/src/routes/docs/harperjs/CDN/+page.md","rawUrl":"https://raw.githubusercontent.com/Automattic/harper/HEAD/packages/web/src/routes/docs/harperjs/CDN/+page.md","title":"CDN Skill","category":"anthropic-skill","format":"markdown","content":"# CDN Skill\n\nPath: `packages/web/src/routes/docs/harperjs/CDN/+page.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Automattic/harper/HEAD/packages/web/src/routes/docs/harperjs/CDN/+page.md)","tokens":300,"sizeBytes":210},{"name":"+page.md","path":"packages/web/src/routes/docs/harperjs/configurerules/+page.md","rawUrl":"https://raw.githubusercontent.com/Automattic/harper/HEAD/packages/web/src/routes/docs/harperjs/configurerules/+page.md","title":"Configurerules Skill","category":"anthropic-skill","format":"markdown","content":"# Configurerules Skill\n\nPath: `packages/web/src/routes/docs/harperjs/configurerules/+page.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Automattic/harper/HEAD/packages/web/src/routes/docs/harperjs/configurerules/+page.md)","tokens":300,"sizeBytes":243},{"name":"+page.md","path":"packages/web/src/routes/docs/harperjs/introduction/+page.md","rawUrl":"https://raw.githubusercontent.com/Automattic/harper/HEAD/packages/web/src/routes/docs/harperjs/introduction/+page.md","title":"Introduction Skill","category":"anthropic-skill","format":"markdown","content":"# Introduction Skill\n\nPath: `packages/web/src/routes/docs/harperjs/introduction/+page.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Automattic/harper/HEAD/packages/web/src/routes/docs/harperjs/introduction/+page.md)","tokens":300,"sizeBytes":237},{"name":"+page.md","path":"packages/web/src/routes/docs/harperjs/linting/+page.md","rawUrl":"https://raw.githubusercontent.com/Automattic/harper/HEAD/packages/web/src/routes/docs/harperjs/linting/+page.md","title":"Linting Skill","category":"anthropic-skill","format":"markdown","content":"# Linting Skill\n\nPath: `packages/web/src/routes/docs/harperjs/linting/+page.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Automattic/harper/HEAD/packages/web/src/routes/docs/harperjs/linting/+page.md)","tokens":300,"sizeBytes":222},{"name":"+page.md","path":"packages/web/src/routes/docs/harperjs/node/+page.md","rawUrl":"https://raw.githubusercontent.com/Automattic/harper/HEAD/packages/web/src/routes/docs/harperjs/node/+page.md","title":"Node Skill","category":"anthropic-skill","format":"markdown","content":"# Node Skill\n\nPath: `packages/web/src/routes/docs/harperjs/node/+page.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Automattic/harper/HEAD/packages/web/src/routes/docs/harperjs/node/+page.md)","tokens":300,"sizeBytes":213},{"name":"+page.md","path":"packages/web/src/routes/docs/harperjs/spans/+page.md","rawUrl":"https://raw.githubusercontent.com/Automattic/harper/HEAD/packages/web/src/routes/docs/harperjs/spans/+page.md","title":"Spans Skill","category":"anthropic-skill","format":"markdown","content":"# Spans Skill\n\nPath: `packages/web/src/routes/docs/harperjs/spans/+page.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Automattic/harper/HEAD/packages/web/src/routes/docs/harperjs/spans/+page.md)","tokens":300,"sizeBytes":216},{"name":"+page.md","path":"packages/web/src/routes/docs/integrations/chrome-extension/+page.md","rawUrl":"https://raw.githubusercontent.com/Automattic/harper/HEAD/packages/web/src/routes/docs/integrations/chrome-extension/+page.md","title":"Chrome-extension Skill","category":"anthropic-skill","format":"markdown","content":"# Chrome-extension Skill\n\nPath: `packages/web/src/routes/docs/integrations/chrome-extension/+page.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Automattic/harper/HEAD/packages/web/src/routes/docs/integrations/chrome-extension/+page.md)","tokens":300,"sizeBytes":257},{"name":"+page.md","path":"packages/web/src/routes/docs/integrations/emacs/+page.md","rawUrl":"https://raw.githubusercontent.com/Automattic/harper/HEAD/packages/web/src/routes/docs/integrations/emacs/+page.md","title":"Emacs Skill","category":"anthropic-skill","format":"markdown","content":"# Emacs Skill\n\nPath: `packages/web/src/routes/docs/integrations/emacs/+page.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Automattic/harper/HEAD/packages/web/src/routes/docs/integrations/emacs/+page.md)","tokens":300,"sizeBytes":224},{"name":"+page.md","path":"packages/web/src/routes/docs/integrations/firefox-extension/+page.md","rawUrl":"https://raw.githubusercontent.com/Automattic/harper/HEAD/packages/web/src/routes/docs/integrations/firefox-extension/+page.md","title":"Firefox-extension Skill","category":"anthropic-skill","format":"markdown","content":"# Firefox-extension Skill\n\nPath: `packages/web/src/routes/docs/integrations/firefox-extension/+page.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Automattic/harper/HEAD/packages/web/src/routes/docs/integrations/firefox-extension/+page.md)","tokens":300,"sizeBytes":260},{"name":"+page.md","path":"packages/web/src/routes/docs/integrations/helix/+page.md","rawUrl":"https://raw.githubusercontent.com/Automattic/harper/HEAD/packages/web/src/routes/docs/integrations/helix/+page.md","title":"Helix Skill","category":"anthropic-skill","format":"markdown","content":"# Helix Skill\n\nPath: `packages/web/src/routes/docs/integrations/helix/+page.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Automattic/harper/HEAD/packages/web/src/routes/docs/integrations/helix/+page.md)","tokens":300,"sizeBytes":224},{"name":"+page.md","path":"packages/web/src/routes/docs/integrations/language-server/+page.md","rawUrl":"https://raw.githubusercontent.com/Automattic/harper/HEAD/packages/web/src/routes/docs/integrations/language-server/+page.md","title":"Language-server Skill","category":"anthropic-skill","format":"markdown","content":"# Language-server Skill\n\nPath: `packages/web/src/routes/docs/integrations/language-server/+page.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Automattic/harper/HEAD/packages/web/src/routes/docs/integrations/language-server/+page.md)","tokens":300,"sizeBytes":254},{"name":"+page.md","path":"packages/web/src/routes/docs/integrations/neovim/+page.md","rawUrl":"https://raw.githubusercontent.com/Automattic/harper/HEAD/packages/web/src/routes/docs/integrations/neovim/+page.md","title":"Neovim Skill","category":"anthropic-skill","format":"markdown","content":"# Neovim Skill\n\nPath: `packages/web/src/routes/docs/integrations/neovim/+page.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Automattic/harper/HEAD/packages/web/src/routes/docs/integrations/neovim/+page.md)","tokens":300,"sizeBytes":227},{"name":"+page.md","path":"packages/web/src/routes/docs/integrations/obsidian/+page.md","rawUrl":"https://raw.githubusercontent.com/Automattic/harper/HEAD/packages/web/src/routes/docs/integrations/obsidian/+page.md","title":"Obsidian Skill","category":"anthropic-skill","format":"markdown","content":"# Obsidian Skill\n\nPath: `packages/web/src/routes/docs/integrations/obsidian/+page.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Automattic/harper/HEAD/packages/web/src/routes/docs/integrations/obsidian/+page.md)","tokens":300,"sizeBytes":233},{"name":"+page.md","path":"packages/web/src/routes/docs/integrations/sublime-text/+page.md","rawUrl":"https://raw.githubusercontent.com/Automattic/harper/HEAD/packages/web/src/routes/docs/integrations/sublime-text/+page.md","title":"Sublime-text Skill","category":"anthropic-skill","format":"markdown","content":"# Sublime-text Skill\n\nPath: `packages/web/src/routes/docs/integrations/sublime-text/+page.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Automattic/harper/HEAD/packages/web/src/routes/docs/integrations/sublime-text/+page.md)","tokens":300,"sizeBytes":245},{"name":"+page.md","path":"packages/web/src/routes/docs/integrations/visual-studio-code/+page.md","rawUrl":"https://raw.githubusercontent.com/Automattic/harper/HEAD/packages/web/src/routes/docs/integrations/visual-studio-code/+page.md","title":"Visual-studio-code Skill","category":"anthropic-skill","format":"markdown","content":"# Visual-studio-code Skill\n\nPath: `packages/web/src/routes/docs/integrations/visual-studio-code/+page.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Automattic/harper/HEAD/packages/web/src/routes/docs/integrations/visual-studio-code/+page.md)","tokens":300,"sizeBytes":263},{"name":"+page.md","path":"packages/web/src/routes/docs/integrations/wordpress/+page.md","rawUrl":"https://raw.githubusercontent.com/Automattic/harper/HEAD/packages/web/src/routes/docs/integrations/wordpress/+page.md","title":"Wordpress Skill","category":"anthropic-skill","format":"markdown","content":"# Wordpress Skill\n\nPath: `packages/web/src/routes/docs/integrations/wordpress/+page.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Automattic/harper/HEAD/packages/web/src/routes/docs/integrations/wordpress/+page.md)","tokens":300,"sizeBytes":236},{"name":"+page.md","path":"packages/web/src/routes/docs/integrations/zed/+page.md","rawUrl":"https://raw.githubusercontent.com/Automattic/harper/HEAD/packages/web/src/routes/docs/integrations/zed/+page.md","title":"Zed Skill","category":"anthropic-skill","format":"markdown","content":"# Zed Skill\n\nPath: `packages/web/src/routes/docs/integrations/zed/+page.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Automattic/harper/HEAD/packages/web/src/routes/docs/integrations/zed/+page.md)","tokens":300,"sizeBytes":218},{"name":"+page.md","path":"packages/web/src/routes/docs/weir/+page.md","rawUrl":"https://raw.githubusercontent.com/Automattic/harper/HEAD/packages/web/src/routes/docs/weir/+page.md","title":"Weir Skill","category":"anthropic-skill","format":"markdown","content":"# Weir Skill\n\nPath: `packages/web/src/routes/docs/weir/+page.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Automattic/harper/HEAD/packages/web/src/routes/docs/weir/+page.md)","tokens":300,"sizeBytes":195},{"name":"tsconfig.json","path":"packages/web/tsconfig.json","rawUrl":"https://raw.githubusercontent.com/Automattic/harper/HEAD/packages/web/tsconfig.json","title":"Web Skill","category":"anthropic-skill","format":"json","content":"{\n\t\"extends\": \"./.svelte-kit/tsconfig.json\",\n\t\"compilerOptions\": {\n\t\t\"allowJs\": true,\n\t\t\"checkJs\": true,\n\t\t\"esModuleInterop\": true,\n\t\t\"forceConsistentCasingInFileNames\": true,\n\t\t\"resolveJsonModule\": true,\n\t\t\"skipLibCheck\": true,\n\t\t\"sourceMap\": true,\n\t\t\"strict\": true\n\t}\n\t// Path aliases are handled by https://kit.svelte.dev/docs/configuration#alias\n\t//\n\t// If you want to overwrite includes/excludes, make sure to copy over the relevant includes/excludes\n\t// from the referenced tsconfig.json - TypeScript does not merge them in\n}\n","isInternal":false,"tokens":152,"sizeBytes":532},{"name":"package.json","path":"packages/wordpress-plugin/package.json","rawUrl":"https://raw.githubusercontent.com/Automattic/harper/HEAD/packages/wordpress-plugin/package.json","title":"wordpress-plugin","category":"anthropic-skill","format":"json","content":"{\n\t\"name\": \"wordpress-plugin\",\n\t\"private\": true,\n\t\"version\": \"0.0.1\",\n\t\"description\": \"The grammar checker that respects your privacy.\",\n\t\"main\": \"build/index.js\",\n\t\"scripts\": {\n\t\t\"build\": \"wp-scripts build --webpack-copy-php\",\n\t\t\"check\": \"tsc --noEmit\",\n\t\t\"packages-update\": \"wp-scripts packages-update\",\n\t\t\"plugin-zip\": \"zip harper.zip build harper.php screenshot.png -r\",\n\t\t\"start\": \"wp-scripts start --webpack-copy-php\"\n\t},\n\t\"devDependencies\": {\n\t\t\"@types/lodash-es\": \"^4.17.12\",\n\t\t\"@types/react\": \"^18.3.0\",\n\t\t\"@types/react-dom\": \"^18.3.0\",\n\t\t\"@types/wordpress__edit-post\": \"^8.4.2\",\n\t\t\"@wordpress/scripts\": \"^30.9.0\",\n\t\t\"@wp-now/wp-now\": \"^0.1.74\",\n\t\t\"typescript\": \"catalog:\"\n\t},\n\t\"dependencies\": {\n\t\t\"@wordpress/components\": \"^29.2.0\",\n\t\t\"@wordpress/data\": \"^10.15.1\",\n\t\t\"@wordpress/edit-post\": \"^8.16.0\",\n\t\t\"@wordpress/editor\": \"^14.20.0\",\n\t\t\"@wordpress/plugins\": \"^7.20.0\",\n\t\t\"@wordpress/preferences-persistence\": \"^2.17.0\",\n\t\t\"harper.js\": \"workspace:*\",\n\t\t\"lodash-es\": \"^4.17.21\",\n\t\t\"react\": \"^18.0.0\",\n\t\t\"react-dom\": \"^18.0.0\"\n\t}\n}\n","frontmatter":{"name":"wordpress-plugin","private":true,"version":"0.0.1","description":"The grammar checker that respects your privacy.","main":"build/index.js","scripts":{"build":"wp-scripts build --webpack-copy-php","check":"tsc --noEmit","packages-update":"wp-scripts packages-update","plugin-zip":"zip harper.zip build harper.php screenshot.png -r","start":"wp-scripts start --webpack-copy-php"},"devDependencies":{"@types/lodash-es":"^4.17.12","@types/react":"^18.3.0","@types/react-dom":"^18.3.0","@types/wordpress__edit-post":"^8.4.2","@wordpress/scripts":"^30.9.0","@wp-now/wp-now":"^0.1.74","typescript":"catalog:"},"dependencies":{"@wordpress/components":"^29.2.0","@wordpress/data":"^10.15.1","@wordpress/edit-post":"^8.16.0","@wordpress/editor":"^14.20.0","@wordpress/plugins":"^7.20.0","@wordpress/preferences-persistence":"^2.17.0","harper.js":"workspace:*","lodash-es":"^4.17.21","react":"^18.0.0","react-dom":"^18.0.0"}},"isInternal":false,"tokens":368,"sizeBytes":1043},{"name":"block.json","path":"packages/wordpress-plugin/src/harper/block.json","rawUrl":"https://raw.githubusercontent.com/Automattic/harper/HEAD/packages/wordpress-plugin/src/harper/block.json","title":"Harper Skill","category":"anthropic-skill","format":"json","content":"# Harper Skill\n\nPath: `packages/wordpress-plugin/src/harper/block.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Automattic/harper/HEAD/packages/wordpress-plugin/src/harper/block.json)","tokens":300,"sizeBytes":207},{"name":"README.md","path":"packages/harper.js/examples/commonjs-simple/README.md","rawUrl":"https://raw.githubusercontent.com/Automattic/harper/HEAD/packages/harper.js/examples/commonjs-simple/README.md","title":"commonjs-simple Documentation","category":"plugin-manifest","format":"markdown","content":"# commonjs-simple Documentation\n\nPath: `packages/harper.js/examples/commonjs-simple/README.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Automattic/harper/HEAD/packages/harper.js/examples/commonjs-simple/README.md)","tokens":300,"sizeBytes":236},{"name":"README.md","path":"packages/harper.js/examples/raw-web/README.md","rawUrl":"https://raw.githubusercontent.com/Automattic/harper/HEAD/packages/harper.js/examples/raw-web/README.md","title":"raw-web Documentation","category":"plugin-manifest","format":"markdown","content":"# raw-web Documentation\n\nPath: `packages/harper.js/examples/raw-web/README.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Automattic/harper/HEAD/packages/harper.js/examples/raw-web/README.md)","tokens":300,"sizeBytes":212},{"name":"README.md","path":"packages/harper.js/README.md","rawUrl":"https://raw.githubusercontent.com/Automattic/harper/HEAD/packages/harper.js/README.md","title":"harper.js Documentation","category":"plugin-manifest","format":"markdown","content":"# harper.js Documentation\n\nPath: `packages/harper.js/README.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Automattic/harper/HEAD/packages/harper.js/README.md)","tokens":300,"sizeBytes":180},{"name":"README.md","path":"packages/lint-framework/README.md","rawUrl":"https://raw.githubusercontent.com/Automattic/harper/HEAD/packages/lint-framework/README.md","title":"lint-framework Documentation","category":"plugin-manifest","format":"markdown","content":"# lint-framework Documentation\n\nPath: `packages/lint-framework/README.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Automattic/harper/HEAD/packages/lint-framework/README.md)","tokens":300,"sizeBytes":195},{"name":"README.md","path":"packages/obsidian-plugin/README.md","rawUrl":"https://raw.githubusercontent.com/Automattic/harper/HEAD/packages/obsidian-plugin/README.md","title":"obsidian-plugin Documentation","category":"plugin-manifest","format":"markdown","content":"# obsidian-plugin Documentation\n\nPath: `packages/obsidian-plugin/README.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Automattic/harper/HEAD/packages/obsidian-plugin/README.md)","tokens":300,"sizeBytes":198},{"name":"README.md","path":"packages/vscode-plugin/README.md","rawUrl":"https://raw.githubusercontent.com/Automattic/harper/HEAD/packages/vscode-plugin/README.md","title":"vscode-plugin Documentation","category":"plugin-manifest","format":"markdown","content":"# Harper for VS Code\n\nHarper is the next-generation grammar checker for your code. You can think of it as an alternative to Grammarly. It catches common stylistic errors, as well as complex grammatical or layout-related problems. It works for almost [all common programming languages](https://writewithharper.com/docs/integrations/language-server#Supported-Languages) and a number of markup formats.\n\nIf you use Rust, Java, JavaScript, or any number of other programming languages, your comments may end up as part of your API's documentation. If that's the case, grammatical mistakes in your code could be down-ranking your site on search results and tarnishing your reputation for quality.\n\nMost importantly, Harper runs on-device and uses barely any memory at all. That means you can get feedback on your work in milliseconds, dramatically increasing your iteration speed.\n\nYou can learn more about [this extension](https://writewithharper.com/docs/integrations/visual-studio-code) and [Harper](https://writewithharper.com/docs/about) over at our [official website](https://writewithharper.com).\n","isInternal":false,"tokens":235,"sizeBytes":1099},{"name":"README.md","path":"packages/web/README.md","rawUrl":"https://raw.githubusercontent.com/Automattic/harper/HEAD/packages/web/README.md","title":"web Documentation","category":"plugin-manifest","format":"markdown","content":"# Web\n\nThis directory contains the source code for [https://writewithharper.com].\n\n## Building\n\nIn order to build the site, you must first compile `harper-wasm` with:\n\n```bash\nwasm-pack build --target bundler\n```\n","isInternal":false,"tokens":56,"sizeBytes":213},{"name":"README.md","path":"packages/wordpress-plugin/README.md","rawUrl":"https://raw.githubusercontent.com/Automattic/harper/HEAD/packages/wordpress-plugin/README.md","title":"wordpress-plugin Documentation","category":"plugin-manifest","format":"markdown","content":"# Harper for WordPress\n\n![The early prototype version of the plugin](./screenshot.png)\n\nThis repository contains the WordPress plugin for [Harper](https://writewithharper.com).\nIt is a work-in-progress. Here be dragons!\n\n## Contributing\n\nRefer to [the online documentation](https://writewithharper.com/docs/contributors/wordpress) for instructions to contribute to the plugin.\n","isInternal":false,"tokens":84,"sizeBytes":377}],"systemPromptSnippet":"<yakaai_skills repo=\"Automattic/harper\">\n<!-- File: AGENTS.md (Tokens: ~4902 | Category: root-instruction) -->\n# Harper Docs Map for Agents\n\nThis repository’s documentation site is powered by Vite + SvelteKit + SveltePress.\n\nUse `packages/web/vite.config.ts` as the source of truth for documentation scope:\n- Sidebar and important doc routes are defined in `packages/web/vite.config.ts`.\n- Route `/docs/...` maps to `packages/web/src/routes/docs/...`.\n- Most docs are in `+page.md`; some are `+page.svelte` or route helpers.\n\nIf you are working on the Harper repository itself, please pay special attention to the `contributors/*` pages.\nImportantly, all the tools available in this repository are available via `just`. To learn more, run `just --list`.\nWhenever agents are done making changes, they should run `just format` before handing work back to the user.\nIf `just format` fails, you can use `just setup` to prepare the relevant dependencies.\n\nHuman coders should periodically review this file and manually migrate stable, human-facing guidance into the real documentation website under `packages/web` so it is available outside agent workflows.\nAgents should remind humans of this when possible.\n\n## Read First\n\n1. `packages/web/vite.config.ts`: Sidebar source of truth and canonical map of important docs routes.\n2. `packages/web/src/routes/docs/about/+page.md`: High-level product overview, privacy model, versioning policy, and ecosystem context.\n3. `packages/web/src/routes/docs/weir/+page.md`: Weir rule language reference with syntax, expression types, and examples.\n4. `packages/web/src/routes/docs/rules/+page.svelte`: Live/generated rule catalog (rule names, defaults, and descriptions).\n5. `packages/web/src/routes/docs/contributors/introduction/+page.md`: Entry point for contributors and links to deeper contributor docs.\n6. `./AGENT_POLICY.md`: Harper's policy on code generated by large language models. Agents MUST read this before making ANY changes.\n\n## Core Documentation Directories\n\n- `packages/web/src/routes/docs/about`\n- `packages/web/src/routes/docs/weir`\n- `packages/web/src/routes/docs/rules`\n- `packages/web/src/routes/docs/integrations`\n- `packages/web/src/routes/docs/harperjs`\n- `packages/web/src/routes/docs/contributors`\n\n## Route Prefix to File Prefix\n\n- `/docs/about` -> `packages/web/src/routes/docs/about/+page.md`\n- `/docs/weir` -> `packages/web/src/routes/docs/weir/+page.md`\n- `/docs/rules` -> `packages/web/src/routes/docs/rules/+page.svelte`\n- `/docs/integrations/*` -> `packages/web/src/routes/docs/integrations/*/+page.md`\n- `/docs/harperjs/*` -> `packages/web/src/routes/docs/harperjs/*/+page.md`\n- `/docs/contributors/*` -> `packages/web/src/routes/docs/contributors/*/+page.md`\n\n## Files Listed in the Sidebar (Local)\n\n- `packages/web/src/routes/docs/about/+page.md`: High-level product overview, privacy model, versioning policy, and ecosystem context.\n- `packages/web/src/routes/docs/weir/+page.md`: Weir rule language reference with syntax, expression types, and examples. Very important if you're asked to write a Weir rule.\n- `packages/web/src/routes/docs/rules/+page.svelte`: Live/generated rule catalog (rule names, defaults, and descriptions).\n- `packages/web/src/routes/docs/integrations/obsidian/+page.md`: Obsidian plugin overview, privacy/value comparison, installation, and support links.\n- `packages/web/src/routes/docs/integrations/chrome-extension/+page.md`: End-user Chrome extension overview and install link.\n- `packages/web/src/routes/docs/integrations/firefox-extension/+page.md`: End-user Firefox extension overview and install link.\n- `packages/web/src/routes/docs/integrations/wordpress/+page.md`: Current WordPress guidance, including migration recommendation to Chrome extension and legacy plugin status.\n- `packages/web/src/routes/docs/integrations/language-server/+page.md`: `harper-ls` install methods, dictionaries, code actions, ignore comments, and full configuration reference.\n- `packages/web/src/routes/docs/integrations/visual-studio-code/+page.md`: VS Code extension install, command list, and settings reference.\n- `packages/web/src/routes/docs/integrations/neovim/+page.md`: Neovim setup using `harper-ls`, plus optional and common config tweaks.\n- `packages/web/src/routes/docs/integrations/helix/+page.md`: Helix setup using `harper-ls`, plus optional and common config tweaks.\n- `packages/web/src/routes/docs/integrations/emacs/+page.md`: Emacs setup using `harper-ls`, plus optional and common config tweaks.\n- `packages/web/src/routes/docs/integrations/zed/+page.md`: Zed extension entry point and link to canonical extension README.\n- `packages/web/src/routes/docs/integrations/sublime-text/+page.md`: Sublime Text setup with `harper-ls` and LSP package configuration.\n- `packages/web/src/routes/docs/harperjs/introduction/+page.md`: `harper.js` mission, package overview, and installation starting point.\n- `packages/web/src/routes/docs/harperjs/linting/+page.md`: Core `harper.js` lint workflow and linter usage patterns.\n- `packages/web/src/routes/docs/harperjs/spans/+page.md`: Explains span objects and how to use them to locate/handle lint ranges.\n- `packages/web/src/routes/docs/harperjs/configurerules/+page.md`: How to programmatically read and set `LintConfig` to enable/disable rules.\n- `packages/web/src/routes/docs/harperjs/node/+page.md`: Node.js-specific usage notes, especially `LocalLinter` vs `WorkerLinter`.\n- `packages/web/src/routes/docs/harperjs/CDN/+page.md`: Browser/CDN usage via unpkg and ESM import patterns.\n- `packages/web/src/routes/docs/contributors/introduction/+page.md`: Contributor onboarding overview and links to architecture/testing/rule-authoring docs.\n- `packages/web/src/routes/docs/contributors/environment/+page.md`: Local development environment setup across Rust, Node/pnpm, and optional Nix shell.\n- `packages/web/src/routes/docs/contributors/committing/+page.md`: Commit message conventions and commit hygiene requirements.\n- `packages/web/src/routes/docs/contributors/architecture/+page.md`: System architecture and roles of core components like `harper-core`, `harper-ls`, and `harper.js`.\n- `packages/web/src/routes/docs/contributors/dictionary/+page.md`: Process for adding or updating curated dictionary entries.\n- `packages/web/src/routes/docs/contributors/testing-strategy/+page.md`: Harper's risk-driven testing strategy, covering automated checks, production feedback, manual testing, and testability.\n- `packages/web/src/routes/docs/contributors/author-a-rule/+page.md`: Step-by-step workflow for implementing and testing new grammar rules.\n- `packages/web/src/routes/docs/contributors/visual-studio-code/+page.md`: How to run, debug, test, and package the VS Code extension locally.\n- `packages/web/src/routes/docs/contributors/chrome-extension/+page.md`: Internal architecture and local development notes for the browser extensions.\n- `packages/web/src/routes/docs/contributors/desktop/+page.md`: Placeholder for Harper Desktop contributor documentation.\n- `packages/web/src/routes/docs/contributors/website/+page.md`: Local development, preview, and validation for writewithharper.com (SvelteKit/SveltePress).\n- `packages/web/src/routes/docs/contributors/wordpress/+page.md`: How to build and run the WordPress plugin locally.\n- `packages/web/src/routes/docs/contributors/obsidian/+page.md`: Obsidian-plugin contributor workflow and plugin-specific constraints.\n- `packages/web/src/routes/docs/contributors/review/+page.md`: PR reviewer playbook, including ways to fetch artifacts and test patches locally.\n- `packages/web/src/routes/docs/contributors/local-stats/+page.md`: Local stats logging model, `stats.txt` format, locations, and privacy behavior.\n- `packages/web/src/routes/docs/contributors/brill/+page.md`: Brief explanation of Harper’s Brill-tagging approach and further reading link.\n- `packages/web/src/routes/docs/contributors/faq/+page.md`: Contributor FAQ for conceptual distinctions (for example `Linter` vs `PatternLinter`).\n\n## Documentation Route Helpers (Non-`+page.md`)\n\n- `packages/web/src/routes/docs/about/+page.ts`: Route behavior helper (`ssr = false`) for the About page.\n- `packages/web/src/routes/docs/harperjs/CDN/example/+server.ts`: Serves the HTML example used by the `harper.js` CDN documentation page.\n\n## External Sidebar Targets (No Local Source File)\n\n- `https://docs.rs/harper-core/latest/harper_core/`\n- `/docs/harperjs/ref/index.html` (generated API reference target)\n\n## Projects Contained in This Repository\n\n- `harper-core`: The core grammar checking engine. This is a dependency to pretty much everything related to Harper.\n- `harper-ls`: A Language Server compatible with a number of text editors, including Neovim, Zed, and Helix. See above linked documentation for more details.\n- `harper-cli`: A command-line binary for debugging Harper's core engine and markup language support.\n- `harper-comments`: Provides parsers for a number of programming languages to support linting their comments.\n- `harper-wasm`: The WebAssembly build target that powers browser and JavaScript integrations such as `harper.js`.\n- `packages/lint-framework`: A package containing the tooling necessary to read/write/highlight text on the web for the purpose of linting.\n- `packages/components`: Shared Svelte component package used by web-facing packages.\n- `packages/harper-editor`: Shared Svelte editor package used by web-facing packages and Harper Desktop.\n- `packages/web`: The Harper website, including documentation and a live demo that uses the `lint-framework`.\n- `packages/harper.js`: The JavaScript package that uses `harper-wasm` to lint text from websites or Node.js processes.\n- `packages/chrome-plugin`: The Harper Chrome Extension - uses the `lint-framework`. Also support Firefox.\n- `packages/obsidian-plugin`\n- `packages/wordpress-plugin`\n- `packages/vscode-plugin`: The Harper Visual Studio Code plugin. Uses `harper-ls`.\n- `harper-desktop`: The Harper Desktop app. It is a Tauri v2 + SvelteKit SPA with an offline editor, settings UI, tray/service control, and native overlay highlighter.\n\nThere are of course projects in this repository not listed above. If relevant, feel free to poke around.\n\n## Harper Desktop\n\nRead the [Desktop contributor documentation](packages/web/src/routes/docs/contributors/desktop/+page.md) for the app's architecture and its relationship to the Cargo workspace.\n\n### Commands\n\n- Use `pnpm` for frontend packages; `harper-desktop/package.json` pins `pnpm@10.10.0`.\n- Dev app: `just dev-desktop` from repo root. It builds shared web packages, runs `cargo tauri dev`, and Tauri then runs `pnpm dev` on port `1420`.\n- Start the highlighter process directly: `just dev-desktop-highlighter` from repo root.\n- Frontend checks: `pnpm check` from `harper-desktop`.\n- Frontend build only: `pnpm build` from `harper-desktop`.\n- Full desktop checks: `just check-desktop` from repo root.\n- Bundle builds match CI: `just build-desktop-linux` or `just build-desktop-macos`.\n- `just build-desktop-linux` builds deb/rpm/appimage bundles.\n- `just build-desktop-macos` builds app/dmg bundles.\n\n### Architecture\n\n- It is a SvelteKit SPA inside Tauri v2.\n- SSR is disabled in `harper-desktop/src/routes/+layout.ts`.\n- `harper-desktop/svelte.config.js` uses `adapter-static` with `fallback: \"index.html\"`.\n- Main Rust entrypoint is `harper-desktop/src-tauri/src/main.rs`, which calls `harper_desktop_lib::run()`.\n- CLI behavior is in `harper-desktop/src-tauri/src/lib.rs`: no subcommand runs the normal Tauri app; `highlighter` runs the native overlay highlighter.\n- Tauri config lives in `harper-desktop/src-tauri/tauri.conf.json`.\n- Tauri capabilities live in `harper-desktop/src-tauri/capabilities/default.json`.\n- The main Svelte route is `harper-desktop/src/routes/+page.svelte`; it switches between the settings UI and editor UI.\n- The editor UI lives in `harper-desktop/src/lib/EditorView.svelte` and uses workspace dependencies on `harper.js` and `harper-editor`.\n- The settings UI lives under `harper-desktop/src/lib/settings/`.\n- Rust uses local workspace dependencies from `harper-desktop/src-tauri/Cargo.toml`, including `harper-core` and `harper-dictionary-wordlist`.\n- The Tauri app starts a tray/menu-bar controlled highlighter service on launch and can open editor/settings windows from the tray.\n- Editor and settings windows hide on close instead of exiting; quit is handled through the tray menu.\n\n### Highlighter Architecture\n\n- The highlighter is Rust/egui/winit code under `harper-desktop/src-tauri/src/highlighter/`.\n- `Highlighter` is the public entry point for the overlay system.\n- `Window` owns native window/GPU plumbing.\n- `WindowManager` owns the winit event loop, monitor windows, cursor hit-testing, and popup selection.\n- `RenderState` owns highlight rendering, popup drawing, markdown rendering cache, and popup action dispatch.\n- `RenderState` uses `ActionableLint` values from `harper-desktop/src-tauri/src/rect.rs`.\n- `ActionableLint` stores lint geometry, the Harper `Lint`, and source text needed for suggestion application and popup actions.\n- Suggestion popup actions currently include close, apply suggestion, ignore lint, add to dictionary, disable rule, and refresh config.\n- Popup hover text is implemented in `RenderState` button helpers.\n- The highlighter read interval is set in `run_highlighter()` with `with_read_interval(Duration::from_millis(16))`.\n\n### OS Integration\n\n- OS integration is behind `harper-desktop/src-tauri/src/os_broker.rs`.\n- macOS uses `harper-desktop/src-tauri/src/mac_broker.rs`.\n- non-macOS currently uses `NoopBroker`.\n- macOS highlighter focus handling depends on `MacBroker.last_focused`; clicking the overlay can make the highlighter process focused, so accessibility reads fall back to the last non-highlighter PID.\n- macOS integrations are bundle-ID based and controlled by persisted `Integration` entries.\n- Highlighter stdout is reserved for JSON-line IPC. Diagnostics in highlighter paths should use `eprintln!`, not `println!`.\n\n### IPC And App State\n\n- Tauri app state lives in `harper-desktop/src-tauri/src/config.rs`.\n- `Config` currently stores `mutable_dictionary: MutableDictionary`, `dialect: Dialect`, `ignored_lints: IgnoredLints`, `lint_config: FlatConfig`, and `integrations: Vec<Integration>`.\n- `Config::new()` uses `MutableDictionary::new()`, `Dialect::American`, `IgnoredLints::new()`, `FlatConfig::new_curated()`, and curated default integrations.\n- Config is persisted under the system config directory in a `harper-desktop` folder. Main settings are serialized to `config.json`; the mutable dictionary is stored separately as `dictionary.txt`.\n- `Config::load_from_system()` loads the serialized config and then hydrates the mutable dictionary with the selected dialect.\n- The Tauri app owns shared config as `Arc<Mutex<Config>>`.\n- `run_tauri()` loads persisted config, creates `HighlighterService`, starts the highlighter service, and creates the tray/menu-bar UI.\n- The highlighter process is spawned through `harper-desktop/src-tauri/src/highlighter_process.rs`.\n- IPC is implemented under `harper-desktop/src-tauri/src/communication/`.\n- IPC uses newline-delimited JSON over child stdin/stdout.\n- The Tauri app is the protocol server.\n- The highlighter process is the protocol client.\n- Protocol messages live in `harper-desktop/src-tauri/src/communication/message.rs`.\n- Supported requests include `GetLintConfig`, `GetDictionary`, `GetDialect`, `GetIgnoredLints`, `GetIntegrations`, `SetLintConfig`, `IgnoreLint`, `AddToDictionary`, `AddIntegration`, `RemoveIntegration`, and `SetIntegrationEnabled`.\n- Supported responses include `GetLintConfig`, `GetDictionary`, `GetDialect`, `GetIgnoredLints`, `GetIntegrations`, and `Ack`.\n- `IgnoredLints` is transferred as whole serialized state and merged server-side.\n- `AddToDictionary` sends only the word; Rust appends it with `DictWordMetadata::default()`.\n- The highlighter uses a Tokio current-thread runtime to call async IPC client methods from synchronous UI callbacks.\n- That runtime is bridge plumbing only; it is not used for linting or UI rendering.\n\n### Dictionary And Linting Gotchas\n\n- Keep dictionary construction centralized through `Config::dictionary_from_user_dictionary(user_dictionary: MutableDictionary) -> Arc<MergedDictionary>` and `Config::create_dictionary()`.\n- Keep linter construction centralized through `Config::create_linter()`.\n- The same merged dictionary source must be used for both `Document::new_markdown_default(text, &dictionary)` and `LintGroup::new_curated(dictionary, dialect)`.\n- Do not use `Document::new_markdown_default_curated(text)` in the main highlighter lint callback when user dictionary words should suppress spelling lints.\n- Harper spelling lint behavior depends on document token metadata, so a linter with the updated dictionary is not enough if the `Document` was built with the curated dictionary only.\n- `RenderState` may still use curated document construction for localized source extraction where dictionary membership does not matter.\n\n### Frontend Integration\n\n- Tauri commands in `harper-desktop/src-tauri/src/lib.rs` include `get_lint_config`, `get_dialect`, `set_dialect`, `set_lint_config`, `get_dictionary`, `set_dictionary`, `ignore_lint`, `add_to_dictionary`, `get_integrations`, `add_integration`, `remove_integration`, and `set_integration_enabled`.\n- JS helper lives in `harper-desktop/src/lib/client.ts`.\n- JS helper class is named `Client` and exposes static methods for lint config, dialect, dictionary, ignored lints, dictionary additions, and integrations.\n- `Client.ignoreLint(...)` uses Harper JS ignored-lints export data and invokes the Rust command.\n- `Client.addToDictionary(word)` sends only the word to Rust.\n- Vite's dev server must stay on port `1420`; `harper-desktop/vite.config.js` uses `strictPort: true` because Tauri expects that port.\n- Vite intentionally ignores `src-tauri/**` during frontend file watching.\n\n### Repo-Specific Gotchas\n\n- CI installs `wasm-pack`, `tauri-cli`, and `cargo-hack` with `cargo binstall`, then runs the relevant root `just` task.\n- Avoid mixing behavior fixes with structural refactors in the highlighter; popup/UI, IPC, dictionary behavior, config persistence, settings UI, and OS-coordinate fixes are easier to review separately.\n\n### Known Review Findings\n\n- Secondary-monitor highlighter coordinates may be wrong. Accessibility rectangles appear to be global screen coordinates, while each overlay window's egui origin is local to that monitor/window. Translate by monitor/window origin or render through one virtual-desktop-sized overlay.\n- macOS text range lookup may be wrong after emoji or other non-BMP characters. Harper spans are char-based, while macOS accessibility ranges are NSString/UTF-16 based. Convert spans before calling `AXBoundsForRangeParameterizedAttribute`.\n\n## On Writing New Rules\n\nWhen asked to write a new rule, keep these guidelines in mind:\n\n- The user is almost always expecting you to write it to a file. Which file and where is up to you to find out.\n- You should include at least 15 total tests, covering a wide variety of cases. Cover false-positives, false negatives, true positives, and if relevant, true negatives.\n- You should run any and all tests to ensure that you do no break existing behavior and that your new rule runs the way you expect. At minimum, that means `just test-rust`. Make sure to check the snapshots for changes.\n- After adding a new rule, update `harper-core/default_config.json` so it is enabled in the curated default config.\n- Built-in Weir rules can be grouped by putting related `.weir` files in a directory under `harper-core/src/linting/weir_rules`; the directory name becomes the single public rule name.\n- If the rule is related to a closed compound noun, see if you can just add an entry to the existing closed compound linter.\n\nUnless you are specifically requested to write the rule in a specific way, choose the language (Rust or Weir) and methodology that fits the task.\n\nALWAYS run extensive bullet tests with `cargo run --bin harper-cli --release -- lint <TEXT>` to make sure the new rule isn't already covered by Harper.\n\n## Workflow for Writing Weir Rules\n\n1. Draft the core expression\n- Encode the match with `expr main` using words, sequences, alternatives, filters, exceptions, POS tags, wildcards, or punctuation.\n- Keep the expression minimal but precise; avoid overmatching.\n- If a wordlist is needed, include it as its own expression, used with an expression reference.\n\n2. Add rule metadata\n- `let message`, `let description`, `let kind`, `let becomes` (and `let strategy` if needed).\n- Use `strategy \"Exact\"` when casing must be normalized; otherwise default behavior or `MatchCase` as appropriate.\n\n3. Add tests (required)\n- Include at least 15 tests.\n- Tests must cover: true positives, false positives, false negatives, and (if relevant) true negatives.\n- Prefer a mix of casing, punctuation, whitespace, and nearby-token variations.\n\n4. Sanity-check edge cases\n- Ensure exceptions do not block valid matches.\n- Ensure replacements are correct and not destructive.\n\n5. Run the tests.\n- Fix any issues that arise.\n\n### Output Format\n\nWrite a Weir rule to a new file with a name of your choosing, including `expr main`, `let` fields, and tests. Make sure it has the extension `.weir`.\n\n## Tips\n\nBefore finishing your turn, run `just format` or `cargo fmt` if you have made any changes. This can help diffs if a human decides to make a commit.\n\nTry to write in a functional style. Minimize adding state whenever it is possible while also respecting the user's query. If additional state is necessary, please centralize it to increase visibility.\n\n<!-- File: ARCHITECTURE.md (Tokens: ~31 | Category: project-spec) -->\n# Harper's Architecture\n\nThis document has been moved to the [online documentation](https://writewithharper.com/docs/contributors/architecture).\n\n<!-- File: packages/chrome-plugin/CHANGELOG.md (Tokens: ~300 | Category: anthropic-skill) -->\n# Chrome-plugin Skill\n\nPath: `packages/chrome-plugin/CHANGELOG.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Automattic/harper/HEAD/packages/chrome-plugin/CHANGELOG.md)\n\n<!-- File: packages/chrome-plugin/package.json (Tokens: ~300 | Category: anthropic-skill) -->\n# Chrome-plugin Skill\n\nPath: `packages/chrome-plugin/package.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Automattic/harper/HEAD/packages/chrome-plugin/package.json)\n\n<!-- File: packages/chrome-plugin/tsconfig.json (Tokens: ~300 | Category: anthropic-skill) -->\n# Chrome-plugin Skill\n\nPath: `packages/chrome-plugin/tsconfig.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Automattic/harper/HEAD/packages/chrome-plugin/tsconfig.json)\n\n<!-- File: packages/chrome-plugin/tsconfig.node.json (Tokens: ~300 | Category: anthropic-skill) -->\n# Chrome-plugin Skill\n\nPath: `packages/chrome-plugin/tsconfig.node.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Automattic/harper/HEAD/packages/chrome-plugin/tsconfig.node.json)\n\n<!-- File: packages/components/package.json (Tokens: ~300 | Category: anthropic-skill) -->\n# Components Skill\n\nPath: `packages/components/package.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Automattic/harper/HEAD/packages/components/package.json)\n\n<!-- File: packages/components/tsconfig.json (Tokens: ~300 | Category: anthropic-skill) -->\n# Components Skill\n\nPath: `packages/components/tsconfig.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Automattic/harper/HEAD/packages/components/tsconfig.json)\n\n<!-- File: packages/harper-editor/package.json (Tokens: ~300 | Category: anthropic-skill) -->\n# Harper-editor Skill\n\nPath: `packages/harper-editor/package.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Automattic/harper/HEAD/packages/harper-editor/package.json)\n\n<!-- File: packages/harper-editor/tsconfig.json (Tokens: ~300 | Category: anthropic-skill) -->\n# Harper-editor Skill\n\nPath: `packages/harper-editor/tsconfig.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Automattic/harper/HEAD/packages/harper-editor/tsconfig.json)\n\n<!-- File: packages/harper.js/api-extractor.json (Tokens: ~300 | Category: anthropic-skill) -->\n# Harper.js Skill\n\nPath: `packages/harper.js/api-extractor.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Automattic/harper/HEAD/packages/harper.js/api-extractor.json)\n\n<!-- File: packages/harper.js/examples/commonjs-simple/package.json (Tokens: ~300 | Category: anthropic-skill) -->\n# Commonjs-simple Skill\n\nPath: `packages/harper.js/examples/commonjs-simple/package.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Automattic/harper/HEAD/packages/harper.js/examples/commonjs-simple/package.json)\n\n<!-- File: packages/harper.js/package.json (Tokens: ~300 | Category: anthropic-skill) -->\n# Harper.js Skill\n\nPath: `packages/harper.js/package.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Automattic/harper/HEAD/packages/harper.js/package.json)\n\n<!-- File: packages/harper.js/tsconfig.json (Tokens: ~300 | Category: anthropic-skill) -->\n# Harper.js Skill\n\nPath: `packages/harper.js/tsconfig.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Automattic/harper/HEAD/packages/harper.js/tsconfig.json)\n\n<!-- File: packages/lint-framework/package.json (Tokens: ~300 | Category: anthropic-skill) -->\n# Lint-framework Skill\n\nPath: `packages/lint-framework/package.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Automattic/harper/HEAD/packages/lint-framework/package.json)\n\n<!-- File: packages/lint-framework/src/assets/hints.json (Tokens: ~300 | Category: anthropic-skill) -->\n# Assets Skill\n\nPath: `packages/lint-framework/src/assets/hints.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Automattic/harper/HEAD/packages/lint-framework/src/assets/hints.json)\n\n<!-- File: packages/lint-framework/tsconfig.json (Tokens: ~300 | Category: anthropic-skill) -->\n# Lint-framework Skill\n\nPath: `packages/lint-framework/tsconfig.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Automattic/harper/HEAD/packages/lint-framework/tsconfig.json)\n\n<!-- File: packages/obsidian-plugin/package.json (Tokens: ~300 | Category: anthropic-skill) -->\n# Obsidian-plugin Skill\n\nPath: `packages/obsidian-plugin/package.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Automattic/harper/HEAD/packages/obsidian-plugin/package.json)\n\n<!-- File: packages/vscode-plugin/.vscode/extensions.json (Tokens: ~300 | Category: anthropic-skill) -->\n# .vscode Skill\n\nPath: `packages/vscode-plugin/.vscode/extensions.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Automattic/harper/HEAD/packages/vscode-plugin/.vscode/extensions.json)\n\n<!-- File: packages/vscode-plugin/.vscode/launch.json (Tokens: ~300 | Category: anthropic-skill) -->\n# .vscode Skill\n\nPath: `packages/vscode-plugin/.vscode/launch.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Automattic/harper/HEAD/packages/vscode-plugin/.vscode/launch.json)\n\n<!-- File: packages/vscode-plugin/.vscode/settings.json (Tokens: ~300 | Category: anthropic-skill) -->\n# .vscode Skill\n\nPath: `packages/vscode-plugin/.vscode/settings.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Automattic/harper/HEAD/packages/vscode-plugin/.vscode/settings.json)\n\n<!-- File: packages/vscode-plugin/.vscode/tasks.json (Tokens: ~300 | Category: anthropic-skill) -->\n# .vscode Skill\n\nPath: `packages/vscode-plugin/.vscode/tasks.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Automattic/harper/HEAD/packages/vscode-plugin/.vscode/tasks.json)\n\n<!-- File: packages/vscode-plugin/development-guide.md (Tokens: ~33 | Category: anthropic-skill) -->\n# Development Guide\n\nThis document has been moved to the [official documentation](https://writewithharper.com/docs/contributors/visual-studio-code).\n\n<!-- File: packages/vscode-plugin/package.json (Tokens: ~14429 | Category: anthropic-skill) -->\n{\n\t\"name\": \"harper\",\n\t\"displayName\": \"Harper - Grammar / Spell Checking\",\n\t\"description\": \"The grammar checker for developers\",\n\t\"version\": \"2.13.0\",\n\t\"private\": true,\n\t\"author\": \"Elijah Potter\",\n\t\"publisher\": \"elijah-potter\",\n\t\"license\": \"Apache-2.0\",\n\t\"icon\": \"icon.png\",\n\t\"galleryBanner\": {\n\t\t\"color\": \"#F2F2F2\",\n\t\t\"theme\": \"light\"\n\t},\n\t\"repository\": {\n\t\t\"type\": \"git\",\n\t\t\"url\": \"https://github.com/automattic/harper\"\n\t},\n\t\"bugs\": {\n\t\t\"url\": \"https://github.com/automattic/harper/issues\"\n\t},\n\t\"engines\": {\n\t\t\"vscode\": \"^1.96.2\"\n\t},\n\t\"categories\": [\n\t\t\"Other\"\n\t],\n\t\"keywords\": [\n\t\t\"grammar\",\n\t\t\"spellcheck\",\n\t\t\"writing\"\n\t],\n\t\"activationEvents\": [\n\t\t\"onLanguage:asciidoc\",\n\t\t\"onLanguage:c\",\n\t\t\"onLanguage:clojure\",\n\t\t\"onLanguage:cmake\",\n\t\t\"onLanguage:cpp\",\n\t\t\"onLanguage:csharp\",\n\t\t\"onLanguage:dart\",\n\t\t\"onLanguage:elixir\",\n\t\t\"onLanguage:git-commit\",\n\t\t\"onLanguage:gleam\",\n\t\t\"onLanguage:go\",\n\t\t\"onLanguage:groovy\",\n\t\t\"onLanguage:haskell\",\n\t\t\"onLanguage:html\",\n\t\t\"onLanguage:ink\",\n\t\t\"onLanguage:java\",\n\t\t\"onLanguage:javascript\",\n\t\t\"onLanguage:javascriptreact\",\n\t\t\"onLanguage:jj-commit\",\n\t\t\"onLanguage:kotlin\",\n\t\t\"onLanguage:literate haskell\",\n\t\t\"onLanguage:lua\",\n\t\t\"onLanguage:markdown\",\n\t\t\"onLanguage:nix\",\n\t\t\"onLanguage:org\",\n\t\t\"onLanguage:php\",\n\t\t\"onLanguage:powershell\",\n\t\t\"onLanguage:plaintext\",\n\t\t\"onLanguage:python\",\n\t\t\"onLanguage:quarto\",\n\t\t\"onLanguage:r\",\n\t\t\"onLanguage:rmd\",\n\t\t\"onLanguage:rmarkdown\",\n\t\t\"onLanguage:ruby\",\n\t\t\"onLanguage:rust\",\n\t\t\"onLanguage:scala\",\n\t\t\"onLanguage:scminput\",\n\t\t\"onLanguage:shellscript\",\n\t\t\"onLanguage:solidity\",\n\t\t\"onLanguage:swift\",\n\t\t\"onLanguage:tex\",\n\t\t\"onLanguage:latex\",\n\t\t\"onLanguage:toml\",\n\t\t\"onLanguage:typescript\",\n\t\t\"onLanguage:typescriptreact\",\n\t\t\"onLanguage:typst\",\n\t\t\"onLanguage:zig\"\n\t],\n\t\"main\": \"./build/extension.js\",\n\t\"contributes\": {\n\t\t\"icons\": {\n\t\t\t\"harper-logo\": {\n\t\t\t\t\"description\": \"Harper logo\",\n\t\t\t\t\"default\": {\n\t\t\t\t\t\"fontPath\": \"media/harper.woff\",\n\t\t\t\t\t\"fontCharacter\": \"\\\\e900\"\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\t\t\"languages\": [\n\t\t\t{\n\t\t\t\t\"id\": \"gleam\",\n\t\t\t\t\"aliases\": [\n\t\t\t\t\t\"Gleam\",\n\t\t\t\t\t\"gleam\"\n\t\t\t\t],\n\t\t\t\t\"extensions\": [\n\t\t\t\t\t\".gleam\"\n\t\t\t\t]\n\t\t\t}\n\t\t],\n\t\t\"commands\": [\n\t\t\t{\n\t\t\t\t\"command\": \"harper.languageserver.restart\",\n\t\t\t\t\"title\": \"Harper: Restart Language Server\",\n\t\t\t\t\"description\": \"Restart harper-ls\"\n\t\t\t}\n\t\t],\n\t\t\"configuration\": {\n\t\t\t\"type\": \"object\",\n\t\t\t\"title\": \"Harper\",\n\t\t\t\"properties\": {\n\t\t\t\t\"harper.path\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"string\",\n\t\t\t\t\t\"description\": \"Optional path to a harper-ls executable to use.\"\n\t\t\t\t},\n\t\t\t\t\"harper.codeActions.ForceStable\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": false,\n\t\t\t\t\t\"description\": \"Make code actions appear in \\\"stable\\\" positions by placing code actions that should always be available, like adding misspelled words in the dictionary, first.\"\n\t\t\t\t},\n\t\t\t\t\"harper.dialect\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"string\",\n\t\t\t\t\t\"enum\": [\n\t\t\t\t\t\t\"British\",\n\t\t\t\t\t\t\"American\",\n\t\t\t\t\t\t\"Canadian\",\n\t\t\t\t\t\t\"Australian\"\n\t\t\t\t\t],\n\t\t\t\t\t\"default\": \"American\",\n\t\t\t\t\t\"description\": \"Set which dialect of English Harper should expect.\"\n\t\t\t\t},\n\t\t\t\t\"harper.diagnosticSeverity\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"string\",\n\t\t\t\t\t\"enum\": [\n\t\t\t\t\t\t\"error\",\n\t\t\t\t\t\t\"hint\",\n\t\t\t\t\t\t\"information\",\n\t\t\t\t\t\t\"warning\"\n\t\t\t\t\t],\n\t\t\t\t\t\"default\": \"information\",\n\t\t\t\t\t\"description\": \"How severe do you want diagnostics to appear in the editor?\"\n\t\t\t\t},\n\t\t\t\t\"harper.excludePatterns\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"array\",\n\t\t\t\t\t\"description\": \"A set of globs to ignore. If a file matches any of the globs, it will not be linted.\"\n\t\t\t\t},\n\t\t\t\t\"harper.fileDictPath\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"string\",\n\t\t\t\t\t\"description\": \"Optional path to a file dictionary directory to use.\"\n\t\t\t\t},\n\t\t\t\t\"harper.isolateEnglish\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": false,\n\t\t\t\t\t\"description\": \"Only lint English text in documents that are a mixture of English and another language.\"\n\t\t\t\t},\n\t\t\t\t\"harper.markdown.IgnoreLinkTitle\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": false,\n\t\t\t\t\t\"description\": \"Skip linting link titles.\"\n\t\t\t\t},\n\t\t\t\t\"harper.maxFileLength\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"number\",\n\t\t\t\t\t\"default\": 120000,\n\t\t\t\t\t\"description\": \"Maximum length of file to be linted (in bytes). If a file is larger than this, it will not be linted.\"\n\t\t\t\t},\n\t\t\t\t\"harper.userDictPath\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"string\",\n\t\t\t\t\t\"description\": \"Optional path to a user dictionary file to use.\"\n\t\t\t\t},\n\t\t\t\t\"harper.workspaceDictPath\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"string\",\n\t\t\t\t\t\"description\": \"Optional path to a workspace-local dictionary file to use.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.ACoupleMore\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"Corrects `a couple of more` to `a couple more`.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.ALittleOfPractice\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"Corrects `a little of practice` to `a little practice` or `a bit of practice`.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.ALongTime\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"Corrects `along time` to `a long time`.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.AMeansToAnEnd\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"Corrects `a mean to an end` to `a means to an end`\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.AOkHyphen\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"Replaces the loose article-plus-abbreviation pairing with the standard hyphenated form whenever a linking verb describes readiness or approval.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.APart\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"Finds and corrects common mistakes between 'a part' and 'apart'\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.ASomeTime\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"Removes the redundant/conflicting indefinite article `a` before `some` when followed by time expressions.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.AWaysToGo\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"Corrects the idiom `a ways to go` when the indefinite article is missing.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.AWhile\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"Enforces `awhile` after verbs and `a while` everywhere else.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.AWholeOther\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"Corrects `a whole another`/`a whole 'nother` to `a whole other`.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.AccuseOf\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"Corrects `accuse for` to `accuse of`.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.AdNauseam\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"Corrects `as nauseam` to `ad nauseam`.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.Addicting\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"Replaces `addicting` with `addictive` when used as an adjective.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.AdjectiveDoubleDegree\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"Finds adjectives that are used as double degrees (e.g. `more prettier`).\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.AdjectiveOfA\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"This rule looks for sequences of words of the form `adjective of a`.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.Ado\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"Corrects `adieu` to `ado`.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.AdvantageOf\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"Corrects the missing preposition in the idiom `take advantage of` when `of` is dropped.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.AfterAWhile\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"Corrects the missing article in `after while`, forming `after a while`.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.AfterAll\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"Corrects `afterall` to `after all`.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.AfterLater\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"Checks for the word `later` following `after [a period of time]`.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.AheadAnd\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"Corrects `an` to `and` after `ahead`.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.Ajar\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"Corrects `a jar` to `ajar`.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.Akimbo\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"Corrects `a kimbo` to `akimbo`.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.Albeit\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"Corrects this expression to the standard `albeit`.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.AllHellBreakLoose\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"Corrects forms of `all hell breaks out` to `all hell breaks loose`.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.AllIntentsAndPurposes\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"Finds and corrects common wrong forms of the phrase 'for all intents and purposes' / 'to all intents and purposes'.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.AllOfASudden\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"Guides this expression toward the standard `all of a sudden`.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.AllReady\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"Flags `all ready` when it precedes an adjective so the adverb `already` can take its place.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.AllThough\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"Nobody means to write the two-word phrase `all though` when the single word `although` is intended.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.AllWellAndGood\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"Corrects `all well in good` to `all well and good`.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.AllowTo\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"Flags erroneous usage of `allow to` without a subject.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.Alongside\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"Replaces the spaced form `along side` with `alongside`.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.AlzheimersDisease\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"Fixes the common misnomer `old-timers' disease`, ensuring the correct medical term `Alzheimer’s disease` is used.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.AmInTheMorning\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"Finds redundant am/pm indicators used together with time periods such as 'in the morning' or 'at night'.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.AmazonNames\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"When referring to the various products of Amazon.com, make sure to treat them as a proper noun.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.Americas\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"When referring to North, Central, and South America, make sure to treat them as a proper noun.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.AmountsFor\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"Corrects `amounts for` to either `amounts to` or `accounts for`\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.AnA\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"A rule that looks for incorrect indefinite articles. For example, `this is an mule` would be flagged as incorrect.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.AnAnother\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"Corrects `an another` and `a another`.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.AnalogAcousticBike\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": false,\n\t\t\t\t\t\"description\": \"Suggests more standard terms for `analog/analogue bike` and `acoustic bike`.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.AndIn\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"Fixes the typo `an in` when it stands in for the conjunction `and in`, while avoiding common `in-...` noun phrases and a few attested exceptions.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.AndSuch\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"Corrects `and the such` to `and such`.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.AndTheLike\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"Corrects mistakes in `and the like` and `or the like`.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.AnotherAn\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"Corrects `another an` to `another`.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.AnotherOnes\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"Corrects `another ones`.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.AnotherThingComing\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"Though `another think coming` is the original phrase, `another thing coming` is now more common.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.AnotherThings\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"Corrects `another things`.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.AnotherThinkComing\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": false,\n\t\t\t\t\t\"description\": \"Though `another thing coming` is now more common, `another think coming` is the original phrase.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.Anybody\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"Looks for incorrect spacing inside the closed compound `anybody`.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.Anyhow\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"Looks for incorrect spacing inside the closed compound `anyhow`.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.Anywhere\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"Looks for incorrect spacing inside the closed compound `anywhere`.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.ApartFrom\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"Flags the misspelling `apart form` and suggests `apart from`.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.AppleNames\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"When referring to Apple products and services, make sure to treat them as proper nouns.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.ArgumentToBeMade\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"Corrects `argument to be said` to `argument to be made`.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.ArriveOnWeekday\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"Keeps schedules explicit by preferring the familiar `arrive on Friday` pattern instead of a bare weekday.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.ArriveTo\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"Corrects `arrive to` to `arrive at` or `arrive in`.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.AsComparedTo\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"Corrects `as compare to` to `as compared to`.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.AsEvidentBy\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"Corrects `evident by` to `evidenced by` in passive constructions where `evidence` is used as a verb.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.AsFarAsICanTell\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"Expands an initialism.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.AsFarAsIKnow\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"Expands an initialism.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.AsFarBackAs\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"Corrects nonstandard `as early back as` to `as far back as`.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.AsFollows\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"Corrects the phrase `as follow`, which is sometimes produced by overcorrection. While it appeared briefly in 19th-century English, it is now considered archaic; modern standard usage requires `as follows` regardless of number.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.AsHow\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"Corrects `as how` to `as to how`.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.AsIUnderstandIt\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"Expands an initialism.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.AsIfThough\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"Corrects redundant `as if though`.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.AsIsWithAnything\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"Flags the incorrect idiom blend `as is with anything` and suggests standard alternatives like `as with anything` or `as is the case with anything`.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.AsItHappens\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"Corrects `as it so happens` to `as it happens`.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.AsLongAs\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"Corrects `aslong as` and `as long that` to `as long as`.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.AsMuchAs\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"Corrects `as much than` to `as much as`.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.AsOfCurrently\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"Corrects `as of currently` to `currently` or `as of now`.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.AsOfLately\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"Corrects `as of lately` to `lately` or `as of late`.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.AsOpposedTo\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"Corrects `as oppose to` to `as opposed to`.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.AsSoonAsPossible\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"Expands an initialism.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.AsToInterrogative\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"Corrects `to` to `as to` between certain adjectives and `wh-words`.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.AskNoPreposition\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"Identifies sequences like `ask to us` or `tell to him` and recommends removing the superfluous “to”.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.AspireTo\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"Corrects `aspire for` to `aspire to`.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.AtAllCosts\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"Corrects `at all cost` to `at all costs`.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.AtFaceValue\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"Corrects nonstandard variants of `at face value`.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.AtLeasToLeast\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"Fixes the frequent typo `at leas` when the intended expression is `at least`.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.AtLestToLeast\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"Fixes the mistake `at lest` when the intended expression is `at least`.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.AtTheBestOfTimes\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"Corrects `in the best of times` to `at the best of times`.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.AtTheEndOfTheDay\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"Corrects `in the end of the day` to `at the end of the day`.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.AtTheExpenseOf\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"The correct idiom is `at the expense of`, with singular `expense`. But retain `expanse` if this phrase refers to a wide area.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.AtTheVeryLeast\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"Corrects `in the very least` to `at the very least`.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.Audible\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"Corrects `hearable` to `audible`.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.Australia\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"When referring to states, territories, and cities in Australia, make sure to treat them as a proper noun.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.AvoidAndAlso\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"Reduces redundancy by replacing `and also` with `and`.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.AvoidContractions\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": false,\n\t\t\t\t\t\"description\": \"Suggests expanded forms for common contractions, such as `isn't` → `is not` and `we're` → `we are`.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.AvoidCurses\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"Flags offensive language and offers various ways to censor or replace with euphemisms.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.AwaitFor\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"Suggests using either `await` or `wait for` but not both, as they express the same meaning.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.AwareOf\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"Corrects `aware about` to the standard `aware of`.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.AzureNames\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"When referring to Azure cloud services, make sure to treat them as proper nouns.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.BackInTheDay\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"This linter flags instances of the nonstandard phrase `back in the days`. The correct, more accepted form is `back in the day`\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.BackhandedCompliment\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"Corrects `backhand compliment` to `backhanded compliment`.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.Backplane\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"Looks for incorrect spacing inside the closed compound `backplane`.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.BadRap\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"Changes `bed rap` to the proper idiom `bad rap`.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.BainBane\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"Detects mixing up `bain` and `bane`.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.BanTogether\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"Detects and corrects the common error of using `ban together` instead of the idiom `band together`, which means to unite or join forces.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.BareBones\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"Corrects `bare-bone` to `bare-bones`.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.BareInMind\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"Ensures the phrase `bear in mind` is used correctly instead of `bare in mind`.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.BareWithMe\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"Corrects `bare with` to `bear with`.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.BarelyUn\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"Flags using `barely` with a negative adjective starting with `un-` (`barely unusable`, etc.), which is a kind of double negative.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.BatedBreath\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"Changes `baited breath` to the correct `bated breath`.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.BeAllowed\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"Ensures the passive form uses `be allowed` after future negatives.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.BeBiased\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"Detects incorrect use of 'be + verb' instead of `be + adjective`.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.BeConcerned\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"Detects incorrect use of 'be + verb' instead of `be + adjective`.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.BePrejudiced\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"Detects incorrect use of 'be + verb' instead of `be + adjective`.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.BeRightBack\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"Expands an initialism.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.BeShocked\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"Detects incorrect use of 'be + verb' instead of `be + adjective`.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.BeWorried\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"Detects incorrect use of 'be + verb' instead of `be + adjective`.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.BeckAndCall\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"Fixes eggcorns of `beck and call`.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.BeenThere\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"Corrects the misspelling `bee there` to the proper phrase `been there`.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.Beforehand\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"`Beforehand` functions as a fixed adverb meaning ‘in advance’; writing it as two words or with a hyphen is nonstandard and can jar readers.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.BehindTheScenes\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"Corrects `behind the scene` to `behind the scenes`.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.BellowBelow\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"Looks for `bellow` wrongly used when `below` is intended.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.BesideThePoint\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"Corrects `besides the point` to `beside the point`.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.BestOfAllTime\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"Checks for nonstandard `of all times` in superlatives instead of singular `time`\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.BestRegards\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"In valedictions, `best` expresses your highest regard—avoid the typo `beat regards`.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.BetterOffPhrase\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"Rewrites `better of` to `better off` in common comparative phrasing.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.BetterOffServed\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"Corrects `better off served` to `better off` or `better served`.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.BetterOffWith\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"Corrects `better of with` to `better off with`.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.BewareOf\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"The verb `beware` naturally pairs with `of` before the noun being warned about, so swap other prepositions for clarity.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.BlacklistWhitelist\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"Normalize the two-word sequence `black list`/`white list` so it matches the established compound noun or verb.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.BlanketStatement\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"Corrects common errors in the phrase `blanket statement`.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.BluRayHyphen\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"Joins the two-word spelling of the optical disc format into the standard compound form.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.BoarderBorder\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"Flags the eggcorn `boarder` (a lodger) where `border` (an edge/boundary) is intended.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.Bollocks\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"Corrects `bullocks` to `bollocks` when the meaning is `nonsense`.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.BoringWords\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": false,\n\t\t\t\t\t\"description\": \"This rule looks for particularly boring or overused words. Using varied language is an easy way to keep a reader's attention.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.Bought\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"Replaces the incorrect past-tense spelling `bough` with `bought` after subject pronouns.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.BrandBrandish\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"Looks for `brandish` wrongly used when `brand` is intended.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.Brutality\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"Suggests the more standard and common synonym `brutality`.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.BuiltIn\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"English convention treats `built-in` as a single, attributive adjective—meaning something integrated from the outset—whereas other forms like `in built` are nonstandard and can feel awkward to readers.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.ByAccident\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"Incorrect preposition: `by accident` is the idiomatic expression.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.ByExtension\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"Corrects `by extent` to `by extension`.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.ByOnesOwn\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"Fixes incorrect phrases like `by my own` by suggesting `on my own` or `by myself`.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.ByTheBook\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"Corrects `by the books` to `by the book`.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.ByTheWay\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"Expands an initialism.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.Bypass\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"Looks for incorrect spacing inside the closed compound `bypass`.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.CallItQuits\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"Corrects wrong variants of the idiom 'call it quits'.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.CallThem\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"Addresses the non-idiomatic phrases `call them as`.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.CanBeSeen\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"Corrects `can be seem` to the proper phrase `can be seen`.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.Canada\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"When referring to provinces, territories, and cities in Canada, make sure to treat them as a proper noun.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.Cant\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"Suggests correcting `cant` to `can't`.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.CantWay\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"Corrects `way` to `wait` in high-confidence contexts such as `can't way to` and `doesn't way for`.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.CapitalizeOn\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"A collection of linters that can be run as one.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.CapitalizePersonalPronouns\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"Forgetting to capitalize personal pronouns, like \\\"I\\\" or \\\"I'm\\\" is one of the most common errors. This rule helps with that.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.CaseInPoint\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"Corrects `case and point` to `case in point`.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.CaseSensitive\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"Ensures `case-sensitive` is correctly hyphenated.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.Catch22\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"Corrects mistakenly using similar-sounding words in the idiom `catch 22`.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.CauseItIsBecause\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"Normalizes informal `cause it is` to the standard subordinating form in explanatory clauses.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.CautionaryTale\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"Corrects confusion between `tale` (story) and `tail` (appendage) in common phrases.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.CeaseTo\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"Detects when `seize to` is likely a typo for `cease to`.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.Chalkboard\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"Looks for incorrect spacing inside the closed compound `chalkboard`.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.ChampAtTheBit\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"Corrects `chomp at the bit` to the idiom `champ at the bit`, which has an equestrian origin referring to the way an anxious horse grinds its teeth against the metal part of the bridle.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.ChangeTack\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"Locates errors in the idioms `to change tack` and `change of tack` to convey the correct meaning of altering one's course or strategy.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.ChickenAndEgg\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"Corrects wrong variants of the `chicken-and-egg` idiom.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.ChineseCommunistParty\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"When referring to the political party, make sure to treat them as a proper noun.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.ChockFull\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"Flags common soundalikes of \\\"chock-full\\\" and makes sure they're hyphenated.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.ClaimToFame\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"Corrects `claim for fame` to the idiom `claim to fame`.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.ClicheAccent\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"A collection of linters that can be run as one.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.ClickThroughRate\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"Hyphenates the verb+preposition pair when it directly precedes rate-style nouns, mirroring how these terms are commonly styled in analytics writing.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.ClientOrServerSide\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"Corrects extraneous apostrophe in `client's side` and `server's side`.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.CloseTightKnit\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"Corrects `close-nit` and `tight-nit` to `close-knit` and `tight-knit`.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.CodeInWriteIn\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"Corrects the wrong preposition `on` to `in` when referring to writing code.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.Codebase\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"Looks for incorrect spacing inside the closed compound `codebase`.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.Codebases\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"Looks for incorrect spacing inside the closed compound `codebases`.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.ColdModalTypo\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"Rewrites `cold` to `could` when it appears in common subject-plus-verb modal contexts.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.Combinate\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"Suggests replacing the nonstandard verb `combinate` with the standard `combine`.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.ComfortableWith\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"Corrects `comfortable of` to `comfortable with`.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.CommaFixes\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"Fix common comma errors such as no space after, erroneous space before, etc., Asian commas instead of English commas, etc.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.CommitmentTo\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"Corrects `commitment toward/towards` to `commitment to`.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.CompaniesProductsAndTrademarks\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"Ensure proper capitalization of companies, products, and trademarks.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.ComplainAsNoun\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"Corrects the use of `complain` as a noun.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.CompoundNouns\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"Detects compound nouns split by a space and suggests merging them when both parts form a valid noun.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.CompoundSubjectI\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"Promotes `I` in compound subjects headed by a possessive determiner.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.ComprisesOf\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"`Comprises` already contains the notion of `of`, so following it with another `of` is redundant.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.CompulseToCompel\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"Suggests replacing the obsolete or archaic verb `compulse` with the standard `compel`.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.CondensateVerb\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"Suggests replacing the nonstandard verb `condensate` with the standard `condense`.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.CondenseAllThe\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"Suggests removing `of` in `all of the` for a more concise phrase.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.Confident\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"This linter detects instances where the noun `confidant` is incorrectly used in place of the adjective `confident`. `Confidant` refers to a trusted person, whereas `confident` describes certainty or self-assurance. The rule suggests replacing `confidant` with `confident` when used in an adjectival context.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.ConfirmThat\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"Corrects `conform` typos to `confirm`.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.ConstituteAs\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"Removes extraneous `as` after the verb `constitute`.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.ConvenientStore\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"Attempts to detect when `convenient store` is mistake for `convenience store`.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.Copyright\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"Corrects `copywrite` to `copyright`. `Copywrite` refers to writing copy, while `copyright` is the legal right to creative works.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.CorrectNumberSuffix\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"When making quick edits, it is common for authors to change the value of a number without changing its suffix. This rule looks for these cases, for example: `2st`.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.Countries\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"When referring to Countries, make sure to treat it as a proper noun.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.CoursingThroughVeins\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"In English idioms, `to course` means to flow rapidly—so avoid the eggcorn `cursing through veins.`\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.CraveFor\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"There should be no `for` after the verb `crave`.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.CriteriaPhenomena\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"The words “criteria” and “phenomena” are the plurals of “criterion” and “phenomenon”, respectively. They are often incorrectly used with the wrong number.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.CrossPlatform\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"Unlike some compound modifiers, `cross-platform` should always be hyphenated.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.CureFor\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"Flags `cure against` and prefers the standard `cure for` pairing.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.CuriousAbout\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"Corrects `curious of` and `curious on` to `curious about`.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.CurrencyPlacement\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"The location of currency symbols varies by country. The rule looks for and corrects improper positioning.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.CuttingAgeEggcorn\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"Corrects the eggcorn `cutting age` or `cutting-age` to `cutting-edge` or `cutting edge`.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.Cybersec\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"Expands the informal abbreviation `cybersec` to `cybersecurity`.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.Damages\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"Checks for plural `damages` not in the context of a court case.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.DampSquib\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"Corrects the eggcorn `damp squid` to `damp squib`, ensuring the intended meaning of a failed or underwhelming outcome.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.Dashes\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"Writers often type `--` or `---` expecting their editor to convert them into proper dashes. Replace these sequences with the correct characters: use an en dash (–) for ranges or connections and an em dash (—) for a break in thought.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.DateBackFrom\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"Corrects the blend of `date from` and `date back to` into the nonstandard `date back from`.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.DayAndAge\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"Fixes wrong variants of the idiom `in this day and age`.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.DayOneNames\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"Ensure proper capitalization of Day One and Day One Premium as brand names.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.Deadlift\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"Looks for incorrect spacing inside the closed compound `deadlift`.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.DefiniteArticle\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"The name of the word `the` is `definite article`.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.DegreesKelvin\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"Corrects use of `degrees kelvin` to `kelvins`.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.DegreesKelvinSymbol\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"Corrects use of `°K` to `K`.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.DenyOffer\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"Corrects `deny` when used with `offer` to `decline` or `reject`.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.Dereference\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"A collection of linters that can be run as one.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.Desktop\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"Looks for incorrect spacing inside the closed compound `desktop`.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.DespiteItIs\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"Corrects `despite` being used with the wrong form of `is`.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.DespiteOf\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"Corrects the misuse of `despite of` and suggests the proper alternatives `despite` or `in spite of`.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.Devops\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"Looks for incorrect spacing inside the closed compound `devops`.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.DidPast\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"Corrects past forms of verbs to their base form, when used together with \\\"did\\\".\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.Didnt\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"Corrects `dint` to `didn't` after subject pronouns.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.DigUnderTheHood\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\t\"default\": true,\n\t\t\t\t\t\"description\": \"Detects the mixed metaphor of `digging under the hood/bonnet`.\"\n\t\t\t\t},\n\t\t\t\t\"harper.linters.DigestiveTract\": {\n\t\t\t\t\t\"scope\": \"resource\",\n\t\t\t\t\t\"type\": \"\n\n<!-- File: packages/vscode-plugin/src/tests/fixtures/.vscode/settings.json (Tokens: ~300 | Category: anthropic-skill) -->\n# .vscode Skill\n\nPath: `packages/vscode-plugin/src/tests/fixtures/.vscode/settings.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Automattic/harper/HEAD/packages/vscode-plugin/src/tests/fixtures/.vscode/settings.json)\n\n<!-- File: packages/vscode-plugin/src/tests/fixtures/integration.md (Tokens: ~300 | Category: anthropic-skill) -->\n# Fixtures Skill\n\nPath: `packages/vscode-plugin/src/tests/fixtures/integration.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Automattic/harper/HEAD/packages/vscode-plugin/src/tests/fixtures/integration.md)\n\n<!-- File: packages/vscode-plugin/tsconfig.json (Tokens: ~93 | Category: anthropic-skill) -->\n{\n\t\"exclude\": [\"src/tests/fixtures\"],\n\t\"compilerOptions\": {\n\t\t\"module\": \"Node16\",\n\t\t\"target\": \"ES2022\",\n\t\t\"lib\": [\"ES2022\", \"DOM\"],\n\t\t\"sourceMap\": true,\n\t\t\"rootDir\": \"src\",\n\t\t\"outDir\": \"build\",\n\t\t\"strict\": true,\n\t\t\"skipLibCheck\": true\n\t}\n}\n\n<!-- File: packages/web/demo_wp_blueprint.json (Tokens: ~506 | Category: anthropic-skill) -->\n{\n\t\"$schema\": \"https://playground.wordpress.net/blueprint-schema.json\",\n\t\"preferredVersions\": {\n\t\t\"php\": \"8.0\",\n\t\t\"wp\": \"6.7\"\n\t},\n\t\"meta\": {\n\t\t\"title\": \"Demo of Harper for WordPress\",\n\t\t\"description\": \"Harper is a grammar checker for people who want to write, without any fuss.\",\n\t\t\"author\": \"elijah-potter\",\n\t\t\"categories\": []\n\t},\n\t\"landingPage\": \"/wp-admin/post.php?post=4&action=edit\",\n\t\"steps\": [\n\t\t{\n\t\t\t\"step\": \"login\",\n\t\t\t\"username\": \"admin\",\n\t\t\t\"password\": \"password\"\n\t\t},\n\t\t{\n\t\t\t\"step\": \"installPlugin\",\n\t\t\t\"pluginData\": {\n\t\t\t\t\"resource\": \"url\",\n\t\t\t\t\"url\": \"https://github.com/Automattic/harper/releases/download/v0.27.0/harper.zip\"\n\t\t\t},\n\t\t\t\"options\": {\n\t\t\t\t\"activate\": true\n\t\t\t}\n\t\t},\n\t\t{\n\t\t\t\"step\": \"installTheme\",\n\t\t\t\"themeData\": {\n\t\t\t\t\"resource\": \"wordpress.org/themes\",\n\t\t\t\t\"slug\": \"twentytwentyfour\"\n\t\t\t}\n\t\t},\n\t\t{\n\t\t\t\"step\": \"runPHP\",\n\t\t\t\"code\": \"<?php require_once 'wordpress/wp-load.php'; wp_insert_post(array('post_title' => 'Harper, in WordPress', 'post_content' => '<!-- wp:paragraph --><p><strong>Click on the Harper button on the top right of this page to get started.</strong></p><!-- /wp:paragraph --><!-- wp:paragraph --><p>Writing on the web can be scary. Theres a lot of competition for traffic and even a small grammatical mstake can be costly to your reputation and search rankings.</p><!-- /wp:paragraph --><!-- wp:paragraph --><p>That\\\\'s why we created Harper: an plugin to save you the embarassment. it can fix typos, serial commas and overall just make your life better.</p><!-- /wp:paragraph --><!-- wp:paragraph --><p>All that while respecting your privacy. You data should never leave Wordpress until you hit \\\"Publish\\\".</p><!-- /wp:paragraph -->'));\"\n\t\t}\n\t]\n}\n\n<!-- File: packages/web/drizzle/meta/_journal.json (Tokens: ~300 | Category: anthropic-skill) -->\n# Meta Skill\n\nPath: `packages/web/drizzle/meta/_journal.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Automattic/harper/HEAD/packages/web/drizzle/meta/_journal.json)\n\n<!-- File: packages/web/drizzle/meta/0000_snapshot.json (Tokens: ~300 | Category: anthropic-skill) -->\n# Meta Skill\n\nPath: `packages/web/drizzle/meta/0000_snapshot.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Automattic/harper/HEAD/packages/web/drizzle/meta/0000_snapshot.json)\n\n<!-- ... +52 more modular skills available via /api/skills/Automattic/harper?path={path} -->\n</yakaai_skills>"}