diff --git a/.changeset/brave-moons-tap.md b/.changeset/brave-moons-tap.md new file mode 100644 index 00000000..a845151c --- /dev/null +++ b/.changeset/brave-moons-tap.md @@ -0,0 +1,2 @@ +--- +--- diff --git a/website/astro.config.mjs b/website/astro.config.mjs index 2fd8e36a..18a382a6 100644 --- a/website/astro.config.mjs +++ b/website/astro.config.mjs @@ -2,6 +2,7 @@ import { unified } from "@astrojs/markdown-remark"; import { defineConfig } from "astro/config"; import sitemap from "@astrojs/sitemap"; import starlight from "@astrojs/starlight"; +import starlightDotMd from "starlight-dot-md"; import starlightLlmsTxt from "starlight-llms-txt"; export default defineConfig({ @@ -15,6 +16,11 @@ export default defineConfig({ "Review code changes and collaborate with coding agents in a desktop-inspired terminal diff viewer.", social: [{ icon: "github", label: "GitHub", href: "https://github.com/modem-dev/hunk" }], plugins: [ + // Serves every docs page's Markdown source at the same URL plus `.md`, so a + // hunk.dev link pasted into an agent resolves to clean Markdown instead of + // HTML that has to be converted back. Complements the llms.txt corpus below: + // that is for learning Hunk, this is for reading one page. + starlightDotMd(), // Publishes /llms.txt, /llms-small.txt, and /llms-full.txt so coding agents can // pull Hunk's docs directly instead of scraping rendered HTML. The full corpus is // small enough (~130KB of Markdown) that an agent can fetch llms-full.txt in one go. diff --git a/website/bun.lock b/website/bun.lock index 8cc530ff..36bdee57 100644 --- a/website/bun.lock +++ b/website/bun.lock @@ -10,6 +10,7 @@ "@astrojs/starlight": "^0.41.5", "@fontsource-variable/jetbrains-mono": "^5.2.8", "astro": "^7.1.4", + "starlight-dot-md": "^0.2.1", "starlight-llms-txt": "^0.11.0", }, "devDependencies": { @@ -991,6 +992,8 @@ "space-separated-tokens": ["space-separated-tokens@2.0.2", "", {}, "sha512-PEGlAwrG8yXGXRjW32fGbg66JAlOAwbObuqVoJpv/mRgoWDQfgH1wDPvtzWyUSNAXBGSk8h755YDbbcEy3SH2Q=="], + "starlight-dot-md": ["starlight-dot-md@0.2.1", "", { "dependencies": { "picomatch": "4.0.4", "yaml": "2.8.3" }, "peerDependencies": { "astro": ">=5.0.0" } }, "sha512-HipXD0DIaeNldvih+gJpIRhFlH2VdYJYnCG7GzeZNkYnUXAanAMSMAgYW9OZW6ZR0SL3+OdN8U1NhX7bjXloMw=="], + "starlight-llms-txt": ["starlight-llms-txt@0.11.0", "", { "dependencies": { "@astrojs/mdx": "^7.0.0", "@types/hast": "^3.0.4", "@types/micromatch": "^4.0.10", "github-slugger": "^2.0.0", "hast-util-select": "^6.0.4", "micromatch": "^4.0.8", "rehype-parse": "^9.0.1", "rehype-remark": "^10.0.1", "remark-gfm": "^4.0.1", "remark-stringify": "^11.0.0", "unified": "^11.0.5", "unist-util-remove": "^4.0.0" }, "peerDependencies": { "@astrojs/starlight": ">=0.41.0", "astro": "^7.0.0" } }, "sha512-83TU5zPgJhL9fXIWAOWjQjyQ6EKocshEjJyA4zOJjOqu/oxQsrTpYGYxjHLyfZe4LRD52N9eCuykSkaIYwUyDw=="], "stream-replace-string": ["stream-replace-string@2.0.0", "", {}, "sha512-TlnjJ1C0QrmxRNrON00JvaFFlNh5TTG00APw23j74ET7gkQpTASi6/L2fuiav8pzK715HXtUeClpBTw2NPSn6w=="], @@ -1123,7 +1126,7 @@ "y18n": ["y18n@5.0.8", "", {}, "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA=="], - "yaml": ["yaml@2.9.0", "", { "bin": { "yaml": "bin.mjs" } }, "sha512-2AvhNX3mb8zd6Zy7INTtSpl1F15HW6Wnqj0srWlkKLcpYl/gMIMJiyuGq2KeI2YFxUPjdlB+3Lc10seMLtL4cA=="], + "yaml": ["yaml@2.8.3", "", { "bin": { "yaml": "bin.mjs" } }, "sha512-AvbaCLOO2Otw/lW5bmh9d/WEdcDFdQp2Z2ZUH3pX9U2ihyUY0nvLv7J6TrWowklRGPYbB/IuIMfYgxaCPg5Bpg=="], "yaml-language-server": ["yaml-language-server@1.23.0", "", { "dependencies": { "@vscode/l10n": "^0.0.18", "ajv": "^8.17.1", "ajv-draft-04": "^1.0.0", "ajv-i18n": "^4.2.0", "prettier": "^3.8.1", "request-light": "^0.5.7", "vscode-json-languageservice": "4.1.8", "vscode-languageserver": "^9.0.0", "vscode-languageserver-textdocument": "^1.0.1", "vscode-languageserver-types": "^3.16.0", "vscode-uri": "^3.0.2", "yaml": "2.8.3" }, "bin": { "yaml-language-server": "bin/yaml-language-server" } }, "sha512-3qVyCOexLCWw06PQa5kRPwvMWMZ/eZeCRWUvgD6a0OkqL/4iCnxy2WumbWifa937Uo5xhyWJ0uxlU39ljhNh7A=="], @@ -1137,6 +1140,8 @@ "zwitch": ["zwitch@2.0.4", "", {}, "sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A=="], + "@astrojs/yaml2ts/yaml": ["yaml@2.9.0", "", { "bin": { "yaml": "bin.mjs" } }, "sha512-2AvhNX3mb8zd6Zy7INTtSpl1F15HW6Wnqj0srWlkKLcpYl/gMIMJiyuGq2KeI2YFxUPjdlB+3Lc10seMLtL4cA=="], + "@img/sharp-wasm32/@emnapi/runtime": ["@emnapi/runtime@1.11.3", "", { "dependencies": { "tslib": "^2.4.0" } }, "sha512-Xz4Tpyki7XyrpbUK1jR1AhdAdaXyhhY4lZ3neLodmhpuWfy2PAQN5B46sAiU4liOXGLkHypn/qU+jvfWSCYYLA=="], "@mdx-js/mdx/estree-walker": ["estree-walker@3.0.3", "", { "dependencies": { "@types/estree": "^1.0.0" } }, "sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g=="], @@ -1163,6 +1168,8 @@ "rollup/fsevents": ["fsevents@2.3.3", "", { "os": "darwin" }, "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw=="], + "starlight-dot-md/picomatch": ["picomatch@4.0.4", "", {}, "sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A=="], + "unstorage/chokidar": ["chokidar@5.0.0", "", { "dependencies": { "readdirp": "^5.0.0" } }, "sha512-TQMmc3w+5AxjpL8iIiwebF73dRDF4fBIieAqGn9RGCWaEVwQ6Fb2cGe31Yns0RRIzii5goJ1Y7xbMwo1TxMplw=="], "vite/fsevents": ["fsevents@2.3.3", "", { "os": "darwin" }, "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw=="], @@ -1175,8 +1182,6 @@ "yaml-language-server/request-light": ["request-light@0.5.8", "", {}, "sha512-3Zjgh+8b5fhRJBQZoy+zbVKpAQGLyka0MPgW3zruTF4dFFJ8Fqcfu9YsAvi/rvdcaTeWG3MkbZv4WKxAn/84Lg=="], - "yaml-language-server/yaml": ["yaml@2.8.3", "", { "bin": { "yaml": "bin.mjs" } }, "sha512-AvbaCLOO2Otw/lW5bmh9d/WEdcDFdQp2Z2ZUH3pX9U2ihyUY0nvLv7J6TrWowklRGPYbB/IuIMfYgxaCPg5Bpg=="], - "csso/css-tree/mdn-data": ["mdn-data@2.0.28", "", {}, "sha512-aylIc7Z9y4yzHYAJNuESG3hfhC+0Ibp/MAMiaOZgNv4pmEdFyfZhhhny4MNiAfWdBQ1RQ2mfDWmM1x8SvGyp8g=="], "unstorage/chokidar/readdirp": ["readdirp@5.0.0", "", {}, "sha512-9u/XQ1pvrQtYyMpZe7DXKv2p5CNvyVwzUB6uhLAnQwHMSgKMBR62lc7AHljaeteeHXn11XTAaLLUVZYVZyuRBQ=="], diff --git a/website/package.json b/website/package.json index 7ad5c2b1..1e07c5ce 100644 --- a/website/package.json +++ b/website/package.json @@ -15,6 +15,7 @@ "@astrojs/starlight": "^0.41.5", "@fontsource-variable/jetbrains-mono": "^5.2.8", "astro": "^7.1.4", + "starlight-dot-md": "^0.2.1", "starlight-llms-txt": "^0.11.0" }, "devDependencies": { diff --git a/website/tests/docs-smoke.spec.ts b/website/tests/docs-smoke.spec.ts index 4681f9f7..f3a335ac 100644 --- a/website/tests/docs-smoke.spec.ts +++ b/website/tests/docs-smoke.spec.ts @@ -134,3 +134,27 @@ test("llms.txt routes expose the docs to coding agents", async ({ request }) => expect(linked.ok(), path).toBe(true); } }); + +test("docs pages serve their Markdown source at .md URLs", async ({ request }) => { + const install = await request.get("/docs/start/install.md"); + expect(install.ok()).toBe(true); + const body = await install.text(); + + // Raw source, not an HTML page that merely ends in .md. + expect(body).not.toContain("