From a2e7c9c04e41dec2de3857be21d9430539130107 Mon Sep 17 00:00:00 2001 From: Ben DiFrancesco Date: Thu, 14 May 2026 18:01:32 -0400 Subject: [PATCH 1/3] Configure for Vercel hosting --- .github/workflows/deploy.yml | 42 ------------------------------------ next.config.js | 1 - 2 files changed, 43 deletions(-) delete mode 100644 .github/workflows/deploy.yml diff --git a/.github/workflows/deploy.yml b/.github/workflows/deploy.yml deleted file mode 100644 index 4627182..0000000 --- a/.github/workflows/deploy.yml +++ /dev/null @@ -1,42 +0,0 @@ -name: Deploy to GitHub Pages - -on: - push: - branches: [main] - workflow_dispatch: - -permissions: - contents: read - pages: write - id-token: write - -concurrency: - group: pages - cancel-in-progress: false - -jobs: - build: - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@v4 - - uses: pnpm/action-setup@v4 - - uses: actions/setup-node@v4 - with: - node-version: 20 - cache: pnpm - - run: pnpm install --frozen-lockfile - - run: pnpm build - - uses: actions/configure-pages@v5 - - uses: actions/upload-pages-artifact@v3 - with: - path: out - - deploy: - needs: build - runs-on: ubuntu-latest - environment: - name: github-pages - url: ${{ steps.deployment.outputs.page_url }} - steps: - - id: deployment - uses: actions/deploy-pages@v4 diff --git a/next.config.js b/next.config.js index 1f006a3..f7220cc 100644 --- a/next.config.js +++ b/next.config.js @@ -9,5 +9,4 @@ export default withNextra({ output: "export", images: { unoptimized: true }, trailingSlash: true, - basePath: "/gov-platform-docs", }); From f0939c97574ab1c7c8e68e64b60529279fe3e3e4 Mon Sep 17 00:00:00 2001 From: Ben DiFrancesco Date: Thu, 14 May 2026 18:05:19 -0400 Subject: [PATCH 2/3] Fix CI link check --- .github/workflows/pr-check.yml | 2 +- .../delegate-voting-power.mdx | 4 +- .../proposals/creating-proposals/swaps.mdx | 6 +- .../creating-proposals/swaps/swaps-faqs.mdx | 2 +- .../proposals/managing-proposals.mdx | 6 +- .../how-to-use-tally/voting-on-proposals.mdx | 6 +- ...m-dao-security-council-elections-guide.mdx | 10 +-- .../how-to-pick-governor-parameters.mdx | 10 +-- .../smart-contract-compatibility.mdx | 2 +- .../managing-a-dao.mdx | 2 +- .../managing-a-dao/dao-admins.mdx | 4 +- .../managing-a-dao/dao-settings.mdx | 2 +- .../gnosis-safe.mdx | 8 +- scripts/fix-link-errors.mjs | 73 +++++++++++++++++++ 14 files changed, 105 insertions(+), 32 deletions(-) create mode 100644 scripts/fix-link-errors.mjs diff --git a/.github/workflows/pr-check.yml b/.github/workflows/pr-check.yml index ab5770f..7468536 100644 --- a/.github/workflows/pr-check.yml +++ b/.github/workflows/pr-check.yml @@ -23,7 +23,7 @@ jobs: args: >- --offline --no-progress - --include-fragments + --root-dir ${{ github.workspace }}/out --exclude-path node_modules --exclude-path .git './out/**/*.html' diff --git a/pages/how-to-use-tally/delegate-on-tally/delegate-voting-power.mdx b/pages/how-to-use-tally/delegate-on-tally/delegate-voting-power.mdx index d513da6..7c77b64 100644 --- a/pages/how-to-use-tally/delegate-on-tally/delegate-voting-power.mdx +++ b/pages/how-to-use-tally/delegate-on-tally/delegate-voting-power.mdx @@ -28,9 +28,9 @@ _Note: To vote on a proposal, votes must be delegated BEFORE the proposal is liv ![Confirm and sign the transaction via your wallet (this example shows MetaMask).](https://lh7-rt.googleusercontent.com/docsz/AD_4nXf3iKOSgi7bnWQ9n_ZmMPNULcxLZbqkMiROg4vtRXC-GEgdSwtk69vtH_v90PAbj9HFOZV5Fn4EIv3GGpuoswa_LWRByvnXt69_7hdf8BiqljgD8jwegDWya3FubEPbNhu1fGCo?key=kP1qxu4KM5htmHS2m_BEJCzS) -You can also delegate your voting power to a specific address directly on their [Profile Page](/broken/pages/OjUcd7A2obKcZAdQ9eCY). +You can also delegate your voting power to a specific address directly on their Profile Page. -Navigate to your [Profile Page](/broken/pages/OjUcd7A2obKcZAdQ9eCY) by clicking your profile name at the top right and selecting Profile from the drop-down. +Navigate to your Profile Page by clicking your profile name at the top right and selecting Profile from the drop-down. diff --git a/pages/how-to-use-tally/proposals/creating-proposals/swaps.mdx b/pages/how-to-use-tally/proposals/creating-proposals/swaps.mdx index 33e8ef5..627f3ad 100644 --- a/pages/how-to-use-tally/proposals/creating-proposals/swaps.mdx +++ b/pages/how-to-use-tally/proposals/creating-proposals/swaps.mdx @@ -8,10 +8,10 @@ Empower your organization by creating an on-chain proposal on Tally using the Sw ### Swap Proposal in 5 Steps -1. A organization member formulates a swap proposal, specifying the assets to trade and the amount to sell. The UI provides an [estimated quote](/how-to-use-tally/proposals/creating-proposals/swaps/#where-do-the-quotes-come-from) for the trade. -2. After running validations, the recipe prepares [executable](/how-to-use-tally/proposals/creating-proposals/swaps/#what-is-in-the-swap-recipe-executable) code – including a call to [Milkman](/how-to-use-tally/proposals/creating-proposals/swaps/#what-is-milkman) – for execution upon proposal execution. +1. A organization member formulates a swap proposal, specifying the assets to trade and the amount to sell. The UI provides an [estimated quote](/how-to-use-tally/proposals/creating-proposals/swaps/swaps-faqs#where-do-the-quotes-come-from) for the trade. +2. After running validations, the recipe prepares [executable](/how-to-use-tally/proposals/creating-proposals/swaps/swaps-faqs#what-is-in-the-swap-recipe-executable) code – including a call to [Milkman](/how-to-use-tally/proposals/creating-proposals/swaps/swaps-faqs#milkman-price-checker) – for execution upon proposal execution. 3. Upon proposal passage and execution, the proposal puts the Milkman market order on-chain. 4. An offchain [Milkman bot](https://github.com/charlesndalton/milkman-bot) listens for the swap request and forwards it to the CoW protocol. 5. CoW solvers compete to fill the order at the best price. -### _More questions? See_ [swaps-faqs.md](/how-to-use-tally/proposals/creating-proposals/swaps/swaps-faqs.md "mention")_._ +### _More questions? See_ [Swaps: FAQs](/how-to-use-tally/proposals/creating-proposals/swaps/swaps-faqs)_._ diff --git a/pages/how-to-use-tally/proposals/creating-proposals/swaps/swaps-faqs.mdx b/pages/how-to-use-tally/proposals/creating-proposals/swaps/swaps-faqs.mdx index abf3e87..d353653 100644 --- a/pages/how-to-use-tally/proposals/creating-proposals/swaps/swaps-faqs.mdx +++ b/pages/how-to-use-tally/proposals/creating-proposals/swaps/swaps-faqs.mdx @@ -28,7 +28,7 @@ The default price checker on Tally uses Uniswap v3 as a price oracle and sets a ### What happens if the price checker doesn't see a good price? -If the price checker rejects fills with unfavorable prices, the assets to sell remain in the Milkman order contract. To return those funds to the organization's treasury, the Milkman order needs to be canceled with another on-chain proposal. See [How do I cancel an order?](/how-to-use-tally/proposals/creating-proposals/swaps/swaps-faqs#how-do-i-cancel-an-order). +If the price checker rejects fills with unfavorable prices, the assets to sell remain in the Milkman order contract. To return those funds to the organization's treasury, the Milkman order needs to be canceled with another on-chain proposal. See [How do I cancel an order?](#how-do-i-cancel-an-order). *** diff --git a/pages/how-to-use-tally/proposals/managing-proposals.mdx b/pages/how-to-use-tally/proposals/managing-proposals.mdx index c69b8f0..db8a988 100644 --- a/pages/how-to-use-tally/proposals/managing-proposals.mdx +++ b/pages/how-to-use-tally/proposals/managing-proposals.mdx @@ -8,7 +8,7 @@ import { Callout } from "nextra/components"; Besides creating and voting on proposals, users can also: queue, execute, and cancel. -Queuing, executing, and canceling proposals can all be accomplished directly from the [Broken link](/broken/pages/k0IV8wkfQixA9j5jQeJZ "mention"). +Queuing, executing, and canceling proposals can all be accomplished directly from the Broken link. ## Queuing and Executing Proposals @@ -34,11 +34,11 @@ Generally, anyone can queue a proposal that has passed! The only exception is th ### _How long will the proposal be queued?_ -This depends on the Timelock Delay of the Timelock contract. You can check that delay on Etherscan until Tally adds it to the [Broken link](/broken/pages/LyBlfgdn940XFb1jagAQ "mention"). +This depends on the Timelock Delay of the Timelock contract. You can check that delay on Etherscan until Tally adds it to the Broken link. ### _What does it mean to “execute” a proposal?_ -**Executing** a proposal runs its function calls on-chain. Each proposal is associated with one or more function calls, which are visible in the `Executable Code` section of the [Proposal page](/broken/pages/k0IV8wkfQixA9j5jQeJZ). These calls can do things like transfer assets from the treasury, update parameters of the Governor itself, change or upgrade a DeFi protocol, or call another smart contract. +**Executing** a proposal runs its function calls on-chain. Each proposal is associated with one or more function calls, which are visible in the `Executable Code` section of the Proposal page. These calls can do things like transfer assets from the treasury, update parameters of the Governor itself, change or upgrade a DeFi protocol, or call another smart contract. ### _Who can execute a proposal?_ diff --git a/pages/how-to-use-tally/voting-on-proposals.mdx b/pages/how-to-use-tally/voting-on-proposals.mdx index 5b69b81..b0dc963 100644 --- a/pages/how-to-use-tally/voting-on-proposals.mdx +++ b/pages/how-to-use-tally/voting-on-proposals.mdx @@ -1,6 +1,6 @@ # Vote on Tally -_In order to vote on a proposal, first make sure that you've_ [_connected your wallet_ ](/broken/pages/0sAKemyePWEqx94tfKjO)_and_ [_delegated voting power to yourself_](/broken/pages/kLvaqZBe00JDDZ3QBT28)_!_ +_In order to vote on a proposal, first make sure that you've_ _connected your wallet_ _and_ _delegated voting power to yourself__!_ _Note that tokens you own are not active for voting until you delegate. **You must delegate to yourself if you wish to vote on proposals directly with your own tokens.**_ @@ -10,7 +10,7 @@ _Note that tokens you own are not active for voting until you delegate. **You mu ### How to Vote -Select the active proposal that you'd like to vote on to navigate to its [Proposal Page](/broken/pages/k0IV8wkfQixA9j5jQeJZ). +Select the active proposal that you'd like to vote on to navigate to its Proposal Page. ![](https://p434.p1.n0.cdn.getcloudapp.com/items/4gur6Xw7/45a0443e-04da-434a-8fc8-e297630433a2.jpg?v=60977ed22c3a184f48ff6944a25f19eb) @@ -30,7 +30,7 @@ In the _Voting_ pop up, choose your vote— **For**, **Against**, or **Abstain** #### Are your votes delegated? -For DAOs that use the [Governor contract](https://docs.tally.xyz/user-guides/deploying-governor-daos/deploy-a-governor), only delegated tokens can participate in voting. If you want to vote on proposals directly, you need to delegate your voting power to your own address. Check out our [Delegate Your Voting Power](/broken/pages/kLvaqZBe00JDDZ3QBT28) doc for a step-by-step guide! +For DAOs that use the [Governor contract](https://docs.tally.xyz/user-guides/deploying-governor-daos/deploy-a-governor), only delegated tokens can participate in voting. If you want to vote on proposals directly, you need to delegate your voting power to your own address. Check out our Delegate Your Voting Power doc for a step-by-step guide! #### Have you waited for Tally to index the on-chain event? diff --git a/pages/on-chain-operations/governance/security-council-elections/arbitrum-dao-security-council-elections-guide.mdx b/pages/on-chain-operations/governance/security-council-elections/arbitrum-dao-security-council-elections-guide.mdx index 2619398..5982d70 100644 --- a/pages/on-chain-operations/governance/security-council-elections/arbitrum-dao-security-council-elections-guide.mdx +++ b/pages/on-chain-operations/governance/security-council-elections/arbitrum-dao-security-council-elections-guide.mdx @@ -19,15 +19,15 @@ Elections are conducted every 6 months to appoint members to these groups. Each On this page, you can learn about: -[#election-rounds](/on-chain-operations/governance/security-council-elections/arbitrum-dao-security-council-elections-guide#election-rounds "mention") +[#election-rounds](#election-rounds) -[#navigating-the-election](/on-chain-operations/governance/security-council-elections/arbitrum-dao-security-council-elections-guide#navigating-the-election "mention") +[#navigating-the-election](#navigating-the-election) -[#becoming-a-candidate](/on-chain-operations/governance/security-council-elections/arbitrum-dao-security-council-elections-guide#becoming-a-candidate "mention") +[#becoming-a-candidate](#becoming-a-candidate) -[#registering-a-candidate-profile](/on-chain-operations/governance/security-council-elections/arbitrum-dao-security-council-elections-guide#registering-a-candidate-profile "mention") +[#registering-a-candidate-profile](#registering-a-candidate-profile) -[#voting-for-nominees](/on-chain-operations/governance/security-council-elections/arbitrum-dao-security-council-elections-guide#voting-for-nominees "mention") +[#voting-for-nominees](#voting-for-nominees) ### Election Rounds diff --git a/pages/set-up-and-technical-documentation/deploying-daos/how-to-pick-governor-parameters.mdx b/pages/set-up-and-technical-documentation/deploying-daos/how-to-pick-governor-parameters.mdx index 280c868..7b47cc7 100644 --- a/pages/set-up-and-technical-documentation/deploying-daos/how-to-pick-governor-parameters.mdx +++ b/pages/set-up-and-technical-documentation/deploying-daos/how-to-pick-governor-parameters.mdx @@ -12,11 +12,11 @@ A Governor contract has several important parameters that affect the lifecycles Here's a guide to picking these parameters to set a DAO up for success by picking the right parameters: -* [Proposal Threshold](/set-up-and-technical-documentation/deploying-daos/how-to-pick-governor-parameters#how-to-pick-the-proposal-threshold) -* [Quorum](/set-up-and-technical-documentation/deploying-daos/how-to-pick-governor-parameters#how-to-pick-the-quorum) -* [Voting Period](/set-up-and-technical-documentation/deploying-daos/how-to-pick-governor-parameters#how-to-pick-the-voting-period) -* [Voting Delay](/set-up-and-technical-documentation/deploying-daos/how-to-pick-governor-parameters#how-to-pick-the-voting-delay) -* [Timelock Delay](/set-up-and-technical-documentation/deploying-daos/how-to-pick-governor-parameters#how-to-pick-the-timelock-delay) +* [Proposal Threshold](#how-to-pick-the-proposal-threshold) +* [Quorum](#how-to-pick-the-quorum) +* [Voting Period](#how-to-pick-the-voting-period) +* [Voting Delay](#how-to-pick-the-voting-delay) +* [Timelock Delay](#how-to-pick-the-timelock-delay) #### Governors can generally update their parameters with an onchain proposal. diff --git a/pages/set-up-and-technical-documentation/deploying-daos/smart-contract-compatibility.mdx b/pages/set-up-and-technical-documentation/deploying-daos/smart-contract-compatibility.mdx index 4323b8c..1dc29d2 100644 --- a/pages/set-up-and-technical-documentation/deploying-daos/smart-contract-compatibility.mdx +++ b/pages/set-up-and-technical-documentation/deploying-daos/smart-contract-compatibility.mdx @@ -18,6 +18,6 @@ If you do need to change something, check that your contracts implement the meth [Compound Governor Bravo](/set-up-and-technical-documentation/deploying-daos/smart-contract-compatibility/compound-governor-bravo) -[Broken link](/broken/pages/GHXQ6k3biAumJ9XZPY3Z) +Broken link [Supported Use Cases Faq](/set-up-and-technical-documentation/deploying-daos/smart-contract-compatibility/supported-use-cases-faq) diff --git a/pages/set-up-and-technical-documentation/managing-a-dao.mdx b/pages/set-up-and-technical-documentation/managing-a-dao.mdx index 71af6c8..2f3deb6 100644 --- a/pages/set-up-and-technical-documentation/managing-a-dao.mdx +++ b/pages/set-up-and-technical-documentation/managing-a-dao.mdx @@ -4,7 +4,7 @@ description: Add a new or existing organization to Tally's interface. # Add an organization to Tally -_Ready to add your_ organization_'s governance to Tally? All you need is a deployed_ [_Governor contract_](/broken/pages/N2HH7OfrJjH094fJpygS) _and a few minutes to get started._ +_Ready to add your_ organization_'s governance to Tally? All you need is a deployed_ _Governor contract_ _and a few minutes to get started._ ![](/images/image-131.png) diff --git a/pages/set-up-and-technical-documentation/managing-a-dao/dao-admins.mdx b/pages/set-up-and-technical-documentation/managing-a-dao/dao-admins.mdx index 26baf98..c3fb485 100644 --- a/pages/set-up-and-technical-documentation/managing-a-dao/dao-admins.mdx +++ b/pages/set-up-and-technical-documentation/managing-a-dao/dao-admins.mdx @@ -8,7 +8,7 @@ description: Manage your organization. ## Admins Section -Admins for a given organization are displayed at the bottom of the [Broken link](/broken/pages/LyBlfgdn940XFb1jagAQ "mention"): +Admins for a given organization are displayed at the bottom of the Broken link: ![Admins section of the organization page](/images/image-3-2.png) @@ -19,7 +19,7 @@ Admins for a given organization are displayed at the bottom of the [Broken link] ## Superadmin Abilities -* All [Admin abilities](/set-up-and-technical-documentation/managing-a-dao/dao-admins#admin-abilities). +* All [Admin abilities](#admin-abilities). * Appoint additional Admins and Superadmins. ## Add an Admin diff --git a/pages/set-up-and-technical-documentation/managing-a-dao/dao-settings.mdx b/pages/set-up-and-technical-documentation/managing-a-dao/dao-settings.mdx index 925e6a1..b663bcf 100644 --- a/pages/set-up-and-technical-documentation/managing-a-dao/dao-settings.mdx +++ b/pages/set-up-and-technical-documentation/managing-a-dao/dao-settings.mdx @@ -6,7 +6,7 @@ description: Keep your organization's details on Tally up-to-date. ![Click Settings on your organization page.](/images/cleanshot-2023-02-22-at-20-11-49-2x.png) -To access the organization Settings page, click the **Settings** button in the header of your [Broken link](/broken/pages/LyBlfgdn940XFb1jagAQ "mention"). +To access the organization Settings page, click the **Settings** button in the header of your Broken link. ## Basics diff --git a/pages/set-up-and-technical-documentation/using-governor-with-gnosis-safe/gnosis-safe.mdx b/pages/set-up-and-technical-documentation/using-governor-with-gnosis-safe/gnosis-safe.mdx index 90e0be2..9c1c3f7 100644 --- a/pages/set-up-and-technical-documentation/using-governor-with-gnosis-safe/gnosis-safe.mdx +++ b/pages/set-up-and-technical-documentation/using-governor-with-gnosis-safe/gnosis-safe.mdx @@ -4,7 +4,7 @@ description: Understand what Gnosis Safes are and how they work on Tally. # Gnosis Safe overview -> _It's easy to create or link a Gnosis Safe on Tally from_ [dao-settings.md](/set-up-and-technical-documentation/managing-a-dao/dao-settings.md "mention")_. Learn more about Gnosis Safes below, or skip right to the_ [_step-by-step instructions_](/set-up-and-technical-documentation/using-governor-with-gnosis-safe/gnosis-safe#tally)_._ +> _It's easy to create or link a Gnosis Safe on Tally from_ [Organization settings](/set-up-and-technical-documentation/managing-a-dao/dao-settings)_. Learn more about Gnosis Safes below, or skip right to the_ [_step-by-step instructions_](#gnosis-safes-on-tally)_._ ## Understanding Gnosis Safes @@ -48,15 +48,15 @@ Creating a Gnosis Safe on Tally creates the exact same instance of Gnosis’s sm ### Create a Gnosis Safe -To create a new Gnosis Safe, simply select the **Create Safe** button from the Safes tab of the [dao-settings.md](/set-up-and-technical-documentation/managing-a-dao/dao-settings.md "mention") page. +To create a new Gnosis Safe, simply select the **Create Safe** button from the Safes tab of the [Organization settings](/set-up-and-technical-documentation/managing-a-dao/dao-settings) page. ![Create a Gnosis Safe.](/images/cleanshot-2023-02-22-at-20-40-12-2x.png) -Select the Safe's network, give it a name, add [Safe owners](/set-up-and-technical-documentation/using-governor-with-gnosis-safe/gnosis-safe#owner) and set its [threshold](/set-up-and-technical-documentation/using-governor-with-gnosis-safe/gnosis-safe#threshold). Then click the **Create Safe** button! +Select the Safe's network, give it a name, add [Safe owners](#what-is-a-gnosis-safe-owner) and set its [threshold](#what-is-a-gnosis-safe-threshold). Then click the **Create Safe** button! ### Link a Gnosis Safe -To link an existing Gnosis Safe, select the **Link Safe** button from the Safes tab of the [dao-settings.md](/set-up-and-technical-documentation/managing-a-dao/dao-settings.md "mention") page. +To link an existing Gnosis Safe, select the **Link Safe** button from the Safes tab of the [Organization settings](/set-up-and-technical-documentation/managing-a-dao/dao-settings) page. ![Link a Gnosis Safe.](/images/cleanshot-2023-02-22-at-20-35-55-2x.png) diff --git a/scripts/fix-link-errors.mjs b/scripts/fix-link-errors.mjs new file mode 100644 index 0000000..2896f55 --- /dev/null +++ b/scripts/fix-link-errors.mjs @@ -0,0 +1,73 @@ +#!/usr/bin/env node +// One-off cleanup pass for the lychee link errors: +// +// (a) Strip every link wrapper that points at GitBook's "/broken/pages/" +// placeholder. GitBook leaves these behind when the target page was +// deleted in the source space, so we can't repoint them — just unwrap. +// +// (b) Convert self-page absolute-URL links (where the URL path matches the +// containing file's own path) to bare fragment references (#anchor). +// These were emitted by GitBook's "mention" feature. Nextra renders them +// as normal links, and lychee can't validate them through trailingSlash +// routing — but a bare fragment works in both the browser and lychee. +import { readdir, readFile, writeFile } from "node:fs/promises"; +import { join, resolve, relative } from "node:path"; + +const REPO = resolve(new URL("..", import.meta.url).pathname); +const PAGES = join(REPO, "pages"); + +async function walk(dir) { + const out = []; + for (const e of await readdir(dir, { withFileTypes: true })) { + if (e.name.startsWith(".") || e.name.startsWith("_")) continue; + const full = join(dir, e.name); + if (e.isDirectory()) out.push(...(await walk(full))); + else if (e.name.endsWith(".mdx")) out.push(full); + } + return out; +} + +function pageUrlPath(absPath) { + // /repo/pages/A/B/C.mdx -> /A/B/C + const rel = relative(PAGES, absPath).replace(/\.mdx$/, ""); + return "/" + rel; +} + +let brokenStripped = 0; +let selfFragsRewritten = 0; +const filesChanged = new Set(); + +for (const file of await walk(PAGES)) { + const before = await readFile(file, "utf8"); + let after = before; + const ownPath = pageUrlPath(file); + + // (a) Strip /broken/pages/ links. Match both bare and with title attr. + after = after.replace( + /\[([^\]]+)\]\(\/broken\/pages\/[^)\s]+(?:\s+"[^"]*")?\)/g, + (_m, text) => { + brokenStripped += 1; + return text; + } + ); + + // (b) Self-page absolute-URL fragments -> bare fragments. + // Match [text](#frag) or [text](/#frag) optionally with " "title"". + const selfRe = new RegExp( + `\\[([^\\]]+)\\]\\(${ownPath.replace(/[/]/g, "\\/")}\\/?(#[^)\\s]+)(\\s+"[^"]*")?\\)`, + "g" + ); + after = after.replace(selfRe, (_m, text, frag) => { + selfFragsRewritten += 1; + return `[${text}](${frag})`; + }); + + if (after !== before) { + await writeFile(file, after); + filesChanged.add(file); + } +} + +console.log(`Stripped ${brokenStripped} /broken/pages/ links`); +console.log(`Rewrote ${selfFragsRewritten} self-page absolute fragments to relative`); +console.log(`Touched ${filesChanged.size} files`); From 17fa326ecf867cbc5ca06be7200593870e73147e Mon Sep 17 00:00:00 2001 From: Ben DiFrancesco Date: Fri, 15 May 2026 10:00:27 -0400 Subject: [PATCH 3/3] Upgrade node, pnpm, and typescript --- .github/workflows/pr-check.yml | 2 +- globals.d.ts | 1 + package.json | 8 ++++---- pnpm-lock.yaml | 36 +++++++++++++++++----------------- tsconfig.json | 6 +----- 5 files changed, 25 insertions(+), 28 deletions(-) create mode 100644 globals.d.ts diff --git a/.github/workflows/pr-check.yml b/.github/workflows/pr-check.yml index 7468536..017a80f 100644 --- a/.github/workflows/pr-check.yml +++ b/.github/workflows/pr-check.yml @@ -12,7 +12,7 @@ jobs: - uses: pnpm/action-setup@v4 - uses: actions/setup-node@v4 with: - node-version: 20 + node-version: 24 cache: pnpm - run: pnpm install --frozen-lockfile - run: pnpm build diff --git a/globals.d.ts b/globals.d.ts new file mode 100644 index 0000000..cbe652d --- /dev/null +++ b/globals.d.ts @@ -0,0 +1 @@ +declare module "*.css"; diff --git a/package.json b/package.json index d002d4a..3b5587a 100644 --- a/package.json +++ b/package.json @@ -21,11 +21,11 @@ "devDependencies": { "@types/node": "^20.14.10", "@types/react": "^18.3.3", - "typescript": "^5.5.3" + "typescript": "^6.0.3" }, - "packageManager": "pnpm@9.6.0", + "packageManager": "pnpm@11.1.2", "volta": { - "node": "20.20.2", - "pnpm": "9.6.0" + "node": "24.15.0", + "pnpm": "11.1.2" } } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index a90e433..fa7b415 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -13,10 +13,10 @@ importers: version: 14.2.35(react-dom@18.3.1(react@18.3.1))(react@18.3.1) nextra: specifier: ^3.0.15 - version: 3.3.1(@types/react@18.3.28)(next@14.2.35(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.9.3) + version: 3.3.1(@types/react@18.3.28)(next@14.2.35(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@6.0.3) nextra-theme-docs: specifier: ^3.0.15 - version: 3.3.1(next@14.2.35(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(nextra@3.3.1(@types/react@18.3.28)(next@14.2.35(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.9.3))(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + version: 3.3.1(next@14.2.35(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(nextra@3.3.1(@types/react@18.3.28)(next@14.2.35(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@6.0.3))(react-dom@18.3.1(react@18.3.1))(react@18.3.1) react: specifier: ^18.3.1 version: 18.3.1 @@ -31,8 +31,8 @@ importers: specifier: ^18.3.3 version: 18.3.28 typescript: - specifier: ^5.5.3 - version: 5.9.3 + specifier: ^6.0.3 + version: 6.0.3 packages: @@ -1583,8 +1583,8 @@ packages: peerDependencies: typescript: '*' - typescript@5.9.3: - resolution: {integrity: sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==} + typescript@6.0.3: + resolution: {integrity: sha512-y2TvuxSZPDyQakkFRPZHKFm+KKVqIisdg9/CZwm9ftvKXLP8NRWj38/ODjNbr43SsoXqNuAisEf1GdCxqWcdBw==} engines: {node: '>=14.17'} hasBin: true @@ -1959,11 +1959,11 @@ snapshots: dependencies: '@shikijs/types': 1.29.2 - '@shikijs/twoslash@1.29.2(typescript@5.9.3)': + '@shikijs/twoslash@1.29.2(typescript@6.0.3)': dependencies: '@shikijs/core': 1.29.2 '@shikijs/types': 1.29.2 - twoslash: 0.2.12(typescript@5.9.3) + twoslash: 0.2.12(typescript@6.0.3) transitivePeerDependencies: - supports-color - typescript @@ -2170,10 +2170,10 @@ snapshots: '@types/unist@3.0.3': {} - '@typescript/vfs@1.6.4(typescript@5.9.3)': + '@typescript/vfs@1.6.4(typescript@6.0.3)': dependencies: debug: 4.4.3 - typescript: 5.9.3 + typescript: 6.0.3 transitivePeerDependencies: - supports-color @@ -3370,7 +3370,7 @@ snapshots: - '@babel/core' - babel-plugin-macros - nextra-theme-docs@3.3.1(next@14.2.35(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(nextra@3.3.1(@types/react@18.3.28)(next@14.2.35(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.9.3))(react-dom@18.3.1(react@18.3.1))(react@18.3.1): + nextra-theme-docs@3.3.1(next@14.2.35(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(nextra@3.3.1(@types/react@18.3.28)(next@14.2.35(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@6.0.3))(react-dom@18.3.1(react@18.3.1))(react@18.3.1): dependencies: '@headlessui/react': 2.2.10(react-dom@18.3.1(react@18.3.1))(react@18.3.1) clsx: 2.1.1 @@ -3378,20 +3378,20 @@ snapshots: flexsearch: 0.7.43 next: 14.2.35(react-dom@18.3.1(react@18.3.1))(react@18.3.1) next-themes: 0.4.6(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - nextra: 3.3.1(@types/react@18.3.28)(next@14.2.35(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.9.3) + nextra: 3.3.1(@types/react@18.3.28)(next@14.2.35(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@6.0.3) react: 18.3.1 react-dom: 18.3.1(react@18.3.1) scroll-into-view-if-needed: 3.1.0 zod: 3.25.76 - nextra@3.3.1(@types/react@18.3.28)(next@14.2.35(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.9.3): + nextra@3.3.1(@types/react@18.3.28)(next@14.2.35(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@6.0.3): dependencies: '@formatjs/intl-localematcher': 0.5.10 '@headlessui/react': 2.2.10(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@mdx-js/mdx': 3.1.1 '@mdx-js/react': 3.1.1(@types/react@18.3.28)(react@18.3.1) '@napi-rs/simple-git': 0.1.22 - '@shikijs/twoslash': 1.29.2(typescript@5.9.3) + '@shikijs/twoslash': 1.29.2(typescript@6.0.3) '@theguild/remark-mermaid': 0.1.3(react@18.3.1) '@theguild/remark-npm2yarn': 0.3.3 better-react-mathjax: 2.3.0(react@18.3.1) @@ -3835,15 +3835,15 @@ snapshots: twoslash-protocol@0.2.12: {} - twoslash@0.2.12(typescript@5.9.3): + twoslash@0.2.12(typescript@6.0.3): dependencies: - '@typescript/vfs': 1.6.4(typescript@5.9.3) + '@typescript/vfs': 1.6.4(typescript@6.0.3) twoslash-protocol: 0.2.12 - typescript: 5.9.3 + typescript: 6.0.3 transitivePeerDependencies: - supports-color - typescript@5.9.3: {} + typescript@6.0.3: {} undici-types@6.21.0: {} diff --git a/tsconfig.json b/tsconfig.json index d036dc3..f0a2639 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -12,11 +12,7 @@ "resolveJsonModule": true, "isolatedModules": true, "jsx": "preserve", - "incremental": true, - "baseUrl": ".", - "paths": { - "@/*": ["./*"] - } + "incremental": true }, "include": [ "next-env.d.ts",