Skip to main content
. Not present in production builds. Safe no-op in prod. */ body { padding: 0 !important; } /* Colors Used #3CB540 - Jade Green #2b9a66 - Light Green #18794E - Dark Green Complementary Greens See https://coolors.co/004225-1a794e-08a045-3cb540-62ba4f #004225 - Deep Forrest #1A794E - Turf Green #08A045 - Medium Jungle #3CB540 - Jade Green #6BBF59 - Moss Green See https://coolors.co/0c0c0c-073b3a-1a794e-08a045-6bbf59 #0C0C0C - Onyx Black #073B3A - Dark Teal #1A794E - Turf Green #08A045 - Medium Jungle #6BBF59 - Moss Green See https://coolors.co/fffffa-073b3a-1a794e-08a045-6bbf59 #FFFFFA - Porcelain #073B3A - Dark Teal #1A794E - Turf Green #08A045 - Medium Jungle #6BBF59 - Moss Green Pink Offset Colour See https://coolors.co/073b3a-1a794e-f61067-08a045-6bbf59 #F61067 - Razzmatazz Pink #073B3A - Dark Teal #1A794E - Turf Green #08A045 - Medium Jungle #6BBF59 - Moss Green */ /* ============================================ GLOBAL THEME VARIABLES Component governance source of truth ============================================ */ :root { --lp-color-accent: #3cb540; --lp-color-accent-strong: #18794e; --lp-color-accent-soft: #6bbf59; --lp-color-accent-bright: #5dd662; --lp-color-accent-brightest: #a0f0a5; --lp-color-arbitrum: #3ea6f8; --lp-color-text-primary: #181c18; --lp-color-text-secondary: #717571; --lp-color-text-muted: #9ca3af; --lp-color-bg-page: #ffffff; --lp-color-bg-card: #f9fafb; --lp-color-bg-elevated: #f3f6f4; --lp-color-bg-subtle: rgba(24, 28, 24, 0.04); --lp-color-bg-overlay: rgba(12, 12, 12, 0.5); --lp-color-border-default: #e5e7eb; --lp-color-border-strong: rgba(24, 28, 24, 0.18); --lp-color-border-inverse: rgba(255, 255, 255, 0.5); --lp-color-on-accent: #ffffff; --lp-color-link: #18794e; --lp-color-link-hover: #004225; --lp-color-brand-discord: #5865f2; --lp-color-brand-forum: #00aeef; --lp-color-brand-github: #181c18; --lp-color-brand-x: #181c18; --lp-color-brand-globe: #00c0ff; --lp-color-brand-twitch: #9048ff; --lp-color-brand-youtube: #ff0034; --lp-color-brand-instagram: #dc2275; --lp-color-brand-linkedin: #0189df; --lp-color-brand-preview: #b636dd; --lp-color-brand-coming-soon: #ef1a73; --lp-color-brand-linux: #ff9a0e; --lp-color-brand-windows: #14bbf7; --lp-color-brand-macos: #60ba47; --lp-color-status-good: #22c55e; --lp-color-status-warn: #fbbf24; --lp-color-status-bad: #ef4444; --lp-spacing-1: 0.25rem; --lp-spacing-2: 0.5rem; --lp-spacing-3: 0.75rem; --lp-spacing-4: 1rem; --lp-spacing-6: 1.5rem; --lp-spacing-8: 2rem; --lp-spacing-px-3: 3px; --lp-spacing-px-4: 4px; --lp-spacing-px-6: 6px; --lp-spacing-px-8: 8px; --lp-spacing-px-12: 12px; --lp-font-sans: 'Inter', 'Segoe UI', sans-serif; --lp-font-mono: 'SFMono-Regular', 'SF Mono', 'Menlo', monospace; --lp-radius-sm: 0.25rem; --lp-radius-md: 0.5rem; --lp-radius-lg: 0.75rem; --lp-shadow-card: 0 8px 24px rgba(24, 28, 24, 0.08); --lp-z-base: 1; --lp-z-overlay: 10; --lp-z-modal: 50; /* Legacy aliases maintained during migration */ --accent: var(--lp-color-accent); --accent-dark: var(--lp-color-accent-strong); --hero-text: var(--lp-color-text-primary); --text: var(--lp-color-text-secondary); --text-secondary: var(--lp-color-text-secondary); --muted-text: var(--lp-color-text-muted); --background: var(--lp-color-bg-page); --card-background: var(--lp-color-bg-card); --background-highlight: var(--lp-color-bg-subtle); --border: var(--lp-color-border-default); --button-text: var(--lp-color-on-accent); --page-header-description-color: var(--lp-color-text-secondary); --arbitrum: var(--lp-color-arbitrum); } .dark { --lp-color-accent: #2b9a66; --lp-color-accent-strong: #18794e; --lp-color-accent-soft: #3cb540; --lp-color-accent-bright: #5dd662; --lp-color-accent-brightest: #7fe584; --lp-color-text-primary: #e0e4e0; --lp-color-text-secondary: #a0a4a0; --lp-color-text-muted: #6b7280; --lp-color-bg-page: #0d0d0d; --lp-color-bg-card: #1a1a1a; --lp-color-bg-elevated: #141a16; --lp-color-bg-subtle: rgba(255, 255, 255, 0.1); --lp-color-bg-overlay: rgba(0, 0, 0, 0.5); --lp-color-border-default: #333333; --lp-color-border-strong: rgba(255, 255, 255, 0.3); --lp-color-border-inverse: rgba(255, 255, 255, 0.5); --lp-color-on-accent: #ffffff; --lp-color-link: #5dd662; --lp-color-link-hover: #a0f0a5; --lp-color-brand-github: #f0f0f0; /* Legacy aliases maintained during migration */ --accent: var(--lp-color-accent); --accent-dark: var(--lp-color-accent-strong); --hero-text: var(--lp-color-text-primary); --text: var(--lp-color-text-secondary); --text-secondary: var(--lp-color-text-secondary); --muted-text: var(--lp-color-text-muted); --background: var(--lp-color-bg-page); --card-background: var(--lp-color-bg-card); --background-highlight: var(--lp-color-bg-subtle); --border: var(--lp-color-border-default); --button-text: var(--lp-color-on-accent); --page-header-description-color: var(--lp-color-text-secondary); --arbitrum: var(--lp-color-arbitrum); } /* ============================================ */ /* Code block themes hiki codeblock themes: Popular Dark Themes: github-dark (what you have now) github-dark-dimmed github-dark-high-contrast dracula dracula-soft monokai nord one-dark-pro poimandres rose-pine everforest-dark vitesse-dark Popular Light Themes: github-light (what you have now) github-light-high-contrast solarized-light rose-pine-dawn everforest-light vitesse-light */ /* img[alt="dark logo"], img[alt="light logo"] { max-width: 180px; } */ /* V2 TEST */ /* a.nav-tabs-item[href="/pages/resources/resources_hub.mdx"], a.nav-tabs-item[href="/pages/08_help/README"] { color: rgba(255, 90, 90, 0.342) !important; } */ /* Make the nav-tabs container full width */ .nav-tabs { width: 100%; justify-content: flex-start; } /* Fix Mintlify content width and centering. Regular pages: balance padding + widen inner cap. Portal/frame pages: balance padding (smaller) + widen inner cap for full-width hero. */ @media (min-width: 1024px) { /* Regular pages */ #content-container:not(:has(.frame-mode-hero-full)):not( :has(.frame-mode-container) ) { padding-left: 3rem !important; padding-right: 3rem !important; } #content-container:not(:has(.frame-mode-hero-full)):not( :has(.frame-mode-container) ) > .max-w-5xl { max-width: 72rem !important; } /* Portal/frame pages — tighter balanced padding, wider inner cap */ #content-container:has(.frame-mode-hero-full), #content-container:has(.frame-mode-container) { padding-left: 2rem !important; padding-right: 2rem !important; } #content-container:has(.frame-mode-hero-full) > .max-w-5xl, #content-container:has(.frame-mode-container) > .max-w-5xl { max-width: 80rem !important; } } #navbar > div.z-10.mx-auto.relative > div.hidden.lg\:flex.px-12.h-12 > div { column-gap: 2rem !important; } a.nav-tabs-item[href*='/internal/'] { margin-left: 1rem; margin-right: -1rem; padding-right: 0; border-bottom-color: transparent !important; } /* .gap-x-6 { column-gap: 2rem !important; } */ /* .nav-tabs h-full flex text-sm gap-x-6 { column-gap: 2rem !important; } */ /* Push Resource HUB to the right and style as outlined button */ a.nav-tabs-item[href$='/resources/redirect'], a.nav-tabs-item[href$='/resources/portal'], a.nav-tabs-item[href$='/07_resources/redirect'], a.nav-tabs-item[href$='/07_resources/portal'] { margin-left: auto; background-color: transparent; border: 1px solid var(--accent) !important; padding: 4px 8px; border-radius: 4px; font-size: 0.7rem; height: auto !important; align-self: center; margin-right: -2rem; } /* Color the text */ /* a.nav-tabs-item[href="/v2/resources/resources_hub"] { color: #2b9a66 !important; } */ /* Shrink & color the icon */ a.nav-tabs-item[href$='/resources/redirect'] svg, a.nav-tabs-item[href$='/resources/portal'] svg, a.nav-tabs-item[href$='/07_resources/redirect'] svg, a.nav-tabs-item[href$='/07_resources/portal'] svg, a.nav-tabs-item[href$='/07_resources/resources_hub'] svg { height: 0.75rem; width: 0.75rem; /* background-color: #2b9a66 !important; */ } /* Hide the underline on the button */ a.nav-tabs-item[href$='/resources/redirect'] > div:last-child, a.nav-tabs-item[href$='/resources/portal'] > div:last-child, a.nav-tabs-item[href$='/07_resources/redirect'] > div:last-child, a.nav-tabs-item[href$='/07_resources/portal'] > div:last-child, a.nav-tabs-item[href$='/07_resources/resources_hub'] > div:last-child { display: none; } /* Stack footer links vertically */ #footer .flex-col .flex.gap-4 { flex-direction: column !important; gap: 0rem !important; } /* Reduce footer padding */ #footer > div { padding-top: 2rem !important; padding-bottom: 1rem !important; } /* Accessibility: prevent hidden assistant sheet from receiving focus */ #chat-assistant-sheet[aria-hidden='true'] { display: none !important; } /* Accessibility: ensure CTA buttons meet minimum target size */ button.text-left.text-gray-600.text-sm.font-medium { min-height: 24px; padding-top: 4px; padding-bottom: 4px; } /* #footer > div > div:first-child { display: flex; flex-direction: row !important; color: red !important; } #footer > div > div:first-child > div { display: flex; flex-direction: row !important; color: green !important; } */ /* Fix bad styling of cards with arrows */ [data-component-part='card-content-container'] { padding-right: 2.5rem; /* Creates space for the arrow */ } /* Reposition View component dropdown */ /* To find the correct selector: 1. Open your page with View components in the browser 2. Right-click on the dropdown in the top-right corner 3. Select "Inspect Element" 4. Find the class name or data attribute 5. Replace the selector below with the actual one */ /* Common possible selectors - uncomment and adjust the one that works */ /* Option 1: If it has a data attribute */ /* [data-view-dropdown] { position: relative !important; top: 60px !important; right: 20px !important; } */ /* Option 2: If it's in a fixed container */ /* .fixed [class*="view"] { position: relative !important; top: 60px !important; } */ /* Option 3: Target by position (fixed elements in top-right) */ /* .fixed.top-0.right-0 [class*="select"], .fixed.top-0.right-0 [class*="dropdown"] { position: relative !important; top: 60px !important; margin-right: 20px !important; } */ /* Option 4: Move it inline with content instead of fixed position */ /* Replace 'ACTUAL_SELECTOR' with the real class name from browser inspection */ /* ACTUAL_SELECTOR { position: static !important; display: inline-block !important; margin-bottom: 20px !important; } */ .code-block > div > div > svg { background-color: #18794e !important; } /* Error 404 Styling */ #error-description > span > div > div { border: 1px solid #18794e !important; } body > div.relative.antialiased.text-gray-500.dark\:text-gray-400 > div.peer-\[\.is-not-custom\]\:lg\:flex.peer-\[\.is-custom\]\:\[\&\>div\:first-child\]\:\!hidden.peer-\[\.is-custom\]\:\[\&\>div\:first-child\]\:sm\:\!hidden.peer-\[\.is-custom\]\:\[\&\>div\:first-child\]\:md\:\!hidden.peer-\[\.is-custom\]\:\[\&\>div\:first-child\]\:lg\:\!hidden.peer-\[\.is-custom\]\:\[\&\>div\:first-child\]\:xl\:\!hidden > div.flex.flex-col.items-center.justify-center.w-full.max-w-lg.overflow-x-hidden.mx-auto.py-48.px-5.text-center.\*\:text-center.gap-y-8.not-found-container > div { margin-top: -5rem; } #error-description > span > div > div > div.relative.rounded-xl.overflow-hidden.flex.justify-center > img { width: 500px; aspect-ratio: 4 / 3; object-fit: cover; /* border: 1px solid #fff; */ } /* Step List Color Icons Styling */ /* #content > div.steps > div > div.absolute.ml-\[-13px\].py-2 > div { background-color: #18794e !important; } */ /* Step List Color Titles */ #content > div.steps.ml-3\.5.mt-10.mb-6 > div > div.w-full.overflow-hidden.pl-8.pr-px > p { color: #2b9a66 !important; } /* View Dropdown */ /* #radix-_R_5slubt9fen9fdb_ */ /* Turn off bg-white in dark mode for multi-view dropdown (PALM THEME BUG) */ .dark .bg-white\/\[0\.95\].multi-view-dropdown-trigger { background-color: transparent !important; background: none !important; } /* Sidebar collapse button - bigger and easier to click */ /* #sidebar button.absolute { min-width: 2.5rem !important; min-height: 2.5rem !important; padding: 0.75rem !important; z-index: 100 !important; } */ /* Override US flag with UK flag in language selector */ /* Hide the original img and use background-image instead */ /* #localization-select-trigger img[alt="US"], #localization-select-item-en img[alt="US"], img[alt="US"][src*="flags/US.svg"] { opacity: 0 !important; position: relative !important; } #localization-select-trigger img[alt="US"]::before, #localization-select-item-en img[alt="US"]::before, img[alt="US"][src*="flags/US.svg"]::before { content: "" !important; position: absolute !important; top: 0 !important; left: 0 !important; width: 100% !important; height: 100% !important; background-image: url("/snippets/assets/media/images/site/united-kingdom-flag-icon.svg") !important; background-size: cover !important; background-position: center !important; border-radius: 50% !important; opacity: 1 !important; } */ /* Hide the panel on frame mode pages (MINTLIFY SUCKS) */ /* Hide empty table of contents layout only when it's empty */ #table-of-contents-layout:empty, #content-side-layout:has(#table-of-contents-layout:empty) { display: none; } /* DynamicTable: force fixed layout so columnWidths prop values take effect. Mintlify's Tailwind prose resets table-layout to auto — !important required. */ [data-docs-dynamic-table] { table-layout: fixed !important; } /* StyledTable should sit flush inside its own border shell. Mint wraps rendered tables in a scroll container with vertical padding, which creates a false gap above/below the header row. */ [data-docs-styled-table-shell] > div { padding-top: 0 !important; padding-bottom: 0 !important; margin-top: 0 !important; margin-bottom: 0 !important; } /* BorderedBox should own its internal spacing. Trim default block margins on the first/last rendered child so headings and paragraphs do not add a false gap inside the padded shell. */ [data-docs-bordered-box] > :first-child { margin-top: 0 !important; } [data-docs-bordered-box] > :last-child { margin-bottom: 0 !important; } [data-docs-bordered-box][data-accent-bar]::before { content: ""; position: absolute; top: 0; bottom: 0; left: 0; width: 4px; background-color: var(--accent-bar-color); border-radius: inherit; border-top-right-radius: 0; border-bottom-right-radius: 0; } /* Frame mode container - 80% of #content-container width, centered */ /* Breaks out of #content padding to center in full #content-container */ .frame-mode-container { width: calc(100% + 96px + 20px); /* 976px */ margin-left: -96px; margin-right: -20px; margin-bottom: 2rem; padding-left: 15%; /* Adjust this for desired content width */ padding-right: 15%; /* Adjust this for desired content width */ box-sizing: border-box; } /* Frame mode container inside hero - already broken out, so reset */ .frame-mode-hero-full .frame-mode-container { width: 100%; margin-left: 0; margin-right: 0; padding-left: 0%; padding-right: 0%; } /* Pagination on frame mode pages ONLY - match container padding */ [data-page-mode='frame'] #pagination { width: calc(100% + 96px + 20px); margin-left: -96px; margin-right: -20px; padding-left: calc((100% + 96px + 20px) * 0.1 + 96px); padding-right: calc((100% + 96px + 20px) * 0.1 + 20px); box-sizing: border-box; } /* Hero full width - breaks out of #content padding to fill #content-container */ .frame-mode-hero-full { width: calc(100% + 96px + 20px); margin-left: -96px; margin-right: -20px; position: relative; } @media (max-width: 1023px) { .frame-mode-container { width: 100%; margin-left: 0; margin-right: 0; padding-left: 1rem; padding-right: 1rem; } [data-page-mode='frame'] #pagination { width: 100%; margin-left: 0; margin-right: 0; padding-left: 1rem; padding-right: 1rem; } .frame-mode-hero-full { width: 100%; margin-left: 0; margin-right: 0; } } #starfield { position: absolute; inset: 0; width: 100%; height: 100%; pointer-events: none; z-index: 0; } /* Target the card content container */ .frame-mode-hero-full [data-component-part='card-content-container'] { padding-top: 0.5rem; padding-bottom: 0.5rem; padding-left: 1rem; padding-right: 2.5rem; /* Space for arrow icon (0.75rem right + icon width ~1rem + margin) */ } /* Target the arrow icon */ .frame-mode-hero-full #card-link-arrow-icon { top: 0.75rem; right: 0.75rem; } /* #content > div.frame-mode-hero-full > div.frame-mode-container > div > div:nth-child(2) > div > div > div:nth-child(4) > a > div { padding-top: 0.5rem; padding-bottom: 0.5rem; } #content > div.frame-mode-hero-full > div.frame-mode-container > div > div:nth-child(2) > div > div > div:nth-child(4) > a > div > #card-link-arrow-icon { top: 0.75rem; right: 0.75rem; } */ /* ============================================ ACCESSIBILITY — Focus indicators ============================================ */ input:focus-visible, select:focus-visible, textarea:focus-visible, button:focus-visible, a:focus-visible, [tabindex]:focus-visible { outline: 2px solid var(--accent) !important; outline-offset: 2px; } /* ============================================ ACCESSIBILITY — Responsive breakpoints ============================================ */ @media (max-width: 767px) { .frame-mode-hero-full { width: 100%; max-width: 100%; overflow-x: hidden; } } @media (max-width: 480px) { #content { padding-left: 1rem; padding-right: 1rem; } } /* ============================================ UTILITY CLASSES — inline element styling Used where components can't replace inline spans (e.g., inside Mintlify , components) ============================================ */ .lp-inline-flex { display: flex; align-items: center; } .lp-text-muted { color: var(--lp-color-text-secondary); } .lp-text-italic-muted { font-style: italic; color: var(--lp-color-text-secondary); } .lp-inline-flex-gap { display: flex; align-items: center; gap: 0.2rem; } .lp-link-underline { border-bottom: 1.5px solid var(--lp-color-text-primary); color: var(--lp-color-text-primary); padding-bottom: 0.25rem; }
lpd is the repository CLI for setup, local docs development, governed page moves, testing, hooks, and managed script execution.
Use bash lpd ... until you have run bash lpd setup --yes and confirmed lpd is on your PATH. After that, plain lpd ... is the normal form.
lpd dev defaults to port 3333 when no port is provided. Agent sessions may not use port 3333 via lpd dev, and direct Mint launcher sessions may not use port 3000.

What lpd does

lpd standardizes the main contributor workflows for this repo:
  • bootstrap local dependencies
  • sync the repo planning skill into the local Codex skills directory
  • verify your environment
  • run Mint locally
  • launch scoped docs previews for large navs
  • load alternate docs config files through scoped dev or the custom loader alias
  • run tests and CI-like checks
  • manage hooks
  • move pages with governed docs-path sync
  • discover and run repo-managed scripts

Most common workflows

Start local docs

bash lpd setup --yes
lpd dev -- --port 3333
bash lpd setup --yes installs tools/tests dependencies, refreshes hooks, optionally installs lpd on PATH, and syncs agentic-project-management-orchestrator into $CODEX_HOME/skills (fallback: ~/.codex/skills).

Start a scoped Mint session

bash lpd dev --scoped --scope-version v2 --scope-language en --scope-prefix v2/orchestrators

Load an alternate docs config

bash lpd dev --scoped --docs-config docs-orch-work.json
bash lpd dev --scoped --docs-config docs-gate-work.json

Use the custom Mint loader helper

bash tools/dev/preview/mint-custom-loader.sh docs-orch-work.json

Run pre-PR checks

lpd doctor --strict
lpd test --staged
lpd ci --skip-browser

Move a page with governed rewrites

bash lpd move-page v2/orchestrators/setup/old.mdx v2/orchestrators/get-started/new.mdx --check

Command quick index

Command guide

bash lpd setup
command
Bootstrap the local repo environment.Usage
bash lpd setup [--yes] [--no-tools] [--no-tests] [--no-hooks] [--with-mintlify] [--no-cli] [--no-codex-skills] [--json]
What it does
  • installs tools dependencies
  • installs tests dependencies
  • installs or refreshes git hooks
  • optionally installs Mintlify globally
  • optionally installs lpd on your PATH
  • syncs agentic-project-management-orchestrator into $CODEX_HOME/skills (fallback: ~/.codex/skills)
Examples
bash lpd setup --yes
bash lpd setup --no-tests --no-cli
bash lpd setup --yes --no-codex-skills
bash lpd setup --with-mintlify
Flags
--yes
boolean
default:"false"
Run setup non-interactively with default choices.
--no-tools
boolean
default:"false"
Skip cd tools && npm install.
--no-tests
boolean
default:"false"
Skip cd operations/tests && npm install.
--no-hooks
boolean
default:"false"
Skip .githooks/install.sh.
--with-mintlify
boolean
default:"false"
Run npm i -g mintlify.
--no-cli
boolean
default:"false"
Skip PATH installation for lpd.
--no-codex-skills
boolean
default:"false"
Skip syncing agentic-project-management-orchestrator into the local Codex skills directory.
--json
boolean
default:"false"
Emit the standard JSON status envelope.
lpd doctor
command
Check whether your repo and local environment are ready.Usage
lpd doctor [--strict] [--json]
Checks
  • git repository context
  • Node availability
  • Mint availability
  • tools/node_modules
  • operations/tests/node_modules
  • hook sync state
Examples
lpd doctor
lpd doctor --strict
lpd --json doctor
Flags
--strict
boolean
default:"false"
Fail with a non-zero exit code if any issue is found.
--json
boolean
default:"false"
Emit the standard JSON status envelope.
lpd help | lpd info | lpd version
command
Use these as the fast discovery commands.Examples
lpd help
lpd info
lpd version
lpd --json version
lpd dev
command
Run the local docs dev launcher.Usage
lpd dev [--test] [--test-mode fast|staged|full] [--script [path]] [--dry-run] [--scoped] [--docs-config [path]] [--scope-interactive] [--scope-list] [--scope-file [path]] [--scope-version [csv]] [--scope-language [csv]] [--scope-tab [csv]] [--scope-prefix [csv]] [--skip-external-fetch] [--disable-openapi] [-- ...mint args]
What --scoped does Generates a reduced dev-only Mint profile so large docs nav trees start faster and route changes are lighter when you are filtering the main docs navigation. Scope inputs are validated before any setup work runs (hooks, patches, fetches) so bad tab names fail immediately.Tab name matching Tab names are case-insensitive and support fuzzy matching. You do not need to quote multi-word tab names. The matcher resolves partial names using prefix, substring, and stem matching:
  • Resources resolves to Resource HUB
  • Orch resolves to Orchestrators
  • LP resolves to LP Token
  • Internal resolves to Internal Hub
If a partial name matches more than one tab, the command fails with a list of ambiguous matches.Examples
lpd dev
lpd dev -- --port 3333
lpd dev --test --test-mode staged
lpd dev --scoped --scope-version v2 --scope-language en --scope-tab Developers
lpd dev --scoped --scope-tab Resources
lpd dev --scoped --scope-tab About, Solutions
lpd dev --scoped --scope-tab About --scope-tab Solutions
lpd dev --scoped --scope-prefix v2/orchestrators
lpd dev --scoped --scope-interactive
lpd dev --scoped --scope-list
lpd dev --dry-run --scoped --scope-prefix v2/orchestrators
Recommended use Use lpd dev --scoped for filtered previews of the main docs navigation and for alternate scoped navigation files such as docs-orch-work.json or docs-gate-work.json.Advanced distinction
--docs-config [path]
string
default:""
Use an alternate docs config as the scoped navigation source. Scoped dev keeps Mint on a projected workspace and rewrites the active workspace-root docs.json when this source file changes.
--scope-file [path]
string
default:""
Load scoped selection settings from JSON. This is for filters such as versions, languages, tabs, prefixes, and optional disableOpenapi.
Flags
--test
boolean
default:"false"
Run advisory tests before starting the dev server.
--test-mode fast|staged|full
enum
default:"fast"
Choose which advisory test mode to run with --test.
--script [path]
string
default:"tools/dev/preview/mint-dev.sh"
Override the launcher script path.
--dry-run
boolean
default:"false"
Print the resolved launcher command and scoped settings, then exit.
--scoped
boolean
default:"false"
Enable scoped Mint profile generation.
--scope-interactive
boolean
default:"false"
Prompt for scoped filters interactively.
--scope-list
boolean
default:"false"
Print available versions, languages, and tab names from docs.json, then exit. Use this to discover valid scope values before running a scoped session.
--scope-version [csv]
string
default:"all"
Limit included versions.
--scope-language [csv]
string
default:"all"
Limit included languages.
--scope-tab [csv]
string
default:"all"
Limit included tabs. Supports fuzzy matching: partial names, prefix matches, and stem matches resolve automatically. Multi-word tab names do not require quotes. Multiple tabs can be comma-separated or passed as repeated flags.
--scope-prefix [csv]
string
default:"all"
Limit included routes by prefix such as v2/orchestrators.
--skip-external-fetch
boolean
default:"false"
Set MINT_SKIP_EXTERNAL_FETCH=1 for this run.
--disable-openapi
boolean
default:"false"
Exclude OpenAPI routes from the scoped profile.
--
separator
Pass the remaining arguments to the Mint launcher.
lpd mint dev
command
Compatibility alias to lpd dev.Usage
lpd mint dev [--scoped] [--scope-...] [-- ...mint args]
Examples
lpd mint dev
lpd mint dev -- --port 3333
lpd mint dev --scoped --scope-prefix v2/orchestrators
mint-custom-loader helper
command
Thin alias for lpd dev --scoped --docs-config.Usage
bash tools/dev/preview/mint-custom-loader.sh <custom-docs-json> [-- ...mint args]
Examples
bash tools/dev/preview/mint-custom-loader.sh docs-orch-work.json
bash tools/dev/preview/mint-custom-loader.sh docs-gate-work.json -- --port 3333
Use this when
  • you want a shorter alias for lpd dev --scoped --docs-config ...
  • you want alternate navigation from docs-gate-work.json
  • you want a custom docs config, not just a filtered view of the main docs nav
lpd test
command
Run the main test suite with optional integration checks.Usage
lpd test [--staged|--full] [--browser] [--domain v1|v2|both] [--wcag] [--wcag-no-fix] [--link-audit-external] [--base-url URL] [--json]
Examples
lpd test --staged
lpd test --staged --wcag
lpd test --full --link-audit-external
lpd test --browser
lpd test --domain both --base-url http://localhost:3000
lpd ci
command
Run the local CI-like validation flow.Usage
lpd ci [--skip-browser] [--base-url URL] [--json]
Examples
lpd ci
lpd ci --skip-browser
lpd ci --base-url http://localhost:3000
lpd ai-sitemap
command
Generate or validate sitemap-ai.xml.Usage
lpd ai-sitemap [--write|--check] [--json]
Examples
lpd ai-sitemap --check
lpd ai-sitemap --write
lpd --json ai-sitemap --check
lpd move-page
command
Move a docs page with governed rewrites.Usage
bash lpd move-page <old> <new> [--yes] [--check] [--no-stage] [--json]
What it does
  • runs git mv
  • runs governed docs-path sync
  • stages related rewrites unless you opt out
Examples
bash lpd move-page v2/orchestrators/setup/old.mdx v2/orchestrators/get-started/new.mdx --check
bash lpd move-page v2/orchestrators/setup/old.mdx v2/orchestrators/get-started/new.mdx --yes
Flags
--yes
boolean
default:"false"
Auto-confirm the move.
--check
boolean
default:"false"
Dry-run the move path sync flow.
--no-stage
boolean
default:"false"
Do not stage rewritten files after the move.
--json
boolean
default:"false"
Emit the standard JSON status envelope.
lpd hooks
command
Manage hooks or run .githooks scripts.Usage
lpd hooks <install|status|verify|info|<hook-script tokens...>> [-- script args]
Examples
lpd hooks install
lpd hooks status
lpd hooks verify
lpd hooks info
lpd hooks verify-browser --dry-run
Built-in subcommands
install
subcommand
Install or update .git/hooks/pre-commit from .githooks/pre-commit.
status
subcommand
Check whether the installed hook exists, is executable, and matches source.
verify
subcommand
Run .githooks/verify.sh.
info
subcommand
Print hook scripts, bypass flags, and human-only override trailers.
<hook-script tokens...>
subcommand
Fallback resolution into managed scripts under .githooks/.
lpd scripts list
command
List managed scripts across tools, tasks, tests, v2, and hooks.Usage
lpd scripts list [--group tools|tasks|tests|v2|hooks] [--show-ignored] [--json]
Examples
lpd scripts list
lpd scripts list --group tools
lpd scripts list --group hooks --show-ignored
lpd --json scripts list --group tests
lpd scripts run
command
Resolve and run a managed script.Usage
lpd scripts run <group> <script-path tokens...> [--dry-run] [--yes] [--json] [-- script args]
Examples
lpd scripts run tools dev authoring add-callouts -- --help
lpd scripts run tasks run-audit --dry-run
lpd scripts run tasks run-audit --yes
Inputs
GROUP
enum
required
One of tools, tasks, tests, v2, or hooks.
<script-path tokens...>
string
required
Space-delimited command path that resolves to a discovered script.
Flags
--dry-run
boolean
default:"false"
Prints the resolved executable command and exits.
--yes
boolean
default:"false"
Auto-confirms high-risk script groups.
--json
boolean
default:"false"
Enables JSON status envelope output.
--
separator
Passes remaining args to the resolved script target. Example: lpd scripts run tools dev authoring add-callouts -- --help
lpd <tools|tasks|tests|v2>
command
Group shorthand alias for lpd scripts run <group> ....Usage
lpd tools <script-path tokens...> [-- script args]
lpd tasks <script-path tokens...> [-- script args]
lpd tests <script-path tokens...> [-- script args]
lpd v2 <script-path tokens...> [-- script args]
Examples
lpd tools dev authoring add-callouts -- --help
lpd tests unit lpd-scoped-mint-dev.test -- --help
lpd v2 wcag-repair-common -- --staged --stage
Script risk model
command
Scripts are assigned risk by group and may require confirmation.Usage
low: tests
medium: tools, hooks
high: tasks, v2
Examples
lpd scripts run tasks run-audit
lpd scripts run tasks run-audit --yes
High-risk groups prompt for confirmation unless --yes is supplied. In non-interactive mode, high-risk commands fail without --yes.
Human-only override trailers: git commit -m "msg" --trailer "allowlist-edit=true" and git commit -m "msg" --trailer "allow-deletions=true".
`lpd` not found
troubleshooting
Run:
bash lpd setup --yes
Then open a new shell or source your shell rc file. Until PATH is updated, use bash lpd ....
Hook mismatch
troubleshooting
Run:
lpd hooks status
lpd hooks install
lpd hooks verify
Slow Mint startup on large navs
troubleshooting
Prefer scoped mode:
lpd dev --scoped --scope-prefix v2/orchestrators
For alternate docs configs, use the helper:
bash tools/dev/preview/mint-custom-loader.sh docs-orch-work.json
bash tools/dev/preview/mint-custom-loader.sh docs-gate-work.json
JSON output
response
Many commands support the standard finish-envelope JSON output.Examples
lpd --json version
lpd doctor --json
lpd ci --json
lpd scripts list --group tools --json
The envelope typically includes:
  • command label
  • status
  • message
  • command-specific payload where supported

Script Catalog

For generated full script metadata (script path, summary, usage, domain), see scripts-catalog.

Troubleshooting

lpd not found

Use the repo-local fallback and verify setup:
bash lpd setup --yes
bash lpd version
If needed, reload your shell rc file (source ~/.zshrc or equivalent).

Hooks mismatch

Check and reinstall hooks:
lpd hooks status
lpd hooks install
lpd hooks verify

--json expectations

Global JSON mode is prefix form: lpd --json <command> .... Some commands also accept local --json. lpd info --json is invalid because info only accepts --help|-h.

Port collision on lpd dev

Pass a port through the launcher:
lpd dev -- --port 3334

Slow startup or slow route changes on very large docs.json

Use scoped dev mode so Mint loads only the version, language, tab, or prefix you are actively editing:
lpd dev --scoped --scope-version v2 --scope-language en --scope-tab Developers
Interactive picker:
lpd dev --scoped --scope-interactive

JSON Output

When JSON mode is active on finish-based commands, output uses this status envelope:
ok
boolean
true for success and false for failure.
command
string
Normalised command label (for example: test, scripts list, hooks status).
message
string
Human-readable summary of the command result.
exit_code
number
Exit code returned by the command path.
repo_root
string
Absolute repo root used during command execution.
Example:
{
  "ok": true,
  "command": "version",
  "message": "lpd 0.2.0",
  "exit_code": 0,
  "repo_root": "/path/to/livepeer-docs-repo"
}
lpd info does not emit a structured JSON envelope. Use JSON mode with commands that complete via finish().
Last modified on April 8, 2026