Skip to content

[claude] Add documentation site with interactive sync explainer - #7

Open
myieye wants to merge 12 commits into
developfrom
claude/fw-lite-lexbox-docs-0e3415
Open

[claude] Add documentation site with interactive sync explainer#7
myieye wants to merge 12 commits into
developfrom
claude/fw-lite-lexbox-docs-0e3415

Conversation

@myieye

@myieye myieye commented Jul 29, 2026

Copy link
Copy Markdown
Owner

[Claude, autonomous]

Staging PR — never merge; promoted to sillsdev when polished (see FORK.md).

Docusaurus site at docs/, in three product-scoped sections: /fw-lite/ (the app guide, home of the interactive "How sync works" explainer), /lexbox/ (accounts, project hosting, Send/Receive, members and roles, organizations, and a manager-facing bridge page for enabling FieldWorks Lite), and /technical/. The homepage routes readers with product tiles; old /user-guide/* URLs redirect. Explainer content lives in one data file (docs/src/components/SyncExplainer/syncScenarios.ts); DOCS-PLAN.md records the decisions, including the deep-link registry for the apps.

Preview: https://myieye.github.io/languageforge-lexbox/

Screenshots

Landing Lexbox guide Send/Receive FW Lite bridge
Explainer (light) Explainer offline (dark)

🤖 Generated with Claude Code

docs/ becomes a Docusaurus site with a user guide and technical section,
seeded from existing README/AGENTS.md content. The user guide's 'How sync
works' page is an interactive question-driven explainer (all content in
docs/src/components/SyncExplainer/syncScenarios.ts). DOCS-PLAN.md records
the tooling survey and decisions.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
@coderabbitai

coderabbitai Bot commented Jul 29, 2026

Copy link
Copy Markdown

Review Change Stack

Important

Review skipped

Auto reviews are disabled on this repository. Please check the settings in the CodeRabbit UI or the .coderabbit.yaml file in this repository. To trigger a single review, invoke the @coderabbitai review command.

⚙️ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro

Run ID: 19d649ac-0921-4d17-b474-c27c55edefb4

You can disable this status message by setting the reviews.review_status to false in the CodeRabbit configuration file.

Use the checkbox below for a quick retry:

  • 🔍 Trigger review
📝 Walkthrough

Walkthrough

Changes

Documentation site

Layer / File(s) Summary
Docusaurus foundation and deployment
.github/workflows/docs.yaml, docs/docusaurus.config.ts, docs/package.json, docs/tsconfig.json, docs/sidebars.ts, docs/.gitignore, docs/pnpm-workspace.yaml, docs/src/css/custom.css
Adds the Docusaurus configuration, package setup, sidebar generation, TypeScript settings, theme styling, ignored artifacts, and GitHub Pages build/deployment workflow.
Site entry points and navigation
docs/src/pages/*, docs/user-guide/index.md, docs/user-guide/getting-started.md, docs/user-guide/faq.md, docs/technical/index.md
Adds the site homepage, navigation cards, user-guide landing content, getting-started instructions, FAQ, and technical documentation entry point.
Interactive sync explainer
docs/src/components/SyncExplainer/*, docs/user-guide/how-sync-works.mdx, DOCS-PLAN.md
Adds scenario data, interactive topology and stepper behavior, responsive styling, and the user-facing sync explanation.
Technical architecture, sync, and development docs
docs/technical/architecture/*, docs/technical/sync/*, docs/technical/development/*, docs/technical/ci-cd.md
Documents architecture, integrations, CI/CD, local development, CRDT synchronization, FwHeadless merges, and the four-hop sync chain.
Repository documentation links
AGENTS.md, README.md
Updates setup links to the new technical documentation paths and relocates the README error image reference under docs/static/img/.
✨ Finishing Touches 💡 1
🛠️ Fix failing CI checks 💡
  • Fix failing CI checks
📝 Generate docstrings
  • Create stacked PR
  • Commit on current branch

Comment @coderabbitai help to get the list of available commands.

@deepsource-io

deepsource-io Bot commented Jul 29, 2026

Copy link
Copy Markdown

DeepSource Code Review

We reviewed changes in e221be6...f6dcc2d on this pull request. Below is the summary for the review, and you can see the individual issues we found as inline review comments.

See full review on DeepSource ↗

PR Report Card

Overall Grade   Security  

Reliability  

Complexity  

Hygiene  

Code Review Summary

Analyzer Status Updated (UTC) Details
C# Aug 13, 2026 12:45p.m. Review ↗
Docker Aug 13, 2026 12:45p.m. Review ↗
JavaScript Aug 13, 2026 12:45p.m. Review ↗
Shell Aug 13, 2026 12:45p.m. Review ↗
SQL Aug 13, 2026 12:45p.m. Review ↗
Secrets Aug 13, 2026 12:45p.m. Review ↗
PowerShell Aug 13, 2026 12:45p.m. Review ↗
CSS Aug 13, 2026 12:45p.m. Review ↗

Important

AI Review is run only on demand for your team. We're only showing results of static analysis review right now. To trigger AI Review, comment @deepsourcebot review on this thread.

Comment thread docs/docusaurus.config.ts Outdated
@@ -0,0 +1,106 @@
import {themes as prismThemes} from 'prism-react-renderer';
import type {Config} from '@docusaurus/types';
import type * as Preset from '@docusaurus/preset-classic';

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Explicitly import the specific method needed


Wildcard imports are easier to write, but make it harder to pick out the specific functions or objects from a dependency that are used in a file.

Comment thread docs/docusaurus.config.ts Outdated
import {themes as prismThemes} from 'prism-react-renderer';
import type {Config} from '@docusaurus/types';
import type * as Preset from '@docusaurus/preset-classic';
import type * as DocsPlugin from '@docusaurus/plugin-content-docs';

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Explicitly import the specific method needed


Wildcard imports are easier to write, but make it harder to pick out the specific functions or objects from a dependency that are used in a file.

Comment on lines +36 to +38
function cx(...classes: (string | false | undefined)[]): string {
return classes.filter(Boolean).join(' ');
}

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Unexpected function declaration in the global scope, wrap in an IIFE for a local variable, assign as global property for a global variable


It is considered a best practice to avoid 'polluting' the global scope with variables that are intended to be local to the script. Global variables created from a script can produce name collisions with global variables created from another script, which will usually lead to runtime errors or unexpected behavior. It is mostly useful for browser scripts.

Comment on lines +41 to +43
function withBold(text: string): ReactNode[] {
return text.split(/\*\*(.+?)\*\*/g).map((part, i) => (i % 2 ? <b key={i}>{part}</b> : part));
}

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Unexpected function declaration in the global scope, wrap in an IIFE for a local variable, assign as global property for a global variable


It is considered a best practice to avoid 'polluting' the global scope with variables that are intended to be local to the script. Global variables created from a script can produce name collisions with global variables created from another script, which will usually lead to runtime errors or unexpected behavior. It is mostly useful for browser scripts.


/** Only INITIAL.text uses this; step sentences are plain text. */
function withBold(text: string): ReactNode[] {
return text.split(/\*\*(.+?)\*\*/g).map((part, i) => (i % 2 ? <b key={i}>{part}</b> : part));

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Do not use Array index in keys


When rendering a list of items in React, it is necessary to pass a "key" prop.
This key is used by React to identify which items have changed, are added, or are removed and should be stable.
It is not recommended to use the index of an element as key because it doesn't uniquely identify the element.
When elements are added/removed from an array, the index of an element may change, which will result in unnecessary re-renders.

: rect.top - stageRect.top + rect.height / 2 - 8;
return {visible: true, x: rect.left - stageRect.left + rect.width / 2 - 8 + offset, y};
};
const coLocated = !!step?.t1 && step.t1 === step.t2;

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

use `Boolean(step?.t1)` instead


Prefer using explicit casts by calling Number, Boolean, or String over using operators like +, !! or "" +. This is considered best practice as it improves readability.


useEffect(() => {
if (!scenario) return;
const onKeyDown = (e: KeyboardEvent): void => {

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

`onKeyDown` has a cyclomatic complexity of 6 with "medium" risk


A function with high cyclomatic complexity can be hard to understand and
maintain. Cyclomatic complexity is a software metric that measures the number of
independent paths through a function. A higher cyclomatic complexity indicates
that the function has more decision points and is more complex.

if (e.key === 'ArrowLeft') setStepIndex((i) => Math.max(i - 1, 0));
};
document.addEventListener('keydown', onKeyDown);
return () => document.removeEventListener('keydown', onKeyDown);

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Arrow function expected no return value


Any code paths that do not have explicit returns will return undefined. It is recommended to replace any implicit dead-ends that return undefined with a return null statement.

const badge = step?.badge;

return (
<div className={styles.root}>

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

JSX tree is too deeply nested. Found 6 levels of nesting


Nesting JSX elements too deeply can confuse developers reading the code. To make maintenance and refactoring easier, DeepSource recommends limiting the maximum JSX tree depth to 4.

Comment thread docs/src/pages/index.tsx Outdated
Comment on lines +14 to +35
export default function Home(): ReactNode {
const {siteConfig} = useDocusaurusContext();
return (
<Layout description={siteConfig.tagline}>
<main className="container margin-vert--xl">
<Heading as="h1">{siteConfig.title}</Heading>
<p>{siteConfig.tagline}</p>
<div className="row margin-top--lg">
{sections.map((section) => (
<div key={section.to} className="col col--6 margin-bottom--md">
<Link to={section.to} className={`card padding--lg ${styles.sectionCard}`}>
<Heading as="h2" className="margin-bottom--none">
{section.label}
</Heading>
</Link>
</div>
))}
</div>
</main>
</Layout>
);
}

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Unexpected function declaration in the global scope, wrap in an IIFE for a local variable, assign as global property for a global variable


It is considered a best practice to avoid 'polluting' the global scope with variables that are intended to be local to the script. Global variables created from a script can produce name collisions with global variables created from another script, which will usually lead to runtime errors or unexpected behavior. It is mostly useful for browser scripts.

Named type imports in the Docusaurus config, Boolean() coercions,
content-derived keys, arrow-const components, and Topology/Stepper
extracted from SyncExplainer. DOCS-PLAN.md gains the FieldWorks Classic
docs relationship and the React-vs-Svelte decision with its revisit
trigger.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
);
};

const SyncExplainer = (): ReactNode => {

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

`SyncExplainer` has a cyclomatic complexity of 6 with "medium" risk


A function with high cyclomatic complexity can be hard to understand and
maintain. Cyclomatic complexity is a software metric that measures the number of
independent paths through a function. A higher cyclomatic complexity indicates
that the function has more decision points and is more complex.

Comment on lines +362 to +364
return () => {
document.removeEventListener('keydown', onKeyDown);
};

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Arrow function expected no return value


Any code paths that do not have explicit returns will return undefined. It is recommended to replace any implicit dead-ends that return undefined with a return null statement.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
@myieye

myieye commented Jul 29, 2026

Copy link
Copy Markdown
Owner Author

@coderabbitai review

@coderabbitai

coderabbitai Bot commented Jul 29, 2026

Copy link
Copy Markdown
✅ Action performed

Review finished.

Note: CodeRabbit is an incremental review system and does not re-review already reviewed commits. This command is applicable only when automatic reviews are paused.

Lets CI deploy previews to another host (e.g. a fork's GitHub Pages)
until the production URL is decided.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 6

🧹 Nitpick comments (1)
docs/src/components/SyncExplainer/styles.module.css (1)

21-21: 🎯 Functional Correctness | 🔵 Trivial | ⚡ Quick win

Ignore CSS Modules pseudo-classes in Stylelint
:global is valid CSS Modules syntax; add global/local to selector-pseudo-class-no-unknown.ignorePseudoClasses (or use a CSS-Modules-aware config) instead of changing this selector.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@docs/src/components/SyncExplainer/styles.module.css` at line 21, Update the
Stylelint configuration’s selector-pseudo-class-no-unknown rule to ignore the
valid CSS Modules pseudo-classes global and local. Preserve the :global selector
in the .root styles and avoid changing the stylesheet selector.

Source: Linters/SAST tools

🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In @.github/workflows/docs.yaml:
- Line 27: Update the actions/checkout step in the docs workflow to set
persist-credentials to false, ensuring the GitHub token is not retained in
.git/config during subsequent pnpm install and pnpm build steps.

In `@docs/docusaurus.config.ts`:
- Around line 19-21: Update the Docusaurus configuration’s url and baseUrl
values to match the finalized deployment origin, using the GitHub Pages project
URL and corresponding repository subpath when a custom domain is not selected,
or the custom-domain root values when it is selected. Do not enable production
deployment until these values reflect the actual hosting target.

In `@docs/pnpm-workspace.yaml`:
- Around line 1-3: Replace the ignoredBuiltDependencies configuration in
pnpm-workspace.yaml with onlyBuiltDependencies, preserving `@swc/core` and core-js
in the allowlist so pnpm permits their build scripts in the docs workspace.

In `@docs/technical/architecture/overview.md`:
- Around line 6-12: Update the opening architecture description to distinguish
shared server-side storage from FW Lite’s local SQLite storage: state that
Lexbox and FwHeadless share the database and Mercurial repositories, while FW
Lite keeps a local project copy and synchronizes through Lexbox’s API. Keep the
component table consistent with this ownership and deployment boundary.

In `@docs/technical/development/index.md`:
- Line 23: Update the setup instructions around the `git push` command to remove
the write operation and use a read-only credential check such as `git ls-remote
origin HEAD` instead, while preserving the subsequent `task setup` step.

In `@docs/user-guide/faq.md`:
- Line 9: Update all seven FAQ question headings in the document, including “Do
I need a Lexbox account?” and the headings at the referenced locations, from
level-3 (`###`) to level-2 (`##`) headings. Leave the questions’ text and
surrounding content unchanged.

---

Nitpick comments:
In `@docs/src/components/SyncExplainer/styles.module.css`:
- Line 21: Update the Stylelint configuration’s selector-pseudo-class-no-unknown
rule to ignore the valid CSS Modules pseudo-classes global and local. Preserve
the :global selector in the .root styles and avoid changing the stylesheet
selector.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro Plus

Run ID: e32f3b1b-8032-4d4f-bbc0-3340e865134f

📥 Commits

Reviewing files that changed from the base of the PR and between e221be6 and 8ebc55a.

⛔ Files ignored due to path filters (5)
  • docs/pnpm-lock.yaml is excluded by !**/pnpm-lock.yaml
  • docs/static/img/error-example.png is excluded by !**/*.png
  • docs/static/img/favicon.png is excluded by !**/*.png
  • docs/static/img/logo-dark.svg is excluded by !**/*.svg
  • docs/static/img/logo.svg is excluded by !**/*.svg
📒 Files selected for processing (34)
  • .github/workflows/docs.yaml
  • AGENTS.md
  • DOCS-PLAN.md
  • README.md
  • docs/.gitignore
  • docs/docusaurus.config.ts
  • docs/package.json
  • docs/pnpm-workspace.yaml
  • docs/sidebars.ts
  • docs/src/components/SyncExplainer/index.tsx
  • docs/src/components/SyncExplainer/styles.module.css
  • docs/src/components/SyncExplainer/syncScenarios.ts
  • docs/src/css/custom.css
  • docs/src/pages/index.module.css
  • docs/src/pages/index.tsx
  • docs/technical/architecture/_category_.json
  • docs/technical/architecture/integrations.md
  • docs/technical/architecture/overview.md
  • docs/technical/ci-cd.md
  • docs/technical/development/_category_.json
  • docs/technical/development/index.md
  • docs/technical/development/setup-linux.md
  • docs/technical/development/setup-macos.md
  • docs/technical/development/setup-windows.md
  • docs/technical/index.md
  • docs/technical/sync/_category_.json
  • docs/technical/sync/crdt.md
  • docs/technical/sync/fwheadless-merge.md
  • docs/technical/sync/index.md
  • docs/tsconfig.json
  • docs/user-guide/faq.md
  • docs/user-guide/getting-started.md
  • docs/user-guide/how-sync-works.mdx
  • docs/user-guide/index.md

run:
working-directory: ./docs
steps:
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🔒 Security & Privacy | 🟠 Major | ⚡ Quick win

Disable checkout credential persistence.

The checkout action leaves the GitHub token in .git/config while pnpm install and pnpm build execute PR-controlled code. Set persist-credentials: false; no later step requires authenticated Git operations.

Suggested fix
       - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
+        with:
+          persist-credentials: false
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
with:
persist-credentials: false
🧰 Tools
🪛 zizmor (1.28.0)

[warning] 27-27: credential persistence through GitHub Actions artifacts (artipacked): does not set persist-credentials: false

(artipacked)

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In @.github/workflows/docs.yaml at line 27, Update the actions/checkout step in
the docs workflow to set persist-credentials to false, ensuring the GitHub token
is not retained in .git/config during subsequent pnpm install and pnpm build
steps.

Source: Linters/SAST tools

Comment thread docs/docusaurus.config.ts Outdated
Comment on lines +19 to +21
// Deploy target and DNS are still a team decision.
url: 'https://docs.lexbox.org',
baseUrl: '/',

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🎯 Functional Correctness | 🟠 Major | ⚡ Quick win

Choose the deployment origin before publishing.

url is hardcoded to https://docs.lexbox.org while the deployment target is still undecided. If GitHub Pages uses the project URL instead of that custom domain, baseUrl: '/' will also produce incorrect canonical URLs and asset/navigation paths. Set url and baseUrl to the final Pages/custom-domain values before enabling production deployment.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@docs/docusaurus.config.ts` around lines 19 - 21, Update the Docusaurus
configuration’s url and baseUrl values to match the finalized deployment origin,
using the GitHub Pages project URL and corresponding repository subpath when a
custom domain is not selected, or the custom-domain root values when it is
selected. Do not enable production deployment until these values reflect the
actual hosting target.

Comment thread docs/pnpm-workspace.yaml
Comment on lines +1 to +3
ignoredBuiltDependencies:
- '@swc/core'
- core-js

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🩺 Stability & Availability | 🟠 Major | ⚡ Quick win

🧩 Analysis chain

🏁 Script executed:

#!/bin/bash
set -euo pipefail

printf '\n== Files ==\n'
git ls-files docs/package.json docs/pnpm-workspace.yaml pnpm-workspace.yaml package.json

printf '\n== docs/pnpm-workspace.yaml ==\n'
cat -n docs/pnpm-workspace.yaml

printf '\n== docs/package.json (relevant lines) ==\n'
cat -n docs/package.json | sed -n '1,220p'

printf '\n== Search for Docusaurus Faster / future flags / pnpm config ==\n'
rg -n "docusaurus|faster|future flags|ignoredBuiltDependencies|onlyBuiltDependencies|`@swc/core`|core-js" -S .

Repository: myieye/languageforge-lexbox

Length of output: 50383


🌐 Web query:

pnpm ignoredBuiltDependencies onlyBuiltDependencies build scripts documentation

💡 Result:

In pnpm v11 and later, the settings ignoredBuiltDependencies, onlyBuiltDependencies, and neverBuiltDependencies have been removed and replaced by a unified allowBuilds configuration in pnpm-workspace.yaml [1][2]. The allowBuilds setting provides a single source of truth for controlling which dependencies are permitted to execute their lifecycle scripts (such as preinstall, install, or postinstall) during installation [2][3]. Key details regarding the transition and current usage: - Unified Configuration: allowBuilds is a map that associates package names with a boolean value: true to allow script execution, or false to disallow it [1][3]. - Migration: If you were previously using the deprecated settings, you should migrate them to the allowBuilds format [1][2]. For example: - Old configuration (deprecated): yaml onlyBuiltDependencies: - electron ignoredBuiltDependencies: - esbuild - New configuration (recommended): yaml allowBuilds: electron: true esbuild: false - Default Behavior: Packages not explicitly listed in allowBuilds are disallowed from running build scripts by default [3]. If a package attempts to run a script without being explicitly allowed, pnpm will print a warning or throw an error depending on the strictDepBuilds setting [2][3]. - Management Tools: You can use pnpm approve-builds to interactively manage these permissions [4]. Running this command will automatically update the allowBuilds configuration in your pnpm-workspace.yaml file [1][4]. - Configuration Location: Since pnpm v11, these settings are no longer read from the pnpm field in package.json and must be defined in pnpm-workspace.yaml [5].

Citations:


🌐 Web query:

Docusaurus Faster pnpm ignoredBuiltDependencies onlyBuiltDependencies install guidance swc core-js

💡 Result:

In pnpm v11+, the legacy settings onlyBuiltDependencies and ignoredBuiltDependencies have been removed [1][2]. They have been replaced by a single configuration field called allowBuilds in pnpm-workspace.yaml [1][2]. If you are upgrading to or using pnpm v11, you must migrate your configuration [2]: // Old configuration (deprecated/removed) onlyBuiltDependencies: - electron ignoredBuiltDependencies: - esbuild // New configuration (pnpm v11+) allowBuilds: electron: true esbuild: false For Docusaurus, "Docusaurus Faster" is a suite of performance optimizations that is now stable and recommended [3]. In Docusaurus 3.10+, you should update your docusaurus.config.js to use the faster flag instead of the legacy experimental_faster flag [3]: const config = { future: { faster: true, // Replaces experimental_faster: true }, }; These optimizations include switching to SWC for JS/CSS transpilation and minification, among other tools, which effectively replace older Babel or Terser-based approaches [4][3]. If you are manually managing core-js or other dependencies, ensure they are correctly set in your allowBuilds configuration if they require build scripts to execute during installation [1][2]. top_results: [1][2][4][3]

Citations:


🏁 Script executed:

#!/bin/bash
set -euo pipefail

printf '\n== frontend/pnpm-workspace.yaml ==\n'
cat -n frontend/pnpm-workspace.yaml | sed -n '1,120p'

printf '\n== Search for workspace build-script settings in repo ==\n'
rg -n "^(ignoredBuiltDependencies|onlyBuiltDependencies|neverBuiltDependencies|allowBuilds):" -S --glob '*/pnpm-workspace.yaml' .

Repository: myieye/languageforge-lexbox

Length of output: 1551


🌐 Web query:

site:docusaurus.io Docusaurus Faster pnpm ignoredBuiltDependencies @swc/core core-js

💡 Result:

When using Docusaurus Faster, which leverages tools like Rspack and SWC for improved build performance, you may encounter issues with pnpm's strict dependency management [1][2]. Because Docusaurus Faster relies on specific versions of packages like @swc/core and core-js, pnpm's default behavior may attempt to restrict their installation or execution if they are considered "built dependencies" or if they interact with the package manager's security settings [1]. To resolve this, you should configure your.npmrc file (specifically for pnpm) to allow these packages to be built. The official Docusaurus documentation recommends the following pnpm configuration to ensure compatibility with Docusaurus Faster [1]: allowBuilds: '@swc/core': true core-js-pure: true core-js: true This configuration explicitly permits pnpm to run build scripts for these specific packages, which is often required because Docusaurus Faster expects them to be fully available and functional as part of the modernized build pipeline [1]. Ensure that your pnpm setup also respects other relevant security settings (such as trustPolicy) as recommended in your project's specific environment [1].

Citations:


Allow these build scripts in the docs workspace. ignoredBuiltDependencies blocks @swc/core and core-js, but Docusaurus Faster needs those installs to run cleanly under pnpm 10.24.0. Switch this to onlyBuiltDependencies so clean installs keep the SWC binding available and docusaurus build doesn’t fail.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@docs/pnpm-workspace.yaml` around lines 1 - 3, Replace the
ignoredBuiltDependencies configuration in pnpm-workspace.yaml with
onlyBuiltDependencies, preserving `@swc/core` and core-js in the allowlist so pnpm
permits their build scripts in the docs workspace.

Comment thread docs/technical/architecture/overview.md Outdated
Comment on lines +6 to +12
Three things live in this repo, and they share one database and one set of Mercurial repositories.

| Part | What it is |
| --- | --- |
| **Lexbox** (formerly Language Depot) | The web app and project host: user/org/project management, permissions, and the server side of both sync protocols. SvelteKit UI in front of a .NET API. |
| **FieldWorks Lite** (FW Lite) | A lightweight dictionary editor for desktop, mobile and browser. Keeps a local SQLite copy of the project and syncs it to Lexbox as CRDT commits. |
| **FwHeadless** | The server-side bridge between the CRDT world (FW Lite) and the Mercurial world (classic FieldWorks). It runs the merge job that reconciles the two. |

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🎯 Functional Correctness | 🟠 Major | ⚡ Quick win

Correct the shared-storage description.

The opening sentence says Lexbox, FW Lite, and FwHeadless share one database and Mercurial repository set, but FW Lite uses a local SQLite copy and synchronizes through the API. This can mislead implementers about data ownership and deployment boundaries.

Proposed wording
-Three things live in this repo, and they share one database and one set of Mercurial repositories.
+Three major components live in this repo. Lexbox and FwHeadless share the server-side database and Mercurial repositories; FW Lite keeps a local SQLite project copy and synchronizes through the API.
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
Three things live in this repo, and they share one database and one set of Mercurial repositories.
| Part | What it is |
| --- | --- |
| **Lexbox** (formerly Language Depot) | The web app and project host: user/org/project management, permissions, and the server side of both sync protocols. SvelteKit UI in front of a .NET API. |
| **FieldWorks Lite** (FW Lite) | A lightweight dictionary editor for desktop, mobile and browser. Keeps a local SQLite copy of the project and syncs it to Lexbox as CRDT commits. |
| **FwHeadless** | The server-side bridge between the CRDT world (FW Lite) and the Mercurial world (classic FieldWorks). It runs the merge job that reconciles the two. |
Three major components live in this repo. Lexbox and FwHeadless share the server-side database and Mercurial repositories; FW Lite keeps a local SQLite project copy and synchronizes through the API.
| Part | What it is |
| --- | --- |
| **Lexbox** (formerly Language Depot) | The web app and project host: user/org/project management, permissions, and the server side of both sync protocols. SvelteKit UI in front of a .NET API. |
| **FieldWorks Lite** (FW Lite) | A lightweight dictionary editor for desktop, mobile and browser. Keeps a local SQLite copy of the project and syncs it to Lexbox as CRDT commits. |
| **FwHeadless** | The server-side bridge between the CRDT world (FW Lite) and the Mercurial world (classic FieldWorks). It runs the merge job that reconciles the two. |
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@docs/technical/architecture/overview.md` around lines 6 - 12, Update the
opening architecture description to distinguish shared server-side storage from
FW Lite’s local SQLite storage: state that Lexbox and FwHeadless share the
database and Mercurial repositories, while FW Lite keeps a local project copy
and synchronizes through Lexbox’s API. Keep the component table consistent with
this ownership and deployment boundary.

Comment thread docs/technical/development/index.md Outdated
* [Linux setup](./setup-linux.md)
* [macOS setup](./setup-macos.md)

Then run `git push` once to confirm your GitHub credentials work, and `task setup`, which initializes `local.env`, points Git at the ignore-revs file, and downloads the FLEx seed-data repo.

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🗄️ Data Integrity & Integration | 🟠 Major | ⚡ Quick win

Do not use git push as a setup credential check.

This can publish unintended commits to the remote repository. Remove it or replace it with a read-only check such as git ls-remote origin HEAD.

Proposed wording
-Then run `git push` once to confirm your GitHub credentials work, and `task setup`, which initializes `local.env`, points Git at the ignore-revs file, and downloads the FLEx seed-data repo.
+Verify repository access with a read-only command such as `git ls-remote origin HEAD`, then run `task setup`, which initializes `local.env`, points Git at the ignore-revs file, and downloads the FLEx seed-data repo.
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
Then run `git push` once to confirm your GitHub credentials work, and `task setup`, which initializes `local.env`, points Git at the ignore-revs file, and downloads the FLEx seed-data repo.
Verify repository access with a read-only command such as `git ls-remote origin HEAD`, then run `task setup`, which initializes `local.env`, points Git at the ignore-revs file, and downloads the FLEx seed-data repo.
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@docs/technical/development/index.md` at line 23, Update the setup
instructions around the `git push` command to remove the write operation and use
a read-only credential check such as `git ls-remote origin HEAD` instead, while
preserving the subsequent `task setup` step.

Comment thread docs/user-guide/faq.md Outdated
Common questions about FieldWorks Lite. Questions about syncing are answered on
[How sync works](/user-guide/how-sync-works).

### Do I need a Lexbox account?

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

📐 Maintainability & Code Quality | 🟡 Minor | ⚡ Quick win

Use level-2 headings for the FAQ questions.

The rendered document already has a title heading, so these top-level questions should use ##, not ###. Apply the same change to all seven question headings to resolve the reported MD001 violation.

Proposed fix
-### Do I need a Lexbox account?
+## Do I need a Lexbox account?

Also applies to: 15-15, 22-22, 27-27, 32-32, 39-39, 47-47

🧰 Tools
🪛 markdownlint-cli2 (0.23.1)

[warning] 9-9: Heading levels should only increment by one level at a time
Expected: h2; Actual: h3

(MD001, heading-increment)

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@docs/user-guide/faq.md` at line 9, Update all seven FAQ question headings in
the document, including “Do I need a Lexbox account?” and the headings at the
referenced locations, from level-3 (`###`) to level-2 (`##`) headings. Leave the
questions’ text and surrounding content unchanged.

Source: Linters/SAST tools

persist-credentials off in the docs workflow checkout, correct the
shared-storage claim in the system overview, read-only credential check
in the dev setup, FAQ headings to level 2.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
@myieye

myieye commented Jul 29, 2026

Copy link
Copy Markdown
Owner Author

[Claude, autonomous]

Applied 4 of the 6 review suggestions (persist-credentials, overview wording, read-only credential check, FAQ heading levels). Two dismissed:

  • Hardcoded site URL: made env-overridable (DOCS_URL/DOCS_BASE_URL) in 23ec7d0, which landed after the reviewed commit; the production URL itself is a pending team decision recorded in DOCS-PLAN.md.
  • ignoredBuiltDependenciesonlyBuiltDependencies: clean installs and builds are proven green with the current setting (four CI runs on ubuntu plus local Windows builds). @swc/core ships prebuilt platform binaries, so its install script is a fallback we don't need to run.

myieye and others added 3 commits July 29, 2026 20:53
Empty split parts produced duplicate position keys; skip them and count
the ** markers when advancing.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Correct the platform list (no Mac or iOS builds ship), add a scenario
step disclosing that the FW Lite Sync button and the project page's
'Sync FieldWorks Lite' are the same action, and add a 'Where you'll see
this in the app' section mapping each leg to its dialog tab, statuses,
and buttons.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
);
};

const SyncExplainer = (): ReactNode => {

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

`SyncExplainer` has a cyclomatic complexity of 6 with "medium" risk


A function with high cyclomatic complexity can be hard to understand and
maintain. Cyclomatic complexity is a software metric that measures the number of
independent paths through a function. A higher cyclomatic complexity indicates
that the function has more decision points and is more complex.

The always-reserved space read as a dead gap between the device box and
leg 1, worst on mobile. Also tell pure-FieldWorks-Lite teams up front
that legs 2 and 3 don't concern them.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
isChecked: (id: CheckableNodeId) => boolean;
}

const Topology = ({

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

`Topology` has a cyclomatic complexity of 6 with "medium" risk


A function with high cyclomatic complexity can be hard to understand and
maintain. Cyclomatic complexity is a software metric that measures the number of
independent paths through a function. A higher cyclomatic complexity indicates
that the function has more decision points and is more complex.

);
};

const SyncExplainer = (): ReactNode => {

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

`SyncExplainer` has a cyclomatic complexity of 7 with "medium" risk


A function with high cyclomatic complexity can be hard to understand and
maintain. Cyclomatic complexity is a software metric that measures the number of
independent paths through a function. A higher cyclomatic complexity indicates
that the function has more decision points and is more complex.

- Ground "Lexbox" for FieldWorks Lite users in the user-guide index and a new
  FAQ, so the FWL guide stays self-contained and doesn't assume readers know
  or visit Lexbox.
- Explain the sync snapshot as the JSON file recording the last merged state
  (the diff baseline, and the "have we synced before?" flag), instead of using
  the bare term "ProjectSnapshot".
- Make the explainer diagram interactive: the three leg triggers are now
  tap/click toggletips (touch + keyboard + screen-reader friendly) that reveal
  where the Sync button lives and that its two names are the same action.
- Color the diagram's leg numbers at rest to match the numbered table below,
  so a leg in the diagram ties to its row.
- Put the caption and stepper directly under the diagram in one "player" card
  so the controls read as driving the picture; compact the phone layout and
  scroll the player into view on select so the diagram and Next are co-visible.
- Turn the diagram vertical by container width (not viewport) so the wide
  horizontal layout never overflows the docs column into the sidebars.
- Give the page real section headings so "On this page" lists the first
  section instead of starting mid-page.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01TZKRnigoAXxEWZVJFrto1k
</div>
);

const Connector = ({

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

`Connector` has a cyclomatic complexity of 8 with "medium" risk


A function with high cyclomatic complexity can be hard to understand and
maintain. Cyclomatic complexity is a software metric that measures the number of
independent paths through a function. A higher cyclomatic complexity indicates
that the function has more decision points and is more complex.

);
};

const SyncExplainer = (): ReactNode => {

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

`SyncExplainer` has a cyclomatic complexity of 8 with "medium" risk


A function with high cyclomatic complexity can be hard to understand and
maintain. Cyclomatic complexity is a software metric that measures the number of
independent paths through a function. A higher cyclomatic complexity indicates
that the function has more decision points and is more complex.

myieye and others added 2 commits August 13, 2026 13:33
/user-guide/ becomes /fw-lite/ (old URLs redirect client-side) and a new
/lexbox/ section covers accounts, project hosting, Send/Receive, members
and roles, organizations, and a manager-facing FieldWorks Lite bridge
page; the homepage routes readers with product tiles. Also fixes
admonition titles to the Docusaurus 3 bracket syntax - the old
space-separated titles rendered as literal ::: text.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Corrections verified against the code:
- CI/CD: staging deploys before integration tests and tests don't gate
  production (approval does); fw-lite also publishes Android; FwHeadless is
  a deployed workload. Same fixes in .github/AGENTS.md, which the docs copied.
- develop hg/resumable hostnames per the ingress (also deployment/README.md)
- task k8s: prefixes for the forward tasks (also README.md)
- FwHeadless flowchart: pre-merge Harmony sync only runs when a snapshot exists
- CRDT sync: the queue doesn't dedup; listener start moved to SyncService
- Lexbox UI facts: New Word button, no Open button, early access on
  wheresMyProject, ask-to-join is org-scoped, org invites need the Invite
  checkbox, project suggestions are org-scoped, Viewer on FieldWorks projects
- "Lexbox" spelling in the sync pages; Nitro (ex Banana Cake Pop)
- lexbox/fw-lite.md now names both sync buttons and says they're the same
- docs.yaml sets DOCS_URL/DOCS_BASE_URL from the repo so a Pages deploy
  works before the final docs home is decided

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants