diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index abb5b50a5ce..16c9cbeb09d 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -259,6 +259,7 @@ jobs: - name: Check types and lint and oxfmt run: pnpm check + # Report-only dead-code scans. Runs after scope detection and stores machine-readable # results as artifacts for later triage before we enable hard gates. # Temporarily disabled in CI while we process initial findings. @@ -298,7 +299,7 @@ jobs: name: dead-code-${{ matrix.tool }}-${{ github.run_id }} path: .artifacts/deadcode - # Validate docs (format, lint, broken links) only when docs files changed. + # Validate docs (spellcheck, format, lint, broken links) only when docs files changed. check-docs: needs: [docs-scope] if: needs.docs-scope.outputs.docs_changed == 'true' @@ -317,6 +318,9 @@ jobs: - name: Check docs run: pnpm check:docs + - name: Spellcheck docs + run: pnpm docs:spellcheck + secrets: runs-on: blacksmith-16vcpu-ubuntu-2404 steps: diff --git a/CHANGELOG.md b/CHANGELOG.md index 7fa00498481..271ae8fc06f 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,6 +6,7 @@ Docs: https://docs.openclaw.ai ### Changes +- Docs: fix FAQ typos and add documentation spellcheck automation with a custom codespell dictionary/ignore list, including CI coverage. (#22457) Thanks @vincentkoc. - Dev tooling: add dead-code scans to CI via Knip/ts-prune/ts-unused-exports and report unused dependencies/exports in non-blocking checks. (#22468) Thanks @vincentkoc. - Dev tooling: move `@larksuiteoapi/node-sdk` out of root `package.json` and keep it scoped to `extensions/feishu` where it is used. (#22471) Thanks @vincentkoc. - Dev tooling: remove unused root dependency `signal-utils` from core manifest after confirming it was only used by extension-only paths. (#22471) Thanks @vincentkoc. diff --git a/docs/help/faq.md b/docs/help/faq.md index 053e7bbb4a9..9e61b595724 100644 --- a/docs/help/faq.md +++ b/docs/help/faq.md @@ -10,7 +10,7 @@ Quick answers plus deeper troubleshooting for real-world setups (local dev, VPS, ## Table of contents - [Quick start and first-run setup] - - [Im stuck whats the fastest way to get unstuck?](#im-stuck-whats-the-fastest-way-to-get-unstuck) + - [Im stuck what's the fastest way to get unstuck?](#im-stuck-whats-the-fastest-way-to-get-unstuck) - [What's the recommended way to install and set up OpenClaw?](#whats-the-recommended-way-to-install-and-set-up-openclaw) - [How do I open the dashboard after onboarding?](#how-do-i-open-the-dashboard-after-onboarding) - [How do I authenticate the dashboard (token) on localhost vs remote?](#how-do-i-authenticate-the-dashboard-token-on-localhost-vs-remote) @@ -126,7 +126,7 @@ Quick answers plus deeper troubleshooting for real-world setups (local dev, VPS, - [Why did context get truncated mid-task? How do I prevent it?](#why-did-context-get-truncated-midtask-how-do-i-prevent-it) - [How do I completely reset OpenClaw but keep it installed?](#how-do-i-completely-reset-openclaw-but-keep-it-installed) - [I'm getting "context too large" errors - how do I reset or compact?](#im-getting-context-too-large-errors-how-do-i-reset-or-compact) - - [Why am I seeing "LLM request rejected: messages.N.content.X.tool_use.input: Field required"?](#why-am-i-seeing-llm-request-rejected-messagesncontentxtooluseinput-field-required) + - [Why am I seeing "LLM request rejected: messages.content.tool_use.input field required"?](#why-am-i-seeing-llm-request-rejected-messagescontenttool_useinput-field-required) - [Why am I getting heartbeat messages every 30 minutes?](#why-am-i-getting-heartbeat-messages-every-30-minutes) - [Do I need to add a "bot account" to a WhatsApp group?](#do-i-need-to-add-a-bot-account-to-a-whatsapp-group) - [How do I get the JID of a WhatsApp group?](#how-do-i-get-the-jid-of-a-whatsapp-group) @@ -262,7 +262,7 @@ Quick answers plus deeper troubleshooting for real-world setups (local dev, VPS, ## Quick start and first-run setup -### Im stuck whats the fastest way to get unstuck +### Im stuck what's the fastest way to get unstuck Use a local AI agent that can **see your machine**. That is far more effective than asking in Discord, because most "I'm stuck" cases are **local config or environment issues** that @@ -440,7 +440,7 @@ Newest entries are at the top. If the top section is marked **Unreleased**, the section is the latest shipped version. Entries are grouped by **Highlights**, **Changes**, and **Fixes** (plus docs/other sections when needed). -### I cant access docs.openclaw.ai SSL error What now +### I can't access docs.openclaw.ai SSL error What now Some Comcast/Xfinity connections incorrectly block `docs.openclaw.ai` via Xfinity Advanced Security. Disable it or allowlist `docs.openclaw.ai`, then retry. More @@ -464,7 +464,7 @@ that same version to `latest`**. That's why beta and stable can point at the See what changed: [https://github.com/openclaw/openclaw/blob/main/CHANGELOG.md](https://github.com/openclaw/openclaw/blob/main/CHANGELOG.md) -### How do I install the beta version and whats the difference between beta and dev +### How do I install the beta version and what's the difference between beta and dev **Beta** is the npm dist-tag `beta` (may match `latest`). **Dev** is the moving head of `main` (git); when published, it uses the npm dist-tag `dev`. @@ -581,7 +581,7 @@ Two common Windows issues: If you want the smoothest Windows setup, use **WSL2** instead of native Windows. Docs: [Windows](/platforms/windows). -### The docs didnt answer my question how do I get a better answer +### The docs didn't answer my question how do I get a better answer Use the **hackable (git) install** so you have the full source and docs locally, then ask your bot (or Claude/Codex) _from that folder_ so it can read the repo and answer precisely. @@ -1839,7 +1839,7 @@ If it keeps happening: Docs: [Compaction](/concepts/compaction), [Session pruning](/concepts/session-pruning), [Session management](/concepts/session). -### Why am I seeing LLM request rejected messagesNcontentXtooluseinput Field required +### Why am I seeing "LLM request rejected: messages.content.tool_use.input field required"? This is a provider validation error: the model emitted a `tool_use` block without the required `input`. It usually means the session history is stale or corrupted (often after long threads @@ -1906,7 +1906,7 @@ openclaw directory groups list --channel whatsapp Docs: [WhatsApp](/channels/whatsapp), [Directory](/cli/directory), [Logs](/cli/logs). -### Why doesnt OpenClaw reply in a group +### Why doesn't OpenClaw reply in a group Two common causes: @@ -1915,7 +1915,7 @@ Two common causes: See [Groups](/channels/groups) and [Group messages](/channels/group-messages). -### Do groupsthreads share context with DMs +### Do groups/threads share context with DMs Direct chats collapse to the main session by default. Groups/channels have their own session keys, and Telegram topics / Discord threads are separate sessions. See [Groups](/channels/groups) and [Group messages](/channels/group-messages). @@ -2335,7 +2335,7 @@ To target a specific agent: openclaw models auth order set --provider anthropic --agent main anthropic:default ``` -### OAuth vs API key whats the difference +### OAuth vs API key what's the difference OpenClaw supports both: @@ -2423,7 +2423,7 @@ Fix: - In the Control UI settings, paste the same token. - Still stuck? Run `openclaw status --all` and follow [Troubleshooting](/gateway/troubleshooting). See [Dashboard](/web/dashboard) for auth details. -### I set gatewaybind tailnet but it cant bind nothing listens +### I set gatewaybind tailnet but it can't bind nothing listens `tailnet` bind picks a Tailscale IP from your network interfaces (100.64.0.0/10). If the machine isn't on Tailscale (or the interface is down), there's nothing to bind to. @@ -2506,7 +2506,7 @@ Service/supervisor logs (when the gateway runs via launchd/systemd): See [Troubleshooting](/gateway/troubleshooting#log-locations) for more. -### How do I startstoprestart the Gateway service +### How do I start/stop/restart the Gateway service Use the gateway helpers: @@ -2732,7 +2732,7 @@ more susceptible to instruction hijacking, so avoid them for tool-enabled agents or when reading untrusted content. If you must use a smaller model, lock down tools and run inside a sandbox. See [Security](/gateway/security). -### I ran start in Telegram but didnt get a pairing code +### I ran start in Telegram but didn't get a pairing code Pairing codes are sent **only** when an unknown sender messages the bot and `dmPolicy: "pairing"` is enabled. `/start` by itself doesn't generate a code. diff --git a/package.json b/package.json index 939d3509fc4..68031a1d5d9 100644 --- a/package.json +++ b/package.json @@ -70,6 +70,8 @@ "docs:check-links": "node scripts/docs-link-audit.mjs", "docs:dev": "cd docs && mint dev", "docs:list": "node scripts/docs-list.js", + "docs:spellcheck": "if command -v codespell >/dev/null 2>&1; then codespell README.md docs --skip='*.png,*.jpg,*.jpeg,*.gif,*.svg' -D - -D scripts/codespell-dictionary.txt -I scripts/codespell-ignore.txt; else pnpm dlx codespell README.md docs --skip='*.png,*.jpg,*.jpeg,*.gif,*.svg' -D - -D scripts/codespell-dictionary.txt -I scripts/codespell-ignore.txt; fi", + "docs:spellcheck:fix": "if command -v codespell >/dev/null 2>&1; then codespell README.md docs --skip='*.png,*.jpg,*.jpeg,*.gif,*.svg' -D - -D scripts/codespell-dictionary.txt -I scripts/codespell-ignore.txt -w; else pnpm dlx codespell README.md docs --skip='*.png,*.jpg,*.jpeg,*.gif,*.svg' -D - -D scripts/codespell-dictionary.txt -I scripts/codespell-ignore.txt -w; fi", "format": "oxfmt --write", "format:all": "pnpm format && pnpm format:swift", "format:check": "oxfmt --check", diff --git a/scripts/codespell-dictionary.txt b/scripts/codespell-dictionary.txt new file mode 100644 index 00000000000..e887ea81d14 --- /dev/null +++ b/scripts/codespell-dictionary.txt @@ -0,0 +1,3 @@ +messagesNcontentXtooluseinput->messages.content.tool_use.input +groupsthreads->groups/threads +startstoprestart->start/stop/restart diff --git a/scripts/codespell-ignore.txt b/scripts/codespell-ignore.txt new file mode 100644 index 00000000000..b7008d3eabf --- /dev/null +++ b/scripts/codespell-ignore.txt @@ -0,0 +1,2 @@ +iTerm +FO