From 1c4b29794107e420ff8c46764e5b833cf02ad548 Mon Sep 17 00:00:00 2001 From: Bret Comnes Date: Sun, 13 Sep 2026 15:30:01 -0700 Subject: [PATCH 1/5] refactor: scope DOMStack data and migrate tooling to TypeScript --- .github/workflows/docs-audit.yml | 7 +- .github/workflows/pages.yml | 13 +- README.md | 40 +- docs/migration.md | 13 +- package.json | 3 +- playwright.config.ts | 2 +- runtime/tools/audit-site.py | 212 - runtime/tools/generate-js-api-reference.py | 318 -- runtime/tools/generate-js-api-reference.ts | 132 + runtime/tools/js-api-reference-content.ts | 409 ++ runtime/tools/js_api_reference_content.py | 1256 ----- sage/tools/audit-site.py | 32 - silk/tools/audit-site.py | 130 - silk/tools/audit-stdlib-docs.py | 134 - silk/tools/sync-from-silk-docs.py | 767 --- silk/tools/sync-from-silk-docs.ts | 88 + slg/tools/audit-site.py | 32 - src/artifacts.template.ts | 86 +- src/docs/client.ts | 3 + src/global.data.ts | 49 +- src/globals/global.client.js | 214 - src/globals/global.client.ts | 2 + src/globals/global.css | 4158 +++++------------ src/layouts/docs.layout.client.ts | 21 +- src/layouts/docs.layout.ts | 97 +- src/layouts/learn.layout.client.ts | 4 +- src/layouts/learn.layout.css | 732 +++ src/layouts/product.layout.client.ts | 1 - src/layouts/root.layout.ts | 41 +- src/layouts/runtime-docs.layout.ts | 10 + src/layouts/sage-docs.layout.ts | 10 + src/layouts/silk-docs.layout.ts | 10 + src/layouts/silkWiki-docs.layout.ts | 10 + src/layouts/slg-docs.layout.ts | 10 + src/layouts/spec.layout.client.ts | 3 + src/layouts/spec.layout.ts | 21 +- src/layouts/virtnosis-docs.layout.ts | 10 + src/lib/article-client.ts | 2 +- src/lib/artifacts.ts | 28 + src/lib/ask-ai-client.ts | 165 + src/lib/{clipboard.js => clipboard.ts} | 2 +- src/lib/docs.ts | 78 +- src/lib/learn-client.js | 151 - src/lib/learn-client.ts | 127 + src/lib/markdown.ts | 14 +- src/lib/navigation.ts | 6 +- src/lib/rendering.ts | 69 + src/lib/{silk.js => silk.ts} | 6 +- src/lib/{tabs.js => tabs.ts} | 18 +- src/lib/{toml.js => toml.ts} | 4 +- src/lib/{zig.js => zig.ts} | 4 +- src/markdown-it.settings.ts | 2 + src/runtime-index.template.ts | 6 + src/runtime-llms.template.ts | 6 + src/runtime-search.template.ts | 6 + src/runtime-sources.template.ts | 6 + src/runtime/docs/cli/build/page.md | 2 +- src/runtime/docs/cli/config/page.md | 2 +- src/runtime/docs/cli/env/page.md | 2 +- src/runtime/docs/cli/help/page.md | 2 +- src/runtime/docs/cli/init/page.md | 2 +- src/runtime/docs/cli/install-app/page.md | 2 +- src/runtime/docs/cli/list-devices/page.md | 2 +- src/runtime/docs/cli/mcp/page.md | 2 +- src/runtime/docs/cli/oroc/page.md | 2 +- src/runtime/docs/cli/print-build-dir/page.md | 2 +- src/runtime/docs/cli/run/page.md | 2 +- src/runtime/docs/cli/setup/page.md | 2 +- src/runtime/docs/cli/update/bundle/page.md | 2 +- src/runtime/docs/cli/update/extract/page.md | 2 +- src/runtime/docs/cli/update/info/page.md | 2 +- src/runtime/docs/cli/update/init/page.md | 2 +- src/runtime/docs/cli/update/keygen/page.md | 2 +- src/runtime/docs/cli/update/page.md | 2 +- src/runtime/docs/cli/update/server/page.md | 2 +- src/runtime/docs/cli/update/sign/page.md | 2 +- src/runtime/docs/cli/update/validate/page.md | 2 +- src/runtime/docs/cli/update/verify/page.md | 2 +- src/runtime/docs/cli/version/page.md | 2 +- src/runtime/docs/cli/versions/page.md | 2 +- src/runtime/docs/config/copy-map/page.md | 2 +- src/runtime/docs/config/overview/page.md | 2 +- src/runtime/docs/config/reference/page.md | 2 +- .../docs/guides/build-and-package/page.md | 2 +- .../docs/guides/calling-http-apis/page.md | 2 +- .../configure-your-runtime-project/page.md | 2 +- .../custom-protocols-and-routing/page.md | 2 +- .../docs/guides/desktop-integrations/page.md | 2 +- .../docs/guides/files-and-sandboxing/page.md | 2 +- .../guides/from-zero-to-first-run/page.md | 2 +- .../guides/frontend-build-pipeline/page.md | 2 +- src/runtime/docs/guides/hello-world/page.md | 2 +- .../lifecycle-hooks-and-deep-links/page.md | 2 +- .../guides/local-data-with-sqlite/page.md | 2 +- .../guides/mcp-and-agent-automation/page.md | 2 +- .../page.md | 2 +- .../docs/guides/native-extensions/page.md | 2 +- .../page.md | 2 +- .../docs/guides/project-layout/page.md | 2 +- .../page.md | 2 +- .../secure-storage-and-sessions/page.md | 2 +- .../shared-workers-across-windows/page.md | 2 +- .../guides/testing-and-diagnostics/page.md | 2 +- .../docs/guides/windows-and-messaging/page.md | 2 +- .../worker-threads-for-heavy-work/page.md | 2 +- src/runtime/docs/javascript/ai/page.md | 2 +- .../docs/javascript/all-modules/page.md | 2 +- .../docs/javascript/application/page.md | 2 +- src/runtime/docs/javascript/asn1/page.md | 2 +- src/runtime/docs/javascript/assert/page.md | 2 +- src/runtime/docs/javascript/async/page.md | 2 +- .../docs/javascript/async_hooks/page.md | 2 +- .../docs/javascript/background/page.md | 2 +- src/runtime/docs/javascript/buffer/page.md | 2 +- src/runtime/docs/javascript/cdp/page.md | 2 +- .../docs/javascript/child_process/page.md | 2 +- src/runtime/docs/javascript/clipboard/page.md | 2 +- src/runtime/docs/javascript/commonjs/page.md | 2 +- src/runtime/docs/javascript/conduit/page.md | 2 +- src/runtime/docs/javascript/console/page.md | 2 +- src/runtime/docs/javascript/constants/page.md | 2 +- src/runtime/docs/javascript/cookies/page.md | 2 +- src/runtime/docs/javascript/crypto/page.md | 2 +- src/runtime/docs/javascript/dbus/page.md | 2 +- src/runtime/docs/javascript/dgram/page.md | 2 +- .../docs/javascript/diagnostics/page.md | 2 +- src/runtime/docs/javascript/did/page.md | 2 +- src/runtime/docs/javascript/dns/page.md | 2 +- .../docs/javascript/enumeration/page.md | 2 +- src/runtime/docs/javascript/errno/page.md | 2 +- src/runtime/docs/javascript/errors/page.md | 2 +- src/runtime/docs/javascript/events/page.md | 2 +- src/runtime/docs/javascript/extension/page.md | 2 +- src/runtime/docs/javascript/fetch/page.md | 2 +- src/runtime/docs/javascript/fs/page.md | 2 +- src/runtime/docs/javascript/gc/page.md | 2 +- src/runtime/docs/javascript/hci/page.md | 2 +- src/runtime/docs/javascript/hooks/page.md | 2 +- src/runtime/docs/javascript/http/page.md | 2 +- src/runtime/docs/javascript/https/page.md | 2 +- src/runtime/docs/javascript/i18n/page.md | 2 +- src/runtime/docs/javascript/ip/page.md | 2 +- src/runtime/docs/javascript/ipc/page.md | 2 +- src/runtime/docs/javascript/ipfs/page.md | 2 +- src/runtime/docs/javascript/iroh/page.md | 2 +- src/runtime/docs/javascript/language/page.md | 2 +- src/runtime/docs/javascript/latica/page.md | 2 +- src/runtime/docs/javascript/location/page.md | 2 +- src/runtime/docs/javascript/mcp/page.md | 2 +- src/runtime/docs/javascript/mime/page.md | 2 +- src/runtime/docs/javascript/module/page.md | 2 +- .../docs/javascript/navigation/page.md | 2 +- src/runtime/docs/javascript/net/page.md | 2 +- src/runtime/docs/javascript/network/page.md | 2 +- .../docs/javascript/notification/page.md | 2 +- src/runtime/docs/javascript/npm/page.md | 2 +- src/runtime/docs/javascript/os/page.md | 2 +- src/runtime/docs/javascript/overview/page.md | 2 +- src/runtime/docs/javascript/path/page.md | 2 +- src/runtime/docs/javascript/process/page.md | 2 +- .../docs/javascript/protocol-handlers/page.md | 2 +- .../docs/javascript/querystring/page.md | 2 +- .../docs/javascript/secure-storage/page.md | 2 +- src/runtime/docs/javascript/semver/page.md | 2 +- .../docs/javascript/service-worker/page.md | 2 +- .../docs/javascript/shared-worker/page.md | 2 +- src/runtime/docs/javascript/signal/page.md | 2 +- src/runtime/docs/javascript/sqlite/page.md | 2 +- src/runtime/docs/javascript/stream/page.md | 2 +- .../docs/javascript/string_decoder/page.md | 2 +- src/runtime/docs/javascript/tar/page.md | 2 +- src/runtime/docs/javascript/tcp/page.md | 2 +- src/runtime/docs/javascript/test/page.md | 2 +- src/runtime/docs/javascript/timers/page.md | 2 +- src/runtime/docs/javascript/tls/page.md | 2 +- src/runtime/docs/javascript/toml/page.md | 2 +- src/runtime/docs/javascript/tty/page.md | 2 +- src/runtime/docs/javascript/url/page.md | 2 +- src/runtime/docs/javascript/usb/page.md | 2 +- src/runtime/docs/javascript/util/page.md | 2 +- src/runtime/docs/javascript/vm/page.md | 2 +- src/runtime/docs/javascript/window/page.md | 2 +- src/runtime/docs/javascript/worker/page.md | 2 +- .../docs/javascript/worker_threads/page.md | 2 +- src/runtime/docs/javascript/xpc/page.md | 2 +- src/runtime/docs/javascript/zlib/page.md | 2 +- src/runtime/docs/page.md | 2 +- src/sage-index.template.ts | 6 + src/sage-llms.template.ts | 6 + src/sage-search.template.ts | 6 + src/sage-sources.template.ts | 6 + src/sage/docs/cli/configuration/page.md | 2 +- src/sage/docs/cli/diagnostics/page.md | 2 +- .../docs/cli/environment-and-files/page.md | 2 +- src/sage/docs/cli/inputs-and-modes/page.md | 2 +- src/sage/docs/cli/keys-and-commands/page.md | 2 +- src/sage/docs/cli/options/page.md | 2 +- src/sage/docs/cli/sage/page.md | 2 +- src/sage/docs/cli/syntax-and-cache/page.md | 2 +- src/sage/docs/guides/getting-started/page.md | 2 +- src/sage/docs/guides/pager-workflows/page.md | 2 +- .../docs/guides/plugins-quickstart/page.md | 2 +- src/sage/docs/javascript/all-modules/page.md | 2 +- src/sage/docs/javascript/crypto/page.md | 2 +- src/sage/docs/javascript/dom/page.md | 2 +- src/sage/docs/javascript/env/page.md | 2 +- src/sage/docs/javascript/fetch/page.md | 2 +- src/sage/docs/javascript/fs/page.md | 2 +- src/sage/docs/javascript/module-index/page.md | 2 +- src/sage/docs/javascript/navigator/page.md | 2 +- src/sage/docs/javascript/overview/page.md | 2 +- src/sage/docs/javascript/path/page.md | 2 +- src/sage/docs/javascript/performance/page.md | 2 +- src/sage/docs/javascript/process/page.md | 2 +- src/sage/docs/javascript/runtime/page.md | 2 +- src/sage/docs/javascript/url/page.md | 2 +- src/sage/docs/javascript/uuid/page.md | 2 +- src/sage/docs/javascript/web/page.md | 2 +- src/sage/docs/man/sage-1/page.md | 2 +- src/sage/docs/man/sage-7/page.md | 2 +- src/sage/docs/man/sage-plugin-api-3/page.md | 2 +- src/sage/docs/page.md | 2 +- src/silk-index.template.ts | 6 + src/silk-llms.template.ts | 6 + src/silk-search.template.ts | 6 + src/silk-sources.template.ts | 6 + src/silk/docs/compiler/abi-libsilk/page.md | 2 +- src/silk/docs/compiler/architecture/page.md | 2 +- src/silk/docs/compiler/async-runtime/page.md | 2 +- src/silk/docs/compiler/backend-amdgpu/page.md | 2 +- src/silk/docs/compiler/backend-gpu/page.md | 2 +- src/silk/docs/compiler/backend-nvidia/page.md | 2 +- src/silk/docs/compiler/backend-wasm/page.md | 2 +- src/silk/docs/compiler/build-scripts/page.md | 2 +- src/silk/docs/compiler/builtin-deps/page.md | 2 +- src/silk/docs/compiler/cache-silk/page.md | 2 +- src/silk/docs/compiler/cli-silk/page.md | 2 +- src/silk/docs/compiler/diagnostics/page.md | 2 +- .../compiler/implementation-status/page.md | 2 +- src/silk/docs/compiler/ir-overview/page.md | 2 +- .../docs/compiler/libsilk-quickstart/page.md | 2 +- src/silk/docs/compiler/limits/page.md | 2 +- src/silk/docs/compiler/lsp-silk/page.md | 2 +- .../compiler/package-distribution/page.md | 2 +- .../docs/compiler/package-manifests/page.md | 2 +- .../docs/compiler/stdlib-integration/page.md | 2 +- .../docs/compiler/testing-strategy/page.md | 2 +- src/silk/docs/compiler/vendored-deps/page.md | 2 +- src/silk/docs/compiler/zig-api/page.md | 2 +- src/silk/docs/guides/cli/page.md | 2 +- src/silk/docs/guides/formal-silk/page.md | 2 +- src/silk/docs/guides/hello-world/page.md | 2 +- src/silk/docs/guides/language-tour/page.md | 2 +- .../docs/guides/modules-and-packages/page.md | 2 +- .../guides/practical-logger-module/page.md | 2 +- .../docs/guides/project-dependencies/page.md | 2 +- src/silk/docs/guides/purpose/page.md | 2 +- src/silk/docs/guides/standard-library/page.md | 2 +- src/silk/docs/guides/testing/page.md | 2 +- src/silk/docs/language/asm/page.md | 2 +- src/silk/docs/language/atomics/page.md | 2 +- src/silk/docs/language/attributes/page.md | 2 +- src/silk/docs/language/borrow-checker/page.md | 2 +- src/silk/docs/language/buffers/page.md | 2 +- src/silk/docs/language/build-metadata/page.md | 2 +- src/silk/docs/language/cheat-sheet/page.md | 2 +- src/silk/docs/language/concurrency/page.md | 2 +- .../docs/language/const-functions/page.md | 2 +- src/silk/docs/language/conventions/page.md | 2 +- .../docs/language/dependent-types/page.md | 2 +- src/silk/docs/language/doc-comments/page.md | 2 +- .../docs/language/duration-instant/page.md | 2 +- src/silk/docs/language/enums/page.md | 2 +- src/silk/docs/language/errors/page.md | 2 +- src/silk/docs/language/ext/page.md | 2 +- .../language/flow-blocks-statements/page.md | 2 +- src/silk/docs/language/flow-break/page.md | 2 +- src/silk/docs/language/flow-continue/page.md | 2 +- .../flow-expression-statements/page.md | 2 +- src/silk/docs/language/flow-for/page.md | 2 +- src/silk/docs/language/flow-if-else/page.md | 2 +- src/silk/docs/language/flow-loop/page.md | 2 +- src/silk/docs/language/flow-match/page.md | 2 +- src/silk/docs/language/flow-overview/page.md | 2 +- src/silk/docs/language/flow-return/page.md | 2 +- src/silk/docs/language/flow-while/page.md | 2 +- .../docs/language/formal-verification/page.md | 2 +- .../language/function-disciplines/page.md | 2 +- src/silk/docs/language/generics/page.md | 2 +- src/silk/docs/language/gpu-execution/page.md | 2 +- .../docs/language/gpu-launch-blocks/page.md | 2 +- src/silk/docs/language/grammar/page.md | 2 +- src/silk/docs/language/interfaces/page.md | 2 +- .../docs/language/literals-aggregate/page.md | 2 +- .../docs/language/literals-boolean/page.md | 2 +- .../docs/language/literals-character/page.md | 2 +- .../docs/language/literals-duration/page.md | 2 +- .../docs/language/literals-numeric/page.md | 2 +- .../docs/language/literals-overview/page.md | 2 +- .../docs/language/literals-regexp/page.md | 2 +- .../docs/language/literals-string/page.md | 2 +- src/silk/docs/language/memory-model/page.md | 2 +- src/silk/docs/language/mutability/page.md | 2 +- src/silk/docs/language/operators/page.md | 2 +- src/silk/docs/language/optional/page.md | 2 +- .../language/packages-imports-exports/page.md | 2 +- src/silk/docs/language/regions/page.md | 2 +- .../docs/language/struct-requirements/page.md | 2 +- .../language/structs-impls-layout/page.md | 2 +- src/silk/docs/language/syntax-tour/page.md | 2 +- .../docs/language/target-metadata/page.md | 2 +- src/silk/docs/language/testing/page.md | 2 +- .../docs/language/toolchain-metadata/page.md | 2 +- src/silk/docs/language/type-unions/page.md | 2 +- src/silk/docs/language/typed-errors/page.md | 2 +- src/silk/docs/language/types/page.md | 2 +- src/silk/docs/language/using/page.md | 2 +- src/silk/docs/language/varargs/page.md | 2 +- src/silk/docs/man/libsilk.7/page.md | 2 +- src/silk/docs/man/silk-build.1/page.md | 2 +- src/silk/docs/man/silk-cache.1/page.md | 2 +- src/silk/docs/man/silk-cc.1/page.md | 2 +- src/silk/docs/man/silk-check.1/page.md | 2 +- src/silk/docs/man/silk-codesign.1/page.md | 2 +- src/silk/docs/man/silk-devices.1/page.md | 2 +- src/silk/docs/man/silk-doc.1/page.md | 2 +- src/silk/docs/man/silk-env.1/page.md | 2 +- src/silk/docs/man/silk-error.1/page.md | 2 +- src/silk/docs/man/silk-format.1/page.md | 2 +- src/silk/docs/man/silk-graph.1/page.md | 2 +- src/silk/docs/man/silk-guide.1/page.md | 2 +- src/silk/docs/man/silk-help.1/page.md | 2 +- src/silk/docs/man/silk-lsp.1/page.md | 2 +- src/silk/docs/man/silk-man.1/page.md | 2 +- src/silk/docs/man/silk-package.1/page.md | 2 +- src/silk/docs/man/silk-proto.1/page.md | 2 +- src/silk/docs/man/silk-repl.1/page.md | 2 +- src/silk/docs/man/silk-size.1/page.md | 2 +- src/silk/docs/man/silk-targets.1/page.md | 2 +- src/silk/docs/man/silk-test.1/page.md | 2 +- src/silk/docs/man/silk.1/page.md | 2 +- src/silk/docs/man/silk.7/page.md | 2 +- .../docs/man/silk_abi_get_version.3/page.md | 2 +- .../page.md | 2 +- src/silk/docs/man/silk_bytes.3/page.md | 2 +- src/silk/docs/man/silk_compiler.3/page.md | 2 +- src/silk/docs/man/silk_error.3/page.md | 2 +- src/silk/docs/man/slc.1/page.md | 2 +- src/silk/docs/man/slcc.1/page.md | 2 +- src/silk/docs/page.md | 2 +- src/silk/docs/std/abort-controller/page.md | 2 +- src/silk/docs/std/abort_controller/page.md | 2 +- src/silk/docs/std/algorithms/page.md | 2 +- src/silk/docs/std/args/page.md | 2 +- src/silk/docs/std/arrays/page.md | 2 +- src/silk/docs/std/atomic/page.md | 2 +- src/silk/docs/std/bits/page.md | 2 +- src/silk/docs/std/boolean/page.md | 2 +- src/silk/docs/std/boxed-values/page.md | 2 +- src/silk/docs/std/buffer/page.md | 2 +- src/silk/docs/std/build/page.md | 2 +- src/silk/docs/std/bytes/page.md | 2 +- src/silk/docs/std/conventions/page.md | 2 +- src/silk/docs/std/crypto-aead/page.md | 2 +- src/silk/docs/std/crypto-box/page.md | 2 +- src/silk/docs/std/crypto-hash/page.md | 2 +- src/silk/docs/std/crypto-random/page.md | 2 +- src/silk/docs/std/crypto-secretbox/page.md | 2 +- src/silk/docs/std/crypto-sign/page.md | 2 +- src/silk/docs/std/crypto/page.md | 2 +- src/silk/docs/std/dylib/page.md | 2 +- src/silk/docs/std/env/page.md | 2 +- src/silk/docs/std/ffi-c/page.md | 2 +- src/silk/docs/std/ffi-c_owned/page.md | 2 +- src/silk/docs/std/filesystem/page.md | 2 +- src/silk/docs/std/flag/page.md | 2 +- src/silk/docs/std/fmt/page.md | 2 +- src/silk/docs/std/formal/page.md | 2 +- src/silk/docs/std/fs-stream/page.md | 2 +- src/silk/docs/std/fs/page.md | 2 +- src/silk/docs/std/function/page.md | 2 +- src/silk/docs/std/ggml/page.md | 2 +- src/silk/docs/std/gpu-device/page.md | 2 +- src/silk/docs/std/gpu-isa/page.md | 2 +- src/silk/docs/std/gpu/page.md | 2 +- src/silk/docs/std/graphics-metal/page.md | 2 +- src/silk/docs/std/graphics-opengl/page.md | 2 +- src/silk/docs/std/graphics-opengles/page.md | 2 +- src/silk/docs/std/graphics-vulkan/page.md | 2 +- src/silk/docs/std/graphics-window/page.md | 2 +- src/silk/docs/std/graphics/page.md | 2 +- src/silk/docs/std/http/page.md | 2 +- src/silk/docs/std/https/page.md | 2 +- src/silk/docs/std/idl-web/page.md | 2 +- src/silk/docs/std/image-color/page.md | 2 +- src/silk/docs/std/image-jpeg/page.md | 2 +- src/silk/docs/std/image-png/page.md | 2 +- src/silk/docs/std/image/page.md | 2 +- src/silk/docs/std/interfaces/page.md | 2 +- src/silk/docs/std/io-async/page.md | 2 +- src/silk/docs/std/io-stream/page.md | 2 +- src/silk/docs/std/io/page.md | 2 +- src/silk/docs/std/js-ecma/page.md | 2 +- src/silk/docs/std/json/page.md | 2 +- src/silk/docs/std/limits/page.md | 2 +- src/silk/docs/std/list/page.md | 2 +- src/silk/docs/std/map/page.md | 2 +- src/silk/docs/std/math-matrix/page.md | 2 +- src/silk/docs/std/math-vector/page.md | 2 +- src/silk/docs/std/math/page.md | 2 +- src/silk/docs/std/memory/page.md | 2 +- src/silk/docs/std/mime/page.md | 2 +- src/silk/docs/std/module-catalog/page.md | 2 +- src/silk/docs/std/net-stream/page.md | 2 +- src/silk/docs/std/net/page.md | 2 +- src/silk/docs/std/networking/page.md | 2 +- src/silk/docs/std/number/page.md | 2 +- src/silk/docs/std/optional/page.md | 2 +- src/silk/docs/std/os/page.md | 2 +- src/silk/docs/std/overview/page.md | 2 +- src/silk/docs/std/package-structure/page.md | 2 +- src/silk/docs/std/path/page.md | 2 +- src/silk/docs/std/process-child/page.md | 2 +- src/silk/docs/std/process/page.md | 2 +- src/silk/docs/std/protobuf/page.md | 2 +- src/silk/docs/std/queue/page.md | 2 +- src/silk/docs/std/range/page.md | 2 +- src/silk/docs/std/readline/page.md | 2 +- src/silk/docs/std/regex/page.md | 2 +- src/silk/docs/std/result/page.md | 2 +- src/silk/docs/std/runtime-atomic/page.md | 2 +- src/silk/docs/std/runtime-build/page.md | 2 +- src/silk/docs/std/runtime-dylib/page.md | 2 +- src/silk/docs/std/runtime-env/page.md | 2 +- src/silk/docs/std/runtime-event_loop/page.md | 2 +- src/silk/docs/std/runtime-fs/page.md | 2 +- src/silk/docs/std/runtime-globals/page.md | 2 +- src/silk/docs/std/runtime-gpu/page.md | 2 +- .../docs/std/runtime-graphics-metal/page.md | 2 +- src/silk/docs/std/runtime-io/page.md | 2 +- .../docs/std/runtime-linux-event_loop/page.md | 2 +- src/silk/docs/std/runtime-mem/page.md | 2 +- src/silk/docs/std/runtime-net/page.md | 2 +- src/silk/docs/std/runtime-number/page.md | 2 +- .../docs/std/runtime-posix-atomic/page.md | 2 +- src/silk/docs/std/runtime-posix-dylib/page.md | 2 +- src/silk/docs/std/runtime-posix-env/page.md | 2 +- .../docs/std/runtime-posix-event_loop/page.md | 2 +- src/silk/docs/std/runtime-posix-fs/page.md | 2 +- src/silk/docs/std/runtime-posix-io/page.md | 2 +- src/silk/docs/std/runtime-posix-mem/page.md | 2 +- src/silk/docs/std/runtime-posix-net/page.md | 2 +- .../docs/std/runtime-posix-process/page.md | 2 +- .../docs/std/runtime-posix-signal/page.md | 2 +- src/silk/docs/std/runtime-posix-sync/page.md | 2 +- src/silk/docs/std/runtime-posix-task/page.md | 2 +- src/silk/docs/std/runtime-posix-time/page.md | 2 +- src/silk/docs/std/runtime-process/page.md | 2 +- src/silk/docs/std/runtime-readline/page.md | 2 +- src/silk/docs/std/runtime-regex/page.md | 2 +- src/silk/docs/std/runtime-signal/page.md | 2 +- src/silk/docs/std/runtime-sync/page.md | 2 +- src/silk/docs/std/runtime-task/page.md | 2 +- src/silk/docs/std/runtime-time/page.md | 2 +- src/silk/docs/std/runtime-unicode/page.md | 2 +- src/silk/docs/std/runtime-wasi-cwd/page.md | 2 +- src/silk/docs/std/runtime-wasi-env/page.md | 2 +- .../docs/std/runtime-wasi-event_loop/page.md | 2 +- src/silk/docs/std/runtime-wasi-fs/page.md | 2 +- src/silk/docs/std/runtime-wasi-io/page.md | 2 +- src/silk/docs/std/runtime-wasi-mem/page.md | 2 +- src/silk/docs/std/runtime-wasi-net/page.md | 2 +- .../docs/std/runtime-wasi-preopen/page.md | 2 +- .../docs/std/runtime-wasi-process/page.md | 2 +- src/silk/docs/std/runtime-wasi-signal/page.md | 2 +- src/silk/docs/std/runtime-wasi-sync/page.md | 2 +- src/silk/docs/std/runtime-wasi-task/page.md | 2 +- src/silk/docs/std/runtime-wasi-time/page.md | 2 +- src/silk/docs/std/runtime-window/page.md | 2 +- src/silk/docs/std/runtime-z3/page.md | 2 +- src/silk/docs/std/runtime/page.md | 2 +- src/silk/docs/std/semver/page.md | 2 +- src/silk/docs/std/set/page.md | 2 +- src/silk/docs/std/signal/page.md | 2 +- src/silk/docs/std/sqlite/page.md | 2 +- src/silk/docs/std/ssh/page.md | 2 +- src/silk/docs/std/ssh2/page.md | 2 +- src/silk/docs/std/stack/page.md | 2 +- src/silk/docs/std/stream/page.md | 2 +- src/silk/docs/std/strings/page.md | 2 +- src/silk/docs/std/sync/page.md | 2 +- src/silk/docs/std/tar-async/page.md | 2 +- src/silk/docs/std/tar/page.md | 2 +- src/silk/docs/std/task/page.md | 2 +- src/silk/docs/std/temporal/page.md | 2 +- src/silk/docs/std/test/page.md | 2 +- src/silk/docs/std/time/page.md | 2 +- src/silk/docs/std/tls/page.md | 2 +- src/silk/docs/std/toml/page.md | 2 +- src/silk/docs/std/unicode/page.md | 2 +- src/silk/docs/std/url/page.md | 2 +- src/silk/docs/std/uuid-random/page.md | 2 +- src/silk/docs/std/uuid/page.md | 2 +- src/silk/docs/std/vector/page.md | 2 +- src/silk/docs/std/wasm/page.md | 2 +- src/silk/docs/std/websocket/page.md | 2 +- src/silk/docs/std/window-gtk/page.md | 2 +- src/silk/docs/std/window-ios/page.md | 2 +- src/silk/docs/std/window-macos/page.md | 2 +- src/silk/docs/std/window/page.md | 2 +- src/silk/docs/std/xml/page.md | 2 +- src/silk/docs/std/z3/page.md | 2 +- src/silk/docs/usage/cli-examples/page.md | 2 +- src/silk/docs/usage/editor-coc-nvim/page.md | 2 +- src/silk/docs/usage/editor-ctags/page.md | 2 +- src/silk/docs/usage/editor-textmate/page.md | 2 +- src/silk/docs/usage/editor-vim/page.md | 2 +- src/silk/docs/usage/getting-started/page.md | 2 +- src/silk/docs/usage/github-actions/page.md | 2 +- src/silk/docs/usage/github-linguist/page.md | 2 +- src/silk/docs/usage/guide-examples/page.md | 2 +- .../usage/howto-custom-stdlib-root/page.md | 2 +- .../usage/howto-dynamic-libraries/page.md | 2 +- src/silk/docs/usage/howto-lumen-trail/page.md | 2 +- .../docs/usage/howto-run-wasi-node/page.md | 2 +- src/silk/docs/usage/pure-silk-gpu-ml/page.md | 2 +- src/silk/docs/usage/pure-silk-gpu/page.md | 2 +- .../usage/tutorials/01-first-program/page.md | 2 +- .../tutorials/02-structs-and-impls/page.md | 2 +- .../tutorials/03-arrays-and-slices/page.md | 2 +- .../usage/tutorials/04-filesystem/page.md | 2 +- .../usage/tutorials/05-concurrency/page.md | 2 +- .../06-async-io-streams-abort/page.md | 2 +- .../usage/tutorials/07-formal-silk/page.md | 2 +- src/silk/wiki/language/borrow-checker/page.md | 2 +- src/silk/wiki/language/buffers/page.md | 2 +- src/silk/wiki/language/cheat-sheet/page.md | 2 +- src/silk/wiki/language/concurrency/page.md | 2 +- .../wiki/language/const-functions/page.md | 2 +- src/silk/wiki/language/conventions/page.md | 2 +- .../wiki/language/dependent-types/page.md | 2 +- src/silk/wiki/language/doc-comments/page.md | 2 +- .../wiki/language/duration-instant/page.md | 2 +- src/silk/wiki/language/enums/page.md | 2 +- src/silk/wiki/language/errors/page.md | 2 +- src/silk/wiki/language/ext/page.md | 2 +- .../language/flow-blocks-statements/page.md | 2 +- src/silk/wiki/language/flow-break/page.md | 2 +- src/silk/wiki/language/flow-continue/page.md | 2 +- .../flow-expression-statements/page.md | 2 +- src/silk/wiki/language/flow-for/page.md | 2 +- src/silk/wiki/language/flow-if-else/page.md | 2 +- src/silk/wiki/language/flow-loop/page.md | 2 +- src/silk/wiki/language/flow-match/page.md | 2 +- src/silk/wiki/language/flow-overview/page.md | 2 +- src/silk/wiki/language/flow-return/page.md | 2 +- src/silk/wiki/language/flow-while/page.md | 2 +- .../wiki/language/formal-verification/page.md | 2 +- .../language/function-disciplines/page.md | 2 +- src/silk/wiki/language/generics/page.md | 2 +- src/silk/wiki/language/grammar/page.md | 2 +- src/silk/wiki/language/interfaces/page.md | 2 +- .../wiki/language/literals-aggregate/page.md | 2 +- .../wiki/language/literals-boolean/page.md | 2 +- .../wiki/language/literals-character/page.md | 2 +- .../wiki/language/literals-duration/page.md | 2 +- .../wiki/language/literals-numeric/page.md | 2 +- .../wiki/language/literals-overview/page.md | 2 +- .../wiki/language/literals-string/page.md | 2 +- src/silk/wiki/language/memory-model/page.md | 2 +- src/silk/wiki/language/mutability/page.md | 2 +- src/silk/wiki/language/operators/page.md | 2 +- src/silk/wiki/language/optional/page.md | 2 +- .../language/packages-imports-exports/page.md | 2 +- src/silk/wiki/language/regions/page.md | 2 +- .../wiki/language/struct-requirements/page.md | 2 +- .../language/structs-impls-layout/page.md | 2 +- src/silk/wiki/language/syntax-tour/page.md | 2 +- src/silk/wiki/language/testing/page.md | 2 +- src/silk/wiki/language/typed-errors/page.md | 2 +- src/silk/wiki/language/types/page.md | 2 +- src/silk/wiki/language/varargs/page.md | 2 +- src/silk/wiki/page.md | 2 +- src/silk/wiki/std/algorithms/page.md | 2 +- src/silk/wiki/std/args/page.md | 2 +- src/silk/wiki/std/arrays/page.md | 2 +- src/silk/wiki/std/bits/page.md | 2 +- src/silk/wiki/std/buffer/page.md | 2 +- src/silk/wiki/std/conventions/page.md | 2 +- src/silk/wiki/std/crypto/page.md | 2 +- src/silk/wiki/std/env/page.md | 2 +- src/silk/wiki/std/filesystem/page.md | 2 +- src/silk/wiki/std/fmt/page.md | 2 +- src/silk/wiki/std/formal/page.md | 2 +- src/silk/wiki/std/interfaces/page.md | 2 +- src/silk/wiki/std/io/page.md | 2 +- src/silk/wiki/std/json/page.md | 2 +- src/silk/wiki/std/map/page.md | 2 +- src/silk/wiki/std/memory/page.md | 2 +- src/silk/wiki/std/networking/page.md | 2 +- src/silk/wiki/std/overview/page.md | 2 +- src/silk/wiki/std/package-structure/page.md | 2 +- src/silk/wiki/std/path/page.md | 2 +- src/silk/wiki/std/process/page.md | 2 +- src/silk/wiki/std/result/page.md | 2 +- src/silk/wiki/std/runtime/page.md | 2 +- src/silk/wiki/std/semver/page.md | 2 +- src/silk/wiki/std/set/page.md | 2 +- src/silk/wiki/std/strings/page.md | 2 +- src/silk/wiki/std/sync/page.md | 2 +- src/silk/wiki/std/task/page.md | 2 +- src/silk/wiki/std/temporal/page.md | 2 +- src/silk/wiki/std/tls/page.md | 2 +- src/silk/wiki/std/toml/page.md | 2 +- src/silk/wiki/std/url/page.md | 2 +- src/silk/wiki/std/uuid/page.md | 2 +- src/silk/wiki/std/vector/page.md | 2 +- src/silkWiki-index.template.ts | 6 + src/silkWiki-search.template.ts | 6 + src/silkWiki-sources.template.ts | 6 + src/sitemap.template.ts | 6 + src/slg-index.template.ts | 6 + src/slg-llms.template.ts | 6 + src/slg-search.template.ts | 6 + src/slg-sources.template.ts | 6 + src/slg/docs/cli/diagnostics/page.md | 2 +- .../docs/cli/input-types-and-parsing/page.md | 2 +- src/slg/docs/cli/options-reference/page.md | 2 +- .../docs/cli/output-and-exit-codes/page.md | 2 +- src/slg/docs/cli/parallelism/page.md | 2 +- .../docs/cli/patterns-and-matching/page.md | 2 +- src/slg/docs/cli/slg/page.md | 2 +- .../docs/cli/traversal-and-ignores/page.md | 2 +- src/slg/docs/guides/getting-started/page.md | 2 +- src/slg/docs/guides/search-recipes/page.md | 2 +- src/slg/docs/man/slg-1/page.md | 2 +- src/slg/docs/page.md | 2 +- src/style.css | 1228 +++++ src/virtnosis-index.template.ts | 6 + src/virtnosis-llms.template.ts | 6 + src/virtnosis-search.template.ts | 6 + src/virtnosis-sources.template.ts | 6 + .../docs/cli/virtnosis-agent/page.md | 2 +- src/virtnosis/docs/cli/vnactl/page.md | 2 +- src/virtnosis/docs/guides/deployment/page.md | 2 +- .../docs/guides/getting-started/page.md | 2 +- .../docs/guides/install-and-package/page.md | 2 +- .../docs/guides/operator-guide/page.md | 2 +- .../docs/guides/output-and-automation/page.md | 2 +- src/virtnosis/docs/guides/systemd/page.md | 2 +- src/virtnosis/docs/man/virtnosis-7/page.md | 2 +- .../docs/man/virtnosis-agent-1/page.md | 2 +- .../man/virtnosis-agent-protocol-7/page.md | 2 +- .../docs/man/virtnosis-scan-report-7/page.md | 2 +- src/virtnosis/docs/man/vnactl-1/page.md | 2 +- src/virtnosis/docs/page.md | 2 +- .../docs/reference/architecture/page.md | 2 +- .../docs/reference/development/page.md | 2 +- src/virtnosis/docs/reference/overview/page.md | 2 +- .../docs/reference/repository-docs/page.md | 2 +- .../docs/reference/scan-analysis/page.md | 2 +- tests/browser/client.spec.ts | 72 + tests/docs-data.test.ts | 60 + tests/docs-watch.test.ts | 93 + tests/ingestion-fixtures.json | 410 ++ tests/ingestion-import.test.ts | 80 + tests/ingestion.test.ts | 127 +- tests/test_ingestion.py | 80 - tests/tooling/content-audit-baseline.json | 37 + tests/tooling/content-audit.test.ts | 71 + tools/audit-content.ts | 30 + tools/audits/common.ts | 176 + tools/audits/runtime.ts | 65 + tools/audits/silk.ts | 75 + tools/import-public.ts | 2 +- tools/migration/content.ts | 2 +- tools/migration/migrate.ts | 2 +- .../{public-copy.js => public-copy.ts} | 29 +- tools/serve-output.ts | 67 + tools/silk-editorial.ts | 192 + tools/silk-ingestion-data.ts | 231 + tools/site_audit_common.py | 315 -- tools/source-pages.py | 43 - tools/source-pages.ts | 74 + tsconfig.json | 5 +- virtnosis/tools/audit-site.py | 32 - 686 files changed, 7051 insertions(+), 7615 deletions(-) delete mode 100644 runtime/tools/audit-site.py delete mode 100644 runtime/tools/generate-js-api-reference.py create mode 100644 runtime/tools/generate-js-api-reference.ts create mode 100644 runtime/tools/js-api-reference-content.ts delete mode 100644 runtime/tools/js_api_reference_content.py delete mode 100644 sage/tools/audit-site.py delete mode 100644 silk/tools/audit-site.py delete mode 100644 silk/tools/audit-stdlib-docs.py delete mode 100644 silk/tools/sync-from-silk-docs.py create mode 100644 silk/tools/sync-from-silk-docs.ts delete mode 100644 slg/tools/audit-site.py create mode 100644 src/docs/client.ts delete mode 100644 src/globals/global.client.js create mode 100644 src/globals/global.client.ts create mode 100644 src/layouts/learn.layout.css delete mode 100644 src/layouts/product.layout.client.ts create mode 100644 src/layouts/runtime-docs.layout.ts create mode 100644 src/layouts/sage-docs.layout.ts create mode 100644 src/layouts/silk-docs.layout.ts create mode 100644 src/layouts/silkWiki-docs.layout.ts create mode 100644 src/layouts/slg-docs.layout.ts create mode 100644 src/layouts/virtnosis-docs.layout.ts create mode 100644 src/lib/artifacts.ts create mode 100644 src/lib/ask-ai-client.ts rename src/lib/{clipboard.js => clipboard.ts} (89%) delete mode 100644 src/lib/learn-client.js create mode 100644 src/lib/learn-client.ts create mode 100644 src/lib/rendering.ts rename src/lib/{silk.js => silk.ts} (97%) rename src/lib/{tabs.js => tabs.ts} (85%) rename src/lib/{toml.js => toml.ts} (94%) rename src/lib/{zig.js => zig.ts} (94%) create mode 100644 src/runtime-index.template.ts create mode 100644 src/runtime-llms.template.ts create mode 100644 src/runtime-search.template.ts create mode 100644 src/runtime-sources.template.ts create mode 100644 src/sage-index.template.ts create mode 100644 src/sage-llms.template.ts create mode 100644 src/sage-search.template.ts create mode 100644 src/sage-sources.template.ts create mode 100644 src/silk-index.template.ts create mode 100644 src/silk-llms.template.ts create mode 100644 src/silk-search.template.ts create mode 100644 src/silk-sources.template.ts create mode 100644 src/silkWiki-index.template.ts create mode 100644 src/silkWiki-search.template.ts create mode 100644 src/silkWiki-sources.template.ts create mode 100644 src/sitemap.template.ts create mode 100644 src/slg-index.template.ts create mode 100644 src/slg-llms.template.ts create mode 100644 src/slg-search.template.ts create mode 100644 src/slg-sources.template.ts create mode 100644 src/style.css create mode 100644 src/virtnosis-index.template.ts create mode 100644 src/virtnosis-llms.template.ts create mode 100644 src/virtnosis-search.template.ts create mode 100644 src/virtnosis-sources.template.ts create mode 100644 tests/browser/client.spec.ts create mode 100644 tests/docs-data.test.ts create mode 100644 tests/docs-watch.test.ts create mode 100644 tests/ingestion-fixtures.json create mode 100644 tests/ingestion-import.test.ts delete mode 100644 tests/test_ingestion.py create mode 100644 tests/tooling/content-audit-baseline.json create mode 100644 tests/tooling/content-audit.test.ts create mode 100644 tools/audit-content.ts create mode 100644 tools/audits/common.ts create mode 100644 tools/audits/runtime.ts create mode 100644 tools/audits/silk.ts rename tools/migration/{public-copy.js => public-copy.ts} (96%) create mode 100644 tools/serve-output.ts create mode 100644 tools/silk-editorial.ts create mode 100644 tools/silk-ingestion-data.ts delete mode 100644 tools/site_audit_common.py delete mode 100644 tools/source-pages.py create mode 100644 tools/source-pages.ts delete mode 100644 virtnosis/tools/audit-site.py diff --git a/.github/workflows/docs-audit.yml b/.github/workflows/docs-audit.yml index 7c818c5a..361f4724 100644 --- a/.github/workflows/docs-audit.yml +++ b/.github/workflows/docs-audit.yml @@ -2,8 +2,7 @@ name: Docs Audit on: pull_request: - push: - branches: [main, master] + workflow_dispatch: permissions: @@ -18,9 +17,7 @@ jobs: with: node-version: '24' cache: npm - - uses: actions/setup-python@v5 - with: - python-version: '3.12' + - run: npm ci - run: npx playwright install --with-deps chromium - run: npm run check diff --git a/.github/workflows/pages.yml b/.github/workflows/pages.yml index 699f94ca..16e7a962 100644 --- a/.github/workflows/pages.yml +++ b/.github/workflows/pages.yml @@ -21,13 +21,20 @@ jobs: with: node-version: '24' cache: npm - - uses: actions/setup-python@v5 - with: - python-version: '3.12' + - run: npm ci # Upstream ingestion is manual. Validate only the committed public sources. - run: npx playwright install --with-deps chromium - run: npm run check + - name: Verify source files remain unchanged + run: | + git diff --check + git diff --exit-code + - uses: actions/upload-artifact@v4 + if: failure() + with: + name: browser-test-results + path: test-results/ - uses: actions/upload-pages-artifact@v3 with: path: public diff --git a/README.md b/README.md index 90440daf..ab9e912f 100644 --- a/README.md +++ b/README.md @@ -5,7 +5,8 @@ chapters, and documentation for Runtime, Silk, Virtnosis, Sage, and slg. ## Local development -Use Node 24 and Python 3.12. No sibling checkout is needed to build the site. +Use Node 24. Builds, ingestion tools, audits, and tests run in TypeScript on Node; +Python is not required. No sibling checkout is needed to build the site. ```sh npm ci @@ -21,16 +22,25 @@ are output files; do not commit `public/`. - `src/**/page.html`: authored page fragments, with metadata in `page.vars.ts`. - `src/**/page.md`: public documentation, including YAML frontmatter. - `src/layouts/`: shared page chrome, navigation, and progressive browser clients. -- `src/globals/global.css`: Oro styles, based on `docs/branding/`. +- `src/globals/global.css`: shared Oro styles, based on `docs/branding/`. + Homepage styles live in `src/style.css`; learn styles in `src/layouts/learn.layout.css`. - `src/lib/`: rendering, URL, collection, and navigation helpers. -- `src/global.data.ts`: collection data derived from source pages. -- `src/artifacts.template.ts`: navigation/search JSON, raw Markdown, LLM packs, - and sitemap output. +- `src/global.data.ts`: validated collection metadata and precomputed navigation, + search, and source-export projections derived from source pages. +- `src/layouts/*-docs.layout.ts`: thin collection-specific data + consumers sharing the docs renderer and its assets. +- `src/*-{index,search,sources,llms}.template.ts`: dependency-scoped collection + artifacts; `src/sitemap.template.ts`: sitemap output; + `src/artifacts.template.ts`: site-wide LLM directory and `.nojekyll`. Consult `docs/branding/` before changing visual design or copy tone. The approved logo originals remain in `docs/branding/assets/`; their checked mirrors in `src/docs/branding/assets/` retain the same public URLs. Update both when replacing an asset. Handlebars is disabled globally so literal `{{ ... }}` code -examples remain intact. +examples remain intact. The Markdown parser deliberately keeps the existing +plugin policy: tables, strikethrough, HTML, linkification, GitHub alerts, syntax +highlighting, and legacy heading IDs. DOMStack's other default extensions are +not implicitly enabled; review fragment and rendered-output compatibility before +adding plugins. Each documentation page declares `title`, `description`, `docsCollection`, `section`, `order`, `sourcePath`, `githubRepo`, and `githubRef`. Preserve @@ -38,6 +48,9 @@ Each documentation page declares `title`, `description`, `docsCollection`, The `start` document lives at its collection root; the specification lives at `src/silk/spec/2026/page.md`. Order is explicit and does not depend on filenames. New imported pages are appended; review their section and order after syncing. +Use the collection-specific layout, such as `runtime-docs` or `silkWiki-docs`, +for new documentation pages (`spec` for the specification). The shared `docs` +layout is an asset-bearing parent, not a standalone article renderer. Use canonical directory links such as `/runtime/docs/guides/hello-world/`. Collection roots redirect legacy `?p=` links while preserving fragments. Static @@ -52,8 +65,8 @@ checkouts, preserve the established curated/website-owned content, and write committed DOMStack Markdown pages. Review and commit their changes before deploying. ```sh -python3 silk/tools/sync-from-silk-docs.py --silk-repo /path/to/silk -python3 runtime/tools/generate-js-api-reference.py --runtime-repo /path/to/runtime +node silk/tools/sync-from-silk-docs.ts --silk-repo /path/to/silk +node runtime/tools/generate-js-api-reference.ts --runtime-repo /path/to/runtime npm run build npm run audit npm run audit:content @@ -69,8 +82,10 @@ linked API headings become plain-text titles when a page changes. The reference catalog includes new pages in the same import batch. Runtime's generated reference markers retain surrounding prose. -The Python index and LLM exporters have been replaced by DOMStack templates. -Content audits inspect `public/` by default; set `ORO_SITE_OUTPUT` to inspect +The generators call the TypeScript importer directly; they never run during a +DOMStack build. JSON indexes and LLM exports are DOMStack templates, not ingestion +outputs. Content audits run through `tools/audit-content.ts` and inspect `public/` +by default; set `ORO_SITE_OUTPUT` to inspect another output directory. Set `ORO_RUNTIME_REPO` explicitly to additionally audit against a particular upstream Runtime checkout; ordinary checks are independent of whatever happens to be checked out next door. @@ -117,7 +132,10 @@ update the relevant assertions and redirects together. ## Deployment and dependency updates -GitHub Actions builds and uploads `public/` and deploys with the Pages environment. +Pull requests run the Docs Audit workflow. Production-branch pushes run the +Pages workflow, which validates once, uploads that checked `public/` artifact, +and deploys with the Pages environment. Both workflows use Node only and retain +browser failure artifacts. The repository's **Settings → Pages → Source** must be **GitHub Actions**. Merging these changes does not itself change that repository setting. The output contains `CNAME`, `.nojekyll`, branding assets, raw Markdown, and `llms.txt` packs. diff --git a/docs/migration.md b/docs/migration.md index 08b0bfb4..5d052595 100644 --- a/docs/migration.md +++ b/docs/migration.md @@ -14,9 +14,18 @@ remains reproducible. Production cutover is complete; deployment evidence is rec | Page chrome | Headers, footers, metadata, product navigation, learn chapter bars, documentation sidebars, breadcrumbs, previous/next links, and heading lists render at build time. | | Progressive features | Search, keyboard tabs, copy controls, Ask AI, mobile sidebar controls, active headings, and tab fragments work with browser JavaScript. | | Artifacts | One build emits HTML, indexes, search data, raw Markdown, LLM packs, the sitemap, CNAME, and `.nojekyll`. | -| Ingestion | Silk and Runtime retain their upstream/editorial ownership rules and accept explicit upstream checkout paths. Unchanged public pages retain exact Markdown and metadata. | +| Ingestion | Native TypeScript tools retain Silk and Runtime upstream/editorial ownership rules and explicit checkout paths. Unchanged public pages retain exact Markdown and metadata. | | Cleanup | The browser Markdown renderers, vendored rendering libraries, old HTML shells, duplicate Python exporters, generated source-tree indexes, and Jekyll configuration are retired. | -| CI | Audit and deployment workflows use Node 24, Python 3.12, and the same `npm run check` gate. | +| CI | Node 24 runs ingestion, audits, browser serving, and the `npm run check` gate without Python. Pull requests validate in Docs Audit; production pushes validate and deploy the same artifact in Pages, without a duplicate push audit. | + +Collection layouts subscribe to lightweight, collection-specific navigation keys. +Search and raw-source/LLM templates have separate dependencies, so document-body +edits do not invalidate unrelated navigation consumers. Shared article transforms +remain page-local rather than storing rendered articles in global data. Markdown +keeps the existing alerts, highlighting, and legacy heading-ID policy; enabling +additional DOMStack Markdown plugins is an explicit compatibility decision. +Homepage and learn styles are scoped to their consumers, and progressive clients +are TypeScript modules rather than unchecked global initializers. The route inventory is in `tools/migration/baseline.json`; original Markdown links and heading text are in `tools/migration/link-inventory.json`. The migration diff --git a/package.json b/package.json index 0f39c367..610cda61 100644 --- a/package.json +++ b/package.json @@ -8,6 +8,7 @@ "scripts": { "clean": "node tools/clean.ts", "build": "npm run clean && domstack", + "start": "domstack --serve", "dev": "domstack --watch", "preview": "domstack --serve", "typecheck": "tsc --noEmit", @@ -16,7 +17,7 @@ "test:site": "node --test tests/site/*.test.ts", "test:browser": "playwright test", "test:reproducibility": "node tools/reproducibility.ts", - "audit:content": "python3 runtime/tools/audit-site.py && python3 silk/tools/audit-site.py && python3 silk/tools/audit-stdlib-docs.py && python3 sage/tools/audit-site.py && python3 slg/tools/audit-site.py && python3 virtnosis/tools/audit-site.py", + "audit:content": "node tools/audit-content.ts", "test:tooling": "node --test tests/tooling/*.test.ts", "check": "npm run typecheck && npm test && npm run build && npm run audit && npm run audit:content && npm run test:site && npm run test:browser && npm run test:tooling && npm run test:reproducibility" }, diff --git a/playwright.config.ts b/playwright.config.ts index 28713868..ab6dddd3 100644 --- a/playwright.config.ts +++ b/playwright.config.ts @@ -9,7 +9,7 @@ export default defineConfig({ : {}, }, webServer: { - command: 'python3 -m http.server 9877 --bind 127.0.0.1 --directory public', + command: 'node tools/serve-output.ts', url: 'http://127.0.0.1:9877', reuseExistingServer: !process.env.CI, }, diff --git a/runtime/tools/audit-site.py b/runtime/tools/audit-site.py deleted file mode 100644 index c183de2c..00000000 --- a/runtime/tools/audit-site.py +++ /dev/null @@ -1,212 +0,0 @@ -#!/usr/bin/env python3 - -from __future__ import annotations - -import re -import sys -import os -from pathlib import Path - - -SITE_ROOT = Path(__file__).resolve().parents[2] -RUNTIME_ROOT = Path(os.environ.get("ORO_SITE_OUTPUT", str(SITE_ROOT / "public"))) / "runtime" -REPO_ROOT = RUNTIME_ROOT.parent -JAVASCRIPT_DOCS = RUNTIME_ROOT / "docs" / "source" / "javascript" -CLI_DOCS = RUNTIME_ROOT / "docs" / "source" / "cli" -UPSTREAM_RUNTIME_ROOT = Path(os.environ["ORO_RUNTIME_REPO"]) if "ORO_RUNTIME_REPO" in os.environ else None -UPSTREAM_RUNTIME_INDEX = UPSTREAM_RUNTIME_ROOT / "api" / "index.d.ts" if UPSTREAM_RUNTIME_ROOT else None -UPSTREAM_RUNTIME_CLI = UPSTREAM_RUNTIME_ROOT / "api" / "CLI.md" if UPSTREAM_RUNTIME_ROOT else None - -sys.path.insert(0, str(SITE_ROOT / "tools")) - -from site_audit_common import SiteAuditConfig, run_site_audit - - -CURATED_FILES_BY_FAMILY = { - "oro:ai": "ai.md", - "oro:application": "application.md", - "oro:extension": "extension.md", - "oro:fs": "fs.md", - "oro:hooks": "hooks.md", - "oro:mcp": "mcp.md", - "oro:notification": "notification.md", - "oro:secure-storage": "secure-storage.md", - "oro:window": "window.md", -} - - -EXCLUDED_PUBLIC_FAMILIES = { - "oro:bootstrap", - "oro:external", - "oro:internal", - "oro:node", - "oro:node-esm-loader", -} - - -MODULE_START = re.compile(r"^declare module ['\"](?Poro:[^'\"]+)['\"]", re.M) -EXAMPLE_HEADING_RE = re.compile(r"^\s*##\s+.*examples?\b", re.I | re.M) - -CLI_SECTION_TO_DOC = { - "oroc": "cli/oroc.md", - "oroc help": "cli/help.md", - "oroc update": "cli/update.md", - "oroc update-init": "cli/update/init.md", - "oroc update-server": "cli/update/server.md", - "oroc update-info": "cli/update/info.md", - "oroc update-keygen": "cli/update/keygen.md", - "oroc update-sign": "cli/update/sign.md", - "oroc update-verify": "cli/update/verify.md", - "oroc update-validate": "cli/update/validate.md", - "oroc update-bundle": "cli/update/bundle.md", - "oroc update-extract": "cli/update/extract.md", - "oroc build": "cli/build.md", - "oroc run": "cli/run.md", - "oroc list-devices": "cli/list-devices.md", - "oroc env": "cli/env.md", - "oroc mcp": "cli/mcp.md", - "oroc init": "cli/init.md", - "oroc install-app": "cli/install-app.md", - "oroc print-build-dir": "cli/print-build-dir.md", - "oroc setup": "cli/setup.md", - "oroc config": "cli/config.md", - "oroc versions": "cli/versions.md", - "oroc version": "cli/version.md", -} - - -def family_reference_re(family: str) -> re.Pattern[str]: - return re.compile(rf"`?{re.escape(family)}(?:/\*|/[A-Za-z0-9._-]+(?:/[A-Za-z0-9._-]+)*)`?") - - -def parse_runtime_specifiers() -> tuple[set[str], set[str]]: - if UPSTREAM_RUNTIME_INDEX is None or not UPSTREAM_RUNTIME_INDEX.exists(): - return set(), set() - text = UPSTREAM_RUNTIME_INDEX.read_text(encoding="utf-8") - specifiers = set(MODULE_START.findall(text)) - families = {spec.split("/", 1)[0] for spec in specifiers} - return families, specifiers - - -def parse_runtime_cli_sections() -> set[str]: - if UPSTREAM_RUNTIME_CLI is None or not UPSTREAM_RUNTIME_CLI.exists(): - return set() - text = UPSTREAM_RUNTIME_CLI.read_text(encoding="utf-8") - return set(re.findall(r"^##\s+([^\n]+)$", text, re.M)) - - -def iter_runtime_doc_issues() -> list[str]: - issues: list[str] = [] - - if (JAVASCRIPT_DOCS / "module-index.md").exists(): - issues.append( - f"{(JAVASCRIPT_DOCS / 'module-index.md').relative_to(REPO_ROOT)}: remove this page; link JavaScript API entry points to javascript/overview." - ) - - for path in sorted(JAVASCRIPT_DOCS.glob("*.md")): - text = path.read_text(encoding="utf-8") - rel = path.relative_to(REPO_ROOT) - - if "console.log(Object.keys(api))" in text: - issues.append(f"{rel}: remove generic Object.keys(api) examples; document a real usage flow instead.") - - if ( - path.stem not in {"overview", "all-modules"} - and path.name not in set(CURATED_FILES_BY_FAMILY.values()) - and not EXAMPLE_HEADING_RE.search(text) - ): - issues.append(f"{rel}: missing an Examples section.") - - families, specifiers = parse_runtime_specifiers() - if families and specifiers: - public_families = {family for family in families if family not in EXCLUDED_PUBLIC_FAMILIES} - public_specifiers = { - spec for spec in specifiers if spec.split("/", 1)[0] not in EXCLUDED_PUBLIC_FAMILIES - } - - for family in sorted(public_families): - expected = CURATED_FILES_BY_FAMILY.get(family, f"{family.removeprefix('oro:')}.md") - if not (JAVASCRIPT_DOCS / expected).exists(): - issues.append( - f"{(JAVASCRIPT_DOCS / expected).relative_to(REPO_ROOT)}: missing docs page for published module family {family}." - ) - - for family in sorted(EXCLUDED_PUBLIC_FAMILIES): - excluded_path = JAVASCRIPT_DOCS / f"{family.removeprefix('oro:')}.md" - if excluded_path.exists(): - issues.append( - f"{excluded_path.relative_to(REPO_ROOT)}: excluded private module family {family} should not have a public docs page." - ) - - all_modules = (JAVASCRIPT_DOCS / "all-modules.md").read_text(encoding="utf-8") - - for family in sorted(EXCLUDED_PUBLIC_FAMILIES): - family_ref = family_reference_re(family) - if family_ref.search(all_modules): - issues.append( - f"{(JAVASCRIPT_DOCS / 'all-modules.md').relative_to(REPO_ROOT)}: excluded private module family {family} should not appear in the public module listing." - ) - - for spec in sorted(public_specifiers): - if spec not in all_modules: - issues.append( - f"{(JAVASCRIPT_DOCS / 'all-modules.md').relative_to(REPO_ROOT)}: missing published module specifier {spec}." - ) - - cli_sections = parse_runtime_cli_sections() - if cli_sections: - for section, rel_path in sorted(CLI_SECTION_TO_DOC.items()): - if section not in cli_sections: - continue - path = RUNTIME_ROOT / "docs" / "source" / rel_path - if not path.exists(): - issues.append( - f"{path.relative_to(REPO_ROOT)}: missing website docs page for upstream CLI section `{section}`." - ) - - stale_repo_patterns = ( - (re.compile(r"oro-computer/" + r"oro" + r"-runtime"), "deprecated runtime repository alias"), - (re.compile(r"oro-computer/" + r"legacy" + r"-runtime"), "deprecated runtime repository alias"), - (re.compile(r"\blegacy" + r"-runtime\b"), "deprecated runtime repository alias"), - ) - for path in ( - REPO_ROOT / "index.html", - RUNTIME_ROOT / "index.html", - RUNTIME_ROOT / "docs" / "index.html", - ): - text = path.read_text(encoding="utf-8") - for pattern, label in stale_repo_patterns: - if pattern.search(text): - issues.append(f"{path.relative_to(REPO_ROOT)}: stale runtime repository reference ({label}).") - - return issues - - -def main() -> int: - rc = run_site_audit( - SiteAuditConfig( - project_root=RUNTIME_ROOT, - docs_source=RUNTIME_ROOT / "docs" / "source", - docs_index=RUNTIME_ROOT / "docs" / "index.json", - missing_index_message="Missing Runtime docs/index.json; run build scripts first.", - success_message="OK: runtime site audit passed", - ) - ) - if rc != 0: - return rc - - issues = iter_runtime_doc_issues() - if issues: - for issue in issues[:200]: - print(issue, file=sys.stderr) - if len(issues) > 200: - print(f"... and {len(issues) - 200} more", file=sys.stderr) - print(f"FAIL: {len(issues)} runtime docs issues", file=sys.stderr) - return 1 - - print("OK: runtime docs audit passed") - return 0 - - -if __name__ == "__main__": - raise SystemExit(main()) diff --git a/runtime/tools/generate-js-api-reference.py b/runtime/tools/generate-js-api-reference.py deleted file mode 100644 index 726f7e73..00000000 --- a/runtime/tools/generate-js-api-reference.py +++ /dev/null @@ -1,318 +0,0 @@ -#!/usr/bin/env python3 - -from __future__ import annotations - -import argparse -import re -import sys -import tempfile -from dataclasses import dataclass -from pathlib import Path - -sys.path.insert(0, str(Path(__file__).resolve().parents[2] / "tools")) -from importlib import import_module -source_pages = import_module("source-pages") - -from js_api_reference_content import ( - DEFAULT_SEE_ALSO, - DESCRIPTION_BY_FAMILY, - EXAMPLES_BY_FAMILY, - GUIDE_REFS_BY_FAMILY, -) - - -MODULE_START = re.compile(r"^declare module ['\"](?Poro:[^'\"]+)['\"]\s*\{\s*$") - - -CURATED_FAMILIES = { - "oro:ai", - "oro:application", - "oro:extension", - "oro:fs", - "oro:hooks", - "oro:mcp", - "oro:notification", - "oro:secure-storage", - "oro:window", -} - - -EXCLUDED_PUBLIC_FAMILIES = { - "oro:bootstrap", - "oro:external", - "oro:internal", - "oro:node", - "oro:node-esm-loader", -} - - -CURATED_FILES_BY_FAMILY = { - "oro:ai": "ai.md", - "oro:application": "application.md", - "oro:extension": "extension.md", - "oro:fs": "fs.md", - "oro:hooks": "hooks.md", - "oro:mcp": "mcp.md", - "oro:notification": "notification.md", - "oro:secure-storage": "secure-storage.md", - "oro:window": "window.md", -} - - -REF_START = "" -REF_END = "" - - -@dataclass(frozen=True) -class ModuleBlock: - spec: str - block: str - - -def repo_root() -> Path: - return Path(__file__).resolve().parents[2] - - -def read_text(path: Path) -> str: - return path.read_text(encoding="utf-8") - - -def write_text_if_changed(path: Path, text: str) -> bool: - path.parent.mkdir(parents=True, exist_ok=True) - prev = path.read_text(encoding="utf-8") if path.exists() else None - if prev == text: - return False - path.write_text(text, encoding="utf-8") - return True - - -def parse_index_d_ts(text: str) -> dict[str, ModuleBlock]: - lines = text.splitlines() - out: dict[str, ModuleBlock] = {} - i = 0 - - while i < len(lines): - m = MODULE_START.match(lines[i]) - if not m: - i += 1 - continue - - spec = m.group("name").strip() - buf: list[str] = [lines[i].rstrip()] - i += 1 - - while i < len(lines): - line = lines[i].rstrip() - buf.append(line) - if line == "}" and not lines[i].startswith((" ", "\t")): - break - i += 1 - - block = "\n".join(buf).rstrip() + "\n" - out[spec] = ModuleBlock(spec=spec, block=block) - i += 1 - - if not out: - raise SystemExit("No `declare module 'oro:*' { ... }` blocks found.") - - return out - - -def family_of(spec: str) -> str: - return spec.split("/", 1)[0] - - -def sort_specs_in_family(family: str, specs: list[str]) -> list[str]: - return sorted(specs, key=lambda s: (s != family, s)) - - -def preferred_import_spec(family: str, specs: list[str], blocks: dict[str, ModuleBlock]) -> str: - if family in blocks: - return family - for s in specs: - if s.endswith("/index"): - return s - return specs[0] - - -def family_title(family: str, blocks: dict[str, ModuleBlock]) -> str: - if family in blocks: - return f"`{family}`" - return f"`{family}/*`" - - -def family_intro(family: str) -> str: - return DESCRIPTION_BY_FAMILY.get( - family, - f"This page documents the exported JavaScript surface for `{family}` as declared by the runtime’s published TypeScript definitions.\n", - ) - - -def render_examples_section(family: str) -> str: - body = EXAMPLES_BY_FAMILY.get(family) - if not body: - raise SystemExit(f"Missing generated examples for {family}") - return f"## Examples\n\n{body.rstrip()}\n" - - -def render_see_also_section() -> str: - lines = ["## See also", ""] - for label, doc_id in DEFAULT_SEE_ALSO: - lines.append(f"- [{label}](?p={doc_id})") - lines.append("") - return "\n".join(lines) - - -def render_related_guides_section(family: str) -> str: - refs = GUIDE_REFS_BY_FAMILY.get(family, ()) - if not refs: - return "" - - lines = ["## Related guides", ""] - for label, doc_id in refs: - lines.append(f"- [{label}](?p={doc_id})") - lines.append("") - return "\n".join(lines) - - -def render_reference_section(family: str, specs: list[str], blocks: dict[str, ModuleBlock]) -> str: - specs_sorted = sort_specs_in_family(family, specs) - - lines: list[str] = [] - lines.append("## API reference") - lines.append("") - lines.append(REF_START) - lines.append("") - lines.append("### Module specifiers") - lines.append("") - lines.append("```text") - for s in specs_sorted: - lines.append(s) - lines.append("```") - lines.append("") - - lines.append("### TypeScript declarations") - lines.append("") - lines.append("These declarations are generated from the runtime's published TypeScript surface.") - lines.append("") - for s in specs_sorted: - lines.append(f"#### `{s}`") - lines.append("") - lines.append("```ts") - lines.extend(blocks[s].block.rstrip().splitlines()) - lines.append("```") - lines.append("") - - lines.append(REF_END) - lines.append("") - return "\n".join(lines) - - -def update_curated_page(path: Path, family: str, specs: list[str], blocks: dict[str, ModuleBlock]) -> bool: - text = read_text(path) - - if REF_START in text and REF_END in text: - before, rest = text.split(REF_START, 1) - _, after = rest.split(REF_END, 1) - before = re.sub(r"(?:\n## API reference\s*)+\Z", "\n", before.rstrip()) - # Keep content outside the generated region; regenerate the region itself. - next_text = before.rstrip() + "\n\n" + render_reference_section(family, specs, blocks) + after.lstrip() - else: - next_text = text.rstrip() + "\n\n" + render_reference_section(family, specs, blocks) - - if "\n## See also\n" not in next_text and not next_text.startswith("## See also\n"): - next_text = next_text.rstrip() + "\n\n" + render_see_also_section() - - # Ensure trailing newline - next_text = next_text.rstrip() + "\n" - return write_text_if_changed(path, next_text) - - -def render_generated_page(path: Path, family: str, specs: list[str], blocks: dict[str, ModuleBlock]) -> str: - title = family_title(family, blocks) - specs_sorted = sort_specs_in_family(family, specs) - - lines: list[str] = [] - lines.append(f"# {title}") - lines.append("") - lines.append(family_intro(family).rstrip()) - lines.append("") - related = render_related_guides_section(family) - if related: - lines.append(related.rstrip()) - lines.append("") - lines.append(render_examples_section(family).rstrip()) - lines.append("") - lines.append(render_reference_section(family, specs_sorted, blocks).rstrip()) - lines.append("") - lines.append(render_see_also_section().rstrip()) - lines.append("") - return "\n".join(lines).rstrip() + "\n" - - -def main() -> None: - root = repo_root() - parser = argparse.ArgumentParser(description="Refresh Runtime API Markdown while preserving curated prose.") - parser.add_argument("--runtime-repo", type=Path, default=root.parent / "runtime") - args = parser.parse_args() - index_path = args.runtime_repo.resolve() / "api" / "index.d.ts" - if not index_path.exists(): - raise SystemExit(f"Missing {index_path}") - - blocks = parse_index_d_ts(read_text(index_path)) - - families: dict[str, list[str]] = {} - for spec in blocks.keys(): - families.setdefault(family_of(spec), []).append(spec) - - staging = tempfile.TemporaryDirectory(prefix="oro-runtime-import-") - staged = Path(staging.name) - source_pages.stage_collection(root, "runtime", staged) - out_dir = staged / "javascript" - out_dir.mkdir(parents=True, exist_ok=True) - - written: list[Path] = [] - removed: list[Path] = [] - - for family in sorted(families.keys()): - if family in EXCLUDED_PUBLIC_FAMILIES: - continue - - specs = families[family] - - if family in CURATED_FAMILIES: - rel = CURATED_FILES_BY_FAMILY[family] - path = out_dir / rel - if not path.exists(): - raise SystemExit(f"Expected curated file to exist: {path}") - if update_curated_page(path, family, specs, blocks): - written.append(path) - continue - - name = family.removeprefix("oro:") - path = out_dir / f"{name}.md" - text = render_generated_page(path, family, specs, blocks) - if write_text_if_changed(path, text): - written.append(path) - - for family in sorted(EXCLUDED_PUBLIC_FAMILIES): - stale_path = out_dir / f"{family.removeprefix('oro:')}.md" - if stale_path.exists(): - stale_path.unlink() - removed.append(stale_path) - - source_pages.import_collection(root, "runtime", staged) - staging.cleanup() - - if written or removed: - print("Wrote:") - for p in written: - print(f"- {root / 'src/runtime/docs/javascript' / p.stem / 'page.md'}") - for p in removed: - print(f"- removed {root / 'src/runtime/docs/javascript' / p.stem / 'page.md'}") - else: - print("Unchanged: generated JavaScript API reference pages") - - -if __name__ == "__main__": - main() diff --git a/runtime/tools/generate-js-api-reference.ts b/runtime/tools/generate-js-api-reference.ts new file mode 100644 index 00000000..6e13325d --- /dev/null +++ b/runtime/tools/generate-js-api-reference.ts @@ -0,0 +1,132 @@ +#!/usr/bin/env node +import { access, mkdir, mkdtemp, rm, unlink } from 'node:fs/promises' +import { tmpdir } from 'node:os' +import { resolve, join, basename } from 'node:path' +import { fileURLToPath, pathToFileURL } from 'node:url' +import { parseArgs } from 'node:util' +import { stageCollection, importCollection, readText, writeTextIfChanged, splitLines } from '../../tools/source-pages.ts' +import { DEFAULT_SEE_ALSO, DESCRIPTION_BY_FAMILY, EXAMPLES_BY_FAMILY, GUIDE_REFS_BY_FAMILY } from './js-api-reference-content.ts' + +export const CURATED_FILES_BY_FAMILY: Record = Object.fromEntries( + ['ai', 'application', 'extension', 'fs', 'hooks', 'mcp', 'notification', 'secure-storage', 'window'].map(name => [`oro:${name}`, `${name}.md`])) +export const EXCLUDED_PUBLIC_FAMILIES = new Set(['oro:bootstrap', 'oro:external', 'oro:internal', 'oro:node', 'oro:node-esm-loader']) +export const REF_START = '' +export const REF_END = '' +export interface ModuleBlock { spec: string; block: string } +export function parseIndexDTS(text: string): Record { + const lines = splitLines(text) + const blocks: Record = {} + for (let i = 0; i < lines.length; i++) { + const match = /^declare module ['"](oro:[^'"]+)['"]\s*\{\s*$/.exec(lines[i]) + if (!match) continue + const spec = match[1].trim() + const buf = [lines[i].trimEnd()] + while (++i < lines.length) { + const line = lines[i].trimEnd() + buf.push(line) + if (line === '}' && !/^[ \t]/.test(lines[i])) break + } + blocks[spec] = { spec, block: buf.join('\n').trimEnd() + '\n' } + } + if (!Object.keys(blocks).length) throw new Error("No `declare module 'oro:*' { ... }` blocks found.") + return blocks +} +export function familyOf(spec: string): string { return spec.split('/', 1)[0] } +export function sortSpecsInFamily(family: string, specs: string[]): string[] { + return [...specs].sort().sort((a, b) => Number(a !== family) - Number(b !== family)) +} +export function preferredImportSpec(family: string, specs: string[], blocks: Record): string { + return family in blocks ? family : specs.find(s => s.endsWith('/index')) ?? specs[0] +} +export function familyTitle(family: string, blocks: Record): string { + return '`' + family + (family in blocks ? '' : '/*') + '`' +} +export function familyIntro(family: string): string { + return DESCRIPTION_BY_FAMILY[family] ?? `This page documents the exported JavaScript surface for \`${family}\` as declared by the runtime’s published TypeScript definitions.\n` +} +export function renderExamplesSection(family: string): string { + const body = EXAMPLES_BY_FAMILY[family] + if (!body) throw new Error(`Missing generated examples for ${family}`) + return `## Examples\n\n${body.trimEnd()}\n` +} +export function renderSeeAlsoSection(): string { + return ['## See also', '', ...DEFAULT_SEE_ALSO.map(([label, id]) => `- [${label}](?p=${id})`), ''].join('\n') +} +export function renderRelatedGuidesSection(family: string): string { + const refs = GUIDE_REFS_BY_FAMILY[family] ?? [] + return refs.length ? ['## Related guides', '', ...refs.map(([label, id]) => `- [${label}](?p=${id})`), ''].join('\n') : '' +} +export function renderReferenceSection(family: string, specs: string[], blocks: Record): string { + const sorted = sortSpecsInFamily(family, specs) + const lines = ['## API reference', '', REF_START, '', '### Module specifiers', '', '```text', ...sorted, '```', '', + '### TypeScript declarations', '', "These declarations are generated from the runtime's published TypeScript surface.", ''] + for (const spec of sorted) lines.push(`#### \`${spec}\``, '', '```ts', ...splitLines(blocks[spec].block.trimEnd()), '```', '') + return [...lines, REF_END, ''].join('\n') +} +export async function updateCuratedPage(path: string, family: string, specs: string[], blocks: Record): Promise { + const text = await readText(path) + let next: string + if (text.includes(REF_START) && text.includes(REF_END)) { + const start = text.indexOf(REF_START) + const end = text.indexOf(REF_END, start + REF_START.length) + if (end < 0) throw new Error(`Reversed generated reference markers in ${path}`) + const before = text.slice(0, start).trimEnd().replace(/(?:\n## API reference\s*)+$/, '\n') + next = before.trimEnd() + '\n\n' + renderReferenceSection(family, specs, blocks) + text.slice(end + REF_END.length).trimStart() + } else next = text.trimEnd() + '\n\n' + renderReferenceSection(family, specs, blocks) + if (!next.includes('\n## See also\n') && !next.startsWith('## See also\n')) next = next.trimEnd() + '\n\n' + renderSeeAlsoSection() + return writeTextIfChanged(path, next.trimEnd() + '\n') +} +export function renderGeneratedPage(_path: string, family: string, specs: string[], blocks: Record): string { + const lines = [`# ${familyTitle(family, blocks)}`, '', familyIntro(family).trimEnd(), ''] + const related = renderRelatedGuidesSection(family) + if (related) lines.push(related.trimEnd(), '') + lines.push(renderExamplesSection(family).trimEnd(), '', renderReferenceSection(family, specs, blocks).trimEnd(), '', renderSeeAlsoSection().trimEnd(), '') + return lines.join('\n').trimEnd() + '\n' +} +export async function generateReference(site: string, runtimeRepo: string): Promise { + const index = resolve(runtimeRepo, 'api/index.d.ts') + try { await access(index) } catch { throw new Error(`Missing ${index}`) } + const blocks = parseIndexDTS(await readText(index)) + const families: Record = {} + for (const spec of Object.keys(blocks)) (families[familyOf(spec)] ??= []).push(spec) + const staged = await mkdtemp(join(tmpdir(), 'oro-runtime-import-')) + const written: string[] = [], removed: string[] = [] + try { + await stageCollection('runtime', staged, site) + const out = join(staged, 'javascript') + await mkdir(out, { recursive: true }) + for (const family of Object.keys(families).sort()) { + if (EXCLUDED_PUBLIC_FAMILIES.has(family)) continue + const curated = CURATED_FILES_BY_FAMILY[family] + const path = join(out, curated ?? `${family.slice(4)}.md`) + if (curated) { + try { await access(path) } catch { throw new Error(`Expected curated file to exist: ${path}`) } + if (await updateCuratedPage(path, family, families[family], blocks)) written.push(path) + } else if (await writeTextIfChanged(path, renderGeneratedPage(path, family, families[family], blocks))) written.push(path) + } + for (const family of [...EXCLUDED_PUBLIC_FAMILIES].sort()) { + const path = join(out, `${family.slice(4)}.md`) + try { await unlink(path); removed.push(path) } catch (error) { + if ((error as NodeJS.ErrnoException).code !== 'ENOENT') throw error + } + } + await importCollection('runtime', staged, site) + } finally { await rm(staged, { recursive: true, force: true }) } + if (written.length || removed.length) { + console.log('Wrote:') + for (const path of written) console.log(`- ${join(site, 'src/runtime/docs/javascript', basename(path, '.md'), 'page.md')}`) + for (const path of removed) console.log(`- removed ${join(site, 'src/runtime/docs/javascript', basename(path, '.md'), 'page.md')}`) + } else console.log('Unchanged: generated JavaScript API reference pages') +} +export async function main(args = process.argv.slice(2)): Promise { + const { values } = parseArgs({ args, options: { 'runtime-repo': { type: 'string' }, help: { type: 'boolean', short: 'h' } } }) + if (values.help) { console.log('Refresh Runtime API Markdown while preserving curated prose.\n\nUsage: node runtime/tools/generate-js-api-reference.ts [--runtime-repo PATH]'); return } + const site = fileURLToPath(new URL('../../', import.meta.url)) + await generateReference(site, values['runtime-repo'] ?? resolve(site, '../runtime')) +} +if (process.argv[1] && import.meta.url === pathToFileURL(resolve(process.argv[1])).href) { + main().catch(error => { + console.error(error.message) + process.exitCode = error.code?.startsWith('ERR_PARSE_ARGS_') ? 2 : 1 + }) +} diff --git a/runtime/tools/js-api-reference-content.ts b/runtime/tools/js-api-reference-content.ts new file mode 100644 index 00000000..06280c58 --- /dev/null +++ b/runtime/tools/js-api-reference-content.ts @@ -0,0 +1,409 @@ +// Evaluated content from the original Python generator; preserve strings exactly. +export const DESCRIPTION_BY_FAMILY: Record = { + "oro:asn1": "`oro:asn1` parses ASN.1 source text and files into structured module data.", + "oro:assert": "`oro:assert` provides Node-compatible assertion helpers for tests, runtime checks, and invariants.", + "oro:async": "`oro:async` exposes async context propagation, deferred values, and resource tracking primitives.", + "oro:async_hooks": "`oro:async_hooks` exposes hook-based async lifecycle inspection compatible with Node-style instrumentation.", + "oro:background": "`oro:background` lets you inspect and coordinate the runtime background task surface.", + "oro:buffer": "`oro:buffer` provides `Buffer`, `Blob`, and related byte-oriented helpers.", + "oro:cdp": "`oro:cdp` controls the runtime Chrome DevTools Protocol endpoint used for inspection and debugging.", + "oro:child_process": "`oro:child_process` launches and manages subprocesses with a Node-compatible API.", + "oro:clipboard": "`oro:clipboard` reads and writes clipboard text from the current application context.", + "oro:commonjs": "`oro:commonjs/*` exposes the runtime’s CommonJS loader, cache, and resolution helpers.", + "oro:conduit": "`oro:conduit` manages the runtime WebSocket conduit used for internal cross-surface messaging.", + "oro:console": "`oro:console` exposes the runtime console implementation and patch helpers.", + "oro:constants": "`oro:constants` publishes the runtime’s platform, errno, and low-level constant tables.", + "oro:cookies": "`oro:cookies` reads and writes cookies for application-controlled origins.", + "oro:crypto": "`oro:crypto` exposes hashing, random bytes, and bundled sodium-backed helpers.", + "oro:dbus": "`oro:dbus` connects to DBus and lets JavaScript code call methods, watch signals, and manage names.", + "oro:dgram": "`oro:dgram` provides UDP sockets and multicast helpers with a Node-compatible API.", + "oro:diagnostics": "`oro:diagnostics` exposes channels, metrics, and runtime/window diagnostic queries.", + "oro:did": "`oro:did` parses and manipulates decentralized identifiers and DID URLs.", + "oro:dns": "`oro:dns` provides DNS lookup helpers and promise-based resolution APIs.", + "oro:enumeration": "`oro:enumeration` is a small typed-set helper used throughout the runtime surface.", + "oro:errno": "`oro:errno` converts errno values to names and messages.", + "oro:errors": "`oro:errors` exports DOM-style and runtime-specific error classes and constants.", + "oro:events": "`oro:events` provides `EventEmitter`, `EventTarget`, and event primitives used across the runtime.", + "oro:extension": "`oro:extension` loads native and wasm extensions and reports extension runtime state.", + "oro:fetch": "`oro:fetch` exposes the runtime fetch stack and standard request/response primitives.", + "oro:gc": "`oro:gc` lets you register finalizers and control object retention hooks.", + "oro:hci": "`oro:hci` exposes host controller interface helpers for low-level Bluetooth adapter access.", + "oro:http": "`oro:http` provides Node-compatible HTTP client and server APIs.", + "oro:https": "`oro:https` provides HTTPS client and server APIs on top of the runtime TLS stack.", + "oro:i18n": "`oro:i18n` resolves UI languages, localized messages, and locale-aware metadata.", + "oro:ip": "`oro:ip` normalizes and validates IP address inputs.", + "oro:ipc": "`oro:ipc` exposes low-level runtime IPC helpers used to talk to the native host process.", + "oro:ipfs": "`oro:ipfs` manages the embedded IPFS node and common content operations.", + "oro:iroh": "`oro:iroh` exposes the runtime’s Iroh transport bindings for peer-to-peer connections and streams.", + "oro:language": "`oro:language` resolves language names, tags, and related metadata.", + "oro:latica": "`oro:latica/*` exposes the runtime’s Latica networking primitives, packet helpers, and crypto utilities.", + "oro:location": "`oro:location` normalizes the current runtime location and origin semantics across platforms.", + "oro:mime": "`oro:mime` looks up MIME types, extensions, and content-type metadata.", + "oro:module": "`oro:module` exposes module-loader helpers and builtin-module inspection.", + "oro:navigation": "`oro:navigation` surfaces the Navigation API state that the runtime makes available to application code.", + "oro:net": "`oro:net` provides Node-compatible TCP clients and servers.", + "oro:network": "`oro:network` exposes a higher-level networking surface built on the Latica stack.", + "oro:npm": "`oro:npm/*` supports package-resolution and service-worker plumbing for NPM-backed modules.", + "oro:os": "`oro:os` exposes platform, CPU, temporary-directory, and system metadata helpers.", + "oro:path": "`oro:path` provides cross-platform path manipulation utilities.", + "oro:process": "`oro:process` exposes runtime process state, env access, signals, and scheduling helpers.", + "oro:protocol-handlers": "`oro:protocol-handlers` exposes runtime helpers for custom protocol and service-worker routing.", + "oro:querystring": "`oro:querystring` parses and serializes URL query strings.", + "oro:semver": "`oro:semver` parses, validates, and compares semantic versions.", + "oro:service-worker": "`oro:service-worker/*` exposes the service-worker environment, lifecycle objects, and helpers.", + "oro:shared-worker": "`oro:shared-worker/*` exposes the shared-worker environment and runtime helpers.", + "oro:signal": "`oro:signal` exposes process-signal constants, conversion helpers, and event listeners.", + "oro:sqlite": "`oro:sqlite` opens SQLite databases and exposes sync and async query helpers.", + "oro:stream": "`oro:stream` exposes Node-style streams, Web streams, and pipeline helpers.", + "oro:string_decoder": "`oro:string_decoder` decodes split byte streams into text without corrupting multibyte characters.", + "oro:tar": "`oro:tar` opens, creates, streams, and extracts tar archives.", + "oro:tcp": "`oro:tcp` exposes lower-level TCP client and server helpers alongside the higher-level `oro:net` API.", + "oro:test": "`oro:test` provides the runtime test harness used by application and module tests.", + "oro:timers": "`oro:timers` exposes timer primitives, promise-based sleeps, and scheduler helpers.", + "oro:tls": "`oro:tls` exposes TLS sockets, servers, and certificate-pin helpers.", + "oro:toml": "`oro:toml` parses and serializes TOML documents.", + "oro:tty": "`oro:tty` exposes terminal streams and TTY detection helpers.", + "oro:url": "`oro:url` exposes the WHATWG URL implementation used by the runtime.", + "oro:usb": "`oro:usb` installs and exposes the runtime WebUSB surface for window contexts.", + "oro:util": "`oro:util` exposes inspection, debug, and type-checking helpers.", + "oro:vm": "`oro:vm` runs JavaScript in isolated runtime contexts and manages context windows and workers.", + "oro:worker": "`oro:worker` re-exports the runtime worker classes for dedicated, shared, and service workers.", + "oro:worker_threads": "`oro:worker_threads` exposes worker-thread primitives, ports, and environment data helpers.", + "oro:xpc": "`oro:xpc` connects to macOS XPC services and encodes structured XPC payloads.", + "oro:zlib": "`oro:zlib` compresses and decompresses buffers and exposes zlib stream helpers." +} +export const EXAMPLES_BY_FAMILY: Record = { + "oro:asn1": "Parse ASN.1 source text and inspect the discovered modules:\n\n```js\nimport { parse } from 'oro:asn1'\n\nconst document = await parse(`\nDemo DEFINITIONS ::= BEGIN\n serialNumber INTEGER ::= 42\nEND\n`)\n\nconsole.log(document.modulesCount)\nconsole.log(document.modules[0]?.name)\n```\n", + "oro:assert": "Use assertion helpers for runtime invariants or tests:\n\n```js\nimport { ok, strictEqual, deepEqual } from 'oro:assert'\n\nconst payload = { id: 7, tags: ['runtime', 'docs'] }\n\nok(payload.id > 0)\nstrictEqual(payload.tags.length, 2)\ndeepEqual(payload.tags, ['runtime', 'docs'])\n```\n", + "oro:async": "Propagate request-scoped state across async boundaries:\n\n```js\nimport { AsyncLocalStorage } from 'oro:async'\n\nconst store = new AsyncLocalStorage()\n\nawait store.run({ requestId: 'req-42' }, async () => {\n await Promise.resolve()\n console.log(store.getStore().requestId)\n})\n```\n", + "oro:async_hooks": "Inspect async-resource lifecycles as work is scheduled:\n\n```js\nimport { createHook, executionAsyncId } from 'oro:async_hooks'\n\nconst hook = createHook({\n init(asyncId, type, triggerAsyncId) {\n console.log({ asyncId, type, triggerAsyncId })\n }\n})\n\nhook.enable()\nqueueMicrotask(() => {\n console.log(executionAsyncId())\n hook.disable()\n})\n```\n", + "oro:background": "Check whether background execution is available before scheduling work:\n\n```js\nimport background from 'oro:background'\n\nif (background.available) {\n console.log(await background.status())\n}\n```\n", + "oro:buffer": "Create byte buffers and wrap them in higher-level binary containers:\n\n```js\nimport Buffer, { Blob } from 'oro:buffer'\n\nconst bytes = Buffer.from('hello runtime', 'utf8')\nconst payload = new Blob([bytes], { type: 'text/plain' })\n\nconsole.log(bytes.length)\nconsole.log(payload.size)\n```\n", + "oro:cdp": "Inspect the current DevTools state and start the endpoint when needed:\n\n```js\nimport { status, listen, close } from 'oro:cdp'\n\nconsole.log(await status())\nawait listen({ host: '127.0.0.1', port: 9222 })\n\n// ...connect a DevTools client...\n\nawait close()\n```\n", + "oro:child_process": "Spawn a subprocess and consume its stdout stream:\n\n```js\nimport { spawn } from 'oro:child_process'\n\nconst child = spawn('echo', ['hello from runtime'])\n\nchild.stdout.on('data', (chunk) => {\n console.log(chunk.toString())\n})\n\nawait new Promise((resolve, reject) => {\n child.once('close', resolve)\n child.once('error', reject)\n})\n```\n", + "oro:clipboard": "Read and write plain-text clipboard content:\n\n```js\nimport { writeText, readText, canWriteText } from 'oro:clipboard'\n\nif (canWriteText()) {\n await writeText('Copied from Oro Runtime')\n console.log(await readText())\n}\n```\n", + "oro:commonjs": "Resolve CommonJS modules from the current ES module:\n\n```js\nimport { Module, isBuiltin } from 'oro:commonjs'\n\nconst require = Module.createRequire(import.meta.url)\n\nconsole.log(isBuiltin('fs'))\nconsole.log(require('./package.json').name)\n```\n", + "oro:conduit": "Connect to the runtime conduit and inspect its current status:\n\n```js\nimport { Conduit } from 'oro:conduit'\n\nconst conduit = new Conduit({ id: 'docs' })\nawait conduit.connect()\n\nconsole.log(await Conduit.status())\n\nawait conduit.close()\n```\n", + "oro:console": "Patch the global console so application logs use the runtime console implementation:\n\n```js\nimport { patchGlobalConsole } from 'oro:console'\n\npatchGlobalConsole(globalThis.console)\n\nconsole.info('runtime console is active')\n```\n", + "oro:constants": "Use named constants instead of hard-coding errno or signal values:\n\n```js\nimport { EACCES, SIGTERM } from 'oro:constants'\n\nconsole.log({ EACCES, SIGTERM })\n```\n", + "oro:cookies": "Set, read, and remove cookies for an application-controlled origin:\n\n```js\nimport { set, get, remove } from 'oro:cookies'\n\nawait set('https://app.example', 'session=abc123; Path=/; HttpOnly')\nconsole.log(await get('https://app.example'))\nawait remove('https://app.example', 'session')\n```\n", + "oro:crypto": "Generate random bytes and hash them with the runtime digest helper:\n\n```js\nimport { randomBytes, createDigest, murmur3 } from 'oro:crypto'\n\nconst nonce = randomBytes(16)\nconst digest = await createDigest('sha256', nonce)\n\nconsole.log(digest.toString('hex'))\nconsole.log(murmur3('hello-runtime'))\n```\n", + "oro:dbus": "Check DBus availability and open a session-bus connection:\n\n```js\nimport { availability, connect, BUS } from 'oro:dbus'\n\nconst state = await availability()\n\nif (state.available) {\n const bus = await connect({ bus: BUS.SESSION })\n console.log(bus.id)\n await bus.close()\n}\n```\n", + "oro:dgram": "Create a UDP socket and send a datagram:\n\n```js\nimport Buffer from 'oro:buffer'\nimport { createSocket } from 'oro:dgram'\n\nconst socket = createSocket('udp4')\n\nsocket.on('message', (message, rinfo) => {\n console.log(rinfo.address, message.toString())\n})\n\nsocket.bind(41234)\nsocket.send(Buffer.from('ping'), 41235, '127.0.0.1')\n```\n", + "oro:diagnostics": "Publish and subscribe to a diagnostics channel:\n\n```js\nimport { channel } from 'oro:diagnostics'\n\nconst buildChannel = channel('build')\n\nbuildChannel.subscribe('step', (message) => {\n console.log(message.step)\n})\n\nawait buildChannel.publish('step', { step: 'bundle-ready' })\n```\n", + "oro:did": "Parse a DID and a DID URL:\n\n```js\nimport { parse, parseUrl } from 'oro:did'\n\nconst did = parse('did:key:z6Mkkx...')\nconst url = parseUrl('did:key:z6Mkkx...#keys-1')\n\nconsole.log(did.method)\nconsole.log(url.fragment)\n```\n", + "oro:dns": "Resolve hostnames with the promise-based DNS helpers:\n\n```js\nimport { lookup } from 'oro:dns/promises'\n\nconst record = await lookup('oro.computer')\n\nconsole.log(record.address)\nconsole.log(record.family)\n```\n", + "oro:enumeration": "Use `Enumeration` when you want a typed, readable set of allowed values:\n\n```js\nimport Enumeration from 'oro:enumeration'\n\nconst states = new Enumeration(['draft', 'ready', 'shipped'])\n\nconsole.log(states.has('ready'))\nconsole.log([...states])\n```\n", + "oro:errno": "Convert errno values to names and human-readable messages:\n\n```js\nimport { EACCES, getName, getMessage } from 'oro:errno'\n\nconsole.log(getName(EACCES))\nconsole.log(getMessage(EACCES))\n```\n", + "oro:errors": "Construct runtime error types directly when surfacing failures:\n\n```js\nimport { AbortError, NotFoundError } from 'oro:errors'\n\nconst abort = new AbortError('request cancelled')\nconst missing = new NotFoundError('resource not found')\n\nconsole.log(abort.name, missing.name)\n```\n", + "oro:events": "Use `EventEmitter` for familiar event-based application code:\n\n```js\nimport EventEmitter from 'oro:events'\n\nconst bus = new EventEmitter()\n\nbus.on('ready', (value) => console.log(value))\nbus.emit('ready', { ok: true })\n```\n", + "oro:extension": "Load a runtime extension and inspect the resulting binding:\n\n```js\nimport { load, stats } from 'oro:extension'\n\nconst extension = await load('image-tools', { allow: ['resize'] })\n\nconsole.log(extension.type)\nconsole.log(await stats())\n\nawait extension.unload()\n```\n", + "oro:fetch": "Use the runtime fetch stack exactly like standard web fetch:\n\n```js\nimport fetch from 'oro:fetch'\n\nconst response = await fetch('https://example.com/api/status')\nconst data = await response.json()\n\nconsole.log(data)\n```\n", + "oro:gc": "Register a finalizer on an object that owns runtime resources:\n\n```js\nimport { ref, unref } from 'oro:gc'\n\nconst resource = {\n [Symbol.for('oro.runtime.gc.finalize')]() {\n console.log('cleaning up resource')\n }\n}\n\nref(resource)\nunref(resource)\n```\n", + "oro:hci": "Inspect local Bluetooth adapters before opening a low-level HCI socket:\n\n```js\nimport { listAdapters, getAdapter } from 'oro:hci'\n\nconst adapters = listAdapters()\nconsole.log(adapters)\n\nif (adapters.length > 0) {\n console.log(getAdapter(adapters[0].devId))\n}\n```\n", + "oro:http": "Start a small HTTP server with the Node-compatible API:\n\n```js\nimport { createServer } from 'oro:http'\n\nconst server = createServer((req, res) => {\n res.writeHead(200, { 'content-type': 'text/plain' })\n res.end('hello from oro:http')\n})\n\nserver.listen(8080, '127.0.0.1')\n```\n", + "oro:https": "Issue an HTTPS request with the familiar client helper:\n\n```js\nimport process from 'oro:process'\nimport { get } from 'oro:https'\n\nget('https://example.com', (res) => {\n res.on('data', (chunk) => process.stdout.write(chunk))\n})\n```\n", + "oro:i18n": "Resolve the current UI language and look up a localized message:\n\n```js\nimport { getUILanguage, getMessage } from 'oro:i18n'\n\nconsole.log(getUILanguage())\nconsole.log(getMessage('menu.file.open'))\n```\n", + "oro:ip": "Normalize user-provided IP input before using it in socket code:\n\n```js\nimport { normalizeIPv4, isIPv4 } from 'oro:ip'\n\nconst address = normalizeIPv4('127.000.000.001')\n\nconsole.log(address)\nconsole.log(isIPv4(address))\n```\n", + "oro:ipc": "Wait for the runtime IPC bridge and post a structured message:\n\n```js\nimport { ready, postMessage, debug } from 'oro:ipc'\n\ndebug(true)\nawait ready()\n\npostMessage({ type: 'docs-demo', at: Date.now() })\n```\n", + "oro:ipfs": "Ensure the embedded IPFS node is running before adding local content:\n\n```js\nimport { ensureStarted, add, status } from 'oro:ipfs'\n\nawait ensureStarted({ repoPath: './ipfs-repo' })\nconsole.log(await status())\n\nconst { cid } = await add('/absolute/path/to/report.txt')\nconsole.log(cid)\n```\n", + "oro:iroh": "Initialize the Iroh transport and create an endpoint:\n\n```js\nimport { ensureInitialized, Endpoint } from 'oro:iroh'\n\nawait ensureInitialized()\n\nconst endpoint = await Endpoint.create()\nawait endpoint.bind()\n\nconsole.log(await endpoint.nodeAddr())\n\nawait endpoint.close()\n```\n", + "oro:language": "Resolve language tags and metadata from user input:\n\n```js\nimport { lookup, describe } from 'oro:language'\n\nconsole.log(lookup('en-US'))\nconsole.log(describe('English'))\n```\n", + "oro:latica": "Use Latica helpers directly when you are working at the packet and transport layer:\n\n```js\nimport { sha256 } from 'oro:latica'\n\nconst topic = await sha256(new TextEncoder().encode('docs-demo'))\n\nconsole.log(topic)\n```\n", + "oro:location": "Inspect the runtime-normalized location values for the current context:\n\n```js\nimport location from 'oro:location'\n\nconsole.log(location.href)\nconsole.log(location.origin)\n```\n", + "oro:mime": "Look up MIME metadata for a type or extension:\n\n```js\nimport { lookupSync } from 'oro:mime'\n\nconsole.log(lookupSync('application/json'))\nconsole.log(lookupSync('.png'))\n```\n", + "oro:module": "Inspect builtin modules and create a `require()` function when you need one:\n\n```js\nimport Module, { builtinModules, isBuiltin, createRequire } from 'oro:module'\n\nconst require = createRequire(import.meta.url)\n\nconsole.log(isBuiltin('oro:path'))\nconsole.log(Object.keys(builtinModules).length)\nconsole.log(typeof Module)\nconsole.log(typeof require)\n```\n", + "oro:navigation": "Read the current navigation entry and listen for browser-style navigation events:\n\n```js\nimport navigation from 'oro:navigation'\n\nconsole.log(navigation.currentEntry?.url)\n\nnavigation.addEventListener('navigate', (event) => {\n console.log(event.destination.url)\n})\n```\n", + "oro:net": "Build a TCP echo server with the Node-compatible net API:\n\n```js\nimport { createServer } from 'oro:net'\n\nconst server = createServer({}, (socket) => {\n socket.on('data', (chunk) => socket.write(chunk))\n})\n\nserver.listen(4040, '127.0.0.1')\n```\n", + "oro:network": "Start the higher-level networking surface and attach event listeners:\n\n```js\nimport network from 'oro:network'\n\nconst bus = await network({})\n\nbus.on('error', console.error)\nbus.on('message', (message) => console.log(message))\n```\n", + "oro:npm": "Resolve an NPM specifier to the runtime module URL it will load:\n\n```js\nimport { resolve } from 'oro:npm/module'\n\nconst resolved = resolve('react', import.meta.url)\n\nconsole.log(resolved?.url)\nconsole.log(resolved?.type)\n```\n", + "oro:os": "Inspect the current platform and locate scratch space:\n\n```js\nimport { arch, platform, tmpdir, cpus } from 'oro:os'\n\nconsole.log(platform(), arch())\nconsole.log(tmpdir())\nconsole.log(cpus().length)\n```\n", + "oro:path": "Compose paths without branching on platform separators:\n\n```js\nimport { resolve, join, dirname, basename } from 'oro:path'\n\nconst absolute = resolve('dist', 'assets', 'logo.svg')\n\nconsole.log(absolute)\nconsole.log(dirname(absolute))\nconsole.log(basename(join('/tmp', 'report.txt')))\n```\n", + "oro:process": "Inspect process state and schedule work on the next tick:\n\n```js\nimport process, { env, hrtime, nextTick } from 'oro:process'\n\nconsole.log(env.PATH)\nconsole.log(hrtime())\n\nnextTick(() => {\n console.log(process.pid)\n})\n```\n", + "oro:protocol-handlers": "Ask the runtime which service worker is currently handling a custom scheme:\n\n```js\nimport { getServiceWorker } from 'oro:protocol-handlers'\n\nconst worker = await getServiceWorker({ scheme: 'npm' })\n\nconsole.log(worker)\n```\n", + "oro:querystring": "Parse and serialize query strings with the Node-compatible helpers:\n\n```js\nimport { stringify, parse } from 'oro:querystring'\n\nconst query = stringify({ q: 'oro runtime', page: 2 })\n\nconsole.log(query)\nconsole.log(parse(query))\n```\n", + "oro:semver": "Validate and compare versions before running upgrade logic:\n\n```js\nimport { valid, compare, gt } from 'oro:semver'\n\nconsole.log(valid('1.4.0'))\nconsole.log(compare('1.4.0', '1.3.9'))\nconsole.log(gt('2.0.0', '1.9.0'))\n```\n", + "oro:service-worker": "Use the runtime service-worker helpers from inside a service-worker scope:\n\n```js\nimport { env } from 'oro:service-worker'\n\nif (env) {\n self.addEventListener('fetch', (event) => {\n event.respondWith(fetch(event.request))\n })\n}\n```\n", + "oro:shared-worker": "Launch a shared worker and communicate through its shared port:\n\n```js\nimport { SharedWorker } from 'oro:shared-worker'\n\nconst worker = new SharedWorker(new URL('./shared.js', import.meta.url))\n\nworker.port.start()\nworker.port.postMessage({ type: 'warmup' })\n```\n", + "oro:signal": "Listen for runtime process signals using the signal helper surface:\n\n```js\nimport signal from 'oro:signal'\n\nsignal.addEventListener('SIGTERM', (event) => {\n console.log(event.type)\n})\n```\n", + "oro:sqlite": "Open an in-memory database and run a few synchronous queries:\n\n```js\nimport { open, OPEN_CREATE, OPEN_MEMORY } from 'oro:sqlite'\n\nconst db = open(':memory:', { flags: OPEN_CREATE | OPEN_MEMORY })\n\ndb.exec('create table notes (id integer primary key, title text)')\ndb.exec(\"insert into notes (title) values ('hello')\")\n\nconsole.log(db.query('select * from notes'))\n```\n", + "oro:stream": "Connect streams together with the pipeline helper:\n\n```js\nimport process from 'oro:process'\nimport { Readable, Writable, pipelinePromise } from 'oro:stream'\n\nconst source = Readable.from(['oro', ' ', 'runtime'])\nconst sink = new Writable({\n write(chunk, _encoding, done) {\n process.stdout.write(chunk)\n done()\n }\n})\n\nawait pipelinePromise(source, sink)\n```\n", + "oro:string_decoder": "Decode chunked UTF-8 data without splitting multibyte characters:\n\n```js\nimport Buffer from 'oro:buffer'\nimport StringDecoder from 'oro:string_decoder'\n\nconst decoder = new StringDecoder('utf8')\nconst chunks = [Buffer.from([0xe2, 0x82]), Buffer.from([0xac])]\n\nconsole.log(decoder.write(chunks[0]))\nconsole.log(decoder.write(chunks[1]))\n```\n", + "oro:tar": "Build a tar archive in memory and inspect its entries:\n\n```js\nimport Buffer from 'oro:buffer'\nimport { createInMemory } from 'oro:tar'\n\nconst archive = await createInMemory()\n\nawait archive.append({ path: 'hello.txt' }, Buffer.from('hello'))\nawait archive.finalize()\n\nconsole.log(await archive.entries())\n```\n", + "oro:tcp": "Open a lower-level TCP server when you want more direct socket control:\n\n```js\nimport { createServer } from 'oro:tcp'\n\nconst server = createServer((socket) => {\n socket.write(Buffer.from('connected'))\n})\n\nserver.listen({ port: 5050, host: '127.0.0.1' })\n```\n", + "oro:test": "Write runtime tests with the built-in test harness:\n\n```js\nimport test from 'oro:test'\n\ntest('querystring roundtrip', async (t) => {\n t.equal('a=1', new URLSearchParams({ a: '1' }).toString())\n})\n```\n", + "oro:timers": "Sleep without writing your own timeout wrapper:\n\n```js\nimport { sleep } from 'oro:timers'\n\nawait sleep(250)\n\nconsole.log('quarter second elapsed')\n```\n", + "oro:tls": "Configure TLS pins before opening pinned connections:\n\n```js\nimport { setTlsPins, getTlsPins, clearTlsPins } from 'oro:tls'\n\nawait setTlsPins('sha256/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=')\nconsole.log(await getTlsPins())\nawait clearTlsPins()\n```\n", + "oro:toml": "Parse configuration and emit updated TOML back to disk:\n\n```js\nimport { parse, stringify } from 'oro:toml'\n\nconst config = parse('name = \"oro\"\\nport = 8080')\nconfig.debug = true\n\nconsole.log(stringify(config))\n```\n", + "oro:tty": "Detect interactive terminals before enabling richer output:\n\n```js\nimport { isatty } from 'oro:tty'\n\nconsole.log(isatty(0))\nconsole.log(isatty(1))\n```\n", + "oro:url": "Use the WHATWG URL implementation for robust URL parsing:\n\n```js\nimport URL from 'oro:url'\n\nconst url = new URL('https://oro.computer/docs?project=runtime')\n\nconsole.log(url.pathname)\nconsole.log(url.searchParams.get('project'))\n```\n", + "oro:usb": "Install the runtime WebUSB surface and request a device in window contexts:\n\n```js\nimport { installNavigatorUSB } from 'oro:usb'\n\nconst usb = installNavigatorUSB()\n\nif (usb) {\n console.log(await usb.getDevices())\n // const device = await usb.requestDevice({ filters: [{ vendorId: 0x1209 }] })\n}\n```\n", + "oro:util": "Use the runtime debug helper and common type predicates:\n\n```js\nimport { debug, isTypedArray } from 'oro:util'\n\nconst log = debug('docs')\nconst payload = new Uint8Array([1, 2, 3])\n\nlog('payload ready')\nconsole.log(isTypedArray(payload))\n```\n", + "oro:vm": "Run a script inside an isolated context object:\n\n```js\nimport { runInContext } from 'oro:vm'\n\nconst context = { answer: 41 }\nconst result = await runInContext('answer + 1', context)\n\nconsole.log(result)\n```\n", + "oro:worker": "Launch a dedicated worker through the runtime worker surface:\n\n```js\nimport Worker from 'oro:worker'\n\nconst worker = new Worker(new URL('./worker.js', import.meta.url), {\n workerData: { job: 'thumbnail' }\n})\n\nworker.postMessage({ type: 'start' })\n```\n", + "oro:worker_threads": "Pass environment data into worker threads and communicate with message channels:\n\n```js\nimport { MessageChannel, setEnvironmentData } from 'oro:worker_threads'\n\nsetEnvironmentData('traceId', 'req-42')\n\nconst { port1, port2 } = new MessageChannel()\nport1.onmessage = (event) => console.log(event.data)\nport2.postMessage({ ok: true })\n```\n", + "oro:xpc": "Open an XPC connection, send a request, and close it cleanly:\n\n```js\nimport { availability, connect } from 'oro:xpc'\n\nconst state = await availability()\n\nif (state.available) {\n const connection = await connect({ service: 'com.example.agent' })\n await connection.sendAndForget({ type: 'ping' })\n await connection.close()\n}\n```\n", + "oro:zlib": "Compress and decompress buffers with the promise-based helpers:\n\n```js\nimport { gzip, gunzip } from 'oro:zlib'\n\nconst compressed = await gzip('hello runtime')\nconst restored = await gunzip(compressed)\n\nconsole.log(restored.toString())\n```\n" +} +export const GUIDE_REFS_BY_FAMILY: Record = { + "oro:application": [ + [ + "Windows and messaging", + "guides/windows-and-messaging" + ], + [ + "Lifecycle hooks and deep links", + "guides/lifecycle-hooks-and-deep-links" + ], + [ + "Desktop integrations", + "guides/desktop-integrations" + ] + ], + "oro:assert": [ + [ + "Testing and diagnostics", + "guides/testing-and-diagnostics" + ] + ], + "oro:cdp": [ + [ + "Testing and diagnostics", + "guides/testing-and-diagnostics" + ] + ], + "oro:child_process": [ + [ + "Configure your runtime project", + "guides/configure-your-runtime-project" + ], + [ + "Testing and diagnostics", + "guides/testing-and-diagnostics" + ] + ], + "oro:clipboard": [ + [ + "Desktop integrations", + "guides/desktop-integrations" + ] + ], + "oro:console": [ + [ + "Testing and diagnostics", + "guides/testing-and-diagnostics" + ] + ], + "oro:crypto": [ + [ + "Secure storage and sessions", + "guides/secure-storage-and-sessions" + ] + ], + "oro:diagnostics": [ + [ + "Testing and diagnostics", + "guides/testing-and-diagnostics" + ] + ], + "oro:errors": [ + [ + "Testing and diagnostics", + "guides/testing-and-diagnostics" + ] + ], + "oro:extension": [ + [ + "Native extensions", + "guides/native-extensions" + ] + ], + "oro:fetch": [ + [ + "Calling HTTP APIs", + "guides/calling-http-apis" + ], + [ + "Offline-first with service workers", + "guides/offline-first-with-service-workers" + ] + ], + "oro:fs": [ + [ + "Files and sandboxing", + "guides/files-and-sandboxing" + ], + [ + "Project layout", + "guides/project-layout" + ] + ], + "oro:hooks": [ + [ + "Lifecycle hooks and deep links", + "guides/lifecycle-hooks-and-deep-links" + ], + [ + "Windows and messaging", + "guides/windows-and-messaging" + ] + ], + "oro:http": [ + [ + "Calling HTTP APIs", + "guides/calling-http-apis" + ] + ], + "oro:https": [ + [ + "Calling HTTP APIs", + "guides/calling-http-apis" + ] + ], + "oro:ipc": [ + [ + "Native extensions", + "guides/native-extensions" + ], + [ + "Windows and messaging", + "guides/windows-and-messaging" + ] + ], + "oro:location": [ + [ + "Lifecycle hooks and deep links", + "guides/lifecycle-hooks-and-deep-links" + ] + ], + "oro:mcp": [ + [ + "MCP and agent automation", + "guides/mcp-and-agent-automation" + ] + ], + "oro:navigation": [ + [ + "Lifecycle hooks and deep links", + "guides/lifecycle-hooks-and-deep-links" + ], + [ + "Windows and messaging", + "guides/windows-and-messaging" + ] + ], + "oro:notification": [ + [ + "Desktop integrations", + "guides/desktop-integrations" + ], + [ + "Lifecycle hooks and deep links", + "guides/lifecycle-hooks-and-deep-links" + ] + ], + "oro:path": [ + [ + "Files and sandboxing", + "guides/files-and-sandboxing" + ], + [ + "Project layout", + "guides/project-layout" + ] + ], + "oro:process": [ + [ + "Configure your runtime project", + "guides/configure-your-runtime-project" + ] + ], + "oro:protocol-handlers": [ + [ + "Custom protocols and routing", + "guides/custom-protocols-and-routing" + ], + [ + "Offline-first with service workers", + "guides/offline-first-with-service-workers" + ] + ], + "oro:secure-storage": [ + [ + "Secure storage and sessions", + "guides/secure-storage-and-sessions" + ] + ], + "oro:service-worker": [ + [ + "Offline-first with service workers", + "guides/offline-first-with-service-workers" + ], + [ + "Custom protocols and routing", + "guides/custom-protocols-and-routing" + ] + ], + "oro:shared-worker": [ + [ + "Shared workers across windows", + "guides/shared-workers-across-windows" + ], + [ + "Windows and messaging", + "guides/windows-and-messaging" + ] + ], + "oro:sqlite": [ + [ + "Local data with SQLite", + "guides/local-data-with-sqlite" + ], + [ + "Files and sandboxing", + "guides/files-and-sandboxing" + ] + ], + "oro:test": [ + [ + "Testing and diagnostics", + "guides/testing-and-diagnostics" + ] + ], + "oro:worker": [ + [ + "Worker threads for heavy work", + "guides/worker-threads-for-heavy-work" + ], + [ + "Shared workers across windows", + "guides/shared-workers-across-windows" + ] + ], + "oro:worker_threads": [ + [ + "Worker threads for heavy work", + "guides/worker-threads-for-heavy-work" + ] + ], + "oro:window": [ + [ + "Windows and messaging", + "guides/windows-and-messaging" + ], + [ + "Desktop integrations", + "guides/desktop-integrations" + ] + ] +} +export const DEFAULT_SEE_ALSO: readonly (readonly [string, string])[] = [ + [ + "JavaScript APIs overview", + "javascript/overview" + ], + [ + "All module specifiers", + "javascript/all-modules" + ] +] diff --git a/runtime/tools/js_api_reference_content.py b/runtime/tools/js_api_reference_content.py deleted file mode 100644 index cca22c85..00000000 --- a/runtime/tools/js_api_reference_content.py +++ /dev/null @@ -1,1256 +0,0 @@ -from __future__ import annotations - -from textwrap import dedent - - -def md(text: str) -> str: - return dedent(text).strip() + "\n" - - -DESCRIPTION_BY_FAMILY: dict[str, str] = { - "oro:asn1": "`oro:asn1` parses ASN.1 source text and files into structured module data.", - "oro:assert": "`oro:assert` provides Node-compatible assertion helpers for tests, runtime checks, and invariants.", - "oro:async": "`oro:async` exposes async context propagation, deferred values, and resource tracking primitives.", - "oro:async_hooks": "`oro:async_hooks` exposes hook-based async lifecycle inspection compatible with Node-style instrumentation.", - "oro:background": "`oro:background` lets you inspect and coordinate the runtime background task surface.", - "oro:buffer": "`oro:buffer` provides `Buffer`, `Blob`, and related byte-oriented helpers.", - "oro:cdp": "`oro:cdp` controls the runtime Chrome DevTools Protocol endpoint used for inspection and debugging.", - "oro:child_process": "`oro:child_process` launches and manages subprocesses with a Node-compatible API.", - "oro:clipboard": "`oro:clipboard` reads and writes clipboard text from the current application context.", - "oro:commonjs": "`oro:commonjs/*` exposes the runtime’s CommonJS loader, cache, and resolution helpers.", - "oro:conduit": "`oro:conduit` manages the runtime WebSocket conduit used for internal cross-surface messaging.", - "oro:console": "`oro:console` exposes the runtime console implementation and patch helpers.", - "oro:constants": "`oro:constants` publishes the runtime’s platform, errno, and low-level constant tables.", - "oro:cookies": "`oro:cookies` reads and writes cookies for application-controlled origins.", - "oro:crypto": "`oro:crypto` exposes hashing, random bytes, and bundled sodium-backed helpers.", - "oro:dbus": "`oro:dbus` connects to DBus and lets JavaScript code call methods, watch signals, and manage names.", - "oro:dgram": "`oro:dgram` provides UDP sockets and multicast helpers with a Node-compatible API.", - "oro:diagnostics": "`oro:diagnostics` exposes channels, metrics, and runtime/window diagnostic queries.", - "oro:did": "`oro:did` parses and manipulates decentralized identifiers and DID URLs.", - "oro:dns": "`oro:dns` provides DNS lookup helpers and promise-based resolution APIs.", - "oro:enumeration": "`oro:enumeration` is a small typed-set helper used throughout the runtime surface.", - "oro:errno": "`oro:errno` converts errno values to names and messages.", - "oro:errors": "`oro:errors` exports DOM-style and runtime-specific error classes and constants.", - "oro:events": "`oro:events` provides `EventEmitter`, `EventTarget`, and event primitives used across the runtime.", - "oro:extension": "`oro:extension` loads native and wasm extensions and reports extension runtime state.", - "oro:fetch": "`oro:fetch` exposes the runtime fetch stack and standard request/response primitives.", - "oro:gc": "`oro:gc` lets you register finalizers and control object retention hooks.", - "oro:hci": "`oro:hci` exposes host controller interface helpers for low-level Bluetooth adapter access.", - "oro:http": "`oro:http` provides Node-compatible HTTP client and server APIs.", - "oro:https": "`oro:https` provides HTTPS client and server APIs on top of the runtime TLS stack.", - "oro:i18n": "`oro:i18n` resolves UI languages, localized messages, and locale-aware metadata.", - "oro:ip": "`oro:ip` normalizes and validates IP address inputs.", - "oro:ipc": "`oro:ipc` exposes low-level runtime IPC helpers used to talk to the native host process.", - "oro:ipfs": "`oro:ipfs` manages the embedded IPFS node and common content operations.", - "oro:iroh": "`oro:iroh` exposes the runtime’s Iroh transport bindings for peer-to-peer connections and streams.", - "oro:language": "`oro:language` resolves language names, tags, and related metadata.", - "oro:latica": "`oro:latica/*` exposes the runtime’s Latica networking primitives, packet helpers, and crypto utilities.", - "oro:location": "`oro:location` normalizes the current runtime location and origin semantics across platforms.", - "oro:mime": "`oro:mime` looks up MIME types, extensions, and content-type metadata.", - "oro:module": "`oro:module` exposes module-loader helpers and builtin-module inspection.", - "oro:navigation": "`oro:navigation` surfaces the Navigation API state that the runtime makes available to application code.", - "oro:net": "`oro:net` provides Node-compatible TCP clients and servers.", - "oro:network": "`oro:network` exposes a higher-level networking surface built on the Latica stack.", - "oro:npm": "`oro:npm/*` supports package-resolution and service-worker plumbing for NPM-backed modules.", - "oro:os": "`oro:os` exposes platform, CPU, temporary-directory, and system metadata helpers.", - "oro:path": "`oro:path` provides cross-platform path manipulation utilities.", - "oro:process": "`oro:process` exposes runtime process state, env access, signals, and scheduling helpers.", - "oro:protocol-handlers": "`oro:protocol-handlers` exposes runtime helpers for custom protocol and service-worker routing.", - "oro:querystring": "`oro:querystring` parses and serializes URL query strings.", - "oro:semver": "`oro:semver` parses, validates, and compares semantic versions.", - "oro:service-worker": "`oro:service-worker/*` exposes the service-worker environment, lifecycle objects, and helpers.", - "oro:shared-worker": "`oro:shared-worker/*` exposes the shared-worker environment and runtime helpers.", - "oro:signal": "`oro:signal` exposes process-signal constants, conversion helpers, and event listeners.", - "oro:sqlite": "`oro:sqlite` opens SQLite databases and exposes sync and async query helpers.", - "oro:stream": "`oro:stream` exposes Node-style streams, Web streams, and pipeline helpers.", - "oro:string_decoder": "`oro:string_decoder` decodes split byte streams into text without corrupting multibyte characters.", - "oro:tar": "`oro:tar` opens, creates, streams, and extracts tar archives.", - "oro:tcp": "`oro:tcp` exposes lower-level TCP client and server helpers alongside the higher-level `oro:net` API.", - "oro:test": "`oro:test` provides the runtime test harness used by application and module tests.", - "oro:timers": "`oro:timers` exposes timer primitives, promise-based sleeps, and scheduler helpers.", - "oro:tls": "`oro:tls` exposes TLS sockets, servers, and certificate-pin helpers.", - "oro:toml": "`oro:toml` parses and serializes TOML documents.", - "oro:tty": "`oro:tty` exposes terminal streams and TTY detection helpers.", - "oro:url": "`oro:url` exposes the WHATWG URL implementation used by the runtime.", - "oro:usb": "`oro:usb` installs and exposes the runtime WebUSB surface for window contexts.", - "oro:util": "`oro:util` exposes inspection, debug, and type-checking helpers.", - "oro:vm": "`oro:vm` runs JavaScript in isolated runtime contexts and manages context windows and workers.", - "oro:worker": "`oro:worker` re-exports the runtime worker classes for dedicated, shared, and service workers.", - "oro:worker_threads": "`oro:worker_threads` exposes worker-thread primitives, ports, and environment data helpers.", - "oro:xpc": "`oro:xpc` connects to macOS XPC services and encodes structured XPC payloads.", - "oro:zlib": "`oro:zlib` compresses and decompresses buffers and exposes zlib stream helpers.", -} - - -EXAMPLES_BY_FAMILY: dict[str, str] = { - "oro:asn1": md( - """ - Parse ASN.1 source text and inspect the discovered modules: - - ```js - import { parse } from 'oro:asn1' - - const document = await parse(` - Demo DEFINITIONS ::= BEGIN - serialNumber INTEGER ::= 42 - END - `) - - console.log(document.modulesCount) - console.log(document.modules[0]?.name) - ``` - """ - ), - "oro:assert": md( - """ - Use assertion helpers for runtime invariants or tests: - - ```js - import { ok, strictEqual, deepEqual } from 'oro:assert' - - const payload = { id: 7, tags: ['runtime', 'docs'] } - - ok(payload.id > 0) - strictEqual(payload.tags.length, 2) - deepEqual(payload.tags, ['runtime', 'docs']) - ``` - """ - ), - "oro:async": md( - """ - Propagate request-scoped state across async boundaries: - - ```js - import { AsyncLocalStorage } from 'oro:async' - - const store = new AsyncLocalStorage() - - await store.run({ requestId: 'req-42' }, async () => { - await Promise.resolve() - console.log(store.getStore().requestId) - }) - ``` - """ - ), - "oro:async_hooks": md( - """ - Inspect async-resource lifecycles as work is scheduled: - - ```js - import { createHook, executionAsyncId } from 'oro:async_hooks' - - const hook = createHook({ - init(asyncId, type, triggerAsyncId) { - console.log({ asyncId, type, triggerAsyncId }) - } - }) - - hook.enable() - queueMicrotask(() => { - console.log(executionAsyncId()) - hook.disable() - }) - ``` - """ - ), - "oro:background": md( - """ - Check whether background execution is available before scheduling work: - - ```js - import background from 'oro:background' - - if (background.available) { - console.log(await background.status()) - } - ``` - """ - ), - "oro:buffer": md( - """ - Create byte buffers and wrap them in higher-level binary containers: - - ```js - import Buffer, { Blob } from 'oro:buffer' - - const bytes = Buffer.from('hello runtime', 'utf8') - const payload = new Blob([bytes], { type: 'text/plain' }) - - console.log(bytes.length) - console.log(payload.size) - ``` - """ - ), - "oro:cdp": md( - """ - Inspect the current DevTools state and start the endpoint when needed: - - ```js - import { status, listen, close } from 'oro:cdp' - - console.log(await status()) - await listen({ host: '127.0.0.1', port: 9222 }) - - // ...connect a DevTools client... - - await close() - ``` - """ - ), - "oro:child_process": md( - """ - Spawn a subprocess and consume its stdout stream: - - ```js - import { spawn } from 'oro:child_process' - - const child = spawn('echo', ['hello from runtime']) - - child.stdout.on('data', (chunk) => { - console.log(chunk.toString()) - }) - - await new Promise((resolve, reject) => { - child.once('close', resolve) - child.once('error', reject) - }) - ``` - """ - ), - "oro:clipboard": md( - """ - Read and write plain-text clipboard content: - - ```js - import { writeText, readText, canWriteText } from 'oro:clipboard' - - if (canWriteText()) { - await writeText('Copied from Oro Runtime') - console.log(await readText()) - } - ``` - """ - ), - "oro:commonjs": md( - """ - Resolve CommonJS modules from the current ES module: - - ```js - import { Module, isBuiltin } from 'oro:commonjs' - - const require = Module.createRequire(import.meta.url) - - console.log(isBuiltin('fs')) - console.log(require('./package.json').name) - ``` - """ - ), - "oro:conduit": md( - """ - Connect to the runtime conduit and inspect its current status: - - ```js - import { Conduit } from 'oro:conduit' - - const conduit = new Conduit({ id: 'docs' }) - await conduit.connect() - - console.log(await Conduit.status()) - - await conduit.close() - ``` - """ - ), - "oro:console": md( - """ - Patch the global console so application logs use the runtime console implementation: - - ```js - import { patchGlobalConsole } from 'oro:console' - - patchGlobalConsole(globalThis.console) - - console.info('runtime console is active') - ``` - """ - ), - "oro:constants": md( - """ - Use named constants instead of hard-coding errno or signal values: - - ```js - import { EACCES, SIGTERM } from 'oro:constants' - - console.log({ EACCES, SIGTERM }) - ``` - """ - ), - "oro:cookies": md( - """ - Set, read, and remove cookies for an application-controlled origin: - - ```js - import { set, get, remove } from 'oro:cookies' - - await set('https://app.example', 'session=abc123; Path=/; HttpOnly') - console.log(await get('https://app.example')) - await remove('https://app.example', 'session') - ``` - """ - ), - "oro:crypto": md( - """ - Generate random bytes and hash them with the runtime digest helper: - - ```js - import { randomBytes, createDigest, murmur3 } from 'oro:crypto' - - const nonce = randomBytes(16) - const digest = await createDigest('sha256', nonce) - - console.log(digest.toString('hex')) - console.log(murmur3('hello-runtime')) - ``` - """ - ), - "oro:dbus": md( - """ - Check DBus availability and open a session-bus connection: - - ```js - import { availability, connect, BUS } from 'oro:dbus' - - const state = await availability() - - if (state.available) { - const bus = await connect({ bus: BUS.SESSION }) - console.log(bus.id) - await bus.close() - } - ``` - """ - ), - "oro:dgram": md( - """ - Create a UDP socket and send a datagram: - - ```js - import Buffer from 'oro:buffer' - import { createSocket } from 'oro:dgram' - - const socket = createSocket('udp4') - - socket.on('message', (message, rinfo) => { - console.log(rinfo.address, message.toString()) - }) - - socket.bind(41234) - socket.send(Buffer.from('ping'), 41235, '127.0.0.1') - ``` - """ - ), - "oro:diagnostics": md( - """ - Publish and subscribe to a diagnostics channel: - - ```js - import { channel } from 'oro:diagnostics' - - const buildChannel = channel('build') - - buildChannel.subscribe('step', (message) => { - console.log(message.step) - }) - - await buildChannel.publish('step', { step: 'bundle-ready' }) - ``` - """ - ), - "oro:did": md( - """ - Parse a DID and a DID URL: - - ```js - import { parse, parseUrl } from 'oro:did' - - const did = parse('did:key:z6Mkkx...') - const url = parseUrl('did:key:z6Mkkx...#keys-1') - - console.log(did.method) - console.log(url.fragment) - ``` - """ - ), - "oro:dns": md( - """ - Resolve hostnames with the promise-based DNS helpers: - - ```js - import { lookup } from 'oro:dns/promises' - - const record = await lookup('oro.computer') - - console.log(record.address) - console.log(record.family) - ``` - """ - ), - "oro:enumeration": md( - """ - Use `Enumeration` when you want a typed, readable set of allowed values: - - ```js - import Enumeration from 'oro:enumeration' - - const states = new Enumeration(['draft', 'ready', 'shipped']) - - console.log(states.has('ready')) - console.log([...states]) - ``` - """ - ), - "oro:errno": md( - """ - Convert errno values to names and human-readable messages: - - ```js - import { EACCES, getName, getMessage } from 'oro:errno' - - console.log(getName(EACCES)) - console.log(getMessage(EACCES)) - ``` - """ - ), - "oro:errors": md( - """ - Construct runtime error types directly when surfacing failures: - - ```js - import { AbortError, NotFoundError } from 'oro:errors' - - const abort = new AbortError('request cancelled') - const missing = new NotFoundError('resource not found') - - console.log(abort.name, missing.name) - ``` - """ - ), - "oro:events": md( - """ - Use `EventEmitter` for familiar event-based application code: - - ```js - import EventEmitter from 'oro:events' - - const bus = new EventEmitter() - - bus.on('ready', (value) => console.log(value)) - bus.emit('ready', { ok: true }) - ``` - """ - ), - "oro:extension": md( - """ - Load a runtime extension and inspect the resulting binding: - - ```js - import { load, stats } from 'oro:extension' - - const extension = await load('image-tools', { allow: ['resize'] }) - - console.log(extension.type) - console.log(await stats()) - - await extension.unload() - ``` - """ - ), - "oro:fetch": md( - """ - Use the runtime fetch stack exactly like standard web fetch: - - ```js - import fetch from 'oro:fetch' - - const response = await fetch('https://example.com/api/status') - const data = await response.json() - - console.log(data) - ``` - """ - ), - "oro:gc": md( - """ - Register a finalizer on an object that owns runtime resources: - - ```js - import { ref, unref } from 'oro:gc' - - const resource = { - [Symbol.for('oro.runtime.gc.finalize')]() { - console.log('cleaning up resource') - } - } - - ref(resource) - unref(resource) - ``` - """ - ), - "oro:hci": md( - """ - Inspect local Bluetooth adapters before opening a low-level HCI socket: - - ```js - import { listAdapters, getAdapter } from 'oro:hci' - - const adapters = listAdapters() - console.log(adapters) - - if (adapters.length > 0) { - console.log(getAdapter(adapters[0].devId)) - } - ``` - """ - ), - "oro:http": md( - """ - Start a small HTTP server with the Node-compatible API: - - ```js - import { createServer } from 'oro:http' - - const server = createServer((req, res) => { - res.writeHead(200, { 'content-type': 'text/plain' }) - res.end('hello from oro:http') - }) - - server.listen(8080, '127.0.0.1') - ``` - """ - ), - "oro:https": md( - """ - Issue an HTTPS request with the familiar client helper: - - ```js - import process from 'oro:process' - import { get } from 'oro:https' - - get('https://example.com', (res) => { - res.on('data', (chunk) => process.stdout.write(chunk)) - }) - ``` - """ - ), - "oro:i18n": md( - """ - Resolve the current UI language and look up a localized message: - - ```js - import { getUILanguage, getMessage } from 'oro:i18n' - - console.log(getUILanguage()) - console.log(getMessage('menu.file.open')) - ``` - """ - ), - "oro:ip": md( - """ - Normalize user-provided IP input before using it in socket code: - - ```js - import { normalizeIPv4, isIPv4 } from 'oro:ip' - - const address = normalizeIPv4('127.000.000.001') - - console.log(address) - console.log(isIPv4(address)) - ``` - """ - ), - "oro:ipc": md( - """ - Wait for the runtime IPC bridge and post a structured message: - - ```js - import { ready, postMessage, debug } from 'oro:ipc' - - debug(true) - await ready() - - postMessage({ type: 'docs-demo', at: Date.now() }) - ``` - """ - ), - "oro:ipfs": md( - """ - Ensure the embedded IPFS node is running before adding local content: - - ```js - import { ensureStarted, add, status } from 'oro:ipfs' - - await ensureStarted({ repoPath: './ipfs-repo' }) - console.log(await status()) - - const { cid } = await add('/absolute/path/to/report.txt') - console.log(cid) - ``` - """ - ), - "oro:iroh": md( - """ - Initialize the Iroh transport and create an endpoint: - - ```js - import { ensureInitialized, Endpoint } from 'oro:iroh' - - await ensureInitialized() - - const endpoint = await Endpoint.create() - await endpoint.bind() - - console.log(await endpoint.nodeAddr()) - - await endpoint.close() - ``` - """ - ), - "oro:language": md( - """ - Resolve language tags and metadata from user input: - - ```js - import { lookup, describe } from 'oro:language' - - console.log(lookup('en-US')) - console.log(describe('English')) - ``` - """ - ), - "oro:latica": md( - """ - Use Latica helpers directly when you are working at the packet and transport layer: - - ```js - import { sha256 } from 'oro:latica' - - const topic = await sha256(new TextEncoder().encode('docs-demo')) - - console.log(topic) - ``` - """ - ), - "oro:location": md( - """ - Inspect the runtime-normalized location values for the current context: - - ```js - import location from 'oro:location' - - console.log(location.href) - console.log(location.origin) - ``` - """ - ), - "oro:mime": md( - """ - Look up MIME metadata for a type or extension: - - ```js - import { lookupSync } from 'oro:mime' - - console.log(lookupSync('application/json')) - console.log(lookupSync('.png')) - ``` - """ - ), - "oro:module": md( - """ - Inspect builtin modules and create a `require()` function when you need one: - - ```js - import Module, { builtinModules, isBuiltin, createRequire } from 'oro:module' - - const require = createRequire(import.meta.url) - - console.log(isBuiltin('oro:path')) - console.log(Object.keys(builtinModules).length) - console.log(typeof Module) - console.log(typeof require) - ``` - """ - ), - "oro:navigation": md( - """ - Read the current navigation entry and listen for browser-style navigation events: - - ```js - import navigation from 'oro:navigation' - - console.log(navigation.currentEntry?.url) - - navigation.addEventListener('navigate', (event) => { - console.log(event.destination.url) - }) - ``` - """ - ), - "oro:net": md( - """ - Build a TCP echo server with the Node-compatible net API: - - ```js - import { createServer } from 'oro:net' - - const server = createServer({}, (socket) => { - socket.on('data', (chunk) => socket.write(chunk)) - }) - - server.listen(4040, '127.0.0.1') - ``` - """ - ), - "oro:network": md( - """ - Start the higher-level networking surface and attach event listeners: - - ```js - import network from 'oro:network' - - const bus = await network({}) - - bus.on('error', console.error) - bus.on('message', (message) => console.log(message)) - ``` - """ - ), - "oro:npm": md( - """ - Resolve an NPM specifier to the runtime module URL it will load: - - ```js - import { resolve } from 'oro:npm/module' - - const resolved = resolve('react', import.meta.url) - - console.log(resolved?.url) - console.log(resolved?.type) - ``` - """ - ), - "oro:os": md( - """ - Inspect the current platform and locate scratch space: - - ```js - import { arch, platform, tmpdir, cpus } from 'oro:os' - - console.log(platform(), arch()) - console.log(tmpdir()) - console.log(cpus().length) - ``` - """ - ), - "oro:path": md( - """ - Compose paths without branching on platform separators: - - ```js - import { resolve, join, dirname, basename } from 'oro:path' - - const absolute = resolve('dist', 'assets', 'logo.svg') - - console.log(absolute) - console.log(dirname(absolute)) - console.log(basename(join('/tmp', 'report.txt'))) - ``` - """ - ), - "oro:process": md( - """ - Inspect process state and schedule work on the next tick: - - ```js - import process, { env, hrtime, nextTick } from 'oro:process' - - console.log(env.PATH) - console.log(hrtime()) - - nextTick(() => { - console.log(process.pid) - }) - ``` - """ - ), - "oro:protocol-handlers": md( - """ - Ask the runtime which service worker is currently handling a custom scheme: - - ```js - import { getServiceWorker } from 'oro:protocol-handlers' - - const worker = await getServiceWorker({ scheme: 'npm' }) - - console.log(worker) - ``` - """ - ), - "oro:querystring": md( - """ - Parse and serialize query strings with the Node-compatible helpers: - - ```js - import { stringify, parse } from 'oro:querystring' - - const query = stringify({ q: 'oro runtime', page: 2 }) - - console.log(query) - console.log(parse(query)) - ``` - """ - ), - "oro:semver": md( - """ - Validate and compare versions before running upgrade logic: - - ```js - import { valid, compare, gt } from 'oro:semver' - - console.log(valid('1.4.0')) - console.log(compare('1.4.0', '1.3.9')) - console.log(gt('2.0.0', '1.9.0')) - ``` - """ - ), - "oro:service-worker": md( - """ - Use the runtime service-worker helpers from inside a service-worker scope: - - ```js - import { env } from 'oro:service-worker' - - if (env) { - self.addEventListener('fetch', (event) => { - event.respondWith(fetch(event.request)) - }) - } - ``` - """ - ), - "oro:shared-worker": md( - """ - Launch a shared worker and communicate through its shared port: - - ```js - import { SharedWorker } from 'oro:shared-worker' - - const worker = new SharedWorker(new URL('./shared.js', import.meta.url)) - - worker.port.start() - worker.port.postMessage({ type: 'warmup' }) - ``` - """ - ), - "oro:signal": md( - """ - Listen for runtime process signals using the signal helper surface: - - ```js - import signal from 'oro:signal' - - signal.addEventListener('SIGTERM', (event) => { - console.log(event.type) - }) - ``` - """ - ), - "oro:sqlite": md( - """ - Open an in-memory database and run a few synchronous queries: - - ```js - import { open, OPEN_CREATE, OPEN_MEMORY } from 'oro:sqlite' - - const db = open(':memory:', { flags: OPEN_CREATE | OPEN_MEMORY }) - - db.exec('create table notes (id integer primary key, title text)') - db.exec(\"insert into notes (title) values ('hello')\") - - console.log(db.query('select * from notes')) - ``` - """ - ), - "oro:stream": md( - """ - Connect streams together with the pipeline helper: - - ```js - import process from 'oro:process' - import { Readable, Writable, pipelinePromise } from 'oro:stream' - - const source = Readable.from(['oro', ' ', 'runtime']) - const sink = new Writable({ - write(chunk, _encoding, done) { - process.stdout.write(chunk) - done() - } - }) - - await pipelinePromise(source, sink) - ``` - """ - ), - "oro:string_decoder": md( - """ - Decode chunked UTF-8 data without splitting multibyte characters: - - ```js - import Buffer from 'oro:buffer' - import StringDecoder from 'oro:string_decoder' - - const decoder = new StringDecoder('utf8') - const chunks = [Buffer.from([0xe2, 0x82]), Buffer.from([0xac])] - - console.log(decoder.write(chunks[0])) - console.log(decoder.write(chunks[1])) - ``` - """ - ), - "oro:tar": md( - """ - Build a tar archive in memory and inspect its entries: - - ```js - import Buffer from 'oro:buffer' - import { createInMemory } from 'oro:tar' - - const archive = await createInMemory() - - await archive.append({ path: 'hello.txt' }, Buffer.from('hello')) - await archive.finalize() - - console.log(await archive.entries()) - ``` - """ - ), - "oro:tcp": md( - """ - Open a lower-level TCP server when you want more direct socket control: - - ```js - import { createServer } from 'oro:tcp' - - const server = createServer((socket) => { - socket.write(Buffer.from('connected')) - }) - - server.listen({ port: 5050, host: '127.0.0.1' }) - ``` - """ - ), - "oro:test": md( - """ - Write runtime tests with the built-in test harness: - - ```js - import test from 'oro:test' - - test('querystring roundtrip', async (t) => { - t.equal('a=1', new URLSearchParams({ a: '1' }).toString()) - }) - ``` - """ - ), - "oro:timers": md( - """ - Sleep without writing your own timeout wrapper: - - ```js - import { sleep } from 'oro:timers' - - await sleep(250) - - console.log('quarter second elapsed') - ``` - """ - ), - "oro:tls": md( - """ - Configure TLS pins before opening pinned connections: - - ```js - import { setTlsPins, getTlsPins, clearTlsPins } from 'oro:tls' - - await setTlsPins('sha256/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=') - console.log(await getTlsPins()) - await clearTlsPins() - ``` - """ - ), - "oro:toml": md( - """ - Parse configuration and emit updated TOML back to disk: - - ```js - import { parse, stringify } from 'oro:toml' - - const config = parse('name = \"oro\"\\nport = 8080') - config.debug = true - - console.log(stringify(config)) - ``` - """ - ), - "oro:tty": md( - """ - Detect interactive terminals before enabling richer output: - - ```js - import { isatty } from 'oro:tty' - - console.log(isatty(0)) - console.log(isatty(1)) - ``` - """ - ), - "oro:url": md( - """ - Use the WHATWG URL implementation for robust URL parsing: - - ```js - import URL from 'oro:url' - - const url = new URL('https://oro.computer/docs?project=runtime') - - console.log(url.pathname) - console.log(url.searchParams.get('project')) - ``` - """ - ), - "oro:usb": md( - """ - Install the runtime WebUSB surface and request a device in window contexts: - - ```js - import { installNavigatorUSB } from 'oro:usb' - - const usb = installNavigatorUSB() - - if (usb) { - console.log(await usb.getDevices()) - // const device = await usb.requestDevice({ filters: [{ vendorId: 0x1209 }] }) - } - ``` - """ - ), - "oro:util": md( - """ - Use the runtime debug helper and common type predicates: - - ```js - import { debug, isTypedArray } from 'oro:util' - - const log = debug('docs') - const payload = new Uint8Array([1, 2, 3]) - - log('payload ready') - console.log(isTypedArray(payload)) - ``` - """ - ), - "oro:vm": md( - """ - Run a script inside an isolated context object: - - ```js - import { runInContext } from 'oro:vm' - - const context = { answer: 41 } - const result = await runInContext('answer + 1', context) - - console.log(result) - ``` - """ - ), - "oro:worker": md( - """ - Launch a dedicated worker through the runtime worker surface: - - ```js - import Worker from 'oro:worker' - - const worker = new Worker(new URL('./worker.js', import.meta.url), { - workerData: { job: 'thumbnail' } - }) - - worker.postMessage({ type: 'start' }) - ``` - """ - ), - "oro:worker_threads": md( - """ - Pass environment data into worker threads and communicate with message channels: - - ```js - import { MessageChannel, setEnvironmentData } from 'oro:worker_threads' - - setEnvironmentData('traceId', 'req-42') - - const { port1, port2 } = new MessageChannel() - port1.onmessage = (event) => console.log(event.data) - port2.postMessage({ ok: true }) - ``` - """ - ), - "oro:xpc": md( - """ - Open an XPC connection, send a request, and close it cleanly: - - ```js - import { availability, connect } from 'oro:xpc' - - const state = await availability() - - if (state.available) { - const connection = await connect({ service: 'com.example.agent' }) - await connection.sendAndForget({ type: 'ping' }) - await connection.close() - } - ``` - """ - ), - "oro:zlib": md( - """ - Compress and decompress buffers with the promise-based helpers: - - ```js - import { gzip, gunzip } from 'oro:zlib' - - const compressed = await gzip('hello runtime') - const restored = await gunzip(compressed) - - console.log(restored.toString()) - ``` - """ - ), -} - - -DEFAULT_SEE_ALSO: tuple[tuple[str, str], ...] = ( - ("JavaScript APIs overview", "javascript/overview"), - ("All module specifiers", "javascript/all-modules"), -) - - -GUIDE_REFS_BY_FAMILY: dict[str, tuple[tuple[str, str], ...]] = { - "oro:application": ( - ("Windows and messaging", "guides/windows-and-messaging"), - ("Lifecycle hooks and deep links", "guides/lifecycle-hooks-and-deep-links"), - ("Desktop integrations", "guides/desktop-integrations"), - ), - "oro:assert": ( - ("Testing and diagnostics", "guides/testing-and-diagnostics"), - ), - "oro:cdp": ( - ("Testing and diagnostics", "guides/testing-and-diagnostics"), - ), - "oro:child_process": ( - ("Configure your runtime project", "guides/configure-your-runtime-project"), - ("Testing and diagnostics", "guides/testing-and-diagnostics"), - ), - "oro:clipboard": ( - ("Desktop integrations", "guides/desktop-integrations"), - ), - "oro:console": ( - ("Testing and diagnostics", "guides/testing-and-diagnostics"), - ), - "oro:crypto": ( - ("Secure storage and sessions", "guides/secure-storage-and-sessions"), - ), - "oro:diagnostics": ( - ("Testing and diagnostics", "guides/testing-and-diagnostics"), - ), - "oro:errors": ( - ("Testing and diagnostics", "guides/testing-and-diagnostics"), - ), - "oro:extension": ( - ("Native extensions", "guides/native-extensions"), - ), - "oro:fetch": ( - ("Calling HTTP APIs", "guides/calling-http-apis"), - ("Offline-first with service workers", "guides/offline-first-with-service-workers"), - ), - "oro:fs": ( - ("Files and sandboxing", "guides/files-and-sandboxing"), - ("Project layout", "guides/project-layout"), - ), - "oro:hooks": ( - ("Lifecycle hooks and deep links", "guides/lifecycle-hooks-and-deep-links"), - ("Windows and messaging", "guides/windows-and-messaging"), - ), - "oro:http": ( - ("Calling HTTP APIs", "guides/calling-http-apis"), - ), - "oro:https": ( - ("Calling HTTP APIs", "guides/calling-http-apis"), - ), - "oro:ipc": ( - ("Native extensions", "guides/native-extensions"), - ("Windows and messaging", "guides/windows-and-messaging"), - ), - "oro:location": ( - ("Lifecycle hooks and deep links", "guides/lifecycle-hooks-and-deep-links"), - ), - "oro:mcp": ( - ("MCP and agent automation", "guides/mcp-and-agent-automation"), - ), - "oro:navigation": ( - ("Lifecycle hooks and deep links", "guides/lifecycle-hooks-and-deep-links"), - ("Windows and messaging", "guides/windows-and-messaging"), - ), - "oro:notification": ( - ("Desktop integrations", "guides/desktop-integrations"), - ("Lifecycle hooks and deep links", "guides/lifecycle-hooks-and-deep-links"), - ), - "oro:path": ( - ("Files and sandboxing", "guides/files-and-sandboxing"), - ("Project layout", "guides/project-layout"), - ), - "oro:process": ( - ("Configure your runtime project", "guides/configure-your-runtime-project"), - ), - "oro:protocol-handlers": ( - ("Custom protocols and routing", "guides/custom-protocols-and-routing"), - ("Offline-first with service workers", "guides/offline-first-with-service-workers"), - ), - "oro:secure-storage": ( - ("Secure storage and sessions", "guides/secure-storage-and-sessions"), - ), - "oro:service-worker": ( - ("Offline-first with service workers", "guides/offline-first-with-service-workers"), - ("Custom protocols and routing", "guides/custom-protocols-and-routing"), - ), - "oro:shared-worker": ( - ("Shared workers across windows", "guides/shared-workers-across-windows"), - ("Windows and messaging", "guides/windows-and-messaging"), - ), - "oro:sqlite": ( - ("Local data with SQLite", "guides/local-data-with-sqlite"), - ("Files and sandboxing", "guides/files-and-sandboxing"), - ), - "oro:test": ( - ("Testing and diagnostics", "guides/testing-and-diagnostics"), - ), - "oro:worker": ( - ("Worker threads for heavy work", "guides/worker-threads-for-heavy-work"), - ("Shared workers across windows", "guides/shared-workers-across-windows"), - ), - "oro:worker_threads": ( - ("Worker threads for heavy work", "guides/worker-threads-for-heavy-work"), - ), - "oro:window": ( - ("Windows and messaging", "guides/windows-and-messaging"), - ("Desktop integrations", "guides/desktop-integrations"), - ), -} diff --git a/sage/tools/audit-site.py b/sage/tools/audit-site.py deleted file mode 100644 index 3ca6450f..00000000 --- a/sage/tools/audit-site.py +++ /dev/null @@ -1,32 +0,0 @@ -#!/usr/bin/env python3 - -from __future__ import annotations - -import sys -import os -from pathlib import Path - - -SITE_ROOT = Path(__file__).resolve().parents[2] -SAGE_ROOT = Path(os.environ.get("ORO_SITE_OUTPUT", str(SITE_ROOT / "public"))) / "sage" -REPO_ROOT = SAGE_ROOT.parent - -sys.path.insert(0, str(SITE_ROOT / "tools")) - -from site_audit_common import SiteAuditConfig, run_site_audit - - -def main() -> int: - return run_site_audit( - SiteAuditConfig( - project_root=SAGE_ROOT, - docs_source=SAGE_ROOT / "docs" / "source", - docs_index=SAGE_ROOT / "docs" / "index.json", - missing_index_message="Missing Sage docs/index.json; run build scripts first.", - success_message="OK: sage site audit passed", - ) - ) - - -if __name__ == "__main__": - raise SystemExit(main()) diff --git a/silk/tools/audit-site.py b/silk/tools/audit-site.py deleted file mode 100644 index 64228e25..00000000 --- a/silk/tools/audit-site.py +++ /dev/null @@ -1,130 +0,0 @@ -#!/usr/bin/env python3 - -from __future__ import annotations - -import re -import sys -import os -from pathlib import Path - - -SITE_ROOT = Path(__file__).resolve().parents[2] -SILK_ROOT = Path(os.environ.get("ORO_SITE_OUTPUT", str(SITE_ROOT / "public"))) / "silk" -REPO_ROOT = SILK_ROOT.parent - -DOCS_SOURCE = SILK_ROOT / "docs" / "source" -WIKI_SOURCE = SILK_ROOT / "wiki" / "source" - -DOCS_INDEX = SILK_ROOT / "docs" / "index.json" -WIKI_INDEX = SILK_ROOT / "wiki" / "index.json" - -sys.path.insert(0, str(SITE_ROOT / "tools")) - -from site_audit_common import ( - Issue, - check_doclike_links_in_tree, - check_index_files_exist_at, - check_no_editorial_status_framing_in_tree, - check_no_raw_manpage_refs_in_tree, - check_no_raw_viewer_refs_in_tree, - check_p_links_in_tree, - load_ids, -) - - -def check_no_arena_identifiers(source_root: Path) -> list[Issue]: - issues: list[Issue] = [] - banned = re.compile( - r"\bconst\s+region\s+arena\b" - r"|\bexport\s+const\s+region\s+arena\b" - r"|\bwith\s+arena\b\s*\{" - r"|\bfrom\s+arena\b" - r"|\bglobal_arena\b", - flags=re.I, - ) - for md in source_root.rglob("*.md"): - text = md.read_text(encoding="utf-8") - if banned.search(text): - issues.append(Issue(md, "Found arena identifier in examples (use regions + neutral names).")) - return issues - - -def check_no_works_today_labels(source_root: Path) -> list[Issue]: - issues: list[Issue] = [] - banned = re.compile( - r"\bWorks today\b|\bWhat works today\b|\(Works today\)|Syntax\s*\(Selected\)", - flags=re.I, - ) - for md in source_root.rglob("*.md"): - text = md.read_text(encoding="utf-8") - if banned.search(text): - issues.append(Issue(md, "Found deprecated 'Works today' / 'Syntax (Selected)' labeling.")) - return issues - - -def check_spec_has_no_repo_internal_paths(spec_path: Path) -> list[Issue]: - issues: list[Issue] = [] - if not spec_path.exists(): - return issues - - text = spec_path.read_text(encoding="utf-8") - banned = re.compile( - r"\bchecker\.[A-Za-z0-9_]+\b" - r"|\bsrc/[A-Za-z0-9_./-]+" - r"|\bc-tests/" - r"|\btests/silk/", - flags=re.I, - ) - if banned.search(text): - issues.append(Issue(spec_path, "Spec contains repo-internal paths/names (remove or generalize).")) - return issues - - -def main() -> int: - if not DOCS_INDEX.exists() or not WIKI_INDEX.exists(): - print("Missing Silk index.json files; run build scripts first.", file=sys.stderr) - return 2 - - docs_ids = load_ids(DOCS_INDEX) - wiki_ids = load_ids(WIKI_INDEX) - ids_by_kind = {"docs": docs_ids, "wiki": wiki_ids} - source_roots = { - "docs": DOCS_SOURCE, - "wiki": WIKI_SOURCE, - "spec": DOCS_SOURCE / "spec", - } - - issues: list[Issue] = [] - issues += check_index_files_exist_at(DOCS_INDEX, DOCS_SOURCE) - issues += check_index_files_exist_at(WIKI_INDEX, WIKI_SOURCE) - issues += check_p_links_in_tree(DOCS_SOURCE, "docs", ids_by_kind, include_kind_in_message=True) - issues += check_p_links_in_tree(WIKI_SOURCE, "wiki", ids_by_kind, include_kind_in_message=True) - issues += check_doclike_links_in_tree(DOCS_SOURCE, REPO_ROOT, source_roots) - issues += check_doclike_links_in_tree(WIKI_SOURCE, REPO_ROOT, source_roots) - issues += check_no_arena_identifiers(DOCS_SOURCE) - issues += check_no_arena_identifiers(WIKI_SOURCE) - issues += check_no_works_today_labels(DOCS_SOURCE) - issues += check_no_works_today_labels(WIKI_SOURCE) - issues += check_no_raw_viewer_refs_in_tree(DOCS_SOURCE) - issues += check_no_raw_viewer_refs_in_tree(WIKI_SOURCE) - issues += check_no_raw_manpage_refs_in_tree(DOCS_SOURCE) - issues += check_no_raw_manpage_refs_in_tree(WIKI_SOURCE) - issues += check_no_editorial_status_framing_in_tree(DOCS_SOURCE) - issues += check_no_editorial_status_framing_in_tree(WIKI_SOURCE) - issues += check_spec_has_no_repo_internal_paths(DOCS_SOURCE / "spec" / "2026.md") - - if issues: - for issue in issues[:200]: - rel = issue.path.relative_to(REPO_ROOT) - print(f"{rel}: {issue.message}", file=sys.stderr) - if len(issues) > 200: - print(f"... and {len(issues) - 200} more", file=sys.stderr) - print(f"FAIL: {len(issues)} issues", file=sys.stderr) - return 1 - - print("OK: silk site audit passed") - return 0 - - -if __name__ == "__main__": - raise SystemExit(main()) diff --git a/silk/tools/audit-stdlib-docs.py b/silk/tools/audit-stdlib-docs.py deleted file mode 100644 index f784f6d2..00000000 --- a/silk/tools/audit-stdlib-docs.py +++ /dev/null @@ -1,134 +0,0 @@ -#!/usr/bin/env python3 - -from __future__ import annotations - -import os -import re -import sys -from dataclasses import dataclass -from pathlib import Path - - -SILK_ROOT = Path(__file__).resolve().parents[1] -STD_DOCS = Path(os.environ.get("ORO_SITE_OUTPUT", str(SILK_ROOT.parent / "public"))) / "silk" / "docs" / "source" / "std" - -ORDER = [ - "Description", - "Exported API", - "Examples", - "Considerations", - "Design goals", - "See also", -] - -BANNED_HEADINGS = ( - "API", - "Current API", - "Implemented API", - "Public API", - "High-Level API", - "Intended Surface", - "Current Surface", - "Current Grammar Coverage", - "Goals", - "Design Goals", - "Future Work", - "Future work", - "Follow-ups", - "Remaining Follow-Ups", - "Important Limitations", - "Current Limitations", - "Notes and Limitations", -) - -BANNED_HEADING_PATTERNS = ( - re.compile(r"\bInitial Design\b", flags=re.I), - re.compile(r"\bCurrent Scope\b", flags=re.I), - re.compile(r"\bScope \(Current\)\b", flags=re.I), - re.compile(r"\bMVP\b", flags=re.I), -) - -BANNED_STATUS_PATTERNS = ( - re.compile(r"active expansion", flags=re.I), - re.compile(r"current snapshot", flags=re.I), - re.compile(r"Partially implemented", flags=re.I), - re.compile(r"initial std wrapper", flags=re.I), - re.compile(r"expansion path", flags=re.I), - re.compile(r"\bMVP\b", flags=re.I), -) - - -@dataclass(frozen=True) -class Issue: - path: Path - message: str - - -def collect_h2s(path: Path) -> list[str]: - headings: list[str] = [] - for line in path.read_text(encoding="utf-8").splitlines(): - if line.startswith("## "): - headings.append(line[3:].strip()) - return headings - - -def check_status(path: Path, text: str) -> list[Issue]: - issues: list[Issue] = [] - for pattern in BANNED_STATUS_PATTERNS: - if pattern.search(text): - issues.append(Issue(path, f"Status/body uses banned transitional wording: {pattern.pattern}")) - return issues - - -def check_headings(path: Path, headings: list[str]) -> list[Issue]: - issues: list[Issue] = [] - - for heading in headings: - for banned in BANNED_HEADINGS: - if heading == banned: - issues.append(Issue(path, f"Banned heading: {heading}")) - for pattern in BANNED_HEADING_PATTERNS: - if pattern.search(heading): - issues.append(Issue(path, f"Banned heading pattern: {heading}")) - - positions = {heading: index for index, heading in enumerate(headings) if heading in ORDER} - last = -1 - seen: list[str] = [] - for heading in ORDER: - pos = positions.get(heading) - if pos is None: - continue - if pos < last: - issues.append( - Issue( - path, - f"Section order violation: {' -> '.join(seen + [heading])}", - ) - ) - break - last = pos - seen.append(heading) - - return issues - - -def main() -> int: - issues: list[Issue] = [] - - for path in sorted(STD_DOCS.glob("*.md")): - text = path.read_text(encoding="utf-8") - issues.extend(check_status(path, text)) - issues.extend(check_headings(path, collect_h2s(path))) - - if issues: - for issue in issues: - rel = issue.path.relative_to(SILK_ROOT.parent) - print(f"{rel}: {issue.message}") - return 1 - - print("Stdlib doc audit passed.") - return 0 - - -if __name__ == "__main__": - raise SystemExit(main()) diff --git a/silk/tools/sync-from-silk-docs.py b/silk/tools/sync-from-silk-docs.py deleted file mode 100644 index 5c6840a8..00000000 --- a/silk/tools/sync-from-silk-docs.py +++ /dev/null @@ -1,767 +0,0 @@ -#!/usr/bin/env python3 - -from __future__ import annotations - -import argparse -import re -import shutil -import sys -import tempfile -from dataclasses import dataclass -from pathlib import Path -from typing import Callable - -sys.path.insert(0, str(Path(__file__).resolve().parents[2] / "tools")) -from importlib import import_module -source_pages = import_module("source-pages") - - -EXCLUDE_BASENAMES = { - # Arenas were removed from the user-facing surface; use regions instead. - "arenas.md", - "README.md", - "PLAN.md", - "STATUS.md", - "llms.txt", - "style-guide.md", - "TEMPLATE.md", - "_template-language.md", - "_template-stdlib.md", -} - - -KEEP_DOCS_PREFIXES = ( - "guides/", -) - - -KEEP_DOCS_FILES = { - # Website-owned landing/start. - "start.md", - "compiler/implementation-status.md", - # Website-owned, downstream-facing rewrites. - "usage/cli-examples.md", - "usage/howto-custom-stdlib-root.md", - "usage/howto-run-wasi-node.md", - "usage/editor-coc-nvim.md", - "usage/editor-ctags.md", - "usage/editor-vim.md", - "usage/editor-textmate.md", - "usage/getting-started.md", - "usage/github-linguist.md", - # Website-owned tutorial rewrites (avoid repo-build steps). - "usage/tutorials/01-first-program.md", - "usage/tutorials/02-structs-and-impls.md", - "usage/tutorials/03-arrays-and-slices.md", - "usage/tutorials/04-filesystem.md", - "usage/tutorials/05-concurrency.md", - "usage/tutorials/06-async-io-streams-abort.md", - "usage/tutorials/07-formal-silk.md", - # Website-owned copy edits to avoid repo-internal wording/refs. - "compiler/backend-wasm.md", - "compiler/testing-strategy.md", - "compiler/libsilk-quickstart.md", - "compiler/zig-api.md", -} - - -KEEP_WIKI_FILES = { - # Website-owned wiki landing/start. - "start.md", -} - - -@dataclass(frozen=True) -class SyncStats: - copied: int = 0 - skipped: int = 0 - deleted: int = 0 - - -def should_skip(rel: str, keep_files: set[str], keep_prefixes: tuple[str, ...]) -> bool: - name = Path(rel).name - if name in EXCLUDE_BASENAMES: - return True - if rel in keep_files: - return True - for prefix in keep_prefixes: - if rel.startswith(prefix): - return True - return False - - -def normalize_region_identifiers(markdown: str) -> str: - out = markdown - replacements = ( - (r"\bexport const region global_arena\b", "export const region global_region_buf"), - (r"\bconst region arena\b", "const region region_buf"), - (r"\bwith arena\b", "with region_buf"), - (r"\bfrom arena\b", "from region_buf"), - (r"\bglobal_arena\b", "global_region_buf"), - (r"\barena\[", "region_buf["), - (r"`arena`", "`region_buf`"), - (r"`global_arena`", "`global_region_buf`"), - ) - for pattern, replacement in replacements: - out = re.sub(pattern, replacement, out) - return out - - -def normalize_shared_markdown(markdown: str) -> str: - markdown = markdown.replace("https://oro.computer/silk/docs/?p=", "?p=") - markdown = markdown.replace("https://oro.computer/silk/wiki/?p=", "wiki/?p=") - markdown = markdown.replace("?p=docs/", "?p=") - markdown = markdown.replace("docs/?p=", "?p=") - markdown = markdown.replace("?p=wiki/", "wiki/?p=") - markdown = re.sub( - r"(?m)^(\s*//\s*)Works today\b", - r"\1Supported", - markdown, - ) - - markdown = re.sub(r"(?m)^(\s*#{2,6}\s+)Syntax\s+\(Selected\)\s*$", r"\1Syntax", markdown) - markdown = re.sub( - r"(?m)^(\s*#{2,6}\s+)(Example|Examples)\s+\(Works today\)(?::\s*(.+))?\s*$", - lambda m: f"{m.group(1)}{m.group(2)}" + (f": {m.group(3)}" if m.group(3) else ""), - markdown, - ) - markdown = re.sub( - r"(?m)^(\s*#{2,6}\s+)Works today(?::\s*(.+))?\s*$", - lambda m: f"{m.group(1)}Example" + (f": {m.group(2)}" if m.group(2) else ""), - markdown, - ) - markdown = re.sub( - r"(?m)^(\s*#{2,6}\s+)What works today(?:\s*\([^)]*\))?\s*$", - r"\1Current subset", - markdown, - ) - markdown = re.sub(r"(?m)^Works today\b", "Current subset", markdown) - markdown = markdown.replace("examples labeled “Works today”", "examples labeled “Example”") - markdown = normalize_region_identifiers(markdown) - return markdown - - -def normalize_user_facing_links(markdown: str) -> str: - def link_label(target: str) -> str: - stem = target.rsplit("/", 1)[-1] - return stem.replace("-", " ").replace("_", " ") - - def doc_link_target(target: str) -> str | None: - target = target.removesuffix(".md") - for prefix in ("docs/", "wiki/"): - if target.startswith(prefix): - target = target[len(prefix):] - target = { - "language/README": "start", - "usage/README": "start", - "usage/tutorials/README": "start", - "std/runtime-event-loop": "std/runtime", - }.get(target, target) - if target in {"std/foo", "std/foo-bar", "man/my-app.7"}: - return None - return target - - def normalize_line(line: str) -> str: - line = re.sub(r"`?\?p=\.\.\.`?", "docs links", line) - line = re.sub( - r"`\?p=(?P[a-zA-Z0-9_./-]+)`", - lambda m: f"[{link_label(m.group('target'))}](?p={m.group('target')})", - line, - ) - - def replace_raw_viewer_ref(match: re.Match[str]) -> str: - prefix = match.group("prefix") or "" - target = doc_link_target(match.group("target")) - if prefix == "[" or target is None: - return match.group(0) - return f"{prefix}[{link_label(target)}](?p={target})" - - line = re.sub( - r"(?P^|[\s:;,(])(?[a-zA-Z0-9_./-]+)", - replace_raw_viewer_ref, - line, - ) - - def replace_man_ref(match: re.Match[str]) -> str: - prefix = match.group("prefix") or "" - name = match.group("name") - section = match.group("section") - if name.startswith("std::"): - target = name.replace("::", "/") - return f"{prefix}[`{name}({section})`](?p={target})" - return f"{prefix}[`{name}({section})`](?p=man/{name}.{section})" - - line = re.sub( - r"(?P^|[\s:;,(])(?[A-Za-z0-9_:+.-]+)`\s+\((?P
[137])\)", - replace_man_ref, - line, - ) - - def replace_markdown_docs_link(match: re.Match[str]) -> str: - target = doc_link_target(match.group("target")) - if target is None: - return match.group(0) - return f"[{link_label(target)}](?p={target})" - - line = re.sub( - r"\[`?docs/(?P[a-zA-Z0-9_./-]+\.md)`?\]\([^)]+\)", - replace_markdown_docs_link, - line, - ) - - def replace_docs_path(match: re.Match[str]) -> str: - prefix = match.group("prefix") or "" - target = doc_link_target(match.group("target")) - if target is None: - return match.group(0) - return f"{prefix}[{link_label(target)}](?p={target})" - - line = re.sub( - r"(?P^|[\s:;,(])`?docs/(?P[a-zA-Z0-9_./-]+\.md)`?", - replace_docs_path, - line, - ) - return line - - out_lines: list[str] = [] - in_code = False - for raw in markdown.splitlines(): - stripped = raw.lstrip() - if stripped.startswith("```") or stripped.startswith("~~~"): - in_code = not in_code - out_lines.append(raw.rstrip()) - continue - out_lines.append(raw.rstrip() if in_code else normalize_line(raw.rstrip())) - return "\n".join(out_lines) + ("\n" if markdown.endswith("\n") else "") - - -def normalize_editorial_framing(markdown: str) -> str: - replacements = ( - (r"\bStatus:\s*\*\*([^*]+)\*\*\.\s*", ""), - (r"\bStatus:\s*\*\*([^*]+)\*\*\s*", ""), - (r"\bStatus:\s*", ""), - (r"\bImplementation status\s*\([^)]*\)\s*:\s*", ""), - (r"\bImplementation status\s*:\s*", ""), - (r"Returning readers typically want the “Implementation Status” section near the top", "Returning readers typically want the notes near the top"), - (r"see “Implementation Status” below", "see the notes below"), - (r"Implementation Status” sections", "notes sections"), - (r"\bCurrent supported contexts include\b", "Supported contexts include"), - (r"\bcurrent supported\b", "supported"), - (r"\bCurrent compiler subset restriction\b", "Restriction"), - (r"\bthe current compiler subset\b", "Silk currently"), - (r"\bThe current compiler subset\b", "Silk currently"), - (r"\bcurrent compiler subset\b", "current implementation"), - (r"\bCurrent subset\b", "Supported forms"), - (r"\bcurrent subset\b", "supported forms"), - (r"\bInitial implementation target\b", "Implementation target"), - (r"\binitial implementation target\b", "implementation target"), - (r"\binitial implementation\b", "implementation"), - (r"\bInitial implementation\b", "Implementation"), - (r"\bImplemented-subset notes\b", "Notes"), - (r"\bImplemented-subset details\b", "Reference details"), - (r"\bImplemented-subset\b", "Reference"), - (r"\bImplemented subset notes\b", "Notes"), - (r"\bimplemented subset notes\b", "notes"), - (r"\bImplemented subset\b", "Supported forms"), - (r"\bimplemented subset\b", "supported forms"), - (r"\bImplemented Subset\b", "Supported Forms"), - (r"\bInitial Implemented Subset\b", "Supported Forms"), - (r"\bCurrent Implemented Subset\b", "Supported Forms"), - (r"\bexamples that exercise the supported forms\b", "examples"), - (r"\bExamples that exercise the supported forms\b", "Examples"), - (r"\bactive expansion\b", "current module surface"), - (r"\bPartially implemented\b", "Implemented"), - (r"\bpartially implemented\b", "implemented"), - (r"\bin progress\b", "available"), - (r"\bIn progress\b", "Available"), - ) - - out_lines: list[str] = [] - in_code = False - for raw in markdown.splitlines(): - stripped = raw.lstrip() - if stripped.startswith("```") or stripped.startswith("~~~"): - in_code = not in_code - out_lines.append(raw.rstrip()) - continue - if in_code: - out_lines.append(raw.rstrip()) - continue - - line = raw - heading = re.match(r"^(?P\s*#{1,6}\s+)(?P.+?)\s*$", line) - if heading: - title = heading.group("title").strip() - title = re.sub( - r"\s+\((?:Initial\s+)?(?:Current\s+)?(?:Implemented|supported|compiler|initial|selected|planned|current|implementation status)[^)]*\)", - "", - title, - flags=re.I, - ) - title = re.sub(r"\s+\(Planned[^)]*\)", "", title, flags=re.I) - if re.fullmatch(r"Status(?:\s*\([^)]*\))?|Implementation Status(?:\s*\([^)]*\))?|Status and Future Work|Future Work|Follow-ups", title, flags=re.I): - title = "Notes" - elif re.fullmatch(r"Notes and Limitations", title, flags=re.I): - title = "Considerations" - elif re.fullmatch(r"Current API(?:\s*\([^)]*\))?|Implemented API|Public API|API\s*\([^)]*\)|API\s*\(current\)", title, flags=re.I): - title = "Exported API" - elif re.fullmatch(r"Current Implemented Subset|Implemented Subset|Implemented subset", title, flags=re.I): - title = "Notes" - title = re.sub(r"\s{2,}", " ", title).strip() - line = f"{heading.group('prefix')}{title}" - - for pattern, replacement in replacements: - line = re.sub(pattern, replacement, line, flags=re.I) - line = re.sub(r"\s{2,}", " ", line).rstrip() - out_lines.append(line) - - return "\n".join(out_lines) + ("\n" if markdown.endswith("\n") else "") - - -def normalize_trailing_newlines(markdown: str) -> str: - return markdown.rstrip() + "\n" - - -def normalize_headings_for_context(path: Path, markdown: str) -> str: - markdown = markdown.replace("`docs/language/mutability.md`", "the mutability docs") - markdown = markdown.replace("`docs/language/literals-duration.md`", "the duration literal docs") - markdown = markdown.replace("?p=std/runtime-event-loop", "?p=std/runtime") - - if "/wiki/source/" in path.as_posix(): - markdown = re.sub(r"\]\(\?p=(compiler|man|usage|guides)/", r"](../docs/?p=\1/", markdown) - - if path.parent.name == "std": - markdown = re.sub(r"(?m)^## API$", "## Exported API", markdown) - markdown = re.sub(r"(?m)^## High-Level API$", "## Exported API", markdown) - markdown = re.sub(r"(?m)^## Intended Surface$", "## Exported API", markdown) - markdown = re.sub(r"(?m)^## Current Surface$", "## Exported API", markdown) - markdown = re.sub(r"(?m)^## Current Grammar Coverage$", "## Grammar coverage", markdown) - markdown = re.sub(r"(?m)^## Goals$", "## Design goals", markdown) - markdown = re.sub(r"(?m)^## Design Goals$", "## Design goals", markdown) - markdown = re.sub(r"(?m)^## Important Limitations$", "## Considerations", markdown) - markdown = re.sub(r"(?m)^## Remaining Follow-Ups$", "## Considerations", markdown) - markdown = re.sub(r"(?m)^## Implemented (`std::interfaces` surface)$", r"## \1", markdown) - markdown = markdown.replace("current API surface", "exported API surface") - markdown = markdown.replace("API surface (current):", "API surface:") - markdown = move_section_to_end(markdown, "Design goals") - - if path.parent.name == "language": - markdown = re.sub(r"(?m)^## Goals$", "## Semantics", markdown) - markdown = re.sub(r"(?m)^## Design Goals$", "## Model", markdown) - markdown = re.sub(r"(?m)^### Important Limitations$", "### Considerations", markdown) - - if path.name == "flow-for.md": - markdown = markdown.replace( - "element.\n\n: integer range iteration", - "element.\n\nSupported forms include integer range iteration", - ) - markdown = re.sub( - r"\n## Semantics\n\n- Provide a readable, structured loop construct for iteration\.\n- Avoid .+? hidden allocation\.\n\n## Surface Syntax", - "\n## Surface Syntax", - markdown, - flags=re.S, - ) - - return markdown - - -def sanitize_wiki_markdown(rel: str, markdown: str) -> str: - """ - The upstream Silk wiki is written for repo contributors and sometimes - references internal tracker files (STATUS.md, PLAN.md) that don't exist (or - aren't meaningful) on the public website. - - This function keeps the useful parts of those lines while removing the - internal-only references. - """ - - markdown = normalize_shared_markdown(markdown) - - out_lines: list[str] = [] - - drop_whole_line = re.compile( - r"^\s*[-*+]\s*(End-to-end support snapshot|Implemented-subset notes)\s*:\s*`?(STATUS|PLAN)\.md`?\s*$", - flags=re.I, - ) - - in_code = False - - for raw in markdown.splitlines(): - trimmed = raw.lstrip() - if trimmed.startswith("```"): - in_code = not in_code - out_lines.append(raw.rstrip()) - continue - - if in_code: - # Never rewrite inside fenced code blocks; preserve indentation and - # exact spelling. - out_lines.append(raw.rstrip()) - continue - - line = raw - - if drop_whole_line.match(line): - continue - - # Rewrite a few common wiki-only phrasings. - line = re.sub(r"^(\s*[-*+]\s+)Relevant fixtures:\s*", r"\1Fixtures: ", line, flags=re.I) - line = re.sub( - r"^\s*Status:\s*implemented for the current front-end \+\s*native backend subset\.\s*$", - "Implemented in the reference compiler (front-end + native backend subset).", - line, - flags=re.I, - ) - - # Remove internal tracker refs while preserving surrounding prose. - for basename in ("STATUS.md", "PLAN.md"): - # Common: "... and `STATUS.md`" - line = re.sub(rf"\s+(?:and|&)\s+`?{re.escape(basename)}`?\s*$", "", line, flags=re.I) - # Strip any remaining mention. - line = re.sub(rf"`?{re.escape(basename)}`?", "", line, flags=re.I) - - # If we removed a reference, clean up dangling conjunctions. - line = re.sub(r"\s+(?:and|&)\s*$", "", line, flags=re.I) - - # Tidy up extra spaces introduced by stripping (but preserve indentation). - leading = re.match(r"^\s*", line).group(0) - body = line[len(leading) :] - body = re.sub(r"[ \t]{2,}", " ", body) - line = (leading + body).rstrip() - - # Drop empty bullets like "- Details:" after stripping. - if re.match(r"^\s*[-*+]\s*[^A-Za-z0-9`]*\s*$", line): - continue - - out_lines.append(line) - - cleaned = "\n".join(out_lines) + ("\n" if markdown.endswith("\n") else "") - cleaned = normalize_editorial_framing(cleaned) - cleaned = normalize_user_facing_links(cleaned) - return normalize_trailing_newlines(cleaned) - - -def sanitize_docs_markdown(rel: str, markdown: str) -> str: - """ - The upstream Silk docs are written for the Silk compiler repository and may - use ambiguous phrasing like "this repository" or project-internal jargon - like "repo dependency workflow". When we sync into the website, we rewrite - a few phrases to be clearer to downstream readers. - """ - - def drop_named_section(md: str, heading: str) -> str: - target = heading.strip().lower() - out_lines: list[str] = [] - in_code = False - skip_level: int | None = None - - for raw in md.splitlines(): - trimmed = raw.lstrip() - if trimmed.startswith("```"): - in_code = not in_code - if skip_level is None: - out_lines.append(raw.rstrip()) - continue - - if not in_code and skip_level is not None: - heading_match = re.match(r"^(#{1,6})\s+(.+?)\s*$", raw) - if not heading_match: - continue - level = len(heading_match.group(1)) - if level > skip_level: - continue - skip_level = None - - if not in_code: - heading_match = re.match(r"^(#{1,6})\s+(.+?)\s*$", raw) - if heading_match and heading_match.group(2).strip().lower() == target: - skip_level = len(heading_match.group(1)) - continue - - if skip_level is None: - out_lines.append(raw.rstrip()) - - return "\n".join(out_lines) + ("\n" if md.endswith("\n") else "") - - def rewrite_outside_inline_code(text: str) -> str: - out = text - - # Make references explicit. - out = re.sub(r"\bThe repository\b", "The Silk compiler repository", out) - out = re.sub(r"\bthe repository\b", "the Silk compiler repository", out) - out = re.sub(r"\bThis repository\b", "The Silk compiler repository", out) - out = re.sub(r"\bthis repository\b", "the Silk compiler repository", out) - - # Prefer a clearer name for the dependency build flow. - out = re.sub( - r"\brepo dependency workflow\b", - "Silk compiler repository’s vendored dependency workflow", - out, - flags=re.I, - ) - out = re.sub(r"\bwhat works today\b", "current implementation notes", out, flags=re.I) - - return out - - def sanitize_std_markdown(text: str) -> str: - out = text - out = re.sub(r"(?m)^Status:\s*\*\*[^*]+\*\*\.\s*", "", out) - out = re.sub(r"(?m)^Status:\s*\*\*[^*]+\*\*\.\s*$", "", out) - out = re.sub(r"(?m)^##\s+Current API\s*$", "## Exported API", out) - out = re.sub(r"(?m)^##\s+Implemented API\s*$", "## Exported API", out) - out = re.sub(r"(?m)^##\s+Public API\s*$", "## Exported API", out) - out = re.sub( - r"(?m)^##\s+(Future Work|Future work|Follow-ups|Current Limitations|Notes and Limitations)\s*$", - "## Considerations", - out, - ) - out = re.sub(r"(?m)^##\s+Current Scope\s*$", "## Considerations", out) - out = re.sub(r"(?m)^##\s+(.+?)\s+\((?:Initial Design|MVP|Current)\)\s*$", r"## \1", out) - out = re.sub(r"active expansion", "current module surface", out, flags=re.I) - out = re.sub(r"current snapshot", "current implementation", out, flags=re.I) - out = re.sub(r"Partially implemented", "Implemented", out, flags=re.I) - out = re.sub(r"initial std wrapper", "stdlib wrapper", out, flags=re.I) - out = re.sub(r"\bMVP\b", "baseline", out) - return out - - def sanitize_spec_markdown(text: str) -> str: - out = drop_named_section(text, "Silk Proposal Process (TC39-Inspired)") - out = out.replace("// Works today", "// Supported") - out = out.replace("checker.checkModuleSetWithImports", "the module-set import helper") - out = re.sub( - r"CLI output:\s*`+silk` CLI`?\s+and\s+`+silk`\s+\(1\)\s+—\s+Silk Language Compiler`?\s+\(`silk --version`\)", - "CLI output: the `silk` CLI and [`silk(1)`](?p=man/silk.1) (`silk --version`)", - out, - ) - return out - - markdown = normalize_shared_markdown(markdown) - markdown = markdown.replace( - "`STATUS.md`", - "[implementation status](?p=compiler/implementation-status)", - ) - markdown = markdown.replace( - "[implementation status](?p=compiler/implementation-status) (implementation status)", - "[implementation status](?p=compiler/implementation-status)", - ) - markdown = re.sub( - r"\s*\(tracked[^)]*`PLAN\.md`\)", - "", - markdown, - flags=re.I, - ) - markdown = drop_named_section(markdown, "Arenas") - markdown = drop_named_section(markdown, "Tests") - if rel.startswith("std/"): - markdown = sanitize_std_markdown(markdown) - if rel == "spec/2026.md": - markdown = sanitize_spec_markdown(markdown) - if rel == "compiler/vendored-deps.md": - markdown = markdown.replace( - "# Built-In Dependencies\n", - "# Built-In Dependencies (Legacy Link)\n", - 1, - ) - - out_lines: list[str] = [] - in_code = False - - for raw in markdown.splitlines(): - trimmed = raw.lstrip() - if trimmed.startswith("```"): - in_code = not in_code - out_lines.append(raw.rstrip()) - continue - - if in_code: - out_lines.append(raw.rstrip()) - continue - - # Preserve inline-code spans (single-backtick) while rewriting prose. - parts = raw.split("`") - for i in range(0, len(parts), 2): - parts[i] = rewrite_outside_inline_code(parts[i]) - out_lines.append("`".join(parts).rstrip()) - - cleaned = "\n".join(out_lines) + ("\n" if markdown.endswith("\n") else "") - cleaned = normalize_editorial_framing(cleaned) - cleaned = normalize_user_facing_links(cleaned) - return normalize_trailing_newlines(cleaned) - - - -def move_section_to_end(markdown: str, heading: str) -> str: - lines = markdown.splitlines() - section: list[str] = [] - out: list[str] = [] - in_code = False - capture = False - capture_level = 0 - - for raw in lines: - stripped = raw.lstrip() - if stripped.startswith("```") or stripped.startswith("~~~"): - in_code = not in_code - - if not in_code: - m = re.match(r"^(#{1,6})\s+(.+?)\s*$", raw) - if m: - level = len(m.group(1)) - title = m.group(2).strip() - if capture and level <= capture_level: - capture = False - if not capture and title.lower() == heading.lower(): - capture = True - capture_level = level - - if capture: - section.append(raw.rstrip()) - else: - out.append(raw.rstrip()) - - if not section: - return markdown - while out and not out[-1].strip(): - out.pop() - while section and not section[-1].strip(): - section.pop() - return "\n".join(out + ["", *section]) + "\n" - - -def postprocess_tree(root: Path, *, keep_files: set[str] = frozenset(), keep_prefixes: tuple[str, ...] = ()) -> None: - for path in sorted(root.rglob("*.md")): - if should_skip(path.relative_to(root).as_posix(), keep_files, keep_prefixes): - continue - text = path.read_text(encoding="utf-8") - def normalize(body): - body = normalize_editorial_framing(body) - body = normalize_user_facing_links(body) - body = normalize_headings_for_context(path, body) - return normalize_trailing_newlines(body) - next_text = source_pages.preserve_fences(text, normalize) - if next_text != text: - path.write_text(next_text, encoding="utf-8") - - -def sync_tree( - src_root: Path, - dst_root: Path, - *, - keep_files: set[str], - keep_prefixes: tuple[str, ...], - sanitize: Callable[[str, str], str] | None = None, -) -> SyncStats: - copied: set[str] = set() - skipped = 0 - deleted = 0 - - for path in sorted(src_root.rglob("*")): - if not path.is_file(): - continue - if path.suffix not in (".md", ".txt"): - continue - - rel = path.relative_to(src_root).as_posix() - if should_skip(rel, keep_files, keep_prefixes): - skipped += 1 - continue - - dst = dst_root / rel - dst.parent.mkdir(parents=True, exist_ok=True) - - if sanitize and path.suffix == ".md": - dst.write_text(sanitize(rel, path.read_text(encoding="utf-8")), encoding="utf-8") - else: - shutil.copyfile(path, dst) - copied.add(rel) - - # Prune any previously-synced files that no longer exist upstream. - for path in sorted(dst_root.rglob("*")): - if not path.is_file(): - continue - if path.suffix not in (".md", ".txt"): - continue - - if path.name in EXCLUDE_BASENAMES: - path.unlink() - deleted += 1 - continue - - rel = path.relative_to(dst_root).as_posix() - if should_skip(rel, keep_files, keep_prefixes): - continue - if rel in copied: - continue - path.unlink() - deleted += 1 - - return SyncStats(copied=len(copied), skipped=skipped, deleted=deleted) - - -def main() -> None: - parser = argparse.ArgumentParser( - description="Sync Silk docs/wiki from the repo (silk/docs) into the website copies (website/silk)." - ) - parser.add_argument( - "--repo-root", - type=Path, - default=None, - help="Path to repo root (auto-detected by default).", - ) - parser.add_argument("--silk-repo", type=Path, help="Path to the upstream Silk checkout.") - args = parser.parse_args() - - site = Path(__file__).resolve().parents[2] - silk_repo = args.silk_repo or ((args.repo_root / "silk") if args.repo_root else site.parent / "silk") - src_docs = silk_repo.resolve() / "docs" - src_wiki = src_docs / "wiki" - - staging = tempfile.TemporaryDirectory(prefix="oro-silk-import-") - dst_docs = Path(staging.name) / "docs" - dst_wiki = Path(staging.name) / "wiki" - source_pages.stage_collection(site, "silk", dst_docs) - source_pages.stage_collection(site, "silkWiki", dst_wiki) - - if not src_docs.exists(): - raise SystemExit(f"Missing source docs at {src_docs}") - - # Docs: copy everything except wiki/ subtree. - docs_stats = sync_tree( - src_docs, - dst_docs, - keep_files=KEEP_DOCS_FILES, - keep_prefixes=KEEP_DOCS_PREFIXES + ("wiki/",), - sanitize=lambda rel, text: source_pages.preserve_fences(text, lambda body: sanitize_docs_markdown(rel, body)), - ) - - # Wiki: copy everything under docs/wiki into website wiki source. - if src_wiki.exists(): - wiki_stats = sync_tree( - src_wiki, - dst_wiki, - keep_files=KEEP_WIKI_FILES, - keep_prefixes=(), - sanitize=lambda rel, text: source_pages.preserve_fences(text, lambda body: sanitize_wiki_markdown(rel, body)), - ) - else: - wiki_stats = SyncStats() - - postprocess_tree(dst_docs, keep_files=KEEP_DOCS_FILES, keep_prefixes=KEEP_DOCS_PREFIXES) - postprocess_tree(dst_wiki, keep_files=KEEP_WIKI_FILES) - - source_pages.import_collection(site, "silk", dst_docs) - if src_wiki.exists(): - source_pages.import_collection(site, "silkWiki", dst_wiki) - staging.cleanup() - - print("Synced Silk docs to website:") - print( - f"- Docs copied: {docs_stats.copied} (skipped: {docs_stats.skipped}, deleted: {docs_stats.deleted})" - ) - print( - f"- Wiki copied: {wiki_stats.copied} (skipped: {wiki_stats.skipped}, deleted: {wiki_stats.deleted})" - ) - - -if __name__ == "__main__": - main() diff --git a/silk/tools/sync-from-silk-docs.ts b/silk/tools/sync-from-silk-docs.ts new file mode 100644 index 00000000..17a6eaba --- /dev/null +++ b/silk/tools/sync-from-silk-docs.ts @@ -0,0 +1,88 @@ +#!/usr/bin/env node +import { access, copyFile, mkdir, mkdtemp, rm, unlink, writeFile } from 'node:fs/promises' +import { tmpdir } from 'node:os' +import { basename, dirname, extname, join, relative, resolve } from 'node:path' +import { fileURLToPath, pathToFileURL } from 'node:url' +import { parseArgs } from 'node:util' +import { files, readText, preserveFences, stageCollection, importCollection } from '../../tools/source-pages.ts' +import { EXCLUDE_BASENAMES, KEEP_DOCS_FILES, KEEP_DOCS_PREFIXES, KEEP_WIKI_FILES } from '../../tools/silk-ingestion-data.ts' +import { sanitizeDocsMarkdown, sanitizeWikiMarkdown, normalizeEditorialFraming, normalizeUserFacingLinks, normalizeHeadingsForContext, normalizeTrailingNewlines } from '../../tools/silk-editorial.ts' +export { EXCLUDE_BASENAMES, KEEP_DOCS_FILES, KEEP_DOCS_PREFIXES, KEEP_WIKI_FILES } +export * from '../../tools/silk-editorial.ts' +export interface Ownership { keepFiles?: readonly string[]; keepPrefixes?: readonly string[] } +export interface SyncStats { copied: number; skipped: number; deleted: number } +export function shouldSkip(rel: string, { keepFiles = [], keepPrefixes = [] }: Ownership): boolean { + return EXCLUDE_BASENAMES.includes(basename(rel)) || keepFiles.includes(rel) || keepPrefixes.some(prefix => rel.startsWith(prefix)) +} +export async function syncTree(src: string, dst: string, options: Ownership & { sanitize?: (rel: string, text: string) => string }): Promise<SyncStats> { + const copied = new Set<string>() + let skipped = 0, deleted = 0 + for (const path of await files(src)) { + if (!['.md', '.txt'].includes(extname(path))) continue + const rel = relative(src, path) + if (shouldSkip(rel, options)) { skipped++; continue } + const dest = join(dst, rel) + await mkdir(dirname(dest), { recursive: true }) + if (options.sanitize && extname(path) === '.md') await writeFile(dest, options.sanitize(rel, await readText(path))) + else await copyFile(path, dest) + copied.add(rel) + } + for (const path of await files(dst)) { + if (!['.md', '.txt'].includes(extname(path))) continue + const rel = relative(dst, path) + if (!EXCLUDE_BASENAMES.includes(basename(path)) && (shouldSkip(rel, options) || copied.has(rel))) continue + await unlink(path); deleted++ + } + return { copied: copied.size, skipped, deleted } +} +export async function postprocessTree(root: string, options: Ownership = {}): Promise<void> { + for (const path of await files(root)) { + if (extname(path) !== '.md' || shouldSkip(relative(root, path), options)) continue + const text = await readText(path) + const next = preserveFences(text, body => normalizeTrailingNewlines(normalizeHeadingsForContext(path, normalizeUserFacingLinks(normalizeEditorialFraming(body))))) + if (next !== text) await writeFile(path, next) + } +} +export async function syncFromSilkDocs(site: string, silkRepo: string): Promise<void> { + const srcDocs = resolve(silkRepo, 'docs'), srcWiki = join(srcDocs, 'wiki') + try { await access(srcDocs) } catch { throw new Error(`Missing source docs at ${srcDocs}`) } + const staged = await mkdtemp(join(tmpdir(), 'oro-silk-import-')) + try { + const dstDocs = join(staged, 'docs'), dstWiki = join(staged, 'wiki') + // Empty collections still need a staging directory for the importer. + await mkdir(dstDocs); await mkdir(dstWiki) + await stageCollection('silk', dstDocs, site) + await stageCollection('silkWiki', dstWiki, site) + const docsStats = await syncTree(srcDocs, dstDocs, { + keepFiles: KEEP_DOCS_FILES, keepPrefixes: [...KEEP_DOCS_PREFIXES, 'wiki/'], + sanitize: (rel, text) => preserveFences(text, body => sanitizeDocsMarkdown(rel, body)), + }) + let hasWiki = true + try { await access(srcWiki) } catch (error) { + if ((error as NodeJS.ErrnoException).code !== 'ENOENT') throw error + hasWiki = false + } + const wikiStats = hasWiki ? await syncTree(srcWiki, dstWiki, { + keepFiles: KEEP_WIKI_FILES, sanitize: (rel, text) => preserveFences(text, body => sanitizeWikiMarkdown(rel, body)), + }) : { copied: 0, skipped: 0, deleted: 0 } + await postprocessTree(dstDocs, { keepFiles: KEEP_DOCS_FILES, keepPrefixes: KEEP_DOCS_PREFIXES }) + await postprocessTree(dstWiki, { keepFiles: KEEP_WIKI_FILES }) + await importCollection('silk', dstDocs, site) + if (hasWiki) await importCollection('silkWiki', dstWiki, site) + console.log('Synced Silk docs to website:') + console.log(`- Docs copied: ${docsStats.copied} (skipped: ${docsStats.skipped}, deleted: ${docsStats.deleted})`) + console.log(`- Wiki copied: ${wikiStats.copied} (skipped: ${wikiStats.skipped}, deleted: ${wikiStats.deleted})`) + } finally { await rm(staged, { recursive: true, force: true }) } +} +export async function main(args = process.argv.slice(2)): Promise<void> { + const { values } = parseArgs({ args, options: { 'repo-root': { type: 'string' }, 'silk-repo': { type: 'string' }, help: { type: 'boolean', short: 'h' } } }) + if (values.help) { console.log('Sync Silk docs/wiki from the repo (silk/docs) into the website copies (website/silk).\n\nUsage: node silk/tools/sync-from-silk-docs.ts [--repo-root PATH] [--silk-repo PATH]'); return } + const site = fileURLToPath(new URL('../../', import.meta.url)) + await syncFromSilkDocs(site, values['silk-repo'] ?? resolve(values['repo-root'] ?? resolve(site, '..'), 'silk')) +} +if (process.argv[1] && import.meta.url === pathToFileURL(resolve(process.argv[1])).href) { + main().catch(error => { + console.error(error.message) + process.exitCode = error.code?.startsWith('ERR_PARSE_ARGS_') ? 2 : 1 + }) +} diff --git a/slg/tools/audit-site.py b/slg/tools/audit-site.py deleted file mode 100644 index f0f9d0d2..00000000 --- a/slg/tools/audit-site.py +++ /dev/null @@ -1,32 +0,0 @@ -#!/usr/bin/env python3 - -from __future__ import annotations - -import sys -import os -from pathlib import Path - - -SITE_ROOT = Path(__file__).resolve().parents[2] -SLG_ROOT = Path(os.environ.get("ORO_SITE_OUTPUT", str(SITE_ROOT / "public"))) / "slg" -REPO_ROOT = SLG_ROOT.parent - -sys.path.insert(0, str(SITE_ROOT / "tools")) - -from site_audit_common import SiteAuditConfig, run_site_audit - - -def main() -> int: - return run_site_audit( - SiteAuditConfig( - project_root=SLG_ROOT, - docs_source=SLG_ROOT / "docs" / "source", - docs_index=SLG_ROOT / "docs" / "index.json", - missing_index_message="Missing Slg docs/index.json; run build scripts first.", - success_message="OK: slg site audit passed", - ) - ) - - -if __name__ == "__main__": - raise SystemExit(main()) diff --git a/src/artifacts.template.ts b/src/artifacts.template.ts index 3b9e24cf..327ff8f6 100644 --- a/src/artifacts.template.ts +++ b/src/artifacts.template.ts @@ -1,80 +1,12 @@ import type { TemplateFunction } from '@domstack/static/types.js' import { collections } from './lib/collections.ts' -import { rawUrl, type DocsData, type Doc } from './lib/docs.ts' -export const dataDeps = ['docs', 'routes'] -const artifacts: TemplateFunction<Record<string, unknown>, DocsData> = ({ - data, -}) => { - const outputs: { outputName: string; content: string }[] = [] - const emit = (name: string, content: string) => - outputs.push({ outputName: name.replace(/^\//, ''), content }) - const json = (name: string, value: unknown) => - emit(name, JSON.stringify(value, null, 2) + '\n') - const packs: Record<string, Doc[]> = {} - for (const [key, c] of Object.entries(collections)) { - const docs = data.docs[key as keyof typeof collections] - const sections = [...new Set(docs.map((d) => d.section))].map((name) => ({ - name, - items: docs - .filter((d) => d.section === name) - .map((d) => ({ - id: d.id, - title: d.title, - file: d.sourcePath, - url: d.url, - })), - })) - json(c.base + 'index.json', { - kind: key === 'silkWiki' ? 'wiki' : 'docs', - count: docs.length, - sections, - }) - json(c.base + 'search.json', { - kind: key === 'silkWiki' ? 'wiki' : 'docs', - count: docs.length, - items: docs.map((d) => ({ - id: d.id, - title: d.title, - file: d.sourcePath, - url: d.url, - section: d.section, - summary: d.description, - text: d.searchText, - })), - }) - for (const doc of docs) emit(rawUrl(doc), doc.markdown) - ;(packs[c.product] ||= []).push(...docs) - } - for (const [product, docs] of Object.entries(packs)) - emit( - `/${product}/llms.txt`, - `# ${product} documentation\n\n` + - docs - .map( - (d) => - `## ${d.title}\n\nURL: https://oro.computer${d.url}\nSource: https://oro.computer${rawUrl(d)}\n\n${d.markdown}`, - ) - .join('\n---\n\n'), - ) - emit( - '/llms.txt', - '# Oro Computer\n\n' + - Object.keys(packs) - .map( - (p) => `- [${p} documentation](https://oro.computer/${p}/llms.txt)`, - ) - .join('\n') + - '\n', - ) - emit( - '/sitemap.xml', - '<?xml version="1.0" encoding="UTF-8"?>\n<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">' + - data.routes - .map((url) => `<url><loc>https://oro.computer${url}</loc></url>`) - .join('') + - '</urlset>\n', - ) - emit('/.nojekyll', '') - return outputs -} +import { output } from './lib/artifacts.ts' +export const dataDeps = [] +const artifacts: TemplateFunction<{ siteUrl: string }> = ({ vars }) => [ + output('/llms.txt', '# Oro Computer\n\n' + + [...new Set(Object.values(collections).map(c => c.product))] + .map(p => `- [${p} documentation](${new URL(`/${p}/llms.txt`, vars.siteUrl).href})`) + .join('\n') + '\n'), + output('/.nojekyll', ''), +] export default artifacts diff --git a/src/docs/client.ts b/src/docs/client.ts new file mode 100644 index 00000000..e949ecf9 --- /dev/null +++ b/src/docs/client.ts @@ -0,0 +1,3 @@ +import { initAskAiMenu } from '../lib/ask-ai-client.ts' + +initAskAiMenu() diff --git a/src/global.data.ts b/src/global.data.ts index b522c90d..58321bae 100644 --- a/src/global.data.ts +++ b/src/global.data.ts @@ -1,32 +1,37 @@ import type { GlobalDataFunction } from '@domstack/static/types.js' import { collections, type Collection } from './lib/collections.ts' -import { plainText, type Doc, type DocsData } from './lib/docs.ts' -const globalData: GlobalDataFunction<DocsData> = async ({ pages }) => { - const docs = Object.fromEntries( - Object.keys(collections).map((k) => [k, []]), - ) as unknown as Record<Collection, Doc[]> +import { editUrl, plainText, projectCollection, validateDocVars, type Doc, type DocsData } from './lib/docs.ts' +const globalData: GlobalDataFunction<DocsData, Record<string, unknown>, string> = async ({ pages }) => { + const docs: Record<Collection, Doc[]> = { + runtime: [], silk: [], silkWiki: [], virtnosis: [], sage: [], slg: [], + } for (const page of pages) { - const v = page.vars - if (!v.docsCollection) continue - const collection = v.docsCollection as Collection - const markdown = await page.readMarkdownContent() - docs[collection].push({ - collection, + if (page.vars.docsCollection === undefined) continue + const source = page.pageInfo.pageFile.relname + const v = validateDocVars(page.vars, source) + if (page.pageInfo.type !== 'md') throw new Error(`${source}: documentation must be Markdown`) + docs[v.docsCollection].push({ + collection: v.docsCollection, id: v.sourcePath.replace(/\.(md|txt)$/, ''), - title: v.title, - description: v.description, - section: v.section, - order: v.order, - url: page.pageInfo.url, - sourcePath: v.sourcePath, - markdown, + title: v.title, description: v.description, section: v.section, order: v.order, + url: page.pageInfo.url, sourcePath: v.sourcePath, + markdown: await page.readMarkdownContent(), searchText: plainText(await page.renderInnerPage()), - githubRepo: v.githubRepo, - githubRef: v.githubRef, + githubRepo: v.githubRepo, githubRef: v.githubRef, + editUrl: editUrl(source), }) } - for (const list of Object.values(docs)) + const data = { routes: pages.map(p => p.pageInfo.url).sort() } as DocsData + for (const collection of Object.keys(collections) as Collection[]) { + const list = docs[collection] list.sort((a, b) => a.order - b.order || a.id.localeCompare(b.id, 'en')) - return { docs, routes: pages.map((p) => p.pageInfo.url).sort() } + data[`${collection}Navigation`] = projectCollection(list) + data[`${collection}Exports`] = list.map(({ collection, id, title, sourcePath, url, markdown }) => ({ collection, id, title, sourcePath, url, markdown })) + data[`${collection}Search`] = { + kind: collection === 'silkWiki' ? 'wiki' : 'docs', count: list.length, + items: list.map(d => ({ id: d.id, title: d.title, file: d.sourcePath, url: d.url, section: d.section, summary: d.description, text: d.searchText })), + } + } + return data } export default globalData diff --git a/src/globals/global.client.js b/src/globals/global.client.js deleted file mode 100644 index 6d471a75..00000000 --- a/src/globals/global.client.js +++ /dev/null @@ -1,214 +0,0 @@ -import { writeClipboard } from "../lib/clipboard.js"; -(() => { - const yearNode = document.querySelector("[data-year]"); - if (yearNode) yearNode.textContent = String(new Date().getFullYear()); - const source = document.querySelector("[data-markdown]"); - if (source) globalThis.oroPageMarkdown = {url:new URL(source.dataset.markdown, location.href).href}; - function getSiteRootUrl() { - const brand = document.querySelector("a.brand[href]"); - if (brand && brand.href) { - try { - return new URL(brand.href); - } catch {} - } - try { - return new URL("./", globalThis.location.href); - } catch { - return new URL("https://example.invalid/"); - } - } - - function buildChatGPTUrl(targetUrl) { - const prompt = `Hi ChatGPT! Can you please read [this page](${targetUrl}) and prepare to answer questions about it?`; - const params = new URLSearchParams({ prompt }); - return `https://chatgpt.com/?${params.toString()}`; - } - - function buildClaudeUrl(targetUrl) { - const prompt = `Hi Claude! Can you please read [this page](${targetUrl}) and prepare to answer questions about it?`; - const params = new URLSearchParams({ q: prompt }); - return `https://claude.ai/new?${params.toString()}`; - } - - function inferLlmsUrl() { - const root = getSiteRootUrl(); - const path = String(globalThis.location.pathname || ""); - if (path.includes("/silk/") || path.endsWith("/silk")) { - return new URL("silk/llms.txt", root).toString(); - } - if (path.includes("/runtime/") || path.endsWith("/runtime")) { - return new URL("runtime/llms.txt", root).toString(); - } - if (path.includes("/sage/") || path.endsWith("/sage")) { - return new URL("sage/llms.txt", root).toString(); - } - if (path.includes("/slg/") || path.endsWith("/slg")) { - return new URL("slg/llms.txt", root).toString(); - } - if (path.includes("/virtnosis/") || path.endsWith("/virtnosis")) { - return new URL("virtnosis/llms.txt", root).toString(); - } - return new URL("llms.txt", root).toString(); - } - - function shouldShowAskAiMenu() { - const body = document.body; - const path = String(globalThis.location.pathname || ""); - if (body?.dataset?.askAi === "true") return true; - if (body?.classList?.contains("docs-page")) return true; - if (body?.classList?.contains("docs-landing-page")) return true; - return /(^|\/)docs(\/|$)/.test(path); - } - - function initAskAiMenu() { - if (!shouldShowAskAiMenu()) return; - - const nav = document.querySelector(".nav"); - if (!nav) return; - if (nav.querySelector("[data-ask-ai]")) return; - - const menu = document.createElement("details"); - menu.className = "menu ask-ai-menu"; - menu.dataset.askAi = "true"; - - const summary = document.createElement("summary"); - summary.className = "button button-quiet"; - summary.textContent = "Ask AI"; - menu.appendChild(summary); - - const panel = document.createElement("div"); - panel.className = "menu-panel"; - - function itemLink(label, hint) { - const a = document.createElement("a"); - a.className = "menu-item"; - a.target = "_blank"; - a.rel = "noreferrer"; - const left = document.createElement("span"); - left.textContent = label; - const right = document.createElement("small"); - right.textContent = hint || ""; - a.appendChild(left); - a.appendChild(right); - return a; - } - - function itemButton(label, hint) { - const b = document.createElement("button"); - b.className = "menu-item"; - b.type = "button"; - const left = document.createElement("span"); - left.textContent = label; - const right = document.createElement("small"); - right.textContent = hint || ""; - b.appendChild(left); - b.appendChild(right); - return b; - } - - function sep() { - const d = document.createElement("div"); - d.className = "menu-sep"; - return d; - } - - const chatgpt = itemLink("ChatGPT", "New tab"); - const claude = itemLink("Claude", "New tab"); - const viewMd = itemLink("View Markdown", "Raw"); - viewMd.dataset.askAiViewMarkdown = "true"; - const copyMd = itemButton("Copy Markdown", "Clipboard"); - copyMd.dataset.askAiCopyMarkdown = "true"; - const llms = itemLink("Open llms.txt", "Pack"); - - const hint = document.createElement("div"); - hint.className = "menu-hint"; - hint.textContent = "Uses page Markdown when available."; - - panel.appendChild(chatgpt); - panel.appendChild(claude); - panel.appendChild(sep()); - panel.appendChild(viewMd); - panel.appendChild(copyMd); - panel.appendChild(sep()); - panel.appendChild(llms); - panel.appendChild(hint); - menu.appendChild(panel); - - const primaryButton = nav.querySelector(".button.button-primary"); - if (primaryButton && primaryButton.parentElement === nav) { - nav.insertBefore(menu, primaryButton); - } else { - nav.appendChild(menu); - } - - function getContext() { - const md = globalThis.oroPageMarkdown; - const markdownUrl = md && md.url ? String(md.url) : ""; - const markdownText = md && md.text ? String(md.text) : ""; - const pageUrl = String(globalThis.location.href || ""); - const llmsUrl = inferLlmsUrl(); - return { markdownUrl, markdownText, pageUrl, llmsUrl }; - } - - function updateMenu() { - const ctx = getContext(); - const target = ctx.markdownUrl || ctx.pageUrl; - chatgpt.href = buildChatGPTUrl(target); - claude.href = buildClaudeUrl(target); - llms.href = ctx.llmsUrl; - - const hasMd = Boolean(ctx.markdownUrl); - viewMd.hidden = !hasMd; - copyMd.hidden = !hasMd; - if (hasMd) viewMd.href = ctx.markdownUrl; - } - - async function onCopyMarkdown() { - const ctx = getContext(); - if (!ctx.markdownUrl) return; - - let text = ctx.markdownText; - if (!text) { - try { - const res = await fetch(ctx.markdownUrl); - if (res.ok) text = await res.text(); - } catch {} - } - - const ok = await writeClipboard(text); - const right = copyMd.querySelector("small"); - if (!right) return; - const prev = right.textContent; - right.textContent = ok ? "Copied" : "Failed"; - globalThis.setTimeout(() => { - right.textContent = prev || "Clipboard"; - }, 900); - } - - copyMd.addEventListener("click", onCopyMarkdown); - - panel.addEventListener("click", (event) => { - const a = event.target && event.target.closest ? event.target.closest("a.menu-item") : null; - if (!a) return; - menu.open = false; - }); - - document.addEventListener("click", (event) => { - if (!menu.open) return; - const t = event.target; - if (t && menu.contains(t)) return; - menu.open = false; - }); - - document.addEventListener("keydown", (event) => { - if (!menu.open) return; - if (event.key === "Escape") menu.open = false; - }); - - globalThis.addEventListener("oro:page-markdown", updateMenu); - updateMenu(); - } - - initAskAiMenu(); - -})(); diff --git a/src/globals/global.client.ts b/src/globals/global.client.ts new file mode 100644 index 00000000..17b562d6 --- /dev/null +++ b/src/globals/global.client.ts @@ -0,0 +1,2 @@ +const yearNode = document.querySelector('[data-year]') +if (yearNode) yearNode.textContent = String(new Date().getFullYear()) diff --git a/src/globals/global.css b/src/globals/global.css index b492fd12..42d1616d 100644 --- a/src/globals/global.css +++ b/src/globals/global.css @@ -363,7 +363,8 @@ pre { position: relative; } -.menu summary { +.menu summary, +.menu .menu-trigger { list-style: none; } @@ -371,7 +372,8 @@ pre { display: none; } -.menu summary::after { +.menu summary::after, +.menu .menu-trigger::after { content: ""; display: inline-block; width: 0.42rem; @@ -384,7 +386,8 @@ pre { transition: transform 140ms ease; } -.menu[open] summary::after { +.menu[open] summary::after, +.menu .menu-trigger[aria-expanded="true"]::after { transform: rotate(225deg) translateY(-0.02em); } @@ -1591,3443 +1594,1627 @@ pre code { } -/* Home redesign */ .container-wide { max-width: var(--container-wide); } -.home-page { +/* Oro repositioning */ +.site-dark { --color-bg: #11100f; --color-fg: #f7f3ea; - --color-muted: rgba(247, 243, 234, 0.68); + --color-muted: rgba(247, 243, 234, 0.66); --color-border: rgba(250, 248, 244, 0.12); --color-border-strong: rgba(250, 248, 244, 0.22); - --color-surface: rgba(250, 248, 244, 0.06); - --color-surface-2: rgba(250, 248, 244, 0.1); - --color-surface-3: rgba(250, 248, 244, 0.14); - --color-code-bg: #171616; - --color-code-bg-2: #211b2a; - --shadow: 0 18px 42px rgba(0, 0, 0, 0.26); + --color-surface: rgba(250, 248, 244, 0.055); + --color-surface-2: rgba(250, 248, 244, 0.085); + --color-surface-3: rgba(250, 248, 244, 0.12); + --color-code-bg: #151414; + --color-code-bg-2: #1f1928; + --shadow: 0 18px 42px rgba(0, 0, 0, 0.28); --shadow-elevated: 0 30px 80px rgba(0, 0, 0, 0.34); - background: var(--color-bg); + background: #11100f; color: var(--color-fg); } -.home-page::before { +.site-dark::before { background: linear-gradient(rgba(250, 248, 244, 0.035) 1px, transparent 1px), linear-gradient(90deg, rgba(250, 248, 244, 0.035) 1px, transparent 1px), - linear-gradient(180deg, rgba(91, 59, 162, 0.12), transparent 44%), - linear-gradient(140deg, rgba(246, 201, 69, 0.06), transparent 38%); + linear-gradient(180deg, rgba(91, 59, 162, 0.12), transparent 42%), + linear-gradient(140deg, rgba(62, 155, 101, 0.08), transparent 46%); background-size: 72px 72px, 72px 72px, auto, auto; - mask-image: linear-gradient(to bottom, black 0%, black 62%, transparent 100%); opacity: 1; } -.home-page a { - color: #d9cbff; - text-decoration-color: rgba(246, 201, 69, 0.35); -} - -.home-page .site-top { - background: rgba(17, 16, 15, 0.82); - border-bottom-color: rgba(250, 248, 244, 0.08); +.site-dark .site-top { + background: rgba(17, 16, 15, 0.9); + border-bottom-color: rgba(250, 248, 244, 0.1); box-shadow: none; } -.home-page .brand, -.home-page .nav a, -.home-page .footer-inner strong { +.site-dark .brand, +.site-dark .footer-inner strong { color: var(--color-fg); } -.home-page .brand-mark { - border-color: rgba(250, 248, 244, 0.16); +.site-dark .brand-mark { + border-color: rgba(250, 248, 244, 0.18); background: rgba(250, 248, 244, 0.08); box-shadow: 0 0 0 1px rgba(246, 201, 69, 0.08); } -.home-page .nav { - color: rgba(247, 243, 234, 0.66); +.site-dark .nav { + color: rgba(247, 243, 234, 0.64); +} + +.site-dark .nav a { + padding: 0.35rem 0; +} + +.site-dark .nav a:hover, +.site-dark .nav a:focus-visible { + color: var(--color-fg); } -.home-page .nav a:hover, -.home-page .nav a:focus-visible { +.site-dark .nav a[aria-current="page"] { color: var(--color-fg); - border-color: rgba(250, 248, 244, 0.12); - background: rgba(250, 248, 244, 0.06); } -.home-page .button { +.site-dark .button { border-color: rgba(250, 248, 244, 0.14); background: rgba(250, 248, 244, 0.06); color: var(--color-fg); } -.home-page .button:hover, -.home-page .button:focus-visible { +.site-dark .button:hover, +.site-dark .button:focus-visible { border-color: rgba(246, 201, 69, 0.42); background: rgba(250, 248, 244, 0.1); } -.home-page .button-primary { +.site-dark .button-primary { border-color: rgba(246, 201, 69, 0.68); background: linear-gradient(135deg, rgba(246, 201, 69, 0.92), rgba(244, 122, 40, 0.72)); color: #1f1f1f; box-shadow: 0 16px 40px rgba(246, 201, 69, 0.12); } -.home-page .button-primary:hover, -.home-page .button-primary:focus-visible { +.site-dark .button-primary:hover, +.site-dark .button-primary:focus-visible { background: linear-gradient(135deg, #f6c945, #f47a28); color: #1f1f1f; } -.home-header { - padding: 0.72rem 0; +.site-dark .menu-panel { + border-color: rgba(250, 248, 244, 0.12); + background: rgba(20, 18, 23, 0.96); + box-shadow: 0 24px 64px rgba(0, 0, 0, 0.34); } -.home-header .nav { - gap: 0.35rem; - font-size: 0.86rem; +.site-dark .menu-item { + color: rgba(247, 243, 234, 0.82); } -.home-header .nav a { - padding: 0.45rem 0.68rem; +.site-dark .menu-item:hover, +.site-dark .menu-item:focus-visible { + border-color: rgba(246, 201, 69, 0.24); + background: rgba(250, 248, 244, 0.08); + color: var(--color-fg); } -.home-header .nav .button { - padding: 0.62rem 0.82rem; +.site-dark .menu-item small, +.site-dark .menu-hint { + color: rgba(247, 243, 234, 0.54); } -.home-hero { - position: relative; - min-height: 780px; - display: flex; - align-items: center; - padding: 5.5rem 0 4.5rem; - overflow: hidden; - border-bottom: 1px solid rgba(250, 248, 244, 0.08); +.site-dark .menu-sep { + background: rgba(250, 248, 244, 0.1); } -.home-hero::after { - content: ""; - position: absolute; - inset: auto 0 0; - height: 34%; - pointer-events: none; - background: linear-gradient(to bottom, transparent, var(--color-bg)); +.site-dark .site-subnav { + border-top-color: rgba(250, 248, 244, 0.08); } -.home-hero-grid { - position: absolute; - inset: 0; - pointer-events: none; - background: - linear-gradient(rgba(250, 248, 244, 0.055) 1px, transparent 1px), - linear-gradient(90deg, rgba(250, 248, 244, 0.055) 1px, transparent 1px); - background-size: 88px 88px; - opacity: 0.42; - mask-image: linear-gradient(to bottom, black 0%, black 72%, transparent 100%); +.site-dark .site-subnav-label { + color: rgba(247, 243, 234, 0.52); } -.home-hero-layout { - position: relative; - z-index: 2; - display: grid; - grid-template-columns: minmax(0, 0.86fr) minmax(0, 1.14fr); - gap: 3rem; - align-items: center; +.site-dark .site-subnav-parent { + border-color: rgba(250, 248, 244, 0.16); + background: rgba(250, 248, 244, 0.07); + color: var(--color-fg); } -.home-hero-copy { - max-width: 700px; +.site-dark .site-subnav-links a { + color: rgba(247, 243, 234, 0.62); + background: rgba(250, 248, 244, 0.04); } -.home-eyebrow { - display: inline-flex; - align-items: center; - gap: 0.65rem; - margin-bottom: 1.1rem; - color: rgba(247, 243, 234, 0.76); - font-size: 0.78rem; - font-weight: 750; - text-transform: uppercase; - letter-spacing: 0.08em; +.site-dark .site-subnav-links a:hover, +.site-dark .site-subnav-links a:focus-visible, +.site-dark .site-subnav-links a[aria-current="page"] { + color: var(--color-fg); + border-color: rgba(246, 201, 69, 0.28); + background: rgba(250, 248, 244, 0.08); } -.home-eyebrow-mark { - width: 12px; - height: 12px; - border-radius: 50%; +.site-dark .hero::before { background: - linear-gradient(90deg, transparent 42%, var(--color-gold) 42% 58%, transparent 58%), - linear-gradient(0deg, transparent 42%, var(--color-green) 42% 58%, transparent 58%), - var(--color-purple); - box-shadow: 0 0 0 5px rgba(246, 201, 69, 0.09); + linear-gradient(rgba(250, 248, 244, 0.035) 1px, transparent 1px), + linear-gradient(90deg, rgba(250, 248, 244, 0.035) 1px, transparent 1px), + linear-gradient(120deg, rgba(91, 59, 162, 0.14), transparent 52%); + background-size: 84px 84px, 84px 84px, auto; } -.home-hero-copy h1 { - max-width: 700px; - margin: 0; - font-size: 5.6rem; - line-height: 0.95; - letter-spacing: 0; - text-wrap: balance; +.site-dark .hero-kicker { + border-color: rgba(250, 248, 244, 0.14); + background: rgba(250, 248, 244, 0.06); + color: rgba(247, 243, 234, 0.74); } -.home-lede { - max-width: 640px; - margin: 1.25rem 0 0; - color: var(--color-muted); - font-size: 1.18rem; - line-height: 1.62; - text-wrap: balance; +.site-dark .panel, +.site-dark .card, +.site-dark .list { + border-color: rgba(250, 248, 244, 0.12); + background: rgba(250, 248, 244, 0.045); + box-shadow: var(--shadow); } -.home-actions { - justify-content: flex-start; - margin-top: 1.65rem; +.site-dark .card::before { + background: + linear-gradient(135deg, rgba(246, 201, 69, 0.14), transparent 48%), + linear-gradient(210deg, rgba(91, 59, 162, 0.18), transparent 56%); + opacity: 1; } -.home-actions-left { - margin-top: 1.35rem; +.site-dark .panel-header { + border-bottom-color: rgba(250, 248, 244, 0.1); + background: rgba(250, 248, 244, 0.045); } -.home-metrics { - display: grid; - grid-template-columns: repeat(3, minmax(0, 1fr)); - gap: 0.8rem; - max-width: 650px; - margin-top: 2.2rem; +.site-dark .card-title, +.site-dark .list-title, +.site-dark .panel-title { + color: var(--color-fg); } -.home-metrics div { - min-width: 0; - padding: 0.9rem 0; - border-top: 1px solid rgba(250, 248, 244, 0.14); +.site-dark .card-meta, +.site-dark .list-desc, +.site-dark p { + color: var(--color-muted); } -.home-metrics strong, -.home-metrics span { - display: block; +.site-dark .list-row { + border-top-color: rgba(250, 248, 244, 0.1); } -.home-metrics strong { - color: var(--color-fg); - font-family: var(--font-display); - font-size: 1.08rem; - line-height: 1.2; +.site-dark .list-row:hover, +.site-dark .list-row:focus-visible { + background: rgba(250, 248, 244, 0.06); } -.home-metrics span { +.site-dark .list-meta, +.site-dark .footer-inner { color: rgba(247, 243, 234, 0.54); - font-size: 0.9rem; - line-height: 1.35; } -.home-orbit { - position: relative; - min-height: 610px; - perspective: 1100px; +.site-dark code { + background: rgba(246, 201, 69, 0.1); + color: rgba(247, 243, 234, 0.92); } -.home-orbit::before { - content: ""; - position: absolute; - inset: 4% 2% 0; - border: 1px solid rgba(91, 59, 162, 0.26); - transform: rotateX(61deg) rotateZ(-28deg); - transform-origin: center; - background: - linear-gradient(rgba(91, 59, 162, 0.16) 1px, transparent 1px), - linear-gradient(90deg, rgba(91, 59, 162, 0.16) 1px, transparent 1px); - background-size: 74px 74px; - opacity: 0.92; +.site-dark pre code { + background: transparent; + color: inherit; } -.home-orbit-plane { - position: absolute; - inset: 0; - transform: rotateX(61deg) rotateZ(-28deg); - transform-style: preserve-3d; +.site-dark pre { + border-color: rgba(250, 248, 244, 0.12); + box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.04), 0 18px 44px rgba(0, 0, 0, 0.24); } -.home-tile { - position: absolute; - width: 178px; - min-height: 74px; - padding: 0.75rem 0.85rem; - border-radius: 8px; - border: 1px solid rgba(250, 248, 244, 0.13); - background: linear-gradient(180deg, rgba(91, 59, 162, 0.5), rgba(23, 20, 30, 0.9)); - color: var(--color-fg); - box-shadow: 0 20px 30px rgba(0, 0, 0, 0.24); - transform: translateZ(28px); +.site-dark .site-footer { + border-top-color: rgba(250, 248, 244, 0.1); } -.home-tile::before { - content: ""; - position: absolute; - inset: 0; - border-radius: inherit; - background: linear-gradient(135deg, rgba(246, 201, 69, 0.18), transparent 48%); - pointer-events: none; +.section-heading { + max-width: 760px; } -.home-tile span, -.home-tile small { - position: relative; - display: block; +.section-heading h2, +.docs-hub-tech-copy h2, +.coming-soon-copy h1, +.docs-hub-copy h1, +.tech-hero-copy h1 { + letter-spacing: 0; } -.home-tile span { +.section-kicker { + margin-bottom: 0.8rem; + color: var(--color-gold); + font-size: 0.78rem; font-weight: 800; - line-height: 1.15; + text-transform: uppercase; + letter-spacing: 0.1em; } -.home-tile small { - margin-top: 0.24rem; - color: rgba(247, 243, 234, 0.58); - font-size: 0.74rem; - line-height: 1.15; +.tech-hero, +.docs-hub-hero, +.coming-soon { + position: relative; + overflow: hidden; + min-height: 760px; + display: flex; + align-items: center; + border-bottom: 1px solid rgba(250, 248, 244, 0.08); } -.tile-runtime { - left: 14%; - top: 26%; +.tech-hero-grid, +.docs-hub-grid, +.coming-soon-grid { + position: absolute; + inset: 0; + pointer-events: none; + background: + linear-gradient(rgba(250, 248, 244, 0.05) 1px, transparent 1px), + linear-gradient(90deg, rgba(250, 248, 244, 0.05) 1px, transparent 1px); + background-size: 88px 88px; + opacity: 0.4; + mask-image: linear-gradient(to bottom, black 0%, black 72%, transparent 100%); } -.tile-silk { - left: 40%; - top: 18%; - border-color: rgba(246, 201, 69, 0.36); +.tech-system-map { + position: absolute; + inset: 8rem max(5vw, calc((100vw - var(--container)) / 2)) 6rem auto; + width: min(390px, 28vw); + pointer-events: none; } -.tile-sage { - left: 62%; - top: 31%; +.system-map-frame { + position: relative; + height: 100%; + min-height: 460px; } -.tile-slg { - left: 28%; - top: 52%; - border-color: rgba(244, 122, 40, 0.32); +.system-map-line { + position: absolute; + background: rgba(250, 248, 244, 0.16); } -.tile-virtnosis { - left: 55%; - top: 58%; - border-color: rgba(62, 155, 101, 0.34); +.system-map-line-main { + left: 50%; + top: 0; + width: 1px; + height: 100%; + background: linear-gradient(180deg, transparent, rgba(246, 201, 69, 0.34), rgba(62, 155, 101, 0.24), transparent); } -.tile-edge { - left: 73%; - top: 52%; +.system-map-line-runtime, +.system-map-line-silk, +.system-map-line-virtnosis { + left: 21%; + width: 58%; + height: 1px; } -.tile-policy { - left: 5%; - top: 47%; - width: 138px; +.system-map-line-runtime { + top: 22%; } -.tile-packages { - left: 78%; - top: 20%; - width: 148px; +.system-map-line-silk { + top: 50%; } -.tile-center { - left: 43%; - top: 40%; - width: 152px; - min-height: 96px; - display: grid; - place-items: center; - text-align: center; - background: linear-gradient(180deg, rgba(246, 201, 69, 0.24), rgba(91, 59, 162, 0.6)); - border-color: rgba(246, 201, 69, 0.48); - transform: translateZ(64px); -} - -.tile-center img { - width: 34px; - height: 34px; - border-radius: 10px; -} - -.tile-center span { - margin-top: 0.35rem; +.system-map-line-virtnosis { + top: 78%; } -.home-strip { - padding: 2.5rem 0 3.5rem; +.system-node { + position: absolute; + display: grid; + grid-template-columns: minmax(0, 1fr); + row-gap: 0.1rem; + width: min(245px, 100%); + padding: 0.95rem 0 0.95rem 1rem; + border-left: 1px solid rgba(250, 248, 244, 0.22); + background: linear-gradient(90deg, rgba(250, 248, 244, 0.07), transparent 82%); + color: rgba(247, 243, 234, 0.9); } -.home-project-strip { - display: grid; - grid-template-columns: repeat(5, minmax(0, 1fr)); - gap: 1rem; - align-items: center; +.system-node strong { + font-size: 1rem; } -.home-project-strip a { - display: flex; - align-items: center; - justify-content: center; - min-height: 76px; - border: 1px solid rgba(250, 248, 244, 0.1); - border-radius: 8px; - background: rgba(250, 248, 244, 0.035); - color: rgba(247, 243, 234, 0.62); - text-decoration: none; - font-family: var(--font-display); - font-size: 1.08rem; - font-weight: 800; +.system-node small { + color: rgba(247, 243, 234, 0.52); + font-size: 0.82rem; } -.home-project-strip a:hover, -.home-project-strip a:focus-visible { - border-color: rgba(246, 201, 69, 0.34); - color: var(--color-fg); - background: rgba(250, 248, 244, 0.065); +.node-runtime { + left: 0; + top: 16%; } -.home-proof { - padding: 4.5rem 0 5rem; - border-top: 1px solid rgba(250, 248, 244, 0.08); - border-bottom: 1px solid rgba(250, 248, 244, 0.08); +.node-silk { + right: 0; + top: 44%; + border-left-color: rgba(91, 59, 162, 0.5); } -.home-proof-grid { - display: grid; - grid-template-columns: minmax(0, 0.78fr) minmax(0, 1.22fr); - gap: 4rem; - align-items: center; +.node-virtnosis { + left: 10%; + top: 72%; + border-left-color: rgba(62, 155, 101, 0.46); } -.home-proof-copy { - display: grid; - gap: 1.15rem; +.tech-hero-copy, +.docs-hub-copy, +.coming-soon-copy { + position: relative; + z-index: 2; + padding: 7rem 0; } -.home-rule-item { - padding: 0.3rem 0 0.35rem 1.25rem; - border-left: 2px solid rgba(250, 248, 244, 0.14); +.tech-hero-copy { + max-width: 720px; } -.home-rule-item[data-active="true"] { - border-left-color: var(--color-gold); +.docs-hub-copy, +.coming-soon-copy { + max-width: 820px; } -.home-rule-item h2, -.home-rule-item h3 { +.tech-hero-copy h1 { + max-width: 720px; margin: 0; - line-height: 1.1; - letter-spacing: 0; + color: var(--color-fg); + font-size: 4.75rem; + line-height: 1; } -.home-rule-item h2 { - font-size: 2.4rem; +.docs-hub-copy h1, +.coming-soon-copy h1 { + max-width: 820px; + margin: 0; + color: var(--color-fg); + font-size: 5.1rem; + line-height: 0.98; } -.home-rule-item h3 { - font-size: 1.35rem; - color: rgba(247, 243, 234, 0.78); +.tech-hero-copy p, +.docs-hub-copy p, +.coming-soon-copy p { + max-width: 680px; + margin-top: 1.25rem; + font-size: 1.16rem; + line-height: 1.62; } -.home-rule-item p { - max-width: 460px; - margin-top: 0.65rem; - color: var(--color-muted); - font-size: 1rem; +.technology-section, +.docs-hub-section { + padding: 5.5rem 0; } -.home-device-map { +.technology-section { position: relative; - min-height: 390px; - border: 1px solid rgba(91, 59, 162, 0.28); - border-radius: 8px; - background: - linear-gradient(rgba(250, 248, 244, 0.04) 1px, transparent 1px), - linear-gradient(90deg, rgba(250, 248, 244, 0.04) 1px, transparent 1px), - rgba(250, 248, 244, 0.025); - background-size: 64px 64px; + border-top: 1px solid rgba(250, 248, 244, 0.08); overflow: hidden; } -.map-root, -.map-node { +.technology-section::before { + content: ""; position: absolute; - display: grid; - place-items: center; - border-radius: 8px; - border: 1px solid rgba(250, 248, 244, 0.14); - background: rgba(17, 16, 15, 0.76); - color: var(--color-fg); - font-weight: 800; + inset: 0; + pointer-events: none; + background: + linear-gradient(rgba(250, 248, 244, 0.035) 1px, transparent 1px), + linear-gradient(90deg, rgba(250, 248, 244, 0.035) 1px, transparent 1px); + background-size: 88px 88px; + opacity: 0.42; + mask-image: linear-gradient(90deg, transparent 0%, black 18%, black 82%, transparent 100%); } -.map-root { - left: 50%; - top: 18%; - width: 132px; - height: 48px; - transform: translateX(-50%); - border-color: rgba(246, 201, 69, 0.5); - color: var(--color-gold); +.technology-section-silk { + background: rgba(91, 59, 162, 0.035); } -.map-node { - width: 122px; - height: 72px; - color: rgba(247, 243, 234, 0.76); +.technology-section-virtnosis { + background: rgba(62, 155, 101, 0.026); } -.node-runtime { - left: 12%; - top: 62%; +.technology-layout { + position: relative; + z-index: 1; + display: grid; + grid-template-columns: minmax(0, 0.95fr) minmax(360px, 0.85fr); + gap: 5rem; + align-items: center; } -.node-silk { - left: 36%; - top: 62%; +.technology-layout-reverse { + grid-template-columns: minmax(360px, 0.85fr) minmax(0, 0.95fr); } -.node-slg { - left: 60%; - top: 62%; +.technology-layout-reverse .technology-copy { + order: 2; } -.node-edge { - left: 80%; - top: 62%; +.technology-copy h2 { + max-width: 760px; + margin: 0; + color: var(--color-fg); + font-size: 3.4rem; + line-height: 1.04; + letter-spacing: 0; } -.map-line { - position: absolute; - left: 18%; - right: 12%; - top: 40%; - height: 1px; - background: rgba(91, 59, 162, 0.75); +.technology-copy p { + max-width: 680px; + margin-top: 1.15rem; + font-size: 1.06rem; + line-height: 1.65; } -.map-line::before, -.map-line::after { - content: ""; - position: absolute; - width: 1px; - height: 92px; - top: 0; - background: rgba(91, 59, 162, 0.75); +.technology-feature-list { + display: grid; + grid-template-columns: repeat(2, minmax(0, 1fr)); + gap: 0.75rem; + max-width: 680px; + margin-top: 1.6rem; + padding: 0; + list-style: none; } -.map-line::before { - left: 16%; +.technology-feature-list li { + position: relative; + min-width: 0; + min-height: 86px; + padding: 0.86rem 0.95rem 0.88rem; + overflow: hidden; + border: 1px solid rgba(250, 248, 244, 0.12); + border-radius: 8px; + background: + linear-gradient(135deg, rgba(250, 248, 244, 0.072), rgba(250, 248, 244, 0.022)), + linear-gradient(90deg, rgba(246, 201, 69, 0.14), transparent 32%); + transition: + border-color 160ms ease, + background-color 160ms ease, + transform 160ms ease; } -.map-line::after { - right: 18%; +.technology-feature-list li::before { + content: ""; + position: absolute; + left: 0; + top: 0.8rem; + bottom: 0.8rem; + width: 2px; + border-radius: 999px; + background: var(--color-gold); } -.map-line-b { - left: 42%; - right: auto; - width: 1px; - height: 92px; +.technology-feature-list li:nth-child(2)::before { + background: var(--color-purple); } -.map-line-c { - left: 66%; - right: auto; - width: 1px; - height: 92px; +.technology-feature-list li:nth-child(3)::before { + background: var(--color-green); } -.map-line-b::before, -.map-line-b::after, -.map-line-c::before, -.map-line-c::after { - display: none; +.technology-feature-list li:nth-child(4)::before { + background: var(--color-orange); } -.home-quote { - position: relative; - padding: 4.75rem 0; - overflow: hidden; - background: - linear-gradient(115deg, rgba(91, 59, 162, 0.22) 0 48%, rgba(246, 201, 69, 0.08) 48% 49%, rgba(17, 16, 15, 0.4) 49%), - #151311; - border-bottom: 1px solid rgba(250, 248, 244, 0.08); +.technology-feature-list li:hover { + border-color: rgba(246, 201, 69, 0.32); + background-color: rgba(250, 248, 244, 0.035); + transform: translateY(-1px); } -.home-quote blockquote { - max-width: 920px; - margin: 0 auto; +.technology-feature-list strong { + display: block; color: var(--color-fg); - font-family: var(--font-display); - font-size: 1.45rem; - font-weight: 800; - line-height: 1.35; - text-align: center; + font-size: 0.96rem; + line-height: 1.25; } -.home-build { - padding: 5.5rem 0 6rem; +.technology-feature-list small { + display: block; + margin-top: 0.28rem; + color: rgba(247, 243, 234, 0.58); + font-size: 0.82rem; + line-height: 1.45; } -.home-build-grid { - display: grid; - grid-template-columns: minmax(0, 0.78fr) minmax(0, 1.22fr); - gap: 4rem; - align-items: center; +.technology-feature-list code { + padding: 0.08rem 0.28rem; + font-size: 0.78em; +} + +.technology-feature-list span { + min-width: 0; + padding: 0.62rem 0.8rem; + border: 1px solid rgba(250, 248, 244, 0.11); + border-radius: 999px; + background: rgba(250, 248, 244, 0.04); + color: rgba(247, 243, 234, 0.78); + font-size: 0.93rem; + font-weight: 700; } -.home-build-copy h2 { +.technology-code pre { margin: 0; - font-size: 3rem; - line-height: 1; - letter-spacing: 0; + font-size: 0.9rem; } -.home-build-copy p { - max-width: 460px; - margin-top: 1rem; - color: var(--color-muted); +.technology-code { + min-width: 0; } -.home-build-mark { - width: 34px; - height: 34px; +.runtime-example { display: grid; - place-items: center; - margin-bottom: 1.1rem; - border-radius: 50%; - border: 1px solid rgba(244, 122, 40, 0.5); - color: var(--color-orange); - font-weight: 900; + gap: 0.8rem; } -.home-code-card { - border: 1px solid rgba(250, 248, 244, 0.12); +.runtime-code-tabs { + border-color: rgba(250, 248, 244, 0.13); border-radius: 8px; - background: rgba(250, 248, 244, 0.04); - box-shadow: var(--shadow-elevated); - overflow: hidden; + background: rgba(18, 15, 22, 0.86); + box-shadow: 0 18px 44px rgba(0, 0, 0, 0.24); } -.home-code-title { - padding: 0.75rem 1rem; - border-bottom: 1px solid rgba(250, 248, 244, 0.1); - color: rgba(247, 243, 234, 0.78); - font-family: var(--font-mono); +.runtime-code-tabs .tabs-list { + gap: 0.35rem; + padding: 0.42rem; + border-bottom-color: rgba(250, 248, 244, 0.1); + background: rgba(250, 248, 244, 0.035); +} + +.runtime-code-tabs .tabs-tab { + min-height: 34px; + padding: 0.42rem 0.72rem; + color: rgba(247, 243, 234, 0.58); font-size: 0.82rem; - font-weight: 800; } -.home-code-card pre { +.runtime-code-tabs .tabs-tab:hover, +.runtime-code-tabs .tabs-tab:focus-visible { + border-color: rgba(246, 201, 69, 0.32); + background: rgba(250, 248, 244, 0.07); + color: var(--color-fg); +} + +.runtime-code-tabs .tabs-tab[aria-selected="true"] { + border-color: rgba(246, 201, 69, 0.42); + background: rgba(246, 201, 69, 0.12); + color: var(--color-fg); +} + +.runtime-code-tabs .tabs-panel { + padding: 0; +} + +.runtime-code-tabs pre { + max-height: 360px; + overflow: auto; border: 0; border-radius: 0; + background: transparent; box-shadow: none; - background: linear-gradient(180deg, #171616 0%, #1d1727 100%); - font-size: 0.95rem; } -.home-section { - position: relative; - padding: 4rem 0 4.5rem; +.technology-section-silk .technology-code pre { + max-height: 560px; + overflow: auto; } -.contact-panel { - display: flex; - justify-content: space-between; - gap: 2rem; +.technology-section-virtnosis .technology-code pre { + max-height: 520px; + overflow: auto; +} + +.runtime-command { + display: grid; + grid-template-columns: auto minmax(0, 1fr); + gap: 0.8rem; align-items: center; - padding: 1.25rem 0; - border-top: 1px solid rgba(250, 248, 244, 0.12); + padding: 0.62rem 0.75rem; + border: 1px solid rgba(250, 248, 244, 0.12); + border-radius: 8px; + background: rgba(250, 248, 244, 0.045); } -.contact-panel h2 { - margin: 0; - font-size: 1.8rem; - line-height: 1; - letter-spacing: 0; +.runtime-command span { + color: rgba(247, 243, 234, 0.58); + font-size: 0.76rem; + font-weight: 800; + letter-spacing: 0.08em; + text-transform: uppercase; + white-space: nowrap; +} + +.runtime-command pre { + padding: 0.35rem 0; + border: 0; + background: transparent; + box-shadow: none; } -.contact-links { +.technology-links, +.docs-selector { display: flex; flex-wrap: wrap; - justify-content: flex-end; gap: 0.55rem; } -.contact-links a { - padding: 0.65rem 0.85rem; - border-radius: 999px; +.technology-links { + margin-top: 1.55rem; +} + +.technology-links a, +.docs-selector a, +.docs-link-group a { + display: inline-flex; + align-items: center; + min-height: 42px; + padding: 0.58rem 0.75rem; border: 1px solid rgba(250, 248, 244, 0.12); - background: rgba(250, 248, 244, 0.06); + border-radius: 999px; + background: rgba(250, 248, 244, 0.045); color: var(--color-fg); text-decoration: none; font-weight: 700; } -.contact-links a:hover, -.contact-links a:focus-visible { - border-color: rgba(246, 201, 69, 0.34); - background: rgba(250, 248, 244, 0.1); +.technology-links a:hover, +.technology-links a:focus-visible, +.docs-selector a:hover, +.docs-selector a:focus-visible, +.docs-link-group a:hover, +.docs-link-group a:focus-visible { + border-color: rgba(246, 201, 69, 0.4); + background: rgba(250, 248, 244, 0.08); } -.home-footer { - border-top-color: rgba(250, 248, 244, 0.08); +.coming-soon { + min-height: 840px; } -.home-footer .footer-inner { - color: rgba(247, 243, 234, 0.56); +.blog-lanes { + position: relative; + z-index: 2; + display: grid; + grid-template-columns: repeat(3, minmax(0, 1fr)); + gap: 1rem; + margin-top: 1.5rem; } -@media (max-width: 1180px) { - .home-hero-layout, - .home-proof-grid, - .home-build-grid { - grid-template-columns: 1fr; - } - - .home-hero-copy { - max-width: 780px; - } - - .home-hero-copy h1 { - max-width: 780px; - font-size: 4.2rem; - } - - .home-orbit { - min-height: 500px; - } +.blog-lanes article, +.blog-placeholder, +.docs-link-group { + border: 1px solid rgba(250, 248, 244, 0.12); + border-radius: 8px; + background: rgba(250, 248, 244, 0.045); } -@media (max-width: 820px) { - .home-hero { - min-height: auto; - padding: 4.25rem 0 3rem; - } - - .home-hero-copy h1 { - font-size: 3rem; - line-height: 1; - } - - .home-lede { - font-size: 1.05rem; - } - - .home-metrics, - .home-project-strip { - grid-template-columns: 1fr; - } +.blog-lanes article { + padding: 1rem; +} - .home-orbit { - min-height: 360px; - margin-top: 1rem; - overflow: hidden; - } +.blog-lanes span { + color: var(--color-gold); + font-size: 0.78rem; + font-weight: 800; + text-transform: uppercase; + letter-spacing: 0.08em; +} - .home-orbit::before, - .home-orbit-plane { - left: -30%; - right: -22%; - transform: rotateX(58deg) rotateZ(-24deg) scale(0.78); - } +.blog-lanes h2 { + margin-top: 0.6rem; + font-size: 1.35rem; +} - .home-tile { - width: 150px; - min-height: 68px; - } +.blog-lanes p { + margin-top: 0.55rem; + font-size: 0.98rem; +} - .home-proof, - .home-build { - padding: 3.75rem 0; - } +.blog-placeholder { + position: relative; + z-index: 2; + display: grid; + grid-template-columns: minmax(0, 0.8fr) minmax(0, 1.2fr); + gap: 2rem; + margin-top: 1rem; + padding: 1.2rem; +} - .home-rule-item h2, - .home-build-copy h2 { - font-size: 2.35rem; - } +.blog-placeholder h2 { + font-size: 1.7rem; +} - .home-device-map { - min-height: 330px; - } +.docs-hub-hero { + min-height: 600px; +} - .map-root { - top: 10%; - } +.docs-selector { + position: relative; + z-index: 2; + margin-top: 1.8rem; +} - .map-node { - width: 112px; - height: 60px; - font-size: 0.84rem; - } +.docs-hub-tech { + display: grid; + grid-template-columns: minmax(0, 0.8fr) minmax(0, 1.2fr); + gap: 3rem; + align-items: start; +} - .node-runtime { - left: 6%; - top: 62%; - } +.docs-hub-tech-copy h2 { + max-width: 680px; + font-size: 3rem; + line-height: 1.04; +} - .node-silk { - left: 35%; - top: 62%; - } +.docs-hub-tech-copy p { + max-width: 620px; + margin-top: 1rem; +} - .node-slg { - left: 64%; - top: 62%; - } +.docs-link-groups { + display: grid; + grid-template-columns: repeat(3, minmax(0, 1fr)); + gap: 0.9rem; +} - .node-edge { - display: none; - } +.docs-link-group { + display: flex; + flex-direction: column; + gap: 0.55rem; + min-width: 0; + padding: 0.95rem; +} - .contact-panel { - align-items: flex-start; - flex-direction: column; - } +.docs-link-group h3 { + color: var(--color-fg); + font-size: 1.1rem; + letter-spacing: 0; +} - .contact-links { - justify-content: flex-start; - } +.docs-link-group a { + justify-content: flex-start; + border-radius: 8px; } -@media (max-width: 520px) { - .home-hero-copy h1 { - font-size: 2.45rem; - } +.docs-flow { + display: grid; + grid-template-columns: minmax(0, 1fr) 44px minmax(0, 1fr) 44px minmax(0, 1fr) 44px minmax(0, 1fr); + gap: 0.35rem; + align-items: center; + margin-top: 2rem; +} - .home-actions { - align-items: stretch; - flex-direction: column; - } +.docs-flow div { + display: grid; + min-height: 74px; + place-items: center; + border: 1px solid rgba(250, 248, 244, 0.12); + border-radius: 8px; + background: rgba(250, 248, 244, 0.045); + color: var(--color-fg); + font-weight: 800; +} - .home-actions .button { - width: 100%; - } +.docs-flow span { + height: 1px; + background: rgba(246, 201, 69, 0.5); } +.docs-flow-silk span { + background: rgba(62, 155, 101, 0.5); +} -/* Oro repositioning */ -.site-dark { - --color-bg: #11100f; - --color-fg: #f7f3ea; - --color-muted: rgba(247, 243, 234, 0.66); - --color-border: rgba(250, 248, 244, 0.12); - --color-border-strong: rgba(250, 248, 244, 0.22); - --color-surface: rgba(250, 248, 244, 0.055); - --color-surface-2: rgba(250, 248, 244, 0.085); - --color-surface-3: rgba(250, 248, 244, 0.12); - --color-code-bg: #151414; - --color-code-bg-2: #1f1928; - --shadow: 0 18px 42px rgba(0, 0, 0, 0.28); - --shadow-elevated: 0 30px 80px rgba(0, 0, 0, 0.34); +.docs-landing-page { background: #11100f; - color: var(--color-fg); } -.site-dark::before { +.docs-landing-main { + position: relative; + border-top: 1px solid rgba(250, 248, 244, 0.08); background: linear-gradient(rgba(250, 248, 244, 0.035) 1px, transparent 1px), linear-gradient(90deg, rgba(250, 248, 244, 0.035) 1px, transparent 1px), - linear-gradient(180deg, rgba(91, 59, 162, 0.12), transparent 42%), - linear-gradient(140deg, rgba(62, 155, 101, 0.08), transparent 46%); - background-size: 72px 72px, 72px 72px, auto, auto; - opacity: 1; -} - -.site-dark .site-top { - background: rgba(17, 16, 15, 0.9); - border-bottom-color: rgba(250, 248, 244, 0.1); - box-shadow: none; + radial-gradient(circle at 22% 12%, rgba(246, 201, 69, 0.08), transparent 32%), + radial-gradient(circle at 88% 18%, rgba(91, 59, 162, 0.12), transparent 34%), + #11100f; + background-size: 48px 48px, 48px 48px, auto, auto, auto; } -.site-dark .brand, -.site-dark .footer-inner strong { - color: var(--color-fg); +.docs-landing-shell { + position: relative; + z-index: 1; + display: grid; + grid-template-columns: 280px minmax(0, 920px) 220px; + gap: 2.75rem; + width: min(100%, 1500px); + margin: 0 auto; + padding: 3rem var(--gutter) 5rem; } -.site-dark .brand-mark { - border-color: rgba(250, 248, 244, 0.18); - background: rgba(250, 248, 244, 0.08); - box-shadow: 0 0 0 1px rgba(246, 201, 69, 0.08); +.docs-landing-sidebar, +.docs-landing-toc { + position: sticky; + top: 112px; + align-self: start; } -.site-dark .nav { - color: rgba(247, 243, 234, 0.64); +.docs-landing-sidebar { + max-height: calc(100vh - 140px); + overflow: auto; + padding-right: 1.25rem; + border-right: 1px solid rgba(250, 248, 244, 0.1); } -.site-dark .nav a { - padding: 0.35rem 0; +.docs-sidebar-home { + display: inline-flex; + min-height: 36px; + align-items: center; + color: var(--color-fg); + font-weight: 800; + text-decoration: none; } -.site-dark .nav a:hover, -.site-dark .nav a:focus-visible { - color: var(--color-fg); +.docs-sidebar-nav { + display: grid; + gap: 1.8rem; + margin-top: 1.5rem; } -.site-dark .nav a[aria-current="page"] { - color: var(--color-fg); +.docs-sidebar-nav section { + display: grid; + gap: 0.22rem; } -.site-dark .button { - border-color: rgba(250, 248, 244, 0.14); - background: rgba(250, 248, 244, 0.06); - color: var(--color-fg); +.docs-sidebar-nav h2, +.docs-landing-toc p, +.docs-landing-kicker { + color: rgba(250, 248, 244, 0.62); + font-size: 0.72rem; + font-weight: 900; + letter-spacing: 0.12em; + text-transform: uppercase; } -.site-dark .button:hover, -.site-dark .button:focus-visible { - border-color: rgba(246, 201, 69, 0.42); - background: rgba(250, 248, 244, 0.1); +.docs-sidebar-nav a, +.docs-landing-toc a { + display: flex; + min-height: 34px; + align-items: center; + border-radius: 8px; + color: rgba(250, 248, 244, 0.74); + text-decoration: none; } -.site-dark .button-primary { - border-color: rgba(246, 201, 69, 0.68); - background: linear-gradient(135deg, rgba(246, 201, 69, 0.92), rgba(244, 122, 40, 0.72)); - color: #1f1f1f; - box-shadow: 0 16px 40px rgba(246, 201, 69, 0.12); +.docs-sidebar-nav a { + padding: 0.28rem 0.55rem; } -.site-dark .button-primary:hover, -.site-dark .button-primary:focus-visible { - background: linear-gradient(135deg, #f6c945, #f47a28); - color: #1f1f1f; +.docs-sidebar-nav a:hover, +.docs-sidebar-nav a:focus-visible, +.docs-landing-toc a:hover, +.docs-landing-toc a:focus-visible { + background: rgba(250, 248, 244, 0.06); + color: var(--color-fg); } -.site-dark .menu-panel { - border-color: rgba(250, 248, 244, 0.12); - background: rgba(20, 18, 23, 0.96); - box-shadow: 0 24px 64px rgba(0, 0, 0, 0.34); +.docs-landing-content { + min-width: 0; } -.site-dark .menu-item { - color: rgba(247, 243, 234, 0.82); +.docs-landing-intro { + padding: 1.2rem 0 2.5rem; + border-bottom: 1px solid rgba(250, 248, 244, 0.1); } -.site-dark .menu-item:hover, -.site-dark .menu-item:focus-visible { - border-color: rgba(246, 201, 69, 0.24); - background: rgba(250, 248, 244, 0.08); +.docs-landing-content h1 { + max-width: 760px; + margin-top: 0.85rem; color: var(--color-fg); + font-size: 3.45rem; + line-height: 1.03; } -.site-dark .menu-item small, -.site-dark .menu-hint { - color: rgba(247, 243, 234, 0.54); +.docs-landing-content h2 { + max-width: 700px; + color: var(--color-fg); + font-size: 2.3rem; + line-height: 1.08; } -.site-dark .menu-sep { - background: rgba(250, 248, 244, 0.1); +.docs-landing-content p { + color: rgba(250, 248, 244, 0.7); + line-height: 1.65; } -.site-dark .site-subnav { - border-top-color: rgba(250, 248, 244, 0.08); +.docs-landing-intro > p:not(.docs-landing-kicker) { + max-width: 760px; + margin-top: 1rem; + font-size: 1.05rem; } -.site-dark .site-subnav-label { - color: rgba(247, 243, 234, 0.52); +.docs-quick-select { + display: grid; + grid-template-columns: repeat(2, minmax(0, 1fr)); + gap: 0.8rem; + margin-top: 2rem; } -.site-dark .site-subnav-parent { - border-color: rgba(250, 248, 244, 0.16); - background: rgba(250, 248, 244, 0.07); +.docs-quick-select a { + display: grid; + gap: 0.35rem; + min-height: 112px; + align-content: center; + padding: 1rem; + border: 1px solid rgba(250, 248, 244, 0.12); + border-radius: 8px; + background: rgba(250, 248, 244, 0.045); color: var(--color-fg); + text-decoration: none; } -.site-dark .site-subnav-links a { - color: rgba(247, 243, 234, 0.62); - background: rgba(250, 248, 244, 0.04); -} - -.site-dark .site-subnav-links a:hover, -.site-dark .site-subnav-links a:focus-visible, -.site-dark .site-subnav-links a[aria-current="page"] { - color: var(--color-fg); - border-color: rgba(246, 201, 69, 0.28); - background: rgba(250, 248, 244, 0.08); +.docs-quick-select a:first-child { + border-color: rgba(246, 201, 69, 0.26); } -.site-dark .hero::before { - background: - linear-gradient(rgba(250, 248, 244, 0.035) 1px, transparent 1px), - linear-gradient(90deg, rgba(250, 248, 244, 0.035) 1px, transparent 1px), - linear-gradient(120deg, rgba(91, 59, 162, 0.14), transparent 52%); - background-size: 84px 84px, 84px 84px, auto; +.docs-quick-select a:last-child { + border-color: rgba(91, 59, 162, 0.34); } -.site-dark .hero-kicker { - border-color: rgba(250, 248, 244, 0.14); - background: rgba(250, 248, 244, 0.06); - color: rgba(247, 243, 234, 0.74); +.docs-quick-select a:hover, +.docs-quick-select a:focus-visible, +.docs-section-action:hover, +.docs-section-action:focus-visible, +.docs-link-block a:hover, +.docs-link-block a:focus-visible { + border-color: rgba(246, 201, 69, 0.5); + background: rgba(250, 248, 244, 0.075); } -.site-dark .panel, -.site-dark .card, -.site-dark .list { - border-color: rgba(250, 248, 244, 0.12); - background: rgba(250, 248, 244, 0.045); - box-shadow: var(--shadow); +.docs-quick-select span { + font-weight: 900; } -.site-dark .card::before { - background: - linear-gradient(135deg, rgba(246, 201, 69, 0.14), transparent 48%), - linear-gradient(210deg, rgba(91, 59, 162, 0.18), transparent 56%); - opacity: 1; +.docs-quick-select small, +.docs-link-block small { + color: rgba(250, 248, 244, 0.58); + line-height: 1.45; } -.site-dark .panel-header { - border-bottom-color: rgba(250, 248, 244, 0.1); - background: rgba(250, 248, 244, 0.045); +.docs-tech-section { + padding: 3rem 0; + border-bottom: 1px solid rgba(250, 248, 244, 0.1); } -.site-dark .card-title, -.site-dark .list-title, -.site-dark .panel-title { - color: var(--color-fg); +.docs-tech-heading { + display: flex; + gap: 1.5rem; + align-items: flex-start; + justify-content: space-between; } -.site-dark .card-meta, -.site-dark .list-desc, -.site-dark p { - color: var(--color-muted); +.docs-tech-heading h2 { + margin-top: 0.7rem; } -.site-dark .list-row { - border-top-color: rgba(250, 248, 244, 0.1); +.docs-section-action { + display: inline-flex; + min-width: 150px; + min-height: 42px; + align-items: center; + justify-content: center; + padding: 0.55rem 0.9rem; + border: 1px solid rgba(246, 201, 69, 0.34); + border-radius: 999px; + background: rgba(246, 201, 69, 0.08); + color: var(--color-fg); + font-weight: 800; + text-decoration: none; + white-space: nowrap; } -.site-dark .list-row:hover, -.site-dark .list-row:focus-visible { - background: rgba(250, 248, 244, 0.06); +.docs-tech-summary { + max-width: 780px; + margin-top: 1rem; } -.site-dark .list-meta, -.site-dark .footer-inner { - color: rgba(247, 243, 234, 0.54); +.docs-link-grid { + display: grid; + grid-template-columns: repeat(2, minmax(0, 1fr)); + gap: 1.1rem; + margin-top: 2rem; } -.site-dark code { - background: rgba(246, 201, 69, 0.1); - color: rgba(247, 243, 234, 0.92); +.docs-link-block { + min-width: 0; + padding-top: 1rem; + border-top: 1px solid rgba(250, 248, 244, 0.12); } -.site-dark pre code { - background: transparent; - color: inherit; +.docs-link-block h3 { + color: var(--color-fg); + font-size: 1rem; } -.site-dark pre { - border-color: rgba(250, 248, 244, 0.12); - box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.04), 0 18px 44px rgba(0, 0, 0, 0.24); +.docs-link-block a { + display: grid; + gap: 0.18rem; + margin-top: 0.7rem; + min-height: 72px; + padding: 0.82rem 0.9rem; + border: 1px solid rgba(250, 248, 244, 0.1); + border-radius: 8px; + background: rgba(250, 248, 244, 0.035); + color: var(--color-fg); + text-decoration: none; } -.site-dark .site-footer { - border-top-color: rgba(250, 248, 244, 0.1); +.docs-link-block span { + font-weight: 800; } -.section-heading { - max-width: 760px; +.docs-link-block code { + background: rgba(246, 201, 69, 0.12); + color: var(--color-gold); } -.section-heading h2, -.docs-hub-tech-copy h2, -.coming-soon-copy h1, -.docs-hub-copy h1, -.tech-hero-copy h1 { - letter-spacing: 0; +.docs-landing-toc { + display: grid; + gap: 0.18rem; + padding-left: 1rem; + border-left: 1px solid rgba(250, 248, 244, 0.1); } -.section-kicker { - margin-bottom: 0.8rem; - color: var(--color-gold); - font-size: 0.78rem; - font-weight: 800; - text-transform: uppercase; - letter-spacing: 0.1em; +.docs-landing-toc p { + margin-bottom: 0.35rem; + color: var(--color-fg); } -.tech-hero, -.docs-hub-hero, -.coming-soon { - position: relative; - overflow: hidden; - min-height: 760px; - display: flex; - align-items: center; - border-bottom: 1px solid rgba(250, 248, 244, 0.08); +.docs-landing-toc a { + padding: 0.25rem 0.5rem; + font-size: 0.92rem; } -.tech-hero-grid, -.docs-hub-grid, -.coming-soon-grid { - position: absolute; - inset: 0; - pointer-events: none; - background: - linear-gradient(rgba(250, 248, 244, 0.05) 1px, transparent 1px), - linear-gradient(90deg, rgba(250, 248, 244, 0.05) 1px, transparent 1px); - background-size: 88px 88px; - opacity: 0.4; - mask-image: linear-gradient(to bottom, black 0%, black 72%, transparent 100%); +.product-page .hero h1 { + max-width: 760px; + font-size: 4.4rem; + line-height: 1; + letter-spacing: 0; } -.tech-system-map { - position: absolute; - inset: 8rem max(5vw, calc((100vw - var(--container)) / 2)) 6rem auto; - width: min(390px, 28vw); - pointer-events: none; +.product-page .hero { + padding: 5.25rem 0; + border-bottom: 1px solid rgba(250, 248, 244, 0.08); } -.system-map-frame { - position: relative; - height: 100%; - min-height: 460px; +.product-page .section { + border-top: 1px solid rgba(250, 248, 244, 0.06); } -.system-map-line { - position: absolute; - background: rgba(250, 248, 244, 0.16); +.learn-copy { + position: relative; + flex: 0 0 auto; + width: 36px; + height: 36px; + border: 1px solid rgba(250, 248, 244, 0.28); + border-radius: 6px; + background: rgba(250, 248, 244, 0.08); + color: rgba(250, 248, 244, 0.92); + cursor: pointer; + -webkit-appearance: none; + appearance: none; } -.system-map-line-main { - left: 50%; - top: 0; - width: 1px; - height: 100%; - background: linear-gradient(180deg, transparent, rgba(246, 201, 69, 0.34), rgba(62, 155, 101, 0.24), transparent); +.learn-copy::before, +.learn-copy::after { + content: ""; + position: absolute; + width: 11px; + height: 13px; + border: 2px solid currentColor; + border-radius: 2px; } -.system-map-line-runtime, -.system-map-line-silk, -.system-map-line-virtnosis { - left: 21%; - width: 58%; - height: 1px; +.learn-copy::before { + left: 10px; + top: 8px; + opacity: 0.72; } -.system-map-line-runtime { - top: 22%; +.learn-copy::after { + left: 14px; + top: 12px; + background: rgba(6, 5, 7, 0.92); } -.system-map-line-silk { - top: 50%; +.learn-copy:hover, +.learn-copy:focus-visible { + border-color: rgba(246, 201, 69, 0.62); + background: rgba(250, 248, 244, 0.14); + color: #fffdf9; } -.system-map-line-virtnosis { - top: 78%; +.learn-copy[data-copy-state="copied"] { + border-color: rgba(62, 155, 101, 0.58); + color: #8fd4aa; } -.system-node { - position: absolute; - display: grid; - grid-template-columns: minmax(0, 1fr); - row-gap: 0.1rem; - width: min(245px, 100%); - padding: 0.95rem 0 0.95rem 1rem; - border-left: 1px solid rgba(250, 248, 244, 0.22); - background: linear-gradient(90deg, rgba(250, 248, 244, 0.07), transparent 82%); - color: rgba(247, 243, 234, 0.9); +.learn-copy[data-copy-state="failed"] { + border-color: rgba(244, 122, 40, 0.58); + color: #ffb17f; } -.system-node strong { - font-size: 1rem; +.docs-page .section { + padding: 2.2rem 0 4.5rem; } -.system-node small { - color: rgba(247, 243, 234, 0.52); - font-size: 0.82rem; +.docs-page .docs-layout { + gap: 2.75rem; } -.node-runtime { - left: 0; - top: 16%; +.docs-page .docs-layout[data-has-toc="true"] { + grid-template-columns: 300px minmax(0, 900px) 260px; } -.node-silk { - right: 0; - top: 44%; - border-left-color: rgba(91, 59, 162, 0.5); +.docs-page .docs-sidebar, +.docs-page .docs-toc { + border-color: rgba(250, 248, 244, 0.12); + background: rgba(250, 248, 244, 0.035); + box-shadow: none; } -.node-virtnosis { - left: 10%; - top: 72%; - border-left-color: rgba(62, 155, 101, 0.46); +.docs-page .docs-sidebar { + border-radius: 0; + border-width: 0 1px 0 0; + padding-right: 1.2rem; } -.tech-hero-copy, -.docs-hub-copy, -.coming-soon-copy { - position: relative; - z-index: 2; - padding: 7rem 0; +.docs-page .docs-toc { + border-radius: 0; + border-width: 0 0 0 1px; + padding-left: 1.2rem; } -.tech-hero-copy { - max-width: 720px; +.docs-page .docs-sidebar-header { + border-bottom-color: rgba(250, 248, 244, 0.1); } -.docs-hub-copy, -.coming-soon-copy { - max-width: 820px; +.docs-page .docs-sidebar-title, +.docs-page .docs-toc-title, +.docs-page .docs-search-result-title, +.docs-page .docs-prevnext-title, +.docs-page .docs-content h1, +.docs-page .docs-content h2, +.docs-page .docs-content h3, +.docs-page .docs-content h4 { + color: var(--color-fg); } -.tech-hero-copy h1 { - max-width: 720px; - margin: 0; - color: var(--color-fg); - font-size: 4.75rem; - line-height: 1; -} - -.docs-hub-copy h1, -.coming-soon-copy h1 { - max-width: 820px; - margin: 0; +.docs-page .docs-search { + border-color: rgba(250, 248, 244, 0.14); + background: rgba(250, 248, 244, 0.055); color: var(--color-fg); - font-size: 5.1rem; - line-height: 0.98; -} - -.tech-hero-copy p, -.docs-hub-copy p, -.coming-soon-copy p { - max-width: 680px; - margin-top: 1.25rem; - font-size: 1.16rem; - line-height: 1.62; -} - -.technology-section, -.docs-hub-section { - padding: 5.5rem 0; -} - -.technology-section { - position: relative; - border-top: 1px solid rgba(250, 248, 244, 0.08); - overflow: hidden; -} - -.technology-section::before { - content: ""; - position: absolute; - inset: 0; - pointer-events: none; - background: - linear-gradient(rgba(250, 248, 244, 0.035) 1px, transparent 1px), - linear-gradient(90deg, rgba(250, 248, 244, 0.035) 1px, transparent 1px); - background-size: 88px 88px; - opacity: 0.42; - mask-image: linear-gradient(90deg, transparent 0%, black 18%, black 82%, transparent 100%); } -.technology-section-silk { - background: rgba(91, 59, 162, 0.035); +.docs-page .docs-search::placeholder { + color: rgba(247, 243, 234, 0.44); } -.technology-section-virtnosis { - background: rgba(62, 155, 101, 0.026); +.docs-page .docs-nav-section, +.docs-page .docs-search-result-meta, +.docs-page .docs-breadcrumb, +.docs-page .docs-prevnext-label, +.docs-page .spec-toc-title { + color: rgba(247, 243, 234, 0.48); } -.technology-layout { - position: relative; - z-index: 1; - display: grid; - grid-template-columns: minmax(0, 0.95fr) minmax(360px, 0.85fr); - gap: 5rem; - align-items: center; +.docs-page .docs-nav a, +.docs-page .docs-toc-list a, +.docs-page .spec-toc a { + color: rgba(247, 243, 234, 0.62); } -.technology-layout-reverse { - grid-template-columns: minmax(360px, 0.85fr) minmax(0, 0.95fr); +.docs-page .docs-nav a:hover, +.docs-page .docs-nav a:focus-visible, +.docs-page .docs-nav a[data-active="true"], +.docs-page .docs-toc-list a:hover, +.docs-page .docs-toc-list a:focus-visible, +.docs-page .spec-toc a:hover, +.docs-page .spec-toc a:focus-visible, +.docs-page .spec-toc a[data-active="true"] { + color: var(--color-fg); + background: rgba(250, 248, 244, 0.07); } -.technology-layout-reverse .technology-copy { - order: 2; +.docs-page .docs-content .prose, +.docs-page .spec-prose { + max-width: 92ch; } -.technology-copy h2 { - max-width: 760px; - margin: 0; - color: var(--color-fg); - font-size: 3.4rem; - line-height: 1.04; +.docs-page .docs-content .prose > h1:first-child, +.docs-page .spec-prose > h1:first-child { + font-size: 3.05rem; + line-height: 1.05; letter-spacing: 0; } -.technology-copy p { - max-width: 680px; - margin-top: 1.15rem; - font-size: 1.06rem; - line-height: 1.65; +.docs-page .docs-content p, +.docs-page .docs-content li, +.docs-page .docs-content dd, +.docs-page .spec-prose p, +.docs-page .spec-prose li, +.docs-page .spec-prose dd { + color: rgba(247, 243, 234, 0.68); } -.technology-feature-list { +.docs-layout .prose ul, +.docs-layout .prose ol, +.spec-prose ul, +.spec-prose ol { display: grid; - grid-template-columns: repeat(2, minmax(0, 1fr)); - gap: 0.75rem; - max-width: 680px; - margin-top: 1.6rem; + gap: 0.55rem; + margin: 1.1rem 0; padding: 0; list-style: none; } -.technology-feature-list li { +.docs-layout .prose li, +.spec-prose li { position: relative; - min-width: 0; - min-height: 86px; - padding: 0.86rem 0.95rem 0.88rem; - overflow: hidden; - border: 1px solid rgba(250, 248, 244, 0.12); + margin: 0; + padding: 0.72rem 0.86rem 0.72rem 1rem; + border: 1px solid rgba(31, 31, 31, 0.1); + border-left: 2px solid rgba(246, 201, 69, 0.44); border-radius: 8px; - background: - linear-gradient(135deg, rgba(250, 248, 244, 0.072), rgba(250, 248, 244, 0.022)), - linear-gradient(90deg, rgba(246, 201, 69, 0.14), transparent 32%); - transition: - border-color 160ms ease, - background-color 160ms ease, - transform 160ms ease; + background: rgba(255, 255, 255, 0.6); } -.technology-feature-list li::before { - content: ""; - position: absolute; - left: 0; - top: 0.8rem; - bottom: 0.8rem; - width: 2px; - border-radius: 999px; - background: var(--color-gold); +.docs-layout .prose li + li, +.spec-prose li + li { + margin-top: 0; } -.technology-feature-list li:nth-child(2)::before { - background: var(--color-purple); +.docs-layout .prose ol, +.spec-prose ol { + counter-reset: docs-ordered-list; } -.technology-feature-list li:nth-child(3)::before { - background: var(--color-green); +.docs-layout .prose ol > li, +.spec-prose ol > li { + counter-increment: docs-ordered-list; + padding-left: 2.75rem; } -.technology-feature-list li:nth-child(4)::before { - background: var(--color-orange); +.docs-layout .prose ol > li::before, +.spec-prose ol > li::before { + content: counter(docs-ordered-list); + position: absolute; + left: 0.78rem; + top: 0.72rem; + display: inline-grid; + place-items: center; + min-width: 1.32rem; + height: 1.32rem; + padding: 0 0.18rem; + border: 1px solid rgba(246, 201, 69, 0.38); + border-radius: 999px; + background: rgba(246, 201, 69, 0.12); + color: var(--color-gold); + font-family: var(--font-mono); + font-size: 0.7rem; + font-weight: 800; + line-height: 1; } -.technology-feature-list li:hover { - border-color: rgba(246, 201, 69, 0.32); - background-color: rgba(250, 248, 244, 0.035); - transform: translateY(-1px); +.docs-layout .prose li > p:first-child, +.spec-prose li > p:first-child { + margin-top: 0; } -.technology-feature-list strong { - display: block; - color: var(--color-fg); - font-size: 0.96rem; - line-height: 1.25; +.docs-layout .prose li > p:last-child, +.spec-prose li > p:last-child { + margin-bottom: 0; } -.technology-feature-list small { - display: block; - margin-top: 0.28rem; - color: rgba(247, 243, 234, 0.58); - font-size: 0.82rem; - line-height: 1.45; +.docs-layout .prose li > ul, +.docs-layout .prose li > ol, +.spec-prose li > ul, +.spec-prose li > ol { + gap: 0.42rem; + margin: 0.64rem 0 0; } -.technology-feature-list code { - padding: 0.08rem 0.28rem; - font-size: 0.78em; +.docs-layout .prose li > ul > li, +.docs-layout .prose li > ol > li, +.spec-prose li > ul > li, +.spec-prose li > ol > li { + padding-top: 0.56rem; + padding-bottom: 0.56rem; + background: rgba(31, 31, 31, 0.035); } -.technology-feature-list span { - min-width: 0; - padding: 0.62rem 0.8rem; - border: 1px solid rgba(250, 248, 244, 0.11); - border-radius: 999px; - background: rgba(250, 248, 244, 0.04); - color: rgba(247, 243, 234, 0.78); - font-size: 0.93rem; - font-weight: 700; +.site-dark .docs-layout .prose li, +.site-dark .spec-prose li, +.docs-page .docs-layout .prose li, +.docs-page .spec-prose li { + border-color: rgba(250, 248, 244, 0.1); + border-left-color: rgba(246, 201, 69, 0.46); + background: rgba(250, 248, 244, 0.045); } -.technology-code pre { - margin: 0; - font-size: 0.9rem; +.site-dark .docs-layout .prose li > ul > li, +.site-dark .docs-layout .prose li > ol > li, +.site-dark .spec-prose li > ul > li, +.site-dark .spec-prose li > ol > li, +.docs-page .docs-layout .prose li > ul > li, +.docs-page .docs-layout .prose li > ol > li, +.docs-page .spec-prose li > ul > li, +.docs-page .spec-prose li > ol > li { + background: rgba(250, 248, 244, 0.035); } -.technology-code { - min-width: 0; +.docs-page .docs-inline-ref { + color: var(--color-fg); + text-decoration-color: rgba(246, 201, 69, 0.35); } -.runtime-example { - display: grid; - gap: 0.8rem; -} - -.runtime-code-tabs { - border-color: rgba(250, 248, 244, 0.13); - border-radius: 8px; - background: rgba(18, 15, 22, 0.86); - box-shadow: 0 18px 44px rgba(0, 0, 0, 0.24); -} - -.runtime-code-tabs .tabs-list { - gap: 0.35rem; - padding: 0.42rem; - border-bottom-color: rgba(250, 248, 244, 0.1); - background: rgba(250, 248, 244, 0.035); -} - -.runtime-code-tabs .tabs-tab { - min-height: 34px; - padding: 0.42rem 0.72rem; - color: rgba(247, 243, 234, 0.58); - font-size: 0.82rem; -} - -.runtime-code-tabs .tabs-tab:hover, -.runtime-code-tabs .tabs-tab:focus-visible { - border-color: rgba(246, 201, 69, 0.32); - background: rgba(250, 248, 244, 0.07); - color: var(--color-fg); -} - -.runtime-code-tabs .tabs-tab[aria-selected="true"] { - border-color: rgba(246, 201, 69, 0.42); - background: rgba(246, 201, 69, 0.12); - color: var(--color-fg); -} - -.runtime-code-tabs .tabs-panel { - padding: 0; -} - -.runtime-code-tabs pre { - max-height: 360px; - overflow: auto; - border: 0; - border-radius: 0; - background: transparent; - box-shadow: none; -} - -.technology-section-silk .technology-code pre { - max-height: 560px; - overflow: auto; -} - -.technology-section-virtnosis .technology-code pre { - max-height: 520px; - overflow: auto; -} - -.runtime-command { - display: grid; - grid-template-columns: auto minmax(0, 1fr); - gap: 0.8rem; - align-items: center; - padding: 0.62rem 0.75rem; - border: 1px solid rgba(250, 248, 244, 0.12); - border-radius: 8px; - background: rgba(250, 248, 244, 0.045); -} - -.runtime-command span { - color: rgba(247, 243, 234, 0.58); - font-size: 0.76rem; - font-weight: 800; - letter-spacing: 0.08em; - text-transform: uppercase; - white-space: nowrap; -} - -.runtime-command pre { - padding: 0.35rem 0; - border: 0; - background: transparent; - box-shadow: none; -} - -.technology-links, -.docs-selector { - display: flex; - flex-wrap: wrap; - gap: 0.55rem; -} - -.technology-links { - margin-top: 1.55rem; -} - -.technology-links a, -.docs-selector a, -.docs-link-group a { - display: inline-flex; - align-items: center; - min-height: 42px; - padding: 0.58rem 0.75rem; - border: 1px solid rgba(250, 248, 244, 0.12); - border-radius: 999px; - background: rgba(250, 248, 244, 0.045); - color: var(--color-fg); - text-decoration: none; - font-weight: 700; -} - -.technology-links a:hover, -.technology-links a:focus-visible, -.docs-selector a:hover, -.docs-selector a:focus-visible, -.docs-link-group a:hover, -.docs-link-group a:focus-visible { - border-color: rgba(246, 201, 69, 0.4); +.docs-page .docs-inline-code, +.docs-page .prose code { background: rgba(250, 248, 244, 0.08); + color: rgba(247, 243, 234, 0.92); } -.coming-soon { - min-height: 840px; -} - -.blog-lanes { - position: relative; - z-index: 2; - display: grid; - grid-template-columns: repeat(3, minmax(0, 1fr)); - gap: 1rem; - margin-top: 1.5rem; -} - -.blog-lanes article, -.blog-placeholder, -.docs-link-group { - border: 1px solid rgba(250, 248, 244, 0.12); - border-radius: 8px; - background: rgba(250, 248, 244, 0.045); +.docs-page .prose pre { + padding: 0; } -.blog-lanes article { +.docs-page .prose pre code, +.docs-page .prose pre code.hljs { + display: block; padding: 1rem; + background: transparent; } -.blog-lanes span { - color: var(--color-gold); - font-size: 0.78rem; - font-weight: 800; - text-transform: uppercase; - letter-spacing: 0.08em; -} - -.blog-lanes h2 { - margin-top: 0.6rem; - font-size: 1.35rem; -} - -.blog-lanes p { - margin-top: 0.55rem; - font-size: 0.98rem; -} - -.blog-placeholder { - position: relative; - z-index: 2; - display: grid; - grid-template-columns: minmax(0, 0.8fr) minmax(0, 1.2fr); - gap: 2rem; - margin-top: 1rem; - padding: 1.2rem; -} - -.blog-placeholder h2 { - font-size: 1.7rem; -} - -.docs-hub-hero { - min-height: 600px; -} - -.docs-selector { - position: relative; - z-index: 2; - margin-top: 1.8rem; -} - -.docs-hub-tech { - display: grid; - grid-template-columns: minmax(0, 0.8fr) minmax(0, 1.2fr); - gap: 3rem; - align-items: start; -} - -.docs-hub-tech-copy h2 { - max-width: 680px; - font-size: 3rem; - line-height: 1.04; -} - -.docs-hub-tech-copy p { - max-width: 620px; - margin-top: 1rem; -} - -.docs-link-groups { - display: grid; - grid-template-columns: repeat(3, minmax(0, 1fr)); - gap: 0.9rem; -} - -.docs-link-group { - display: flex; - flex-direction: column; - gap: 0.55rem; - min-width: 0; - padding: 0.95rem; -} - -.docs-link-group h3 { - color: var(--color-fg); - font-size: 1.1rem; - letter-spacing: 0; -} - -.docs-link-group a { - justify-content: flex-start; - border-radius: 8px; -} - -.docs-flow { - display: grid; - grid-template-columns: minmax(0, 1fr) 44px minmax(0, 1fr) 44px minmax(0, 1fr) 44px minmax(0, 1fr); - gap: 0.35rem; - align-items: center; - margin-top: 2rem; -} - -.docs-flow div { - display: grid; - min-height: 74px; - place-items: center; - border: 1px solid rgba(250, 248, 244, 0.12); - border-radius: 8px; - background: rgba(250, 248, 244, 0.045); - color: var(--color-fg); - font-weight: 800; -} - -.docs-flow span { - height: 1px; - background: rgba(246, 201, 69, 0.5); -} - -.docs-flow-silk span { - background: rgba(62, 155, 101, 0.5); -} - -.docs-landing-page { - background: #11100f; -} - -.docs-landing-main { - position: relative; - border-top: 1px solid rgba(250, 248, 244, 0.08); - background: - linear-gradient(rgba(250, 248, 244, 0.035) 1px, transparent 1px), - linear-gradient(90deg, rgba(250, 248, 244, 0.035) 1px, transparent 1px), - radial-gradient(circle at 22% 12%, rgba(246, 201, 69, 0.08), transparent 32%), - radial-gradient(circle at 88% 18%, rgba(91, 59, 162, 0.12), transparent 34%), - #11100f; - background-size: 48px 48px, 48px 48px, auto, auto, auto; -} - -.docs-landing-shell { - position: relative; - z-index: 1; - display: grid; - grid-template-columns: 280px minmax(0, 920px) 220px; - gap: 2.75rem; - width: min(100%, 1500px); - margin: 0 auto; - padding: 3rem var(--gutter) 5rem; -} - -.docs-landing-sidebar, -.docs-landing-toc { - position: sticky; - top: 112px; - align-self: start; -} - -.docs-landing-sidebar { - max-height: calc(100vh - 140px); - overflow: auto; - padding-right: 1.25rem; - border-right: 1px solid rgba(250, 248, 244, 0.1); -} - -.docs-sidebar-home { - display: inline-flex; - min-height: 36px; - align-items: center; - color: var(--color-fg); - font-weight: 800; - text-decoration: none; -} - -.docs-sidebar-nav { - display: grid; - gap: 1.8rem; - margin-top: 1.5rem; -} - -.docs-sidebar-nav section { - display: grid; - gap: 0.22rem; -} - -.docs-sidebar-nav h2, -.docs-landing-toc p, -.docs-landing-kicker { - color: rgba(250, 248, 244, 0.62); - font-size: 0.72rem; - font-weight: 900; - letter-spacing: 0.12em; - text-transform: uppercase; -} - -.docs-sidebar-nav a, -.docs-landing-toc a { - display: flex; - min-height: 34px; - align-items: center; - border-radius: 8px; - color: rgba(250, 248, 244, 0.74); - text-decoration: none; -} - -.docs-sidebar-nav a { - padding: 0.28rem 0.55rem; -} - -.docs-sidebar-nav a:hover, -.docs-sidebar-nav a:focus-visible, -.docs-landing-toc a:hover, -.docs-landing-toc a:focus-visible { - background: rgba(250, 248, 244, 0.06); - color: var(--color-fg); -} - -.docs-landing-content { - min-width: 0; -} - -.docs-landing-intro { - padding: 1.2rem 0 2.5rem; - border-bottom: 1px solid rgba(250, 248, 244, 0.1); -} - -.docs-landing-content h1 { - max-width: 760px; - margin-top: 0.85rem; - color: var(--color-fg); - font-size: 3.45rem; - line-height: 1.03; -} - -.docs-landing-content h2 { - max-width: 700px; - color: var(--color-fg); - font-size: 2.3rem; - line-height: 1.08; -} - -.docs-landing-content p { - color: rgba(250, 248, 244, 0.7); - line-height: 1.65; -} - -.docs-landing-intro > p:not(.docs-landing-kicker) { - max-width: 760px; - margin-top: 1rem; - font-size: 1.05rem; -} - -.docs-quick-select { - display: grid; - grid-template-columns: repeat(2, minmax(0, 1fr)); - gap: 0.8rem; - margin-top: 2rem; -} - -.docs-quick-select a { - display: grid; - gap: 0.35rem; - min-height: 112px; - align-content: center; - padding: 1rem; - border: 1px solid rgba(250, 248, 244, 0.12); - border-radius: 8px; - background: rgba(250, 248, 244, 0.045); - color: var(--color-fg); - text-decoration: none; -} - -.docs-quick-select a:first-child { - border-color: rgba(246, 201, 69, 0.26); -} - -.docs-quick-select a:last-child { - border-color: rgba(91, 59, 162, 0.34); -} - -.docs-quick-select a:hover, -.docs-quick-select a:focus-visible, -.docs-section-action:hover, -.docs-section-action:focus-visible, -.docs-link-block a:hover, -.docs-link-block a:focus-visible { - border-color: rgba(246, 201, 69, 0.5); - background: rgba(250, 248, 244, 0.075); -} - -.docs-quick-select span { - font-weight: 900; -} - -.docs-quick-select small, -.docs-link-block small { - color: rgba(250, 248, 244, 0.58); - line-height: 1.45; -} - -.docs-tech-section { - padding: 3rem 0; - border-bottom: 1px solid rgba(250, 248, 244, 0.1); -} - -.docs-tech-heading { - display: flex; - gap: 1.5rem; - align-items: flex-start; - justify-content: space-between; -} - -.docs-tech-heading h2 { - margin-top: 0.7rem; -} - -.docs-section-action { - display: inline-flex; - min-width: 150px; - min-height: 42px; - align-items: center; - justify-content: center; - padding: 0.55rem 0.9rem; - border: 1px solid rgba(246, 201, 69, 0.34); - border-radius: 999px; - background: rgba(246, 201, 69, 0.08); - color: var(--color-fg); - font-weight: 800; - text-decoration: none; - white-space: nowrap; -} - -.docs-tech-summary { - max-width: 780px; - margin-top: 1rem; -} - -.docs-link-grid { - display: grid; - grid-template-columns: repeat(2, minmax(0, 1fr)); - gap: 1.1rem; - margin-top: 2rem; -} - -.docs-link-block { - min-width: 0; - padding-top: 1rem; - border-top: 1px solid rgba(250, 248, 244, 0.12); -} - -.docs-link-block h3 { - color: var(--color-fg); - font-size: 1rem; -} - -.docs-link-block a { - display: grid; - gap: 0.18rem; - margin-top: 0.7rem; - min-height: 72px; - padding: 0.82rem 0.9rem; - border: 1px solid rgba(250, 248, 244, 0.1); - border-radius: 8px; - background: rgba(250, 248, 244, 0.035); - color: var(--color-fg); - text-decoration: none; -} - -.docs-link-block span { - font-weight: 800; -} - -.docs-link-block code { - background: rgba(246, 201, 69, 0.12); - color: var(--color-gold); -} - -.docs-landing-toc { - display: grid; - gap: 0.18rem; - padding-left: 1rem; - border-left: 1px solid rgba(250, 248, 244, 0.1); -} - -.docs-landing-toc p { - margin-bottom: 0.35rem; - color: var(--color-fg); -} - -.docs-landing-toc a { - padding: 0.25rem 0.5rem; - font-size: 0.92rem; -} - -.product-page .hero h1 { - max-width: 760px; - font-size: 4.4rem; - line-height: 1; - letter-spacing: 0; -} - -.product-page .hero { - padding: 5.25rem 0; - border-bottom: 1px solid rgba(250, 248, 244, 0.08); -} - -.product-page .section { - border-top: 1px solid rgba(250, 248, 244, 0.06); -} - -.learn-page .hero { - padding: clamp(4rem, 7vw, 6.5rem) 0 3rem; -} - -.learn-hero { - position: relative; - z-index: 1; - max-width: 780px; - margin: 0 auto; - text-align: center; -} - -.learn-hero h1 { - max-width: none; - margin-top: 1rem; - font-size: clamp(3.1rem, 7vw, 5.7rem); - line-height: 0.98; - letter-spacing: 0; -} - -.learn-hero .lede { - max-width: 62ch; - margin: 1.15rem auto 0; -} - -.learn-hero-actions { - justify-content: center; -} - -.learn-hero-art { - position: relative; - display: grid; - place-items: center; - min-height: clamp(18rem, 31vw, 28rem); - margin-top: clamp(2rem, 5vw, 4rem); - overflow: hidden; - border-bottom: 1px solid rgba(250, 248, 244, 0.08); - background: - linear-gradient(rgba(250, 248, 244, 0.035) 1px, transparent 1px), - linear-gradient(90deg, rgba(250, 248, 244, 0.035) 1px, transparent 1px), - radial-gradient(60% 80% at 50% 110%, rgba(62, 155, 101, 0.28), transparent 58%), - radial-gradient(80% 90% at 50% 115%, rgba(91, 59, 162, 0.18), transparent 64%); - background-size: 56px 56px, 56px 56px, auto, auto; -} - -.learn-course-panel { - position: relative; - width: min(100%, 560px); - padding: 1.4rem; - border: 1px solid rgba(250, 248, 244, 0.12); - border-radius: 8px; - background: rgba(12, 11, 14, 0.86); - box-shadow: 0 28px 80px rgba(0, 0, 0, 0.36); -} - -.learn-course-mark { - display: grid; - place-items: center; - width: 72px; - height: 72px; - margin: -3rem auto 1.1rem; - border: 1px solid rgba(250, 248, 244, 0.16); - border-radius: 8px; - background: - linear-gradient(135deg, rgba(250, 248, 244, 0.96), rgba(250, 248, 244, 0.78)), - linear-gradient(135deg, rgba(246, 201, 69, 0.3), rgba(91, 59, 162, 0.22)); -} - -.learn-course-mark img { - width: 42px; - height: 42px; -} - -.learn-course-panel h2 { - text-align: center; -} - -.learn-course-panel p { - max-width: 44ch; - margin: 0.55rem auto 0; - text-align: center; -} - -.learn-current-row { - display: grid; - grid-template-columns: minmax(0, 1fr) auto; - gap: 1rem; - align-items: center; - margin: 1.4rem auto 0; - padding: 0.82rem 0.95rem; - max-width: 380px; - border: 1px solid rgba(250, 248, 244, 0.1); - border-radius: 999px; - background: rgba(250, 248, 244, 0.06); - text-align: left; -} - -.learn-current-row strong { - display: block; - color: var(--color-fg); - line-height: 1.2; -} - -.learn-current-row span { - display: block; - margin-top: 0.18rem; - color: rgba(247, 243, 234, 0.56); - font-size: 0.85rem; - line-height: 1.35; -} - -.learn-current-dot { - width: 28px; - height: 28px; - border: 1px solid rgba(246, 201, 69, 0.34); - border-radius: 999px; - background: rgba(246, 201, 69, 0.12); -} - -.learn-section-heading { - display: flex; - align-items: baseline; - justify-content: center; - gap: 1rem; - flex-wrap: wrap; - text-align: center; -} - -.learn-section-heading p { - font-size: 1rem; -} - -.learn-chapter-grid { - display: grid; - grid-template-columns: repeat(3, minmax(0, 1fr)); - gap: 0.8rem; -} - -.learn-chapter { - display: grid; - grid-template-columns: auto minmax(0, 1fr); - gap: 0.78rem; - min-height: 112px; - padding: 1rem; - border: 1px solid rgba(250, 248, 244, 0.12); - border-radius: 8px; - background: rgba(250, 248, 244, 0.045); - color: inherit; - text-decoration: none; - transition: transform 140ms ease, background 140ms ease, border-color 140ms ease; -} - -.learn-chapter:hover, -.learn-chapter:focus-visible { - border-color: rgba(246, 201, 69, 0.36); - background: rgba(250, 248, 244, 0.07); - transform: translateY(-1px); -} - -.learn-chapter-number { - display: inline-grid; - place-items: center; - width: 1.7rem; - height: 1.7rem; - margin-top: 0; - border-radius: 999px; - background: rgba(246, 201, 69, 0.16); - color: var(--color-gold); - font-family: var(--font-mono); - font-size: 0.78rem; - font-weight: 800; - line-height: 1; - text-align: center; -} - -.learn-chapter:nth-child(3n + 2) .learn-chapter-number { - background: rgba(62, 155, 101, 0.16); - color: #8fd4aa; -} - -.learn-chapter:nth-child(3n) .learn-chapter-number { - background: rgba(244, 122, 40, 0.16); - color: #ffb17f; -} - -.learn-chapter strong { - display: block; - color: var(--color-fg); - line-height: 1.25; -} - -.learn-chapter > span:not(.learn-chapter-number) { - display: block; - min-width: 0; -} - -.learn-chapter > span:not(.learn-chapter-number) > span { - display: block; - margin-top: 0.38rem; - color: rgba(247, 243, 234, 0.62); - font-size: 0.92rem; - line-height: 1.45; -} - -.learn-info-grid { - display: grid; - grid-template-columns: repeat(2, minmax(0, 1fr)); - gap: 1rem; -} - -.learn-info { - padding: 1.15rem; - border: 1px solid rgba(250, 248, 244, 0.12); - border-radius: 8px; - background: rgba(250, 248, 244, 0.04); -} - -.learn-info h3 { - font-size: 1.2rem; -} - -.learn-info p { - margin-top: 0.45rem; -} - -.learn-lesson-page .section { - padding-top: 2.2rem; -} - -.learn-lesson-page { - --learn-lesson-bar-top: 126px; -} - -.learn-lesson-shell { - max-width: 920px; - margin: 0 auto; -} - -.learn-lesson-bar { - position: sticky; - top: var(--learn-lesson-bar-top); - z-index: 80; - display: flex; - gap: 0.75rem; - align-items: center; - margin-bottom: 2rem; - padding: 0.55rem 0.72rem; - border: 1px solid rgba(250, 248, 244, 0.12); - border-radius: 999px; - background: rgba(10, 9, 12, 0.88); - backdrop-filter: blur(16px); -} - -.learn-lesson-menu { - width: 36px; - height: 36px; - border: 1px solid rgba(250, 248, 244, 0.1); - border-radius: 999px; - background: rgba(250, 248, 244, 0.045); - position: relative; -} - -.learn-lesson-menu::before, -.learn-lesson-menu::after { - content: ""; - position: absolute; - left: 10px; - width: 14px; - height: 1px; - background: rgba(247, 243, 234, 0.72); -} - -.learn-lesson-menu::before { - top: 13px; - box-shadow: 0 5px 0 rgba(247, 243, 234, 0.72); -} - -.learn-lesson-menu::after { - top: 23px; -} - -.learn-lesson-title { - display: flex; - align-items: center; - gap: 0.7rem; - min-width: 0; - flex: 0 1 auto; -} - -.learn-lesson-title img { - width: 30px; - height: 30px; - border-radius: 8px; - border: 1px solid rgba(250, 248, 244, 0.12); - background: rgba(250, 248, 244, 0.08); -} - -.learn-lesson-title strong, -.learn-lesson-title span { - display: block; - overflow: hidden; - text-overflow: ellipsis; - white-space: nowrap; -} - -.learn-lesson-title strong { - color: var(--color-fg); - font-size: 0.9rem; - line-height: 1.15; -} - -.learn-lesson-title span { - color: rgba(247, 243, 234, 0.55); - font-size: 0.78rem; - line-height: 1.25; -} - -.learn-lesson-top { - margin-left: auto; - padding-left: 0.9rem; - border-left: 1px solid rgba(250, 248, 244, 0.1); - color: rgba(247, 243, 234, 0.68); - font-size: 0.82rem; - font-weight: 650; - text-decoration: none; -} - -.learn-lesson-nav { - display: flex; - align-items: center; - gap: 0.4rem; - margin-left: auto; - padding-left: 0.85rem; - border-left: 1px solid rgba(250, 248, 244, 0.1); -} - -.learn-lesson-nav a, -.learn-lesson-nav span { - display: inline-flex; - align-items: center; - min-height: 2rem; - padding: 0 0.68rem; - border-radius: 999px; - color: rgba(247, 243, 234, 0.68); - font-size: 0.78rem; - font-weight: 700; - line-height: 1; - text-decoration: none; - white-space: nowrap; -} - -.learn-lesson-nav a { - border: 1px solid rgba(250, 248, 244, 0.1); - background: rgba(250, 248, 244, 0.045); -} - -.learn-lesson-nav a:hover, -.learn-lesson-nav a:focus-visible { - border-color: rgba(246, 201, 69, 0.28); - color: var(--color-fg); - background: rgba(250, 248, 244, 0.08); -} - -.learn-lesson-nav span { - color: rgba(247, 243, 234, 0.5); -} - -.learn-lesson-heading { - display: grid; - grid-template-columns: auto minmax(0, 1fr); - gap: 1.2rem; - align-items: center; - padding-bottom: 2rem; - border-bottom: 1px solid rgba(250, 248, 244, 0.1); -} - -.learn-lesson-number { - display: grid; - place-items: center; - width: 68px; - height: 68px; - border-radius: 999px; - background: rgba(246, 201, 69, 0.14); - color: var(--color-gold); - font-family: var(--font-mono); - font-size: 2rem; - font-weight: 800; -} - -.learn-lesson-heading small { - color: rgba(247, 243, 234, 0.56); - font-weight: 700; -} - -.learn-lesson-heading h1 { - margin-top: 0.2rem; - font-size: clamp(2.5rem, 5.5vw, 4rem); - line-height: 1; -} - -.learn-prose { - max-width: none; -} - -.learn-prose > * + * { - margin-top: 1.2rem; -} - -.learn-prose h2 { - margin-top: 3.2rem; - padding-top: 0.2rem; - font-size: 1.7rem; -} - -.learn-prose ul { - margin: 1rem 0; - padding-left: 1.25rem; -} - -.learn-prose li { - color: rgba(247, 243, 234, 0.7); -} - -.learn-code { - margin: 1rem 0 1.4rem; - overflow: hidden; - border: 1px solid rgba(250, 248, 244, 0.13); - border-radius: 8px; - background: rgba(6, 5, 7, 0.92); -} - -.learn-code-header { - display: flex; - align-items: center; - justify-content: space-between; - gap: 1rem; - min-height: 46px; - padding: 0.55rem 0.68rem 0.55rem 0.9rem; - border-bottom: 1px solid rgba(250, 248, 244, 0.1); - background: rgba(250, 248, 244, 0.025); -} - -.learn-code-title { - display: inline-flex; - align-items: center; - gap: 0.55rem; - min-width: 0; - color: rgba(247, 243, 234, 0.68); - font-size: 0.82rem; - font-weight: 650; -} - -.learn-code-title::before { - content: ""; - flex: 0 0 auto; - width: 16px; - height: 16px; - border: 1px solid rgba(250, 248, 244, 0.48); - border-radius: 3px; -} - -.learn-code[data-code-kind="terminal"] .learn-code-title::before { - border: 0; - border-radius: 0; - background: - linear-gradient(45deg, transparent 44%, rgba(250, 248, 244, 0.72) 46%, rgba(250, 248, 244, 0.72) 58%, transparent 60%) 0 2px / 8px 10px no-repeat, - linear-gradient(rgba(250, 248, 244, 0.72), rgba(250, 248, 244, 0.72)) 10px 12px / 8px 1.5px no-repeat; -} - -.learn-copy { - position: relative; - flex: 0 0 auto; - width: 36px; - height: 36px; - border: 1px solid rgba(250, 248, 244, 0.28); - border-radius: 6px; - background: rgba(250, 248, 244, 0.08); - color: rgba(250, 248, 244, 0.92); - cursor: pointer; - -webkit-appearance: none; - appearance: none; -} - -.learn-copy::before, -.learn-copy::after { - content: ""; - position: absolute; - width: 11px; - height: 13px; - border: 2px solid currentColor; - border-radius: 2px; -} - -.learn-copy::before { - left: 10px; - top: 8px; - opacity: 0.72; -} - -.learn-copy::after { - left: 14px; - top: 12px; - background: rgba(6, 5, 7, 0.92); -} - -.learn-copy:hover, -.learn-copy:focus-visible { - border-color: rgba(246, 201, 69, 0.62); - background: rgba(250, 248, 244, 0.14); - color: #fffdf9; -} - -.learn-copy[data-copy-state="copied"] { - border-color: rgba(62, 155, 101, 0.58); - color: #8fd4aa; -} - -.learn-copy[data-copy-state="failed"] { - border-color: rgba(244, 122, 40, 0.58); - color: #ffb17f; -} - -.learn-code pre { - padding: 1rem 1.1rem; - border: 0; - border-radius: 0; - background: transparent; - box-shadow: none; -} - -.learn-code pre code { - display: block; - min-width: max-content; - font-size: 0.9rem; - line-height: 1.6; -} - -.learn-callout { - padding: 1rem 1.1rem; - border: 1px solid rgba(246, 201, 69, 0.24); - border-radius: 8px; - background: rgba(246, 201, 69, 0.07); -} - -.learn-complete { - margin-top: 3rem; - padding: 2rem; - border: 1px solid rgba(250, 248, 244, 0.12); - border-radius: 8px; - background: rgba(250, 248, 244, 0.04); - text-align: center; -} - -.learn-complete h2 { - margin-top: 0; -} - -.learn-complete .button { - margin-top: 1.25rem; -} - -.docs-page .section { - padding: 2.2rem 0 4.5rem; -} - -.docs-page .docs-layout { - gap: 2.75rem; -} - -.docs-page .docs-layout[data-has-toc="true"] { - grid-template-columns: 300px minmax(0, 900px) 260px; -} - -.docs-page .docs-sidebar, -.docs-page .docs-toc { - border-color: rgba(250, 248, 244, 0.12); - background: rgba(250, 248, 244, 0.035); - box-shadow: none; -} - -.docs-page .docs-sidebar { - border-radius: 0; - border-width: 0 1px 0 0; - padding-right: 1.2rem; -} - -.docs-page .docs-toc { - border-radius: 0; - border-width: 0 0 0 1px; - padding-left: 1.2rem; -} - -.docs-page .docs-sidebar-header { - border-bottom-color: rgba(250, 248, 244, 0.1); -} - -.docs-page .docs-sidebar-title, -.docs-page .docs-toc-title, -.docs-page .docs-search-result-title, -.docs-page .docs-prevnext-title, -.docs-page .docs-content h1, -.docs-page .docs-content h2, -.docs-page .docs-content h3, -.docs-page .docs-content h4 { - color: var(--color-fg); -} - -.docs-page .docs-search { - border-color: rgba(250, 248, 244, 0.14); - background: rgba(250, 248, 244, 0.055); - color: var(--color-fg); -} - -.docs-page .docs-search::placeholder { - color: rgba(247, 243, 234, 0.44); -} - -.docs-page .docs-nav-section, -.docs-page .docs-search-result-meta, -.docs-page .docs-breadcrumb, -.docs-page .docs-prevnext-label, -.docs-page .spec-toc-title { - color: rgba(247, 243, 234, 0.48); -} - -.docs-page .docs-nav a, -.docs-page .docs-toc-list a, -.docs-page .spec-toc a { - color: rgba(247, 243, 234, 0.62); -} - -.docs-page .docs-nav a:hover, -.docs-page .docs-nav a:focus-visible, -.docs-page .docs-nav a[data-active="true"], -.docs-page .docs-toc-list a:hover, -.docs-page .docs-toc-list a:focus-visible, -.docs-page .spec-toc a:hover, -.docs-page .spec-toc a:focus-visible, -.docs-page .spec-toc a[data-active="true"] { - color: var(--color-fg); - background: rgba(250, 248, 244, 0.07); -} - -.docs-page .docs-content .prose, -.docs-page .spec-prose { - max-width: 92ch; -} - -.docs-page .docs-content .prose > h1:first-child, -.docs-page .spec-prose > h1:first-child { - font-size: 3.05rem; - line-height: 1.05; - letter-spacing: 0; -} - -.docs-page .docs-content p, -.docs-page .docs-content li, -.docs-page .docs-content dd, -.docs-page .spec-prose p, -.docs-page .spec-prose li, -.docs-page .spec-prose dd { - color: rgba(247, 243, 234, 0.68); -} - -.docs-layout .prose ul, -.docs-layout .prose ol, -.spec-prose ul, -.spec-prose ol { - display: grid; - gap: 0.55rem; - margin: 1.1rem 0; - padding: 0; - list-style: none; -} - -.docs-layout .prose li, -.spec-prose li { - position: relative; - margin: 0; - padding: 0.72rem 0.86rem 0.72rem 1rem; - border: 1px solid rgba(31, 31, 31, 0.1); - border-left: 2px solid rgba(246, 201, 69, 0.44); - border-radius: 8px; - background: rgba(255, 255, 255, 0.6); -} - -.docs-layout .prose li + li, -.spec-prose li + li { - margin-top: 0; -} - -.docs-layout .prose ol, -.spec-prose ol { - counter-reset: docs-ordered-list; -} - -.docs-layout .prose ol > li, -.spec-prose ol > li { - counter-increment: docs-ordered-list; - padding-left: 2.75rem; -} - -.docs-layout .prose ol > li::before, -.spec-prose ol > li::before { - content: counter(docs-ordered-list); - position: absolute; - left: 0.78rem; - top: 0.72rem; - display: inline-grid; - place-items: center; - min-width: 1.32rem; - height: 1.32rem; - padding: 0 0.18rem; - border: 1px solid rgba(246, 201, 69, 0.38); - border-radius: 999px; - background: rgba(246, 201, 69, 0.12); - color: var(--color-gold); - font-family: var(--font-mono); - font-size: 0.7rem; - font-weight: 800; - line-height: 1; -} - -.docs-layout .prose li > p:first-child, -.spec-prose li > p:first-child { - margin-top: 0; -} - -.docs-layout .prose li > p:last-child, -.spec-prose li > p:last-child { - margin-bottom: 0; -} - -.docs-layout .prose li > ul, -.docs-layout .prose li > ol, -.spec-prose li > ul, -.spec-prose li > ol { - gap: 0.42rem; - margin: 0.64rem 0 0; -} - -.docs-layout .prose li > ul > li, -.docs-layout .prose li > ol > li, -.spec-prose li > ul > li, -.spec-prose li > ol > li { - padding-top: 0.56rem; - padding-bottom: 0.56rem; - background: rgba(31, 31, 31, 0.035); -} - -.site-dark .docs-layout .prose li, -.site-dark .spec-prose li, -.docs-page .docs-layout .prose li, -.docs-page .spec-prose li { - border-color: rgba(250, 248, 244, 0.1); - border-left-color: rgba(246, 201, 69, 0.46); - background: rgba(250, 248, 244, 0.045); -} - -.site-dark .docs-layout .prose li > ul > li, -.site-dark .docs-layout .prose li > ol > li, -.site-dark .spec-prose li > ul > li, -.site-dark .spec-prose li > ol > li, -.docs-page .docs-layout .prose li > ul > li, -.docs-page .docs-layout .prose li > ol > li, -.docs-page .spec-prose li > ul > li, -.docs-page .spec-prose li > ol > li { - background: rgba(250, 248, 244, 0.035); -} - -.docs-page .docs-inline-ref { - color: var(--color-fg); - text-decoration-color: rgba(246, 201, 69, 0.35); -} - -.docs-page .docs-inline-code, -.docs-page .prose code { - background: rgba(250, 248, 244, 0.08); - color: rgba(247, 243, 234, 0.92); -} - -.docs-page .prose pre { - padding: 0; -} - -.docs-page .prose pre code, -.docs-page .prose pre code.hljs { - display: block; - padding: 1rem; - background: transparent; -} - -.docs-page .prose h1 code, -.docs-page .prose h2 code, -.docs-page .prose h3 code, -.docs-page .prose h4 code, -.docs-page .docs-nav code, -.docs-page .docs-breadcrumb code, -.docs-page .docs-search-result-title code, -.docs-page .docs-prevnext-title code { - background: transparent; - color: var(--color-gold); -} - -.docs-page .prose table { - border-color: rgba(250, 248, 244, 0.12); - background: rgba(250, 248, 244, 0.035); -} - -.docs-page .prose th, -.docs-page .prose td { - border-color: rgba(250, 248, 244, 0.1); -} - -.docs-page .prose th { - background: rgba(246, 201, 69, 0.08); -} - -.docs-page .prose tbody tr:nth-child(even) td { - background: rgba(250, 248, 244, 0.025); -} - -.docs-page .prose blockquote { - border-left-color: rgba(246, 201, 69, 0.42); -} - -.docs-page .prose details { - border-color: rgba(250, 248, 244, 0.12); - background: rgba(250, 248, 244, 0.045); -} - -.docs-page .prose summary:hover, -.docs-page .prose summary:focus-visible { - background: rgba(250, 248, 244, 0.07); -} - -.docs-page .docs-prevnext { - border-top-color: rgba(250, 248, 244, 0.1); -} - -.docs-page .docs-prevnext-link { - border-color: rgba(250, 248, 244, 0.12); - background: rgba(250, 248, 244, 0.045); -} - -.docs-page .docs-prevnext-link:hover, -.docs-page .docs-prevnext-link:focus-visible { - background: rgba(250, 248, 244, 0.08); -} - -@media (max-width: 980px) { - .learn-chapter-grid { - grid-template-columns: repeat(2, minmax(0, 1fr)); - } -} - -@media (max-width: 1180px) { - .tech-hero-copy h1, - .docs-hub-copy h1, - .coming-soon-copy h1, - .product-page .hero h1 { - font-size: 3.7rem; - } - - .tech-system-map { - opacity: 0.26; - width: 38vw; - } - - .technology-layout, - .technology-layout-reverse, - .docs-hub-tech, - .blog-placeholder { - grid-template-columns: 1fr; - } - - .technology-layout-reverse .technology-copy { - order: 0; - } - - .docs-link-groups, - .blog-lanes { - grid-template-columns: repeat(2, minmax(0, 1fr)); - } - - .docs-page .docs-layout, - .docs-page .docs-layout[data-has-toc="true"] { - grid-template-columns: 300px minmax(0, 1fr); - } - - .docs-page .docs-toc { - display: none; - } - - .docs-landing-shell { - grid-template-columns: 250px minmax(0, 1fr); - gap: 2rem; - } - - .docs-landing-toc { - display: none; - } -} - -@media (max-width: 820px) { - .tech-hero, - .docs-hub-hero, - .coming-soon { - min-height: auto; - } - - .tech-hero-copy, - .docs-hub-copy, - .coming-soon-copy { - padding: 4.25rem 0 3rem; - } - - .tech-hero-copy h1, - .docs-hub-copy h1, - .coming-soon-copy h1, - .product-page .hero h1, - .docs-page .docs-content .prose > h1:first-child, - .docs-page .spec-prose > h1:first-child { - font-size: 2.75rem; - line-height: 1.04; - } - - .tech-system-map { - display: none; - } - - .technology-section, - .docs-hub-section { - padding: 3.5rem 0; - } - - .technology-copy h2, - .docs-hub-tech-copy h2 { - font-size: 2.25rem; - } - - .technology-feature-list, - .docs-link-groups, - .blog-lanes, - .docs-flow { - grid-template-columns: 1fr; - } - - .docs-flow span { - width: 1px; - height: 28px; - justify-self: center; - } - - .docs-page .docs-sidebar, - .docs-page .docs-toc { - border-width: 1px; - border-radius: 8px; - } - - .docs-page .docs-layout, - .docs-page .docs-layout[data-has-toc="true"] { - grid-template-columns: minmax(0, 1fr); - } - - .docs-landing-shell { - display: block; - padding: 2rem var(--gutter) 3.5rem; - } - - .docs-landing-sidebar { - display: none; - } - - .docs-landing-content h1 { - font-size: 2.65rem; - } - - .docs-landing-content h2 { - font-size: 2rem; - } - - .docs-quick-select, - .docs-link-grid { - grid-template-columns: minmax(0, 1fr); - } - - .docs-tech-heading { - display: block; - } - - .docs-section-action { - margin-top: 1rem; - } - - .learn-hero-art { - margin-inline: calc(var(--gutter) * -1); - } - - .learn-section-heading { - display: block; - } - - .learn-section-heading p { - margin-top: 0.45rem; - } - - .learn-chapter-grid, - .learn-info-grid { - grid-template-columns: minmax(0, 1fr); - } - - .learn-lesson-bar { - position: static; - flex-wrap: wrap; - border-radius: 8px; - } - - .learn-lesson-title { - flex: 1 1 0; - } - - .learn-lesson-nav { - flex: 1 0 100%; - margin-left: 0; - padding: 0.55rem 0 0; - border-top: 1px solid rgba(250, 248, 244, 0.1); - border-left: 0; - } - - .learn-lesson-top { - display: none; - } - - .learn-lesson-heading { - grid-template-columns: minmax(0, 1fr); - } -} - -@media (max-width: 520px) { - .tech-hero-copy h1, - .docs-hub-copy h1, - .coming-soon-copy h1, - .product-page .hero h1 { - font-size: 2.35rem; - } - - .technology-feature-list li, - .technology-feature-list span, - .blog-placeholder, - .docs-link-group { - padding: 0.9rem; - } - - .runtime-command { - grid-template-columns: minmax(0, 1fr); - } - - .runtime-code-tabs pre { - max-height: 300px; - } - - .docs-sidebar-nav { - grid-template-columns: minmax(0, 1fr); - } - - .docs-landing-content h1 { - font-size: 2.25rem; - } - - .docs-landing-content h2 { - font-size: 1.8rem; - } - - .learn-page .hero { - padding-top: 3rem; - } - - .learn-course-panel { - width: calc(100% - 2rem); - padding: 1.1rem; - } - - .learn-current-row { - grid-template-columns: minmax(0, 1fr); - border-radius: 8px; - } - - .learn-current-dot { - display: none; - } - - .learn-chapter { - grid-template-columns: minmax(0, 1fr); - } - - .learn-lesson-number { - width: 56px; - height: 56px; - font-size: 1.55rem; - } - - .learn-code pre code { - font-size: 0.82rem; - } -} - -/* Oro editorial homepage */ -.editorial-layout { - --editorial-rail: 220px; - --editorial-column-gap: 4rem; - --editorial-page-max: 1440px; - min-height: 100vh; - display: grid; - grid-template-columns: var(--editorial-rail) minmax(0, 1fr); - grid-template-rows: minmax(0, 1fr) auto; - column-gap: var(--editorial-column-gap); - max-width: var(--editorial-page-max); - margin: 0 auto; - padding: 0 2rem; - background: linear-gradient(180deg, #fffdf9 0%, var(--color-bg) 52%, #f5eee1 100%); - color: var(--color-fg); -} - -.editorial-layout::before { - content: none; -} - -.editorial-layout .site-top { - grid-column: 1; - grid-row: 1; - position: sticky; - top: 0; - align-self: start; - height: fit-content; - padding-top: 6rem; - background: transparent; - border-bottom: 0; - box-shadow: none; - backdrop-filter: none; -} - -.editorial-layout .site-top .container, -.editorial-layout .site-top .container-wide { - max-width: none; - padding: 0; -} - -.editorial-layout .site-header { - flex-direction: column; - align-items: flex-start; - justify-content: flex-start; - gap: 4rem; - min-height: 0; -} - -.editorial-layout .brand { - color: var(--color-fg); -} - -.editorial-layout .brand-mark { - width: 30px; - height: 30px; - border-color: rgba(31, 31, 31, 0.14); - background: rgba(255, 255, 255, 0.72); -} - -.editorial-layout .brand-name { - font-size: 1.48rem; -} - -.editorial-layout .nav { - flex-direction: column; - align-items: flex-start; - gap: 0.4rem; - margin-left: 0; - color: rgba(31, 31, 31, 0.55); - font-size: 0.88rem; - line-height: 1.2; -} - -.editorial-layout .nav a { - padding: 0.22rem 0; -} - -.editorial-layout .nav a::after { - display: none; -} - -.editorial-layout .nav a:hover, -.editorial-layout .nav a:focus-visible { - color: var(--color-fg); -} - -.editorial-main { - grid-column: 2; - grid-row: 1; - min-width: 0; - padding: 6rem 0 0; -} - -.editorial-layout .section-kicker { - margin: 0; - color: var(--color-purple); - font-size: 0.78rem; - font-weight: 760; - letter-spacing: 0.08em; -} - -.editorial-hero { - max-width: 760px; - padding-bottom: 5rem; -} - -.editorial-hero h1 { - max-width: 760px; - margin: 0; - font-family: var(--font-display); - font-size: 5.6rem; - font-weight: 820; - line-height: 0.95; - letter-spacing: 0; -} - -.editorial-hero p:not(.section-kicker) { - max-width: 650px; - margin: 1.35rem 0 0; - color: var(--color-muted); - font-size: 1.1rem; - line-height: 1.65; -} - -.editorial-actions { - display: flex; - flex-wrap: wrap; - gap: 0.75rem; - margin-top: 1.8rem; -} - -.editorial-layout .button { - min-height: 44px; - border-radius: var(--radius); - font-size: 0.94rem; -} - -.editorial-layout .button-primary { - border-color: rgba(31, 31, 31, 0.9); - background: var(--color-fg); - color: var(--color-bg); - box-shadow: 0 14px 32px rgba(31, 31, 31, 0.14); +.docs-page .prose h1 code, +.docs-page .prose h2 code, +.docs-page .prose h3 code, +.docs-page .prose h4 code, +.docs-page .docs-nav code, +.docs-page .docs-breadcrumb code, +.docs-page .docs-search-result-title code, +.docs-page .docs-prevnext-title code { + background: transparent; + color: var(--color-gold); } -.editorial-layout .button-primary:hover, -.editorial-layout .button-primary:focus-visible { - border-color: rgba(31, 31, 31, 0.9); - background: #000; - color: var(--color-bg); +.docs-page .prose table { + border-color: rgba(250, 248, 244, 0.12); + background: rgba(250, 248, 244, 0.035); } -.editorial-layout .button-quiet { - border-color: rgba(31, 31, 31, 0.14); - background: rgba(255, 255, 255, 0.54); - color: var(--color-fg); +.docs-page .prose th, +.docs-page .prose td { + border-color: rgba(250, 248, 244, 0.1); } -.editorial-layout .button-quiet:hover, -.editorial-layout .button-quiet:focus-visible { - border-color: rgba(31, 31, 31, 0.24); - background: rgba(255, 255, 255, 0.84); +.docs-page .prose th { + background: rgba(246, 201, 69, 0.08); } -.editorial-products { - padding: 0 0 4.5rem; +.docs-page .prose tbody tr:nth-child(even) td { + background: rgba(250, 248, 244, 0.025); } -.editorial-section-heading { - margin-bottom: 1.4rem; +.docs-page .prose blockquote { + border-left-color: rgba(246, 201, 69, 0.42); } -.editorial-section-heading h2 { - margin: 0; - font-family: var(--font-display); - font-size: 2.65rem; - font-weight: 740; - line-height: 1.08; - letter-spacing: 0; +.docs-page .prose details { + border-color: rgba(250, 248, 244, 0.12); + background: rgba(250, 248, 244, 0.045); } -.editorial-product { - display: grid; - grid-template-columns: 64px minmax(0, 760px); - gap: 2rem; - align-items: start; - padding: 1.8rem 0; - border-top: 1px solid rgba(31, 31, 31, 0.12); +.docs-page .prose summary:hover, +.docs-page .prose summary:focus-visible { + background: rgba(250, 248, 244, 0.07); } -.editorial-product:last-child { - border-bottom: 1px solid rgba(31, 31, 31, 0.12); +.docs-page .docs-prevnext { + border-top-color: rgba(250, 248, 244, 0.1); } -.editorial-product-index { - color: rgba(91, 59, 162, 0.84); - font-family: var(--font-mono); - font-size: 0.84rem; - font-weight: 720; - line-height: 1.9; +.docs-page .docs-prevnext-link { + border-color: rgba(250, 248, 244, 0.12); + background: rgba(250, 248, 244, 0.045); } -.editorial-product h3 { - margin: 0; - font-family: var(--font-display); - font-size: 1.55rem; - font-weight: 740; - line-height: 1.15; +.docs-page .docs-prevnext-link:hover, +.docs-page .docs-prevnext-link:focus-visible { + background: rgba(250, 248, 244, 0.08); } -.editorial-product p { - max-width: 560px; - margin: 0.55rem 0 0; - color: var(--color-muted); - line-height: 1.62; -} +@media (max-width: 1180px) { + .tech-hero-copy h1, + .docs-hub-copy h1, + .coming-soon-copy h1, + .product-page .hero h1 { + font-size: 3.7rem; + } -.editorial-product-links { - display: flex; - justify-content: flex-end; - gap: 0.5rem; - flex-wrap: wrap; -} + .tech-system-map { + opacity: 0.26; + width: 38vw; + } -.editorial-product-links a { - display: inline-flex; - align-items: center; - min-height: 34px; - padding: 0.42rem 0.68rem; - border: 1px solid rgba(31, 31, 31, 0.12); - border-radius: 999px; - background: rgba(255, 255, 255, 0.46); - color: rgba(31, 31, 31, 0.72); - text-decoration: none; - font-size: 0.82rem; - font-weight: 680; - line-height: 1.1; -} + .technology-layout, + .technology-layout-reverse, + .docs-hub-tech, + .blog-placeholder { + grid-template-columns: 1fr; + } -.editorial-product-links a:hover, -.editorial-product-links a:focus-visible { - border-color: rgba(91, 59, 162, 0.34); - background: rgba(255, 255, 255, 0.78); - color: var(--color-fg); -} + .technology-layout-reverse .technology-copy { + order: 0; + } -.editorial-footer { - grid-column: 1 / -1; - display: grid; - grid-template-columns: var(--editorial-rail) minmax(0, 1fr) auto; - gap: var(--editorial-column-gap); - align-items: center; - padding: 2.5rem 0 4rem; - border-top: 1px solid rgba(31, 31, 31, 0.12); - color: rgba(31, 31, 31, 0.58); - font-size: 0.88rem; - line-height: 1.35; -} + .docs-link-groups, + .blog-lanes { + grid-template-columns: repeat(2, minmax(0, 1fr)); + } -.editorial-footer-contact { - display: grid; - gap: 0.4rem; -} + .docs-page .docs-layout, + .docs-page .docs-layout[data-has-toc="true"] { + grid-template-columns: 300px minmax(0, 1fr); + } -.editorial-footer-contact span { - color: var(--color-fg); - font-weight: 720; -} + .docs-page .docs-toc { + display: none; + } -.editorial-footer a { - color: rgba(31, 31, 31, 0.62); - text-decoration: none; -} + .docs-landing-shell { + grid-template-columns: 250px minmax(0, 1fr); + gap: 2rem; + } -.editorial-footer a:hover, -.editorial-footer a:focus-visible { - color: var(--color-fg); + .docs-landing-toc { + display: none; + } } -.editorial-footer-links { - display: flex; - flex-wrap: wrap; - gap: 0.95rem; - align-items: center; -} +@media (max-width: 820px) { + .tech-hero, + .docs-hub-hero, + .coming-soon { + min-height: auto; + } -.editorial-footer-links:last-child { - justify-content: flex-end; -} + .tech-hero-copy, + .docs-hub-copy, + .coming-soon-copy { + padding: 4.25rem 0 3rem; + } -@media (max-width: 1080px) { - .editorial-layout { - --editorial-rail: 180px; - --editorial-column-gap: 2.5rem; + .tech-hero-copy h1, + .docs-hub-copy h1, + .coming-soon-copy h1, + .product-page .hero h1, + .docs-page .docs-content .prose > h1:first-child, + .docs-page .spec-prose > h1:first-child { + font-size: 2.75rem; + line-height: 1.04; } - .editorial-hero h1 { - font-size: 4.6rem; + .tech-system-map { + display: none; } - .editorial-product { - grid-template-columns: 48px minmax(0, 1fr); + .technology-section, + .docs-hub-section { + padding: 3.5rem 0; } -} -@media (max-width: 940px) { - .editorial-layout { - display: block; - padding: 0; + .technology-copy h2, + .docs-hub-tech-copy h2 { + font-size: 2.25rem; } - .editorial-layout .site-top { - position: sticky; - top: 0; - padding-top: 0; - background: rgba(250, 248, 244, 0.92); - border-bottom: 1px solid rgba(31, 31, 31, 0.08); - backdrop-filter: blur(16px); + .technology-feature-list, + .docs-link-groups, + .blog-lanes, + .docs-flow { + grid-template-columns: 1fr; } - .editorial-layout .site-top .container, - .editorial-layout .site-top .container-wide { - max-width: none; - padding: 0 var(--gutter); + .docs-flow span { + width: 1px; + height: 28px; + justify-self: center; } - .editorial-layout .site-header { - min-height: 68px; - flex-direction: row; - align-items: center; - gap: 1rem; + .docs-page .docs-sidebar, + .docs-page .docs-toc { + border-width: 1px; + border-radius: 8px; } - .editorial-layout .nav { - flex: 1 1 100%; - flex-direction: row; - flex-wrap: nowrap; - gap: 0.72rem; - width: 100%; - padding: 0 0 0.75rem; - overflow-x: auto; - font-size: 0.82rem; - white-space: nowrap; - scrollbar-width: none; + .docs-page .docs-layout, + .docs-page .docs-layout[data-has-toc="true"] { + grid-template-columns: minmax(0, 1fr); } - .editorial-layout .nav::-webkit-scrollbar { - display: none; + .docs-landing-shell { + display: block; + padding: 2rem var(--gutter) 3.5rem; } - .editorial-main { - padding: 3.75rem var(--gutter) 0; + .docs-landing-sidebar { + display: none; } - .editorial-hero { - padding-bottom: 3.5rem; + .docs-landing-content h1 { + font-size: 2.65rem; } - .editorial-hero h1 { - font-size: 3.8rem; + .docs-landing-content h2 { + font-size: 2rem; } - .editorial-section-heading, - .editorial-product { + .docs-quick-select, + .docs-link-grid { grid-template-columns: minmax(0, 1fr); - gap: 0.8rem; } - .editorial-footer { - display: grid; - grid-template-columns: minmax(0, 1fr); - gap: 1.35rem; - padding: 2rem var(--gutter) 3rem; + .docs-tech-heading { + display: block; } - .editorial-footer-links:last-child { - justify-content: flex-start; + .docs-section-action { + margin-top: 1rem; } } -@media (max-width: 560px) { - .editorial-main { - padding-top: 3rem; +@media (max-width: 520px) { + .tech-hero-copy h1, + .docs-hub-copy h1, + .coming-soon-copy h1, + .product-page .hero h1 { + font-size: 2.35rem; } - .editorial-hero h1 { - font-size: 3rem; - line-height: 1.02; + .technology-feature-list li, + .technology-feature-list span, + .blog-placeholder, + .docs-link-group { + padding: 0.9rem; } - .editorial-hero p:not(.section-kicker) { - font-size: 1rem; + .runtime-command { + grid-template-columns: minmax(0, 1fr); } - .editorial-actions .button { - width: 100%; + .runtime-code-tabs pre { + max-height: 300px; + } + + .docs-sidebar-nav { + grid-template-columns: minmax(0, 1fr); } - .editorial-section-heading h2 { - font-size: 2.1rem; + .docs-landing-content h1 { + font-size: 2.25rem; } - .editorial-product { - padding: 1.45rem 0; + .docs-landing-content h2 { + font-size: 1.8rem; } } @@ -5155,7 +3342,6 @@ body:not(.editorial-layout) .hero-grid { } body:not(.editorial-layout) .hero-copy, -body:not(.editorial-layout) .learn-hero, body:not(.editorial-layout) .coming-soon-copy { max-width: 840px; padding: 0; @@ -5189,7 +3375,6 @@ body:not(.editorial-layout) .docs-landing-content h1 { } body:not(.editorial-layout) .hero-copy p, -body:not(.editorial-layout) .learn-hero p, body:not(.editorial-layout) .docs-landing-intro > p:not(.docs-landing-kicker), body:not(.editorial-layout) .docs-tech-summary { max-width: 680px; @@ -5255,13 +3440,7 @@ body:not(.editorial-layout) .docs-sidebar, body:not(.editorial-layout) .docs-toc, body:not(.editorial-layout) .docs-prevnext-link, body:not(.editorial-layout) .docs-quick-select a, -body:not(.editorial-layout) .docs-link-block, -body:not(.editorial-layout) .learn-course-panel, -body:not(.editorial-layout) .learn-info, -body:not(.editorial-layout) .learn-current-row, -body:not(.editorial-layout) .learn-lesson-bar, -body:not(.editorial-layout) .learn-code, -body:not(.editorial-layout) .learn-callout { +body:not(.editorial-layout) .docs-link-block { border-color: rgba(31, 31, 31, 0.12); background: rgba(255, 255, 255, 0.5); box-shadow: none; @@ -5441,10 +3620,6 @@ body:not(.editorial-layout).docs-page .spec-prose > h1:first-child { color: var(--color-fg); } -body:not(.editorial-layout) .learn-hero-art { - display: none; -} - body:not(.editorial-layout) .button, body:not(.editorial-layout) .site-subnav-parent, body:not(.editorial-layout) .site-subnav-links a, @@ -5458,13 +3633,7 @@ body:not(.editorial-layout) .docs-search-result, body:not(.editorial-layout) .docs-prevnext-link, body:not(.editorial-layout) .docs-quick-select a, body:not(.editorial-layout) .docs-link-block a, -body:not(.editorial-layout) .docs-section-action, -body:not(.editorial-layout) .learn-course-panel, -body:not(.editorial-layout) .learn-info, -body:not(.editorial-layout) .learn-current-row, -body:not(.editorial-layout) .learn-lesson-bar, -body:not(.editorial-layout) .learn-code, -body:not(.editorial-layout) .learn-callout { +body:not(.editorial-layout) .docs-section-action { border-radius: var(--radius); } @@ -5486,14 +3655,12 @@ body:not(.editorial-layout) pre { body:not(.editorial-layout) pre code, body:not(.editorial-layout) pre code.hljs, body:not(.editorial-layout).docs-page .prose pre code, -body:not(.editorial-layout).docs-page .prose pre code.hljs, -body:not(.editorial-layout) .learn-code pre code { +body:not(.editorial-layout).docs-page .prose pre code.hljs { background: transparent; color: inherit; } -body:not(.editorial-layout).docs-page .prose pre, -body:not(.editorial-layout) .learn-code pre { +body:not(.editorial-layout).docs-page .prose pre { border-radius: var(--radius); background: linear-gradient(180deg, #171513 0%, #241d31 100%); color: rgba(250, 248, 244, 0.94); @@ -5573,16 +3740,6 @@ body:not(.editorial-layout) .docs-tech-heading h2, body:not(.editorial-layout) .docs-quick-select span, body:not(.editorial-layout) .docs-link-block h3, body:not(.editorial-layout) .docs-link-block span, -body:not(.editorial-layout) .learn-section-heading h2, -body:not(.editorial-layout) .learn-course-panel h2, -body:not(.editorial-layout) .learn-current-row strong, -body:not(.editorial-layout) .learn-chapter strong, -body:not(.editorial-layout) .learn-info h3, -body:not(.editorial-layout) .learn-lesson-heading h1, -body:not(.editorial-layout) .learn-lesson-title strong, -body:not(.editorial-layout) .learn-prose h2, -body:not(.editorial-layout) .learn-prose h3, -body:not(.editorial-layout) .learn-complete h2, body:not(.editorial-layout).docs-page .docs-sidebar-title, body:not(.editorial-layout).docs-page .docs-toc-title, body:not(.editorial-layout).docs-page .docs-search-result-title, @@ -5609,19 +3766,6 @@ body:not(.editorial-layout) .docs-landing-content p, body:not(.editorial-layout) .docs-tech-summary, body:not(.editorial-layout) .docs-quick-select small, body:not(.editorial-layout) .docs-link-block small, -body:not(.editorial-layout) .learn-hero .lede, -body:not(.editorial-layout) .learn-section-heading p, -body:not(.editorial-layout) .learn-course-panel p, -body:not(.editorial-layout) .learn-current-row span, -body:not(.editorial-layout) .learn-chapter > span:not(.learn-chapter-number) > span, -body:not(.editorial-layout) .learn-info p, -body:not(.editorial-layout) .learn-lesson-title span, -body:not(.editorial-layout) .learn-lesson-heading small, -body:not(.editorial-layout) .learn-prose p, -body:not(.editorial-layout) .learn-prose li, -body:not(.editorial-layout) .learn-callout, -body:not(.editorial-layout) .learn-callout p, -body:not(.editorial-layout) .learn-complete p, body:not(.editorial-layout).docs-page .docs-content p, body:not(.editorial-layout).docs-page .docs-content li, body:not(.editorial-layout).docs-page .docs-content dd, @@ -5642,10 +3786,7 @@ body:not(.editorial-layout).docs-page .spec-toc-title { body:not(.editorial-layout).docs-page .docs-nav a, body:not(.editorial-layout).docs-page .docs-toc-list a, -body:not(.editorial-layout).docs-page .spec-toc a, -body:not(.editorial-layout) .learn-lesson-top, -body:not(.editorial-layout) .learn-lesson-nav a, -body:not(.editorial-layout) .learn-lesson-nav span { +body:not(.editorial-layout).docs-page .spec-toc a { color: rgba(31, 31, 31, 0.64); } @@ -5656,11 +3797,7 @@ body:not(.editorial-layout).docs-page .docs-toc-list a:hover, body:not(.editorial-layout).docs-page .docs-toc-list a:focus-visible, body:not(.editorial-layout).docs-page .spec-toc a:hover, body:not(.editorial-layout).docs-page .spec-toc a:focus-visible, -body:not(.editorial-layout).docs-page .spec-toc a[data-active="true"], -body:not(.editorial-layout) .learn-lesson-top:hover, -body:not(.editorial-layout) .learn-lesson-top:focus-visible, -body:not(.editorial-layout) .learn-lesson-nav a:hover, -body:not(.editorial-layout) .learn-lesson-nav a:focus-visible { +body:not(.editorial-layout).docs-page .spec-toc a[data-active="true"] { background: rgba(31, 31, 31, 0.05); color: var(--color-fg); } @@ -5674,10 +3811,6 @@ body:not(.editorial-layout).product-page .section, body:not(.editorial-layout) .docs-landing-intro, body:not(.editorial-layout) .docs-tech-section, body:not(.editorial-layout) .docs-link-block, -body:not(.editorial-layout) .learn-hero-art, -body:not(.editorial-layout) .learn-lesson-heading, -body:not(.editorial-layout) .learn-lesson-top, -body:not(.editorial-layout) .learn-lesson-nav, body:not(.editorial-layout).docs-page .docs-sidebar-header, body:not(.editorial-layout).docs-page .docs-prevnext { border-color: rgba(31, 31, 31, 0.1); @@ -5691,14 +3824,6 @@ body:not(.editorial-layout) .docs-link-group a, body:not(.editorial-layout) .blog-lanes article, body:not(.editorial-layout) .blog-placeholder, body:not(.editorial-layout) .docs-flow div, -body:not(.editorial-layout) .learn-course-panel, -body:not(.editorial-layout) .learn-current-row, -body:not(.editorial-layout) .learn-chapter, -body:not(.editorial-layout) .learn-info, -body:not(.editorial-layout) .learn-lesson-bar, -body:not(.editorial-layout) .learn-lesson-menu, -body:not(.editorial-layout) .learn-lesson-nav a, -body:not(.editorial-layout) .learn-complete, body:not(.editorial-layout).docs-page .docs-search, body:not(.editorial-layout).docs-page .docs-search-result, body:not(.editorial-layout).docs-page .docs-prevnext-link, @@ -5707,32 +3832,6 @@ body:not(.editorial-layout).docs-page .prose details { background: rgba(255, 255, 255, 0.5); } -body:not(.editorial-layout) .learn-lesson-menu::before, -body:not(.editorial-layout) .learn-lesson-menu::after { - background: rgba(31, 31, 31, 0.72); -} - -body:not(.editorial-layout) .learn-lesson-menu::before { - box-shadow: 0 5px 0 rgba(31, 31, 31, 0.72); -} - -body:not(.editorial-layout) .learn-lesson-title img { - border-color: rgba(31, 31, 31, 0.12); - background: rgba(255, 255, 255, 0.56); -} - -body:not(.editorial-layout) .learn-code { - border-color: rgba(246, 201, 69, 0.22); - background: linear-gradient(180deg, #171513 0%, #241d31 100%); - color: rgba(250, 248, 244, 0.94); -} - -body:not(.editorial-layout) .learn-code-header { - border-bottom-color: rgba(250, 248, 244, 0.1); - background: rgba(250, 248, 244, 0.035); -} - -body:not(.editorial-layout) .learn-code-title, body:not(.editorial-layout) .learn-copy { color: rgba(250, 248, 244, 0.72); } @@ -5791,38 +3890,38 @@ body:not(.editorial-layout).docs-page .prose tbody tr:nth-child(even) td { background: rgba(31, 31, 31, 0.035); } -body:not(.editorial-layout) .nav .menu-panel { +body:not(.editorial-layout) .site-header .menu-panel { border-color: rgba(31, 31, 31, 0.12); background: rgba(255, 255, 255, 0.96); color: var(--color-fg); box-shadow: 0 18px 42px rgba(31, 31, 31, 0.12); } -body:not(.editorial-layout) .nav .menu-item { +body:not(.editorial-layout) .site-header .menu-item { position: relative; padding: 0.54rem 0.62rem; border-radius: var(--radius); color: var(--color-fg); } -body:not(.editorial-layout) .nav .menu-item::after { +body:not(.editorial-layout) .site-header .menu-item::after { content: none; display: none; } -body:not(.editorial-layout) .nav .menu-item:hover, -body:not(.editorial-layout) .nav .menu-item:focus-visible { +body:not(.editorial-layout) .site-header .menu-item:hover, +body:not(.editorial-layout) .site-header .menu-item:focus-visible { border-color: rgba(31, 31, 31, 0.12); background: rgba(31, 31, 31, 0.06); color: var(--color-fg); } -body:not(.editorial-layout) .nav .menu-item small, -body:not(.editorial-layout) .nav .menu-hint { +body:not(.editorial-layout) .site-header .menu-item small, +body:not(.editorial-layout) .site-header .menu-hint { color: rgba(31, 31, 31, 0.58); } -body:not(.editorial-layout) .nav .menu-sep { +body:not(.editorial-layout) .site-header .menu-sep { background: rgba(31, 31, 31, 0.1); } @@ -5847,3 +3946,14 @@ body:not(.editorial-layout) .nav .menu-sep { .markdown-alert-warning, .markdown-alert-caution { border-color: var(--color-orange); } .docs-tab-anchor { display: block; scroll-margin-top: var(--site-top-offset, 144px); } + +/* The Ask AI panel is a sibling of the scrolling nav, anchored by its client. */ +.ask-ai-panel { + font-size: 0.82rem; + font-weight: 650; + right: auto; + min-width: min(224px, calc(100vw - 16px)); + max-width: calc(100vw - 16px); + max-height: calc(100dvh - 160px); + overflow-y: auto; +} diff --git a/src/layouts/docs.layout.client.ts b/src/layouts/docs.layout.client.ts index 04294aab..c0aa4770 100644 --- a/src/layouts/docs.layout.client.ts +++ b/src/layouts/docs.layout.client.ts @@ -1,7 +1,8 @@ +import { initAskAiMenu } from '../lib/ask-ai-client.ts' import { legacyTarget } from '../lib/legacy.ts' import { enhanceSidebar } from '../lib/sidebar-client.ts' -import '../lib/learn-client.js' -import { renderTabs } from '../lib/tabs.js' +import { initLearn } from '../lib/learn-client.ts' +import { renderTabs } from '../lib/tabs.ts' import { enhanceArticle } from '../lib/article-client.ts' const app = document.querySelector<HTMLElement>('[data-docs-app]') if (app) { @@ -20,10 +21,7 @@ if (app) { } const content = app.querySelector<HTMLElement>('[data-docs-content]')! renderTabs(content) - const oro = globalThis as typeof globalThis & { - oroInitTabs?: (root: HTMLElement) => void - } - oro.oroInitTabs?.(content) + initLearn(content) enhanceArticle(app) enhanceSidebar(app) const input = app.querySelector<HTMLInputElement>('[data-docs-search]')! @@ -51,7 +49,13 @@ if (app) { return r.json() }) .then((data) => data.items) - const docs = await index + const pending = index + // Evict failures even when the query was cleared while fetching. An older + // request must never evict a replacement cached by a later input event. + void pending.catch(() => { + if (index === pending) index = undefined + }) + const docs = await pending if (current !== version) return const scored = docs .map((d) => ({ @@ -88,7 +92,6 @@ if (app) { results.textContent = 'Search is unavailable. Browse the navigation below.' nav.hidden = false - index = undefined } } }) @@ -109,3 +112,5 @@ function revealHashTarget() { } revealHashTarget() addEventListener('hashchange', revealHashTarget) + +initAskAiMenu() diff --git a/src/layouts/docs.layout.ts b/src/layouts/docs.layout.ts index 54d767b6..2865bec7 100644 --- a/src/layouts/docs.layout.ts +++ b/src/layouts/docs.layout.ts @@ -1,68 +1,15 @@ import { html, raw, render } from 'fragtml' -import { load } from 'cheerio' +import { article } from '../lib/rendering.ts' import type { LayoutFunction } from '@domstack/static/types.js' import { collections, sectionTitle, - type Collection, } from '../lib/collections.ts' -import { rawUrl, type Doc, type DocsData } from '../lib/docs.ts' +import { rawUrl, type DocLink, type Navigation, type DocVars } from '../lib/docs.ts' export const parentLayout = 'root' -export const vars = { dataDeps: ['docs'] } -export function article( - content: string, - spec = false, -): { body: string; toc: string } { - const $ = load(content, {}, false) - const headings: { id: string; title: string; level: string }[] = [] - $('h2,h3,h4,h5').each((_i, h) => { - const id = $(h).attr('id') || '' - const title = $(h).text() - if (id) { - headings.push({ id, title, level: h.tagName }) - $(h).append( - render( - html`<a - class="docs-heading-anchor" - href="#${id}" - aria-label="Link to this section" - >#</a - >`, - ), - ) - } - }) - return { - body: $.html(), - toc: render( - spec - ? html`<div class="spec-toc-title">Table of contents</div> - <div class="spec-toc"> - ${headings.map( - (h) => - html`<a - href="#${h.id}" - data-level="${h.level}" - data-id="${h.id}" - >${h.title}</a - >`, - )} - </div>` - : html`<div class="docs-toc-title">On this page</div> - <ul class="docs-toc-list"> - ${headings - .filter((h) => ['h2', 'h3'].includes(h.level)) - .map( - (h) => - html`<li data-level="${h.level}"> - <a href="#${h.id}">${h.title}</a> - </li>`, - )} - </ul>`, - ), - } -} -function prevNext(doc: Doc | undefined, label: string): string { +// Asset-bearing parent: collection wrappers render the documentation shell. +const docsLayout: LayoutFunction<Record<string, unknown>, string> = ({ children }) => children +function prevNext(doc: DocLink | null, label: string): string { return doc ? render( html`<a class="docs-prevnext-link" href="${doc.url}" @@ -72,23 +19,13 @@ function prevNext(doc: Doc | undefined, label: string): string { ) : '' } -const docsLayout: LayoutFunction< - Record<string, any>, - string, - string, - DocsData -> = ({ vars: v, children, data }) => { - const collection = v.docsCollection as Collection - const c = collections[collection] - const docs = data.docs[collection] - const idx = docs.findIndex((d) => d.sourcePath === v.sourcePath) - const doc = docs[idx] - const sections = [...new Set(docs.map((d) => d.section))] +export function renderDocs(v: DocVars, children: string, navigation: Navigation): string { + const c = collections[v.docsCollection] + const doc = navigation.bySource[v.sourcePath] + if (!doc) throw new Error(`Missing navigation document: ${v.docsCollection}/${v.sourcePath}`) + const sections = navigation.sections const { body, toc } = article(children) - const legacy = - doc.id === 'start' - ? JSON.stringify(Object.fromEntries(docs.map((d) => [d.id, d.url]))) - : '' + const legacy = doc.id === 'start' ? JSON.stringify(navigation.legacy) : '' return render( html`<main id="main"> <section class="section"> @@ -116,11 +53,9 @@ const docsLayout: LayoutFunction< <nav class="docs-nav" data-docs-nav> ${sections.map( (s) => - html`<div class="docs-nav-section">${sectionTitle(s)}</div> + html`<div class="docs-nav-section">${s.title}</div> <ul class="docs-nav-list"> - ${docs - .filter((d) => d.section === s) - .map( + ${s.items.map( (d) => html`<li> <a @@ -156,17 +91,17 @@ const docsLayout: LayoutFunction< > · <a - href="https://github.com/oro-computer/website/blob/master/src${doc.url}page.md" + href="${doc.editUrl}" >Edit this page</a > · <a href="${rawUrl(doc)}">View Markdown</a> </p> <div class="docs-prevnext"> <div class="docs-prevnext-item" data-docs-prev> - ${raw(prevNext(docs[idx - 1], 'Previous'))} + ${raw(prevNext(doc.previous, 'Previous'))} </div> <div class="docs-prevnext-item" data-docs-next> - ${raw(prevNext(docs[idx + 1], 'Next'))} + ${raw(prevNext(doc.next, 'Next'))} </div> </div> </article> diff --git a/src/layouts/learn.layout.client.ts b/src/layouts/learn.layout.client.ts index 31da9879..61abbd96 100644 --- a/src/layouts/learn.layout.client.ts +++ b/src/layouts/learn.layout.client.ts @@ -1 +1,3 @@ -import '../lib/learn-client.js' +import { initLearn } from '../lib/learn-client.ts' + +initLearn() diff --git a/src/layouts/learn.layout.css b/src/layouts/learn.layout.css new file mode 100644 index 00000000..e60e1a7a --- /dev/null +++ b/src/layouts/learn.layout.css @@ -0,0 +1,732 @@ +/* Learn layout rules, in their original cascade order. Shared tabs and copy controls remain global. */ +.learn-page .hero { + padding: clamp(4rem, 7vw, 6.5rem) 0 3rem; +} + +.learn-hero { + position: relative; + z-index: 1; + max-width: 780px; + margin: 0 auto; + text-align: center; +} + +.learn-hero h1 { + max-width: none; + margin-top: 1rem; + font-size: clamp(3.1rem, 7vw, 5.7rem); + line-height: 0.98; + letter-spacing: 0; +} + +.learn-hero .lede { + max-width: 62ch; + margin: 1.15rem auto 0; +} + +.learn-hero-actions { + justify-content: center; +} + +.learn-hero-art { + position: relative; + display: grid; + place-items: center; + min-height: clamp(18rem, 31vw, 28rem); + margin-top: clamp(2rem, 5vw, 4rem); + overflow: hidden; + border-bottom: 1px solid rgba(250, 248, 244, 0.08); + background: + linear-gradient(rgba(250, 248, 244, 0.035) 1px, transparent 1px), + linear-gradient(90deg, rgba(250, 248, 244, 0.035) 1px, transparent 1px), + radial-gradient(60% 80% at 50% 110%, rgba(62, 155, 101, 0.28), transparent 58%), + radial-gradient(80% 90% at 50% 115%, rgba(91, 59, 162, 0.18), transparent 64%); + background-size: 56px 56px, 56px 56px, auto, auto; +} + +.learn-course-panel { + position: relative; + width: min(100%, 560px); + padding: 1.4rem; + border: 1px solid rgba(250, 248, 244, 0.12); + border-radius: 8px; + background: rgba(12, 11, 14, 0.86); + box-shadow: 0 28px 80px rgba(0, 0, 0, 0.36); +} + +.learn-course-mark { + display: grid; + place-items: center; + width: 72px; + height: 72px; + margin: -3rem auto 1.1rem; + border: 1px solid rgba(250, 248, 244, 0.16); + border-radius: 8px; + background: + linear-gradient(135deg, rgba(250, 248, 244, 0.96), rgba(250, 248, 244, 0.78)), + linear-gradient(135deg, rgba(246, 201, 69, 0.3), rgba(91, 59, 162, 0.22)); +} + +.learn-course-mark img { + width: 42px; + height: 42px; +} + +.learn-course-panel h2 { + text-align: center; +} + +.learn-course-panel p { + max-width: 44ch; + margin: 0.55rem auto 0; + text-align: center; +} + +.learn-current-row { + display: grid; + grid-template-columns: minmax(0, 1fr) auto; + gap: 1rem; + align-items: center; + margin: 1.4rem auto 0; + padding: 0.82rem 0.95rem; + max-width: 380px; + border: 1px solid rgba(250, 248, 244, 0.1); + border-radius: 999px; + background: rgba(250, 248, 244, 0.06); + text-align: left; +} + +.learn-current-row strong { + display: block; + color: var(--color-fg); + line-height: 1.2; +} + +.learn-current-row span { + display: block; + margin-top: 0.18rem; + color: rgba(247, 243, 234, 0.56); + font-size: 0.85rem; + line-height: 1.35; +} + +.learn-current-dot { + width: 28px; + height: 28px; + border: 1px solid rgba(246, 201, 69, 0.34); + border-radius: 999px; + background: rgba(246, 201, 69, 0.12); +} + +.learn-section-heading { + display: flex; + align-items: baseline; + justify-content: center; + gap: 1rem; + flex-wrap: wrap; + text-align: center; +} + +.learn-section-heading p { + font-size: 1rem; +} + +.learn-chapter-grid { + display: grid; + grid-template-columns: repeat(3, minmax(0, 1fr)); + gap: 0.8rem; +} + +.learn-chapter { + display: grid; + grid-template-columns: auto minmax(0, 1fr); + gap: 0.78rem; + min-height: 112px; + padding: 1rem; + border: 1px solid rgba(250, 248, 244, 0.12); + border-radius: 8px; + background: rgba(250, 248, 244, 0.045); + color: inherit; + text-decoration: none; + transition: transform 140ms ease, background 140ms ease, border-color 140ms ease; +} + +.learn-chapter:hover, +.learn-chapter:focus-visible { + border-color: rgba(246, 201, 69, 0.36); + background: rgba(250, 248, 244, 0.07); + transform: translateY(-1px); +} + +.learn-chapter-number { + display: inline-grid; + place-items: center; + width: 1.7rem; + height: 1.7rem; + margin-top: 0; + border-radius: 999px; + background: rgba(246, 201, 69, 0.16); + color: var(--color-gold); + font-family: var(--font-mono); + font-size: 0.78rem; + font-weight: 800; + line-height: 1; + text-align: center; +} + +.learn-chapter:nth-child(3n + 2) .learn-chapter-number { + background: rgba(62, 155, 101, 0.16); + color: #8fd4aa; +} + +.learn-chapter:nth-child(3n) .learn-chapter-number { + background: rgba(244, 122, 40, 0.16); + color: #ffb17f; +} + +.learn-chapter strong { + display: block; + color: var(--color-fg); + line-height: 1.25; +} + +.learn-chapter > span:not(.learn-chapter-number) { + display: block; + min-width: 0; +} + +.learn-chapter > span:not(.learn-chapter-number) > span { + display: block; + margin-top: 0.38rem; + color: rgba(247, 243, 234, 0.62); + font-size: 0.92rem; + line-height: 1.45; +} + +.learn-info-grid { + display: grid; + grid-template-columns: repeat(2, minmax(0, 1fr)); + gap: 1rem; +} + +.learn-info { + padding: 1.15rem; + border: 1px solid rgba(250, 248, 244, 0.12); + border-radius: 8px; + background: rgba(250, 248, 244, 0.04); +} + +.learn-info h3 { + font-size: 1.2rem; +} + +.learn-info p { + margin-top: 0.45rem; +} + +.learn-lesson-page .section { + padding-top: 2.2rem; +} + +.learn-lesson-page { + --learn-lesson-bar-top: 126px; +} + +.learn-lesson-shell { + max-width: 920px; + margin: 0 auto; +} + +.learn-lesson-bar { + position: sticky; + top: var(--learn-lesson-bar-top); + z-index: 80; + display: flex; + gap: 0.75rem; + align-items: center; + margin-bottom: 2rem; + padding: 0.55rem 0.72rem; + border: 1px solid rgba(250, 248, 244, 0.12); + border-radius: 999px; + background: rgba(10, 9, 12, 0.88); + backdrop-filter: blur(16px); +} + +.learn-lesson-menu { + width: 36px; + height: 36px; + border: 1px solid rgba(250, 248, 244, 0.1); + border-radius: 999px; + background: rgba(250, 248, 244, 0.045); + position: relative; +} + +.learn-lesson-menu::before, +.learn-lesson-menu::after { + content: ""; + position: absolute; + left: 10px; + width: 14px; + height: 1px; + background: rgba(247, 243, 234, 0.72); +} + +.learn-lesson-menu::before { + top: 13px; + box-shadow: 0 5px 0 rgba(247, 243, 234, 0.72); +} + +.learn-lesson-menu::after { + top: 23px; +} + +.learn-lesson-title { + display: flex; + align-items: center; + gap: 0.7rem; + min-width: 0; + flex: 0 1 auto; +} + +.learn-lesson-title img { + width: 30px; + height: 30px; + border-radius: 8px; + border: 1px solid rgba(250, 248, 244, 0.12); + background: rgba(250, 248, 244, 0.08); +} + +.learn-lesson-title strong, +.learn-lesson-title span { + display: block; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; +} + +.learn-lesson-title strong { + color: var(--color-fg); + font-size: 0.9rem; + line-height: 1.15; +} + +.learn-lesson-title span { + color: rgba(247, 243, 234, 0.55); + font-size: 0.78rem; + line-height: 1.25; +} + +.learn-lesson-top { + margin-left: auto; + padding-left: 0.9rem; + border-left: 1px solid rgba(250, 248, 244, 0.1); + color: rgba(247, 243, 234, 0.68); + font-size: 0.82rem; + font-weight: 650; + text-decoration: none; +} + +.learn-lesson-nav { + display: flex; + align-items: center; + gap: 0.4rem; + margin-left: auto; + padding-left: 0.85rem; + border-left: 1px solid rgba(250, 248, 244, 0.1); +} + +.learn-lesson-nav a, +.learn-lesson-nav span { + display: inline-flex; + align-items: center; + min-height: 2rem; + padding: 0 0.68rem; + border-radius: 999px; + color: rgba(247, 243, 234, 0.68); + font-size: 0.78rem; + font-weight: 700; + line-height: 1; + text-decoration: none; + white-space: nowrap; +} + +.learn-lesson-nav a { + border: 1px solid rgba(250, 248, 244, 0.1); + background: rgba(250, 248, 244, 0.045); +} + +.learn-lesson-nav a:hover, +.learn-lesson-nav a:focus-visible { + border-color: rgba(246, 201, 69, 0.28); + color: var(--color-fg); + background: rgba(250, 248, 244, 0.08); +} + +.learn-lesson-nav span { + color: rgba(247, 243, 234, 0.5); +} + +.learn-lesson-heading { + display: grid; + grid-template-columns: auto minmax(0, 1fr); + gap: 1.2rem; + align-items: center; + padding-bottom: 2rem; + border-bottom: 1px solid rgba(250, 248, 244, 0.1); +} + +.learn-lesson-number { + display: grid; + place-items: center; + width: 68px; + height: 68px; + border-radius: 999px; + background: rgba(246, 201, 69, 0.14); + color: var(--color-gold); + font-family: var(--font-mono); + font-size: 2rem; + font-weight: 800; +} + +.learn-lesson-heading small { + color: rgba(247, 243, 234, 0.56); + font-weight: 700; +} + +.learn-lesson-heading h1 { + margin-top: 0.2rem; + font-size: clamp(2.5rem, 5.5vw, 4rem); + line-height: 1; +} + +.learn-prose { + max-width: none; +} + +.learn-prose > * + * { + margin-top: 1.2rem; +} + +.learn-prose h2 { + margin-top: 3.2rem; + padding-top: 0.2rem; + font-size: 1.7rem; +} + +.learn-prose ul { + margin: 1rem 0; + padding-left: 1.25rem; +} + +.learn-prose li { + color: rgba(247, 243, 234, 0.7); +} + +.learn-code { + margin: 1rem 0 1.4rem; + overflow: hidden; + border: 1px solid rgba(250, 248, 244, 0.13); + border-radius: 8px; + background: rgba(6, 5, 7, 0.92); +} + +.learn-code-header { + display: flex; + align-items: center; + justify-content: space-between; + gap: 1rem; + min-height: 46px; + padding: 0.55rem 0.68rem 0.55rem 0.9rem; + border-bottom: 1px solid rgba(250, 248, 244, 0.1); + background: rgba(250, 248, 244, 0.025); +} + +.learn-code-title { + display: inline-flex; + align-items: center; + gap: 0.55rem; + min-width: 0; + color: rgba(247, 243, 234, 0.68); + font-size: 0.82rem; + font-weight: 650; +} + +.learn-code-title::before { + content: ""; + flex: 0 0 auto; + width: 16px; + height: 16px; + border: 1px solid rgba(250, 248, 244, 0.48); + border-radius: 3px; +} + +.learn-code[data-code-kind="terminal"] .learn-code-title::before { + border: 0; + border-radius: 0; + background: + linear-gradient(45deg, transparent 44%, rgba(250, 248, 244, 0.72) 46%, rgba(250, 248, 244, 0.72) 58%, transparent 60%) 0 2px / 8px 10px no-repeat, + linear-gradient(rgba(250, 248, 244, 0.72), rgba(250, 248, 244, 0.72)) 10px 12px / 8px 1.5px no-repeat; +} + +.learn-code pre { + padding: 1rem 1.1rem; + border: 0; + border-radius: 0; + background: transparent; + box-shadow: none; +} + +.learn-code pre code { + display: block; + min-width: max-content; + font-size: 0.9rem; + line-height: 1.6; +} + +.learn-callout { + padding: 1rem 1.1rem; + border: 1px solid rgba(246, 201, 69, 0.24); + border-radius: 8px; + background: rgba(246, 201, 69, 0.07); +} + +.learn-complete { + margin-top: 3rem; + padding: 2rem; + border: 1px solid rgba(250, 248, 244, 0.12); + border-radius: 8px; + background: rgba(250, 248, 244, 0.04); + text-align: center; +} + +.learn-complete h2 { + margin-top: 0; +} + +.learn-complete .button { + margin-top: 1.25rem; +} + +@media (max-width: 980px) { + .learn-chapter-grid { + grid-template-columns: repeat(2, minmax(0, 1fr)); + }} + +@media (max-width: 820px) { + + .learn-hero-art { + margin-inline: calc(var(--gutter) * -1); + } + + .learn-section-heading { + display: block; + } + + .learn-section-heading p { + margin-top: 0.45rem; + } + + .learn-chapter-grid, + .learn-info-grid { + grid-template-columns: minmax(0, 1fr); + } + + .learn-lesson-bar { + position: static; + flex-wrap: wrap; + border-radius: 8px; + } + + .learn-lesson-title { + flex: 1 1 0; + } + + .learn-lesson-nav { + flex: 1 0 100%; + margin-left: 0; + padding: 0.55rem 0 0; + border-top: 1px solid rgba(250, 248, 244, 0.1); + border-left: 0; + } + + .learn-lesson-top { + display: none; + } + + .learn-lesson-heading { + grid-template-columns: minmax(0, 1fr); + }} + +@media (max-width: 520px) { + + .learn-page .hero { + padding-top: 3rem; + } + + .learn-course-panel { + width: calc(100% - 2rem); + padding: 1.1rem; + } + + .learn-current-row { + grid-template-columns: minmax(0, 1fr); + border-radius: 8px; + } + + .learn-current-dot { + display: none; + } + + .learn-chapter { + grid-template-columns: minmax(0, 1fr); + } + + .learn-lesson-number { + width: 56px; + height: 56px; + font-size: 1.55rem; + } + + .learn-code pre code { + font-size: 0.82rem; + }} + +body:not(.editorial-layout) .learn-hero { + max-width: 840px; + padding: 0; +} + +body:not(.editorial-layout) .learn-hero p { + max-width: 680px; + margin-top: 1.25rem; + color: var(--color-muted); + font-size: 1.08rem; + line-height: 1.65; +} + +body:not(.editorial-layout) .learn-course-panel, +body:not(.editorial-layout) .learn-info, +body:not(.editorial-layout) .learn-current-row, +body:not(.editorial-layout) .learn-lesson-bar, +body:not(.editorial-layout) .learn-code, +body:not(.editorial-layout) .learn-callout { + border-color: rgba(31, 31, 31, 0.12); + background: rgba(255, 255, 255, 0.5); + box-shadow: none; +} + +body:not(.editorial-layout) .learn-hero-art { + display: none; +} + +body:not(.editorial-layout) .learn-course-panel, +body:not(.editorial-layout) .learn-info, +body:not(.editorial-layout) .learn-current-row, +body:not(.editorial-layout) .learn-lesson-bar, +body:not(.editorial-layout) .learn-code, +body:not(.editorial-layout) .learn-callout { + border-radius: var(--radius); +} + +body:not(.editorial-layout) .learn-code pre code { + background: transparent; + color: inherit; +} + +body:not(.editorial-layout) .learn-code pre { + border-radius: var(--radius); + background: linear-gradient(180deg, #171513 0%, #241d31 100%); + color: rgba(250, 248, 244, 0.94); +} + +/* Light-theme contrast cleanup for components inherited from the dark presentation. */ +body:not(.editorial-layout) .learn-section-heading h2, +body:not(.editorial-layout) .learn-course-panel h2, +body:not(.editorial-layout) .learn-current-row strong, +body:not(.editorial-layout) .learn-chapter strong, +body:not(.editorial-layout) .learn-info h3, +body:not(.editorial-layout) .learn-lesson-heading h1, +body:not(.editorial-layout) .learn-lesson-title strong, +body:not(.editorial-layout) .learn-prose h2, +body:not(.editorial-layout) .learn-prose h3, +body:not(.editorial-layout) .learn-complete h2 { + color: var(--color-fg); +} + +body:not(.editorial-layout) .learn-hero .lede, +body:not(.editorial-layout) .learn-section-heading p, +body:not(.editorial-layout) .learn-course-panel p, +body:not(.editorial-layout) .learn-current-row span, +body:not(.editorial-layout) .learn-chapter > span:not(.learn-chapter-number) > span, +body:not(.editorial-layout) .learn-info p, +body:not(.editorial-layout) .learn-lesson-title span, +body:not(.editorial-layout) .learn-lesson-heading small, +body:not(.editorial-layout) .learn-prose p, +body:not(.editorial-layout) .learn-prose li, +body:not(.editorial-layout) .learn-callout, +body:not(.editorial-layout) .learn-callout p, +body:not(.editorial-layout) .learn-complete p { + color: var(--color-muted); +} + +body:not(.editorial-layout) .learn-lesson-top, +body:not(.editorial-layout) .learn-lesson-nav a, +body:not(.editorial-layout) .learn-lesson-nav span { + color: rgba(31, 31, 31, 0.64); +} + +body:not(.editorial-layout) .learn-lesson-top:hover, +body:not(.editorial-layout) .learn-lesson-top:focus-visible, +body:not(.editorial-layout) .learn-lesson-nav a:hover, +body:not(.editorial-layout) .learn-lesson-nav a:focus-visible { + background: rgba(31, 31, 31, 0.05); + color: var(--color-fg); +} + +body:not(.editorial-layout) .learn-hero-art, +body:not(.editorial-layout) .learn-lesson-heading, +body:not(.editorial-layout) .learn-lesson-top, +body:not(.editorial-layout) .learn-lesson-nav { + border-color: rgba(31, 31, 31, 0.1); +} + +body:not(.editorial-layout) .learn-course-panel, +body:not(.editorial-layout) .learn-current-row, +body:not(.editorial-layout) .learn-chapter, +body:not(.editorial-layout) .learn-info, +body:not(.editorial-layout) .learn-lesson-bar, +body:not(.editorial-layout) .learn-lesson-menu, +body:not(.editorial-layout) .learn-lesson-nav a, +body:not(.editorial-layout) .learn-complete { + border-color: rgba(31, 31, 31, 0.12); + background: rgba(255, 255, 255, 0.5); +} + +body:not(.editorial-layout) .learn-lesson-menu::before, +body:not(.editorial-layout) .learn-lesson-menu::after { + background: rgba(31, 31, 31, 0.72); +} + +body:not(.editorial-layout) .learn-lesson-menu::before { + box-shadow: 0 5px 0 rgba(31, 31, 31, 0.72); +} + +body:not(.editorial-layout) .learn-lesson-title img { + border-color: rgba(31, 31, 31, 0.12); + background: rgba(255, 255, 255, 0.56); +} + +body:not(.editorial-layout) .learn-code { + border-color: rgba(246, 201, 69, 0.22); + background: linear-gradient(180deg, #171513 0%, #241d31 100%); + color: rgba(250, 248, 244, 0.94); +} + +body:not(.editorial-layout) .learn-code-header { + border-bottom-color: rgba(250, 248, 244, 0.1); + background: rgba(250, 248, 244, 0.035); +} + +body:not(.editorial-layout) .learn-code-title { + color: rgba(250, 248, 244, 0.72); +} diff --git a/src/layouts/product.layout.client.ts b/src/layouts/product.layout.client.ts deleted file mode 100644 index 31da9879..00000000 --- a/src/layouts/product.layout.client.ts +++ /dev/null @@ -1 +0,0 @@ -import '../lib/learn-client.js' diff --git a/src/layouts/root.layout.ts b/src/layouts/root.layout.ts index 80c191b4..c69f94e7 100644 --- a/src/layouts/root.layout.ts +++ b/src/layouts/root.layout.ts @@ -1,10 +1,23 @@ -import { load } from 'cheerio' -import { highlight } from '../lib/markdown.ts' +import { rootContent } from '../lib/rendering.ts' import { html, raw, render } from 'fragtml' import type { LayoutFunction } from '@domstack/static/types.js' import { header, footer } from '../lib/navigation.ts' import { collections, type Collection } from '../lib/collections.ts' -const root: LayoutFunction<Record<string, any>, string> = ({ +interface RootVars { + title: string + siteUrl: string + siteName?: string + lang?: string + layout: string + docsCollection?: Collection + description?: string + bodyClass?: string + product?: string + redirect?: string + footerLabel?: string + bodyAttrs?: { 'data-ask-ai'?: string | boolean } +} +const root: LayoutFunction<RootVars, string> = ({ vars: v, children, page, @@ -12,30 +25,18 @@ const root: LayoutFunction<Record<string, any>, string> = ({ styles = [], }) => { const collection = v.docsCollection - ? collections[v.docsCollection as Collection] + ? collections[v.docsCollection] : undefined const editorial = (v.bodyClass || '').includes('editorial-layout') const product = collection?.product || v.product || '' const title = collection - ? `${v.title} · ${v.layout === 'spec' ? 'Silk Spec' : collection.title} · Oro Computer` + ? `${v.title} · ${v.layout === 'spec' ? 'Silk Spec' : collection.title} · ${v.siteName ?? 'Oro Computer'}` : v.title - if (!collection && children.includes('<pre')) { - const $ = load(children, {}, false) - $('pre code').each((_i, el) => { - const language = $(el) - .attr('class') - ?.match(/language-([\w+-]+)/)?.[1] - if (language) { - const highlighted = highlight($(el).text(), language) - if (highlighted) $(el).html(highlighted).addClass('hljs') - } - }) - children = $.html() - } + if (!collection) children = rootContent(children) const canonical = new URL(v.redirect || page.url, v.siteUrl).href return render( html`<!doctype html> - <html lang="en"> + <html lang="${v.lang ?? 'en'}"> <head> <meta charset="utf-8" /> <meta name="viewport" content="width=device-width, initial-scale=1" /> @@ -49,7 +50,7 @@ const root: LayoutFunction<Record<string, any>, string> = ({ <meta property="og:type" content="website" /> <meta property="og:image" - content="https://oro.computer/docs/branding/assets/logo-full.png" + content="${new URL('/docs/branding/assets/logo-full.png', v.siteUrl).href}" /> <meta name="twitter:card" content="summary" /> <link diff --git a/src/layouts/runtime-docs.layout.ts b/src/layouts/runtime-docs.layout.ts new file mode 100644 index 00000000..096cb469 --- /dev/null +++ b/src/layouts/runtime-docs.layout.ts @@ -0,0 +1,10 @@ +import type { DataDeps, LayoutFunction } from '@domstack/static/types.js' +import type { DocVars, DocsData } from '../lib/docs.ts' +import { renderDocs } from './docs.layout.ts' +export const parentLayout = 'docs' +export const dataDeps = ['runtimeNavigation'] satisfies DataDeps<Pick<DocsData, 'runtimeNavigation'>> +// DOMStack beta.5 reads layout subscriptions from vars. +export const vars = { dataDeps } +const layout: LayoutFunction<DocVars, string, string, Pick<DocsData, 'runtimeNavigation'>> = ({ vars, children, data }) => + renderDocs(vars, children, data.runtimeNavigation) +export default layout diff --git a/src/layouts/sage-docs.layout.ts b/src/layouts/sage-docs.layout.ts new file mode 100644 index 00000000..886b4126 --- /dev/null +++ b/src/layouts/sage-docs.layout.ts @@ -0,0 +1,10 @@ +import type { DataDeps, LayoutFunction } from '@domstack/static/types.js' +import type { DocVars, DocsData } from '../lib/docs.ts' +import { renderDocs } from './docs.layout.ts' +export const parentLayout = 'docs' +export const dataDeps = ['sageNavigation'] satisfies DataDeps<Pick<DocsData, 'sageNavigation'>> +// DOMStack beta.5 reads layout subscriptions from vars. +export const vars = { dataDeps } +const layout: LayoutFunction<DocVars, string, string, Pick<DocsData, 'sageNavigation'>> = ({ vars, children, data }) => + renderDocs(vars, children, data.sageNavigation) +export default layout diff --git a/src/layouts/silk-docs.layout.ts b/src/layouts/silk-docs.layout.ts new file mode 100644 index 00000000..43395692 --- /dev/null +++ b/src/layouts/silk-docs.layout.ts @@ -0,0 +1,10 @@ +import type { DataDeps, LayoutFunction } from '@domstack/static/types.js' +import type { DocVars, DocsData } from '../lib/docs.ts' +import { renderDocs } from './docs.layout.ts' +export const parentLayout = 'docs' +export const dataDeps = ['silkNavigation'] satisfies DataDeps<Pick<DocsData, 'silkNavigation'>> +// DOMStack beta.5 reads layout subscriptions from vars. +export const vars = { dataDeps } +const layout: LayoutFunction<DocVars, string, string, Pick<DocsData, 'silkNavigation'>> = ({ vars, children, data }) => + renderDocs(vars, children, data.silkNavigation) +export default layout diff --git a/src/layouts/silkWiki-docs.layout.ts b/src/layouts/silkWiki-docs.layout.ts new file mode 100644 index 00000000..c6afcf6c --- /dev/null +++ b/src/layouts/silkWiki-docs.layout.ts @@ -0,0 +1,10 @@ +import type { DataDeps, LayoutFunction } from '@domstack/static/types.js' +import type { DocVars, DocsData } from '../lib/docs.ts' +import { renderDocs } from './docs.layout.ts' +export const parentLayout = 'docs' +export const dataDeps = ['silkWikiNavigation'] satisfies DataDeps<Pick<DocsData, 'silkWikiNavigation'>> +// DOMStack beta.5 reads layout subscriptions from vars. +export const vars = { dataDeps } +const layout: LayoutFunction<DocVars, string, string, Pick<DocsData, 'silkWikiNavigation'>> = ({ vars, children, data }) => + renderDocs(vars, children, data.silkWikiNavigation) +export default layout diff --git a/src/layouts/slg-docs.layout.ts b/src/layouts/slg-docs.layout.ts new file mode 100644 index 00000000..83e23bcc --- /dev/null +++ b/src/layouts/slg-docs.layout.ts @@ -0,0 +1,10 @@ +import type { DataDeps, LayoutFunction } from '@domstack/static/types.js' +import type { DocVars, DocsData } from '../lib/docs.ts' +import { renderDocs } from './docs.layout.ts' +export const parentLayout = 'docs' +export const dataDeps = ['slgNavigation'] satisfies DataDeps<Pick<DocsData, 'slgNavigation'>> +// DOMStack beta.5 reads layout subscriptions from vars. +export const vars = { dataDeps } +const layout: LayoutFunction<DocVars, string, string, Pick<DocsData, 'slgNavigation'>> = ({ vars, children, data }) => + renderDocs(vars, children, data.slgNavigation) +export default layout diff --git a/src/layouts/spec.layout.client.ts b/src/layouts/spec.layout.client.ts index bd301014..24bac85c 100644 --- a/src/layouts/spec.layout.client.ts +++ b/src/layouts/spec.layout.client.ts @@ -1,3 +1,4 @@ +import { initAskAiMenu } from '../lib/ask-ai-client.ts' import { enhanceSidebar } from '../lib/sidebar-client.ts' import { enhanceArticle } from '../lib/article-client.ts' const app = document.querySelector<HTMLElement>('[data-spec-app]') @@ -16,3 +17,5 @@ if (app) { if (p && !/^spec\/2026(?:\.md)?$/.test(p)) location.replace('/silk/docs/?p=' + encodeURIComponent(p) + location.hash) } + +initAskAiMenu() diff --git a/src/layouts/spec.layout.ts b/src/layouts/spec.layout.ts index 2d6f6c65..a32e767b 100644 --- a/src/layouts/spec.layout.ts +++ b/src/layouts/spec.layout.ts @@ -1,9 +1,18 @@ import { html, raw, render } from 'fragtml' import type { LayoutFunction } from '@domstack/static/types.js' -import { article } from './docs.layout.ts' +import { article } from '../lib/rendering.ts' +import { collections } from '../lib/collections.ts' +import { rawUrl, type DocVars } from '../lib/docs.ts' export const parentLayout = 'root' -const spec: LayoutFunction<Record<string, any>, string> = ({ children }) => { +type SpecVars = DocVars & { specLabel?: string } +const spec: LayoutFunction<SpecVars, string> = ({ vars: v, children }) => { const { body, toc } = article(children, true) + const markdownUrl = rawUrl({ collection: v.docsCollection, sourcePath: v.sourcePath }) + const year = v.sourcePath.match(/(?:^|\/)(\d{4})\.(?:md|txt)$/)?.[1] + const productLabel = collections[v.docsCollection].title.replace(/ (?:Docs|Wiki)$/, '') + const label = v.specLabel ?? (year ? `${productLabel} Spec (${year})` : v.title) + const upstreamPath = v.sourcePath.split('/').map(encodeURIComponent).join('/') + const upstreamUrl = `https://github.com/${v.githubRepo}/blob/${encodeURIComponent(v.githubRef)}/docs/${upstreamPath}` return render( html`<main id="main"> <section class="section"> @@ -11,14 +20,14 @@ const spec: LayoutFunction<Record<string, any>, string> = ({ children }) => { <div class="docs-layout spec-layout" data-spec-app - data-markdown="/silk/docs/source/spec/2026.md" + data-markdown="${markdownUrl}" > <aside class="docs-sidebar spec-sidebar" aria-label="Specification table of contents" > <div class="docs-sidebar-header"> - <div class="docs-sidebar-title">Silk Spec (2026)</div> + <div class="docs-sidebar-title">${label}</div> <input class="docs-search" type="search" @@ -35,10 +44,10 @@ const spec: LayoutFunction<Record<string, any>, string> = ({ children }) => { <div class="prose spec-prose" data-spec-content>${raw(body)}</div> <p> <a - href="https://github.com/oro-computer/silk/blob/master/docs/spec/2026.md" + href="${upstreamUrl}" >Source on GitHub</a > - · <a href="/silk/docs/source/spec/2026.md">View Markdown</a> + · <a href="${markdownUrl}">View Markdown</a> </p> </article> </div> diff --git a/src/layouts/virtnosis-docs.layout.ts b/src/layouts/virtnosis-docs.layout.ts new file mode 100644 index 00000000..9344aeed --- /dev/null +++ b/src/layouts/virtnosis-docs.layout.ts @@ -0,0 +1,10 @@ +import type { DataDeps, LayoutFunction } from '@domstack/static/types.js' +import type { DocVars, DocsData } from '../lib/docs.ts' +import { renderDocs } from './docs.layout.ts' +export const parentLayout = 'docs' +export const dataDeps = ['virtnosisNavigation'] satisfies DataDeps<Pick<DocsData, 'virtnosisNavigation'>> +// DOMStack beta.5 reads layout subscriptions from vars. +export const vars = { dataDeps } +const layout: LayoutFunction<DocVars, string, string, Pick<DocsData, 'virtnosisNavigation'>> = ({ vars, children, data }) => + renderDocs(vars, children, data.virtnosisNavigation) +export default layout diff --git a/src/lib/article-client.ts b/src/lib/article-client.ts index 700f6432..cb2d63c6 100644 --- a/src/lib/article-client.ts +++ b/src/lib/article-client.ts @@ -1,4 +1,4 @@ -import { writeClipboard } from './clipboard.js' +import { writeClipboard } from './clipboard.ts' export function enhanceArticle(app: HTMLElement): void { for (const pre of app.querySelectorAll('pre')) { const code = pre.querySelector('code') diff --git a/src/lib/artifacts.ts b/src/lib/artifacts.ts new file mode 100644 index 00000000..a88855a1 --- /dev/null +++ b/src/lib/artifacts.ts @@ -0,0 +1,28 @@ +import { collections, type Collection } from './collections.ts' +import { rawUrl, type Navigation, type ExportDoc } from './docs.ts' +export interface Output { outputName: string; content: string } +export const output = (name: string, content: string): Output => ({ outputName: name.replace(/^\//, ''), content }) +export const json = (name: string, value: unknown): Output => output(name, JSON.stringify(value, null, 2) + '\n') +export function collectionIndex(collection: Collection, navigation: Navigation): Output { + return json(collections[collection].base + 'index.json', { + kind: collection === 'silkWiki' ? 'wiki' : 'docs', + count: Object.keys(navigation.bySource).length, + sections: navigation.sections.map(s => ({ name: s.name, items: s.items.map(d => ({ + id: d.id, title: d.title, file: d.sourcePath, url: d.url, + })) })), + }) +} +export function sources(docs: ExportDoc[]): Output[] { + return docs.map(d => output(rawUrl(d), d.markdown)) +} +export function pack(product: string, docs: ExportDoc[], siteUrl: string): Output { + return output(`/${product}/llms.txt`, `# ${product} documentation\n\n` + docs.map(d => + `## ${d.title}\n\nURL: ${new URL(d.url, siteUrl).href}\nSource: ${new URL(rawUrl(d), siteUrl).href}\n\n${d.markdown}`, + ).join('\n---\n\n')) +} +export function xmlEscape(value: string): string { + return value.replace(/[&<>"']/g, c => ({ '&': '&', '<': '<', '>': '>', '"': '"', "'": ''' })[c]!) +} +export function sitemap(routes: string[], siteUrl: string): Output { + return output('/sitemap.xml', '<?xml version="1.0" encoding="UTF-8"?>\n<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">' + routes.map(url => `<url><loc>${xmlEscape(new URL(url, siteUrl).href)}</loc></url>`).join('') + '</urlset>\n') +} diff --git a/src/lib/ask-ai-client.ts b/src/lib/ask-ai-client.ts new file mode 100644 index 00000000..1e5a6f9c --- /dev/null +++ b/src/lib/ask-ai-client.ts @@ -0,0 +1,165 @@ +import { writeClipboard } from './clipboard.ts' + +function siteRoot(): URL { + const brand = document.querySelector<HTMLAnchorElement>('a.brand[href]') + return new URL(brand?.href || './', location.href) +} + +function llmsUrl(): string { + const product = ['silk', 'runtime', 'sage', 'slg', 'virtnosis'].find((name) => + location.pathname.includes(`/${name}/`) || location.pathname.endsWith(`/${name}`), + ) + return new URL(product ? `${product}/llms.txt` : 'llms.txt', siteRoot()).href +} + +function pageMarkdownUrl(): string { + const source = document.querySelector<HTMLElement>('[data-markdown]') + return source?.dataset.markdown + ? new URL(source.dataset.markdown, location.href).href + : '' +} + +export function initAskAiMenu(): void { + const body = document.body + if (body.dataset.askAi !== 'true' && + !body.classList.contains('docs-page') && + !body.classList.contains('docs-landing-page') && + !/(^|\/)docs(\/|$)/.test(location.pathname)) return + + const nav = document.querySelector('.nav') + const header = nav?.closest<HTMLElement>('.site-header') + if (!nav || !header || nav.querySelector('[data-ask-ai]')) return + + const menu = document.createElement('div') + menu.className = 'menu ask-ai-menu' + menu.dataset.askAi = 'true' + const trigger = document.createElement('button') + trigger.className = 'button button-quiet menu-trigger' + trigger.type = 'button' + trigger.textContent = 'Ask AI' + trigger.setAttribute('aria-expanded', 'false') + trigger.setAttribute('aria-controls', 'ask-ai-panel') + menu.append(trigger) + + const panel = document.createElement('div') + panel.className = 'menu-panel ask-ai-panel' + panel.id = 'ask-ai-panel' + panel.hidden = true + + function labelItem(item: HTMLAnchorElement | HTMLButtonElement, label: string, hint: string): void { + item.className = 'menu-item' + const left = document.createElement('span') + left.textContent = label + const right = document.createElement('small') + right.textContent = hint + item.append(left, right) + } + function link(label: string, hint: string): HTMLAnchorElement { + const item = document.createElement('a') + item.target = '_blank' + item.rel = 'noreferrer' + labelItem(item, label, hint) + return item + } + function separator(): HTMLDivElement { + const item = document.createElement('div') + item.className = 'menu-sep' + return item + } + + const chatgpt = link('ChatGPT', 'New tab') + const claude = link('Claude', 'New tab') + const viewMd = link('View Markdown', 'Raw') + viewMd.dataset.askAiViewMarkdown = 'true' + const copyMd = document.createElement('button') + copyMd.type = 'button' + copyMd.dataset.askAiCopyMarkdown = 'true' + labelItem(copyMd, 'Copy Markdown', 'Clipboard') + const llms = link('Open llms.txt', 'Pack') + const hint = document.createElement('div') + hint.className = 'menu-hint' + hint.textContent = 'Uses page Markdown when available.' + panel.append(chatgpt, claude, separator(), viewMd, copyMd, separator(), llms, hint) + + // A sibling of the scrolling nav cannot be clipped by its overflow boundary. + header.append(panel) + const primary = nav.querySelector('.button.button-primary') + if (primary?.parentElement === nav) nav.insertBefore(menu, primary) + else nav.append(menu) + + function updateMenu(): void { + const markdown = pageMarkdownUrl() + const target = markdown || location.href + const prompt = (name: string) => + `Hi ${name}! Can you please read [this page](${target}) and prepare to answer questions about it?` + chatgpt.href = `https://chatgpt.com/?${new URLSearchParams({ prompt: prompt('ChatGPT') })}` + claude.href = `https://claude.ai/new?${new URLSearchParams({ q: prompt('Claude') })}` + llms.href = llmsUrl() + viewMd.hidden = copyMd.hidden = !markdown + if (markdown) viewMd.href = markdown + } + + copyMd.addEventListener('click', async () => { + const url = pageMarkdownUrl() + if (!url) return + let text = '' + try { + const response = await fetch(url) + if (response.ok) text = await response.text() + } catch {} + const ok = await writeClipboard(text) + const label = copyMd.querySelector('small')! + label.textContent = ok ? 'Copied' : 'Failed' + setTimeout(() => { label.textContent = 'Clipboard' }, 900) + }) + + function positionPanel(): void { + const anchor = trigger.getBoundingClientRect() + const bounds = header!.getBoundingClientRect() + const width = panel.getBoundingClientRect().width + const left = Math.max(8, Math.min(anchor.right - width, innerWidth - width - 8)) + panel.style.left = `${left - bounds.left}px` + panel.style.top = `${anchor.bottom - bounds.top + 10}px` + } + function setOpen(open: boolean, focus = false): void { + panel.hidden = !open + trigger.setAttribute('aria-expanded', String(open)) + if (open) { + updateMenu() + positionPanel() + if (focus) chatgpt.focus() + } + } + function dismissOutside(event: Event): void { + if (event.target instanceof Node && !menu.contains(event.target) && !panel.contains(event.target)) { + setOpen(false) + } + } + trigger.addEventListener('click', () => setOpen(Boolean(panel.hidden))) + trigger.addEventListener('keydown', (event) => { + if (event.key === 'ArrowDown' || (event.key === 'Tab' && !event.shiftKey && !panel.hidden)) { + event.preventDefault() + setOpen(true, true) + } + }) + panel.addEventListener('click', (event) => { + if (event.target instanceof Element && event.target.closest('a.menu-item')) setOpen(false) + }) + panel.addEventListener('keydown', (event) => { + if (event.key === 'Tab' && event.shiftKey && event.target === chatgpt) { + event.preventDefault() + trigger.focus() + } + }) + document.addEventListener('click', dismissOutside) + document.addEventListener('focusin', dismissOutside) + document.addEventListener('keydown', (event) => { + if (!panel.hidden && event.key === 'Escape') { + setOpen(false) + trigger.focus() + } + }) + nav.addEventListener('scroll', () => { if (!panel.hidden) positionPanel() }) + addEventListener('resize', () => { if (!panel.hidden) positionPanel() }) + updateMenu() +} diff --git a/src/lib/clipboard.js b/src/lib/clipboard.ts similarity index 89% rename from src/lib/clipboard.js rename to src/lib/clipboard.ts index 65b00669..3a5d0ef1 100644 --- a/src/lib/clipboard.js +++ b/src/lib/clipboard.ts @@ -1,4 +1,4 @@ -export function writeClipboard(text) { +export function writeClipboard(text: string | null | undefined): Promise<boolean> { const value = String(text ?? ""); if (!value) return Promise.resolve(false); diff --git a/src/lib/docs.ts b/src/lib/docs.ts index 430696ea..72754556 100644 --- a/src/lib/docs.ts +++ b/src/lib/docs.ts @@ -1,23 +1,83 @@ import { load } from 'cheerio' -import { collections, type Collection } from './collections.ts' -export interface Doc { - collection: Collection - id: string +import { collections, sectionTitle, type Collection } from './collections.ts' +export interface DocVars { + docsCollection: Collection title: string description: string section: string order: number - url: string sourcePath: string - markdown: string - searchText: string githubRepo: string githubRef: string } -export type DocsData = { docs: Record<Collection, Doc[]>; routes: string[] } +export interface Doc extends Omit<DocVars, 'docsCollection'> { + collection: Collection + id: string + url: string + markdown: string + searchText: string + editUrl: string +} +export type DocLink = Pick<Doc, 'id' | 'title' | 'url'> +export type NavDoc = Omit<Doc, 'markdown' | 'searchText' | 'description' | 'order'> & { + previous: DocLink | null + next: DocLink | null +} +export interface Navigation { + bySource: Record<string, NavDoc> + sections: { name: string; title: string; items: (DocLink & { sourcePath: string })[] }[] + legacy: Record<string, string> +} +export type ExportDoc = Pick<Doc, 'collection' | 'id' | 'title' | 'sourcePath' | 'url' | 'markdown'> +export interface SearchIndex { + kind: string + count: number + items: { id: string; title: string; file: string; url: string; section: string; summary: string; text: string }[] +} +export type DocsData = { routes: string[] } & + Record<`${Collection}Navigation`, Navigation> & + Record<`${Collection}Exports`, ExportDoc[]> & + Record<`${Collection}Search`, SearchIndex> + +export function validateDocVars(v: Record<string, unknown>, source: string): DocVars { + if (typeof v.docsCollection !== 'string' || !Object.hasOwn(collections, v.docsCollection)) + throw new Error(`${source}: unknown docsCollection ${String(v.docsCollection)}`) + for (const key of ['title', 'description', 'section', 'sourcePath', 'githubRepo', 'githubRef']) + if (typeof v[key] !== 'string' || (key !== 'description' && !v[key])) + throw new Error(`${source}: ${key} must be a string${key === 'description' ? '' : ' (non-empty)'}`) + if (typeof v.order !== 'number' || !Number.isFinite(v.order)) + throw new Error(`${source}: order must be finite`) + const path = v.sourcePath as string + if (!/\.(md|txt)$/.test(path) || path.startsWith('/') || path.includes('\\') || path.split('/').some(p => !p || p === '.' || p === '..')) + throw new Error(`${source}: invalid sourcePath ${path}`) + return v as unknown as DocVars +} +export function projectCollection(docs: Doc[]) { + const bySource: Record<string, NavDoc> = Object.create(null) + const legacy: Record<string, string> = Object.create(null) + const sections: Navigation['sections'] = [] + const sourceById = new Map<string, string>() + const link = (d: Doc): DocLink => ({ id: d.id, title: d.title, url: d.url }) + for (const [i, d] of docs.entries()) { + if (Object.hasOwn(bySource, d.sourcePath)) throw new Error(`Duplicate document: ${d.collection}/${d.sourcePath}`) + if (sourceById.has(d.id)) + throw new Error(`Duplicate document id "${d.id}" in collection "${d.collection}": ${sourceById.get(d.id)} and ${d.sourcePath}`) + sourceById.set(d.id, d.sourcePath) + const { markdown: _markdown, searchText: _search, description: _description, order: _order, ...nav } = d + bySource[d.sourcePath] = { ...nav, previous: i ? link(docs[i - 1]) : null, next: i + 1 < docs.length ? link(docs[i + 1]) : null } + legacy[d.id] = d.url + let section = sections.find(s => s.name === d.section) + if (!section) sections.push(section = { name: d.section, title: sectionTitle(d.section), items: [] }) + section.items.push({ ...link(d), sourcePath: d.sourcePath }) + } + return { bySource, sections, legacy } +} export function plainText(html: string): string { return load(html).text().replace(/\s+/g, ' ').trim() } -export function rawUrl(doc: Doc): string { +export function rawUrl(doc: Pick<Doc, 'collection' | 'sourcePath'>): string { return collections[doc.collection].base + 'source/' + doc.sourcePath } +export function editUrl(sourceRelname: string): string { + return 'https://github.com/oro-computer/website/blob/master/src/' + sourceRelname.replace(/\\/g, '/').split('/').map(encodeURIComponent).join('/') +} diff --git a/src/lib/learn-client.js b/src/lib/learn-client.js deleted file mode 100644 index 556e9b5e..00000000 --- a/src/lib/learn-client.js +++ /dev/null @@ -1,151 +0,0 @@ -import { writeClipboard } from "./clipboard.js"; -(() => { - function initCodeCopy(root = document) { - const scope = root && "querySelectorAll" in root ? root : document; - const buttons = Array.from(scope.querySelectorAll("[data-copy-code]")); - for (const button of buttons) { - if (button.dataset.copyInit === "true") continue; - button.dataset.copyInit = "true"; - - button.addEventListener("click", async () => { - const block = button.closest("[data-code-block]"); - const code = block?.querySelector?.("pre code"); - const text = code?.textContent || ""; - const ok = await writeClipboard(text); - const previousLabel = button.getAttribute("aria-label") || "Copy code"; - button.dataset.copyState = ok ? "copied" : "failed"; - button.setAttribute("aria-label", ok ? "Copied" : "Copy failed"); - globalThis.setTimeout(() => { - delete button.dataset.copyState; - button.setAttribute("aria-label", previousLabel); - }, 1100); - }); - } - } - - globalThis.oroInitCodeCopy = initCodeCopy; - initCodeCopy(document); - - let tabInstance = 0; - - function activateTab(set, tabs, panels, next, { focus = false } = {}) { - if (next < 0 || next >= tabs.length) return; - for (let i = 0; i < tabs.length; i += 1) { - const on = i === next; - tabs[i].setAttribute("aria-selected", on ? "true" : "false"); - tabs[i].tabIndex = on ? 0 : -1; - if (panels[i]) panels[i].hidden = !on; - } - if (focus) tabs[next]?.focus?.(); - set.dataset.activeTab = String(next); - } - - function getHashTargetId() { - const raw = String(globalThis.location.hash || ""); - if (!raw || raw === "#") return null; - try { - return decodeURIComponent(raw.slice(1)); - } catch { - return raw.slice(1); - } - } - - function initTabSet(set) { - if (!(set instanceof HTMLElement)) return; - if (set.dataset.tabsInit === "true") return; - - const tabList = set.querySelector(".tabs-list"); - const tabs = Array.from(set.querySelectorAll(".tabs-tab")); - const panels = Array.from(set.querySelectorAll(".tabs-panel")); - if (!tabList || !tabs.length || !panels.length) return; - - tabInstance += 1; - const prefix = set.dataset.tabsId || `tabs-${tabInstance}`; - set.dataset.tabsId = prefix; - - tabList.setAttribute("role", "tablist"); - tabList.setAttribute("aria-orientation", "horizontal"); - - for (let i = 0; i < tabs.length; i += 1) { - const tab = tabs[i]; - const panel = panels[i]; - tab.setAttribute("role", "tab"); - tab.id ||= `${prefix}-tab-${i}`; - if (panel) { - panel.setAttribute("role", "tabpanel"); - panel.id ||= `${prefix}-panel-${i}`; - tab.setAttribute("aria-controls", panel.id); - panel.setAttribute("aria-labelledby", tab.id); - } - - tab.addEventListener("click", () => { - activateTab(set, tabs, panels, i, { focus: true }); - }); - - tab.addEventListener("keydown", (event) => { - const key = String(event.key || ""); - let nextIndex = -1; - - if (key === "ArrowRight") nextIndex = (i + 1) % tabs.length; - else if (key === "ArrowLeft") nextIndex = (i - 1 + tabs.length) % tabs.length; - else if (key === "Home") nextIndex = 0; - else if (key === "End") nextIndex = tabs.length - 1; - else if (key === "Enter" || key === " ") nextIndex = i; - - if (nextIndex === -1) return; - event.preventDefault(); - activateTab(set, tabs, panels, nextIndex, { focus: true }); - }); - } - - let active = tabs.findIndex((t) => t.getAttribute("aria-selected") === "true"); - if (active === -1) active = 0; - - const targetId = getHashTargetId(); - if (targetId) { - try { - const target = set.querySelector(`#${CSS.escape(targetId)}`); - if (target) { - const panel = target.closest?.(".tabs-panel"); - const idx = panel ? panels.indexOf(panel) : -1; - if (idx !== -1) active = idx; - } - } catch {} - } - - activateTab(set, tabs, panels, active); - set.dataset.tabsInit = "true"; - } - - function oroInitTabs(root = document) { - const scope = root && "querySelectorAll" in root ? root : document; - for (const set of Array.from(scope.querySelectorAll("[data-tabs]"))) { - initTabSet(set); - } - } - - globalThis.oroInitTabs = oroInitTabs; - oroInitTabs(document); - - globalThis.addEventListener("hashchange", () => { - const targetId = getHashTargetId(); - if (!targetId) return; - const sets = Array.from(document.querySelectorAll("[data-tabs][data-tabs-init='true']")); - for (const set of sets) { - const panels = Array.from(set.querySelectorAll(".tabs-panel")); - const tabs = Array.from(set.querySelectorAll(".tabs-tab")); - if (!tabs.length || !panels.length) continue; - let idx = -1; - try { - const target = set.querySelector(`#${CSS.escape(targetId)}`); - if (target) { - const panel = target.closest?.(".tabs-panel"); - idx = panel ? panels.indexOf(panel) : -1; - } - } catch { - idx = -1; - } - if (idx !== -1) activateTab(set, tabs, panels, idx); - } - }); -})(); diff --git a/src/lib/learn-client.ts b/src/lib/learn-client.ts new file mode 100644 index 00000000..6571b2ff --- /dev/null +++ b/src/lib/learn-client.ts @@ -0,0 +1,127 @@ +import { writeClipboard } from './clipboard.ts' + +export function initCodeCopy(root: ParentNode = document): void { + for (const button of root.querySelectorAll<HTMLButtonElement>('[data-copy-code]')) { + if (button.dataset.copyInit === 'true') continue + button.dataset.copyInit = 'true' + button.addEventListener('click', async () => { + const code = button.closest('[data-code-block]')?.querySelector('pre code') + const ok = await writeClipboard(code?.textContent) + const previousLabel = button.getAttribute('aria-label') || 'Copy code' + button.dataset.copyState = ok ? 'copied' : 'failed' + button.setAttribute('aria-label', ok ? 'Copied' : 'Copy failed') + setTimeout(() => { + delete button.dataset.copyState + button.setAttribute('aria-label', previousLabel) + }, 1100) + }) + } +} + +let tabInstance = 0 + +function activateTab( + set: HTMLElement, + tabs: HTMLElement[], + panels: HTMLElement[], + next: number, + { focus = false } = {}, +): void { + if (next < 0 || next >= tabs.length) return + for (let i = 0; i < tabs.length; i += 1) { + const on = i === next + tabs[i].setAttribute('aria-selected', String(on)) + tabs[i].tabIndex = on ? 0 : -1 + if (panels[i]) panels[i].hidden = !on + } + if (focus) tabs[next].focus() + set.dataset.activeTab = String(next) +} + +function getHashTargetId(): string | null { + const raw = location.hash + if (!raw || raw === '#') return null + try { + return decodeURIComponent(raw.slice(1)) + } catch { + return raw.slice(1) + } +} + +function hashPanelIndex(set: HTMLElement, panels: HTMLElement[]): number { + const targetId = getHashTargetId() + if (!targetId) return -1 + const target = set.querySelector(`#${CSS.escape(targetId)}`) + const panel = target?.closest<HTMLElement>('.tabs-panel') + return panel ? panels.indexOf(panel) : -1 +} + +function initTabSet(set: HTMLElement): void { + if (set.dataset.tabsInit === 'true') return + const tabList = set.querySelector('.tabs-list') + const tabs = [...set.querySelectorAll<HTMLElement>('.tabs-tab')] + const panels = [...set.querySelectorAll<HTMLElement>('.tabs-panel')] + if (!tabList || !tabs.length || !panels.length) return + + const prefix = set.dataset.tabsId || `tabs-${++tabInstance}` + set.dataset.tabsId = prefix + tabList.setAttribute('role', 'tablist') + tabList.setAttribute('aria-orientation', 'horizontal') + + for (let i = 0; i < tabs.length; i += 1) { + const tab = tabs[i] + const panel = panels[i] + tab.setAttribute('role', 'tab') + tab.id ||= `${prefix}-tab-${i}` + if (panel) { + panel.setAttribute('role', 'tabpanel') + panel.id ||= `${prefix}-panel-${i}` + tab.setAttribute('aria-controls', panel.id) + panel.setAttribute('aria-labelledby', tab.id) + } + tab.addEventListener('click', () => { + activateTab(set, tabs, panels, i, { focus: true }) + }) + tab.addEventListener('keydown', (event) => { + let next = -1 + if (event.key === 'ArrowRight') next = (i + 1) % tabs.length + else if (event.key === 'ArrowLeft') next = (i - 1 + tabs.length) % tabs.length + else if (event.key === 'Home') next = 0 + else if (event.key === 'End') next = tabs.length - 1 + else if (event.key === 'Enter' || event.key === ' ') next = i + if (next === -1) return + event.preventDefault() + activateTab(set, tabs, panels, next, { focus: true }) + }) + } + + let active = tabs.findIndex((tab) => tab.getAttribute('aria-selected') === 'true') + if (active === -1) active = 0 + const hashIndex = hashPanelIndex(set, panels) + if (hashIndex !== -1) active = hashIndex + activateTab(set, tabs, panels, active) + set.dataset.tabsInit = 'true' +} + +export function initTabs(root: ParentNode = document): void { + for (const set of root.querySelectorAll<HTMLElement>('[data-tabs]')) initTabSet(set) +} + +function revealHashTab(): void { + for (const set of document.querySelectorAll<HTMLElement>("[data-tabs][data-tabs-init='true']")) { + const tabs = [...set.querySelectorAll<HTMLElement>('.tabs-tab')] + const panels = [...set.querySelectorAll<HTMLElement>('.tabs-panel')] + const index = hashPanelIndex(set, panels) + if (index !== -1) activateTab(set, tabs, panels, index) + } +} + +let listening = false +export function initLearn(root: ParentNode = document): void { + initCodeCopy(root) + initTabs(root) + if (!listening) { + addEventListener('hashchange', revealHashTab) + listening = true + } +} diff --git a/src/lib/markdown.ts b/src/lib/markdown.ts index 5f496f39..4d74f487 100644 --- a/src/lib/markdown.ts +++ b/src/lib/markdown.ts @@ -1,9 +1,9 @@ import MarkdownIt from 'markdown-it' import alerts from 'markdown-it-github-alerts' import hljs, { type LanguageFn } from 'highlight.js' -import silk from './silk.js' -import toml from './toml.js' -import zig from './zig.js' +import silk from './silk.ts' +import toml from './toml.ts' +import zig from './zig.ts' for (const [name, language] of Object.entries({ silk, toml, zig })) hljs.registerLanguage(name, language as LanguageFn) // Match the previous marked renderer's anchor algorithm, including duplicate suffixes. @@ -18,14 +18,16 @@ export function slug(text: string): string { ) .replace(/\s/g, '-') } +// Own the complete plugin set rather than inheriting DOMStack's defaults: +// GitHub alerts and the legacy heading IDs are the site's compatibility contract. +// Keep MarkdownIt's default tables/strikethrough, HTML and linkification; do not +// add anchor, emoji, task-list or typography plugins that change existing output. export function markdown() { const md = new MarkdownIt({ html: true, linkify: true, highlight(code, lang) { - return lang && hljs.getLanguage(lang) - ? hljs.highlight(code, { language: lang, ignoreIllegals: true }).value - : '' + return lang ? highlight(code, lang) || '' : '' }, }) md.use(alerts) diff --git a/src/lib/navigation.ts b/src/lib/navigation.ts index ae2639a1..e0bd4904 100644 --- a/src/lib/navigation.ts +++ b/src/lib/navigation.ts @@ -28,6 +28,9 @@ export function header(product: string, route: string, wide: boolean): string { : []), ] : [] + const activeSubnav = sub + .filter(([text, url]) => route === url || (text !== 'Overview' && route.startsWith(url))) + .sort((a, b) => b[1].length - a[1].length)[0]?.[1] return render( html`<header class="site-top" id="top"> <div class="${wide ? 'container container-wide' : 'container'}"> @@ -70,8 +73,7 @@ export function header(product: string, route: string, wide: boolean): string { ([text, url]) => html`<a href="${url}" - ${route === url || - (text !== 'Overview' && route.startsWith(url)) + ${url === activeSubnav ? html`aria-current="page"` : null} >${text}</a diff --git a/src/lib/rendering.ts b/src/lib/rendering.ts new file mode 100644 index 00000000..3423061e --- /dev/null +++ b/src/lib/rendering.ts @@ -0,0 +1,69 @@ +import { html, render } from 'fragtml' +import { load } from 'cheerio' +import { highlight } from './markdown.ts' +export function article( + content: string, + spec = false, +): { body: string; toc: string } { + const $ = load(content, {}, false) + const headings: { id: string; title: string; level: string }[] = [] + $('h2,h3,h4,h5').each((_i, h) => { + const id = $(h).attr('id') || '' + const title = $(h).text() + if (id) { + headings.push({ id, title, level: h.tagName }) + $(h).append( + render( + html`<a + class="docs-heading-anchor" + href="#${id}" + aria-label="Link to this section" + >#</a + >`, + ), + ) + } + }) + return { + body: $.html(), + toc: render( + spec + ? html`<div class="spec-toc-title">Table of contents</div> + <div class="spec-toc"> + ${headings.map( + (h) => + html`<a + href="#${h.id}" + data-level="${h.level}" + data-id="${h.id}" + >${h.title}</a + >`, + )} + </div>` + : html`<div class="docs-toc-title">On this page</div> + <ul class="docs-toc-list"> + ${headings + .filter((h) => ['h2', 'h3'].includes(h.level)) + .map( + (h) => + html`<li data-level="${h.level}"> + <a href="#${h.id}">${h.title}</a> + </li>`, + )} + </ul>`, + ), + } +} + +export function rootContent(content: string): string { + if (!content.includes('<pre')) return content + const $ = load(content, {}, false) + $('pre code').each((_i, el) => { + const language = $(el).attr('class')?.match(/language-([\w+-]+)/)?.[1] + if (language) { + const highlighted = highlight($(el).text(), language) + if (highlighted) $(el).html(highlighted).addClass('hljs') + } + }) + return $.html() +} diff --git a/src/lib/silk.js b/src/lib/silk.ts similarity index 97% rename from src/lib/silk.js rename to src/lib/silk.ts index e3529a27..f562e796 100644 --- a/src/lib/silk.js +++ b/src/lib/silk.ts @@ -1,4 +1,6 @@ -export default function defineSilk(hljs) { +import type { HLJSApi, Language, Mode } from 'highlight.js' + +export default function defineSilk(hljs: HLJSApi): Language { const KEYWORDS = { keyword: "package module import from attr export public private default const let var mut move fn c_fn test theory struct extends enum type error interface impl using as is raw pure async task region with new sizeof alignof offsetof typename asm ext where if else match while for in loop return panic break continue assert await yield", @@ -103,7 +105,7 @@ export default function defineSilk(hljs) { relevance: 0, }; - const DECL_IMPL = { + const DECL_IMPL: Mode = { variants: [ { match: [/\bimpl\b/, /\s+/, QUALIFIED_NAME, /\s+/, /\bas\b/, /\s+/, QUALIFIED_NAME], diff --git a/src/lib/tabs.js b/src/lib/tabs.ts similarity index 85% rename from src/lib/tabs.js rename to src/lib/tabs.ts index 9827ec27..e9c25119 100644 --- a/src/lib/tabs.js +++ b/src/lib/tabs.ts @@ -1,13 +1,13 @@ -export function renderTabs(container) { +export function renderTabs(container: HTMLElement | null): void { if (!container) return; const doc = container.ownerDocument || document; const walker = doc.createTreeWalker(container, NodeFilter.SHOW_COMMENT); - const starts = []; + const starts: Comment[] = []; let node = null; while ((node = walker.nextNode())) { - const text = String(node.data || "").trim(); - if (text.startsWith("tabs:start")) starts.push(node); + const text = String(node.nodeValue || "").trim(); + if (text.startsWith("tabs:start")) starts.push(node as Comment); } let counter = 0; @@ -21,11 +21,11 @@ export function renderTabs(container) { const parent = start.parentNode; if (!parent) continue; - let end = null; + let end: Comment | null = null; let cur = start.nextSibling; while (cur) { - if (cur.nodeType === Node.COMMENT_NODE && String(cur.data || "").trim().startsWith("tabs:end")) { - end = cur; + if (cur.nodeType === Node.COMMENT_NODE && String(cur.nodeValue || "").trim().startsWith("tabs:end")) { + end = cur as Comment; break; } cur = cur.nextSibling; @@ -40,7 +40,7 @@ export function renderTabs(container) { } const headings = between.filter( - (n) => n.nodeType === Node.ELEMENT_NODE && /^H[2-6]$/.test(n.tagName || "") + (n): n is HTMLElement => n instanceof HTMLElement && /^H[2-6]$/.test(n.tagName) ); if (!headings.length) { start.remove(); @@ -91,7 +91,7 @@ export function renderTabs(container) { panels.push(panel); let child = heading.nextSibling; - while (child && child !== end && !(child.nodeType === Node.ELEMENT_NODE && child.tagName === headingTag)) { + while (child && child !== end && !(child instanceof Element && child.tagName === headingTag)) { const next = child.nextSibling; if (child.nodeType === Node.TEXT_NODE && !String(child.textContent || "").trim()) { child.remove(); diff --git a/src/lib/toml.js b/src/lib/toml.ts similarity index 94% rename from src/lib/toml.js rename to src/lib/toml.ts index 363514ee..f2befe29 100644 --- a/src/lib/toml.js +++ b/src/lib/toml.ts @@ -1,4 +1,6 @@ -export default function defineToml(hljs) { +import type { HLJSApi, Language } from 'highlight.js' + +export default function defineToml(hljs: HLJSApi): Language { const COMMENT = hljs.COMMENT("#", "$", { relevance: 0 }); const BASIC_STRING = { diff --git a/src/lib/zig.js b/src/lib/zig.ts similarity index 94% rename from src/lib/zig.js rename to src/lib/zig.ts index 06e1502d..7b8d01b3 100644 --- a/src/lib/zig.js +++ b/src/lib/zig.ts @@ -1,4 +1,6 @@ -export default function defineZig(hljs) { +import type { HLJSApi, Language } from 'highlight.js' + +export default function defineZig(hljs: HLJSApi): Language { const KEYWORDS = { keyword: "addrspace align allowzero and anyframe anytype asm async await break catch comptime const continue defer else enum errdefer error export extern fn for if inline linksection noalias noinline nosuspend orelse packed pub resume return callconv struct suspend switch test threadlocal try union unreachable usingnamespace var volatile while", diff --git a/src/markdown-it.settings.ts b/src/markdown-it.settings.ts index 35d6c39d..da15ee30 100644 --- a/src/markdown-it.settings.ts +++ b/src/markdown-it.settings.ts @@ -1,2 +1,4 @@ import { markdown } from './lib/markdown.ts' +// DOMStack accepts a factory returning a fully configured MarkdownIt instance. +// A fresh instance keeps heading-ID state page-local and bypasses default plugins. export default markdown diff --git a/src/runtime-index.template.ts b/src/runtime-index.template.ts new file mode 100644 index 00000000..74243956 --- /dev/null +++ b/src/runtime-index.template.ts @@ -0,0 +1,6 @@ +import type { DataDeps, TemplateFunction } from '@domstack/static/types.js' +import type { DocsData } from './lib/docs.ts' +import { collectionIndex } from './lib/artifacts.ts' +export const dataDeps = ['runtimeNavigation'] satisfies DataDeps<Pick<DocsData, 'runtimeNavigation'>> +const template: TemplateFunction<Record<string, unknown>, Pick<DocsData, 'runtimeNavigation'>> = ({ data }) => collectionIndex('runtime', data.runtimeNavigation) +export default template diff --git a/src/runtime-llms.template.ts b/src/runtime-llms.template.ts new file mode 100644 index 00000000..960d0153 --- /dev/null +++ b/src/runtime-llms.template.ts @@ -0,0 +1,6 @@ +import type { DataDeps, TemplateFunction } from '@domstack/static/types.js' +import type { DocsData } from './lib/docs.ts' +import { pack } from './lib/artifacts.ts' +export const dataDeps = ["runtimeExports"] satisfies DataDeps<Pick<DocsData, 'runtimeExports'>> +const template: TemplateFunction<{ siteUrl: string }, Pick<DocsData, 'runtimeExports'>> = ({ data, vars }) => pack('runtime', data.runtimeExports, vars.siteUrl) +export default template diff --git a/src/runtime-search.template.ts b/src/runtime-search.template.ts new file mode 100644 index 00000000..1db087d8 --- /dev/null +++ b/src/runtime-search.template.ts @@ -0,0 +1,6 @@ +import type { DataDeps, TemplateFunction } from '@domstack/static/types.js' +import type { DocsData } from './lib/docs.ts' +import { json } from './lib/artifacts.ts' +export const dataDeps = ['runtimeSearch'] satisfies DataDeps<Pick<DocsData, 'runtimeSearch'>> +const template: TemplateFunction<Record<string, unknown>, Pick<DocsData, 'runtimeSearch'>> = ({ data }) => json('/runtime/docs/search.json', data.runtimeSearch) +export default template diff --git a/src/runtime-sources.template.ts b/src/runtime-sources.template.ts new file mode 100644 index 00000000..d88a7ce1 --- /dev/null +++ b/src/runtime-sources.template.ts @@ -0,0 +1,6 @@ +import type { DataDeps, TemplateFunction } from '@domstack/static/types.js' +import type { DocsData } from './lib/docs.ts' +import { sources } from './lib/artifacts.ts' +export const dataDeps = ['runtimeExports'] satisfies DataDeps<Pick<DocsData, 'runtimeExports'>> +const template: TemplateFunction<Record<string, unknown>, Pick<DocsData, 'runtimeExports'>> = ({ data }) => sources(data.runtimeExports) +export default template diff --git a/src/runtime/docs/cli/build/page.md b/src/runtime/docs/cli/build/page.md index a4b73991..a04401a7 100644 --- a/src/runtime/docs/cli/build/page.md +++ b/src/runtime/docs/cli/build/page.md @@ -1,5 +1,5 @@ --- -layout: "docs" +layout: "runtime-docs" title: "oroc build" description: "Build an Oro Runtime application." docsCollection: "runtime" diff --git a/src/runtime/docs/cli/config/page.md b/src/runtime/docs/cli/config/page.md index aad4a0e5..85206dda 100644 --- a/src/runtime/docs/cli/config/page.md +++ b/src/runtime/docs/cli/config/page.md @@ -1,5 +1,5 @@ --- -layout: "docs" +layout: "runtime-docs" title: "oroc config" description: "Inspect configuration values." docsCollection: "runtime" diff --git a/src/runtime/docs/cli/env/page.md b/src/runtime/docs/cli/env/page.md index f6b60a71..1b5c0ac1 100644 --- a/src/runtime/docs/cli/env/page.md +++ b/src/runtime/docs/cli/env/page.md @@ -1,5 +1,5 @@ --- -layout: "docs" +layout: "runtime-docs" title: "oroc env" description: "Print environment variables relevant to the Oro CLI and build configuration." docsCollection: "runtime" diff --git a/src/runtime/docs/cli/help/page.md b/src/runtime/docs/cli/help/page.md index 00a41e3d..41047305 100644 --- a/src/runtime/docs/cli/help/page.md +++ b/src/runtime/docs/cli/help/page.md @@ -1,5 +1,5 @@ --- -layout: "docs" +layout: "runtime-docs" title: "oroc help" description: "Discover commands, options, and workflow entry points from the CLI help index." docsCollection: "runtime" diff --git a/src/runtime/docs/cli/init/page.md b/src/runtime/docs/cli/init/page.md index a10adb40..7cb6a545 100644 --- a/src/runtime/docs/cli/init/page.md +++ b/src/runtime/docs/cli/init/page.md @@ -1,5 +1,5 @@ --- -layout: "docs" +layout: "runtime-docs" title: "oroc init" description: "Create a new project. If the path is not provided, the new project is created in the current directory." docsCollection: "runtime" diff --git a/src/runtime/docs/cli/install-app/page.md b/src/runtime/docs/cli/install-app/page.md index e5be13d2..720f6897 100644 --- a/src/runtime/docs/cli/install-app/page.md +++ b/src/runtime/docs/cli/install-app/page.md @@ -1,5 +1,5 @@ --- -layout: "docs" +layout: "runtime-docs" title: "oroc install-app" description: "Install the app to the device or host target." docsCollection: "runtime" diff --git a/src/runtime/docs/cli/list-devices/page.md b/src/runtime/docs/cli/list-devices/page.md index fe580c1f..1b5a5475 100644 --- a/src/runtime/docs/cli/list-devices/page.md +++ b/src/runtime/docs/cli/list-devices/page.md @@ -1,5 +1,5 @@ --- -layout: "docs" +layout: "runtime-docs" title: "oroc list-devices" description: "Get the list of connected devices." docsCollection: "runtime" diff --git a/src/runtime/docs/cli/mcp/page.md b/src/runtime/docs/cli/mcp/page.md index 4e6b4615..95aa68b9 100644 --- a/src/runtime/docs/cli/mcp/page.md +++ b/src/runtime/docs/cli/mcp/page.md @@ -1,5 +1,5 @@ --- -layout: "docs" +layout: "runtime-docs" title: "oroc mcp" description: "Run a Model Context Protocol (MCP) server for agent tooling." docsCollection: "runtime" diff --git a/src/runtime/docs/cli/oroc/page.md b/src/runtime/docs/cli/oroc/page.md index 5422aee6..0fa0e559 100644 --- a/src/runtime/docs/cli/oroc/page.md +++ b/src/runtime/docs/cli/oroc/page.md @@ -1,5 +1,5 @@ --- -layout: "docs" +layout: "runtime-docs" title: "oroc" description: "oroc is the Oro Runtime command line tool. It builds, runs, packages, and inspects Oro Runtime projects." docsCollection: "runtime" diff --git a/src/runtime/docs/cli/print-build-dir/page.md b/src/runtime/docs/cli/print-build-dir/page.md index d3db8bf3..63404727 100644 --- a/src/runtime/docs/cli/print-build-dir/page.md +++ b/src/runtime/docs/cli/print-build-dir/page.md @@ -1,5 +1,5 @@ --- -layout: "docs" +layout: "runtime-docs" title: "oroc print-build-dir" description: "Print the build directory path." docsCollection: "runtime" diff --git a/src/runtime/docs/cli/run/page.md b/src/runtime/docs/cli/run/page.md index 229cf4e1..b764c6b2 100644 --- a/src/runtime/docs/cli/run/page.md +++ b/src/runtime/docs/cli/run/page.md @@ -1,5 +1,5 @@ --- -layout: "docs" +layout: "runtime-docs" title: "oroc run" description: "Run an Oro Runtime application." docsCollection: "runtime" diff --git a/src/runtime/docs/cli/setup/page.md b/src/runtime/docs/cli/setup/page.md index 60c6a73d..7662b93a 100644 --- a/src/runtime/docs/cli/setup/page.md +++ b/src/runtime/docs/cli/setup/page.md @@ -1,5 +1,5 @@ --- -layout: "docs" +layout: "runtime-docs" title: "oroc setup" description: "Setup build tools for the host or a target platform." docsCollection: "runtime" diff --git a/src/runtime/docs/cli/update/bundle/page.md b/src/runtime/docs/cli/update/bundle/page.md index 9c8b2e54..d613cae6 100644 --- a/src/runtime/docs/cli/update/bundle/page.md +++ b/src/runtime/docs/cli/update/bundle/page.md @@ -1,5 +1,5 @@ --- -layout: "docs" +layout: "runtime-docs" title: "oroc update bundle" description: "Build a tar archive containing a directory for use as an update artifact." docsCollection: "runtime" diff --git a/src/runtime/docs/cli/update/extract/page.md b/src/runtime/docs/cli/update/extract/page.md index a8a21672..c2f4189c 100644 --- a/src/runtime/docs/cli/update/extract/page.md +++ b/src/runtime/docs/cli/update/extract/page.md @@ -1,5 +1,5 @@ --- -layout: "docs" +layout: "runtime-docs" title: "oroc update extract" description: "Extract a tar archive produced by oroc update bundle into a destination directory." docsCollection: "runtime" diff --git a/src/runtime/docs/cli/update/info/page.md b/src/runtime/docs/cli/update/info/page.md index 036b4858..51e62314 100644 --- a/src/runtime/docs/cli/update/info/page.md +++ b/src/runtime/docs/cli/update/info/page.md @@ -1,5 +1,5 @@ --- -layout: "docs" +layout: "runtime-docs" title: "oroc update info" description: "Query update servers or static manifests over HTTP, TCP, or UDP." docsCollection: "runtime" diff --git a/src/runtime/docs/cli/update/init/page.md b/src/runtime/docs/cli/update/init/page.md index eed4cd65..48cbcde3 100644 --- a/src/runtime/docs/cli/update/init/page.md +++ b/src/runtime/docs/cli/update/init/page.md @@ -1,5 +1,5 @@ --- -layout: "docs" +layout: "runtime-docs" title: "oroc update init" description: "Scaffold a minimal update manifest JSON file." docsCollection: "runtime" diff --git a/src/runtime/docs/cli/update/keygen/page.md b/src/runtime/docs/cli/update/keygen/page.md index c3f7c34f..487b2416 100644 --- a/src/runtime/docs/cli/update/keygen/page.md +++ b/src/runtime/docs/cli/update/keygen/page.md @@ -1,5 +1,5 @@ --- -layout: "docs" +layout: "runtime-docs" title: "oroc update keygen" description: "Generate an Ed25519 keypair for signing update manifests." docsCollection: "runtime" diff --git a/src/runtime/docs/cli/update/page.md b/src/runtime/docs/cli/update/page.md index 7f237611..465165cf 100644 --- a/src/runtime/docs/cli/update/page.md +++ b/src/runtime/docs/cli/update/page.md @@ -1,5 +1,5 @@ --- -layout: "docs" +layout: "runtime-docs" title: "oroc update" description: "Update tooling for manifests, signatures, and bundles." docsCollection: "runtime" diff --git a/src/runtime/docs/cli/update/server/page.md b/src/runtime/docs/cli/update/server/page.md index eae65fae..de55594f 100644 --- a/src/runtime/docs/cli/update/server/page.md +++ b/src/runtime/docs/cli/update/server/page.md @@ -1,5 +1,5 @@ --- -layout: "docs" +layout: "runtime-docs" title: "oroc update server" description: "Run an update server that speaks the Oro Application Update Protocol." docsCollection: "runtime" diff --git a/src/runtime/docs/cli/update/sign/page.md b/src/runtime/docs/cli/update/sign/page.md index 48aa9a82..1b341c37 100644 --- a/src/runtime/docs/cli/update/sign/page.md +++ b/src/runtime/docs/cli/update/sign/page.md @@ -1,5 +1,5 @@ --- -layout: "docs" +layout: "runtime-docs" title: "oroc update sign" description: "Sign an update manifest and emit a detached manifest.sig file." docsCollection: "runtime" diff --git a/src/runtime/docs/cli/update/validate/page.md b/src/runtime/docs/cli/update/validate/page.md index 9d5395c7..61d9c111 100644 --- a/src/runtime/docs/cli/update/validate/page.md +++ b/src/runtime/docs/cli/update/validate/page.md @@ -1,5 +1,5 @@ --- -layout: "docs" +layout: "runtime-docs" title: "oroc update validate" description: "Validate an update manifest JSON file against the expected schema shape." docsCollection: "runtime" diff --git a/src/runtime/docs/cli/update/verify/page.md b/src/runtime/docs/cli/update/verify/page.md index 8bd65747..648a9065 100644 --- a/src/runtime/docs/cli/update/verify/page.md +++ b/src/runtime/docs/cli/update/verify/page.md @@ -1,5 +1,5 @@ --- -layout: "docs" +layout: "runtime-docs" title: "oroc update verify" description: "Verify a manifest and signature pair using an Ed25519 public key." docsCollection: "runtime" diff --git a/src/runtime/docs/cli/version/page.md b/src/runtime/docs/cli/version/page.md index bca957f5..9c180314 100644 --- a/src/runtime/docs/cli/version/page.md +++ b/src/runtime/docs/cli/version/page.md @@ -1,5 +1,5 @@ --- -layout: "docs" +layout: "runtime-docs" title: "oroc version" description: "Inspect or bump the project version defined in your configuration file." docsCollection: "runtime" diff --git a/src/runtime/docs/cli/versions/page.md b/src/runtime/docs/cli/versions/page.md index 2db4edaf..c0b2ad80 100644 --- a/src/runtime/docs/cli/versions/page.md +++ b/src/runtime/docs/cli/versions/page.md @@ -1,5 +1,5 @@ --- -layout: "docs" +layout: "runtime-docs" title: "oroc versions" description: "Print Oro CLI/runtime and dependency versions." docsCollection: "runtime" diff --git a/src/runtime/docs/config/copy-map/page.md b/src/runtime/docs/config/copy-map/page.md index 7697f99a..bf913487 100644 --- a/src/runtime/docs/config/copy-map/page.md +++ b/src/runtime/docs/config/copy-map/page.md @@ -1,5 +1,5 @@ --- -layout: "docs" +layout: "runtime-docs" title: "copy_map" description: "Copy-maps let you explicitly map build inputs into your app bundle. They are referenced from oro.toml:" docsCollection: "runtime" diff --git a/src/runtime/docs/config/overview/page.md b/src/runtime/docs/config/overview/page.md index d09f52cd..574d1d7c 100644 --- a/src/runtime/docs/config/overview/page.md +++ b/src/runtime/docs/config/overview/page.md @@ -1,5 +1,5 @@ --- -layout: "docs" +layout: "runtime-docs" title: "Configuration overview" description: "Oro Runtime projects are configured with a file named oro.toml (TOML) in the project root." docsCollection: "runtime" diff --git a/src/runtime/docs/config/reference/page.md b/src/runtime/docs/config/reference/page.md index 080618cd..ac71c82d 100644 --- a/src/runtime/docs/config/reference/page.md +++ b/src/runtime/docs/config/reference/page.md @@ -1,5 +1,5 @@ --- -layout: "docs" +layout: "runtime-docs" title: "Configuration reference" description: "This page documents the most commonly used oro.toml sections and keys." docsCollection: "runtime" diff --git a/src/runtime/docs/guides/build-and-package/page.md b/src/runtime/docs/guides/build-and-package/page.md index d83d5336..28ce62cd 100644 --- a/src/runtime/docs/guides/build-and-package/page.md +++ b/src/runtime/docs/guides/build-and-package/page.md @@ -1,5 +1,5 @@ --- -layout: "docs" +layout: "runtime-docs" title: "Build and package" description: "This guide summarizes the workflows downstream app developers use most:" docsCollection: "runtime" diff --git a/src/runtime/docs/guides/calling-http-apis/page.md b/src/runtime/docs/guides/calling-http-apis/page.md index a3c640a1..78a04cec 100644 --- a/src/runtime/docs/guides/calling-http-apis/page.md +++ b/src/runtime/docs/guides/calling-http-apis/page.md @@ -1,5 +1,5 @@ --- -layout: "docs" +layout: "runtime-docs" title: "Calling HTTP APIs" description: "Most production applications spend their time moving between three layers:" docsCollection: "runtime" diff --git a/src/runtime/docs/guides/configure-your-runtime-project/page.md b/src/runtime/docs/guides/configure-your-runtime-project/page.md index 30fa94da..ff7bd7b7 100644 --- a/src/runtime/docs/guides/configure-your-runtime-project/page.md +++ b/src/runtime/docs/guides/configure-your-runtime-project/page.md @@ -1,5 +1,5 @@ --- -layout: "docs" +layout: "runtime-docs" title: "Configure your runtime project" description: "Oro Runtime projects are controlled by oro.toml, with optional machine-local overrides in .ororc. Treat those files as part of the app contract: they define what ships, how the window behaves, which p" docsCollection: "runtime" diff --git a/src/runtime/docs/guides/custom-protocols-and-routing/page.md b/src/runtime/docs/guides/custom-protocols-and-routing/page.md index 6bb3a382..94b6d106 100644 --- a/src/runtime/docs/guides/custom-protocols-and-routing/page.md +++ b/src/runtime/docs/guides/custom-protocols-and-routing/page.md @@ -1,5 +1,5 @@ --- -layout: "docs" +layout: "runtime-docs" title: "Custom protocols and routing" description: "Some apps need more than a single https://-style origin. Custom protocols let you give internal resources a stable shape and route them through service-worker logic instead of hard-coding filesystem p" docsCollection: "runtime" diff --git a/src/runtime/docs/guides/desktop-integrations/page.md b/src/runtime/docs/guides/desktop-integrations/page.md index ac84389b..c31c4c92 100644 --- a/src/runtime/docs/guides/desktop-integrations/page.md +++ b/src/runtime/docs/guides/desktop-integrations/page.md @@ -1,5 +1,5 @@ --- -layout: "docs" +layout: "runtime-docs" title: "Desktop integrations" description: "Oro Runtime applications stay web-first, but the point of the runtime is that you do not stop at the browser boundary. This guide shows how to add four integrations users actually notice: notification" docsCollection: "runtime" diff --git a/src/runtime/docs/guides/files-and-sandboxing/page.md b/src/runtime/docs/guides/files-and-sandboxing/page.md index 67873437..e6fe2ba2 100644 --- a/src/runtime/docs/guides/files-and-sandboxing/page.md +++ b/src/runtime/docs/guides/files-and-sandboxing/page.md @@ -1,5 +1,5 @@ --- -layout: "docs" +layout: "runtime-docs" title: "Files and sandboxing" description: "Most serious applications need two kinds of file access:" docsCollection: "runtime" diff --git a/src/runtime/docs/guides/from-zero-to-first-run/page.md b/src/runtime/docs/guides/from-zero-to-first-run/page.md index 9b4ca603..db62c545 100644 --- a/src/runtime/docs/guides/from-zero-to-first-run/page.md +++ b/src/runtime/docs/guides/from-zero-to-first-run/page.md @@ -1,5 +1,5 @@ --- -layout: "docs" +layout: "runtime-docs" title: "From zero to first run" description: "This guide starts from an empty directory and gets you to a runnable Oro Runtime application using the installed toolchain. The goal is not just to boot a page, but to end with a project that already " docsCollection: "runtime" diff --git a/src/runtime/docs/guides/frontend-build-pipeline/page.md b/src/runtime/docs/guides/frontend-build-pipeline/page.md index f69261f8..f685bf55 100644 --- a/src/runtime/docs/guides/frontend-build-pipeline/page.md +++ b/src/runtime/docs/guides/frontend-build-pipeline/page.md @@ -1,5 +1,5 @@ --- -layout: "docs" +layout: "runtime-docs" title: "Frontend build pipeline" description: "Most production Oro Runtime applications do not ship raw source files. They run a web build first, then copy the built artifacts into the runtime bundle. This guide shows a clean pipeline that works f" docsCollection: "runtime" diff --git a/src/runtime/docs/guides/hello-world/page.md b/src/runtime/docs/guides/hello-world/page.md index f63a91c5..d4edb38c 100644 --- a/src/runtime/docs/guides/hello-world/page.md +++ b/src/runtime/docs/guides/hello-world/page.md @@ -1,5 +1,5 @@ --- -layout: "docs" +layout: "runtime-docs" title: "Hello world" description: "This guide builds a small Oro Runtime app that does three things immediately:" docsCollection: "runtime" diff --git a/src/runtime/docs/guides/lifecycle-hooks-and-deep-links/page.md b/src/runtime/docs/guides/lifecycle-hooks-and-deep-links/page.md index 820f79be..86ad9199 100644 --- a/src/runtime/docs/guides/lifecycle-hooks-and-deep-links/page.md +++ b/src/runtime/docs/guides/lifecycle-hooks-and-deep-links/page.md @@ -1,5 +1,5 @@ --- -layout: "docs" +layout: "runtime-docs" title: "Lifecycle hooks and deep links" description: "Lifecycle hooks are where the application stops being a generic page and starts reacting like a native application. Use them for readiness, connectivity, backgrounding, and OS-delivered URLs." docsCollection: "runtime" diff --git a/src/runtime/docs/guides/local-data-with-sqlite/page.md b/src/runtime/docs/guides/local-data-with-sqlite/page.md index ffec88c1..7bf2452f 100644 --- a/src/runtime/docs/guides/local-data-with-sqlite/page.md +++ b/src/runtime/docs/guides/local-data-with-sqlite/page.md @@ -1,5 +1,5 @@ --- -layout: "docs" +layout: "runtime-docs" title: "Local data with SQLite" description: "Once an app moves beyond a few JSON files, SQLite is the right default. It gives you transactions, indexes, and queryable data without adding another service to your deployment story." docsCollection: "runtime" diff --git a/src/runtime/docs/guides/mcp-and-agent-automation/page.md b/src/runtime/docs/guides/mcp-and-agent-automation/page.md index 21622762..210c7cdb 100644 --- a/src/runtime/docs/guides/mcp-and-agent-automation/page.md +++ b/src/runtime/docs/guides/mcp-and-agent-automation/page.md @@ -1,5 +1,5 @@ --- -layout: "docs" +layout: "runtime-docs" title: "MCP and agent automation" description: "Oro Runtime supports MCP in two complementary ways:" docsCollection: "runtime" diff --git a/src/runtime/docs/guides/mobile-targets-and-device-installs/page.md b/src/runtime/docs/guides/mobile-targets-and-device-installs/page.md index 80bfe8d4..55094197 100644 --- a/src/runtime/docs/guides/mobile-targets-and-device-installs/page.md +++ b/src/runtime/docs/guides/mobile-targets-and-device-installs/page.md @@ -1,5 +1,5 @@ --- -layout: "docs" +layout: "runtime-docs" title: "Mobile targets and device installs" description: "Oro Runtime can target Android and Apple devices from the same project model. The key is to separate three concerns:" docsCollection: "runtime" diff --git a/src/runtime/docs/guides/native-extensions/page.md b/src/runtime/docs/guides/native-extensions/page.md index 8ede3007..5a146fc5 100644 --- a/src/runtime/docs/guides/native-extensions/page.md +++ b/src/runtime/docs/guides/native-extensions/page.md @@ -1,5 +1,5 @@ --- -layout: "docs" +layout: "runtime-docs" title: "Native extensions" description: "Use a native extension when app code needs a capability that should not live in JavaScript: an existing C/C++ library, platform-specific code, long-running native work, or a Wasm module that should be" docsCollection: "runtime" diff --git a/src/runtime/docs/guides/offline-first-with-service-workers/page.md b/src/runtime/docs/guides/offline-first-with-service-workers/page.md index cd70331f..0f8cdf6f 100644 --- a/src/runtime/docs/guides/offline-first-with-service-workers/page.md +++ b/src/runtime/docs/guides/offline-first-with-service-workers/page.md @@ -1,5 +1,5 @@ --- -layout: "docs" +layout: "runtime-docs" title: "Offline-first with service workers" description: "For applications that need to keep working without reliable connectivity, service workers are the right boundary. Use them to cache the application shell, serve known assets, and provide controlled fa" docsCollection: "runtime" diff --git a/src/runtime/docs/guides/project-layout/page.md b/src/runtime/docs/guides/project-layout/page.md index facaa515..6f84627b 100644 --- a/src/runtime/docs/guides/project-layout/page.md +++ b/src/runtime/docs/guides/project-layout/page.md @@ -1,5 +1,5 @@ --- -layout: "docs" +layout: "runtime-docs" title: "Project layout" description: "An Oro Runtime project is a directory with:" docsCollection: "runtime" diff --git a/src/runtime/docs/guides/release-packaging-and-signed-updates/page.md b/src/runtime/docs/guides/release-packaging-and-signed-updates/page.md index 35bd4d7f..fdde093a 100644 --- a/src/runtime/docs/guides/release-packaging-and-signed-updates/page.md +++ b/src/runtime/docs/guides/release-packaging-and-signed-updates/page.md @@ -1,5 +1,5 @@ --- -layout: "docs" +layout: "runtime-docs" title: "Release packaging and signed updates" description: "Shipping the app is only half of the release story. The other half is producing update artifacts that can be verified, served, and diagnosed later without improvisation." docsCollection: "runtime" diff --git a/src/runtime/docs/guides/secure-storage-and-sessions/page.md b/src/runtime/docs/guides/secure-storage-and-sessions/page.md index 21afd2b0..8f290686 100644 --- a/src/runtime/docs/guides/secure-storage-and-sessions/page.md +++ b/src/runtime/docs/guides/secure-storage-and-sessions/page.md @@ -1,5 +1,5 @@ --- -layout: "docs" +layout: "runtime-docs" title: "Secure storage and sessions" description: "Application data and application secrets are not the same thing. Put notes, caches, and drafts in the filesystem or SQLite. Put refresh tokens, client secrets, and other credentials in oro:secure-stor" docsCollection: "runtime" diff --git a/src/runtime/docs/guides/shared-workers-across-windows/page.md b/src/runtime/docs/guides/shared-workers-across-windows/page.md index 540b96b7..c3dc1941 100644 --- a/src/runtime/docs/guides/shared-workers-across-windows/page.md +++ b/src/runtime/docs/guides/shared-workers-across-windows/page.md @@ -1,5 +1,5 @@ --- -layout: "docs" +layout: "runtime-docs" title: "Shared workers across windows" description: "If one background coordinator should serve multiple windows at the same time, use a shared worker instead of one worker per window. This is a strong fit for search indexing, presence state, websocket " docsCollection: "runtime" diff --git a/src/runtime/docs/guides/testing-and-diagnostics/page.md b/src/runtime/docs/guides/testing-and-diagnostics/page.md index 2c7562a0..c1b10b5c 100644 --- a/src/runtime/docs/guides/testing-and-diagnostics/page.md +++ b/src/runtime/docs/guides/testing-and-diagnostics/page.md @@ -1,5 +1,5 @@ --- -layout: "docs" +layout: "runtime-docs" title: "Testing and diagnostics" description: "If the runtime app is real, it needs two things early:" docsCollection: "runtime" diff --git a/src/runtime/docs/guides/windows-and-messaging/page.md b/src/runtime/docs/guides/windows-and-messaging/page.md index d75a373b..09e6d535 100644 --- a/src/runtime/docs/guides/windows-and-messaging/page.md +++ b/src/runtime/docs/guides/windows-and-messaging/page.md @@ -1,5 +1,5 @@ --- -layout: "docs" +layout: "runtime-docs" title: "Windows and messaging" description: "Oro Runtime apps can create multiple windows. Windows are identified by a numeric index." docsCollection: "runtime" diff --git a/src/runtime/docs/guides/worker-threads-for-heavy-work/page.md b/src/runtime/docs/guides/worker-threads-for-heavy-work/page.md index afcf860c..dfb9170e 100644 --- a/src/runtime/docs/guides/worker-threads-for-heavy-work/page.md +++ b/src/runtime/docs/guides/worker-threads-for-heavy-work/page.md @@ -1,5 +1,5 @@ --- -layout: "docs" +layout: "runtime-docs" title: "Worker threads for heavy work" description: "The main window should stay responsive. If a task is CPU-heavy or processes large blobs of text or binary data, move it to oro:worker_threads." docsCollection: "runtime" diff --git a/src/runtime/docs/javascript/ai/page.md b/src/runtime/docs/javascript/ai/page.md index 26f1e667..bb4f0329 100644 --- a/src/runtime/docs/javascript/ai/page.md +++ b/src/runtime/docs/javascript/ai/page.md @@ -1,5 +1,5 @@ --- -layout: "docs" +layout: "runtime-docs" title: "oro:ai" description: "oro:ai exposes local AI helpers. It currently exports two modules:" docsCollection: "runtime" diff --git a/src/runtime/docs/javascript/all-modules/page.md b/src/runtime/docs/javascript/all-modules/page.md index 70ca91b5..eed282f8 100644 --- a/src/runtime/docs/javascript/all-modules/page.md +++ b/src/runtime/docs/javascript/all-modules/page.md @@ -1,5 +1,5 @@ --- -layout: "docs" +layout: "runtime-docs" title: "JavaScript API modules" description: "Oro Runtime exposes native capabilities as explicit ES module imports under the oro:* namespace. Treat those imports as the boundary between ordinary web code and host capabilities." docsCollection: "runtime" diff --git a/src/runtime/docs/javascript/application/page.md b/src/runtime/docs/javascript/application/page.md index 2c36343d..611865dd 100644 --- a/src/runtime/docs/javascript/application/page.md +++ b/src/runtime/docs/javascript/application/page.md @@ -1,5 +1,5 @@ --- -layout: "docs" +layout: "runtime-docs" title: "oro:application" description: "oro:application exposes application-level APIs: creating windows, querying windows, menus, and runtime metadata." docsCollection: "runtime" diff --git a/src/runtime/docs/javascript/asn1/page.md b/src/runtime/docs/javascript/asn1/page.md index 34b6780d..2e966e4d 100644 --- a/src/runtime/docs/javascript/asn1/page.md +++ b/src/runtime/docs/javascript/asn1/page.md @@ -1,5 +1,5 @@ --- -layout: "docs" +layout: "runtime-docs" title: "oro:asn1" description: "oro:asn1 parses ASN.1 source text and files into structured module data." docsCollection: "runtime" diff --git a/src/runtime/docs/javascript/assert/page.md b/src/runtime/docs/javascript/assert/page.md index 4352bf0b..2549e552 100644 --- a/src/runtime/docs/javascript/assert/page.md +++ b/src/runtime/docs/javascript/assert/page.md @@ -1,5 +1,5 @@ --- -layout: "docs" +layout: "runtime-docs" title: "oro:assert" description: "oro:assert provides Node-compatible assertion helpers for tests, runtime checks, and invariants." docsCollection: "runtime" diff --git a/src/runtime/docs/javascript/async/page.md b/src/runtime/docs/javascript/async/page.md index c01df7b5..9b25958f 100644 --- a/src/runtime/docs/javascript/async/page.md +++ b/src/runtime/docs/javascript/async/page.md @@ -1,5 +1,5 @@ --- -layout: "docs" +layout: "runtime-docs" title: "oro:async" description: "oro:async exposes async context propagation, deferred values, and resource tracking primitives." docsCollection: "runtime" diff --git a/src/runtime/docs/javascript/async_hooks/page.md b/src/runtime/docs/javascript/async_hooks/page.md index 2e14e095..2a5003cb 100644 --- a/src/runtime/docs/javascript/async_hooks/page.md +++ b/src/runtime/docs/javascript/async_hooks/page.md @@ -1,5 +1,5 @@ --- -layout: "docs" +layout: "runtime-docs" title: "oro:async_hooks" description: "oro:async_hooks exposes hook-based async lifecycle inspection compatible with Node-style instrumentation." docsCollection: "runtime" diff --git a/src/runtime/docs/javascript/background/page.md b/src/runtime/docs/javascript/background/page.md index b5827198..2a072383 100644 --- a/src/runtime/docs/javascript/background/page.md +++ b/src/runtime/docs/javascript/background/page.md @@ -1,5 +1,5 @@ --- -layout: "docs" +layout: "runtime-docs" title: "oro:background" description: "oro:background lets you inspect and coordinate the runtime background task surface." docsCollection: "runtime" diff --git a/src/runtime/docs/javascript/buffer/page.md b/src/runtime/docs/javascript/buffer/page.md index e7be624c..fe3d3be4 100644 --- a/src/runtime/docs/javascript/buffer/page.md +++ b/src/runtime/docs/javascript/buffer/page.md @@ -1,5 +1,5 @@ --- -layout: "docs" +layout: "runtime-docs" title: "oro:buffer" description: "oro:buffer provides Buffer, Blob, and related byte-oriented helpers." docsCollection: "runtime" diff --git a/src/runtime/docs/javascript/cdp/page.md b/src/runtime/docs/javascript/cdp/page.md index 01231070..8d47788e 100644 --- a/src/runtime/docs/javascript/cdp/page.md +++ b/src/runtime/docs/javascript/cdp/page.md @@ -1,5 +1,5 @@ --- -layout: "docs" +layout: "runtime-docs" title: "oro:cdp" description: "oro:cdp controls the runtime Chrome DevTools Protocol endpoint used for inspection and debugging." docsCollection: "runtime" diff --git a/src/runtime/docs/javascript/child_process/page.md b/src/runtime/docs/javascript/child_process/page.md index a43fc9b5..78c77e25 100644 --- a/src/runtime/docs/javascript/child_process/page.md +++ b/src/runtime/docs/javascript/child_process/page.md @@ -1,5 +1,5 @@ --- -layout: "docs" +layout: "runtime-docs" title: "oro:child_process" description: "oro:child_process launches and manages subprocesses with a Node-compatible API." docsCollection: "runtime" diff --git a/src/runtime/docs/javascript/clipboard/page.md b/src/runtime/docs/javascript/clipboard/page.md index cf5b9abf..27520e18 100644 --- a/src/runtime/docs/javascript/clipboard/page.md +++ b/src/runtime/docs/javascript/clipboard/page.md @@ -1,5 +1,5 @@ --- -layout: "docs" +layout: "runtime-docs" title: "oro:clipboard" description: "oro:clipboard reads and writes clipboard text from the current application context." docsCollection: "runtime" diff --git a/src/runtime/docs/javascript/commonjs/page.md b/src/runtime/docs/javascript/commonjs/page.md index 5cb27a9f..1d633f91 100644 --- a/src/runtime/docs/javascript/commonjs/page.md +++ b/src/runtime/docs/javascript/commonjs/page.md @@ -1,5 +1,5 @@ --- -layout: "docs" +layout: "runtime-docs" title: "oro:commonjs" description: "oro:commonjs/* exposes the runtime’s CommonJS loader, cache, and resolution helpers." docsCollection: "runtime" diff --git a/src/runtime/docs/javascript/conduit/page.md b/src/runtime/docs/javascript/conduit/page.md index 569d0938..bbfb1504 100644 --- a/src/runtime/docs/javascript/conduit/page.md +++ b/src/runtime/docs/javascript/conduit/page.md @@ -1,5 +1,5 @@ --- -layout: "docs" +layout: "runtime-docs" title: "oro:conduit" description: "oro:conduit manages the runtime WebSocket conduit used for internal cross-surface messaging." docsCollection: "runtime" diff --git a/src/runtime/docs/javascript/console/page.md b/src/runtime/docs/javascript/console/page.md index 6d7cfa4e..251181ac 100644 --- a/src/runtime/docs/javascript/console/page.md +++ b/src/runtime/docs/javascript/console/page.md @@ -1,5 +1,5 @@ --- -layout: "docs" +layout: "runtime-docs" title: "oro:console" description: "oro:console exposes the runtime console implementation and patch helpers." docsCollection: "runtime" diff --git a/src/runtime/docs/javascript/constants/page.md b/src/runtime/docs/javascript/constants/page.md index 474abf9e..c4b73535 100644 --- a/src/runtime/docs/javascript/constants/page.md +++ b/src/runtime/docs/javascript/constants/page.md @@ -1,5 +1,5 @@ --- -layout: "docs" +layout: "runtime-docs" title: "oro:constants" description: "oro:constants publishes the runtime’s platform, errno, and low-level constant tables." docsCollection: "runtime" diff --git a/src/runtime/docs/javascript/cookies/page.md b/src/runtime/docs/javascript/cookies/page.md index c79d25c6..35e64433 100644 --- a/src/runtime/docs/javascript/cookies/page.md +++ b/src/runtime/docs/javascript/cookies/page.md @@ -1,5 +1,5 @@ --- -layout: "docs" +layout: "runtime-docs" title: "oro:cookies" description: "oro:cookies reads and writes cookies for application-controlled origins." docsCollection: "runtime" diff --git a/src/runtime/docs/javascript/crypto/page.md b/src/runtime/docs/javascript/crypto/page.md index 95e0524e..c56a3cff 100644 --- a/src/runtime/docs/javascript/crypto/page.md +++ b/src/runtime/docs/javascript/crypto/page.md @@ -1,5 +1,5 @@ --- -layout: "docs" +layout: "runtime-docs" title: "oro:crypto" description: "oro:crypto exposes hashing, random bytes, and bundled sodium-backed helpers." docsCollection: "runtime" diff --git a/src/runtime/docs/javascript/dbus/page.md b/src/runtime/docs/javascript/dbus/page.md index 1c2bc803..a1e6b986 100644 --- a/src/runtime/docs/javascript/dbus/page.md +++ b/src/runtime/docs/javascript/dbus/page.md @@ -1,5 +1,5 @@ --- -layout: "docs" +layout: "runtime-docs" title: "oro:dbus" description: "oro:dbus connects to DBus and lets JavaScript code call methods, watch signals, and manage names." docsCollection: "runtime" diff --git a/src/runtime/docs/javascript/dgram/page.md b/src/runtime/docs/javascript/dgram/page.md index 95276493..02d9e479 100644 --- a/src/runtime/docs/javascript/dgram/page.md +++ b/src/runtime/docs/javascript/dgram/page.md @@ -1,5 +1,5 @@ --- -layout: "docs" +layout: "runtime-docs" title: "oro:dgram" description: "oro:dgram provides UDP sockets and multicast helpers with a Node-compatible API." docsCollection: "runtime" diff --git a/src/runtime/docs/javascript/diagnostics/page.md b/src/runtime/docs/javascript/diagnostics/page.md index 4fda187f..ec41c92d 100644 --- a/src/runtime/docs/javascript/diagnostics/page.md +++ b/src/runtime/docs/javascript/diagnostics/page.md @@ -1,5 +1,5 @@ --- -layout: "docs" +layout: "runtime-docs" title: "oro:diagnostics" description: "oro:diagnostics exposes channels, metrics, and runtime/window diagnostic queries." docsCollection: "runtime" diff --git a/src/runtime/docs/javascript/did/page.md b/src/runtime/docs/javascript/did/page.md index aaafb2fa..19d14931 100644 --- a/src/runtime/docs/javascript/did/page.md +++ b/src/runtime/docs/javascript/did/page.md @@ -1,5 +1,5 @@ --- -layout: "docs" +layout: "runtime-docs" title: "oro:did" description: "oro:did parses and manipulates decentralized identifiers and DID URLs." docsCollection: "runtime" diff --git a/src/runtime/docs/javascript/dns/page.md b/src/runtime/docs/javascript/dns/page.md index 59fd64ea..ad911870 100644 --- a/src/runtime/docs/javascript/dns/page.md +++ b/src/runtime/docs/javascript/dns/page.md @@ -1,5 +1,5 @@ --- -layout: "docs" +layout: "runtime-docs" title: "oro:dns" description: "oro:dns provides DNS lookup helpers and promise-based resolution APIs." docsCollection: "runtime" diff --git a/src/runtime/docs/javascript/enumeration/page.md b/src/runtime/docs/javascript/enumeration/page.md index 34cf6a3c..8b0f1e0a 100644 --- a/src/runtime/docs/javascript/enumeration/page.md +++ b/src/runtime/docs/javascript/enumeration/page.md @@ -1,5 +1,5 @@ --- -layout: "docs" +layout: "runtime-docs" title: "oro:enumeration" description: "oro:enumeration is a small typed-set helper used throughout the runtime surface." docsCollection: "runtime" diff --git a/src/runtime/docs/javascript/errno/page.md b/src/runtime/docs/javascript/errno/page.md index d849a87b..8fa29a70 100644 --- a/src/runtime/docs/javascript/errno/page.md +++ b/src/runtime/docs/javascript/errno/page.md @@ -1,5 +1,5 @@ --- -layout: "docs" +layout: "runtime-docs" title: "oro:errno" description: "oro:errno converts errno values to names and messages." docsCollection: "runtime" diff --git a/src/runtime/docs/javascript/errors/page.md b/src/runtime/docs/javascript/errors/page.md index 30ce6be7..b8ba3f27 100644 --- a/src/runtime/docs/javascript/errors/page.md +++ b/src/runtime/docs/javascript/errors/page.md @@ -1,5 +1,5 @@ --- -layout: "docs" +layout: "runtime-docs" title: "oro:errors" description: "oro:errors exports DOM-style and runtime-specific error classes and constants." docsCollection: "runtime" diff --git a/src/runtime/docs/javascript/events/page.md b/src/runtime/docs/javascript/events/page.md index f2b52ff2..520fea2c 100644 --- a/src/runtime/docs/javascript/events/page.md +++ b/src/runtime/docs/javascript/events/page.md @@ -1,5 +1,5 @@ --- -layout: "docs" +layout: "runtime-docs" title: "oro:events" description: "oro:events provides EventEmitter, EventTarget, and event primitives used across the runtime." docsCollection: "runtime" diff --git a/src/runtime/docs/javascript/extension/page.md b/src/runtime/docs/javascript/extension/page.md index c3646546..da6fba30 100644 --- a/src/runtime/docs/javascript/extension/page.md +++ b/src/runtime/docs/javascript/extension/page.md @@ -1,5 +1,5 @@ --- -layout: "docs" +layout: "runtime-docs" title: "oro:extension" description: "oro:extension loads app-bundled native extensions and Wasm extensions, then exposes their registered runtime state to JavaScript." docsCollection: "runtime" diff --git a/src/runtime/docs/javascript/fetch/page.md b/src/runtime/docs/javascript/fetch/page.md index b1879ced..e266b9af 100644 --- a/src/runtime/docs/javascript/fetch/page.md +++ b/src/runtime/docs/javascript/fetch/page.md @@ -1,5 +1,5 @@ --- -layout: "docs" +layout: "runtime-docs" title: "oro:fetch" description: "oro:fetch exposes the runtime fetch stack and standard request/response primitives." docsCollection: "runtime" diff --git a/src/runtime/docs/javascript/fs/page.md b/src/runtime/docs/javascript/fs/page.md index aad0d63b..16f11974 100644 --- a/src/runtime/docs/javascript/fs/page.md +++ b/src/runtime/docs/javascript/fs/page.md @@ -1,5 +1,5 @@ --- -layout: "docs" +layout: "runtime-docs" title: "oro:fs" description: "oro:fs provides filesystem APIs modeled on POSIX and Node.js." docsCollection: "runtime" diff --git a/src/runtime/docs/javascript/gc/page.md b/src/runtime/docs/javascript/gc/page.md index ce73b1d5..de9dfb3e 100644 --- a/src/runtime/docs/javascript/gc/page.md +++ b/src/runtime/docs/javascript/gc/page.md @@ -1,5 +1,5 @@ --- -layout: "docs" +layout: "runtime-docs" title: "oro:gc" description: "oro:gc lets you register finalizers and control object retention hooks." docsCollection: "runtime" diff --git a/src/runtime/docs/javascript/hci/page.md b/src/runtime/docs/javascript/hci/page.md index 4b94449e..5b18f4cd 100644 --- a/src/runtime/docs/javascript/hci/page.md +++ b/src/runtime/docs/javascript/hci/page.md @@ -1,5 +1,5 @@ --- -layout: "docs" +layout: "runtime-docs" title: "oro:hci" description: "oro:hci exposes host controller interface helpers for low-level Bluetooth adapter access." docsCollection: "runtime" diff --git a/src/runtime/docs/javascript/hooks/page.md b/src/runtime/docs/javascript/hooks/page.md index b07b0fe2..7d134a70 100644 --- a/src/runtime/docs/javascript/hooks/page.md +++ b/src/runtime/docs/javascript/hooks/page.md @@ -1,5 +1,5 @@ --- -layout: "docs" +layout: "runtime-docs" title: "oro:hooks" description: "oro:hooks provides a consistent way to subscribe to runtime-delivered lifecycle and system events." docsCollection: "runtime" diff --git a/src/runtime/docs/javascript/http/page.md b/src/runtime/docs/javascript/http/page.md index 947d653e..4e6486d0 100644 --- a/src/runtime/docs/javascript/http/page.md +++ b/src/runtime/docs/javascript/http/page.md @@ -1,5 +1,5 @@ --- -layout: "docs" +layout: "runtime-docs" title: "oro:http" description: "oro:http provides Node-compatible HTTP client and server APIs." docsCollection: "runtime" diff --git a/src/runtime/docs/javascript/https/page.md b/src/runtime/docs/javascript/https/page.md index 9059ce23..69b96c8e 100644 --- a/src/runtime/docs/javascript/https/page.md +++ b/src/runtime/docs/javascript/https/page.md @@ -1,5 +1,5 @@ --- -layout: "docs" +layout: "runtime-docs" title: "oro:https" description: "oro:https provides HTTPS client and server APIs on top of the runtime TLS stack." docsCollection: "runtime" diff --git a/src/runtime/docs/javascript/i18n/page.md b/src/runtime/docs/javascript/i18n/page.md index 081e45cb..897d93bc 100644 --- a/src/runtime/docs/javascript/i18n/page.md +++ b/src/runtime/docs/javascript/i18n/page.md @@ -1,5 +1,5 @@ --- -layout: "docs" +layout: "runtime-docs" title: "oro:i18n" description: "oro:i18n resolves UI languages, localized messages, and locale-aware metadata." docsCollection: "runtime" diff --git a/src/runtime/docs/javascript/ip/page.md b/src/runtime/docs/javascript/ip/page.md index 4bf1cbd2..9e45402a 100644 --- a/src/runtime/docs/javascript/ip/page.md +++ b/src/runtime/docs/javascript/ip/page.md @@ -1,5 +1,5 @@ --- -layout: "docs" +layout: "runtime-docs" title: "oro:ip" description: "oro:ip normalizes and validates IP address inputs." docsCollection: "runtime" diff --git a/src/runtime/docs/javascript/ipc/page.md b/src/runtime/docs/javascript/ipc/page.md index a0d1dea7..e10258be 100644 --- a/src/runtime/docs/javascript/ipc/page.md +++ b/src/runtime/docs/javascript/ipc/page.md @@ -1,5 +1,5 @@ --- -layout: "docs" +layout: "runtime-docs" title: "oro:ipc" description: "oro:ipc exposes low-level runtime IPC helpers used to talk to the native host process." docsCollection: "runtime" diff --git a/src/runtime/docs/javascript/ipfs/page.md b/src/runtime/docs/javascript/ipfs/page.md index bd0f9616..86c50b06 100644 --- a/src/runtime/docs/javascript/ipfs/page.md +++ b/src/runtime/docs/javascript/ipfs/page.md @@ -1,5 +1,5 @@ --- -layout: "docs" +layout: "runtime-docs" title: "oro:ipfs" description: "oro:ipfs manages the embedded IPFS node and common content operations." docsCollection: "runtime" diff --git a/src/runtime/docs/javascript/iroh/page.md b/src/runtime/docs/javascript/iroh/page.md index 3151a402..f91cc812 100644 --- a/src/runtime/docs/javascript/iroh/page.md +++ b/src/runtime/docs/javascript/iroh/page.md @@ -1,5 +1,5 @@ --- -layout: "docs" +layout: "runtime-docs" title: "oro:iroh" description: "oro:iroh exposes the runtime’s Iroh transport bindings for peer-to-peer connections and streams." docsCollection: "runtime" diff --git a/src/runtime/docs/javascript/language/page.md b/src/runtime/docs/javascript/language/page.md index 12f98156..1bc42db5 100644 --- a/src/runtime/docs/javascript/language/page.md +++ b/src/runtime/docs/javascript/language/page.md @@ -1,5 +1,5 @@ --- -layout: "docs" +layout: "runtime-docs" title: "oro:language" description: "oro:language resolves language names, tags, and related metadata." docsCollection: "runtime" diff --git a/src/runtime/docs/javascript/latica/page.md b/src/runtime/docs/javascript/latica/page.md index c6b2be64..026a39a9 100644 --- a/src/runtime/docs/javascript/latica/page.md +++ b/src/runtime/docs/javascript/latica/page.md @@ -1,5 +1,5 @@ --- -layout: "docs" +layout: "runtime-docs" title: "oro:latica" description: "oro:latica/* exposes the runtime’s Latica networking primitives, packet helpers, and crypto utilities." docsCollection: "runtime" diff --git a/src/runtime/docs/javascript/location/page.md b/src/runtime/docs/javascript/location/page.md index db0005d4..3512d04c 100644 --- a/src/runtime/docs/javascript/location/page.md +++ b/src/runtime/docs/javascript/location/page.md @@ -1,5 +1,5 @@ --- -layout: "docs" +layout: "runtime-docs" title: "oro:location" description: "oro:location normalizes the current runtime location and origin semantics across platforms." docsCollection: "runtime" diff --git a/src/runtime/docs/javascript/mcp/page.md b/src/runtime/docs/javascript/mcp/page.md index 7d8c62ed..ffd0ba21 100644 --- a/src/runtime/docs/javascript/mcp/page.md +++ b/src/runtime/docs/javascript/mcp/page.md @@ -1,5 +1,5 @@ --- -layout: "docs" +layout: "runtime-docs" title: "oro:mcp" description: "oro:mcp provides runtime MCP helpers for registering tools/resources and controlling the embedded HTTP/SSE bridge." docsCollection: "runtime" diff --git a/src/runtime/docs/javascript/mime/page.md b/src/runtime/docs/javascript/mime/page.md index 6da3823f..08d72918 100644 --- a/src/runtime/docs/javascript/mime/page.md +++ b/src/runtime/docs/javascript/mime/page.md @@ -1,5 +1,5 @@ --- -layout: "docs" +layout: "runtime-docs" title: "oro:mime" description: "oro:mime looks up MIME types, extensions, and content-type metadata." docsCollection: "runtime" diff --git a/src/runtime/docs/javascript/module/page.md b/src/runtime/docs/javascript/module/page.md index 95995a19..98100d84 100644 --- a/src/runtime/docs/javascript/module/page.md +++ b/src/runtime/docs/javascript/module/page.md @@ -1,5 +1,5 @@ --- -layout: "docs" +layout: "runtime-docs" title: "oro:module" description: "oro:module exposes module-loader helpers and builtin-module inspection." docsCollection: "runtime" diff --git a/src/runtime/docs/javascript/navigation/page.md b/src/runtime/docs/javascript/navigation/page.md index 8b3792bf..f4b3139a 100644 --- a/src/runtime/docs/javascript/navigation/page.md +++ b/src/runtime/docs/javascript/navigation/page.md @@ -1,5 +1,5 @@ --- -layout: "docs" +layout: "runtime-docs" title: "oro:navigation" description: "oro:navigation surfaces the Navigation API state that the runtime makes available to application code." docsCollection: "runtime" diff --git a/src/runtime/docs/javascript/net/page.md b/src/runtime/docs/javascript/net/page.md index 5b64a6c0..7d78d1b7 100644 --- a/src/runtime/docs/javascript/net/page.md +++ b/src/runtime/docs/javascript/net/page.md @@ -1,5 +1,5 @@ --- -layout: "docs" +layout: "runtime-docs" title: "oro:net" description: "oro:net provides Node-compatible TCP clients and servers." docsCollection: "runtime" diff --git a/src/runtime/docs/javascript/network/page.md b/src/runtime/docs/javascript/network/page.md index 1959bd77..b048d8a3 100644 --- a/src/runtime/docs/javascript/network/page.md +++ b/src/runtime/docs/javascript/network/page.md @@ -1,5 +1,5 @@ --- -layout: "docs" +layout: "runtime-docs" title: "oro:network" description: "oro:network exposes a higher-level networking surface built on the Latica stack." docsCollection: "runtime" diff --git a/src/runtime/docs/javascript/notification/page.md b/src/runtime/docs/javascript/notification/page.md index dec78cb5..567babdc 100644 --- a/src/runtime/docs/javascript/notification/page.md +++ b/src/runtime/docs/javascript/notification/page.md @@ -1,5 +1,5 @@ --- -layout: "docs" +layout: "runtime-docs" title: "oro:notification" description: "oro:notification provides an API to display desktop and mobile notifications and request permission to use them." docsCollection: "runtime" diff --git a/src/runtime/docs/javascript/npm/page.md b/src/runtime/docs/javascript/npm/page.md index 82f412bf..63226a5e 100644 --- a/src/runtime/docs/javascript/npm/page.md +++ b/src/runtime/docs/javascript/npm/page.md @@ -1,5 +1,5 @@ --- -layout: "docs" +layout: "runtime-docs" title: "oro:npm/*" description: "oro:npm/* supports package-resolution and service-worker plumbing for NPM-backed modules." docsCollection: "runtime" diff --git a/src/runtime/docs/javascript/os/page.md b/src/runtime/docs/javascript/os/page.md index c2d6ac21..76dd5fe0 100644 --- a/src/runtime/docs/javascript/os/page.md +++ b/src/runtime/docs/javascript/os/page.md @@ -1,5 +1,5 @@ --- -layout: "docs" +layout: "runtime-docs" title: "oro:os" description: "oro:os exposes platform, CPU, temporary-directory, and system metadata helpers." docsCollection: "runtime" diff --git a/src/runtime/docs/javascript/overview/page.md b/src/runtime/docs/javascript/overview/page.md index 9b9de6c3..b17b3ac1 100644 --- a/src/runtime/docs/javascript/overview/page.md +++ b/src/runtime/docs/javascript/overview/page.md @@ -1,5 +1,5 @@ --- -layout: "docs" +layout: "runtime-docs" title: "JavaScript APIs overview" description: "Oro Runtime apps run inside the platform WebView. You use standard web APIs (DOM, ES modules, fetch, URLs, WebCrypto, WebAssembly) and import Oro-specific native capabilities as explicit ES modules un" docsCollection: "runtime" diff --git a/src/runtime/docs/javascript/path/page.md b/src/runtime/docs/javascript/path/page.md index 8c148534..c830af24 100644 --- a/src/runtime/docs/javascript/path/page.md +++ b/src/runtime/docs/javascript/path/page.md @@ -1,5 +1,5 @@ --- -layout: "docs" +layout: "runtime-docs" title: "oro:path" description: "oro:path provides cross-platform path manipulation utilities." docsCollection: "runtime" diff --git a/src/runtime/docs/javascript/process/page.md b/src/runtime/docs/javascript/process/page.md index 2575cf6f..1c290b6d 100644 --- a/src/runtime/docs/javascript/process/page.md +++ b/src/runtime/docs/javascript/process/page.md @@ -1,5 +1,5 @@ --- -layout: "docs" +layout: "runtime-docs" title: "oro:process" description: "oro:process exposes runtime process state, env access, signals, and scheduling helpers." docsCollection: "runtime" diff --git a/src/runtime/docs/javascript/protocol-handlers/page.md b/src/runtime/docs/javascript/protocol-handlers/page.md index 3be73848..c9200829 100644 --- a/src/runtime/docs/javascript/protocol-handlers/page.md +++ b/src/runtime/docs/javascript/protocol-handlers/page.md @@ -1,5 +1,5 @@ --- -layout: "docs" +layout: "runtime-docs" title: "oro:protocol-handlers" description: "oro:protocol-handlers exposes runtime helpers for custom protocol and service-worker routing." docsCollection: "runtime" diff --git a/src/runtime/docs/javascript/querystring/page.md b/src/runtime/docs/javascript/querystring/page.md index 86398f08..0bb74d76 100644 --- a/src/runtime/docs/javascript/querystring/page.md +++ b/src/runtime/docs/javascript/querystring/page.md @@ -1,5 +1,5 @@ --- -layout: "docs" +layout: "runtime-docs" title: "oro:querystring" description: "oro:querystring parses and serializes URL query strings." docsCollection: "runtime" diff --git a/src/runtime/docs/javascript/secure-storage/page.md b/src/runtime/docs/javascript/secure-storage/page.md index a63c99e8..a8874937 100644 --- a/src/runtime/docs/javascript/secure-storage/page.md +++ b/src/runtime/docs/javascript/secure-storage/page.md @@ -1,5 +1,5 @@ --- -layout: "docs" +layout: "runtime-docs" title: "oro:secure-storage" description: "oro:secure-storage stores secrets scoped by origin (for example tokens, credentials, API keys)." docsCollection: "runtime" diff --git a/src/runtime/docs/javascript/semver/page.md b/src/runtime/docs/javascript/semver/page.md index fb68406c..5b22dc7f 100644 --- a/src/runtime/docs/javascript/semver/page.md +++ b/src/runtime/docs/javascript/semver/page.md @@ -1,5 +1,5 @@ --- -layout: "docs" +layout: "runtime-docs" title: "oro:semver" description: "oro:semver parses, validates, and compares semantic versions." docsCollection: "runtime" diff --git a/src/runtime/docs/javascript/service-worker/page.md b/src/runtime/docs/javascript/service-worker/page.md index 6d321176..9c2b548c 100644 --- a/src/runtime/docs/javascript/service-worker/page.md +++ b/src/runtime/docs/javascript/service-worker/page.md @@ -1,5 +1,5 @@ --- -layout: "docs" +layout: "runtime-docs" title: "oro:service-worker" description: "oro:service-worker/* exposes the service-worker environment, lifecycle objects, and helpers." docsCollection: "runtime" diff --git a/src/runtime/docs/javascript/shared-worker/page.md b/src/runtime/docs/javascript/shared-worker/page.md index 4a9a7e66..2820f002 100644 --- a/src/runtime/docs/javascript/shared-worker/page.md +++ b/src/runtime/docs/javascript/shared-worker/page.md @@ -1,5 +1,5 @@ --- -layout: "docs" +layout: "runtime-docs" title: "oro:shared-worker" description: "oro:shared-worker/* exposes the shared-worker environment and runtime helpers." docsCollection: "runtime" diff --git a/src/runtime/docs/javascript/signal/page.md b/src/runtime/docs/javascript/signal/page.md index a393b99e..7808e736 100644 --- a/src/runtime/docs/javascript/signal/page.md +++ b/src/runtime/docs/javascript/signal/page.md @@ -1,5 +1,5 @@ --- -layout: "docs" +layout: "runtime-docs" title: "oro:signal" description: "oro:signal exposes process-signal constants, conversion helpers, and event listeners." docsCollection: "runtime" diff --git a/src/runtime/docs/javascript/sqlite/page.md b/src/runtime/docs/javascript/sqlite/page.md index b01135cf..2ae7933d 100644 --- a/src/runtime/docs/javascript/sqlite/page.md +++ b/src/runtime/docs/javascript/sqlite/page.md @@ -1,5 +1,5 @@ --- -layout: "docs" +layout: "runtime-docs" title: "oro:sqlite" description: "oro:sqlite opens SQLite databases and exposes sync and async query helpers." docsCollection: "runtime" diff --git a/src/runtime/docs/javascript/stream/page.md b/src/runtime/docs/javascript/stream/page.md index a550ef37..b4ab71e0 100644 --- a/src/runtime/docs/javascript/stream/page.md +++ b/src/runtime/docs/javascript/stream/page.md @@ -1,5 +1,5 @@ --- -layout: "docs" +layout: "runtime-docs" title: "oro:stream" description: "oro:stream exposes Node-style streams, Web streams, and pipeline helpers." docsCollection: "runtime" diff --git a/src/runtime/docs/javascript/string_decoder/page.md b/src/runtime/docs/javascript/string_decoder/page.md index 5a04ac8c..5c84bc19 100644 --- a/src/runtime/docs/javascript/string_decoder/page.md +++ b/src/runtime/docs/javascript/string_decoder/page.md @@ -1,5 +1,5 @@ --- -layout: "docs" +layout: "runtime-docs" title: "oro:string_decoder" description: "oro:string_decoder decodes split byte streams into text without corrupting multibyte characters." docsCollection: "runtime" diff --git a/src/runtime/docs/javascript/tar/page.md b/src/runtime/docs/javascript/tar/page.md index 8d021ba9..aa41a926 100644 --- a/src/runtime/docs/javascript/tar/page.md +++ b/src/runtime/docs/javascript/tar/page.md @@ -1,5 +1,5 @@ --- -layout: "docs" +layout: "runtime-docs" title: "oro:tar" description: "oro:tar opens, creates, streams, and extracts tar archives." docsCollection: "runtime" diff --git a/src/runtime/docs/javascript/tcp/page.md b/src/runtime/docs/javascript/tcp/page.md index 35037201..e02b5514 100644 --- a/src/runtime/docs/javascript/tcp/page.md +++ b/src/runtime/docs/javascript/tcp/page.md @@ -1,5 +1,5 @@ --- -layout: "docs" +layout: "runtime-docs" title: "oro:tcp" description: "oro:tcp exposes lower-level TCP client and server helpers alongside the higher-level oro:net API." docsCollection: "runtime" diff --git a/src/runtime/docs/javascript/test/page.md b/src/runtime/docs/javascript/test/page.md index cf7e793f..6ee3aa64 100644 --- a/src/runtime/docs/javascript/test/page.md +++ b/src/runtime/docs/javascript/test/page.md @@ -1,5 +1,5 @@ --- -layout: "docs" +layout: "runtime-docs" title: "oro:test" description: "oro:test provides the runtime test harness used by application and module tests." docsCollection: "runtime" diff --git a/src/runtime/docs/javascript/timers/page.md b/src/runtime/docs/javascript/timers/page.md index 86553d1e..208948ae 100644 --- a/src/runtime/docs/javascript/timers/page.md +++ b/src/runtime/docs/javascript/timers/page.md @@ -1,5 +1,5 @@ --- -layout: "docs" +layout: "runtime-docs" title: "oro:timers" description: "oro:timers exposes timer primitives, promise-based sleeps, and scheduler helpers." docsCollection: "runtime" diff --git a/src/runtime/docs/javascript/tls/page.md b/src/runtime/docs/javascript/tls/page.md index fa84749b..822f245c 100644 --- a/src/runtime/docs/javascript/tls/page.md +++ b/src/runtime/docs/javascript/tls/page.md @@ -1,5 +1,5 @@ --- -layout: "docs" +layout: "runtime-docs" title: "oro:tls" description: "oro:tls exposes TLS sockets, servers, and certificate-pin helpers." docsCollection: "runtime" diff --git a/src/runtime/docs/javascript/toml/page.md b/src/runtime/docs/javascript/toml/page.md index 94aba3ac..3d8c37a2 100644 --- a/src/runtime/docs/javascript/toml/page.md +++ b/src/runtime/docs/javascript/toml/page.md @@ -1,5 +1,5 @@ --- -layout: "docs" +layout: "runtime-docs" title: "oro:toml" description: "oro:toml parses and serializes TOML documents." docsCollection: "runtime" diff --git a/src/runtime/docs/javascript/tty/page.md b/src/runtime/docs/javascript/tty/page.md index 2f2dbe3e..6f73dcc4 100644 --- a/src/runtime/docs/javascript/tty/page.md +++ b/src/runtime/docs/javascript/tty/page.md @@ -1,5 +1,5 @@ --- -layout: "docs" +layout: "runtime-docs" title: "oro:tty" description: "oro:tty exposes terminal streams and TTY detection helpers." docsCollection: "runtime" diff --git a/src/runtime/docs/javascript/url/page.md b/src/runtime/docs/javascript/url/page.md index 7da6a506..cef47f50 100644 --- a/src/runtime/docs/javascript/url/page.md +++ b/src/runtime/docs/javascript/url/page.md @@ -1,5 +1,5 @@ --- -layout: "docs" +layout: "runtime-docs" title: "oro:url" description: "oro:url exposes the WHATWG URL implementation used by the runtime." docsCollection: "runtime" diff --git a/src/runtime/docs/javascript/usb/page.md b/src/runtime/docs/javascript/usb/page.md index e04b9e4a..d68ce871 100644 --- a/src/runtime/docs/javascript/usb/page.md +++ b/src/runtime/docs/javascript/usb/page.md @@ -1,5 +1,5 @@ --- -layout: "docs" +layout: "runtime-docs" title: "oro:usb" description: "oro:usb installs and exposes the runtime WebUSB surface for window contexts." docsCollection: "runtime" diff --git a/src/runtime/docs/javascript/util/page.md b/src/runtime/docs/javascript/util/page.md index 0695b322..06f7f1b4 100644 --- a/src/runtime/docs/javascript/util/page.md +++ b/src/runtime/docs/javascript/util/page.md @@ -1,5 +1,5 @@ --- -layout: "docs" +layout: "runtime-docs" title: "oro:util" description: "oro:util exposes inspection, debug, and type-checking helpers." docsCollection: "runtime" diff --git a/src/runtime/docs/javascript/vm/page.md b/src/runtime/docs/javascript/vm/page.md index 8b738142..c2511fb0 100644 --- a/src/runtime/docs/javascript/vm/page.md +++ b/src/runtime/docs/javascript/vm/page.md @@ -1,5 +1,5 @@ --- -layout: "docs" +layout: "runtime-docs" title: "oro:vm" description: "oro:vm runs JavaScript in isolated runtime contexts and manages context windows and workers." docsCollection: "runtime" diff --git a/src/runtime/docs/javascript/window/page.md b/src/runtime/docs/javascript/window/page.md index 7db23f23..d1a267ab 100644 --- a/src/runtime/docs/javascript/window/page.md +++ b/src/runtime/docs/javascript/window/page.md @@ -1,5 +1,5 @@ --- -layout: "docs" +layout: "runtime-docs" title: "oro:window" description: "oro:window provides the ApplicationWindow class and window-specific methods." docsCollection: "runtime" diff --git a/src/runtime/docs/javascript/worker/page.md b/src/runtime/docs/javascript/worker/page.md index b404f530..8f4a739c 100644 --- a/src/runtime/docs/javascript/worker/page.md +++ b/src/runtime/docs/javascript/worker/page.md @@ -1,5 +1,5 @@ --- -layout: "docs" +layout: "runtime-docs" title: "oro:worker" description: "oro:worker re-exports the runtime worker classes for dedicated, shared, and service workers." docsCollection: "runtime" diff --git a/src/runtime/docs/javascript/worker_threads/page.md b/src/runtime/docs/javascript/worker_threads/page.md index f89e483b..eeaf90d8 100644 --- a/src/runtime/docs/javascript/worker_threads/page.md +++ b/src/runtime/docs/javascript/worker_threads/page.md @@ -1,5 +1,5 @@ --- -layout: "docs" +layout: "runtime-docs" title: "oro:worker_threads" description: "oro:worker_threads exposes worker-thread primitives, ports, and environment data helpers." docsCollection: "runtime" diff --git a/src/runtime/docs/javascript/xpc/page.md b/src/runtime/docs/javascript/xpc/page.md index d04e3b1c..76a63353 100644 --- a/src/runtime/docs/javascript/xpc/page.md +++ b/src/runtime/docs/javascript/xpc/page.md @@ -1,5 +1,5 @@ --- -layout: "docs" +layout: "runtime-docs" title: "oro:xpc" description: "oro:xpc connects to macOS XPC services and encodes structured XPC payloads." docsCollection: "runtime" diff --git a/src/runtime/docs/javascript/zlib/page.md b/src/runtime/docs/javascript/zlib/page.md index fae2dfcb..ea160155 100644 --- a/src/runtime/docs/javascript/zlib/page.md +++ b/src/runtime/docs/javascript/zlib/page.md @@ -1,5 +1,5 @@ --- -layout: "docs" +layout: "runtime-docs" title: "oro:zlib" description: "oro:zlib compresses and decompresses buffers and exposes zlib stream helpers." docsCollection: "runtime" diff --git a/src/runtime/docs/page.md b/src/runtime/docs/page.md index 2ee641f7..077907df 100644 --- a/src/runtime/docs/page.md +++ b/src/runtime/docs/page.md @@ -1,5 +1,5 @@ --- -layout: "docs" +layout: "runtime-docs" title: "Oro Runtime Docs" description: "Oro Runtime is a cross-platform runtime for building native applications as web applications: HTML/CSS for UI, JavaScript for behavior, and a small native core for OS integration." docsCollection: "runtime" diff --git a/src/sage-index.template.ts b/src/sage-index.template.ts new file mode 100644 index 00000000..b6ce3a1b --- /dev/null +++ b/src/sage-index.template.ts @@ -0,0 +1,6 @@ +import type { DataDeps, TemplateFunction } from '@domstack/static/types.js' +import type { DocsData } from './lib/docs.ts' +import { collectionIndex } from './lib/artifacts.ts' +export const dataDeps = ['sageNavigation'] satisfies DataDeps<Pick<DocsData, 'sageNavigation'>> +const template: TemplateFunction<Record<string, unknown>, Pick<DocsData, 'sageNavigation'>> = ({ data }) => collectionIndex('sage', data.sageNavigation) +export default template diff --git a/src/sage-llms.template.ts b/src/sage-llms.template.ts new file mode 100644 index 00000000..f7e4952d --- /dev/null +++ b/src/sage-llms.template.ts @@ -0,0 +1,6 @@ +import type { DataDeps, TemplateFunction } from '@domstack/static/types.js' +import type { DocsData } from './lib/docs.ts' +import { pack } from './lib/artifacts.ts' +export const dataDeps = ["sageExports"] satisfies DataDeps<Pick<DocsData, 'sageExports'>> +const template: TemplateFunction<{ siteUrl: string }, Pick<DocsData, 'sageExports'>> = ({ data, vars }) => pack('sage', data.sageExports, vars.siteUrl) +export default template diff --git a/src/sage-search.template.ts b/src/sage-search.template.ts new file mode 100644 index 00000000..20386425 --- /dev/null +++ b/src/sage-search.template.ts @@ -0,0 +1,6 @@ +import type { DataDeps, TemplateFunction } from '@domstack/static/types.js' +import type { DocsData } from './lib/docs.ts' +import { json } from './lib/artifacts.ts' +export const dataDeps = ['sageSearch'] satisfies DataDeps<Pick<DocsData, 'sageSearch'>> +const template: TemplateFunction<Record<string, unknown>, Pick<DocsData, 'sageSearch'>> = ({ data }) => json('/sage/docs/search.json', data.sageSearch) +export default template diff --git a/src/sage-sources.template.ts b/src/sage-sources.template.ts new file mode 100644 index 00000000..a963efea --- /dev/null +++ b/src/sage-sources.template.ts @@ -0,0 +1,6 @@ +import type { DataDeps, TemplateFunction } from '@domstack/static/types.js' +import type { DocsData } from './lib/docs.ts' +import { sources } from './lib/artifacts.ts' +export const dataDeps = ['sageExports'] satisfies DataDeps<Pick<DocsData, 'sageExports'>> +const template: TemplateFunction<Record<string, unknown>, Pick<DocsData, 'sageExports'>> = ({ data }) => sources(data.sageExports) +export default template diff --git a/src/sage/docs/cli/configuration/page.md b/src/sage/docs/cli/configuration/page.md index a988feaa..61e928ce 100644 --- a/src/sage/docs/cli/configuration/page.md +++ b/src/sage/docs/cli/configuration/page.md @@ -1,5 +1,5 @@ --- -layout: "docs" +layout: "sage-docs" title: "Configuration" description: "sage reads configuration from .sagerc, a TOML file." docsCollection: "sage" diff --git a/src/sage/docs/cli/diagnostics/page.md b/src/sage/docs/cli/diagnostics/page.md index 2062dbcd..bcdb0b8b 100644 --- a/src/sage/docs/cli/diagnostics/page.md +++ b/src/sage/docs/cli/diagnostics/page.md @@ -1,5 +1,5 @@ --- -layout: "docs" +layout: "sage-docs" title: "Diagnostics" description: "This page documents the public exit codes plus the most important user-visible warnings and errors." docsCollection: "sage" diff --git a/src/sage/docs/cli/environment-and-files/page.md b/src/sage/docs/cli/environment-and-files/page.md index b4d916d2..d7a22dea 100644 --- a/src/sage/docs/cli/environment-and-files/page.md +++ b/src/sage/docs/cli/environment-and-files/page.md @@ -1,5 +1,5 @@ --- -layout: "docs" +layout: "sage-docs" title: "Environment and files" description: "This page collects every environment variable and important filesystem location used by sage." docsCollection: "sage" diff --git a/src/sage/docs/cli/inputs-and-modes/page.md b/src/sage/docs/cli/inputs-and-modes/page.md index 0d7f1a4f..9f0882df 100644 --- a/src/sage/docs/cli/inputs-and-modes/page.md +++ b/src/sage/docs/cli/inputs-and-modes/page.md @@ -1,5 +1,5 @@ --- -layout: "docs" +layout: "sage-docs" title: "Inputs and modes" description: "This page is the exact downstream input model for sage." docsCollection: "sage" diff --git a/src/sage/docs/cli/keys-and-commands/page.md b/src/sage/docs/cli/keys-and-commands/page.md index 81b56bb1..69adb449 100644 --- a/src/sage/docs/cli/keys-and-commands/page.md +++ b/src/sage/docs/cli/keys-and-commands/page.md @@ -1,5 +1,5 @@ --- -layout: "docs" +layout: "sage-docs" title: "Keys and commands" description: "This is the full interactive key and command reference for sage." docsCollection: "sage" diff --git a/src/sage/docs/cli/options/page.md b/src/sage/docs/cli/options/page.md index f133b05a..1ec663b6 100644 --- a/src/sage/docs/cli/options/page.md +++ b/src/sage/docs/cli/options/page.md @@ -1,5 +1,5 @@ --- -layout: "docs" +layout: "sage-docs" title: "Options" description: "This page documents every public CLI flag on sage." docsCollection: "sage" diff --git a/src/sage/docs/cli/sage/page.md b/src/sage/docs/cli/sage/page.md index b9083916..43e0ceab 100644 --- a/src/sage/docs/cli/sage/page.md +++ b/src/sage/docs/cli/sage/page.md @@ -1,5 +1,5 @@ --- -layout: "docs" +layout: "sage-docs" title: "sage" description: "sage is the canonical CLI entrypoint for the pager." docsCollection: "sage" diff --git a/src/sage/docs/cli/syntax-and-cache/page.md b/src/sage/docs/cli/syntax-and-cache/page.md index 9eda656a..3b79f99f 100644 --- a/src/sage/docs/cli/syntax-and-cache/page.md +++ b/src/sage/docs/cli/syntax-and-cache/page.md @@ -1,5 +1,5 @@ --- -layout: "docs" +layout: "sage-docs" title: "Syntax and cache" description: "sage can apply syntax highlighting to local paths and URL-backed content." docsCollection: "sage" diff --git a/src/sage/docs/guides/getting-started/page.md b/src/sage/docs/guides/getting-started/page.md index 58d0768f..679e5bf4 100644 --- a/src/sage/docs/guides/getting-started/page.md +++ b/src/sage/docs/guides/getting-started/page.md @@ -1,5 +1,5 @@ --- -layout: "docs" +layout: "sage-docs" title: "Getting started" description: "This guide covers the downstream story: build sage, install it, page real inputs, then move into configuration and plugins." docsCollection: "sage" diff --git a/src/sage/docs/guides/pager-workflows/page.md b/src/sage/docs/guides/pager-workflows/page.md index cc27697e..13d5e7ad 100644 --- a/src/sage/docs/guides/pager-workflows/page.md +++ b/src/sage/docs/guides/pager-workflows/page.md @@ -1,5 +1,5 @@ --- -layout: "docs" +layout: "sage-docs" title: "Pager workflows" description: "sage is most useful when you treat it as a CLI tool first and a programmable runtime second. These patterns cover the common downstream workflows." docsCollection: "sage" diff --git a/src/sage/docs/guides/plugins-quickstart/page.md b/src/sage/docs/guides/plugins-quickstart/page.md index c9cdc2d2..e417a8c0 100644 --- a/src/sage/docs/guides/plugins-quickstart/page.md +++ b/src/sage/docs/guides/plugins-quickstart/page.md @@ -1,5 +1,5 @@ --- -layout: "docs" +layout: "sage-docs" title: "Plugins quickstart" description: "sage can load JavaScript plugins in the interactive TUI path. Plugins are a good fit when you want:" docsCollection: "sage" diff --git a/src/sage/docs/javascript/all-modules/page.md b/src/sage/docs/javascript/all-modules/page.md index 5cbeb4de..68c28f0b 100644 --- a/src/sage/docs/javascript/all-modules/page.md +++ b/src/sage/docs/javascript/all-modules/page.md @@ -1,5 +1,5 @@ --- -layout: "docs" +layout: "sage-docs" title: "All module specifiers" description: "Public, stable module specifiers:" docsCollection: "sage" diff --git a/src/sage/docs/javascript/crypto/page.md b/src/sage/docs/javascript/crypto/page.md index b5c25d70..865e63c3 100644 --- a/src/sage/docs/javascript/crypto/page.md +++ b/src/sage/docs/javascript/crypto/page.md @@ -1,5 +1,5 @@ --- -layout: "docs" +layout: "sage-docs" title: "sage:crypto" description: "sage:crypto provides random bytes and UUID v4 generation." docsCollection: "sage" diff --git a/src/sage/docs/javascript/dom/page.md b/src/sage/docs/javascript/dom/page.md index c20485b2..8906b73c 100644 --- a/src/sage/docs/javascript/dom/page.md +++ b/src/sage/docs/javascript/dom/page.md @@ -1,5 +1,5 @@ --- -layout: "docs" +layout: "sage-docs" title: "sage:core/dom" description: "sage:core/dom provides DOMException and structuredClone." docsCollection: "sage" diff --git a/src/sage/docs/javascript/env/page.md b/src/sage/docs/javascript/env/page.md index 4029fa40..cf78eef0 100644 --- a/src/sage/docs/javascript/env/page.md +++ b/src/sage/docs/javascript/env/page.md @@ -1,5 +1,5 @@ --- -layout: "docs" +layout: "sage-docs" title: "sage:env" description: "sage:env reads and mutates the host process environment." docsCollection: "sage" diff --git a/src/sage/docs/javascript/fetch/page.md b/src/sage/docs/javascript/fetch/page.md index b2dbd00d..148d1cfb 100644 --- a/src/sage/docs/javascript/fetch/page.md +++ b/src/sage/docs/javascript/fetch/page.md @@ -1,5 +1,5 @@ --- -layout: "docs" +layout: "sage-docs" title: "sage:fetch" description: "sage:fetch is the host-backed WHATWG-style network module." docsCollection: "sage" diff --git a/src/sage/docs/javascript/fs/page.md b/src/sage/docs/javascript/fs/page.md index cbaece9a..d3046a86 100644 --- a/src/sage/docs/javascript/fs/page.md +++ b/src/sage/docs/javascript/fs/page.md @@ -1,5 +1,5 @@ --- -layout: "docs" +layout: "sage-docs" title: "sage:fs" description: "sage:fs provides bounded filesystem access for plugins." docsCollection: "sage" diff --git a/src/sage/docs/javascript/module-index/page.md b/src/sage/docs/javascript/module-index/page.md index d14f834c..0772e090 100644 --- a/src/sage/docs/javascript/module-index/page.md +++ b/src/sage/docs/javascript/module-index/page.md @@ -1,5 +1,5 @@ --- -layout: "docs" +layout: "sage-docs" title: "Module index" description: "This is the stable built-in module surface for Sage plugins." docsCollection: "sage" diff --git a/src/sage/docs/javascript/navigator/page.md b/src/sage/docs/javascript/navigator/page.md index 16ef38b7..92cb570f 100644 --- a/src/sage/docs/javascript/navigator/page.md +++ b/src/sage/docs/javascript/navigator/page.md @@ -1,5 +1,5 @@ --- -layout: "docs" +layout: "sage-docs" title: "sage:navigator" description: "sage:navigator exposes a browser-like navigator object." docsCollection: "sage" diff --git a/src/sage/docs/javascript/overview/page.md b/src/sage/docs/javascript/overview/page.md index 02fc523c..0bf74596 100644 --- a/src/sage/docs/javascript/overview/page.md +++ b/src/sage/docs/javascript/overview/page.md @@ -1,5 +1,5 @@ --- -layout: "docs" +layout: "sage-docs" title: "JavaScript APIs overview" description: "sage can load JavaScript plugins in the interactive TUI path. Plugins run as ES modules on top of QuickJS and can extend the pager with custom commands, event handlers, bounded filesystem state, child" docsCollection: "sage" diff --git a/src/sage/docs/javascript/path/page.md b/src/sage/docs/javascript/path/page.md index f6a57ba8..08c1c0e7 100644 --- a/src/sage/docs/javascript/path/page.md +++ b/src/sage/docs/javascript/path/page.md @@ -1,5 +1,5 @@ --- -layout: "docs" +layout: "sage-docs" title: "sage:path" description: "sage:path is a small POSIX-style path helper module." docsCollection: "sage" diff --git a/src/sage/docs/javascript/performance/page.md b/src/sage/docs/javascript/performance/page.md index 708e80bf..8d248b09 100644 --- a/src/sage/docs/javascript/performance/page.md +++ b/src/sage/docs/javascript/performance/page.md @@ -1,5 +1,5 @@ --- -layout: "docs" +layout: "sage-docs" title: "sage:performance" description: "sage:performance provides a small Performance implementation." docsCollection: "sage" diff --git a/src/sage/docs/javascript/process/page.md b/src/sage/docs/javascript/process/page.md index 2f680408..9b3d0cb1 100644 --- a/src/sage/docs/javascript/process/page.md +++ b/src/sage/docs/javascript/process/page.md @@ -1,5 +1,5 @@ --- -layout: "docs" +layout: "sage-docs" title: "sage:process" description: "sage:process exposes process metadata plus bounded shell execution." docsCollection: "sage" diff --git a/src/sage/docs/javascript/runtime/page.md b/src/sage/docs/javascript/runtime/page.md index 6675169d..13403096 100644 --- a/src/sage/docs/javascript/runtime/page.md +++ b/src/sage/docs/javascript/runtime/page.md @@ -1,5 +1,5 @@ --- -layout: "docs" +layout: "sage-docs" title: "JavaScript runtime" description: "This page describes the full plugin runtime model: how plugins load, what globals are installed, what events exist, and where the limits are." docsCollection: "sage" diff --git a/src/sage/docs/javascript/url/page.md b/src/sage/docs/javascript/url/page.md index f7b29622..b3f510b0 100644 --- a/src/sage/docs/javascript/url/page.md +++ b/src/sage/docs/javascript/url/page.md @@ -1,5 +1,5 @@ --- -layout: "docs" +layout: "sage-docs" title: "sage:url" description: "sage:url implements WHATWG-style URL and URLSearchParams." docsCollection: "sage" diff --git a/src/sage/docs/javascript/uuid/page.md b/src/sage/docs/javascript/uuid/page.md index 64e76128..07bf536e 100644 --- a/src/sage/docs/javascript/uuid/page.md +++ b/src/sage/docs/javascript/uuid/page.md @@ -1,5 +1,5 @@ --- -layout: "docs" +layout: "sage-docs" title: "sage:uuid" description: "sage:uuid provides explicit UUID helper functions." docsCollection: "sage" diff --git a/src/sage/docs/javascript/web/page.md b/src/sage/docs/javascript/web/page.md index c6fe290d..07f20380 100644 --- a/src/sage/docs/javascript/web/page.md +++ b/src/sage/docs/javascript/web/page.md @@ -1,5 +1,5 @@ --- -layout: "docs" +layout: "sage-docs" title: "sage:core/web" description: "sage:core/web provides a host-free, in-memory set of WHATWG-style web primitives." docsCollection: "sage" diff --git a/src/sage/docs/man/sage-1/page.md b/src/sage/docs/man/sage-1/page.md index 84fc05d8..fa52e17e 100644 --- a/src/sage/docs/man/sage-1/page.md +++ b/src/sage/docs/man/sage-1/page.md @@ -1,5 +1,5 @@ --- -layout: "docs" +layout: "sage-docs" title: "sage(1)" description: "sage(1) is the command reference for the pager itself. This page mirrors the man page in website form so downstream readers do not have to context-switch into man." docsCollection: "sage" diff --git a/src/sage/docs/man/sage-7/page.md b/src/sage/docs/man/sage-7/page.md index b7edb0e1..6093e74d 100644 --- a/src/sage/docs/man/sage-7/page.md +++ b/src/sage/docs/man/sage-7/page.md @@ -1,5 +1,5 @@ --- -layout: "docs" +layout: "sage-docs" title: "sage(7)" description: "sage(7) is the conceptual manual page for the pager. It explains how the CLI behaves beyond the flag list in sage(1)." docsCollection: "sage" diff --git a/src/sage/docs/man/sage-plugin-api-3/page.md b/src/sage/docs/man/sage-plugin-api-3/page.md index 21a8441e..429a98ba 100644 --- a/src/sage/docs/man/sage-plugin-api-3/page.md +++ b/src/sage/docs/man/sage-plugin-api-3/page.md @@ -1,5 +1,5 @@ --- -layout: "docs" +layout: "sage-docs" title: "sage-plugin-api(3)" description: "sage-plugin-api(3) is the manual page for the JavaScript plugin runtime. This page mirrors the man page in website form and points into the fuller module documentation." docsCollection: "sage" diff --git a/src/sage/docs/page.md b/src/sage/docs/page.md index 34271360..491708dd 100644 --- a/src/sage/docs/page.md +++ b/src/sage/docs/page.md @@ -1,5 +1,5 @@ --- -layout: "docs" +layout: "sage-docs" title: "Sage Docs" description: "sage is a fast, ergonomic terminal pager with a strong CLI story: open one file, a directory worth of files, piped stdin, or remote content, then navigate with a responsive TUI, incremental search, sy" docsCollection: "sage" diff --git a/src/silk-index.template.ts b/src/silk-index.template.ts new file mode 100644 index 00000000..b7b596f3 --- /dev/null +++ b/src/silk-index.template.ts @@ -0,0 +1,6 @@ +import type { DataDeps, TemplateFunction } from '@domstack/static/types.js' +import type { DocsData } from './lib/docs.ts' +import { collectionIndex } from './lib/artifacts.ts' +export const dataDeps = ['silkNavigation'] satisfies DataDeps<Pick<DocsData, 'silkNavigation'>> +const template: TemplateFunction<Record<string, unknown>, Pick<DocsData, 'silkNavigation'>> = ({ data }) => collectionIndex('silk', data.silkNavigation) +export default template diff --git a/src/silk-llms.template.ts b/src/silk-llms.template.ts new file mode 100644 index 00000000..b61043a2 --- /dev/null +++ b/src/silk-llms.template.ts @@ -0,0 +1,6 @@ +import type { DataDeps, TemplateFunction } from '@domstack/static/types.js' +import type { DocsData } from './lib/docs.ts' +import { pack } from './lib/artifacts.ts' +export const dataDeps = ["silkExports","silkWikiExports"] satisfies DataDeps<Pick<DocsData, 'silkExports' | 'silkWikiExports'>> +const template: TemplateFunction<{ siteUrl: string }, Pick<DocsData, 'silkExports' | 'silkWikiExports'>> = ({ data, vars }) => pack('silk', [...data.silkExports, ...data.silkWikiExports], vars.siteUrl) +export default template diff --git a/src/silk-search.template.ts b/src/silk-search.template.ts new file mode 100644 index 00000000..2fce9d91 --- /dev/null +++ b/src/silk-search.template.ts @@ -0,0 +1,6 @@ +import type { DataDeps, TemplateFunction } from '@domstack/static/types.js' +import type { DocsData } from './lib/docs.ts' +import { json } from './lib/artifacts.ts' +export const dataDeps = ['silkSearch'] satisfies DataDeps<Pick<DocsData, 'silkSearch'>> +const template: TemplateFunction<Record<string, unknown>, Pick<DocsData, 'silkSearch'>> = ({ data }) => json('/silk/docs/search.json', data.silkSearch) +export default template diff --git a/src/silk-sources.template.ts b/src/silk-sources.template.ts new file mode 100644 index 00000000..42d2f72c --- /dev/null +++ b/src/silk-sources.template.ts @@ -0,0 +1,6 @@ +import type { DataDeps, TemplateFunction } from '@domstack/static/types.js' +import type { DocsData } from './lib/docs.ts' +import { sources } from './lib/artifacts.ts' +export const dataDeps = ['silkExports'] satisfies DataDeps<Pick<DocsData, 'silkExports'>> +const template: TemplateFunction<Record<string, unknown>, Pick<DocsData, 'silkExports'>> = ({ data }) => sources(data.silkExports) +export default template diff --git a/src/silk/docs/compiler/abi-libsilk/page.md b/src/silk/docs/compiler/abi-libsilk/page.md index 3cc12519..03ce11f1 100644 --- a/src/silk/docs/compiler/abi-libsilk/page.md +++ b/src/silk/docs/compiler/abi-libsilk/page.md @@ -1,5 +1,5 @@ --- -layout: "docs" +layout: "silk-docs" title: "C99 ABI and libsilk.a" description: "This document defines the C99 ABI and the interface of the libsilk.a static library." docsCollection: "silk" diff --git a/src/silk/docs/compiler/architecture/page.md b/src/silk/docs/compiler/architecture/page.md index ced65db5..e17f666d 100644 --- a/src/silk/docs/compiler/architecture/page.md +++ b/src/silk/docs/compiler/architecture/page.md @@ -1,5 +1,5 @@ --- -layout: "docs" +layout: "silk-docs" title: "Compiler Architecture" description: "This document describes the intended architecture of the Silk compiler implemented in Zig." docsCollection: "silk" diff --git a/src/silk/docs/compiler/async-runtime/page.md b/src/silk/docs/compiler/async-runtime/page.md index 19f35a50..eeab4636 100644 --- a/src/silk/docs/compiler/async-runtime/page.md +++ b/src/silk/docs/compiler/async-runtime/page.md @@ -1,5 +1,5 @@ --- -layout: "docs" +layout: "silk-docs" title: "Async Runtime (Hosted)" description: "Current host-build note:" docsCollection: "silk" diff --git a/src/silk/docs/compiler/backend-amdgpu/page.md b/src/silk/docs/compiler/backend-amdgpu/page.md index fc6205f8..37b2f808 100644 --- a/src/silk/docs/compiler/backend-amdgpu/page.md +++ b/src/silk/docs/compiler/backend-amdgpu/page.md @@ -1,5 +1,5 @@ --- -layout: "docs" +layout: "silk-docs" title: "AMDGPU Backend" description: "This document specifies the initial AMD GPU backend surface for Silk. The backend is implemented in Zig and emits AMDHSA code-object bytes directly from Silk-owned data structures. It must not depend " docsCollection: "silk" diff --git a/src/silk/docs/compiler/backend-gpu/page.md b/src/silk/docs/compiler/backend-gpu/page.md index 837f8ccb..4c86d2d1 100644 --- a/src/silk/docs/compiler/backend-gpu/page.md +++ b/src/silk/docs/compiler/backend-gpu/page.md @@ -1,5 +1,5 @@ --- -layout: "docs" +layout: "silk-docs" title: "Target-neutral GPU compilation" description: "This document defines the shared compiler contract between Silk source and processor-specific GPU backends. AMDGPU is the first consumer; the GPU-v1 closure adds an NVIDIA PTX consumer. Both consume t" docsCollection: "silk" diff --git a/src/silk/docs/compiler/backend-nvidia/page.md b/src/silk/docs/compiler/backend-nvidia/page.md index c0cf6659..326edf6e 100644 --- a/src/silk/docs/compiler/backend-nvidia/page.md +++ b/src/silk/docs/compiler/backend-nvidia/page.md @@ -1,5 +1,5 @@ --- -layout: "docs" +layout: "silk-docs" title: "NVIDIA GPU backend" description: "This document specifies Silk's NVIDIA provider for the target-neutral GPU-v1 contract in backend-gpu.md." docsCollection: "silk" diff --git a/src/silk/docs/compiler/backend-wasm/page.md b/src/silk/docs/compiler/backend-wasm/page.md index cbcc15be..c392e346 100644 --- a/src/silk/docs/compiler/backend-wasm/page.md +++ b/src/silk/docs/compiler/backend-wasm/page.md @@ -1,5 +1,5 @@ --- -layout: "docs" +layout: "silk-docs" title: "WebAssembly Back-End (wasm32 / wasm64)" description: "This document describes the shipped WebAssembly back-end, the target conventions it uses today, and the remaining ABI boundaries for wasm targets." docsCollection: "silk" diff --git a/src/silk/docs/compiler/build-scripts/page.md b/src/silk/docs/compiler/build-scripts/page.md index 64f89505..1fc33388 100644 --- a/src/silk/docs/compiler/build-scripts/page.md +++ b/src/silk/docs/compiler/build-scripts/page.md @@ -1,5 +1,5 @@ --- -layout: "docs" +layout: "silk-docs" title: "Build Modules (build.slk)" description: "This document specifies Silk’s build module concept: a package-local Silk module named build.slk that can generate a package build plan at build time." docsCollection: "silk" diff --git a/src/silk/docs/compiler/builtin-deps/page.md b/src/silk/docs/compiler/builtin-deps/page.md index ab63a782..24af2f6d 100644 --- a/src/silk/docs/compiler/builtin-deps/page.md +++ b/src/silk/docs/compiler/builtin-deps/page.md @@ -1,5 +1,5 @@ --- -layout: "docs" +layout: "silk-docs" title: "Built-In Dependencies" description: "Silk aims to be buildable with minimal reliance on system-installed dependencies. For the hosted POSIX baseline, Silk ships built-in dependency sources and pinned archives:" docsCollection: "silk" diff --git a/src/silk/docs/compiler/cache-silk/page.md b/src/silk/docs/compiler/cache-silk/page.md index d51ce920..070c61f8 100644 --- a/src/silk/docs/compiler/cache-silk/page.md +++ b/src/silk/docs/compiler/cache-silk/page.md @@ -1,5 +1,5 @@ --- -layout: "docs" +layout: "silk-docs" title: "silk Cache Management" description: "This document describes the managed cache model used by the silk toolchain and the silk cache command surface for inspecting and maintaining that cache." docsCollection: "silk" diff --git a/src/silk/docs/compiler/cli-silk/page.md b/src/silk/docs/compiler/cli-silk/page.md index a2e7e9b1..1a7a382c 100644 --- a/src/silk/docs/compiler/cli-silk/page.md +++ b/src/silk/docs/compiler/cli-silk/page.md @@ -1,5 +1,5 @@ --- -layout: "docs" +layout: "silk-docs" title: "silk CLI" description: "This document describes the command-line interface of the silk compiler from the downstream user’s perspective." docsCollection: "silk" diff --git a/src/silk/docs/compiler/diagnostics/page.md b/src/silk/docs/compiler/diagnostics/page.md index d4f97f4c..aadbf665 100644 --- a/src/silk/docs/compiler/diagnostics/page.md +++ b/src/silk/docs/compiler/diagnostics/page.md @@ -1,5 +1,5 @@ --- -layout: "docs" +layout: "silk-docs" title: "Compiler Diagnostics" description: "This document specifies the human-readable diagnostic format emitted by the Silk toolchain, including:" docsCollection: "silk" diff --git a/src/silk/docs/compiler/implementation-status/page.md b/src/silk/docs/compiler/implementation-status/page.md index 390e8628..b4ab5df3 100644 --- a/src/silk/docs/compiler/implementation-status/page.md +++ b/src/silk/docs/compiler/implementation-status/page.md @@ -1,5 +1,5 @@ --- -layout: "docs" +layout: "silk-docs" title: "Notes" description: "This page is a downstream-facing snapshot of what the reference Silk compiler and toolchain support end-to-end today. It is intentionally high-level: each language, standard-library, and compiler page" docsCollection: "silk" diff --git a/src/silk/docs/compiler/ir-overview/page.md b/src/silk/docs/compiler/ir-overview/page.md index 8b318184..c442aa58 100644 --- a/src/silk/docs/compiler/ir-overview/page.md +++ b/src/silk/docs/compiler/ir-overview/page.md @@ -1,5 +1,5 @@ --- -layout: "docs" +layout: "silk-docs" title: "Intermediate Representation (IR) – Overview" description: "This document introduces the initial intermediate representation (IR) used by the Silk compiler. The IR is intentionally small and focused for now so that we can start supporting more advanced program" docsCollection: "silk" diff --git a/src/silk/docs/compiler/libsilk-quickstart/page.md b/src/silk/docs/compiler/libsilk-quickstart/page.md index 888f376f..cb48aa1e 100644 --- a/src/silk/docs/compiler/libsilk-quickstart/page.md +++ b/src/silk/docs/compiler/libsilk-quickstart/page.md @@ -1,5 +1,5 @@ --- -layout: "docs" +layout: "silk-docs" title: "libsilk quickstart" description: "This page is the shortest path to embedding the Silk compiler from C or C++." docsCollection: "silk" diff --git a/src/silk/docs/compiler/limits/page.md b/src/silk/docs/compiler/limits/page.md index 78d43cd6..53a1edfd 100644 --- a/src/silk/docs/compiler/limits/page.md +++ b/src/silk/docs/compiler/limits/page.md @@ -1,5 +1,5 @@ --- -layout: "docs" +layout: "silk-docs" title: "Compiler Limits" description: "This document enumerates the current hard limits in the Silk compiler and its tooling. These limits are implementation guardrails (primarily to keep memory usage bounded when compiling untrusted input" docsCollection: "silk" diff --git a/src/silk/docs/compiler/lsp-silk/page.md b/src/silk/docs/compiler/lsp-silk/page.md index 7a0a4a31..560e8815 100644 --- a/src/silk/docs/compiler/lsp-silk/page.md +++ b/src/silk/docs/compiler/lsp-silk/page.md @@ -1,5 +1,5 @@ --- -layout: "docs" +layout: "silk-docs" title: "Silk Language Server (LSP)" description: "This document specifies the current Language Server Protocol (LSP) implementation for Silk." docsCollection: "silk" diff --git a/src/silk/docs/compiler/package-distribution/page.md b/src/silk/docs/compiler/package-distribution/page.md index dcb060f3..66e83982 100644 --- a/src/silk/docs/compiler/package-distribution/page.md +++ b/src/silk/docs/compiler/package-distribution/page.md @@ -1,5 +1,5 @@ --- -layout: "docs" +layout: "silk-docs" title: "Silk Package Distribution" description: "The manifest, CLI, install, inspection/linting, and binary-dependency consumption behavior described here are implemented in the current toolchain. This document describes the package authoring, publi" docsCollection: "silk" diff --git a/src/silk/docs/compiler/package-manifests/page.md b/src/silk/docs/compiler/package-manifests/page.md index e70c857d..92ddc3ec 100644 --- a/src/silk/docs/compiler/package-manifests/page.md +++ b/src/silk/docs/compiler/package-manifests/page.md @@ -1,5 +1,5 @@ --- -layout: "docs" +layout: "silk-docs" title: "Package Manifests (silk.toml)" description: "This document specifies Silk’s package manifest format and how the silk compiler consumes it." docsCollection: "silk" diff --git a/src/silk/docs/compiler/stdlib-integration/page.md b/src/silk/docs/compiler/stdlib-integration/page.md index fd205e2c..77db5fe6 100644 --- a/src/silk/docs/compiler/stdlib-integration/page.md +++ b/src/silk/docs/compiler/stdlib-integration/page.md @@ -1,5 +1,5 @@ --- -layout: "docs" +layout: "silk-docs" title: "Standard Library Integration" description: "This document describes how the std:: package integrates with the compiler and the CLI." docsCollection: "silk" diff --git a/src/silk/docs/compiler/testing-strategy/page.md b/src/silk/docs/compiler/testing-strategy/page.md index c478c9c9..21e17961 100644 --- a/src/silk/docs/compiler/testing-strategy/page.md +++ b/src/silk/docs/compiler/testing-strategy/page.md @@ -1,5 +1,5 @@ --- -layout: "docs" +layout: "silk-docs" title: "Testing Strategy (Zig + C99 + Silk)" description: "This document defines how we validate the compiler, ABI, and standard library." docsCollection: "silk" diff --git a/src/silk/docs/compiler/vendored-deps/page.md b/src/silk/docs/compiler/vendored-deps/page.md index b6672495..e97c4022 100644 --- a/src/silk/docs/compiler/vendored-deps/page.md +++ b/src/silk/docs/compiler/vendored-deps/page.md @@ -1,5 +1,5 @@ --- -layout: "docs" +layout: "silk-docs" title: "Built-In Dependencies (Legacy Link)" description: "This page moved to builtin deps. The canonical built-in dependency documentation describes the shipped dependency sources, generated archives, provider selection, staging layout, and zig build deps wo" docsCollection: "silk" diff --git a/src/silk/docs/compiler/zig-api/page.md b/src/silk/docs/compiler/zig-api/page.md index a4b6e08c..1770478e 100644 --- a/src/silk/docs/compiler/zig-api/page.md +++ b/src/silk/docs/compiler/zig-api/page.md @@ -1,5 +1,5 @@ --- -layout: "docs" +layout: "silk-docs" title: "Zig Embedding API" description: "This page documents the Zig-facing embedding surface exported as the silk module." docsCollection: "silk" diff --git a/src/silk/docs/guides/cli/page.md b/src/silk/docs/guides/cli/page.md index 0e51f90d..660bb96f 100644 --- a/src/silk/docs/guides/cli/page.md +++ b/src/silk/docs/guides/cli/page.md @@ -1,5 +1,5 @@ --- -layout: "docs" +layout: "silk-docs" title: "CLI and toolchain" description: "Silk’s CLI is designed around a small number of commands that compose well:" docsCollection: "silk" diff --git a/src/silk/docs/guides/formal-silk/page.md b/src/silk/docs/guides/formal-silk/page.md index b0deb13a..beb9318f 100644 --- a/src/silk/docs/guides/formal-silk/page.md +++ b/src/silk/docs/guides/formal-silk/page.md @@ -1,5 +1,5 @@ --- -layout: "docs" +layout: "silk-docs" title: "Formal Silk" description: "Formal Silk is Silk’s compile-time formal verification language. It lets you write machine-checked specifications next to ordinary code, and have the compiler prove those specifications using the Z3 S" docsCollection: "silk" diff --git a/src/silk/docs/guides/hello-world/page.md b/src/silk/docs/guides/hello-world/page.md index b923c200..33240612 100644 --- a/src/silk/docs/guides/hello-world/page.md +++ b/src/silk/docs/guides/hello-world/page.md @@ -1,5 +1,5 @@ --- -layout: "docs" +layout: "silk-docs" title: "Hello world" description: "This page teaches the Silk “shape of a program”: explicit imports, a normal main, and a workflow that makes it cheap to iterate." docsCollection: "silk" diff --git a/src/silk/docs/guides/language-tour/page.md b/src/silk/docs/guides/language-tour/page.md index ec1c3e59..094f15db 100644 --- a/src/silk/docs/guides/language-tour/page.md +++ b/src/silk/docs/guides/language-tour/page.md @@ -1,5 +1,5 @@ --- -layout: "docs" +layout: "silk-docs" title: "Language tour" description: "This is a guided walkthrough of the core ideas you’ll use in real Silk programs: explicit structure, readable types, predictable control flow, and clear boundaries." docsCollection: "silk" diff --git a/src/silk/docs/guides/modules-and-packages/page.md b/src/silk/docs/guides/modules-and-packages/page.md index cb3cc681..d3933a35 100644 --- a/src/silk/docs/guides/modules-and-packages/page.md +++ b/src/silk/docs/guides/modules-and-packages/page.md @@ -1,5 +1,5 @@ --- -layout: "docs" +layout: "silk-docs" title: "Modules, Packages, and Publication" description: "Silk code is organized around explicit module sets. A module set is the group of .slk files the compiler loads, resolves, checks, and builds together. Packages give those files a public namespace, imp" docsCollection: "silk" diff --git a/src/silk/docs/guides/practical-logger-module/page.md b/src/silk/docs/guides/practical-logger-module/page.md index b3f64be3..ff407f54 100644 --- a/src/silk/docs/guides/practical-logger-module/page.md +++ b/src/silk/docs/guides/practical-logger-module/page.md @@ -1,5 +1,5 @@ --- -layout: "docs" +layout: "silk-docs" title: "Practical Logger Module Walkthrough" description: "This walkthrough builds a small structured logger package that can be imported from Silk and exposed to C through a generated header. It starts with the normal Silk API in src/lib.slk, then adds src/c" docsCollection: "silk" diff --git a/src/silk/docs/guides/project-dependencies/page.md b/src/silk/docs/guides/project-dependencies/page.md index ad77ce43..df98cfb6 100644 --- a/src/silk/docs/guides/project-dependencies/page.md +++ b/src/silk/docs/guides/project-dependencies/page.md @@ -1,5 +1,5 @@ --- -layout: "docs" +layout: "silk-docs" title: "Project Dependencies" description: "Silk projects build dependencies from package roots on disk. A dependency can be an explicit local path, a package found under a packages/ search root, or an installed package root. The examples/proje" docsCollection: "silk" diff --git a/src/silk/docs/guides/purpose/page.md b/src/silk/docs/guides/purpose/page.md index e9a49fb3..dbad472f 100644 --- a/src/silk/docs/guides/purpose/page.md +++ b/src/silk/docs/guides/purpose/page.md @@ -1,5 +1,5 @@ --- -layout: "docs" +layout: "silk-docs" title: "What Silk is for" description: "Silk is for systems code that has to be understood, shipped, embedded, and trusted after it grows beyond a single file." docsCollection: "silk" diff --git a/src/silk/docs/guides/standard-library/page.md b/src/silk/docs/guides/standard-library/page.md index a6bd8df1..8275268d 100644 --- a/src/silk/docs/guides/standard-library/page.md +++ b/src/silk/docs/guides/standard-library/page.md @@ -1,5 +1,5 @@ --- -layout: "docs" +layout: "silk-docs" title: "Standard library" description: "Silk’s standard library lives under the reserved std:: namespace. This is where “practical systems programming” shows up: I/O, filesystem, networking, parsing, collections, time, and the shared conven" docsCollection: "silk" diff --git a/src/silk/docs/guides/testing/page.md b/src/silk/docs/guides/testing/page.md index 901b59c8..80a8b4fb 100644 --- a/src/silk/docs/guides/testing/page.md +++ b/src/silk/docs/guides/testing/page.md @@ -1,5 +1,5 @@ --- -layout: "docs" +layout: "silk-docs" title: "Testing" description: "Silk testing is language-level: tests live next to the code they exercise. The compiler discovers them, runs them with silk test, and emits TAP output (TAP v13) so results are easy to consume in CI an" docsCollection: "silk" diff --git a/src/silk/docs/language/asm/page.md b/src/silk/docs/language/asm/page.md index 9456a4c1..d11290da 100644 --- a/src/silk/docs/language/asm/page.md +++ b/src/silk/docs/language/asm/page.md @@ -1,5 +1,5 @@ --- -layout: "docs" +layout: "silk-docs" title: "Inline Assembly (asm)" description: "Silk provides an asm keyword for embedding inline assembly in a way that is explicit in source code and assembled at compile time." docsCollection: "silk" diff --git a/src/silk/docs/language/atomics/page.md b/src/silk/docs/language/atomics/page.md index ebf20147..14a765b2 100644 --- a/src/silk/docs/language/atomics/page.md +++ b/src/silk/docs/language/atomics/page.md @@ -1,5 +1,5 @@ --- -layout: "docs" +layout: "silk-docs" title: "Atomics" description: "Silk atomics are compiler-backed operations for low-level thread synchronization. They are distinct from ordinary loads/stores and from volatile memory access:" docsCollection: "silk" diff --git a/src/silk/docs/language/attributes/page.md b/src/silk/docs/language/attributes/page.md index 95d2eac9..2938fc1f 100644 --- a/src/silk/docs/language/attributes/page.md +++ b/src/silk/docs/language/attributes/page.md @@ -1,5 +1,5 @@ --- -layout: "docs" +layout: "silk-docs" title: "Attributes (attr(...))" description: "Silk supports first-class attributes that can annotate declarations and can also be queried at compile time for conditional compilation." docsCollection: "silk" diff --git a/src/silk/docs/language/borrow-checker/page.md b/src/silk/docs/language/borrow-checker/page.md index 55e119a2..2d7b010c 100644 --- a/src/silk/docs/language/borrow-checker/page.md +++ b/src/silk/docs/language/borrow-checker/page.md @@ -1,5 +1,5 @@ --- -layout: "docs" +layout: "silk-docs" title: "Borrow Checking (Static Alias and Lifetime Safety)" description: "This document specifies Silk’s intended borrow-checking model for references." docsCollection: "silk" diff --git a/src/silk/docs/language/buffers/page.md b/src/silk/docs/language/buffers/page.md index d34dd95e..45df5a33 100644 --- a/src/silk/docs/language/buffers/page.md +++ b/src/silk/docs/language/buffers/page.md @@ -1,5 +1,5 @@ --- -layout: "docs" +layout: "silk-docs" title: "Buffers" description: "Buffer(T) provides low-level access to a contiguous block of memory. It is intentionally unsafe and used as a foundation for higher-level collections and strings." docsCollection: "silk" diff --git a/src/silk/docs/language/build-metadata/page.md b/src/silk/docs/language/build-metadata/page.md index 6c57a2c0..9adbce0b 100644 --- a/src/silk/docs/language/build-metadata/page.md +++ b/src/silk/docs/language/build-metadata/page.md @@ -1,5 +1,5 @@ --- -layout: "docs" +layout: "silk-docs" title: "Build Metadata (BUILD_KIND, BUILD_MODE, BUILD_VERSION)" description: "Silk exposes a small set of compiler-provided build metadata values to both runtime code and Formal Silk (compile-time verification) so programs can adapt to build configuration and so theories can ex" docsCollection: "silk" diff --git a/src/silk/docs/language/cheat-sheet/page.md b/src/silk/docs/language/cheat-sheet/page.md index d4c16dfe..3d9e92c7 100644 --- a/src/silk/docs/language/cheat-sheet/page.md +++ b/src/silk/docs/language/cheat-sheet/page.md @@ -1,5 +1,5 @@ --- -layout: "docs" +layout: "silk-docs" title: "Language Cheat Sheet" description: "This document summarizes the key syntax and concepts from the Silk language in a condensed form. It is meant as a quick reference; detailed semantics live in the other docs/language/ files." docsCollection: "silk" diff --git a/src/silk/docs/language/concurrency/page.md b/src/silk/docs/language/concurrency/page.md index 5c182b24..e2ab3753 100644 --- a/src/silk/docs/language/concurrency/page.md +++ b/src/silk/docs/language/concurrency/page.md @@ -1,5 +1,5 @@ --- -layout: "docs" +layout: "silk-docs" title: "Concurrency" description: "Concurrency in Silk is built around two orthogonal function modifiers:" docsCollection: "silk" diff --git a/src/silk/docs/language/const-functions/page.md b/src/silk/docs/language/const-functions/page.md index 091784c8..e92eee45 100644 --- a/src/silk/docs/language/const-functions/page.md +++ b/src/silk/docs/language/const-functions/page.md @@ -1,5 +1,5 @@ --- -layout: "docs" +layout: "silk-docs" title: "Const Functions (const fn)" description: "Parser: implemented" docsCollection: "silk" diff --git a/src/silk/docs/language/conventions/page.md b/src/silk/docs/language/conventions/page.md index 10cf8d7a..d91fbdb7 100644 --- a/src/silk/docs/language/conventions/page.md +++ b/src/silk/docs/language/conventions/page.md @@ -1,5 +1,5 @@ --- -layout: "docs" +layout: "silk-docs" title: "Language Spec Conventions" description: "This document defines conventions used across docs/language/. It exists to keep the language specification consistent and easy to navigate for both:" docsCollection: "silk" diff --git a/src/silk/docs/language/dependent-types/page.md b/src/silk/docs/language/dependent-types/page.md index 66fdaf01..b6cd1079 100644 --- a/src/silk/docs/language/dependent-types/page.md +++ b/src/silk/docs/language/dependent-types/page.md @@ -1,5 +1,5 @@ --- -layout: "docs" +layout: "silk-docs" title: "Dependent Types (Const Parameters and Type-Level Computation)" description: "This document specifies Silk’s intended support for “dependent-type-like” patterns where types mention compile-time values (most notably integers)." docsCollection: "silk" diff --git a/src/silk/docs/language/doc-comments/page.md b/src/silk/docs/language/doc-comments/page.md index d25408e7..e8fa558b 100644 --- a/src/silk/docs/language/doc-comments/page.md +++ b/src/silk/docs/language/doc-comments/page.md @@ -1,5 +1,5 @@ --- -layout: "docs" +layout: "silk-docs" title: "Silkdoc (Documentation Comments)" description: "This document specifies Silkdoc, Silk’s documentation-comment format. Silkdoc comments are intended for tools (documentation generators, editors, and the language server). They do not affect program s" docsCollection: "silk" diff --git a/src/silk/docs/language/duration-instant/page.md b/src/silk/docs/language/duration-instant/page.md index db8dc9aa..fad15e15 100644 --- a/src/silk/docs/language/duration-instant/page.md +++ b/src/silk/docs/language/duration-instant/page.md @@ -1,5 +1,5 @@ --- -layout: "docs" +layout: "silk-docs" title: "Duration & Instant" description: "Duration and Instant are time-related types with special literal and operator support." docsCollection: "silk" diff --git a/src/silk/docs/language/enums/page.md b/src/silk/docs/language/enums/page.md index a59f6590..c5628d60 100644 --- a/src/silk/docs/language/enums/page.md +++ b/src/silk/docs/language/enums/page.md @@ -1,5 +1,5 @@ --- -layout: "docs" +layout: "silk-docs" title: "enum Types" description: "An enum defines a tagged union type: a value that is exactly one of several named variants, optionally carrying a payload." docsCollection: "silk" diff --git a/src/silk/docs/language/errors/page.md b/src/silk/docs/language/errors/page.md index 409c1cb7..dcf70151 100644 --- a/src/silk/docs/language/errors/page.md +++ b/src/silk/docs/language/errors/page.md @@ -1,5 +1,5 @@ --- -layout: "docs" +layout: "silk-docs" title: "Errors" description: "This document summarizes the Silk error-handling model at a level suitable for compiler implementation. It is based on the language design captured in docs/ (optionals, verification, ext, ABI)." docsCollection: "silk" diff --git a/src/silk/docs/language/ext/page.md b/src/silk/docs/language/ext/page.md index 1262d4be..ccfeb0a2 100644 --- a/src/silk/docs/language/ext/page.md +++ b/src/silk/docs/language/ext/page.md @@ -1,5 +1,5 @@ --- -layout: "docs" +layout: "silk-docs" title: "External Declarations (ext)" description: "Silk’s external declaration feature lets Silk code call foreign functions and access foreign variables." docsCollection: "silk" diff --git a/src/silk/docs/language/flow-blocks-statements/page.md b/src/silk/docs/language/flow-blocks-statements/page.md index 5efd59ab..ba5fd4fb 100644 --- a/src/silk/docs/language/flow-blocks-statements/page.md +++ b/src/silk/docs/language/flow-blocks-statements/page.md @@ -1,5 +1,5 @@ --- -layout: "docs" +layout: "silk-docs" title: "Blocks and Statement Composition" description: "Blocks group statements, establish lexical scopes, and provide the “body” form for structured control-flow constructs like if, while, and the match statement used for typed errors." docsCollection: "silk" diff --git a/src/silk/docs/language/flow-break/page.md b/src/silk/docs/language/flow-break/page.md index 6507e668..e37ff844 100644 --- a/src/silk/docs/language/flow-break/page.md +++ b/src/silk/docs/language/flow-break/page.md @@ -1,5 +1,5 @@ --- -layout: "docs" +layout: "silk-docs" title: "break" description: "break exits the nearest enclosing loop." docsCollection: "silk" diff --git a/src/silk/docs/language/flow-continue/page.md b/src/silk/docs/language/flow-continue/page.md index 904a6028..2b9a69ce 100644 --- a/src/silk/docs/language/flow-continue/page.md +++ b/src/silk/docs/language/flow-continue/page.md @@ -1,5 +1,5 @@ --- -layout: "docs" +layout: "silk-docs" title: "continue" description: "continue skips the remainder of the current loop iteration and jumps to the next iteration of the nearest enclosing loop." docsCollection: "silk" diff --git a/src/silk/docs/language/flow-expression-statements/page.md b/src/silk/docs/language/flow-expression-statements/page.md index 25c274b5..cb4832c9 100644 --- a/src/silk/docs/language/flow-expression-statements/page.md +++ b/src/silk/docs/language/flow-expression-statements/page.md @@ -1,5 +1,5 @@ --- -layout: "docs" +layout: "silk-docs" title: "Expression Statements" description: "Expression statements allow expressions to be used for their side effects." docsCollection: "silk" diff --git a/src/silk/docs/language/flow-for/page.md b/src/silk/docs/language/flow-for/page.md index 826c06c6..e007c1ac 100644 --- a/src/silk/docs/language/flow-for/page.md +++ b/src/silk/docs/language/flow-for/page.md @@ -1,5 +1,5 @@ --- -layout: "docs" +layout: "silk-docs" title: "for Loop" description: "The for loop iterates over a range or iterable and executes a block once per element." docsCollection: "silk" diff --git a/src/silk/docs/language/flow-if-else/page.md b/src/silk/docs/language/flow-if-else/page.md index c7f8571b..7230143e 100644 --- a/src/silk/docs/language/flow-if-else/page.md +++ b/src/silk/docs/language/flow-if-else/page.md @@ -1,5 +1,5 @@ --- -layout: "docs" +layout: "silk-docs" title: "if / else" description: "The if / else construct provides branching based on a boolean condition." docsCollection: "silk" diff --git a/src/silk/docs/language/flow-loop/page.md b/src/silk/docs/language/flow-loop/page.md index c7978296..c64b79ef 100644 --- a/src/silk/docs/language/flow-loop/page.md +++ b/src/silk/docs/language/flow-loop/page.md @@ -1,5 +1,5 @@ --- -layout: "docs" +layout: "silk-docs" title: "loop Loop" description: "The loop statement executes a block repeatedly until it is terminated by a break or return." docsCollection: "silk" diff --git a/src/silk/docs/language/flow-match/page.md b/src/silk/docs/language/flow-match/page.md index a0045bd2..5b1f7d59 100644 --- a/src/silk/docs/language/flow-match/page.md +++ b/src/silk/docs/language/flow-match/page.md @@ -1,5 +1,5 @@ --- -layout: "docs" +layout: "silk-docs" title: "match Expression (and Statement)" description: "The match expression provides structured pattern matching." docsCollection: "silk" diff --git a/src/silk/docs/language/flow-overview/page.md b/src/silk/docs/language/flow-overview/page.md index d21203b2..aa032ac3 100644 --- a/src/silk/docs/language/flow-overview/page.md +++ b/src/silk/docs/language/flow-overview/page.md @@ -1,5 +1,5 @@ --- -layout: "docs" +layout: "silk-docs" title: "Flow Control Overview" description: "Flow control describes how Silk programs sequence work, branch, loop, and exit. This concept spans several surface constructs and their static rules (typing, scoping, and diagnostics)." docsCollection: "silk" diff --git a/src/silk/docs/language/flow-return/page.md b/src/silk/docs/language/flow-return/page.md index 337310e3..958c7fad 100644 --- a/src/silk/docs/language/flow-return/page.md +++ b/src/silk/docs/language/flow-return/page.md @@ -1,5 +1,5 @@ --- -layout: "docs" +layout: "silk-docs" title: "return" description: "The return statement exits a function, optionally with a value." docsCollection: "silk" diff --git a/src/silk/docs/language/flow-while/page.md b/src/silk/docs/language/flow-while/page.md index 4189a3c1..8d228f53 100644 --- a/src/silk/docs/language/flow-while/page.md +++ b/src/silk/docs/language/flow-while/page.md @@ -1,5 +1,5 @@ --- -layout: "docs" +layout: "silk-docs" title: "while Loop" description: "The while loop repeatedly executes a block while a boolean condition holds." docsCollection: "silk" diff --git a/src/silk/docs/language/formal-verification/page.md b/src/silk/docs/language/formal-verification/page.md index b753a5d6..a70601fb 100644 --- a/src/silk/docs/language/formal-verification/page.md +++ b/src/silk/docs/language/formal-verification/page.md @@ -1,5 +1,5 @@ --- -layout: "docs" +layout: "silk-docs" title: "Formal Silk" description: "Formal Silk is Silk’s compile-time formal verification language. It is written using syntax that does not exist at runtime and is discharged at compile time using the Z3 SMT solver." docsCollection: "silk" diff --git a/src/silk/docs/language/function-disciplines/page.md b/src/silk/docs/language/function-disciplines/page.md index ff1fa9aa..a62e543b 100644 --- a/src/silk/docs/language/function-disciplines/page.md +++ b/src/silk/docs/language/function-disciplines/page.md @@ -1,5 +1,5 @@ --- -layout: "docs" +layout: "silk-docs" title: "Function Disciplines (pure, task, async)" description: "This document specifies Silk’s intended “function discipline” system: how functions declare whether they are pure, asynchronous, or safe to run as parallel tasks." docsCollection: "silk" diff --git a/src/silk/docs/language/generics/page.md b/src/silk/docs/language/generics/page.md index b1b03c46..480b2421 100644 --- a/src/silk/docs/language/generics/page.md +++ b/src/silk/docs/language/generics/page.md @@ -1,5 +1,5 @@ --- -layout: "docs" +layout: "silk-docs" title: "Generics (Monomorphized)" description: "This document specifies Silk’s parameterized type and declaration syntax." docsCollection: "silk" diff --git a/src/silk/docs/language/gpu-execution/page.md b/src/silk/docs/language/gpu-execution/page.md index 7a4e4990..1e67e736 100644 --- a/src/silk/docs/language/gpu-execution/page.md +++ b/src/silk/docs/language/gpu-execution/page.md @@ -1,5 +1,5 @@ --- -layout: "docs" +layout: "silk-docs" title: "GPU execution placement" description: "Silk functions run on the program's host CPU unless their declaration carries the GPU placement attribute:" docsCollection: "silk" diff --git a/src/silk/docs/language/gpu-launch-blocks/page.md b/src/silk/docs/language/gpu-launch-blocks/page.md index 5352ef09..337587d3 100644 --- a/src/silk/docs/language/gpu-launch-blocks/page.md +++ b/src/silk/docs/language/gpu-launch-blocks/page.md @@ -1,5 +1,5 @@ --- -layout: "docs" +layout: "silk-docs" title: "GPU launch blocks" description: "Silk provides a checked host-side form for launching one GPU kernel without importing a launch function or repeating the kernel name as a string:" docsCollection: "silk" diff --git a/src/silk/docs/language/grammar/page.md b/src/silk/docs/language/grammar/page.md index cc808c5e..e072e9c1 100644 --- a/src/silk/docs/language/grammar/page.md +++ b/src/silk/docs/language/grammar/page.md @@ -1,5 +1,5 @@ --- -layout: "docs" +layout: "silk-docs" title: "Formal Grammar Spec" description: "This document contains the formal grammar and lexical specification for Silk as used by the compiler implementation." docsCollection: "silk" diff --git a/src/silk/docs/language/interfaces/page.md b/src/silk/docs/language/interfaces/page.md index 67b83b5a..71642475 100644 --- a/src/silk/docs/language/interfaces/page.md +++ b/src/silk/docs/language/interfaces/page.md @@ -1,5 +1,5 @@ --- -layout: "docs" +layout: "silk-docs" title: "Interfaces" description: "Interfaces allow types to declare that they implement a particular contract. They are the foundation for standard-library “protocols” such as readers, writers, iterators, and allocators." docsCollection: "silk" diff --git a/src/silk/docs/language/literals-aggregate/page.md b/src/silk/docs/language/literals-aggregate/page.md index b07dbddc..274322c3 100644 --- a/src/silk/docs/language/literals-aggregate/page.md +++ b/src/silk/docs/language/literals-aggregate/page.md @@ -1,5 +1,5 @@ --- -layout: "docs" +layout: "silk-docs" title: "Aggregate Literals" description: "Aggregate literals cover arrays and structs." docsCollection: "silk" diff --git a/src/silk/docs/language/literals-boolean/page.md b/src/silk/docs/language/literals-boolean/page.md index e4ad6459..3bb022b8 100644 --- a/src/silk/docs/language/literals-boolean/page.md +++ b/src/silk/docs/language/literals-boolean/page.md @@ -1,5 +1,5 @@ --- -layout: "docs" +layout: "silk-docs" title: "Boolean Literals" description: "Boolean literals are the two built-in logical values:" docsCollection: "silk" diff --git a/src/silk/docs/language/literals-character/page.md b/src/silk/docs/language/literals-character/page.md index 43e4e8fd..6118f12c 100644 --- a/src/silk/docs/language/literals-character/page.md +++ b/src/silk/docs/language/literals-character/page.md @@ -1,5 +1,5 @@ --- -layout: "docs" +layout: "silk-docs" title: "Character Literals" description: "Character literals represent Unicode scalar values (code points) and have type char (types)." docsCollection: "silk" diff --git a/src/silk/docs/language/literals-duration/page.md b/src/silk/docs/language/literals-duration/page.md index c8a435c8..12f3f3b0 100644 --- a/src/silk/docs/language/literals-duration/page.md +++ b/src/silk/docs/language/literals-duration/page.md @@ -1,5 +1,5 @@ --- -layout: "docs" +layout: "silk-docs" title: "Duration Literals" description: "The Duration and Instant types have specialized literal support." docsCollection: "silk" diff --git a/src/silk/docs/language/literals-numeric/page.md b/src/silk/docs/language/literals-numeric/page.md index 736a36bc..a2b1c8aa 100644 --- a/src/silk/docs/language/literals-numeric/page.md +++ b/src/silk/docs/language/literals-numeric/page.md @@ -1,5 +1,5 @@ --- -layout: "docs" +layout: "silk-docs" title: "Numeric Literals" description: "Numeric literals produce integer (int, u8, i128, …) and floating-point (f32, f64, f128) values." docsCollection: "silk" diff --git a/src/silk/docs/language/literals-overview/page.md b/src/silk/docs/language/literals-overview/page.md index c1a7939c..3ffcf81d 100644 --- a/src/silk/docs/language/literals-overview/page.md +++ b/src/silk/docs/language/literals-overview/page.md @@ -1,5 +1,5 @@ --- -layout: "docs" +layout: "silk-docs" title: "Literals Overview" description: "This document provides a high-level overview of literals in Silk, with details split into dedicated documents for each category." docsCollection: "silk" diff --git a/src/silk/docs/language/literals-regexp/page.md b/src/silk/docs/language/literals-regexp/page.md index 6cda1b4f..2883bdc0 100644 --- a/src/silk/docs/language/literals-regexp/page.md +++ b/src/silk/docs/language/literals-regexp/page.md @@ -1,5 +1,5 @@ --- -layout: "docs" +layout: "silk-docs" title: "Regular Expression Literals" description: "Regular expression literals represent regexp values: compiled regular expression bytecode that can be used by std::regex helpers." docsCollection: "silk" diff --git a/src/silk/docs/language/literals-string/page.md b/src/silk/docs/language/literals-string/page.md index 2fe1141c..a2cae556 100644 --- a/src/silk/docs/language/literals-string/page.md +++ b/src/silk/docs/language/literals-string/page.md @@ -1,5 +1,5 @@ --- -layout: "docs" +layout: "silk-docs" title: "String Literals" description: "String literals represent string values: immutable, length-tracked sequences of bytes that are typically interpreted as UTF-8 text." docsCollection: "silk" diff --git a/src/silk/docs/language/memory-model/page.md b/src/silk/docs/language/memory-model/page.md index 6087009c..dd6930f3 100644 --- a/src/silk/docs/language/memory-model/page.md +++ b/src/silk/docs/language/memory-model/page.md @@ -1,5 +1,5 @@ --- -layout: "docs" +layout: "silk-docs" title: "Memory Model (Stack, Heap, and Moves)" description: "This document specifies Silk’s intended memory model: how values are allocated, passed, and how (future) heap-managed values interact with the type system." docsCollection: "silk" diff --git a/src/silk/docs/language/mutability/page.md b/src/silk/docs/language/mutability/page.md index 22abc3db..f9c599eb 100644 --- a/src/silk/docs/language/mutability/page.md +++ b/src/silk/docs/language/mutability/page.md @@ -1,5 +1,5 @@ --- -layout: "docs" +layout: "silk-docs" title: "Mutability" description: "Mutability in Silk is “safe by default”: values are immutable unless explicitly marked mutable under clear rules using the mut keyword." docsCollection: "silk" diff --git a/src/silk/docs/language/operators/page.md b/src/silk/docs/language/operators/page.md index 1517fa68..19b0312d 100644 --- a/src/silk/docs/language/operators/page.md +++ b/src/silk/docs/language/operators/page.md @@ -1,5 +1,5 @@ --- -layout: "docs" +layout: "silk-docs" title: "Operators" description: "This document summarizes the operator set and precedence for Silk." docsCollection: "silk" diff --git a/src/silk/docs/language/optional/page.md b/src/silk/docs/language/optional/page.md index 6ae0278f..3d877484 100644 --- a/src/silk/docs/language/optional/page.md +++ b/src/silk/docs/language/optional/page.md @@ -1,5 +1,5 @@ --- -layout: "docs" +layout: "silk-docs" title: "Optional" description: "The Optional type provides a safe way to represent values that may or may not be present, instead of relying on sentinel values such as null." docsCollection: "silk" diff --git a/src/silk/docs/language/packages-imports-exports/page.md b/src/silk/docs/language/packages-imports-exports/page.md index 25679610..9d88b0d4 100644 --- a/src/silk/docs/language/packages-imports-exports/page.md +++ b/src/silk/docs/language/packages-imports-exports/page.md @@ -1,5 +1,5 @@ --- -layout: "docs" +layout: "silk-docs" title: "Packages, Imports, and Exports" description: "This document specifies the initial surface syntax for packages, imports, and exports in Silk. The semantics are intentionally minimal for now and will be extended as the compiler’s resolver and linke" docsCollection: "silk" diff --git a/src/silk/docs/language/regions/page.md b/src/silk/docs/language/regions/page.md index a9e36520..fe09d189 100644 --- a/src/silk/docs/language/regions/page.md +++ b/src/silk/docs/language/regions/page.md @@ -1,5 +1,5 @@ --- -layout: "docs" +layout: "silk-docs" title: "Regions" description: "Regions provide a fixed-size, statically allocated block of memory that can be used as an allocation context for new." docsCollection: "silk" diff --git a/src/silk/docs/language/struct-requirements/page.md b/src/silk/docs/language/struct-requirements/page.md index f45e7e97..7508c24c 100644 --- a/src/silk/docs/language/struct-requirements/page.md +++ b/src/silk/docs/language/struct-requirements/page.md @@ -1,5 +1,5 @@ --- -layout: "docs" +layout: "silk-docs" title: "Struct Requirements (#require)" description: "Use #require on a struct to state requirements that must hold for all values constructed for that struct type." docsCollection: "silk" diff --git a/src/silk/docs/language/structs-impls-layout/page.md b/src/silk/docs/language/structs-impls-layout/page.md index 5d73011b..b3dae2ea 100644 --- a/src/silk/docs/language/structs-impls-layout/page.md +++ b/src/silk/docs/language/structs-impls-layout/page.md @@ -1,5 +1,5 @@ --- -layout: "docs" +layout: "silk-docs" title: "Structs, Impl Blocks, and Memory Layout" description: "Structs and impl blocks are separated:" docsCollection: "silk" diff --git a/src/silk/docs/language/syntax-tour/page.md b/src/silk/docs/language/syntax-tour/page.md index 540cfd48..4d69ad28 100644 --- a/src/silk/docs/language/syntax-tour/page.md +++ b/src/silk/docs/language/syntax-tour/page.md @@ -1,5 +1,5 @@ --- -layout: "docs" +layout: "silk-docs" title: "Silk Syntax Tour (Soup to Nuts)" description: "This document is an example-driven tour of Silk’s surface syntax, from a single-file “hello world” through modules/packages, declarations, statements, expressions, and the Formal Silk verification dir" docsCollection: "silk" diff --git a/src/silk/docs/language/target-metadata/page.md b/src/silk/docs/language/target-metadata/page.md index 0517b642..f452fb3c 100644 --- a/src/silk/docs/language/target-metadata/page.md +++ b/src/silk/docs/language/target-metadata/page.md @@ -1,5 +1,5 @@ --- -layout: "docs" +layout: "silk-docs" title: "Target Metadata (OS_PLATFORM, OS_ARCH, OS_IS_UNIX, OS_IS_POSIX)" description: "Silk exposes a small set of compiler-provided target metadata values to both runtime code and Formal Silk (compile-time verification)." docsCollection: "silk" diff --git a/src/silk/docs/language/testing/page.md b/src/silk/docs/language/testing/page.md index 582db39a..08ef6e49 100644 --- a/src/silk/docs/language/testing/page.md +++ b/src/silk/docs/language/testing/page.md @@ -1,5 +1,5 @@ --- -layout: "docs" +layout: "silk-docs" title: "Testing" description: "This document specifies the initial language-level testing surface for Silk." docsCollection: "silk" diff --git a/src/silk/docs/language/toolchain-metadata/page.md b/src/silk/docs/language/toolchain-metadata/page.md index f60a9f53..6b582160 100644 --- a/src/silk/docs/language/toolchain-metadata/page.md +++ b/src/silk/docs/language/toolchain-metadata/page.md @@ -1,5 +1,5 @@ --- -layout: "docs" +layout: "silk-docs" title: "Toolchain Metadata (SILK_VERSION, SILK_ABI_VERSION, SILK_GIT_COMMIT)" description: "Silk exposes a small set of compiler-provided toolchain metadata values to:" docsCollection: "silk" diff --git a/src/silk/docs/language/type-unions/page.md b/src/silk/docs/language/type-unions/page.md index 5ba64d90..4593b37a 100644 --- a/src/silk/docs/language/type-unions/page.md +++ b/src/silk/docs/language/type-unions/page.md @@ -1,5 +1,5 @@ --- -layout: "docs" +layout: "silk-docs" title: "Type Unions (T1 | T2 | ...)" description: "Silk supports type unions in type annotations. A union type represents a value that is exactly one of several member types." docsCollection: "silk" diff --git a/src/silk/docs/language/typed-errors/page.md b/src/silk/docs/language/typed-errors/page.md index f096e726..0ada21b4 100644 --- a/src/silk/docs/language/typed-errors/page.md +++ b/src/silk/docs/language/typed-errors/page.md @@ -1,5 +1,5 @@ --- -layout: "docs" +layout: "silk-docs" title: "Typed Errors (error, panic, and T | ErrorType...)" description: "Silk’s typed error system exists to eliminate the “trust gap” between a function’s signature and its real behavior. There are no hidden exceptions and no implicit panic channel: if a function can term" docsCollection: "silk" diff --git a/src/silk/docs/language/types/page.md b/src/silk/docs/language/types/page.md index a4636e93..9521a73f 100644 --- a/src/silk/docs/language/types/page.md +++ b/src/silk/docs/language/types/page.md @@ -1,5 +1,5 @@ --- -layout: "docs" +layout: "silk-docs" title: "Types" description: "This document specifies the Silk type system used by the compiler front-end and type checker." docsCollection: "silk" diff --git a/src/silk/docs/language/using/page.md b/src/silk/docs/language/using/page.md index d3271f1d..f6d421bd 100644 --- a/src/silk/docs/language/using/page.md +++ b/src/silk/docs/language/using/page.md @@ -1,5 +1,5 @@ --- -layout: "docs" +layout: "silk-docs" title: "using (Aliases and Method Reuse)" description: "using introduces a local alias to an existing symbol, and (in interface / impl bodies) can import method signatures/implementations under a new name." docsCollection: "silk" diff --git a/src/silk/docs/language/varargs/page.md b/src/silk/docs/language/varargs/page.md index 63dd5d88..feed624c 100644 --- a/src/silk/docs/language/varargs/page.md +++ b/src/silk/docs/language/varargs/page.md @@ -1,5 +1,5 @@ --- -layout: "docs" +layout: "silk-docs" title: "Varargs (Variable Arguments)" description: "Silk supports declaring functions that accept a variable number of trailing arguments (“varargs”). This is used heavily by std::io::print / std::io::println for formatted output." docsCollection: "silk" diff --git a/src/silk/docs/man/libsilk.7/page.md b/src/silk/docs/man/libsilk.7/page.md index 6b825583..9dbffbe3 100644 --- a/src/silk/docs/man/libsilk.7/page.md +++ b/src/silk/docs/man/libsilk.7/page.md @@ -1,5 +1,5 @@ --- -layout: "docs" +layout: "silk-docs" title: "[libsilk(7)](?p=man/libsilk.7) — C99 ABI for the Silk Compiler" description: "NOTE: This is the Markdown source for a man 7 page describing the C99 embedding ABI exposed by libsilk.a. The roff-formatted manpage should be generated from this content." docsCollection: "silk" diff --git a/src/silk/docs/man/silk-build.1/page.md b/src/silk/docs/man/silk-build.1/page.md index f571ecc7..ae87efe9 100644 --- a/src/silk/docs/man/silk-build.1/page.md +++ b/src/silk/docs/man/silk-build.1/page.md @@ -1,5 +1,5 @@ --- -layout: "docs" +layout: "silk-docs" title: "[silk-build(1)](?p=man/silk-build.1) — Build Silk Artifacts" description: "NOTE: This is the Markdown source for the eventual man 1 page for silk build. The roff-formatted manpage should be generated from this content." docsCollection: "silk" diff --git a/src/silk/docs/man/silk-cache.1/page.md b/src/silk/docs/man/silk-cache.1/page.md index 2006ee2a..2b9c9910 100644 --- a/src/silk/docs/man/silk-cache.1/page.md +++ b/src/silk/docs/man/silk-cache.1/page.md @@ -1,5 +1,5 @@ --- -layout: "docs" +layout: "silk-docs" title: "[silk-cache(1)](?p=man/silk-cache.1) — Inspect and Maintain the Managed Silk Cache" description: "NOTE: This is the Markdown source for the eventual man 1 page for silk cache. The roff-formatted manpage should be generated from this content." docsCollection: "silk" diff --git a/src/silk/docs/man/silk-cc.1/page.md b/src/silk/docs/man/silk-cc.1/page.md index 383ff775..2a4eaae9 100644 --- a/src/silk/docs/man/silk-cc.1/page.md +++ b/src/silk/docs/man/silk-cc.1/page.md @@ -1,5 +1,5 @@ --- -layout: "docs" +layout: "silk-docs" title: "[silk-cc(1)](?p=man/silk-cc.1) — C Compiler Wrapper for libsilk" description: "NOTE: This is the Markdown source for the eventual man 1 page for silk cc. The roff-formatted manpage should be generated from this content." docsCollection: "silk" diff --git a/src/silk/docs/man/silk-check.1/page.md b/src/silk/docs/man/silk-check.1/page.md index f32e5970..feead9cc 100644 --- a/src/silk/docs/man/silk-check.1/page.md +++ b/src/silk/docs/man/silk-check.1/page.md @@ -1,5 +1,5 @@ --- -layout: "docs" +layout: "silk-docs" title: "[silk-check(1)](?p=man/silk-check.1) — Parse and Type-Check" description: "NOTE: This is the Markdown source for the eventual man 1 page for silk check. The roff-formatted manpage should be generated from this content." docsCollection: "silk" diff --git a/src/silk/docs/man/silk-codesign.1/page.md b/src/silk/docs/man/silk-codesign.1/page.md index a9806de6..1402551d 100644 --- a/src/silk/docs/man/silk-codesign.1/page.md +++ b/src/silk/docs/man/silk-codesign.1/page.md @@ -1,5 +1,5 @@ --- -layout: "docs" +layout: "silk-docs" title: "[silk-codesign(1)](?p=man/silk-codesign.1) - Sign And Verify Platform Artifacts" description: "NOTE: This is the Markdown source for the eventual man 1 page for silk codesign. The roff-formatted manpage should be generated from this content." docsCollection: "silk" diff --git a/src/silk/docs/man/silk-devices.1/page.md b/src/silk/docs/man/silk-devices.1/page.md index 792bca2c..a55d19d9 100644 --- a/src/silk/docs/man/silk-devices.1/page.md +++ b/src/silk/docs/man/silk-devices.1/page.md @@ -1,5 +1,5 @@ --- -layout: "docs" +layout: "silk-docs" title: "[silk-devices(1)](?p=man/silk-devices.1) - Manage Platform Devices And App Lifecycles" description: "NOTE: This is the Markdown source for the eventual man 1 page for silk devices. The roff-formatted manpage should be generated from this content." docsCollection: "silk" diff --git a/src/silk/docs/man/silk-doc.1/page.md b/src/silk/docs/man/silk-doc.1/page.md index 86bcf0e2..26965985 100644 --- a/src/silk/docs/man/silk-doc.1/page.md +++ b/src/silk/docs/man/silk-doc.1/page.md @@ -1,5 +1,5 @@ --- -layout: "docs" +layout: "silk-docs" title: "[silk-doc(1)](?p=man/silk-doc.1) — Generate Documentation (Markdown or Manpages)" description: "NOTE: This is the Markdown source for the eventual man 1 page for silk doc. The roff-formatted manpage should be generated from this content." docsCollection: "silk" diff --git a/src/silk/docs/man/silk-env.1/page.md b/src/silk/docs/man/silk-env.1/page.md index 69b46824..622a72bc 100644 --- a/src/silk/docs/man/silk-env.1/page.md +++ b/src/silk/docs/man/silk-env.1/page.md @@ -1,5 +1,5 @@ --- -layout: "docs" +layout: "silk-docs" title: "[silk-env(1)](?p=man/silk-env.1) — Print silk CLI Environment" description: "NOTE: This is the Markdown source for the eventual man 1 page for silk env. The roff-formatted manpage should be generated from this content." docsCollection: "silk" diff --git a/src/silk/docs/man/silk-error.1/page.md b/src/silk/docs/man/silk-error.1/page.md index e76e4f5a..7fc3140d 100644 --- a/src/silk/docs/man/silk-error.1/page.md +++ b/src/silk/docs/man/silk-error.1/page.md @@ -1,5 +1,5 @@ --- -layout: "docs" +layout: "silk-docs" title: "[silk-error(1)](?p=man/silk-error.1) — Explain Compiler Diagnostic Codes" description: "NOTE: This is the Markdown source for the eventual man 1 page for silk error. The roff-formatted manpage should be generated from this content." docsCollection: "silk" diff --git a/src/silk/docs/man/silk-format.1/page.md b/src/silk/docs/man/silk-format.1/page.md index c7c3ce43..d8e35489 100644 --- a/src/silk/docs/man/silk-format.1/page.md +++ b/src/silk/docs/man/silk-format.1/page.md @@ -1,5 +1,5 @@ --- -layout: "docs" +layout: "silk-docs" title: "[silk-format(1)](?p=man/silk-format.1) — Format Silk Source Files" description: "NOTE: This is the Markdown source for the eventual man 1 page for silk format. The roff-formatted manpage should be generated from this content." docsCollection: "silk" diff --git a/src/silk/docs/man/silk-graph.1/page.md b/src/silk/docs/man/silk-graph.1/page.md index cac82b3e..769185b6 100644 --- a/src/silk/docs/man/silk-graph.1/page.md +++ b/src/silk/docs/man/silk-graph.1/page.md @@ -1,5 +1,5 @@ --- -layout: "docs" +layout: "silk-docs" title: "[silk-graph(1)](?p=man/silk-graph.1) - Inspect Module Graphs" description: "NOTE: This is the Markdown source for the eventual man 1 page for silk graph. The roff-formatted manpage should be generated from this content." docsCollection: "silk" diff --git a/src/silk/docs/man/silk-guide.1/page.md b/src/silk/docs/man/silk-guide.1/page.md index 4195fce5..0cde6814 100644 --- a/src/silk/docs/man/silk-guide.1/page.md +++ b/src/silk/docs/man/silk-guide.1/page.md @@ -1,5 +1,5 @@ --- -layout: "docs" +layout: "silk-docs" title: "[silk-guide(1)](?p=man/silk-guide.1) — Search Curated Silk Example Guides" description: "NOTE: This is the Markdown source for the eventual man 1 page for silk guide. The roff-formatted manpage should be generated from this content." docsCollection: "silk" diff --git a/src/silk/docs/man/silk-help.1/page.md b/src/silk/docs/man/silk-help.1/page.md index 0697d4c1..da755944 100644 --- a/src/silk/docs/man/silk-help.1/page.md +++ b/src/silk/docs/man/silk-help.1/page.md @@ -1,5 +1,5 @@ --- -layout: "docs" +layout: "silk-docs" title: "[silk-help(1)](?p=man/silk-help.1) - Show Silk CLI Help" description: "NOTE: This is the Markdown source for the eventual man 1 page for silk help. The roff-formatted manpage should be generated from this content." docsCollection: "silk" diff --git a/src/silk/docs/man/silk-lsp.1/page.md b/src/silk/docs/man/silk-lsp.1/page.md index da740d7b..2a5f4780 100644 --- a/src/silk/docs/man/silk-lsp.1/page.md +++ b/src/silk/docs/man/silk-lsp.1/page.md @@ -1,5 +1,5 @@ --- -layout: "docs" +layout: "silk-docs" title: "[silk-lsp(1)](?p=man/silk-lsp.1) — Language Server Protocol (LSP) Server" description: "NOTE: This is the Markdown source for the eventual man 1 page for silk-lsp. The roff-formatted manpage should be generated from this content." docsCollection: "silk" diff --git a/src/silk/docs/man/silk-man.1/page.md b/src/silk/docs/man/silk-man.1/page.md index b439d990..f9032d06 100644 --- a/src/silk/docs/man/silk-man.1/page.md +++ b/src/silk/docs/man/silk-man.1/page.md @@ -1,5 +1,5 @@ --- -layout: "docs" +layout: "silk-docs" title: "[silk-man(1)](?p=man/silk-man.1) — View Manpages Derived from Source Docs" description: "NOTE: This is the Markdown source for the eventual man 1 page for silk man. The roff-formatted manpage should be generated from this content." docsCollection: "silk" diff --git a/src/silk/docs/man/silk-package.1/page.md b/src/silk/docs/man/silk-package.1/page.md index 33fc4bf9..e0578560 100644 --- a/src/silk/docs/man/silk-package.1/page.md +++ b/src/silk/docs/man/silk-package.1/page.md @@ -1,5 +1,5 @@ --- -layout: "docs" +layout: "silk-docs" title: "[silk-package(1)](?p=man/silk-package.1) — Inspect And Lint Silk Packages" description: "NOTE: This is the Markdown source for the eventual man 1 page for silk package. The roff-formatted manpage should be generated from this content." docsCollection: "silk" diff --git a/src/silk/docs/man/silk-proto.1/page.md b/src/silk/docs/man/silk-proto.1/page.md index 43c5c691..56262cba 100644 --- a/src/silk/docs/man/silk-proto.1/page.md +++ b/src/silk/docs/man/silk-proto.1/page.md @@ -1,5 +1,5 @@ --- -layout: "docs" +layout: "silk-docs" title: "[silk-proto(1)](?p=man/silk-proto.1) — compile proto3 schemas to Silk" description: "NOTE: This is the Markdown source for the eventual man 1 page for silk proto. The roff-formatted manpage should be generated from this content." docsCollection: "silk" diff --git a/src/silk/docs/man/silk-repl.1/page.md b/src/silk/docs/man/silk-repl.1/page.md index 14af7530..d3f84077 100644 --- a/src/silk/docs/man/silk-repl.1/page.md +++ b/src/silk/docs/man/silk-repl.1/page.md @@ -1,5 +1,5 @@ --- -layout: "docs" +layout: "silk-docs" title: "[silk-repl(1)](?p=man/silk-repl.1) - Interactive Silk REPL" description: "NOTE: This is the Markdown source for the eventual man 1 page for silk repl. The roff-formatted manpage should be generated from this content." docsCollection: "silk" diff --git a/src/silk/docs/man/silk-size.1/page.md b/src/silk/docs/man/silk-size.1/page.md index 06d254fa..709327da 100644 --- a/src/silk/docs/man/silk-size.1/page.md +++ b/src/silk/docs/man/silk-size.1/page.md @@ -1,5 +1,5 @@ --- -layout: "docs" +layout: "silk-docs" title: "[silk-size(1)](?p=man/silk-size.1) - Inspect Artifact Sizes" description: "NOTE: This is the Markdown source for the eventual man 1 page for silk size. The roff-formatted manpage should be generated from this content." docsCollection: "silk" diff --git a/src/silk/docs/man/silk-targets.1/page.md b/src/silk/docs/man/silk-targets.1/page.md index df841f59..3c2ff939 100644 --- a/src/silk/docs/man/silk-targets.1/page.md +++ b/src/silk/docs/man/silk-targets.1/page.md @@ -1,5 +1,5 @@ --- -layout: "docs" +layout: "silk-docs" title: "[silk-targets(1)](?p=man/silk-targets.1) - Inspect Target Capabilities" description: "NOTE: This is the Markdown source for the eventual man 1 page for silk targets. The roff-formatted manpage should be generated from this content." docsCollection: "silk" diff --git a/src/silk/docs/man/silk-test.1/page.md b/src/silk/docs/man/silk-test.1/page.md index 5c0b1958..8d5e8c24 100644 --- a/src/silk/docs/man/silk-test.1/page.md +++ b/src/silk/docs/man/silk-test.1/page.md @@ -1,5 +1,5 @@ --- -layout: "docs" +layout: "silk-docs" title: "[silk-test(1)](?p=man/silk-test.1) — Run Language-Level Tests" description: "NOTE: This is the Markdown source for the eventual man 1 page for silk test. The roff-formatted manpage should be generated from this content." docsCollection: "silk" diff --git a/src/silk/docs/man/silk.1/page.md b/src/silk/docs/man/silk.1/page.md index 66e0ef18..6a28a4e0 100644 --- a/src/silk/docs/man/silk.1/page.md +++ b/src/silk/docs/man/silk.1/page.md @@ -1,5 +1,5 @@ --- -layout: "docs" +layout: "silk-docs" title: "[silk(1)](?p=man/silk.1) — Silk Language Compiler" description: "NOTE: This is the Markdown source for the eventual man 1 page for silk. The roff-formatted manpage should be generated from this content." docsCollection: "silk" diff --git a/src/silk/docs/man/silk.7/page.md b/src/silk/docs/man/silk.7/page.md index 4cc85552..5ae0b559 100644 --- a/src/silk/docs/man/silk.7/page.md +++ b/src/silk/docs/man/silk.7/page.md @@ -1,5 +1,5 @@ --- -layout: "docs" +layout: "silk-docs" title: "[silk(7)](?p=man/silk.7) — Silk Toolchain Overview" description: "NOTE: This is the Markdown source for the eventual man 7 page for Silk. The roff-formatted manpage should be generated from this content." docsCollection: "silk" diff --git a/src/silk/docs/man/silk_abi_get_version.3/page.md b/src/silk/docs/man/silk_abi_get_version.3/page.md index 145726bb..deb961e1 100644 --- a/src/silk/docs/man/silk_abi_get_version.3/page.md +++ b/src/silk/docs/man/silk_abi_get_version.3/page.md @@ -1,5 +1,5 @@ --- -layout: "docs" +layout: "silk-docs" title: "[silk_abi_get_version(3)](?p=man/silk_abi_get_version.3) — Query the libsilk ABI Version" description: "NOTE: This is the Markdown source for the eventual man 3 page for silk_abi_get_version. The roff-formatted manpage should be generated from this content." docsCollection: "silk" diff --git a/src/silk/docs/man/silk_amdgpu_aql_dispatch_packet_build.3/page.md b/src/silk/docs/man/silk_amdgpu_aql_dispatch_packet_build.3/page.md index 9d79f34b..cffd21a4 100644 --- a/src/silk/docs/man/silk_amdgpu_aql_dispatch_packet_build.3/page.md +++ b/src/silk/docs/man/silk_amdgpu_aql_dispatch_packet_build.3/page.md @@ -1,5 +1,5 @@ --- -layout: "docs" +layout: "silk-docs" title: "[silk_amdgpu_aql_dispatch_packet_build(3)](?p=man/silk_amdgpu_aql_dispatch_packet_build.3) — Serialize AMDGPU AQL Dispatch Packets" description: "NOTE: This is the Markdown source for the eventual man 3 page for the AMDGPU AQL packet helper. The roff-formatted manpage should be generated from this content." docsCollection: "silk" diff --git a/src/silk/docs/man/silk_bytes.3/page.md b/src/silk/docs/man/silk_bytes.3/page.md index 20dfeb99..4a2cf515 100644 --- a/src/silk/docs/man/silk_bytes.3/page.md +++ b/src/silk/docs/man/silk_bytes.3/page.md @@ -1,5 +1,5 @@ --- -layout: "docs" +layout: "silk-docs" title: "[silk_bytes(3)](?p=man/silk_bytes.3) — Manage Owned Build Output Buffers" description: "NOTE: This is the Markdown source for the eventual man 3 page for SilkBytes output buffers. The roff-formatted manpage should be generated from this content." docsCollection: "silk" diff --git a/src/silk/docs/man/silk_compiler.3/page.md b/src/silk/docs/man/silk_compiler.3/page.md index e817c5f3..981aa637 100644 --- a/src/silk/docs/man/silk_compiler.3/page.md +++ b/src/silk/docs/man/silk_compiler.3/page.md @@ -1,5 +1,5 @@ --- -layout: "docs" +layout: "silk-docs" title: "[silk_compiler(3)](?p=man/silk_compiler.3) — Embed the Silk Compiler" description: "NOTE: This is the Markdown source for the eventual man 3 page for the SilkCompiler embedding API. The roff-formatted manpage should be generated from this content." docsCollection: "silk" diff --git a/src/silk/docs/man/silk_error.3/page.md b/src/silk/docs/man/silk_error.3/page.md index 403bc989..868a57ee 100644 --- a/src/silk/docs/man/silk_error.3/page.md +++ b/src/silk/docs/man/silk_error.3/page.md @@ -1,5 +1,5 @@ --- -layout: "docs" +layout: "silk-docs" title: "[silk_error(3)](?p=man/silk_error.3) — Retrieve and Format Compiler Errors" description: "NOTE: This is the Markdown source for the eventual man 3 page for SilkError formatting and retrieval. The roff-formatted manpage should be generated from this content." docsCollection: "silk" diff --git a/src/silk/docs/man/slc.1/page.md b/src/silk/docs/man/slc.1/page.md index 01ba9898..48d18448 100644 --- a/src/silk/docs/man/slc.1/page.md +++ b/src/silk/docs/man/slc.1/page.md @@ -1,5 +1,5 @@ --- -layout: "docs" +layout: "silk-docs" title: "[slc(1)](?p=man/slc.1) — Alias of silk build" description: "NOTE: This is the Markdown source for the eventual man 1 page for slc. The roff-formatted manpage should be generated from this content." docsCollection: "silk" diff --git a/src/silk/docs/man/slcc.1/page.md b/src/silk/docs/man/slcc.1/page.md index 80829dc1..21c0f321 100644 --- a/src/silk/docs/man/slcc.1/page.md +++ b/src/silk/docs/man/slcc.1/page.md @@ -1,5 +1,5 @@ --- -layout: "docs" +layout: "silk-docs" title: "[slcc(1)](?p=man/slcc.1) — Alias of silk cc" description: "NOTE: This is the Markdown source for the eventual man 1 page for slcc. The roff-formatted manpage should be generated from this content." docsCollection: "silk" diff --git a/src/silk/docs/page.md b/src/silk/docs/page.md index dd4487db..778eec38 100644 --- a/src/silk/docs/page.md +++ b/src/silk/docs/page.md @@ -1,5 +1,5 @@ --- -layout: "docs" +layout: "silk-docs" title: "Silk Documentation" description: "Silk is a high performance general purpose programming language with formal verification built in. Silk targets computer systems, mobile / tablet devices, WASM / WASI runtimes, and the web." docsCollection: "silk" diff --git a/src/silk/docs/std/abort-controller/page.md b/src/silk/docs/std/abort-controller/page.md index eb49e9b8..23e22440 100644 --- a/src/silk/docs/std/abort-controller/page.md +++ b/src/silk/docs/std/abort-controller/page.md @@ -1,5 +1,5 @@ --- -layout: "docs" +layout: "silk-docs" title: "std::abort_controller" description: "This module provides a WHATWG-style AbortController / AbortSignal pair for cooperative cancellation across async functions and OS-thread-backed task concurrency." docsCollection: "silk" diff --git a/src/silk/docs/std/abort_controller/page.md b/src/silk/docs/std/abort_controller/page.md index e702125a..a42eefb1 100644 --- a/src/silk/docs/std/abort_controller/page.md +++ b/src/silk/docs/std/abort_controller/page.md @@ -1,5 +1,5 @@ --- -layout: "docs" +layout: "silk-docs" title: "std::abort_controller" description: "This is the canonical module doc for std::abort_controller." docsCollection: "silk" diff --git a/src/silk/docs/std/algorithms/page.md b/src/silk/docs/std/algorithms/page.md index 4bd8baeb..01642046 100644 --- a/src/silk/docs/std/algorithms/page.md +++ b/src/silk/docs/std/algorithms/page.md @@ -1,5 +1,5 @@ --- -layout: "docs" +layout: "silk-docs" title: "std::algorithms" description: "This describes intended algorithm APIs; it is not implemented yet." docsCollection: "silk" diff --git a/src/silk/docs/std/args/page.md b/src/silk/docs/std/args/page.md index 07bad5ad..84f6f680 100644 --- a/src/silk/docs/std/args/page.md +++ b/src/silk/docs/std/args/page.md @@ -1,5 +1,5 @@ --- -layout: "docs" +layout: "silk-docs" title: "std::args" description: "A small native-argv helper surface is implemented in std/args.slk to make early programs ergonomic while string[] parameters and richer slice/iterator features are still future work." docsCollection: "silk" diff --git a/src/silk/docs/std/arrays/page.md b/src/silk/docs/std/arrays/page.md index 24a42a55..efa815ba 100644 --- a/src/silk/docs/std/arrays/page.md +++ b/src/silk/docs/std/arrays/page.md @@ -1,5 +1,5 @@ --- -layout: "docs" +layout: "silk-docs" title: "std::arrays" description: "A generic Slice(T) view type is provided for early FFI-friendly bridging; higher-level owning containers live in std::vector." docsCollection: "silk" diff --git a/src/silk/docs/std/atomic/page.md b/src/silk/docs/std/atomic/page.md index f0bc2a78..9fb310c3 100644 --- a/src/silk/docs/std/atomic/page.md +++ b/src/silk/docs/std/atomic/page.md @@ -1,5 +1,5 @@ --- -layout: "docs" +layout: "silk-docs" title: "std::atomic" description: "std::atomic provides the public Silk API for low-level atomic operations." docsCollection: "silk" diff --git a/src/silk/docs/std/bits/page.md b/src/silk/docs/std/bits/page.md index 8a463b7d..7df91e0a 100644 --- a/src/silk/docs/std/bits/page.md +++ b/src/silk/docs/std/bits/page.md @@ -1,5 +1,5 @@ --- -layout: "docs" +layout: "silk-docs" title: "std::bits" description: "A small bit-manipulation and byte-order helper subset is implemented in std/bits.slk for the current backend subset." docsCollection: "silk" diff --git a/src/silk/docs/std/boolean/page.md b/src/silk/docs/std/boolean/page.md index 634890de..bcd98861 100644 --- a/src/silk/docs/std/boolean/page.md +++ b/src/silk/docs/std/boolean/page.md @@ -1,5 +1,5 @@ --- -layout: "docs" +layout: "silk-docs" title: "std::boolean" description: "std::boolean provides a no-allocation boxed wrapper around the built-in bool primitive for method-oriented APIs." docsCollection: "silk" diff --git a/src/silk/docs/std/boxed-values/page.md b/src/silk/docs/std/boxed-values/page.md index 9526d2b5..36c4d477 100644 --- a/src/silk/docs/std/boxed-values/page.md +++ b/src/silk/docs/std/boxed-values/page.md @@ -1,5 +1,5 @@ --- -layout: "docs" +layout: "silk-docs" title: "Boxed Value Types" description: "This document records the current design direction for boxed stdlib wrappers around language primitive values and primitive-adjacent built-ins." docsCollection: "silk" diff --git a/src/silk/docs/std/buffer/page.md b/src/silk/docs/std/buffer/page.md index 431660dd..3098fbb5 100644 --- a/src/silk/docs/std/buffer/page.md +++ b/src/silk/docs/std/buffer/page.md @@ -1,5 +1,5 @@ --- -layout: "docs" +layout: "silk-docs" title: "std::buffer" description: "std::buffer provides:" docsCollection: "silk" diff --git a/src/silk/docs/std/build/page.md b/src/silk/docs/std/build/page.md index 10a99763..e058ebc9 100644 --- a/src/silk/docs/std/build/page.md +++ b/src/silk/docs/std/build/page.md @@ -1,5 +1,5 @@ --- -layout: "docs" +layout: "silk-docs" title: "std::build" description: "(manifest builder + step graph)." docsCollection: "silk" diff --git a/src/silk/docs/std/bytes/page.md b/src/silk/docs/std/bytes/page.md index 18e23150..2e364b7f 100644 --- a/src/silk/docs/std/bytes/page.md +++ b/src/silk/docs/std/bytes/page.md @@ -1,5 +1,5 @@ --- -layout: "docs" +layout: "silk-docs" title: "std::bytes" description: "std::bytes is the byte-oriented facade for allocation-free work over borrowed memory. It reuses std::arrays::ByteSlice as the concrete slice type and gives CLI/search/build tools short, stable names f" docsCollection: "silk" diff --git a/src/silk/docs/std/conventions/page.md b/src/silk/docs/std/conventions/page.md index 402cd468..ceac4405 100644 --- a/src/silk/docs/std/conventions/page.md +++ b/src/silk/docs/std/conventions/page.md @@ -1,5 +1,5 @@ --- -layout: "docs" +layout: "silk-docs" title: "std:: Conventions" description: "This defines the intended conventions for the Silk standard library. New and refactored std:: APIs must follow this document; older surfaces may temporarily diverge but must be migrated as they are to" docsCollection: "silk" diff --git a/src/silk/docs/std/crypto-aead/page.md b/src/silk/docs/std/crypto-aead/page.md index 81399939..3120d320 100644 --- a/src/silk/docs/std/crypto-aead/page.md +++ b/src/silk/docs/std/crypto-aead/page.md @@ -1,5 +1,5 @@ --- -layout: "docs" +layout: "silk-docs" title: "std::crypto::aead" description: "Source: std/crypto/aead.slk" docsCollection: "silk" diff --git a/src/silk/docs/std/crypto-box/page.md b/src/silk/docs/std/crypto-box/page.md index 0abd26f1..7c3743f9 100644 --- a/src/silk/docs/std/crypto-box/page.md +++ b/src/silk/docs/std/crypto-box/page.md @@ -1,5 +1,5 @@ --- -layout: "docs" +layout: "silk-docs" title: "std::crypto::box" description: "Source: std/crypto/box.slk" docsCollection: "silk" diff --git a/src/silk/docs/std/crypto-hash/page.md b/src/silk/docs/std/crypto-hash/page.md index 7ba99136..cc6e7262 100644 --- a/src/silk/docs/std/crypto-hash/page.md +++ b/src/silk/docs/std/crypto-hash/page.md @@ -1,5 +1,5 @@ --- -layout: "docs" +layout: "silk-docs" title: "std::crypto::hash" description: "Source: std/crypto/hash.slk" docsCollection: "silk" diff --git a/src/silk/docs/std/crypto-random/page.md b/src/silk/docs/std/crypto-random/page.md index fbe372fe..276c13a5 100644 --- a/src/silk/docs/std/crypto-random/page.md +++ b/src/silk/docs/std/crypto-random/page.md @@ -1,5 +1,5 @@ --- -layout: "docs" +layout: "silk-docs" title: "std::crypto::random" description: "Source: std/crypto/random.slk" docsCollection: "silk" diff --git a/src/silk/docs/std/crypto-secretbox/page.md b/src/silk/docs/std/crypto-secretbox/page.md index 24a613c4..9192f3d2 100644 --- a/src/silk/docs/std/crypto-secretbox/page.md +++ b/src/silk/docs/std/crypto-secretbox/page.md @@ -1,5 +1,5 @@ --- -layout: "docs" +layout: "silk-docs" title: "std::crypto::secretbox" description: "Source: std/crypto/secretbox.slk" docsCollection: "silk" diff --git a/src/silk/docs/std/crypto-sign/page.md b/src/silk/docs/std/crypto-sign/page.md index 7977b8ce..87897c9d 100644 --- a/src/silk/docs/std/crypto-sign/page.md +++ b/src/silk/docs/std/crypto-sign/page.md @@ -1,5 +1,5 @@ --- -layout: "docs" +layout: "silk-docs" title: "std::crypto::sign" description: "Source: std/crypto/sign.slk" docsCollection: "silk" diff --git a/src/silk/docs/std/crypto/page.md b/src/silk/docs/std/crypto/page.md index 5d60a592..a760cdb0 100644 --- a/src/silk/docs/std/crypto/page.md +++ b/src/silk/docs/std/crypto/page.md @@ -1,5 +1,5 @@ --- -layout: "docs" +layout: "silk-docs" title: "std::crypto" description: "std::crypto provides cryptographic primitives through a selectable security provider. The builtin provider uses target-matched built-in libsodium archives on the hosted POSIX baseline; the Apple platf" docsCollection: "silk" diff --git a/src/silk/docs/std/dylib/page.md b/src/silk/docs/std/dylib/page.md index 95cbfb15..44bf7a82 100644 --- a/src/silk/docs/std/dylib/page.md +++ b/src/silk/docs/std/dylib/page.md @@ -1,5 +1,5 @@ --- -layout: "docs" +layout: "silk-docs" title: "std::dylib" description: "std::dylib is the opt-in standard-library facade for loading dynamic libraries and resolving symbols at runtime." docsCollection: "silk" diff --git a/src/silk/docs/std/env/page.md b/src/silk/docs/std/env/page.md index 7c6c3b74..c0cfdcc5 100644 --- a/src/silk/docs/std/env/page.md +++ b/src/silk/docs/std/env/page.md @@ -1,5 +1,5 @@ --- -layout: "docs" +layout: "silk-docs" title: "std::env" description: "std::env provides access to process environment variables." docsCollection: "silk" diff --git a/src/silk/docs/std/ffi-c/page.md b/src/silk/docs/std/ffi-c/page.md index a8e82926..e951d7ef 100644 --- a/src/silk/docs/std/ffi-c/page.md +++ b/src/silk/docs/std/ffi-c/page.md @@ -1,5 +1,5 @@ --- -layout: "docs" +layout: "silk-docs" title: "std::ffi::c (C FFI helpers)" description: "This module provides small, explicit helpers for interoperating with C APIs from Silk via ext declarations." docsCollection: "silk" diff --git a/src/silk/docs/std/ffi-c_owned/page.md b/src/silk/docs/std/ffi-c_owned/page.md index 227b8521..0d4b8801 100644 --- a/src/silk/docs/std/ffi-c_owned/page.md +++ b/src/silk/docs/std/ffi-c_owned/page.md @@ -1,5 +1,5 @@ --- -layout: "docs" +layout: "silk-docs" title: "std::ffi::c_owned" description: "Source: std/ffi/c_owned.slk" docsCollection: "silk" diff --git a/src/silk/docs/std/filesystem/page.md b/src/silk/docs/std/filesystem/page.md index 8a1accbb..9cc6b07a 100644 --- a/src/silk/docs/std/filesystem/page.md +++ b/src/silk/docs/std/filesystem/page.md @@ -1,5 +1,5 @@ --- -layout: "docs" +layout: "silk-docs" title: "std::fs" description: "std::fs provides a small hosted filesystem API backed by std::runtime::fs. It exposes low-level File handles, path/file metadata queries, whole-file helpers, directory iteration, and byte-oriented I/O" docsCollection: "silk" diff --git a/src/silk/docs/std/flag/page.md b/src/silk/docs/std/flag/page.md index ac7f866c..b9e91806 100644 --- a/src/silk/docs/std/flag/page.md +++ b/src/silk/docs/std/flag/page.md @@ -1,5 +1,5 @@ --- -layout: "docs" +layout: "silk-docs" title: "std::flag" description: "std::flag provides a small, robust command line argument parser modeled after Go’s flag package, but shaped to match std:: conventions (explicit Result(...) errors, no leaky out-params, and a clear se" docsCollection: "silk" diff --git a/src/silk/docs/std/fmt/page.md b/src/silk/docs/std/fmt/page.md index 50bbb773..09d5daa4 100644 --- a/src/silk/docs/std/fmt/page.md +++ b/src/silk/docs/std/fmt/page.md @@ -1,5 +1,5 @@ --- -layout: "docs" +layout: "silk-docs" title: "std::fmt" description: "The initial formatting engine is implemented in std/fmt.slk and is intentionally scoped to the current compiler/backend subset (no generics, no runtime interface dispatch)." docsCollection: "silk" diff --git a/src/silk/docs/std/formal/page.md b/src/silk/docs/std/formal/page.md index d2831d8b..6dd0a595 100644 --- a/src/silk/docs/std/formal/page.md +++ b/src/silk/docs/std/formal/page.md @@ -1,5 +1,5 @@ --- -layout: "docs" +layout: "silk-docs" title: "std::formal" description: "This module provides the small, stable Formal Silk vocabulary that is broadly reusable across std:: and downstream verified code." docsCollection: "silk" diff --git a/src/silk/docs/std/fs-stream/page.md b/src/silk/docs/std/fs-stream/page.md index 14f3d9ee..3bfcddf9 100644 --- a/src/silk/docs/std/fs-stream/page.md +++ b/src/silk/docs/std/fs-stream/page.md @@ -1,5 +1,5 @@ --- -layout: "docs" +layout: "silk-docs" title: "std::fs::stream" description: "Source: std/fs/stream.slk" docsCollection: "silk" diff --git a/src/silk/docs/std/fs/page.md b/src/silk/docs/std/fs/page.md index 2c1904e9..de00c2a9 100644 --- a/src/silk/docs/std/fs/page.md +++ b/src/silk/docs/std/fs/page.md @@ -1,5 +1,5 @@ --- -layout: "docs" +layout: "silk-docs" title: "std::fs" description: "This is the canonical module doc for std::fs." docsCollection: "silk" diff --git a/src/silk/docs/std/function/page.md b/src/silk/docs/std/function/page.md index 845e1e3d..3926491b 100644 --- a/src/silk/docs/std/function/page.md +++ b/src/silk/docs/std/function/page.md @@ -1,5 +1,5 @@ --- -layout: "docs" +layout: "silk-docs" title: "std::function" description: "std::function provides a boxed holder for first-class Silk function values." docsCollection: "silk" diff --git a/src/silk/docs/std/ggml/page.md b/src/silk/docs/std/ggml/page.md index cd61a9a1..bb8686af 100644 --- a/src/silk/docs/std/ggml/page.md +++ b/src/silk/docs/std/ggml/page.md @@ -1,5 +1,5 @@ --- -layout: "docs" +layout: "silk-docs" title: "std::ggml" description: "std::ggml exposes a small, ABI-safe Silk wrapper over a pinned subset of upstream ggml. The current module is intentionally narrow: it is meant to let Silk programs allocate ggml contexts, build basic" docsCollection: "silk" diff --git a/src/silk/docs/std/gpu-device/page.md b/src/silk/docs/std/gpu-device/page.md index 44357296..4e51927f 100644 --- a/src/silk/docs/std/gpu-device/page.md +++ b/src/silk/docs/std/gpu-device/page.md @@ -1,5 +1,5 @@ --- -layout: "docs" +layout: "silk-docs" title: "std::gpu::device" description: "std::gpu::device is the semantic operation surface available inside attr(device=gpu) function bodies. Unlike std::gpu::isa, its API is expressed in terms of kernel parameters and work-item behavior ra" docsCollection: "silk" diff --git a/src/silk/docs/std/gpu-isa/page.md b/src/silk/docs/std/gpu-isa/page.md index f1b05f4a..ee729046 100644 --- a/src/silk/docs/std/gpu-isa/page.md +++ b/src/silk/docs/std/gpu-isa/page.md @@ -1,5 +1,5 @@ --- -layout: "docs" +layout: "silk-docs" title: "std::gpu::isa" description: "std::gpu::isa is the typed Silk spelling of the initial dependency-light AMDGPU instruction subset. It exists for kernel bring-up while ordinary Silk expressions are connected to the general GPU selec" docsCollection: "silk" diff --git a/src/silk/docs/std/gpu/page.md b/src/silk/docs/std/gpu/page.md index 5617187c..c1e4b313 100644 --- a/src/silk/docs/std/gpu/page.md +++ b/src/silk/docs/std/gpu/page.md @@ -1,5 +1,5 @@ --- -layout: "docs" +layout: "silk-docs" title: "std::gpu" description: "std::gpu is the public host-side API for pure-Silk GPU discovery, device memory, streams, kernel launch, and synchronization. GPU-v1 mixed Linux x86_64 executables use the provider recorded in their b" docsCollection: "silk" diff --git a/src/silk/docs/std/graphics-metal/page.md b/src/silk/docs/std/graphics-metal/page.md index 87e2d9eb..9853dc5e 100644 --- a/src/silk/docs/std/graphics-metal/page.md +++ b/src/silk/docs/std/graphics-metal/page.md @@ -1,5 +1,5 @@ --- -layout: "docs" +layout: "silk-docs" title: "std::graphics::metal" description: "Source: std/graphics/metal.slk" docsCollection: "silk" diff --git a/src/silk/docs/std/graphics-opengl/page.md b/src/silk/docs/std/graphics-opengl/page.md index 0a866fa9..37b589a7 100644 --- a/src/silk/docs/std/graphics-opengl/page.md +++ b/src/silk/docs/std/graphics-opengl/page.md @@ -1,5 +1,5 @@ --- -layout: "docs" +layout: "silk-docs" title: "std::graphics::opengl" description: "Source: std/graphics/opengl.slk" docsCollection: "silk" diff --git a/src/silk/docs/std/graphics-opengles/page.md b/src/silk/docs/std/graphics-opengles/page.md index 46d5cca7..96e1d972 100644 --- a/src/silk/docs/std/graphics-opengles/page.md +++ b/src/silk/docs/std/graphics-opengles/page.md @@ -1,5 +1,5 @@ --- -layout: "docs" +layout: "silk-docs" title: "std::graphics::opengles" description: "Source: std/graphics/opengles.slk" docsCollection: "silk" diff --git a/src/silk/docs/std/graphics-vulkan/page.md b/src/silk/docs/std/graphics-vulkan/page.md index cba05b64..f657d980 100644 --- a/src/silk/docs/std/graphics-vulkan/page.md +++ b/src/silk/docs/std/graphics-vulkan/page.md @@ -1,5 +1,5 @@ --- -layout: "docs" +layout: "silk-docs" title: "std::graphics::vulkan" description: "Source: std/graphics/vulkan.slk" docsCollection: "silk" diff --git a/src/silk/docs/std/graphics-window/page.md b/src/silk/docs/std/graphics-window/page.md index 01ec077f..96fccdfd 100644 --- a/src/silk/docs/std/graphics-window/page.md +++ b/src/silk/docs/std/graphics-window/page.md @@ -1,5 +1,5 @@ --- -layout: "docs" +layout: "silk-docs" title: "std::graphics::window" description: "Source: std/graphics/window.slk" docsCollection: "silk" diff --git a/src/silk/docs/std/graphics/page.md b/src/silk/docs/std/graphics/page.md index b6043941..69880fe1 100644 --- a/src/silk/docs/std/graphics/page.md +++ b/src/silk/docs/std/graphics/page.md @@ -1,5 +1,5 @@ --- -layout: "docs" +layout: "silk-docs" title: "std::graphics — Graphics API Bindings" description: "std::graphics is a namespace for low-level, FFI-oriented bindings to common graphics APIs and platform-specific facades where a generated SDK registry is not available." docsCollection: "silk" diff --git a/src/silk/docs/std/http/page.md b/src/silk/docs/std/http/page.md index e944434f..833663c2 100644 --- a/src/silk/docs/std/http/page.md +++ b/src/silk/docs/std/http/page.md @@ -1,5 +1,5 @@ --- -layout: "docs" +layout: "silk-docs" title: "std::http" description: "std::http provides HTTP/1.1 request/response parsing, a small blocking client/server connection API on top of std::net::TCPStream, and ergonomic URL/stream client helpers." docsCollection: "silk" diff --git a/src/silk/docs/std/https/page.md b/src/silk/docs/std/https/page.md index fddee54d..f65879f0 100644 --- a/src/silk/docs/std/https/page.md +++ b/src/silk/docs/std/https/page.md @@ -1,5 +1,5 @@ --- -layout: "docs" +layout: "silk-docs" title: "std::https" description: "std::https provides a small HTTPS client/server connection API on top of std::tls (currently the built-in mbedTLS provider) and std::net::TCPStream, plus URL and stream convenience helpers." docsCollection: "silk" diff --git a/src/silk/docs/std/idl-web/page.md b/src/silk/docs/std/idl-web/page.md index 3712e611..4303b1ef 100644 --- a/src/silk/docs/std/idl-web/page.md +++ b/src/silk/docs/std/idl-web/page.md @@ -1,5 +1,5 @@ --- -layout: "docs" +layout: "silk-docs" title: "Web IDL (std::idl::web)" description: "This module provides a Web IDL parser plus an ergonomic, query-oriented API for inspecting the parsed document." docsCollection: "silk" diff --git a/src/silk/docs/std/image-color/page.md b/src/silk/docs/std/image-color/page.md index 6b040d60..c229aeb3 100644 --- a/src/silk/docs/std/image-color/page.md +++ b/src/silk/docs/std/image-color/page.md @@ -1,5 +1,5 @@ --- -layout: "docs" +layout: "silk-docs" title: "std::image::color" description: "Source: std/image/color.slk" docsCollection: "silk" diff --git a/src/silk/docs/std/image-jpeg/page.md b/src/silk/docs/std/image-jpeg/page.md index 7960490f..06d766f8 100644 --- a/src/silk/docs/std/image-jpeg/page.md +++ b/src/silk/docs/std/image-jpeg/page.md @@ -1,5 +1,5 @@ --- -layout: "docs" +layout: "silk-docs" title: "std::image::jpeg" description: "Source: std/image/jpeg.slk" docsCollection: "silk" diff --git a/src/silk/docs/std/image-png/page.md b/src/silk/docs/std/image-png/page.md index 9b9fa960..f8ec531e 100644 --- a/src/silk/docs/std/image-png/page.md +++ b/src/silk/docs/std/image-png/page.md @@ -1,5 +1,5 @@ --- -layout: "docs" +layout: "silk-docs" title: "std::image::png" description: "Source: std/image/png.slk" docsCollection: "silk" diff --git a/src/silk/docs/std/image/page.md b/src/silk/docs/std/image/page.md index 9403f223..cb479408 100644 --- a/src/silk/docs/std/image/page.md +++ b/src/silk/docs/std/image/page.md @@ -1,5 +1,5 @@ --- -layout: "docs" +layout: "silk-docs" title: "std::image — Image Codecs + Color" description: "std::image provides:" docsCollection: "silk" diff --git a/src/silk/docs/std/interfaces/page.md b/src/silk/docs/std/interfaces/page.md index 38a425e6..2c6ebbbc 100644 --- a/src/silk/docs/std/interfaces/page.md +++ b/src/silk/docs/std/interfaces/page.md @@ -1,5 +1,5 @@ --- -layout: "docs" +layout: "silk-docs" title: "std::interfaces" description: "This module defines small, non-generic standard-library interfaces (“protocols”) that can be used today to express common capabilities across std:: types." docsCollection: "silk" diff --git a/src/silk/docs/std/io-async/page.md b/src/silk/docs/std/io-async/page.md index 7e7e3955..3bc12b54 100644 --- a/src/silk/docs/std/io-async/page.md +++ b/src/silk/docs/std/io-async/page.md @@ -1,5 +1,5 @@ --- -layout: "docs" +layout: "silk-docs" title: "std::io::async" description: "Source: std/io/async.slk" docsCollection: "silk" diff --git a/src/silk/docs/std/io-stream/page.md b/src/silk/docs/std/io-stream/page.md index 03a48a3d..1bcfbf73 100644 --- a/src/silk/docs/std/io-stream/page.md +++ b/src/silk/docs/std/io-stream/page.md @@ -1,5 +1,5 @@ --- -layout: "docs" +layout: "silk-docs" title: "std::io::stream" description: "Source: std/io/stream.slk" docsCollection: "silk" diff --git a/src/silk/docs/std/io/page.md b/src/silk/docs/std/io/page.md index 2c94eaf1..54ab3e45 100644 --- a/src/silk/docs/std/io/page.md +++ b/src/silk/docs/std/io/page.md @@ -1,5 +1,5 @@ --- -layout: "docs" +layout: "silk-docs" title: "std::io" description: "Basic stdin reads, stdout/stderr writes, an fd-backed BufferedWriter, and a minimal std::io::async subset are implemented in std/io.slk via std::runtime::io." docsCollection: "silk" diff --git a/src/silk/docs/std/js-ecma/page.md b/src/silk/docs/std/js-ecma/page.md index c65c97b7..21af6afa 100644 --- a/src/silk/docs/std/js-ecma/page.md +++ b/src/silk/docs/std/js-ecma/page.md @@ -1,5 +1,5 @@ --- -layout: "docs" +layout: "silk-docs" title: "ECMAScript FFI (std::js::ecma)" description: "This module defines a small, environment-agnostic interface for interacting with an ECMAScript engine from Silk." docsCollection: "silk" diff --git a/src/silk/docs/std/json/page.md b/src/silk/docs/std/json/page.md index 535f26b9..b476a55d 100644 --- a/src/silk/docs/std/json/page.md +++ b/src/silk/docs/std/json/page.md @@ -1,5 +1,5 @@ --- -layout: "docs" +layout: "silk-docs" title: "std::json" description: "std::json provides an RFC 8259-style JSON parser plus deterministic JSON emission over an index-based DOM." docsCollection: "silk" diff --git a/src/silk/docs/std/limits/page.md b/src/silk/docs/std/limits/page.md index 90d9c50a..237d9d8d 100644 --- a/src/silk/docs/std/limits/page.md +++ b/src/silk/docs/std/limits/page.md @@ -1,5 +1,5 @@ --- -layout: "docs" +layout: "silk-docs" title: "std::limits" description: "This module provides shared numeric limits for Silk primitive types." docsCollection: "silk" diff --git a/src/silk/docs/std/list/page.md b/src/silk/docs/std/list/page.md index 3dea475d..0c895b1d 100644 --- a/src/silk/docs/std/list/page.md +++ b/src/silk/docs/std/list/page.md @@ -1,5 +1,5 @@ --- -layout: "docs" +layout: "silk-docs" title: "std::list" description: "This module provides list-shaped wrappers over the queue core from std::queue." docsCollection: "silk" diff --git a/src/silk/docs/std/map/page.md b/src/silk/docs/std/map/page.md index ada27524..db396a1d 100644 --- a/src/silk/docs/std/map/page.md +++ b/src/silk/docs/std/map/page.md @@ -1,5 +1,5 @@ --- -layout: "docs" +layout: "silk-docs" title: "std::map — Maps and Dictionaries" description: "std::map provides the standard associative container surfaces:" docsCollection: "silk" diff --git a/src/silk/docs/std/math-matrix/page.md b/src/silk/docs/std/math-matrix/page.md index 2c519f90..d6341059 100644 --- a/src/silk/docs/std/math-matrix/page.md +++ b/src/silk/docs/std/math-matrix/page.md @@ -1,5 +1,5 @@ --- -layout: "docs" +layout: "silk-docs" title: "std::math::matrix" description: "Source: std/math/matrix.slk" docsCollection: "silk" diff --git a/src/silk/docs/std/math-vector/page.md b/src/silk/docs/std/math-vector/page.md index cbfa0b15..66fbafa0 100644 --- a/src/silk/docs/std/math-vector/page.md +++ b/src/silk/docs/std/math-vector/page.md @@ -1,5 +1,5 @@ --- -layout: "docs" +layout: "silk-docs" title: "std::math::vector" description: "Source: std/math/vector.slk" docsCollection: "silk" diff --git a/src/silk/docs/std/math/page.md b/src/silk/docs/std/math/page.md index cf40320e..bec2b5af 100644 --- a/src/silk/docs/std/math/page.md +++ b/src/silk/docs/std/math/page.md @@ -1,5 +1,5 @@ --- -layout: "docs" +layout: "silk-docs" title: "std::math" description: "This module provides linear algebra utilities intended for graphics and general-purpose computation." docsCollection: "silk" diff --git a/src/silk/docs/std/memory/page.md b/src/silk/docs/std/memory/page.md index 19173ec9..0f31215e 100644 --- a/src/silk/docs/std/memory/page.md +++ b/src/silk/docs/std/memory/page.md @@ -1,5 +1,5 @@ --- -layout: "docs" +layout: "silk-docs" title: "std::memory" description: "This describes intended memory APIs; it is not implemented yet." docsCollection: "silk" diff --git a/src/silk/docs/std/mime/page.md b/src/silk/docs/std/mime/page.md index b92bab8a..293e0926 100644 --- a/src/silk/docs/std/mime/page.md +++ b/src/silk/docs/std/mime/page.md @@ -1,5 +1,5 @@ --- -layout: "docs" +layout: "silk-docs" title: "std::mime" description: "std::mime maps file names, extensions, and content-type strings to MIME metadata suitable for HTTP responses, file indexing tools, and package publication helpers. Its shape is influenced by the local" docsCollection: "silk" diff --git a/src/silk/docs/std/module-catalog/page.md b/src/silk/docs/std/module-catalog/page.md index 700c89ae..42cbc12c 100644 --- a/src/silk/docs/std/module-catalog/page.md +++ b/src/silk/docs/std/module-catalog/page.md @@ -1,5 +1,5 @@ --- -layout: "docs" +layout: "silk-docs" title: "std:: Module Catalog" description: "This page is the canonical inventory of shipped modules under std/." docsCollection: "silk" diff --git a/src/silk/docs/std/net-stream/page.md b/src/silk/docs/std/net-stream/page.md index 90a72fa4..5ebf4897 100644 --- a/src/silk/docs/std/net-stream/page.md +++ b/src/silk/docs/std/net-stream/page.md @@ -1,5 +1,5 @@ --- -layout: "docs" +layout: "silk-docs" title: "std::net::stream" description: "Source: std/net/stream.slk" docsCollection: "silk" diff --git a/src/silk/docs/std/net/page.md b/src/silk/docs/std/net/page.md index 959aa701..38ce4077 100644 --- a/src/silk/docs/std/net/page.md +++ b/src/silk/docs/std/net/page.md @@ -1,5 +1,5 @@ --- -layout: "docs" +layout: "silk-docs" title: "std::net" description: "This is the canonical module doc for std::net." docsCollection: "silk" diff --git a/src/silk/docs/std/networking/page.md b/src/silk/docs/std/networking/page.md index 71f91d73..5d111e86 100644 --- a/src/silk/docs/std/networking/page.md +++ b/src/silk/docs/std/networking/page.md @@ -1,5 +1,5 @@ --- -layout: "docs" +layout: "silk-docs" title: "std::net" description: "A small endian/byte-order helper subset plus hosted IPv4/IPv6 TCP and IPv4/IPv6 UDP socket APIs are implemented in std/net.slk." docsCollection: "silk" diff --git a/src/silk/docs/std/number/page.md b/src/silk/docs/std/number/page.md index c156a8e8..0823bdad 100644 --- a/src/silk/docs/std/number/page.md +++ b/src/silk/docs/std/number/page.md @@ -1,5 +1,5 @@ --- -layout: "docs" +layout: "silk-docs" title: "std::number" description: "This module provides small, dependency-light number parsing and formatting helpers, plus a boxed Number value type." docsCollection: "silk" diff --git a/src/silk/docs/std/optional/page.md b/src/silk/docs/std/optional/page.md index 1e23e14b..a841b738 100644 --- a/src/silk/docs/std/optional/page.md +++ b/src/silk/docs/std/optional/page.md @@ -1,5 +1,5 @@ --- -layout: "docs" +layout: "silk-docs" title: "std::optional" description: "Optional(T) / T? is a language type, not a stdlib-defined enum. The compiler already provides the method-oriented combinator surface on optional values. std::optional exists as a stdlib namespace of f" docsCollection: "silk" diff --git a/src/silk/docs/std/os/page.md b/src/silk/docs/std/os/page.md index 02001f27..e50bbabf 100644 --- a/src/silk/docs/std/os/page.md +++ b/src/silk/docs/std/os/page.md @@ -1,5 +1,5 @@ --- -layout: "docs" +layout: "silk-docs" title: "std::os" description: "std::os provides:" docsCollection: "silk" diff --git a/src/silk/docs/std/overview/page.md b/src/silk/docs/std/overview/page.md index d6bdab96..0b492374 100644 --- a/src/silk/docs/std/overview/page.md +++ b/src/silk/docs/std/overview/page.md @@ -1,5 +1,5 @@ --- -layout: "docs" +layout: "silk-docs" title: "Standard Library Overview (std::)" description: "The docs/std/ directory specifies the intended API and structure. A minimal in-tree stdlib source tree also exists under std/ (used by the toolchain to satisfy import std::...;)." docsCollection: "silk" diff --git a/src/silk/docs/std/package-structure/page.md b/src/silk/docs/std/package-structure/page.md index 1c64955e..0b0aa532 100644 --- a/src/silk/docs/std/package-structure/page.md +++ b/src/silk/docs/std/package-structure/page.md @@ -1,5 +1,5 @@ --- -layout: "docs" +layout: "silk-docs" title: "std:: Module Structure" description: "This describes the intended organization and build integration for std::. A first, minimal slice of the build integration is implemented (auto-resolving std::... imports from a configurable stdlib roo" docsCollection: "silk" diff --git a/src/silk/docs/std/path/page.md b/src/silk/docs/std/path/page.md index c2273bf7..3c99e859 100644 --- a/src/silk/docs/std/path/page.md +++ b/src/silk/docs/std/path/page.md @@ -1,5 +1,5 @@ --- -layout: "docs" +layout: "silk-docs" title: "std::path" description: "std::path provides path manipulation utilities, borrowed path views, and the owned PathBuf builder/buffer." docsCollection: "silk" diff --git a/src/silk/docs/std/process-child/page.md b/src/silk/docs/std/process-child/page.md index 070d75d9..22b79450 100644 --- a/src/silk/docs/std/process-child/page.md +++ b/src/silk/docs/std/process-child/page.md @@ -1,5 +1,5 @@ --- -layout: "docs" +layout: "silk-docs" title: "std::process::child" description: "Source: std/process/child.slk" docsCollection: "silk" diff --git a/src/silk/docs/std/process/page.md b/src/silk/docs/std/process/page.md index 5c6de204..1e859e2f 100644 --- a/src/silk/docs/std/process/page.md +++ b/src/silk/docs/std/process/page.md @@ -1,5 +1,5 @@ --- -layout: "docs" +layout: "silk-docs" title: "std::process" description: "(hosted POSIX baseline)." docsCollection: "silk" diff --git a/src/silk/docs/std/protobuf/page.md b/src/silk/docs/std/protobuf/page.md index 51c0d98a..f16c082d 100644 --- a/src/silk/docs/std/protobuf/page.md +++ b/src/silk/docs/std/protobuf/page.md @@ -1,5 +1,5 @@ --- -layout: "docs" +layout: "silk-docs" title: "std::protobuf" description: "std::protobuf provides dependency-free Protocol Buffers binary wire helpers for Silk code and for modules generated by silk proto." docsCollection: "silk" diff --git a/src/silk/docs/std/queue/page.md b/src/silk/docs/std/queue/page.md index ac0a3a6b..13801e05 100644 --- a/src/silk/docs/std/queue/page.md +++ b/src/silk/docs/std/queue/page.md @@ -1,5 +1,5 @@ --- -layout: "docs" +layout: "silk-docs" title: "std::queue" description: "This module provides queue-oriented containers built on a shared owning deque core." docsCollection: "silk" diff --git a/src/silk/docs/std/range/page.md b/src/silk/docs/std/range/page.md index 7e443f61..9cfaeaa4 100644 --- a/src/silk/docs/std/range/page.md +++ b/src/silk/docs/std/range/page.md @@ -1,5 +1,5 @@ --- -layout: "docs" +layout: "silk-docs" title: "std::range" description: "std::range provides a boxed, method-bearing representation of the built-in range primitive." docsCollection: "silk" diff --git a/src/silk/docs/std/readline/page.md b/src/silk/docs/std/readline/page.md index a6de121e..a450f0a6 100644 --- a/src/silk/docs/std/readline/page.md +++ b/src/silk/docs/std/readline/page.md @@ -1,5 +1,5 @@ --- -layout: "docs" +layout: "silk-docs" title: "std::readline" description: "std::readline provides a small, ergonomic readline-style API for reading a single line of user input with interactive editing and history when stdin is connected to a TTY." docsCollection: "silk" diff --git a/src/silk/docs/std/regex/page.md b/src/silk/docs/std/regex/page.md index 5c361386..8e9dbef3 100644 --- a/src/silk/docs/std/regex/page.md +++ b/src/silk/docs/std/regex/page.md @@ -1,5 +1,5 @@ --- -layout: "docs" +layout: "silk-docs" title: "std::regex" description: "This module provides regular expression helpers built on top of:" docsCollection: "silk" diff --git a/src/silk/docs/std/result/page.md b/src/silk/docs/std/result/page.md index 7866f582..7f2b1ae3 100644 --- a/src/silk/docs/std/result/page.md +++ b/src/silk/docs/std/result/page.md @@ -1,5 +1,5 @@ --- -layout: "docs" +layout: "silk-docs" title: "std::result" description: "The language’s error model is explicit and typed (errors). std::result standardizes the common “success or error” return shape so that APIs across std:: compose cleanly." docsCollection: "silk" diff --git a/src/silk/docs/std/runtime-atomic/page.md b/src/silk/docs/std/runtime-atomic/page.md index f914a326..8d7d0b08 100644 --- a/src/silk/docs/std/runtime-atomic/page.md +++ b/src/silk/docs/std/runtime-atomic/page.md @@ -1,5 +1,5 @@ --- -layout: "docs" +layout: "silk-docs" title: "std::runtime::atomic" description: "std::runtime::atomic is the stdlib runtime interface used by std::atomic." docsCollection: "silk" diff --git a/src/silk/docs/std/runtime-build/page.md b/src/silk/docs/std/runtime-build/page.md index c7e4a955..db6e33ec 100644 --- a/src/silk/docs/std/runtime-build/page.md +++ b/src/silk/docs/std/runtime-build/page.md @@ -1,5 +1,5 @@ --- -layout: "docs" +layout: "silk-docs" title: "std::runtime::build" description: "Source: std/runtime/build.slk" docsCollection: "silk" diff --git a/src/silk/docs/std/runtime-dylib/page.md b/src/silk/docs/std/runtime-dylib/page.md index f9c34432..e1a5be75 100644 --- a/src/silk/docs/std/runtime-dylib/page.md +++ b/src/silk/docs/std/runtime-dylib/page.md @@ -1,5 +1,5 @@ --- -layout: "docs" +layout: "silk-docs" title: "std::runtime::dylib" description: "std::runtime::dylib is the runtime interface used by std::dylib." docsCollection: "silk" diff --git a/src/silk/docs/std/runtime-env/page.md b/src/silk/docs/std/runtime-env/page.md index 15f30d15..1a5ced73 100644 --- a/src/silk/docs/std/runtime-env/page.md +++ b/src/silk/docs/std/runtime-env/page.md @@ -1,5 +1,5 @@ --- -layout: "docs" +layout: "silk-docs" title: "std::runtime::env" description: "Source: std/runtime/env.slk" docsCollection: "silk" diff --git a/src/silk/docs/std/runtime-event_loop/page.md b/src/silk/docs/std/runtime-event_loop/page.md index 8dcd7f33..3b2336af 100644 --- a/src/silk/docs/std/runtime-event_loop/page.md +++ b/src/silk/docs/std/runtime-event_loop/page.md @@ -1,5 +1,5 @@ --- -layout: "docs" +layout: "silk-docs" title: "std::runtime::event_loop" description: "Source: std/runtime/event_loop.slk" docsCollection: "silk" diff --git a/src/silk/docs/std/runtime-fs/page.md b/src/silk/docs/std/runtime-fs/page.md index 87c4044c..524556e6 100644 --- a/src/silk/docs/std/runtime-fs/page.md +++ b/src/silk/docs/std/runtime-fs/page.md @@ -1,5 +1,5 @@ --- -layout: "docs" +layout: "silk-docs" title: "std::runtime::fs" description: "Source: std/runtime/fs.slk" docsCollection: "silk" diff --git a/src/silk/docs/std/runtime-globals/page.md b/src/silk/docs/std/runtime-globals/page.md index 53182449..0580207c 100644 --- a/src/silk/docs/std/runtime-globals/page.md +++ b/src/silk/docs/std/runtime-globals/page.md @@ -1,5 +1,5 @@ --- -layout: "docs" +layout: "silk-docs" title: "std::runtime::globals" description: "Source: std/runtime/globals.slk" docsCollection: "silk" diff --git a/src/silk/docs/std/runtime-gpu/page.md b/src/silk/docs/std/runtime-gpu/page.md index dd48223f..a8db6ccc 100644 --- a/src/silk/docs/std/runtime-gpu/page.md +++ b/src/silk/docs/std/runtime-gpu/page.md @@ -1,5 +1,5 @@ --- -layout: "docs" +layout: "silk-docs" title: "std::runtime::gpu" description: "std::runtime::gpu is the internal swappable runtime interface beneath std::gpu. It forwards to bundled silk_rt_gpu_* functions on the hosted Linux baseline and is not the preferred application import." docsCollection: "silk" diff --git a/src/silk/docs/std/runtime-graphics-metal/page.md b/src/silk/docs/std/runtime-graphics-metal/page.md index 6c3b4ed2..4b355893 100644 --- a/src/silk/docs/std/runtime-graphics-metal/page.md +++ b/src/silk/docs/std/runtime-graphics-metal/page.md @@ -1,5 +1,5 @@ --- -layout: "docs" +layout: "silk-docs" title: "std::runtime::graphics::metal" description: "std::runtime::graphics::metal is the low-level runtime boundary used by std::graphics::metal. It is not the application API; application code should import std::graphics::metal or std::graphics::windo" docsCollection: "silk" diff --git a/src/silk/docs/std/runtime-io/page.md b/src/silk/docs/std/runtime-io/page.md index 4a262545..cda58a53 100644 --- a/src/silk/docs/std/runtime-io/page.md +++ b/src/silk/docs/std/runtime-io/page.md @@ -1,5 +1,5 @@ --- -layout: "docs" +layout: "silk-docs" title: "std::runtime::io" description: "Source: std/runtime/io.slk" docsCollection: "silk" diff --git a/src/silk/docs/std/runtime-linux-event_loop/page.md b/src/silk/docs/std/runtime-linux-event_loop/page.md index ca1ee63a..0e7f28e5 100644 --- a/src/silk/docs/std/runtime-linux-event_loop/page.md +++ b/src/silk/docs/std/runtime-linux-event_loop/page.md @@ -1,5 +1,5 @@ --- -layout: "docs" +layout: "silk-docs" title: "std::runtime::linux::event_loop" description: "Source: std/runtime/linux/event_loop.slk" docsCollection: "silk" diff --git a/src/silk/docs/std/runtime-mem/page.md b/src/silk/docs/std/runtime-mem/page.md index 7456775d..89953999 100644 --- a/src/silk/docs/std/runtime-mem/page.md +++ b/src/silk/docs/std/runtime-mem/page.md @@ -1,5 +1,5 @@ --- -layout: "docs" +layout: "silk-docs" title: "std::runtime::mem" description: "Source: std/runtime/mem.slk" docsCollection: "silk" diff --git a/src/silk/docs/std/runtime-net/page.md b/src/silk/docs/std/runtime-net/page.md index 51481649..069da217 100644 --- a/src/silk/docs/std/runtime-net/page.md +++ b/src/silk/docs/std/runtime-net/page.md @@ -1,5 +1,5 @@ --- -layout: "docs" +layout: "silk-docs" title: "std::runtime::net" description: "Source: std/runtime/net.slk" docsCollection: "silk" diff --git a/src/silk/docs/std/runtime-number/page.md b/src/silk/docs/std/runtime-number/page.md index 914f40a4..7e0614c0 100644 --- a/src/silk/docs/std/runtime-number/page.md +++ b/src/silk/docs/std/runtime-number/page.md @@ -1,5 +1,5 @@ --- -layout: "docs" +layout: "silk-docs" title: "std::runtime::number" description: "Source: std/runtime/number.slk" docsCollection: "silk" diff --git a/src/silk/docs/std/runtime-posix-atomic/page.md b/src/silk/docs/std/runtime-posix-atomic/page.md index b512b72d..983c626e 100644 --- a/src/silk/docs/std/runtime-posix-atomic/page.md +++ b/src/silk/docs/std/runtime-posix-atomic/page.md @@ -1,5 +1,5 @@ --- -layout: "docs" +layout: "silk-docs" title: "std::runtime::posix::atomic" description: "std::runtime::posix::atomic is the hosted POSIX implementation module for std::runtime::atomic." docsCollection: "silk" diff --git a/src/silk/docs/std/runtime-posix-dylib/page.md b/src/silk/docs/std/runtime-posix-dylib/page.md index 899d9f3e..7cbe16c9 100644 --- a/src/silk/docs/std/runtime-posix-dylib/page.md +++ b/src/silk/docs/std/runtime-posix-dylib/page.md @@ -1,5 +1,5 @@ --- -layout: "docs" +layout: "silk-docs" title: "std::runtime::posix::dylib" description: "std::runtime::posix::dylib is the hosted POSIX dynamic-loader backend for std::runtime::dylib." docsCollection: "silk" diff --git a/src/silk/docs/std/runtime-posix-env/page.md b/src/silk/docs/std/runtime-posix-env/page.md index 9a6c544c..957de918 100644 --- a/src/silk/docs/std/runtime-posix-env/page.md +++ b/src/silk/docs/std/runtime-posix-env/page.md @@ -1,5 +1,5 @@ --- -layout: "docs" +layout: "silk-docs" title: "std::runtime::posix::env" description: "Source: std/runtime/posix/env.slk" docsCollection: "silk" diff --git a/src/silk/docs/std/runtime-posix-event_loop/page.md b/src/silk/docs/std/runtime-posix-event_loop/page.md index 8eff4607..16da2e0b 100644 --- a/src/silk/docs/std/runtime-posix-event_loop/page.md +++ b/src/silk/docs/std/runtime-posix-event_loop/page.md @@ -1,5 +1,5 @@ --- -layout: "docs" +layout: "silk-docs" title: "std::runtime::posix::event_loop" description: "Source: std/runtime/posix/event_loop.slk" docsCollection: "silk" diff --git a/src/silk/docs/std/runtime-posix-fs/page.md b/src/silk/docs/std/runtime-posix-fs/page.md index 9fe180ac..0ea1556a 100644 --- a/src/silk/docs/std/runtime-posix-fs/page.md +++ b/src/silk/docs/std/runtime-posix-fs/page.md @@ -1,5 +1,5 @@ --- -layout: "docs" +layout: "silk-docs" title: "std::runtime::posix::fs" description: "Source: std/runtime/posix/fs.slk" docsCollection: "silk" diff --git a/src/silk/docs/std/runtime-posix-io/page.md b/src/silk/docs/std/runtime-posix-io/page.md index 79e482bf..ab0703c8 100644 --- a/src/silk/docs/std/runtime-posix-io/page.md +++ b/src/silk/docs/std/runtime-posix-io/page.md @@ -1,5 +1,5 @@ --- -layout: "docs" +layout: "silk-docs" title: "std::runtime::posix::io" description: "Source: std/runtime/posix/io.slk" docsCollection: "silk" diff --git a/src/silk/docs/std/runtime-posix-mem/page.md b/src/silk/docs/std/runtime-posix-mem/page.md index 0f7d0204..b57b8db1 100644 --- a/src/silk/docs/std/runtime-posix-mem/page.md +++ b/src/silk/docs/std/runtime-posix-mem/page.md @@ -1,5 +1,5 @@ --- -layout: "docs" +layout: "silk-docs" title: "std::runtime::posix::mem" description: "Source: std/runtime/posix/mem.slk" docsCollection: "silk" diff --git a/src/silk/docs/std/runtime-posix-net/page.md b/src/silk/docs/std/runtime-posix-net/page.md index 507e7eab..fa580076 100644 --- a/src/silk/docs/std/runtime-posix-net/page.md +++ b/src/silk/docs/std/runtime-posix-net/page.md @@ -1,5 +1,5 @@ --- -layout: "docs" +layout: "silk-docs" title: "std::runtime::posix::net" description: "Source: std/runtime/posix/net.slk" docsCollection: "silk" diff --git a/src/silk/docs/std/runtime-posix-process/page.md b/src/silk/docs/std/runtime-posix-process/page.md index 52c67927..b5528414 100644 --- a/src/silk/docs/std/runtime-posix-process/page.md +++ b/src/silk/docs/std/runtime-posix-process/page.md @@ -1,5 +1,5 @@ --- -layout: "docs" +layout: "silk-docs" title: "std::runtime::posix::process" description: "Source: std/runtime/posix/process.slk" docsCollection: "silk" diff --git a/src/silk/docs/std/runtime-posix-signal/page.md b/src/silk/docs/std/runtime-posix-signal/page.md index 55ec4c2a..f0c1d536 100644 --- a/src/silk/docs/std/runtime-posix-signal/page.md +++ b/src/silk/docs/std/runtime-posix-signal/page.md @@ -1,5 +1,5 @@ --- -layout: "docs" +layout: "silk-docs" title: "std::runtime::posix::signal" description: "Source: std/runtime/posix/signal.slk" docsCollection: "silk" diff --git a/src/silk/docs/std/runtime-posix-sync/page.md b/src/silk/docs/std/runtime-posix-sync/page.md index fa196132..066b2686 100644 --- a/src/silk/docs/std/runtime-posix-sync/page.md +++ b/src/silk/docs/std/runtime-posix-sync/page.md @@ -1,5 +1,5 @@ --- -layout: "docs" +layout: "silk-docs" title: "std::runtime::posix::sync" description: "Source: std/runtime/posix/sync.slk" docsCollection: "silk" diff --git a/src/silk/docs/std/runtime-posix-task/page.md b/src/silk/docs/std/runtime-posix-task/page.md index ef7c68f0..516f7eeb 100644 --- a/src/silk/docs/std/runtime-posix-task/page.md +++ b/src/silk/docs/std/runtime-posix-task/page.md @@ -1,5 +1,5 @@ --- -layout: "docs" +layout: "silk-docs" title: "std::runtime::posix::task" description: "Source: std/runtime/posix/task.slk" docsCollection: "silk" diff --git a/src/silk/docs/std/runtime-posix-time/page.md b/src/silk/docs/std/runtime-posix-time/page.md index fa59d7ca..cfcae753 100644 --- a/src/silk/docs/std/runtime-posix-time/page.md +++ b/src/silk/docs/std/runtime-posix-time/page.md @@ -1,5 +1,5 @@ --- -layout: "docs" +layout: "silk-docs" title: "std::runtime::posix::time" description: "Source: std/runtime/posix/time.slk" docsCollection: "silk" diff --git a/src/silk/docs/std/runtime-process/page.md b/src/silk/docs/std/runtime-process/page.md index 25612e39..2d6a469f 100644 --- a/src/silk/docs/std/runtime-process/page.md +++ b/src/silk/docs/std/runtime-process/page.md @@ -1,5 +1,5 @@ --- -layout: "docs" +layout: "silk-docs" title: "std::runtime::process" description: "Source: std/runtime/process.slk" docsCollection: "silk" diff --git a/src/silk/docs/std/runtime-readline/page.md b/src/silk/docs/std/runtime-readline/page.md index e8fad17b..02a8fd05 100644 --- a/src/silk/docs/std/runtime-readline/page.md +++ b/src/silk/docs/std/runtime-readline/page.md @@ -1,5 +1,5 @@ --- -layout: "docs" +layout: "silk-docs" title: "std::runtime::readline" description: "Source: std/runtime/readline.slk" docsCollection: "silk" diff --git a/src/silk/docs/std/runtime-regex/page.md b/src/silk/docs/std/runtime-regex/page.md index 5050fca6..25c0e403 100644 --- a/src/silk/docs/std/runtime-regex/page.md +++ b/src/silk/docs/std/runtime-regex/page.md @@ -1,5 +1,5 @@ --- -layout: "docs" +layout: "silk-docs" title: "std::runtime::regex" description: "Source: std/runtime/regex.slk" docsCollection: "silk" diff --git a/src/silk/docs/std/runtime-signal/page.md b/src/silk/docs/std/runtime-signal/page.md index 94331761..8199a03e 100644 --- a/src/silk/docs/std/runtime-signal/page.md +++ b/src/silk/docs/std/runtime-signal/page.md @@ -1,5 +1,5 @@ --- -layout: "docs" +layout: "silk-docs" title: "std::runtime::signal" description: "Source: std/runtime/signal.slk" docsCollection: "silk" diff --git a/src/silk/docs/std/runtime-sync/page.md b/src/silk/docs/std/runtime-sync/page.md index 6618734a..88cd0fbc 100644 --- a/src/silk/docs/std/runtime-sync/page.md +++ b/src/silk/docs/std/runtime-sync/page.md @@ -1,5 +1,5 @@ --- -layout: "docs" +layout: "silk-docs" title: "std::runtime::sync" description: "Source: std/runtime/sync.slk" docsCollection: "silk" diff --git a/src/silk/docs/std/runtime-task/page.md b/src/silk/docs/std/runtime-task/page.md index 35c12520..fd568648 100644 --- a/src/silk/docs/std/runtime-task/page.md +++ b/src/silk/docs/std/runtime-task/page.md @@ -1,5 +1,5 @@ --- -layout: "docs" +layout: "silk-docs" title: "std::runtime::task" description: "Source: std/runtime/task.slk" docsCollection: "silk" diff --git a/src/silk/docs/std/runtime-time/page.md b/src/silk/docs/std/runtime-time/page.md index ca8ae678..87c98b99 100644 --- a/src/silk/docs/std/runtime-time/page.md +++ b/src/silk/docs/std/runtime-time/page.md @@ -1,5 +1,5 @@ --- -layout: "docs" +layout: "silk-docs" title: "std::runtime::time" description: "Source: std/runtime/time.slk" docsCollection: "silk" diff --git a/src/silk/docs/std/runtime-unicode/page.md b/src/silk/docs/std/runtime-unicode/page.md index d9b109cb..9b06ec03 100644 --- a/src/silk/docs/std/runtime-unicode/page.md +++ b/src/silk/docs/std/runtime-unicode/page.md @@ -1,5 +1,5 @@ --- -layout: "docs" +layout: "silk-docs" title: "std::runtime::unicode" description: "Source: std/runtime/unicode.slk" docsCollection: "silk" diff --git a/src/silk/docs/std/runtime-wasi-cwd/page.md b/src/silk/docs/std/runtime-wasi-cwd/page.md index f4f3f6b6..23948102 100644 --- a/src/silk/docs/std/runtime-wasi-cwd/page.md +++ b/src/silk/docs/std/runtime-wasi-cwd/page.md @@ -1,5 +1,5 @@ --- -layout: "docs" +layout: "silk-docs" title: "std::runtime::wasi::cwd" description: "Source: std/runtime/wasi/cwd.slk" docsCollection: "silk" diff --git a/src/silk/docs/std/runtime-wasi-env/page.md b/src/silk/docs/std/runtime-wasi-env/page.md index aff0b49f..6021e4cc 100644 --- a/src/silk/docs/std/runtime-wasi-env/page.md +++ b/src/silk/docs/std/runtime-wasi-env/page.md @@ -1,5 +1,5 @@ --- -layout: "docs" +layout: "silk-docs" title: "std::runtime::wasi::env" description: "Source: std/runtime/wasi/env.slk" docsCollection: "silk" diff --git a/src/silk/docs/std/runtime-wasi-event_loop/page.md b/src/silk/docs/std/runtime-wasi-event_loop/page.md index 5392cd16..ac94a4eb 100644 --- a/src/silk/docs/std/runtime-wasi-event_loop/page.md +++ b/src/silk/docs/std/runtime-wasi-event_loop/page.md @@ -1,5 +1,5 @@ --- -layout: "docs" +layout: "silk-docs" title: "std::runtime::wasi::event_loop" description: "Source: std/runtime/wasi/event_loop.slk" docsCollection: "silk" diff --git a/src/silk/docs/std/runtime-wasi-fs/page.md b/src/silk/docs/std/runtime-wasi-fs/page.md index 4d14a0b7..5e1bbc18 100644 --- a/src/silk/docs/std/runtime-wasi-fs/page.md +++ b/src/silk/docs/std/runtime-wasi-fs/page.md @@ -1,5 +1,5 @@ --- -layout: "docs" +layout: "silk-docs" title: "std::runtime::wasi::fs" description: "Source: std/runtime/wasi/fs.slk" docsCollection: "silk" diff --git a/src/silk/docs/std/runtime-wasi-io/page.md b/src/silk/docs/std/runtime-wasi-io/page.md index 89e66693..31fe5e98 100644 --- a/src/silk/docs/std/runtime-wasi-io/page.md +++ b/src/silk/docs/std/runtime-wasi-io/page.md @@ -1,5 +1,5 @@ --- -layout: "docs" +layout: "silk-docs" title: "std::runtime::wasi::io" description: "Source: std/runtime/wasi/io.slk" docsCollection: "silk" diff --git a/src/silk/docs/std/runtime-wasi-mem/page.md b/src/silk/docs/std/runtime-wasi-mem/page.md index d7ee727a..93accce2 100644 --- a/src/silk/docs/std/runtime-wasi-mem/page.md +++ b/src/silk/docs/std/runtime-wasi-mem/page.md @@ -1,5 +1,5 @@ --- -layout: "docs" +layout: "silk-docs" title: "std::runtime::wasi::mem" description: "Source: std/runtime/wasi/mem.slk" docsCollection: "silk" diff --git a/src/silk/docs/std/runtime-wasi-net/page.md b/src/silk/docs/std/runtime-wasi-net/page.md index 294628a3..690925fa 100644 --- a/src/silk/docs/std/runtime-wasi-net/page.md +++ b/src/silk/docs/std/runtime-wasi-net/page.md @@ -1,5 +1,5 @@ --- -layout: "docs" +layout: "silk-docs" title: "std::runtime::wasi::net" description: "Source: std/runtime/wasi/net.slk" docsCollection: "silk" diff --git a/src/silk/docs/std/runtime-wasi-preopen/page.md b/src/silk/docs/std/runtime-wasi-preopen/page.md index fabd1ae6..8f274e0c 100644 --- a/src/silk/docs/std/runtime-wasi-preopen/page.md +++ b/src/silk/docs/std/runtime-wasi-preopen/page.md @@ -1,5 +1,5 @@ --- -layout: "docs" +layout: "silk-docs" title: "std::runtime::wasi::preopen" description: "Source: std/runtime/wasi/preopen.slk" docsCollection: "silk" diff --git a/src/silk/docs/std/runtime-wasi-process/page.md b/src/silk/docs/std/runtime-wasi-process/page.md index 24ec40cd..0dd240aa 100644 --- a/src/silk/docs/std/runtime-wasi-process/page.md +++ b/src/silk/docs/std/runtime-wasi-process/page.md @@ -1,5 +1,5 @@ --- -layout: "docs" +layout: "silk-docs" title: "std::runtime::wasi::process" description: "Source: std/runtime/wasi/process.slk" docsCollection: "silk" diff --git a/src/silk/docs/std/runtime-wasi-signal/page.md b/src/silk/docs/std/runtime-wasi-signal/page.md index c7e79716..5c848b45 100644 --- a/src/silk/docs/std/runtime-wasi-signal/page.md +++ b/src/silk/docs/std/runtime-wasi-signal/page.md @@ -1,5 +1,5 @@ --- -layout: "docs" +layout: "silk-docs" title: "std::runtime::wasi::signal" description: "Source: std/runtime/wasi/signal.slk" docsCollection: "silk" diff --git a/src/silk/docs/std/runtime-wasi-sync/page.md b/src/silk/docs/std/runtime-wasi-sync/page.md index aa8a5a38..d9db5e5b 100644 --- a/src/silk/docs/std/runtime-wasi-sync/page.md +++ b/src/silk/docs/std/runtime-wasi-sync/page.md @@ -1,5 +1,5 @@ --- -layout: "docs" +layout: "silk-docs" title: "std::runtime::wasi::sync" description: "Source: std/runtime/wasi/sync.slk" docsCollection: "silk" diff --git a/src/silk/docs/std/runtime-wasi-task/page.md b/src/silk/docs/std/runtime-wasi-task/page.md index fc9a8aea..cd74499b 100644 --- a/src/silk/docs/std/runtime-wasi-task/page.md +++ b/src/silk/docs/std/runtime-wasi-task/page.md @@ -1,5 +1,5 @@ --- -layout: "docs" +layout: "silk-docs" title: "std::runtime::wasi::task" description: "Source: std/runtime/wasi/task.slk" docsCollection: "silk" diff --git a/src/silk/docs/std/runtime-wasi-time/page.md b/src/silk/docs/std/runtime-wasi-time/page.md index 1f7cee6b..1e1d6984 100644 --- a/src/silk/docs/std/runtime-wasi-time/page.md +++ b/src/silk/docs/std/runtime-wasi-time/page.md @@ -1,5 +1,5 @@ --- -layout: "docs" +layout: "silk-docs" title: "std::runtime::wasi::time" description: "Source: std/runtime/wasi/time.slk" docsCollection: "silk" diff --git a/src/silk/docs/std/runtime-window/page.md b/src/silk/docs/std/runtime-window/page.md index b78b860e..4dedf26c 100644 --- a/src/silk/docs/std/runtime-window/page.md +++ b/src/silk/docs/std/runtime-window/page.md @@ -1,5 +1,5 @@ --- -layout: "docs" +layout: "silk-docs" title: "std::runtime::window" description: "std::runtime::window is the low-level runtime boundary used by std::window. It is not intended as the ergonomic application API; import std::window or a platform facade under std::window::* instead." docsCollection: "silk" diff --git a/src/silk/docs/std/runtime-z3/page.md b/src/silk/docs/std/runtime-z3/page.md index 2599e327..4c2157c3 100644 --- a/src/silk/docs/std/runtime-z3/page.md +++ b/src/silk/docs/std/runtime-z3/page.md @@ -1,5 +1,5 @@ --- -layout: "docs" +layout: "silk-docs" title: "std::runtime::z3" description: "Source: std/runtime/z3.slk" docsCollection: "silk" diff --git a/src/silk/docs/std/runtime/page.md b/src/silk/docs/std/runtime/page.md index 3e341cde..373c889c 100644 --- a/src/silk/docs/std/runtime/page.md +++ b/src/silk/docs/std/runtime/page.md @@ -1,5 +1,5 @@ --- -layout: "docs" +layout: "silk-docs" title: "std::runtime" description: "std::runtime defines a runtime interface layer that sits underneath the rest of the standard library." docsCollection: "silk" diff --git a/src/silk/docs/std/semver/page.md b/src/silk/docs/std/semver/page.md index 4a3f68b4..5e69d3b8 100644 --- a/src/silk/docs/std/semver/page.md +++ b/src/silk/docs/std/semver/page.md @@ -1,5 +1,5 @@ --- -layout: "docs" +layout: "silk-docs" title: "std::semver" description: "std::semver provides a SemVer 2.0.0 parser and precedence comparison." docsCollection: "silk" diff --git a/src/silk/docs/std/set/page.md b/src/silk/docs/std/set/page.md index b951f261..a2617203 100644 --- a/src/silk/docs/std/set/page.md +++ b/src/silk/docs/std/set/page.md @@ -1,5 +1,5 @@ --- -layout: "docs" +layout: "silk-docs" title: "std::set — Sets" description: "std::set provides standard set container surfaces:" docsCollection: "silk" diff --git a/src/silk/docs/std/signal/page.md b/src/silk/docs/std/signal/page.md index 67a905ad..d51e47d8 100644 --- a/src/silk/docs/std/signal/page.md +++ b/src/silk/docs/std/signal/page.md @@ -1,5 +1,5 @@ --- -layout: "docs" +layout: "silk-docs" title: "std::signal" description: "std::signal provides a small, pollable signal-watching surface intended for terminal/TUI programs." docsCollection: "silk" diff --git a/src/silk/docs/std/sqlite/page.md b/src/silk/docs/std/sqlite/page.md index d0178df9..09b97c88 100644 --- a/src/silk/docs/std/sqlite/page.md +++ b/src/silk/docs/std/sqlite/page.md @@ -1,5 +1,5 @@ --- -layout: "docs" +layout: "silk-docs" title: "std::sqlite" description: "std::sqlite provides SQLite database primitives for the hosted POSIX baseline. On supported hosted target layouts, silk build auto-links the built-in libsqlite3.a so outputs do not depend on a system " docsCollection: "silk" diff --git a/src/silk/docs/std/ssh/page.md b/src/silk/docs/std/ssh/page.md index cc9e6e95..182a2843 100644 --- a/src/silk/docs/std/ssh/page.md +++ b/src/silk/docs/std/ssh/page.md @@ -1,5 +1,5 @@ --- -layout: "docs" +layout: "silk-docs" title: "std::ssh" description: "std::ssh is the ergonomic stdlib entrypoint for Silk's hosted SSH client surface. It forwards the current libssh2-backed implementation that lives in std::ssh2, so downstream code can import std::ssh " docsCollection: "silk" diff --git a/src/silk/docs/std/ssh2/page.md b/src/silk/docs/std/ssh2/page.md index 22b77db4..4fafac1d 100644 --- a/src/silk/docs/std/ssh2/page.md +++ b/src/silk/docs/std/ssh2/page.md @@ -1,5 +1,5 @@ --- -layout: "docs" +layout: "silk-docs" title: "std::ssh2" description: "std::ssh2 provides the current libssh2-backed SSH2 implementation for the hosted POSIX baseline. On supported hosted target layouts, silk build auto-links the built-in libssh2.a so outputs do not depe" docsCollection: "silk" diff --git a/src/silk/docs/std/stack/page.md b/src/silk/docs/std/stack/page.md index 0843e54e..ab221ed0 100644 --- a/src/silk/docs/std/stack/page.md +++ b/src/silk/docs/std/stack/page.md @@ -1,5 +1,5 @@ --- -layout: "docs" +layout: "silk-docs" title: "std::stack" description: "This module provides stack-oriented wrappers over std::queue’s deque core." docsCollection: "silk" diff --git a/src/silk/docs/std/stream/page.md b/src/silk/docs/std/stream/page.md index 33eee0d0..91644eda 100644 --- a/src/silk/docs/std/stream/page.md +++ b/src/silk/docs/std/stream/page.md @@ -1,5 +1,5 @@ --- -layout: "docs" +layout: "silk-docs" title: "std::stream" description: "This module provides a Web Streams-inspired API for byte streams designed to work well with Silk’s async/task model." docsCollection: "silk" diff --git a/src/silk/docs/std/strings/page.md b/src/silk/docs/std/strings/page.md index 0003d4f1..8c808639 100644 --- a/src/silk/docs/std/strings/page.md +++ b/src/silk/docs/std/strings/page.md @@ -1,5 +1,5 @@ --- -layout: "docs" +layout: "silk-docs" title: "std::strings" description: "A small but growing subset is implemented in std/strings.slk to support early toolchain bring-up; the rest of this document describes the intended long-term API." docsCollection: "silk" diff --git a/src/silk/docs/std/sync/page.md b/src/silk/docs/std/sync/page.md index 24a34f07..36c0e773 100644 --- a/src/silk/docs/std/sync/page.md +++ b/src/silk/docs/std/sync/page.md @@ -1,5 +1,5 @@ --- -layout: "docs" +layout: "silk-docs" title: "std::sync" description: "This module provides a small hosted baseline for synchronization primitives used by the current task lowering on linux/x86_64." docsCollection: "silk" diff --git a/src/silk/docs/std/tar-async/page.md b/src/silk/docs/std/tar-async/page.md index 265b389b..9abf707c 100644 --- a/src/silk/docs/std/tar-async/page.md +++ b/src/silk/docs/std/tar-async/page.md @@ -1,5 +1,5 @@ --- -layout: "docs" +layout: "silk-docs" title: "std::tar::async" description: "Source: std/tar/async.slk" docsCollection: "silk" diff --git a/src/silk/docs/std/tar/page.md b/src/silk/docs/std/tar/page.md index ff8c46f3..18cc2885 100644 --- a/src/silk/docs/std/tar/page.md +++ b/src/silk/docs/std/tar/page.md @@ -1,5 +1,5 @@ --- -layout: "docs" +layout: "silk-docs" title: "std::tar" description: "std::tar provides a portable, streaming tar reader/writer for building and inspecting tar archives without loading whole archives into memory." docsCollection: "silk" diff --git a/src/silk/docs/std/task/page.md b/src/silk/docs/std/task/page.md index 14b51aff..976a717b 100644 --- a/src/silk/docs/std/task/page.md +++ b/src/silk/docs/std/task/page.md @@ -1,5 +1,5 @@ --- -layout: "docs" +layout: "silk-docs" title: "std::task" description: "This module provides a small hosted baseline for task/runtime utilities on linux/x86_64." docsCollection: "silk" diff --git a/src/silk/docs/std/temporal/page.md b/src/silk/docs/std/temporal/page.md index ee5ea94e..75f6c1b4 100644 --- a/src/silk/docs/std/temporal/page.md +++ b/src/silk/docs/std/temporal/page.md @@ -1,5 +1,5 @@ --- -layout: "docs" +layout: "silk-docs" title: "std::temporal" description: "A small, ergonomic subset is implemented in std/temporal.slk:" docsCollection: "silk" diff --git a/src/silk/docs/std/test/page.md b/src/silk/docs/std/test/page.md index 87789f78..8206101b 100644 --- a/src/silk/docs/std/test/page.md +++ b/src/silk/docs/std/test/page.md @@ -1,5 +1,5 @@ --- -layout: "docs" +layout: "silk-docs" title: "std::test" description: "This module provides test-only helpers that record test failures without aborting the process." docsCollection: "silk" diff --git a/src/silk/docs/std/time/page.md b/src/silk/docs/std/time/page.md index fe8b72e5..e478d252 100644 --- a/src/silk/docs/std/time/page.md +++ b/src/silk/docs/std/time/page.md @@ -1,5 +1,5 @@ --- -layout: "docs" +layout: "silk-docs" title: "std::time" description: "std::time is a small CLI-oriented facade over the broader std::temporal module. It exposes monotonic timing and basic duration helpers without requiring tools to import calendar/date functionality." docsCollection: "silk" diff --git a/src/silk/docs/std/tls/page.md b/src/silk/docs/std/tls/page.md index eda9b1ed..959aca82 100644 --- a/src/silk/docs/std/tls/page.md +++ b/src/silk/docs/std/tls/page.md @@ -1,5 +1,5 @@ --- -layout: "docs" +layout: "silk-docs" title: "std::tls" description: "std::tls provides TLS client/server primitives for the hosted POSIX baseline using the built-in mbedTLS provider." docsCollection: "silk" diff --git a/src/silk/docs/std/toml/page.md b/src/silk/docs/std/toml/page.md index 31a6077c..2e55d540 100644 --- a/src/silk/docs/std/toml/page.md +++ b/src/silk/docs/std/toml/page.md @@ -1,5 +1,5 @@ --- -layout: "docs" +layout: "silk-docs" title: "std::toml" description: "std::toml provides a TOML v1.0-style parser plus deterministic emission over an index-based DOM." docsCollection: "silk" diff --git a/src/silk/docs/std/unicode/page.md b/src/silk/docs/std/unicode/page.md index f5db55ce..fc467437 100644 --- a/src/silk/docs/std/unicode/page.md +++ b/src/silk/docs/std/unicode/page.md @@ -1,5 +1,5 @@ --- -layout: "docs" +layout: "silk-docs" title: "std::unicode" description: "This module provides practical Unicode helpers focused on:" docsCollection: "silk" diff --git a/src/silk/docs/std/url/page.md b/src/silk/docs/std/url/page.md index ea011ad6..68e12867 100644 --- a/src/silk/docs/std/url/page.md +++ b/src/silk/docs/std/url/page.md @@ -1,5 +1,5 @@ --- -layout: "docs" +layout: "silk-docs" title: "std::url" description: "std::url provides a WHATWG-URL-compatible URL parser and serializer plus URLSearchParams behavior (application/x-www-form-urlencoded)." docsCollection: "silk" diff --git a/src/silk/docs/std/uuid-random/page.md b/src/silk/docs/std/uuid-random/page.md index f6baa2c0..a1ae7fa3 100644 --- a/src/silk/docs/std/uuid-random/page.md +++ b/src/silk/docs/std/uuid-random/page.md @@ -1,5 +1,5 @@ --- -layout: "docs" +layout: "silk-docs" title: "std::uuid::random" description: "Source: std/uuid/random.slk" docsCollection: "silk" diff --git a/src/silk/docs/std/uuid/page.md b/src/silk/docs/std/uuid/page.md index cfc1f5e2..da4adbd6 100644 --- a/src/silk/docs/std/uuid/page.md +++ b/src/silk/docs/std/uuid/page.md @@ -1,5 +1,5 @@ --- -layout: "docs" +layout: "silk-docs" title: "std::uuid" description: "std::uuid provides a robust UUID/ULID-like identifier primitive with full support for UUID versions 1, 3, 4, 5, 6, 7, and 8 (RFC 4122 + RFC 9562 family)." docsCollection: "silk" diff --git a/src/silk/docs/std/vector/page.md b/src/silk/docs/std/vector/page.md index db7d2ea5..a9ae55ad 100644 --- a/src/silk/docs/std/vector/page.md +++ b/src/silk/docs/std/vector/page.md @@ -1,5 +1,5 @@ --- -layout: "docs" +layout: "silk-docs" title: "std::vector" description: "This module provides a generic, growable vector type Vector(T) used broadly across std::." docsCollection: "silk" diff --git a/src/silk/docs/std/wasm/page.md b/src/silk/docs/std/wasm/page.md index 2d24184f..6ceeccf5 100644 --- a/src/silk/docs/std/wasm/page.md +++ b/src/silk/docs/std/wasm/page.md @@ -1,5 +1,5 @@ --- -layout: "docs" +layout: "silk-docs" title: "WebAssembly Runtime (std::wasm)" description: "std::wasm is the standard library surface for executing WebAssembly (WASM) modules from Silk." docsCollection: "silk" diff --git a/src/silk/docs/std/websocket/page.md b/src/silk/docs/std/websocket/page.md index 9771c633..6ebb4a10 100644 --- a/src/silk/docs/std/websocket/page.md +++ b/src/silk/docs/std/websocket/page.md @@ -1,5 +1,5 @@ --- -layout: "docs" +layout: "silk-docs" title: "std::websocket" description: "std::websocket provides an RFC 6455 WebSocket implementation on top of std::net::TCPStream (client + server handshake, framing, ping/pong, close, fragmentation)." docsCollection: "silk" diff --git a/src/silk/docs/std/window-gtk/page.md b/src/silk/docs/std/window-gtk/page.md index ae7d49ae..04f72837 100644 --- a/src/silk/docs/std/window-gtk/page.md +++ b/src/silk/docs/std/window-gtk/page.md @@ -1,5 +1,5 @@ --- -layout: "docs" +layout: "silk-docs" title: "std::window::gtk" description: "std::window::gtk is the GTK-specific facade for applications that want to select the Linux GTK provider explicitly while still using the portable std::window types." docsCollection: "silk" diff --git a/src/silk/docs/std/window-ios/page.md b/src/silk/docs/std/window-ios/page.md index 06e8e8aa..a42d6d97 100644 --- a/src/silk/docs/std/window-ios/page.md +++ b/src/silk/docs/std/window-ios/page.md @@ -1,5 +1,5 @@ --- -layout: "docs" +layout: "silk-docs" title: "std::window::ios" description: "std::window::ios is the iOS-specific facade for applications that want to select the iOS provider explicitly while still using the portable std::window types." docsCollection: "silk" diff --git a/src/silk/docs/std/window-macos/page.md b/src/silk/docs/std/window-macos/page.md index 52e30c60..4cd6ffd1 100644 --- a/src/silk/docs/std/window-macos/page.md +++ b/src/silk/docs/std/window-macos/page.md @@ -1,5 +1,5 @@ --- -layout: "docs" +layout: "silk-docs" title: "std::window::macos" description: "std::window::macos is the macOS-specific facade for applications that want to select the macOS provider explicitly while still using the portable std::window types." docsCollection: "silk" diff --git a/src/silk/docs/std/window/page.md b/src/silk/docs/std/window/page.md index f5d4745f..bdcf95af 100644 --- a/src/silk/docs/std/window/page.md +++ b/src/silk/docs/std/window/page.md @@ -1,5 +1,5 @@ --- -layout: "docs" +layout: "silk-docs" title: "std::window" description: "std::window is the opt-in standard-library windowing facade. Importing and reaching this module's runtime calls is the signal that an executable wants platform window support; unrelated std:: users do" docsCollection: "silk" diff --git a/src/silk/docs/std/xml/page.md b/src/silk/docs/std/xml/page.md index d6010984..cb28d5ad 100644 --- a/src/silk/docs/std/xml/page.md +++ b/src/silk/docs/std/xml/page.md @@ -1,5 +1,5 @@ --- -layout: "docs" +layout: "silk-docs" title: "std::xml — XML Parsing (libxml2)" description: "std::xml provides a small, DOM-style XML parsing and traversal API backed by libxml2." docsCollection: "silk" diff --git a/src/silk/docs/std/z3/page.md b/src/silk/docs/std/z3/page.md index e8f0163a..181c2654 100644 --- a/src/silk/docs/std/z3/page.md +++ b/src/silk/docs/std/z3/page.md @@ -1,5 +1,5 @@ --- -layout: "docs" +layout: "silk-docs" title: "std::runtime::z3 — Z3 SMT Solver (C API Bindings)" description: "std::runtime::z3 provides low-level ext bindings for the Z3 C API. It is intended for user-space programs that want to call into Z3 directly." docsCollection: "silk" diff --git a/src/silk/docs/usage/cli-examples/page.md b/src/silk/docs/usage/cli-examples/page.md index a7ae3c72..d2537691 100644 --- a/src/silk/docs/usage/cli-examples/page.md +++ b/src/silk/docs/usage/cli-examples/page.md @@ -1,5 +1,5 @@ --- -layout: "docs" +layout: "silk-docs" title: "CLI usage examples" description: "This page is a grab bag of practical workflows for the silk toolchain. It focuses on how people actually use the CLI: quick feedback (check), tests that integrate with CI (test), and explicit build ou" docsCollection: "silk" diff --git a/src/silk/docs/usage/editor-coc-nvim/page.md b/src/silk/docs/usage/editor-coc-nvim/page.md index ff7012c2..1865380a 100644 --- a/src/silk/docs/usage/editor-coc-nvim/page.md +++ b/src/silk/docs/usage/editor-coc-nvim/page.md @@ -1,5 +1,5 @@ --- -layout: "docs" +layout: "silk-docs" title: "coc.nvim Integration for Silk" description: "This page describes the coc.nvim client for the silk-lsp language server." docsCollection: "silk" diff --git a/src/silk/docs/usage/editor-ctags/page.md b/src/silk/docs/usage/editor-ctags/page.md index 963b2f4b..a8255695 100644 --- a/src/silk/docs/usage/editor-ctags/page.md +++ b/src/silk/docs/usage/editor-ctags/page.md @@ -1,5 +1,5 @@ --- -layout: "docs" +layout: "silk-docs" title: "Universal Ctags Support" description: "The Silk compiler repository ships a Universal Ctags configuration for Silk at its root (.ctags)." docsCollection: "silk" diff --git a/src/silk/docs/usage/editor-textmate/page.md b/src/silk/docs/usage/editor-textmate/page.md index e787c745..8f1f554b 100644 --- a/src/silk/docs/usage/editor-textmate/page.md +++ b/src/silk/docs/usage/editor-textmate/page.md @@ -1,5 +1,5 @@ --- -layout: "docs" +layout: "silk-docs" title: "TextMate Grammar (tmLanguage)" description: "The Silk compiler repository ships a TextMate grammar for Silk under textmate/silk.tmLanguage.json. It provides syntax highlighting for editors that consume tmLanguage grammars (TextMate, VS Code, Sub" docsCollection: "silk" diff --git a/src/silk/docs/usage/editor-vim/page.md b/src/silk/docs/usage/editor-vim/page.md index 2976c4ee..c5365c83 100644 --- a/src/silk/docs/usage/editor-vim/page.md +++ b/src/silk/docs/usage/editor-vim/page.md @@ -1,5 +1,5 @@ --- -layout: "docs" +layout: "silk-docs" title: "Vim Integration for Silk" description: "This document describes the built-in Vim support for Silk shipped with the Silk compiler repository." docsCollection: "silk" diff --git a/src/silk/docs/usage/getting-started/page.md b/src/silk/docs/usage/getting-started/page.md index af468aa2..a6adf1c8 100644 --- a/src/silk/docs/usage/getting-started/page.md +++ b/src/silk/docs/usage/getting-started/page.md @@ -1,5 +1,5 @@ --- -layout: "docs" +layout: "silk-docs" title: "Getting started" description: "This page gets you from “a file” to “a runnable program”, and points you at the docs you’ll use most often." docsCollection: "silk" diff --git a/src/silk/docs/usage/github-actions/page.md b/src/silk/docs/usage/github-actions/page.md index a7ebdca3..dccc99ab 100644 --- a/src/silk/docs/usage/github-actions/page.md +++ b/src/silk/docs/usage/github-actions/page.md @@ -1,5 +1,5 @@ --- -layout: "docs" +layout: "silk-docs" title: "GitHub Actions: Install Released silk" description: "This guide shows how to install the released Silk CLI in another GitHub Actions workflow without rebuilding the compiler from source." docsCollection: "silk" diff --git a/src/silk/docs/usage/github-linguist/page.md b/src/silk/docs/usage/github-linguist/page.md index 5c5e0576..ddfad785 100644 --- a/src/silk/docs/usage/github-linguist/page.md +++ b/src/silk/docs/usage/github-linguist/page.md @@ -1,5 +1,5 @@ --- -layout: "docs" +layout: "silk-docs" title: "GitHub Linguist Support" description: "The Silk compiler repository includes a .gitattributes entry that tags *.slk files as Silk sources for GitHub Linguist." docsCollection: "silk" diff --git a/src/silk/docs/usage/guide-examples/page.md b/src/silk/docs/usage/guide-examples/page.md index f5c91dac..4cbf9e44 100644 --- a/src/silk/docs/usage/guide-examples/page.md +++ b/src/silk/docs/usage/guide-examples/page.md @@ -1,5 +1,5 @@ --- -layout: "docs" +layout: "silk-docs" title: "silk guide" description: "silk guide is the curated example discovery surface for common Silk tasks." docsCollection: "silk" diff --git a/src/silk/docs/usage/howto-custom-stdlib-root/page.md b/src/silk/docs/usage/howto-custom-stdlib-root/page.md index 510e435f..718e9f1f 100644 --- a/src/silk/docs/usage/howto-custom-stdlib-root/page.md +++ b/src/silk/docs/usage/howto-custom-stdlib-root/page.md @@ -1,5 +1,5 @@ --- -layout: "docs" +layout: "silk-docs" title: "How-To: Use a Custom Stdlib Root (and Runtime)" description: "The std::... modules are loaded from a stdlib root (a directory containing a std/ tree). Because std::runtime is part of that source tree, selecting a different stdlib root is also how you select a di" docsCollection: "silk" diff --git a/src/silk/docs/usage/howto-dynamic-libraries/page.md b/src/silk/docs/usage/howto-dynamic-libraries/page.md index 73924f5e..630b771f 100644 --- a/src/silk/docs/usage/howto-dynamic-libraries/page.md +++ b/src/silk/docs/usage/howto-dynamic-libraries/page.md @@ -1,5 +1,5 @@ --- -layout: "docs" +layout: "silk-docs" title: "How To Load Dynamic Libraries" description: "This guide shows how to load a dynamic library at runtime, resolve a symbol, convert it to a typed C function pointer, and call it from Silk." docsCollection: "silk" diff --git a/src/silk/docs/usage/howto-lumen-trail/page.md b/src/silk/docs/usage/howto-lumen-trail/page.md index bced37eb..96cb89ab 100644 --- a/src/silk/docs/usage/howto-lumen-trail/page.md +++ b/src/silk/docs/usage/howto-lumen-trail/page.md @@ -1,5 +1,5 @@ --- -layout: "docs" +layout: "silk-docs" title: "Build LumenTrail, an iOS Objective-C App With Silk Stdlib Code" description: "This how-to uses examples/projects/lumen-trail/ to show the current iOS embedding flow on Apple Silicon macOS through the LumenTrail simulator app:" docsCollection: "silk" diff --git a/src/silk/docs/usage/howto-run-wasi-node/page.md b/src/silk/docs/usage/howto-run-wasi-node/page.md index 1a5df9a9..60125d05 100644 --- a/src/silk/docs/usage/howto-run-wasi-node/page.md +++ b/src/silk/docs/usage/howto-run-wasi-node/page.md @@ -1,5 +1,5 @@ --- -layout: "docs" +layout: "silk-docs" title: "How-To: Run wasm32-wasi Output in Node.js" description: "This guide shows how to:" docsCollection: "silk" diff --git a/src/silk/docs/usage/pure-silk-gpu-ml/page.md b/src/silk/docs/usage/pure-silk-gpu-ml/page.md index f7592536..ca315c59 100644 --- a/src/silk/docs/usage/pure-silk-gpu-ml/page.md +++ b/src/silk/docs/usage/pure-silk-gpu-ml/page.md @@ -1,5 +1,5 @@ --- -layout: "docs" +layout: "silk-docs" title: "Pure-Silk learned-threshold GPU classifier" description: "examples/pure_silk_gpu_ml.slk is a small but real supervised-learning workflow. It uses a one-dimensional nearest-centroid model:" docsCollection: "silk" diff --git a/src/silk/docs/usage/pure-silk-gpu/page.md b/src/silk/docs/usage/pure-silk-gpu/page.md index eac726b8..95c97ca5 100644 --- a/src/silk/docs/usage/pure-silk-gpu/page.md +++ b/src/silk/docs/usage/pure-silk-gpu/page.md @@ -1,5 +1,5 @@ --- -layout: "docs" +layout: "silk-docs" title: "Pure-Silk CPU/GPU program" description: "The following workflow keeps application code entirely in Silk. main and ordinary functions compile for the host CPU; attr(device=gpu) functions are compiled into target GPU artifacts embedded in the " docsCollection: "silk" diff --git a/src/silk/docs/usage/tutorials/01-first-program/page.md b/src/silk/docs/usage/tutorials/01-first-program/page.md index e6e7af94..5e0b67c0 100644 --- a/src/silk/docs/usage/tutorials/01-first-program/page.md +++ b/src/silk/docs/usage/tutorials/01-first-program/page.md @@ -1,5 +1,5 @@ --- -layout: "docs" +layout: "silk-docs" title: "Tutorial 1: your first program" description: "This tutorial gets you from “a file” to “a runnable program” with the smallest useful workflow:" docsCollection: "silk" diff --git a/src/silk/docs/usage/tutorials/02-structs-and-impls/page.md b/src/silk/docs/usage/tutorials/02-structs-and-impls/page.md index f4796778..3723f114 100644 --- a/src/silk/docs/usage/tutorials/02-structs-and-impls/page.md +++ b/src/silk/docs/usage/tutorials/02-structs-and-impls/page.md @@ -1,5 +1,5 @@ --- -layout: "docs" +layout: "silk-docs" title: "Tutorial 2: structs and impl" description: "This tutorial covers:" docsCollection: "silk" diff --git a/src/silk/docs/usage/tutorials/03-arrays-and-slices/page.md b/src/silk/docs/usage/tutorials/03-arrays-and-slices/page.md index 6ded24f5..620cafd2 100644 --- a/src/silk/docs/usage/tutorials/03-arrays-and-slices/page.md +++ b/src/silk/docs/usage/tutorials/03-arrays-and-slices/page.md @@ -1,5 +1,5 @@ --- -layout: "docs" +layout: "silk-docs" title: "Tutorial 3: Arrays and Slices" description: "This tutorial covers:" docsCollection: "silk" diff --git a/src/silk/docs/usage/tutorials/04-filesystem/page.md b/src/silk/docs/usage/tutorials/04-filesystem/page.md index cffefa9e..9efaf67a 100644 --- a/src/silk/docs/usage/tutorials/04-filesystem/page.md +++ b/src/silk/docs/usage/tutorials/04-filesystem/page.md @@ -1,5 +1,5 @@ --- -layout: "docs" +layout: "silk-docs" title: "Tutorial 4: filesystem basics (std::fs)" description: "This tutorial demonstrates a very common “systems script” pattern:" docsCollection: "silk" diff --git a/src/silk/docs/usage/tutorials/05-concurrency/page.md b/src/silk/docs/usage/tutorials/05-concurrency/page.md index 23de4189..a067bee1 100644 --- a/src/silk/docs/usage/tutorials/05-concurrency/page.md +++ b/src/silk/docs/usage/tutorials/05-concurrency/page.md @@ -1,5 +1,5 @@ --- -layout: "docs" +layout: "silk-docs" title: "Tutorial 5: concurrency basics (async, task, yield, await)" description: "Silk’s concurrency model is built from two orthogonal modifiers:" docsCollection: "silk" diff --git a/src/silk/docs/usage/tutorials/06-async-io-streams-abort/page.md b/src/silk/docs/usage/tutorials/06-async-io-streams-abort/page.md index 69f0abda..801913a3 100644 --- a/src/silk/docs/usage/tutorials/06-async-io-streams-abort/page.md +++ b/src/silk/docs/usage/tutorials/06-async-io-streams-abort/page.md @@ -1,5 +1,5 @@ --- -layout: "docs" +layout: "silk-docs" title: "Tutorial 6: Async I/O + Streams + Abort Signals" description: "This tutorial shows how to compose the current concurrency + stdlib building blocks into practical I/O pipelines:" docsCollection: "silk" diff --git a/src/silk/docs/usage/tutorials/07-formal-silk/page.md b/src/silk/docs/usage/tutorials/07-formal-silk/page.md index 74d68d45..ac827ce6 100644 --- a/src/silk/docs/usage/tutorials/07-formal-silk/page.md +++ b/src/silk/docs/usage/tutorials/07-formal-silk/page.md @@ -1,5 +1,5 @@ --- -layout: "docs" +layout: "silk-docs" title: "Tutorial 7: Formal Silk in real code" description: "This tutorial shows how Formal Silk fits into ordinary systems code:" docsCollection: "silk" diff --git a/src/silk/wiki/language/borrow-checker/page.md b/src/silk/wiki/language/borrow-checker/page.md index 23f99e2e..a5497b98 100644 --- a/src/silk/wiki/language/borrow-checker/page.md +++ b/src/silk/wiki/language/borrow-checker/page.md @@ -1,5 +1,5 @@ --- -layout: "docs" +layout: "silkWiki-docs" title: "Borrow checker (design)" description: "Silk’s long-term design includes a borrow-checker-style static safety layer over references and mutation. Silk currently enforces a simpler, explicit mut borrow contract (see mutability)." docsCollection: "silkWiki" diff --git a/src/silk/wiki/language/buffers/page.md b/src/silk/wiki/language/buffers/page.md index bbb0cd71..7ae2bb08 100644 --- a/src/silk/wiki/language/buffers/page.md +++ b/src/silk/wiki/language/buffers/page.md @@ -1,5 +1,5 @@ --- -layout: "docs" +layout: "silkWiki-docs" title: "Buffers (Buffer(T)) (design)" description: "The long-term design includes an intrinsic Buffer(T) type for low-level, unsafe contiguous memory access, intended to sit underneath safe collections." docsCollection: "silkWiki" diff --git a/src/silk/wiki/language/cheat-sheet/page.md b/src/silk/wiki/language/cheat-sheet/page.md index 3a8871ca..cf1542c7 100644 --- a/src/silk/wiki/language/cheat-sheet/page.md +++ b/src/silk/wiki/language/cheat-sheet/page.md @@ -1,5 +1,5 @@ --- -layout: "docs" +layout: "silkWiki-docs" title: "Cheat sheet" description: "If you want a fast, high-signal overview of Silk surface syntax, start with the canonical cheat sheet:" docsCollection: "silkWiki" diff --git a/src/silk/wiki/language/concurrency/page.md b/src/silk/wiki/language/concurrency/page.md index d9ff9c31..c500a3bb 100644 --- a/src/silk/wiki/language/concurrency/page.md +++ b/src/silk/wiki/language/concurrency/page.md @@ -1,5 +1,5 @@ --- -layout: "docs" +layout: "silkWiki-docs" title: "Concurrency (async, task, await, yield)" description: "Silk concurrency is built around:" docsCollection: "silkWiki" diff --git a/src/silk/wiki/language/const-functions/page.md b/src/silk/wiki/language/const-functions/page.md index eb8e6c94..b5e9bc6a 100644 --- a/src/silk/wiki/language/const-functions/page.md +++ b/src/silk/wiki/language/const-functions/page.md @@ -1,5 +1,5 @@ --- -layout: "docs" +layout: "silkWiki-docs" title: "Const Functions (const fn)" description: "const fn marks a function as eligible for compile-time evaluation." docsCollection: "silkWiki" diff --git a/src/silk/wiki/language/conventions/page.md b/src/silk/wiki/language/conventions/page.md index 0f3ce3e2..359436b2 100644 --- a/src/silk/wiki/language/conventions/page.md +++ b/src/silk/wiki/language/conventions/page.md @@ -1,5 +1,5 @@ --- -layout: "docs" +layout: "silkWiki-docs" title: "Conventions" description: "This page summarizes the conventions used throughout the Silk language docs: notation, naming, and the “implementation status” pattern." docsCollection: "silkWiki" diff --git a/src/silk/wiki/language/dependent-types/page.md b/src/silk/wiki/language/dependent-types/page.md index 1ce6ccc4..f98e5f05 100644 --- a/src/silk/wiki/language/dependent-types/page.md +++ b/src/silk/wiki/language/dependent-types/page.md @@ -1,5 +1,5 @@ --- -layout: "docs" +layout: "silkWiki-docs" title: "Dependent types (const parameters) (design)" description: "This page covers Silk’s intended support for types that mention compile-time values (especially integers), such as dependent-length collections." docsCollection: "silkWiki" diff --git a/src/silk/wiki/language/doc-comments/page.md b/src/silk/wiki/language/doc-comments/page.md index 9a14afc0..5c9391e9 100644 --- a/src/silk/wiki/language/doc-comments/page.md +++ b/src/silk/wiki/language/doc-comments/page.md @@ -1,5 +1,5 @@ --- -layout: "docs" +layout: "silkWiki-docs" title: "Doc comments" description: "Silk supports both line and block doc comments. They attach to the following declaration (like many C/Rust-style doc systems)." docsCollection: "silkWiki" diff --git a/src/silk/wiki/language/duration-instant/page.md b/src/silk/wiki/language/duration-instant/page.md index 33b8bddb..a63b3ded 100644 --- a/src/silk/wiki/language/duration-instant/page.md +++ b/src/silk/wiki/language/duration-instant/page.md @@ -1,5 +1,5 @@ --- -layout: "docs" +layout: "silkWiki-docs" title: "Duration and Instant" description: "Duration represents a signed time span and Instant represents a signed point-in-time on a monotonic timeline. the backend treats both as distinct Silk types that lower to i64 nanoseconds." docsCollection: "silkWiki" diff --git a/src/silk/wiki/language/enums/page.md b/src/silk/wiki/language/enums/page.md index 37756ce6..3c5a0c7a 100644 --- a/src/silk/wiki/language/enums/page.md +++ b/src/silk/wiki/language/enums/page.md @@ -1,5 +1,5 @@ --- -layout: "docs" +layout: "silkWiki-docs" title: "Enums" description: "enum defines a nominal sum type with a fixed set of variants." docsCollection: "silkWiki" diff --git a/src/silk/wiki/language/errors/page.md b/src/silk/wiki/language/errors/page.md index bf870666..858693fe 100644 --- a/src/silk/wiki/language/errors/page.md +++ b/src/silk/wiki/language/errors/page.md @@ -1,5 +1,5 @@ --- -layout: "docs" +layout: "silkWiki-docs" title: "Errors and assertions" description: "Silk favors explicit, typed error modeling (optionals and Result-style return shapes) and uses typed errors (error, panic, T | ErrorType...) for unrecoverable logic bugs and contract violations." docsCollection: "silkWiki" diff --git a/src/silk/wiki/language/ext/page.md b/src/silk/wiki/language/ext/page.md index 859a6359..3b9f5f62 100644 --- a/src/silk/wiki/language/ext/page.md +++ b/src/silk/wiki/language/ext/page.md @@ -1,5 +1,5 @@ --- -layout: "docs" +layout: "silkWiki-docs" title: "External declarations (ext)" description: "ext declares foreign symbols so Silk code can call C (or wasm imports) access foreign variables." docsCollection: "silkWiki" diff --git a/src/silk/wiki/language/flow-blocks-statements/page.md b/src/silk/wiki/language/flow-blocks-statements/page.md index 5d79118c..7f487eac 100644 --- a/src/silk/wiki/language/flow-blocks-statements/page.md +++ b/src/silk/wiki/language/flow-blocks-statements/page.md @@ -1,5 +1,5 @@ --- -layout: "docs" +layout: "silkWiki-docs" title: "Blocks and statements" description: "Blocks ({ ... }) group statements and introduce a new scope." docsCollection: "silkWiki" diff --git a/src/silk/wiki/language/flow-break/page.md b/src/silk/wiki/language/flow-break/page.md index dc002578..23feaf24 100644 --- a/src/silk/wiki/language/flow-break/page.md +++ b/src/silk/wiki/language/flow-break/page.md @@ -1,5 +1,5 @@ --- -layout: "docs" +layout: "silkWiki-docs" title: "break" description: "break; exits the nearest enclosing loop." docsCollection: "silkWiki" diff --git a/src/silk/wiki/language/flow-continue/page.md b/src/silk/wiki/language/flow-continue/page.md index c5d61f6b..0c9948a6 100644 --- a/src/silk/wiki/language/flow-continue/page.md +++ b/src/silk/wiki/language/flow-continue/page.md @@ -1,5 +1,5 @@ --- -layout: "docs" +layout: "silkWiki-docs" title: "continue" description: "continue; skips the remainder of the current loop body and advances to the next iteration." docsCollection: "silkWiki" diff --git a/src/silk/wiki/language/flow-expression-statements/page.md b/src/silk/wiki/language/flow-expression-statements/page.md index 1463a23e..245cd8ce 100644 --- a/src/silk/wiki/language/flow-expression-statements/page.md +++ b/src/silk/wiki/language/flow-expression-statements/page.md @@ -1,5 +1,5 @@ --- -layout: "docs" +layout: "silkWiki-docs" title: "Expression statements" description: "Many expressions can appear as standalone statements when followed by ; (assignment, calls, ++/--, and other “statement-like” expressions)." docsCollection: "silkWiki" diff --git a/src/silk/wiki/language/flow-for/page.md b/src/silk/wiki/language/flow-for/page.md index 2e70ad55..08f0463a 100644 --- a/src/silk/wiki/language/flow-for/page.md +++ b/src/silk/wiki/language/flow-for/page.md @@ -1,5 +1,5 @@ --- -layout: "docs" +layout: "silkWiki-docs" title: "for loops" description: "for loops iterate over:" docsCollection: "silkWiki" diff --git a/src/silk/wiki/language/flow-if-else/page.md b/src/silk/wiki/language/flow-if-else/page.md index 5c6d8d1a..d6981b0e 100644 --- a/src/silk/wiki/language/flow-if-else/page.md +++ b/src/silk/wiki/language/flow-if-else/page.md @@ -1,5 +1,5 @@ --- -layout: "docs" +layout: "silkWiki-docs" title: "if / else" description: "Use if / else for boolean branching." docsCollection: "silkWiki" diff --git a/src/silk/wiki/language/flow-loop/page.md b/src/silk/wiki/language/flow-loop/page.md index 62f6d7b6..751866c3 100644 --- a/src/silk/wiki/language/flow-loop/page.md +++ b/src/silk/wiki/language/flow-loop/page.md @@ -1,5 +1,5 @@ --- -layout: "docs" +layout: "silkWiki-docs" title: "loop" description: "loop { ... } is an infinite loop that exits via break or return." docsCollection: "silkWiki" diff --git a/src/silk/wiki/language/flow-match/page.md b/src/silk/wiki/language/flow-match/page.md index 72a4fc7c..9acb560a 100644 --- a/src/silk/wiki/language/flow-match/page.md +++ b/src/silk/wiki/language/flow-match/page.md @@ -1,5 +1,5 @@ --- -layout: "docs" +layout: "silkWiki-docs" title: "match" description: "match provides structured pattern matching." docsCollection: "silkWiki" diff --git a/src/silk/wiki/language/flow-overview/page.md b/src/silk/wiki/language/flow-overview/page.md index 5864b6e3..18381d82 100644 --- a/src/silk/wiki/language/flow-overview/page.md +++ b/src/silk/wiki/language/flow-overview/page.md @@ -1,5 +1,5 @@ --- -layout: "docs" +layout: "silkWiki-docs" title: "Flow control overview" description: "Silk has familiar structured control flow:" docsCollection: "silkWiki" diff --git a/src/silk/wiki/language/flow-return/page.md b/src/silk/wiki/language/flow-return/page.md index 14c7cebc..8bd2cab4 100644 --- a/src/silk/wiki/language/flow-return/page.md +++ b/src/silk/wiki/language/flow-return/page.md @@ -1,5 +1,5 @@ --- -layout: "docs" +layout: "silkWiki-docs" title: "return" description: "Use return to exit the current function." docsCollection: "silkWiki" diff --git a/src/silk/wiki/language/flow-while/page.md b/src/silk/wiki/language/flow-while/page.md index 479434c8..e56f2632 100644 --- a/src/silk/wiki/language/flow-while/page.md +++ b/src/silk/wiki/language/flow-while/page.md @@ -1,5 +1,5 @@ --- -layout: "docs" +layout: "silkWiki-docs" title: "while" description: "Use while for condition-controlled looping." docsCollection: "silkWiki" diff --git a/src/silk/wiki/language/formal-verification/page.md b/src/silk/wiki/language/formal-verification/page.md index 6e7d0ab8..65afc61d 100644 --- a/src/silk/wiki/language/formal-verification/page.md +++ b/src/silk/wiki/language/formal-verification/page.md @@ -1,5 +1,5 @@ --- -layout: "docs" +layout: "silkWiki-docs" title: "Formal verification (Formal Silk)" description: "Silk includes syntax for writing contracts and verification metadata:" docsCollection: "silkWiki" diff --git a/src/silk/wiki/language/function-disciplines/page.md b/src/silk/wiki/language/function-disciplines/page.md index 01dac4e3..3efef1b0 100644 --- a/src/silk/wiki/language/function-disciplines/page.md +++ b/src/silk/wiki/language/function-disciplines/page.md @@ -1,5 +1,5 @@ --- -layout: "docs" +layout: "silkWiki-docs" title: "Function disciplines (pure, async, task)" description: "Function modifiers declare constraints and concurrency behavior:" docsCollection: "silkWiki" diff --git a/src/silk/wiki/language/generics/page.md b/src/silk/wiki/language/generics/page.md index 24903961..a4d17517 100644 --- a/src/silk/wiki/language/generics/page.md +++ b/src/silk/wiki/language/generics/page.md @@ -1,5 +1,5 @@ --- -layout: "docs" +layout: "silkWiki-docs" title: "Generics (monomorphized)" description: "Silk generics are compile-time and monomorphized: each applied type like Vector(int) produces a concrete instantiation at build time (no runtime type parameters)." docsCollection: "silkWiki" diff --git a/src/silk/wiki/language/grammar/page.md b/src/silk/wiki/language/grammar/page.md index 448997a4..ae6b154f 100644 --- a/src/silk/wiki/language/grammar/page.md +++ b/src/silk/wiki/language/grammar/page.md @@ -1,5 +1,5 @@ --- -layout: "docs" +layout: "silkWiki-docs" title: "Grammar" description: "grammar is the canonical “what the parser accepts” reference for Silk surface syntax." docsCollection: "silkWiki" diff --git a/src/silk/wiki/language/interfaces/page.md b/src/silk/wiki/language/interfaces/page.md index 4fac3397..5e3cd82c 100644 --- a/src/silk/wiki/language/interfaces/page.md +++ b/src/silk/wiki/language/interfaces/page.md @@ -1,5 +1,5 @@ --- -layout: "docs" +layout: "silkWiki-docs" title: "Interfaces" description: "Interfaces declare method signatures that types (or modules) can conform to via impl ... as ... (or module ... as ...). This is the basis for protocol-like surfaces such as iterators and Drop." docsCollection: "silkWiki" diff --git a/src/silk/wiki/language/literals-aggregate/page.md b/src/silk/wiki/language/literals-aggregate/page.md index 41f53ce7..f940c232 100644 --- a/src/silk/wiki/language/literals-aggregate/page.md +++ b/src/silk/wiki/language/literals-aggregate/page.md @@ -1,5 +1,5 @@ --- -layout: "docs" +layout: "silkWiki-docs" title: "Aggregate literals (arrays and structs)" description: "Aggregate literals build compound values directly in source code:" docsCollection: "silkWiki" diff --git a/src/silk/wiki/language/literals-boolean/page.md b/src/silk/wiki/language/literals-boolean/page.md index 5559f5ba..002ddb9a 100644 --- a/src/silk/wiki/language/literals-boolean/page.md +++ b/src/silk/wiki/language/literals-boolean/page.md @@ -1,5 +1,5 @@ --- -layout: "docs" +layout: "silkWiki-docs" title: "Boolean literals" description: "Silk has the boolean type bool with literals true and false." docsCollection: "silkWiki" diff --git a/src/silk/wiki/language/literals-character/page.md b/src/silk/wiki/language/literals-character/page.md index 19863c90..27f371f2 100644 --- a/src/silk/wiki/language/literals-character/page.md +++ b/src/silk/wiki/language/literals-character/page.md @@ -1,5 +1,5 @@ --- -layout: "docs" +layout: "silkWiki-docs" title: "Character literals" description: "char represents a Unicode scalar value. Character literals write a char value directly in source code." docsCollection: "silkWiki" diff --git a/src/silk/wiki/language/literals-duration/page.md b/src/silk/wiki/language/literals-duration/page.md index 69c081c6..5cf6918e 100644 --- a/src/silk/wiki/language/literals-duration/page.md +++ b/src/silk/wiki/language/literals-duration/page.md @@ -1,5 +1,5 @@ --- -layout: "docs" +layout: "silkWiki-docs" title: "Duration literals" description: "Duration literals represent time spans with unit suffixes (ms, s, min, etc) and produce a Duration value." docsCollection: "silkWiki" diff --git a/src/silk/wiki/language/literals-numeric/page.md b/src/silk/wiki/language/literals-numeric/page.md index 7046dfa8..ef508bd5 100644 --- a/src/silk/wiki/language/literals-numeric/page.md +++ b/src/silk/wiki/language/literals-numeric/page.md @@ -1,5 +1,5 @@ --- -layout: "docs" +layout: "silkWiki-docs" title: "Numeric literals" description: "Silk supports integer and floating-point literals, including base prefixes suffixes as defined in the canonical spec." docsCollection: "silkWiki" diff --git a/src/silk/wiki/language/literals-overview/page.md b/src/silk/wiki/language/literals-overview/page.md index 25b4da8c..6bf8eaae 100644 --- a/src/silk/wiki/language/literals-overview/page.md +++ b/src/silk/wiki/language/literals-overview/page.md @@ -1,5 +1,5 @@ --- -layout: "docs" +layout: "silkWiki-docs" title: "Literals" description: "Literals are the simplest way to write values directly in source code: numbers, booleans, chars, strings, durations, and aggregates like arrays struct literals." docsCollection: "silkWiki" diff --git a/src/silk/wiki/language/literals-string/page.md b/src/silk/wiki/language/literals-string/page.md index dcc7b5a6..ba63b744 100644 --- a/src/silk/wiki/language/literals-string/page.md +++ b/src/silk/wiki/language/literals-string/page.md @@ -1,5 +1,5 @@ --- -layout: "docs" +layout: "silkWiki-docs" title: "String literals" description: "string is Silk’s built-in UTF‑8 byte sequence type. String literals write a string value directly in source code." docsCollection: "silkWiki" diff --git a/src/silk/wiki/language/memory-model/page.md b/src/silk/wiki/language/memory-model/page.md index ad4b54e7..8d016f8c 100644 --- a/src/silk/wiki/language/memory-model/page.md +++ b/src/silk/wiki/language/memory-model/page.md @@ -1,5 +1,5 @@ --- -layout: "docs" +layout: "silkWiki-docs" title: "Memory model" description: "This page is a learning-oriented companion to the canonical memory model: memory model." docsCollection: "silkWiki" diff --git a/src/silk/wiki/language/mutability/page.md b/src/silk/wiki/language/mutability/page.md index 93f7495e..996de048 100644 --- a/src/silk/wiki/language/mutability/page.md +++ b/src/silk/wiki/language/mutability/page.md @@ -1,5 +1,5 @@ --- -layout: "docs" +layout: "silkWiki-docs" title: "Mutability (mut)" description: "Silk is safe-by-default: bindings and borrows are immutable unless you opt in to mutation." docsCollection: "silkWiki" diff --git a/src/silk/wiki/language/operators/page.md b/src/silk/wiki/language/operators/page.md index 8b52672d..0240a477 100644 --- a/src/silk/wiki/language/operators/page.md +++ b/src/silk/wiki/language/operators/page.md @@ -1,5 +1,5 @@ --- -layout: "docs" +layout: "silkWiki-docs" title: "Operators" description: "Silk’s operators cover arithmetic, comparisons, logical operators, assignment, casts, ranges, optionals (?., ??), and typed-error propagation (?)." docsCollection: "silkWiki" diff --git a/src/silk/wiki/language/optional/page.md b/src/silk/wiki/language/optional/page.md index 8eb1afa5..071fc160 100644 --- a/src/silk/wiki/language/optional/page.md +++ b/src/silk/wiki/language/optional/page.md @@ -1,5 +1,5 @@ --- -layout: "docs" +layout: "silkWiki-docs" title: "Optionals (T?)" description: "Optionals represent “maybe a value” without sentinel nulls." docsCollection: "silkWiki" diff --git a/src/silk/wiki/language/packages-imports-exports/page.md b/src/silk/wiki/language/packages-imports-exports/page.md index 1f19ec83..a562d9d6 100644 --- a/src/silk/wiki/language/packages-imports-exports/page.md +++ b/src/silk/wiki/language/packages-imports-exports/page.md @@ -1,5 +1,5 @@ --- -layout: "docs" +layout: "silkWiki-docs" title: "Packages, imports, and exports" description: "Silk has explicit module/package structure:" docsCollection: "silkWiki" diff --git a/src/silk/wiki/language/regions/page.md b/src/silk/wiki/language/regions/page.md index 11cca9f2..0bd8856f 100644 --- a/src/silk/wiki/language/regions/page.md +++ b/src/silk/wiki/language/regions/page.md @@ -1,5 +1,5 @@ --- -layout: "docs" +layout: "silkWiki-docs" title: "Regions (with)" description: "Regions provide a fixed-size, statically allocated backing store that can be used as an allocation context for new." docsCollection: "silkWiki" diff --git a/src/silk/wiki/language/struct-requirements/page.md b/src/silk/wiki/language/struct-requirements/page.md index ddb9d987..8d26bec2 100644 --- a/src/silk/wiki/language/struct-requirements/page.md +++ b/src/silk/wiki/language/struct-requirements/page.md @@ -1,5 +1,5 @@ --- -layout: "docs" +layout: "silkWiki-docs" title: "Struct requirements (#require)" description: "Use #require on a struct to state requirements that must hold for all values constructed for that type." docsCollection: "silkWiki" diff --git a/src/silk/wiki/language/structs-impls-layout/page.md b/src/silk/wiki/language/structs-impls-layout/page.md index 4d3a266e..14391c68 100644 --- a/src/silk/wiki/language/structs-impls-layout/page.md +++ b/src/silk/wiki/language/structs-impls-layout/page.md @@ -1,5 +1,5 @@ --- -layout: "docs" +layout: "silkWiki-docs" title: "Structs and impl" description: "struct is Silk’s primary record type: named fields stored together as one value. impl blocks attach methods (and special methods like constructor and drop) to a type." docsCollection: "silkWiki" diff --git a/src/silk/wiki/language/syntax-tour/page.md b/src/silk/wiki/language/syntax-tour/page.md index 4a459923..30e53698 100644 --- a/src/silk/wiki/language/syntax-tour/page.md +++ b/src/silk/wiki/language/syntax-tour/page.md @@ -1,5 +1,5 @@ --- -layout: "docs" +layout: "silkWiki-docs" title: "Syntax tour" description: "The canonical syntax tour is a soup-to-nuts walkthrough of Silk surface syntax, with many examples and cross-links:" docsCollection: "silkWiki" diff --git a/src/silk/wiki/language/testing/page.md b/src/silk/wiki/language/testing/page.md index fcdc4185..20d6e5ed 100644 --- a/src/silk/wiki/language/testing/page.md +++ b/src/silk/wiki/language/testing/page.md @@ -1,5 +1,5 @@ --- -layout: "docs" +layout: "silkWiki-docs" title: "Testing (test)" description: "Silk supports top-level test declarations that are discovered and executed by silk test." docsCollection: "silkWiki" diff --git a/src/silk/wiki/language/typed-errors/page.md b/src/silk/wiki/language/typed-errors/page.md index b2772a96..001d13dd 100644 --- a/src/silk/wiki/language/typed-errors/page.md +++ b/src/silk/wiki/language/typed-errors/page.md @@ -1,5 +1,5 @@ --- -layout: "docs" +layout: "silkWiki-docs" title: "Typed errors (error, panic, and T | ErrorType...)" description: "Typed errors make “this function can fail” explicit in the type system:" docsCollection: "silkWiki" diff --git a/src/silk/wiki/language/types/page.md b/src/silk/wiki/language/types/page.md index 36075d40..3ba8ca56 100644 --- a/src/silk/wiki/language/types/page.md +++ b/src/silk/wiki/language/types/page.md @@ -1,5 +1,5 @@ --- -layout: "docs" +layout: "silkWiki-docs" title: "Types" description: "Silk is a statically typed language with a small set of built-in primitive types and first-class user-defined types (struct, enum, interface)." docsCollection: "silkWiki" diff --git a/src/silk/wiki/language/varargs/page.md b/src/silk/wiki/language/varargs/page.md index 45ab7b84..af1565d2 100644 --- a/src/silk/wiki/language/varargs/page.md +++ b/src/silk/wiki/language/varargs/page.md @@ -1,5 +1,5 @@ --- -layout: "docs" +layout: "silkWiki-docs" title: "Varargs (...args)" description: "Silk supports “varargs” parameters to accept a variable number of trailing arguments, used by std::io::print / std::io::println." docsCollection: "silkWiki" diff --git a/src/silk/wiki/page.md b/src/silk/wiki/page.md index 1a1ef0e6..6e46b4df 100644 --- a/src/silk/wiki/page.md +++ b/src/silk/wiki/page.md @@ -1,5 +1,5 @@ --- -layout: "docs" +layout: "silkWiki-docs" title: "Silk Wiki" description: "The Silk Wiki is the learning-first, example-driven side of the Silk documentation set." docsCollection: "silkWiki" diff --git a/src/silk/wiki/std/algorithms/page.md b/src/silk/wiki/std/algorithms/page.md index 0b370d22..98a2b07b 100644 --- a/src/silk/wiki/std/algorithms/page.md +++ b/src/silk/wiki/std/algorithms/page.md @@ -1,5 +1,5 @@ --- -layout: "docs" +layout: "silkWiki-docs" title: "std::algorithms" description: "std::algorithms provides common algorithms over collections. Today, a small Supported forms exists for scalar types." docsCollection: "silkWiki" diff --git a/src/silk/wiki/std/args/page.md b/src/silk/wiki/std/args/page.md index 3fc8e7ce..37b11539 100644 --- a/src/silk/wiki/std/args/page.md +++ b/src/silk/wiki/std/args/page.md @@ -1,5 +1,5 @@ --- -layout: "docs" +layout: "silkWiki-docs" title: "std::args" description: "std::args provides helpers for working with the hosted main(argc, argv) entrypoint shape." docsCollection: "silkWiki" diff --git a/src/silk/wiki/std/arrays/page.md b/src/silk/wiki/std/arrays/page.md index d4b45493..6e23e590 100644 --- a/src/silk/wiki/std/arrays/page.md +++ b/src/silk/wiki/std/arrays/page.md @@ -1,5 +1,5 @@ --- -layout: "docs" +layout: "silkWiki-docs" title: "std::arrays" description: "std::arrays defines borrowed views like Slice(T) and helpers for working with fixed arrays and slices." docsCollection: "silkWiki" diff --git a/src/silk/wiki/std/bits/page.md b/src/silk/wiki/std/bits/page.md index 58127744..845ee5b9 100644 --- a/src/silk/wiki/std/bits/page.md +++ b/src/silk/wiki/std/bits/page.md @@ -1,5 +1,5 @@ --- -layout: "docs" +layout: "silkWiki-docs" title: "std::bits" description: "std::bits is the standard bit-manipulation and byte-order helper module." docsCollection: "silkWiki" diff --git a/src/silk/wiki/std/buffer/page.md b/src/silk/wiki/std/buffer/page.md index 4b523a61..5cf766c9 100644 --- a/src/silk/wiki/std/buffer/page.md +++ b/src/silk/wiki/std/buffer/page.md @@ -1,5 +1,5 @@ --- -layout: "docs" +layout: "silkWiki-docs" title: "std::buffer" description: "In the in-tree stdlib, std::buffer provides a packed byte buffer (BufferU8) plus width-oriented scalar buffer aliases built on std::vector::Vector(T) (for example BufferI32)." docsCollection: "silkWiki" diff --git a/src/silk/wiki/std/conventions/page.md b/src/silk/wiki/std/conventions/page.md index ef5bf21b..fed9f38e 100644 --- a/src/silk/wiki/std/conventions/page.md +++ b/src/silk/wiki/std/conventions/page.md @@ -1,5 +1,5 @@ --- -layout: "docs" +layout: "silkWiki-docs" title: "std:: conventions" description: "std:: modules follow shared conventions for naming, ownership/allocation, error reporting." docsCollection: "silkWiki" diff --git a/src/silk/wiki/std/crypto/page.md b/src/silk/wiki/std/crypto/page.md index 70ac3ee3..182df12e 100644 --- a/src/silk/wiki/std/crypto/page.md +++ b/src/silk/wiki/std/crypto/page.md @@ -1,5 +1,5 @@ --- -layout: "docs" +layout: "silkWiki-docs" title: "std::crypto" description: "std::crypto provides cryptography primitives (hosted baseline via libsodium in the current design)." docsCollection: "silkWiki" diff --git a/src/silk/wiki/std/env/page.md b/src/silk/wiki/std/env/page.md index fcaa7750..3bfc31c1 100644 --- a/src/silk/wiki/std/env/page.md +++ b/src/silk/wiki/std/env/page.md @@ -1,5 +1,5 @@ --- -layout: "docs" +layout: "silkWiki-docs" title: "std::env" description: "std::env provides access to process environment variables and common directory helpers." docsCollection: "silkWiki" diff --git a/src/silk/wiki/std/filesystem/page.md b/src/silk/wiki/std/filesystem/page.md index 8dd1924b..05914399 100644 --- a/src/silk/wiki/std/filesystem/page.md +++ b/src/silk/wiki/std/filesystem/page.md @@ -1,5 +1,5 @@ --- -layout: "docs" +layout: "silkWiki-docs" title: "std::fs" description: "std::fs provides a small hosted POSIX-oriented filesystem API (Supported forms subset)." docsCollection: "silkWiki" diff --git a/src/silk/wiki/std/fmt/page.md b/src/silk/wiki/std/fmt/page.md index 1882b5f5..52bfb709 100644 --- a/src/silk/wiki/std/fmt/page.md +++ b/src/silk/wiki/std/fmt/page.md @@ -1,5 +1,5 @@ --- -layout: "docs" +layout: "silkWiki-docs" title: "std::fmt" description: "std::fmt defines the formatting model used by std::io::print/println by string-building helpers. It follows a Zig-std.fmt-style format-string syntax." docsCollection: "silkWiki" diff --git a/src/silk/wiki/std/formal/page.md b/src/silk/wiki/std/formal/page.md index 84ec4332..18aa5f66 100644 --- a/src/silk/wiki/std/formal/page.md +++ b/src/silk/wiki/std/formal/page.md @@ -1,5 +1,5 @@ --- -layout: "docs" +layout: "silkWiki-docs" title: "std::formal" description: "std::formal provides reusable Formal Silk theories (“standard lemmas”) used by stdlib code and downstream verified code." docsCollection: "silkWiki" diff --git a/src/silk/wiki/std/interfaces/page.md b/src/silk/wiki/std/interfaces/page.md index c6a5c690..28cdf8f4 100644 --- a/src/silk/wiki/std/interfaces/page.md +++ b/src/silk/wiki/std/interfaces/page.md @@ -1,5 +1,5 @@ --- -layout: "docs" +layout: "silkWiki-docs" title: "std::interfaces" description: "std::interfaces defines shared std protocol interfaces such as Drop, Len, and Iterator(T)." docsCollection: "silkWiki" diff --git a/src/silk/wiki/std/io/page.md b/src/silk/wiki/std/io/page.md index f7abb126..9695e1c2 100644 --- a/src/silk/wiki/std/io/page.md +++ b/src/silk/wiki/std/io/page.md @@ -1,5 +1,5 @@ --- -layout: "docs" +layout: "silkWiki-docs" title: "std::io" description: "std::io provides basic stdin/stdout/stderr I/O and a small formatting surface (print/println)." docsCollection: "silkWiki" diff --git a/src/silk/wiki/std/json/page.md b/src/silk/wiki/std/json/page.md index 310a9396..df0282a4 100644 --- a/src/silk/wiki/std/json/page.md +++ b/src/silk/wiki/std/json/page.md @@ -1,5 +1,5 @@ --- -layout: "docs" +layout: "silkWiki-docs" title: "std::json" description: "std::json provides JSON parsing and stringifying (implementation + expanded subset)." docsCollection: "silkWiki" diff --git a/src/silk/wiki/std/map/page.md b/src/silk/wiki/std/map/page.md index b3999a1c..4842635c 100644 --- a/src/silk/wiki/std/map/page.md +++ b/src/silk/wiki/std/map/page.md @@ -1,5 +1,5 @@ --- -layout: "docs" +layout: "silkWiki-docs" title: "std::map" description: "std::map provides associative containers:" docsCollection: "silkWiki" diff --git a/src/silk/wiki/std/memory/page.md b/src/silk/wiki/std/memory/page.md index 53cce93a..4b0569fe 100644 --- a/src/silk/wiki/std/memory/page.md +++ b/src/silk/wiki/std/memory/page.md @@ -1,5 +1,5 @@ --- -layout: "docs" +layout: "silkWiki-docs" title: "std::memory" description: "std::memory provides low-level helpers and the long-term allocator design." docsCollection: "silkWiki" diff --git a/src/silk/wiki/std/networking/page.md b/src/silk/wiki/std/networking/page.md index c60aa22b..5ed19890 100644 --- a/src/silk/wiki/std/networking/page.md +++ b/src/silk/wiki/std/networking/page.md @@ -1,5 +1,5 @@ --- -layout: "docs" +layout: "silkWiki-docs" title: "std::net" description: "std::net provides networking primitives (hosted POSIX baseline)." docsCollection: "silkWiki" diff --git a/src/silk/wiki/std/overview/page.md b/src/silk/wiki/std/overview/page.md index 9a1e8a15..a2590173 100644 --- a/src/silk/wiki/std/overview/page.md +++ b/src/silk/wiki/std/overview/page.md @@ -1,5 +1,5 @@ --- -layout: "docs" +layout: "silkWiki-docs" title: "Standard library overview (std::)" description: "std:: is the Silk standard library namespace. The docs/std/ tree specifies the intended API and structure; an in-tree stdlib implementation exists under std/ for Silk currently." docsCollection: "silkWiki" diff --git a/src/silk/wiki/std/package-structure/page.md b/src/silk/wiki/std/package-structure/page.md index ba003a78..45f80295 100644 --- a/src/silk/wiki/std/package-structure/page.md +++ b/src/silk/wiki/std/package-structure/page.md @@ -1,5 +1,5 @@ --- -layout: "docs" +layout: "silkWiki-docs" title: "std:: package structure" description: "This page describes how std:: modules are organized and how the compiler finds and links them (including std-root selection and archive wiring)." docsCollection: "silkWiki" diff --git a/src/silk/wiki/std/path/page.md b/src/silk/wiki/std/path/page.md index 1c559cc2..407ae755 100644 --- a/src/silk/wiki/std/path/page.md +++ b/src/silk/wiki/std/path/page.md @@ -1,5 +1,5 @@ --- -layout: "docs" +layout: "silkWiki-docs" title: "std::path" description: "std::path provides path manipulation helpers." docsCollection: "silkWiki" diff --git a/src/silk/wiki/std/process/page.md b/src/silk/wiki/std/process/page.md index 3706eca2..3e832903 100644 --- a/src/silk/wiki/std/process/page.md +++ b/src/silk/wiki/std/process/page.md @@ -1,5 +1,5 @@ --- -layout: "docs" +layout: "silkWiki-docs" title: "std::process" description: "std::process provides process-oriented primitives (hosted baseline)." docsCollection: "silkWiki" diff --git a/src/silk/wiki/std/result/page.md b/src/silk/wiki/std/result/page.md index 57c1c88b..9676dda8 100644 --- a/src/silk/wiki/std/result/page.md +++ b/src/silk/wiki/std/result/page.md @@ -1,5 +1,5 @@ --- -layout: "docs" +layout: "silkWiki-docs" title: "std::result" description: "std::result standardizes the common “success or error” return shape as Result(T, E) so APIs across std:: compose cleanly." docsCollection: "silkWiki" diff --git a/src/silk/wiki/std/runtime/page.md b/src/silk/wiki/std/runtime/page.md index db2ade2f..e676efda 100644 --- a/src/silk/wiki/std/runtime/page.md +++ b/src/silk/wiki/std/runtime/page.md @@ -1,5 +1,5 @@ --- -layout: "docs" +layout: "silkWiki-docs" title: "std::runtime" description: "std::runtime is the interface layer that isolates OS/environment-specific primitives (I/O, filesystem, time, threads, allocation) from higher-level std::... modules." docsCollection: "silkWiki" diff --git a/src/silk/wiki/std/semver/page.md b/src/silk/wiki/std/semver/page.md index 00d18ce0..7361b6d3 100644 --- a/src/silk/wiki/std/semver/page.md +++ b/src/silk/wiki/std/semver/page.md @@ -1,5 +1,5 @@ --- -layout: "docs" +layout: "silkWiki-docs" title: "std::semver" description: "std::semver implements Semantic Versioning (SemVer 2.0.0):" docsCollection: "silkWiki" diff --git a/src/silk/wiki/std/set/page.md b/src/silk/wiki/std/set/page.md index 013463ee..fd972169 100644 --- a/src/silk/wiki/std/set/page.md +++ b/src/silk/wiki/std/set/page.md @@ -1,5 +1,5 @@ --- -layout: "docs" +layout: "silkWiki-docs" title: "std::set" description: "std::set provides set containers:" docsCollection: "silkWiki" diff --git a/src/silk/wiki/std/strings/page.md b/src/silk/wiki/std/strings/page.md index 480178c6..a6d12e4a 100644 --- a/src/silk/wiki/std/strings/page.md +++ b/src/silk/wiki/std/strings/page.md @@ -1,5 +1,5 @@ --- -layout: "docs" +layout: "silkWiki-docs" title: "std::strings" description: "std::strings provides utilities and types built on top of the core string type (UTF‑8 bytes), including simple comparisons and owned string construction." docsCollection: "silkWiki" diff --git a/src/silk/wiki/std/sync/page.md b/src/silk/wiki/std/sync/page.md index 706e3a36..a59f20b2 100644 --- a/src/silk/wiki/std/sync/page.md +++ b/src/silk/wiki/std/sync/page.md @@ -1,5 +1,5 @@ --- -layout: "docs" +layout: "silkWiki-docs" title: "std::sync" description: "std::sync provides synchronization primitives (hosted baseline)." docsCollection: "silkWiki" diff --git a/src/silk/wiki/std/task/page.md b/src/silk/wiki/std/task/page.md index 75a99571..9a230311 100644 --- a/src/silk/wiki/std/task/page.md +++ b/src/silk/wiki/std/task/page.md @@ -1,5 +1,5 @@ --- -layout: "docs" +layout: "silkWiki-docs" title: "std::task" description: "std::task provides hosted task/runtime helpers, including sleep/yield operations." docsCollection: "silkWiki" diff --git a/src/silk/wiki/std/temporal/page.md b/src/silk/wiki/std/temporal/page.md index ecbe89bf..0a7db391 100644 --- a/src/silk/wiki/std/temporal/page.md +++ b/src/silk/wiki/std/temporal/page.md @@ -1,5 +1,5 @@ --- -layout: "docs" +layout: "silkWiki-docs" title: "std::temporal" description: "std::temporal provides Instant/Duration helpers and time-related utilities." docsCollection: "silkWiki" diff --git a/src/silk/wiki/std/tls/page.md b/src/silk/wiki/std/tls/page.md index f7f0ba98..313e219e 100644 --- a/src/silk/wiki/std/tls/page.md +++ b/src/silk/wiki/std/tls/page.md @@ -1,5 +1,5 @@ --- -layout: "docs" +layout: "silkWiki-docs" title: "std::tls" description: "std::tls provides TLS client/server primitives (hosted baseline via mbedTLS)." docsCollection: "silkWiki" diff --git a/src/silk/wiki/std/toml/page.md b/src/silk/wiki/std/toml/page.md index 4a19e4b6..96a900d9 100644 --- a/src/silk/wiki/std/toml/page.md +++ b/src/silk/wiki/std/toml/page.md @@ -1,5 +1,5 @@ --- -layout: "docs" +layout: "silkWiki-docs" title: "std::toml" description: "std::toml provides TOML parsing (implementation + expanded subset)." docsCollection: "silkWiki" diff --git a/src/silk/wiki/std/url/page.md b/src/silk/wiki/std/url/page.md index ddc1a2c8..a0a21ad5 100644 --- a/src/silk/wiki/std/url/page.md +++ b/src/silk/wiki/std/url/page.md @@ -1,5 +1,5 @@ --- -layout: "docs" +layout: "silkWiki-docs" title: "std::url" description: "std::url provides a WHATWG URL parser/serializer and URLSearchParams-style behavior." docsCollection: "silkWiki" diff --git a/src/silk/wiki/std/uuid/page.md b/src/silk/wiki/std/uuid/page.md index e0a1290b..95c3b4b8 100644 --- a/src/silk/wiki/std/uuid/page.md +++ b/src/silk/wiki/std/uuid/page.md @@ -1,5 +1,5 @@ --- -layout: "docs" +layout: "silkWiki-docs" title: "std::uuid" description: "std::uuid provides UUID primitives (parsing, formatting, and variants)." docsCollection: "silkWiki" diff --git a/src/silk/wiki/std/vector/page.md b/src/silk/wiki/std/vector/page.md index 34d8c4bd..656dff16 100644 --- a/src/silk/wiki/std/vector/page.md +++ b/src/silk/wiki/std/vector/page.md @@ -1,5 +1,5 @@ --- -layout: "docs" +layout: "silkWiki-docs" title: "std::vector" description: "std::vector provides a generic, growable owning container Vector(T) used widely throughout std::." docsCollection: "silkWiki" diff --git a/src/silkWiki-index.template.ts b/src/silkWiki-index.template.ts new file mode 100644 index 00000000..916ebb26 --- /dev/null +++ b/src/silkWiki-index.template.ts @@ -0,0 +1,6 @@ +import type { DataDeps, TemplateFunction } from '@domstack/static/types.js' +import type { DocsData } from './lib/docs.ts' +import { collectionIndex } from './lib/artifacts.ts' +export const dataDeps = ['silkWikiNavigation'] satisfies DataDeps<Pick<DocsData, 'silkWikiNavigation'>> +const template: TemplateFunction<Record<string, unknown>, Pick<DocsData, 'silkWikiNavigation'>> = ({ data }) => collectionIndex('silkWiki', data.silkWikiNavigation) +export default template diff --git a/src/silkWiki-search.template.ts b/src/silkWiki-search.template.ts new file mode 100644 index 00000000..a58adb3d --- /dev/null +++ b/src/silkWiki-search.template.ts @@ -0,0 +1,6 @@ +import type { DataDeps, TemplateFunction } from '@domstack/static/types.js' +import type { DocsData } from './lib/docs.ts' +import { json } from './lib/artifacts.ts' +export const dataDeps = ['silkWikiSearch'] satisfies DataDeps<Pick<DocsData, 'silkWikiSearch'>> +const template: TemplateFunction<Record<string, unknown>, Pick<DocsData, 'silkWikiSearch'>> = ({ data }) => json('/silk/wiki/search.json', data.silkWikiSearch) +export default template diff --git a/src/silkWiki-sources.template.ts b/src/silkWiki-sources.template.ts new file mode 100644 index 00000000..ccb75e31 --- /dev/null +++ b/src/silkWiki-sources.template.ts @@ -0,0 +1,6 @@ +import type { DataDeps, TemplateFunction } from '@domstack/static/types.js' +import type { DocsData } from './lib/docs.ts' +import { sources } from './lib/artifacts.ts' +export const dataDeps = ['silkWikiExports'] satisfies DataDeps<Pick<DocsData, 'silkWikiExports'>> +const template: TemplateFunction<Record<string, unknown>, Pick<DocsData, 'silkWikiExports'>> = ({ data }) => sources(data.silkWikiExports) +export default template diff --git a/src/sitemap.template.ts b/src/sitemap.template.ts new file mode 100644 index 00000000..e4e5a480 --- /dev/null +++ b/src/sitemap.template.ts @@ -0,0 +1,6 @@ +import type { DataDeps, TemplateFunction } from '@domstack/static/types.js' +import type { DocsData } from './lib/docs.ts' +import { sitemap } from './lib/artifacts.ts' +export const dataDeps = ['routes'] satisfies DataDeps<Pick<DocsData, 'routes'>> +const template: TemplateFunction<{ siteUrl: string }, Pick<DocsData, 'routes'>> = ({ data, vars }) => sitemap(data.routes, vars.siteUrl) +export default template diff --git a/src/slg-index.template.ts b/src/slg-index.template.ts new file mode 100644 index 00000000..d0d0dcb5 --- /dev/null +++ b/src/slg-index.template.ts @@ -0,0 +1,6 @@ +import type { DataDeps, TemplateFunction } from '@domstack/static/types.js' +import type { DocsData } from './lib/docs.ts' +import { collectionIndex } from './lib/artifacts.ts' +export const dataDeps = ['slgNavigation'] satisfies DataDeps<Pick<DocsData, 'slgNavigation'>> +const template: TemplateFunction<Record<string, unknown>, Pick<DocsData, 'slgNavigation'>> = ({ data }) => collectionIndex('slg', data.slgNavigation) +export default template diff --git a/src/slg-llms.template.ts b/src/slg-llms.template.ts new file mode 100644 index 00000000..bbbda0fa --- /dev/null +++ b/src/slg-llms.template.ts @@ -0,0 +1,6 @@ +import type { DataDeps, TemplateFunction } from '@domstack/static/types.js' +import type { DocsData } from './lib/docs.ts' +import { pack } from './lib/artifacts.ts' +export const dataDeps = ["slgExports"] satisfies DataDeps<Pick<DocsData, 'slgExports'>> +const template: TemplateFunction<{ siteUrl: string }, Pick<DocsData, 'slgExports'>> = ({ data, vars }) => pack('slg', data.slgExports, vars.siteUrl) +export default template diff --git a/src/slg-search.template.ts b/src/slg-search.template.ts new file mode 100644 index 00000000..be25450f --- /dev/null +++ b/src/slg-search.template.ts @@ -0,0 +1,6 @@ +import type { DataDeps, TemplateFunction } from '@domstack/static/types.js' +import type { DocsData } from './lib/docs.ts' +import { json } from './lib/artifacts.ts' +export const dataDeps = ['slgSearch'] satisfies DataDeps<Pick<DocsData, 'slgSearch'>> +const template: TemplateFunction<Record<string, unknown>, Pick<DocsData, 'slgSearch'>> = ({ data }) => json('/slg/docs/search.json', data.slgSearch) +export default template diff --git a/src/slg-sources.template.ts b/src/slg-sources.template.ts new file mode 100644 index 00000000..68b669f9 --- /dev/null +++ b/src/slg-sources.template.ts @@ -0,0 +1,6 @@ +import type { DataDeps, TemplateFunction } from '@domstack/static/types.js' +import type { DocsData } from './lib/docs.ts' +import { sources } from './lib/artifacts.ts' +export const dataDeps = ['slgExports'] satisfies DataDeps<Pick<DocsData, 'slgExports'>> +const template: TemplateFunction<Record<string, unknown>, Pick<DocsData, 'slgExports'>> = ({ data }) => sources(data.slgExports) +export default template diff --git a/src/slg/docs/cli/diagnostics/page.md b/src/slg/docs/cli/diagnostics/page.md index 1419d583..1362e169 100644 --- a/src/slg/docs/cli/diagnostics/page.md +++ b/src/slg/docs/cli/diagnostics/page.md @@ -1,5 +1,5 @@ --- -layout: "docs" +layout: "slg-docs" title: "Diagnostics" description: "This page documents the public exit codes plus the most important user-visible diagnostics." docsCollection: "slg" diff --git a/src/slg/docs/cli/input-types-and-parsing/page.md b/src/slg/docs/cli/input-types-and-parsing/page.md index c4e3a1f1..97fe3687 100644 --- a/src/slg/docs/cli/input-types-and-parsing/page.md +++ b/src/slg/docs/cli/input-types-and-parsing/page.md @@ -1,5 +1,5 @@ --- -layout: "docs" +layout: "slg-docs" title: "Input types and parsing" description: "This page is the exact downstream input model for slg." docsCollection: "slg" diff --git a/src/slg/docs/cli/options-reference/page.md b/src/slg/docs/cli/options-reference/page.md index 67fc464f..7f52b044 100644 --- a/src/slg/docs/cli/options-reference/page.md +++ b/src/slg/docs/cli/options-reference/page.md @@ -1,5 +1,5 @@ --- -layout: "docs" +layout: "slg-docs" title: "Options reference" description: "This page lists every public CLI flag on slg." docsCollection: "slg" diff --git a/src/slg/docs/cli/output-and-exit-codes/page.md b/src/slg/docs/cli/output-and-exit-codes/page.md index f5c92a9c..c58d42b4 100644 --- a/src/slg/docs/cli/output-and-exit-codes/page.md +++ b/src/slg/docs/cli/output-and-exit-codes/page.md @@ -1,5 +1,5 @@ --- -layout: "docs" +layout: "slg-docs" title: "Output and exit codes" description: "This page documents what slg prints, where it prints it, and how it exits." docsCollection: "slg" diff --git a/src/slg/docs/cli/parallelism/page.md b/src/slg/docs/cli/parallelism/page.md index e5d58e50..6f9679e5 100644 --- a/src/slg/docs/cli/parallelism/page.md +++ b/src/slg/docs/cli/parallelism/page.md @@ -1,5 +1,5 @@ --- -layout: "docs" +layout: "slg-docs" title: "Parallelism" description: "slg can traverse and search in parallel, but the control surface is explicit and intentionally bounded." docsCollection: "slg" diff --git a/src/slg/docs/cli/patterns-and-matching/page.md b/src/slg/docs/cli/patterns-and-matching/page.md index e238c546..4437a07b 100644 --- a/src/slg/docs/cli/patterns-and-matching/page.md +++ b/src/slg/docs/cli/patterns-and-matching/page.md @@ -1,5 +1,5 @@ --- -layout: "docs" +layout: "slg-docs" title: "Patterns and matching" description: "This page documents how slg interprets patterns once parsing is complete." docsCollection: "slg" diff --git a/src/slg/docs/cli/slg/page.md b/src/slg/docs/cli/slg/page.md index 0af734d8..d658b9cd 100644 --- a/src/slg/docs/cli/slg/page.md +++ b/src/slg/docs/cli/slg/page.md @@ -1,5 +1,5 @@ --- -layout: "docs" +layout: "slg-docs" title: "slg" description: "slg is the canonical CLI entrypoint for Silk Line Grep." docsCollection: "slg" diff --git a/src/slg/docs/cli/traversal-and-ignores/page.md b/src/slg/docs/cli/traversal-and-ignores/page.md index 9121900a..7f5f5091 100644 --- a/src/slg/docs/cli/traversal-and-ignores/page.md +++ b/src/slg/docs/cli/traversal-and-ignores/page.md @@ -1,5 +1,5 @@ --- -layout: "docs" +layout: "slg-docs" title: "Traversal and ignores" description: "This page documents exactly what slg walks, skips, and re-enables." docsCollection: "slg" diff --git a/src/slg/docs/guides/getting-started/page.md b/src/slg/docs/guides/getting-started/page.md index ac29eb5f..556cc929 100644 --- a/src/slg/docs/guides/getting-started/page.md +++ b/src/slg/docs/guides/getting-started/page.md @@ -1,5 +1,5 @@ --- -layout: "docs" +layout: "slg-docs" title: "Getting started" description: "This guide covers the downstream story: build slg, install it, run a few real searches, then move into the exact CLI reference." docsCollection: "slg" diff --git a/src/slg/docs/guides/search-recipes/page.md b/src/slg/docs/guides/search-recipes/page.md index 1bd9a912..efd0a4cf 100644 --- a/src/slg/docs/guides/search-recipes/page.md +++ b/src/slg/docs/guides/search-recipes/page.md @@ -1,5 +1,5 @@ --- -layout: "docs" +layout: "slg-docs" title: "Search recipes" description: "These are practical slg workflows for code trees, logs, and large repositories." docsCollection: "slg" diff --git a/src/slg/docs/man/slg-1/page.md b/src/slg/docs/man/slg-1/page.md index a6ca5a72..caf30cca 100644 --- a/src/slg/docs/man/slg-1/page.md +++ b/src/slg/docs/man/slg-1/page.md @@ -1,5 +1,5 @@ --- -layout: "docs" +layout: "slg-docs" title: "slg (1) — Silk Line Grep" description: "This page is the reader-friendly website form of the shipped slg(1) manual." docsCollection: "slg" diff --git a/src/slg/docs/page.md b/src/slg/docs/page.md index e57fc74f..fe229928 100644 --- a/src/slg/docs/page.md +++ b/src/slg/docs/page.md @@ -1,5 +1,5 @@ --- -layout: "docs" +layout: "slg-docs" title: "slg Docs" description: "slg is a fast recursive line grep utility for files and directories." docsCollection: "slg" diff --git a/src/style.css b/src/style.css new file mode 100644 index 00000000..4faa49e3 --- /dev/null +++ b/src/style.css @@ -0,0 +1,1228 @@ +/* Home redesign */ + +.home-page { + --color-bg: #11100f; + --color-fg: #f7f3ea; + --color-muted: rgba(247, 243, 234, 0.68); + --color-border: rgba(250, 248, 244, 0.12); + --color-border-strong: rgba(250, 248, 244, 0.22); + --color-surface: rgba(250, 248, 244, 0.06); + --color-surface-2: rgba(250, 248, 244, 0.1); + --color-surface-3: rgba(250, 248, 244, 0.14); + --color-code-bg: #171616; + --color-code-bg-2: #211b2a; + --shadow: 0 18px 42px rgba(0, 0, 0, 0.26); + --shadow-elevated: 0 30px 80px rgba(0, 0, 0, 0.34); + background: var(--color-bg); + color: var(--color-fg); +} + +.home-page::before { + background: + linear-gradient(rgba(250, 248, 244, 0.035) 1px, transparent 1px), + linear-gradient(90deg, rgba(250, 248, 244, 0.035) 1px, transparent 1px), + linear-gradient(180deg, rgba(91, 59, 162, 0.12), transparent 44%), + linear-gradient(140deg, rgba(246, 201, 69, 0.06), transparent 38%); + background-size: 72px 72px, 72px 72px, auto, auto; + mask-image: linear-gradient(to bottom, black 0%, black 62%, transparent 100%); + opacity: 1; +} + +.home-page a { + color: #d9cbff; + text-decoration-color: rgba(246, 201, 69, 0.35); +} + +.home-page .site-top { + background: rgba(17, 16, 15, 0.82); + border-bottom-color: rgba(250, 248, 244, 0.08); + box-shadow: none; +} + +.home-page .brand, +.home-page .nav a, +.home-page .footer-inner strong { + color: var(--color-fg); +} + +.home-page .brand-mark { + border-color: rgba(250, 248, 244, 0.16); + background: rgba(250, 248, 244, 0.08); + box-shadow: 0 0 0 1px rgba(246, 201, 69, 0.08); +} + +.home-page .nav { + color: rgba(247, 243, 234, 0.66); +} + +.home-page .nav a:hover, +.home-page .nav a:focus-visible { + color: var(--color-fg); + border-color: rgba(250, 248, 244, 0.12); + background: rgba(250, 248, 244, 0.06); +} + +.home-page .button { + border-color: rgba(250, 248, 244, 0.14); + background: rgba(250, 248, 244, 0.06); + color: var(--color-fg); +} + +.home-page .button:hover, +.home-page .button:focus-visible { + border-color: rgba(246, 201, 69, 0.42); + background: rgba(250, 248, 244, 0.1); +} + +.home-page .button-primary { + border-color: rgba(246, 201, 69, 0.68); + background: linear-gradient(135deg, rgba(246, 201, 69, 0.92), rgba(244, 122, 40, 0.72)); + color: #1f1f1f; + box-shadow: 0 16px 40px rgba(246, 201, 69, 0.12); +} + +.home-page .button-primary:hover, +.home-page .button-primary:focus-visible { + background: linear-gradient(135deg, #f6c945, #f47a28); + color: #1f1f1f; +} + +.home-header { + padding: 0.72rem 0; +} + +.home-header .nav { + gap: 0.35rem; + font-size: 0.86rem; +} + +.home-header .nav a { + padding: 0.45rem 0.68rem; +} + +.home-header .nav .button { + padding: 0.62rem 0.82rem; +} + +.home-hero { + position: relative; + min-height: 780px; + display: flex; + align-items: center; + padding: 5.5rem 0 4.5rem; + overflow: hidden; + border-bottom: 1px solid rgba(250, 248, 244, 0.08); +} + +.home-hero::after { + content: ""; + position: absolute; + inset: auto 0 0; + height: 34%; + pointer-events: none; + background: linear-gradient(to bottom, transparent, var(--color-bg)); +} + +.home-hero-grid { + position: absolute; + inset: 0; + pointer-events: none; + background: + linear-gradient(rgba(250, 248, 244, 0.055) 1px, transparent 1px), + linear-gradient(90deg, rgba(250, 248, 244, 0.055) 1px, transparent 1px); + background-size: 88px 88px; + opacity: 0.42; + mask-image: linear-gradient(to bottom, black 0%, black 72%, transparent 100%); +} + +.home-hero-layout { + position: relative; + z-index: 2; + display: grid; + grid-template-columns: minmax(0, 0.86fr) minmax(0, 1.14fr); + gap: 3rem; + align-items: center; +} + +.home-hero-copy { + max-width: 700px; +} + +.home-eyebrow { + display: inline-flex; + align-items: center; + gap: 0.65rem; + margin-bottom: 1.1rem; + color: rgba(247, 243, 234, 0.76); + font-size: 0.78rem; + font-weight: 750; + text-transform: uppercase; + letter-spacing: 0.08em; +} + +.home-eyebrow-mark { + width: 12px; + height: 12px; + border-radius: 50%; + background: + linear-gradient(90deg, transparent 42%, var(--color-gold) 42% 58%, transparent 58%), + linear-gradient(0deg, transparent 42%, var(--color-green) 42% 58%, transparent 58%), + var(--color-purple); + box-shadow: 0 0 0 5px rgba(246, 201, 69, 0.09); +} + +.home-hero-copy h1 { + max-width: 700px; + margin: 0; + font-size: 5.6rem; + line-height: 0.95; + letter-spacing: 0; + text-wrap: balance; +} + +.home-lede { + max-width: 640px; + margin: 1.25rem 0 0; + color: var(--color-muted); + font-size: 1.18rem; + line-height: 1.62; + text-wrap: balance; +} + +.home-actions { + justify-content: flex-start; + margin-top: 1.65rem; +} + +.home-actions-left { + margin-top: 1.35rem; +} + +.home-metrics { + display: grid; + grid-template-columns: repeat(3, minmax(0, 1fr)); + gap: 0.8rem; + max-width: 650px; + margin-top: 2.2rem; +} + +.home-metrics div { + min-width: 0; + padding: 0.9rem 0; + border-top: 1px solid rgba(250, 248, 244, 0.14); +} + +.home-metrics strong, +.home-metrics span { + display: block; +} + +.home-metrics strong { + color: var(--color-fg); + font-family: var(--font-display); + font-size: 1.08rem; + line-height: 1.2; +} + +.home-metrics span { + color: rgba(247, 243, 234, 0.54); + font-size: 0.9rem; + line-height: 1.35; +} + +.home-orbit { + position: relative; + min-height: 610px; + perspective: 1100px; +} + +.home-orbit::before { + content: ""; + position: absolute; + inset: 4% 2% 0; + border: 1px solid rgba(91, 59, 162, 0.26); + transform: rotateX(61deg) rotateZ(-28deg); + transform-origin: center; + background: + linear-gradient(rgba(91, 59, 162, 0.16) 1px, transparent 1px), + linear-gradient(90deg, rgba(91, 59, 162, 0.16) 1px, transparent 1px); + background-size: 74px 74px; + opacity: 0.92; +} + +.home-orbit-plane { + position: absolute; + inset: 0; + transform: rotateX(61deg) rotateZ(-28deg); + transform-style: preserve-3d; +} + +.home-tile { + position: absolute; + width: 178px; + min-height: 74px; + padding: 0.75rem 0.85rem; + border-radius: 8px; + border: 1px solid rgba(250, 248, 244, 0.13); + background: linear-gradient(180deg, rgba(91, 59, 162, 0.5), rgba(23, 20, 30, 0.9)); + color: var(--color-fg); + box-shadow: 0 20px 30px rgba(0, 0, 0, 0.24); + transform: translateZ(28px); +} + +.home-tile::before { + content: ""; + position: absolute; + inset: 0; + border-radius: inherit; + background: linear-gradient(135deg, rgba(246, 201, 69, 0.18), transparent 48%); + pointer-events: none; +} + +.home-tile span, +.home-tile small { + position: relative; + display: block; +} + +.home-tile span { + font-weight: 800; + line-height: 1.15; +} + +.home-tile small { + margin-top: 0.24rem; + color: rgba(247, 243, 234, 0.58); + font-size: 0.74rem; + line-height: 1.15; +} + +.tile-runtime { + left: 14%; + top: 26%; +} + +.tile-silk { + left: 40%; + top: 18%; + border-color: rgba(246, 201, 69, 0.36); +} + +.tile-sage { + left: 62%; + top: 31%; +} + +.tile-slg { + left: 28%; + top: 52%; + border-color: rgba(244, 122, 40, 0.32); +} + +.tile-virtnosis { + left: 55%; + top: 58%; + border-color: rgba(62, 155, 101, 0.34); +} + +.tile-edge { + left: 73%; + top: 52%; +} + +.tile-policy { + left: 5%; + top: 47%; + width: 138px; +} + +.tile-packages { + left: 78%; + top: 20%; + width: 148px; +} + +.tile-center { + left: 43%; + top: 40%; + width: 152px; + min-height: 96px; + display: grid; + place-items: center; + text-align: center; + background: linear-gradient(180deg, rgba(246, 201, 69, 0.24), rgba(91, 59, 162, 0.6)); + border-color: rgba(246, 201, 69, 0.48); + transform: translateZ(64px); +} + +.tile-center img { + width: 34px; + height: 34px; + border-radius: 10px; +} + +.tile-center span { + margin-top: 0.35rem; +} + +.home-strip { + padding: 2.5rem 0 3.5rem; +} + +.home-project-strip { + display: grid; + grid-template-columns: repeat(5, minmax(0, 1fr)); + gap: 1rem; + align-items: center; +} + +.home-project-strip a { + display: flex; + align-items: center; + justify-content: center; + min-height: 76px; + border: 1px solid rgba(250, 248, 244, 0.1); + border-radius: 8px; + background: rgba(250, 248, 244, 0.035); + color: rgba(247, 243, 234, 0.62); + text-decoration: none; + font-family: var(--font-display); + font-size: 1.08rem; + font-weight: 800; +} + +.home-project-strip a:hover, +.home-project-strip a:focus-visible { + border-color: rgba(246, 201, 69, 0.34); + color: var(--color-fg); + background: rgba(250, 248, 244, 0.065); +} + +.home-proof { + padding: 4.5rem 0 5rem; + border-top: 1px solid rgba(250, 248, 244, 0.08); + border-bottom: 1px solid rgba(250, 248, 244, 0.08); +} + +.home-proof-grid { + display: grid; + grid-template-columns: minmax(0, 0.78fr) minmax(0, 1.22fr); + gap: 4rem; + align-items: center; +} + +.home-proof-copy { + display: grid; + gap: 1.15rem; +} + +.home-rule-item { + padding: 0.3rem 0 0.35rem 1.25rem; + border-left: 2px solid rgba(250, 248, 244, 0.14); +} + +.home-rule-item[data-active="true"] { + border-left-color: var(--color-gold); +} + +.home-rule-item h2, +.home-rule-item h3 { + margin: 0; + line-height: 1.1; + letter-spacing: 0; +} + +.home-rule-item h2 { + font-size: 2.4rem; +} + +.home-rule-item h3 { + font-size: 1.35rem; + color: rgba(247, 243, 234, 0.78); +} + +.home-rule-item p { + max-width: 460px; + margin-top: 0.65rem; + color: var(--color-muted); + font-size: 1rem; +} + +.home-device-map { + position: relative; + min-height: 390px; + border: 1px solid rgba(91, 59, 162, 0.28); + border-radius: 8px; + background: + linear-gradient(rgba(250, 248, 244, 0.04) 1px, transparent 1px), + linear-gradient(90deg, rgba(250, 248, 244, 0.04) 1px, transparent 1px), + rgba(250, 248, 244, 0.025); + background-size: 64px 64px; + overflow: hidden; +} + +.map-root, +.map-node { + position: absolute; + display: grid; + place-items: center; + border-radius: 8px; + border: 1px solid rgba(250, 248, 244, 0.14); + background: rgba(17, 16, 15, 0.76); + color: var(--color-fg); + font-weight: 800; +} + +.map-root { + left: 50%; + top: 18%; + width: 132px; + height: 48px; + transform: translateX(-50%); + border-color: rgba(246, 201, 69, 0.5); + color: var(--color-gold); +} + +.map-node { + width: 122px; + height: 72px; + color: rgba(247, 243, 234, 0.76); +} + +.node-runtime { + left: 12%; + top: 62%; +} + +.node-silk { + left: 36%; + top: 62%; +} + +.node-slg { + left: 60%; + top: 62%; +} + +.node-edge { + left: 80%; + top: 62%; +} + +.map-line { + position: absolute; + left: 18%; + right: 12%; + top: 40%; + height: 1px; + background: rgba(91, 59, 162, 0.75); +} + +.map-line::before, +.map-line::after { + content: ""; + position: absolute; + width: 1px; + height: 92px; + top: 0; + background: rgba(91, 59, 162, 0.75); +} + +.map-line::before { + left: 16%; +} + +.map-line::after { + right: 18%; +} + +.map-line-b { + left: 42%; + right: auto; + width: 1px; + height: 92px; +} + +.map-line-c { + left: 66%; + right: auto; + width: 1px; + height: 92px; +} + +.map-line-b::before, +.map-line-b::after, +.map-line-c::before, +.map-line-c::after { + display: none; +} + +.home-quote { + position: relative; + padding: 4.75rem 0; + overflow: hidden; + background: + linear-gradient(115deg, rgba(91, 59, 162, 0.22) 0 48%, rgba(246, 201, 69, 0.08) 48% 49%, rgba(17, 16, 15, 0.4) 49%), + #151311; + border-bottom: 1px solid rgba(250, 248, 244, 0.08); +} + +.home-quote blockquote { + max-width: 920px; + margin: 0 auto; + color: var(--color-fg); + font-family: var(--font-display); + font-size: 1.45rem; + font-weight: 800; + line-height: 1.35; + text-align: center; +} + +.home-build { + padding: 5.5rem 0 6rem; +} + +.home-build-grid { + display: grid; + grid-template-columns: minmax(0, 0.78fr) minmax(0, 1.22fr); + gap: 4rem; + align-items: center; +} + +.home-build-copy h2 { + margin: 0; + font-size: 3rem; + line-height: 1; + letter-spacing: 0; +} + +.home-build-copy p { + max-width: 460px; + margin-top: 1rem; + color: var(--color-muted); +} + +.home-build-mark { + width: 34px; + height: 34px; + display: grid; + place-items: center; + margin-bottom: 1.1rem; + border-radius: 50%; + border: 1px solid rgba(244, 122, 40, 0.5); + color: var(--color-orange); + font-weight: 900; +} + +.home-code-card { + border: 1px solid rgba(250, 248, 244, 0.12); + border-radius: 8px; + background: rgba(250, 248, 244, 0.04); + box-shadow: var(--shadow-elevated); + overflow: hidden; +} + +.home-code-title { + padding: 0.75rem 1rem; + border-bottom: 1px solid rgba(250, 248, 244, 0.1); + color: rgba(247, 243, 234, 0.78); + font-family: var(--font-mono); + font-size: 0.82rem; + font-weight: 800; +} + +.home-code-card pre { + border: 0; + border-radius: 0; + box-shadow: none; + background: linear-gradient(180deg, #171616 0%, #1d1727 100%); + font-size: 0.95rem; +} + +.home-section { + position: relative; + padding: 4rem 0 4.5rem; +} + +.contact-panel { + display: flex; + justify-content: space-between; + gap: 2rem; + align-items: center; + padding: 1.25rem 0; + border-top: 1px solid rgba(250, 248, 244, 0.12); +} + +.contact-panel h2 { + margin: 0; + font-size: 1.8rem; + line-height: 1; + letter-spacing: 0; +} + +.contact-links { + display: flex; + flex-wrap: wrap; + justify-content: flex-end; + gap: 0.55rem; +} + +.contact-links a { + padding: 0.65rem 0.85rem; + border-radius: 999px; + border: 1px solid rgba(250, 248, 244, 0.12); + background: rgba(250, 248, 244, 0.06); + color: var(--color-fg); + text-decoration: none; + font-weight: 700; +} + +.contact-links a:hover, +.contact-links a:focus-visible { + border-color: rgba(246, 201, 69, 0.34); + background: rgba(250, 248, 244, 0.1); +} + +.home-footer { + border-top-color: rgba(250, 248, 244, 0.08); +} + +.home-footer .footer-inner { + color: rgba(247, 243, 234, 0.56); +} + +@media (max-width: 1180px) { + .home-hero-layout, + .home-proof-grid, + .home-build-grid { + grid-template-columns: 1fr; + } + + .home-hero-copy { + max-width: 780px; + } + + .home-hero-copy h1 { + max-width: 780px; + font-size: 4.2rem; + } + + .home-orbit { + min-height: 500px; + } +} + +@media (max-width: 820px) { + .home-hero { + min-height: auto; + padding: 4.25rem 0 3rem; + } + + .home-hero-copy h1 { + font-size: 3rem; + line-height: 1; + } + + .home-lede { + font-size: 1.05rem; + } + + .home-metrics, + .home-project-strip { + grid-template-columns: 1fr; + } + + .home-orbit { + min-height: 360px; + margin-top: 1rem; + overflow: hidden; + } + + .home-orbit::before, + .home-orbit-plane { + left: -30%; + right: -22%; + transform: rotateX(58deg) rotateZ(-24deg) scale(0.78); + } + + .home-tile { + width: 150px; + min-height: 68px; + } + + .home-proof, + .home-build { + padding: 3.75rem 0; + } + + .home-rule-item h2, + .home-build-copy h2 { + font-size: 2.35rem; + } + + .home-device-map { + min-height: 330px; + } + + .map-root { + top: 10%; + } + + .map-node { + width: 112px; + height: 60px; + font-size: 0.84rem; + } + + .node-runtime { + left: 6%; + top: 62%; + } + + .node-silk { + left: 35%; + top: 62%; + } + + .node-slg { + left: 64%; + top: 62%; + } + + .node-edge { + display: none; + } + + .contact-panel { + align-items: flex-start; + flex-direction: column; + } + + .contact-links { + justify-content: flex-start; + } +} + +@media (max-width: 520px) { + .home-hero-copy h1 { + font-size: 2.45rem; + } + + .home-actions { + align-items: stretch; + flex-direction: column; + } + + .home-actions .button { + width: 100%; + } +} + + +/* Oro editorial homepage */ +.editorial-layout { + --editorial-rail: 220px; + --editorial-column-gap: 4rem; + --editorial-page-max: 1440px; + min-height: 100vh; + display: grid; + grid-template-columns: var(--editorial-rail) minmax(0, 1fr); + grid-template-rows: minmax(0, 1fr) auto; + column-gap: var(--editorial-column-gap); + max-width: var(--editorial-page-max); + margin: 0 auto; + padding: 0 2rem; + background: linear-gradient(180deg, #fffdf9 0%, var(--color-bg) 52%, #f5eee1 100%); + color: var(--color-fg); +} + +.editorial-layout::before { + content: none; +} + +.editorial-layout .site-top { + grid-column: 1; + grid-row: 1; + position: sticky; + top: 0; + align-self: start; + height: fit-content; + padding-top: 6rem; + background: transparent; + border-bottom: 0; + box-shadow: none; + backdrop-filter: none; +} + +.editorial-layout .site-top .container, +.editorial-layout .site-top .container-wide { + max-width: none; + padding: 0; +} + +.editorial-layout .site-header { + flex-direction: column; + align-items: flex-start; + justify-content: flex-start; + gap: 4rem; + min-height: 0; +} + +.editorial-layout .brand { + color: var(--color-fg); +} + +.editorial-layout .brand-mark { + width: 30px; + height: 30px; + border-color: rgba(31, 31, 31, 0.14); + background: rgba(255, 255, 255, 0.72); +} + +.editorial-layout .brand-name { + font-size: 1.48rem; +} + +.editorial-layout .nav { + flex-direction: column; + align-items: flex-start; + gap: 0.4rem; + margin-left: 0; + color: rgba(31, 31, 31, 0.55); + font-size: 0.88rem; + line-height: 1.2; +} + +.editorial-layout .nav a { + padding: 0.22rem 0; +} + +.editorial-layout .nav a::after { + display: none; +} + +.editorial-layout .nav a:hover, +.editorial-layout .nav a:focus-visible { + color: var(--color-fg); +} + +.editorial-main { + grid-column: 2; + grid-row: 1; + min-width: 0; + padding: 6rem 0 0; +} + +.editorial-layout .section-kicker { + margin: 0; + color: var(--color-purple); + font-size: 0.78rem; + font-weight: 760; + letter-spacing: 0.08em; +} + +.editorial-hero { + max-width: 760px; + padding-bottom: 5rem; +} + +.editorial-hero h1 { + max-width: 760px; + margin: 0; + font-family: var(--font-display); + font-size: 5.6rem; + font-weight: 820; + line-height: 0.95; + letter-spacing: 0; +} + +.editorial-hero p:not(.section-kicker) { + max-width: 650px; + margin: 1.35rem 0 0; + color: var(--color-muted); + font-size: 1.1rem; + line-height: 1.65; +} + +.editorial-actions { + display: flex; + flex-wrap: wrap; + gap: 0.75rem; + margin-top: 1.8rem; +} + +.editorial-layout .button { + min-height: 44px; + border-radius: var(--radius); + font-size: 0.94rem; +} + +.editorial-layout .button-primary { + border-color: rgba(31, 31, 31, 0.9); + background: var(--color-fg); + color: var(--color-bg); + box-shadow: 0 14px 32px rgba(31, 31, 31, 0.14); +} + +.editorial-layout .button-primary:hover, +.editorial-layout .button-primary:focus-visible { + border-color: rgba(31, 31, 31, 0.9); + background: #000; + color: var(--color-bg); +} + +.editorial-layout .button-quiet { + border-color: rgba(31, 31, 31, 0.14); + background: rgba(255, 255, 255, 0.54); + color: var(--color-fg); +} + +.editorial-layout .button-quiet:hover, +.editorial-layout .button-quiet:focus-visible { + border-color: rgba(31, 31, 31, 0.24); + background: rgba(255, 255, 255, 0.84); +} + +.editorial-products { + padding: 0 0 4.5rem; +} + +.editorial-section-heading { + margin-bottom: 1.4rem; +} + +.editorial-section-heading h2 { + margin: 0; + font-family: var(--font-display); + font-size: 2.65rem; + font-weight: 740; + line-height: 1.08; + letter-spacing: 0; +} + +.editorial-product { + display: grid; + grid-template-columns: 64px minmax(0, 760px); + gap: 2rem; + align-items: start; + padding: 1.8rem 0; + border-top: 1px solid rgba(31, 31, 31, 0.12); +} + +.editorial-product:last-child { + border-bottom: 1px solid rgba(31, 31, 31, 0.12); +} + +.editorial-product-index { + color: rgba(91, 59, 162, 0.84); + font-family: var(--font-mono); + font-size: 0.84rem; + font-weight: 720; + line-height: 1.9; +} + +.editorial-product h3 { + margin: 0; + font-family: var(--font-display); + font-size: 1.55rem; + font-weight: 740; + line-height: 1.15; +} + +.editorial-product p { + max-width: 560px; + margin: 0.55rem 0 0; + color: var(--color-muted); + line-height: 1.62; +} + +.editorial-product-links { + display: flex; + justify-content: flex-end; + gap: 0.5rem; + flex-wrap: wrap; +} + +.editorial-product-links a { + display: inline-flex; + align-items: center; + min-height: 34px; + padding: 0.42rem 0.68rem; + border: 1px solid rgba(31, 31, 31, 0.12); + border-radius: 999px; + background: rgba(255, 255, 255, 0.46); + color: rgba(31, 31, 31, 0.72); + text-decoration: none; + font-size: 0.82rem; + font-weight: 680; + line-height: 1.1; +} + +.editorial-product-links a:hover, +.editorial-product-links a:focus-visible { + border-color: rgba(91, 59, 162, 0.34); + background: rgba(255, 255, 255, 0.78); + color: var(--color-fg); +} + +.editorial-footer { + grid-column: 1 / -1; + display: grid; + grid-template-columns: var(--editorial-rail) minmax(0, 1fr) auto; + gap: var(--editorial-column-gap); + align-items: center; + padding: 2.5rem 0 4rem; + border-top: 1px solid rgba(31, 31, 31, 0.12); + color: rgba(31, 31, 31, 0.58); + font-size: 0.88rem; + line-height: 1.35; +} + +.editorial-footer-contact { + display: grid; + gap: 0.4rem; +} + +.editorial-footer-contact span { + color: var(--color-fg); + font-weight: 720; +} + +.editorial-footer a { + color: rgba(31, 31, 31, 0.62); + text-decoration: none; +} + +.editorial-footer a:hover, +.editorial-footer a:focus-visible { + color: var(--color-fg); +} + +.editorial-footer-links { + display: flex; + flex-wrap: wrap; + gap: 0.95rem; + align-items: center; +} + +.editorial-footer-links:last-child { + justify-content: flex-end; +} + +@media (max-width: 1080px) { + .editorial-layout { + --editorial-rail: 180px; + --editorial-column-gap: 2.5rem; + } + + .editorial-hero h1 { + font-size: 4.6rem; + } + + .editorial-product { + grid-template-columns: 48px minmax(0, 1fr); + } +} + +@media (max-width: 940px) { + .editorial-layout { + display: block; + padding: 0; + } + + .editorial-layout .site-top { + position: sticky; + top: 0; + padding-top: 0; + background: rgba(250, 248, 244, 0.92); + border-bottom: 1px solid rgba(31, 31, 31, 0.08); + backdrop-filter: blur(16px); + } + + .editorial-layout .site-top .container, + .editorial-layout .site-top .container-wide { + max-width: none; + padding: 0 var(--gutter); + } + + .editorial-layout .site-header { + min-height: 68px; + flex-direction: row; + align-items: center; + gap: 1rem; + } + + .editorial-layout .nav { + flex: 1 1 100%; + flex-direction: row; + flex-wrap: nowrap; + gap: 0.72rem; + width: 100%; + padding: 0 0 0.75rem; + overflow-x: auto; + font-size: 0.82rem; + white-space: nowrap; + scrollbar-width: none; + } + + .editorial-layout .nav::-webkit-scrollbar { + display: none; + } + + .editorial-main { + padding: 3.75rem var(--gutter) 0; + } + + .editorial-hero { + padding-bottom: 3.5rem; + } + + .editorial-hero h1 { + font-size: 3.8rem; + } + + .editorial-section-heading, + .editorial-product { + grid-template-columns: minmax(0, 1fr); + gap: 0.8rem; + } + + .editorial-footer { + display: grid; + grid-template-columns: minmax(0, 1fr); + gap: 1.35rem; + padding: 2rem var(--gutter) 3rem; + } + + .editorial-footer-links:last-child { + justify-content: flex-start; + } +} + +@media (max-width: 560px) { + .editorial-main { + padding-top: 3rem; + } + + .editorial-hero h1 { + font-size: 3rem; + line-height: 1.02; + } + + .editorial-hero p:not(.section-kicker) { + font-size: 1rem; + } + + .editorial-actions .button { + width: 100%; + } + + .editorial-section-heading h2 { + font-size: 2.1rem; + } + + .editorial-product { + padding: 1.45rem 0; + } +} + diff --git a/src/virtnosis-index.template.ts b/src/virtnosis-index.template.ts new file mode 100644 index 00000000..cb4a49d6 --- /dev/null +++ b/src/virtnosis-index.template.ts @@ -0,0 +1,6 @@ +import type { DataDeps, TemplateFunction } from '@domstack/static/types.js' +import type { DocsData } from './lib/docs.ts' +import { collectionIndex } from './lib/artifacts.ts' +export const dataDeps = ['virtnosisNavigation'] satisfies DataDeps<Pick<DocsData, 'virtnosisNavigation'>> +const template: TemplateFunction<Record<string, unknown>, Pick<DocsData, 'virtnosisNavigation'>> = ({ data }) => collectionIndex('virtnosis', data.virtnosisNavigation) +export default template diff --git a/src/virtnosis-llms.template.ts b/src/virtnosis-llms.template.ts new file mode 100644 index 00000000..41ea2a5e --- /dev/null +++ b/src/virtnosis-llms.template.ts @@ -0,0 +1,6 @@ +import type { DataDeps, TemplateFunction } from '@domstack/static/types.js' +import type { DocsData } from './lib/docs.ts' +import { pack } from './lib/artifacts.ts' +export const dataDeps = ["virtnosisExports"] satisfies DataDeps<Pick<DocsData, 'virtnosisExports'>> +const template: TemplateFunction<{ siteUrl: string }, Pick<DocsData, 'virtnosisExports'>> = ({ data, vars }) => pack('virtnosis', data.virtnosisExports, vars.siteUrl) +export default template diff --git a/src/virtnosis-search.template.ts b/src/virtnosis-search.template.ts new file mode 100644 index 00000000..80bf5bff --- /dev/null +++ b/src/virtnosis-search.template.ts @@ -0,0 +1,6 @@ +import type { DataDeps, TemplateFunction } from '@domstack/static/types.js' +import type { DocsData } from './lib/docs.ts' +import { json } from './lib/artifacts.ts' +export const dataDeps = ['virtnosisSearch'] satisfies DataDeps<Pick<DocsData, 'virtnosisSearch'>> +const template: TemplateFunction<Record<string, unknown>, Pick<DocsData, 'virtnosisSearch'>> = ({ data }) => json('/virtnosis/docs/search.json', data.virtnosisSearch) +export default template diff --git a/src/virtnosis-sources.template.ts b/src/virtnosis-sources.template.ts new file mode 100644 index 00000000..cba9739d --- /dev/null +++ b/src/virtnosis-sources.template.ts @@ -0,0 +1,6 @@ +import type { DataDeps, TemplateFunction } from '@domstack/static/types.js' +import type { DocsData } from './lib/docs.ts' +import { sources } from './lib/artifacts.ts' +export const dataDeps = ['virtnosisExports'] satisfies DataDeps<Pick<DocsData, 'virtnosisExports'>> +const template: TemplateFunction<Record<string, unknown>, Pick<DocsData, 'virtnosisExports'>> = ({ data }) => sources(data.virtnosisExports) +export default template diff --git a/src/virtnosis/docs/cli/virtnosis-agent/page.md b/src/virtnosis/docs/cli/virtnosis-agent/page.md index 66b0e251..9dc9c237 100644 --- a/src/virtnosis/docs/cli/virtnosis-agent/page.md +++ b/src/virtnosis/docs/cli/virtnosis-agent/page.md @@ -1,5 +1,5 @@ --- -layout: "docs" +layout: "virtnosis-docs" title: "virtnosis-agent" description: "virtnosis-agent is the local control-plane daemon for Virtnosis." docsCollection: "virtnosis" diff --git a/src/virtnosis/docs/cli/vnactl/page.md b/src/virtnosis/docs/cli/vnactl/page.md index 75855c89..c3f051a0 100644 --- a/src/virtnosis/docs/cli/vnactl/page.md +++ b/src/virtnosis/docs/cli/vnactl/page.md @@ -1,5 +1,5 @@ --- -layout: "docs" +layout: "virtnosis-docs" title: "vnactl" description: "vnactl is the operator and automation client for virtnosis-agent." docsCollection: "virtnosis" diff --git a/src/virtnosis/docs/guides/deployment/page.md b/src/virtnosis/docs/guides/deployment/page.md index 29032623..b3d0a962 100644 --- a/src/virtnosis/docs/guides/deployment/page.md +++ b/src/virtnosis/docs/guides/deployment/page.md @@ -1,5 +1,5 @@ --- -layout: "docs" +layout: "virtnosis-docs" title: "Deployment Guide" description: "This guide covers local agent deployment, shared socket deployment, and the important permission and auth choices." docsCollection: "virtnosis" diff --git a/src/virtnosis/docs/guides/getting-started/page.md b/src/virtnosis/docs/guides/getting-started/page.md index 5b4645df..27d576fe 100644 --- a/src/virtnosis/docs/guides/getting-started/page.md +++ b/src/virtnosis/docs/guides/getting-started/page.md @@ -1,5 +1,5 @@ --- -layout: "docs" +layout: "virtnosis-docs" title: "Getting Started" description: "This guide gets you from an installed Virtnosis CLI to a useful first scan." docsCollection: "virtnosis" diff --git a/src/virtnosis/docs/guides/install-and-package/page.md b/src/virtnosis/docs/guides/install-and-package/page.md index 3bfc4df2..662a9ca7 100644 --- a/src/virtnosis/docs/guides/install-and-package/page.md +++ b/src/virtnosis/docs/guides/install-and-package/page.md @@ -1,5 +1,5 @@ --- -layout: "docs" +layout: "virtnosis-docs" title: "Install and Package" description: "This guide covers source builds, local installs, docs installs, and the packaging-oriented make targets shipped in the repository." docsCollection: "virtnosis" diff --git a/src/virtnosis/docs/guides/operator-guide/page.md b/src/virtnosis/docs/guides/operator-guide/page.md index 39aac8bd..14b85d3d 100644 --- a/src/virtnosis/docs/guides/operator-guide/page.md +++ b/src/virtnosis/docs/guides/operator-guide/page.md @@ -1,5 +1,5 @@ --- -layout: "docs" +layout: "virtnosis-docs" title: "Operator Guide" description: "This guide focuses on day-to-day use of Virtnosis as an operator, responder, or CI consumer." docsCollection: "virtnosis" diff --git a/src/virtnosis/docs/guides/output-and-automation/page.md b/src/virtnosis/docs/guides/output-and-automation/page.md index ad2603ff..389b9670 100644 --- a/src/virtnosis/docs/guides/output-and-automation/page.md +++ b/src/virtnosis/docs/guides/output-and-automation/page.md @@ -1,5 +1,5 @@ --- -layout: "docs" +layout: "virtnosis-docs" title: "Output and Automation" description: "Virtnosis output is designed to stay machine-consumable even when the scan is partial, bounded, or degraded." docsCollection: "virtnosis" diff --git a/src/virtnosis/docs/guides/systemd/page.md b/src/virtnosis/docs/guides/systemd/page.md index 5bec62b2..10a9c8f3 100644 --- a/src/virtnosis/docs/guides/systemd/page.md +++ b/src/virtnosis/docs/guides/systemd/page.md @@ -1,5 +1,5 @@ --- -layout: "docs" +layout: "virtnosis-docs" title: "Systemd Guide" description: "This guide documents the systemd deployment story for Virtnosis." docsCollection: "virtnosis" diff --git a/src/virtnosis/docs/man/virtnosis-7/page.md b/src/virtnosis/docs/man/virtnosis-7/page.md index b6c22e3c..9ca8ade7 100644 --- a/src/virtnosis/docs/man/virtnosis-7/page.md +++ b/src/virtnosis/docs/man/virtnosis-7/page.md @@ -1,5 +1,5 @@ --- -layout: "docs" +layout: "virtnosis-docs" title: "virtnosis(7)" description: "virtnosis — libvirt security analysis and diagnosis architecture" docsCollection: "virtnosis" diff --git a/src/virtnosis/docs/man/virtnosis-agent-1/page.md b/src/virtnosis/docs/man/virtnosis-agent-1/page.md index 2bdb7899..21881a0e 100644 --- a/src/virtnosis/docs/man/virtnosis-agent-1/page.md +++ b/src/virtnosis/docs/man/virtnosis-agent-1/page.md @@ -1,5 +1,5 @@ --- -layout: "docs" +layout: "virtnosis-docs" title: "virtnosis-agent(1)" description: "virtnosis-agent — Virtnosis local agent and daemon" docsCollection: "virtnosis" diff --git a/src/virtnosis/docs/man/virtnosis-agent-protocol-7/page.md b/src/virtnosis/docs/man/virtnosis-agent-protocol-7/page.md index 97aba8ca..8de918bc 100644 --- a/src/virtnosis/docs/man/virtnosis-agent-protocol-7/page.md +++ b/src/virtnosis/docs/man/virtnosis-agent-protocol-7/page.md @@ -1,5 +1,5 @@ --- -layout: "docs" +layout: "virtnosis-docs" title: "virtnosis-agent-protocol(7)" description: "virtnosis-agent-protocol — control protocol and transport model for Virtnosis" docsCollection: "virtnosis" diff --git a/src/virtnosis/docs/man/virtnosis-scan-report-7/page.md b/src/virtnosis/docs/man/virtnosis-scan-report-7/page.md index 7455d0a4..af063045 100644 --- a/src/virtnosis/docs/man/virtnosis-scan-report-7/page.md +++ b/src/virtnosis/docs/man/virtnosis-scan-report-7/page.md @@ -1,5 +1,5 @@ --- -layout: "docs" +layout: "virtnosis-docs" title: "virtnosis-scan-report(7)" description: "virtnosis-scan-report — output model and reporting semantics for Virtnosis scans" docsCollection: "virtnosis" diff --git a/src/virtnosis/docs/man/vnactl-1/page.md b/src/virtnosis/docs/man/vnactl-1/page.md index 4e7f090a..aed77fa2 100644 --- a/src/virtnosis/docs/man/vnactl-1/page.md +++ b/src/virtnosis/docs/man/vnactl-1/page.md @@ -1,5 +1,5 @@ --- -layout: "docs" +layout: "virtnosis-docs" title: "vnactl(1)" description: "vnactl — Virtnosis agent control client" docsCollection: "virtnosis" diff --git a/src/virtnosis/docs/page.md b/src/virtnosis/docs/page.md index d24f4904..793eaef3 100644 --- a/src/virtnosis/docs/page.md +++ b/src/virtnosis/docs/page.md @@ -1,5 +1,5 @@ --- -layout: "docs" +layout: "virtnosis-docs" title: "Virtnosis Docs" description: "Virtnosis is a read-only libvirt security analysis and diagnosis toolset." docsCollection: "virtnosis" diff --git a/src/virtnosis/docs/reference/architecture/page.md b/src/virtnosis/docs/reference/architecture/page.md index ad079ed0..598764e3 100644 --- a/src/virtnosis/docs/reference/architecture/page.md +++ b/src/virtnosis/docs/reference/architecture/page.md @@ -1,5 +1,5 @@ --- -layout: "docs" +layout: "virtnosis-docs" title: "Architecture" description: "This document explains the product architecture from a systems perspective." docsCollection: "virtnosis" diff --git a/src/virtnosis/docs/reference/development/page.md b/src/virtnosis/docs/reference/development/page.md index 79134fa5..6fb462a1 100644 --- a/src/virtnosis/docs/reference/development/page.md +++ b/src/virtnosis/docs/reference/development/page.md @@ -1,5 +1,5 @@ --- -layout: "docs" +layout: "virtnosis-docs" title: "Development Guide" description: "This guide is for contributors working inside virtnosis/." docsCollection: "virtnosis" diff --git a/src/virtnosis/docs/reference/overview/page.md b/src/virtnosis/docs/reference/overview/page.md index 17514b13..19a9913a 100644 --- a/src/virtnosis/docs/reference/overview/page.md +++ b/src/virtnosis/docs/reference/overview/page.md @@ -1,5 +1,5 @@ --- -layout: "docs" +layout: "virtnosis-docs" title: "Overview" description: "Virtnosis is a read-only libvirt security analysis and diagnosis toolset." docsCollection: "virtnosis" diff --git a/src/virtnosis/docs/reference/repository-docs/page.md b/src/virtnosis/docs/reference/repository-docs/page.md index f93bfb88..e717b0c8 100644 --- a/src/virtnosis/docs/reference/repository-docs/page.md +++ b/src/virtnosis/docs/reference/repository-docs/page.md @@ -1,5 +1,5 @@ --- -layout: "docs" +layout: "virtnosis-docs" title: "Repository Documents" description: "This page maps the documentation layers that exist in the virtnosis repository and explains which ones are public/operator-facing versus contributor/internal." docsCollection: "virtnosis" diff --git a/src/virtnosis/docs/reference/scan-analysis/page.md b/src/virtnosis/docs/reference/scan-analysis/page.md index b9a2cfed..fa7e48c9 100644 --- a/src/virtnosis/docs/reference/scan-analysis/page.md +++ b/src/virtnosis/docs/reference/scan-analysis/page.md @@ -1,5 +1,5 @@ --- -layout: "docs" +layout: "virtnosis-docs" title: "Scan Analysis" description: "This guide explains what Virtnosis scans, what “deep” means, and how to interpret partial versus confirmed findings." docsCollection: "virtnosis" diff --git a/tests/browser/client.spec.ts b/tests/browser/client.spec.ts new file mode 100644 index 00000000..d7fb47d7 --- /dev/null +++ b/tests/browser/client.spec.ts @@ -0,0 +1,72 @@ +import { test, expect, type Route } from '@playwright/test' + +test('search retries a failed index after the pending query was cleared', async ({ page }) => { + let requests = 0 + let resolveFirst!: (route: Route) => void + const first = new Promise<Route>((resolve) => { resolveFirst = resolve }) + await page.route('**/runtime/docs/search.json', async (route) => { + requests += 1 + if (requests === 1) { + resolveFirst(route) + return + } + await route.fulfill({ json: { items: [ + { title: 'Retry result', url: '/runtime/docs/', summary: 'Recovered', text: 'retry' }, + ] } }) + }) + await page.goto('/runtime/docs/guides/hello-world/') + const search = page.getByRole('searchbox', { name: 'Search documentation' }) + await search.fill('first') + const pending = await first + await search.fill('') + const response = page.waitForResponse('**/runtime/docs/search.json') + await pending.fulfill({ status: 503, body: 'Unavailable' }) + await (await response).finished() + // Let the fetch rejection settle before creating a new input event. + await page.evaluate(() => new Promise<void>((resolve) => { + requestAnimationFrame(() => requestAnimationFrame(() => resolve())) + })) + await expect(page.locator('[data-docs-results]')).toBeHidden() + await search.fill('retry') + await expect(page.getByRole('link', { name: 'Retry result Recovered' })).toBeVisible() + expect(requests).toBe(2) +}) + +test('Ask AI escapes the scrolling nav and supports keyboard dismissal', async ({ page }) => { + await page.goto('/runtime/docs/guides/hello-world/') + const trigger = page.getByRole('button', { name: 'Ask AI', exact: true }) + await trigger.click() + const panel = page.locator('#ask-ai-panel') + await expect(panel).toBeVisible() + await expect(trigger).toHaveAttribute('aria-expanded', 'true') + expect(await panel.evaluate((element) => { + const bounds = element.getBoundingClientRect() + const item = element.querySelector('a')! + const target = item.getBoundingClientRect() + return !element.closest('.nav') && bounds.left >= 0 && bounds.right <= innerWidth && + item.contains(document.elementFromPoint(target.x + target.width / 2, target.y + target.height / 2)) && + document.documentElement.scrollWidth <= innerWidth + })).toBe(true) + await trigger.press('ArrowDown') + await expect(page.getByRole('link', { name: 'ChatGPT New tab' })).toBeFocused() + await page.keyboard.press('Escape') + await expect(panel).toBeHidden() + await expect(trigger).toBeFocused() + await expect(trigger).toHaveAttribute('aria-expanded', 'false') + await trigger.click() + await page.locator('.prose h1').click() + await expect(panel).toBeHidden() +}) + +test('section navigation selects only the most specific Docs destination', async ({ page }) => { + for (const [route, label] of [ + ['/runtime/docs/cli/oroc/', 'CLI'], + ['/runtime/docs/javascript/overview/', 'JavaScript APIs'], + ['/runtime/docs/guides/hello-world/', 'Docs'], + ]) { + await page.goto(route) + const current = page.locator('.site-subnav-links [aria-current="page"]') + await expect(current).toHaveCount(1) + await expect(current).toHaveText(label) + } +}) diff --git a/tests/docs-data.test.ts b/tests/docs-data.test.ts new file mode 100644 index 00000000..0d1a7872 --- /dev/null +++ b/tests/docs-data.test.ts @@ -0,0 +1,60 @@ +import { test } from 'node:test' +import assert from 'node:assert/strict' +import { projectCollection, validateDocVars, editUrl, type Doc } from '../src/lib/docs.ts' +import { collectionIndex, pack, sitemap } from '../src/lib/artifacts.ts' +import { article, rootContent } from '../src/lib/rendering.ts' +import { markdown } from '../src/lib/markdown.ts' +const doc: Doc = { + collection: 'runtime', id: 'start', title: 'Start', description: 'Summary', + section: 'overview', order: 0, sourcePath: 'start.md', url: '/runtime/docs/', + githubRepo: 'oro-computer/runtime', githubRef: 'master', editUrl: editUrl('runtime/docs/page.md'), + markdown: '# Start\n', searchText: 'Start', +} +test('navigation is JSON-safe, precomputed, and independent of body/search changes', () => { + const second = { ...doc, id: 'next', sourcePath: 'next.txt', title: 'Next', url: '/runtime/docs/next/' } + const nav = projectCollection([doc, second]) + assert.equal(nav.bySource['start.md'].previous, null) + assert.equal(nav.bySource['start.md'].next?.title, 'Next') + assert.equal(nav.bySource['next.txt'].previous?.id, 'start') + assert.equal(nav.bySource['next.txt'].next, null) + assert.equal(nav.sections[0].title, 'Start') + assert.equal(nav.legacy.start, doc.url) + assert.equal(JSON.stringify(nav), JSON.stringify(projectCollection([{ ...doc, markdown: 'Changed', searchText: 'Changed', description: 'Changed' }, second]))) + assert.deepEqual(JSON.parse(JSON.stringify(nav)).bySource['start.md'], { ...nav.bySource['start.md'] }) + assert.throws(() => projectCollection([doc, doc]), /Duplicate document/) + const index = JSON.parse(collectionIndex('runtime', nav).content) + assert.equal(index.sections[0].items[1].file, 'next.txt') +}) +test('navigation rejects legacy ID collisions between Markdown and text sources', () => { + const first = { ...doc, id: 'foo', sourcePath: 'foo.md' } + const second = { ...doc, id: 'foo', sourcePath: 'foo.txt', url: '/runtime/docs/other/' } + assert.throws(() => projectCollection([first, second]), { + message: 'Duplicate document id "foo" in collection "runtime": foo.md and foo.txt', + }) +}) +test('source validation rejects malformed collection metadata with source context', () => { + const vars = { ...doc, docsCollection: doc.collection } + assert.equal(validateDocVars(vars, 'runtime/docs/page.md').title, 'Start') + for (const change of [{ docsCollection: 'invalid' }, { order: NaN }, { title: 4 }, { sourcePath: '../secret.md' }, { sourcePath: '/start.md' }]) + assert.throws(() => validateDocVars({ ...vars, ...change }, 'runtime/docs/page.md'), /runtime\/docs\/page.md/) + assert.equal(editUrl('silk/docs/renamed/README.md'), 'https://github.com/oro-computer/website/blob/master/src/silk/docs/renamed/README.md') +}) +test('artifact URLs use site configuration and sitemap escapes XML', () => { + assert.match(pack('runtime', [doc], 'https://preview.example').content, /URL: https:\/\/preview.example\/runtime\/docs\//) + const xml = sitemap(['/page/?a=1&b=2'], 'https://preview.example').content + assert.ok(xml.includes('https://preview.example/page/?a=1&b=2')) +}) +test('article enhancement is page-local and preserves legacy anchors', () => { + const md = markdown() + const source = '## `oro:fs` API\n\n## `oro:fs` API\n\n> [!NOTE]\n> Alert\n' + const rendered = md.render(source) + assert.equal(md.render(source), rendered) + const result = article(rendered) + assert.ok(result.body.includes('id="orofs-api-1"')) + assert.ok(result.toc.includes('href="#orofs-api-1"')) + assert.ok(rendered.includes('markdown-alert')) + assert.equal(article(rendered).body, result.body) + assert.ok(article(rendered, true).toc.includes('spec-toc')) + assert.equal(rootContent('<p>Unchanged</p>'), '<p>Unchanged</p>') + assert.ok(rootContent('<pre><code class="language-js">const x = 1</code></pre>').includes('hljs-keyword')) +}) diff --git a/tests/docs-watch.test.ts b/tests/docs-watch.test.ts new file mode 100644 index 00000000..371bd241 --- /dev/null +++ b/tests/docs-watch.test.ts @@ -0,0 +1,93 @@ +import { test } from 'node:test' +import assert from 'node:assert/strict' +import { mkdtemp, mkdir, writeFile, readFile, rm, readdir } from 'node:fs/promises' +import { tmpdir } from 'node:os' +import { join, basename } from 'node:path' +import { identifyPages } from '@domstack/static/lib/identify-pages.js' +import { buildPagesDirect } from '@domstack/static/lib/build-pages/index.js' + +test('DOMStack selectively rebuilds docs consumers for body and navigation edits', { timeout: 20000 }, async () => { + const fixture = await mkdtemp(join(tmpdir(), 'oro-docs-watch-')) + const src = join(fixture, 'src') + const dest = join(fixture, 'public') + try { + await mkdir(src) + // Re-export real consumers so the fixture tests their actual subscriptions, + // while keeping builds and edits isolated from the site's source/output. + const proxy = async (target: string, source: string) => { + const url = new URL('../src/' + source, import.meta.url).href + await writeFile(join(src, target), `export { default } from ${JSON.stringify(url)}\nexport * from ${JSON.stringify(url)}\n`) + } + for (const name of ['global.data.ts', 'global.vars.ts', 'markdown-it.settings.ts']) await proxy(name, name) + for (const name of ['root', 'docs', 'runtime-docs', 'silk-docs']) + await proxy(name + '.layout.ts', 'layouts/' + name + '.layout.ts') + for (const name of (await readdir(new URL('../src/', import.meta.url))).filter(name => name.endsWith('.template.ts') && name !== 'cname.template.ts')) + await proxy(name, name) + const pageSource = (collection: string, id: string, title: string, body: string) => `--- +layout: "${collection}-docs" +title: "${title}" +description: "Summary" +docsCollection: "${collection}" +section: "overview" +order: ${id === 'start' ? 0 : 1} +sourcePath: "${id}.md" +githubRepo: "oro-computer/${collection}" +githubRef: "master" +--- +# ${title} + +## Stable anchor + +${body} +` + const pageFiles: string[] = [] + for (const [collection, id] of [['runtime', 'start'], ['runtime', 'next'], ['silk', 'start']]) { + const dir = join(src, collection, 'docs', ...(id === 'start' ? [] : [id])) + await mkdir(dir, { recursive: true }) + const path = join(dir, 'page.md') + pageFiles.push(path) + await writeFile(path, pageSource(collection, id, id, 'Original body')) + } + const siteData = await identifyPages(src) + assert.deepEqual(siteData.errors, []) + const first = await buildPagesDirect(src, dest, siteData, { trackWatchDependencies: true }) + assert.deepEqual(first.errors, []) + const initial = first.report.watchDependencies! + assert.ok(Object.values(initial.globalDataFingerprints).every(value => typeof value === 'string')) + const subscription = Object.values(initial.consumers).find(c => c.key === pageFiles[0])! + assert.deepEqual(subscription.globalDataKeys, ['runtimeNavigation']) + const unchanged = await readFile(join(dest, 'runtime/docs/next/index.html'), 'utf8') + const index = await readFile(join(dest, 'runtime/docs/index.json'), 'utf8') + + await writeFile(pageFiles[0], pageSource('runtime', 'start', 'start', 'Changed body')) + const bodyEdit = await buildPagesDirect(src, dest, siteData, { + trackWatchDependencies: true, previousWatchDependencies: initial, + pageFilterPaths: [pageFiles[0]], templateFilterPaths: [], pagesFileFilterPaths: [], + }) + assert.deepEqual(bodyEdit.errors, []) + assert.deepEqual(bodyEdit.report.pages.map(p => p.sourcePageFilePath), [pageFiles[0]]) + assert.deepEqual(bodyEdit.report.templates.map(t => basename(t.templateInfo.templateFile.filepath)).sort(), [ + 'runtime-llms.template.ts', 'runtime-search.template.ts', 'runtime-sources.template.ts', + ]) + assert.equal(await readFile(join(dest, 'runtime/docs/next/index.html'), 'utf8'), unchanged) + assert.equal(await readFile(join(dest, 'runtime/docs/index.json'), 'utf8'), index) + assert.match(await readFile(join(dest, 'runtime/docs/search.json'), 'utf8'), /Changed body/) + assert.match(await readFile(join(dest, 'runtime/docs/source/start.md'), 'utf8'), /Changed body/) + assert.match(await readFile(join(dest, 'runtime/llms.txt'), 'utf8'), /Changed body/) + assert.match(await readFile(join(dest, 'runtime/docs/index.html'), 'utf8'), /id="stable-anchor"/) + + await writeFile(pageFiles[0], pageSource('runtime', 'start', 'Renamed', 'Changed body')) + const titleEdit = await buildPagesDirect(src, dest, siteData, { + trackWatchDependencies: true, previousWatchDependencies: bodyEdit.report.watchDependencies, + pageFilterPaths: [pageFiles[0]], templateFilterPaths: [], pagesFileFilterPaths: [], + }) + assert.deepEqual(titleEdit.errors, []) + assert.deepEqual(titleEdit.report.pages.map(p => p.sourcePageFilePath).sort(), pageFiles.slice(0, 2).sort()) + assert.deepEqual(titleEdit.report.templates.map(t => basename(t.templateInfo.templateFile.filepath)).sort(), [ + 'runtime-index.template.ts', 'runtime-llms.template.ts', 'runtime-search.template.ts', 'runtime-sources.template.ts', + ]) + assert.match(await readFile(join(dest, 'runtime/docs/next/index.html'), 'utf8'), /Renamed/) + } finally { + await rm(fixture, { recursive: true, force: true }) + } +}) diff --git a/tests/ingestion-fixtures.json b/tests/ingestion-fixtures.json new file mode 100644 index 00000000..d4c5aacc --- /dev/null +++ b/tests/ingestion-fixtures.json @@ -0,0 +1,410 @@ +{ + "cases": [ + { + "rel": "std/sample.md", + "path": "/fixture/std/sample.md", + "kind": "docs", + "input": "# Reference (Current)\n\nStatus: **Partially implemented**. The repository has current supported contexts.\nWorks today: prose\n## Syntax (Selected)\n## Examples (Works today): sample\n## Works today: another\n## What works today (native)\nexamples labeled “Works today”\nexport const region global_arena; const region arena; with arena; from arena; arena[0]; `arena`; `global_arena`\n## Implementation Status\nImplementation status (native): in progress\nInitial Implemented Subset; current compiler subset; active expansion; Partially implemented\nStatus and Future Work\n## Notes and Limitations\n## Current API (native)\n## Design Goals\nKeep design notes.\n## Tests\nRemove test prose.\n### Nested tests\nAlso removed.\n## Arenas\nRemoved arena prose.\n## Surface Syntax\nThe repository, the repository, This repository, this repository.\n`this repository` repo dependency workflow; what works today.\n`STATUS.md` (implementation status) (tracked in `PLAN.md`)\n- End-to-end support snapshot: `STATUS.md`\n- Implemented-subset notes: PLAN.md\n- Relevant fixtures: useful and `STATUS.md`\nStatus: implemented for the current front-end + native backend subset.\nSee `?p=std/runtime`, ?p=docs/language/README and `silk` (1), `std::io` (3).\nSee [docs/std/runtime-event-loop.md](old), docs/std/foo.md, `docs/language/mutability.md`.\nhttps://oro.computer/silk/docs/?p=docs/start https://oro.computer/silk/wiki/?p=wiki/start\n`?p=...` docs/usage/tutorials/README.md ?p=man/my-app.7 docs/std/foo-bar.md\n## Silk Proposal Process (TC39-Inspired)\nRemove proposal.\n## Exported API\nchecker.checkModuleSetWithImports\nCLI output: `silk` CLI and `silk` (1) — Silk Language Compiler (`silk --version`)\n## Current Scope\nMVP initial std wrapper current snapshot.\n", + "expected": "# Reference\n\nThe Silk compiler repository has supported contexts.\nSupported forms: prose\n## Syntax\n## Examples: sample\n## Example: another\n## Supported forms\nexamples labeled “Example”\nexport const region global_region_buf; const region region_buf; with region_buf; from region_buf; region_buf[0]; `region_buf`; `global_region_buf`\n## Notes\navailable\nInitial Supported forms; current implementation; current module surface; Implemented\nStatus and Future Work\n## Considerations\n## Exported API\n## Surface Syntax\nThe Silk compiler repository, the Silk compiler repository, The Silk compiler repository, the Silk compiler repository.\n`this repository` Silk compiler repository’s vendored dependency workflow; current implementation notes.\n[implementation status](?p=compiler/implementation-status)\n- End-to-end support snapshot: [implementation status](?p=compiler/implementation-status)\n- Notes: PLAN.md\n- Relevant fixtures: useful and [implementation status](?p=compiler/implementation-status)\nimplemented for the current front-end + native backend subset.\nSee [runtime](?p=std/runtime), [start](?p=start) and [`silk(1)`](?p=man/silk.1), [`std::io(3)`](?p=std/io).\nSee [runtime](?p=std/runtime), docs/std/foo.md, [mutability](?p=language/mutability).\n[start](?p=start) wiki/wiki/?p=start\ndocs links [start](?p=start) ?p=man/my-app.7 docs/std/foo-bar.md\n## Silk Proposal Process (TC39-Inspired)\nRemove proposal.\n## Exported API\nchecker.checkModuleSetWithImports\nCLI output: `silk` CLI and [`silk(1)`](?p=man/silk.1) — Silk Language Compiler (`silk --version`)\n## Considerations\nbaseline stdlib wrapper current implementation.\n\n## Design goals\nKeep design notes.\n" + }, + { + "rel": "std/sample.md", + "path": "/fixture/std/sample.md", + "kind": "docs", + "input": "# Built-In Dependencies\n\n# Reference (Current)\n\nStatus: **Partially implemented**. The repository has current supported contexts.\nWorks today: prose\n## Syntax (Selected)\n## Examples (Works today): sample\n## Works today: another\n## What works today (native)\nexamples labeled “Works today”\nexport const region global_arena; const region arena; with arena; from arena; arena[0]; `arena`; `global_arena`\n## Implementation Status\nImplementation status (native): in progress\nInitial Implemented Subset; current compiler subset; active expansion; Partially implemented\nStatus and Future Work\n## Notes and Limitations\n## Current API (native)\n## Design Goals\nKeep design notes.\n## Tests\nRemove test prose.\n### Nested tests\nAlso removed.\n## Arenas\nRemoved arena prose.\n## Surface Syntax\nThe repository, the repository, This repository, this repository.\n`this repository` repo dependency workflow; what works today.\n`STATUS.md` (implementation status) (tracked in `PLAN.md`)\n- End-to-end support snapshot: `STATUS.md`\n- Implemented-subset notes: PLAN.md\n- Relevant fixtures: useful and `STATUS.md`\nStatus: implemented for the current front-end + native backend subset.\nSee `?p=std/runtime`, ?p=docs/language/README and `silk` (1), `std::io` (3).\nSee [docs/std/runtime-event-loop.md](old), docs/std/foo.md, `docs/language/mutability.md`.\nhttps://oro.computer/silk/docs/?p=docs/start https://oro.computer/silk/wiki/?p=wiki/start\n`?p=...` docs/usage/tutorials/README.md ?p=man/my-app.7 docs/std/foo-bar.md\n## Silk Proposal Process (TC39-Inspired)\nRemove proposal.\n## Exported API\nchecker.checkModuleSetWithImports\nCLI output: `silk` CLI and `silk` (1) — Silk Language Compiler (`silk --version`)\n## Current Scope\nMVP initial std wrapper current snapshot.\n", + "expected": "# Built-In Dependencies\n\n# Reference\n\nThe Silk compiler repository has supported contexts.\nSupported forms: prose\n## Syntax\n## Examples: sample\n## Example: another\n## Supported forms\nexamples labeled “Example”\nexport const region global_region_buf; const region region_buf; with region_buf; from region_buf; region_buf[0]; `region_buf`; `global_region_buf`\n## Notes\navailable\nInitial Supported forms; current implementation; current module surface; Implemented\nStatus and Future Work\n## Considerations\n## Exported API\n## Surface Syntax\nThe Silk compiler repository, the Silk compiler repository, The Silk compiler repository, the Silk compiler repository.\n`this repository` Silk compiler repository’s vendored dependency workflow; current implementation notes.\n[implementation status](?p=compiler/implementation-status)\n- End-to-end support snapshot: [implementation status](?p=compiler/implementation-status)\n- Notes: PLAN.md\n- Relevant fixtures: useful and [implementation status](?p=compiler/implementation-status)\nimplemented for the current front-end + native backend subset.\nSee [runtime](?p=std/runtime), [start](?p=start) and [`silk(1)`](?p=man/silk.1), [`std::io(3)`](?p=std/io).\nSee [runtime](?p=std/runtime), docs/std/foo.md, [mutability](?p=language/mutability).\n[start](?p=start) wiki/wiki/?p=start\ndocs links [start](?p=start) ?p=man/my-app.7 docs/std/foo-bar.md\n## Silk Proposal Process (TC39-Inspired)\nRemove proposal.\n## Exported API\nchecker.checkModuleSetWithImports\nCLI output: `silk` CLI and [`silk(1)`](?p=man/silk.1) — Silk Language Compiler (`silk --version`)\n## Considerations\nbaseline stdlib wrapper current implementation.\n\n## Design goals\nKeep design notes.\n" + }, + { + "rel": "std/sample.md", + "path": "/fixture/std/sample.md", + "kind": "docs", + "input": "```silk\n// Works today: {{ literal }} \nlet n = 1;\n```\n", + "expected": "```silk\n// Works today: {{ literal }} \nlet n = 1;\n```\n" + }, + { + "rel": "std/sample.md", + "path": "/fixture/std/sample.md", + "kind": "docs", + "input": " ~~~~silk\nStatus: **private**.\n~~~\n ~~~~~\n", + "expected": " ~~~~silk\nStatus: **private**.\n~~~\n ~~~~~\n" + }, + { + "rel": "std/sample.md", + "path": "/fixture/std/sample.md", + "kind": "docs", + "input": "````md\n```silk\nthis repository\n```\n````\n", + "expected": "````md\n```silk\nthis repository\n```\n````\n" + }, + { + "rel": "std/sample.md", + "path": "/fixture/std/sample.md", + "kind": "docs", + "input": "```silk\n// Works today: unclosed ", + "expected": "```silk\n// Works today: unclosed " + }, + { + "rel": "std/sample.md", + "path": "/fixture/std/sample.md", + "kind": "docs", + "input": " ```silk\nWorks today: indented\n ```\n", + "expected": " ```silk\nCurrent subset: indented\n ```\n" + }, + { + "rel": "std/sample.md", + "path": "/fixture/std/sample.md", + "kind": "docs", + "input": "```invalid`info\nWorks today: not a fence\n```\n", + "expected": "```invalid`info\nCurrent subset: not a fence\n```\n" + }, + { + "rel": "language/flow-for.md", + "path": "/fixture/language/flow-for.md", + "kind": "docs", + "input": "# Reference (Current)\n\nStatus: **Partially implemented**. The repository has current supported contexts.\nWorks today: prose\n## Syntax (Selected)\n## Examples (Works today): sample\n## Works today: another\n## What works today (native)\nexamples labeled “Works today”\nexport const region global_arena; const region arena; with arena; from arena; arena[0]; `arena`; `global_arena`\n## Implementation Status\nImplementation status (native): in progress\nInitial Implemented Subset; current compiler subset; active expansion; Partially implemented\nStatus and Future Work\n## Notes and Limitations\n## Current API (native)\n## Design Goals\nKeep design notes.\n## Tests\nRemove test prose.\n### Nested tests\nAlso removed.\n## Arenas\nRemoved arena prose.\n## Surface Syntax\nThe repository, the repository, This repository, this repository.\n`this repository` repo dependency workflow; what works today.\n`STATUS.md` (implementation status) (tracked in `PLAN.md`)\n- End-to-end support snapshot: `STATUS.md`\n- Implemented-subset notes: PLAN.md\n- Relevant fixtures: useful and `STATUS.md`\nStatus: implemented for the current front-end + native backend subset.\nSee `?p=std/runtime`, ?p=docs/language/README and `silk` (1), `std::io` (3).\nSee [docs/std/runtime-event-loop.md](old), docs/std/foo.md, `docs/language/mutability.md`.\nhttps://oro.computer/silk/docs/?p=docs/start https://oro.computer/silk/wiki/?p=wiki/start\n`?p=...` docs/usage/tutorials/README.md ?p=man/my-app.7 docs/std/foo-bar.md\n## Silk Proposal Process (TC39-Inspired)\nRemove proposal.\n## Exported API\nchecker.checkModuleSetWithImports\nCLI output: `silk` CLI and `silk` (1) — Silk Language Compiler (`silk --version`)\n## Current Scope\nMVP initial std wrapper current snapshot.\n", + "expected": "# Reference\n\nThe Silk compiler repository has supported contexts.\nSupported forms: prose\n## Syntax\n## Examples: sample\n## Example: another\n## Supported forms\nexamples labeled “Example”\nexport const region global_region_buf; const region region_buf; with region_buf; from region_buf; region_buf[0]; `region_buf`; `global_region_buf`\n## Notes\navailable\nInitial Supported forms; current implementation; current module surface; Implemented\nStatus and Future Work\n## Considerations\n## Exported API\n## Model\nKeep design notes.\n## Surface Syntax\nThe Silk compiler repository, the Silk compiler repository, The Silk compiler repository, the Silk compiler repository.\n`this repository` Silk compiler repository’s vendored dependency workflow; current implementation notes.\n[implementation status](?p=compiler/implementation-status)\n- End-to-end support snapshot: [implementation status](?p=compiler/implementation-status)\n- Notes: PLAN.md\n- Relevant fixtures: useful and [implementation status](?p=compiler/implementation-status)\nimplemented for the current front-end + native backend subset.\nSee [runtime](?p=std/runtime), [start](?p=start) and [`silk(1)`](?p=man/silk.1), [`std::io(3)`](?p=std/io).\nSee [runtime](?p=std/runtime), docs/std/foo.md, [mutability](?p=language/mutability).\n[start](?p=start) wiki/wiki/?p=start\ndocs links [start](?p=start) ?p=man/my-app.7 docs/std/foo-bar.md\n## Silk Proposal Process (TC39-Inspired)\nRemove proposal.\n## Exported API\nchecker.checkModuleSetWithImports\nCLI output: `silk` CLI and [`silk(1)`](?p=man/silk.1) — Silk Language Compiler (`silk --version`)\n## Current Scope\nMVP initial std wrapper current snapshot.\n" + }, + { + "rel": "language/flow-for.md", + "path": "/fixture/language/flow-for.md", + "kind": "docs", + "input": "# Built-In Dependencies\n\n# Reference (Current)\n\nStatus: **Partially implemented**. The repository has current supported contexts.\nWorks today: prose\n## Syntax (Selected)\n## Examples (Works today): sample\n## Works today: another\n## What works today (native)\nexamples labeled “Works today”\nexport const region global_arena; const region arena; with arena; from arena; arena[0]; `arena`; `global_arena`\n## Implementation Status\nImplementation status (native): in progress\nInitial Implemented Subset; current compiler subset; active expansion; Partially implemented\nStatus and Future Work\n## Notes and Limitations\n## Current API (native)\n## Design Goals\nKeep design notes.\n## Tests\nRemove test prose.\n### Nested tests\nAlso removed.\n## Arenas\nRemoved arena prose.\n## Surface Syntax\nThe repository, the repository, This repository, this repository.\n`this repository` repo dependency workflow; what works today.\n`STATUS.md` (implementation status) (tracked in `PLAN.md`)\n- End-to-end support snapshot: `STATUS.md`\n- Implemented-subset notes: PLAN.md\n- Relevant fixtures: useful and `STATUS.md`\nStatus: implemented for the current front-end + native backend subset.\nSee `?p=std/runtime`, ?p=docs/language/README and `silk` (1), `std::io` (3).\nSee [docs/std/runtime-event-loop.md](old), docs/std/foo.md, `docs/language/mutability.md`.\nhttps://oro.computer/silk/docs/?p=docs/start https://oro.computer/silk/wiki/?p=wiki/start\n`?p=...` docs/usage/tutorials/README.md ?p=man/my-app.7 docs/std/foo-bar.md\n## Silk Proposal Process (TC39-Inspired)\nRemove proposal.\n## Exported API\nchecker.checkModuleSetWithImports\nCLI output: `silk` CLI and `silk` (1) — Silk Language Compiler (`silk --version`)\n## Current Scope\nMVP initial std wrapper current snapshot.\n", + "expected": "# Built-In Dependencies\n\n# Reference\n\nThe Silk compiler repository has supported contexts.\nSupported forms: prose\n## Syntax\n## Examples: sample\n## Example: another\n## Supported forms\nexamples labeled “Example”\nexport const region global_region_buf; const region region_buf; with region_buf; from region_buf; region_buf[0]; `region_buf`; `global_region_buf`\n## Notes\navailable\nInitial Supported forms; current implementation; current module surface; Implemented\nStatus and Future Work\n## Considerations\n## Exported API\n## Model\nKeep design notes.\n## Surface Syntax\nThe Silk compiler repository, the Silk compiler repository, The Silk compiler repository, the Silk compiler repository.\n`this repository` Silk compiler repository’s vendored dependency workflow; current implementation notes.\n[implementation status](?p=compiler/implementation-status)\n- End-to-end support snapshot: [implementation status](?p=compiler/implementation-status)\n- Notes: PLAN.md\n- Relevant fixtures: useful and [implementation status](?p=compiler/implementation-status)\nimplemented for the current front-end + native backend subset.\nSee [runtime](?p=std/runtime), [start](?p=start) and [`silk(1)`](?p=man/silk.1), [`std::io(3)`](?p=std/io).\nSee [runtime](?p=std/runtime), docs/std/foo.md, [mutability](?p=language/mutability).\n[start](?p=start) wiki/wiki/?p=start\ndocs links [start](?p=start) ?p=man/my-app.7 docs/std/foo-bar.md\n## Silk Proposal Process (TC39-Inspired)\nRemove proposal.\n## Exported API\nchecker.checkModuleSetWithImports\nCLI output: `silk` CLI and [`silk(1)`](?p=man/silk.1) — Silk Language Compiler (`silk --version`)\n## Current Scope\nMVP initial std wrapper current snapshot.\n" + }, + { + "rel": "language/flow-for.md", + "path": "/fixture/language/flow-for.md", + "kind": "docs", + "input": "```silk\n// Works today: {{ literal }} \nlet n = 1;\n```\n", + "expected": "```silk\n// Works today: {{ literal }} \nlet n = 1;\n```\n" + }, + { + "rel": "language/flow-for.md", + "path": "/fixture/language/flow-for.md", + "kind": "docs", + "input": " ~~~~silk\nStatus: **private**.\n~~~\n ~~~~~\n", + "expected": " ~~~~silk\nStatus: **private**.\n~~~\n ~~~~~\n" + }, + { + "rel": "language/flow-for.md", + "path": "/fixture/language/flow-for.md", + "kind": "docs", + "input": "````md\n```silk\nthis repository\n```\n````\n", + "expected": "````md\n```silk\nthis repository\n```\n````\n" + }, + { + "rel": "language/flow-for.md", + "path": "/fixture/language/flow-for.md", + "kind": "docs", + "input": "```silk\n// Works today: unclosed ", + "expected": "```silk\n// Works today: unclosed " + }, + { + "rel": "language/flow-for.md", + "path": "/fixture/language/flow-for.md", + "kind": "docs", + "input": " ```silk\nWorks today: indented\n ```\n", + "expected": " ```silk\nCurrent subset: indented\n ```\n" + }, + { + "rel": "language/flow-for.md", + "path": "/fixture/language/flow-for.md", + "kind": "docs", + "input": "```invalid`info\nWorks today: not a fence\n```\n", + "expected": "```invalid`info\nCurrent subset: not a fence\n```\n" + }, + { + "rel": "spec/2026.md", + "path": "/fixture/spec/2026.md", + "kind": "docs", + "input": "# Reference (Current)\n\nStatus: **Partially implemented**. The repository has current supported contexts.\nWorks today: prose\n## Syntax (Selected)\n## Examples (Works today): sample\n## Works today: another\n## What works today (native)\nexamples labeled “Works today”\nexport const region global_arena; const region arena; with arena; from arena; arena[0]; `arena`; `global_arena`\n## Implementation Status\nImplementation status (native): in progress\nInitial Implemented Subset; current compiler subset; active expansion; Partially implemented\nStatus and Future Work\n## Notes and Limitations\n## Current API (native)\n## Design Goals\nKeep design notes.\n## Tests\nRemove test prose.\n### Nested tests\nAlso removed.\n## Arenas\nRemoved arena prose.\n## Surface Syntax\nThe repository, the repository, This repository, this repository.\n`this repository` repo dependency workflow; what works today.\n`STATUS.md` (implementation status) (tracked in `PLAN.md`)\n- End-to-end support snapshot: `STATUS.md`\n- Implemented-subset notes: PLAN.md\n- Relevant fixtures: useful and `STATUS.md`\nStatus: implemented for the current front-end + native backend subset.\nSee `?p=std/runtime`, ?p=docs/language/README and `silk` (1), `std::io` (3).\nSee [docs/std/runtime-event-loop.md](old), docs/std/foo.md, `docs/language/mutability.md`.\nhttps://oro.computer/silk/docs/?p=docs/start https://oro.computer/silk/wiki/?p=wiki/start\n`?p=...` docs/usage/tutorials/README.md ?p=man/my-app.7 docs/std/foo-bar.md\n## Silk Proposal Process (TC39-Inspired)\nRemove proposal.\n## Exported API\nchecker.checkModuleSetWithImports\nCLI output: `silk` CLI and `silk` (1) — Silk Language Compiler (`silk --version`)\n## Current Scope\nMVP initial std wrapper current snapshot.\n", + "expected": "# Reference\n\nThe Silk compiler repository has supported contexts.\nSupported forms: prose\n## Syntax\n## Examples: sample\n## Example: another\n## Supported forms\nexamples labeled “Example”\nexport const region global_region_buf; const region region_buf; with region_buf; from region_buf; region_buf[0]; `region_buf`; `global_region_buf`\n## Notes\navailable\nInitial Supported forms; current implementation; current module surface; Implemented\nStatus and Future Work\n## Considerations\n## Exported API\n## Design Goals\nKeep design notes.\n## Surface Syntax\nThe Silk compiler repository, the Silk compiler repository, The Silk compiler repository, the Silk compiler repository.\n`this repository` Silk compiler repository’s vendored dependency workflow; current implementation notes.\n[implementation status](?p=compiler/implementation-status)\n- End-to-end support snapshot: [implementation status](?p=compiler/implementation-status)\n- Notes: PLAN.md\n- Relevant fixtures: useful and [implementation status](?p=compiler/implementation-status)\nimplemented for the current front-end + native backend subset.\nSee [runtime](?p=std/runtime), [start](?p=start) and [`silk(1)`](?p=man/silk.1), [`std::io(3)`](?p=std/io).\nSee [runtime](?p=std/runtime), docs/std/foo.md, [mutability](?p=language/mutability).\n[start](?p=start) wiki/wiki/?p=start\ndocs links [start](?p=start) ?p=man/my-app.7 docs/std/foo-bar.md\n## Exported API\nthe module-set import helper\nCLI output: the `silk` CLI and [`silk(1)`](?p=man/silk.1) (`silk --version`)\n## Current Scope\nMVP initial std wrapper current snapshot.\n" + }, + { + "rel": "spec/2026.md", + "path": "/fixture/spec/2026.md", + "kind": "docs", + "input": "# Built-In Dependencies\n\n# Reference (Current)\n\nStatus: **Partially implemented**. The repository has current supported contexts.\nWorks today: prose\n## Syntax (Selected)\n## Examples (Works today): sample\n## Works today: another\n## What works today (native)\nexamples labeled “Works today”\nexport const region global_arena; const region arena; with arena; from arena; arena[0]; `arena`; `global_arena`\n## Implementation Status\nImplementation status (native): in progress\nInitial Implemented Subset; current compiler subset; active expansion; Partially implemented\nStatus and Future Work\n## Notes and Limitations\n## Current API (native)\n## Design Goals\nKeep design notes.\n## Tests\nRemove test prose.\n### Nested tests\nAlso removed.\n## Arenas\nRemoved arena prose.\n## Surface Syntax\nThe repository, the repository, This repository, this repository.\n`this repository` repo dependency workflow; what works today.\n`STATUS.md` (implementation status) (tracked in `PLAN.md`)\n- End-to-end support snapshot: `STATUS.md`\n- Implemented-subset notes: PLAN.md\n- Relevant fixtures: useful and `STATUS.md`\nStatus: implemented for the current front-end + native backend subset.\nSee `?p=std/runtime`, ?p=docs/language/README and `silk` (1), `std::io` (3).\nSee [docs/std/runtime-event-loop.md](old), docs/std/foo.md, `docs/language/mutability.md`.\nhttps://oro.computer/silk/docs/?p=docs/start https://oro.computer/silk/wiki/?p=wiki/start\n`?p=...` docs/usage/tutorials/README.md ?p=man/my-app.7 docs/std/foo-bar.md\n## Silk Proposal Process (TC39-Inspired)\nRemove proposal.\n## Exported API\nchecker.checkModuleSetWithImports\nCLI output: `silk` CLI and `silk` (1) — Silk Language Compiler (`silk --version`)\n## Current Scope\nMVP initial std wrapper current snapshot.\n", + "expected": "# Built-In Dependencies\n\n# Reference\n\nThe Silk compiler repository has supported contexts.\nSupported forms: prose\n## Syntax\n## Examples: sample\n## Example: another\n## Supported forms\nexamples labeled “Example”\nexport const region global_region_buf; const region region_buf; with region_buf; from region_buf; region_buf[0]; `region_buf`; `global_region_buf`\n## Notes\navailable\nInitial Supported forms; current implementation; current module surface; Implemented\nStatus and Future Work\n## Considerations\n## Exported API\n## Design Goals\nKeep design notes.\n## Surface Syntax\nThe Silk compiler repository, the Silk compiler repository, The Silk compiler repository, the Silk compiler repository.\n`this repository` Silk compiler repository’s vendored dependency workflow; current implementation notes.\n[implementation status](?p=compiler/implementation-status)\n- End-to-end support snapshot: [implementation status](?p=compiler/implementation-status)\n- Notes: PLAN.md\n- Relevant fixtures: useful and [implementation status](?p=compiler/implementation-status)\nimplemented for the current front-end + native backend subset.\nSee [runtime](?p=std/runtime), [start](?p=start) and [`silk(1)`](?p=man/silk.1), [`std::io(3)`](?p=std/io).\nSee [runtime](?p=std/runtime), docs/std/foo.md, [mutability](?p=language/mutability).\n[start](?p=start) wiki/wiki/?p=start\ndocs links [start](?p=start) ?p=man/my-app.7 docs/std/foo-bar.md\n## Exported API\nthe module-set import helper\nCLI output: the `silk` CLI and [`silk(1)`](?p=man/silk.1) (`silk --version`)\n## Current Scope\nMVP initial std wrapper current snapshot.\n" + }, + { + "rel": "spec/2026.md", + "path": "/fixture/spec/2026.md", + "kind": "docs", + "input": "```silk\n// Works today: {{ literal }} \nlet n = 1;\n```\n", + "expected": "```silk\n// Works today: {{ literal }} \nlet n = 1;\n```\n" + }, + { + "rel": "spec/2026.md", + "path": "/fixture/spec/2026.md", + "kind": "docs", + "input": " ~~~~silk\nStatus: **private**.\n~~~\n ~~~~~\n", + "expected": " ~~~~silk\nStatus: **private**.\n~~~\n ~~~~~\n" + }, + { + "rel": "spec/2026.md", + "path": "/fixture/spec/2026.md", + "kind": "docs", + "input": "````md\n```silk\nthis repository\n```\n````\n", + "expected": "````md\n```silk\nthis repository\n```\n````\n" + }, + { + "rel": "spec/2026.md", + "path": "/fixture/spec/2026.md", + "kind": "docs", + "input": "```silk\n// Works today: unclosed ", + "expected": "```silk\n// Works today: unclosed " + }, + { + "rel": "spec/2026.md", + "path": "/fixture/spec/2026.md", + "kind": "docs", + "input": " ```silk\nWorks today: indented\n ```\n", + "expected": " ```silk\nCurrent subset: indented\n ```\n" + }, + { + "rel": "spec/2026.md", + "path": "/fixture/spec/2026.md", + "kind": "docs", + "input": "```invalid`info\nWorks today: not a fence\n```\n", + "expected": "```invalid`info\nCurrent subset: not a fence\n```\n" + }, + { + "rel": "compiler/vendored-deps.md", + "path": "/fixture/compiler/vendored-deps.md", + "kind": "docs", + "input": "# Reference (Current)\n\nStatus: **Partially implemented**. The repository has current supported contexts.\nWorks today: prose\n## Syntax (Selected)\n## Examples (Works today): sample\n## Works today: another\n## What works today (native)\nexamples labeled “Works today”\nexport const region global_arena; const region arena; with arena; from arena; arena[0]; `arena`; `global_arena`\n## Implementation Status\nImplementation status (native): in progress\nInitial Implemented Subset; current compiler subset; active expansion; Partially implemented\nStatus and Future Work\n## Notes and Limitations\n## Current API (native)\n## Design Goals\nKeep design notes.\n## Tests\nRemove test prose.\n### Nested tests\nAlso removed.\n## Arenas\nRemoved arena prose.\n## Surface Syntax\nThe repository, the repository, This repository, this repository.\n`this repository` repo dependency workflow; what works today.\n`STATUS.md` (implementation status) (tracked in `PLAN.md`)\n- End-to-end support snapshot: `STATUS.md`\n- Implemented-subset notes: PLAN.md\n- Relevant fixtures: useful and `STATUS.md`\nStatus: implemented for the current front-end + native backend subset.\nSee `?p=std/runtime`, ?p=docs/language/README and `silk` (1), `std::io` (3).\nSee [docs/std/runtime-event-loop.md](old), docs/std/foo.md, `docs/language/mutability.md`.\nhttps://oro.computer/silk/docs/?p=docs/start https://oro.computer/silk/wiki/?p=wiki/start\n`?p=...` docs/usage/tutorials/README.md ?p=man/my-app.7 docs/std/foo-bar.md\n## Silk Proposal Process (TC39-Inspired)\nRemove proposal.\n## Exported API\nchecker.checkModuleSetWithImports\nCLI output: `silk` CLI and `silk` (1) — Silk Language Compiler (`silk --version`)\n## Current Scope\nMVP initial std wrapper current snapshot.\n", + "expected": "# Reference\n\nThe Silk compiler repository has supported contexts.\nSupported forms: prose\n## Syntax\n## Examples: sample\n## Example: another\n## Supported forms\nexamples labeled “Example”\nexport const region global_region_buf; const region region_buf; with region_buf; from region_buf; region_buf[0]; `region_buf`; `global_region_buf`\n## Notes\navailable\nInitial Supported forms; current implementation; current module surface; Implemented\nStatus and Future Work\n## Considerations\n## Exported API\n## Design Goals\nKeep design notes.\n## Surface Syntax\nThe Silk compiler repository, the Silk compiler repository, The Silk compiler repository, the Silk compiler repository.\n`this repository` Silk compiler repository’s vendored dependency workflow; current implementation notes.\n[implementation status](?p=compiler/implementation-status)\n- End-to-end support snapshot: [implementation status](?p=compiler/implementation-status)\n- Notes: PLAN.md\n- Relevant fixtures: useful and [implementation status](?p=compiler/implementation-status)\nimplemented for the current front-end + native backend subset.\nSee [runtime](?p=std/runtime), [start](?p=start) and [`silk(1)`](?p=man/silk.1), [`std::io(3)`](?p=std/io).\nSee [runtime](?p=std/runtime), docs/std/foo.md, [mutability](?p=language/mutability).\n[start](?p=start) wiki/wiki/?p=start\ndocs links [start](?p=start) ?p=man/my-app.7 docs/std/foo-bar.md\n## Silk Proposal Process (TC39-Inspired)\nRemove proposal.\n## Exported API\nchecker.checkModuleSetWithImports\nCLI output: `silk` CLI and [`silk(1)`](?p=man/silk.1) — Silk Language Compiler (`silk --version`)\n## Current Scope\nMVP initial std wrapper current snapshot.\n" + }, + { + "rel": "compiler/vendored-deps.md", + "path": "/fixture/compiler/vendored-deps.md", + "kind": "docs", + "input": "# Built-In Dependencies\n\n# Reference (Current)\n\nStatus: **Partially implemented**. The repository has current supported contexts.\nWorks today: prose\n## Syntax (Selected)\n## Examples (Works today): sample\n## Works today: another\n## What works today (native)\nexamples labeled “Works today”\nexport const region global_arena; const region arena; with arena; from arena; arena[0]; `arena`; `global_arena`\n## Implementation Status\nImplementation status (native): in progress\nInitial Implemented Subset; current compiler subset; active expansion; Partially implemented\nStatus and Future Work\n## Notes and Limitations\n## Current API (native)\n## Design Goals\nKeep design notes.\n## Tests\nRemove test prose.\n### Nested tests\nAlso removed.\n## Arenas\nRemoved arena prose.\n## Surface Syntax\nThe repository, the repository, This repository, this repository.\n`this repository` repo dependency workflow; what works today.\n`STATUS.md` (implementation status) (tracked in `PLAN.md`)\n- End-to-end support snapshot: `STATUS.md`\n- Implemented-subset notes: PLAN.md\n- Relevant fixtures: useful and `STATUS.md`\nStatus: implemented for the current front-end + native backend subset.\nSee `?p=std/runtime`, ?p=docs/language/README and `silk` (1), `std::io` (3).\nSee [docs/std/runtime-event-loop.md](old), docs/std/foo.md, `docs/language/mutability.md`.\nhttps://oro.computer/silk/docs/?p=docs/start https://oro.computer/silk/wiki/?p=wiki/start\n`?p=...` docs/usage/tutorials/README.md ?p=man/my-app.7 docs/std/foo-bar.md\n## Silk Proposal Process (TC39-Inspired)\nRemove proposal.\n## Exported API\nchecker.checkModuleSetWithImports\nCLI output: `silk` CLI and `silk` (1) — Silk Language Compiler (`silk --version`)\n## Current Scope\nMVP initial std wrapper current snapshot.\n", + "expected": "# Built-In Dependencies (Legacy Link)\n\n# Reference\n\nThe Silk compiler repository has supported contexts.\nSupported forms: prose\n## Syntax\n## Examples: sample\n## Example: another\n## Supported forms\nexamples labeled “Example”\nexport const region global_region_buf; const region region_buf; with region_buf; from region_buf; region_buf[0]; `region_buf`; `global_region_buf`\n## Notes\navailable\nInitial Supported forms; current implementation; current module surface; Implemented\nStatus and Future Work\n## Considerations\n## Exported API\n## Design Goals\nKeep design notes.\n## Surface Syntax\nThe Silk compiler repository, the Silk compiler repository, The Silk compiler repository, the Silk compiler repository.\n`this repository` Silk compiler repository’s vendored dependency workflow; current implementation notes.\n[implementation status](?p=compiler/implementation-status)\n- End-to-end support snapshot: [implementation status](?p=compiler/implementation-status)\n- Notes: PLAN.md\n- Relevant fixtures: useful and [implementation status](?p=compiler/implementation-status)\nimplemented for the current front-end + native backend subset.\nSee [runtime](?p=std/runtime), [start](?p=start) and [`silk(1)`](?p=man/silk.1), [`std::io(3)`](?p=std/io).\nSee [runtime](?p=std/runtime), docs/std/foo.md, [mutability](?p=language/mutability).\n[start](?p=start) wiki/wiki/?p=start\ndocs links [start](?p=start) ?p=man/my-app.7 docs/std/foo-bar.md\n## Silk Proposal Process (TC39-Inspired)\nRemove proposal.\n## Exported API\nchecker.checkModuleSetWithImports\nCLI output: `silk` CLI and [`silk(1)`](?p=man/silk.1) — Silk Language Compiler (`silk --version`)\n## Current Scope\nMVP initial std wrapper current snapshot.\n" + }, + { + "rel": "compiler/vendored-deps.md", + "path": "/fixture/compiler/vendored-deps.md", + "kind": "docs", + "input": "```silk\n// Works today: {{ literal }} \nlet n = 1;\n```\n", + "expected": "```silk\n// Works today: {{ literal }} \nlet n = 1;\n```\n" + }, + { + "rel": "compiler/vendored-deps.md", + "path": "/fixture/compiler/vendored-deps.md", + "kind": "docs", + "input": " ~~~~silk\nStatus: **private**.\n~~~\n ~~~~~\n", + "expected": " ~~~~silk\nStatus: **private**.\n~~~\n ~~~~~\n" + }, + { + "rel": "compiler/vendored-deps.md", + "path": "/fixture/compiler/vendored-deps.md", + "kind": "docs", + "input": "````md\n```silk\nthis repository\n```\n````\n", + "expected": "````md\n```silk\nthis repository\n```\n````\n" + }, + { + "rel": "compiler/vendored-deps.md", + "path": "/fixture/compiler/vendored-deps.md", + "kind": "docs", + "input": "```silk\n// Works today: unclosed ", + "expected": "```silk\n// Works today: unclosed " + }, + { + "rel": "compiler/vendored-deps.md", + "path": "/fixture/compiler/vendored-deps.md", + "kind": "docs", + "input": " ```silk\nWorks today: indented\n ```\n", + "expected": " ```silk\nCurrent subset: indented\n ```\n" + }, + { + "rel": "compiler/vendored-deps.md", + "path": "/fixture/compiler/vendored-deps.md", + "kind": "docs", + "input": "```invalid`info\nWorks today: not a fence\n```\n", + "expected": "```invalid`info\nCurrent subset: not a fence\n```\n" + }, + { + "rel": "wiki/reference.md", + "path": "/fixture/wiki/reference.md", + "kind": "wiki", + "input": "# Reference (Current)\n\nStatus: **Partially implemented**. The repository has current supported contexts.\nWorks today: prose\n## Syntax (Selected)\n## Examples (Works today): sample\n## Works today: another\n## What works today (native)\nexamples labeled “Works today”\nexport const region global_arena; const region arena; with arena; from arena; arena[0]; `arena`; `global_arena`\n## Implementation Status\nImplementation status (native): in progress\nInitial Implemented Subset; current compiler subset; active expansion; Partially implemented\nStatus and Future Work\n## Notes and Limitations\n## Current API (native)\n## Design Goals\nKeep design notes.\n## Tests\nRemove test prose.\n### Nested tests\nAlso removed.\n## Arenas\nRemoved arena prose.\n## Surface Syntax\nThe repository, the repository, This repository, this repository.\n`this repository` repo dependency workflow; what works today.\n`STATUS.md` (implementation status) (tracked in `PLAN.md`)\n- End-to-end support snapshot: `STATUS.md`\n- Implemented-subset notes: PLAN.md\n- Relevant fixtures: useful and `STATUS.md`\nStatus: implemented for the current front-end + native backend subset.\nSee `?p=std/runtime`, ?p=docs/language/README and `silk` (1), `std::io` (3).\nSee [docs/std/runtime-event-loop.md](old), docs/std/foo.md, `docs/language/mutability.md`.\nhttps://oro.computer/silk/docs/?p=docs/start https://oro.computer/silk/wiki/?p=wiki/start\n`?p=...` docs/usage/tutorials/README.md ?p=man/my-app.7 docs/std/foo-bar.md\n## Silk Proposal Process (TC39-Inspired)\nRemove proposal.\n## Exported API\nchecker.checkModuleSetWithImports\nCLI output: `silk` CLI and `silk` (1) — Silk Language Compiler (`silk --version`)\n## Current Scope\nMVP initial std wrapper current snapshot.\n", + "expected": "# Reference\n\nThe repository has supported contexts.\nSupported forms: prose\n## Syntax\n## Examples: sample\n## Example: another\n## Supported forms\nexamples labeled “Example”\nexport const region global_region_buf; const region region_buf; with region_buf; from region_buf; region_buf[0]; `region_buf`; `global_region_buf`\n## Notes\navailable\nInitial Supported forms; current implementation; current module surface; Implemented\nStatus and Future Work\n## Considerations\n## Exported API\n## Design Goals\nKeep design notes.\n## Tests\nRemove test prose.\n### Nested tests\nAlso removed.\n## Arenas\nRemoved arena prose.\n## Surface Syntax\nThe repository, the repository, This repository, this repository.\n`this repository` repo dependency workflow; what works today.\n (implementation status) (tracked in )\n- Fixtures: useful\nImplemented in the reference compiler (front-end + native backend subset).\nSee [runtime](?p=std/runtime), [start](?p=start) and [`silk(1)`](?p=man/silk.1), [`std::io(3)`](?p=std/io).\nSee [runtime](?p=std/runtime), docs/std/foo.md, [mutability](?p=language/mutability).\n[start](?p=start) wiki/wiki/?p=start\ndocs links [start](?p=start) ?p=man/my-app.7 docs/std/foo-bar.md\n## Silk Proposal Process (TC39-Inspired)\nRemove proposal.\n## Exported API\nchecker.checkModuleSetWithImports\nCLI output: `silk` CLI and [`silk(1)`](?p=man/silk.1) — Silk Language Compiler (`silk --version`)\n## Current Scope\nMVP initial std wrapper current snapshot.\n" + }, + { + "rel": "wiki/reference.md", + "path": "/fixture/wiki/reference.md", + "kind": "wiki", + "input": "# Built-In Dependencies\n\n# Reference (Current)\n\nStatus: **Partially implemented**. The repository has current supported contexts.\nWorks today: prose\n## Syntax (Selected)\n## Examples (Works today): sample\n## Works today: another\n## What works today (native)\nexamples labeled “Works today”\nexport const region global_arena; const region arena; with arena; from arena; arena[0]; `arena`; `global_arena`\n## Implementation Status\nImplementation status (native): in progress\nInitial Implemented Subset; current compiler subset; active expansion; Partially implemented\nStatus and Future Work\n## Notes and Limitations\n## Current API (native)\n## Design Goals\nKeep design notes.\n## Tests\nRemove test prose.\n### Nested tests\nAlso removed.\n## Arenas\nRemoved arena prose.\n## Surface Syntax\nThe repository, the repository, This repository, this repository.\n`this repository` repo dependency workflow; what works today.\n`STATUS.md` (implementation status) (tracked in `PLAN.md`)\n- End-to-end support snapshot: `STATUS.md`\n- Implemented-subset notes: PLAN.md\n- Relevant fixtures: useful and `STATUS.md`\nStatus: implemented for the current front-end + native backend subset.\nSee `?p=std/runtime`, ?p=docs/language/README and `silk` (1), `std::io` (3).\nSee [docs/std/runtime-event-loop.md](old), docs/std/foo.md, `docs/language/mutability.md`.\nhttps://oro.computer/silk/docs/?p=docs/start https://oro.computer/silk/wiki/?p=wiki/start\n`?p=...` docs/usage/tutorials/README.md ?p=man/my-app.7 docs/std/foo-bar.md\n## Silk Proposal Process (TC39-Inspired)\nRemove proposal.\n## Exported API\nchecker.checkModuleSetWithImports\nCLI output: `silk` CLI and `silk` (1) — Silk Language Compiler (`silk --version`)\n## Current Scope\nMVP initial std wrapper current snapshot.\n", + "expected": "# Built-In Dependencies\n\n# Reference\n\nThe repository has supported contexts.\nSupported forms: prose\n## Syntax\n## Examples: sample\n## Example: another\n## Supported forms\nexamples labeled “Example”\nexport const region global_region_buf; const region region_buf; with region_buf; from region_buf; region_buf[0]; `region_buf`; `global_region_buf`\n## Notes\navailable\nInitial Supported forms; current implementation; current module surface; Implemented\nStatus and Future Work\n## Considerations\n## Exported API\n## Design Goals\nKeep design notes.\n## Tests\nRemove test prose.\n### Nested tests\nAlso removed.\n## Arenas\nRemoved arena prose.\n## Surface Syntax\nThe repository, the repository, This repository, this repository.\n`this repository` repo dependency workflow; what works today.\n (implementation status) (tracked in )\n- Fixtures: useful\nImplemented in the reference compiler (front-end + native backend subset).\nSee [runtime](?p=std/runtime), [start](?p=start) and [`silk(1)`](?p=man/silk.1), [`std::io(3)`](?p=std/io).\nSee [runtime](?p=std/runtime), docs/std/foo.md, [mutability](?p=language/mutability).\n[start](?p=start) wiki/wiki/?p=start\ndocs links [start](?p=start) ?p=man/my-app.7 docs/std/foo-bar.md\n## Silk Proposal Process (TC39-Inspired)\nRemove proposal.\n## Exported API\nchecker.checkModuleSetWithImports\nCLI output: `silk` CLI and [`silk(1)`](?p=man/silk.1) — Silk Language Compiler (`silk --version`)\n## Current Scope\nMVP initial std wrapper current snapshot.\n" + }, + { + "rel": "wiki/reference.md", + "path": "/fixture/wiki/reference.md", + "kind": "wiki", + "input": "```silk\n// Works today: {{ literal }} \nlet n = 1;\n```\n", + "expected": "```silk\n// Works today: {{ literal }} \nlet n = 1;\n```\n" + }, + { + "rel": "wiki/reference.md", + "path": "/fixture/wiki/reference.md", + "kind": "wiki", + "input": " ~~~~silk\nStatus: **private**.\n~~~\n ~~~~~\n", + "expected": " ~~~~silk\nStatus: **private**.\n~~~\n ~~~~~\n" + }, + { + "rel": "wiki/reference.md", + "path": "/fixture/wiki/reference.md", + "kind": "wiki", + "input": "````md\n```silk\nthis repository\n```\n````\n", + "expected": "````md\n```silk\nthis repository\n```\n````\n" + }, + { + "rel": "wiki/reference.md", + "path": "/fixture/wiki/reference.md", + "kind": "wiki", + "input": "```silk\n// Works today: unclosed ", + "expected": "```silk\n// Works today: unclosed " + }, + { + "rel": "wiki/reference.md", + "path": "/fixture/wiki/reference.md", + "kind": "wiki", + "input": " ```silk\nWorks today: indented\n ```\n", + "expected": " ```silk\nCurrent subset: indented\n ```\n" + }, + { + "rel": "wiki/reference.md", + "path": "/fixture/wiki/reference.md", + "kind": "wiki", + "input": "```invalid`info\nWorks today: not a fence\n```\n", + "expected": "```invalid`info\nCurrent subset: not a fence\n```\n" + } + ], + "runtimeFamilies": [ + "oro:asn1", + "oro:assert", + "oro:async", + "oro:async_hooks", + "oro:background", + "oro:buffer", + "oro:cdp", + "oro:child_process", + "oro:clipboard", + "oro:commonjs", + "oro:conduit", + "oro:console", + "oro:constants", + "oro:cookies", + "oro:crypto", + "oro:dbus", + "oro:dgram", + "oro:diagnostics", + "oro:did", + "oro:dns", + "oro:enumeration", + "oro:errno", + "oro:errors", + "oro:events", + "oro:extension", + "oro:fetch", + "oro:gc", + "oro:hci", + "oro:http", + "oro:https", + "oro:i18n", + "oro:ip", + "oro:ipc", + "oro:ipfs", + "oro:iroh", + "oro:language", + "oro:latica", + "oro:location", + "oro:mime", + "oro:module", + "oro:navigation", + "oro:net", + "oro:network", + "oro:npm", + "oro:os", + "oro:path", + "oro:process", + "oro:protocol-handlers", + "oro:querystring", + "oro:semver", + "oro:service-worker", + "oro:shared-worker", + "oro:signal", + "oro:sqlite", + "oro:stream", + "oro:string_decoder", + "oro:tar", + "oro:tcp", + "oro:test", + "oro:timers", + "oro:tls", + "oro:toml", + "oro:tty", + "oro:url", + "oro:usb", + "oro:util", + "oro:vm", + "oro:worker", + "oro:worker_threads", + "oro:xpc", + "oro:zlib" + ], + "runtimeSHA256": "3ec5ff0e83872239708f9132bfb596307e4ce8c83d5ed9a7fb9e2d292feaca8e", + "contentSHA256": "c6234bf674ec8696b31b0cf839743b625263b6050dca3f94c6b204c17a70b36c", + "curated": [ + { + "input": "# Curated\n\nKeep prose.\n", + "declarations": "declare module 'oro:application' {\n export function ping(): void;\n}\n", + "expected": "# Curated\n\nKeep prose.\n\n## API reference\n\n<!-- GENERATED: ORO_API_REFERENCE_START -->\n\n### Module specifiers\n\n```text\noro:application\n```\n\n### TypeScript declarations\n\nThese declarations are generated from the runtime's published TypeScript surface.\n\n#### `oro:application`\n\n```ts\ndeclare module 'oro:application' {\n export function ping(): void;\n}\n```\n\n<!-- GENERATED: ORO_API_REFERENCE_END -->\n\n## See also\n\n- [JavaScript APIs overview](?p=javascript/overview)\n- [All module specifiers](?p=javascript/all-modules)\n", + "secondExpected": "# Curated\n\nKeep prose.\n\n## API reference\n\n<!-- GENERATED: ORO_API_REFERENCE_START -->\n\n### Module specifiers\n\n```text\noro:application\n```\n\n### TypeScript declarations\n\nThese declarations are generated from the runtime's published TypeScript surface.\n\n#### `oro:application`\n\n```ts\ndeclare module 'oro:application' {\n export function ping(): void;\n}\n```\n\n<!-- GENERATED: ORO_API_REFERENCE_END -->\n## See also\n\n- [JavaScript APIs overview](?p=javascript/overview)\n- [All module specifiers](?p=javascript/all-modules)\n" + }, + { + "input": "# Curated\n\n## API reference\n\n<!-- GENERATED: ORO_API_REFERENCE_START -->\nOld API\n<!-- GENERATED: ORO_API_REFERENCE_END -->\n\nKeep footer.\n", + "declarations": "declare module 'oro:application' {\n export function ping(): void;\n}\n", + "expected": "# Curated\n\n## API reference\n\n<!-- GENERATED: ORO_API_REFERENCE_START -->\n\n### Module specifiers\n\n```text\noro:application\n```\n\n### TypeScript declarations\n\nThese declarations are generated from the runtime's published TypeScript surface.\n\n#### `oro:application`\n\n```ts\ndeclare module 'oro:application' {\n export function ping(): void;\n}\n```\n\n<!-- GENERATED: ORO_API_REFERENCE_END -->\nKeep footer.\n\n## See also\n\n- [JavaScript APIs overview](?p=javascript/overview)\n- [All module specifiers](?p=javascript/all-modules)\n", + "secondExpected": "# Curated\n\n## API reference\n\n<!-- GENERATED: ORO_API_REFERENCE_START -->\n\n### Module specifiers\n\n```text\noro:application\n```\n\n### TypeScript declarations\n\nThese declarations are generated from the runtime's published TypeScript surface.\n\n#### `oro:application`\n\n```ts\ndeclare module 'oro:application' {\n export function ping(): void;\n}\n```\n\n<!-- GENERATED: ORO_API_REFERENCE_END -->\nKeep footer.\n\n## See also\n\n- [JavaScript APIs overview](?p=javascript/overview)\n- [All module specifiers](?p=javascript/all-modules)\n" + }, + { + "input": "# Curated\n\n<!-- GENERATED: ORO_API_REFERENCE_START -->\nOld\n<!-- GENERATED: ORO_API_REFERENCE_END -->\n\n## See also\n\nKeep links.\n", + "declarations": "declare module 'oro:application' {\n export function ping(): void;\n}\n", + "expected": "# Curated\n\n## API reference\n\n<!-- GENERATED: ORO_API_REFERENCE_START -->\n\n### Module specifiers\n\n```text\noro:application\n```\n\n### TypeScript declarations\n\nThese declarations are generated from the runtime's published TypeScript surface.\n\n#### `oro:application`\n\n```ts\ndeclare module 'oro:application' {\n export function ping(): void;\n}\n```\n\n<!-- GENERATED: ORO_API_REFERENCE_END -->\n## See also\n\nKeep links.\n", + "secondExpected": "# Curated\n\n## API reference\n\n<!-- GENERATED: ORO_API_REFERENCE_START -->\n\n### Module specifiers\n\n```text\noro:application\n```\n\n### TypeScript declarations\n\nThese declarations are generated from the runtime's published TypeScript surface.\n\n#### `oro:application`\n\n```ts\ndeclare module 'oro:application' {\n export function ping(): void;\n}\n```\n\n<!-- GENERATED: ORO_API_REFERENCE_END -->\n## See also\n\nKeep links.\n" + } + ], + "tree": { + "source": { + "start.md": "upstream start", + "guides/custom.md": "upstream guide", + "language/new.md": "# New\n\nWorks today: prose\n", + "language/raw.txt": "raw\r\nbytes\u0000", + "wiki/reference.md": "wiki", + "STATUS.md": "private", + "ignored.bin": "ignored" + }, + "staged": { + "start.md": "authored start", + "guides/custom.md": "authored guide", + "language/removed.md": "removed", + "STATUS.md": "stale tracker", + "guides/PLAN.md": "excluded tracker", + "asset.svg": "not owned" + }, + "stats": { + "copied": 2, + "skipped": 4, + "deleted": 3 + }, + "expected": { + "asset.svg": "not owned", + "guides/custom.md": "authored guide", + "language/new.md": "# New\n\nSupported forms: prose\n", + "language/raw.txt": "raw\r\nbytes\u0000", + "start.md": "authored start" + } + } +} diff --git a/tests/ingestion-import.test.ts b/tests/ingestion-import.test.ts new file mode 100644 index 00000000..0ce58f0e --- /dev/null +++ b/tests/ingestion-import.test.ts @@ -0,0 +1,80 @@ +import { test } from 'node:test' +import assert from 'node:assert/strict' +import { mkdir, mkdtemp, readFile, rm, stat, writeFile } from 'node:fs/promises' +import { tmpdir } from 'node:os' +import { dirname, join } from 'node:path' +import { generateReference, REF_START, REF_END } from '../runtime/tools/generate-js-api-reference.ts' +import { syncFromSilkDocs } from '../silk/tools/sync-from-silk-docs.ts' +import { pageText, splitPage } from '../tools/import-public.ts' + +async function temporary(run: (site: string, upstream: string) => Promise<void>): Promise<void> { + const root = await mkdtemp(join(tmpdir(), 'oro-ingestion-import-test-')) + try { + const site = join(root, 'site'), upstream = join(root, 'upstream') + await mkdir(join(site, 'src'), { recursive: true }) + await mkdir(upstream) + await run(site, upstream) + } finally { await rm(root, { recursive: true, force: true }) } +} +async function put(path: string, body: string): Promise<void> { + await mkdir(dirname(path), { recursive: true }) + await writeFile(path, body) +} +async function page(site: string, route: string, collection: string, sourcePath: string, body: string): Promise<string> { + const path = join(site, 'src', route, 'page.md') + await put(path, pageText({ layout: `${collection}-docs`, title: 'Authored title', description: 'Authored description', docsCollection: collection, sourcePath, order: 7, section: 'authored', githubRepo: 'preserved/repository', githubRef: 'authored-ref' }, body)) + return path +} +test('Runtime generator uses the public importer, prunes excluded families, and retains curated metadata', async () => temporary(async (site, upstream) => { + const curated = await page(site, 'runtime/docs/javascript/application', 'runtime', 'javascript/application.md', '# Application\n\nAuthored introduction.\n\n' + REF_START + '\nOld API\n' + REF_END + '\n\nAuthored footer.\n') + const excluded = await page(site, 'runtime/docs/javascript/internal', 'runtime', 'javascript/internal.md', '# Internal\n') + const unrelated = await page(site, 'runtime/docs/guides/custom', 'runtime', 'guides/custom.md', '# Guide\n\nWorks today: authored {{ literal }}.\n') + const untouched = await readFile(unrelated, 'utf8') + await put(join(upstream, 'api/index.d.ts'), "declare module 'oro:application' {\n export function ping(): void;\n}\ndeclare module 'oro:assert' {\n export function ok(value: unknown): void;\n}\ndeclare module 'oro:internal' {\n export const privateAPI: true;\n}\n") + await generateReference(site, upstream) + const { metadata, body } = splitPage(await readFile(curated, 'utf8')) + assert.ok(body.includes('Authored introduction.')) + assert.ok(body.includes('Authored footer.')) + assert.ok(body.includes('ping()')) + assert.ok(!body.includes('Old API')) + assert.equal(metadata.order, 7) + assert.equal(metadata.githubRef, 'authored-ref') + assert.equal(metadata.section, 'authored') + assert.equal(await readFile(unrelated, 'utf8'), untouched) + await assert.rejects(stat(excluded), { code: 'ENOENT' }) + const generated = join(site, 'src/runtime/docs/javascript/assert/page.md') + const first = await readFile(generated, 'utf8') + assert.equal(splitPage(first).metadata.layout, 'runtime-docs') + await generateReference(site, upstream) + assert.equal(await readFile(generated, 'utf8'), first) +})) +test('Silk imports prune upstream-owned pages but retain authored pages and an absent upstream wiki', async () => temporary(async (site, upstream) => { + const landing = await page(site, 'silk/docs/start', 'silk', 'start.md', '# Silk\n\nWorks today: authored.\n') + const guide = await page(site, 'silk/docs/guides/custom', 'silk', 'guides/custom.md', '# Guide\n\nAuthored guide.\n') + const wiki = await page(site, 'silk/wiki/reference', 'silkWiki', 'reference.md', '# Wiki\n\nWorks today: preserve without upstream wiki.\n') + const removed = await page(site, 'silk/docs/language/removed', 'silk', 'language/removed.md', '# Removed\n') + const originals = await Promise.all([landing, guide, wiki].map(path => readFile(path, 'utf8'))) + await put(join(upstream, 'docs/start.md'), '# Upstream start\n') + await put(join(upstream, 'docs/guides/custom.md'), '# Upstream guide\n') + await put(join(upstream, 'docs/language/new.md'), '# New\n\nWorks today: prose\n\n```silk\n// Works today: {{ literal }} \n```\n') + await syncFromSilkDocs(site, upstream) + assert.deepEqual(await Promise.all([landing, guide, wiki].map(path => readFile(path, 'utf8'))), originals) + await assert.rejects(stat(removed), { code: 'ENOENT' }) + const added = join(site, 'src/silk/docs/language/new/page.md') + const first = await readFile(added, 'utf8') + assert.equal(splitPage(first).metadata.layout, 'silk-docs') + assert.ok(first.includes('// Works today: {{ literal }} \n')) + await syncFromSilkDocs(site, upstream) + assert.equal(await readFile(added, 'utf8'), first) + await put(join(upstream, 'docs/wiki/fresh.md'), '# Fresh wiki\n') + await syncFromSilkDocs(site, upstream) + await assert.rejects(stat(wiki), { code: 'ENOENT' }) + assert.ok((await readFile(join(site, 'src/silk/wiki/fresh/page.md'), 'utf8')).includes('# Fresh wiki')) +})) +test('Runtime validation failures do not partially import staged changes', async () => temporary(async (site, upstream) => { + const curated = await page(site, 'runtime/docs/javascript/application', 'runtime', 'javascript/application.md', '# Authored\n') + const original = await readFile(curated, 'utf8') + await put(join(upstream, 'api/index.d.ts'), "declare module 'oro:application' {\n export function ping(): void;\n}\ndeclare module 'oro:unknown' {\n}\n") + await assert.rejects(generateReference(site, upstream), /Missing generated examples/) + assert.equal(await readFile(curated, 'utf8'), original) +})) diff --git a/tests/ingestion.test.ts b/tests/ingestion.test.ts index 89f53629..47bd978f 100644 --- a/tests/ingestion.test.ts +++ b/tests/ingestion.test.ts @@ -1,5 +1,126 @@ import { test } from 'node:test' -import { execFileSync } from 'node:child_process' -test('manual upstream generators preserve curated content and ingestion ownership', () => { - execFileSync('python3', ['tests/test_ingestion.py'], { stdio: 'inherit' }) +import assert from 'node:assert/strict' +import { createHash } from 'node:crypto' +import { readFile, writeFile, mkdir, mkdtemp, rm, stat } from 'node:fs/promises' +import { tmpdir } from 'node:os' +import { dirname, join, relative } from 'node:path' +import { execFileSync, spawnSync } from 'node:child_process' +import { files, preserveFences, splitLines } from '../tools/source-pages.ts' +import { KEEP_DOCS_FILES, KEEP_DOCS_PREFIXES, syncTree, postprocessTree, sanitizeDocsMarkdown, sanitizeWikiMarkdown, normalizeEditorialFraming, normalizeUserFacingLinks, normalizeHeadingsForContext, normalizeTrailingNewlines, main as silkMain } from '../silk/tools/sync-from-silk-docs.ts' +import { parseIndexDTS, renderGeneratedPage, updateCuratedPage } from '../runtime/tools/generate-js-api-reference.ts' +import { DESCRIPTION_BY_FAMILY, EXAMPLES_BY_FAMILY, GUIDE_REFS_BY_FAMILY, DEFAULT_SEE_ALSO } from '../runtime/tools/js-api-reference-content.ts' + +// Captured from the original Python implementations before removal. +const fixture = JSON.parse(await readFile(new URL('./ingestion-fixtures.json', import.meta.url), 'utf8')) as { + cases: { rel: string; path: string; kind: string; input: string; expected: string }[] + runtimeFamilies: string[]; runtimeSHA256: string; contentSHA256: string + tree: { source: Record<string, string>; staged: Record<string, string>; stats: { copied: number; skipped: number; deleted: number }; expected: Record<string, string> } + curated: { input: string; declarations: string; expected: string; secondExpected: string }[] +} +const sha256 = (text: string) => createHash('sha256').update(text).digest('hex') +async function temporary(run: (root: string) => Promise<void>): Promise<void> { + const root = await mkdtemp(join(tmpdir(), 'oro-ingestion-test-')) + try { await run(root) } finally { await rm(root, { recursive: true, force: true }) } +} +test('evaluated runtime content and all family renderers match the Python oracle exactly', () => { + assert.equal(sha256(JSON.stringify([DESCRIPTION_BY_FAMILY, EXAMPLES_BY_FAMILY, GUIDE_REFS_BY_FAMILY, DEFAULT_SEE_ALSO])), fixture.contentSHA256) + const rendered = fixture.runtimeFamilies.map(family => { + const declarations = [family + '/z', family, family + '/index'].map(spec => `declare module '${spec}' {\n export function ping(): void;\n}\n`).join('\n') + const blocks = parseIndexDTS(declarations) + return renderGeneratedPage('unused', family, Object.keys(blocks), blocks) + }) + assert.equal(sha256(rendered.join('')), fixture.runtimeSHA256) +}) +test('Silk editorial transformations and fence protection match the Python oracle', () => { + for (const [index, entry] of fixture.cases.entries()) { + const sanitize = entry.kind === 'wiki' ? sanitizeWikiMarkdown : sanitizeDocsMarkdown + let actual = preserveFences(entry.input, body => sanitize(entry.rel, body)) + actual = preserveFences(actual, body => normalizeTrailingNewlines(normalizeHeadingsForContext(entry.path, normalizeUserFacingLinks(normalizeEditorialFraming(body))))) + assert.equal(actual, entry.expected, `fixture ${index}: ${entry.rel}`) + } +}) +test('curated reference markers preserve surrounding prose and are idempotent', async () => temporary(async root => { + const path = join(root, 'application.md') + for (const entry of fixture.curated) { + await writeFile(path, entry.input) + const blocks = parseIndexDTS(entry.declarations) + assert.equal(await updateCuratedPage(path, 'oro:application', Object.keys(blocks), blocks), true) + assert.equal(await readFile(path, 'utf8'), entry.expected) + // The original normalizes the gap before a newly appended See also on its second pass. + await updateCuratedPage(path, 'oro:application', Object.keys(blocks), blocks) + assert.equal(await readFile(path, 'utf8'), entry.secondExpected) + const before = (await stat(path)).mtimeMs + assert.equal(await updateCuratedPage(path, 'oro:application', Object.keys(blocks), blocks), false) + assert.equal((await stat(path)).mtimeMs, before) + } +})) +test('Silk ownership, exclusions, pruning, raw txt copying, and postprocessing', async () => temporary(async root => { + const src = join(root, 'upstream'), dst = join(root, 'staged') + for (const base of [src, dst]) for (const name of ['guides', 'language', 'wiki']) await mkdir(join(base, name), { recursive: true }) + const authored = '# Custom guide\n\nWorks today: a deliberately authored phrase.\n' + for (const name of ['guides/custom.md', 'start.md']) { + await writeFile(join(src, name), 'upstream') + await writeFile(join(dst, name), authored) + } + await writeFile(join(src, 'language/new.md'), '# New\n\nWorks today: prose\n\n```silk\n// Works today: {{ literal }} \n```\n') + await writeFile(join(src, 'language/raw.txt'), Buffer.from('raw\r\nbytes\u0000')) + await writeFile(join(src, 'wiki/reference.md'), 'wiki') + await writeFile(join(src, 'STATUS.md'), 'private tracker') + await writeFile(join(src, 'ignored.bin'), 'ignored') + await writeFile(join(dst, 'language/removed.md'), 'removed') + await writeFile(join(dst, 'STATUS.md'), 'stale tracker') + await writeFile(join(dst, 'guides/PLAN.md'), 'excluded even under an owned prefix') + const ownership = { keepFiles: KEEP_DOCS_FILES, keepPrefixes: [...KEEP_DOCS_PREFIXES, 'wiki/'] } + assert.deepEqual(await syncTree(src, dst, { ...ownership, sanitize: (rel, text) => preserveFences(text, body => sanitizeDocsMarkdown(rel, body)) }), { copied: 2, skipped: 4, deleted: 3 }) + await postprocessTree(dst, ownership) + for (const name of ['guides/custom.md', 'start.md']) assert.equal(await readFile(join(dst, name), 'utf8'), authored) + for (const name of ['language/removed.md', 'STATUS.md', 'guides/PLAN.md', 'wiki/reference.md', 'ignored.bin']) await assert.rejects(stat(join(dst, name)), { code: 'ENOENT' }) + assert.deepEqual(await readFile(join(dst, 'language/raw.txt')), await readFile(join(src, 'language/raw.txt'))) + assert.match(await readFile(join(dst, 'language/new.md'), 'utf8'), /\/\/ Works today: \{\{ literal \}\} \n/) +})) +test('complete staged Silk tree and counters match the Python oracle', async () => temporary(async root => { + const src = join(root, 'upstream'), dst = join(root, 'staged') + for (const [base, entries] of [[src, fixture.tree.source], [dst, fixture.tree.staged]] as const) { + for (const [rel, body] of Object.entries(entries)) { + const path = join(base, rel) + await mkdir(dirname(path), { recursive: true }) + await writeFile(path, body) + } + } + assert.deepEqual(await syncTree(src, dst, { + keepFiles: KEEP_DOCS_FILES, keepPrefixes: [...KEEP_DOCS_PREFIXES, 'wiki/'], + sanitize: (rel, text) => preserveFences(text, body => sanitizeDocsMarkdown(rel, body)), + }), fixture.tree.stats) + await postprocessTree(dst, { keepFiles: KEEP_DOCS_FILES, keepPrefixes: KEEP_DOCS_PREFIXES }) + const actual: Record<string, string> = {} + for (const path of await files(dst)) actual[relative(dst, path)] = await readFile(path, 'utf8') + assert.deepEqual(actual, fixture.tree.expected) +})) +test('fence placeholders cannot collide with authored text; mismatched and unclosed fences stay exact', () => { + const fence = '````silk\nWorks today: {{ value }} \n```\n~~~~\n`````\n' + const text = 'OROFENCE0END\n\nWorks today: prose\n\n' + fence + assert.equal(preserveFences(text, body => body.replaceAll('Works today', 'Supported')), text.replace('Works today: prose', 'Supported: prose')) + const unclosed = ' ~~~~silk\nWorks today: literal ' + assert.equal(preserveFences(unclosed, body => body.trimEnd() + '\n'), unclosed) +}) +test('declaration parsing retains duplicate-last behavior, nesting, whitespace, and errors', () => { + assert.throws(() => parseIndexDTS('not a declaration'), /No `declare module/) + assert.throws(() => renderGeneratedPage('', 'oro:unknown', [], {}), /Missing generated examples/) + const text = "declare module 'oro:x' {\r\n export interface X {\r\n nested: string; \r\n }\r\n}\r\ndeclare module \"oro:x\" {\r\n export const last: true; \r\n}\r\n" + assert.equal(parseIndexDTS(text)['oro:x'].block, 'declare module "oro:x" {\n export const last: true;\n}\n') + assert.deepEqual(splitLines('a\n\n'), ['a', '']) + assert.deepEqual(splitLines('a\r\n'), ['a']) + assert.deepEqual(splitLines('a\u0085b\u2028c\v'), ['a', 'b', 'c']) +}) +test('Silk CLI resolves repo-root and gives silk-repo precedence', async () => temporary(async root => { + await assert.rejects(silkMain(['--repo-root', root]), { message: `Missing source docs at ${join(root, 'silk/docs')}` }) + await assert.rejects(silkMain(['--repo-root', root, '--silk-repo', join(root, 'explicit')]), { message: `Missing source docs at ${join(root, 'explicit/docs')}` }) +})) +test('manual CLI entry points expose preserved flags without running imports', () => { + for (const [path, flag] of [['runtime/tools/generate-js-api-reference.ts', '--runtime-repo'], ['silk/tools/sync-from-silk-docs.ts', '--silk-repo']]) { + const help = execFileSync(process.execPath, [path, '--help'], { encoding: 'utf8' }) + assert.ok(help.includes(flag)) + assert.equal(spawnSync(process.execPath, [path, '--unknown']).status, 2) + assert.equal(spawnSync(process.execPath, [path, flag]).status, 2) + } }) diff --git a/tests/test_ingestion.py b/tests/test_ingestion.py deleted file mode 100644 index f1148ac9..00000000 --- a/tests/test_ingestion.py +++ /dev/null @@ -1,80 +0,0 @@ -import importlib.util -import sys -import tempfile -import unittest -from pathlib import Path - -SITE = Path(__file__).resolve().parents[1] -sys.path.insert(0, str(SITE / 'runtime' / 'tools')) - - -def module(name, path): - spec = importlib.util.spec_from_file_location(name, SITE / path) - result = importlib.util.module_from_spec(spec) - sys.modules[name] = result - spec.loader.exec_module(result) - return result - - -silk = module('silk_sync', 'silk/tools/sync-from-silk-docs.py') -runtime = module('runtime_api', 'runtime/tools/generate-js-api-reference.py') - - -class IngestionTests(unittest.TestCase): - def test_silk_preserves_website_owned_pages_and_prunes_removed_imports(self): - with tempfile.TemporaryDirectory() as folder: - src, dst = Path(folder) / 'upstream', Path(folder) / 'staged' - for base in (src, dst): - (base / 'guides').mkdir(parents=True) - (base / 'language').mkdir() - (src / 'guides' / 'custom.md').write_text('upstream guide') - (dst / 'guides' / 'custom.md').write_text('website guide') - (src / 'start.md').write_text('upstream start') - (dst / 'start.md').write_text('website start') - (src / 'language' / 'new.md').write_text('# New\n') - (dst / 'language' / 'removed.md').write_text('# Removed\n') - (src / 'STATUS.md').write_text('private tracker') - silk.sync_tree(src, dst, keep_files=silk.KEEP_DOCS_FILES, - keep_prefixes=silk.KEEP_DOCS_PREFIXES) - self.assertEqual((dst / 'guides/custom.md').read_text(), 'website guide') - self.assertEqual((dst / 'start.md').read_text(), 'website start') - self.assertTrue((dst / 'language/new.md').exists()) - self.assertFalse((dst / 'language/removed.md').exists()) - self.assertFalse((dst / 'STATUS.md').exists()) - - def test_postprocessing_leaves_website_owned_copy_untouched(self): - with tempfile.TemporaryDirectory() as folder: - root = Path(folder) - (root / 'guides').mkdir() - page = root / 'guides/custom.md' - text = '# Custom guide\n\nWorks today: a deliberately authored phrase.\n' - page.write_text(text) - silk.postprocess_tree(root, keep_files=silk.KEEP_DOCS_FILES, - keep_prefixes=silk.KEEP_DOCS_PREFIXES) - self.assertEqual(page.read_text(), text) - - def test_runtime_preserves_curated_prose_around_generated_markers(self): - with tempfile.TemporaryDirectory() as folder: - path = Path(folder) / 'application.md' - path.write_text('# Curated application\n\nKeep this example.\n\n' + - runtime.REF_START + '\nOld API\n' + runtime.REF_END + '\n\nKeep this footer.\n') - declarations = "declare module 'oro:application' {\n export function ping(): void;\n}\n" - blocks = runtime.parse_index_d_ts(declarations) - runtime.update_curated_page(path, 'oro:application', ['oro:application'], blocks) - result = path.read_text() - self.assertIn('Keep this example.', result) - self.assertIn('Keep this footer.', result) - self.assertIn('ping()', result) - self.assertNotIn('Old API', result) - self.assertEqual(result.count(runtime.REF_START), 1) - self.assertEqual(result.count(runtime.REF_END), 1) - - def test_silk_editorial_pass_preserves_code_comments(self): - example = '```silk\n// Works today: {{ literal }}\nlet n = 1;\n```' - result = silk.source_pages.preserve_fences('Works today: prose\n\n' + example, - silk.normalize_shared_markdown) - self.assertIn(example, result) - - -if __name__ == '__main__': - unittest.main() diff --git a/tests/tooling/content-audit-baseline.json b/tests/tooling/content-audit-baseline.json new file mode 100644 index 00000000..17bbb618 --- /dev/null +++ b/tests/tooling/content-audit-baseline.json @@ -0,0 +1,37 @@ +{ + "missing": { + "status": 2, + "stdout": "", + "stderr": "Missing Runtime docs/index.json; run build scripts first.\n" + }, + "clean": { + "status": 0, + "stdout": "OK: runtime site audit passed\nOK: runtime docs audit passed\nOK: silk site audit passed\nStdlib doc audit passed.\nOK: sage site audit passed\nOK: slg site audit passed\nOK: virtnosis site audit passed\n", + "stderr": "" + }, + "common": { + "status": 1, + "stdout": "", + "stderr": "sage/docs/index.json: Index refers to missing file: lost.md\nsage/docs/source/start.md: Broken ?p= link: heading\nsage/docs/source/start.md: Broken ?p= link: fenced\nsage/docs/source/start.md: Broken ?p= link: missing\nsage/docs/source/start.md: Broken ?p= link: nope\nsage/docs/source/start.md: Missing link target: docs/absent.md -> sage/docs/source/absent.md\nsage/docs/source/start.md: Missing link target: /absent.txt -> absent.txt\nsage/docs/source/start.md: Line 6: raw ?p= reference must be a markdown link.\nsage/docs/source/start.md: Line 6: raw manpage reference must be a markdown link.\nsage/docs/source/start.md: Line 10: avoid status-style or transitional editorial framing in published docs.\nsage/docs/source/start.md: Line 11: avoid status-style or transitional editorial framing in published docs.\nsage/docs/source/start.md: Line 12: avoid status-style or transitional editorial framing in published docs.\nsage/docs/source/start.md: Line 13: avoid status-style or transitional editorial framing in published docs.\nsage/docs/source/start.md: Line 14: avoid status-style or transitional editorial framing in published docs.\nsage/docs/source/start.md: Line 15: avoid status-style or transitional editorial framing in published docs.\nsage/docs/source/start.md: Line 16: avoid status-style or transitional editorial framing in published docs.\nsage/docs/source/start.md: Line 17: avoid status-style or transitional editorial framing in published docs.\nsage/docs/source/start.md: Line 19: avoid status-style or transitional editorial framing in published docs.\nFAIL: 18 issues\n" + }, + "silk": { + "status": 1, + "stdout": "", + "stderr": "silk/docs/source/start.md: Broken ?p= link: wiki/lost\nsilk/docs/source/start.md: Broken ?p= link: docs/oops\nsilk/docs/source/start.md: Missing link target: spec/missing.md -> silk/docs/source/spec/missing.md\nsilk/wiki/source/wiki.md: Missing link target: docs/missing.txt -> silk/docs/source/missing.txt\nsilk/docs/source/start.md: Found arena identifier in examples (use regions + neutral names).\nsilk/wiki/source/wiki.md: Found arena identifier in examples (use regions + neutral names).\nsilk/docs/source/start.md: Found deprecated 'Works today' / 'Syntax (Selected)' labeling.\nsilk/wiki/source/wiki.md: Found deprecated 'Works today' / 'Syntax (Selected)' labeling.\nsilk/docs/source/start.md: Line 6: raw ?p= reference must be a markdown link.\nsilk/docs/source/start.md: Line 6: raw manpage reference must be a markdown link.\nsilk/docs/source/start.md: Line 7: avoid status-style or transitional editorial framing in published docs.\nsilk/wiki/source/wiki.md: Line 3: avoid status-style or transitional editorial framing in published docs.\nsilk/docs/source/spec/2026.md: Spec contains repo-internal paths/names (remove or generalize).\nFAIL: 13 issues\n" + }, + "stdlib": { + "status": 1, + "stdout": "<fixture>/silk/docs/source/std/a.md: Status/body uses banned transitional wording: active expansion\n<fixture>/silk/docs/source/std/a.md: Status/body uses banned transitional wording: current snapshot\n<fixture>/silk/docs/source/std/a.md: Status/body uses banned transitional wording: Partially implemented\n<fixture>/silk/docs/source/std/a.md: Status/body uses banned transitional wording: initial std wrapper\n<fixture>/silk/docs/source/std/a.md: Status/body uses banned transitional wording: expansion path\n<fixture>/silk/docs/source/std/a.md: Status/body uses banned transitional wording: \\bMVP\\b\n<fixture>/silk/docs/source/std/a.md: Banned heading: API\n<fixture>/silk/docs/source/std/a.md: Banned heading: Design Goals\n<fixture>/silk/docs/source/std/a.md: Banned heading pattern: Initial Design MVP\n<fixture>/silk/docs/source/std/a.md: Banned heading pattern: Initial Design MVP\n<fixture>/silk/docs/source/std/a.md: Banned heading pattern: Current Scope\n", + "stderr": "" + }, + "runtime": { + "status": 1, + "stdout": "OK: runtime site audit passed\n", + "stderr": "runtime/docs/source/javascript/module-index.md: remove this page; link JavaScript API entry points to javascript/overview.\nruntime/docs/source/javascript/module-index.md: remove generic Object.keys(api) examples; document a real usage flow instead.\nruntime/docs/source/javascript/module-index.md: missing an Examples section.\nruntime/docs/source/javascript/fs.md: missing docs page for published module family oro:fs.\nruntime/docs/source/javascript/new.md: missing docs page for published module family oro:new.\nruntime/docs/source/javascript/node.md: excluded private module family oro:node should not have a public docs page.\nruntime/docs/source/javascript/all-modules.md: excluded private module family oro:internal should not appear in the public module listing.\nruntime/docs/source/javascript/all-modules.md: missing published module specifier oro:fs/promises.\nruntime/docs/source/javascript/all-modules.md: missing published module specifier oro:new.\nruntime/docs/source/cli/oroc.md: missing website docs page for upstream CLI section `oroc`.\nruntime/docs/source/cli/update/init.md: missing website docs page for upstream CLI section `oroc update-init`.\nindex.html: stale runtime repository reference (deprecated runtime repository alias).\nindex.html: stale runtime repository reference (deprecated runtime repository alias).\nindex.html: stale runtime repository reference (deprecated runtime repository alias).\nFAIL: 14 runtime docs issues\n" + }, + "cap": { + "status": 1, + "stdout": "", + "stderr": "sage/docs/source/start.md: Broken ?p= link: missing0\nsage/docs/source/start.md: Broken ?p= link: missing1\nsage/docs/source/start.md: Broken ?p= link: missing2\nsage/docs/source/start.md: Broken ?p= link: missing3\nsage/docs/source/start.md: Broken ?p= link: missing4\nsage/docs/source/start.md: Broken ?p= link: missing5\nsage/docs/source/start.md: Broken ?p= link: missing6\nsage/docs/source/start.md: Broken ?p= link: missing7\nsage/docs/source/start.md: Broken ?p= link: missing8\nsage/docs/source/start.md: Broken ?p= link: missing9\nsage/docs/source/start.md: Broken ?p= link: missing10\nsage/docs/source/start.md: Broken ?p= link: missing11\nsage/docs/source/start.md: Broken ?p= link: missing12\nsage/docs/source/start.md: Broken ?p= link: missing13\nsage/docs/source/start.md: Broken ?p= link: missing14\nsage/docs/source/start.md: Broken ?p= link: missing15\nsage/docs/source/start.md: Broken ?p= link: missing16\nsage/docs/source/start.md: Broken ?p= link: missing17\nsage/docs/source/start.md: Broken ?p= link: missing18\nsage/docs/source/start.md: Broken ?p= link: missing19\nsage/docs/source/start.md: Broken ?p= link: missing20\nsage/docs/source/start.md: Broken ?p= link: missing21\nsage/docs/source/start.md: Broken ?p= link: missing22\nsage/docs/source/start.md: Broken ?p= link: missing23\nsage/docs/source/start.md: Broken ?p= link: missing24\nsage/docs/source/start.md: Broken ?p= link: missing25\nsage/docs/source/start.md: Broken ?p= link: missing26\nsage/docs/source/start.md: Broken ?p= link: missing27\nsage/docs/source/start.md: Broken ?p= link: missing28\nsage/docs/source/start.md: Broken ?p= link: missing29\nsage/docs/source/start.md: Broken ?p= link: missing30\nsage/docs/source/start.md: Broken ?p= link: missing31\nsage/docs/source/start.md: Broken ?p= link: missing32\nsage/docs/source/start.md: Broken ?p= link: missing33\nsage/docs/source/start.md: Broken ?p= link: missing34\nsage/docs/source/start.md: Broken ?p= link: missing35\nsage/docs/source/start.md: Broken ?p= link: missing36\nsage/docs/source/start.md: Broken ?p= link: missing37\nsage/docs/source/start.md: Broken ?p= link: missing38\nsage/docs/source/start.md: Broken ?p= link: missing39\nsage/docs/source/start.md: Broken ?p= link: missing40\nsage/docs/source/start.md: Broken ?p= link: missing41\nsage/docs/source/start.md: Broken ?p= link: missing42\nsage/docs/source/start.md: Broken ?p= link: missing43\nsage/docs/source/start.md: Broken ?p= link: missing44\nsage/docs/source/start.md: Broken ?p= link: missing45\nsage/docs/source/start.md: Broken ?p= link: missing46\nsage/docs/source/start.md: Broken ?p= link: missing47\nsage/docs/source/start.md: Broken ?p= link: missing48\nsage/docs/source/start.md: Broken ?p= link: missing49\nsage/docs/source/start.md: Broken ?p= link: missing50\nsage/docs/source/start.md: Broken ?p= link: missing51\nsage/docs/source/start.md: Broken ?p= link: missing52\nsage/docs/source/start.md: Broken ?p= link: missing53\nsage/docs/source/start.md: Broken ?p= link: missing54\nsage/docs/source/start.md: Broken ?p= link: missing55\nsage/docs/source/start.md: Broken ?p= link: missing56\nsage/docs/source/start.md: Broken ?p= link: missing57\nsage/docs/source/start.md: Broken ?p= link: missing58\nsage/docs/source/start.md: Broken ?p= link: missing59\nsage/docs/source/start.md: Broken ?p= link: missing60\nsage/docs/source/start.md: Broken ?p= link: missing61\nsage/docs/source/start.md: Broken ?p= link: missing62\nsage/docs/source/start.md: Broken ?p= link: missing63\nsage/docs/source/start.md: Broken ?p= link: missing64\nsage/docs/source/start.md: Broken ?p= link: missing65\nsage/docs/source/start.md: Broken ?p= link: missing66\nsage/docs/source/start.md: Broken ?p= link: missing67\nsage/docs/source/start.md: Broken ?p= link: missing68\nsage/docs/source/start.md: Broken ?p= link: missing69\nsage/docs/source/start.md: Broken ?p= link: missing70\nsage/docs/source/start.md: Broken ?p= link: missing71\nsage/docs/source/start.md: Broken ?p= link: missing72\nsage/docs/source/start.md: Broken ?p= link: missing73\nsage/docs/source/start.md: Broken ?p= link: missing74\nsage/docs/source/start.md: Broken ?p= link: missing75\nsage/docs/source/start.md: Broken ?p= link: missing76\nsage/docs/source/start.md: Broken ?p= link: missing77\nsage/docs/source/start.md: Broken ?p= link: missing78\nsage/docs/source/start.md: Broken ?p= link: missing79\nsage/docs/source/start.md: Broken ?p= link: missing80\nsage/docs/source/start.md: Broken ?p= link: missing81\nsage/docs/source/start.md: Broken ?p= link: missing82\nsage/docs/source/start.md: Broken ?p= link: missing83\nsage/docs/source/start.md: Broken ?p= link: missing84\nsage/docs/source/start.md: Broken ?p= link: missing85\nsage/docs/source/start.md: Broken ?p= link: missing86\nsage/docs/source/start.md: Broken ?p= link: missing87\nsage/docs/source/start.md: Broken ?p= link: missing88\nsage/docs/source/start.md: Broken ?p= link: missing89\nsage/docs/source/start.md: Broken ?p= link: missing90\nsage/docs/source/start.md: Broken ?p= link: missing91\nsage/docs/source/start.md: Broken ?p= link: missing92\nsage/docs/source/start.md: Broken ?p= link: missing93\nsage/docs/source/start.md: Broken ?p= link: missing94\nsage/docs/source/start.md: Broken ?p= link: missing95\nsage/docs/source/start.md: Broken ?p= link: missing96\nsage/docs/source/start.md: Broken ?p= link: missing97\nsage/docs/source/start.md: Broken ?p= link: missing98\nsage/docs/source/start.md: Broken ?p= link: missing99\nsage/docs/source/start.md: Broken ?p= link: missing100\nsage/docs/source/start.md: Broken ?p= link: missing101\nsage/docs/source/start.md: Broken ?p= link: missing102\nsage/docs/source/start.md: Broken ?p= link: missing103\nsage/docs/source/start.md: Broken ?p= link: missing104\nsage/docs/source/start.md: Broken ?p= link: missing105\nsage/docs/source/start.md: Broken ?p= link: missing106\nsage/docs/source/start.md: Broken ?p= link: missing107\nsage/docs/source/start.md: Broken ?p= link: missing108\nsage/docs/source/start.md: Broken ?p= link: missing109\nsage/docs/source/start.md: Broken ?p= link: missing110\nsage/docs/source/start.md: Broken ?p= link: missing111\nsage/docs/source/start.md: Broken ?p= link: missing112\nsage/docs/source/start.md: Broken ?p= link: missing113\nsage/docs/source/start.md: Broken ?p= link: missing114\nsage/docs/source/start.md: Broken ?p= link: missing115\nsage/docs/source/start.md: Broken ?p= link: missing116\nsage/docs/source/start.md: Broken ?p= link: missing117\nsage/docs/source/start.md: Broken ?p= link: missing118\nsage/docs/source/start.md: Broken ?p= link: missing119\nsage/docs/source/start.md: Broken ?p= link: missing120\nsage/docs/source/start.md: Broken ?p= link: missing121\nsage/docs/source/start.md: Broken ?p= link: missing122\nsage/docs/source/start.md: Broken ?p= link: missing123\nsage/docs/source/start.md: Broken ?p= link: missing124\nsage/docs/source/start.md: Broken ?p= link: missing125\nsage/docs/source/start.md: Broken ?p= link: missing126\nsage/docs/source/start.md: Broken ?p= link: missing127\nsage/docs/source/start.md: Broken ?p= link: missing128\nsage/docs/source/start.md: Broken ?p= link: missing129\nsage/docs/source/start.md: Broken ?p= link: missing130\nsage/docs/source/start.md: Broken ?p= link: missing131\nsage/docs/source/start.md: Broken ?p= link: missing132\nsage/docs/source/start.md: Broken ?p= link: missing133\nsage/docs/source/start.md: Broken ?p= link: missing134\nsage/docs/source/start.md: Broken ?p= link: missing135\nsage/docs/source/start.md: Broken ?p= link: missing136\nsage/docs/source/start.md: Broken ?p= link: missing137\nsage/docs/source/start.md: Broken ?p= link: missing138\nsage/docs/source/start.md: Broken ?p= link: missing139\nsage/docs/source/start.md: Broken ?p= link: missing140\nsage/docs/source/start.md: Broken ?p= link: missing141\nsage/docs/source/start.md: Broken ?p= link: missing142\nsage/docs/source/start.md: Broken ?p= link: missing143\nsage/docs/source/start.md: Broken ?p= link: missing144\nsage/docs/source/start.md: Broken ?p= link: missing145\nsage/docs/source/start.md: Broken ?p= link: missing146\nsage/docs/source/start.md: Broken ?p= link: missing147\nsage/docs/source/start.md: Broken ?p= link: missing148\nsage/docs/source/start.md: Broken ?p= link: missing149\nsage/docs/source/start.md: Broken ?p= link: missing150\nsage/docs/source/start.md: Broken ?p= link: missing151\nsage/docs/source/start.md: Broken ?p= link: missing152\nsage/docs/source/start.md: Broken ?p= link: missing153\nsage/docs/source/start.md: Broken ?p= link: missing154\nsage/docs/source/start.md: Broken ?p= link: missing155\nsage/docs/source/start.md: Broken ?p= link: missing156\nsage/docs/source/start.md: Broken ?p= link: missing157\nsage/docs/source/start.md: Broken ?p= link: missing158\nsage/docs/source/start.md: Broken ?p= link: missing159\nsage/docs/source/start.md: Broken ?p= link: missing160\nsage/docs/source/start.md: Broken ?p= link: missing161\nsage/docs/source/start.md: Broken ?p= link: missing162\nsage/docs/source/start.md: Broken ?p= link: missing163\nsage/docs/source/start.md: Broken ?p= link: missing164\nsage/docs/source/start.md: Broken ?p= link: missing165\nsage/docs/source/start.md: Broken ?p= link: missing166\nsage/docs/source/start.md: Broken ?p= link: missing167\nsage/docs/source/start.md: Broken ?p= link: missing168\nsage/docs/source/start.md: Broken ?p= link: missing169\nsage/docs/source/start.md: Broken ?p= link: missing170\nsage/docs/source/start.md: Broken ?p= link: missing171\nsage/docs/source/start.md: Broken ?p= link: missing172\nsage/docs/source/start.md: Broken ?p= link: missing173\nsage/docs/source/start.md: Broken ?p= link: missing174\nsage/docs/source/start.md: Broken ?p= link: missing175\nsage/docs/source/start.md: Broken ?p= link: missing176\nsage/docs/source/start.md: Broken ?p= link: missing177\nsage/docs/source/start.md: Broken ?p= link: missing178\nsage/docs/source/start.md: Broken ?p= link: missing179\nsage/docs/source/start.md: Broken ?p= link: missing180\nsage/docs/source/start.md: Broken ?p= link: missing181\nsage/docs/source/start.md: Broken ?p= link: missing182\nsage/docs/source/start.md: Broken ?p= link: missing183\nsage/docs/source/start.md: Broken ?p= link: missing184\nsage/docs/source/start.md: Broken ?p= link: missing185\nsage/docs/source/start.md: Broken ?p= link: missing186\nsage/docs/source/start.md: Broken ?p= link: missing187\nsage/docs/source/start.md: Broken ?p= link: missing188\nsage/docs/source/start.md: Broken ?p= link: missing189\nsage/docs/source/start.md: Broken ?p= link: missing190\nsage/docs/source/start.md: Broken ?p= link: missing191\nsage/docs/source/start.md: Broken ?p= link: missing192\nsage/docs/source/start.md: Broken ?p= link: missing193\nsage/docs/source/start.md: Broken ?p= link: missing194\nsage/docs/source/start.md: Broken ?p= link: missing195\nsage/docs/source/start.md: Broken ?p= link: missing196\nsage/docs/source/start.md: Broken ?p= link: missing197\nsage/docs/source/start.md: Broken ?p= link: missing198\nsage/docs/source/start.md: Broken ?p= link: missing199\n... and 5 more\nFAIL: 205 issues\n" + } +} diff --git a/tests/tooling/content-audit.test.ts b/tests/tooling/content-audit.test.ts new file mode 100644 index 00000000..a176dc3f --- /dev/null +++ b/tests/tooling/content-audit.test.ts @@ -0,0 +1,71 @@ +import assert from 'node:assert/strict' +import { mkdirSync, mkdtempSync, readFileSync, rmSync, writeFileSync } from 'node:fs' +import { dirname, join, resolve } from 'node:path' + +import { test } from 'node:test' +import { auditContext, runContentAudit } from '../../tools/audit-content.ts' +import { runSiteAudit } from '../../tools/audits/common.ts' +import type { AuditContext, Reporter } from '../../tools/audits/common.ts' +import { runRuntimeAudit } from '../../tools/audits/runtime.ts' +import { runSilkAudit, runStdlibAudit } from '../../tools/audits/silk.ts' + +const siteRoot = resolve(import.meta.dirname, '../..') +const cases = ['missing', 'clean', 'common', 'silk', 'stdlib', 'runtime', 'cap'] as const +const baselines = JSON.parse(readFileSync(new URL('./content-audit-baseline.json', import.meta.url), 'utf8')) +for (const name of cases) test(`Python content audit parity: ${name}`, () => { + const root = mkdtempSync(join(siteRoot, '.audit-fixture-')) + const context: AuditContext = { siteRoot, outputRoot: root, runtimeRepo: join(root, 'upstream') } + const put = (path: string, text: string): void => { + mkdirSync(dirname(join(root, path)), { recursive: true }) + writeFileSync(join(root, path), text) + } + try { + if (name !== 'missing') { + for (const product of ['runtime', 'silk', 'sage', 'slg', 'virtnosis']) { + put(`${product}/docs/index.json`, JSON.stringify({ sections: [{ items: [{ id: 'start', file: 'start.md' }] }] })) + put(`${product}/docs/source/start.md`, '# Start\n') + } + put('silk/wiki/index.json', '{"sections":[]}') + for (const path of ['index.html', 'runtime/index.html', 'runtime/docs/index.html']) put(path, '') + } + if (name === 'common') { + put('sage/docs/index.json', '{"sections":[{"items":[{"id":"start","file":"start.md"},{"id":"lost","file":"lost.md"}]}]}') + put('sage/docs/source/start.md', '# Heading ?p=heading\n```\n?p=fenced\n## Status\n~~~\nRaw ?p=missing and `open` (3)\n[ok](?p=start) [bad](wiki/?p=nope)\n[missing](docs/absent.md) [escape](../ignored.md)\n[absolute](/absent.txt) [remote](https://example.org/no.md)\n## Status (details)\n## API (initial surface)\n## Thing (Planned soon)\nStatus: **yes**\nInitial implementation\n## Current API\n## Future Work\n## Current APİ\n\u001c## Status\n\ufeff## Status\néinitial implementationé\n'); + } + if (name === 'silk') { + put('silk/docs/source/start.md', '[wiki](wiki/?p=lost) [spec](spec/missing.md)\n```\nconst region arena\nWorks today\n```\nRaw ?p=oops `foo` (1)\n## Status\n') + put('silk/wiki/source/wiki.md', 'from arena\nSyntax (Selected)\n## Current API\n[docs](docs/missing.txt)\n') + put('silk/docs/source/spec/2026.md', 'checker.foo src/example c-tests/ tests/silk/') + } + if (name === 'stdlib') put('silk/docs/source/std/a.md', 'active expansion; current snapshot; Partially implemented; initial std wrapper; expansion path; MVP\n## Examples\n## Description\n## API\n## Design Goals\n## Scope (Current)\n## Initial Design MVP\n```\n## Current Scope\n```\n## Examples\n') + if (name === 'runtime') { + put('runtime/docs/source/javascript/module-index.md', 'console.log(Object.keys(api))') + put('runtime/docs/source/javascript/foo.md', '## Example\n') + put('runtime/docs/source/javascript/node.md', '## Examples\n') + put('runtime/docs/source/javascript/all-modules.md', 'oro:node alone; oro:internal/*; oro:fs') + put('upstream/api/index.d.ts', 'declare module "oro:fs" {}\ndeclare module "oro:fs/promises" {}\ndeclare module "oro:new" {}\ndeclare module "oro:node" {}\n') + put('upstream/api/CLI.md', '## oroc\n## oroc update-init\n## oroc unknown\n') + put('index.html', 'oro-computer/oro-runtime oro-computer/legacy-runtime') + } + if (name === 'cap') put('sage/docs/source/start.md', Array.from({ length: 205 }, (_, i) => `[x](?p=missing${i})`).join('\n')) + const runners: Record<string, (ctx: AuditContext, reporter: Reporter) => number> = { + missing: runContentAudit, clean: runContentAudit, common: (ctx, reporter) => runSiteAudit(ctx, 'sage', reporter), + silk: runSilkAudit, stdlib: runStdlibAudit, runtime: runRuntimeAudit, cap: (ctx, reporter) => runSiteAudit(ctx, 'sage', reporter), + } + const stdout: string[] = [], stderr: string[] = [] + const status = runners[name]!(context, { log: message => stdout.push(message), error: message => stderr.push(message) }) + const normalize = (text: string): string => text.replaceAll(root.slice(siteRoot.length + 1), '<fixture>') + const result = { status, stdout: normalize(stdout.join('\n') + (stdout.length ? '\n' : '')), stderr: normalize(stderr.join('\n') + (stderr.length ? '\n' : '')) } + // Captured from the original Python audits before deletion. Directory traversal + // order is filesystem-dependent, so compare findings within each output stream. + assert.equal(result.status, baselines[name].status) + assert.deepEqual(result.stdout.split('\n').sort(), baselines[name].stdout.split('\n').sort()) + assert.deepEqual(result.stderr.split('\n').sort(), baselines[name].stderr.split('\n').sort()) + } finally { rmSync(root, { recursive: true, force: true }) } +}) +test('audit environment paths', () => { + assert.equal(auditContext({}).outputRoot, join(siteRoot, 'public')) + assert.equal(auditContext({}).runtimeRepo, undefined) + assert.equal(auditContext({ ORO_SITE_OUTPUT: 'other', ORO_RUNTIME_REPO: 'runtime-repo' }).outputRoot, resolve('other')) + assert.equal(auditContext({ ORO_RUNTIME_REPO: 'runtime-repo' }).runtimeRepo, resolve('runtime-repo')) +}) diff --git a/tools/audit-content.ts b/tools/audit-content.ts new file mode 100644 index 00000000..8fca5a47 --- /dev/null +++ b/tools/audit-content.ts @@ -0,0 +1,30 @@ +import { resolve } from 'node:path' +import { fileURLToPath } from 'node:url' +import { runSiteAudit } from './audits/common.ts' +import type { AuditContext, Reporter } from './audits/common.ts' +import { runRuntimeAudit } from './audits/runtime.ts' +import { runSilkAudit, runStdlibAudit } from './audits/silk.ts' + +export function auditContext(env: NodeJS.ProcessEnv = process.env): AuditContext { + const siteRoot = fileURLToPath(new URL('../', import.meta.url)).replace(/\/$/, '') + return { + siteRoot, + outputRoot: resolve(env.ORO_SITE_OUTPUT ?? resolve(siteRoot, 'public')), + runtimeRepo: env.ORO_RUNTIME_REPO === undefined ? undefined : resolve(env.ORO_RUNTIME_REPO), + } +} +export function runContentAudit(context = auditContext(), reporter: Reporter = console): number { + // Match the former package script's order and && short-circuit behavior. + const audits = [runRuntimeAudit, runSilkAudit, runStdlibAudit, + ...(['sage', 'slg', 'virtnosis'] as const).map(collection => + (ctx: AuditContext, output: Reporter) => runSiteAudit(ctx, collection, output)), + ] + for (const audit of audits) { + const rc = audit(context, reporter) + if (rc !== 0) return rc + } + return 0 +} +if (process.argv[1] && resolve(process.argv[1]) === fileURLToPath(import.meta.url)) { + process.exitCode = runContentAudit() +} diff --git a/tools/audits/common.ts b/tools/audits/common.ts new file mode 100644 index 00000000..fae1a830 --- /dev/null +++ b/tools/audits/common.ts @@ -0,0 +1,176 @@ +import { existsSync, readFileSync, readdirSync, realpathSync } from 'node:fs' +import { dirname, isAbsolute, relative, resolve } from 'node:path' +import { collections, type Collection } from '../../src/lib/collections.ts' + +export interface Issue { path: string; message: string } +export interface AuditContext { siteRoot: string; outputRoot: string; runtimeRepo?: string } +export interface CollectionConfig { source: string; index: string; kind: string } +export type Reporter = Pick<Console, 'log' | 'error'> + +// Translate the Python regex constructs used by these audits, without changing policy. +// In particular: Unicode word/space classes, dotted/dotless I under IGNORECASE, +// and Python's newline-only dot and multiline anchors. +export function pattern(source: string, flags = ''): RegExp { + const word = '[\\p{L}\\p{N}_]' + let translated = '' + let inClass = false + for (let index = 0; index < source.length; index++) { + const char = source[index]! + if (char === '\\') { + const next = source[++index]! + translated += next === 's' ? '[\\p{White_Space}\\x1c-\\x1f]' + : next === 'b' ? `(?:(?<!${word})(?=${word})|(?<=${word})(?!${word}))` : `\\${next}` + } else if (char === '[') { + inClass = true + translated += char + if (flags.includes('i') && /[iI]|a-z|A-Z/.test(source.slice(index + 1, source.indexOf(']', index)))) translated += 'İı' + } else if (char === ']') { inClass = false; translated += char } + else if (!inClass && char === '.') translated += '[^\\n]' + else if (!inClass && char === '^') translated += flags.includes('m') ? '(?:^|(?<=\\n))' : '^' + else if (!inClass && char === '$') translated += flags.includes('m') ? '(?=\\n|$)' : '(?=\\n?$)' + else if (!inClass && flags.includes('i') && /[iI]/.test(char)) translated += '[iIİı]' + else translated += char + } + return new RegExp(translated, flags.replace('m', '') + 'u') +} +export const trim = (text: string): string => text.replace(pattern('^\\s+|\\s+$', 'g'), '') +export const lines = (text: string): string[] => { + const result = text.split(/\r\n|[\n\r\v\f\x1c-\x1e\x85\u2028\u2029]/u) + if (result.at(-1) === '') result.pop() + return result +} +export const read = (path: string): string => readFileSync(path, 'utf8').replace(/\r\n?/g, '\n') +// pathlib joins normalize dots and repeated separators, but not parent segments. +export function pathJoin(...parts: string[]): string { + let value = '' + for (const part of parts) value = isAbsolute(part) || !value ? part : `${value}/${part}` + const absolute = value.startsWith('/') + return (absolute ? '/' : '') + value.split('/').filter(p => p && p !== '.').join('/') +} +export function collectionConfig(context: AuditContext, collection: Collection): CollectionConfig { + const root = pathJoin(context.outputRoot, collections[collection].base.slice(1)) + return { source: pathJoin(root, 'source'), index: pathJoin(root, 'index.json'), kind: collection === 'silkWiki' ? 'wiki' : 'docs' } +} +export function markdownFiles(root: string, recursive = true): string[] { + if (!existsSync(root)) return [] + const entries = readdirSync(root, { withFileTypes: true }) + const files = entries.filter(e => e.name.endsWith('.md')).map(e => pathJoin(root, e.name)) + if (recursive) for (const entry of entries) { + if (entry.isDirectory()) files.push(...markdownFiles(pathJoin(root, entry.name))) + } + return files +} +interface Index { sections?: { items?: { id: string; file: string }[] }[] } +export function indexItems(path: string): { id: string; file: string }[] { + const data: Index = JSON.parse(read(path)) + return (data.sections ?? []).flatMap(section => section.items ?? []) +} +export const loadIds = (path: string): Set<string> => new Set(indexItems(path).map(item => item.id)) +export function checkIndex(config: CollectionConfig): Issue[] { + return indexItems(config.index).filter(item => !existsSync(pathJoin(config.source, item.file))) + .map(item => ({ path: config.index, message: `Index refers to missing file: ${item.file}` })) +} +export function normalizeRelPath(input: string): string | undefined { + if (!input) return undefined + const raw = trim(input).replaceAll('\\', '/').replace(/^\.\//, '').replace(/^\/+/, '') + const parts: string[] = [] + for (const rawPart of raw.split('/')) { + const part = trim(rawPart) + if (!part || part === '.') continue + if (part === '..') { if (!parts.length) return undefined; parts.pop() } + else parts.push(part) + } + const result = parts.join('/') + return result && !result.includes('\0') ? result : undefined +} +function canonical(path: string): string { + try { return realpathSync(path) } catch { + const parent = dirname(path) + return parent === path ? path : resolve(canonical(parent), path.slice(parent.length + 1)) + } +} +export function resolveDoclikeTarget(href: string, file: string, root: string, sources: Record<string, string>): string | undefined { + let raw = trim(href) + if (raw.startsWith('<') && raw.endsWith('>')) raw = trim(raw.slice(1, -1)) + if (!raw || ['http://', 'https://', 'mailto:', 'tel:', 'data:', 'javascript:', '#'].some(p => raw.startsWith(p))) return + if (raw.startsWith('?p=') || raw.startsWith('/?p=') || raw.includes('&p=')) return + raw = trim(raw.split('#', 1)[0]!.split('?', 1)[0]!) + if (!raw || !(raw.endsWith('.md') || raw.endsWith('.txt') || Object.keys(sources).some(p => raw.startsWith(`${p}/`)))) return + if (raw.startsWith('/')) return pathJoin(root, raw.replace(/^\/+/, '')) + for (const [prefix, source] of Object.entries(sources)) { + if (raw.startsWith(`${prefix}/`)) { + const rel = normalizeRelPath(raw.slice(prefix.length + 1)) + return rel ? pathJoin(source, rel) : undefined + } + } + const rel = normalizeRelPath(raw) + if (!rel) return + const target = canonical(resolve(dirname(file), rel)) + const fromRoot = relative(root, target) + if (fromRoot === '..' || fromRoot.startsWith('../') || isAbsolute(fromRoot)) return + return target +} +export function checkPLinks(config: CollectionConfig, ids: Record<string, Set<string>>, includeKind = false): Issue[] { + const issues: Issue[] = [] + for (const path of markdownFiles(config.source)) for (const match of read(path).matchAll(/(?:([a-zA-Z0-9_-]+)\/)?\?p=([a-zA-Z0-9_./-]+)/g)) { + const kind = match[1] || config.kind + const id = match[2]! + if (!ids[kind]?.has(id)) issues.push({ path, message: `Broken ?p= link: ${includeKind ? `${kind}/` : ''}${id}` }) + } + return issues +} +export function checkDocLinks(source: string, root: string, sources: Record<string, string>): Issue[] { + const issues: Issue[] = [] + for (const path of markdownFiles(source)) for (const match of read(path).matchAll(/\[[^\]]*\]\(([^)]+)\)/g)) { + const href = match[1]! + const target = resolveDoclikeTarget(href, path, root, sources) + if (target && !existsSync(target)) { + const display = target.startsWith(root + '/') ? target.slice(root.length + 1) : target + issues.push({ path, message: `Missing link target: ${href} -> ${display}` }) + } + } + return issues +} +const editorial = [ + '^\\s*#{1,6}\\s+(?:Status(?:\\s*\\([^)]*\\))?|Status and Future Work|Future Work|Follow-ups)\\s*$', + '^\\s*#{1,6}\\s+.+\\s+\\(Planned(?:[^)]*)\\)\\s*$', + '^\\s*Status:\\s*\\*\\*.+\\*\\*', + '^\\s*#{1,6}\\s+Current API(?:\\s*\\([^)]*\\))?\\s*$', + '^\\s*#{1,6}\\s+API\\s*\\((?:selected|implemented[^)]*|initial[^)]*|current[^)]*)\\)\\s*$', + '\\b(?:Implemented subset|Current supported|Implemented-subset|active expansion|current compiler subset|initial implementation)\\b', +].map(source => pattern(source, 'i')) +export function checkLines(source: string, kind: 'viewer' | 'manpage' | 'editorial'): Issue[] { + const issues: Issue[] = [] + const expressions = kind === 'editorial' ? editorial : kind === 'viewer' + ? [/(?<!\]\()(?<!\()(?<!\/)\?p=[a-zA-Z0-9_./-]+/] + : [/(?<!\[)`[A-Za-z0-9_:+.-]+` \(([137])\)/] + const message = kind === 'editorial' ? 'avoid status-style or transitional editorial framing in published docs.' + : `raw ${kind === 'viewer' ? '?p=' : 'manpage'} reference must be a markdown link.` + for (const path of markdownFiles(source)) { + let fence = false + for (const [index, line] of lines(read(path)).entries()) { + const stripped = line.replace(pattern('^\\s+'), '') + if (stripped.startsWith('```') || stripped.startsWith('~~~')) { fence = !fence; continue } + if (fence || (kind !== 'editorial' && stripped.startsWith('#'))) continue + if (expressions.some(re => re.test(line))) issues.push({ path, message: `Line ${index + 1}: ${message}` }) + } + } + return issues +} +export function reportIssues(issues: Issue[], root: string, success: string, reporter: Reporter = console, label = 'issues'): number { + if (!issues.length) { reporter.log(success); return 0 } + for (const issue of issues.slice(0, 200)) reporter.error(`${relative(root, issue.path)}: ${issue.message}`) + if (issues.length > 200) reporter.error(`... and ${issues.length - 200} more`) + reporter.error(`FAIL: ${issues.length} ${label}`) + return 1 +} +export function runSiteAudit(context: AuditContext, collection: Exclude<Collection, 'silkWiki'>, reporter: Reporter = console): number { + const config = collectionConfig(context, collection) + const title = { runtime: 'Runtime', silk: 'Silk', sage: 'Sage', slg: 'Slg', virtnosis: 'Virtnosis' }[collection] + if (!existsSync(config.index)) { reporter.error(`Missing ${title} docs/index.json; run build scripts first.`); return 2 } + return reportIssues([ + ...checkIndex(config), ...checkPLinks(config, { docs: loadIds(config.index) }), + ...checkDocLinks(config.source, context.outputRoot, { docs: config.source }), + ...checkLines(config.source, 'viewer'), ...checkLines(config.source, 'manpage'), ...checkLines(config.source, 'editorial'), + ], context.outputRoot, `OK: ${collection} site audit passed`, reporter) +} diff --git a/tools/audits/runtime.ts b/tools/audits/runtime.ts new file mode 100644 index 00000000..5c7dff62 --- /dev/null +++ b/tools/audits/runtime.ts @@ -0,0 +1,65 @@ +import { existsSync } from 'node:fs' +import { collectionConfig, markdownFiles, pathJoin, pattern, read, reportIssues, runSiteAudit } from './common.ts' +import type { AuditContext, Issue, Reporter } from './common.ts' + +const curated = new Map(['ai', 'application', 'extension', 'fs', 'hooks', 'mcp', 'notification', 'secure-storage', 'window'].map(name => [`oro:${name}`, `${name}.md`])) +const excluded = new Set(['oro:bootstrap', 'oro:external', 'oro:internal', 'oro:node', 'oro:node-esm-loader']) +const cliDocs: Record<string, string> = Object.fromEntries([ + ['oroc', 'oroc'], ...['help', 'update', 'build', 'run', 'list-devices', 'env', 'mcp', 'init', 'install-app', 'print-build-dir', 'setup', 'config', 'versions', 'version'].map(name => [`oroc ${name}`, name]), + ...['init', 'server', 'info', 'keygen', 'sign', 'verify', 'validate', 'bundle', 'extract'].map(name => [`oroc update-${name}`, `update/${name}`]), +].map(([section, path]) => [section, `cli/${path}.md`])) + +export function runtimeIssues(context: AuditContext): Issue[] { + const issues: Issue[] = [] + const docs = collectionConfig(context, 'runtime').source + const javascript = pathJoin(docs, 'javascript') + const add = (path: string, message: string): void => { issues.push({ path, message }) } + const moduleIndex = pathJoin(javascript, 'module-index.md') + if (existsSync(moduleIndex)) add(moduleIndex, 'remove this page; link JavaScript API entry points to javascript/overview.') + for (const path of markdownFiles(javascript, false).sort()) { + const text = read(path) + const name = path.slice(path.lastIndexOf('/') + 1) + if (text.includes('console.log(Object.keys(api))')) add(path, 'remove generic Object.keys(api) examples; document a real usage flow instead.') + if (!['overview.md', 'all-modules.md', ...curated.values()].includes(name) && !pattern('^\\s*##\\s+.*examples?\\b', 'im').test(text)) add(path, 'missing an Examples section.') + } + const index = context.runtimeRepo === undefined ? undefined : pathJoin(context.runtimeRepo, 'api/index.d.ts') + const specifiers = new Set(index && existsSync(index) ? [...read(index).matchAll(/^declare module ['"](oro:[^'"]+)['"]/gm)].map(match => match[1]!) : []) + const families = new Set([...specifiers].map(spec => spec.split('/')[0]!)) + if (families.size && specifiers.size) { + for (const family of [...families].filter(family => !excluded.has(family)).sort()) { + const expected = pathJoin(javascript, curated.get(family) ?? `${family.replace(/^oro:/, '')}.md`) + if (!existsSync(expected)) add(expected, `missing docs page for published module family ${family}.`) + } + for (const family of [...excluded].sort()) { + const path = pathJoin(javascript, `${family.replace(/^oro:/, '')}.md`) + if (existsSync(path)) add(path, `excluded private module family ${family} should not have a public docs page.`) + } + const allModulesPath = pathJoin(javascript, 'all-modules.md') + const allModules = read(allModulesPath) + for (const family of [...excluded].sort()) { + const escaped = family.replace(/[.*+?^${}()|[\]\\]/g, '\\$&') + if (new RegExp('`?' + escaped + '(?:/\\*|/[A-Za-z0-9._-]+(?:/[A-Za-z0-9._-]+)*)`?').test(allModules)) add(allModulesPath, `excluded private module family ${family} should not appear in the public module listing.`) + } + for (const spec of [...specifiers].filter(spec => !excluded.has(spec.split('/')[0]!)).sort()) { + if (!allModules.includes(spec)) add(allModulesPath, `missing published module specifier ${spec}.`) + } + } + const cli = context.runtimeRepo === undefined ? undefined : pathJoin(context.runtimeRepo, 'api/CLI.md') + const sections = new Set(cli && existsSync(cli) ? [...read(cli).matchAll(pattern('^##\\s+([^\\n]+)$', 'gm'))].map(match => match[1]!) : []) + if (sections.size) for (const section of Object.keys(cliDocs).sort()) { + const path = pathJoin(docs, cliDocs[section]!) + if (sections.has(section) && !existsSync(path)) add(path, `missing website docs page for upstream CLI section \`${section}\`.`) + } + const stalePatterns = [/oro-computer\/oro-runtime/, /oro-computer\/legacy-runtime/, pattern('\\blegacy-runtime\\b')] + for (const rel of ['index.html', 'runtime/index.html', 'runtime/docs/index.html']) { + const path = pathJoin(context.outputRoot, rel) + const text = read(path) + for (const expression of stalePatterns) if (expression.test(text)) add(path, 'stale runtime repository reference (deprecated runtime repository alias).') + } + return issues +} +export function runRuntimeAudit(context: AuditContext, reporter: Reporter = console): number { + const rc = runSiteAudit(context, 'runtime', reporter) + if (rc !== 0) return rc + return reportIssues(runtimeIssues(context), context.outputRoot, 'OK: runtime docs audit passed', reporter, 'runtime docs issues') +} diff --git a/tools/audits/silk.ts b/tools/audits/silk.ts new file mode 100644 index 00000000..fc71bcf3 --- /dev/null +++ b/tools/audits/silk.ts @@ -0,0 +1,75 @@ +import { existsSync } from 'node:fs' +import { relative } from 'node:path' +import { checkDocLinks, checkIndex, checkLines, checkPLinks, collectionConfig, lines, loadIds, markdownFiles, pathJoin, pattern, read, reportIssues, trim } from './common.ts' +import type { AuditContext, Issue, Reporter } from './common.ts' + +function checkText(source: string, expression: RegExp, message: string): Issue[] { + return markdownFiles(source).filter(path => expression.test(read(path))).map(path => ({ path, message })) +} +export function runSilkAudit(context: AuditContext, reporter: Reporter = console): number { + const configs = [collectionConfig(context, 'silk'), collectionConfig(context, 'silkWiki')] + if (configs.some(config => !existsSync(config.index))) { + reporter.error('Missing Silk index.json files; run build scripts first.') + return 2 + } + const docs = configs[0]! + const wiki = configs[1]! + const ids = { docs: loadIds(docs.index), wiki: loadIds(wiki.index) } + const sources = { docs: docs.source, wiki: wiki.source, spec: pathJoin(docs.source, 'spec') } + const issues = [ + ...configs.flatMap(checkIndex), + ...configs.flatMap(config => checkPLinks(config, ids, true)), + ...configs.flatMap(config => checkDocLinks(config.source, context.outputRoot, sources)), + ...configs.flatMap(config => checkText(config.source, pattern('\\bconst\\s+region\\s+arena\\b|\\bexport\\s+const\\s+region\\s+arena\\b|\\bwith\\s+arena\\b\\s*\\{|\\bfrom\\s+arena\\b|\\bglobal_arena\\b', 'i'), 'Found arena identifier in examples (use regions + neutral names).')), + ...configs.flatMap(config => checkText(config.source, pattern('\\bWorks today\\b|\\bWhat works today\\b|\\(Works today\\)|Syntax\\s*\\(Selected\\)', 'i'), "Found deprecated 'Works today' / 'Syntax (Selected)' labeling.")), + ...configs.flatMap(config => checkLines(config.source, 'viewer')), + ...configs.flatMap(config => checkLines(config.source, 'manpage')), + ...configs.flatMap(config => checkLines(config.source, 'editorial')), + ] + const spec = pathJoin(docs.source, 'spec/2026.md') + if (existsSync(spec) && pattern('\\bchecker\\.[A-Za-z0-9_]+\\b|\\bsrc/[A-Za-z0-9_./-]+|\\bc-tests/|\\btests/silk/', 'i').test(read(spec))) { + issues.push({ path: spec, message: 'Spec contains repo-internal paths/names (remove or generalize).' }) + } + return reportIssues(issues, context.outputRoot, 'OK: silk site audit passed', reporter) +} +const order = ['Description', 'Exported API', 'Examples', 'Considerations', 'Design goals', 'See also'] +const bannedHeadings = ['API', 'Current API', 'Implemented API', 'Public API', 'High-Level API', 'Intended Surface', 'Current Surface', 'Current Grammar Coverage', 'Goals', 'Design Goals', 'Future Work', 'Future work', 'Follow-ups', 'Remaining Follow-Ups', 'Important Limitations', 'Current Limitations', 'Notes and Limitations'] +const headingPatterns = ['\\bInitial Design\\b', '\\bCurrent Scope\\b', '\\bScope \\(Current\\)\\b', '\\bMVP\\b'].map(source => pattern(source, 'i')) +const statusPatterns = ['active expansion', 'current snapshot', 'Partially implemented', 'initial std wrapper', 'expansion path', '\\bMVP\\b'] +export function stdlibIssues(context: AuditContext): Issue[] { + const issues: Issue[] = [] + for (const path of markdownFiles(pathJoin(collectionConfig(context, 'silk').source, 'std'), false).sort()) { + const text = read(path) + for (const source of statusPatterns) if (pattern(source, 'i').test(text)) issues.push({ path, message: `Status/body uses banned transitional wording: ${source}` }) + const headings = lines(text).filter(line => line.startsWith('## ')).map(line => trim(line.slice(3))) + for (const heading of headings) { + for (const banned of bannedHeadings) if (heading === banned) issues.push({ path, message: `Banned heading: ${heading}` }) + for (const expression of headingPatterns) if (expression.test(heading)) issues.push({ path, message: `Banned heading pattern: ${heading}` }) + } + const positions = new Map(headings.map((heading, index) => [heading, index])) + let last = -1 + const seen: string[] = [] + for (const heading of order) { + const pos = positions.get(heading) + if (pos === undefined) continue + if (pos < last) { issues.push({ path, message: `Section order violation: ${[...seen, heading].join(' -> ')}` }); break } + last = pos + seen.push(heading) + } + } + return issues +} +export function runStdlibAudit(context: AuditContext, reporter: Reporter = console): number { + const issues = stdlibIssues(context) + if (issues.length) { + // The original stdlib audit reports workspace-relative paths on stdout, without a summary or cap. + for (const issue of issues) { + const rel = relative(context.siteRoot, issue.path) + if (rel === '..' || rel.startsWith('../')) throw new Error(`${issue.path} is not in the subpath of ${context.siteRoot}`) + reporter.log(`${rel}: ${issue.message}`) + } + return 1 + } + reporter.log('Stdlib doc audit passed.') + return 0 +} diff --git a/tools/import-public.ts b/tools/import-public.ts index d369a1aa..a5d0a4a8 100644 --- a/tools/import-public.ts +++ b/tools/import-public.ts @@ -100,7 +100,7 @@ export async function importCollection( const text = linkReferences(body, collection, file, catalog) const metadata = { ...(previous?.metadata || { - layout: file === 'spec/2026.md' ? 'spec' : 'docs', + layout: collection === 'silk' && file === 'spec/2026.md' ? 'spec' : `${collection}-docs`, title, description: '', docsCollection: collection, diff --git a/tools/migration/content.ts b/tools/migration/content.ts index 4c7187a6..6f6eff61 100644 --- a/tools/migration/content.ts +++ b/tools/migration/content.ts @@ -1,5 +1,5 @@ import MarkdownIt from 'markdown-it' -import { sanitizeMarkdown, sanitizeSpecMarkdown } from './public-copy.js' +import { sanitizeMarkdown, sanitizeSpecMarkdown } from './public-copy.ts' import { canonicalLink } from '../../src/lib/urls.ts' import { collections, type Collection } from '../../src/lib/collections.ts' const parser = new MarkdownIt({ html: true }) diff --git a/tools/migration/migrate.ts b/tools/migration/migrate.ts index 8d88615d..29c4dd79 100644 --- a/tools/migration/migrate.ts +++ b/tools/migration/migrate.ts @@ -81,7 +81,7 @@ for (const [key, c] of Object.entries(collections)) { order: order++, } const vars = { - layout: id === 'spec/2026' ? 'spec' : 'docs', + layout: collection === 'silk' && id === 'spec/2026' ? 'spec' : `${collection}-docs`, title: info.title.replace(/`/g, ''), description: description(body), docsCollection: collection, diff --git a/tools/migration/public-copy.js b/tools/migration/public-copy.ts similarity index 96% rename from tools/migration/public-copy.js rename to tools/migration/public-copy.ts index 93112f66..784f9f4d 100644 --- a/tools/migration/public-copy.js +++ b/tools/migration/public-copy.ts @@ -1,5 +1,10 @@ // Public-copy normalization, moved from the legacy viewer. Import-time only. -export function sanitizeMarkdown(markdown, { currentFile = "", kind = "docs" } = {}) { +export interface SanitizeMarkdownOptions { + currentFile?: string; + kind?: "docs" | "wiki"; +} + +export function sanitizeMarkdown(markdown: string, { currentFile = "", kind = "docs" }: SanitizeMarkdownOptions = {}): string { const banned = /(STATUS\.md|PLAN\.md|docs\/wiki\/style-guide\.md|_template-[^`\\s]+|style-guide\.md|README\.md)/; const statusLine = /^(Status:|Implementation status:)\s*/i; @@ -7,7 +12,7 @@ export function sanitizeMarkdown(markdown, { currentFile = "", kind = "docs" } = const isLanguageDoc = String(currentFile || "").startsWith("language/"); const testsHeading = /^(#{1,6})\s+Tests\b/i; - function rewriteStatusLine(line) { + function rewriteStatusLine(line: string): string | null { const m = String(line).match(/^(\s*)(Status:|Implementation status:)\s*/i); if (!m) return null; const leading = m[1] || ""; @@ -32,7 +37,7 @@ export function sanitizeMarkdown(markdown, { currentFile = "", kind = "docs" } = return leading + rest.slice(cut + cutLen); } - function rewriteOutsideCode(text) { + function rewriteOutsideCode(text: string): string { let out = text; // Headings @@ -178,8 +183,8 @@ export function sanitizeMarkdown(markdown, { currentFile = "", kind = "docs" } = const lines = String(markdown).split("\n"); const out = []; let inCode = false; - let codeLang = null; - let skipLevel = null; + let codeLang: string | null = null; + let skipLevel: number | null = null; let skipRepoFixtureList = false; let skipWikiFixtureBullets = false; @@ -307,7 +312,7 @@ export function sanitizeMarkdown(markdown, { currentFile = "", kind = "docs" } = } - function dropProposalProcess(markdown) { + function dropProposalProcess(markdown: string): string { const lines = String(markdown).split("\n"); const out = []; let i = 0; @@ -324,7 +329,7 @@ export function sanitizeMarkdown(markdown, { currentFile = "", kind = "docs" } = return out.join("\n"); } -export function sanitizeSpecMarkdown(markdown) { +export function sanitizeSpecMarkdown(markdown: string): string { // Keep the spec faithful, but remove repo-workflow prose and status framing // that does not belong in a standalone reader-facing specification. const banned = @@ -333,7 +338,7 @@ export function sanitizeSpecMarkdown(markdown) { const statusHeading = /^(#{1,6})\s+(Status|Implementation status)\s*:?\s*$/i; const testsHeading = /^(#{1,6})\s+Tests\b/i; - function rewriteStatusLine(line) { + function rewriteStatusLine(line: string): string | null { const m = String(line).match(/^(\s*)(Status:|Implementation status:)\s*/i); if (!m) return null; const leading = m[1] || ""; @@ -353,7 +358,7 @@ export function sanitizeSpecMarkdown(markdown) { return leading + rest.slice(cut + cutLen); } - function rewriteOutsideCode(text) { + function rewriteOutsideCode(text: string): string { let out = text; // Generated-spec phrasing: make the single-file edition self-contained. @@ -433,8 +438,8 @@ export function sanitizeSpecMarkdown(markdown) { const lines = md.split("\n"); const out = []; let inCode = false; - let skipLevel = null; - let codeLang = null; + let skipLevel: number | null = null; + let codeLang: string | null = null; let skipFixtureList = false; for (let line of lines) { @@ -537,7 +542,7 @@ export function sanitizeSpecMarkdown(markdown) { ); } else { // In code fences, rewrite comment text only. - const rewriteComment = (comment) => { + const rewriteComment = (comment: string): string => { const leading = (comment.match(/^\s*/) || [""])[0]; const body = comment.slice(leading.length); const rewritten = body diff --git a/tools/serve-output.ts b/tools/serve-output.ts new file mode 100644 index 00000000..d9b6a970 --- /dev/null +++ b/tools/serve-output.ts @@ -0,0 +1,67 @@ +import { createServer } from 'node:http' +import { readFile, realpath, stat } from 'node:fs/promises' +import { extname, isAbsolute, join, relative, resolve } from 'node:path' + +// Serve the already-validated artifact, without rebuilding it or injecting a client. +const root = await realpath(resolve('public')) +const types: Record<string, string> = { + '.html': 'text/html; charset=utf-8', + '.css': 'text/css; charset=utf-8', + '.js': 'text/javascript; charset=utf-8', + '.json': 'application/json; charset=utf-8', + '.map': 'application/json; charset=utf-8', + '.md': 'text/plain; charset=utf-8', + '.txt': 'text/plain; charset=utf-8', + '.xml': 'application/xml; charset=utf-8', + '.svg': 'image/svg+xml', + '.png': 'image/png', + '.jpg': 'image/jpeg', + '.jpeg': 'image/jpeg', + '.webp': 'image/webp', + '.ico': 'image/x-icon', + '.woff': 'font/woff', + '.woff2': 'font/woff2', +} +function insideRoot(path: string): boolean { + const rel = relative(root, path) + return !isAbsolute(rel) && rel !== '..' && !rel.startsWith('../') +} +const server = createServer(async (req, res) => { + if (req.method !== 'GET' && req.method !== 'HEAD') { + res.writeHead(405, { Allow: 'GET, HEAD' }).end() + return + } + try { + const url = new URL(req.url || '/', 'http://127.0.0.1:9877') + const pathname = decodeURIComponent(url.pathname) + let path = await realpath(resolve(root, '.' + pathname)) + if (!insideRoot(path)) { + res.writeHead(403).end() + return + } + if ((await stat(path)).isDirectory()) { + if (!url.pathname.endsWith('/')) { + res.writeHead(301, { Location: url.pathname + '/' + url.search }).end() + return + } + path = await realpath(join(path, 'index.html')) + } + if (!insideRoot(path)) { + res.writeHead(403).end() + return + } + const body = await readFile(path) + res.writeHead(200, { + 'Content-Type': types[extname(path)] || 'application/octet-stream', + 'Content-Length': body.length, + 'Cache-Control': 'no-store', + }) + res.end(req.method === 'HEAD' ? undefined : body) + } catch (error) { + const code = (error as NodeJS.ErrnoException).code + res.writeHead(error instanceof URIError ? 400 : code === 'ENOENT' || code === 'ENOTDIR' ? 404 : 500).end() + } +}) +server.listen(9877, '127.0.0.1', () => console.log('Serving public/ at http://127.0.0.1:9877')) +for (const signal of ['SIGINT', 'SIGTERM'] as const) + process.on(signal, () => server.close()) diff --git a/tools/silk-editorial.ts b/tools/silk-editorial.ts new file mode 100644 index 00000000..05972a1e --- /dev/null +++ b/tools/silk-editorial.ts @@ -0,0 +1,192 @@ +import { basename, dirname } from 'node:path' +import { splitLines } from './source-pages.ts' +import { normalize_region_identifiers, normalize_editorial_framing } from './silk-ingestion-data.ts' + +// These ordered substitutions are the existing public-copy policy, not a new editorial pass. +function replacements(text: string, pairs: string[][], flags = 'g'): string { + for (const [pattern, replacement] of pairs) text = text.replace(new RegExp(pattern, flags), () => replacement) + return text +} +function mapLines(text: string, transform: (line: string) => string): string { + let inCode = false + return splitLines(text).map(raw => { + if (/^\s*(```|~~~)/.test(raw)) { inCode = !inCode; return raw.trimEnd() } + return inCode ? raw.trimEnd() : transform(raw) + }).join('\n') + (text.endsWith('\n') ? '\n' : '') +} +export function normalizeRegionIdentifiers(text: string): string { return replacements(text, normalize_region_identifiers) } +export function normalizeSharedMarkdown(text: string): string { + for (const [from, to] of [ + ['https://oro.computer/silk/docs/?p=', '?p='], ['https://oro.computer/silk/wiki/?p=', 'wiki/?p='], + ['?p=docs/', '?p='], ['docs/?p=', '?p='], ['?p=wiki/', 'wiki/?p='], + ]) text = text.replaceAll(from, to) + text = text.replace(/^(\s*\/\/\s*)Works today\b/gm, '$1Supported') + .replace(/^(\s*#{2,6}\s+)Syntax\s+\(Selected\)\s*$/gm, '$1Syntax') + .replace(/^(\s*#{2,6}\s+)(Example|Examples)\s+\(Works today\)(?::\s*(.+))?\s*$/gm, (_, p, label, detail) => p + label + (detail ? ': ' + detail : '')) + .replace(/^(\s*#{2,6}\s+)Works today(?::\s*(.+))?\s*$/gm, (_, p, detail) => p + 'Example' + (detail ? ': ' + detail : '')) + .replace(/^(\s*#{2,6}\s+)What works today(?:\s*\([^)]*\))?\s*$/gm, '$1Current subset') + .replace(/^Works today\b/gm, 'Current subset') + .replaceAll('examples labeled “Works today”', 'examples labeled “Example”') + return normalizeRegionIdentifiers(text) +} +function linkLabel(target: string): string { return target.split('/').at(-1)!.replaceAll('-', ' ').replaceAll('_', ' ') } +function docLinkTarget(target: string): string | undefined { + target = target.replace(/\.md$/, '') + for (const prefix of ['docs/', 'wiki/']) if (target.startsWith(prefix)) target = target.slice(prefix.length) + target = ({ 'language/README': 'start', 'usage/README': 'start', 'usage/tutorials/README': 'start', 'std/runtime-event-loop': 'std/runtime' } as Record<string, string>)[target] ?? target + return ['std/foo', 'std/foo-bar', 'man/my-app.7'].includes(target) ? undefined : target +} +export function normalizeUserFacingLinks(text: string): string { + return mapLines(text, raw => { + let line = raw.trimEnd().replace(/`?\?p=\.\.\.`?/g, 'docs links') + .replace(/`\?p=([a-zA-Z0-9_./-]+)`/g, (_, target) => `[${linkLabel(target)}](?p=${target})`) + line = line.replace(/(^|[\s:;,(])(?<!\]\()(?<!\/)\?p=([a-zA-Z0-9_./-]+)/g, (match, prefix, target) => { + const dest = docLinkTarget(target) + return dest === undefined ? match : `${prefix}[${linkLabel(dest)}](?p=${dest})` + }) + line = line.replace(/(^|[\s:;,(])(?<!\[)`([A-Za-z0-9_:+.-]+)`\s+\(([137])\)/g, (_, prefix, name: string, section) => + `${prefix}[\`${name}(${section})\`](?p=${name.startsWith('std::') ? name.replaceAll('::', '/') : `man/${name}.${section}`})`) + line = line.replace(/\[`?docs\/([a-zA-Z0-9_./-]+\.md)`?\]\([^)]+\)/g, (match, target) => { + const dest = docLinkTarget(target) + return dest === undefined ? match : `[${linkLabel(dest)}](?p=${dest})` + }) + return line.replace(/(^|[\s:;,(])`?docs\/([a-zA-Z0-9_./-]+\.md)`?/g, (match, prefix, target) => { + const dest = docLinkTarget(target) + return dest === undefined ? match : `${prefix}[${linkLabel(dest)}](?p=${dest})` + }) + }) +} +export function normalizeEditorialFraming(text: string): string { + return mapLines(text, raw => { + let line = raw + const heading = /^(\s*#{1,6}\s+)(.+?)\s*$/.exec(line) + if (heading) { + let title = heading[2].trim() + .replace(/\s+\((?:Initial\s+)?(?:Current\s+)?(?:Implemented|supported|compiler|initial|selected|planned|current|implementation status)[^)]*\)/gi, '') + .replace(/\s+\(Planned[^)]*\)/gi, '') + if (/^(?:Status(?:\s*\([^)]*\))?|Implementation Status(?:\s*\([^)]*\))?|Status and Future Work|Future Work|Follow-ups)$/i.test(title)) title = 'Notes' + else if (/^Notes and Limitations$/i.test(title)) title = 'Considerations' + else if (/^(?:Current API(?:\s*\([^)]*\))?|Implemented API|Public API|API\s*\([^)]*\)|API\s*\(current\))$/i.test(title)) title = 'Exported API' + else if (/^(?:Current Implemented Subset|Implemented Subset|Implemented subset)$/i.test(title)) title = 'Notes' + line = heading[1] + title.replace(/\s{2,}/g, ' ').trim() + } + return replacements(line, normalize_editorial_framing, 'gi').replace(/\s{2,}/g, ' ').trimEnd() + }) +} +export function normalizeTrailingNewlines(text: string): string { return text.trimEnd() + '\n' } +export function moveSectionToEnd(text: string, heading: string): string { + const section: string[] = [], out: string[] = [] + let inCode = false, capture = false, captureLevel = 0 + for (const raw of splitLines(text)) { + if (/^\s*(```|~~~)/.test(raw)) inCode = !inCode + if (!inCode) { + const m = /^(#{1,6})\s+(.+?)\s*$/.exec(raw) + if (m) { + if (capture && m[1].length <= captureLevel) capture = false + if (!capture && m[2].trim().toLowerCase() === heading.toLowerCase()) { capture = true; captureLevel = m[1].length } + } + } + ;(capture ? section : out).push(raw.trimEnd()) + } + if (!section.length) return text + while (out.length && !out.at(-1)!.trim()) out.pop() + while (section.length && !section.at(-1)!.trim()) section.pop() + return [...out, '', ...section].join('\n') + '\n' +} +export function normalizeHeadingsForContext(path: string, text: string): string { + text = text.replaceAll('`docs/language/mutability.md`', 'the mutability docs') + .replaceAll('`docs/language/literals-duration.md`', 'the duration literal docs') + .replaceAll('?p=std/runtime-event-loop', '?p=std/runtime') + if (path.includes('/wiki/source/')) text = text.replace(/\]\(\?p=(compiler|man|usage|guides)\//g, '](../docs/?p=$1/') + if (basename(dirname(path)) === 'std') { + for (const [from, to] of [ + ['API', 'Exported API'], ['High-Level API', 'Exported API'], ['Intended Surface', 'Exported API'], ['Current Surface', 'Exported API'], + ['Current Grammar Coverage', 'Grammar coverage'], ['Goals', 'Design goals'], ['Design Goals', 'Design goals'], + ['Important Limitations', 'Considerations'], ['Remaining Follow-Ups', 'Considerations'], + ]) text = text.replace(new RegExp('^## ' + from + '$', 'gm'), '## ' + to) + text = text.replace(/^## Implemented (`std::interfaces` surface)$/gm, '## $1') + .replaceAll('current API surface', 'exported API surface').replaceAll('API surface (current):', 'API surface:') + text = moveSectionToEnd(text, 'Design goals') + } + if (basename(dirname(path)) === 'language') { + text = text.replace(/^## Goals$/gm, '## Semantics').replace(/^## Design Goals$/gm, '## Model') + .replace(/^### Important Limitations$/gm, '### Considerations') + if (basename(path) === 'flow-for.md') text = text.replaceAll('element.\n\n: integer range iteration', 'element.\n\nSupported forms include integer range iteration') + .replace(/\n## Semantics\n\n- Provide a readable, structured loop construct for iteration\.\n- Avoid .+? hidden allocation\.\n\n## Surface Syntax/gs, '\n## Surface Syntax') + } + return text +} +export function sanitizeWikiMarkdown(_rel: string, text: string): string { + text = normalizeSharedMarkdown(text) + const out: string[] = [] + let inCode = false + for (const raw of splitLines(text)) { + if (raw.trimStart().startsWith('```')) { inCode = !inCode; out.push(raw.trimEnd()); continue } + if (inCode) { out.push(raw.trimEnd()); continue } + if (/^\s*[-*+]\s*(End-to-end support snapshot|Implemented-subset notes)\s*:\s*`?(STATUS|PLAN)\.md`?\s*$/i.test(raw)) continue + let line = raw.replace(/^(\s*[-*+]\s+)Relevant fixtures:\s*/gi, '$1Fixtures: ') + .replace(/^\s*Status:\s*implemented for the current front-end \+\s*native backend subset\.\s*$/gi, 'Implemented in the reference compiler (front-end + native backend subset).') + for (const name of ['STATUS', 'PLAN']) line = line.replace(new RegExp('\\s+(?:and|&)\\s+`?' + name + '\\.md`?\\s*$', 'gi'), '') + .replace(new RegExp('`?' + name + '\\.md`?', 'gi'), '') + line = line.replace(/\s+(?:and|&)\s*$/gi, '') + const leading = /^\s*/.exec(line)![0] + line = (leading + line.slice(leading.length).replace(/[ \t]{2,}/g, ' ')).trimEnd() + if (/^\s*[-*+]\s*[^A-Za-z0-9`]*\s*$/.test(line)) continue + out.push(line) + } + return normalizeTrailingNewlines(normalizeUserFacingLinks(normalizeEditorialFraming(out.join('\n') + (text.endsWith('\n') ? '\n' : '')))) +} +function dropNamedSection(text: string, heading: string): string { + const out: string[] = [] + let inCode = false, skipLevel: number | undefined + for (const raw of splitLines(text)) { + if (raw.trimStart().startsWith('```')) { + inCode = !inCode + if (skipLevel === undefined) out.push(raw.trimEnd()) + continue + } + if (!inCode && skipLevel !== undefined) { + const m = /^(#{1,6})\s+(.+?)\s*$/.exec(raw) + if (!m || m[1].length > skipLevel) continue + skipLevel = undefined + } + if (!inCode) { + const m = /^(#{1,6})\s+(.+?)\s*$/.exec(raw) + if (m && m[2].trim().toLowerCase() === heading.trim().toLowerCase()) { skipLevel = m[1].length; continue } + } + if (skipLevel === undefined) out.push(raw.trimEnd()) + } + return out.join('\n') + (text.endsWith('\n') ? '\n' : '') +} +export function sanitizeDocsMarkdown(rel: string, text: string): string { + text = normalizeSharedMarkdown(text).replaceAll('`STATUS.md`', '[implementation status](?p=compiler/implementation-status)') + .replaceAll('[implementation status](?p=compiler/implementation-status) (implementation status)', '[implementation status](?p=compiler/implementation-status)') + .replace(/\s*\(tracked[^)]*`PLAN\.md`\)/gi, '') + text = dropNamedSection(dropNamedSection(text, 'Arenas'), 'Tests') + if (rel.startsWith('std/')) text = text.replace(/^Status:\s*\*\*[^*]+\*\*\.\s*/gm, '').replace(/^Status:\s*\*\*[^*]+\*\*\.\s*$/gm, '') + .replace(/^##\s+Current API\s*$/gm, '## Exported API').replace(/^##\s+Implemented API\s*$/gm, '## Exported API').replace(/^##\s+Public API\s*$/gm, '## Exported API') + .replace(/^##\s+(Future Work|Future work|Follow-ups|Current Limitations|Notes and Limitations)\s*$/gm, '## Considerations') + .replace(/^##\s+Current Scope\s*$/gm, '## Considerations') + .replace(/^##\s+(.+?)\s+\((?:Initial Design|MVP|Current)\)\s*$/gm, '## $1') + .replace(/active expansion/gi, 'current module surface').replace(/current snapshot/gi, 'current implementation') + .replace(/Partially implemented/gi, 'Implemented').replace(/initial std wrapper/gi, 'stdlib wrapper').replace(/\bMVP\b/g, 'baseline') + if (rel === 'spec/2026.md') text = dropNamedSection(text, 'Silk Proposal Process (TC39-Inspired)') + .replaceAll('// Works today', '// Supported').replaceAll('checker.checkModuleSetWithImports', 'the module-set import helper') + .replace(/CLI output:\s*`+silk` CLI`?\s+and\s+`+silk`\s+\(1\)\s+—\s+Silk Language Compiler`?\s+\(`silk --version`\)/g, + 'CLI output: the `silk` CLI and [`silk(1)`](?p=man/silk.1) (`silk --version`)') + if (rel === 'compiler/vendored-deps.md') text = text.replace('# Built-In Dependencies\n', '# Built-In Dependencies (Legacy Link)\n') + const out: string[] = [] + let inCode = false + for (const raw of splitLines(text)) { + if (raw.trimStart().startsWith('```')) { inCode = !inCode; out.push(raw.trimEnd()); continue } + if (inCode) { out.push(raw.trimEnd()); continue } + const parts = raw.split('`') + for (let i = 0; i < parts.length; i += 2) parts[i] = parts[i] + .replace(/\bThe repository\b/g, 'The Silk compiler repository').replace(/\bthe repository\b/g, 'the Silk compiler repository') + .replace(/\bThis repository\b/g, 'The Silk compiler repository').replace(/\bthis repository\b/g, 'the Silk compiler repository') + .replace(/\brepo dependency workflow\b/gi, 'Silk compiler repository’s vendored dependency workflow') + .replace(/\bwhat works today\b/gi, 'current implementation notes') + out.push(parts.join('`').trimEnd()) + } + return normalizeTrailingNewlines(normalizeUserFacingLinks(normalizeEditorialFraming(out.join('\n') + (text.endsWith('\n') ? '\n' : '')))) +} diff --git a/tools/silk-ingestion-data.ts b/tools/silk-ingestion-data.ts new file mode 100644 index 00000000..13c0324c --- /dev/null +++ b/tools/silk-ingestion-data.ts @@ -0,0 +1,231 @@ +// Original ownership policy and ordered editorial replacements. +export const EXCLUDE_BASENAMES = [ + "PLAN.md", + "README.md", + "STATUS.md", + "TEMPLATE.md", + "_template-language.md", + "_template-stdlib.md", + "arenas.md", + "llms.txt", + "style-guide.md" +] + +export const KEEP_DOCS_PREFIXES = [ + "guides/" +] + +export const KEEP_DOCS_FILES = [ + "compiler/backend-wasm.md", + "compiler/implementation-status.md", + "compiler/libsilk-quickstart.md", + "compiler/testing-strategy.md", + "compiler/zig-api.md", + "start.md", + "usage/cli-examples.md", + "usage/editor-coc-nvim.md", + "usage/editor-ctags.md", + "usage/editor-textmate.md", + "usage/editor-vim.md", + "usage/getting-started.md", + "usage/github-linguist.md", + "usage/howto-custom-stdlib-root.md", + "usage/howto-run-wasi-node.md", + "usage/tutorials/01-first-program.md", + "usage/tutorials/02-structs-and-impls.md", + "usage/tutorials/03-arrays-and-slices.md", + "usage/tutorials/04-filesystem.md", + "usage/tutorials/05-concurrency.md", + "usage/tutorials/06-async-io-streams-abort.md", + "usage/tutorials/07-formal-silk.md" +] + +export const KEEP_WIKI_FILES = [ + "start.md" +] + +export const normalize_region_identifiers = [ + [ + "\\bexport const region global_arena\\b", + "export const region global_region_buf" + ], + [ + "\\bconst region arena\\b", + "const region region_buf" + ], + [ + "\\bwith arena\\b", + "with region_buf" + ], + [ + "\\bfrom arena\\b", + "from region_buf" + ], + [ + "\\bglobal_arena\\b", + "global_region_buf" + ], + [ + "\\barena\\[", + "region_buf[" + ], + [ + "`arena`", + "`region_buf`" + ], + [ + "`global_arena`", + "`global_region_buf`" + ] +] + +export const normalize_editorial_framing = [ + [ + "\\bStatus:\\s*\\*\\*([^*]+)\\*\\*\\.\\s*", + "" + ], + [ + "\\bStatus:\\s*\\*\\*([^*]+)\\*\\*\\s*", + "" + ], + [ + "\\bStatus:\\s*", + "" + ], + [ + "\\bImplementation status\\s*\\([^)]*\\)\\s*:\\s*", + "" + ], + [ + "\\bImplementation status\\s*:\\s*", + "" + ], + [ + "Returning readers typically want the “Implementation Status” section near the top", + "Returning readers typically want the notes near the top" + ], + [ + "see “Implementation Status” below", + "see the notes below" + ], + [ + "Implementation Status” sections", + "notes sections" + ], + [ + "\\bCurrent supported contexts include\\b", + "Supported contexts include" + ], + [ + "\\bcurrent supported\\b", + "supported" + ], + [ + "\\bCurrent compiler subset restriction\\b", + "Restriction" + ], + [ + "\\bthe current compiler subset\\b", + "Silk currently" + ], + [ + "\\bThe current compiler subset\\b", + "Silk currently" + ], + [ + "\\bcurrent compiler subset\\b", + "current implementation" + ], + [ + "\\bCurrent subset\\b", + "Supported forms" + ], + [ + "\\bcurrent subset\\b", + "supported forms" + ], + [ + "\\bInitial implementation target\\b", + "Implementation target" + ], + [ + "\\binitial implementation target\\b", + "implementation target" + ], + [ + "\\binitial implementation\\b", + "implementation" + ], + [ + "\\bInitial implementation\\b", + "Implementation" + ], + [ + "\\bImplemented-subset notes\\b", + "Notes" + ], + [ + "\\bImplemented-subset details\\b", + "Reference details" + ], + [ + "\\bImplemented-subset\\b", + "Reference" + ], + [ + "\\bImplemented subset notes\\b", + "Notes" + ], + [ + "\\bimplemented subset notes\\b", + "notes" + ], + [ + "\\bImplemented subset\\b", + "Supported forms" + ], + [ + "\\bimplemented subset\\b", + "supported forms" + ], + [ + "\\bImplemented Subset\\b", + "Supported Forms" + ], + [ + "\\bInitial Implemented Subset\\b", + "Supported Forms" + ], + [ + "\\bCurrent Implemented Subset\\b", + "Supported Forms" + ], + [ + "\\bexamples that exercise the supported forms\\b", + "examples" + ], + [ + "\\bExamples that exercise the supported forms\\b", + "Examples" + ], + [ + "\\bactive expansion\\b", + "current module surface" + ], + [ + "\\bPartially implemented\\b", + "Implemented" + ], + [ + "\\bpartially implemented\\b", + "implemented" + ], + [ + "\\bin progress\\b", + "available" + ], + [ + "\\bIn progress\\b", + "Available" + ] +] diff --git a/tools/site_audit_common.py b/tools/site_audit_common.py deleted file mode 100644 index 3a5e19a5..00000000 --- a/tools/site_audit_common.py +++ /dev/null @@ -1,315 +0,0 @@ -#!/usr/bin/env python3 - -from __future__ import annotations - -import json -import re -import sys -from dataclasses import dataclass -from pathlib import Path - - -P_LINK_RE = re.compile(r"(?:(?P<kind>[a-zA-Z0-9_-]+)/)?\?p=(?P<id>[a-zA-Z0-9_./-]+)") -MD_LINK_RE = re.compile(r"\[[^\]]*\]\(([^)]+)\)") -RAW_VIEWER_REF_RE = re.compile(r"(?<!\]\()(?<!\()(?<!/)\?p=[a-zA-Z0-9_./-]+") -RAW_MANPAGE_REF_RE = re.compile(r"(?<!\[)`[A-Za-z0-9_:+.-]+` \(([137])\)") -STATUS_HEADING_RE = re.compile( - r"^\s*#{1,6}\s+(?:Status(?:\s*\([^)]*\))?|Status and Future Work|Future Work|Follow-ups)\s*$", - re.IGNORECASE, -) -PLANNED_HEADING_RE = re.compile(r"^\s*#{1,6}\s+.+\s+\(Planned(?:[^)]*)\)\s*$", re.IGNORECASE) -STATUS_BANNER_RE = re.compile(r"^\s*Status:\s*\*\*.+\*\*", re.IGNORECASE) -CURRENT_API_HEADING_RE = re.compile(r"^\s*#{1,6}\s+Current API(?:\s*\([^)]*\))?\s*$", re.IGNORECASE) -SELECTED_API_HEADING_RE = re.compile( - r"^\s*#{1,6}\s+API\s*\((?:selected|implemented[^)]*|initial[^)]*|current[^)]*)\)\s*$", - re.IGNORECASE, -) -TRANSITIONAL_PHRASE_RE = re.compile( - r"\b(?:Implemented subset|Current supported|Implemented-subset|active expansion|current compiler subset|initial implementation)\b", - re.IGNORECASE, -) - -SKIP_PREFIXES = ("http://", "https://", "mailto:", "tel:", "data:", "javascript:", "#") - - -@dataclass(frozen=True) -class Issue: - path: Path - message: str - - -@dataclass(frozen=True) -class SiteAuditConfig: - project_root: Path - docs_source: Path - docs_index: Path - missing_index_message: str - success_message: str - - @property - def repo_root(self) -> Path: - return self.project_root.parent - - -def load_ids(index_path: Path) -> set[str]: - data = json.loads(index_path.read_text(encoding="utf-8")) - ids: set[str] = set() - for sec in data.get("sections", []): - for item in sec.get("items", []): - ids.add(item["id"]) - return ids - - -def load_index_files(index_path: Path) -> list[str]: - data = json.loads(index_path.read_text(encoding="utf-8")) - files: list[str] = [] - for sec in data.get("sections", []): - for item in sec.get("items", []): - files.append(item["file"]) - return files - - -def normalize_rel_path(input_path: str) -> str | None: - if not input_path: - return None - - raw_path = str(input_path).strip().replace("\\", "/").removeprefix("./").lstrip("/") - parts: list[str] = [] - for raw_part in raw_path.split("/"): - part = raw_part.strip() - if not part or part == ".": - continue - if part == "..": - if not parts: - return None - parts.pop() - continue - parts.append(part) - - normalized = "/".join(parts) - if not normalized or "\0" in normalized: - return None - return normalized - - -def resolve_doclike_target_from_roots( - href: str, - current_file: Path, - repo_root: Path, - source_roots: dict[str, Path], -) -> Path | None: - raw = href.strip() - if not raw: - return None - if raw.startswith("<") and raw.endswith(">"): - raw = raw[1:-1].strip() - if not raw or raw.startswith(SKIP_PREFIXES): - return None - if raw.startswith("?p=") or raw.startswith("/?p=") or "&p=" in raw: - return None - - raw = raw.split("#", 1)[0].split("?", 1)[0].strip() - if not raw: - return None - - looks_like_doc = raw.endswith(".md") or raw.endswith(".txt") or any( - raw.startswith(f"{prefix}/") for prefix in source_roots - ) - if not looks_like_doc: - return None - - if raw.startswith("/"): - return repo_root / raw.lstrip("/") - - for prefix, root in source_roots.items(): - if raw.startswith(f"{prefix}/"): - rel = normalize_rel_path(raw.removeprefix(f"{prefix}/")) - return (root / rel) if rel else None - - rel = normalize_rel_path(raw) - if not rel: - return None - - resolved = (current_file.parent / rel).resolve() - try: - resolved.relative_to(repo_root) - except ValueError: - return None - return resolved - - -def resolve_doclike_target(config: SiteAuditConfig, href: str, current_file: Path) -> Path | None: - return resolve_doclike_target_from_roots( - href=href, - current_file=current_file, - repo_root=config.repo_root, - source_roots={"docs": config.docs_source}, - ) - - -def iter_auditable_lines(md: Path) -> list[tuple[int, str]]: - text = md.read_text(encoding="utf-8") - out: list[tuple[int, str]] = [] - in_fence = False - for lineno, line in enumerate(text.splitlines(), start=1): - stripped = line.lstrip() - if stripped.startswith("```") or stripped.startswith("~~~"): - in_fence = not in_fence - continue - if in_fence or stripped.startswith("#"): - continue - out.append((lineno, line)) - return out - - -def check_index_files_exist_at(index_path: Path, source_root: Path) -> list[Issue]: - issues: list[Issue] = [] - for file_name in load_index_files(index_path): - target = source_root / file_name - if not target.exists(): - issues.append(Issue(index_path, f"Index refers to missing file: {file_name}")) - return issues - - -def check_index_files_exist(config: SiteAuditConfig) -> list[Issue]: - return check_index_files_exist_at(config.docs_index, config.docs_source) - - -def check_p_links_in_tree( - source_root: Path, - default_kind: str, - ids_by_kind: dict[str, set[str]], - *, - include_kind_in_message: bool = False, -) -> list[Issue]: - issues: list[Issue] = [] - for md in source_root.rglob("*.md"): - text = md.read_text(encoding="utf-8") - for match in P_LINK_RE.finditer(text): - target_kind = match.group("kind") or default_kind - target_id = match.group("id") - ids = ids_by_kind.get(target_kind, set()) - if target_id not in ids: - message = f"Broken ?p= link: {target_kind}/{target_id}" if include_kind_in_message else f"Broken ?p= link: {target_id}" - issues.append(Issue(md, message)) - return issues - - -def check_p_links(config: SiteAuditConfig, ids: set[str]) -> list[Issue]: - return check_p_links_in_tree(config.docs_source, "docs", {"docs": ids}) - - -def check_doclike_links_in_tree( - source_root: Path, - repo_root: Path, - source_roots: dict[str, Path], -) -> list[Issue]: - issues: list[Issue] = [] - for md in source_root.rglob("*.md"): - text = md.read_text(encoding="utf-8") - for match in MD_LINK_RE.finditer(text): - href = match.group(1) - target = resolve_doclike_target_from_roots(href, md, repo_root, source_roots) - if not target: - continue - if not target.exists(): - try: - rel = target.relative_to(repo_root) - except ValueError: - rel = target - issues.append(Issue(md, f"Missing link target: {href} -> {rel}")) - return issues - - -def check_doclike_links(config: SiteAuditConfig) -> list[Issue]: - return check_doclike_links_in_tree( - config.docs_source, - config.repo_root, - {"docs": config.docs_source}, - ) - - -def check_no_raw_viewer_refs_in_tree(source_root: Path) -> list[Issue]: - issues: list[Issue] = [] - for md in source_root.rglob("*.md"): - for lineno, line in iter_auditable_lines(md): - if RAW_VIEWER_REF_RE.search(line): - issues.append(Issue(md, f"Line {lineno}: raw ?p= reference must be a markdown link.")) - return issues - - -def check_no_raw_viewer_refs(config: SiteAuditConfig) -> list[Issue]: - return check_no_raw_viewer_refs_in_tree(config.docs_source) - - -def check_no_raw_manpage_refs_in_tree(source_root: Path) -> list[Issue]: - issues: list[Issue] = [] - for md in source_root.rglob("*.md"): - for lineno, line in iter_auditable_lines(md): - if RAW_MANPAGE_REF_RE.search(line): - issues.append(Issue(md, f"Line {lineno}: raw manpage reference must be a markdown link.")) - return issues - - -def check_no_raw_manpage_refs(config: SiteAuditConfig) -> list[Issue]: - return check_no_raw_manpage_refs_in_tree(config.docs_source) - - -def check_no_editorial_status_framing_in_tree(source_root: Path) -> list[Issue]: - issues: list[Issue] = [] - for md in source_root.rglob("*.md"): - text = md.read_text(encoding="utf-8") - in_fence = False - for lineno, line in enumerate(text.splitlines(), start=1): - stripped = line.lstrip() - if stripped.startswith("```") or stripped.startswith("~~~"): - in_fence = not in_fence - continue - if in_fence: - continue - if ( - STATUS_HEADING_RE.search(line) - or PLANNED_HEADING_RE.search(line) - or STATUS_BANNER_RE.search(line) - or CURRENT_API_HEADING_RE.search(line) - or SELECTED_API_HEADING_RE.search(line) - or TRANSITIONAL_PHRASE_RE.search(line) - ): - issues.append( - Issue( - md, - f"Line {lineno}: avoid status-style or transitional editorial framing in published docs.", - ) - ) - return issues - - -def check_no_editorial_status_framing(config: SiteAuditConfig) -> list[Issue]: - return check_no_editorial_status_framing_in_tree(config.docs_source) - - -def run_site_audit(config: SiteAuditConfig) -> int: - if not config.docs_index.exists(): - print(config.missing_index_message, file=sys.stderr) - return 2 - - ids = load_ids(config.docs_index) - issues: list[Issue] = [] - issues += check_index_files_exist(config) - issues += check_p_links(config, ids) - issues += check_doclike_links(config) - issues += check_no_raw_viewer_refs(config) - issues += check_no_raw_manpage_refs(config) - issues += check_no_editorial_status_framing(config) - - if issues: - for issue in issues[:200]: - rel = issue.path.relative_to(config.repo_root) - print(f"{rel}: {issue.message}", file=sys.stderr) - if len(issues) > 200: - print(f"... and {len(issues) - 200} more", file=sys.stderr) - print(f"FAIL: {len(issues)} issues", file=sys.stderr) - return 1 - - print(config.success_message) - return 0 diff --git a/tools/source-pages.py b/tools/source-pages.py deleted file mode 100644 index 2ca65a3a..00000000 --- a/tools/source-pages.py +++ /dev/null @@ -1,43 +0,0 @@ -"""Bridge manual upstream generators to committed DOMStack Markdown pages. - -A temporary flat source tree lets existing editorial logic retain ownership rules. -Only the final Node importer writes page.md files and metadata to the website. -""" -from __future__ import annotations -import subprocess -from pathlib import Path - - -def stage_collection(site: Path, collection: str, dest: Path) -> None: - subprocess.run(['node', str(site / 'tools' / 'import-public.ts'), '--export', - collection, str(dest), str(site)], check=True, cwd=site) - - -def import_collection(site: Path, collection: str, source: Path) -> None: - subprocess.run(['node', str(site / 'tools' / 'import-public.ts'), - collection, str(source), str(site)], check=True, cwd=site) - - -def preserve_fences(text: str, transform) -> str: - import re - fences = [] - lines = text.splitlines(keepends=True) - protected = [] - i = 0 - while i < len(lines): - opening = re.match(r'^ {0,3}(`{3,}|~{3,})([^\n]*)', lines[i]) - if not opening or (opening[1][0] == '`' and '`' in opening[2]): - protected.append(lines[i]) - i += 1 - continue - start = i - marker = opening[1] - i += 1 - while i < len(lines): - closing = re.match(r'^ {0,3}(' + re.escape(marker[0]) + r'{'+str(len(marker))+r',})[ \t]*$', lines[i].rstrip('\n')) - i += 1 - if closing: - break - fences.append(''.join(lines[start:i])) - protected.append(f'OROFENCE{len(fences)-1}END\n') - return re.sub(r'OROFENCE(\d+)END\n?', lambda m: fences[int(m.group(1))], transform(''.join(protected))) diff --git a/tools/source-pages.ts b/tools/source-pages.ts new file mode 100644 index 00000000..a4b2d6e1 --- /dev/null +++ b/tools/source-pages.ts @@ -0,0 +1,74 @@ +import { readFile, writeFile, mkdir, readdir, stat } from 'node:fs/promises' +import { dirname, join } from 'node:path' +import type { Collection } from '../src/lib/collections.ts' + +export async function stageCollection(collection: Collection, dest: string, site: string): Promise<void> { + const { exportCollection } = await import('./import-public.ts') + await exportCollection(collection, dest, site) +} +export async function importCollection(collection: Collection, source: string, site: string): Promise<void> { + const { importCollection: importPublicCollection } = await import('./import-public.ts') + await importPublicCollection(collection, source, site) +} + +// Python's text readers normalize universal newlines before editorial processing. +export async function readText(path: string): Promise<string> { + return (await readFile(path, 'utf8')).replace(/\r\n?/g, '\n') +} +export async function writeTextIfChanged(path: string, text: string): Promise<boolean> { + let previous: string | undefined + try { previous = await readText(path) } catch (error) { + if ((error as NodeJS.ErrnoException).code !== 'ENOENT') throw error + } + if (previous === text) return false + await mkdir(dirname(path), { recursive: true }) + await writeFile(path, text) + return true +} +export async function files(root: string): Promise<string[]> { + try { + const entries = await readdir(root, { recursive: true, withFileTypes: true }) + const paths: string[] = [] + for (const entry of entries) { + const path = join(entry.parentPath, entry.name) + if (entry.isFile()) paths.push(path) + else if (entry.isSymbolicLink()) { + try { if ((await stat(path)).isFile()) paths.push(path) } catch (error) { + if ((error as NodeJS.ErrnoException).code !== 'ENOENT') throw error + } + } + } + return paths.sort() + } catch (error) { + if ((error as NodeJS.ErrnoException).code === 'ENOENT') return [] + throw error + } +} +export function splitLines(text: string): string[] { + if (!text) return [] + const lines = text.split(/\r\n|[\n\r\v\f\x1c-\x1e\x85\u2028\u2029]/) + if (lines.at(-1) === '') lines.pop() + return lines +} +export function preserveFences(text: string, transform: (text: string) => string): string { + const fences: string[] = [] + const lines = text.match(/[^\n\r\v\f\x1c-\x1e\x85\u2028\u2029]*(?:\r\n|[\n\r\v\f\x1c-\x1e\x85\u2028\u2029])|[^\n\r\v\f\x1c-\x1e\x85\u2028\u2029]+$/g) ?? [] + const protectedLines: string[] = [] + // Avoid interpreting authored text as one of our placeholders. + let token = 'OROFENCE' + while (text.includes(token)) token += 'X' + for (let i = 0; i < lines.length;) { + const opening = /^ {0,3}(`{3,}|~{3,})([^\n]*)/.exec(lines[i]) + if (!opening || (opening[1][0] === '`' && opening[2].includes('`'))) { + protectedLines.push(lines[i++]); continue + } + const start = i++ + const closing = new RegExp('^ {0,3}' + opening[1][0] + '{' + opening[1].length + ',}[ \\t]*$') + while (i < lines.length) { + if (closing.test(lines[i++].replace(/\n$/, ''))) break + } + fences.push(lines.slice(start, i).join('')) + protectedLines.push(`${token}${fences.length - 1}END\n`) + } + return transform(protectedLines.join('')).replace(new RegExp(token + '(\\d+)END\\n?', 'g'), (_, index) => fences[Number(index)]) +} diff --git a/tsconfig.json b/tsconfig.json index 3a922577..1c27a622 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -14,14 +14,15 @@ "strict": true, "noEmit": true, "allowImportingTsExtensions": true, - "allowJs": true, - "checkJs": false, + "allowJs": false, "skipLibCheck": true, "erasableSyntaxOnly": true }, "include": [ "src/**/*.ts", "tools/**/*.ts", + "runtime/tools/**/*.ts", + "silk/tools/**/*.ts", "tests/**/*.ts", "playwright.config.ts" ] diff --git a/virtnosis/tools/audit-site.py b/virtnosis/tools/audit-site.py deleted file mode 100644 index d9f18eba..00000000 --- a/virtnosis/tools/audit-site.py +++ /dev/null @@ -1,32 +0,0 @@ -#!/usr/bin/env python3 - -from __future__ import annotations - -import sys -import os -from pathlib import Path - - -SITE_ROOT = Path(__file__).resolve().parents[2] -VIRTNOSIS_ROOT = Path(os.environ.get("ORO_SITE_OUTPUT", str(SITE_ROOT / "public"))) / "virtnosis" -REPO_ROOT = VIRTNOSIS_ROOT.parent - -sys.path.insert(0, str(SITE_ROOT / "tools")) - -from site_audit_common import SiteAuditConfig, run_site_audit - - -def main() -> int: - return run_site_audit( - SiteAuditConfig( - project_root=VIRTNOSIS_ROOT, - docs_source=VIRTNOSIS_ROOT / "docs" / "source", - docs_index=VIRTNOSIS_ROOT / "docs" / "index.json", - missing_index_message="Missing Virtnosis docs/index.json; run build scripts first.", - success_message="OK: virtnosis site audit passed", - ) - ) - - -if __name__ == "__main__": - raise SystemExit(main()) From 187d1dc49ddc3b68224a8c4a9b59b0b8113901ed Mon Sep 17 00:00:00 2001 From: Bret Comnes <bret@comnes.org> Date: Sun, 13 Sep 2026 16:56:46 -0700 Subject: [PATCH 2/5] refactor: simplify documentation to one shared layout --- README.md | 15 +++++++++------ docs/migration.md | 14 +++++++++----- src/global.data.ts | 4 ++-- src/layouts/docs.layout.ts | 12 +++++++----- src/layouts/runtime-docs.layout.ts | 10 ---------- src/layouts/sage-docs.layout.ts | 10 ---------- src/layouts/silk-docs.layout.ts | 10 ---------- src/layouts/silkWiki-docs.layout.ts | 10 ---------- src/layouts/slg-docs.layout.ts | 10 ---------- src/layouts/virtnosis-docs.layout.ts | 10 ---------- src/lib/docs.ts | 7 +++++-- src/navigation.template.ts | 11 +++++++++++ src/runtime-index.template.ts | 6 ------ src/runtime/docs/cli/build/page.md | 2 +- src/runtime/docs/cli/config/page.md | 2 +- src/runtime/docs/cli/env/page.md | 2 +- src/runtime/docs/cli/help/page.md | 2 +- src/runtime/docs/cli/init/page.md | 2 +- src/runtime/docs/cli/install-app/page.md | 2 +- src/runtime/docs/cli/list-devices/page.md | 2 +- src/runtime/docs/cli/mcp/page.md | 2 +- src/runtime/docs/cli/oroc/page.md | 2 +- src/runtime/docs/cli/print-build-dir/page.md | 2 +- src/runtime/docs/cli/run/page.md | 2 +- src/runtime/docs/cli/setup/page.md | 2 +- src/runtime/docs/cli/update/bundle/page.md | 2 +- src/runtime/docs/cli/update/extract/page.md | 2 +- src/runtime/docs/cli/update/info/page.md | 2 +- src/runtime/docs/cli/update/init/page.md | 2 +- src/runtime/docs/cli/update/keygen/page.md | 2 +- src/runtime/docs/cli/update/page.md | 2 +- src/runtime/docs/cli/update/server/page.md | 2 +- src/runtime/docs/cli/update/sign/page.md | 2 +- src/runtime/docs/cli/update/validate/page.md | 2 +- src/runtime/docs/cli/update/verify/page.md | 2 +- src/runtime/docs/cli/version/page.md | 2 +- src/runtime/docs/cli/versions/page.md | 2 +- src/runtime/docs/config/copy-map/page.md | 2 +- src/runtime/docs/config/overview/page.md | 2 +- src/runtime/docs/config/reference/page.md | 2 +- .../docs/guides/build-and-package/page.md | 2 +- .../docs/guides/calling-http-apis/page.md | 2 +- .../configure-your-runtime-project/page.md | 2 +- .../guides/custom-protocols-and-routing/page.md | 2 +- .../docs/guides/desktop-integrations/page.md | 2 +- .../docs/guides/files-and-sandboxing/page.md | 2 +- .../docs/guides/from-zero-to-first-run/page.md | 2 +- .../docs/guides/frontend-build-pipeline/page.md | 2 +- src/runtime/docs/guides/hello-world/page.md | 2 +- .../lifecycle-hooks-and-deep-links/page.md | 2 +- .../docs/guides/local-data-with-sqlite/page.md | 2 +- .../guides/mcp-and-agent-automation/page.md | 2 +- .../mobile-targets-and-device-installs/page.md | 2 +- .../docs/guides/native-extensions/page.md | 2 +- .../offline-first-with-service-workers/page.md | 2 +- src/runtime/docs/guides/project-layout/page.md | 2 +- .../page.md | 2 +- .../guides/secure-storage-and-sessions/page.md | 2 +- .../shared-workers-across-windows/page.md | 2 +- .../docs/guides/testing-and-diagnostics/page.md | 2 +- .../docs/guides/windows-and-messaging/page.md | 2 +- .../worker-threads-for-heavy-work/page.md | 2 +- src/runtime/docs/javascript/ai/page.md | 2 +- src/runtime/docs/javascript/all-modules/page.md | 2 +- src/runtime/docs/javascript/application/page.md | 2 +- src/runtime/docs/javascript/asn1/page.md | 2 +- src/runtime/docs/javascript/assert/page.md | 2 +- src/runtime/docs/javascript/async/page.md | 2 +- src/runtime/docs/javascript/async_hooks/page.md | 2 +- src/runtime/docs/javascript/background/page.md | 2 +- src/runtime/docs/javascript/buffer/page.md | 2 +- src/runtime/docs/javascript/cdp/page.md | 2 +- .../docs/javascript/child_process/page.md | 2 +- src/runtime/docs/javascript/clipboard/page.md | 2 +- src/runtime/docs/javascript/commonjs/page.md | 2 +- src/runtime/docs/javascript/conduit/page.md | 2 +- src/runtime/docs/javascript/console/page.md | 2 +- src/runtime/docs/javascript/constants/page.md | 2 +- src/runtime/docs/javascript/cookies/page.md | 2 +- src/runtime/docs/javascript/crypto/page.md | 2 +- src/runtime/docs/javascript/dbus/page.md | 2 +- src/runtime/docs/javascript/dgram/page.md | 2 +- src/runtime/docs/javascript/diagnostics/page.md | 2 +- src/runtime/docs/javascript/did/page.md | 2 +- src/runtime/docs/javascript/dns/page.md | 2 +- src/runtime/docs/javascript/enumeration/page.md | 2 +- src/runtime/docs/javascript/errno/page.md | 2 +- src/runtime/docs/javascript/errors/page.md | 2 +- src/runtime/docs/javascript/events/page.md | 2 +- src/runtime/docs/javascript/extension/page.md | 2 +- src/runtime/docs/javascript/fetch/page.md | 2 +- src/runtime/docs/javascript/fs/page.md | 2 +- src/runtime/docs/javascript/gc/page.md | 2 +- src/runtime/docs/javascript/hci/page.md | 2 +- src/runtime/docs/javascript/hooks/page.md | 2 +- src/runtime/docs/javascript/http/page.md | 2 +- src/runtime/docs/javascript/https/page.md | 2 +- src/runtime/docs/javascript/i18n/page.md | 2 +- src/runtime/docs/javascript/ip/page.md | 2 +- src/runtime/docs/javascript/ipc/page.md | 2 +- src/runtime/docs/javascript/ipfs/page.md | 2 +- src/runtime/docs/javascript/iroh/page.md | 2 +- src/runtime/docs/javascript/language/page.md | 2 +- src/runtime/docs/javascript/latica/page.md | 2 +- src/runtime/docs/javascript/location/page.md | 2 +- src/runtime/docs/javascript/mcp/page.md | 2 +- src/runtime/docs/javascript/mime/page.md | 2 +- src/runtime/docs/javascript/module/page.md | 2 +- src/runtime/docs/javascript/navigation/page.md | 2 +- src/runtime/docs/javascript/net/page.md | 2 +- src/runtime/docs/javascript/network/page.md | 2 +- .../docs/javascript/notification/page.md | 2 +- src/runtime/docs/javascript/npm/page.md | 2 +- src/runtime/docs/javascript/os/page.md | 2 +- src/runtime/docs/javascript/overview/page.md | 2 +- src/runtime/docs/javascript/path/page.md | 2 +- src/runtime/docs/javascript/process/page.md | 2 +- .../docs/javascript/protocol-handlers/page.md | 2 +- src/runtime/docs/javascript/querystring/page.md | 2 +- .../docs/javascript/secure-storage/page.md | 2 +- src/runtime/docs/javascript/semver/page.md | 2 +- .../docs/javascript/service-worker/page.md | 2 +- .../docs/javascript/shared-worker/page.md | 2 +- src/runtime/docs/javascript/signal/page.md | 2 +- src/runtime/docs/javascript/sqlite/page.md | 2 +- src/runtime/docs/javascript/stream/page.md | 2 +- .../docs/javascript/string_decoder/page.md | 2 +- src/runtime/docs/javascript/tar/page.md | 2 +- src/runtime/docs/javascript/tcp/page.md | 2 +- src/runtime/docs/javascript/test/page.md | 2 +- src/runtime/docs/javascript/timers/page.md | 2 +- src/runtime/docs/javascript/tls/page.md | 2 +- src/runtime/docs/javascript/toml/page.md | 2 +- src/runtime/docs/javascript/tty/page.md | 2 +- src/runtime/docs/javascript/url/page.md | 2 +- src/runtime/docs/javascript/usb/page.md | 2 +- src/runtime/docs/javascript/util/page.md | 2 +- src/runtime/docs/javascript/vm/page.md | 2 +- src/runtime/docs/javascript/window/page.md | 2 +- src/runtime/docs/javascript/worker/page.md | 2 +- .../docs/javascript/worker_threads/page.md | 2 +- src/runtime/docs/javascript/xpc/page.md | 2 +- src/runtime/docs/javascript/zlib/page.md | 2 +- src/runtime/docs/page.md | 2 +- src/sage-index.template.ts | 6 ------ src/sage/docs/cli/configuration/page.md | 2 +- src/sage/docs/cli/diagnostics/page.md | 2 +- src/sage/docs/cli/environment-and-files/page.md | 2 +- src/sage/docs/cli/inputs-and-modes/page.md | 2 +- src/sage/docs/cli/keys-and-commands/page.md | 2 +- src/sage/docs/cli/options/page.md | 2 +- src/sage/docs/cli/sage/page.md | 2 +- src/sage/docs/cli/syntax-and-cache/page.md | 2 +- src/sage/docs/guides/getting-started/page.md | 2 +- src/sage/docs/guides/pager-workflows/page.md | 2 +- src/sage/docs/guides/plugins-quickstart/page.md | 2 +- src/sage/docs/javascript/all-modules/page.md | 2 +- src/sage/docs/javascript/crypto/page.md | 2 +- src/sage/docs/javascript/dom/page.md | 2 +- src/sage/docs/javascript/env/page.md | 2 +- src/sage/docs/javascript/fetch/page.md | 2 +- src/sage/docs/javascript/fs/page.md | 2 +- src/sage/docs/javascript/module-index/page.md | 2 +- src/sage/docs/javascript/navigator/page.md | 2 +- src/sage/docs/javascript/overview/page.md | 2 +- src/sage/docs/javascript/path/page.md | 2 +- src/sage/docs/javascript/performance/page.md | 2 +- src/sage/docs/javascript/process/page.md | 2 +- src/sage/docs/javascript/runtime/page.md | 2 +- src/sage/docs/javascript/url/page.md | 2 +- src/sage/docs/javascript/uuid/page.md | 2 +- src/sage/docs/javascript/web/page.md | 2 +- src/sage/docs/man/sage-1/page.md | 2 +- src/sage/docs/man/sage-7/page.md | 2 +- src/sage/docs/man/sage-plugin-api-3/page.md | 2 +- src/sage/docs/page.md | 2 +- src/silk-index.template.ts | 6 ------ src/silk/docs/compiler/abi-libsilk/page.md | 2 +- src/silk/docs/compiler/architecture/page.md | 2 +- src/silk/docs/compiler/async-runtime/page.md | 2 +- src/silk/docs/compiler/backend-amdgpu/page.md | 2 +- src/silk/docs/compiler/backend-gpu/page.md | 2 +- src/silk/docs/compiler/backend-nvidia/page.md | 2 +- src/silk/docs/compiler/backend-wasm/page.md | 2 +- src/silk/docs/compiler/build-scripts/page.md | 2 +- src/silk/docs/compiler/builtin-deps/page.md | 2 +- src/silk/docs/compiler/cache-silk/page.md | 2 +- src/silk/docs/compiler/cli-silk/page.md | 2 +- src/silk/docs/compiler/diagnostics/page.md | 2 +- .../docs/compiler/implementation-status/page.md | 2 +- src/silk/docs/compiler/ir-overview/page.md | 2 +- .../docs/compiler/libsilk-quickstart/page.md | 2 +- src/silk/docs/compiler/limits/page.md | 2 +- src/silk/docs/compiler/lsp-silk/page.md | 2 +- .../docs/compiler/package-distribution/page.md | 2 +- .../docs/compiler/package-manifests/page.md | 2 +- .../docs/compiler/stdlib-integration/page.md | 2 +- src/silk/docs/compiler/testing-strategy/page.md | 2 +- src/silk/docs/compiler/vendored-deps/page.md | 2 +- src/silk/docs/compiler/zig-api/page.md | 2 +- src/silk/docs/guides/cli/page.md | 2 +- src/silk/docs/guides/formal-silk/page.md | 2 +- src/silk/docs/guides/hello-world/page.md | 2 +- src/silk/docs/guides/language-tour/page.md | 2 +- .../docs/guides/modules-and-packages/page.md | 2 +- .../docs/guides/practical-logger-module/page.md | 2 +- .../docs/guides/project-dependencies/page.md | 2 +- src/silk/docs/guides/purpose/page.md | 2 +- src/silk/docs/guides/standard-library/page.md | 2 +- src/silk/docs/guides/testing/page.md | 2 +- src/silk/docs/language/asm/page.md | 2 +- src/silk/docs/language/atomics/page.md | 2 +- src/silk/docs/language/attributes/page.md | 2 +- src/silk/docs/language/borrow-checker/page.md | 2 +- src/silk/docs/language/buffers/page.md | 2 +- src/silk/docs/language/build-metadata/page.md | 2 +- src/silk/docs/language/cheat-sheet/page.md | 2 +- src/silk/docs/language/concurrency/page.md | 2 +- src/silk/docs/language/const-functions/page.md | 2 +- src/silk/docs/language/conventions/page.md | 2 +- src/silk/docs/language/dependent-types/page.md | 2 +- src/silk/docs/language/doc-comments/page.md | 2 +- src/silk/docs/language/duration-instant/page.md | 2 +- src/silk/docs/language/enums/page.md | 2 +- src/silk/docs/language/errors/page.md | 2 +- src/silk/docs/language/ext/page.md | 2 +- .../language/flow-blocks-statements/page.md | 2 +- src/silk/docs/language/flow-break/page.md | 2 +- src/silk/docs/language/flow-continue/page.md | 2 +- .../language/flow-expression-statements/page.md | 2 +- src/silk/docs/language/flow-for/page.md | 2 +- src/silk/docs/language/flow-if-else/page.md | 2 +- src/silk/docs/language/flow-loop/page.md | 2 +- src/silk/docs/language/flow-match/page.md | 2 +- src/silk/docs/language/flow-overview/page.md | 2 +- src/silk/docs/language/flow-return/page.md | 2 +- src/silk/docs/language/flow-while/page.md | 2 +- .../docs/language/formal-verification/page.md | 2 +- .../docs/language/function-disciplines/page.md | 2 +- src/silk/docs/language/generics/page.md | 2 +- src/silk/docs/language/gpu-execution/page.md | 2 +- .../docs/language/gpu-launch-blocks/page.md | 2 +- src/silk/docs/language/grammar/page.md | 2 +- src/silk/docs/language/interfaces/page.md | 2 +- .../docs/language/literals-aggregate/page.md | 2 +- src/silk/docs/language/literals-boolean/page.md | 2 +- .../docs/language/literals-character/page.md | 2 +- .../docs/language/literals-duration/page.md | 2 +- src/silk/docs/language/literals-numeric/page.md | 2 +- .../docs/language/literals-overview/page.md | 2 +- src/silk/docs/language/literals-regexp/page.md | 2 +- src/silk/docs/language/literals-string/page.md | 2 +- src/silk/docs/language/memory-model/page.md | 2 +- src/silk/docs/language/mutability/page.md | 2 +- src/silk/docs/language/operators/page.md | 2 +- src/silk/docs/language/optional/page.md | 2 +- .../language/packages-imports-exports/page.md | 2 +- src/silk/docs/language/regions/page.md | 2 +- .../docs/language/struct-requirements/page.md | 2 +- .../docs/language/structs-impls-layout/page.md | 2 +- src/silk/docs/language/syntax-tour/page.md | 2 +- src/silk/docs/language/target-metadata/page.md | 2 +- src/silk/docs/language/testing/page.md | 2 +- .../docs/language/toolchain-metadata/page.md | 2 +- src/silk/docs/language/type-unions/page.md | 2 +- src/silk/docs/language/typed-errors/page.md | 2 +- src/silk/docs/language/types/page.md | 2 +- src/silk/docs/language/using/page.md | 2 +- src/silk/docs/language/varargs/page.md | 2 +- src/silk/docs/man/libsilk.7/page.md | 2 +- src/silk/docs/man/silk-build.1/page.md | 2 +- src/silk/docs/man/silk-cache.1/page.md | 2 +- src/silk/docs/man/silk-cc.1/page.md | 2 +- src/silk/docs/man/silk-check.1/page.md | 2 +- src/silk/docs/man/silk-codesign.1/page.md | 2 +- src/silk/docs/man/silk-devices.1/page.md | 2 +- src/silk/docs/man/silk-doc.1/page.md | 2 +- src/silk/docs/man/silk-env.1/page.md | 2 +- src/silk/docs/man/silk-error.1/page.md | 2 +- src/silk/docs/man/silk-format.1/page.md | 2 +- src/silk/docs/man/silk-graph.1/page.md | 2 +- src/silk/docs/man/silk-guide.1/page.md | 2 +- src/silk/docs/man/silk-help.1/page.md | 2 +- src/silk/docs/man/silk-lsp.1/page.md | 2 +- src/silk/docs/man/silk-man.1/page.md | 2 +- src/silk/docs/man/silk-package.1/page.md | 2 +- src/silk/docs/man/silk-proto.1/page.md | 2 +- src/silk/docs/man/silk-repl.1/page.md | 2 +- src/silk/docs/man/silk-size.1/page.md | 2 +- src/silk/docs/man/silk-targets.1/page.md | 2 +- src/silk/docs/man/silk-test.1/page.md | 2 +- src/silk/docs/man/silk.1/page.md | 2 +- src/silk/docs/man/silk.7/page.md | 2 +- .../docs/man/silk_abi_get_version.3/page.md | 2 +- .../page.md | 2 +- src/silk/docs/man/silk_bytes.3/page.md | 2 +- src/silk/docs/man/silk_compiler.3/page.md | 2 +- src/silk/docs/man/silk_error.3/page.md | 2 +- src/silk/docs/man/slc.1/page.md | 2 +- src/silk/docs/man/slcc.1/page.md | 2 +- src/silk/docs/page.md | 2 +- src/silk/docs/std/abort-controller/page.md | 2 +- src/silk/docs/std/abort_controller/page.md | 2 +- src/silk/docs/std/algorithms/page.md | 2 +- src/silk/docs/std/args/page.md | 2 +- src/silk/docs/std/arrays/page.md | 2 +- src/silk/docs/std/atomic/page.md | 2 +- src/silk/docs/std/bits/page.md | 2 +- src/silk/docs/std/boolean/page.md | 2 +- src/silk/docs/std/boxed-values/page.md | 2 +- src/silk/docs/std/buffer/page.md | 2 +- src/silk/docs/std/build/page.md | 2 +- src/silk/docs/std/bytes/page.md | 2 +- src/silk/docs/std/conventions/page.md | 2 +- src/silk/docs/std/crypto-aead/page.md | 2 +- src/silk/docs/std/crypto-box/page.md | 2 +- src/silk/docs/std/crypto-hash/page.md | 2 +- src/silk/docs/std/crypto-random/page.md | 2 +- src/silk/docs/std/crypto-secretbox/page.md | 2 +- src/silk/docs/std/crypto-sign/page.md | 2 +- src/silk/docs/std/crypto/page.md | 2 +- src/silk/docs/std/dylib/page.md | 2 +- src/silk/docs/std/env/page.md | 2 +- src/silk/docs/std/ffi-c/page.md | 2 +- src/silk/docs/std/ffi-c_owned/page.md | 2 +- src/silk/docs/std/filesystem/page.md | 2 +- src/silk/docs/std/flag/page.md | 2 +- src/silk/docs/std/fmt/page.md | 2 +- src/silk/docs/std/formal/page.md | 2 +- src/silk/docs/std/fs-stream/page.md | 2 +- src/silk/docs/std/fs/page.md | 2 +- src/silk/docs/std/function/page.md | 2 +- src/silk/docs/std/ggml/page.md | 2 +- src/silk/docs/std/gpu-device/page.md | 2 +- src/silk/docs/std/gpu-isa/page.md | 2 +- src/silk/docs/std/gpu/page.md | 2 +- src/silk/docs/std/graphics-metal/page.md | 2 +- src/silk/docs/std/graphics-opengl/page.md | 2 +- src/silk/docs/std/graphics-opengles/page.md | 2 +- src/silk/docs/std/graphics-vulkan/page.md | 2 +- src/silk/docs/std/graphics-window/page.md | 2 +- src/silk/docs/std/graphics/page.md | 2 +- src/silk/docs/std/http/page.md | 2 +- src/silk/docs/std/https/page.md | 2 +- src/silk/docs/std/idl-web/page.md | 2 +- src/silk/docs/std/image-color/page.md | 2 +- src/silk/docs/std/image-jpeg/page.md | 2 +- src/silk/docs/std/image-png/page.md | 2 +- src/silk/docs/std/image/page.md | 2 +- src/silk/docs/std/interfaces/page.md | 2 +- src/silk/docs/std/io-async/page.md | 2 +- src/silk/docs/std/io-stream/page.md | 2 +- src/silk/docs/std/io/page.md | 2 +- src/silk/docs/std/js-ecma/page.md | 2 +- src/silk/docs/std/json/page.md | 2 +- src/silk/docs/std/limits/page.md | 2 +- src/silk/docs/std/list/page.md | 2 +- src/silk/docs/std/map/page.md | 2 +- src/silk/docs/std/math-matrix/page.md | 2 +- src/silk/docs/std/math-vector/page.md | 2 +- src/silk/docs/std/math/page.md | 2 +- src/silk/docs/std/memory/page.md | 2 +- src/silk/docs/std/mime/page.md | 2 +- src/silk/docs/std/module-catalog/page.md | 2 +- src/silk/docs/std/net-stream/page.md | 2 +- src/silk/docs/std/net/page.md | 2 +- src/silk/docs/std/networking/page.md | 2 +- src/silk/docs/std/number/page.md | 2 +- src/silk/docs/std/optional/page.md | 2 +- src/silk/docs/std/os/page.md | 2 +- src/silk/docs/std/overview/page.md | 2 +- src/silk/docs/std/package-structure/page.md | 2 +- src/silk/docs/std/path/page.md | 2 +- src/silk/docs/std/process-child/page.md | 2 +- src/silk/docs/std/process/page.md | 2 +- src/silk/docs/std/protobuf/page.md | 2 +- src/silk/docs/std/queue/page.md | 2 +- src/silk/docs/std/range/page.md | 2 +- src/silk/docs/std/readline/page.md | 2 +- src/silk/docs/std/regex/page.md | 2 +- src/silk/docs/std/result/page.md | 2 +- src/silk/docs/std/runtime-atomic/page.md | 2 +- src/silk/docs/std/runtime-build/page.md | 2 +- src/silk/docs/std/runtime-dylib/page.md | 2 +- src/silk/docs/std/runtime-env/page.md | 2 +- src/silk/docs/std/runtime-event_loop/page.md | 2 +- src/silk/docs/std/runtime-fs/page.md | 2 +- src/silk/docs/std/runtime-globals/page.md | 2 +- src/silk/docs/std/runtime-gpu/page.md | 2 +- .../docs/std/runtime-graphics-metal/page.md | 2 +- src/silk/docs/std/runtime-io/page.md | 2 +- .../docs/std/runtime-linux-event_loop/page.md | 2 +- src/silk/docs/std/runtime-mem/page.md | 2 +- src/silk/docs/std/runtime-net/page.md | 2 +- src/silk/docs/std/runtime-number/page.md | 2 +- src/silk/docs/std/runtime-posix-atomic/page.md | 2 +- src/silk/docs/std/runtime-posix-dylib/page.md | 2 +- src/silk/docs/std/runtime-posix-env/page.md | 2 +- .../docs/std/runtime-posix-event_loop/page.md | 2 +- src/silk/docs/std/runtime-posix-fs/page.md | 2 +- src/silk/docs/std/runtime-posix-io/page.md | 2 +- src/silk/docs/std/runtime-posix-mem/page.md | 2 +- src/silk/docs/std/runtime-posix-net/page.md | 2 +- src/silk/docs/std/runtime-posix-process/page.md | 2 +- src/silk/docs/std/runtime-posix-signal/page.md | 2 +- src/silk/docs/std/runtime-posix-sync/page.md | 2 +- src/silk/docs/std/runtime-posix-task/page.md | 2 +- src/silk/docs/std/runtime-posix-time/page.md | 2 +- src/silk/docs/std/runtime-process/page.md | 2 +- src/silk/docs/std/runtime-readline/page.md | 2 +- src/silk/docs/std/runtime-regex/page.md | 2 +- src/silk/docs/std/runtime-signal/page.md | 2 +- src/silk/docs/std/runtime-sync/page.md | 2 +- src/silk/docs/std/runtime-task/page.md | 2 +- src/silk/docs/std/runtime-time/page.md | 2 +- src/silk/docs/std/runtime-unicode/page.md | 2 +- src/silk/docs/std/runtime-wasi-cwd/page.md | 2 +- src/silk/docs/std/runtime-wasi-env/page.md | 2 +- .../docs/std/runtime-wasi-event_loop/page.md | 2 +- src/silk/docs/std/runtime-wasi-fs/page.md | 2 +- src/silk/docs/std/runtime-wasi-io/page.md | 2 +- src/silk/docs/std/runtime-wasi-mem/page.md | 2 +- src/silk/docs/std/runtime-wasi-net/page.md | 2 +- src/silk/docs/std/runtime-wasi-preopen/page.md | 2 +- src/silk/docs/std/runtime-wasi-process/page.md | 2 +- src/silk/docs/std/runtime-wasi-signal/page.md | 2 +- src/silk/docs/std/runtime-wasi-sync/page.md | 2 +- src/silk/docs/std/runtime-wasi-task/page.md | 2 +- src/silk/docs/std/runtime-wasi-time/page.md | 2 +- src/silk/docs/std/runtime-window/page.md | 2 +- src/silk/docs/std/runtime-z3/page.md | 2 +- src/silk/docs/std/runtime/page.md | 2 +- src/silk/docs/std/semver/page.md | 2 +- src/silk/docs/std/set/page.md | 2 +- src/silk/docs/std/signal/page.md | 2 +- src/silk/docs/std/sqlite/page.md | 2 +- src/silk/docs/std/ssh/page.md | 2 +- src/silk/docs/std/ssh2/page.md | 2 +- src/silk/docs/std/stack/page.md | 2 +- src/silk/docs/std/stream/page.md | 2 +- src/silk/docs/std/strings/page.md | 2 +- src/silk/docs/std/sync/page.md | 2 +- src/silk/docs/std/tar-async/page.md | 2 +- src/silk/docs/std/tar/page.md | 2 +- src/silk/docs/std/task/page.md | 2 +- src/silk/docs/std/temporal/page.md | 2 +- src/silk/docs/std/test/page.md | 2 +- src/silk/docs/std/time/page.md | 2 +- src/silk/docs/std/tls/page.md | 2 +- src/silk/docs/std/toml/page.md | 2 +- src/silk/docs/std/unicode/page.md | 2 +- src/silk/docs/std/url/page.md | 2 +- src/silk/docs/std/uuid-random/page.md | 2 +- src/silk/docs/std/uuid/page.md | 2 +- src/silk/docs/std/vector/page.md | 2 +- src/silk/docs/std/wasm/page.md | 2 +- src/silk/docs/std/websocket/page.md | 2 +- src/silk/docs/std/window-gtk/page.md | 2 +- src/silk/docs/std/window-ios/page.md | 2 +- src/silk/docs/std/window-macos/page.md | 2 +- src/silk/docs/std/window/page.md | 2 +- src/silk/docs/std/xml/page.md | 2 +- src/silk/docs/std/z3/page.md | 2 +- src/silk/docs/usage/cli-examples/page.md | 2 +- src/silk/docs/usage/editor-coc-nvim/page.md | 2 +- src/silk/docs/usage/editor-ctags/page.md | 2 +- src/silk/docs/usage/editor-textmate/page.md | 2 +- src/silk/docs/usage/editor-vim/page.md | 2 +- src/silk/docs/usage/getting-started/page.md | 2 +- src/silk/docs/usage/github-actions/page.md | 2 +- src/silk/docs/usage/github-linguist/page.md | 2 +- src/silk/docs/usage/guide-examples/page.md | 2 +- .../docs/usage/howto-custom-stdlib-root/page.md | 2 +- .../docs/usage/howto-dynamic-libraries/page.md | 2 +- src/silk/docs/usage/howto-lumen-trail/page.md | 2 +- src/silk/docs/usage/howto-run-wasi-node/page.md | 2 +- src/silk/docs/usage/pure-silk-gpu-ml/page.md | 2 +- src/silk/docs/usage/pure-silk-gpu/page.md | 2 +- .../usage/tutorials/01-first-program/page.md | 2 +- .../tutorials/02-structs-and-impls/page.md | 2 +- .../tutorials/03-arrays-and-slices/page.md | 2 +- .../docs/usage/tutorials/04-filesystem/page.md | 2 +- .../docs/usage/tutorials/05-concurrency/page.md | 2 +- .../tutorials/06-async-io-streams-abort/page.md | 2 +- .../docs/usage/tutorials/07-formal-silk/page.md | 2 +- src/silk/wiki/language/borrow-checker/page.md | 2 +- src/silk/wiki/language/buffers/page.md | 2 +- src/silk/wiki/language/cheat-sheet/page.md | 2 +- src/silk/wiki/language/concurrency/page.md | 2 +- src/silk/wiki/language/const-functions/page.md | 2 +- src/silk/wiki/language/conventions/page.md | 2 +- src/silk/wiki/language/dependent-types/page.md | 2 +- src/silk/wiki/language/doc-comments/page.md | 2 +- src/silk/wiki/language/duration-instant/page.md | 2 +- src/silk/wiki/language/enums/page.md | 2 +- src/silk/wiki/language/errors/page.md | 2 +- src/silk/wiki/language/ext/page.md | 2 +- .../language/flow-blocks-statements/page.md | 2 +- src/silk/wiki/language/flow-break/page.md | 2 +- src/silk/wiki/language/flow-continue/page.md | 2 +- .../language/flow-expression-statements/page.md | 2 +- src/silk/wiki/language/flow-for/page.md | 2 +- src/silk/wiki/language/flow-if-else/page.md | 2 +- src/silk/wiki/language/flow-loop/page.md | 2 +- src/silk/wiki/language/flow-match/page.md | 2 +- src/silk/wiki/language/flow-overview/page.md | 2 +- src/silk/wiki/language/flow-return/page.md | 2 +- src/silk/wiki/language/flow-while/page.md | 2 +- .../wiki/language/formal-verification/page.md | 2 +- .../wiki/language/function-disciplines/page.md | 2 +- src/silk/wiki/language/generics/page.md | 2 +- src/silk/wiki/language/grammar/page.md | 2 +- src/silk/wiki/language/interfaces/page.md | 2 +- .../wiki/language/literals-aggregate/page.md | 2 +- src/silk/wiki/language/literals-boolean/page.md | 2 +- .../wiki/language/literals-character/page.md | 2 +- .../wiki/language/literals-duration/page.md | 2 +- src/silk/wiki/language/literals-numeric/page.md | 2 +- .../wiki/language/literals-overview/page.md | 2 +- src/silk/wiki/language/literals-string/page.md | 2 +- src/silk/wiki/language/memory-model/page.md | 2 +- src/silk/wiki/language/mutability/page.md | 2 +- src/silk/wiki/language/operators/page.md | 2 +- src/silk/wiki/language/optional/page.md | 2 +- .../language/packages-imports-exports/page.md | 2 +- src/silk/wiki/language/regions/page.md | 2 +- .../wiki/language/struct-requirements/page.md | 2 +- .../wiki/language/structs-impls-layout/page.md | 2 +- src/silk/wiki/language/syntax-tour/page.md | 2 +- src/silk/wiki/language/testing/page.md | 2 +- src/silk/wiki/language/typed-errors/page.md | 2 +- src/silk/wiki/language/types/page.md | 2 +- src/silk/wiki/language/varargs/page.md | 2 +- src/silk/wiki/page.md | 2 +- src/silk/wiki/std/algorithms/page.md | 2 +- src/silk/wiki/std/args/page.md | 2 +- src/silk/wiki/std/arrays/page.md | 2 +- src/silk/wiki/std/bits/page.md | 2 +- src/silk/wiki/std/buffer/page.md | 2 +- src/silk/wiki/std/conventions/page.md | 2 +- src/silk/wiki/std/crypto/page.md | 2 +- src/silk/wiki/std/env/page.md | 2 +- src/silk/wiki/std/filesystem/page.md | 2 +- src/silk/wiki/std/fmt/page.md | 2 +- src/silk/wiki/std/formal/page.md | 2 +- src/silk/wiki/std/interfaces/page.md | 2 +- src/silk/wiki/std/io/page.md | 2 +- src/silk/wiki/std/json/page.md | 2 +- src/silk/wiki/std/map/page.md | 2 +- src/silk/wiki/std/memory/page.md | 2 +- src/silk/wiki/std/networking/page.md | 2 +- src/silk/wiki/std/overview/page.md | 2 +- src/silk/wiki/std/package-structure/page.md | 2 +- src/silk/wiki/std/path/page.md | 2 +- src/silk/wiki/std/process/page.md | 2 +- src/silk/wiki/std/result/page.md | 2 +- src/silk/wiki/std/runtime/page.md | 2 +- src/silk/wiki/std/semver/page.md | 2 +- src/silk/wiki/std/set/page.md | 2 +- src/silk/wiki/std/strings/page.md | 2 +- src/silk/wiki/std/sync/page.md | 2 +- src/silk/wiki/std/task/page.md | 2 +- src/silk/wiki/std/temporal/page.md | 2 +- src/silk/wiki/std/tls/page.md | 2 +- src/silk/wiki/std/toml/page.md | 2 +- src/silk/wiki/std/url/page.md | 2 +- src/silk/wiki/std/uuid/page.md | 2 +- src/silk/wiki/std/vector/page.md | 2 +- src/silkWiki-index.template.ts | 6 ------ src/slg-index.template.ts | 6 ------ src/slg/docs/cli/diagnostics/page.md | 2 +- .../docs/cli/input-types-and-parsing/page.md | 2 +- src/slg/docs/cli/options-reference/page.md | 2 +- src/slg/docs/cli/output-and-exit-codes/page.md | 2 +- src/slg/docs/cli/parallelism/page.md | 2 +- src/slg/docs/cli/patterns-and-matching/page.md | 2 +- src/slg/docs/cli/slg/page.md | 2 +- src/slg/docs/cli/traversal-and-ignores/page.md | 2 +- src/slg/docs/guides/getting-started/page.md | 2 +- src/slg/docs/guides/search-recipes/page.md | 2 +- src/slg/docs/man/slg-1/page.md | 2 +- src/slg/docs/page.md | 2 +- src/virtnosis-index.template.ts | 6 ------ src/virtnosis/docs/cli/virtnosis-agent/page.md | 2 +- src/virtnosis/docs/cli/vnactl/page.md | 2 +- src/virtnosis/docs/guides/deployment/page.md | 2 +- .../docs/guides/getting-started/page.md | 2 +- .../docs/guides/install-and-package/page.md | 2 +- .../docs/guides/operator-guide/page.md | 2 +- .../docs/guides/output-and-automation/page.md | 2 +- src/virtnosis/docs/guides/systemd/page.md | 2 +- src/virtnosis/docs/man/virtnosis-7/page.md | 2 +- .../docs/man/virtnosis-agent-1/page.md | 2 +- .../docs/man/virtnosis-agent-protocol-7/page.md | 2 +- .../docs/man/virtnosis-scan-report-7/page.md | 2 +- src/virtnosis/docs/man/vnactl-1/page.md | 2 +- src/virtnosis/docs/page.md | 2 +- .../docs/reference/architecture/page.md | 2 +- .../docs/reference/development/page.md | 2 +- src/virtnosis/docs/reference/overview/page.md | 2 +- .../docs/reference/repository-docs/page.md | 2 +- .../docs/reference/scan-analysis/page.md | 2 +- tests/docs-watch.test.ts | 12 ++++++------ tests/ingestion-import.test.ts | 17 +++++++++++------ tools/import-public.ts | 2 +- tools/migration/migrate.ts | 2 +- 606 files changed, 646 insertions(+), 714 deletions(-) delete mode 100644 src/layouts/runtime-docs.layout.ts delete mode 100644 src/layouts/sage-docs.layout.ts delete mode 100644 src/layouts/silk-docs.layout.ts delete mode 100644 src/layouts/silkWiki-docs.layout.ts delete mode 100644 src/layouts/slg-docs.layout.ts delete mode 100644 src/layouts/virtnosis-docs.layout.ts create mode 100644 src/navigation.template.ts delete mode 100644 src/runtime-index.template.ts delete mode 100644 src/sage-index.template.ts delete mode 100644 src/silk-index.template.ts delete mode 100644 src/silkWiki-index.template.ts delete mode 100644 src/slg-index.template.ts delete mode 100644 src/virtnosis-index.template.ts diff --git a/README.md b/README.md index ab9e912f..089041d7 100644 --- a/README.md +++ b/README.md @@ -27,9 +27,10 @@ are output files; do not commit `public/`. - `src/lib/`: rendering, URL, collection, and navigation helpers. - `src/global.data.ts`: validated collection metadata and precomputed navigation, search, and source-export projections derived from source pages. -- `src/layouts/*-docs.layout.ts`: thin collection-specific data - consumers sharing the docs renderer and its assets. -- `src/*-{index,search,sources,llms}.template.ts`: dependency-scoped collection +- `src/layouts/docs.layout.ts`: the shared documentation renderer, consuming one + lightweight navigation key for all collections. +- `src/navigation.template.ts`: navigation indexes for all collections. +- `src/*-{search,sources,llms}.template.ts`: dependency-scoped collection artifacts; `src/sitemap.template.ts`: sitemap output; `src/artifacts.template.ts`: site-wide LLM directory and `.nojekyll`. @@ -48,9 +49,11 @@ Each documentation page declares `title`, `description`, `docsCollection`, The `start` document lives at its collection root; the specification lives at `src/silk/spec/2026/page.md`. Order is explicit and does not depend on filenames. New imported pages are appended; review their section and order after syncing. -Use the collection-specific layout, such as `runtime-docs` or `silkWiki-docs`, -for new documentation pages (`spec` for the specification). The shared `docs` -layout is an asset-bearing parent, not a standalone article renderer. +Use `layout: "docs"` for documentation pages in every collection (`spec` for the +specification). All docs share one lightweight navigation dependency: navigation +changes rebuild all docs, while body-only edits remain isolated to the changed +article and its collection's search and exports. Search and raw-source/LLM +artifacts retain separate, per-collection dependencies. Use canonical directory links such as `/runtime/docs/guides/hello-world/`. Collection roots redirect legacy `?p=` links while preserving fragments. Static diff --git a/docs/migration.md b/docs/migration.md index 5d052595..99ede845 100644 --- a/docs/migration.md +++ b/docs/migration.md @@ -18,11 +18,15 @@ remains reproducible. Production cutover is complete; deployment evidence is rec | Cleanup | The browser Markdown renderers, vendored rendering libraries, old HTML shells, duplicate Python exporters, generated source-tree indexes, and Jekyll configuration are retired. | | CI | Node 24 runs ingestion, audits, browser serving, and the `npm run check` gate without Python. Pull requests validate in Docs Audit; production pushes validate and deploy the same artifact in Pages, without a duplicate push audit. | -Collection layouts subscribe to lightweight, collection-specific navigation keys. -Search and raw-source/LLM templates have separate dependencies, so document-body -edits do not invalidate unrelated navigation consumers. Shared article transforms -remain page-local rather than storing rendered articles in global data. Markdown -keeps the existing alerts, highlighting, and legacy heading-ID policy; enabling +All six documentation collections use the single `docs` layout; the Silk +specification retains `spec`. The `docs` layout subscribes to one shared, +lightweight navigation key covering all collections. Navigation changes rebuild +all docs. Body-only edits remain isolated to the changed article and its +collection's search and exports: search and raw-source/LLM templates retain +separate, per-collection dependencies. Ingestion remains separate from building. +Shared article transforms remain page-local rather than storing rendered articles +in global data. Markdown keeps the existing alerts, highlighting, and legacy +heading-ID policy; enabling additional DOMStack Markdown plugins is an explicit compatibility decision. Homepage and learn styles are scoped to their consumers, and progressive clients are TypeScript modules rather than unchecked global initializers. diff --git a/src/global.data.ts b/src/global.data.ts index 58321bae..d7d8ba10 100644 --- a/src/global.data.ts +++ b/src/global.data.ts @@ -21,11 +21,11 @@ const globalData: GlobalDataFunction<DocsData, Record<string, unknown>, string> editUrl: editUrl(source), }) } - const data = { routes: pages.map(p => p.pageInfo.url).sort() } as DocsData + const data = { routes: pages.map(p => p.pageInfo.url).sort(), navigation: {} } as DocsData for (const collection of Object.keys(collections) as Collection[]) { const list = docs[collection] list.sort((a, b) => a.order - b.order || a.id.localeCompare(b.id, 'en')) - data[`${collection}Navigation`] = projectCollection(list) + data.navigation[collection] = projectCollection(list) data[`${collection}Exports`] = list.map(({ collection, id, title, sourcePath, url, markdown }) => ({ collection, id, title, sourcePath, url, markdown })) data[`${collection}Search`] = { kind: collection === 'silkWiki' ? 'wiki' : 'docs', count: list.length, diff --git a/src/layouts/docs.layout.ts b/src/layouts/docs.layout.ts index 2865bec7..e0034a4d 100644 --- a/src/layouts/docs.layout.ts +++ b/src/layouts/docs.layout.ts @@ -1,14 +1,15 @@ import { html, raw, render } from 'fragtml' import { article } from '../lib/rendering.ts' -import type { LayoutFunction } from '@domstack/static/types.js' +import type { DataDeps, LayoutFunction } from '@domstack/static/types.js' import { collections, sectionTitle, } from '../lib/collections.ts' -import { rawUrl, type DocLink, type Navigation, type DocVars } from '../lib/docs.ts' +import { rawUrl, type DocLink, type NavigationData, type DocVars } from '../lib/docs.ts' export const parentLayout = 'root' -// Asset-bearing parent: collection wrappers render the documentation shell. -const docsLayout: LayoutFunction<Record<string, unknown>, string> = ({ children }) => children +export const vars = { + dataDeps: ['navigation'] satisfies DataDeps<NavigationData>, +} function prevNext(doc: DocLink | null, label: string): string { return doc ? render( @@ -19,7 +20,8 @@ function prevNext(doc: DocLink | null, label: string): string { ) : '' } -export function renderDocs(v: DocVars, children: string, navigation: Navigation): string { +const docsLayout: LayoutFunction<DocVars, string, string, NavigationData> = ({ vars: v, children, data }) => { + const navigation = data.navigation[v.docsCollection] const c = collections[v.docsCollection] const doc = navigation.bySource[v.sourcePath] if (!doc) throw new Error(`Missing navigation document: ${v.docsCollection}/${v.sourcePath}`) diff --git a/src/layouts/runtime-docs.layout.ts b/src/layouts/runtime-docs.layout.ts deleted file mode 100644 index 096cb469..00000000 --- a/src/layouts/runtime-docs.layout.ts +++ /dev/null @@ -1,10 +0,0 @@ -import type { DataDeps, LayoutFunction } from '@domstack/static/types.js' -import type { DocVars, DocsData } from '../lib/docs.ts' -import { renderDocs } from './docs.layout.ts' -export const parentLayout = 'docs' -export const dataDeps = ['runtimeNavigation'] satisfies DataDeps<Pick<DocsData, 'runtimeNavigation'>> -// DOMStack beta.5 reads layout subscriptions from vars. -export const vars = { dataDeps } -const layout: LayoutFunction<DocVars, string, string, Pick<DocsData, 'runtimeNavigation'>> = ({ vars, children, data }) => - renderDocs(vars, children, data.runtimeNavigation) -export default layout diff --git a/src/layouts/sage-docs.layout.ts b/src/layouts/sage-docs.layout.ts deleted file mode 100644 index 886b4126..00000000 --- a/src/layouts/sage-docs.layout.ts +++ /dev/null @@ -1,10 +0,0 @@ -import type { DataDeps, LayoutFunction } from '@domstack/static/types.js' -import type { DocVars, DocsData } from '../lib/docs.ts' -import { renderDocs } from './docs.layout.ts' -export const parentLayout = 'docs' -export const dataDeps = ['sageNavigation'] satisfies DataDeps<Pick<DocsData, 'sageNavigation'>> -// DOMStack beta.5 reads layout subscriptions from vars. -export const vars = { dataDeps } -const layout: LayoutFunction<DocVars, string, string, Pick<DocsData, 'sageNavigation'>> = ({ vars, children, data }) => - renderDocs(vars, children, data.sageNavigation) -export default layout diff --git a/src/layouts/silk-docs.layout.ts b/src/layouts/silk-docs.layout.ts deleted file mode 100644 index 43395692..00000000 --- a/src/layouts/silk-docs.layout.ts +++ /dev/null @@ -1,10 +0,0 @@ -import type { DataDeps, LayoutFunction } from '@domstack/static/types.js' -import type { DocVars, DocsData } from '../lib/docs.ts' -import { renderDocs } from './docs.layout.ts' -export const parentLayout = 'docs' -export const dataDeps = ['silkNavigation'] satisfies DataDeps<Pick<DocsData, 'silkNavigation'>> -// DOMStack beta.5 reads layout subscriptions from vars. -export const vars = { dataDeps } -const layout: LayoutFunction<DocVars, string, string, Pick<DocsData, 'silkNavigation'>> = ({ vars, children, data }) => - renderDocs(vars, children, data.silkNavigation) -export default layout diff --git a/src/layouts/silkWiki-docs.layout.ts b/src/layouts/silkWiki-docs.layout.ts deleted file mode 100644 index c6afcf6c..00000000 --- a/src/layouts/silkWiki-docs.layout.ts +++ /dev/null @@ -1,10 +0,0 @@ -import type { DataDeps, LayoutFunction } from '@domstack/static/types.js' -import type { DocVars, DocsData } from '../lib/docs.ts' -import { renderDocs } from './docs.layout.ts' -export const parentLayout = 'docs' -export const dataDeps = ['silkWikiNavigation'] satisfies DataDeps<Pick<DocsData, 'silkWikiNavigation'>> -// DOMStack beta.5 reads layout subscriptions from vars. -export const vars = { dataDeps } -const layout: LayoutFunction<DocVars, string, string, Pick<DocsData, 'silkWikiNavigation'>> = ({ vars, children, data }) => - renderDocs(vars, children, data.silkWikiNavigation) -export default layout diff --git a/src/layouts/slg-docs.layout.ts b/src/layouts/slg-docs.layout.ts deleted file mode 100644 index 83e23bcc..00000000 --- a/src/layouts/slg-docs.layout.ts +++ /dev/null @@ -1,10 +0,0 @@ -import type { DataDeps, LayoutFunction } from '@domstack/static/types.js' -import type { DocVars, DocsData } from '../lib/docs.ts' -import { renderDocs } from './docs.layout.ts' -export const parentLayout = 'docs' -export const dataDeps = ['slgNavigation'] satisfies DataDeps<Pick<DocsData, 'slgNavigation'>> -// DOMStack beta.5 reads layout subscriptions from vars. -export const vars = { dataDeps } -const layout: LayoutFunction<DocVars, string, string, Pick<DocsData, 'slgNavigation'>> = ({ vars, children, data }) => - renderDocs(vars, children, data.slgNavigation) -export default layout diff --git a/src/layouts/virtnosis-docs.layout.ts b/src/layouts/virtnosis-docs.layout.ts deleted file mode 100644 index 9344aeed..00000000 --- a/src/layouts/virtnosis-docs.layout.ts +++ /dev/null @@ -1,10 +0,0 @@ -import type { DataDeps, LayoutFunction } from '@domstack/static/types.js' -import type { DocVars, DocsData } from '../lib/docs.ts' -import { renderDocs } from './docs.layout.ts' -export const parentLayout = 'docs' -export const dataDeps = ['virtnosisNavigation'] satisfies DataDeps<Pick<DocsData, 'virtnosisNavigation'>> -// DOMStack beta.5 reads layout subscriptions from vars. -export const vars = { dataDeps } -const layout: LayoutFunction<DocVars, string, string, Pick<DocsData, 'virtnosisNavigation'>> = ({ vars, children, data }) => - renderDocs(vars, children, data.virtnosisNavigation) -export default layout diff --git a/src/lib/docs.ts b/src/lib/docs.ts index 72754556..32888bf0 100644 --- a/src/lib/docs.ts +++ b/src/lib/docs.ts @@ -34,10 +34,13 @@ export interface SearchIndex { count: number items: { id: string; title: string; file: string; url: string; section: string; summary: string; text: string }[] } -export type DocsData = { routes: string[] } & - Record<`${Collection}Navigation`, Navigation> & +export type DocsData = { + routes: string[] + navigation: Record<Collection, Navigation> +} & Record<`${Collection}Exports`, ExportDoc[]> & Record<`${Collection}Search`, SearchIndex> +export type NavigationData = Pick<DocsData, 'navigation'> export function validateDocVars(v: Record<string, unknown>, source: string): DocVars { if (typeof v.docsCollection !== 'string' || !Object.hasOwn(collections, v.docsCollection)) diff --git a/src/navigation.template.ts b/src/navigation.template.ts new file mode 100644 index 00000000..989df79e --- /dev/null +++ b/src/navigation.template.ts @@ -0,0 +1,11 @@ +import type { DataDeps, TemplateFunction } from '@domstack/static/types.js' +import { collections, type Collection } from './lib/collections.ts' +import type { NavigationData } from './lib/docs.ts' +import { collectionIndex } from './lib/artifacts.ts' + +export const dataDeps = ['navigation'] satisfies DataDeps<NavigationData> +const template: TemplateFunction<Record<string, unknown>, NavigationData> = ({ data }) => + (Object.keys(collections) as Collection[]).map(collection => + collectionIndex(collection, data.navigation[collection]), + ) +export default template diff --git a/src/runtime-index.template.ts b/src/runtime-index.template.ts deleted file mode 100644 index 74243956..00000000 --- a/src/runtime-index.template.ts +++ /dev/null @@ -1,6 +0,0 @@ -import type { DataDeps, TemplateFunction } from '@domstack/static/types.js' -import type { DocsData } from './lib/docs.ts' -import { collectionIndex } from './lib/artifacts.ts' -export const dataDeps = ['runtimeNavigation'] satisfies DataDeps<Pick<DocsData, 'runtimeNavigation'>> -const template: TemplateFunction<Record<string, unknown>, Pick<DocsData, 'runtimeNavigation'>> = ({ data }) => collectionIndex('runtime', data.runtimeNavigation) -export default template diff --git a/src/runtime/docs/cli/build/page.md b/src/runtime/docs/cli/build/page.md index a04401a7..a4b73991 100644 --- a/src/runtime/docs/cli/build/page.md +++ b/src/runtime/docs/cli/build/page.md @@ -1,5 +1,5 @@ --- -layout: "runtime-docs" +layout: "docs" title: "oroc build" description: "Build an Oro Runtime application." docsCollection: "runtime" diff --git a/src/runtime/docs/cli/config/page.md b/src/runtime/docs/cli/config/page.md index 85206dda..aad4a0e5 100644 --- a/src/runtime/docs/cli/config/page.md +++ b/src/runtime/docs/cli/config/page.md @@ -1,5 +1,5 @@ --- -layout: "runtime-docs" +layout: "docs" title: "oroc config" description: "Inspect configuration values." docsCollection: "runtime" diff --git a/src/runtime/docs/cli/env/page.md b/src/runtime/docs/cli/env/page.md index 1b5c0ac1..f6b60a71 100644 --- a/src/runtime/docs/cli/env/page.md +++ b/src/runtime/docs/cli/env/page.md @@ -1,5 +1,5 @@ --- -layout: "runtime-docs" +layout: "docs" title: "oroc env" description: "Print environment variables relevant to the Oro CLI and build configuration." docsCollection: "runtime" diff --git a/src/runtime/docs/cli/help/page.md b/src/runtime/docs/cli/help/page.md index 41047305..00a41e3d 100644 --- a/src/runtime/docs/cli/help/page.md +++ b/src/runtime/docs/cli/help/page.md @@ -1,5 +1,5 @@ --- -layout: "runtime-docs" +layout: "docs" title: "oroc help" description: "Discover commands, options, and workflow entry points from the CLI help index." docsCollection: "runtime" diff --git a/src/runtime/docs/cli/init/page.md b/src/runtime/docs/cli/init/page.md index 7cb6a545..a10adb40 100644 --- a/src/runtime/docs/cli/init/page.md +++ b/src/runtime/docs/cli/init/page.md @@ -1,5 +1,5 @@ --- -layout: "runtime-docs" +layout: "docs" title: "oroc init" description: "Create a new project. If the path is not provided, the new project is created in the current directory." docsCollection: "runtime" diff --git a/src/runtime/docs/cli/install-app/page.md b/src/runtime/docs/cli/install-app/page.md index 720f6897..e5be13d2 100644 --- a/src/runtime/docs/cli/install-app/page.md +++ b/src/runtime/docs/cli/install-app/page.md @@ -1,5 +1,5 @@ --- -layout: "runtime-docs" +layout: "docs" title: "oroc install-app" description: "Install the app to the device or host target." docsCollection: "runtime" diff --git a/src/runtime/docs/cli/list-devices/page.md b/src/runtime/docs/cli/list-devices/page.md index 1b5a5475..fe580c1f 100644 --- a/src/runtime/docs/cli/list-devices/page.md +++ b/src/runtime/docs/cli/list-devices/page.md @@ -1,5 +1,5 @@ --- -layout: "runtime-docs" +layout: "docs" title: "oroc list-devices" description: "Get the list of connected devices." docsCollection: "runtime" diff --git a/src/runtime/docs/cli/mcp/page.md b/src/runtime/docs/cli/mcp/page.md index 95aa68b9..4e6b4615 100644 --- a/src/runtime/docs/cli/mcp/page.md +++ b/src/runtime/docs/cli/mcp/page.md @@ -1,5 +1,5 @@ --- -layout: "runtime-docs" +layout: "docs" title: "oroc mcp" description: "Run a Model Context Protocol (MCP) server for agent tooling." docsCollection: "runtime" diff --git a/src/runtime/docs/cli/oroc/page.md b/src/runtime/docs/cli/oroc/page.md index 0fa0e559..5422aee6 100644 --- a/src/runtime/docs/cli/oroc/page.md +++ b/src/runtime/docs/cli/oroc/page.md @@ -1,5 +1,5 @@ --- -layout: "runtime-docs" +layout: "docs" title: "oroc" description: "oroc is the Oro Runtime command line tool. It builds, runs, packages, and inspects Oro Runtime projects." docsCollection: "runtime" diff --git a/src/runtime/docs/cli/print-build-dir/page.md b/src/runtime/docs/cli/print-build-dir/page.md index 63404727..d3db8bf3 100644 --- a/src/runtime/docs/cli/print-build-dir/page.md +++ b/src/runtime/docs/cli/print-build-dir/page.md @@ -1,5 +1,5 @@ --- -layout: "runtime-docs" +layout: "docs" title: "oroc print-build-dir" description: "Print the build directory path." docsCollection: "runtime" diff --git a/src/runtime/docs/cli/run/page.md b/src/runtime/docs/cli/run/page.md index b764c6b2..229cf4e1 100644 --- a/src/runtime/docs/cli/run/page.md +++ b/src/runtime/docs/cli/run/page.md @@ -1,5 +1,5 @@ --- -layout: "runtime-docs" +layout: "docs" title: "oroc run" description: "Run an Oro Runtime application." docsCollection: "runtime" diff --git a/src/runtime/docs/cli/setup/page.md b/src/runtime/docs/cli/setup/page.md index 7662b93a..60c6a73d 100644 --- a/src/runtime/docs/cli/setup/page.md +++ b/src/runtime/docs/cli/setup/page.md @@ -1,5 +1,5 @@ --- -layout: "runtime-docs" +layout: "docs" title: "oroc setup" description: "Setup build tools for the host or a target platform." docsCollection: "runtime" diff --git a/src/runtime/docs/cli/update/bundle/page.md b/src/runtime/docs/cli/update/bundle/page.md index d613cae6..9c8b2e54 100644 --- a/src/runtime/docs/cli/update/bundle/page.md +++ b/src/runtime/docs/cli/update/bundle/page.md @@ -1,5 +1,5 @@ --- -layout: "runtime-docs" +layout: "docs" title: "oroc update bundle" description: "Build a tar archive containing a directory for use as an update artifact." docsCollection: "runtime" diff --git a/src/runtime/docs/cli/update/extract/page.md b/src/runtime/docs/cli/update/extract/page.md index c2f4189c..a8a21672 100644 --- a/src/runtime/docs/cli/update/extract/page.md +++ b/src/runtime/docs/cli/update/extract/page.md @@ -1,5 +1,5 @@ --- -layout: "runtime-docs" +layout: "docs" title: "oroc update extract" description: "Extract a tar archive produced by oroc update bundle into a destination directory." docsCollection: "runtime" diff --git a/src/runtime/docs/cli/update/info/page.md b/src/runtime/docs/cli/update/info/page.md index 51e62314..036b4858 100644 --- a/src/runtime/docs/cli/update/info/page.md +++ b/src/runtime/docs/cli/update/info/page.md @@ -1,5 +1,5 @@ --- -layout: "runtime-docs" +layout: "docs" title: "oroc update info" description: "Query update servers or static manifests over HTTP, TCP, or UDP." docsCollection: "runtime" diff --git a/src/runtime/docs/cli/update/init/page.md b/src/runtime/docs/cli/update/init/page.md index 48cbcde3..eed4cd65 100644 --- a/src/runtime/docs/cli/update/init/page.md +++ b/src/runtime/docs/cli/update/init/page.md @@ -1,5 +1,5 @@ --- -layout: "runtime-docs" +layout: "docs" title: "oroc update init" description: "Scaffold a minimal update manifest JSON file." docsCollection: "runtime" diff --git a/src/runtime/docs/cli/update/keygen/page.md b/src/runtime/docs/cli/update/keygen/page.md index 487b2416..c3f7c34f 100644 --- a/src/runtime/docs/cli/update/keygen/page.md +++ b/src/runtime/docs/cli/update/keygen/page.md @@ -1,5 +1,5 @@ --- -layout: "runtime-docs" +layout: "docs" title: "oroc update keygen" description: "Generate an Ed25519 keypair for signing update manifests." docsCollection: "runtime" diff --git a/src/runtime/docs/cli/update/page.md b/src/runtime/docs/cli/update/page.md index 465165cf..7f237611 100644 --- a/src/runtime/docs/cli/update/page.md +++ b/src/runtime/docs/cli/update/page.md @@ -1,5 +1,5 @@ --- -layout: "runtime-docs" +layout: "docs" title: "oroc update" description: "Update tooling for manifests, signatures, and bundles." docsCollection: "runtime" diff --git a/src/runtime/docs/cli/update/server/page.md b/src/runtime/docs/cli/update/server/page.md index de55594f..eae65fae 100644 --- a/src/runtime/docs/cli/update/server/page.md +++ b/src/runtime/docs/cli/update/server/page.md @@ -1,5 +1,5 @@ --- -layout: "runtime-docs" +layout: "docs" title: "oroc update server" description: "Run an update server that speaks the Oro Application Update Protocol." docsCollection: "runtime" diff --git a/src/runtime/docs/cli/update/sign/page.md b/src/runtime/docs/cli/update/sign/page.md index 1b341c37..48aa9a82 100644 --- a/src/runtime/docs/cli/update/sign/page.md +++ b/src/runtime/docs/cli/update/sign/page.md @@ -1,5 +1,5 @@ --- -layout: "runtime-docs" +layout: "docs" title: "oroc update sign" description: "Sign an update manifest and emit a detached manifest.sig file." docsCollection: "runtime" diff --git a/src/runtime/docs/cli/update/validate/page.md b/src/runtime/docs/cli/update/validate/page.md index 61d9c111..9d5395c7 100644 --- a/src/runtime/docs/cli/update/validate/page.md +++ b/src/runtime/docs/cli/update/validate/page.md @@ -1,5 +1,5 @@ --- -layout: "runtime-docs" +layout: "docs" title: "oroc update validate" description: "Validate an update manifest JSON file against the expected schema shape." docsCollection: "runtime" diff --git a/src/runtime/docs/cli/update/verify/page.md b/src/runtime/docs/cli/update/verify/page.md index 648a9065..8bd65747 100644 --- a/src/runtime/docs/cli/update/verify/page.md +++ b/src/runtime/docs/cli/update/verify/page.md @@ -1,5 +1,5 @@ --- -layout: "runtime-docs" +layout: "docs" title: "oroc update verify" description: "Verify a manifest and signature pair using an Ed25519 public key." docsCollection: "runtime" diff --git a/src/runtime/docs/cli/version/page.md b/src/runtime/docs/cli/version/page.md index 9c180314..bca957f5 100644 --- a/src/runtime/docs/cli/version/page.md +++ b/src/runtime/docs/cli/version/page.md @@ -1,5 +1,5 @@ --- -layout: "runtime-docs" +layout: "docs" title: "oroc version" description: "Inspect or bump the project version defined in your configuration file." docsCollection: "runtime" diff --git a/src/runtime/docs/cli/versions/page.md b/src/runtime/docs/cli/versions/page.md index c0b2ad80..2db4edaf 100644 --- a/src/runtime/docs/cli/versions/page.md +++ b/src/runtime/docs/cli/versions/page.md @@ -1,5 +1,5 @@ --- -layout: "runtime-docs" +layout: "docs" title: "oroc versions" description: "Print Oro CLI/runtime and dependency versions." docsCollection: "runtime" diff --git a/src/runtime/docs/config/copy-map/page.md b/src/runtime/docs/config/copy-map/page.md index bf913487..7697f99a 100644 --- a/src/runtime/docs/config/copy-map/page.md +++ b/src/runtime/docs/config/copy-map/page.md @@ -1,5 +1,5 @@ --- -layout: "runtime-docs" +layout: "docs" title: "copy_map" description: "Copy-maps let you explicitly map build inputs into your app bundle. They are referenced from oro.toml:" docsCollection: "runtime" diff --git a/src/runtime/docs/config/overview/page.md b/src/runtime/docs/config/overview/page.md index 574d1d7c..d09f52cd 100644 --- a/src/runtime/docs/config/overview/page.md +++ b/src/runtime/docs/config/overview/page.md @@ -1,5 +1,5 @@ --- -layout: "runtime-docs" +layout: "docs" title: "Configuration overview" description: "Oro Runtime projects are configured with a file named oro.toml (TOML) in the project root." docsCollection: "runtime" diff --git a/src/runtime/docs/config/reference/page.md b/src/runtime/docs/config/reference/page.md index ac71c82d..080618cd 100644 --- a/src/runtime/docs/config/reference/page.md +++ b/src/runtime/docs/config/reference/page.md @@ -1,5 +1,5 @@ --- -layout: "runtime-docs" +layout: "docs" title: "Configuration reference" description: "This page documents the most commonly used oro.toml sections and keys." docsCollection: "runtime" diff --git a/src/runtime/docs/guides/build-and-package/page.md b/src/runtime/docs/guides/build-and-package/page.md index 28ce62cd..d83d5336 100644 --- a/src/runtime/docs/guides/build-and-package/page.md +++ b/src/runtime/docs/guides/build-and-package/page.md @@ -1,5 +1,5 @@ --- -layout: "runtime-docs" +layout: "docs" title: "Build and package" description: "This guide summarizes the workflows downstream app developers use most:" docsCollection: "runtime" diff --git a/src/runtime/docs/guides/calling-http-apis/page.md b/src/runtime/docs/guides/calling-http-apis/page.md index 78a04cec..a3c640a1 100644 --- a/src/runtime/docs/guides/calling-http-apis/page.md +++ b/src/runtime/docs/guides/calling-http-apis/page.md @@ -1,5 +1,5 @@ --- -layout: "runtime-docs" +layout: "docs" title: "Calling HTTP APIs" description: "Most production applications spend their time moving between three layers:" docsCollection: "runtime" diff --git a/src/runtime/docs/guides/configure-your-runtime-project/page.md b/src/runtime/docs/guides/configure-your-runtime-project/page.md index ff7bd7b7..30fa94da 100644 --- a/src/runtime/docs/guides/configure-your-runtime-project/page.md +++ b/src/runtime/docs/guides/configure-your-runtime-project/page.md @@ -1,5 +1,5 @@ --- -layout: "runtime-docs" +layout: "docs" title: "Configure your runtime project" description: "Oro Runtime projects are controlled by oro.toml, with optional machine-local overrides in .ororc. Treat those files as part of the app contract: they define what ships, how the window behaves, which p" docsCollection: "runtime" diff --git a/src/runtime/docs/guides/custom-protocols-and-routing/page.md b/src/runtime/docs/guides/custom-protocols-and-routing/page.md index 94b6d106..6bb3a382 100644 --- a/src/runtime/docs/guides/custom-protocols-and-routing/page.md +++ b/src/runtime/docs/guides/custom-protocols-and-routing/page.md @@ -1,5 +1,5 @@ --- -layout: "runtime-docs" +layout: "docs" title: "Custom protocols and routing" description: "Some apps need more than a single https://-style origin. Custom protocols let you give internal resources a stable shape and route them through service-worker logic instead of hard-coding filesystem p" docsCollection: "runtime" diff --git a/src/runtime/docs/guides/desktop-integrations/page.md b/src/runtime/docs/guides/desktop-integrations/page.md index c31c4c92..ac84389b 100644 --- a/src/runtime/docs/guides/desktop-integrations/page.md +++ b/src/runtime/docs/guides/desktop-integrations/page.md @@ -1,5 +1,5 @@ --- -layout: "runtime-docs" +layout: "docs" title: "Desktop integrations" description: "Oro Runtime applications stay web-first, but the point of the runtime is that you do not stop at the browser boundary. This guide shows how to add four integrations users actually notice: notification" docsCollection: "runtime" diff --git a/src/runtime/docs/guides/files-and-sandboxing/page.md b/src/runtime/docs/guides/files-and-sandboxing/page.md index e6fe2ba2..67873437 100644 --- a/src/runtime/docs/guides/files-and-sandboxing/page.md +++ b/src/runtime/docs/guides/files-and-sandboxing/page.md @@ -1,5 +1,5 @@ --- -layout: "runtime-docs" +layout: "docs" title: "Files and sandboxing" description: "Most serious applications need two kinds of file access:" docsCollection: "runtime" diff --git a/src/runtime/docs/guides/from-zero-to-first-run/page.md b/src/runtime/docs/guides/from-zero-to-first-run/page.md index db62c545..9b4ca603 100644 --- a/src/runtime/docs/guides/from-zero-to-first-run/page.md +++ b/src/runtime/docs/guides/from-zero-to-first-run/page.md @@ -1,5 +1,5 @@ --- -layout: "runtime-docs" +layout: "docs" title: "From zero to first run" description: "This guide starts from an empty directory and gets you to a runnable Oro Runtime application using the installed toolchain. The goal is not just to boot a page, but to end with a project that already " docsCollection: "runtime" diff --git a/src/runtime/docs/guides/frontend-build-pipeline/page.md b/src/runtime/docs/guides/frontend-build-pipeline/page.md index f685bf55..f69261f8 100644 --- a/src/runtime/docs/guides/frontend-build-pipeline/page.md +++ b/src/runtime/docs/guides/frontend-build-pipeline/page.md @@ -1,5 +1,5 @@ --- -layout: "runtime-docs" +layout: "docs" title: "Frontend build pipeline" description: "Most production Oro Runtime applications do not ship raw source files. They run a web build first, then copy the built artifacts into the runtime bundle. This guide shows a clean pipeline that works f" docsCollection: "runtime" diff --git a/src/runtime/docs/guides/hello-world/page.md b/src/runtime/docs/guides/hello-world/page.md index d4edb38c..f63a91c5 100644 --- a/src/runtime/docs/guides/hello-world/page.md +++ b/src/runtime/docs/guides/hello-world/page.md @@ -1,5 +1,5 @@ --- -layout: "runtime-docs" +layout: "docs" title: "Hello world" description: "This guide builds a small Oro Runtime app that does three things immediately:" docsCollection: "runtime" diff --git a/src/runtime/docs/guides/lifecycle-hooks-and-deep-links/page.md b/src/runtime/docs/guides/lifecycle-hooks-and-deep-links/page.md index 86ad9199..820f79be 100644 --- a/src/runtime/docs/guides/lifecycle-hooks-and-deep-links/page.md +++ b/src/runtime/docs/guides/lifecycle-hooks-and-deep-links/page.md @@ -1,5 +1,5 @@ --- -layout: "runtime-docs" +layout: "docs" title: "Lifecycle hooks and deep links" description: "Lifecycle hooks are where the application stops being a generic page and starts reacting like a native application. Use them for readiness, connectivity, backgrounding, and OS-delivered URLs." docsCollection: "runtime" diff --git a/src/runtime/docs/guides/local-data-with-sqlite/page.md b/src/runtime/docs/guides/local-data-with-sqlite/page.md index 7bf2452f..ffec88c1 100644 --- a/src/runtime/docs/guides/local-data-with-sqlite/page.md +++ b/src/runtime/docs/guides/local-data-with-sqlite/page.md @@ -1,5 +1,5 @@ --- -layout: "runtime-docs" +layout: "docs" title: "Local data with SQLite" description: "Once an app moves beyond a few JSON files, SQLite is the right default. It gives you transactions, indexes, and queryable data without adding another service to your deployment story." docsCollection: "runtime" diff --git a/src/runtime/docs/guides/mcp-and-agent-automation/page.md b/src/runtime/docs/guides/mcp-and-agent-automation/page.md index 210c7cdb..21622762 100644 --- a/src/runtime/docs/guides/mcp-and-agent-automation/page.md +++ b/src/runtime/docs/guides/mcp-and-agent-automation/page.md @@ -1,5 +1,5 @@ --- -layout: "runtime-docs" +layout: "docs" title: "MCP and agent automation" description: "Oro Runtime supports MCP in two complementary ways:" docsCollection: "runtime" diff --git a/src/runtime/docs/guides/mobile-targets-and-device-installs/page.md b/src/runtime/docs/guides/mobile-targets-and-device-installs/page.md index 55094197..80bfe8d4 100644 --- a/src/runtime/docs/guides/mobile-targets-and-device-installs/page.md +++ b/src/runtime/docs/guides/mobile-targets-and-device-installs/page.md @@ -1,5 +1,5 @@ --- -layout: "runtime-docs" +layout: "docs" title: "Mobile targets and device installs" description: "Oro Runtime can target Android and Apple devices from the same project model. The key is to separate three concerns:" docsCollection: "runtime" diff --git a/src/runtime/docs/guides/native-extensions/page.md b/src/runtime/docs/guides/native-extensions/page.md index 5a146fc5..8ede3007 100644 --- a/src/runtime/docs/guides/native-extensions/page.md +++ b/src/runtime/docs/guides/native-extensions/page.md @@ -1,5 +1,5 @@ --- -layout: "runtime-docs" +layout: "docs" title: "Native extensions" description: "Use a native extension when app code needs a capability that should not live in JavaScript: an existing C/C++ library, platform-specific code, long-running native work, or a Wasm module that should be" docsCollection: "runtime" diff --git a/src/runtime/docs/guides/offline-first-with-service-workers/page.md b/src/runtime/docs/guides/offline-first-with-service-workers/page.md index 0f8cdf6f..cd70331f 100644 --- a/src/runtime/docs/guides/offline-first-with-service-workers/page.md +++ b/src/runtime/docs/guides/offline-first-with-service-workers/page.md @@ -1,5 +1,5 @@ --- -layout: "runtime-docs" +layout: "docs" title: "Offline-first with service workers" description: "For applications that need to keep working without reliable connectivity, service workers are the right boundary. Use them to cache the application shell, serve known assets, and provide controlled fa" docsCollection: "runtime" diff --git a/src/runtime/docs/guides/project-layout/page.md b/src/runtime/docs/guides/project-layout/page.md index 6f84627b..facaa515 100644 --- a/src/runtime/docs/guides/project-layout/page.md +++ b/src/runtime/docs/guides/project-layout/page.md @@ -1,5 +1,5 @@ --- -layout: "runtime-docs" +layout: "docs" title: "Project layout" description: "An Oro Runtime project is a directory with:" docsCollection: "runtime" diff --git a/src/runtime/docs/guides/release-packaging-and-signed-updates/page.md b/src/runtime/docs/guides/release-packaging-and-signed-updates/page.md index fdde093a..35bd4d7f 100644 --- a/src/runtime/docs/guides/release-packaging-and-signed-updates/page.md +++ b/src/runtime/docs/guides/release-packaging-and-signed-updates/page.md @@ -1,5 +1,5 @@ --- -layout: "runtime-docs" +layout: "docs" title: "Release packaging and signed updates" description: "Shipping the app is only half of the release story. The other half is producing update artifacts that can be verified, served, and diagnosed later without improvisation." docsCollection: "runtime" diff --git a/src/runtime/docs/guides/secure-storage-and-sessions/page.md b/src/runtime/docs/guides/secure-storage-and-sessions/page.md index 8f290686..21afd2b0 100644 --- a/src/runtime/docs/guides/secure-storage-and-sessions/page.md +++ b/src/runtime/docs/guides/secure-storage-and-sessions/page.md @@ -1,5 +1,5 @@ --- -layout: "runtime-docs" +layout: "docs" title: "Secure storage and sessions" description: "Application data and application secrets are not the same thing. Put notes, caches, and drafts in the filesystem or SQLite. Put refresh tokens, client secrets, and other credentials in oro:secure-stor" docsCollection: "runtime" diff --git a/src/runtime/docs/guides/shared-workers-across-windows/page.md b/src/runtime/docs/guides/shared-workers-across-windows/page.md index c3dc1941..540b96b7 100644 --- a/src/runtime/docs/guides/shared-workers-across-windows/page.md +++ b/src/runtime/docs/guides/shared-workers-across-windows/page.md @@ -1,5 +1,5 @@ --- -layout: "runtime-docs" +layout: "docs" title: "Shared workers across windows" description: "If one background coordinator should serve multiple windows at the same time, use a shared worker instead of one worker per window. This is a strong fit for search indexing, presence state, websocket " docsCollection: "runtime" diff --git a/src/runtime/docs/guides/testing-and-diagnostics/page.md b/src/runtime/docs/guides/testing-and-diagnostics/page.md index c1b10b5c..2c7562a0 100644 --- a/src/runtime/docs/guides/testing-and-diagnostics/page.md +++ b/src/runtime/docs/guides/testing-and-diagnostics/page.md @@ -1,5 +1,5 @@ --- -layout: "runtime-docs" +layout: "docs" title: "Testing and diagnostics" description: "If the runtime app is real, it needs two things early:" docsCollection: "runtime" diff --git a/src/runtime/docs/guides/windows-and-messaging/page.md b/src/runtime/docs/guides/windows-and-messaging/page.md index 09e6d535..d75a373b 100644 --- a/src/runtime/docs/guides/windows-and-messaging/page.md +++ b/src/runtime/docs/guides/windows-and-messaging/page.md @@ -1,5 +1,5 @@ --- -layout: "runtime-docs" +layout: "docs" title: "Windows and messaging" description: "Oro Runtime apps can create multiple windows. Windows are identified by a numeric index." docsCollection: "runtime" diff --git a/src/runtime/docs/guides/worker-threads-for-heavy-work/page.md b/src/runtime/docs/guides/worker-threads-for-heavy-work/page.md index dfb9170e..afcf860c 100644 --- a/src/runtime/docs/guides/worker-threads-for-heavy-work/page.md +++ b/src/runtime/docs/guides/worker-threads-for-heavy-work/page.md @@ -1,5 +1,5 @@ --- -layout: "runtime-docs" +layout: "docs" title: "Worker threads for heavy work" description: "The main window should stay responsive. If a task is CPU-heavy or processes large blobs of text or binary data, move it to oro:worker_threads." docsCollection: "runtime" diff --git a/src/runtime/docs/javascript/ai/page.md b/src/runtime/docs/javascript/ai/page.md index bb4f0329..26f1e667 100644 --- a/src/runtime/docs/javascript/ai/page.md +++ b/src/runtime/docs/javascript/ai/page.md @@ -1,5 +1,5 @@ --- -layout: "runtime-docs" +layout: "docs" title: "oro:ai" description: "oro:ai exposes local AI helpers. It currently exports two modules:" docsCollection: "runtime" diff --git a/src/runtime/docs/javascript/all-modules/page.md b/src/runtime/docs/javascript/all-modules/page.md index eed282f8..70ca91b5 100644 --- a/src/runtime/docs/javascript/all-modules/page.md +++ b/src/runtime/docs/javascript/all-modules/page.md @@ -1,5 +1,5 @@ --- -layout: "runtime-docs" +layout: "docs" title: "JavaScript API modules" description: "Oro Runtime exposes native capabilities as explicit ES module imports under the oro:* namespace. Treat those imports as the boundary between ordinary web code and host capabilities." docsCollection: "runtime" diff --git a/src/runtime/docs/javascript/application/page.md b/src/runtime/docs/javascript/application/page.md index 611865dd..2c36343d 100644 --- a/src/runtime/docs/javascript/application/page.md +++ b/src/runtime/docs/javascript/application/page.md @@ -1,5 +1,5 @@ --- -layout: "runtime-docs" +layout: "docs" title: "oro:application" description: "oro:application exposes application-level APIs: creating windows, querying windows, menus, and runtime metadata." docsCollection: "runtime" diff --git a/src/runtime/docs/javascript/asn1/page.md b/src/runtime/docs/javascript/asn1/page.md index 2e966e4d..34b6780d 100644 --- a/src/runtime/docs/javascript/asn1/page.md +++ b/src/runtime/docs/javascript/asn1/page.md @@ -1,5 +1,5 @@ --- -layout: "runtime-docs" +layout: "docs" title: "oro:asn1" description: "oro:asn1 parses ASN.1 source text and files into structured module data." docsCollection: "runtime" diff --git a/src/runtime/docs/javascript/assert/page.md b/src/runtime/docs/javascript/assert/page.md index 2549e552..4352bf0b 100644 --- a/src/runtime/docs/javascript/assert/page.md +++ b/src/runtime/docs/javascript/assert/page.md @@ -1,5 +1,5 @@ --- -layout: "runtime-docs" +layout: "docs" title: "oro:assert" description: "oro:assert provides Node-compatible assertion helpers for tests, runtime checks, and invariants." docsCollection: "runtime" diff --git a/src/runtime/docs/javascript/async/page.md b/src/runtime/docs/javascript/async/page.md index 9b25958f..c01df7b5 100644 --- a/src/runtime/docs/javascript/async/page.md +++ b/src/runtime/docs/javascript/async/page.md @@ -1,5 +1,5 @@ --- -layout: "runtime-docs" +layout: "docs" title: "oro:async" description: "oro:async exposes async context propagation, deferred values, and resource tracking primitives." docsCollection: "runtime" diff --git a/src/runtime/docs/javascript/async_hooks/page.md b/src/runtime/docs/javascript/async_hooks/page.md index 2a5003cb..2e14e095 100644 --- a/src/runtime/docs/javascript/async_hooks/page.md +++ b/src/runtime/docs/javascript/async_hooks/page.md @@ -1,5 +1,5 @@ --- -layout: "runtime-docs" +layout: "docs" title: "oro:async_hooks" description: "oro:async_hooks exposes hook-based async lifecycle inspection compatible with Node-style instrumentation." docsCollection: "runtime" diff --git a/src/runtime/docs/javascript/background/page.md b/src/runtime/docs/javascript/background/page.md index 2a072383..b5827198 100644 --- a/src/runtime/docs/javascript/background/page.md +++ b/src/runtime/docs/javascript/background/page.md @@ -1,5 +1,5 @@ --- -layout: "runtime-docs" +layout: "docs" title: "oro:background" description: "oro:background lets you inspect and coordinate the runtime background task surface." docsCollection: "runtime" diff --git a/src/runtime/docs/javascript/buffer/page.md b/src/runtime/docs/javascript/buffer/page.md index fe3d3be4..e7be624c 100644 --- a/src/runtime/docs/javascript/buffer/page.md +++ b/src/runtime/docs/javascript/buffer/page.md @@ -1,5 +1,5 @@ --- -layout: "runtime-docs" +layout: "docs" title: "oro:buffer" description: "oro:buffer provides Buffer, Blob, and related byte-oriented helpers." docsCollection: "runtime" diff --git a/src/runtime/docs/javascript/cdp/page.md b/src/runtime/docs/javascript/cdp/page.md index 8d47788e..01231070 100644 --- a/src/runtime/docs/javascript/cdp/page.md +++ b/src/runtime/docs/javascript/cdp/page.md @@ -1,5 +1,5 @@ --- -layout: "runtime-docs" +layout: "docs" title: "oro:cdp" description: "oro:cdp controls the runtime Chrome DevTools Protocol endpoint used for inspection and debugging." docsCollection: "runtime" diff --git a/src/runtime/docs/javascript/child_process/page.md b/src/runtime/docs/javascript/child_process/page.md index 78c77e25..a43fc9b5 100644 --- a/src/runtime/docs/javascript/child_process/page.md +++ b/src/runtime/docs/javascript/child_process/page.md @@ -1,5 +1,5 @@ --- -layout: "runtime-docs" +layout: "docs" title: "oro:child_process" description: "oro:child_process launches and manages subprocesses with a Node-compatible API." docsCollection: "runtime" diff --git a/src/runtime/docs/javascript/clipboard/page.md b/src/runtime/docs/javascript/clipboard/page.md index 27520e18..cf5b9abf 100644 --- a/src/runtime/docs/javascript/clipboard/page.md +++ b/src/runtime/docs/javascript/clipboard/page.md @@ -1,5 +1,5 @@ --- -layout: "runtime-docs" +layout: "docs" title: "oro:clipboard" description: "oro:clipboard reads and writes clipboard text from the current application context." docsCollection: "runtime" diff --git a/src/runtime/docs/javascript/commonjs/page.md b/src/runtime/docs/javascript/commonjs/page.md index 1d633f91..5cb27a9f 100644 --- a/src/runtime/docs/javascript/commonjs/page.md +++ b/src/runtime/docs/javascript/commonjs/page.md @@ -1,5 +1,5 @@ --- -layout: "runtime-docs" +layout: "docs" title: "oro:commonjs" description: "oro:commonjs/* exposes the runtime’s CommonJS loader, cache, and resolution helpers." docsCollection: "runtime" diff --git a/src/runtime/docs/javascript/conduit/page.md b/src/runtime/docs/javascript/conduit/page.md index bbfb1504..569d0938 100644 --- a/src/runtime/docs/javascript/conduit/page.md +++ b/src/runtime/docs/javascript/conduit/page.md @@ -1,5 +1,5 @@ --- -layout: "runtime-docs" +layout: "docs" title: "oro:conduit" description: "oro:conduit manages the runtime WebSocket conduit used for internal cross-surface messaging." docsCollection: "runtime" diff --git a/src/runtime/docs/javascript/console/page.md b/src/runtime/docs/javascript/console/page.md index 251181ac..6d7cfa4e 100644 --- a/src/runtime/docs/javascript/console/page.md +++ b/src/runtime/docs/javascript/console/page.md @@ -1,5 +1,5 @@ --- -layout: "runtime-docs" +layout: "docs" title: "oro:console" description: "oro:console exposes the runtime console implementation and patch helpers." docsCollection: "runtime" diff --git a/src/runtime/docs/javascript/constants/page.md b/src/runtime/docs/javascript/constants/page.md index c4b73535..474abf9e 100644 --- a/src/runtime/docs/javascript/constants/page.md +++ b/src/runtime/docs/javascript/constants/page.md @@ -1,5 +1,5 @@ --- -layout: "runtime-docs" +layout: "docs" title: "oro:constants" description: "oro:constants publishes the runtime’s platform, errno, and low-level constant tables." docsCollection: "runtime" diff --git a/src/runtime/docs/javascript/cookies/page.md b/src/runtime/docs/javascript/cookies/page.md index 35e64433..c79d25c6 100644 --- a/src/runtime/docs/javascript/cookies/page.md +++ b/src/runtime/docs/javascript/cookies/page.md @@ -1,5 +1,5 @@ --- -layout: "runtime-docs" +layout: "docs" title: "oro:cookies" description: "oro:cookies reads and writes cookies for application-controlled origins." docsCollection: "runtime" diff --git a/src/runtime/docs/javascript/crypto/page.md b/src/runtime/docs/javascript/crypto/page.md index c56a3cff..95e0524e 100644 --- a/src/runtime/docs/javascript/crypto/page.md +++ b/src/runtime/docs/javascript/crypto/page.md @@ -1,5 +1,5 @@ --- -layout: "runtime-docs" +layout: "docs" title: "oro:crypto" description: "oro:crypto exposes hashing, random bytes, and bundled sodium-backed helpers." docsCollection: "runtime" diff --git a/src/runtime/docs/javascript/dbus/page.md b/src/runtime/docs/javascript/dbus/page.md index a1e6b986..1c2bc803 100644 --- a/src/runtime/docs/javascript/dbus/page.md +++ b/src/runtime/docs/javascript/dbus/page.md @@ -1,5 +1,5 @@ --- -layout: "runtime-docs" +layout: "docs" title: "oro:dbus" description: "oro:dbus connects to DBus and lets JavaScript code call methods, watch signals, and manage names." docsCollection: "runtime" diff --git a/src/runtime/docs/javascript/dgram/page.md b/src/runtime/docs/javascript/dgram/page.md index 02d9e479..95276493 100644 --- a/src/runtime/docs/javascript/dgram/page.md +++ b/src/runtime/docs/javascript/dgram/page.md @@ -1,5 +1,5 @@ --- -layout: "runtime-docs" +layout: "docs" title: "oro:dgram" description: "oro:dgram provides UDP sockets and multicast helpers with a Node-compatible API." docsCollection: "runtime" diff --git a/src/runtime/docs/javascript/diagnostics/page.md b/src/runtime/docs/javascript/diagnostics/page.md index ec41c92d..4fda187f 100644 --- a/src/runtime/docs/javascript/diagnostics/page.md +++ b/src/runtime/docs/javascript/diagnostics/page.md @@ -1,5 +1,5 @@ --- -layout: "runtime-docs" +layout: "docs" title: "oro:diagnostics" description: "oro:diagnostics exposes channels, metrics, and runtime/window diagnostic queries." docsCollection: "runtime" diff --git a/src/runtime/docs/javascript/did/page.md b/src/runtime/docs/javascript/did/page.md index 19d14931..aaafb2fa 100644 --- a/src/runtime/docs/javascript/did/page.md +++ b/src/runtime/docs/javascript/did/page.md @@ -1,5 +1,5 @@ --- -layout: "runtime-docs" +layout: "docs" title: "oro:did" description: "oro:did parses and manipulates decentralized identifiers and DID URLs." docsCollection: "runtime" diff --git a/src/runtime/docs/javascript/dns/page.md b/src/runtime/docs/javascript/dns/page.md index ad911870..59fd64ea 100644 --- a/src/runtime/docs/javascript/dns/page.md +++ b/src/runtime/docs/javascript/dns/page.md @@ -1,5 +1,5 @@ --- -layout: "runtime-docs" +layout: "docs" title: "oro:dns" description: "oro:dns provides DNS lookup helpers and promise-based resolution APIs." docsCollection: "runtime" diff --git a/src/runtime/docs/javascript/enumeration/page.md b/src/runtime/docs/javascript/enumeration/page.md index 8b0f1e0a..34cf6a3c 100644 --- a/src/runtime/docs/javascript/enumeration/page.md +++ b/src/runtime/docs/javascript/enumeration/page.md @@ -1,5 +1,5 @@ --- -layout: "runtime-docs" +layout: "docs" title: "oro:enumeration" description: "oro:enumeration is a small typed-set helper used throughout the runtime surface." docsCollection: "runtime" diff --git a/src/runtime/docs/javascript/errno/page.md b/src/runtime/docs/javascript/errno/page.md index 8fa29a70..d849a87b 100644 --- a/src/runtime/docs/javascript/errno/page.md +++ b/src/runtime/docs/javascript/errno/page.md @@ -1,5 +1,5 @@ --- -layout: "runtime-docs" +layout: "docs" title: "oro:errno" description: "oro:errno converts errno values to names and messages." docsCollection: "runtime" diff --git a/src/runtime/docs/javascript/errors/page.md b/src/runtime/docs/javascript/errors/page.md index b8ba3f27..30ce6be7 100644 --- a/src/runtime/docs/javascript/errors/page.md +++ b/src/runtime/docs/javascript/errors/page.md @@ -1,5 +1,5 @@ --- -layout: "runtime-docs" +layout: "docs" title: "oro:errors" description: "oro:errors exports DOM-style and runtime-specific error classes and constants." docsCollection: "runtime" diff --git a/src/runtime/docs/javascript/events/page.md b/src/runtime/docs/javascript/events/page.md index 520fea2c..f2b52ff2 100644 --- a/src/runtime/docs/javascript/events/page.md +++ b/src/runtime/docs/javascript/events/page.md @@ -1,5 +1,5 @@ --- -layout: "runtime-docs" +layout: "docs" title: "oro:events" description: "oro:events provides EventEmitter, EventTarget, and event primitives used across the runtime." docsCollection: "runtime" diff --git a/src/runtime/docs/javascript/extension/page.md b/src/runtime/docs/javascript/extension/page.md index da6fba30..c3646546 100644 --- a/src/runtime/docs/javascript/extension/page.md +++ b/src/runtime/docs/javascript/extension/page.md @@ -1,5 +1,5 @@ --- -layout: "runtime-docs" +layout: "docs" title: "oro:extension" description: "oro:extension loads app-bundled native extensions and Wasm extensions, then exposes their registered runtime state to JavaScript." docsCollection: "runtime" diff --git a/src/runtime/docs/javascript/fetch/page.md b/src/runtime/docs/javascript/fetch/page.md index e266b9af..b1879ced 100644 --- a/src/runtime/docs/javascript/fetch/page.md +++ b/src/runtime/docs/javascript/fetch/page.md @@ -1,5 +1,5 @@ --- -layout: "runtime-docs" +layout: "docs" title: "oro:fetch" description: "oro:fetch exposes the runtime fetch stack and standard request/response primitives." docsCollection: "runtime" diff --git a/src/runtime/docs/javascript/fs/page.md b/src/runtime/docs/javascript/fs/page.md index 16f11974..aad0d63b 100644 --- a/src/runtime/docs/javascript/fs/page.md +++ b/src/runtime/docs/javascript/fs/page.md @@ -1,5 +1,5 @@ --- -layout: "runtime-docs" +layout: "docs" title: "oro:fs" description: "oro:fs provides filesystem APIs modeled on POSIX and Node.js." docsCollection: "runtime" diff --git a/src/runtime/docs/javascript/gc/page.md b/src/runtime/docs/javascript/gc/page.md index de9dfb3e..ce73b1d5 100644 --- a/src/runtime/docs/javascript/gc/page.md +++ b/src/runtime/docs/javascript/gc/page.md @@ -1,5 +1,5 @@ --- -layout: "runtime-docs" +layout: "docs" title: "oro:gc" description: "oro:gc lets you register finalizers and control object retention hooks." docsCollection: "runtime" diff --git a/src/runtime/docs/javascript/hci/page.md b/src/runtime/docs/javascript/hci/page.md index 5b18f4cd..4b94449e 100644 --- a/src/runtime/docs/javascript/hci/page.md +++ b/src/runtime/docs/javascript/hci/page.md @@ -1,5 +1,5 @@ --- -layout: "runtime-docs" +layout: "docs" title: "oro:hci" description: "oro:hci exposes host controller interface helpers for low-level Bluetooth adapter access." docsCollection: "runtime" diff --git a/src/runtime/docs/javascript/hooks/page.md b/src/runtime/docs/javascript/hooks/page.md index 7d134a70..b07b0fe2 100644 --- a/src/runtime/docs/javascript/hooks/page.md +++ b/src/runtime/docs/javascript/hooks/page.md @@ -1,5 +1,5 @@ --- -layout: "runtime-docs" +layout: "docs" title: "oro:hooks" description: "oro:hooks provides a consistent way to subscribe to runtime-delivered lifecycle and system events." docsCollection: "runtime" diff --git a/src/runtime/docs/javascript/http/page.md b/src/runtime/docs/javascript/http/page.md index 4e6486d0..947d653e 100644 --- a/src/runtime/docs/javascript/http/page.md +++ b/src/runtime/docs/javascript/http/page.md @@ -1,5 +1,5 @@ --- -layout: "runtime-docs" +layout: "docs" title: "oro:http" description: "oro:http provides Node-compatible HTTP client and server APIs." docsCollection: "runtime" diff --git a/src/runtime/docs/javascript/https/page.md b/src/runtime/docs/javascript/https/page.md index 69b96c8e..9059ce23 100644 --- a/src/runtime/docs/javascript/https/page.md +++ b/src/runtime/docs/javascript/https/page.md @@ -1,5 +1,5 @@ --- -layout: "runtime-docs" +layout: "docs" title: "oro:https" description: "oro:https provides HTTPS client and server APIs on top of the runtime TLS stack." docsCollection: "runtime" diff --git a/src/runtime/docs/javascript/i18n/page.md b/src/runtime/docs/javascript/i18n/page.md index 897d93bc..081e45cb 100644 --- a/src/runtime/docs/javascript/i18n/page.md +++ b/src/runtime/docs/javascript/i18n/page.md @@ -1,5 +1,5 @@ --- -layout: "runtime-docs" +layout: "docs" title: "oro:i18n" description: "oro:i18n resolves UI languages, localized messages, and locale-aware metadata." docsCollection: "runtime" diff --git a/src/runtime/docs/javascript/ip/page.md b/src/runtime/docs/javascript/ip/page.md index 9e45402a..4bf1cbd2 100644 --- a/src/runtime/docs/javascript/ip/page.md +++ b/src/runtime/docs/javascript/ip/page.md @@ -1,5 +1,5 @@ --- -layout: "runtime-docs" +layout: "docs" title: "oro:ip" description: "oro:ip normalizes and validates IP address inputs." docsCollection: "runtime" diff --git a/src/runtime/docs/javascript/ipc/page.md b/src/runtime/docs/javascript/ipc/page.md index e10258be..a0d1dea7 100644 --- a/src/runtime/docs/javascript/ipc/page.md +++ b/src/runtime/docs/javascript/ipc/page.md @@ -1,5 +1,5 @@ --- -layout: "runtime-docs" +layout: "docs" title: "oro:ipc" description: "oro:ipc exposes low-level runtime IPC helpers used to talk to the native host process." docsCollection: "runtime" diff --git a/src/runtime/docs/javascript/ipfs/page.md b/src/runtime/docs/javascript/ipfs/page.md index 86c50b06..bd0f9616 100644 --- a/src/runtime/docs/javascript/ipfs/page.md +++ b/src/runtime/docs/javascript/ipfs/page.md @@ -1,5 +1,5 @@ --- -layout: "runtime-docs" +layout: "docs" title: "oro:ipfs" description: "oro:ipfs manages the embedded IPFS node and common content operations." docsCollection: "runtime" diff --git a/src/runtime/docs/javascript/iroh/page.md b/src/runtime/docs/javascript/iroh/page.md index f91cc812..3151a402 100644 --- a/src/runtime/docs/javascript/iroh/page.md +++ b/src/runtime/docs/javascript/iroh/page.md @@ -1,5 +1,5 @@ --- -layout: "runtime-docs" +layout: "docs" title: "oro:iroh" description: "oro:iroh exposes the runtime’s Iroh transport bindings for peer-to-peer connections and streams." docsCollection: "runtime" diff --git a/src/runtime/docs/javascript/language/page.md b/src/runtime/docs/javascript/language/page.md index 1bc42db5..12f98156 100644 --- a/src/runtime/docs/javascript/language/page.md +++ b/src/runtime/docs/javascript/language/page.md @@ -1,5 +1,5 @@ --- -layout: "runtime-docs" +layout: "docs" title: "oro:language" description: "oro:language resolves language names, tags, and related metadata." docsCollection: "runtime" diff --git a/src/runtime/docs/javascript/latica/page.md b/src/runtime/docs/javascript/latica/page.md index 026a39a9..c6b2be64 100644 --- a/src/runtime/docs/javascript/latica/page.md +++ b/src/runtime/docs/javascript/latica/page.md @@ -1,5 +1,5 @@ --- -layout: "runtime-docs" +layout: "docs" title: "oro:latica" description: "oro:latica/* exposes the runtime’s Latica networking primitives, packet helpers, and crypto utilities." docsCollection: "runtime" diff --git a/src/runtime/docs/javascript/location/page.md b/src/runtime/docs/javascript/location/page.md index 3512d04c..db0005d4 100644 --- a/src/runtime/docs/javascript/location/page.md +++ b/src/runtime/docs/javascript/location/page.md @@ -1,5 +1,5 @@ --- -layout: "runtime-docs" +layout: "docs" title: "oro:location" description: "oro:location normalizes the current runtime location and origin semantics across platforms." docsCollection: "runtime" diff --git a/src/runtime/docs/javascript/mcp/page.md b/src/runtime/docs/javascript/mcp/page.md index ffd0ba21..7d8c62ed 100644 --- a/src/runtime/docs/javascript/mcp/page.md +++ b/src/runtime/docs/javascript/mcp/page.md @@ -1,5 +1,5 @@ --- -layout: "runtime-docs" +layout: "docs" title: "oro:mcp" description: "oro:mcp provides runtime MCP helpers for registering tools/resources and controlling the embedded HTTP/SSE bridge." docsCollection: "runtime" diff --git a/src/runtime/docs/javascript/mime/page.md b/src/runtime/docs/javascript/mime/page.md index 08d72918..6da3823f 100644 --- a/src/runtime/docs/javascript/mime/page.md +++ b/src/runtime/docs/javascript/mime/page.md @@ -1,5 +1,5 @@ --- -layout: "runtime-docs" +layout: "docs" title: "oro:mime" description: "oro:mime looks up MIME types, extensions, and content-type metadata." docsCollection: "runtime" diff --git a/src/runtime/docs/javascript/module/page.md b/src/runtime/docs/javascript/module/page.md index 98100d84..95995a19 100644 --- a/src/runtime/docs/javascript/module/page.md +++ b/src/runtime/docs/javascript/module/page.md @@ -1,5 +1,5 @@ --- -layout: "runtime-docs" +layout: "docs" title: "oro:module" description: "oro:module exposes module-loader helpers and builtin-module inspection." docsCollection: "runtime" diff --git a/src/runtime/docs/javascript/navigation/page.md b/src/runtime/docs/javascript/navigation/page.md index f4b3139a..8b3792bf 100644 --- a/src/runtime/docs/javascript/navigation/page.md +++ b/src/runtime/docs/javascript/navigation/page.md @@ -1,5 +1,5 @@ --- -layout: "runtime-docs" +layout: "docs" title: "oro:navigation" description: "oro:navigation surfaces the Navigation API state that the runtime makes available to application code." docsCollection: "runtime" diff --git a/src/runtime/docs/javascript/net/page.md b/src/runtime/docs/javascript/net/page.md index 7d78d1b7..5b64a6c0 100644 --- a/src/runtime/docs/javascript/net/page.md +++ b/src/runtime/docs/javascript/net/page.md @@ -1,5 +1,5 @@ --- -layout: "runtime-docs" +layout: "docs" title: "oro:net" description: "oro:net provides Node-compatible TCP clients and servers." docsCollection: "runtime" diff --git a/src/runtime/docs/javascript/network/page.md b/src/runtime/docs/javascript/network/page.md index b048d8a3..1959bd77 100644 --- a/src/runtime/docs/javascript/network/page.md +++ b/src/runtime/docs/javascript/network/page.md @@ -1,5 +1,5 @@ --- -layout: "runtime-docs" +layout: "docs" title: "oro:network" description: "oro:network exposes a higher-level networking surface built on the Latica stack." docsCollection: "runtime" diff --git a/src/runtime/docs/javascript/notification/page.md b/src/runtime/docs/javascript/notification/page.md index 567babdc..dec78cb5 100644 --- a/src/runtime/docs/javascript/notification/page.md +++ b/src/runtime/docs/javascript/notification/page.md @@ -1,5 +1,5 @@ --- -layout: "runtime-docs" +layout: "docs" title: "oro:notification" description: "oro:notification provides an API to display desktop and mobile notifications and request permission to use them." docsCollection: "runtime" diff --git a/src/runtime/docs/javascript/npm/page.md b/src/runtime/docs/javascript/npm/page.md index 63226a5e..82f412bf 100644 --- a/src/runtime/docs/javascript/npm/page.md +++ b/src/runtime/docs/javascript/npm/page.md @@ -1,5 +1,5 @@ --- -layout: "runtime-docs" +layout: "docs" title: "oro:npm/*" description: "oro:npm/* supports package-resolution and service-worker plumbing for NPM-backed modules." docsCollection: "runtime" diff --git a/src/runtime/docs/javascript/os/page.md b/src/runtime/docs/javascript/os/page.md index 76dd5fe0..c2d6ac21 100644 --- a/src/runtime/docs/javascript/os/page.md +++ b/src/runtime/docs/javascript/os/page.md @@ -1,5 +1,5 @@ --- -layout: "runtime-docs" +layout: "docs" title: "oro:os" description: "oro:os exposes platform, CPU, temporary-directory, and system metadata helpers." docsCollection: "runtime" diff --git a/src/runtime/docs/javascript/overview/page.md b/src/runtime/docs/javascript/overview/page.md index b17b3ac1..9b9de6c3 100644 --- a/src/runtime/docs/javascript/overview/page.md +++ b/src/runtime/docs/javascript/overview/page.md @@ -1,5 +1,5 @@ --- -layout: "runtime-docs" +layout: "docs" title: "JavaScript APIs overview" description: "Oro Runtime apps run inside the platform WebView. You use standard web APIs (DOM, ES modules, fetch, URLs, WebCrypto, WebAssembly) and import Oro-specific native capabilities as explicit ES modules un" docsCollection: "runtime" diff --git a/src/runtime/docs/javascript/path/page.md b/src/runtime/docs/javascript/path/page.md index c830af24..8c148534 100644 --- a/src/runtime/docs/javascript/path/page.md +++ b/src/runtime/docs/javascript/path/page.md @@ -1,5 +1,5 @@ --- -layout: "runtime-docs" +layout: "docs" title: "oro:path" description: "oro:path provides cross-platform path manipulation utilities." docsCollection: "runtime" diff --git a/src/runtime/docs/javascript/process/page.md b/src/runtime/docs/javascript/process/page.md index 1c290b6d..2575cf6f 100644 --- a/src/runtime/docs/javascript/process/page.md +++ b/src/runtime/docs/javascript/process/page.md @@ -1,5 +1,5 @@ --- -layout: "runtime-docs" +layout: "docs" title: "oro:process" description: "oro:process exposes runtime process state, env access, signals, and scheduling helpers." docsCollection: "runtime" diff --git a/src/runtime/docs/javascript/protocol-handlers/page.md b/src/runtime/docs/javascript/protocol-handlers/page.md index c9200829..3be73848 100644 --- a/src/runtime/docs/javascript/protocol-handlers/page.md +++ b/src/runtime/docs/javascript/protocol-handlers/page.md @@ -1,5 +1,5 @@ --- -layout: "runtime-docs" +layout: "docs" title: "oro:protocol-handlers" description: "oro:protocol-handlers exposes runtime helpers for custom protocol and service-worker routing." docsCollection: "runtime" diff --git a/src/runtime/docs/javascript/querystring/page.md b/src/runtime/docs/javascript/querystring/page.md index 0bb74d76..86398f08 100644 --- a/src/runtime/docs/javascript/querystring/page.md +++ b/src/runtime/docs/javascript/querystring/page.md @@ -1,5 +1,5 @@ --- -layout: "runtime-docs" +layout: "docs" title: "oro:querystring" description: "oro:querystring parses and serializes URL query strings." docsCollection: "runtime" diff --git a/src/runtime/docs/javascript/secure-storage/page.md b/src/runtime/docs/javascript/secure-storage/page.md index a8874937..a63c99e8 100644 --- a/src/runtime/docs/javascript/secure-storage/page.md +++ b/src/runtime/docs/javascript/secure-storage/page.md @@ -1,5 +1,5 @@ --- -layout: "runtime-docs" +layout: "docs" title: "oro:secure-storage" description: "oro:secure-storage stores secrets scoped by origin (for example tokens, credentials, API keys)." docsCollection: "runtime" diff --git a/src/runtime/docs/javascript/semver/page.md b/src/runtime/docs/javascript/semver/page.md index 5b22dc7f..fb68406c 100644 --- a/src/runtime/docs/javascript/semver/page.md +++ b/src/runtime/docs/javascript/semver/page.md @@ -1,5 +1,5 @@ --- -layout: "runtime-docs" +layout: "docs" title: "oro:semver" description: "oro:semver parses, validates, and compares semantic versions." docsCollection: "runtime" diff --git a/src/runtime/docs/javascript/service-worker/page.md b/src/runtime/docs/javascript/service-worker/page.md index 9c2b548c..6d321176 100644 --- a/src/runtime/docs/javascript/service-worker/page.md +++ b/src/runtime/docs/javascript/service-worker/page.md @@ -1,5 +1,5 @@ --- -layout: "runtime-docs" +layout: "docs" title: "oro:service-worker" description: "oro:service-worker/* exposes the service-worker environment, lifecycle objects, and helpers." docsCollection: "runtime" diff --git a/src/runtime/docs/javascript/shared-worker/page.md b/src/runtime/docs/javascript/shared-worker/page.md index 2820f002..4a9a7e66 100644 --- a/src/runtime/docs/javascript/shared-worker/page.md +++ b/src/runtime/docs/javascript/shared-worker/page.md @@ -1,5 +1,5 @@ --- -layout: "runtime-docs" +layout: "docs" title: "oro:shared-worker" description: "oro:shared-worker/* exposes the shared-worker environment and runtime helpers." docsCollection: "runtime" diff --git a/src/runtime/docs/javascript/signal/page.md b/src/runtime/docs/javascript/signal/page.md index 7808e736..a393b99e 100644 --- a/src/runtime/docs/javascript/signal/page.md +++ b/src/runtime/docs/javascript/signal/page.md @@ -1,5 +1,5 @@ --- -layout: "runtime-docs" +layout: "docs" title: "oro:signal" description: "oro:signal exposes process-signal constants, conversion helpers, and event listeners." docsCollection: "runtime" diff --git a/src/runtime/docs/javascript/sqlite/page.md b/src/runtime/docs/javascript/sqlite/page.md index 2ae7933d..b01135cf 100644 --- a/src/runtime/docs/javascript/sqlite/page.md +++ b/src/runtime/docs/javascript/sqlite/page.md @@ -1,5 +1,5 @@ --- -layout: "runtime-docs" +layout: "docs" title: "oro:sqlite" description: "oro:sqlite opens SQLite databases and exposes sync and async query helpers." docsCollection: "runtime" diff --git a/src/runtime/docs/javascript/stream/page.md b/src/runtime/docs/javascript/stream/page.md index b4ab71e0..a550ef37 100644 --- a/src/runtime/docs/javascript/stream/page.md +++ b/src/runtime/docs/javascript/stream/page.md @@ -1,5 +1,5 @@ --- -layout: "runtime-docs" +layout: "docs" title: "oro:stream" description: "oro:stream exposes Node-style streams, Web streams, and pipeline helpers." docsCollection: "runtime" diff --git a/src/runtime/docs/javascript/string_decoder/page.md b/src/runtime/docs/javascript/string_decoder/page.md index 5c84bc19..5a04ac8c 100644 --- a/src/runtime/docs/javascript/string_decoder/page.md +++ b/src/runtime/docs/javascript/string_decoder/page.md @@ -1,5 +1,5 @@ --- -layout: "runtime-docs" +layout: "docs" title: "oro:string_decoder" description: "oro:string_decoder decodes split byte streams into text without corrupting multibyte characters." docsCollection: "runtime" diff --git a/src/runtime/docs/javascript/tar/page.md b/src/runtime/docs/javascript/tar/page.md index aa41a926..8d021ba9 100644 --- a/src/runtime/docs/javascript/tar/page.md +++ b/src/runtime/docs/javascript/tar/page.md @@ -1,5 +1,5 @@ --- -layout: "runtime-docs" +layout: "docs" title: "oro:tar" description: "oro:tar opens, creates, streams, and extracts tar archives." docsCollection: "runtime" diff --git a/src/runtime/docs/javascript/tcp/page.md b/src/runtime/docs/javascript/tcp/page.md index e02b5514..35037201 100644 --- a/src/runtime/docs/javascript/tcp/page.md +++ b/src/runtime/docs/javascript/tcp/page.md @@ -1,5 +1,5 @@ --- -layout: "runtime-docs" +layout: "docs" title: "oro:tcp" description: "oro:tcp exposes lower-level TCP client and server helpers alongside the higher-level oro:net API." docsCollection: "runtime" diff --git a/src/runtime/docs/javascript/test/page.md b/src/runtime/docs/javascript/test/page.md index 6ee3aa64..cf7e793f 100644 --- a/src/runtime/docs/javascript/test/page.md +++ b/src/runtime/docs/javascript/test/page.md @@ -1,5 +1,5 @@ --- -layout: "runtime-docs" +layout: "docs" title: "oro:test" description: "oro:test provides the runtime test harness used by application and module tests." docsCollection: "runtime" diff --git a/src/runtime/docs/javascript/timers/page.md b/src/runtime/docs/javascript/timers/page.md index 208948ae..86553d1e 100644 --- a/src/runtime/docs/javascript/timers/page.md +++ b/src/runtime/docs/javascript/timers/page.md @@ -1,5 +1,5 @@ --- -layout: "runtime-docs" +layout: "docs" title: "oro:timers" description: "oro:timers exposes timer primitives, promise-based sleeps, and scheduler helpers." docsCollection: "runtime" diff --git a/src/runtime/docs/javascript/tls/page.md b/src/runtime/docs/javascript/tls/page.md index 822f245c..fa84749b 100644 --- a/src/runtime/docs/javascript/tls/page.md +++ b/src/runtime/docs/javascript/tls/page.md @@ -1,5 +1,5 @@ --- -layout: "runtime-docs" +layout: "docs" title: "oro:tls" description: "oro:tls exposes TLS sockets, servers, and certificate-pin helpers." docsCollection: "runtime" diff --git a/src/runtime/docs/javascript/toml/page.md b/src/runtime/docs/javascript/toml/page.md index 3d8c37a2..94aba3ac 100644 --- a/src/runtime/docs/javascript/toml/page.md +++ b/src/runtime/docs/javascript/toml/page.md @@ -1,5 +1,5 @@ --- -layout: "runtime-docs" +layout: "docs" title: "oro:toml" description: "oro:toml parses and serializes TOML documents." docsCollection: "runtime" diff --git a/src/runtime/docs/javascript/tty/page.md b/src/runtime/docs/javascript/tty/page.md index 6f73dcc4..2f2dbe3e 100644 --- a/src/runtime/docs/javascript/tty/page.md +++ b/src/runtime/docs/javascript/tty/page.md @@ -1,5 +1,5 @@ --- -layout: "runtime-docs" +layout: "docs" title: "oro:tty" description: "oro:tty exposes terminal streams and TTY detection helpers." docsCollection: "runtime" diff --git a/src/runtime/docs/javascript/url/page.md b/src/runtime/docs/javascript/url/page.md index cef47f50..7da6a506 100644 --- a/src/runtime/docs/javascript/url/page.md +++ b/src/runtime/docs/javascript/url/page.md @@ -1,5 +1,5 @@ --- -layout: "runtime-docs" +layout: "docs" title: "oro:url" description: "oro:url exposes the WHATWG URL implementation used by the runtime." docsCollection: "runtime" diff --git a/src/runtime/docs/javascript/usb/page.md b/src/runtime/docs/javascript/usb/page.md index d68ce871..e04b9e4a 100644 --- a/src/runtime/docs/javascript/usb/page.md +++ b/src/runtime/docs/javascript/usb/page.md @@ -1,5 +1,5 @@ --- -layout: "runtime-docs" +layout: "docs" title: "oro:usb" description: "oro:usb installs and exposes the runtime WebUSB surface for window contexts." docsCollection: "runtime" diff --git a/src/runtime/docs/javascript/util/page.md b/src/runtime/docs/javascript/util/page.md index 06f7f1b4..0695b322 100644 --- a/src/runtime/docs/javascript/util/page.md +++ b/src/runtime/docs/javascript/util/page.md @@ -1,5 +1,5 @@ --- -layout: "runtime-docs" +layout: "docs" title: "oro:util" description: "oro:util exposes inspection, debug, and type-checking helpers." docsCollection: "runtime" diff --git a/src/runtime/docs/javascript/vm/page.md b/src/runtime/docs/javascript/vm/page.md index c2511fb0..8b738142 100644 --- a/src/runtime/docs/javascript/vm/page.md +++ b/src/runtime/docs/javascript/vm/page.md @@ -1,5 +1,5 @@ --- -layout: "runtime-docs" +layout: "docs" title: "oro:vm" description: "oro:vm runs JavaScript in isolated runtime contexts and manages context windows and workers." docsCollection: "runtime" diff --git a/src/runtime/docs/javascript/window/page.md b/src/runtime/docs/javascript/window/page.md index d1a267ab..7db23f23 100644 --- a/src/runtime/docs/javascript/window/page.md +++ b/src/runtime/docs/javascript/window/page.md @@ -1,5 +1,5 @@ --- -layout: "runtime-docs" +layout: "docs" title: "oro:window" description: "oro:window provides the ApplicationWindow class and window-specific methods." docsCollection: "runtime" diff --git a/src/runtime/docs/javascript/worker/page.md b/src/runtime/docs/javascript/worker/page.md index 8f4a739c..b404f530 100644 --- a/src/runtime/docs/javascript/worker/page.md +++ b/src/runtime/docs/javascript/worker/page.md @@ -1,5 +1,5 @@ --- -layout: "runtime-docs" +layout: "docs" title: "oro:worker" description: "oro:worker re-exports the runtime worker classes for dedicated, shared, and service workers." docsCollection: "runtime" diff --git a/src/runtime/docs/javascript/worker_threads/page.md b/src/runtime/docs/javascript/worker_threads/page.md index eeaf90d8..f89e483b 100644 --- a/src/runtime/docs/javascript/worker_threads/page.md +++ b/src/runtime/docs/javascript/worker_threads/page.md @@ -1,5 +1,5 @@ --- -layout: "runtime-docs" +layout: "docs" title: "oro:worker_threads" description: "oro:worker_threads exposes worker-thread primitives, ports, and environment data helpers." docsCollection: "runtime" diff --git a/src/runtime/docs/javascript/xpc/page.md b/src/runtime/docs/javascript/xpc/page.md index 76a63353..d04e3b1c 100644 --- a/src/runtime/docs/javascript/xpc/page.md +++ b/src/runtime/docs/javascript/xpc/page.md @@ -1,5 +1,5 @@ --- -layout: "runtime-docs" +layout: "docs" title: "oro:xpc" description: "oro:xpc connects to macOS XPC services and encodes structured XPC payloads." docsCollection: "runtime" diff --git a/src/runtime/docs/javascript/zlib/page.md b/src/runtime/docs/javascript/zlib/page.md index ea160155..fae2dfcb 100644 --- a/src/runtime/docs/javascript/zlib/page.md +++ b/src/runtime/docs/javascript/zlib/page.md @@ -1,5 +1,5 @@ --- -layout: "runtime-docs" +layout: "docs" title: "oro:zlib" description: "oro:zlib compresses and decompresses buffers and exposes zlib stream helpers." docsCollection: "runtime" diff --git a/src/runtime/docs/page.md b/src/runtime/docs/page.md index 077907df..2ee641f7 100644 --- a/src/runtime/docs/page.md +++ b/src/runtime/docs/page.md @@ -1,5 +1,5 @@ --- -layout: "runtime-docs" +layout: "docs" title: "Oro Runtime Docs" description: "Oro Runtime is a cross-platform runtime for building native applications as web applications: HTML/CSS for UI, JavaScript for behavior, and a small native core for OS integration." docsCollection: "runtime" diff --git a/src/sage-index.template.ts b/src/sage-index.template.ts deleted file mode 100644 index b6ce3a1b..00000000 --- a/src/sage-index.template.ts +++ /dev/null @@ -1,6 +0,0 @@ -import type { DataDeps, TemplateFunction } from '@domstack/static/types.js' -import type { DocsData } from './lib/docs.ts' -import { collectionIndex } from './lib/artifacts.ts' -export const dataDeps = ['sageNavigation'] satisfies DataDeps<Pick<DocsData, 'sageNavigation'>> -const template: TemplateFunction<Record<string, unknown>, Pick<DocsData, 'sageNavigation'>> = ({ data }) => collectionIndex('sage', data.sageNavigation) -export default template diff --git a/src/sage/docs/cli/configuration/page.md b/src/sage/docs/cli/configuration/page.md index 61e928ce..a988feaa 100644 --- a/src/sage/docs/cli/configuration/page.md +++ b/src/sage/docs/cli/configuration/page.md @@ -1,5 +1,5 @@ --- -layout: "sage-docs" +layout: "docs" title: "Configuration" description: "sage reads configuration from .sagerc, a TOML file." docsCollection: "sage" diff --git a/src/sage/docs/cli/diagnostics/page.md b/src/sage/docs/cli/diagnostics/page.md index bcdb0b8b..2062dbcd 100644 --- a/src/sage/docs/cli/diagnostics/page.md +++ b/src/sage/docs/cli/diagnostics/page.md @@ -1,5 +1,5 @@ --- -layout: "sage-docs" +layout: "docs" title: "Diagnostics" description: "This page documents the public exit codes plus the most important user-visible warnings and errors." docsCollection: "sage" diff --git a/src/sage/docs/cli/environment-and-files/page.md b/src/sage/docs/cli/environment-and-files/page.md index d7a22dea..b4d916d2 100644 --- a/src/sage/docs/cli/environment-and-files/page.md +++ b/src/sage/docs/cli/environment-and-files/page.md @@ -1,5 +1,5 @@ --- -layout: "sage-docs" +layout: "docs" title: "Environment and files" description: "This page collects every environment variable and important filesystem location used by sage." docsCollection: "sage" diff --git a/src/sage/docs/cli/inputs-and-modes/page.md b/src/sage/docs/cli/inputs-and-modes/page.md index 9f0882df..0d7f1a4f 100644 --- a/src/sage/docs/cli/inputs-and-modes/page.md +++ b/src/sage/docs/cli/inputs-and-modes/page.md @@ -1,5 +1,5 @@ --- -layout: "sage-docs" +layout: "docs" title: "Inputs and modes" description: "This page is the exact downstream input model for sage." docsCollection: "sage" diff --git a/src/sage/docs/cli/keys-and-commands/page.md b/src/sage/docs/cli/keys-and-commands/page.md index 69adb449..81b56bb1 100644 --- a/src/sage/docs/cli/keys-and-commands/page.md +++ b/src/sage/docs/cli/keys-and-commands/page.md @@ -1,5 +1,5 @@ --- -layout: "sage-docs" +layout: "docs" title: "Keys and commands" description: "This is the full interactive key and command reference for sage." docsCollection: "sage" diff --git a/src/sage/docs/cli/options/page.md b/src/sage/docs/cli/options/page.md index 1ec663b6..f133b05a 100644 --- a/src/sage/docs/cli/options/page.md +++ b/src/sage/docs/cli/options/page.md @@ -1,5 +1,5 @@ --- -layout: "sage-docs" +layout: "docs" title: "Options" description: "This page documents every public CLI flag on sage." docsCollection: "sage" diff --git a/src/sage/docs/cli/sage/page.md b/src/sage/docs/cli/sage/page.md index 43e0ceab..b9083916 100644 --- a/src/sage/docs/cli/sage/page.md +++ b/src/sage/docs/cli/sage/page.md @@ -1,5 +1,5 @@ --- -layout: "sage-docs" +layout: "docs" title: "sage" description: "sage is the canonical CLI entrypoint for the pager." docsCollection: "sage" diff --git a/src/sage/docs/cli/syntax-and-cache/page.md b/src/sage/docs/cli/syntax-and-cache/page.md index 3b79f99f..9eda656a 100644 --- a/src/sage/docs/cli/syntax-and-cache/page.md +++ b/src/sage/docs/cli/syntax-and-cache/page.md @@ -1,5 +1,5 @@ --- -layout: "sage-docs" +layout: "docs" title: "Syntax and cache" description: "sage can apply syntax highlighting to local paths and URL-backed content." docsCollection: "sage" diff --git a/src/sage/docs/guides/getting-started/page.md b/src/sage/docs/guides/getting-started/page.md index 679e5bf4..58d0768f 100644 --- a/src/sage/docs/guides/getting-started/page.md +++ b/src/sage/docs/guides/getting-started/page.md @@ -1,5 +1,5 @@ --- -layout: "sage-docs" +layout: "docs" title: "Getting started" description: "This guide covers the downstream story: build sage, install it, page real inputs, then move into configuration and plugins." docsCollection: "sage" diff --git a/src/sage/docs/guides/pager-workflows/page.md b/src/sage/docs/guides/pager-workflows/page.md index 13d5e7ad..cc27697e 100644 --- a/src/sage/docs/guides/pager-workflows/page.md +++ b/src/sage/docs/guides/pager-workflows/page.md @@ -1,5 +1,5 @@ --- -layout: "sage-docs" +layout: "docs" title: "Pager workflows" description: "sage is most useful when you treat it as a CLI tool first and a programmable runtime second. These patterns cover the common downstream workflows." docsCollection: "sage" diff --git a/src/sage/docs/guides/plugins-quickstart/page.md b/src/sage/docs/guides/plugins-quickstart/page.md index e417a8c0..c9cdc2d2 100644 --- a/src/sage/docs/guides/plugins-quickstart/page.md +++ b/src/sage/docs/guides/plugins-quickstart/page.md @@ -1,5 +1,5 @@ --- -layout: "sage-docs" +layout: "docs" title: "Plugins quickstart" description: "sage can load JavaScript plugins in the interactive TUI path. Plugins are a good fit when you want:" docsCollection: "sage" diff --git a/src/sage/docs/javascript/all-modules/page.md b/src/sage/docs/javascript/all-modules/page.md index 68c28f0b..5cbeb4de 100644 --- a/src/sage/docs/javascript/all-modules/page.md +++ b/src/sage/docs/javascript/all-modules/page.md @@ -1,5 +1,5 @@ --- -layout: "sage-docs" +layout: "docs" title: "All module specifiers" description: "Public, stable module specifiers:" docsCollection: "sage" diff --git a/src/sage/docs/javascript/crypto/page.md b/src/sage/docs/javascript/crypto/page.md index 865e63c3..b5c25d70 100644 --- a/src/sage/docs/javascript/crypto/page.md +++ b/src/sage/docs/javascript/crypto/page.md @@ -1,5 +1,5 @@ --- -layout: "sage-docs" +layout: "docs" title: "sage:crypto" description: "sage:crypto provides random bytes and UUID v4 generation." docsCollection: "sage" diff --git a/src/sage/docs/javascript/dom/page.md b/src/sage/docs/javascript/dom/page.md index 8906b73c..c20485b2 100644 --- a/src/sage/docs/javascript/dom/page.md +++ b/src/sage/docs/javascript/dom/page.md @@ -1,5 +1,5 @@ --- -layout: "sage-docs" +layout: "docs" title: "sage:core/dom" description: "sage:core/dom provides DOMException and structuredClone." docsCollection: "sage" diff --git a/src/sage/docs/javascript/env/page.md b/src/sage/docs/javascript/env/page.md index cf78eef0..4029fa40 100644 --- a/src/sage/docs/javascript/env/page.md +++ b/src/sage/docs/javascript/env/page.md @@ -1,5 +1,5 @@ --- -layout: "sage-docs" +layout: "docs" title: "sage:env" description: "sage:env reads and mutates the host process environment." docsCollection: "sage" diff --git a/src/sage/docs/javascript/fetch/page.md b/src/sage/docs/javascript/fetch/page.md index 148d1cfb..b2dbd00d 100644 --- a/src/sage/docs/javascript/fetch/page.md +++ b/src/sage/docs/javascript/fetch/page.md @@ -1,5 +1,5 @@ --- -layout: "sage-docs" +layout: "docs" title: "sage:fetch" description: "sage:fetch is the host-backed WHATWG-style network module." docsCollection: "sage" diff --git a/src/sage/docs/javascript/fs/page.md b/src/sage/docs/javascript/fs/page.md index d3046a86..cbaece9a 100644 --- a/src/sage/docs/javascript/fs/page.md +++ b/src/sage/docs/javascript/fs/page.md @@ -1,5 +1,5 @@ --- -layout: "sage-docs" +layout: "docs" title: "sage:fs" description: "sage:fs provides bounded filesystem access for plugins." docsCollection: "sage" diff --git a/src/sage/docs/javascript/module-index/page.md b/src/sage/docs/javascript/module-index/page.md index 0772e090..d14f834c 100644 --- a/src/sage/docs/javascript/module-index/page.md +++ b/src/sage/docs/javascript/module-index/page.md @@ -1,5 +1,5 @@ --- -layout: "sage-docs" +layout: "docs" title: "Module index" description: "This is the stable built-in module surface for Sage plugins." docsCollection: "sage" diff --git a/src/sage/docs/javascript/navigator/page.md b/src/sage/docs/javascript/navigator/page.md index 92cb570f..16ef38b7 100644 --- a/src/sage/docs/javascript/navigator/page.md +++ b/src/sage/docs/javascript/navigator/page.md @@ -1,5 +1,5 @@ --- -layout: "sage-docs" +layout: "docs" title: "sage:navigator" description: "sage:navigator exposes a browser-like navigator object." docsCollection: "sage" diff --git a/src/sage/docs/javascript/overview/page.md b/src/sage/docs/javascript/overview/page.md index 0bf74596..02fc523c 100644 --- a/src/sage/docs/javascript/overview/page.md +++ b/src/sage/docs/javascript/overview/page.md @@ -1,5 +1,5 @@ --- -layout: "sage-docs" +layout: "docs" title: "JavaScript APIs overview" description: "sage can load JavaScript plugins in the interactive TUI path. Plugins run as ES modules on top of QuickJS and can extend the pager with custom commands, event handlers, bounded filesystem state, child" docsCollection: "sage" diff --git a/src/sage/docs/javascript/path/page.md b/src/sage/docs/javascript/path/page.md index 08c1c0e7..f6a57ba8 100644 --- a/src/sage/docs/javascript/path/page.md +++ b/src/sage/docs/javascript/path/page.md @@ -1,5 +1,5 @@ --- -layout: "sage-docs" +layout: "docs" title: "sage:path" description: "sage:path is a small POSIX-style path helper module." docsCollection: "sage" diff --git a/src/sage/docs/javascript/performance/page.md b/src/sage/docs/javascript/performance/page.md index 8d248b09..708e80bf 100644 --- a/src/sage/docs/javascript/performance/page.md +++ b/src/sage/docs/javascript/performance/page.md @@ -1,5 +1,5 @@ --- -layout: "sage-docs" +layout: "docs" title: "sage:performance" description: "sage:performance provides a small Performance implementation." docsCollection: "sage" diff --git a/src/sage/docs/javascript/process/page.md b/src/sage/docs/javascript/process/page.md index 9b3d0cb1..2f680408 100644 --- a/src/sage/docs/javascript/process/page.md +++ b/src/sage/docs/javascript/process/page.md @@ -1,5 +1,5 @@ --- -layout: "sage-docs" +layout: "docs" title: "sage:process" description: "sage:process exposes process metadata plus bounded shell execution." docsCollection: "sage" diff --git a/src/sage/docs/javascript/runtime/page.md b/src/sage/docs/javascript/runtime/page.md index 13403096..6675169d 100644 --- a/src/sage/docs/javascript/runtime/page.md +++ b/src/sage/docs/javascript/runtime/page.md @@ -1,5 +1,5 @@ --- -layout: "sage-docs" +layout: "docs" title: "JavaScript runtime" description: "This page describes the full plugin runtime model: how plugins load, what globals are installed, what events exist, and where the limits are." docsCollection: "sage" diff --git a/src/sage/docs/javascript/url/page.md b/src/sage/docs/javascript/url/page.md index b3f510b0..f7b29622 100644 --- a/src/sage/docs/javascript/url/page.md +++ b/src/sage/docs/javascript/url/page.md @@ -1,5 +1,5 @@ --- -layout: "sage-docs" +layout: "docs" title: "sage:url" description: "sage:url implements WHATWG-style URL and URLSearchParams." docsCollection: "sage" diff --git a/src/sage/docs/javascript/uuid/page.md b/src/sage/docs/javascript/uuid/page.md index 07bf536e..64e76128 100644 --- a/src/sage/docs/javascript/uuid/page.md +++ b/src/sage/docs/javascript/uuid/page.md @@ -1,5 +1,5 @@ --- -layout: "sage-docs" +layout: "docs" title: "sage:uuid" description: "sage:uuid provides explicit UUID helper functions." docsCollection: "sage" diff --git a/src/sage/docs/javascript/web/page.md b/src/sage/docs/javascript/web/page.md index 07f20380..c6fe290d 100644 --- a/src/sage/docs/javascript/web/page.md +++ b/src/sage/docs/javascript/web/page.md @@ -1,5 +1,5 @@ --- -layout: "sage-docs" +layout: "docs" title: "sage:core/web" description: "sage:core/web provides a host-free, in-memory set of WHATWG-style web primitives." docsCollection: "sage" diff --git a/src/sage/docs/man/sage-1/page.md b/src/sage/docs/man/sage-1/page.md index fa52e17e..84fc05d8 100644 --- a/src/sage/docs/man/sage-1/page.md +++ b/src/sage/docs/man/sage-1/page.md @@ -1,5 +1,5 @@ --- -layout: "sage-docs" +layout: "docs" title: "sage(1)" description: "sage(1) is the command reference for the pager itself. This page mirrors the man page in website form so downstream readers do not have to context-switch into man." docsCollection: "sage" diff --git a/src/sage/docs/man/sage-7/page.md b/src/sage/docs/man/sage-7/page.md index 6093e74d..b7edb0e1 100644 --- a/src/sage/docs/man/sage-7/page.md +++ b/src/sage/docs/man/sage-7/page.md @@ -1,5 +1,5 @@ --- -layout: "sage-docs" +layout: "docs" title: "sage(7)" description: "sage(7) is the conceptual manual page for the pager. It explains how the CLI behaves beyond the flag list in sage(1)." docsCollection: "sage" diff --git a/src/sage/docs/man/sage-plugin-api-3/page.md b/src/sage/docs/man/sage-plugin-api-3/page.md index 429a98ba..21a8441e 100644 --- a/src/sage/docs/man/sage-plugin-api-3/page.md +++ b/src/sage/docs/man/sage-plugin-api-3/page.md @@ -1,5 +1,5 @@ --- -layout: "sage-docs" +layout: "docs" title: "sage-plugin-api(3)" description: "sage-plugin-api(3) is the manual page for the JavaScript plugin runtime. This page mirrors the man page in website form and points into the fuller module documentation." docsCollection: "sage" diff --git a/src/sage/docs/page.md b/src/sage/docs/page.md index 491708dd..34271360 100644 --- a/src/sage/docs/page.md +++ b/src/sage/docs/page.md @@ -1,5 +1,5 @@ --- -layout: "sage-docs" +layout: "docs" title: "Sage Docs" description: "sage is a fast, ergonomic terminal pager with a strong CLI story: open one file, a directory worth of files, piped stdin, or remote content, then navigate with a responsive TUI, incremental search, sy" docsCollection: "sage" diff --git a/src/silk-index.template.ts b/src/silk-index.template.ts deleted file mode 100644 index b7b596f3..00000000 --- a/src/silk-index.template.ts +++ /dev/null @@ -1,6 +0,0 @@ -import type { DataDeps, TemplateFunction } from '@domstack/static/types.js' -import type { DocsData } from './lib/docs.ts' -import { collectionIndex } from './lib/artifacts.ts' -export const dataDeps = ['silkNavigation'] satisfies DataDeps<Pick<DocsData, 'silkNavigation'>> -const template: TemplateFunction<Record<string, unknown>, Pick<DocsData, 'silkNavigation'>> = ({ data }) => collectionIndex('silk', data.silkNavigation) -export default template diff --git a/src/silk/docs/compiler/abi-libsilk/page.md b/src/silk/docs/compiler/abi-libsilk/page.md index 03ce11f1..3cc12519 100644 --- a/src/silk/docs/compiler/abi-libsilk/page.md +++ b/src/silk/docs/compiler/abi-libsilk/page.md @@ -1,5 +1,5 @@ --- -layout: "silk-docs" +layout: "docs" title: "C99 ABI and libsilk.a" description: "This document defines the C99 ABI and the interface of the libsilk.a static library." docsCollection: "silk" diff --git a/src/silk/docs/compiler/architecture/page.md b/src/silk/docs/compiler/architecture/page.md index e17f666d..ced65db5 100644 --- a/src/silk/docs/compiler/architecture/page.md +++ b/src/silk/docs/compiler/architecture/page.md @@ -1,5 +1,5 @@ --- -layout: "silk-docs" +layout: "docs" title: "Compiler Architecture" description: "This document describes the intended architecture of the Silk compiler implemented in Zig." docsCollection: "silk" diff --git a/src/silk/docs/compiler/async-runtime/page.md b/src/silk/docs/compiler/async-runtime/page.md index eeab4636..19f35a50 100644 --- a/src/silk/docs/compiler/async-runtime/page.md +++ b/src/silk/docs/compiler/async-runtime/page.md @@ -1,5 +1,5 @@ --- -layout: "silk-docs" +layout: "docs" title: "Async Runtime (Hosted)" description: "Current host-build note:" docsCollection: "silk" diff --git a/src/silk/docs/compiler/backend-amdgpu/page.md b/src/silk/docs/compiler/backend-amdgpu/page.md index 37b2f808..fc6205f8 100644 --- a/src/silk/docs/compiler/backend-amdgpu/page.md +++ b/src/silk/docs/compiler/backend-amdgpu/page.md @@ -1,5 +1,5 @@ --- -layout: "silk-docs" +layout: "docs" title: "AMDGPU Backend" description: "This document specifies the initial AMD GPU backend surface for Silk. The backend is implemented in Zig and emits AMDHSA code-object bytes directly from Silk-owned data structures. It must not depend " docsCollection: "silk" diff --git a/src/silk/docs/compiler/backend-gpu/page.md b/src/silk/docs/compiler/backend-gpu/page.md index 4c86d2d1..837f8ccb 100644 --- a/src/silk/docs/compiler/backend-gpu/page.md +++ b/src/silk/docs/compiler/backend-gpu/page.md @@ -1,5 +1,5 @@ --- -layout: "silk-docs" +layout: "docs" title: "Target-neutral GPU compilation" description: "This document defines the shared compiler contract between Silk source and processor-specific GPU backends. AMDGPU is the first consumer; the GPU-v1 closure adds an NVIDIA PTX consumer. Both consume t" docsCollection: "silk" diff --git a/src/silk/docs/compiler/backend-nvidia/page.md b/src/silk/docs/compiler/backend-nvidia/page.md index 326edf6e..c0cf6659 100644 --- a/src/silk/docs/compiler/backend-nvidia/page.md +++ b/src/silk/docs/compiler/backend-nvidia/page.md @@ -1,5 +1,5 @@ --- -layout: "silk-docs" +layout: "docs" title: "NVIDIA GPU backend" description: "This document specifies Silk's NVIDIA provider for the target-neutral GPU-v1 contract in backend-gpu.md." docsCollection: "silk" diff --git a/src/silk/docs/compiler/backend-wasm/page.md b/src/silk/docs/compiler/backend-wasm/page.md index c392e346..cbcc15be 100644 --- a/src/silk/docs/compiler/backend-wasm/page.md +++ b/src/silk/docs/compiler/backend-wasm/page.md @@ -1,5 +1,5 @@ --- -layout: "silk-docs" +layout: "docs" title: "WebAssembly Back-End (wasm32 / wasm64)" description: "This document describes the shipped WebAssembly back-end, the target conventions it uses today, and the remaining ABI boundaries for wasm targets." docsCollection: "silk" diff --git a/src/silk/docs/compiler/build-scripts/page.md b/src/silk/docs/compiler/build-scripts/page.md index 1fc33388..64f89505 100644 --- a/src/silk/docs/compiler/build-scripts/page.md +++ b/src/silk/docs/compiler/build-scripts/page.md @@ -1,5 +1,5 @@ --- -layout: "silk-docs" +layout: "docs" title: "Build Modules (build.slk)" description: "This document specifies Silk’s build module concept: a package-local Silk module named build.slk that can generate a package build plan at build time." docsCollection: "silk" diff --git a/src/silk/docs/compiler/builtin-deps/page.md b/src/silk/docs/compiler/builtin-deps/page.md index 24af2f6d..ab63a782 100644 --- a/src/silk/docs/compiler/builtin-deps/page.md +++ b/src/silk/docs/compiler/builtin-deps/page.md @@ -1,5 +1,5 @@ --- -layout: "silk-docs" +layout: "docs" title: "Built-In Dependencies" description: "Silk aims to be buildable with minimal reliance on system-installed dependencies. For the hosted POSIX baseline, Silk ships built-in dependency sources and pinned archives:" docsCollection: "silk" diff --git a/src/silk/docs/compiler/cache-silk/page.md b/src/silk/docs/compiler/cache-silk/page.md index 070c61f8..d51ce920 100644 --- a/src/silk/docs/compiler/cache-silk/page.md +++ b/src/silk/docs/compiler/cache-silk/page.md @@ -1,5 +1,5 @@ --- -layout: "silk-docs" +layout: "docs" title: "silk Cache Management" description: "This document describes the managed cache model used by the silk toolchain and the silk cache command surface for inspecting and maintaining that cache." docsCollection: "silk" diff --git a/src/silk/docs/compiler/cli-silk/page.md b/src/silk/docs/compiler/cli-silk/page.md index 1a7a382c..a2e7e9b1 100644 --- a/src/silk/docs/compiler/cli-silk/page.md +++ b/src/silk/docs/compiler/cli-silk/page.md @@ -1,5 +1,5 @@ --- -layout: "silk-docs" +layout: "docs" title: "silk CLI" description: "This document describes the command-line interface of the silk compiler from the downstream user’s perspective." docsCollection: "silk" diff --git a/src/silk/docs/compiler/diagnostics/page.md b/src/silk/docs/compiler/diagnostics/page.md index aadbf665..d4f97f4c 100644 --- a/src/silk/docs/compiler/diagnostics/page.md +++ b/src/silk/docs/compiler/diagnostics/page.md @@ -1,5 +1,5 @@ --- -layout: "silk-docs" +layout: "docs" title: "Compiler Diagnostics" description: "This document specifies the human-readable diagnostic format emitted by the Silk toolchain, including:" docsCollection: "silk" diff --git a/src/silk/docs/compiler/implementation-status/page.md b/src/silk/docs/compiler/implementation-status/page.md index b4ab5df3..390e8628 100644 --- a/src/silk/docs/compiler/implementation-status/page.md +++ b/src/silk/docs/compiler/implementation-status/page.md @@ -1,5 +1,5 @@ --- -layout: "silk-docs" +layout: "docs" title: "Notes" description: "This page is a downstream-facing snapshot of what the reference Silk compiler and toolchain support end-to-end today. It is intentionally high-level: each language, standard-library, and compiler page" docsCollection: "silk" diff --git a/src/silk/docs/compiler/ir-overview/page.md b/src/silk/docs/compiler/ir-overview/page.md index c442aa58..8b318184 100644 --- a/src/silk/docs/compiler/ir-overview/page.md +++ b/src/silk/docs/compiler/ir-overview/page.md @@ -1,5 +1,5 @@ --- -layout: "silk-docs" +layout: "docs" title: "Intermediate Representation (IR) – Overview" description: "This document introduces the initial intermediate representation (IR) used by the Silk compiler. The IR is intentionally small and focused for now so that we can start supporting more advanced program" docsCollection: "silk" diff --git a/src/silk/docs/compiler/libsilk-quickstart/page.md b/src/silk/docs/compiler/libsilk-quickstart/page.md index cb48aa1e..888f376f 100644 --- a/src/silk/docs/compiler/libsilk-quickstart/page.md +++ b/src/silk/docs/compiler/libsilk-quickstart/page.md @@ -1,5 +1,5 @@ --- -layout: "silk-docs" +layout: "docs" title: "libsilk quickstart" description: "This page is the shortest path to embedding the Silk compiler from C or C++." docsCollection: "silk" diff --git a/src/silk/docs/compiler/limits/page.md b/src/silk/docs/compiler/limits/page.md index 53a1edfd..78d43cd6 100644 --- a/src/silk/docs/compiler/limits/page.md +++ b/src/silk/docs/compiler/limits/page.md @@ -1,5 +1,5 @@ --- -layout: "silk-docs" +layout: "docs" title: "Compiler Limits" description: "This document enumerates the current hard limits in the Silk compiler and its tooling. These limits are implementation guardrails (primarily to keep memory usage bounded when compiling untrusted input" docsCollection: "silk" diff --git a/src/silk/docs/compiler/lsp-silk/page.md b/src/silk/docs/compiler/lsp-silk/page.md index 560e8815..7a0a4a31 100644 --- a/src/silk/docs/compiler/lsp-silk/page.md +++ b/src/silk/docs/compiler/lsp-silk/page.md @@ -1,5 +1,5 @@ --- -layout: "silk-docs" +layout: "docs" title: "Silk Language Server (LSP)" description: "This document specifies the current Language Server Protocol (LSP) implementation for Silk." docsCollection: "silk" diff --git a/src/silk/docs/compiler/package-distribution/page.md b/src/silk/docs/compiler/package-distribution/page.md index 66e83982..dcb060f3 100644 --- a/src/silk/docs/compiler/package-distribution/page.md +++ b/src/silk/docs/compiler/package-distribution/page.md @@ -1,5 +1,5 @@ --- -layout: "silk-docs" +layout: "docs" title: "Silk Package Distribution" description: "The manifest, CLI, install, inspection/linting, and binary-dependency consumption behavior described here are implemented in the current toolchain. This document describes the package authoring, publi" docsCollection: "silk" diff --git a/src/silk/docs/compiler/package-manifests/page.md b/src/silk/docs/compiler/package-manifests/page.md index 92ddc3ec..e70c857d 100644 --- a/src/silk/docs/compiler/package-manifests/page.md +++ b/src/silk/docs/compiler/package-manifests/page.md @@ -1,5 +1,5 @@ --- -layout: "silk-docs" +layout: "docs" title: "Package Manifests (silk.toml)" description: "This document specifies Silk’s package manifest format and how the silk compiler consumes it." docsCollection: "silk" diff --git a/src/silk/docs/compiler/stdlib-integration/page.md b/src/silk/docs/compiler/stdlib-integration/page.md index 77db5fe6..fd205e2c 100644 --- a/src/silk/docs/compiler/stdlib-integration/page.md +++ b/src/silk/docs/compiler/stdlib-integration/page.md @@ -1,5 +1,5 @@ --- -layout: "silk-docs" +layout: "docs" title: "Standard Library Integration" description: "This document describes how the std:: package integrates with the compiler and the CLI." docsCollection: "silk" diff --git a/src/silk/docs/compiler/testing-strategy/page.md b/src/silk/docs/compiler/testing-strategy/page.md index 21e17961..c478c9c9 100644 --- a/src/silk/docs/compiler/testing-strategy/page.md +++ b/src/silk/docs/compiler/testing-strategy/page.md @@ -1,5 +1,5 @@ --- -layout: "silk-docs" +layout: "docs" title: "Testing Strategy (Zig + C99 + Silk)" description: "This document defines how we validate the compiler, ABI, and standard library." docsCollection: "silk" diff --git a/src/silk/docs/compiler/vendored-deps/page.md b/src/silk/docs/compiler/vendored-deps/page.md index e97c4022..b6672495 100644 --- a/src/silk/docs/compiler/vendored-deps/page.md +++ b/src/silk/docs/compiler/vendored-deps/page.md @@ -1,5 +1,5 @@ --- -layout: "silk-docs" +layout: "docs" title: "Built-In Dependencies (Legacy Link)" description: "This page moved to builtin deps. The canonical built-in dependency documentation describes the shipped dependency sources, generated archives, provider selection, staging layout, and zig build deps wo" docsCollection: "silk" diff --git a/src/silk/docs/compiler/zig-api/page.md b/src/silk/docs/compiler/zig-api/page.md index 1770478e..a4b6e08c 100644 --- a/src/silk/docs/compiler/zig-api/page.md +++ b/src/silk/docs/compiler/zig-api/page.md @@ -1,5 +1,5 @@ --- -layout: "silk-docs" +layout: "docs" title: "Zig Embedding API" description: "This page documents the Zig-facing embedding surface exported as the silk module." docsCollection: "silk" diff --git a/src/silk/docs/guides/cli/page.md b/src/silk/docs/guides/cli/page.md index 660bb96f..0e51f90d 100644 --- a/src/silk/docs/guides/cli/page.md +++ b/src/silk/docs/guides/cli/page.md @@ -1,5 +1,5 @@ --- -layout: "silk-docs" +layout: "docs" title: "CLI and toolchain" description: "Silk’s CLI is designed around a small number of commands that compose well:" docsCollection: "silk" diff --git a/src/silk/docs/guides/formal-silk/page.md b/src/silk/docs/guides/formal-silk/page.md index beb9318f..b0deb13a 100644 --- a/src/silk/docs/guides/formal-silk/page.md +++ b/src/silk/docs/guides/formal-silk/page.md @@ -1,5 +1,5 @@ --- -layout: "silk-docs" +layout: "docs" title: "Formal Silk" description: "Formal Silk is Silk’s compile-time formal verification language. It lets you write machine-checked specifications next to ordinary code, and have the compiler prove those specifications using the Z3 S" docsCollection: "silk" diff --git a/src/silk/docs/guides/hello-world/page.md b/src/silk/docs/guides/hello-world/page.md index 33240612..b923c200 100644 --- a/src/silk/docs/guides/hello-world/page.md +++ b/src/silk/docs/guides/hello-world/page.md @@ -1,5 +1,5 @@ --- -layout: "silk-docs" +layout: "docs" title: "Hello world" description: "This page teaches the Silk “shape of a program”: explicit imports, a normal main, and a workflow that makes it cheap to iterate." docsCollection: "silk" diff --git a/src/silk/docs/guides/language-tour/page.md b/src/silk/docs/guides/language-tour/page.md index 094f15db..ec1c3e59 100644 --- a/src/silk/docs/guides/language-tour/page.md +++ b/src/silk/docs/guides/language-tour/page.md @@ -1,5 +1,5 @@ --- -layout: "silk-docs" +layout: "docs" title: "Language tour" description: "This is a guided walkthrough of the core ideas you’ll use in real Silk programs: explicit structure, readable types, predictable control flow, and clear boundaries." docsCollection: "silk" diff --git a/src/silk/docs/guides/modules-and-packages/page.md b/src/silk/docs/guides/modules-and-packages/page.md index d3933a35..cb3cc681 100644 --- a/src/silk/docs/guides/modules-and-packages/page.md +++ b/src/silk/docs/guides/modules-and-packages/page.md @@ -1,5 +1,5 @@ --- -layout: "silk-docs" +layout: "docs" title: "Modules, Packages, and Publication" description: "Silk code is organized around explicit module sets. A module set is the group of .slk files the compiler loads, resolves, checks, and builds together. Packages give those files a public namespace, imp" docsCollection: "silk" diff --git a/src/silk/docs/guides/practical-logger-module/page.md b/src/silk/docs/guides/practical-logger-module/page.md index ff407f54..b3f64be3 100644 --- a/src/silk/docs/guides/practical-logger-module/page.md +++ b/src/silk/docs/guides/practical-logger-module/page.md @@ -1,5 +1,5 @@ --- -layout: "silk-docs" +layout: "docs" title: "Practical Logger Module Walkthrough" description: "This walkthrough builds a small structured logger package that can be imported from Silk and exposed to C through a generated header. It starts with the normal Silk API in src/lib.slk, then adds src/c" docsCollection: "silk" diff --git a/src/silk/docs/guides/project-dependencies/page.md b/src/silk/docs/guides/project-dependencies/page.md index df98cfb6..ad77ce43 100644 --- a/src/silk/docs/guides/project-dependencies/page.md +++ b/src/silk/docs/guides/project-dependencies/page.md @@ -1,5 +1,5 @@ --- -layout: "silk-docs" +layout: "docs" title: "Project Dependencies" description: "Silk projects build dependencies from package roots on disk. A dependency can be an explicit local path, a package found under a packages/ search root, or an installed package root. The examples/proje" docsCollection: "silk" diff --git a/src/silk/docs/guides/purpose/page.md b/src/silk/docs/guides/purpose/page.md index dbad472f..e9a49fb3 100644 --- a/src/silk/docs/guides/purpose/page.md +++ b/src/silk/docs/guides/purpose/page.md @@ -1,5 +1,5 @@ --- -layout: "silk-docs" +layout: "docs" title: "What Silk is for" description: "Silk is for systems code that has to be understood, shipped, embedded, and trusted after it grows beyond a single file." docsCollection: "silk" diff --git a/src/silk/docs/guides/standard-library/page.md b/src/silk/docs/guides/standard-library/page.md index 8275268d..a6bd8df1 100644 --- a/src/silk/docs/guides/standard-library/page.md +++ b/src/silk/docs/guides/standard-library/page.md @@ -1,5 +1,5 @@ --- -layout: "silk-docs" +layout: "docs" title: "Standard library" description: "Silk’s standard library lives under the reserved std:: namespace. This is where “practical systems programming” shows up: I/O, filesystem, networking, parsing, collections, time, and the shared conven" docsCollection: "silk" diff --git a/src/silk/docs/guides/testing/page.md b/src/silk/docs/guides/testing/page.md index 80a8b4fb..901b59c8 100644 --- a/src/silk/docs/guides/testing/page.md +++ b/src/silk/docs/guides/testing/page.md @@ -1,5 +1,5 @@ --- -layout: "silk-docs" +layout: "docs" title: "Testing" description: "Silk testing is language-level: tests live next to the code they exercise. The compiler discovers them, runs them with silk test, and emits TAP output (TAP v13) so results are easy to consume in CI an" docsCollection: "silk" diff --git a/src/silk/docs/language/asm/page.md b/src/silk/docs/language/asm/page.md index d11290da..9456a4c1 100644 --- a/src/silk/docs/language/asm/page.md +++ b/src/silk/docs/language/asm/page.md @@ -1,5 +1,5 @@ --- -layout: "silk-docs" +layout: "docs" title: "Inline Assembly (asm)" description: "Silk provides an asm keyword for embedding inline assembly in a way that is explicit in source code and assembled at compile time." docsCollection: "silk" diff --git a/src/silk/docs/language/atomics/page.md b/src/silk/docs/language/atomics/page.md index 14a765b2..ebf20147 100644 --- a/src/silk/docs/language/atomics/page.md +++ b/src/silk/docs/language/atomics/page.md @@ -1,5 +1,5 @@ --- -layout: "silk-docs" +layout: "docs" title: "Atomics" description: "Silk atomics are compiler-backed operations for low-level thread synchronization. They are distinct from ordinary loads/stores and from volatile memory access:" docsCollection: "silk" diff --git a/src/silk/docs/language/attributes/page.md b/src/silk/docs/language/attributes/page.md index 2938fc1f..95d2eac9 100644 --- a/src/silk/docs/language/attributes/page.md +++ b/src/silk/docs/language/attributes/page.md @@ -1,5 +1,5 @@ --- -layout: "silk-docs" +layout: "docs" title: "Attributes (attr(...))" description: "Silk supports first-class attributes that can annotate declarations and can also be queried at compile time for conditional compilation." docsCollection: "silk" diff --git a/src/silk/docs/language/borrow-checker/page.md b/src/silk/docs/language/borrow-checker/page.md index 2d7b010c..55e119a2 100644 --- a/src/silk/docs/language/borrow-checker/page.md +++ b/src/silk/docs/language/borrow-checker/page.md @@ -1,5 +1,5 @@ --- -layout: "silk-docs" +layout: "docs" title: "Borrow Checking (Static Alias and Lifetime Safety)" description: "This document specifies Silk’s intended borrow-checking model for references." docsCollection: "silk" diff --git a/src/silk/docs/language/buffers/page.md b/src/silk/docs/language/buffers/page.md index 45df5a33..d34dd95e 100644 --- a/src/silk/docs/language/buffers/page.md +++ b/src/silk/docs/language/buffers/page.md @@ -1,5 +1,5 @@ --- -layout: "silk-docs" +layout: "docs" title: "Buffers" description: "Buffer(T) provides low-level access to a contiguous block of memory. It is intentionally unsafe and used as a foundation for higher-level collections and strings." docsCollection: "silk" diff --git a/src/silk/docs/language/build-metadata/page.md b/src/silk/docs/language/build-metadata/page.md index 9adbce0b..6c57a2c0 100644 --- a/src/silk/docs/language/build-metadata/page.md +++ b/src/silk/docs/language/build-metadata/page.md @@ -1,5 +1,5 @@ --- -layout: "silk-docs" +layout: "docs" title: "Build Metadata (BUILD_KIND, BUILD_MODE, BUILD_VERSION)" description: "Silk exposes a small set of compiler-provided build metadata values to both runtime code and Formal Silk (compile-time verification) so programs can adapt to build configuration and so theories can ex" docsCollection: "silk" diff --git a/src/silk/docs/language/cheat-sheet/page.md b/src/silk/docs/language/cheat-sheet/page.md index 3d9e92c7..d4c16dfe 100644 --- a/src/silk/docs/language/cheat-sheet/page.md +++ b/src/silk/docs/language/cheat-sheet/page.md @@ -1,5 +1,5 @@ --- -layout: "silk-docs" +layout: "docs" title: "Language Cheat Sheet" description: "This document summarizes the key syntax and concepts from the Silk language in a condensed form. It is meant as a quick reference; detailed semantics live in the other docs/language/ files." docsCollection: "silk" diff --git a/src/silk/docs/language/concurrency/page.md b/src/silk/docs/language/concurrency/page.md index e2ab3753..5c182b24 100644 --- a/src/silk/docs/language/concurrency/page.md +++ b/src/silk/docs/language/concurrency/page.md @@ -1,5 +1,5 @@ --- -layout: "silk-docs" +layout: "docs" title: "Concurrency" description: "Concurrency in Silk is built around two orthogonal function modifiers:" docsCollection: "silk" diff --git a/src/silk/docs/language/const-functions/page.md b/src/silk/docs/language/const-functions/page.md index e92eee45..091784c8 100644 --- a/src/silk/docs/language/const-functions/page.md +++ b/src/silk/docs/language/const-functions/page.md @@ -1,5 +1,5 @@ --- -layout: "silk-docs" +layout: "docs" title: "Const Functions (const fn)" description: "Parser: implemented" docsCollection: "silk" diff --git a/src/silk/docs/language/conventions/page.md b/src/silk/docs/language/conventions/page.md index d91fbdb7..10cf8d7a 100644 --- a/src/silk/docs/language/conventions/page.md +++ b/src/silk/docs/language/conventions/page.md @@ -1,5 +1,5 @@ --- -layout: "silk-docs" +layout: "docs" title: "Language Spec Conventions" description: "This document defines conventions used across docs/language/. It exists to keep the language specification consistent and easy to navigate for both:" docsCollection: "silk" diff --git a/src/silk/docs/language/dependent-types/page.md b/src/silk/docs/language/dependent-types/page.md index b6cd1079..66fdaf01 100644 --- a/src/silk/docs/language/dependent-types/page.md +++ b/src/silk/docs/language/dependent-types/page.md @@ -1,5 +1,5 @@ --- -layout: "silk-docs" +layout: "docs" title: "Dependent Types (Const Parameters and Type-Level Computation)" description: "This document specifies Silk’s intended support for “dependent-type-like” patterns where types mention compile-time values (most notably integers)." docsCollection: "silk" diff --git a/src/silk/docs/language/doc-comments/page.md b/src/silk/docs/language/doc-comments/page.md index e8fa558b..d25408e7 100644 --- a/src/silk/docs/language/doc-comments/page.md +++ b/src/silk/docs/language/doc-comments/page.md @@ -1,5 +1,5 @@ --- -layout: "silk-docs" +layout: "docs" title: "Silkdoc (Documentation Comments)" description: "This document specifies Silkdoc, Silk’s documentation-comment format. Silkdoc comments are intended for tools (documentation generators, editors, and the language server). They do not affect program s" docsCollection: "silk" diff --git a/src/silk/docs/language/duration-instant/page.md b/src/silk/docs/language/duration-instant/page.md index fad15e15..db8dc9aa 100644 --- a/src/silk/docs/language/duration-instant/page.md +++ b/src/silk/docs/language/duration-instant/page.md @@ -1,5 +1,5 @@ --- -layout: "silk-docs" +layout: "docs" title: "Duration & Instant" description: "Duration and Instant are time-related types with special literal and operator support." docsCollection: "silk" diff --git a/src/silk/docs/language/enums/page.md b/src/silk/docs/language/enums/page.md index c5628d60..a59f6590 100644 --- a/src/silk/docs/language/enums/page.md +++ b/src/silk/docs/language/enums/page.md @@ -1,5 +1,5 @@ --- -layout: "silk-docs" +layout: "docs" title: "enum Types" description: "An enum defines a tagged union type: a value that is exactly one of several named variants, optionally carrying a payload." docsCollection: "silk" diff --git a/src/silk/docs/language/errors/page.md b/src/silk/docs/language/errors/page.md index dcf70151..409c1cb7 100644 --- a/src/silk/docs/language/errors/page.md +++ b/src/silk/docs/language/errors/page.md @@ -1,5 +1,5 @@ --- -layout: "silk-docs" +layout: "docs" title: "Errors" description: "This document summarizes the Silk error-handling model at a level suitable for compiler implementation. It is based on the language design captured in docs/ (optionals, verification, ext, ABI)." docsCollection: "silk" diff --git a/src/silk/docs/language/ext/page.md b/src/silk/docs/language/ext/page.md index ccfeb0a2..1262d4be 100644 --- a/src/silk/docs/language/ext/page.md +++ b/src/silk/docs/language/ext/page.md @@ -1,5 +1,5 @@ --- -layout: "silk-docs" +layout: "docs" title: "External Declarations (ext)" description: "Silk’s external declaration feature lets Silk code call foreign functions and access foreign variables." docsCollection: "silk" diff --git a/src/silk/docs/language/flow-blocks-statements/page.md b/src/silk/docs/language/flow-blocks-statements/page.md index ba5fd4fb..5efd59ab 100644 --- a/src/silk/docs/language/flow-blocks-statements/page.md +++ b/src/silk/docs/language/flow-blocks-statements/page.md @@ -1,5 +1,5 @@ --- -layout: "silk-docs" +layout: "docs" title: "Blocks and Statement Composition" description: "Blocks group statements, establish lexical scopes, and provide the “body” form for structured control-flow constructs like if, while, and the match statement used for typed errors." docsCollection: "silk" diff --git a/src/silk/docs/language/flow-break/page.md b/src/silk/docs/language/flow-break/page.md index e37ff844..6507e668 100644 --- a/src/silk/docs/language/flow-break/page.md +++ b/src/silk/docs/language/flow-break/page.md @@ -1,5 +1,5 @@ --- -layout: "silk-docs" +layout: "docs" title: "break" description: "break exits the nearest enclosing loop." docsCollection: "silk" diff --git a/src/silk/docs/language/flow-continue/page.md b/src/silk/docs/language/flow-continue/page.md index 2b9a69ce..904a6028 100644 --- a/src/silk/docs/language/flow-continue/page.md +++ b/src/silk/docs/language/flow-continue/page.md @@ -1,5 +1,5 @@ --- -layout: "silk-docs" +layout: "docs" title: "continue" description: "continue skips the remainder of the current loop iteration and jumps to the next iteration of the nearest enclosing loop." docsCollection: "silk" diff --git a/src/silk/docs/language/flow-expression-statements/page.md b/src/silk/docs/language/flow-expression-statements/page.md index cb4832c9..25c274b5 100644 --- a/src/silk/docs/language/flow-expression-statements/page.md +++ b/src/silk/docs/language/flow-expression-statements/page.md @@ -1,5 +1,5 @@ --- -layout: "silk-docs" +layout: "docs" title: "Expression Statements" description: "Expression statements allow expressions to be used for their side effects." docsCollection: "silk" diff --git a/src/silk/docs/language/flow-for/page.md b/src/silk/docs/language/flow-for/page.md index e007c1ac..826c06c6 100644 --- a/src/silk/docs/language/flow-for/page.md +++ b/src/silk/docs/language/flow-for/page.md @@ -1,5 +1,5 @@ --- -layout: "silk-docs" +layout: "docs" title: "for Loop" description: "The for loop iterates over a range or iterable and executes a block once per element." docsCollection: "silk" diff --git a/src/silk/docs/language/flow-if-else/page.md b/src/silk/docs/language/flow-if-else/page.md index 7230143e..c7f8571b 100644 --- a/src/silk/docs/language/flow-if-else/page.md +++ b/src/silk/docs/language/flow-if-else/page.md @@ -1,5 +1,5 @@ --- -layout: "silk-docs" +layout: "docs" title: "if / else" description: "The if / else construct provides branching based on a boolean condition." docsCollection: "silk" diff --git a/src/silk/docs/language/flow-loop/page.md b/src/silk/docs/language/flow-loop/page.md index c64b79ef..c7978296 100644 --- a/src/silk/docs/language/flow-loop/page.md +++ b/src/silk/docs/language/flow-loop/page.md @@ -1,5 +1,5 @@ --- -layout: "silk-docs" +layout: "docs" title: "loop Loop" description: "The loop statement executes a block repeatedly until it is terminated by a break or return." docsCollection: "silk" diff --git a/src/silk/docs/language/flow-match/page.md b/src/silk/docs/language/flow-match/page.md index 5b1f7d59..a0045bd2 100644 --- a/src/silk/docs/language/flow-match/page.md +++ b/src/silk/docs/language/flow-match/page.md @@ -1,5 +1,5 @@ --- -layout: "silk-docs" +layout: "docs" title: "match Expression (and Statement)" description: "The match expression provides structured pattern matching." docsCollection: "silk" diff --git a/src/silk/docs/language/flow-overview/page.md b/src/silk/docs/language/flow-overview/page.md index aa032ac3..d21203b2 100644 --- a/src/silk/docs/language/flow-overview/page.md +++ b/src/silk/docs/language/flow-overview/page.md @@ -1,5 +1,5 @@ --- -layout: "silk-docs" +layout: "docs" title: "Flow Control Overview" description: "Flow control describes how Silk programs sequence work, branch, loop, and exit. This concept spans several surface constructs and their static rules (typing, scoping, and diagnostics)." docsCollection: "silk" diff --git a/src/silk/docs/language/flow-return/page.md b/src/silk/docs/language/flow-return/page.md index 958c7fad..337310e3 100644 --- a/src/silk/docs/language/flow-return/page.md +++ b/src/silk/docs/language/flow-return/page.md @@ -1,5 +1,5 @@ --- -layout: "silk-docs" +layout: "docs" title: "return" description: "The return statement exits a function, optionally with a value." docsCollection: "silk" diff --git a/src/silk/docs/language/flow-while/page.md b/src/silk/docs/language/flow-while/page.md index 8d228f53..4189a3c1 100644 --- a/src/silk/docs/language/flow-while/page.md +++ b/src/silk/docs/language/flow-while/page.md @@ -1,5 +1,5 @@ --- -layout: "silk-docs" +layout: "docs" title: "while Loop" description: "The while loop repeatedly executes a block while a boolean condition holds." docsCollection: "silk" diff --git a/src/silk/docs/language/formal-verification/page.md b/src/silk/docs/language/formal-verification/page.md index a70601fb..b753a5d6 100644 --- a/src/silk/docs/language/formal-verification/page.md +++ b/src/silk/docs/language/formal-verification/page.md @@ -1,5 +1,5 @@ --- -layout: "silk-docs" +layout: "docs" title: "Formal Silk" description: "Formal Silk is Silk’s compile-time formal verification language. It is written using syntax that does not exist at runtime and is discharged at compile time using the Z3 SMT solver." docsCollection: "silk" diff --git a/src/silk/docs/language/function-disciplines/page.md b/src/silk/docs/language/function-disciplines/page.md index a62e543b..ff1fa9aa 100644 --- a/src/silk/docs/language/function-disciplines/page.md +++ b/src/silk/docs/language/function-disciplines/page.md @@ -1,5 +1,5 @@ --- -layout: "silk-docs" +layout: "docs" title: "Function Disciplines (pure, task, async)" description: "This document specifies Silk’s intended “function discipline” system: how functions declare whether they are pure, asynchronous, or safe to run as parallel tasks." docsCollection: "silk" diff --git a/src/silk/docs/language/generics/page.md b/src/silk/docs/language/generics/page.md index 480b2421..b1b03c46 100644 --- a/src/silk/docs/language/generics/page.md +++ b/src/silk/docs/language/generics/page.md @@ -1,5 +1,5 @@ --- -layout: "silk-docs" +layout: "docs" title: "Generics (Monomorphized)" description: "This document specifies Silk’s parameterized type and declaration syntax." docsCollection: "silk" diff --git a/src/silk/docs/language/gpu-execution/page.md b/src/silk/docs/language/gpu-execution/page.md index 1e67e736..7a4e4990 100644 --- a/src/silk/docs/language/gpu-execution/page.md +++ b/src/silk/docs/language/gpu-execution/page.md @@ -1,5 +1,5 @@ --- -layout: "silk-docs" +layout: "docs" title: "GPU execution placement" description: "Silk functions run on the program's host CPU unless their declaration carries the GPU placement attribute:" docsCollection: "silk" diff --git a/src/silk/docs/language/gpu-launch-blocks/page.md b/src/silk/docs/language/gpu-launch-blocks/page.md index 337587d3..5352ef09 100644 --- a/src/silk/docs/language/gpu-launch-blocks/page.md +++ b/src/silk/docs/language/gpu-launch-blocks/page.md @@ -1,5 +1,5 @@ --- -layout: "silk-docs" +layout: "docs" title: "GPU launch blocks" description: "Silk provides a checked host-side form for launching one GPU kernel without importing a launch function or repeating the kernel name as a string:" docsCollection: "silk" diff --git a/src/silk/docs/language/grammar/page.md b/src/silk/docs/language/grammar/page.md index e072e9c1..cc808c5e 100644 --- a/src/silk/docs/language/grammar/page.md +++ b/src/silk/docs/language/grammar/page.md @@ -1,5 +1,5 @@ --- -layout: "silk-docs" +layout: "docs" title: "Formal Grammar Spec" description: "This document contains the formal grammar and lexical specification for Silk as used by the compiler implementation." docsCollection: "silk" diff --git a/src/silk/docs/language/interfaces/page.md b/src/silk/docs/language/interfaces/page.md index 71642475..67b83b5a 100644 --- a/src/silk/docs/language/interfaces/page.md +++ b/src/silk/docs/language/interfaces/page.md @@ -1,5 +1,5 @@ --- -layout: "silk-docs" +layout: "docs" title: "Interfaces" description: "Interfaces allow types to declare that they implement a particular contract. They are the foundation for standard-library “protocols” such as readers, writers, iterators, and allocators." docsCollection: "silk" diff --git a/src/silk/docs/language/literals-aggregate/page.md b/src/silk/docs/language/literals-aggregate/page.md index 274322c3..b07dbddc 100644 --- a/src/silk/docs/language/literals-aggregate/page.md +++ b/src/silk/docs/language/literals-aggregate/page.md @@ -1,5 +1,5 @@ --- -layout: "silk-docs" +layout: "docs" title: "Aggregate Literals" description: "Aggregate literals cover arrays and structs." docsCollection: "silk" diff --git a/src/silk/docs/language/literals-boolean/page.md b/src/silk/docs/language/literals-boolean/page.md index 3bb022b8..e4ad6459 100644 --- a/src/silk/docs/language/literals-boolean/page.md +++ b/src/silk/docs/language/literals-boolean/page.md @@ -1,5 +1,5 @@ --- -layout: "silk-docs" +layout: "docs" title: "Boolean Literals" description: "Boolean literals are the two built-in logical values:" docsCollection: "silk" diff --git a/src/silk/docs/language/literals-character/page.md b/src/silk/docs/language/literals-character/page.md index 6118f12c..43e4e8fd 100644 --- a/src/silk/docs/language/literals-character/page.md +++ b/src/silk/docs/language/literals-character/page.md @@ -1,5 +1,5 @@ --- -layout: "silk-docs" +layout: "docs" title: "Character Literals" description: "Character literals represent Unicode scalar values (code points) and have type char (types)." docsCollection: "silk" diff --git a/src/silk/docs/language/literals-duration/page.md b/src/silk/docs/language/literals-duration/page.md index 12f3f3b0..c8a435c8 100644 --- a/src/silk/docs/language/literals-duration/page.md +++ b/src/silk/docs/language/literals-duration/page.md @@ -1,5 +1,5 @@ --- -layout: "silk-docs" +layout: "docs" title: "Duration Literals" description: "The Duration and Instant types have specialized literal support." docsCollection: "silk" diff --git a/src/silk/docs/language/literals-numeric/page.md b/src/silk/docs/language/literals-numeric/page.md index a2b1c8aa..736a36bc 100644 --- a/src/silk/docs/language/literals-numeric/page.md +++ b/src/silk/docs/language/literals-numeric/page.md @@ -1,5 +1,5 @@ --- -layout: "silk-docs" +layout: "docs" title: "Numeric Literals" description: "Numeric literals produce integer (int, u8, i128, …) and floating-point (f32, f64, f128) values." docsCollection: "silk" diff --git a/src/silk/docs/language/literals-overview/page.md b/src/silk/docs/language/literals-overview/page.md index 3ffcf81d..c1a7939c 100644 --- a/src/silk/docs/language/literals-overview/page.md +++ b/src/silk/docs/language/literals-overview/page.md @@ -1,5 +1,5 @@ --- -layout: "silk-docs" +layout: "docs" title: "Literals Overview" description: "This document provides a high-level overview of literals in Silk, with details split into dedicated documents for each category." docsCollection: "silk" diff --git a/src/silk/docs/language/literals-regexp/page.md b/src/silk/docs/language/literals-regexp/page.md index 2883bdc0..6cda1b4f 100644 --- a/src/silk/docs/language/literals-regexp/page.md +++ b/src/silk/docs/language/literals-regexp/page.md @@ -1,5 +1,5 @@ --- -layout: "silk-docs" +layout: "docs" title: "Regular Expression Literals" description: "Regular expression literals represent regexp values: compiled regular expression bytecode that can be used by std::regex helpers." docsCollection: "silk" diff --git a/src/silk/docs/language/literals-string/page.md b/src/silk/docs/language/literals-string/page.md index a2cae556..2fe1141c 100644 --- a/src/silk/docs/language/literals-string/page.md +++ b/src/silk/docs/language/literals-string/page.md @@ -1,5 +1,5 @@ --- -layout: "silk-docs" +layout: "docs" title: "String Literals" description: "String literals represent string values: immutable, length-tracked sequences of bytes that are typically interpreted as UTF-8 text." docsCollection: "silk" diff --git a/src/silk/docs/language/memory-model/page.md b/src/silk/docs/language/memory-model/page.md index dd6930f3..6087009c 100644 --- a/src/silk/docs/language/memory-model/page.md +++ b/src/silk/docs/language/memory-model/page.md @@ -1,5 +1,5 @@ --- -layout: "silk-docs" +layout: "docs" title: "Memory Model (Stack, Heap, and Moves)" description: "This document specifies Silk’s intended memory model: how values are allocated, passed, and how (future) heap-managed values interact with the type system." docsCollection: "silk" diff --git a/src/silk/docs/language/mutability/page.md b/src/silk/docs/language/mutability/page.md index f9c599eb..22abc3db 100644 --- a/src/silk/docs/language/mutability/page.md +++ b/src/silk/docs/language/mutability/page.md @@ -1,5 +1,5 @@ --- -layout: "silk-docs" +layout: "docs" title: "Mutability" description: "Mutability in Silk is “safe by default”: values are immutable unless explicitly marked mutable under clear rules using the mut keyword." docsCollection: "silk" diff --git a/src/silk/docs/language/operators/page.md b/src/silk/docs/language/operators/page.md index 19b0312d..1517fa68 100644 --- a/src/silk/docs/language/operators/page.md +++ b/src/silk/docs/language/operators/page.md @@ -1,5 +1,5 @@ --- -layout: "silk-docs" +layout: "docs" title: "Operators" description: "This document summarizes the operator set and precedence for Silk." docsCollection: "silk" diff --git a/src/silk/docs/language/optional/page.md b/src/silk/docs/language/optional/page.md index 3d877484..6ae0278f 100644 --- a/src/silk/docs/language/optional/page.md +++ b/src/silk/docs/language/optional/page.md @@ -1,5 +1,5 @@ --- -layout: "silk-docs" +layout: "docs" title: "Optional" description: "The Optional type provides a safe way to represent values that may or may not be present, instead of relying on sentinel values such as null." docsCollection: "silk" diff --git a/src/silk/docs/language/packages-imports-exports/page.md b/src/silk/docs/language/packages-imports-exports/page.md index 9d88b0d4..25679610 100644 --- a/src/silk/docs/language/packages-imports-exports/page.md +++ b/src/silk/docs/language/packages-imports-exports/page.md @@ -1,5 +1,5 @@ --- -layout: "silk-docs" +layout: "docs" title: "Packages, Imports, and Exports" description: "This document specifies the initial surface syntax for packages, imports, and exports in Silk. The semantics are intentionally minimal for now and will be extended as the compiler’s resolver and linke" docsCollection: "silk" diff --git a/src/silk/docs/language/regions/page.md b/src/silk/docs/language/regions/page.md index fe09d189..a9e36520 100644 --- a/src/silk/docs/language/regions/page.md +++ b/src/silk/docs/language/regions/page.md @@ -1,5 +1,5 @@ --- -layout: "silk-docs" +layout: "docs" title: "Regions" description: "Regions provide a fixed-size, statically allocated block of memory that can be used as an allocation context for new." docsCollection: "silk" diff --git a/src/silk/docs/language/struct-requirements/page.md b/src/silk/docs/language/struct-requirements/page.md index 7508c24c..f45e7e97 100644 --- a/src/silk/docs/language/struct-requirements/page.md +++ b/src/silk/docs/language/struct-requirements/page.md @@ -1,5 +1,5 @@ --- -layout: "silk-docs" +layout: "docs" title: "Struct Requirements (#require)" description: "Use #require on a struct to state requirements that must hold for all values constructed for that struct type." docsCollection: "silk" diff --git a/src/silk/docs/language/structs-impls-layout/page.md b/src/silk/docs/language/structs-impls-layout/page.md index b3dae2ea..5d73011b 100644 --- a/src/silk/docs/language/structs-impls-layout/page.md +++ b/src/silk/docs/language/structs-impls-layout/page.md @@ -1,5 +1,5 @@ --- -layout: "silk-docs" +layout: "docs" title: "Structs, Impl Blocks, and Memory Layout" description: "Structs and impl blocks are separated:" docsCollection: "silk" diff --git a/src/silk/docs/language/syntax-tour/page.md b/src/silk/docs/language/syntax-tour/page.md index 4d69ad28..540cfd48 100644 --- a/src/silk/docs/language/syntax-tour/page.md +++ b/src/silk/docs/language/syntax-tour/page.md @@ -1,5 +1,5 @@ --- -layout: "silk-docs" +layout: "docs" title: "Silk Syntax Tour (Soup to Nuts)" description: "This document is an example-driven tour of Silk’s surface syntax, from a single-file “hello world” through modules/packages, declarations, statements, expressions, and the Formal Silk verification dir" docsCollection: "silk" diff --git a/src/silk/docs/language/target-metadata/page.md b/src/silk/docs/language/target-metadata/page.md index f452fb3c..0517b642 100644 --- a/src/silk/docs/language/target-metadata/page.md +++ b/src/silk/docs/language/target-metadata/page.md @@ -1,5 +1,5 @@ --- -layout: "silk-docs" +layout: "docs" title: "Target Metadata (OS_PLATFORM, OS_ARCH, OS_IS_UNIX, OS_IS_POSIX)" description: "Silk exposes a small set of compiler-provided target metadata values to both runtime code and Formal Silk (compile-time verification)." docsCollection: "silk" diff --git a/src/silk/docs/language/testing/page.md b/src/silk/docs/language/testing/page.md index 08ef6e49..582db39a 100644 --- a/src/silk/docs/language/testing/page.md +++ b/src/silk/docs/language/testing/page.md @@ -1,5 +1,5 @@ --- -layout: "silk-docs" +layout: "docs" title: "Testing" description: "This document specifies the initial language-level testing surface for Silk." docsCollection: "silk" diff --git a/src/silk/docs/language/toolchain-metadata/page.md b/src/silk/docs/language/toolchain-metadata/page.md index 6b582160..f60a9f53 100644 --- a/src/silk/docs/language/toolchain-metadata/page.md +++ b/src/silk/docs/language/toolchain-metadata/page.md @@ -1,5 +1,5 @@ --- -layout: "silk-docs" +layout: "docs" title: "Toolchain Metadata (SILK_VERSION, SILK_ABI_VERSION, SILK_GIT_COMMIT)" description: "Silk exposes a small set of compiler-provided toolchain metadata values to:" docsCollection: "silk" diff --git a/src/silk/docs/language/type-unions/page.md b/src/silk/docs/language/type-unions/page.md index 4593b37a..5ba64d90 100644 --- a/src/silk/docs/language/type-unions/page.md +++ b/src/silk/docs/language/type-unions/page.md @@ -1,5 +1,5 @@ --- -layout: "silk-docs" +layout: "docs" title: "Type Unions (T1 | T2 | ...)" description: "Silk supports type unions in type annotations. A union type represents a value that is exactly one of several member types." docsCollection: "silk" diff --git a/src/silk/docs/language/typed-errors/page.md b/src/silk/docs/language/typed-errors/page.md index 0ada21b4..f096e726 100644 --- a/src/silk/docs/language/typed-errors/page.md +++ b/src/silk/docs/language/typed-errors/page.md @@ -1,5 +1,5 @@ --- -layout: "silk-docs" +layout: "docs" title: "Typed Errors (error, panic, and T | ErrorType...)" description: "Silk’s typed error system exists to eliminate the “trust gap” between a function’s signature and its real behavior. There are no hidden exceptions and no implicit panic channel: if a function can term" docsCollection: "silk" diff --git a/src/silk/docs/language/types/page.md b/src/silk/docs/language/types/page.md index 9521a73f..a4636e93 100644 --- a/src/silk/docs/language/types/page.md +++ b/src/silk/docs/language/types/page.md @@ -1,5 +1,5 @@ --- -layout: "silk-docs" +layout: "docs" title: "Types" description: "This document specifies the Silk type system used by the compiler front-end and type checker." docsCollection: "silk" diff --git a/src/silk/docs/language/using/page.md b/src/silk/docs/language/using/page.md index f6d421bd..d3271f1d 100644 --- a/src/silk/docs/language/using/page.md +++ b/src/silk/docs/language/using/page.md @@ -1,5 +1,5 @@ --- -layout: "silk-docs" +layout: "docs" title: "using (Aliases and Method Reuse)" description: "using introduces a local alias to an existing symbol, and (in interface / impl bodies) can import method signatures/implementations under a new name." docsCollection: "silk" diff --git a/src/silk/docs/language/varargs/page.md b/src/silk/docs/language/varargs/page.md index feed624c..63dd5d88 100644 --- a/src/silk/docs/language/varargs/page.md +++ b/src/silk/docs/language/varargs/page.md @@ -1,5 +1,5 @@ --- -layout: "silk-docs" +layout: "docs" title: "Varargs (Variable Arguments)" description: "Silk supports declaring functions that accept a variable number of trailing arguments (“varargs”). This is used heavily by std::io::print / std::io::println for formatted output." docsCollection: "silk" diff --git a/src/silk/docs/man/libsilk.7/page.md b/src/silk/docs/man/libsilk.7/page.md index 9dbffbe3..6b825583 100644 --- a/src/silk/docs/man/libsilk.7/page.md +++ b/src/silk/docs/man/libsilk.7/page.md @@ -1,5 +1,5 @@ --- -layout: "silk-docs" +layout: "docs" title: "[libsilk(7)](?p=man/libsilk.7) — C99 ABI for the Silk Compiler" description: "NOTE: This is the Markdown source for a man 7 page describing the C99 embedding ABI exposed by libsilk.a. The roff-formatted manpage should be generated from this content." docsCollection: "silk" diff --git a/src/silk/docs/man/silk-build.1/page.md b/src/silk/docs/man/silk-build.1/page.md index ae87efe9..f571ecc7 100644 --- a/src/silk/docs/man/silk-build.1/page.md +++ b/src/silk/docs/man/silk-build.1/page.md @@ -1,5 +1,5 @@ --- -layout: "silk-docs" +layout: "docs" title: "[silk-build(1)](?p=man/silk-build.1) — Build Silk Artifacts" description: "NOTE: This is the Markdown source for the eventual man 1 page for silk build. The roff-formatted manpage should be generated from this content." docsCollection: "silk" diff --git a/src/silk/docs/man/silk-cache.1/page.md b/src/silk/docs/man/silk-cache.1/page.md index 2b9c9910..2006ee2a 100644 --- a/src/silk/docs/man/silk-cache.1/page.md +++ b/src/silk/docs/man/silk-cache.1/page.md @@ -1,5 +1,5 @@ --- -layout: "silk-docs" +layout: "docs" title: "[silk-cache(1)](?p=man/silk-cache.1) — Inspect and Maintain the Managed Silk Cache" description: "NOTE: This is the Markdown source for the eventual man 1 page for silk cache. The roff-formatted manpage should be generated from this content." docsCollection: "silk" diff --git a/src/silk/docs/man/silk-cc.1/page.md b/src/silk/docs/man/silk-cc.1/page.md index 2a4eaae9..383ff775 100644 --- a/src/silk/docs/man/silk-cc.1/page.md +++ b/src/silk/docs/man/silk-cc.1/page.md @@ -1,5 +1,5 @@ --- -layout: "silk-docs" +layout: "docs" title: "[silk-cc(1)](?p=man/silk-cc.1) — C Compiler Wrapper for libsilk" description: "NOTE: This is the Markdown source for the eventual man 1 page for silk cc. The roff-formatted manpage should be generated from this content." docsCollection: "silk" diff --git a/src/silk/docs/man/silk-check.1/page.md b/src/silk/docs/man/silk-check.1/page.md index feead9cc..f32e5970 100644 --- a/src/silk/docs/man/silk-check.1/page.md +++ b/src/silk/docs/man/silk-check.1/page.md @@ -1,5 +1,5 @@ --- -layout: "silk-docs" +layout: "docs" title: "[silk-check(1)](?p=man/silk-check.1) — Parse and Type-Check" description: "NOTE: This is the Markdown source for the eventual man 1 page for silk check. The roff-formatted manpage should be generated from this content." docsCollection: "silk" diff --git a/src/silk/docs/man/silk-codesign.1/page.md b/src/silk/docs/man/silk-codesign.1/page.md index 1402551d..a9806de6 100644 --- a/src/silk/docs/man/silk-codesign.1/page.md +++ b/src/silk/docs/man/silk-codesign.1/page.md @@ -1,5 +1,5 @@ --- -layout: "silk-docs" +layout: "docs" title: "[silk-codesign(1)](?p=man/silk-codesign.1) - Sign And Verify Platform Artifacts" description: "NOTE: This is the Markdown source for the eventual man 1 page for silk codesign. The roff-formatted manpage should be generated from this content." docsCollection: "silk" diff --git a/src/silk/docs/man/silk-devices.1/page.md b/src/silk/docs/man/silk-devices.1/page.md index a55d19d9..792bca2c 100644 --- a/src/silk/docs/man/silk-devices.1/page.md +++ b/src/silk/docs/man/silk-devices.1/page.md @@ -1,5 +1,5 @@ --- -layout: "silk-docs" +layout: "docs" title: "[silk-devices(1)](?p=man/silk-devices.1) - Manage Platform Devices And App Lifecycles" description: "NOTE: This is the Markdown source for the eventual man 1 page for silk devices. The roff-formatted manpage should be generated from this content." docsCollection: "silk" diff --git a/src/silk/docs/man/silk-doc.1/page.md b/src/silk/docs/man/silk-doc.1/page.md index 26965985..86bcf0e2 100644 --- a/src/silk/docs/man/silk-doc.1/page.md +++ b/src/silk/docs/man/silk-doc.1/page.md @@ -1,5 +1,5 @@ --- -layout: "silk-docs" +layout: "docs" title: "[silk-doc(1)](?p=man/silk-doc.1) — Generate Documentation (Markdown or Manpages)" description: "NOTE: This is the Markdown source for the eventual man 1 page for silk doc. The roff-formatted manpage should be generated from this content." docsCollection: "silk" diff --git a/src/silk/docs/man/silk-env.1/page.md b/src/silk/docs/man/silk-env.1/page.md index 622a72bc..69b46824 100644 --- a/src/silk/docs/man/silk-env.1/page.md +++ b/src/silk/docs/man/silk-env.1/page.md @@ -1,5 +1,5 @@ --- -layout: "silk-docs" +layout: "docs" title: "[silk-env(1)](?p=man/silk-env.1) — Print silk CLI Environment" description: "NOTE: This is the Markdown source for the eventual man 1 page for silk env. The roff-formatted manpage should be generated from this content." docsCollection: "silk" diff --git a/src/silk/docs/man/silk-error.1/page.md b/src/silk/docs/man/silk-error.1/page.md index 7fc3140d..e76e4f5a 100644 --- a/src/silk/docs/man/silk-error.1/page.md +++ b/src/silk/docs/man/silk-error.1/page.md @@ -1,5 +1,5 @@ --- -layout: "silk-docs" +layout: "docs" title: "[silk-error(1)](?p=man/silk-error.1) — Explain Compiler Diagnostic Codes" description: "NOTE: This is the Markdown source for the eventual man 1 page for silk error. The roff-formatted manpage should be generated from this content." docsCollection: "silk" diff --git a/src/silk/docs/man/silk-format.1/page.md b/src/silk/docs/man/silk-format.1/page.md index d8e35489..c7c3ce43 100644 --- a/src/silk/docs/man/silk-format.1/page.md +++ b/src/silk/docs/man/silk-format.1/page.md @@ -1,5 +1,5 @@ --- -layout: "silk-docs" +layout: "docs" title: "[silk-format(1)](?p=man/silk-format.1) — Format Silk Source Files" description: "NOTE: This is the Markdown source for the eventual man 1 page for silk format. The roff-formatted manpage should be generated from this content." docsCollection: "silk" diff --git a/src/silk/docs/man/silk-graph.1/page.md b/src/silk/docs/man/silk-graph.1/page.md index 769185b6..cac82b3e 100644 --- a/src/silk/docs/man/silk-graph.1/page.md +++ b/src/silk/docs/man/silk-graph.1/page.md @@ -1,5 +1,5 @@ --- -layout: "silk-docs" +layout: "docs" title: "[silk-graph(1)](?p=man/silk-graph.1) - Inspect Module Graphs" description: "NOTE: This is the Markdown source for the eventual man 1 page for silk graph. The roff-formatted manpage should be generated from this content." docsCollection: "silk" diff --git a/src/silk/docs/man/silk-guide.1/page.md b/src/silk/docs/man/silk-guide.1/page.md index 0cde6814..4195fce5 100644 --- a/src/silk/docs/man/silk-guide.1/page.md +++ b/src/silk/docs/man/silk-guide.1/page.md @@ -1,5 +1,5 @@ --- -layout: "silk-docs" +layout: "docs" title: "[silk-guide(1)](?p=man/silk-guide.1) — Search Curated Silk Example Guides" description: "NOTE: This is the Markdown source for the eventual man 1 page for silk guide. The roff-formatted manpage should be generated from this content." docsCollection: "silk" diff --git a/src/silk/docs/man/silk-help.1/page.md b/src/silk/docs/man/silk-help.1/page.md index da755944..0697d4c1 100644 --- a/src/silk/docs/man/silk-help.1/page.md +++ b/src/silk/docs/man/silk-help.1/page.md @@ -1,5 +1,5 @@ --- -layout: "silk-docs" +layout: "docs" title: "[silk-help(1)](?p=man/silk-help.1) - Show Silk CLI Help" description: "NOTE: This is the Markdown source for the eventual man 1 page for silk help. The roff-formatted manpage should be generated from this content." docsCollection: "silk" diff --git a/src/silk/docs/man/silk-lsp.1/page.md b/src/silk/docs/man/silk-lsp.1/page.md index 2a5f4780..da740d7b 100644 --- a/src/silk/docs/man/silk-lsp.1/page.md +++ b/src/silk/docs/man/silk-lsp.1/page.md @@ -1,5 +1,5 @@ --- -layout: "silk-docs" +layout: "docs" title: "[silk-lsp(1)](?p=man/silk-lsp.1) — Language Server Protocol (LSP) Server" description: "NOTE: This is the Markdown source for the eventual man 1 page for silk-lsp. The roff-formatted manpage should be generated from this content." docsCollection: "silk" diff --git a/src/silk/docs/man/silk-man.1/page.md b/src/silk/docs/man/silk-man.1/page.md index f9032d06..b439d990 100644 --- a/src/silk/docs/man/silk-man.1/page.md +++ b/src/silk/docs/man/silk-man.1/page.md @@ -1,5 +1,5 @@ --- -layout: "silk-docs" +layout: "docs" title: "[silk-man(1)](?p=man/silk-man.1) — View Manpages Derived from Source Docs" description: "NOTE: This is the Markdown source for the eventual man 1 page for silk man. The roff-formatted manpage should be generated from this content." docsCollection: "silk" diff --git a/src/silk/docs/man/silk-package.1/page.md b/src/silk/docs/man/silk-package.1/page.md index e0578560..33fc4bf9 100644 --- a/src/silk/docs/man/silk-package.1/page.md +++ b/src/silk/docs/man/silk-package.1/page.md @@ -1,5 +1,5 @@ --- -layout: "silk-docs" +layout: "docs" title: "[silk-package(1)](?p=man/silk-package.1) — Inspect And Lint Silk Packages" description: "NOTE: This is the Markdown source for the eventual man 1 page for silk package. The roff-formatted manpage should be generated from this content." docsCollection: "silk" diff --git a/src/silk/docs/man/silk-proto.1/page.md b/src/silk/docs/man/silk-proto.1/page.md index 56262cba..43c5c691 100644 --- a/src/silk/docs/man/silk-proto.1/page.md +++ b/src/silk/docs/man/silk-proto.1/page.md @@ -1,5 +1,5 @@ --- -layout: "silk-docs" +layout: "docs" title: "[silk-proto(1)](?p=man/silk-proto.1) — compile proto3 schemas to Silk" description: "NOTE: This is the Markdown source for the eventual man 1 page for silk proto. The roff-formatted manpage should be generated from this content." docsCollection: "silk" diff --git a/src/silk/docs/man/silk-repl.1/page.md b/src/silk/docs/man/silk-repl.1/page.md index d3f84077..14af7530 100644 --- a/src/silk/docs/man/silk-repl.1/page.md +++ b/src/silk/docs/man/silk-repl.1/page.md @@ -1,5 +1,5 @@ --- -layout: "silk-docs" +layout: "docs" title: "[silk-repl(1)](?p=man/silk-repl.1) - Interactive Silk REPL" description: "NOTE: This is the Markdown source for the eventual man 1 page for silk repl. The roff-formatted manpage should be generated from this content." docsCollection: "silk" diff --git a/src/silk/docs/man/silk-size.1/page.md b/src/silk/docs/man/silk-size.1/page.md index 709327da..06d254fa 100644 --- a/src/silk/docs/man/silk-size.1/page.md +++ b/src/silk/docs/man/silk-size.1/page.md @@ -1,5 +1,5 @@ --- -layout: "silk-docs" +layout: "docs" title: "[silk-size(1)](?p=man/silk-size.1) - Inspect Artifact Sizes" description: "NOTE: This is the Markdown source for the eventual man 1 page for silk size. The roff-formatted manpage should be generated from this content." docsCollection: "silk" diff --git a/src/silk/docs/man/silk-targets.1/page.md b/src/silk/docs/man/silk-targets.1/page.md index 3c2ff939..df841f59 100644 --- a/src/silk/docs/man/silk-targets.1/page.md +++ b/src/silk/docs/man/silk-targets.1/page.md @@ -1,5 +1,5 @@ --- -layout: "silk-docs" +layout: "docs" title: "[silk-targets(1)](?p=man/silk-targets.1) - Inspect Target Capabilities" description: "NOTE: This is the Markdown source for the eventual man 1 page for silk targets. The roff-formatted manpage should be generated from this content." docsCollection: "silk" diff --git a/src/silk/docs/man/silk-test.1/page.md b/src/silk/docs/man/silk-test.1/page.md index 8d5e8c24..5c0b1958 100644 --- a/src/silk/docs/man/silk-test.1/page.md +++ b/src/silk/docs/man/silk-test.1/page.md @@ -1,5 +1,5 @@ --- -layout: "silk-docs" +layout: "docs" title: "[silk-test(1)](?p=man/silk-test.1) — Run Language-Level Tests" description: "NOTE: This is the Markdown source for the eventual man 1 page for silk test. The roff-formatted manpage should be generated from this content." docsCollection: "silk" diff --git a/src/silk/docs/man/silk.1/page.md b/src/silk/docs/man/silk.1/page.md index 6a28a4e0..66e0ef18 100644 --- a/src/silk/docs/man/silk.1/page.md +++ b/src/silk/docs/man/silk.1/page.md @@ -1,5 +1,5 @@ --- -layout: "silk-docs" +layout: "docs" title: "[silk(1)](?p=man/silk.1) — Silk Language Compiler" description: "NOTE: This is the Markdown source for the eventual man 1 page for silk. The roff-formatted manpage should be generated from this content." docsCollection: "silk" diff --git a/src/silk/docs/man/silk.7/page.md b/src/silk/docs/man/silk.7/page.md index 5ae0b559..4cc85552 100644 --- a/src/silk/docs/man/silk.7/page.md +++ b/src/silk/docs/man/silk.7/page.md @@ -1,5 +1,5 @@ --- -layout: "silk-docs" +layout: "docs" title: "[silk(7)](?p=man/silk.7) — Silk Toolchain Overview" description: "NOTE: This is the Markdown source for the eventual man 7 page for Silk. The roff-formatted manpage should be generated from this content." docsCollection: "silk" diff --git a/src/silk/docs/man/silk_abi_get_version.3/page.md b/src/silk/docs/man/silk_abi_get_version.3/page.md index deb961e1..145726bb 100644 --- a/src/silk/docs/man/silk_abi_get_version.3/page.md +++ b/src/silk/docs/man/silk_abi_get_version.3/page.md @@ -1,5 +1,5 @@ --- -layout: "silk-docs" +layout: "docs" title: "[silk_abi_get_version(3)](?p=man/silk_abi_get_version.3) — Query the libsilk ABI Version" description: "NOTE: This is the Markdown source for the eventual man 3 page for silk_abi_get_version. The roff-formatted manpage should be generated from this content." docsCollection: "silk" diff --git a/src/silk/docs/man/silk_amdgpu_aql_dispatch_packet_build.3/page.md b/src/silk/docs/man/silk_amdgpu_aql_dispatch_packet_build.3/page.md index cffd21a4..9d79f34b 100644 --- a/src/silk/docs/man/silk_amdgpu_aql_dispatch_packet_build.3/page.md +++ b/src/silk/docs/man/silk_amdgpu_aql_dispatch_packet_build.3/page.md @@ -1,5 +1,5 @@ --- -layout: "silk-docs" +layout: "docs" title: "[silk_amdgpu_aql_dispatch_packet_build(3)](?p=man/silk_amdgpu_aql_dispatch_packet_build.3) — Serialize AMDGPU AQL Dispatch Packets" description: "NOTE: This is the Markdown source for the eventual man 3 page for the AMDGPU AQL packet helper. The roff-formatted manpage should be generated from this content." docsCollection: "silk" diff --git a/src/silk/docs/man/silk_bytes.3/page.md b/src/silk/docs/man/silk_bytes.3/page.md index 4a2cf515..20dfeb99 100644 --- a/src/silk/docs/man/silk_bytes.3/page.md +++ b/src/silk/docs/man/silk_bytes.3/page.md @@ -1,5 +1,5 @@ --- -layout: "silk-docs" +layout: "docs" title: "[silk_bytes(3)](?p=man/silk_bytes.3) — Manage Owned Build Output Buffers" description: "NOTE: This is the Markdown source for the eventual man 3 page for SilkBytes output buffers. The roff-formatted manpage should be generated from this content." docsCollection: "silk" diff --git a/src/silk/docs/man/silk_compiler.3/page.md b/src/silk/docs/man/silk_compiler.3/page.md index 981aa637..e817c5f3 100644 --- a/src/silk/docs/man/silk_compiler.3/page.md +++ b/src/silk/docs/man/silk_compiler.3/page.md @@ -1,5 +1,5 @@ --- -layout: "silk-docs" +layout: "docs" title: "[silk_compiler(3)](?p=man/silk_compiler.3) — Embed the Silk Compiler" description: "NOTE: This is the Markdown source for the eventual man 3 page for the SilkCompiler embedding API. The roff-formatted manpage should be generated from this content." docsCollection: "silk" diff --git a/src/silk/docs/man/silk_error.3/page.md b/src/silk/docs/man/silk_error.3/page.md index 868a57ee..403bc989 100644 --- a/src/silk/docs/man/silk_error.3/page.md +++ b/src/silk/docs/man/silk_error.3/page.md @@ -1,5 +1,5 @@ --- -layout: "silk-docs" +layout: "docs" title: "[silk_error(3)](?p=man/silk_error.3) — Retrieve and Format Compiler Errors" description: "NOTE: This is the Markdown source for the eventual man 3 page for SilkError formatting and retrieval. The roff-formatted manpage should be generated from this content." docsCollection: "silk" diff --git a/src/silk/docs/man/slc.1/page.md b/src/silk/docs/man/slc.1/page.md index 48d18448..01ba9898 100644 --- a/src/silk/docs/man/slc.1/page.md +++ b/src/silk/docs/man/slc.1/page.md @@ -1,5 +1,5 @@ --- -layout: "silk-docs" +layout: "docs" title: "[slc(1)](?p=man/slc.1) — Alias of silk build" description: "NOTE: This is the Markdown source for the eventual man 1 page for slc. The roff-formatted manpage should be generated from this content." docsCollection: "silk" diff --git a/src/silk/docs/man/slcc.1/page.md b/src/silk/docs/man/slcc.1/page.md index 21c0f321..80829dc1 100644 --- a/src/silk/docs/man/slcc.1/page.md +++ b/src/silk/docs/man/slcc.1/page.md @@ -1,5 +1,5 @@ --- -layout: "silk-docs" +layout: "docs" title: "[slcc(1)](?p=man/slcc.1) — Alias of silk cc" description: "NOTE: This is the Markdown source for the eventual man 1 page for slcc. The roff-formatted manpage should be generated from this content." docsCollection: "silk" diff --git a/src/silk/docs/page.md b/src/silk/docs/page.md index 778eec38..dd4487db 100644 --- a/src/silk/docs/page.md +++ b/src/silk/docs/page.md @@ -1,5 +1,5 @@ --- -layout: "silk-docs" +layout: "docs" title: "Silk Documentation" description: "Silk is a high performance general purpose programming language with formal verification built in. Silk targets computer systems, mobile / tablet devices, WASM / WASI runtimes, and the web." docsCollection: "silk" diff --git a/src/silk/docs/std/abort-controller/page.md b/src/silk/docs/std/abort-controller/page.md index 23e22440..eb49e9b8 100644 --- a/src/silk/docs/std/abort-controller/page.md +++ b/src/silk/docs/std/abort-controller/page.md @@ -1,5 +1,5 @@ --- -layout: "silk-docs" +layout: "docs" title: "std::abort_controller" description: "This module provides a WHATWG-style AbortController / AbortSignal pair for cooperative cancellation across async functions and OS-thread-backed task concurrency." docsCollection: "silk" diff --git a/src/silk/docs/std/abort_controller/page.md b/src/silk/docs/std/abort_controller/page.md index a42eefb1..e702125a 100644 --- a/src/silk/docs/std/abort_controller/page.md +++ b/src/silk/docs/std/abort_controller/page.md @@ -1,5 +1,5 @@ --- -layout: "silk-docs" +layout: "docs" title: "std::abort_controller" description: "This is the canonical module doc for std::abort_controller." docsCollection: "silk" diff --git a/src/silk/docs/std/algorithms/page.md b/src/silk/docs/std/algorithms/page.md index 01642046..4bd8baeb 100644 --- a/src/silk/docs/std/algorithms/page.md +++ b/src/silk/docs/std/algorithms/page.md @@ -1,5 +1,5 @@ --- -layout: "silk-docs" +layout: "docs" title: "std::algorithms" description: "This describes intended algorithm APIs; it is not implemented yet." docsCollection: "silk" diff --git a/src/silk/docs/std/args/page.md b/src/silk/docs/std/args/page.md index 84f6f680..07bad5ad 100644 --- a/src/silk/docs/std/args/page.md +++ b/src/silk/docs/std/args/page.md @@ -1,5 +1,5 @@ --- -layout: "silk-docs" +layout: "docs" title: "std::args" description: "A small native-argv helper surface is implemented in std/args.slk to make early programs ergonomic while string[] parameters and richer slice/iterator features are still future work." docsCollection: "silk" diff --git a/src/silk/docs/std/arrays/page.md b/src/silk/docs/std/arrays/page.md index efa815ba..24a42a55 100644 --- a/src/silk/docs/std/arrays/page.md +++ b/src/silk/docs/std/arrays/page.md @@ -1,5 +1,5 @@ --- -layout: "silk-docs" +layout: "docs" title: "std::arrays" description: "A generic Slice(T) view type is provided for early FFI-friendly bridging; higher-level owning containers live in std::vector." docsCollection: "silk" diff --git a/src/silk/docs/std/atomic/page.md b/src/silk/docs/std/atomic/page.md index 9fb310c3..f0bc2a78 100644 --- a/src/silk/docs/std/atomic/page.md +++ b/src/silk/docs/std/atomic/page.md @@ -1,5 +1,5 @@ --- -layout: "silk-docs" +layout: "docs" title: "std::atomic" description: "std::atomic provides the public Silk API for low-level atomic operations." docsCollection: "silk" diff --git a/src/silk/docs/std/bits/page.md b/src/silk/docs/std/bits/page.md index 7df91e0a..8a463b7d 100644 --- a/src/silk/docs/std/bits/page.md +++ b/src/silk/docs/std/bits/page.md @@ -1,5 +1,5 @@ --- -layout: "silk-docs" +layout: "docs" title: "std::bits" description: "A small bit-manipulation and byte-order helper subset is implemented in std/bits.slk for the current backend subset." docsCollection: "silk" diff --git a/src/silk/docs/std/boolean/page.md b/src/silk/docs/std/boolean/page.md index bcd98861..634890de 100644 --- a/src/silk/docs/std/boolean/page.md +++ b/src/silk/docs/std/boolean/page.md @@ -1,5 +1,5 @@ --- -layout: "silk-docs" +layout: "docs" title: "std::boolean" description: "std::boolean provides a no-allocation boxed wrapper around the built-in bool primitive for method-oriented APIs." docsCollection: "silk" diff --git a/src/silk/docs/std/boxed-values/page.md b/src/silk/docs/std/boxed-values/page.md index 36c4d477..9526d2b5 100644 --- a/src/silk/docs/std/boxed-values/page.md +++ b/src/silk/docs/std/boxed-values/page.md @@ -1,5 +1,5 @@ --- -layout: "silk-docs" +layout: "docs" title: "Boxed Value Types" description: "This document records the current design direction for boxed stdlib wrappers around language primitive values and primitive-adjacent built-ins." docsCollection: "silk" diff --git a/src/silk/docs/std/buffer/page.md b/src/silk/docs/std/buffer/page.md index 3098fbb5..431660dd 100644 --- a/src/silk/docs/std/buffer/page.md +++ b/src/silk/docs/std/buffer/page.md @@ -1,5 +1,5 @@ --- -layout: "silk-docs" +layout: "docs" title: "std::buffer" description: "std::buffer provides:" docsCollection: "silk" diff --git a/src/silk/docs/std/build/page.md b/src/silk/docs/std/build/page.md index e058ebc9..10a99763 100644 --- a/src/silk/docs/std/build/page.md +++ b/src/silk/docs/std/build/page.md @@ -1,5 +1,5 @@ --- -layout: "silk-docs" +layout: "docs" title: "std::build" description: "(manifest builder + step graph)." docsCollection: "silk" diff --git a/src/silk/docs/std/bytes/page.md b/src/silk/docs/std/bytes/page.md index 2e364b7f..18e23150 100644 --- a/src/silk/docs/std/bytes/page.md +++ b/src/silk/docs/std/bytes/page.md @@ -1,5 +1,5 @@ --- -layout: "silk-docs" +layout: "docs" title: "std::bytes" description: "std::bytes is the byte-oriented facade for allocation-free work over borrowed memory. It reuses std::arrays::ByteSlice as the concrete slice type and gives CLI/search/build tools short, stable names f" docsCollection: "silk" diff --git a/src/silk/docs/std/conventions/page.md b/src/silk/docs/std/conventions/page.md index ceac4405..402cd468 100644 --- a/src/silk/docs/std/conventions/page.md +++ b/src/silk/docs/std/conventions/page.md @@ -1,5 +1,5 @@ --- -layout: "silk-docs" +layout: "docs" title: "std:: Conventions" description: "This defines the intended conventions for the Silk standard library. New and refactored std:: APIs must follow this document; older surfaces may temporarily diverge but must be migrated as they are to" docsCollection: "silk" diff --git a/src/silk/docs/std/crypto-aead/page.md b/src/silk/docs/std/crypto-aead/page.md index 3120d320..81399939 100644 --- a/src/silk/docs/std/crypto-aead/page.md +++ b/src/silk/docs/std/crypto-aead/page.md @@ -1,5 +1,5 @@ --- -layout: "silk-docs" +layout: "docs" title: "std::crypto::aead" description: "Source: std/crypto/aead.slk" docsCollection: "silk" diff --git a/src/silk/docs/std/crypto-box/page.md b/src/silk/docs/std/crypto-box/page.md index 7c3743f9..0abd26f1 100644 --- a/src/silk/docs/std/crypto-box/page.md +++ b/src/silk/docs/std/crypto-box/page.md @@ -1,5 +1,5 @@ --- -layout: "silk-docs" +layout: "docs" title: "std::crypto::box" description: "Source: std/crypto/box.slk" docsCollection: "silk" diff --git a/src/silk/docs/std/crypto-hash/page.md b/src/silk/docs/std/crypto-hash/page.md index cc6e7262..7ba99136 100644 --- a/src/silk/docs/std/crypto-hash/page.md +++ b/src/silk/docs/std/crypto-hash/page.md @@ -1,5 +1,5 @@ --- -layout: "silk-docs" +layout: "docs" title: "std::crypto::hash" description: "Source: std/crypto/hash.slk" docsCollection: "silk" diff --git a/src/silk/docs/std/crypto-random/page.md b/src/silk/docs/std/crypto-random/page.md index 276c13a5..fbe372fe 100644 --- a/src/silk/docs/std/crypto-random/page.md +++ b/src/silk/docs/std/crypto-random/page.md @@ -1,5 +1,5 @@ --- -layout: "silk-docs" +layout: "docs" title: "std::crypto::random" description: "Source: std/crypto/random.slk" docsCollection: "silk" diff --git a/src/silk/docs/std/crypto-secretbox/page.md b/src/silk/docs/std/crypto-secretbox/page.md index 9192f3d2..24a613c4 100644 --- a/src/silk/docs/std/crypto-secretbox/page.md +++ b/src/silk/docs/std/crypto-secretbox/page.md @@ -1,5 +1,5 @@ --- -layout: "silk-docs" +layout: "docs" title: "std::crypto::secretbox" description: "Source: std/crypto/secretbox.slk" docsCollection: "silk" diff --git a/src/silk/docs/std/crypto-sign/page.md b/src/silk/docs/std/crypto-sign/page.md index 87897c9d..7977b8ce 100644 --- a/src/silk/docs/std/crypto-sign/page.md +++ b/src/silk/docs/std/crypto-sign/page.md @@ -1,5 +1,5 @@ --- -layout: "silk-docs" +layout: "docs" title: "std::crypto::sign" description: "Source: std/crypto/sign.slk" docsCollection: "silk" diff --git a/src/silk/docs/std/crypto/page.md b/src/silk/docs/std/crypto/page.md index a760cdb0..5d60a592 100644 --- a/src/silk/docs/std/crypto/page.md +++ b/src/silk/docs/std/crypto/page.md @@ -1,5 +1,5 @@ --- -layout: "silk-docs" +layout: "docs" title: "std::crypto" description: "std::crypto provides cryptographic primitives through a selectable security provider. The builtin provider uses target-matched built-in libsodium archives on the hosted POSIX baseline; the Apple platf" docsCollection: "silk" diff --git a/src/silk/docs/std/dylib/page.md b/src/silk/docs/std/dylib/page.md index 44bf7a82..95cbfb15 100644 --- a/src/silk/docs/std/dylib/page.md +++ b/src/silk/docs/std/dylib/page.md @@ -1,5 +1,5 @@ --- -layout: "silk-docs" +layout: "docs" title: "std::dylib" description: "std::dylib is the opt-in standard-library facade for loading dynamic libraries and resolving symbols at runtime." docsCollection: "silk" diff --git a/src/silk/docs/std/env/page.md b/src/silk/docs/std/env/page.md index c0cfdcc5..7c6c3b74 100644 --- a/src/silk/docs/std/env/page.md +++ b/src/silk/docs/std/env/page.md @@ -1,5 +1,5 @@ --- -layout: "silk-docs" +layout: "docs" title: "std::env" description: "std::env provides access to process environment variables." docsCollection: "silk" diff --git a/src/silk/docs/std/ffi-c/page.md b/src/silk/docs/std/ffi-c/page.md index e951d7ef..a8e82926 100644 --- a/src/silk/docs/std/ffi-c/page.md +++ b/src/silk/docs/std/ffi-c/page.md @@ -1,5 +1,5 @@ --- -layout: "silk-docs" +layout: "docs" title: "std::ffi::c (C FFI helpers)" description: "This module provides small, explicit helpers for interoperating with C APIs from Silk via ext declarations." docsCollection: "silk" diff --git a/src/silk/docs/std/ffi-c_owned/page.md b/src/silk/docs/std/ffi-c_owned/page.md index 0d4b8801..227b8521 100644 --- a/src/silk/docs/std/ffi-c_owned/page.md +++ b/src/silk/docs/std/ffi-c_owned/page.md @@ -1,5 +1,5 @@ --- -layout: "silk-docs" +layout: "docs" title: "std::ffi::c_owned" description: "Source: std/ffi/c_owned.slk" docsCollection: "silk" diff --git a/src/silk/docs/std/filesystem/page.md b/src/silk/docs/std/filesystem/page.md index 9cc6b07a..8a1accbb 100644 --- a/src/silk/docs/std/filesystem/page.md +++ b/src/silk/docs/std/filesystem/page.md @@ -1,5 +1,5 @@ --- -layout: "silk-docs" +layout: "docs" title: "std::fs" description: "std::fs provides a small hosted filesystem API backed by std::runtime::fs. It exposes low-level File handles, path/file metadata queries, whole-file helpers, directory iteration, and byte-oriented I/O" docsCollection: "silk" diff --git a/src/silk/docs/std/flag/page.md b/src/silk/docs/std/flag/page.md index b9e91806..ac7f866c 100644 --- a/src/silk/docs/std/flag/page.md +++ b/src/silk/docs/std/flag/page.md @@ -1,5 +1,5 @@ --- -layout: "silk-docs" +layout: "docs" title: "std::flag" description: "std::flag provides a small, robust command line argument parser modeled after Go’s flag package, but shaped to match std:: conventions (explicit Result(...) errors, no leaky out-params, and a clear se" docsCollection: "silk" diff --git a/src/silk/docs/std/fmt/page.md b/src/silk/docs/std/fmt/page.md index 09d5daa4..50bbb773 100644 --- a/src/silk/docs/std/fmt/page.md +++ b/src/silk/docs/std/fmt/page.md @@ -1,5 +1,5 @@ --- -layout: "silk-docs" +layout: "docs" title: "std::fmt" description: "The initial formatting engine is implemented in std/fmt.slk and is intentionally scoped to the current compiler/backend subset (no generics, no runtime interface dispatch)." docsCollection: "silk" diff --git a/src/silk/docs/std/formal/page.md b/src/silk/docs/std/formal/page.md index 6dd0a595..d2831d8b 100644 --- a/src/silk/docs/std/formal/page.md +++ b/src/silk/docs/std/formal/page.md @@ -1,5 +1,5 @@ --- -layout: "silk-docs" +layout: "docs" title: "std::formal" description: "This module provides the small, stable Formal Silk vocabulary that is broadly reusable across std:: and downstream verified code." docsCollection: "silk" diff --git a/src/silk/docs/std/fs-stream/page.md b/src/silk/docs/std/fs-stream/page.md index 3bfcddf9..14f3d9ee 100644 --- a/src/silk/docs/std/fs-stream/page.md +++ b/src/silk/docs/std/fs-stream/page.md @@ -1,5 +1,5 @@ --- -layout: "silk-docs" +layout: "docs" title: "std::fs::stream" description: "Source: std/fs/stream.slk" docsCollection: "silk" diff --git a/src/silk/docs/std/fs/page.md b/src/silk/docs/std/fs/page.md index de00c2a9..2c1904e9 100644 --- a/src/silk/docs/std/fs/page.md +++ b/src/silk/docs/std/fs/page.md @@ -1,5 +1,5 @@ --- -layout: "silk-docs" +layout: "docs" title: "std::fs" description: "This is the canonical module doc for std::fs." docsCollection: "silk" diff --git a/src/silk/docs/std/function/page.md b/src/silk/docs/std/function/page.md index 3926491b..845e1e3d 100644 --- a/src/silk/docs/std/function/page.md +++ b/src/silk/docs/std/function/page.md @@ -1,5 +1,5 @@ --- -layout: "silk-docs" +layout: "docs" title: "std::function" description: "std::function provides a boxed holder for first-class Silk function values." docsCollection: "silk" diff --git a/src/silk/docs/std/ggml/page.md b/src/silk/docs/std/ggml/page.md index bb8686af..cd61a9a1 100644 --- a/src/silk/docs/std/ggml/page.md +++ b/src/silk/docs/std/ggml/page.md @@ -1,5 +1,5 @@ --- -layout: "silk-docs" +layout: "docs" title: "std::ggml" description: "std::ggml exposes a small, ABI-safe Silk wrapper over a pinned subset of upstream ggml. The current module is intentionally narrow: it is meant to let Silk programs allocate ggml contexts, build basic" docsCollection: "silk" diff --git a/src/silk/docs/std/gpu-device/page.md b/src/silk/docs/std/gpu-device/page.md index 4e51927f..44357296 100644 --- a/src/silk/docs/std/gpu-device/page.md +++ b/src/silk/docs/std/gpu-device/page.md @@ -1,5 +1,5 @@ --- -layout: "silk-docs" +layout: "docs" title: "std::gpu::device" description: "std::gpu::device is the semantic operation surface available inside attr(device=gpu) function bodies. Unlike std::gpu::isa, its API is expressed in terms of kernel parameters and work-item behavior ra" docsCollection: "silk" diff --git a/src/silk/docs/std/gpu-isa/page.md b/src/silk/docs/std/gpu-isa/page.md index ee729046..f1b05f4a 100644 --- a/src/silk/docs/std/gpu-isa/page.md +++ b/src/silk/docs/std/gpu-isa/page.md @@ -1,5 +1,5 @@ --- -layout: "silk-docs" +layout: "docs" title: "std::gpu::isa" description: "std::gpu::isa is the typed Silk spelling of the initial dependency-light AMDGPU instruction subset. It exists for kernel bring-up while ordinary Silk expressions are connected to the general GPU selec" docsCollection: "silk" diff --git a/src/silk/docs/std/gpu/page.md b/src/silk/docs/std/gpu/page.md index c1e4b313..5617187c 100644 --- a/src/silk/docs/std/gpu/page.md +++ b/src/silk/docs/std/gpu/page.md @@ -1,5 +1,5 @@ --- -layout: "silk-docs" +layout: "docs" title: "std::gpu" description: "std::gpu is the public host-side API for pure-Silk GPU discovery, device memory, streams, kernel launch, and synchronization. GPU-v1 mixed Linux x86_64 executables use the provider recorded in their b" docsCollection: "silk" diff --git a/src/silk/docs/std/graphics-metal/page.md b/src/silk/docs/std/graphics-metal/page.md index 9853dc5e..87e2d9eb 100644 --- a/src/silk/docs/std/graphics-metal/page.md +++ b/src/silk/docs/std/graphics-metal/page.md @@ -1,5 +1,5 @@ --- -layout: "silk-docs" +layout: "docs" title: "std::graphics::metal" description: "Source: std/graphics/metal.slk" docsCollection: "silk" diff --git a/src/silk/docs/std/graphics-opengl/page.md b/src/silk/docs/std/graphics-opengl/page.md index 37b589a7..0a866fa9 100644 --- a/src/silk/docs/std/graphics-opengl/page.md +++ b/src/silk/docs/std/graphics-opengl/page.md @@ -1,5 +1,5 @@ --- -layout: "silk-docs" +layout: "docs" title: "std::graphics::opengl" description: "Source: std/graphics/opengl.slk" docsCollection: "silk" diff --git a/src/silk/docs/std/graphics-opengles/page.md b/src/silk/docs/std/graphics-opengles/page.md index 96e1d972..46d5cca7 100644 --- a/src/silk/docs/std/graphics-opengles/page.md +++ b/src/silk/docs/std/graphics-opengles/page.md @@ -1,5 +1,5 @@ --- -layout: "silk-docs" +layout: "docs" title: "std::graphics::opengles" description: "Source: std/graphics/opengles.slk" docsCollection: "silk" diff --git a/src/silk/docs/std/graphics-vulkan/page.md b/src/silk/docs/std/graphics-vulkan/page.md index f657d980..cba05b64 100644 --- a/src/silk/docs/std/graphics-vulkan/page.md +++ b/src/silk/docs/std/graphics-vulkan/page.md @@ -1,5 +1,5 @@ --- -layout: "silk-docs" +layout: "docs" title: "std::graphics::vulkan" description: "Source: std/graphics/vulkan.slk" docsCollection: "silk" diff --git a/src/silk/docs/std/graphics-window/page.md b/src/silk/docs/std/graphics-window/page.md index 96fccdfd..01ec077f 100644 --- a/src/silk/docs/std/graphics-window/page.md +++ b/src/silk/docs/std/graphics-window/page.md @@ -1,5 +1,5 @@ --- -layout: "silk-docs" +layout: "docs" title: "std::graphics::window" description: "Source: std/graphics/window.slk" docsCollection: "silk" diff --git a/src/silk/docs/std/graphics/page.md b/src/silk/docs/std/graphics/page.md index 69880fe1..b6043941 100644 --- a/src/silk/docs/std/graphics/page.md +++ b/src/silk/docs/std/graphics/page.md @@ -1,5 +1,5 @@ --- -layout: "silk-docs" +layout: "docs" title: "std::graphics — Graphics API Bindings" description: "std::graphics is a namespace for low-level, FFI-oriented bindings to common graphics APIs and platform-specific facades where a generated SDK registry is not available." docsCollection: "silk" diff --git a/src/silk/docs/std/http/page.md b/src/silk/docs/std/http/page.md index 833663c2..e944434f 100644 --- a/src/silk/docs/std/http/page.md +++ b/src/silk/docs/std/http/page.md @@ -1,5 +1,5 @@ --- -layout: "silk-docs" +layout: "docs" title: "std::http" description: "std::http provides HTTP/1.1 request/response parsing, a small blocking client/server connection API on top of std::net::TCPStream, and ergonomic URL/stream client helpers." docsCollection: "silk" diff --git a/src/silk/docs/std/https/page.md b/src/silk/docs/std/https/page.md index f65879f0..fddee54d 100644 --- a/src/silk/docs/std/https/page.md +++ b/src/silk/docs/std/https/page.md @@ -1,5 +1,5 @@ --- -layout: "silk-docs" +layout: "docs" title: "std::https" description: "std::https provides a small HTTPS client/server connection API on top of std::tls (currently the built-in mbedTLS provider) and std::net::TCPStream, plus URL and stream convenience helpers." docsCollection: "silk" diff --git a/src/silk/docs/std/idl-web/page.md b/src/silk/docs/std/idl-web/page.md index 4303b1ef..3712e611 100644 --- a/src/silk/docs/std/idl-web/page.md +++ b/src/silk/docs/std/idl-web/page.md @@ -1,5 +1,5 @@ --- -layout: "silk-docs" +layout: "docs" title: "Web IDL (std::idl::web)" description: "This module provides a Web IDL parser plus an ergonomic, query-oriented API for inspecting the parsed document." docsCollection: "silk" diff --git a/src/silk/docs/std/image-color/page.md b/src/silk/docs/std/image-color/page.md index c229aeb3..6b040d60 100644 --- a/src/silk/docs/std/image-color/page.md +++ b/src/silk/docs/std/image-color/page.md @@ -1,5 +1,5 @@ --- -layout: "silk-docs" +layout: "docs" title: "std::image::color" description: "Source: std/image/color.slk" docsCollection: "silk" diff --git a/src/silk/docs/std/image-jpeg/page.md b/src/silk/docs/std/image-jpeg/page.md index 06d766f8..7960490f 100644 --- a/src/silk/docs/std/image-jpeg/page.md +++ b/src/silk/docs/std/image-jpeg/page.md @@ -1,5 +1,5 @@ --- -layout: "silk-docs" +layout: "docs" title: "std::image::jpeg" description: "Source: std/image/jpeg.slk" docsCollection: "silk" diff --git a/src/silk/docs/std/image-png/page.md b/src/silk/docs/std/image-png/page.md index f8ec531e..9b9fa960 100644 --- a/src/silk/docs/std/image-png/page.md +++ b/src/silk/docs/std/image-png/page.md @@ -1,5 +1,5 @@ --- -layout: "silk-docs" +layout: "docs" title: "std::image::png" description: "Source: std/image/png.slk" docsCollection: "silk" diff --git a/src/silk/docs/std/image/page.md b/src/silk/docs/std/image/page.md index cb479408..9403f223 100644 --- a/src/silk/docs/std/image/page.md +++ b/src/silk/docs/std/image/page.md @@ -1,5 +1,5 @@ --- -layout: "silk-docs" +layout: "docs" title: "std::image — Image Codecs + Color" description: "std::image provides:" docsCollection: "silk" diff --git a/src/silk/docs/std/interfaces/page.md b/src/silk/docs/std/interfaces/page.md index 2c6ebbbc..38a425e6 100644 --- a/src/silk/docs/std/interfaces/page.md +++ b/src/silk/docs/std/interfaces/page.md @@ -1,5 +1,5 @@ --- -layout: "silk-docs" +layout: "docs" title: "std::interfaces" description: "This module defines small, non-generic standard-library interfaces (“protocols”) that can be used today to express common capabilities across std:: types." docsCollection: "silk" diff --git a/src/silk/docs/std/io-async/page.md b/src/silk/docs/std/io-async/page.md index 3bc12b54..7e7e3955 100644 --- a/src/silk/docs/std/io-async/page.md +++ b/src/silk/docs/std/io-async/page.md @@ -1,5 +1,5 @@ --- -layout: "silk-docs" +layout: "docs" title: "std::io::async" description: "Source: std/io/async.slk" docsCollection: "silk" diff --git a/src/silk/docs/std/io-stream/page.md b/src/silk/docs/std/io-stream/page.md index 1bcfbf73..03a48a3d 100644 --- a/src/silk/docs/std/io-stream/page.md +++ b/src/silk/docs/std/io-stream/page.md @@ -1,5 +1,5 @@ --- -layout: "silk-docs" +layout: "docs" title: "std::io::stream" description: "Source: std/io/stream.slk" docsCollection: "silk" diff --git a/src/silk/docs/std/io/page.md b/src/silk/docs/std/io/page.md index 54ab3e45..2c94eaf1 100644 --- a/src/silk/docs/std/io/page.md +++ b/src/silk/docs/std/io/page.md @@ -1,5 +1,5 @@ --- -layout: "silk-docs" +layout: "docs" title: "std::io" description: "Basic stdin reads, stdout/stderr writes, an fd-backed BufferedWriter, and a minimal std::io::async subset are implemented in std/io.slk via std::runtime::io." docsCollection: "silk" diff --git a/src/silk/docs/std/js-ecma/page.md b/src/silk/docs/std/js-ecma/page.md index 21af6afa..c65c97b7 100644 --- a/src/silk/docs/std/js-ecma/page.md +++ b/src/silk/docs/std/js-ecma/page.md @@ -1,5 +1,5 @@ --- -layout: "silk-docs" +layout: "docs" title: "ECMAScript FFI (std::js::ecma)" description: "This module defines a small, environment-agnostic interface for interacting with an ECMAScript engine from Silk." docsCollection: "silk" diff --git a/src/silk/docs/std/json/page.md b/src/silk/docs/std/json/page.md index b476a55d..535f26b9 100644 --- a/src/silk/docs/std/json/page.md +++ b/src/silk/docs/std/json/page.md @@ -1,5 +1,5 @@ --- -layout: "silk-docs" +layout: "docs" title: "std::json" description: "std::json provides an RFC 8259-style JSON parser plus deterministic JSON emission over an index-based DOM." docsCollection: "silk" diff --git a/src/silk/docs/std/limits/page.md b/src/silk/docs/std/limits/page.md index 237d9d8d..90d9c50a 100644 --- a/src/silk/docs/std/limits/page.md +++ b/src/silk/docs/std/limits/page.md @@ -1,5 +1,5 @@ --- -layout: "silk-docs" +layout: "docs" title: "std::limits" description: "This module provides shared numeric limits for Silk primitive types." docsCollection: "silk" diff --git a/src/silk/docs/std/list/page.md b/src/silk/docs/std/list/page.md index 0c895b1d..3dea475d 100644 --- a/src/silk/docs/std/list/page.md +++ b/src/silk/docs/std/list/page.md @@ -1,5 +1,5 @@ --- -layout: "silk-docs" +layout: "docs" title: "std::list" description: "This module provides list-shaped wrappers over the queue core from std::queue." docsCollection: "silk" diff --git a/src/silk/docs/std/map/page.md b/src/silk/docs/std/map/page.md index db396a1d..ada27524 100644 --- a/src/silk/docs/std/map/page.md +++ b/src/silk/docs/std/map/page.md @@ -1,5 +1,5 @@ --- -layout: "silk-docs" +layout: "docs" title: "std::map — Maps and Dictionaries" description: "std::map provides the standard associative container surfaces:" docsCollection: "silk" diff --git a/src/silk/docs/std/math-matrix/page.md b/src/silk/docs/std/math-matrix/page.md index d6341059..2c519f90 100644 --- a/src/silk/docs/std/math-matrix/page.md +++ b/src/silk/docs/std/math-matrix/page.md @@ -1,5 +1,5 @@ --- -layout: "silk-docs" +layout: "docs" title: "std::math::matrix" description: "Source: std/math/matrix.slk" docsCollection: "silk" diff --git a/src/silk/docs/std/math-vector/page.md b/src/silk/docs/std/math-vector/page.md index 66fbafa0..cbfa0b15 100644 --- a/src/silk/docs/std/math-vector/page.md +++ b/src/silk/docs/std/math-vector/page.md @@ -1,5 +1,5 @@ --- -layout: "silk-docs" +layout: "docs" title: "std::math::vector" description: "Source: std/math/vector.slk" docsCollection: "silk" diff --git a/src/silk/docs/std/math/page.md b/src/silk/docs/std/math/page.md index bec2b5af..cf40320e 100644 --- a/src/silk/docs/std/math/page.md +++ b/src/silk/docs/std/math/page.md @@ -1,5 +1,5 @@ --- -layout: "silk-docs" +layout: "docs" title: "std::math" description: "This module provides linear algebra utilities intended for graphics and general-purpose computation." docsCollection: "silk" diff --git a/src/silk/docs/std/memory/page.md b/src/silk/docs/std/memory/page.md index 0f31215e..19173ec9 100644 --- a/src/silk/docs/std/memory/page.md +++ b/src/silk/docs/std/memory/page.md @@ -1,5 +1,5 @@ --- -layout: "silk-docs" +layout: "docs" title: "std::memory" description: "This describes intended memory APIs; it is not implemented yet." docsCollection: "silk" diff --git a/src/silk/docs/std/mime/page.md b/src/silk/docs/std/mime/page.md index 293e0926..b92bab8a 100644 --- a/src/silk/docs/std/mime/page.md +++ b/src/silk/docs/std/mime/page.md @@ -1,5 +1,5 @@ --- -layout: "silk-docs" +layout: "docs" title: "std::mime" description: "std::mime maps file names, extensions, and content-type strings to MIME metadata suitable for HTTP responses, file indexing tools, and package publication helpers. Its shape is influenced by the local" docsCollection: "silk" diff --git a/src/silk/docs/std/module-catalog/page.md b/src/silk/docs/std/module-catalog/page.md index 42cbc12c..700c89ae 100644 --- a/src/silk/docs/std/module-catalog/page.md +++ b/src/silk/docs/std/module-catalog/page.md @@ -1,5 +1,5 @@ --- -layout: "silk-docs" +layout: "docs" title: "std:: Module Catalog" description: "This page is the canonical inventory of shipped modules under std/." docsCollection: "silk" diff --git a/src/silk/docs/std/net-stream/page.md b/src/silk/docs/std/net-stream/page.md index 5ebf4897..90a72fa4 100644 --- a/src/silk/docs/std/net-stream/page.md +++ b/src/silk/docs/std/net-stream/page.md @@ -1,5 +1,5 @@ --- -layout: "silk-docs" +layout: "docs" title: "std::net::stream" description: "Source: std/net/stream.slk" docsCollection: "silk" diff --git a/src/silk/docs/std/net/page.md b/src/silk/docs/std/net/page.md index 38ce4077..959aa701 100644 --- a/src/silk/docs/std/net/page.md +++ b/src/silk/docs/std/net/page.md @@ -1,5 +1,5 @@ --- -layout: "silk-docs" +layout: "docs" title: "std::net" description: "This is the canonical module doc for std::net." docsCollection: "silk" diff --git a/src/silk/docs/std/networking/page.md b/src/silk/docs/std/networking/page.md index 5d111e86..71f91d73 100644 --- a/src/silk/docs/std/networking/page.md +++ b/src/silk/docs/std/networking/page.md @@ -1,5 +1,5 @@ --- -layout: "silk-docs" +layout: "docs" title: "std::net" description: "A small endian/byte-order helper subset plus hosted IPv4/IPv6 TCP and IPv4/IPv6 UDP socket APIs are implemented in std/net.slk." docsCollection: "silk" diff --git a/src/silk/docs/std/number/page.md b/src/silk/docs/std/number/page.md index 0823bdad..c156a8e8 100644 --- a/src/silk/docs/std/number/page.md +++ b/src/silk/docs/std/number/page.md @@ -1,5 +1,5 @@ --- -layout: "silk-docs" +layout: "docs" title: "std::number" description: "This module provides small, dependency-light number parsing and formatting helpers, plus a boxed Number value type." docsCollection: "silk" diff --git a/src/silk/docs/std/optional/page.md b/src/silk/docs/std/optional/page.md index a841b738..1e23e14b 100644 --- a/src/silk/docs/std/optional/page.md +++ b/src/silk/docs/std/optional/page.md @@ -1,5 +1,5 @@ --- -layout: "silk-docs" +layout: "docs" title: "std::optional" description: "Optional(T) / T? is a language type, not a stdlib-defined enum. The compiler already provides the method-oriented combinator surface on optional values. std::optional exists as a stdlib namespace of f" docsCollection: "silk" diff --git a/src/silk/docs/std/os/page.md b/src/silk/docs/std/os/page.md index e50bbabf..02001f27 100644 --- a/src/silk/docs/std/os/page.md +++ b/src/silk/docs/std/os/page.md @@ -1,5 +1,5 @@ --- -layout: "silk-docs" +layout: "docs" title: "std::os" description: "std::os provides:" docsCollection: "silk" diff --git a/src/silk/docs/std/overview/page.md b/src/silk/docs/std/overview/page.md index 0b492374..d6bdab96 100644 --- a/src/silk/docs/std/overview/page.md +++ b/src/silk/docs/std/overview/page.md @@ -1,5 +1,5 @@ --- -layout: "silk-docs" +layout: "docs" title: "Standard Library Overview (std::)" description: "The docs/std/ directory specifies the intended API and structure. A minimal in-tree stdlib source tree also exists under std/ (used by the toolchain to satisfy import std::...;)." docsCollection: "silk" diff --git a/src/silk/docs/std/package-structure/page.md b/src/silk/docs/std/package-structure/page.md index 0b0aa532..1c64955e 100644 --- a/src/silk/docs/std/package-structure/page.md +++ b/src/silk/docs/std/package-structure/page.md @@ -1,5 +1,5 @@ --- -layout: "silk-docs" +layout: "docs" title: "std:: Module Structure" description: "This describes the intended organization and build integration for std::. A first, minimal slice of the build integration is implemented (auto-resolving std::... imports from a configurable stdlib roo" docsCollection: "silk" diff --git a/src/silk/docs/std/path/page.md b/src/silk/docs/std/path/page.md index 3c99e859..c2273bf7 100644 --- a/src/silk/docs/std/path/page.md +++ b/src/silk/docs/std/path/page.md @@ -1,5 +1,5 @@ --- -layout: "silk-docs" +layout: "docs" title: "std::path" description: "std::path provides path manipulation utilities, borrowed path views, and the owned PathBuf builder/buffer." docsCollection: "silk" diff --git a/src/silk/docs/std/process-child/page.md b/src/silk/docs/std/process-child/page.md index 22b79450..070d75d9 100644 --- a/src/silk/docs/std/process-child/page.md +++ b/src/silk/docs/std/process-child/page.md @@ -1,5 +1,5 @@ --- -layout: "silk-docs" +layout: "docs" title: "std::process::child" description: "Source: std/process/child.slk" docsCollection: "silk" diff --git a/src/silk/docs/std/process/page.md b/src/silk/docs/std/process/page.md index 1e859e2f..5c6de204 100644 --- a/src/silk/docs/std/process/page.md +++ b/src/silk/docs/std/process/page.md @@ -1,5 +1,5 @@ --- -layout: "silk-docs" +layout: "docs" title: "std::process" description: "(hosted POSIX baseline)." docsCollection: "silk" diff --git a/src/silk/docs/std/protobuf/page.md b/src/silk/docs/std/protobuf/page.md index f16c082d..51c0d98a 100644 --- a/src/silk/docs/std/protobuf/page.md +++ b/src/silk/docs/std/protobuf/page.md @@ -1,5 +1,5 @@ --- -layout: "silk-docs" +layout: "docs" title: "std::protobuf" description: "std::protobuf provides dependency-free Protocol Buffers binary wire helpers for Silk code and for modules generated by silk proto." docsCollection: "silk" diff --git a/src/silk/docs/std/queue/page.md b/src/silk/docs/std/queue/page.md index 13801e05..ac0a3a6b 100644 --- a/src/silk/docs/std/queue/page.md +++ b/src/silk/docs/std/queue/page.md @@ -1,5 +1,5 @@ --- -layout: "silk-docs" +layout: "docs" title: "std::queue" description: "This module provides queue-oriented containers built on a shared owning deque core." docsCollection: "silk" diff --git a/src/silk/docs/std/range/page.md b/src/silk/docs/std/range/page.md index 9cfaeaa4..7e443f61 100644 --- a/src/silk/docs/std/range/page.md +++ b/src/silk/docs/std/range/page.md @@ -1,5 +1,5 @@ --- -layout: "silk-docs" +layout: "docs" title: "std::range" description: "std::range provides a boxed, method-bearing representation of the built-in range primitive." docsCollection: "silk" diff --git a/src/silk/docs/std/readline/page.md b/src/silk/docs/std/readline/page.md index a450f0a6..a6de121e 100644 --- a/src/silk/docs/std/readline/page.md +++ b/src/silk/docs/std/readline/page.md @@ -1,5 +1,5 @@ --- -layout: "silk-docs" +layout: "docs" title: "std::readline" description: "std::readline provides a small, ergonomic readline-style API for reading a single line of user input with interactive editing and history when stdin is connected to a TTY." docsCollection: "silk" diff --git a/src/silk/docs/std/regex/page.md b/src/silk/docs/std/regex/page.md index 8e9dbef3..5c361386 100644 --- a/src/silk/docs/std/regex/page.md +++ b/src/silk/docs/std/regex/page.md @@ -1,5 +1,5 @@ --- -layout: "silk-docs" +layout: "docs" title: "std::regex" description: "This module provides regular expression helpers built on top of:" docsCollection: "silk" diff --git a/src/silk/docs/std/result/page.md b/src/silk/docs/std/result/page.md index 7f2b1ae3..7866f582 100644 --- a/src/silk/docs/std/result/page.md +++ b/src/silk/docs/std/result/page.md @@ -1,5 +1,5 @@ --- -layout: "silk-docs" +layout: "docs" title: "std::result" description: "The language’s error model is explicit and typed (errors). std::result standardizes the common “success or error” return shape so that APIs across std:: compose cleanly." docsCollection: "silk" diff --git a/src/silk/docs/std/runtime-atomic/page.md b/src/silk/docs/std/runtime-atomic/page.md index 8d7d0b08..f914a326 100644 --- a/src/silk/docs/std/runtime-atomic/page.md +++ b/src/silk/docs/std/runtime-atomic/page.md @@ -1,5 +1,5 @@ --- -layout: "silk-docs" +layout: "docs" title: "std::runtime::atomic" description: "std::runtime::atomic is the stdlib runtime interface used by std::atomic." docsCollection: "silk" diff --git a/src/silk/docs/std/runtime-build/page.md b/src/silk/docs/std/runtime-build/page.md index db6e33ec..c7e4a955 100644 --- a/src/silk/docs/std/runtime-build/page.md +++ b/src/silk/docs/std/runtime-build/page.md @@ -1,5 +1,5 @@ --- -layout: "silk-docs" +layout: "docs" title: "std::runtime::build" description: "Source: std/runtime/build.slk" docsCollection: "silk" diff --git a/src/silk/docs/std/runtime-dylib/page.md b/src/silk/docs/std/runtime-dylib/page.md index e1a5be75..f9c34432 100644 --- a/src/silk/docs/std/runtime-dylib/page.md +++ b/src/silk/docs/std/runtime-dylib/page.md @@ -1,5 +1,5 @@ --- -layout: "silk-docs" +layout: "docs" title: "std::runtime::dylib" description: "std::runtime::dylib is the runtime interface used by std::dylib." docsCollection: "silk" diff --git a/src/silk/docs/std/runtime-env/page.md b/src/silk/docs/std/runtime-env/page.md index 1a5ced73..15f30d15 100644 --- a/src/silk/docs/std/runtime-env/page.md +++ b/src/silk/docs/std/runtime-env/page.md @@ -1,5 +1,5 @@ --- -layout: "silk-docs" +layout: "docs" title: "std::runtime::env" description: "Source: std/runtime/env.slk" docsCollection: "silk" diff --git a/src/silk/docs/std/runtime-event_loop/page.md b/src/silk/docs/std/runtime-event_loop/page.md index 3b2336af..8dcd7f33 100644 --- a/src/silk/docs/std/runtime-event_loop/page.md +++ b/src/silk/docs/std/runtime-event_loop/page.md @@ -1,5 +1,5 @@ --- -layout: "silk-docs" +layout: "docs" title: "std::runtime::event_loop" description: "Source: std/runtime/event_loop.slk" docsCollection: "silk" diff --git a/src/silk/docs/std/runtime-fs/page.md b/src/silk/docs/std/runtime-fs/page.md index 524556e6..87c4044c 100644 --- a/src/silk/docs/std/runtime-fs/page.md +++ b/src/silk/docs/std/runtime-fs/page.md @@ -1,5 +1,5 @@ --- -layout: "silk-docs" +layout: "docs" title: "std::runtime::fs" description: "Source: std/runtime/fs.slk" docsCollection: "silk" diff --git a/src/silk/docs/std/runtime-globals/page.md b/src/silk/docs/std/runtime-globals/page.md index 0580207c..53182449 100644 --- a/src/silk/docs/std/runtime-globals/page.md +++ b/src/silk/docs/std/runtime-globals/page.md @@ -1,5 +1,5 @@ --- -layout: "silk-docs" +layout: "docs" title: "std::runtime::globals" description: "Source: std/runtime/globals.slk" docsCollection: "silk" diff --git a/src/silk/docs/std/runtime-gpu/page.md b/src/silk/docs/std/runtime-gpu/page.md index a8db6ccc..dd48223f 100644 --- a/src/silk/docs/std/runtime-gpu/page.md +++ b/src/silk/docs/std/runtime-gpu/page.md @@ -1,5 +1,5 @@ --- -layout: "silk-docs" +layout: "docs" title: "std::runtime::gpu" description: "std::runtime::gpu is the internal swappable runtime interface beneath std::gpu. It forwards to bundled silk_rt_gpu_* functions on the hosted Linux baseline and is not the preferred application import." docsCollection: "silk" diff --git a/src/silk/docs/std/runtime-graphics-metal/page.md b/src/silk/docs/std/runtime-graphics-metal/page.md index 4b355893..6c3b4ed2 100644 --- a/src/silk/docs/std/runtime-graphics-metal/page.md +++ b/src/silk/docs/std/runtime-graphics-metal/page.md @@ -1,5 +1,5 @@ --- -layout: "silk-docs" +layout: "docs" title: "std::runtime::graphics::metal" description: "std::runtime::graphics::metal is the low-level runtime boundary used by std::graphics::metal. It is not the application API; application code should import std::graphics::metal or std::graphics::windo" docsCollection: "silk" diff --git a/src/silk/docs/std/runtime-io/page.md b/src/silk/docs/std/runtime-io/page.md index cda58a53..4a262545 100644 --- a/src/silk/docs/std/runtime-io/page.md +++ b/src/silk/docs/std/runtime-io/page.md @@ -1,5 +1,5 @@ --- -layout: "silk-docs" +layout: "docs" title: "std::runtime::io" description: "Source: std/runtime/io.slk" docsCollection: "silk" diff --git a/src/silk/docs/std/runtime-linux-event_loop/page.md b/src/silk/docs/std/runtime-linux-event_loop/page.md index 0e7f28e5..ca1ee63a 100644 --- a/src/silk/docs/std/runtime-linux-event_loop/page.md +++ b/src/silk/docs/std/runtime-linux-event_loop/page.md @@ -1,5 +1,5 @@ --- -layout: "silk-docs" +layout: "docs" title: "std::runtime::linux::event_loop" description: "Source: std/runtime/linux/event_loop.slk" docsCollection: "silk" diff --git a/src/silk/docs/std/runtime-mem/page.md b/src/silk/docs/std/runtime-mem/page.md index 89953999..7456775d 100644 --- a/src/silk/docs/std/runtime-mem/page.md +++ b/src/silk/docs/std/runtime-mem/page.md @@ -1,5 +1,5 @@ --- -layout: "silk-docs" +layout: "docs" title: "std::runtime::mem" description: "Source: std/runtime/mem.slk" docsCollection: "silk" diff --git a/src/silk/docs/std/runtime-net/page.md b/src/silk/docs/std/runtime-net/page.md index 069da217..51481649 100644 --- a/src/silk/docs/std/runtime-net/page.md +++ b/src/silk/docs/std/runtime-net/page.md @@ -1,5 +1,5 @@ --- -layout: "silk-docs" +layout: "docs" title: "std::runtime::net" description: "Source: std/runtime/net.slk" docsCollection: "silk" diff --git a/src/silk/docs/std/runtime-number/page.md b/src/silk/docs/std/runtime-number/page.md index 7e0614c0..914f40a4 100644 --- a/src/silk/docs/std/runtime-number/page.md +++ b/src/silk/docs/std/runtime-number/page.md @@ -1,5 +1,5 @@ --- -layout: "silk-docs" +layout: "docs" title: "std::runtime::number" description: "Source: std/runtime/number.slk" docsCollection: "silk" diff --git a/src/silk/docs/std/runtime-posix-atomic/page.md b/src/silk/docs/std/runtime-posix-atomic/page.md index 983c626e..b512b72d 100644 --- a/src/silk/docs/std/runtime-posix-atomic/page.md +++ b/src/silk/docs/std/runtime-posix-atomic/page.md @@ -1,5 +1,5 @@ --- -layout: "silk-docs" +layout: "docs" title: "std::runtime::posix::atomic" description: "std::runtime::posix::atomic is the hosted POSIX implementation module for std::runtime::atomic." docsCollection: "silk" diff --git a/src/silk/docs/std/runtime-posix-dylib/page.md b/src/silk/docs/std/runtime-posix-dylib/page.md index 7cbe16c9..899d9f3e 100644 --- a/src/silk/docs/std/runtime-posix-dylib/page.md +++ b/src/silk/docs/std/runtime-posix-dylib/page.md @@ -1,5 +1,5 @@ --- -layout: "silk-docs" +layout: "docs" title: "std::runtime::posix::dylib" description: "std::runtime::posix::dylib is the hosted POSIX dynamic-loader backend for std::runtime::dylib." docsCollection: "silk" diff --git a/src/silk/docs/std/runtime-posix-env/page.md b/src/silk/docs/std/runtime-posix-env/page.md index 957de918..9a6c544c 100644 --- a/src/silk/docs/std/runtime-posix-env/page.md +++ b/src/silk/docs/std/runtime-posix-env/page.md @@ -1,5 +1,5 @@ --- -layout: "silk-docs" +layout: "docs" title: "std::runtime::posix::env" description: "Source: std/runtime/posix/env.slk" docsCollection: "silk" diff --git a/src/silk/docs/std/runtime-posix-event_loop/page.md b/src/silk/docs/std/runtime-posix-event_loop/page.md index 16da2e0b..8eff4607 100644 --- a/src/silk/docs/std/runtime-posix-event_loop/page.md +++ b/src/silk/docs/std/runtime-posix-event_loop/page.md @@ -1,5 +1,5 @@ --- -layout: "silk-docs" +layout: "docs" title: "std::runtime::posix::event_loop" description: "Source: std/runtime/posix/event_loop.slk" docsCollection: "silk" diff --git a/src/silk/docs/std/runtime-posix-fs/page.md b/src/silk/docs/std/runtime-posix-fs/page.md index 0ea1556a..9fe180ac 100644 --- a/src/silk/docs/std/runtime-posix-fs/page.md +++ b/src/silk/docs/std/runtime-posix-fs/page.md @@ -1,5 +1,5 @@ --- -layout: "silk-docs" +layout: "docs" title: "std::runtime::posix::fs" description: "Source: std/runtime/posix/fs.slk" docsCollection: "silk" diff --git a/src/silk/docs/std/runtime-posix-io/page.md b/src/silk/docs/std/runtime-posix-io/page.md index ab0703c8..79e482bf 100644 --- a/src/silk/docs/std/runtime-posix-io/page.md +++ b/src/silk/docs/std/runtime-posix-io/page.md @@ -1,5 +1,5 @@ --- -layout: "silk-docs" +layout: "docs" title: "std::runtime::posix::io" description: "Source: std/runtime/posix/io.slk" docsCollection: "silk" diff --git a/src/silk/docs/std/runtime-posix-mem/page.md b/src/silk/docs/std/runtime-posix-mem/page.md index b57b8db1..0f7d0204 100644 --- a/src/silk/docs/std/runtime-posix-mem/page.md +++ b/src/silk/docs/std/runtime-posix-mem/page.md @@ -1,5 +1,5 @@ --- -layout: "silk-docs" +layout: "docs" title: "std::runtime::posix::mem" description: "Source: std/runtime/posix/mem.slk" docsCollection: "silk" diff --git a/src/silk/docs/std/runtime-posix-net/page.md b/src/silk/docs/std/runtime-posix-net/page.md index fa580076..507e7eab 100644 --- a/src/silk/docs/std/runtime-posix-net/page.md +++ b/src/silk/docs/std/runtime-posix-net/page.md @@ -1,5 +1,5 @@ --- -layout: "silk-docs" +layout: "docs" title: "std::runtime::posix::net" description: "Source: std/runtime/posix/net.slk" docsCollection: "silk" diff --git a/src/silk/docs/std/runtime-posix-process/page.md b/src/silk/docs/std/runtime-posix-process/page.md index b5528414..52c67927 100644 --- a/src/silk/docs/std/runtime-posix-process/page.md +++ b/src/silk/docs/std/runtime-posix-process/page.md @@ -1,5 +1,5 @@ --- -layout: "silk-docs" +layout: "docs" title: "std::runtime::posix::process" description: "Source: std/runtime/posix/process.slk" docsCollection: "silk" diff --git a/src/silk/docs/std/runtime-posix-signal/page.md b/src/silk/docs/std/runtime-posix-signal/page.md index f0c1d536..55ec4c2a 100644 --- a/src/silk/docs/std/runtime-posix-signal/page.md +++ b/src/silk/docs/std/runtime-posix-signal/page.md @@ -1,5 +1,5 @@ --- -layout: "silk-docs" +layout: "docs" title: "std::runtime::posix::signal" description: "Source: std/runtime/posix/signal.slk" docsCollection: "silk" diff --git a/src/silk/docs/std/runtime-posix-sync/page.md b/src/silk/docs/std/runtime-posix-sync/page.md index 066b2686..fa196132 100644 --- a/src/silk/docs/std/runtime-posix-sync/page.md +++ b/src/silk/docs/std/runtime-posix-sync/page.md @@ -1,5 +1,5 @@ --- -layout: "silk-docs" +layout: "docs" title: "std::runtime::posix::sync" description: "Source: std/runtime/posix/sync.slk" docsCollection: "silk" diff --git a/src/silk/docs/std/runtime-posix-task/page.md b/src/silk/docs/std/runtime-posix-task/page.md index 516f7eeb..ef7c68f0 100644 --- a/src/silk/docs/std/runtime-posix-task/page.md +++ b/src/silk/docs/std/runtime-posix-task/page.md @@ -1,5 +1,5 @@ --- -layout: "silk-docs" +layout: "docs" title: "std::runtime::posix::task" description: "Source: std/runtime/posix/task.slk" docsCollection: "silk" diff --git a/src/silk/docs/std/runtime-posix-time/page.md b/src/silk/docs/std/runtime-posix-time/page.md index cfcae753..fa59d7ca 100644 --- a/src/silk/docs/std/runtime-posix-time/page.md +++ b/src/silk/docs/std/runtime-posix-time/page.md @@ -1,5 +1,5 @@ --- -layout: "silk-docs" +layout: "docs" title: "std::runtime::posix::time" description: "Source: std/runtime/posix/time.slk" docsCollection: "silk" diff --git a/src/silk/docs/std/runtime-process/page.md b/src/silk/docs/std/runtime-process/page.md index 2d6a469f..25612e39 100644 --- a/src/silk/docs/std/runtime-process/page.md +++ b/src/silk/docs/std/runtime-process/page.md @@ -1,5 +1,5 @@ --- -layout: "silk-docs" +layout: "docs" title: "std::runtime::process" description: "Source: std/runtime/process.slk" docsCollection: "silk" diff --git a/src/silk/docs/std/runtime-readline/page.md b/src/silk/docs/std/runtime-readline/page.md index 02a8fd05..e8fad17b 100644 --- a/src/silk/docs/std/runtime-readline/page.md +++ b/src/silk/docs/std/runtime-readline/page.md @@ -1,5 +1,5 @@ --- -layout: "silk-docs" +layout: "docs" title: "std::runtime::readline" description: "Source: std/runtime/readline.slk" docsCollection: "silk" diff --git a/src/silk/docs/std/runtime-regex/page.md b/src/silk/docs/std/runtime-regex/page.md index 25c0e403..5050fca6 100644 --- a/src/silk/docs/std/runtime-regex/page.md +++ b/src/silk/docs/std/runtime-regex/page.md @@ -1,5 +1,5 @@ --- -layout: "silk-docs" +layout: "docs" title: "std::runtime::regex" description: "Source: std/runtime/regex.slk" docsCollection: "silk" diff --git a/src/silk/docs/std/runtime-signal/page.md b/src/silk/docs/std/runtime-signal/page.md index 8199a03e..94331761 100644 --- a/src/silk/docs/std/runtime-signal/page.md +++ b/src/silk/docs/std/runtime-signal/page.md @@ -1,5 +1,5 @@ --- -layout: "silk-docs" +layout: "docs" title: "std::runtime::signal" description: "Source: std/runtime/signal.slk" docsCollection: "silk" diff --git a/src/silk/docs/std/runtime-sync/page.md b/src/silk/docs/std/runtime-sync/page.md index 88cd0fbc..6618734a 100644 --- a/src/silk/docs/std/runtime-sync/page.md +++ b/src/silk/docs/std/runtime-sync/page.md @@ -1,5 +1,5 @@ --- -layout: "silk-docs" +layout: "docs" title: "std::runtime::sync" description: "Source: std/runtime/sync.slk" docsCollection: "silk" diff --git a/src/silk/docs/std/runtime-task/page.md b/src/silk/docs/std/runtime-task/page.md index fd568648..35c12520 100644 --- a/src/silk/docs/std/runtime-task/page.md +++ b/src/silk/docs/std/runtime-task/page.md @@ -1,5 +1,5 @@ --- -layout: "silk-docs" +layout: "docs" title: "std::runtime::task" description: "Source: std/runtime/task.slk" docsCollection: "silk" diff --git a/src/silk/docs/std/runtime-time/page.md b/src/silk/docs/std/runtime-time/page.md index 87c98b99..ca8ae678 100644 --- a/src/silk/docs/std/runtime-time/page.md +++ b/src/silk/docs/std/runtime-time/page.md @@ -1,5 +1,5 @@ --- -layout: "silk-docs" +layout: "docs" title: "std::runtime::time" description: "Source: std/runtime/time.slk" docsCollection: "silk" diff --git a/src/silk/docs/std/runtime-unicode/page.md b/src/silk/docs/std/runtime-unicode/page.md index 9b06ec03..d9b109cb 100644 --- a/src/silk/docs/std/runtime-unicode/page.md +++ b/src/silk/docs/std/runtime-unicode/page.md @@ -1,5 +1,5 @@ --- -layout: "silk-docs" +layout: "docs" title: "std::runtime::unicode" description: "Source: std/runtime/unicode.slk" docsCollection: "silk" diff --git a/src/silk/docs/std/runtime-wasi-cwd/page.md b/src/silk/docs/std/runtime-wasi-cwd/page.md index 23948102..f4f3f6b6 100644 --- a/src/silk/docs/std/runtime-wasi-cwd/page.md +++ b/src/silk/docs/std/runtime-wasi-cwd/page.md @@ -1,5 +1,5 @@ --- -layout: "silk-docs" +layout: "docs" title: "std::runtime::wasi::cwd" description: "Source: std/runtime/wasi/cwd.slk" docsCollection: "silk" diff --git a/src/silk/docs/std/runtime-wasi-env/page.md b/src/silk/docs/std/runtime-wasi-env/page.md index 6021e4cc..aff0b49f 100644 --- a/src/silk/docs/std/runtime-wasi-env/page.md +++ b/src/silk/docs/std/runtime-wasi-env/page.md @@ -1,5 +1,5 @@ --- -layout: "silk-docs" +layout: "docs" title: "std::runtime::wasi::env" description: "Source: std/runtime/wasi/env.slk" docsCollection: "silk" diff --git a/src/silk/docs/std/runtime-wasi-event_loop/page.md b/src/silk/docs/std/runtime-wasi-event_loop/page.md index ac94a4eb..5392cd16 100644 --- a/src/silk/docs/std/runtime-wasi-event_loop/page.md +++ b/src/silk/docs/std/runtime-wasi-event_loop/page.md @@ -1,5 +1,5 @@ --- -layout: "silk-docs" +layout: "docs" title: "std::runtime::wasi::event_loop" description: "Source: std/runtime/wasi/event_loop.slk" docsCollection: "silk" diff --git a/src/silk/docs/std/runtime-wasi-fs/page.md b/src/silk/docs/std/runtime-wasi-fs/page.md index 5e1bbc18..4d14a0b7 100644 --- a/src/silk/docs/std/runtime-wasi-fs/page.md +++ b/src/silk/docs/std/runtime-wasi-fs/page.md @@ -1,5 +1,5 @@ --- -layout: "silk-docs" +layout: "docs" title: "std::runtime::wasi::fs" description: "Source: std/runtime/wasi/fs.slk" docsCollection: "silk" diff --git a/src/silk/docs/std/runtime-wasi-io/page.md b/src/silk/docs/std/runtime-wasi-io/page.md index 31fe5e98..89e66693 100644 --- a/src/silk/docs/std/runtime-wasi-io/page.md +++ b/src/silk/docs/std/runtime-wasi-io/page.md @@ -1,5 +1,5 @@ --- -layout: "silk-docs" +layout: "docs" title: "std::runtime::wasi::io" description: "Source: std/runtime/wasi/io.slk" docsCollection: "silk" diff --git a/src/silk/docs/std/runtime-wasi-mem/page.md b/src/silk/docs/std/runtime-wasi-mem/page.md index 93accce2..d7ee727a 100644 --- a/src/silk/docs/std/runtime-wasi-mem/page.md +++ b/src/silk/docs/std/runtime-wasi-mem/page.md @@ -1,5 +1,5 @@ --- -layout: "silk-docs" +layout: "docs" title: "std::runtime::wasi::mem" description: "Source: std/runtime/wasi/mem.slk" docsCollection: "silk" diff --git a/src/silk/docs/std/runtime-wasi-net/page.md b/src/silk/docs/std/runtime-wasi-net/page.md index 690925fa..294628a3 100644 --- a/src/silk/docs/std/runtime-wasi-net/page.md +++ b/src/silk/docs/std/runtime-wasi-net/page.md @@ -1,5 +1,5 @@ --- -layout: "silk-docs" +layout: "docs" title: "std::runtime::wasi::net" description: "Source: std/runtime/wasi/net.slk" docsCollection: "silk" diff --git a/src/silk/docs/std/runtime-wasi-preopen/page.md b/src/silk/docs/std/runtime-wasi-preopen/page.md index 8f274e0c..fabd1ae6 100644 --- a/src/silk/docs/std/runtime-wasi-preopen/page.md +++ b/src/silk/docs/std/runtime-wasi-preopen/page.md @@ -1,5 +1,5 @@ --- -layout: "silk-docs" +layout: "docs" title: "std::runtime::wasi::preopen" description: "Source: std/runtime/wasi/preopen.slk" docsCollection: "silk" diff --git a/src/silk/docs/std/runtime-wasi-process/page.md b/src/silk/docs/std/runtime-wasi-process/page.md index 0dd240aa..24ec40cd 100644 --- a/src/silk/docs/std/runtime-wasi-process/page.md +++ b/src/silk/docs/std/runtime-wasi-process/page.md @@ -1,5 +1,5 @@ --- -layout: "silk-docs" +layout: "docs" title: "std::runtime::wasi::process" description: "Source: std/runtime/wasi/process.slk" docsCollection: "silk" diff --git a/src/silk/docs/std/runtime-wasi-signal/page.md b/src/silk/docs/std/runtime-wasi-signal/page.md index 5c848b45..c7e79716 100644 --- a/src/silk/docs/std/runtime-wasi-signal/page.md +++ b/src/silk/docs/std/runtime-wasi-signal/page.md @@ -1,5 +1,5 @@ --- -layout: "silk-docs" +layout: "docs" title: "std::runtime::wasi::signal" description: "Source: std/runtime/wasi/signal.slk" docsCollection: "silk" diff --git a/src/silk/docs/std/runtime-wasi-sync/page.md b/src/silk/docs/std/runtime-wasi-sync/page.md index d9db5e5b..aa8a5a38 100644 --- a/src/silk/docs/std/runtime-wasi-sync/page.md +++ b/src/silk/docs/std/runtime-wasi-sync/page.md @@ -1,5 +1,5 @@ --- -layout: "silk-docs" +layout: "docs" title: "std::runtime::wasi::sync" description: "Source: std/runtime/wasi/sync.slk" docsCollection: "silk" diff --git a/src/silk/docs/std/runtime-wasi-task/page.md b/src/silk/docs/std/runtime-wasi-task/page.md index cd74499b..fc9a8aea 100644 --- a/src/silk/docs/std/runtime-wasi-task/page.md +++ b/src/silk/docs/std/runtime-wasi-task/page.md @@ -1,5 +1,5 @@ --- -layout: "silk-docs" +layout: "docs" title: "std::runtime::wasi::task" description: "Source: std/runtime/wasi/task.slk" docsCollection: "silk" diff --git a/src/silk/docs/std/runtime-wasi-time/page.md b/src/silk/docs/std/runtime-wasi-time/page.md index 1e1d6984..1f7cee6b 100644 --- a/src/silk/docs/std/runtime-wasi-time/page.md +++ b/src/silk/docs/std/runtime-wasi-time/page.md @@ -1,5 +1,5 @@ --- -layout: "silk-docs" +layout: "docs" title: "std::runtime::wasi::time" description: "Source: std/runtime/wasi/time.slk" docsCollection: "silk" diff --git a/src/silk/docs/std/runtime-window/page.md b/src/silk/docs/std/runtime-window/page.md index 4dedf26c..b78b860e 100644 --- a/src/silk/docs/std/runtime-window/page.md +++ b/src/silk/docs/std/runtime-window/page.md @@ -1,5 +1,5 @@ --- -layout: "silk-docs" +layout: "docs" title: "std::runtime::window" description: "std::runtime::window is the low-level runtime boundary used by std::window. It is not intended as the ergonomic application API; import std::window or a platform facade under std::window::* instead." docsCollection: "silk" diff --git a/src/silk/docs/std/runtime-z3/page.md b/src/silk/docs/std/runtime-z3/page.md index 4c2157c3..2599e327 100644 --- a/src/silk/docs/std/runtime-z3/page.md +++ b/src/silk/docs/std/runtime-z3/page.md @@ -1,5 +1,5 @@ --- -layout: "silk-docs" +layout: "docs" title: "std::runtime::z3" description: "Source: std/runtime/z3.slk" docsCollection: "silk" diff --git a/src/silk/docs/std/runtime/page.md b/src/silk/docs/std/runtime/page.md index 373c889c..3e341cde 100644 --- a/src/silk/docs/std/runtime/page.md +++ b/src/silk/docs/std/runtime/page.md @@ -1,5 +1,5 @@ --- -layout: "silk-docs" +layout: "docs" title: "std::runtime" description: "std::runtime defines a runtime interface layer that sits underneath the rest of the standard library." docsCollection: "silk" diff --git a/src/silk/docs/std/semver/page.md b/src/silk/docs/std/semver/page.md index 5e69d3b8..4a3f68b4 100644 --- a/src/silk/docs/std/semver/page.md +++ b/src/silk/docs/std/semver/page.md @@ -1,5 +1,5 @@ --- -layout: "silk-docs" +layout: "docs" title: "std::semver" description: "std::semver provides a SemVer 2.0.0 parser and precedence comparison." docsCollection: "silk" diff --git a/src/silk/docs/std/set/page.md b/src/silk/docs/std/set/page.md index a2617203..b951f261 100644 --- a/src/silk/docs/std/set/page.md +++ b/src/silk/docs/std/set/page.md @@ -1,5 +1,5 @@ --- -layout: "silk-docs" +layout: "docs" title: "std::set — Sets" description: "std::set provides standard set container surfaces:" docsCollection: "silk" diff --git a/src/silk/docs/std/signal/page.md b/src/silk/docs/std/signal/page.md index d51e47d8..67a905ad 100644 --- a/src/silk/docs/std/signal/page.md +++ b/src/silk/docs/std/signal/page.md @@ -1,5 +1,5 @@ --- -layout: "silk-docs" +layout: "docs" title: "std::signal" description: "std::signal provides a small, pollable signal-watching surface intended for terminal/TUI programs." docsCollection: "silk" diff --git a/src/silk/docs/std/sqlite/page.md b/src/silk/docs/std/sqlite/page.md index 09b97c88..d0178df9 100644 --- a/src/silk/docs/std/sqlite/page.md +++ b/src/silk/docs/std/sqlite/page.md @@ -1,5 +1,5 @@ --- -layout: "silk-docs" +layout: "docs" title: "std::sqlite" description: "std::sqlite provides SQLite database primitives for the hosted POSIX baseline. On supported hosted target layouts, silk build auto-links the built-in libsqlite3.a so outputs do not depend on a system " docsCollection: "silk" diff --git a/src/silk/docs/std/ssh/page.md b/src/silk/docs/std/ssh/page.md index 182a2843..cc9e6e95 100644 --- a/src/silk/docs/std/ssh/page.md +++ b/src/silk/docs/std/ssh/page.md @@ -1,5 +1,5 @@ --- -layout: "silk-docs" +layout: "docs" title: "std::ssh" description: "std::ssh is the ergonomic stdlib entrypoint for Silk's hosted SSH client surface. It forwards the current libssh2-backed implementation that lives in std::ssh2, so downstream code can import std::ssh " docsCollection: "silk" diff --git a/src/silk/docs/std/ssh2/page.md b/src/silk/docs/std/ssh2/page.md index 4fafac1d..22b77db4 100644 --- a/src/silk/docs/std/ssh2/page.md +++ b/src/silk/docs/std/ssh2/page.md @@ -1,5 +1,5 @@ --- -layout: "silk-docs" +layout: "docs" title: "std::ssh2" description: "std::ssh2 provides the current libssh2-backed SSH2 implementation for the hosted POSIX baseline. On supported hosted target layouts, silk build auto-links the built-in libssh2.a so outputs do not depe" docsCollection: "silk" diff --git a/src/silk/docs/std/stack/page.md b/src/silk/docs/std/stack/page.md index ab221ed0..0843e54e 100644 --- a/src/silk/docs/std/stack/page.md +++ b/src/silk/docs/std/stack/page.md @@ -1,5 +1,5 @@ --- -layout: "silk-docs" +layout: "docs" title: "std::stack" description: "This module provides stack-oriented wrappers over std::queue’s deque core." docsCollection: "silk" diff --git a/src/silk/docs/std/stream/page.md b/src/silk/docs/std/stream/page.md index 91644eda..33eee0d0 100644 --- a/src/silk/docs/std/stream/page.md +++ b/src/silk/docs/std/stream/page.md @@ -1,5 +1,5 @@ --- -layout: "silk-docs" +layout: "docs" title: "std::stream" description: "This module provides a Web Streams-inspired API for byte streams designed to work well with Silk’s async/task model." docsCollection: "silk" diff --git a/src/silk/docs/std/strings/page.md b/src/silk/docs/std/strings/page.md index 8c808639..0003d4f1 100644 --- a/src/silk/docs/std/strings/page.md +++ b/src/silk/docs/std/strings/page.md @@ -1,5 +1,5 @@ --- -layout: "silk-docs" +layout: "docs" title: "std::strings" description: "A small but growing subset is implemented in std/strings.slk to support early toolchain bring-up; the rest of this document describes the intended long-term API." docsCollection: "silk" diff --git a/src/silk/docs/std/sync/page.md b/src/silk/docs/std/sync/page.md index 36c0e773..24a34f07 100644 --- a/src/silk/docs/std/sync/page.md +++ b/src/silk/docs/std/sync/page.md @@ -1,5 +1,5 @@ --- -layout: "silk-docs" +layout: "docs" title: "std::sync" description: "This module provides a small hosted baseline for synchronization primitives used by the current task lowering on linux/x86_64." docsCollection: "silk" diff --git a/src/silk/docs/std/tar-async/page.md b/src/silk/docs/std/tar-async/page.md index 9abf707c..265b389b 100644 --- a/src/silk/docs/std/tar-async/page.md +++ b/src/silk/docs/std/tar-async/page.md @@ -1,5 +1,5 @@ --- -layout: "silk-docs" +layout: "docs" title: "std::tar::async" description: "Source: std/tar/async.slk" docsCollection: "silk" diff --git a/src/silk/docs/std/tar/page.md b/src/silk/docs/std/tar/page.md index 18cc2885..ff8c46f3 100644 --- a/src/silk/docs/std/tar/page.md +++ b/src/silk/docs/std/tar/page.md @@ -1,5 +1,5 @@ --- -layout: "silk-docs" +layout: "docs" title: "std::tar" description: "std::tar provides a portable, streaming tar reader/writer for building and inspecting tar archives without loading whole archives into memory." docsCollection: "silk" diff --git a/src/silk/docs/std/task/page.md b/src/silk/docs/std/task/page.md index 976a717b..14b51aff 100644 --- a/src/silk/docs/std/task/page.md +++ b/src/silk/docs/std/task/page.md @@ -1,5 +1,5 @@ --- -layout: "silk-docs" +layout: "docs" title: "std::task" description: "This module provides a small hosted baseline for task/runtime utilities on linux/x86_64." docsCollection: "silk" diff --git a/src/silk/docs/std/temporal/page.md b/src/silk/docs/std/temporal/page.md index 75f6c1b4..ee5ea94e 100644 --- a/src/silk/docs/std/temporal/page.md +++ b/src/silk/docs/std/temporal/page.md @@ -1,5 +1,5 @@ --- -layout: "silk-docs" +layout: "docs" title: "std::temporal" description: "A small, ergonomic subset is implemented in std/temporal.slk:" docsCollection: "silk" diff --git a/src/silk/docs/std/test/page.md b/src/silk/docs/std/test/page.md index 8206101b..87789f78 100644 --- a/src/silk/docs/std/test/page.md +++ b/src/silk/docs/std/test/page.md @@ -1,5 +1,5 @@ --- -layout: "silk-docs" +layout: "docs" title: "std::test" description: "This module provides test-only helpers that record test failures without aborting the process." docsCollection: "silk" diff --git a/src/silk/docs/std/time/page.md b/src/silk/docs/std/time/page.md index e478d252..fe8b72e5 100644 --- a/src/silk/docs/std/time/page.md +++ b/src/silk/docs/std/time/page.md @@ -1,5 +1,5 @@ --- -layout: "silk-docs" +layout: "docs" title: "std::time" description: "std::time is a small CLI-oriented facade over the broader std::temporal module. It exposes monotonic timing and basic duration helpers without requiring tools to import calendar/date functionality." docsCollection: "silk" diff --git a/src/silk/docs/std/tls/page.md b/src/silk/docs/std/tls/page.md index 959aca82..eda9b1ed 100644 --- a/src/silk/docs/std/tls/page.md +++ b/src/silk/docs/std/tls/page.md @@ -1,5 +1,5 @@ --- -layout: "silk-docs" +layout: "docs" title: "std::tls" description: "std::tls provides TLS client/server primitives for the hosted POSIX baseline using the built-in mbedTLS provider." docsCollection: "silk" diff --git a/src/silk/docs/std/toml/page.md b/src/silk/docs/std/toml/page.md index 2e55d540..31a6077c 100644 --- a/src/silk/docs/std/toml/page.md +++ b/src/silk/docs/std/toml/page.md @@ -1,5 +1,5 @@ --- -layout: "silk-docs" +layout: "docs" title: "std::toml" description: "std::toml provides a TOML v1.0-style parser plus deterministic emission over an index-based DOM." docsCollection: "silk" diff --git a/src/silk/docs/std/unicode/page.md b/src/silk/docs/std/unicode/page.md index fc467437..f5db55ce 100644 --- a/src/silk/docs/std/unicode/page.md +++ b/src/silk/docs/std/unicode/page.md @@ -1,5 +1,5 @@ --- -layout: "silk-docs" +layout: "docs" title: "std::unicode" description: "This module provides practical Unicode helpers focused on:" docsCollection: "silk" diff --git a/src/silk/docs/std/url/page.md b/src/silk/docs/std/url/page.md index 68e12867..ea011ad6 100644 --- a/src/silk/docs/std/url/page.md +++ b/src/silk/docs/std/url/page.md @@ -1,5 +1,5 @@ --- -layout: "silk-docs" +layout: "docs" title: "std::url" description: "std::url provides a WHATWG-URL-compatible URL parser and serializer plus URLSearchParams behavior (application/x-www-form-urlencoded)." docsCollection: "silk" diff --git a/src/silk/docs/std/uuid-random/page.md b/src/silk/docs/std/uuid-random/page.md index a1ae7fa3..f6baa2c0 100644 --- a/src/silk/docs/std/uuid-random/page.md +++ b/src/silk/docs/std/uuid-random/page.md @@ -1,5 +1,5 @@ --- -layout: "silk-docs" +layout: "docs" title: "std::uuid::random" description: "Source: std/uuid/random.slk" docsCollection: "silk" diff --git a/src/silk/docs/std/uuid/page.md b/src/silk/docs/std/uuid/page.md index da4adbd6..cfc1f5e2 100644 --- a/src/silk/docs/std/uuid/page.md +++ b/src/silk/docs/std/uuid/page.md @@ -1,5 +1,5 @@ --- -layout: "silk-docs" +layout: "docs" title: "std::uuid" description: "std::uuid provides a robust UUID/ULID-like identifier primitive with full support for UUID versions 1, 3, 4, 5, 6, 7, and 8 (RFC 4122 + RFC 9562 family)." docsCollection: "silk" diff --git a/src/silk/docs/std/vector/page.md b/src/silk/docs/std/vector/page.md index a9ae55ad..db7d2ea5 100644 --- a/src/silk/docs/std/vector/page.md +++ b/src/silk/docs/std/vector/page.md @@ -1,5 +1,5 @@ --- -layout: "silk-docs" +layout: "docs" title: "std::vector" description: "This module provides a generic, growable vector type Vector(T) used broadly across std::." docsCollection: "silk" diff --git a/src/silk/docs/std/wasm/page.md b/src/silk/docs/std/wasm/page.md index 6ceeccf5..2d24184f 100644 --- a/src/silk/docs/std/wasm/page.md +++ b/src/silk/docs/std/wasm/page.md @@ -1,5 +1,5 @@ --- -layout: "silk-docs" +layout: "docs" title: "WebAssembly Runtime (std::wasm)" description: "std::wasm is the standard library surface for executing WebAssembly (WASM) modules from Silk." docsCollection: "silk" diff --git a/src/silk/docs/std/websocket/page.md b/src/silk/docs/std/websocket/page.md index 6ebb4a10..9771c633 100644 --- a/src/silk/docs/std/websocket/page.md +++ b/src/silk/docs/std/websocket/page.md @@ -1,5 +1,5 @@ --- -layout: "silk-docs" +layout: "docs" title: "std::websocket" description: "std::websocket provides an RFC 6455 WebSocket implementation on top of std::net::TCPStream (client + server handshake, framing, ping/pong, close, fragmentation)." docsCollection: "silk" diff --git a/src/silk/docs/std/window-gtk/page.md b/src/silk/docs/std/window-gtk/page.md index 04f72837..ae7d49ae 100644 --- a/src/silk/docs/std/window-gtk/page.md +++ b/src/silk/docs/std/window-gtk/page.md @@ -1,5 +1,5 @@ --- -layout: "silk-docs" +layout: "docs" title: "std::window::gtk" description: "std::window::gtk is the GTK-specific facade for applications that want to select the Linux GTK provider explicitly while still using the portable std::window types." docsCollection: "silk" diff --git a/src/silk/docs/std/window-ios/page.md b/src/silk/docs/std/window-ios/page.md index a42d6d97..06e8e8aa 100644 --- a/src/silk/docs/std/window-ios/page.md +++ b/src/silk/docs/std/window-ios/page.md @@ -1,5 +1,5 @@ --- -layout: "silk-docs" +layout: "docs" title: "std::window::ios" description: "std::window::ios is the iOS-specific facade for applications that want to select the iOS provider explicitly while still using the portable std::window types." docsCollection: "silk" diff --git a/src/silk/docs/std/window-macos/page.md b/src/silk/docs/std/window-macos/page.md index 4cd6ffd1..52e30c60 100644 --- a/src/silk/docs/std/window-macos/page.md +++ b/src/silk/docs/std/window-macos/page.md @@ -1,5 +1,5 @@ --- -layout: "silk-docs" +layout: "docs" title: "std::window::macos" description: "std::window::macos is the macOS-specific facade for applications that want to select the macOS provider explicitly while still using the portable std::window types." docsCollection: "silk" diff --git a/src/silk/docs/std/window/page.md b/src/silk/docs/std/window/page.md index bdcf95af..f5d4745f 100644 --- a/src/silk/docs/std/window/page.md +++ b/src/silk/docs/std/window/page.md @@ -1,5 +1,5 @@ --- -layout: "silk-docs" +layout: "docs" title: "std::window" description: "std::window is the opt-in standard-library windowing facade. Importing and reaching this module's runtime calls is the signal that an executable wants platform window support; unrelated std:: users do" docsCollection: "silk" diff --git a/src/silk/docs/std/xml/page.md b/src/silk/docs/std/xml/page.md index cb28d5ad..d6010984 100644 --- a/src/silk/docs/std/xml/page.md +++ b/src/silk/docs/std/xml/page.md @@ -1,5 +1,5 @@ --- -layout: "silk-docs" +layout: "docs" title: "std::xml — XML Parsing (libxml2)" description: "std::xml provides a small, DOM-style XML parsing and traversal API backed by libxml2." docsCollection: "silk" diff --git a/src/silk/docs/std/z3/page.md b/src/silk/docs/std/z3/page.md index 181c2654..e8f0163a 100644 --- a/src/silk/docs/std/z3/page.md +++ b/src/silk/docs/std/z3/page.md @@ -1,5 +1,5 @@ --- -layout: "silk-docs" +layout: "docs" title: "std::runtime::z3 — Z3 SMT Solver (C API Bindings)" description: "std::runtime::z3 provides low-level ext bindings for the Z3 C API. It is intended for user-space programs that want to call into Z3 directly." docsCollection: "silk" diff --git a/src/silk/docs/usage/cli-examples/page.md b/src/silk/docs/usage/cli-examples/page.md index d2537691..a7ae3c72 100644 --- a/src/silk/docs/usage/cli-examples/page.md +++ b/src/silk/docs/usage/cli-examples/page.md @@ -1,5 +1,5 @@ --- -layout: "silk-docs" +layout: "docs" title: "CLI usage examples" description: "This page is a grab bag of practical workflows for the silk toolchain. It focuses on how people actually use the CLI: quick feedback (check), tests that integrate with CI (test), and explicit build ou" docsCollection: "silk" diff --git a/src/silk/docs/usage/editor-coc-nvim/page.md b/src/silk/docs/usage/editor-coc-nvim/page.md index 1865380a..ff7012c2 100644 --- a/src/silk/docs/usage/editor-coc-nvim/page.md +++ b/src/silk/docs/usage/editor-coc-nvim/page.md @@ -1,5 +1,5 @@ --- -layout: "silk-docs" +layout: "docs" title: "coc.nvim Integration for Silk" description: "This page describes the coc.nvim client for the silk-lsp language server." docsCollection: "silk" diff --git a/src/silk/docs/usage/editor-ctags/page.md b/src/silk/docs/usage/editor-ctags/page.md index a8255695..963b2f4b 100644 --- a/src/silk/docs/usage/editor-ctags/page.md +++ b/src/silk/docs/usage/editor-ctags/page.md @@ -1,5 +1,5 @@ --- -layout: "silk-docs" +layout: "docs" title: "Universal Ctags Support" description: "The Silk compiler repository ships a Universal Ctags configuration for Silk at its root (.ctags)." docsCollection: "silk" diff --git a/src/silk/docs/usage/editor-textmate/page.md b/src/silk/docs/usage/editor-textmate/page.md index 8f1f554b..e787c745 100644 --- a/src/silk/docs/usage/editor-textmate/page.md +++ b/src/silk/docs/usage/editor-textmate/page.md @@ -1,5 +1,5 @@ --- -layout: "silk-docs" +layout: "docs" title: "TextMate Grammar (tmLanguage)" description: "The Silk compiler repository ships a TextMate grammar for Silk under textmate/silk.tmLanguage.json. It provides syntax highlighting for editors that consume tmLanguage grammars (TextMate, VS Code, Sub" docsCollection: "silk" diff --git a/src/silk/docs/usage/editor-vim/page.md b/src/silk/docs/usage/editor-vim/page.md index c5365c83..2976c4ee 100644 --- a/src/silk/docs/usage/editor-vim/page.md +++ b/src/silk/docs/usage/editor-vim/page.md @@ -1,5 +1,5 @@ --- -layout: "silk-docs" +layout: "docs" title: "Vim Integration for Silk" description: "This document describes the built-in Vim support for Silk shipped with the Silk compiler repository." docsCollection: "silk" diff --git a/src/silk/docs/usage/getting-started/page.md b/src/silk/docs/usage/getting-started/page.md index a6adf1c8..af468aa2 100644 --- a/src/silk/docs/usage/getting-started/page.md +++ b/src/silk/docs/usage/getting-started/page.md @@ -1,5 +1,5 @@ --- -layout: "silk-docs" +layout: "docs" title: "Getting started" description: "This page gets you from “a file” to “a runnable program”, and points you at the docs you’ll use most often." docsCollection: "silk" diff --git a/src/silk/docs/usage/github-actions/page.md b/src/silk/docs/usage/github-actions/page.md index dccc99ab..a7ebdca3 100644 --- a/src/silk/docs/usage/github-actions/page.md +++ b/src/silk/docs/usage/github-actions/page.md @@ -1,5 +1,5 @@ --- -layout: "silk-docs" +layout: "docs" title: "GitHub Actions: Install Released silk" description: "This guide shows how to install the released Silk CLI in another GitHub Actions workflow without rebuilding the compiler from source." docsCollection: "silk" diff --git a/src/silk/docs/usage/github-linguist/page.md b/src/silk/docs/usage/github-linguist/page.md index ddfad785..5c5e0576 100644 --- a/src/silk/docs/usage/github-linguist/page.md +++ b/src/silk/docs/usage/github-linguist/page.md @@ -1,5 +1,5 @@ --- -layout: "silk-docs" +layout: "docs" title: "GitHub Linguist Support" description: "The Silk compiler repository includes a .gitattributes entry that tags *.slk files as Silk sources for GitHub Linguist." docsCollection: "silk" diff --git a/src/silk/docs/usage/guide-examples/page.md b/src/silk/docs/usage/guide-examples/page.md index 4cbf9e44..f5c91dac 100644 --- a/src/silk/docs/usage/guide-examples/page.md +++ b/src/silk/docs/usage/guide-examples/page.md @@ -1,5 +1,5 @@ --- -layout: "silk-docs" +layout: "docs" title: "silk guide" description: "silk guide is the curated example discovery surface for common Silk tasks." docsCollection: "silk" diff --git a/src/silk/docs/usage/howto-custom-stdlib-root/page.md b/src/silk/docs/usage/howto-custom-stdlib-root/page.md index 718e9f1f..510e435f 100644 --- a/src/silk/docs/usage/howto-custom-stdlib-root/page.md +++ b/src/silk/docs/usage/howto-custom-stdlib-root/page.md @@ -1,5 +1,5 @@ --- -layout: "silk-docs" +layout: "docs" title: "How-To: Use a Custom Stdlib Root (and Runtime)" description: "The std::... modules are loaded from a stdlib root (a directory containing a std/ tree). Because std::runtime is part of that source tree, selecting a different stdlib root is also how you select a di" docsCollection: "silk" diff --git a/src/silk/docs/usage/howto-dynamic-libraries/page.md b/src/silk/docs/usage/howto-dynamic-libraries/page.md index 630b771f..73924f5e 100644 --- a/src/silk/docs/usage/howto-dynamic-libraries/page.md +++ b/src/silk/docs/usage/howto-dynamic-libraries/page.md @@ -1,5 +1,5 @@ --- -layout: "silk-docs" +layout: "docs" title: "How To Load Dynamic Libraries" description: "This guide shows how to load a dynamic library at runtime, resolve a symbol, convert it to a typed C function pointer, and call it from Silk." docsCollection: "silk" diff --git a/src/silk/docs/usage/howto-lumen-trail/page.md b/src/silk/docs/usage/howto-lumen-trail/page.md index 96cb89ab..bced37eb 100644 --- a/src/silk/docs/usage/howto-lumen-trail/page.md +++ b/src/silk/docs/usage/howto-lumen-trail/page.md @@ -1,5 +1,5 @@ --- -layout: "silk-docs" +layout: "docs" title: "Build LumenTrail, an iOS Objective-C App With Silk Stdlib Code" description: "This how-to uses examples/projects/lumen-trail/ to show the current iOS embedding flow on Apple Silicon macOS through the LumenTrail simulator app:" docsCollection: "silk" diff --git a/src/silk/docs/usage/howto-run-wasi-node/page.md b/src/silk/docs/usage/howto-run-wasi-node/page.md index 60125d05..1a5df9a9 100644 --- a/src/silk/docs/usage/howto-run-wasi-node/page.md +++ b/src/silk/docs/usage/howto-run-wasi-node/page.md @@ -1,5 +1,5 @@ --- -layout: "silk-docs" +layout: "docs" title: "How-To: Run wasm32-wasi Output in Node.js" description: "This guide shows how to:" docsCollection: "silk" diff --git a/src/silk/docs/usage/pure-silk-gpu-ml/page.md b/src/silk/docs/usage/pure-silk-gpu-ml/page.md index ca315c59..f7592536 100644 --- a/src/silk/docs/usage/pure-silk-gpu-ml/page.md +++ b/src/silk/docs/usage/pure-silk-gpu-ml/page.md @@ -1,5 +1,5 @@ --- -layout: "silk-docs" +layout: "docs" title: "Pure-Silk learned-threshold GPU classifier" description: "examples/pure_silk_gpu_ml.slk is a small but real supervised-learning workflow. It uses a one-dimensional nearest-centroid model:" docsCollection: "silk" diff --git a/src/silk/docs/usage/pure-silk-gpu/page.md b/src/silk/docs/usage/pure-silk-gpu/page.md index 95c97ca5..eac726b8 100644 --- a/src/silk/docs/usage/pure-silk-gpu/page.md +++ b/src/silk/docs/usage/pure-silk-gpu/page.md @@ -1,5 +1,5 @@ --- -layout: "silk-docs" +layout: "docs" title: "Pure-Silk CPU/GPU program" description: "The following workflow keeps application code entirely in Silk. main and ordinary functions compile for the host CPU; attr(device=gpu) functions are compiled into target GPU artifacts embedded in the " docsCollection: "silk" diff --git a/src/silk/docs/usage/tutorials/01-first-program/page.md b/src/silk/docs/usage/tutorials/01-first-program/page.md index 5e0b67c0..e6e7af94 100644 --- a/src/silk/docs/usage/tutorials/01-first-program/page.md +++ b/src/silk/docs/usage/tutorials/01-first-program/page.md @@ -1,5 +1,5 @@ --- -layout: "silk-docs" +layout: "docs" title: "Tutorial 1: your first program" description: "This tutorial gets you from “a file” to “a runnable program” with the smallest useful workflow:" docsCollection: "silk" diff --git a/src/silk/docs/usage/tutorials/02-structs-and-impls/page.md b/src/silk/docs/usage/tutorials/02-structs-and-impls/page.md index 3723f114..f4796778 100644 --- a/src/silk/docs/usage/tutorials/02-structs-and-impls/page.md +++ b/src/silk/docs/usage/tutorials/02-structs-and-impls/page.md @@ -1,5 +1,5 @@ --- -layout: "silk-docs" +layout: "docs" title: "Tutorial 2: structs and impl" description: "This tutorial covers:" docsCollection: "silk" diff --git a/src/silk/docs/usage/tutorials/03-arrays-and-slices/page.md b/src/silk/docs/usage/tutorials/03-arrays-and-slices/page.md index 620cafd2..6ded24f5 100644 --- a/src/silk/docs/usage/tutorials/03-arrays-and-slices/page.md +++ b/src/silk/docs/usage/tutorials/03-arrays-and-slices/page.md @@ -1,5 +1,5 @@ --- -layout: "silk-docs" +layout: "docs" title: "Tutorial 3: Arrays and Slices" description: "This tutorial covers:" docsCollection: "silk" diff --git a/src/silk/docs/usage/tutorials/04-filesystem/page.md b/src/silk/docs/usage/tutorials/04-filesystem/page.md index 9efaf67a..cffefa9e 100644 --- a/src/silk/docs/usage/tutorials/04-filesystem/page.md +++ b/src/silk/docs/usage/tutorials/04-filesystem/page.md @@ -1,5 +1,5 @@ --- -layout: "silk-docs" +layout: "docs" title: "Tutorial 4: filesystem basics (std::fs)" description: "This tutorial demonstrates a very common “systems script” pattern:" docsCollection: "silk" diff --git a/src/silk/docs/usage/tutorials/05-concurrency/page.md b/src/silk/docs/usage/tutorials/05-concurrency/page.md index a067bee1..23de4189 100644 --- a/src/silk/docs/usage/tutorials/05-concurrency/page.md +++ b/src/silk/docs/usage/tutorials/05-concurrency/page.md @@ -1,5 +1,5 @@ --- -layout: "silk-docs" +layout: "docs" title: "Tutorial 5: concurrency basics (async, task, yield, await)" description: "Silk’s concurrency model is built from two orthogonal modifiers:" docsCollection: "silk" diff --git a/src/silk/docs/usage/tutorials/06-async-io-streams-abort/page.md b/src/silk/docs/usage/tutorials/06-async-io-streams-abort/page.md index 801913a3..69f0abda 100644 --- a/src/silk/docs/usage/tutorials/06-async-io-streams-abort/page.md +++ b/src/silk/docs/usage/tutorials/06-async-io-streams-abort/page.md @@ -1,5 +1,5 @@ --- -layout: "silk-docs" +layout: "docs" title: "Tutorial 6: Async I/O + Streams + Abort Signals" description: "This tutorial shows how to compose the current concurrency + stdlib building blocks into practical I/O pipelines:" docsCollection: "silk" diff --git a/src/silk/docs/usage/tutorials/07-formal-silk/page.md b/src/silk/docs/usage/tutorials/07-formal-silk/page.md index ac827ce6..74d68d45 100644 --- a/src/silk/docs/usage/tutorials/07-formal-silk/page.md +++ b/src/silk/docs/usage/tutorials/07-formal-silk/page.md @@ -1,5 +1,5 @@ --- -layout: "silk-docs" +layout: "docs" title: "Tutorial 7: Formal Silk in real code" description: "This tutorial shows how Formal Silk fits into ordinary systems code:" docsCollection: "silk" diff --git a/src/silk/wiki/language/borrow-checker/page.md b/src/silk/wiki/language/borrow-checker/page.md index a5497b98..23f99e2e 100644 --- a/src/silk/wiki/language/borrow-checker/page.md +++ b/src/silk/wiki/language/borrow-checker/page.md @@ -1,5 +1,5 @@ --- -layout: "silkWiki-docs" +layout: "docs" title: "Borrow checker (design)" description: "Silk’s long-term design includes a borrow-checker-style static safety layer over references and mutation. Silk currently enforces a simpler, explicit mut borrow contract (see mutability)." docsCollection: "silkWiki" diff --git a/src/silk/wiki/language/buffers/page.md b/src/silk/wiki/language/buffers/page.md index 7ae2bb08..bbb0cd71 100644 --- a/src/silk/wiki/language/buffers/page.md +++ b/src/silk/wiki/language/buffers/page.md @@ -1,5 +1,5 @@ --- -layout: "silkWiki-docs" +layout: "docs" title: "Buffers (Buffer(T)) (design)" description: "The long-term design includes an intrinsic Buffer(T) type for low-level, unsafe contiguous memory access, intended to sit underneath safe collections." docsCollection: "silkWiki" diff --git a/src/silk/wiki/language/cheat-sheet/page.md b/src/silk/wiki/language/cheat-sheet/page.md index cf1542c7..3a8871ca 100644 --- a/src/silk/wiki/language/cheat-sheet/page.md +++ b/src/silk/wiki/language/cheat-sheet/page.md @@ -1,5 +1,5 @@ --- -layout: "silkWiki-docs" +layout: "docs" title: "Cheat sheet" description: "If you want a fast, high-signal overview of Silk surface syntax, start with the canonical cheat sheet:" docsCollection: "silkWiki" diff --git a/src/silk/wiki/language/concurrency/page.md b/src/silk/wiki/language/concurrency/page.md index c500a3bb..d9ff9c31 100644 --- a/src/silk/wiki/language/concurrency/page.md +++ b/src/silk/wiki/language/concurrency/page.md @@ -1,5 +1,5 @@ --- -layout: "silkWiki-docs" +layout: "docs" title: "Concurrency (async, task, await, yield)" description: "Silk concurrency is built around:" docsCollection: "silkWiki" diff --git a/src/silk/wiki/language/const-functions/page.md b/src/silk/wiki/language/const-functions/page.md index b5e9bc6a..eb8e6c94 100644 --- a/src/silk/wiki/language/const-functions/page.md +++ b/src/silk/wiki/language/const-functions/page.md @@ -1,5 +1,5 @@ --- -layout: "silkWiki-docs" +layout: "docs" title: "Const Functions (const fn)" description: "const fn marks a function as eligible for compile-time evaluation." docsCollection: "silkWiki" diff --git a/src/silk/wiki/language/conventions/page.md b/src/silk/wiki/language/conventions/page.md index 359436b2..0f3ce3e2 100644 --- a/src/silk/wiki/language/conventions/page.md +++ b/src/silk/wiki/language/conventions/page.md @@ -1,5 +1,5 @@ --- -layout: "silkWiki-docs" +layout: "docs" title: "Conventions" description: "This page summarizes the conventions used throughout the Silk language docs: notation, naming, and the “implementation status” pattern." docsCollection: "silkWiki" diff --git a/src/silk/wiki/language/dependent-types/page.md b/src/silk/wiki/language/dependent-types/page.md index f98e5f05..1ce6ccc4 100644 --- a/src/silk/wiki/language/dependent-types/page.md +++ b/src/silk/wiki/language/dependent-types/page.md @@ -1,5 +1,5 @@ --- -layout: "silkWiki-docs" +layout: "docs" title: "Dependent types (const parameters) (design)" description: "This page covers Silk’s intended support for types that mention compile-time values (especially integers), such as dependent-length collections." docsCollection: "silkWiki" diff --git a/src/silk/wiki/language/doc-comments/page.md b/src/silk/wiki/language/doc-comments/page.md index 5c9391e9..9a14afc0 100644 --- a/src/silk/wiki/language/doc-comments/page.md +++ b/src/silk/wiki/language/doc-comments/page.md @@ -1,5 +1,5 @@ --- -layout: "silkWiki-docs" +layout: "docs" title: "Doc comments" description: "Silk supports both line and block doc comments. They attach to the following declaration (like many C/Rust-style doc systems)." docsCollection: "silkWiki" diff --git a/src/silk/wiki/language/duration-instant/page.md b/src/silk/wiki/language/duration-instant/page.md index a63b3ded..33b8bddb 100644 --- a/src/silk/wiki/language/duration-instant/page.md +++ b/src/silk/wiki/language/duration-instant/page.md @@ -1,5 +1,5 @@ --- -layout: "silkWiki-docs" +layout: "docs" title: "Duration and Instant" description: "Duration represents a signed time span and Instant represents a signed point-in-time on a monotonic timeline. the backend treats both as distinct Silk types that lower to i64 nanoseconds." docsCollection: "silkWiki" diff --git a/src/silk/wiki/language/enums/page.md b/src/silk/wiki/language/enums/page.md index 3c5a0c7a..37756ce6 100644 --- a/src/silk/wiki/language/enums/page.md +++ b/src/silk/wiki/language/enums/page.md @@ -1,5 +1,5 @@ --- -layout: "silkWiki-docs" +layout: "docs" title: "Enums" description: "enum defines a nominal sum type with a fixed set of variants." docsCollection: "silkWiki" diff --git a/src/silk/wiki/language/errors/page.md b/src/silk/wiki/language/errors/page.md index 858693fe..bf870666 100644 --- a/src/silk/wiki/language/errors/page.md +++ b/src/silk/wiki/language/errors/page.md @@ -1,5 +1,5 @@ --- -layout: "silkWiki-docs" +layout: "docs" title: "Errors and assertions" description: "Silk favors explicit, typed error modeling (optionals and Result-style return shapes) and uses typed errors (error, panic, T | ErrorType...) for unrecoverable logic bugs and contract violations." docsCollection: "silkWiki" diff --git a/src/silk/wiki/language/ext/page.md b/src/silk/wiki/language/ext/page.md index 3b9f5f62..859a6359 100644 --- a/src/silk/wiki/language/ext/page.md +++ b/src/silk/wiki/language/ext/page.md @@ -1,5 +1,5 @@ --- -layout: "silkWiki-docs" +layout: "docs" title: "External declarations (ext)" description: "ext declares foreign symbols so Silk code can call C (or wasm imports) access foreign variables." docsCollection: "silkWiki" diff --git a/src/silk/wiki/language/flow-blocks-statements/page.md b/src/silk/wiki/language/flow-blocks-statements/page.md index 7f487eac..5d79118c 100644 --- a/src/silk/wiki/language/flow-blocks-statements/page.md +++ b/src/silk/wiki/language/flow-blocks-statements/page.md @@ -1,5 +1,5 @@ --- -layout: "silkWiki-docs" +layout: "docs" title: "Blocks and statements" description: "Blocks ({ ... }) group statements and introduce a new scope." docsCollection: "silkWiki" diff --git a/src/silk/wiki/language/flow-break/page.md b/src/silk/wiki/language/flow-break/page.md index 23feaf24..dc002578 100644 --- a/src/silk/wiki/language/flow-break/page.md +++ b/src/silk/wiki/language/flow-break/page.md @@ -1,5 +1,5 @@ --- -layout: "silkWiki-docs" +layout: "docs" title: "break" description: "break; exits the nearest enclosing loop." docsCollection: "silkWiki" diff --git a/src/silk/wiki/language/flow-continue/page.md b/src/silk/wiki/language/flow-continue/page.md index 0c9948a6..c5d61f6b 100644 --- a/src/silk/wiki/language/flow-continue/page.md +++ b/src/silk/wiki/language/flow-continue/page.md @@ -1,5 +1,5 @@ --- -layout: "silkWiki-docs" +layout: "docs" title: "continue" description: "continue; skips the remainder of the current loop body and advances to the next iteration." docsCollection: "silkWiki" diff --git a/src/silk/wiki/language/flow-expression-statements/page.md b/src/silk/wiki/language/flow-expression-statements/page.md index 245cd8ce..1463a23e 100644 --- a/src/silk/wiki/language/flow-expression-statements/page.md +++ b/src/silk/wiki/language/flow-expression-statements/page.md @@ -1,5 +1,5 @@ --- -layout: "silkWiki-docs" +layout: "docs" title: "Expression statements" description: "Many expressions can appear as standalone statements when followed by ; (assignment, calls, ++/--, and other “statement-like” expressions)." docsCollection: "silkWiki" diff --git a/src/silk/wiki/language/flow-for/page.md b/src/silk/wiki/language/flow-for/page.md index 08f0463a..2e70ad55 100644 --- a/src/silk/wiki/language/flow-for/page.md +++ b/src/silk/wiki/language/flow-for/page.md @@ -1,5 +1,5 @@ --- -layout: "silkWiki-docs" +layout: "docs" title: "for loops" description: "for loops iterate over:" docsCollection: "silkWiki" diff --git a/src/silk/wiki/language/flow-if-else/page.md b/src/silk/wiki/language/flow-if-else/page.md index d6981b0e..5c6d8d1a 100644 --- a/src/silk/wiki/language/flow-if-else/page.md +++ b/src/silk/wiki/language/flow-if-else/page.md @@ -1,5 +1,5 @@ --- -layout: "silkWiki-docs" +layout: "docs" title: "if / else" description: "Use if / else for boolean branching." docsCollection: "silkWiki" diff --git a/src/silk/wiki/language/flow-loop/page.md b/src/silk/wiki/language/flow-loop/page.md index 751866c3..62f6d7b6 100644 --- a/src/silk/wiki/language/flow-loop/page.md +++ b/src/silk/wiki/language/flow-loop/page.md @@ -1,5 +1,5 @@ --- -layout: "silkWiki-docs" +layout: "docs" title: "loop" description: "loop { ... } is an infinite loop that exits via break or return." docsCollection: "silkWiki" diff --git a/src/silk/wiki/language/flow-match/page.md b/src/silk/wiki/language/flow-match/page.md index 9acb560a..72a4fc7c 100644 --- a/src/silk/wiki/language/flow-match/page.md +++ b/src/silk/wiki/language/flow-match/page.md @@ -1,5 +1,5 @@ --- -layout: "silkWiki-docs" +layout: "docs" title: "match" description: "match provides structured pattern matching." docsCollection: "silkWiki" diff --git a/src/silk/wiki/language/flow-overview/page.md b/src/silk/wiki/language/flow-overview/page.md index 18381d82..5864b6e3 100644 --- a/src/silk/wiki/language/flow-overview/page.md +++ b/src/silk/wiki/language/flow-overview/page.md @@ -1,5 +1,5 @@ --- -layout: "silkWiki-docs" +layout: "docs" title: "Flow control overview" description: "Silk has familiar structured control flow:" docsCollection: "silkWiki" diff --git a/src/silk/wiki/language/flow-return/page.md b/src/silk/wiki/language/flow-return/page.md index 8bd2cab4..14c7cebc 100644 --- a/src/silk/wiki/language/flow-return/page.md +++ b/src/silk/wiki/language/flow-return/page.md @@ -1,5 +1,5 @@ --- -layout: "silkWiki-docs" +layout: "docs" title: "return" description: "Use return to exit the current function." docsCollection: "silkWiki" diff --git a/src/silk/wiki/language/flow-while/page.md b/src/silk/wiki/language/flow-while/page.md index e56f2632..479434c8 100644 --- a/src/silk/wiki/language/flow-while/page.md +++ b/src/silk/wiki/language/flow-while/page.md @@ -1,5 +1,5 @@ --- -layout: "silkWiki-docs" +layout: "docs" title: "while" description: "Use while for condition-controlled looping." docsCollection: "silkWiki" diff --git a/src/silk/wiki/language/formal-verification/page.md b/src/silk/wiki/language/formal-verification/page.md index 65afc61d..6e7d0ab8 100644 --- a/src/silk/wiki/language/formal-verification/page.md +++ b/src/silk/wiki/language/formal-verification/page.md @@ -1,5 +1,5 @@ --- -layout: "silkWiki-docs" +layout: "docs" title: "Formal verification (Formal Silk)" description: "Silk includes syntax for writing contracts and verification metadata:" docsCollection: "silkWiki" diff --git a/src/silk/wiki/language/function-disciplines/page.md b/src/silk/wiki/language/function-disciplines/page.md index 3efef1b0..01dac4e3 100644 --- a/src/silk/wiki/language/function-disciplines/page.md +++ b/src/silk/wiki/language/function-disciplines/page.md @@ -1,5 +1,5 @@ --- -layout: "silkWiki-docs" +layout: "docs" title: "Function disciplines (pure, async, task)" description: "Function modifiers declare constraints and concurrency behavior:" docsCollection: "silkWiki" diff --git a/src/silk/wiki/language/generics/page.md b/src/silk/wiki/language/generics/page.md index a4d17517..24903961 100644 --- a/src/silk/wiki/language/generics/page.md +++ b/src/silk/wiki/language/generics/page.md @@ -1,5 +1,5 @@ --- -layout: "silkWiki-docs" +layout: "docs" title: "Generics (monomorphized)" description: "Silk generics are compile-time and monomorphized: each applied type like Vector(int) produces a concrete instantiation at build time (no runtime type parameters)." docsCollection: "silkWiki" diff --git a/src/silk/wiki/language/grammar/page.md b/src/silk/wiki/language/grammar/page.md index ae6b154f..448997a4 100644 --- a/src/silk/wiki/language/grammar/page.md +++ b/src/silk/wiki/language/grammar/page.md @@ -1,5 +1,5 @@ --- -layout: "silkWiki-docs" +layout: "docs" title: "Grammar" description: "grammar is the canonical “what the parser accepts” reference for Silk surface syntax." docsCollection: "silkWiki" diff --git a/src/silk/wiki/language/interfaces/page.md b/src/silk/wiki/language/interfaces/page.md index 5e3cd82c..4fac3397 100644 --- a/src/silk/wiki/language/interfaces/page.md +++ b/src/silk/wiki/language/interfaces/page.md @@ -1,5 +1,5 @@ --- -layout: "silkWiki-docs" +layout: "docs" title: "Interfaces" description: "Interfaces declare method signatures that types (or modules) can conform to via impl ... as ... (or module ... as ...). This is the basis for protocol-like surfaces such as iterators and Drop." docsCollection: "silkWiki" diff --git a/src/silk/wiki/language/literals-aggregate/page.md b/src/silk/wiki/language/literals-aggregate/page.md index f940c232..41f53ce7 100644 --- a/src/silk/wiki/language/literals-aggregate/page.md +++ b/src/silk/wiki/language/literals-aggregate/page.md @@ -1,5 +1,5 @@ --- -layout: "silkWiki-docs" +layout: "docs" title: "Aggregate literals (arrays and structs)" description: "Aggregate literals build compound values directly in source code:" docsCollection: "silkWiki" diff --git a/src/silk/wiki/language/literals-boolean/page.md b/src/silk/wiki/language/literals-boolean/page.md index 002ddb9a..5559f5ba 100644 --- a/src/silk/wiki/language/literals-boolean/page.md +++ b/src/silk/wiki/language/literals-boolean/page.md @@ -1,5 +1,5 @@ --- -layout: "silkWiki-docs" +layout: "docs" title: "Boolean literals" description: "Silk has the boolean type bool with literals true and false." docsCollection: "silkWiki" diff --git a/src/silk/wiki/language/literals-character/page.md b/src/silk/wiki/language/literals-character/page.md index 27f371f2..19863c90 100644 --- a/src/silk/wiki/language/literals-character/page.md +++ b/src/silk/wiki/language/literals-character/page.md @@ -1,5 +1,5 @@ --- -layout: "silkWiki-docs" +layout: "docs" title: "Character literals" description: "char represents a Unicode scalar value. Character literals write a char value directly in source code." docsCollection: "silkWiki" diff --git a/src/silk/wiki/language/literals-duration/page.md b/src/silk/wiki/language/literals-duration/page.md index 5cf6918e..69c081c6 100644 --- a/src/silk/wiki/language/literals-duration/page.md +++ b/src/silk/wiki/language/literals-duration/page.md @@ -1,5 +1,5 @@ --- -layout: "silkWiki-docs" +layout: "docs" title: "Duration literals" description: "Duration literals represent time spans with unit suffixes (ms, s, min, etc) and produce a Duration value." docsCollection: "silkWiki" diff --git a/src/silk/wiki/language/literals-numeric/page.md b/src/silk/wiki/language/literals-numeric/page.md index ef508bd5..7046dfa8 100644 --- a/src/silk/wiki/language/literals-numeric/page.md +++ b/src/silk/wiki/language/literals-numeric/page.md @@ -1,5 +1,5 @@ --- -layout: "silkWiki-docs" +layout: "docs" title: "Numeric literals" description: "Silk supports integer and floating-point literals, including base prefixes suffixes as defined in the canonical spec." docsCollection: "silkWiki" diff --git a/src/silk/wiki/language/literals-overview/page.md b/src/silk/wiki/language/literals-overview/page.md index 6bf8eaae..25b4da8c 100644 --- a/src/silk/wiki/language/literals-overview/page.md +++ b/src/silk/wiki/language/literals-overview/page.md @@ -1,5 +1,5 @@ --- -layout: "silkWiki-docs" +layout: "docs" title: "Literals" description: "Literals are the simplest way to write values directly in source code: numbers, booleans, chars, strings, durations, and aggregates like arrays struct literals." docsCollection: "silkWiki" diff --git a/src/silk/wiki/language/literals-string/page.md b/src/silk/wiki/language/literals-string/page.md index ba63b744..dcc7b5a6 100644 --- a/src/silk/wiki/language/literals-string/page.md +++ b/src/silk/wiki/language/literals-string/page.md @@ -1,5 +1,5 @@ --- -layout: "silkWiki-docs" +layout: "docs" title: "String literals" description: "string is Silk’s built-in UTF‑8 byte sequence type. String literals write a string value directly in source code." docsCollection: "silkWiki" diff --git a/src/silk/wiki/language/memory-model/page.md b/src/silk/wiki/language/memory-model/page.md index 8d016f8c..ad4b54e7 100644 --- a/src/silk/wiki/language/memory-model/page.md +++ b/src/silk/wiki/language/memory-model/page.md @@ -1,5 +1,5 @@ --- -layout: "silkWiki-docs" +layout: "docs" title: "Memory model" description: "This page is a learning-oriented companion to the canonical memory model: memory model." docsCollection: "silkWiki" diff --git a/src/silk/wiki/language/mutability/page.md b/src/silk/wiki/language/mutability/page.md index 996de048..93f7495e 100644 --- a/src/silk/wiki/language/mutability/page.md +++ b/src/silk/wiki/language/mutability/page.md @@ -1,5 +1,5 @@ --- -layout: "silkWiki-docs" +layout: "docs" title: "Mutability (mut)" description: "Silk is safe-by-default: bindings and borrows are immutable unless you opt in to mutation." docsCollection: "silkWiki" diff --git a/src/silk/wiki/language/operators/page.md b/src/silk/wiki/language/operators/page.md index 0240a477..8b52672d 100644 --- a/src/silk/wiki/language/operators/page.md +++ b/src/silk/wiki/language/operators/page.md @@ -1,5 +1,5 @@ --- -layout: "silkWiki-docs" +layout: "docs" title: "Operators" description: "Silk’s operators cover arithmetic, comparisons, logical operators, assignment, casts, ranges, optionals (?., ??), and typed-error propagation (?)." docsCollection: "silkWiki" diff --git a/src/silk/wiki/language/optional/page.md b/src/silk/wiki/language/optional/page.md index 071fc160..8eb1afa5 100644 --- a/src/silk/wiki/language/optional/page.md +++ b/src/silk/wiki/language/optional/page.md @@ -1,5 +1,5 @@ --- -layout: "silkWiki-docs" +layout: "docs" title: "Optionals (T?)" description: "Optionals represent “maybe a value” without sentinel nulls." docsCollection: "silkWiki" diff --git a/src/silk/wiki/language/packages-imports-exports/page.md b/src/silk/wiki/language/packages-imports-exports/page.md index a562d9d6..1f19ec83 100644 --- a/src/silk/wiki/language/packages-imports-exports/page.md +++ b/src/silk/wiki/language/packages-imports-exports/page.md @@ -1,5 +1,5 @@ --- -layout: "silkWiki-docs" +layout: "docs" title: "Packages, imports, and exports" description: "Silk has explicit module/package structure:" docsCollection: "silkWiki" diff --git a/src/silk/wiki/language/regions/page.md b/src/silk/wiki/language/regions/page.md index 0bd8856f..11cca9f2 100644 --- a/src/silk/wiki/language/regions/page.md +++ b/src/silk/wiki/language/regions/page.md @@ -1,5 +1,5 @@ --- -layout: "silkWiki-docs" +layout: "docs" title: "Regions (with)" description: "Regions provide a fixed-size, statically allocated backing store that can be used as an allocation context for new." docsCollection: "silkWiki" diff --git a/src/silk/wiki/language/struct-requirements/page.md b/src/silk/wiki/language/struct-requirements/page.md index 8d26bec2..ddb9d987 100644 --- a/src/silk/wiki/language/struct-requirements/page.md +++ b/src/silk/wiki/language/struct-requirements/page.md @@ -1,5 +1,5 @@ --- -layout: "silkWiki-docs" +layout: "docs" title: "Struct requirements (#require)" description: "Use #require on a struct to state requirements that must hold for all values constructed for that type." docsCollection: "silkWiki" diff --git a/src/silk/wiki/language/structs-impls-layout/page.md b/src/silk/wiki/language/structs-impls-layout/page.md index 14391c68..4d3a266e 100644 --- a/src/silk/wiki/language/structs-impls-layout/page.md +++ b/src/silk/wiki/language/structs-impls-layout/page.md @@ -1,5 +1,5 @@ --- -layout: "silkWiki-docs" +layout: "docs" title: "Structs and impl" description: "struct is Silk’s primary record type: named fields stored together as one value. impl blocks attach methods (and special methods like constructor and drop) to a type." docsCollection: "silkWiki" diff --git a/src/silk/wiki/language/syntax-tour/page.md b/src/silk/wiki/language/syntax-tour/page.md index 30e53698..4a459923 100644 --- a/src/silk/wiki/language/syntax-tour/page.md +++ b/src/silk/wiki/language/syntax-tour/page.md @@ -1,5 +1,5 @@ --- -layout: "silkWiki-docs" +layout: "docs" title: "Syntax tour" description: "The canonical syntax tour is a soup-to-nuts walkthrough of Silk surface syntax, with many examples and cross-links:" docsCollection: "silkWiki" diff --git a/src/silk/wiki/language/testing/page.md b/src/silk/wiki/language/testing/page.md index 20d6e5ed..fcdc4185 100644 --- a/src/silk/wiki/language/testing/page.md +++ b/src/silk/wiki/language/testing/page.md @@ -1,5 +1,5 @@ --- -layout: "silkWiki-docs" +layout: "docs" title: "Testing (test)" description: "Silk supports top-level test declarations that are discovered and executed by silk test." docsCollection: "silkWiki" diff --git a/src/silk/wiki/language/typed-errors/page.md b/src/silk/wiki/language/typed-errors/page.md index 001d13dd..b2772a96 100644 --- a/src/silk/wiki/language/typed-errors/page.md +++ b/src/silk/wiki/language/typed-errors/page.md @@ -1,5 +1,5 @@ --- -layout: "silkWiki-docs" +layout: "docs" title: "Typed errors (error, panic, and T | ErrorType...)" description: "Typed errors make “this function can fail” explicit in the type system:" docsCollection: "silkWiki" diff --git a/src/silk/wiki/language/types/page.md b/src/silk/wiki/language/types/page.md index 3ba8ca56..36075d40 100644 --- a/src/silk/wiki/language/types/page.md +++ b/src/silk/wiki/language/types/page.md @@ -1,5 +1,5 @@ --- -layout: "silkWiki-docs" +layout: "docs" title: "Types" description: "Silk is a statically typed language with a small set of built-in primitive types and first-class user-defined types (struct, enum, interface)." docsCollection: "silkWiki" diff --git a/src/silk/wiki/language/varargs/page.md b/src/silk/wiki/language/varargs/page.md index af1565d2..45ab7b84 100644 --- a/src/silk/wiki/language/varargs/page.md +++ b/src/silk/wiki/language/varargs/page.md @@ -1,5 +1,5 @@ --- -layout: "silkWiki-docs" +layout: "docs" title: "Varargs (...args)" description: "Silk supports “varargs” parameters to accept a variable number of trailing arguments, used by std::io::print / std::io::println." docsCollection: "silkWiki" diff --git a/src/silk/wiki/page.md b/src/silk/wiki/page.md index 6e46b4df..1a1ef0e6 100644 --- a/src/silk/wiki/page.md +++ b/src/silk/wiki/page.md @@ -1,5 +1,5 @@ --- -layout: "silkWiki-docs" +layout: "docs" title: "Silk Wiki" description: "The Silk Wiki is the learning-first, example-driven side of the Silk documentation set." docsCollection: "silkWiki" diff --git a/src/silk/wiki/std/algorithms/page.md b/src/silk/wiki/std/algorithms/page.md index 98a2b07b..0b370d22 100644 --- a/src/silk/wiki/std/algorithms/page.md +++ b/src/silk/wiki/std/algorithms/page.md @@ -1,5 +1,5 @@ --- -layout: "silkWiki-docs" +layout: "docs" title: "std::algorithms" description: "std::algorithms provides common algorithms over collections. Today, a small Supported forms exists for scalar types." docsCollection: "silkWiki" diff --git a/src/silk/wiki/std/args/page.md b/src/silk/wiki/std/args/page.md index 37b11539..3fc8e7ce 100644 --- a/src/silk/wiki/std/args/page.md +++ b/src/silk/wiki/std/args/page.md @@ -1,5 +1,5 @@ --- -layout: "silkWiki-docs" +layout: "docs" title: "std::args" description: "std::args provides helpers for working with the hosted main(argc, argv) entrypoint shape." docsCollection: "silkWiki" diff --git a/src/silk/wiki/std/arrays/page.md b/src/silk/wiki/std/arrays/page.md index 6e23e590..d4b45493 100644 --- a/src/silk/wiki/std/arrays/page.md +++ b/src/silk/wiki/std/arrays/page.md @@ -1,5 +1,5 @@ --- -layout: "silkWiki-docs" +layout: "docs" title: "std::arrays" description: "std::arrays defines borrowed views like Slice(T) and helpers for working with fixed arrays and slices." docsCollection: "silkWiki" diff --git a/src/silk/wiki/std/bits/page.md b/src/silk/wiki/std/bits/page.md index 845ee5b9..58127744 100644 --- a/src/silk/wiki/std/bits/page.md +++ b/src/silk/wiki/std/bits/page.md @@ -1,5 +1,5 @@ --- -layout: "silkWiki-docs" +layout: "docs" title: "std::bits" description: "std::bits is the standard bit-manipulation and byte-order helper module." docsCollection: "silkWiki" diff --git a/src/silk/wiki/std/buffer/page.md b/src/silk/wiki/std/buffer/page.md index 5cf766c9..4b523a61 100644 --- a/src/silk/wiki/std/buffer/page.md +++ b/src/silk/wiki/std/buffer/page.md @@ -1,5 +1,5 @@ --- -layout: "silkWiki-docs" +layout: "docs" title: "std::buffer" description: "In the in-tree stdlib, std::buffer provides a packed byte buffer (BufferU8) plus width-oriented scalar buffer aliases built on std::vector::Vector(T) (for example BufferI32)." docsCollection: "silkWiki" diff --git a/src/silk/wiki/std/conventions/page.md b/src/silk/wiki/std/conventions/page.md index fed9f38e..ef5bf21b 100644 --- a/src/silk/wiki/std/conventions/page.md +++ b/src/silk/wiki/std/conventions/page.md @@ -1,5 +1,5 @@ --- -layout: "silkWiki-docs" +layout: "docs" title: "std:: conventions" description: "std:: modules follow shared conventions for naming, ownership/allocation, error reporting." docsCollection: "silkWiki" diff --git a/src/silk/wiki/std/crypto/page.md b/src/silk/wiki/std/crypto/page.md index 182df12e..70ac3ee3 100644 --- a/src/silk/wiki/std/crypto/page.md +++ b/src/silk/wiki/std/crypto/page.md @@ -1,5 +1,5 @@ --- -layout: "silkWiki-docs" +layout: "docs" title: "std::crypto" description: "std::crypto provides cryptography primitives (hosted baseline via libsodium in the current design)." docsCollection: "silkWiki" diff --git a/src/silk/wiki/std/env/page.md b/src/silk/wiki/std/env/page.md index 3bfc31c1..fcaa7750 100644 --- a/src/silk/wiki/std/env/page.md +++ b/src/silk/wiki/std/env/page.md @@ -1,5 +1,5 @@ --- -layout: "silkWiki-docs" +layout: "docs" title: "std::env" description: "std::env provides access to process environment variables and common directory helpers." docsCollection: "silkWiki" diff --git a/src/silk/wiki/std/filesystem/page.md b/src/silk/wiki/std/filesystem/page.md index 05914399..8dd1924b 100644 --- a/src/silk/wiki/std/filesystem/page.md +++ b/src/silk/wiki/std/filesystem/page.md @@ -1,5 +1,5 @@ --- -layout: "silkWiki-docs" +layout: "docs" title: "std::fs" description: "std::fs provides a small hosted POSIX-oriented filesystem API (Supported forms subset)." docsCollection: "silkWiki" diff --git a/src/silk/wiki/std/fmt/page.md b/src/silk/wiki/std/fmt/page.md index 52bfb709..1882b5f5 100644 --- a/src/silk/wiki/std/fmt/page.md +++ b/src/silk/wiki/std/fmt/page.md @@ -1,5 +1,5 @@ --- -layout: "silkWiki-docs" +layout: "docs" title: "std::fmt" description: "std::fmt defines the formatting model used by std::io::print/println by string-building helpers. It follows a Zig-std.fmt-style format-string syntax." docsCollection: "silkWiki" diff --git a/src/silk/wiki/std/formal/page.md b/src/silk/wiki/std/formal/page.md index 18aa5f66..84ec4332 100644 --- a/src/silk/wiki/std/formal/page.md +++ b/src/silk/wiki/std/formal/page.md @@ -1,5 +1,5 @@ --- -layout: "silkWiki-docs" +layout: "docs" title: "std::formal" description: "std::formal provides reusable Formal Silk theories (“standard lemmas”) used by stdlib code and downstream verified code." docsCollection: "silkWiki" diff --git a/src/silk/wiki/std/interfaces/page.md b/src/silk/wiki/std/interfaces/page.md index 28cdf8f4..c6a5c690 100644 --- a/src/silk/wiki/std/interfaces/page.md +++ b/src/silk/wiki/std/interfaces/page.md @@ -1,5 +1,5 @@ --- -layout: "silkWiki-docs" +layout: "docs" title: "std::interfaces" description: "std::interfaces defines shared std protocol interfaces such as Drop, Len, and Iterator(T)." docsCollection: "silkWiki" diff --git a/src/silk/wiki/std/io/page.md b/src/silk/wiki/std/io/page.md index 9695e1c2..f7abb126 100644 --- a/src/silk/wiki/std/io/page.md +++ b/src/silk/wiki/std/io/page.md @@ -1,5 +1,5 @@ --- -layout: "silkWiki-docs" +layout: "docs" title: "std::io" description: "std::io provides basic stdin/stdout/stderr I/O and a small formatting surface (print/println)." docsCollection: "silkWiki" diff --git a/src/silk/wiki/std/json/page.md b/src/silk/wiki/std/json/page.md index df0282a4..310a9396 100644 --- a/src/silk/wiki/std/json/page.md +++ b/src/silk/wiki/std/json/page.md @@ -1,5 +1,5 @@ --- -layout: "silkWiki-docs" +layout: "docs" title: "std::json" description: "std::json provides JSON parsing and stringifying (implementation + expanded subset)." docsCollection: "silkWiki" diff --git a/src/silk/wiki/std/map/page.md b/src/silk/wiki/std/map/page.md index 4842635c..b3999a1c 100644 --- a/src/silk/wiki/std/map/page.md +++ b/src/silk/wiki/std/map/page.md @@ -1,5 +1,5 @@ --- -layout: "silkWiki-docs" +layout: "docs" title: "std::map" description: "std::map provides associative containers:" docsCollection: "silkWiki" diff --git a/src/silk/wiki/std/memory/page.md b/src/silk/wiki/std/memory/page.md index 4b0569fe..53cce93a 100644 --- a/src/silk/wiki/std/memory/page.md +++ b/src/silk/wiki/std/memory/page.md @@ -1,5 +1,5 @@ --- -layout: "silkWiki-docs" +layout: "docs" title: "std::memory" description: "std::memory provides low-level helpers and the long-term allocator design." docsCollection: "silkWiki" diff --git a/src/silk/wiki/std/networking/page.md b/src/silk/wiki/std/networking/page.md index 5ed19890..c60aa22b 100644 --- a/src/silk/wiki/std/networking/page.md +++ b/src/silk/wiki/std/networking/page.md @@ -1,5 +1,5 @@ --- -layout: "silkWiki-docs" +layout: "docs" title: "std::net" description: "std::net provides networking primitives (hosted POSIX baseline)." docsCollection: "silkWiki" diff --git a/src/silk/wiki/std/overview/page.md b/src/silk/wiki/std/overview/page.md index a2590173..9a1e8a15 100644 --- a/src/silk/wiki/std/overview/page.md +++ b/src/silk/wiki/std/overview/page.md @@ -1,5 +1,5 @@ --- -layout: "silkWiki-docs" +layout: "docs" title: "Standard library overview (std::)" description: "std:: is the Silk standard library namespace. The docs/std/ tree specifies the intended API and structure; an in-tree stdlib implementation exists under std/ for Silk currently." docsCollection: "silkWiki" diff --git a/src/silk/wiki/std/package-structure/page.md b/src/silk/wiki/std/package-structure/page.md index 45f80295..ba003a78 100644 --- a/src/silk/wiki/std/package-structure/page.md +++ b/src/silk/wiki/std/package-structure/page.md @@ -1,5 +1,5 @@ --- -layout: "silkWiki-docs" +layout: "docs" title: "std:: package structure" description: "This page describes how std:: modules are organized and how the compiler finds and links them (including std-root selection and archive wiring)." docsCollection: "silkWiki" diff --git a/src/silk/wiki/std/path/page.md b/src/silk/wiki/std/path/page.md index 407ae755..1c559cc2 100644 --- a/src/silk/wiki/std/path/page.md +++ b/src/silk/wiki/std/path/page.md @@ -1,5 +1,5 @@ --- -layout: "silkWiki-docs" +layout: "docs" title: "std::path" description: "std::path provides path manipulation helpers." docsCollection: "silkWiki" diff --git a/src/silk/wiki/std/process/page.md b/src/silk/wiki/std/process/page.md index 3e832903..3706eca2 100644 --- a/src/silk/wiki/std/process/page.md +++ b/src/silk/wiki/std/process/page.md @@ -1,5 +1,5 @@ --- -layout: "silkWiki-docs" +layout: "docs" title: "std::process" description: "std::process provides process-oriented primitives (hosted baseline)." docsCollection: "silkWiki" diff --git a/src/silk/wiki/std/result/page.md b/src/silk/wiki/std/result/page.md index 9676dda8..57c1c88b 100644 --- a/src/silk/wiki/std/result/page.md +++ b/src/silk/wiki/std/result/page.md @@ -1,5 +1,5 @@ --- -layout: "silkWiki-docs" +layout: "docs" title: "std::result" description: "std::result standardizes the common “success or error” return shape as Result(T, E) so APIs across std:: compose cleanly." docsCollection: "silkWiki" diff --git a/src/silk/wiki/std/runtime/page.md b/src/silk/wiki/std/runtime/page.md index e676efda..db2ade2f 100644 --- a/src/silk/wiki/std/runtime/page.md +++ b/src/silk/wiki/std/runtime/page.md @@ -1,5 +1,5 @@ --- -layout: "silkWiki-docs" +layout: "docs" title: "std::runtime" description: "std::runtime is the interface layer that isolates OS/environment-specific primitives (I/O, filesystem, time, threads, allocation) from higher-level std::... modules." docsCollection: "silkWiki" diff --git a/src/silk/wiki/std/semver/page.md b/src/silk/wiki/std/semver/page.md index 7361b6d3..00d18ce0 100644 --- a/src/silk/wiki/std/semver/page.md +++ b/src/silk/wiki/std/semver/page.md @@ -1,5 +1,5 @@ --- -layout: "silkWiki-docs" +layout: "docs" title: "std::semver" description: "std::semver implements Semantic Versioning (SemVer 2.0.0):" docsCollection: "silkWiki" diff --git a/src/silk/wiki/std/set/page.md b/src/silk/wiki/std/set/page.md index fd972169..013463ee 100644 --- a/src/silk/wiki/std/set/page.md +++ b/src/silk/wiki/std/set/page.md @@ -1,5 +1,5 @@ --- -layout: "silkWiki-docs" +layout: "docs" title: "std::set" description: "std::set provides set containers:" docsCollection: "silkWiki" diff --git a/src/silk/wiki/std/strings/page.md b/src/silk/wiki/std/strings/page.md index a6d12e4a..480178c6 100644 --- a/src/silk/wiki/std/strings/page.md +++ b/src/silk/wiki/std/strings/page.md @@ -1,5 +1,5 @@ --- -layout: "silkWiki-docs" +layout: "docs" title: "std::strings" description: "std::strings provides utilities and types built on top of the core string type (UTF‑8 bytes), including simple comparisons and owned string construction." docsCollection: "silkWiki" diff --git a/src/silk/wiki/std/sync/page.md b/src/silk/wiki/std/sync/page.md index a59f20b2..706e3a36 100644 --- a/src/silk/wiki/std/sync/page.md +++ b/src/silk/wiki/std/sync/page.md @@ -1,5 +1,5 @@ --- -layout: "silkWiki-docs" +layout: "docs" title: "std::sync" description: "std::sync provides synchronization primitives (hosted baseline)." docsCollection: "silkWiki" diff --git a/src/silk/wiki/std/task/page.md b/src/silk/wiki/std/task/page.md index 9a230311..75a99571 100644 --- a/src/silk/wiki/std/task/page.md +++ b/src/silk/wiki/std/task/page.md @@ -1,5 +1,5 @@ --- -layout: "silkWiki-docs" +layout: "docs" title: "std::task" description: "std::task provides hosted task/runtime helpers, including sleep/yield operations." docsCollection: "silkWiki" diff --git a/src/silk/wiki/std/temporal/page.md b/src/silk/wiki/std/temporal/page.md index 0a7db391..ecbe89bf 100644 --- a/src/silk/wiki/std/temporal/page.md +++ b/src/silk/wiki/std/temporal/page.md @@ -1,5 +1,5 @@ --- -layout: "silkWiki-docs" +layout: "docs" title: "std::temporal" description: "std::temporal provides Instant/Duration helpers and time-related utilities." docsCollection: "silkWiki" diff --git a/src/silk/wiki/std/tls/page.md b/src/silk/wiki/std/tls/page.md index 313e219e..f7f0ba98 100644 --- a/src/silk/wiki/std/tls/page.md +++ b/src/silk/wiki/std/tls/page.md @@ -1,5 +1,5 @@ --- -layout: "silkWiki-docs" +layout: "docs" title: "std::tls" description: "std::tls provides TLS client/server primitives (hosted baseline via mbedTLS)." docsCollection: "silkWiki" diff --git a/src/silk/wiki/std/toml/page.md b/src/silk/wiki/std/toml/page.md index 96a900d9..4a19e4b6 100644 --- a/src/silk/wiki/std/toml/page.md +++ b/src/silk/wiki/std/toml/page.md @@ -1,5 +1,5 @@ --- -layout: "silkWiki-docs" +layout: "docs" title: "std::toml" description: "std::toml provides TOML parsing (implementation + expanded subset)." docsCollection: "silkWiki" diff --git a/src/silk/wiki/std/url/page.md b/src/silk/wiki/std/url/page.md index a0a21ad5..ddc1a2c8 100644 --- a/src/silk/wiki/std/url/page.md +++ b/src/silk/wiki/std/url/page.md @@ -1,5 +1,5 @@ --- -layout: "silkWiki-docs" +layout: "docs" title: "std::url" description: "std::url provides a WHATWG URL parser/serializer and URLSearchParams-style behavior." docsCollection: "silkWiki" diff --git a/src/silk/wiki/std/uuid/page.md b/src/silk/wiki/std/uuid/page.md index 95c3b4b8..e0a1290b 100644 --- a/src/silk/wiki/std/uuid/page.md +++ b/src/silk/wiki/std/uuid/page.md @@ -1,5 +1,5 @@ --- -layout: "silkWiki-docs" +layout: "docs" title: "std::uuid" description: "std::uuid provides UUID primitives (parsing, formatting, and variants)." docsCollection: "silkWiki" diff --git a/src/silk/wiki/std/vector/page.md b/src/silk/wiki/std/vector/page.md index 656dff16..34d8c4bd 100644 --- a/src/silk/wiki/std/vector/page.md +++ b/src/silk/wiki/std/vector/page.md @@ -1,5 +1,5 @@ --- -layout: "silkWiki-docs" +layout: "docs" title: "std::vector" description: "std::vector provides a generic, growable owning container Vector(T) used widely throughout std::." docsCollection: "silkWiki" diff --git a/src/silkWiki-index.template.ts b/src/silkWiki-index.template.ts deleted file mode 100644 index 916ebb26..00000000 --- a/src/silkWiki-index.template.ts +++ /dev/null @@ -1,6 +0,0 @@ -import type { DataDeps, TemplateFunction } from '@domstack/static/types.js' -import type { DocsData } from './lib/docs.ts' -import { collectionIndex } from './lib/artifacts.ts' -export const dataDeps = ['silkWikiNavigation'] satisfies DataDeps<Pick<DocsData, 'silkWikiNavigation'>> -const template: TemplateFunction<Record<string, unknown>, Pick<DocsData, 'silkWikiNavigation'>> = ({ data }) => collectionIndex('silkWiki', data.silkWikiNavigation) -export default template diff --git a/src/slg-index.template.ts b/src/slg-index.template.ts deleted file mode 100644 index d0d0dcb5..00000000 --- a/src/slg-index.template.ts +++ /dev/null @@ -1,6 +0,0 @@ -import type { DataDeps, TemplateFunction } from '@domstack/static/types.js' -import type { DocsData } from './lib/docs.ts' -import { collectionIndex } from './lib/artifacts.ts' -export const dataDeps = ['slgNavigation'] satisfies DataDeps<Pick<DocsData, 'slgNavigation'>> -const template: TemplateFunction<Record<string, unknown>, Pick<DocsData, 'slgNavigation'>> = ({ data }) => collectionIndex('slg', data.slgNavigation) -export default template diff --git a/src/slg/docs/cli/diagnostics/page.md b/src/slg/docs/cli/diagnostics/page.md index 1362e169..1419d583 100644 --- a/src/slg/docs/cli/diagnostics/page.md +++ b/src/slg/docs/cli/diagnostics/page.md @@ -1,5 +1,5 @@ --- -layout: "slg-docs" +layout: "docs" title: "Diagnostics" description: "This page documents the public exit codes plus the most important user-visible diagnostics." docsCollection: "slg" diff --git a/src/slg/docs/cli/input-types-and-parsing/page.md b/src/slg/docs/cli/input-types-and-parsing/page.md index 97fe3687..c4e3a1f1 100644 --- a/src/slg/docs/cli/input-types-and-parsing/page.md +++ b/src/slg/docs/cli/input-types-and-parsing/page.md @@ -1,5 +1,5 @@ --- -layout: "slg-docs" +layout: "docs" title: "Input types and parsing" description: "This page is the exact downstream input model for slg." docsCollection: "slg" diff --git a/src/slg/docs/cli/options-reference/page.md b/src/slg/docs/cli/options-reference/page.md index 7f52b044..67fc464f 100644 --- a/src/slg/docs/cli/options-reference/page.md +++ b/src/slg/docs/cli/options-reference/page.md @@ -1,5 +1,5 @@ --- -layout: "slg-docs" +layout: "docs" title: "Options reference" description: "This page lists every public CLI flag on slg." docsCollection: "slg" diff --git a/src/slg/docs/cli/output-and-exit-codes/page.md b/src/slg/docs/cli/output-and-exit-codes/page.md index c58d42b4..f5c92a9c 100644 --- a/src/slg/docs/cli/output-and-exit-codes/page.md +++ b/src/slg/docs/cli/output-and-exit-codes/page.md @@ -1,5 +1,5 @@ --- -layout: "slg-docs" +layout: "docs" title: "Output and exit codes" description: "This page documents what slg prints, where it prints it, and how it exits." docsCollection: "slg" diff --git a/src/slg/docs/cli/parallelism/page.md b/src/slg/docs/cli/parallelism/page.md index 6f9679e5..e5d58e50 100644 --- a/src/slg/docs/cli/parallelism/page.md +++ b/src/slg/docs/cli/parallelism/page.md @@ -1,5 +1,5 @@ --- -layout: "slg-docs" +layout: "docs" title: "Parallelism" description: "slg can traverse and search in parallel, but the control surface is explicit and intentionally bounded." docsCollection: "slg" diff --git a/src/slg/docs/cli/patterns-and-matching/page.md b/src/slg/docs/cli/patterns-and-matching/page.md index 4437a07b..e238c546 100644 --- a/src/slg/docs/cli/patterns-and-matching/page.md +++ b/src/slg/docs/cli/patterns-and-matching/page.md @@ -1,5 +1,5 @@ --- -layout: "slg-docs" +layout: "docs" title: "Patterns and matching" description: "This page documents how slg interprets patterns once parsing is complete." docsCollection: "slg" diff --git a/src/slg/docs/cli/slg/page.md b/src/slg/docs/cli/slg/page.md index d658b9cd..0af734d8 100644 --- a/src/slg/docs/cli/slg/page.md +++ b/src/slg/docs/cli/slg/page.md @@ -1,5 +1,5 @@ --- -layout: "slg-docs" +layout: "docs" title: "slg" description: "slg is the canonical CLI entrypoint for Silk Line Grep." docsCollection: "slg" diff --git a/src/slg/docs/cli/traversal-and-ignores/page.md b/src/slg/docs/cli/traversal-and-ignores/page.md index 7f5f5091..9121900a 100644 --- a/src/slg/docs/cli/traversal-and-ignores/page.md +++ b/src/slg/docs/cli/traversal-and-ignores/page.md @@ -1,5 +1,5 @@ --- -layout: "slg-docs" +layout: "docs" title: "Traversal and ignores" description: "This page documents exactly what slg walks, skips, and re-enables." docsCollection: "slg" diff --git a/src/slg/docs/guides/getting-started/page.md b/src/slg/docs/guides/getting-started/page.md index 556cc929..ac29eb5f 100644 --- a/src/slg/docs/guides/getting-started/page.md +++ b/src/slg/docs/guides/getting-started/page.md @@ -1,5 +1,5 @@ --- -layout: "slg-docs" +layout: "docs" title: "Getting started" description: "This guide covers the downstream story: build slg, install it, run a few real searches, then move into the exact CLI reference." docsCollection: "slg" diff --git a/src/slg/docs/guides/search-recipes/page.md b/src/slg/docs/guides/search-recipes/page.md index efd0a4cf..1bd9a912 100644 --- a/src/slg/docs/guides/search-recipes/page.md +++ b/src/slg/docs/guides/search-recipes/page.md @@ -1,5 +1,5 @@ --- -layout: "slg-docs" +layout: "docs" title: "Search recipes" description: "These are practical slg workflows for code trees, logs, and large repositories." docsCollection: "slg" diff --git a/src/slg/docs/man/slg-1/page.md b/src/slg/docs/man/slg-1/page.md index caf30cca..a6ca5a72 100644 --- a/src/slg/docs/man/slg-1/page.md +++ b/src/slg/docs/man/slg-1/page.md @@ -1,5 +1,5 @@ --- -layout: "slg-docs" +layout: "docs" title: "slg (1) — Silk Line Grep" description: "This page is the reader-friendly website form of the shipped slg(1) manual." docsCollection: "slg" diff --git a/src/slg/docs/page.md b/src/slg/docs/page.md index fe229928..e57fc74f 100644 --- a/src/slg/docs/page.md +++ b/src/slg/docs/page.md @@ -1,5 +1,5 @@ --- -layout: "slg-docs" +layout: "docs" title: "slg Docs" description: "slg is a fast recursive line grep utility for files and directories." docsCollection: "slg" diff --git a/src/virtnosis-index.template.ts b/src/virtnosis-index.template.ts deleted file mode 100644 index cb4a49d6..00000000 --- a/src/virtnosis-index.template.ts +++ /dev/null @@ -1,6 +0,0 @@ -import type { DataDeps, TemplateFunction } from '@domstack/static/types.js' -import type { DocsData } from './lib/docs.ts' -import { collectionIndex } from './lib/artifacts.ts' -export const dataDeps = ['virtnosisNavigation'] satisfies DataDeps<Pick<DocsData, 'virtnosisNavigation'>> -const template: TemplateFunction<Record<string, unknown>, Pick<DocsData, 'virtnosisNavigation'>> = ({ data }) => collectionIndex('virtnosis', data.virtnosisNavigation) -export default template diff --git a/src/virtnosis/docs/cli/virtnosis-agent/page.md b/src/virtnosis/docs/cli/virtnosis-agent/page.md index 9dc9c237..66b0e251 100644 --- a/src/virtnosis/docs/cli/virtnosis-agent/page.md +++ b/src/virtnosis/docs/cli/virtnosis-agent/page.md @@ -1,5 +1,5 @@ --- -layout: "virtnosis-docs" +layout: "docs" title: "virtnosis-agent" description: "virtnosis-agent is the local control-plane daemon for Virtnosis." docsCollection: "virtnosis" diff --git a/src/virtnosis/docs/cli/vnactl/page.md b/src/virtnosis/docs/cli/vnactl/page.md index c3f051a0..75855c89 100644 --- a/src/virtnosis/docs/cli/vnactl/page.md +++ b/src/virtnosis/docs/cli/vnactl/page.md @@ -1,5 +1,5 @@ --- -layout: "virtnosis-docs" +layout: "docs" title: "vnactl" description: "vnactl is the operator and automation client for virtnosis-agent." docsCollection: "virtnosis" diff --git a/src/virtnosis/docs/guides/deployment/page.md b/src/virtnosis/docs/guides/deployment/page.md index b3d0a962..29032623 100644 --- a/src/virtnosis/docs/guides/deployment/page.md +++ b/src/virtnosis/docs/guides/deployment/page.md @@ -1,5 +1,5 @@ --- -layout: "virtnosis-docs" +layout: "docs" title: "Deployment Guide" description: "This guide covers local agent deployment, shared socket deployment, and the important permission and auth choices." docsCollection: "virtnosis" diff --git a/src/virtnosis/docs/guides/getting-started/page.md b/src/virtnosis/docs/guides/getting-started/page.md index 27d576fe..5b4645df 100644 --- a/src/virtnosis/docs/guides/getting-started/page.md +++ b/src/virtnosis/docs/guides/getting-started/page.md @@ -1,5 +1,5 @@ --- -layout: "virtnosis-docs" +layout: "docs" title: "Getting Started" description: "This guide gets you from an installed Virtnosis CLI to a useful first scan." docsCollection: "virtnosis" diff --git a/src/virtnosis/docs/guides/install-and-package/page.md b/src/virtnosis/docs/guides/install-and-package/page.md index 662a9ca7..3bfc4df2 100644 --- a/src/virtnosis/docs/guides/install-and-package/page.md +++ b/src/virtnosis/docs/guides/install-and-package/page.md @@ -1,5 +1,5 @@ --- -layout: "virtnosis-docs" +layout: "docs" title: "Install and Package" description: "This guide covers source builds, local installs, docs installs, and the packaging-oriented make targets shipped in the repository." docsCollection: "virtnosis" diff --git a/src/virtnosis/docs/guides/operator-guide/page.md b/src/virtnosis/docs/guides/operator-guide/page.md index 14b85d3d..39aac8bd 100644 --- a/src/virtnosis/docs/guides/operator-guide/page.md +++ b/src/virtnosis/docs/guides/operator-guide/page.md @@ -1,5 +1,5 @@ --- -layout: "virtnosis-docs" +layout: "docs" title: "Operator Guide" description: "This guide focuses on day-to-day use of Virtnosis as an operator, responder, or CI consumer." docsCollection: "virtnosis" diff --git a/src/virtnosis/docs/guides/output-and-automation/page.md b/src/virtnosis/docs/guides/output-and-automation/page.md index 389b9670..ad2603ff 100644 --- a/src/virtnosis/docs/guides/output-and-automation/page.md +++ b/src/virtnosis/docs/guides/output-and-automation/page.md @@ -1,5 +1,5 @@ --- -layout: "virtnosis-docs" +layout: "docs" title: "Output and Automation" description: "Virtnosis output is designed to stay machine-consumable even when the scan is partial, bounded, or degraded." docsCollection: "virtnosis" diff --git a/src/virtnosis/docs/guides/systemd/page.md b/src/virtnosis/docs/guides/systemd/page.md index 10a9c8f3..5bec62b2 100644 --- a/src/virtnosis/docs/guides/systemd/page.md +++ b/src/virtnosis/docs/guides/systemd/page.md @@ -1,5 +1,5 @@ --- -layout: "virtnosis-docs" +layout: "docs" title: "Systemd Guide" description: "This guide documents the systemd deployment story for Virtnosis." docsCollection: "virtnosis" diff --git a/src/virtnosis/docs/man/virtnosis-7/page.md b/src/virtnosis/docs/man/virtnosis-7/page.md index 9ca8ade7..b6c22e3c 100644 --- a/src/virtnosis/docs/man/virtnosis-7/page.md +++ b/src/virtnosis/docs/man/virtnosis-7/page.md @@ -1,5 +1,5 @@ --- -layout: "virtnosis-docs" +layout: "docs" title: "virtnosis(7)" description: "virtnosis — libvirt security analysis and diagnosis architecture" docsCollection: "virtnosis" diff --git a/src/virtnosis/docs/man/virtnosis-agent-1/page.md b/src/virtnosis/docs/man/virtnosis-agent-1/page.md index 21881a0e..2bdb7899 100644 --- a/src/virtnosis/docs/man/virtnosis-agent-1/page.md +++ b/src/virtnosis/docs/man/virtnosis-agent-1/page.md @@ -1,5 +1,5 @@ --- -layout: "virtnosis-docs" +layout: "docs" title: "virtnosis-agent(1)" description: "virtnosis-agent — Virtnosis local agent and daemon" docsCollection: "virtnosis" diff --git a/src/virtnosis/docs/man/virtnosis-agent-protocol-7/page.md b/src/virtnosis/docs/man/virtnosis-agent-protocol-7/page.md index 8de918bc..97aba8ca 100644 --- a/src/virtnosis/docs/man/virtnosis-agent-protocol-7/page.md +++ b/src/virtnosis/docs/man/virtnosis-agent-protocol-7/page.md @@ -1,5 +1,5 @@ --- -layout: "virtnosis-docs" +layout: "docs" title: "virtnosis-agent-protocol(7)" description: "virtnosis-agent-protocol — control protocol and transport model for Virtnosis" docsCollection: "virtnosis" diff --git a/src/virtnosis/docs/man/virtnosis-scan-report-7/page.md b/src/virtnosis/docs/man/virtnosis-scan-report-7/page.md index af063045..7455d0a4 100644 --- a/src/virtnosis/docs/man/virtnosis-scan-report-7/page.md +++ b/src/virtnosis/docs/man/virtnosis-scan-report-7/page.md @@ -1,5 +1,5 @@ --- -layout: "virtnosis-docs" +layout: "docs" title: "virtnosis-scan-report(7)" description: "virtnosis-scan-report — output model and reporting semantics for Virtnosis scans" docsCollection: "virtnosis" diff --git a/src/virtnosis/docs/man/vnactl-1/page.md b/src/virtnosis/docs/man/vnactl-1/page.md index aed77fa2..4e7f090a 100644 --- a/src/virtnosis/docs/man/vnactl-1/page.md +++ b/src/virtnosis/docs/man/vnactl-1/page.md @@ -1,5 +1,5 @@ --- -layout: "virtnosis-docs" +layout: "docs" title: "vnactl(1)" description: "vnactl — Virtnosis agent control client" docsCollection: "virtnosis" diff --git a/src/virtnosis/docs/page.md b/src/virtnosis/docs/page.md index 793eaef3..d24f4904 100644 --- a/src/virtnosis/docs/page.md +++ b/src/virtnosis/docs/page.md @@ -1,5 +1,5 @@ --- -layout: "virtnosis-docs" +layout: "docs" title: "Virtnosis Docs" description: "Virtnosis is a read-only libvirt security analysis and diagnosis toolset." docsCollection: "virtnosis" diff --git a/src/virtnosis/docs/reference/architecture/page.md b/src/virtnosis/docs/reference/architecture/page.md index 598764e3..ad079ed0 100644 --- a/src/virtnosis/docs/reference/architecture/page.md +++ b/src/virtnosis/docs/reference/architecture/page.md @@ -1,5 +1,5 @@ --- -layout: "virtnosis-docs" +layout: "docs" title: "Architecture" description: "This document explains the product architecture from a systems perspective." docsCollection: "virtnosis" diff --git a/src/virtnosis/docs/reference/development/page.md b/src/virtnosis/docs/reference/development/page.md index 6fb462a1..79134fa5 100644 --- a/src/virtnosis/docs/reference/development/page.md +++ b/src/virtnosis/docs/reference/development/page.md @@ -1,5 +1,5 @@ --- -layout: "virtnosis-docs" +layout: "docs" title: "Development Guide" description: "This guide is for contributors working inside virtnosis/." docsCollection: "virtnosis" diff --git a/src/virtnosis/docs/reference/overview/page.md b/src/virtnosis/docs/reference/overview/page.md index 19a9913a..17514b13 100644 --- a/src/virtnosis/docs/reference/overview/page.md +++ b/src/virtnosis/docs/reference/overview/page.md @@ -1,5 +1,5 @@ --- -layout: "virtnosis-docs" +layout: "docs" title: "Overview" description: "Virtnosis is a read-only libvirt security analysis and diagnosis toolset." docsCollection: "virtnosis" diff --git a/src/virtnosis/docs/reference/repository-docs/page.md b/src/virtnosis/docs/reference/repository-docs/page.md index e717b0c8..f93bfb88 100644 --- a/src/virtnosis/docs/reference/repository-docs/page.md +++ b/src/virtnosis/docs/reference/repository-docs/page.md @@ -1,5 +1,5 @@ --- -layout: "virtnosis-docs" +layout: "docs" title: "Repository Documents" description: "This page maps the documentation layers that exist in the virtnosis repository and explains which ones are public/operator-facing versus contributor/internal." docsCollection: "virtnosis" diff --git a/src/virtnosis/docs/reference/scan-analysis/page.md b/src/virtnosis/docs/reference/scan-analysis/page.md index fa7e48c9..b9a2cfed 100644 --- a/src/virtnosis/docs/reference/scan-analysis/page.md +++ b/src/virtnosis/docs/reference/scan-analysis/page.md @@ -1,5 +1,5 @@ --- -layout: "virtnosis-docs" +layout: "docs" title: "Scan Analysis" description: "This guide explains what Virtnosis scans, what “deep” means, and how to interpret partial versus confirmed findings." docsCollection: "virtnosis" diff --git a/tests/docs-watch.test.ts b/tests/docs-watch.test.ts index 371bd241..751ddd91 100644 --- a/tests/docs-watch.test.ts +++ b/tests/docs-watch.test.ts @@ -6,7 +6,7 @@ import { join, basename } from 'node:path' import { identifyPages } from '@domstack/static/lib/identify-pages.js' import { buildPagesDirect } from '@domstack/static/lib/build-pages/index.js' -test('DOMStack selectively rebuilds docs consumers for body and navigation edits', { timeout: 20000 }, async () => { +test('body edits stay isolated while navigation edits rebuild shared docs consumers', { timeout: 20000 }, async () => { const fixture = await mkdtemp(join(tmpdir(), 'oro-docs-watch-')) const src = join(fixture, 'src') const dest = join(fixture, 'public') @@ -19,12 +19,12 @@ test('DOMStack selectively rebuilds docs consumers for body and navigation edits await writeFile(join(src, target), `export { default } from ${JSON.stringify(url)}\nexport * from ${JSON.stringify(url)}\n`) } for (const name of ['global.data.ts', 'global.vars.ts', 'markdown-it.settings.ts']) await proxy(name, name) - for (const name of ['root', 'docs', 'runtime-docs', 'silk-docs']) + for (const name of ['root', 'docs']) await proxy(name + '.layout.ts', 'layouts/' + name + '.layout.ts') for (const name of (await readdir(new URL('../src/', import.meta.url))).filter(name => name.endsWith('.template.ts') && name !== 'cname.template.ts')) await proxy(name, name) const pageSource = (collection: string, id: string, title: string, body: string) => `--- -layout: "${collection}-docs" +layout: "docs" title: "${title}" description: "Summary" docsCollection: "${collection}" @@ -55,7 +55,7 @@ ${body} const initial = first.report.watchDependencies! assert.ok(Object.values(initial.globalDataFingerprints).every(value => typeof value === 'string')) const subscription = Object.values(initial.consumers).find(c => c.key === pageFiles[0])! - assert.deepEqual(subscription.globalDataKeys, ['runtimeNavigation']) + assert.deepEqual(subscription.globalDataKeys, ['navigation']) const unchanged = await readFile(join(dest, 'runtime/docs/next/index.html'), 'utf8') const index = await readFile(join(dest, 'runtime/docs/index.json'), 'utf8') @@ -82,9 +82,9 @@ ${body} pageFilterPaths: [pageFiles[0]], templateFilterPaths: [], pagesFileFilterPaths: [], }) assert.deepEqual(titleEdit.errors, []) - assert.deepEqual(titleEdit.report.pages.map(p => p.sourcePageFilePath).sort(), pageFiles.slice(0, 2).sort()) + assert.deepEqual(titleEdit.report.pages.map(p => p.sourcePageFilePath).sort(), [...pageFiles].sort()) assert.deepEqual(titleEdit.report.templates.map(t => basename(t.templateInfo.templateFile.filepath)).sort(), [ - 'runtime-index.template.ts', 'runtime-llms.template.ts', 'runtime-search.template.ts', 'runtime-sources.template.ts', + 'navigation.template.ts', 'runtime-llms.template.ts', 'runtime-search.template.ts', 'runtime-sources.template.ts', ]) assert.match(await readFile(join(dest, 'runtime/docs/next/index.html'), 'utf8'), /Renamed/) } finally { diff --git a/tests/ingestion-import.test.ts b/tests/ingestion-import.test.ts index 0ce58f0e..04363463 100644 --- a/tests/ingestion-import.test.ts +++ b/tests/ingestion-import.test.ts @@ -22,7 +22,7 @@ async function put(path: string, body: string): Promise<void> { } async function page(site: string, route: string, collection: string, sourcePath: string, body: string): Promise<string> { const path = join(site, 'src', route, 'page.md') - await put(path, pageText({ layout: `${collection}-docs`, title: 'Authored title', description: 'Authored description', docsCollection: collection, sourcePath, order: 7, section: 'authored', githubRepo: 'preserved/repository', githubRef: 'authored-ref' }, body)) + await put(path, pageText({ layout: collection === 'silk' && sourcePath === 'spec/2026.md' ? 'spec' : 'docs', title: 'Authored title', description: 'Authored description', docsCollection: collection, sourcePath, order: 7, section: 'authored', githubRepo: 'preserved/repository', githubRef: 'authored-ref' }, body)) return path } test('Runtime generator uses the public importer, prunes excluded families, and retains curated metadata', async () => temporary(async (site, upstream) => { @@ -37,14 +37,15 @@ test('Runtime generator uses the public importer, prunes excluded families, and assert.ok(body.includes('Authored footer.')) assert.ok(body.includes('ping()')) assert.ok(!body.includes('Old API')) - assert.equal(metadata.order, 7) + assert.equal(metadata.layout, 'docs') + assert.equal(metadata.order, 7) assert.equal(metadata.githubRef, 'authored-ref') assert.equal(metadata.section, 'authored') assert.equal(await readFile(unrelated, 'utf8'), untouched) await assert.rejects(stat(excluded), { code: 'ENOENT' }) const generated = join(site, 'src/runtime/docs/javascript/assert/page.md') const first = await readFile(generated, 'utf8') - assert.equal(splitPage(first).metadata.layout, 'runtime-docs') + assert.equal(splitPage(first).metadata.layout, 'docs') await generateReference(site, upstream) assert.equal(await readFile(generated, 'utf8'), first) })) @@ -56,20 +57,24 @@ test('Silk imports prune upstream-owned pages but retain authored pages and an a const originals = await Promise.all([landing, guide, wiki].map(path => readFile(path, 'utf8'))) await put(join(upstream, 'docs/start.md'), '# Upstream start\n') await put(join(upstream, 'docs/guides/custom.md'), '# Upstream guide\n') - await put(join(upstream, 'docs/language/new.md'), '# New\n\nWorks today: prose\n\n```silk\n// Works today: {{ literal }} \n```\n') + await put(join(upstream, 'docs/spec/2026.md'), '# Silk specification\n') + await put(join(upstream, 'docs/language/new.md'), '# New\n\nWorks today: prose\n\n```silk\n// Works today: {{ literal }} \n```\n') await syncFromSilkDocs(site, upstream) assert.deepEqual(await Promise.all([landing, guide, wiki].map(path => readFile(path, 'utf8'))), originals) await assert.rejects(stat(removed), { code: 'ENOENT' }) const added = join(site, 'src/silk/docs/language/new/page.md') const first = await readFile(added, 'utf8') - assert.equal(splitPage(first).metadata.layout, 'silk-docs') + assert.equal(splitPage(first).metadata.layout, 'docs') + assert.equal(splitPage(await readFile(join(site, 'src/silk/spec/2026/page.md'), 'utf8')).metadata.layout, 'spec') assert.ok(first.includes('// Works today: {{ literal }} \n')) await syncFromSilkDocs(site, upstream) assert.equal(await readFile(added, 'utf8'), first) await put(join(upstream, 'docs/wiki/fresh.md'), '# Fresh wiki\n') await syncFromSilkDocs(site, upstream) await assert.rejects(stat(wiki), { code: 'ENOENT' }) - assert.ok((await readFile(join(site, 'src/silk/wiki/fresh/page.md'), 'utf8')).includes('# Fresh wiki')) + const fresh = splitPage(await readFile(join(site, 'src/silk/wiki/fresh/page.md'), 'utf8')) + assert.equal(fresh.metadata.layout, 'docs') + assert.ok(fresh.body.includes('# Fresh wiki')) })) test('Runtime validation failures do not partially import staged changes', async () => temporary(async (site, upstream) => { const curated = await page(site, 'runtime/docs/javascript/application', 'runtime', 'javascript/application.md', '# Authored\n') diff --git a/tools/import-public.ts b/tools/import-public.ts index a5d0a4a8..26c1ca86 100644 --- a/tools/import-public.ts +++ b/tools/import-public.ts @@ -100,7 +100,7 @@ export async function importCollection( const text = linkReferences(body, collection, file, catalog) const metadata = { ...(previous?.metadata || { - layout: collection === 'silk' && file === 'spec/2026.md' ? 'spec' : `${collection}-docs`, + layout: collection === 'silk' && file === 'spec/2026.md' ? 'spec' : 'docs', title, description: '', docsCollection: collection, diff --git a/tools/migration/migrate.ts b/tools/migration/migrate.ts index 29c4dd79..fb5dcae6 100644 --- a/tools/migration/migrate.ts +++ b/tools/migration/migrate.ts @@ -81,7 +81,7 @@ for (const [key, c] of Object.entries(collections)) { order: order++, } const vars = { - layout: collection === 'silk' && id === 'spec/2026' ? 'spec' : `${collection}-docs`, + layout: collection === 'silk' && id === 'spec/2026' ? 'spec' : 'docs', title: info.title.replace(/`/g, ''), description: description(body), docsCollection: collection, From 7529243a33cb387b33c1aa44d530257da14c2984 Mon Sep 17 00:00:00 2001 From: Bret Comnes <bret@comnes.org> Date: Mon, 14 Sep 2026 19:09:33 -0700 Subject: [PATCH 3/5] refactor: adopt page-owned exports and typed layout contracts --- README.md | 41 +++++++--- docs/migration.md | 31 ++++++- package-lock.json | 8 +- package.json | 5 +- src/CNAME.template.ts | 4 + src/artifacts.template.ts | 12 --- src/blog/page.vars.ts | 8 +- src/cname.template.ts | 6 -- src/docs/client.ts | 2 +- src/docs/page.vars.ts | 8 +- src/{ => globals}/global.data.ts | 4 +- src/{ => globals}/global.vars.ts | 0 src/layouts/docs.layout.client.ts | 12 +-- src/layouts/docs.layout.ts | 7 +- src/layouts/learn.layout.client.ts | 4 +- src/layouts/learn.layout.ts | 2 +- src/layouts/registry.ts | 20 +++++ src/layouts/root.layout.ts | 6 +- src/layouts/spec.layout.client.ts | 6 +- src/layouts/spec.layout.ts | 7 +- src/lib/artifacts.ts | 32 +++----- src/lib/docs-page-outputs.ts | 7 ++ src/lib/page-vars.ts | 10 +++ src/llms.txt.template.ts | 10 +++ src/markdown-it.settings.ts | 2 +- src/navigation.template.ts | 11 --- src/nojekyll.template.ts | 2 + src/page.vars.ts | 8 +- src/runtime-sources.template.ts | 6 -- .../docs/search.json.template.ts} | 6 +- src/runtime/learn/configuration/page.vars.ts | 8 +- .../learn/desktop-integrations/page.vars.ts | 8 +- .../learn/getting-started/page.vars.ts | 8 +- src/runtime/learn/page.vars.ts | 8 +- src/runtime/learn/project-layout/page.vars.ts | 8 +- .../learn/windows-and-messaging/page.vars.ts | 8 +- .../llms.txt.template.ts} | 4 +- src/runtime/page.vars.ts | 8 +- src/sage-sources.template.ts | 6 -- .../docs/search.json.template.ts} | 6 +- .../llms.txt.template.ts} | 4 +- src/sage/page.vars.ts | 8 +- src/silk-sources.template.ts | 6 -- .../docs/search.json.template.ts} | 6 +- src/silk/learn/getting-started/page.vars.ts | 8 +- src/silk/learn/language-tour/page.vars.ts | 8 +- .../learn/modules-and-packages/page.vars.ts | 8 +- src/silk/learn/page.vars.ts | 8 +- .../learn/results-and-errors/page.vars.ts | 8 +- .../learn/types-and-optionals/page.vars.ts | 8 +- .../llms.txt.template.ts} | 4 +- src/silk/page.vars.ts | 8 +- .../wiki/search.json.template.ts} | 6 +- src/silkWiki-sources.template.ts | 6 -- ...ap.template.ts => sitemap.xml.template.ts} | 4 +- src/slg-sources.template.ts | 6 -- .../docs/search.json.template.ts} | 6 +- .../llms.txt.template.ts} | 4 +- src/slg/page.vars.ts | 8 +- src/virtnosis-sources.template.ts | 6 -- .../docs/search.json.template.ts} | 6 +- .../llms.txt.template.ts} | 4 +- src/virtnosis/page.vars.ts | 8 +- tests/content.test.ts | 6 +- tests/docs-data.test.ts | 23 ++++-- tests/docs-watch.test.ts | 27 +++--- tests/import-roundtrip.test.ts | 2 +- tests/layout-types.typecheck.ts | 47 +++++++++++ tests/site/output.test.ts | 44 +++++++++- tests/tooling/content-audit-baseline.json | 8 +- tests/tooling/content-audit.test.ts | 64 ++++++++++++--- tests/tooling/watch.test.ts | 82 ++++++++++++++----- tools/audit-content.ts | 3 +- tools/audits/common.ts | 50 +++++++---- tools/audits/runtime.ts | 3 +- tools/audits/silk.ts | 11 +-- tools/import-public.ts | 2 +- tools/migration/content.ts | 4 +- tools/migration/migrate.ts | 4 +- tools/migration/references.ts | 4 +- tools/source-pages.ts | 2 +- 81 files changed, 598 insertions(+), 295 deletions(-) create mode 100644 src/CNAME.template.ts delete mode 100644 src/artifacts.template.ts delete mode 100644 src/cname.template.ts rename src/{ => globals}/global.data.ts (94%) rename src/{ => globals}/global.vars.ts (100%) create mode 100644 src/layouts/registry.ts create mode 100644 src/lib/docs-page-outputs.ts create mode 100644 src/lib/page-vars.ts create mode 100644 src/llms.txt.template.ts delete mode 100644 src/navigation.template.ts create mode 100644 src/nojekyll.template.ts delete mode 100644 src/runtime-sources.template.ts rename src/{runtime-search.template.ts => runtime/docs/search.json.template.ts} (58%) rename src/{runtime-llms.template.ts => runtime/llms.txt.template.ts} (80%) delete mode 100644 src/sage-sources.template.ts rename src/{sage-search.template.ts => sage/docs/search.json.template.ts} (58%) rename src/{sage-llms.template.ts => sage/llms.txt.template.ts} (79%) delete mode 100644 src/silk-sources.template.ts rename src/{silk-search.template.ts => silk/docs/search.json.template.ts} (58%) rename src/{silk-llms.template.ts => silk/llms.txt.template.ts} (83%) rename src/{silkWiki-search.template.ts => silk/wiki/search.json.template.ts} (58%) delete mode 100644 src/silkWiki-sources.template.ts rename src/{sitemap.template.ts => sitemap.xml.template.ts} (77%) delete mode 100644 src/slg-sources.template.ts rename src/{slg-search.template.ts => slg/docs/search.json.template.ts} (59%) rename src/{slg-llms.template.ts => slg/llms.txt.template.ts} (79%) delete mode 100644 src/virtnosis-sources.template.ts rename src/{virtnosis-search.template.ts => virtnosis/docs/search.json.template.ts} (57%) rename src/{virtnosis-llms.template.ts => virtnosis/llms.txt.template.ts} (80%) create mode 100644 tests/layout-types.typecheck.ts diff --git a/README.md b/README.md index 089041d7..1df5bcfb 100644 --- a/README.md +++ b/README.md @@ -22,17 +22,35 @@ are output files; do not commit `public/`. - `src/**/page.html`: authored page fragments, with metadata in `page.vars.ts`. - `src/**/page.md`: public documentation, including YAML frontmatter. - `src/layouts/`: shared page chrome, navigation, and progressive browser clients. + `registry.ts` registers actual layout exports with DOMStack's type-only registry. + HTML `page.vars.ts` companions use `CheckedPageVars` from `#lib/page-vars.ts` + to validate supplied metadata against their layout chain and global vars during + `npm run typecheck`; this adds no runtime registry or subscriptions. - `src/globals/global.css`: shared Oro styles, based on `docs/branding/`. Homepage styles live in `src/style.css`; learn styles in `src/layouts/learn.layout.css`. - `src/lib/`: rendering, URL, collection, and navigation helpers. -- `src/global.data.ts`: validated collection metadata and precomputed navigation, - search, and source-export projections derived from source pages. +- `src/globals/global.vars.ts`: shared site configuration. +- `src/globals/global.data.ts`: validated collection metadata and precomputed navigation, + search, and LLM-export projections derived from source pages. - `src/layouts/docs.layout.ts`: the shared documentation renderer, consuming one lightweight navigation key for all collections. -- `src/navigation.template.ts`: navigation indexes for all collections. -- `src/*-{search,sources,llms}.template.ts`: dependency-scoped collection - artifacts; `src/sitemap.template.ts`: sitemap output; - `src/artifacts.template.ts`: site-wide LLM directory and `.nojekyll`. +- `src/{product}/llms.txt.template.ts`: product LLM packs; Silk includes its wiki. +- `src/{product}/docs/search.json.template.ts`: collection search indexes; + the wiki uses `src/silk/wiki/`. +- `src/lib/docs-page-outputs.ts`: shared `pageOutputs` hook exported by the `docs` + and `spec` layouts. Each page owns its raw Markdown export at its existing + collection `source/` URL, using its `sourcePath`. +- `src/llms.txt.template.ts`, `sitemap.xml.template.ts`, `CNAME.template.ts`, + and `nojekyll.template.ts`: site-wide artifacts. + +Templates live beside their output locations. Single-file templates return strings +and use their filenames without `.template.ts` as output names. The root +`nojekyll.template.ts` explicitly names its hidden output `.nojekyll`. +Raw Markdown uses DOMStack page outputs instead of collection templates: body +edits update only that page's raw copy, and watch rebuilds retain unchanged copies +without rewriting them. Deleted pages and changed raw paths clean up owned files. +Navigation is rendered into HTML from global data; the legacy navigation +`index.json` endpoints are no longer generated. Consult `docs/branding/` before changing visual design or copy tone. The approved logo originals remain in `docs/branding/assets/`; their checked mirrors in `src/docs/branding/assets/` retain @@ -52,8 +70,8 @@ New imported pages are appended; review their section and order after syncing. Use `layout: "docs"` for documentation pages in every collection (`spec` for the specification). All docs share one lightweight navigation dependency: navigation changes rebuild all docs, while body-only edits remain isolated to the changed -article and its collection's search and exports. Search and raw-source/LLM -artifacts retain separate, per-collection dependencies. +article, its raw output, and its collection's search and LLM exports. Search and +LLM artifacts retain separate, per-collection dependencies; raw outputs need none. Use canonical directory links such as `/runtime/docs/guides/hello-world/`. Collection roots redirect legacy `?p=` links while preserving fragments. Static @@ -86,9 +104,10 @@ catalog includes new pages in the same import batch. Runtime's generated reference markers retain surrounding prose. The generators call the TypeScript importer directly; they never run during a -DOMStack build. JSON indexes and LLM exports are DOMStack templates, not ingestion -outputs. Content audits run through `tools/audit-content.ts` and inspect `public/` -by default; set `ORO_SITE_OUTPUT` to inspect +DOMStack build. Search indexes and LLM exports are DOMStack templates, not ingestion +outputs. Content audits derive document IDs and expected raw filenames from committed +Markdown frontmatter, then inspect the generated files in `public/` by default. +They do not depend on public navigation JSON. Set `ORO_SITE_OUTPUT` to inspect another output directory. Set `ORO_RUNTIME_REPO` explicitly to additionally audit against a particular upstream Runtime checkout; ordinary checks are independent of whatever happens to be checked out next door. diff --git a/docs/migration.md b/docs/migration.md index 99ede845..593ada13 100644 --- a/docs/migration.md +++ b/docs/migration.md @@ -13,7 +13,7 @@ remains reproducible. Production cutover is complete; deployment evidence is rec | Compatibility | Original collection roots, all valid legacy document IDs, aliases, fragments, and raw Markdown endpoints are retained. | | Page chrome | Headers, footers, metadata, product navigation, learn chapter bars, documentation sidebars, breadcrumbs, previous/next links, and heading lists render at build time. | | Progressive features | Search, keyboard tabs, copy controls, Ask AI, mobile sidebar controls, active headings, and tab fragments work with browser JavaScript. | -| Artifacts | One build emits HTML, indexes, search data, raw Markdown, LLM packs, the sitemap, CNAME, and `.nojekyll`. | +| Artifacts | One build emits HTML, search indexes, raw Markdown, LLM packs, the sitemap, CNAME, and `.nojekyll`. Legacy navigation JSON exports are retired. | | Ingestion | Native TypeScript tools retain Silk and Runtime upstream/editorial ownership rules and explicit checkout paths. Unchanged public pages retain exact Markdown and metadata. | | Cleanup | The browser Markdown renderers, vendored rendering libraries, old HTML shells, duplicate Python exporters, generated source-tree indexes, and Jekyll configuration are retired. | | CI | Node 24 runs ingestion, audits, browser serving, and the `npm run check` gate without Python. Pull requests validate in Docs Audit; production pushes validate and deploy the same artifact in Pages, without a duplicate push audit. | @@ -21,9 +21,13 @@ remains reproducible. Production cutover is complete; deployment evidence is rec All six documentation collections use the single `docs` layout; the Silk specification retains `spec`. The `docs` layout subscribes to one shared, lightweight navigation key covering all collections. Navigation changes rebuild -all docs. Body-only edits remain isolated to the changed article and its -collection's search and exports: search and raw-source/LLM templates retain -separate, per-collection dependencies. Ingestion remains separate from building. +all docs. Body-only edits update the changed article and its page-owned raw copy, +plus its collection's search and LLM templates, which retain per-collection +dependencies. DOMStack 12.0.0-beta.6 supplies the `pageOutputs` hook shared by +`docs` and `spec`; no collection subscription is needed for raw exports. Watch +rebuilds skip unchanged raw writes and clean up removed or renamed outputs. +Global data still processes all documents for search; this change narrows output +writes, not that computation. Ingestion remains separate from building. Shared article transforms remain page-local rather than storing rendered articles in global data. Markdown keeps the existing alerts, highlighting, and legacy heading-ID policy; enabling @@ -31,11 +35,30 @@ additional DOMStack Markdown plugins is an explicit compatibility decision. Homepage and learn styles are scoped to their consumers, and progressive clients are TypeScript modules rather than unchecked global initializers. +Artifact templates are co-located with their output directories: product +`llms.txt.template.ts` files and collection `search.json.template.ts` files. +The former six `source/sources.template.ts` exporters are replaced by the shared +`src/lib/docs-page-outputs.ts` hook, with each source page owning its raw output. +The wiki uses `src/silk/wiki/`; other collections use `src/{product}/docs/`. +Navigation remains in global data for HTML rendering, not as public `index.json` +exports. Content audits read committed Markdown metadata for document IDs and +expected raw exports. Single-file outputs use the template filename without `.template.ts`; +raw page outputs use destination-root paths derived from collection metadata and +`sourcePath`, preserving public URLs and Markdown bytes with frontmatter stripped. Site-wide `llms.txt`, sitemap, CNAME, and `.nojekyll` templates +remain at the source root, with an explicit hidden-output name for `.nojekyll`. + The route inventory is in `tools/migration/baseline.json`; original Markdown links and heading text are in `tools/migration/link-inventory.json`. The migration utility can reconstruct the initial conversion from a legacy checkout. It is not part of ordinary builds or content refreshes. +HTML page companions now validate their supplied vars with DOMStack's type-only +layout registry and `ValidatePageVars`, via `CheckedPageVars`. The registry +references actual renderer, parent, and default exports for all seven layouts; +it does not alter runtime discovery, rendering, or subscriptions. Markdown +frontmatter continues to use runtime metadata validation rather than per-page +TypeScript companions. + ## Acceptance checks `npm run check` runs: diff --git a/package-lock.json b/package-lock.json index 26f45920..ab113b8f 100644 --- a/package-lock.json +++ b/package-lock.json @@ -6,7 +6,7 @@ "": { "name": "oro-website", "devDependencies": { - "@domstack/static": "beta", + "@domstack/static": "12.0.0-beta.6", "@playwright/test": "^1.55.0", "@types/markdown-it": "^14.1.2", "@types/node": "^24.0.0", @@ -75,9 +75,9 @@ } }, "node_modules/@domstack/static": { - "version": "12.0.0-beta.5", - "resolved": "https://registry.npmjs.org/@domstack/static/-/static-12.0.0-beta.5.tgz", - "integrity": "sha512-9MnBvELmRHVftEvmbKoRcuJe/xrrHTah6+jXnDAQVYaPBqlUpc/AVdfCpjPSo/wIoMCo0uWTUVVplb2KSEpN1A==", + "version": "12.0.0-beta.6", + "resolved": "https://registry.npmjs.org/@domstack/static/-/static-12.0.0-beta.6.tgz", + "integrity": "sha512-Rti3mJT8ja6hZEP1NOggZaBBzlmr9X/OnccBQdlGtfagbFlrX0DyuMWYq9upXWmDUy2cmjBU/zDJYja9uCfjnQ==", "dev": true, "license": "MIT", "workspaces": [ diff --git a/package.json b/package.json index 610cda61..984c7d19 100644 --- a/package.json +++ b/package.json @@ -5,6 +5,9 @@ "engines": { "node": ">=24" }, + "imports": { + "#lib/*": "./src/lib/*" + }, "scripts": { "clean": "node tools/clean.ts", "build": "npm run clean && domstack", @@ -22,7 +25,7 @@ "check": "npm run typecheck && npm test && npm run build && npm run audit && npm run audit:content && npm run test:site && npm run test:browser && npm run test:tooling && npm run test:reproducibility" }, "devDependencies": { - "@domstack/static": "beta", + "@domstack/static": "12.0.0-beta.6", "@playwright/test": "^1.55.0", "@types/markdown-it": "^14.1.2", "@types/node": "^24.0.0", diff --git a/src/CNAME.template.ts b/src/CNAME.template.ts new file mode 100644 index 00000000..e77d0705 --- /dev/null +++ b/src/CNAME.template.ts @@ -0,0 +1,4 @@ +import { readFile } from 'node:fs/promises' +// Keep the custom domain in the repository's canonical CNAME file. +export const dataDeps = [] +export default () => readFile(new URL('../CNAME', import.meta.url), 'utf8') diff --git a/src/artifacts.template.ts b/src/artifacts.template.ts deleted file mode 100644 index 327ff8f6..00000000 --- a/src/artifacts.template.ts +++ /dev/null @@ -1,12 +0,0 @@ -import type { TemplateFunction } from '@domstack/static/types.js' -import { collections } from './lib/collections.ts' -import { output } from './lib/artifacts.ts' -export const dataDeps = [] -const artifacts: TemplateFunction<{ siteUrl: string }> = ({ vars }) => [ - output('/llms.txt', '# Oro Computer\n\n' + - [...new Set(Object.values(collections).map(c => c.product))] - .map(p => `- [${p} documentation](${new URL(`/${p}/llms.txt`, vars.siteUrl).href})`) - .join('\n') + '\n'), - output('/.nojekyll', ''), -] -export default artifacts diff --git a/src/blog/page.vars.ts b/src/blog/page.vars.ts index 46e06463..71b62305 100644 --- a/src/blog/page.vars.ts +++ b/src/blog/page.vars.ts @@ -1,5 +1,7 @@ -export default { - "layout": "marketing", +import type { CheckedPageVars } from '#lib/page-vars.ts' + +const vars = { + "layout": "marketing" as const, "title": "Blog · Oro Computer", "description": "The Oro Computer blog is coming soon.", "bodyClass": "site-dark blog-page", @@ -7,3 +9,5 @@ export default { "product": "blog", "footerLabel": "Oro Computer Blog" } + +export default vars satisfies CheckedPageVars<typeof vars> diff --git a/src/cname.template.ts b/src/cname.template.ts deleted file mode 100644 index 1c03a990..00000000 --- a/src/cname.template.ts +++ /dev/null @@ -1,6 +0,0 @@ -import { readFile } from 'node:fs/promises' -// Keep the custom domain in the repository's canonical CNAME file. -export default async () => ({ - outputName: 'CNAME', - content: await readFile(new URL('../CNAME', import.meta.url), 'utf8'), -}) diff --git a/src/docs/client.ts b/src/docs/client.ts index e949ecf9..506a227f 100644 --- a/src/docs/client.ts +++ b/src/docs/client.ts @@ -1,3 +1,3 @@ -import { initAskAiMenu } from '../lib/ask-ai-client.ts' +import { initAskAiMenu } from '#lib/ask-ai-client.ts' initAskAiMenu() diff --git a/src/docs/page.vars.ts b/src/docs/page.vars.ts index fb38a2cb..7de56fc3 100644 --- a/src/docs/page.vars.ts +++ b/src/docs/page.vars.ts @@ -1,5 +1,7 @@ -export default { - "layout": "marketing", +import type { CheckedPageVars } from '#lib/page-vars.ts' + +const vars = { + "layout": "marketing" as const, "title": "Docs · Oro Computer", "description": "Oro Computer documentation hub for Oro Runtime and Silk, with quick starts, guides, full references, CLI docs, embedders, and Formal Silk.", "bodyClass": "site-dark docs-landing-page", @@ -7,3 +9,5 @@ export default { "product": "docs", "footerLabel": "Oro Computer Docs" } + +export default vars satisfies CheckedPageVars<typeof vars> diff --git a/src/global.data.ts b/src/globals/global.data.ts similarity index 94% rename from src/global.data.ts rename to src/globals/global.data.ts index d7d8ba10..5fa54ea4 100644 --- a/src/global.data.ts +++ b/src/globals/global.data.ts @@ -1,6 +1,6 @@ import type { GlobalDataFunction } from '@domstack/static/types.js' -import { collections, type Collection } from './lib/collections.ts' -import { editUrl, plainText, projectCollection, validateDocVars, type Doc, type DocsData } from './lib/docs.ts' +import { collections, type Collection } from '#lib/collections.ts' +import { editUrl, plainText, projectCollection, validateDocVars, type Doc, type DocsData } from '#lib/docs.ts' const globalData: GlobalDataFunction<DocsData, Record<string, unknown>, string> = async ({ pages }) => { const docs: Record<Collection, Doc[]> = { runtime: [], silk: [], silkWiki: [], virtnosis: [], sage: [], slg: [], diff --git a/src/global.vars.ts b/src/globals/global.vars.ts similarity index 100% rename from src/global.vars.ts rename to src/globals/global.vars.ts diff --git a/src/layouts/docs.layout.client.ts b/src/layouts/docs.layout.client.ts index c0aa4770..b5b55085 100644 --- a/src/layouts/docs.layout.client.ts +++ b/src/layouts/docs.layout.client.ts @@ -1,9 +1,9 @@ -import { initAskAiMenu } from '../lib/ask-ai-client.ts' -import { legacyTarget } from '../lib/legacy.ts' -import { enhanceSidebar } from '../lib/sidebar-client.ts' -import { initLearn } from '../lib/learn-client.ts' -import { renderTabs } from '../lib/tabs.ts' -import { enhanceArticle } from '../lib/article-client.ts' +import { initAskAiMenu } from '#lib/ask-ai-client.ts' +import { legacyTarget } from '#lib/legacy.ts' +import { enhanceSidebar } from '#lib/sidebar-client.ts' +import { initLearn } from '#lib/learn-client.ts' +import { renderTabs } from '#lib/tabs.ts' +import { enhanceArticle } from '#lib/article-client.ts' const app = document.querySelector<HTMLElement>('[data-docs-app]') if (app) { const routes = document.querySelector('[data-legacy-routes]') diff --git a/src/layouts/docs.layout.ts b/src/layouts/docs.layout.ts index e0034a4d..fdb939d9 100644 --- a/src/layouts/docs.layout.ts +++ b/src/layouts/docs.layout.ts @@ -1,11 +1,12 @@ import { html, raw, render } from 'fragtml' -import { article } from '../lib/rendering.ts' +import { article } from '#lib/rendering.ts' import type { DataDeps, LayoutFunction } from '@domstack/static/types.js' import { collections, sectionTitle, -} from '../lib/collections.ts' -import { rawUrl, type DocLink, type NavigationData, type DocVars } from '../lib/docs.ts' +} from '#lib/collections.ts' +import { rawUrl, type DocLink, type NavigationData, type DocVars } from '#lib/docs.ts' +export { pageOutputs } from '#lib/docs-page-outputs.ts' export const parentLayout = 'root' export const vars = { dataDeps: ['navigation'] satisfies DataDeps<NavigationData>, diff --git a/src/layouts/learn.layout.client.ts b/src/layouts/learn.layout.client.ts index 61abbd96..caa7ffa4 100644 --- a/src/layouts/learn.layout.client.ts +++ b/src/layouts/learn.layout.client.ts @@ -1,3 +1 @@ -import { initLearn } from '../lib/learn-client.ts' - -initLearn() +import '#lib/learn-client.ts' diff --git a/src/layouts/learn.layout.ts b/src/layouts/learn.layout.ts index 8ef98e48..b9120383 100644 --- a/src/layouts/learn.layout.ts +++ b/src/layouts/learn.layout.ts @@ -1,6 +1,6 @@ import { html, render } from 'fragtml' import type { LayoutFunction } from '@domstack/static/types.js' -import { names } from '../lib/navigation.ts' +import { names } from '#lib/navigation.ts' export const parentLayout = 'root' interface LearnVars { product: string diff --git a/src/layouts/registry.ts b/src/layouts/registry.ts new file mode 100644 index 00000000..8e575b2c --- /dev/null +++ b/src/layouts/registry.ts @@ -0,0 +1,20 @@ +import type * as root from './root.layout.ts' +import type * as marketing from './marketing.layout.ts' +import type * as product from './product.layout.ts' +import type * as learn from './learn.layout.ts' +import type * as redirect from './redirect.layout.ts' +import type * as docs from './docs.layout.ts' +import type * as spec from './spec.layout.ts' + +// DOMStack's type registry names the renderer `render`; layout modules export it as default. +declare module '@domstack/static/types.js' { + interface LayoutRegistry { + root: typeof root & { render: typeof root.default } + marketing: typeof marketing & { render: typeof marketing.default } + product: typeof product & { render: typeof product.default } + learn: typeof learn & { render: typeof learn.default } + redirect: typeof redirect & { render: typeof redirect.default } + docs: typeof docs & { render: typeof docs.default } + spec: typeof spec & { render: typeof spec.default } + } +} diff --git a/src/layouts/root.layout.ts b/src/layouts/root.layout.ts index c69f94e7..e13cd2a3 100644 --- a/src/layouts/root.layout.ts +++ b/src/layouts/root.layout.ts @@ -1,8 +1,8 @@ -import { rootContent } from '../lib/rendering.ts' +import { rootContent } from '#lib/rendering.ts' import { html, raw, render } from 'fragtml' import type { LayoutFunction } from '@domstack/static/types.js' -import { header, footer } from '../lib/navigation.ts' -import { collections, type Collection } from '../lib/collections.ts' +import { header, footer } from '#lib/navigation.ts' +import { collections, type Collection } from '#lib/collections.ts' interface RootVars { title: string siteUrl: string diff --git a/src/layouts/spec.layout.client.ts b/src/layouts/spec.layout.client.ts index 24bac85c..abeec959 100644 --- a/src/layouts/spec.layout.client.ts +++ b/src/layouts/spec.layout.client.ts @@ -1,6 +1,6 @@ -import { initAskAiMenu } from '../lib/ask-ai-client.ts' -import { enhanceSidebar } from '../lib/sidebar-client.ts' -import { enhanceArticle } from '../lib/article-client.ts' +import { initAskAiMenu } from '#lib/ask-ai-client.ts' +import { enhanceSidebar } from '#lib/sidebar-client.ts' +import { enhanceArticle } from '#lib/article-client.ts' const app = document.querySelector<HTMLElement>('[data-spec-app]') if (app) { enhanceArticle(app) diff --git a/src/layouts/spec.layout.ts b/src/layouts/spec.layout.ts index a32e767b..c89f8e0c 100644 --- a/src/layouts/spec.layout.ts +++ b/src/layouts/spec.layout.ts @@ -1,8 +1,9 @@ import { html, raw, render } from 'fragtml' import type { LayoutFunction } from '@domstack/static/types.js' -import { article } from '../lib/rendering.ts' -import { collections } from '../lib/collections.ts' -import { rawUrl, type DocVars } from '../lib/docs.ts' +import { article } from '#lib/rendering.ts' +import { collections } from '#lib/collections.ts' +import { rawUrl, type DocVars } from '#lib/docs.ts' +export { pageOutputs } from '#lib/docs-page-outputs.ts' export const parentLayout = 'root' type SpecVars = DocVars & { specLabel?: string } const spec: LayoutFunction<SpecVars, string> = ({ vars: v, children }) => { diff --git a/src/lib/artifacts.ts b/src/lib/artifacts.ts index a88855a1..ab02c5d6 100644 --- a/src/lib/artifacts.ts +++ b/src/lib/artifacts.ts @@ -1,28 +1,16 @@ -import { collections, type Collection } from './collections.ts' -import { rawUrl, type Navigation, type ExportDoc } from './docs.ts' -export interface Output { outputName: string; content: string } -export const output = (name: string, content: string): Output => ({ outputName: name.replace(/^\//, ''), content }) -export const json = (name: string, value: unknown): Output => output(name, JSON.stringify(value, null, 2) + '\n') -export function collectionIndex(collection: Collection, navigation: Navigation): Output { - return json(collections[collection].base + 'index.json', { - kind: collection === 'silkWiki' ? 'wiki' : 'docs', - count: Object.keys(navigation.bySource).length, - sections: navigation.sections.map(s => ({ name: s.name, items: s.items.map(d => ({ - id: d.id, title: d.title, file: d.sourcePath, url: d.url, - })) })), - }) -} -export function sources(docs: ExportDoc[]): Output[] { - return docs.map(d => output(rawUrl(d), d.markdown)) -} -export function pack(product: string, docs: ExportDoc[], siteUrl: string): Output { - return output(`/${product}/llms.txt`, `# ${product} documentation\n\n` + docs.map(d => +import { rawUrl, type ExportDoc } from './docs.ts' + +export const json = (value: unknown): string => JSON.stringify(value, null, 2) + '\n' + + +export function pack(product: string, docs: ExportDoc[], siteUrl: string): string { + return `# ${product} documentation\n\n` + docs.map(d => `## ${d.title}\n\nURL: ${new URL(d.url, siteUrl).href}\nSource: ${new URL(rawUrl(d), siteUrl).href}\n\n${d.markdown}`, - ).join('\n---\n\n')) + ).join('\n---\n\n') } export function xmlEscape(value: string): string { return value.replace(/[&<>"']/g, c => ({ '&': '&', '<': '<', '>': '>', '"': '"', "'": ''' })[c]!) } -export function sitemap(routes: string[], siteUrl: string): Output { - return output('/sitemap.xml', '<?xml version="1.0" encoding="UTF-8"?>\n<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">' + routes.map(url => `<url><loc>${xmlEscape(new URL(url, siteUrl).href)}</loc></url>`).join('') + '</urlset>\n') +export function sitemap(routes: string[], siteUrl: string): string { + return '<?xml version="1.0" encoding="UTF-8"?>\n<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">' + routes.map(url => `<url><loc>${xmlEscape(new URL(url, siteUrl).href)}</loc></url>`).join('') + '</urlset>\n' } diff --git a/src/lib/docs-page-outputs.ts b/src/lib/docs-page-outputs.ts new file mode 100644 index 00000000..16e160c0 --- /dev/null +++ b/src/lib/docs-page-outputs.ts @@ -0,0 +1,7 @@ +import type { PageOutputsFunction } from '@domstack/static/types.js' +import { rawUrl, type DocVars } from './docs.ts' + +export const pageOutputs: PageOutputsFunction<DocVars> = async ({ page, vars }) => ({ + outputName: rawUrl({ collection: vars.docsCollection, sourcePath: vars.sourcePath }), + content: await page.readMarkdownContent(), +}) diff --git a/src/lib/page-vars.ts b/src/lib/page-vars.ts new file mode 100644 index 00000000..01f406b1 --- /dev/null +++ b/src/lib/page-vars.ts @@ -0,0 +1,10 @@ +import type { ValidatePageVars } from '@domstack/static/types.js' +import type globalVars from '../globals/global.vars.ts' +import type {} from '../layouts/registry.ts' + +// Validate supplied HTML companion vars, rather than inferring missing renderer requirements. +export type CheckedPageVars<Vars extends { layout: string }> = ValidatePageVars< + Vars['layout'], + Vars, + typeof globalVars +> diff --git a/src/llms.txt.template.ts b/src/llms.txt.template.ts new file mode 100644 index 00000000..a445c22d --- /dev/null +++ b/src/llms.txt.template.ts @@ -0,0 +1,10 @@ +import type { TemplateFunction } from '@domstack/static/types.js' +import { collections } from '#lib/collections.ts' + +export const dataDeps = [] +const template: TemplateFunction<{ siteUrl: string }> = ({ vars }) => + '# Oro Computer\n\n' + + [...new Set(Object.values(collections).map(c => c.product))] + .map(p => `- [${p} documentation](${new URL(`/${p}/llms.txt`, vars.siteUrl).href})`) + .join('\n') + '\n' +export default template diff --git a/src/markdown-it.settings.ts b/src/markdown-it.settings.ts index da15ee30..12c8e148 100644 --- a/src/markdown-it.settings.ts +++ b/src/markdown-it.settings.ts @@ -1,4 +1,4 @@ -import { markdown } from './lib/markdown.ts' +import { markdown } from '#lib/markdown.ts' // DOMStack accepts a factory returning a fully configured MarkdownIt instance. // A fresh instance keeps heading-ID state page-local and bypasses default plugins. export default markdown diff --git a/src/navigation.template.ts b/src/navigation.template.ts deleted file mode 100644 index 989df79e..00000000 --- a/src/navigation.template.ts +++ /dev/null @@ -1,11 +0,0 @@ -import type { DataDeps, TemplateFunction } from '@domstack/static/types.js' -import { collections, type Collection } from './lib/collections.ts' -import type { NavigationData } from './lib/docs.ts' -import { collectionIndex } from './lib/artifacts.ts' - -export const dataDeps = ['navigation'] satisfies DataDeps<NavigationData> -const template: TemplateFunction<Record<string, unknown>, NavigationData> = ({ data }) => - (Object.keys(collections) as Collection[]).map(collection => - collectionIndex(collection, data.navigation[collection]), - ) -export default template diff --git a/src/nojekyll.template.ts b/src/nojekyll.template.ts new file mode 100644 index 00000000..48345f0f --- /dev/null +++ b/src/nojekyll.template.ts @@ -0,0 +1,2 @@ +export const dataDeps = [] +export default () => ({ outputName: '.nojekyll', content: '' }) diff --git a/src/page.vars.ts b/src/page.vars.ts index f5fe0fe4..ea84c0b0 100644 --- a/src/page.vars.ts +++ b/src/page.vars.ts @@ -1,5 +1,7 @@ -export default { - layout: 'marketing', +import type { CheckedPageVars } from '#lib/page-vars.ts' + +const vars = { + layout: 'marketing' as const, title: 'Technology · Oro Computer', description: 'Oro Computer builds edge software foundations for humans and AI agents through Oro Runtime, Silk, and Virtnosis.', @@ -8,3 +10,5 @@ export default { product: '', footerLabel: '', } + +export default vars satisfies CheckedPageVars<typeof vars> diff --git a/src/runtime-sources.template.ts b/src/runtime-sources.template.ts deleted file mode 100644 index d88a7ce1..00000000 --- a/src/runtime-sources.template.ts +++ /dev/null @@ -1,6 +0,0 @@ -import type { DataDeps, TemplateFunction } from '@domstack/static/types.js' -import type { DocsData } from './lib/docs.ts' -import { sources } from './lib/artifacts.ts' -export const dataDeps = ['runtimeExports'] satisfies DataDeps<Pick<DocsData, 'runtimeExports'>> -const template: TemplateFunction<Record<string, unknown>, Pick<DocsData, 'runtimeExports'>> = ({ data }) => sources(data.runtimeExports) -export default template diff --git a/src/runtime-search.template.ts b/src/runtime/docs/search.json.template.ts similarity index 58% rename from src/runtime-search.template.ts rename to src/runtime/docs/search.json.template.ts index 1db087d8..01760807 100644 --- a/src/runtime-search.template.ts +++ b/src/runtime/docs/search.json.template.ts @@ -1,6 +1,6 @@ import type { DataDeps, TemplateFunction } from '@domstack/static/types.js' -import type { DocsData } from './lib/docs.ts' -import { json } from './lib/artifacts.ts' +import type { DocsData } from '#lib/docs.ts' +import { json } from '#lib/artifacts.ts' export const dataDeps = ['runtimeSearch'] satisfies DataDeps<Pick<DocsData, 'runtimeSearch'>> -const template: TemplateFunction<Record<string, unknown>, Pick<DocsData, 'runtimeSearch'>> = ({ data }) => json('/runtime/docs/search.json', data.runtimeSearch) +const template: TemplateFunction<Record<string, unknown>, Pick<DocsData, 'runtimeSearch'>> = ({ data }) => json(data.runtimeSearch) export default template diff --git a/src/runtime/learn/configuration/page.vars.ts b/src/runtime/learn/configuration/page.vars.ts index e3928d4e..4ddc9f47 100644 --- a/src/runtime/learn/configuration/page.vars.ts +++ b/src/runtime/learn/configuration/page.vars.ts @@ -1,5 +1,7 @@ -export default { - "layout": "learn", +import type { CheckedPageVars } from '#lib/page-vars.ts' + +const vars = { + "layout": "learn" as const, "title": "Configuration · Learn Oro Runtime", "description": "Chapter 3 of Learn Oro Runtime: configure shared app settings, permissions, and local .ororc overrides.", "bodyClass": "site-dark product-page learn-page learn-lesson-page runtime-learn-page", @@ -22,3 +24,5 @@ export default { "position": "3 / 5" } } + +export default vars satisfies CheckedPageVars<typeof vars> diff --git a/src/runtime/learn/desktop-integrations/page.vars.ts b/src/runtime/learn/desktop-integrations/page.vars.ts index 06c3baa3..dfb489b8 100644 --- a/src/runtime/learn/desktop-integrations/page.vars.ts +++ b/src/runtime/learn/desktop-integrations/page.vars.ts @@ -1,5 +1,7 @@ -export default { - "layout": "learn", +import type { CheckedPageVars } from '#lib/page-vars.ts' + +const vars = { + "layout": "learn" as const, "title": "Desktop Integrations · Learn Oro Runtime", "description": "Chapter 5 of Learn Oro Runtime: add notifications, clipboard actions, and a native application menu.", "bodyClass": "site-dark product-page learn-page learn-lesson-page runtime-learn-page", @@ -22,3 +24,5 @@ export default { "position": "5 / 5" } } + +export default vars satisfies CheckedPageVars<typeof vars> diff --git a/src/runtime/learn/getting-started/page.vars.ts b/src/runtime/learn/getting-started/page.vars.ts index 5b9ded29..b5904723 100644 --- a/src/runtime/learn/getting-started/page.vars.ts +++ b/src/runtime/learn/getting-started/page.vars.ts @@ -1,5 +1,7 @@ -export default { - "layout": "learn", +import type { CheckedPageVars } from '#lib/page-vars.ts' + +const vars = { + "layout": "learn" as const, "title": "First Runtime App · Learn Oro Runtime", "description": "Chapter 1 of Learn Oro Runtime: create a project, edit the first page, use oro:application, and run the app.", "bodyClass": "site-dark product-page learn-page learn-lesson-page runtime-learn-page", @@ -22,3 +24,5 @@ export default { "position": "1 / 5" } } + +export default vars satisfies CheckedPageVars<typeof vars> diff --git a/src/runtime/learn/page.vars.ts b/src/runtime/learn/page.vars.ts index 0554436a..7c0d951b 100644 --- a/src/runtime/learn/page.vars.ts +++ b/src/runtime/learn/page.vars.ts @@ -1,5 +1,7 @@ -export default { - "layout": "learn", +import type { CheckedPageVars } from '#lib/page-vars.ts' + +const vars = { + "layout": "learn" as const, "title": "Learn Oro Runtime · Oro Computer", "description": "A guided Oro Runtime learning path for first runs, project layout, native capabilities, service workers, packaging, and updates.", "bodyClass": "site-dark product-page learn-page runtime-learn-page", @@ -7,3 +9,5 @@ export default { "product": "runtime", "footerLabel": "Learn Runtime" } + +export default vars satisfies CheckedPageVars<typeof vars> diff --git a/src/runtime/learn/project-layout/page.vars.ts b/src/runtime/learn/project-layout/page.vars.ts index fca904f0..f0fb52b0 100644 --- a/src/runtime/learn/project-layout/page.vars.ts +++ b/src/runtime/learn/project-layout/page.vars.ts @@ -1,5 +1,7 @@ -export default { - "layout": "learn", +import type { CheckedPageVars } from '#lib/page-vars.ts' + +const vars = { + "layout": "learn" as const, "title": "Project Layout · Learn Oro Runtime", "description": "Chapter 2 of Learn Oro Runtime: understand oro.toml, copy maps, bundled web files, and the project shape.", "bodyClass": "site-dark product-page learn-page learn-lesson-page runtime-learn-page", @@ -22,3 +24,5 @@ export default { "position": "2 / 5" } } + +export default vars satisfies CheckedPageVars<typeof vars> diff --git a/src/runtime/learn/windows-and-messaging/page.vars.ts b/src/runtime/learn/windows-and-messaging/page.vars.ts index c24cabbb..400f6984 100644 --- a/src/runtime/learn/windows-and-messaging/page.vars.ts +++ b/src/runtime/learn/windows-and-messaging/page.vars.ts @@ -1,5 +1,7 @@ -export default { - "layout": "learn", +import type { CheckedPageVars } from '#lib/page-vars.ts' + +const vars = { + "layout": "learn" as const, "title": "Windows and Messaging · Learn Oro Runtime", "description": "Chapter 4 of Learn Oro Runtime: create a second native window and pass messages between windows.", "bodyClass": "site-dark product-page learn-page learn-lesson-page runtime-learn-page", @@ -22,3 +24,5 @@ export default { "position": "4 / 5" } } + +export default vars satisfies CheckedPageVars<typeof vars> diff --git a/src/runtime-llms.template.ts b/src/runtime/llms.txt.template.ts similarity index 80% rename from src/runtime-llms.template.ts rename to src/runtime/llms.txt.template.ts index 960d0153..a1d3f86d 100644 --- a/src/runtime-llms.template.ts +++ b/src/runtime/llms.txt.template.ts @@ -1,6 +1,6 @@ import type { DataDeps, TemplateFunction } from '@domstack/static/types.js' -import type { DocsData } from './lib/docs.ts' -import { pack } from './lib/artifacts.ts' +import type { DocsData } from '#lib/docs.ts' +import { pack } from '#lib/artifacts.ts' export const dataDeps = ["runtimeExports"] satisfies DataDeps<Pick<DocsData, 'runtimeExports'>> const template: TemplateFunction<{ siteUrl: string }, Pick<DocsData, 'runtimeExports'>> = ({ data, vars }) => pack('runtime', data.runtimeExports, vars.siteUrl) export default template diff --git a/src/runtime/page.vars.ts b/src/runtime/page.vars.ts index ebf7c347..b26f6c41 100644 --- a/src/runtime/page.vars.ts +++ b/src/runtime/page.vars.ts @@ -1,5 +1,7 @@ -export default { - "layout": "product", +import type { CheckedPageVars } from '#lib/page-vars.ts' + +const vars = { + "layout": "product" as const, "title": "Oro Runtime · Oro Computer", "description": "Oro Runtime turns web projects into native applications with project configuration, packaging, service workers, windows, files, and updates.", "bodyClass": "site-dark product-page runtime-product-page", @@ -7,3 +9,5 @@ export default { "product": "runtime", "footerLabel": "Oro Runtime" } + +export default vars satisfies CheckedPageVars<typeof vars> diff --git a/src/sage-sources.template.ts b/src/sage-sources.template.ts deleted file mode 100644 index a963efea..00000000 --- a/src/sage-sources.template.ts +++ /dev/null @@ -1,6 +0,0 @@ -import type { DataDeps, TemplateFunction } from '@domstack/static/types.js' -import type { DocsData } from './lib/docs.ts' -import { sources } from './lib/artifacts.ts' -export const dataDeps = ['sageExports'] satisfies DataDeps<Pick<DocsData, 'sageExports'>> -const template: TemplateFunction<Record<string, unknown>, Pick<DocsData, 'sageExports'>> = ({ data }) => sources(data.sageExports) -export default template diff --git a/src/sage-search.template.ts b/src/sage/docs/search.json.template.ts similarity index 58% rename from src/sage-search.template.ts rename to src/sage/docs/search.json.template.ts index 20386425..ea3660e4 100644 --- a/src/sage-search.template.ts +++ b/src/sage/docs/search.json.template.ts @@ -1,6 +1,6 @@ import type { DataDeps, TemplateFunction } from '@domstack/static/types.js' -import type { DocsData } from './lib/docs.ts' -import { json } from './lib/artifacts.ts' +import type { DocsData } from '#lib/docs.ts' +import { json } from '#lib/artifacts.ts' export const dataDeps = ['sageSearch'] satisfies DataDeps<Pick<DocsData, 'sageSearch'>> -const template: TemplateFunction<Record<string, unknown>, Pick<DocsData, 'sageSearch'>> = ({ data }) => json('/sage/docs/search.json', data.sageSearch) +const template: TemplateFunction<Record<string, unknown>, Pick<DocsData, 'sageSearch'>> = ({ data }) => json(data.sageSearch) export default template diff --git a/src/sage-llms.template.ts b/src/sage/llms.txt.template.ts similarity index 79% rename from src/sage-llms.template.ts rename to src/sage/llms.txt.template.ts index f7e4952d..68db537d 100644 --- a/src/sage-llms.template.ts +++ b/src/sage/llms.txt.template.ts @@ -1,6 +1,6 @@ import type { DataDeps, TemplateFunction } from '@domstack/static/types.js' -import type { DocsData } from './lib/docs.ts' -import { pack } from './lib/artifacts.ts' +import type { DocsData } from '#lib/docs.ts' +import { pack } from '#lib/artifacts.ts' export const dataDeps = ["sageExports"] satisfies DataDeps<Pick<DocsData, 'sageExports'>> const template: TemplateFunction<{ siteUrl: string }, Pick<DocsData, 'sageExports'>> = ({ data, vars }) => pack('sage', data.sageExports, vars.siteUrl) export default template diff --git a/src/sage/page.vars.ts b/src/sage/page.vars.ts index 623767fb..fcca35b8 100644 --- a/src/sage/page.vars.ts +++ b/src/sage/page.vars.ts @@ -1,5 +1,7 @@ -export default { - "layout": "product", +import type { CheckedPageVars } from '#lib/page-vars.ts' + +const vars = { + "layout": "product" as const, "title": "Sage · Oro Computer", "description": "Sage is a fast, ergonomic terminal pager for files, directories, stdin, and remote content, with syntax highlighting and a robust JavaScript plugin API.", "bodyClass": "", @@ -7,3 +9,5 @@ export default { "product": "sage", "footerLabel": "Sage" } + +export default vars satisfies CheckedPageVars<typeof vars> diff --git a/src/silk-sources.template.ts b/src/silk-sources.template.ts deleted file mode 100644 index 42d2f72c..00000000 --- a/src/silk-sources.template.ts +++ /dev/null @@ -1,6 +0,0 @@ -import type { DataDeps, TemplateFunction } from '@domstack/static/types.js' -import type { DocsData } from './lib/docs.ts' -import { sources } from './lib/artifacts.ts' -export const dataDeps = ['silkExports'] satisfies DataDeps<Pick<DocsData, 'silkExports'>> -const template: TemplateFunction<Record<string, unknown>, Pick<DocsData, 'silkExports'>> = ({ data }) => sources(data.silkExports) -export default template diff --git a/src/silk-search.template.ts b/src/silk/docs/search.json.template.ts similarity index 58% rename from src/silk-search.template.ts rename to src/silk/docs/search.json.template.ts index 2fce9d91..150ef80c 100644 --- a/src/silk-search.template.ts +++ b/src/silk/docs/search.json.template.ts @@ -1,6 +1,6 @@ import type { DataDeps, TemplateFunction } from '@domstack/static/types.js' -import type { DocsData } from './lib/docs.ts' -import { json } from './lib/artifacts.ts' +import type { DocsData } from '#lib/docs.ts' +import { json } from '#lib/artifacts.ts' export const dataDeps = ['silkSearch'] satisfies DataDeps<Pick<DocsData, 'silkSearch'>> -const template: TemplateFunction<Record<string, unknown>, Pick<DocsData, 'silkSearch'>> = ({ data }) => json('/silk/docs/search.json', data.silkSearch) +const template: TemplateFunction<Record<string, unknown>, Pick<DocsData, 'silkSearch'>> = ({ data }) => json(data.silkSearch) export default template diff --git a/src/silk/learn/getting-started/page.vars.ts b/src/silk/learn/getting-started/page.vars.ts index 55de3885..ba5a81cb 100644 --- a/src/silk/learn/getting-started/page.vars.ts +++ b/src/silk/learn/getting-started/page.vars.ts @@ -1,5 +1,7 @@ -export default { - "layout": "learn", +import type { CheckedPageVars } from '#lib/page-vars.ts' + +const vars = { + "layout": "learn" as const, "title": "First Silk Program · Learn Silk", "description": "Chapter 1 of Learn Silk: write a small Silk program, import stdlib I/O, and run silk check, test, and build.", "bodyClass": "site-dark product-page learn-page learn-lesson-page silk-learn-page", @@ -22,3 +24,5 @@ export default { "position": "1 / 5" } } + +export default vars satisfies CheckedPageVars<typeof vars> diff --git a/src/silk/learn/language-tour/page.vars.ts b/src/silk/learn/language-tour/page.vars.ts index e8e4d088..86c27f79 100644 --- a/src/silk/learn/language-tour/page.vars.ts +++ b/src/silk/learn/language-tour/page.vars.ts @@ -1,5 +1,7 @@ -export default { - "layout": "learn", +import type { CheckedPageVars } from '#lib/page-vars.ts' + +const vars = { + "layout": "learn" as const, "title": "Language Tour · Learn Silk", "description": "Chapter 2 of Learn Silk: read bindings, functions, control flow, optionals, and small result-oriented APIs.", "bodyClass": "site-dark product-page learn-page learn-lesson-page silk-learn-page", @@ -22,3 +24,5 @@ export default { "position": "2 / 5" } } + +export default vars satisfies CheckedPageVars<typeof vars> diff --git a/src/silk/learn/modules-and-packages/page.vars.ts b/src/silk/learn/modules-and-packages/page.vars.ts index 48502df7..2236017b 100644 --- a/src/silk/learn/modules-and-packages/page.vars.ts +++ b/src/silk/learn/modules-and-packages/page.vars.ts @@ -1,5 +1,7 @@ -export default { - "layout": "learn", +import type { CheckedPageVars } from '#lib/page-vars.ts' + +const vars = { + "layout": "learn" as const, "title": "Modules and Packages · Learn Silk", "description": "Chapter 3 of Learn Silk: create a package root, export a small module, and import it from a downstream program.", "bodyClass": "site-dark product-page learn-page learn-lesson-page silk-learn-page", @@ -22,3 +24,5 @@ export default { "position": "3 / 5" } } + +export default vars satisfies CheckedPageVars<typeof vars> diff --git a/src/silk/learn/page.vars.ts b/src/silk/learn/page.vars.ts index 02b04bfa..0bd2ad3a 100644 --- a/src/silk/learn/page.vars.ts +++ b/src/silk/learn/page.vars.ts @@ -1,5 +1,7 @@ -export default { - "layout": "learn", +import type { CheckedPageVars } from '#lib/page-vars.ts' + +const vars = { + "layout": "learn" as const, "title": "Learn Silk · Oro Computer", "description": "A guided Silk learning path for first programs, modules, packages, stdlib APIs, C ABI surfaces, and Formal Silk.", "bodyClass": "site-dark product-page learn-page silk-learn-page", @@ -7,3 +9,5 @@ export default { "product": "silk", "footerLabel": "Learn Silk" } + +export default vars satisfies CheckedPageVars<typeof vars> diff --git a/src/silk/learn/results-and-errors/page.vars.ts b/src/silk/learn/results-and-errors/page.vars.ts index edb265ce..fb1640d2 100644 --- a/src/silk/learn/results-and-errors/page.vars.ts +++ b/src/silk/learn/results-and-errors/page.vars.ts @@ -1,5 +1,7 @@ -export default { - "layout": "learn", +import type { CheckedPageVars } from '#lib/page-vars.ts' + +const vars = { + "layout": "learn" as const, "title": "Results and Errors · Learn Silk", "description": "Chapter 5 of Learn Silk: use Result(T, E) for recoverable failure and typed errors for contract violations.", "bodyClass": "site-dark product-page learn-page learn-lesson-page silk-learn-page", @@ -22,3 +24,5 @@ export default { "position": "5 / 5" } } + +export default vars satisfies CheckedPageVars<typeof vars> diff --git a/src/silk/learn/types-and-optionals/page.vars.ts b/src/silk/learn/types-and-optionals/page.vars.ts index f9ad9e74..4727ef82 100644 --- a/src/silk/learn/types-and-optionals/page.vars.ts +++ b/src/silk/learn/types-and-optionals/page.vars.ts @@ -1,5 +1,7 @@ -export default { - "layout": "learn", +import type { CheckedPageVars } from '#lib/page-vars.ts' + +const vars = { + "layout": "learn" as const, "title": "Types and Optionals · Learn Silk", "description": "Chapter 4 of Learn Silk: use explicit scalar types, structs, and T? optionals for missing values.", "bodyClass": "site-dark product-page learn-page learn-lesson-page silk-learn-page", @@ -22,3 +24,5 @@ export default { "position": "4 / 5" } } + +export default vars satisfies CheckedPageVars<typeof vars> diff --git a/src/silk-llms.template.ts b/src/silk/llms.txt.template.ts similarity index 83% rename from src/silk-llms.template.ts rename to src/silk/llms.txt.template.ts index b61043a2..d44ce682 100644 --- a/src/silk-llms.template.ts +++ b/src/silk/llms.txt.template.ts @@ -1,6 +1,6 @@ import type { DataDeps, TemplateFunction } from '@domstack/static/types.js' -import type { DocsData } from './lib/docs.ts' -import { pack } from './lib/artifacts.ts' +import type { DocsData } from '#lib/docs.ts' +import { pack } from '#lib/artifacts.ts' export const dataDeps = ["silkExports","silkWikiExports"] satisfies DataDeps<Pick<DocsData, 'silkExports' | 'silkWikiExports'>> const template: TemplateFunction<{ siteUrl: string }, Pick<DocsData, 'silkExports' | 'silkWikiExports'>> = ({ data, vars }) => pack('silk', [...data.silkExports, ...data.silkWikiExports], vars.siteUrl) export default template diff --git a/src/silk/page.vars.ts b/src/silk/page.vars.ts index eb693bc9..b6e399a5 100644 --- a/src/silk/page.vars.ts +++ b/src/silk/page.vars.ts @@ -1,5 +1,7 @@ -export default { - "layout": "product", +import type { CheckedPageVars } from '#lib/page-vars.ts' + +const vars = { + "layout": "product" as const, "title": "Silk · Oro Computer", "description": "Silk is a high performance general purpose programming language with formal verification built in. Silk targets computer systems, mobile / tablet devices, WASM / WASI runtimes, and the web.", "bodyClass": "site-dark product-page silk-product-page", @@ -7,3 +9,5 @@ export default { "product": "silk", "footerLabel": "Silk" } + +export default vars satisfies CheckedPageVars<typeof vars> diff --git a/src/silkWiki-search.template.ts b/src/silk/wiki/search.json.template.ts similarity index 58% rename from src/silkWiki-search.template.ts rename to src/silk/wiki/search.json.template.ts index a58adb3d..3fc4024c 100644 --- a/src/silkWiki-search.template.ts +++ b/src/silk/wiki/search.json.template.ts @@ -1,6 +1,6 @@ import type { DataDeps, TemplateFunction } from '@domstack/static/types.js' -import type { DocsData } from './lib/docs.ts' -import { json } from './lib/artifacts.ts' +import type { DocsData } from '#lib/docs.ts' +import { json } from '#lib/artifacts.ts' export const dataDeps = ['silkWikiSearch'] satisfies DataDeps<Pick<DocsData, 'silkWikiSearch'>> -const template: TemplateFunction<Record<string, unknown>, Pick<DocsData, 'silkWikiSearch'>> = ({ data }) => json('/silk/wiki/search.json', data.silkWikiSearch) +const template: TemplateFunction<Record<string, unknown>, Pick<DocsData, 'silkWikiSearch'>> = ({ data }) => json(data.silkWikiSearch) export default template diff --git a/src/silkWiki-sources.template.ts b/src/silkWiki-sources.template.ts deleted file mode 100644 index ccb75e31..00000000 --- a/src/silkWiki-sources.template.ts +++ /dev/null @@ -1,6 +0,0 @@ -import type { DataDeps, TemplateFunction } from '@domstack/static/types.js' -import type { DocsData } from './lib/docs.ts' -import { sources } from './lib/artifacts.ts' -export const dataDeps = ['silkWikiExports'] satisfies DataDeps<Pick<DocsData, 'silkWikiExports'>> -const template: TemplateFunction<Record<string, unknown>, Pick<DocsData, 'silkWikiExports'>> = ({ data }) => sources(data.silkWikiExports) -export default template diff --git a/src/sitemap.template.ts b/src/sitemap.xml.template.ts similarity index 77% rename from src/sitemap.template.ts rename to src/sitemap.xml.template.ts index e4e5a480..83c76c78 100644 --- a/src/sitemap.template.ts +++ b/src/sitemap.xml.template.ts @@ -1,6 +1,6 @@ import type { DataDeps, TemplateFunction } from '@domstack/static/types.js' -import type { DocsData } from './lib/docs.ts' -import { sitemap } from './lib/artifacts.ts' +import type { DocsData } from '#lib/docs.ts' +import { sitemap } from '#lib/artifacts.ts' export const dataDeps = ['routes'] satisfies DataDeps<Pick<DocsData, 'routes'>> const template: TemplateFunction<{ siteUrl: string }, Pick<DocsData, 'routes'>> = ({ data, vars }) => sitemap(data.routes, vars.siteUrl) export default template diff --git a/src/slg-sources.template.ts b/src/slg-sources.template.ts deleted file mode 100644 index 68b669f9..00000000 --- a/src/slg-sources.template.ts +++ /dev/null @@ -1,6 +0,0 @@ -import type { DataDeps, TemplateFunction } from '@domstack/static/types.js' -import type { DocsData } from './lib/docs.ts' -import { sources } from './lib/artifacts.ts' -export const dataDeps = ['slgExports'] satisfies DataDeps<Pick<DocsData, 'slgExports'>> -const template: TemplateFunction<Record<string, unknown>, Pick<DocsData, 'slgExports'>> = ({ data }) => sources(data.slgExports) -export default template diff --git a/src/slg-search.template.ts b/src/slg/docs/search.json.template.ts similarity index 59% rename from src/slg-search.template.ts rename to src/slg/docs/search.json.template.ts index be25450f..6bfba669 100644 --- a/src/slg-search.template.ts +++ b/src/slg/docs/search.json.template.ts @@ -1,6 +1,6 @@ import type { DataDeps, TemplateFunction } from '@domstack/static/types.js' -import type { DocsData } from './lib/docs.ts' -import { json } from './lib/artifacts.ts' +import type { DocsData } from '#lib/docs.ts' +import { json } from '#lib/artifacts.ts' export const dataDeps = ['slgSearch'] satisfies DataDeps<Pick<DocsData, 'slgSearch'>> -const template: TemplateFunction<Record<string, unknown>, Pick<DocsData, 'slgSearch'>> = ({ data }) => json('/slg/docs/search.json', data.slgSearch) +const template: TemplateFunction<Record<string, unknown>, Pick<DocsData, 'slgSearch'>> = ({ data }) => json(data.slgSearch) export default template diff --git a/src/slg-llms.template.ts b/src/slg/llms.txt.template.ts similarity index 79% rename from src/slg-llms.template.ts rename to src/slg/llms.txt.template.ts index bbbda0fa..38344446 100644 --- a/src/slg-llms.template.ts +++ b/src/slg/llms.txt.template.ts @@ -1,6 +1,6 @@ import type { DataDeps, TemplateFunction } from '@domstack/static/types.js' -import type { DocsData } from './lib/docs.ts' -import { pack } from './lib/artifacts.ts' +import type { DocsData } from '#lib/docs.ts' +import { pack } from '#lib/artifacts.ts' export const dataDeps = ["slgExports"] satisfies DataDeps<Pick<DocsData, 'slgExports'>> const template: TemplateFunction<{ siteUrl: string }, Pick<DocsData, 'slgExports'>> = ({ data, vars }) => pack('slg', data.slgExports, vars.siteUrl) export default template diff --git a/src/slg/page.vars.ts b/src/slg/page.vars.ts index 6975de6d..992df672 100644 --- a/src/slg/page.vars.ts +++ b/src/slg/page.vars.ts @@ -1,5 +1,7 @@ -export default { - "layout": "product", +import type { CheckedPageVars } from '#lib/page-vars.ts' + +const vars = { + "layout": "product" as const, "title": "slg · Oro Computer", "description": "slg is a fast recursive line grep utility for files and directories, with rg/ag-style workflows, explicit ignore controls, and tunable parallel traversal.", "bodyClass": "", @@ -7,3 +9,5 @@ export default { "product": "slg", "footerLabel": "slg" } + +export default vars satisfies CheckedPageVars<typeof vars> diff --git a/src/virtnosis-sources.template.ts b/src/virtnosis-sources.template.ts deleted file mode 100644 index cba9739d..00000000 --- a/src/virtnosis-sources.template.ts +++ /dev/null @@ -1,6 +0,0 @@ -import type { DataDeps, TemplateFunction } from '@domstack/static/types.js' -import type { DocsData } from './lib/docs.ts' -import { sources } from './lib/artifacts.ts' -export const dataDeps = ['virtnosisExports'] satisfies DataDeps<Pick<DocsData, 'virtnosisExports'>> -const template: TemplateFunction<Record<string, unknown>, Pick<DocsData, 'virtnosisExports'>> = ({ data }) => sources(data.virtnosisExports) -export default template diff --git a/src/virtnosis-search.template.ts b/src/virtnosis/docs/search.json.template.ts similarity index 57% rename from src/virtnosis-search.template.ts rename to src/virtnosis/docs/search.json.template.ts index 80bf5bff..b81e257e 100644 --- a/src/virtnosis-search.template.ts +++ b/src/virtnosis/docs/search.json.template.ts @@ -1,6 +1,6 @@ import type { DataDeps, TemplateFunction } from '@domstack/static/types.js' -import type { DocsData } from './lib/docs.ts' -import { json } from './lib/artifacts.ts' +import type { DocsData } from '#lib/docs.ts' +import { json } from '#lib/artifacts.ts' export const dataDeps = ['virtnosisSearch'] satisfies DataDeps<Pick<DocsData, 'virtnosisSearch'>> -const template: TemplateFunction<Record<string, unknown>, Pick<DocsData, 'virtnosisSearch'>> = ({ data }) => json('/virtnosis/docs/search.json', data.virtnosisSearch) +const template: TemplateFunction<Record<string, unknown>, Pick<DocsData, 'virtnosisSearch'>> = ({ data }) => json(data.virtnosisSearch) export default template diff --git a/src/virtnosis-llms.template.ts b/src/virtnosis/llms.txt.template.ts similarity index 80% rename from src/virtnosis-llms.template.ts rename to src/virtnosis/llms.txt.template.ts index 41ea2a5e..5b0669ea 100644 --- a/src/virtnosis-llms.template.ts +++ b/src/virtnosis/llms.txt.template.ts @@ -1,6 +1,6 @@ import type { DataDeps, TemplateFunction } from '@domstack/static/types.js' -import type { DocsData } from './lib/docs.ts' -import { pack } from './lib/artifacts.ts' +import type { DocsData } from '#lib/docs.ts' +import { pack } from '#lib/artifacts.ts' export const dataDeps = ["virtnosisExports"] satisfies DataDeps<Pick<DocsData, 'virtnosisExports'>> const template: TemplateFunction<{ siteUrl: string }, Pick<DocsData, 'virtnosisExports'>> = ({ data, vars }) => pack('virtnosis', data.virtnosisExports, vars.siteUrl) export default template diff --git a/src/virtnosis/page.vars.ts b/src/virtnosis/page.vars.ts index 77c0fd92..dd2b1d14 100644 --- a/src/virtnosis/page.vars.ts +++ b/src/virtnosis/page.vars.ts @@ -1,5 +1,7 @@ -export default { - "layout": "product", +import type { CheckedPageVars } from '#lib/page-vars.ts' + +const vars = { + "layout": "product" as const, "title": "Virtnosis · Oro Computer", "description": "Virtnosis is a read-only libvirt security analysis and diagnosis toolset built around a bounded local agent and an operator CLI.", "bodyClass": "site-dark product-page virtnosis-product-page", @@ -7,3 +9,5 @@ export default { "product": "virtnosis", "footerLabel": "Virtnosis" } + +export default vars satisfies CheckedPageVars<typeof vars> diff --git a/tests/content.test.ts b/tests/content.test.ts index 4f0e4bea..e473cfea 100644 --- a/tests/content.test.ts +++ b/tests/content.test.ts @@ -11,9 +11,9 @@ import { import { tmpdir } from 'node:os' import { join } from 'node:path' import { load } from 'cheerio' -import { canonicalLink } from '../src/lib/urls.ts' -import { docUrl } from '../src/lib/collections.ts' -import { markdown } from '../src/lib/markdown.ts' +import { canonicalLink } from '#lib/urls.ts' +import { docUrl } from '#lib/collections.ts' +import { markdown } from '#lib/markdown.ts' import { publicContent } from '../tools/migration/content.ts' import { importCollection, diff --git a/tests/docs-data.test.ts b/tests/docs-data.test.ts index 0d1a7872..843973c2 100644 --- a/tests/docs-data.test.ts +++ b/tests/docs-data.test.ts @@ -1,9 +1,9 @@ import { test } from 'node:test' import assert from 'node:assert/strict' -import { projectCollection, validateDocVars, editUrl, type Doc } from '../src/lib/docs.ts' -import { collectionIndex, pack, sitemap } from '../src/lib/artifacts.ts' -import { article, rootContent } from '../src/lib/rendering.ts' -import { markdown } from '../src/lib/markdown.ts' +import { projectCollection, validateDocVars, editUrl, rawUrl, type Doc } from '#lib/docs.ts' +import { pack, sitemap } from '#lib/artifacts.ts' +import { article, rootContent } from '#lib/rendering.ts' +import { markdown } from '#lib/markdown.ts' const doc: Doc = { collection: 'runtime', id: 'start', title: 'Start', description: 'Summary', section: 'overview', order: 0, sourcePath: 'start.md', url: '/runtime/docs/', @@ -22,8 +22,7 @@ test('navigation is JSON-safe, precomputed, and independent of body/search chang assert.equal(JSON.stringify(nav), JSON.stringify(projectCollection([{ ...doc, markdown: 'Changed', searchText: 'Changed', description: 'Changed' }, second]))) assert.deepEqual(JSON.parse(JSON.stringify(nav)).bySource['start.md'], { ...nav.bySource['start.md'] }) assert.throws(() => projectCollection([doc, doc]), /Duplicate document/) - const index = JSON.parse(collectionIndex('runtime', nav).content) - assert.equal(index.sections[0].items[1].file, 'next.txt') + assert.equal(nav.sections[0].items[1].sourcePath, 'next.txt') }) test('navigation rejects legacy ID collisions between Markdown and text sources', () => { const first = { ...doc, id: 'foo', sourcePath: 'foo.md' } @@ -40,10 +39,18 @@ test('source validation rejects malformed collection metadata with source contex assert.equal(editUrl('silk/docs/renamed/README.md'), 'https://github.com/oro-computer/website/blob/master/src/silk/docs/renamed/README.md') }) test('artifact URLs use site configuration and sitemap escapes XML', () => { - assert.match(pack('runtime', [doc], 'https://preview.example').content, /URL: https:\/\/preview.example\/runtime\/docs\//) - const xml = sitemap(['/page/?a=1&b=2'], 'https://preview.example').content + assert.match(pack('runtime', [doc], 'https://preview.example'), /URL: https:\/\/preview.example\/runtime\/docs\//) + const xml = sitemap(['/page/?a=1&b=2'], 'https://preview.example') assert.ok(xml.includes('https://preview.example/page/?a=1&b=2')) }) +test('LLM packs retain source-relative raw URLs and exact Markdown bytes', () => { + const nested = { ...doc, sourcePath: 'guides/nested/start.txt', markdown: '# Start\r\n\r\nExact bytes\n' } + assert.equal(rawUrl(nested), '/runtime/docs/source/guides/nested/start.txt') + assert.equal(pack('runtime', [nested], 'https://preview.example'), + '# runtime documentation\n\n## Start\n\nURL: https://preview.example/runtime/docs/\n' + + 'Source: https://preview.example/runtime/docs/source/guides/nested/start.txt\n\n' + nested.markdown) + +}) test('article enhancement is page-local and preserves legacy anchors', () => { const md = markdown() const source = '## `oro:fs` API\n\n## `oro:fs` API\n\n> [!NOTE]\n> Alert\n' diff --git a/tests/docs-watch.test.ts b/tests/docs-watch.test.ts index 751ddd91..4288842b 100644 --- a/tests/docs-watch.test.ts +++ b/tests/docs-watch.test.ts @@ -2,7 +2,7 @@ import { test } from 'node:test' import assert from 'node:assert/strict' import { mkdtemp, mkdir, writeFile, readFile, rm, readdir } from 'node:fs/promises' import { tmpdir } from 'node:os' -import { join, basename } from 'node:path' +import { join, dirname } from 'node:path' import { identifyPages } from '@domstack/static/lib/identify-pages.js' import { buildPagesDirect } from '@domstack/static/lib/build-pages/index.js' @@ -16,12 +16,13 @@ test('body edits stay isolated while navigation edits rebuild shared docs consum // while keeping builds and edits isolated from the site's source/output. const proxy = async (target: string, source: string) => { const url = new URL('../src/' + source, import.meta.url).href + await mkdir(dirname(join(src, target)), { recursive: true }) await writeFile(join(src, target), `export { default } from ${JSON.stringify(url)}\nexport * from ${JSON.stringify(url)}\n`) } - for (const name of ['global.data.ts', 'global.vars.ts', 'markdown-it.settings.ts']) await proxy(name, name) + for (const name of ['globals/global.data.ts', 'globals/global.vars.ts', 'markdown-it.settings.ts']) await proxy(name, name) for (const name of ['root', 'docs']) await proxy(name + '.layout.ts', 'layouts/' + name + '.layout.ts') - for (const name of (await readdir(new URL('../src/', import.meta.url))).filter(name => name.endsWith('.template.ts') && name !== 'cname.template.ts')) + for (const name of (await readdir(new URL('../src/', import.meta.url), { recursive: true })).filter(name => name.endsWith('.template.ts'))) await proxy(name, name) const pageSource = (collection: string, id: string, title: string, body: string) => `--- layout: "docs" @@ -34,7 +35,7 @@ sourcePath: "${id}.md" githubRepo: "oro-computer/${collection}" githubRef: "master" --- -# ${title} +# ${id} ## Stable anchor @@ -50,14 +51,20 @@ ${body} } const siteData = await identifyPages(src) assert.deepEqual(siteData.errors, []) + for (const template of siteData.templates) { + const name = template.templateFile.relname + assert.equal(join(template.path, template.outputName), name.replace(/\.template\.ts$/, '')) + } const first = await buildPagesDirect(src, dest, siteData, { trackWatchDependencies: true }) assert.deepEqual(first.errors, []) + assert.equal(await readFile(join(dest, '.nojekyll'), 'utf8'), '') + assert.equal(await readFile(join(dest, 'CNAME'), 'utf8'), await readFile(new URL('../CNAME', import.meta.url), 'utf8')) const initial = first.report.watchDependencies! assert.ok(Object.values(initial.globalDataFingerprints).every(value => typeof value === 'string')) const subscription = Object.values(initial.consumers).find(c => c.key === pageFiles[0])! assert.deepEqual(subscription.globalDataKeys, ['navigation']) const unchanged = await readFile(join(dest, 'runtime/docs/next/index.html'), 'utf8') - const index = await readFile(join(dest, 'runtime/docs/index.json'), 'utf8') + await writeFile(pageFiles[0], pageSource('runtime', 'start', 'start', 'Changed body')) const bodyEdit = await buildPagesDirect(src, dest, siteData, { @@ -66,11 +73,11 @@ ${body} }) assert.deepEqual(bodyEdit.errors, []) assert.deepEqual(bodyEdit.report.pages.map(p => p.sourcePageFilePath), [pageFiles[0]]) - assert.deepEqual(bodyEdit.report.templates.map(t => basename(t.templateInfo.templateFile.filepath)).sort(), [ - 'runtime-llms.template.ts', 'runtime-search.template.ts', 'runtime-sources.template.ts', + assert.deepEqual(bodyEdit.report.templates.map(t => t.templateInfo.templateFile.relname).sort(), [ + 'runtime/docs/search.json.template.ts', 'runtime/llms.txt.template.ts', ]) assert.equal(await readFile(join(dest, 'runtime/docs/next/index.html'), 'utf8'), unchanged) - assert.equal(await readFile(join(dest, 'runtime/docs/index.json'), 'utf8'), index) + assert.match(await readFile(join(dest, 'runtime/docs/search.json'), 'utf8'), /Changed body/) assert.match(await readFile(join(dest, 'runtime/docs/source/start.md'), 'utf8'), /Changed body/) assert.match(await readFile(join(dest, 'runtime/llms.txt'), 'utf8'), /Changed body/) @@ -83,8 +90,8 @@ ${body} }) assert.deepEqual(titleEdit.errors, []) assert.deepEqual(titleEdit.report.pages.map(p => p.sourcePageFilePath).sort(), [...pageFiles].sort()) - assert.deepEqual(titleEdit.report.templates.map(t => basename(t.templateInfo.templateFile.filepath)).sort(), [ - 'navigation.template.ts', 'runtime-llms.template.ts', 'runtime-search.template.ts', 'runtime-sources.template.ts', + assert.deepEqual(titleEdit.report.templates.map(t => t.templateInfo.templateFile.relname).sort(), [ + 'runtime/docs/search.json.template.ts', 'runtime/llms.txt.template.ts', ]) assert.match(await readFile(join(dest, 'runtime/docs/next/index.html'), 'utf8'), /Renamed/) } finally { diff --git a/tests/import-roundtrip.test.ts b/tests/import-roundtrip.test.ts index 88503e90..ed2e3ed8 100644 --- a/tests/import-roundtrip.test.ts +++ b/tests/import-roundtrip.test.ts @@ -3,7 +3,7 @@ import assert from 'node:assert/strict' import { cp, mkdtemp, readdir, readFile, rm } from 'node:fs/promises' import { tmpdir } from 'node:os' import { join } from 'node:path' -import { collections, type Collection } from '../src/lib/collections.ts' +import { collections, type Collection } from '#lib/collections.ts' import { exportCollection, importCollection } from '../tools/import-public.ts' test('all 585 public documents survive an unchanged refresh byte for byte', async () => { const site = await mkdtemp(join(tmpdir(), 'oro-import-roundtrip-')) diff --git a/tests/layout-types.typecheck.ts b/tests/layout-types.typecheck.ts new file mode 100644 index 00000000..38a5c0c1 --- /dev/null +++ b/tests/layout-types.typecheck.ts @@ -0,0 +1,47 @@ +import type { + LayoutChain, + LayoutProvidedVars, + PageForLayout, + ValidatePageVars, +} from '@domstack/static/types.js' +import type { CheckedPageVars } from '../src/lib/page-vars.ts' +import type globalVars from '../src/globals/global.vars.ts' +import type home from '../src/page.vars.ts' +import type lesson from '../src/runtime/learn/getting-started/page.vars.ts' +import type { DocVars, NavigationData } from '../src/lib/docs.ts' + +// Typecheck-only: these assertions import no renderers or page companions at runtime. +type Assert<T extends true> = T +type IsNever<T> = [T] extends [never] ? true : false +type Equal<A, B> = [A] extends [B] ? [B] extends [A] ? true : false : false + +type HomeVars = Assert<Equal<CheckedPageVars<typeof home>, typeof home>> +type LessonVars = Assert<Equal<CheckedPageVars<typeof lesson>, typeof lesson>> +type LearnChain = Assert<Equal<LayoutChain<'learn'>, readonly ['root', 'learn']>> +type DocsChain = Assert<Equal<LayoutChain<'docs'>, readonly ['root', 'docs']>> +type SpecChain = Assert<Equal<LayoutChain<'spec'>, readonly ['root', 'spec']>> + +type MissingTitle = Assert<IsNever<CheckedPageVars<Omit<typeof home, 'title'>>>> +type MissingProduct = Assert<IsNever<CheckedPageVars<Omit<typeof lesson, 'product'>>>> +type UnknownLayout = Assert<IsNever<CheckedPageVars<{ layout: 'unknown'; title: string }>>> +type MissingGlobals = Assert<IsNever<ValidatePageVars<'marketing', typeof home>>> +type InvalidGlobalOverride = Assert<IsNever<CheckedPageVars<typeof home & { siteUrl: number }>>> +type InvalidChapter = Assert<IsNever<CheckedPageVars< + Omit<typeof lesson, 'chapter'> & { chapter: { label: string } } +>>> +type MissingRedirect = Assert<IsNever<CheckedPageVars<{ layout: 'redirect'; title: string }>>> + +// A data subscription is not a supplied render var, and render data stays in `data`. +type DocsVars = DocVars & { layout: 'docs' } +type DocsVarsValid = Assert<Equal<CheckedPageVars<DocsVars>, DocsVars>> +type SubscriptionIsNotDefault = Assert<Equal<LayoutProvidedVars<'docs'>, {}>> +type DocsPage = PageForLayout<'docs', DocsVars, NavigationData, typeof globalVars> +type DocsParams = Parameters<DocsPage>[0] +type NavigationInData = Assert<Equal<DocsParams['data'], NavigationData>> +type NoDataInVars = Assert<Equal<Extract<keyof DocsParams['vars'], 'navigation' | 'dataDeps'>, never>> +type SubscriptionCannotSupplyProduct = Assert<IsNever<CheckedPageVars< + Omit<typeof lesson, 'product'> & { dataDeps: ['product'] } +>>> +type SubscriptionCannotBeGlobal = Assert<IsNever<ValidatePageVars< + 'marketing', typeof home, typeof globalVars & { dataDeps: ['navigation'] } +>>> diff --git a/tests/site/output.test.ts b/tests/site/output.test.ts index 466285d4..130be014 100644 --- a/tests/site/output.test.ts +++ b/tests/site/output.test.ts @@ -1,9 +1,13 @@ import { test } from 'node:test' import assert from 'node:assert/strict' -import { readFile, access } from 'node:fs/promises' +import { readFile, access, mkdtemp, mkdir, writeFile, rm } from 'node:fs/promises' +import { tmpdir } from 'node:os' +import { join, dirname } from 'node:path' +import { identifyPages } from '@domstack/static/lib/identify-pages.js' +import { buildPagesDirect } from '@domstack/static/lib/build-pages/index.js' import { load } from 'cheerio' import { splitPage } from '../../tools/import-public.ts' -import { collections } from '../../src/lib/collections.ts' +import { collections } from '#lib/collections.ts' const baseline = JSON.parse( await readFile('tools/migration/baseline.json', 'utf8'), ) @@ -28,8 +32,42 @@ test('all original routes and documents have static HTML and unchanged raw endpo assert.equal(raw.trim(), body.trim(), doc.source) } }) +test('docs and spec page outputs preserve raw bytes and nested .txt filenames', async () => { + const fixture = await mkdtemp(join(tmpdir(), 'oro-page-outputs-')) + const src = join(fixture, 'src') + const dest = join(fixture, 'public') + try { + for (const name of ['globals/global.data.ts', 'globals/global.vars.ts', 'markdown-it.settings.ts', 'layouts/root.layout.ts', 'layouts/docs.layout.ts', 'layouts/spec.layout.ts']) { + const target = join(src, name) + const url = new URL('../../src/' + name, import.meta.url).href + await mkdir(dirname(target), { recursive: true }) + await writeFile(target, `export { default } from ${JSON.stringify(url)}\nexport * from ${JSON.stringify(url)}\n`) + } + const body = '\n\n# Exact bytes\r\n\r\nUnicode: café — λ. \r\n\n---\n\n{{ untouched }}\n\n' + for (const layout of ['docs', 'spec']) { + const target = join(src, 'silk', layout, 'bytes', 'page.md') + await mkdir(dirname(target), { recursive: true }) + await writeFile(target, `---\nlayout: "${layout}"\ntitle: "Exact bytes"\ndescription: "Summary"\ndocsCollection: "silk"\nsection: "spec"\norder: 0\nsourcePath: "${layout}/bytes.txt"\ngithubRepo: "oro-computer/silk"\ngithubRef: "master"\n---` + body) + } + const siteData = await identifyPages(src) + assert.deepEqual(siteData.errors, []) + const result = await buildPagesDirect(src, dest, siteData) + assert.deepEqual(result.errors, []) + for (const layout of ['docs', 'spec']) { + await access(join(dest, 'silk', layout, 'bytes', 'index.html')) + assert.deepEqual( + await readFile(join(dest, 'silk/docs/source', layout, 'bytes.txt')), + Buffer.from(body), + layout, + ) + } + } finally { + await rm(fixture, { recursive: true, force: true }) + } +}) test('search and LLM packs contain the public article content', async () => { for (const [key, c] of Object.entries(collections)) { + await assert.rejects(access('public' + c.base + 'index.json'), { code: 'ENOENT' }) const search = JSON.parse( await readFile('public' + c.base + 'search.json', 'utf8'), ) @@ -77,7 +115,7 @@ test('public branding assets match the canonical originals', async () => { for (const file of ['CNAME', '.nojekyll']) await access('public/' + file) }) test('every legacy document ID resolves to its recorded canonical route', async () => { - const { legacyTarget } = await import('../../src/lib/legacy.ts') + const { legacyTarget } = await import('#lib/legacy.ts') for (const key of Object.keys(collections)) { const docs = baseline.documents.filter((d: any) => d.collection === key) const map = Object.fromEntries(docs.map((d: any) => [d.id, d.url])) diff --git a/tests/tooling/content-audit-baseline.json b/tests/tooling/content-audit-baseline.json index 17bbb618..21e09d14 100644 --- a/tests/tooling/content-audit-baseline.json +++ b/tests/tooling/content-audit-baseline.json @@ -1,8 +1,8 @@ { "missing": { - "status": 2, + "status": 1, "stdout": "", - "stderr": "Missing Runtime docs/index.json; run build scripts first.\n" + "stderr": "runtime/docs/source/start.md: Missing raw output for source page; run build scripts first.\nFAIL: 1 issues\n" }, "clean": { "status": 0, @@ -12,7 +12,7 @@ "common": { "status": 1, "stdout": "", - "stderr": "sage/docs/index.json: Index refers to missing file: lost.md\nsage/docs/source/start.md: Broken ?p= link: heading\nsage/docs/source/start.md: Broken ?p= link: fenced\nsage/docs/source/start.md: Broken ?p= link: missing\nsage/docs/source/start.md: Broken ?p= link: nope\nsage/docs/source/start.md: Missing link target: docs/absent.md -> sage/docs/source/absent.md\nsage/docs/source/start.md: Missing link target: /absent.txt -> absent.txt\nsage/docs/source/start.md: Line 6: raw ?p= reference must be a markdown link.\nsage/docs/source/start.md: Line 6: raw manpage reference must be a markdown link.\nsage/docs/source/start.md: Line 10: avoid status-style or transitional editorial framing in published docs.\nsage/docs/source/start.md: Line 11: avoid status-style or transitional editorial framing in published docs.\nsage/docs/source/start.md: Line 12: avoid status-style or transitional editorial framing in published docs.\nsage/docs/source/start.md: Line 13: avoid status-style or transitional editorial framing in published docs.\nsage/docs/source/start.md: Line 14: avoid status-style or transitional editorial framing in published docs.\nsage/docs/source/start.md: Line 15: avoid status-style or transitional editorial framing in published docs.\nsage/docs/source/start.md: Line 16: avoid status-style or transitional editorial framing in published docs.\nsage/docs/source/start.md: Line 17: avoid status-style or transitional editorial framing in published docs.\nsage/docs/source/start.md: Line 19: avoid status-style or transitional editorial framing in published docs.\nFAIL: 18 issues\n" + "stderr": "sage/docs/source/lost.md: Missing raw output for source page; run build scripts first.\nsage/docs/source/start.md: Broken ?p= link: heading\nsage/docs/source/start.md: Broken ?p= link: fenced\nsage/docs/source/start.md: Broken ?p= link: missing\nsage/docs/source/start.md: Broken ?p= link: nope\nsage/docs/source/start.md: Missing link target: docs/absent.md -> sage/docs/source/absent.md\nsage/docs/source/start.md: Missing link target: /absent.txt -> absent.txt\nsage/docs/source/start.md: Line 6: raw ?p= reference must be a markdown link.\nsage/docs/source/start.md: Line 6: raw manpage reference must be a markdown link.\nsage/docs/source/start.md: Line 10: avoid status-style or transitional editorial framing in published docs.\nsage/docs/source/start.md: Line 11: avoid status-style or transitional editorial framing in published docs.\nsage/docs/source/start.md: Line 12: avoid status-style or transitional editorial framing in published docs.\nsage/docs/source/start.md: Line 13: avoid status-style or transitional editorial framing in published docs.\nsage/docs/source/start.md: Line 14: avoid status-style or transitional editorial framing in published docs.\nsage/docs/source/start.md: Line 15: avoid status-style or transitional editorial framing in published docs.\nsage/docs/source/start.md: Line 16: avoid status-style or transitional editorial framing in published docs.\nsage/docs/source/start.md: Line 17: avoid status-style or transitional editorial framing in published docs.\nsage/docs/source/start.md: Line 19: avoid status-style or transitional editorial framing in published docs.\nFAIL: 18 issues\n" }, "silk": { "status": 1, @@ -21,7 +21,7 @@ }, "stdlib": { "status": 1, - "stdout": "<fixture>/silk/docs/source/std/a.md: Status/body uses banned transitional wording: active expansion\n<fixture>/silk/docs/source/std/a.md: Status/body uses banned transitional wording: current snapshot\n<fixture>/silk/docs/source/std/a.md: Status/body uses banned transitional wording: Partially implemented\n<fixture>/silk/docs/source/std/a.md: Status/body uses banned transitional wording: initial std wrapper\n<fixture>/silk/docs/source/std/a.md: Status/body uses banned transitional wording: expansion path\n<fixture>/silk/docs/source/std/a.md: Status/body uses banned transitional wording: \\bMVP\\b\n<fixture>/silk/docs/source/std/a.md: Banned heading: API\n<fixture>/silk/docs/source/std/a.md: Banned heading: Design Goals\n<fixture>/silk/docs/source/std/a.md: Banned heading pattern: Initial Design MVP\n<fixture>/silk/docs/source/std/a.md: Banned heading pattern: Initial Design MVP\n<fixture>/silk/docs/source/std/a.md: Banned heading pattern: Current Scope\n", + "stdout": "output/silk/docs/source/std/a.md: Status/body uses banned transitional wording: active expansion\noutput/silk/docs/source/std/a.md: Status/body uses banned transitional wording: current snapshot\noutput/silk/docs/source/std/a.md: Status/body uses banned transitional wording: Partially implemented\noutput/silk/docs/source/std/a.md: Status/body uses banned transitional wording: initial std wrapper\noutput/silk/docs/source/std/a.md: Status/body uses banned transitional wording: expansion path\noutput/silk/docs/source/std/a.md: Status/body uses banned transitional wording: \\bMVP\\b\noutput/silk/docs/source/std/a.md: Banned heading: API\noutput/silk/docs/source/std/a.md: Banned heading: Design Goals\noutput/silk/docs/source/std/a.md: Banned heading pattern: Initial Design MVP\noutput/silk/docs/source/std/a.md: Banned heading pattern: Initial Design MVP\noutput/silk/docs/source/std/a.md: Banned heading pattern: Current Scope\n", "stderr": "" }, "runtime": { diff --git a/tests/tooling/content-audit.test.ts b/tests/tooling/content-audit.test.ts index a176dc3f..10b09665 100644 --- a/tests/tooling/content-audit.test.ts +++ b/tests/tooling/content-audit.test.ts @@ -4,7 +4,7 @@ import { dirname, join, resolve } from 'node:path' import { test } from 'node:test' import { auditContext, runContentAudit } from '../../tools/audit-content.ts' -import { runSiteAudit } from '../../tools/audits/common.ts' +import { buildSourceInventory, runSiteAudit } from '../../tools/audits/common.ts' import type { AuditContext, Reporter } from '../../tools/audits/common.ts' import { runRuntimeAudit } from '../../tools/audits/runtime.ts' import { runSilkAudit, runStdlibAudit } from '../../tools/audits/silk.ts' @@ -12,27 +12,35 @@ import { runSilkAudit, runStdlibAudit } from '../../tools/audits/silk.ts' const siteRoot = resolve(import.meta.dirname, '../..') const cases = ['missing', 'clean', 'common', 'silk', 'stdlib', 'runtime', 'cap'] as const const baselines = JSON.parse(readFileSync(new URL('./content-audit-baseline.json', import.meta.url), 'utf8')) -for (const name of cases) test(`Python content audit parity: ${name}`, () => { +for (const name of cases) test(`Content audit regression: ${name}`, () => { const root = mkdtempSync(join(siteRoot, '.audit-fixture-')) - const context: AuditContext = { siteRoot, outputRoot: root, runtimeRepo: join(root, 'upstream') } + const context: AuditContext = { siteRoot: root, outputRoot: join(root, 'output'), runtimeRepo: join(root, 'output/upstream') } const put = (path: string, text: string): void => { - mkdirSync(dirname(join(root, path)), { recursive: true }) - writeFileSync(join(root, path), text) + mkdirSync(dirname(join(context.outputRoot, path)), { recursive: true }) + writeFileSync(join(context.outputRoot, path), text) + } + const page = (collection: string, sourcePath: string, route = `${collection}/${sourcePath}`): void => { + const path = join(root, 'src', route, 'page.md') + mkdirSync(dirname(path), { recursive: true }) + writeFileSync(path, `---\ndocsCollection: ${collection}\nsourcePath: ${sourcePath}\n---\n# Source\n`) } try { + for (const product of ['runtime', 'silk', 'sage', 'slg', 'virtnosis']) page(product, 'start.md') if (name !== 'missing') { for (const product of ['runtime', 'silk', 'sage', 'slg', 'virtnosis']) { - put(`${product}/docs/index.json`, JSON.stringify({ sections: [{ items: [{ id: 'start', file: 'start.md' }] }] })) + put(`${product}/docs/source/start.md`, '# Start\n') } - put('silk/wiki/index.json', '{"sections":[]}') + for (const path of ['index.html', 'runtime/index.html', 'runtime/docs/index.html']) put(path, '') } if (name === 'common') { - put('sage/docs/index.json', '{"sections":[{"items":[{"id":"start","file":"start.md"},{"id":"lost","file":"lost.md"}]}]}') + page('sage', 'lost.md') put('sage/docs/source/start.md', '# Heading ?p=heading\n```\n?p=fenced\n## Status\n~~~\nRaw ?p=missing and `open` (3)\n[ok](?p=start) [bad](wiki/?p=nope)\n[missing](docs/absent.md) [escape](../ignored.md)\n[absolute](/absent.txt) [remote](https://example.org/no.md)\n## Status (details)\n## API (initial surface)\n## Thing (Planned soon)\nStatus: **yes**\nInitial implementation\n## Current API\n## Future Work\n## Current APİ\n\u001c## Status\n\ufeff## Status\néinitial implementationé\n'); } if (name === 'silk') { + page('silkWiki', 'wiki.md') + page('silk', 'spec/2026.md', 'silk/spec/2026') put('silk/docs/source/start.md', '[wiki](wiki/?p=lost) [spec](spec/missing.md)\n```\nconst region arena\nWorks today\n```\nRaw ?p=oops `foo` (1)\n## Status\n') put('silk/wiki/source/wiki.md', 'from arena\nSyntax (Selected)\n## Current API\n[docs](docs/missing.txt)\n') put('silk/docs/source/spec/2026.md', 'checker.foo src/example c-tests/ tests/silk/') @@ -54,15 +62,49 @@ for (const name of cases) test(`Python content audit parity: ${name}`, () => { } const stdout: string[] = [], stderr: string[] = [] const status = runners[name]!(context, { log: message => stdout.push(message), error: message => stderr.push(message) }) - const normalize = (text: string): string => text.replaceAll(root.slice(siteRoot.length + 1), '<fixture>') - const result = { status, stdout: normalize(stdout.join('\n') + (stdout.length ? '\n' : '')), stderr: normalize(stderr.join('\n') + (stderr.length ? '\n' : '')) } - // Captured from the original Python audits before deletion. Directory traversal + const result = { status, stdout: stdout.join('\n') + (stdout.length ? '\n' : ''), stderr: stderr.join('\n') + (stderr.length ? '\n' : '') } + // Editorial findings were captured from the original Python audits; missing-output + // expectations now follow committed source metadata rather than public indexes. Directory traversal // order is filesystem-dependent, so compare findings within each output stream. assert.equal(result.status, baselines[name].status) assert.deepEqual(result.stdout.split('\n').sort(), baselines[name].stdout.split('\n').sort()) assert.deepEqual(result.stderr.split('\n').sort(), baselines[name].stderr.split('\n').sort()) } finally { rmSync(root, { recursive: true, force: true }) } }) +test('source inventory includes dedicated spec routes and txt outputs without public indexes', () => { + const root = mkdtempSync(join(siteRoot, '.audit-fixture-')) + const context: AuditContext = { siteRoot: root, outputRoot: join(root, 'custom-output') } + const put = (path: string, text: string): void => { + mkdirSync(dirname(join(root, path)), { recursive: true }) + writeFileSync(join(root, path), text) + } + const messages: string[] = [] + const reporter: Reporter = { log: () => {}, error: message => messages.push(message) } + try { + put('src/silk/spec/2026/page.md', '---\ndocsCollection: silk\nsourcePath: spec/2026.md\n---\n') + put('src/silk/docs/reference/page.md', '---\ndocsCollection: silk\nsourcePath: reference.txt\n---\n') + put('src/silk/wiki/start/page.md', '---\ndocsCollection: silkWiki\nsourcePath: start.md\n---\n') + put('src/unrelated/page.md', '---\ntitle: Not documentation\n---\n') + assert.deepEqual(buildSourceInventory(root).silk.map(item => item.file).sort(), ['reference.txt', 'spec/2026.md']) + put('custom-output/silk/docs/source/spec/2026.md', '[text](?p=reference) [spec](?p=spec/2026) [wiki](wiki/?p=start)\n') + put('custom-output/silk/wiki/source/start.md', '[spec](docs/?p=spec/2026)\n') + assert.equal(runSilkAudit(context, reporter), 1) + assert.deepEqual(messages, ['silk/docs/source/reference.txt: Missing raw output for source page; run build scripts first.', 'FAIL: 1 issues']) + messages.length = 0 + put('custom-output/silk/docs/source/reference.txt', 'Reference\n') + assert.equal(runSilkAudit(context, reporter), 0) + // A later run on the same context must observe changed source metadata. + put('src/silk/docs/new/page.md', '---\ndocsCollection: silk\nsourcePath: new.txt\n---\n') + assert.equal(runSilkAudit(context, reporter), 1) + assert.deepEqual(messages, ['silk/docs/source/new.txt: Missing raw output for source page; run build scripts first.', 'FAIL: 1 issues']) + messages.length = 0 + put('custom-output/silk/docs/source/new.txt', 'New\n') + rmSync(join(root, 'custom-output/silk/docs/source/spec/2026.md')) + assert.equal(runSilkAudit(context, reporter), 1) + assert.deepEqual(messages, ['silk/docs/source/spec/2026.md: Missing raw output for source page; run build scripts first.', 'FAIL: 1 issues']) + } finally { rmSync(root, { recursive: true, force: true }) } +}) + test('audit environment paths', () => { assert.equal(auditContext({}).outputRoot, join(siteRoot, 'public')) assert.equal(auditContext({}).runtimeRepo, undefined) diff --git a/tests/tooling/watch.test.ts b/tests/tooling/watch.test.ts index 60842b5d..86460985 100644 --- a/tests/tooling/watch.test.ts +++ b/tests/tooling/watch.test.ts @@ -3,7 +3,9 @@ import assert from 'node:assert/strict' import { cp, mkdtemp, - mkdir, + readdir, + stat, + access, readFile, writeFile, rm, @@ -60,27 +62,69 @@ test('a standalone checkout rebuilds articles, sidebar data and exports in watch await waitFor(async () => logs.includes('ORO_WATCH_READY')) const source = join(site, 'src', route, 'page.md') const original = await readFile(source, 'utf8') - const updated = - original - .replace('title: "Hello world"', 'title: "Watch refresh"') - .replace('# Hello world', '# Watch refresh') + - '\nA unique watch-mode verification sentence.\n' + const outputRoot = join(site, 'public') + const rawPath = 'runtime/docs/source/guides/hello-world.md' + const siblingPath = join(outputRoot, 'runtime/docs/index.html') + const rawMtimes = async () => { + const paths = (await readdir(outputRoot, { recursive: true })) + .filter(path => /\/(docs|wiki)\/source\/.*\.(md|txt)$/.test(path)).sort() + return Object.fromEntries(await Promise.all(paths.map(async path => + [path, (await stat(join(outputRoot, path), { bigint: true })).mtimeNs] as const))) + } + const initialRaw = await rawMtimes() + assert.ok(Object.keys(initialRaw).length > 1) + assert.ok(rawPath in initialRaw) + const sibling = await readFile(siblingPath, 'utf8') + const siblingMtime = (await stat(siblingPath, { bigint: true })).mtimeNs + const sentence = 'A unique watch-mode verification sentence.' + const updated = original + '\n' + sentence + '\n' + await delay(100) await writeFile(source, updated) await waitFor(async () => { - const paths = [ - route + 'index.html', - 'runtime/docs/index.html', - 'runtime/docs/search.json', - 'runtime/docs/index.json', - 'runtime/llms.txt', - 'runtime/docs/source/guides/hello-world.md', - ] - const output = await Promise.all( - paths.map((path) => readFile(join(site, 'public', path), 'utf8')), - ) - return output.every((text) => text.includes('Watch refresh')) + const output = await Promise.all([ + route + 'index.html', 'runtime/docs/search.json', 'runtime/llms.txt', rawPath, + ].map(path => readFile(join(outputRoot, path), 'utf8'))) + return output.every(text => text.includes(sentence)) + }) + // Allow the debounced build to finish before checking files it must not touch. + await delay(500) + const bodyRaw = await rawMtimes() + assert.deepEqual(Object.keys(bodyRaw), Object.keys(initialRaw)) + assert.deepEqual(Object.keys(bodyRaw).filter(path => bodyRaw[path] !== initialRaw[path]), [rawPath]) + assert.equal(await readFile(siblingPath, 'utf8'), sibling) + assert.equal((await stat(siblingPath, { bigint: true })).mtimeNs, siblingMtime) + + // Only frontmatter changes: the Markdown heading and raw body stay identical. + const retitled = updated.replace('title: "Hello world"', 'title: "Watch refresh"') + assert.notEqual(retitled, updated) + await writeFile(source, retitled) + await waitFor(async () => { + const output = await Promise.all([ + route + 'index.html', 'runtime/docs/index.html', 'runtime/docs/search.json', 'runtime/llms.txt', + ].map(path => readFile(join(outputRoot, path), 'utf8'))) + return output.every(text => text.includes('Watch refresh')) + }) + await delay(500) + assert.deepEqual(await rawMtimes(), bodyRaw) + + const renamedRawPath = 'runtime/docs/source/guides/watch-renamed.txt' + const renamed = retitled.replace('sourcePath: "guides/hello-world.md"', 'sourcePath: "guides/watch-renamed.txt"') + assert.notEqual(renamed, retitled) + const raw = await readFile(join(outputRoot, rawPath)) + await writeFile(source, renamed) + await waitFor(async () => { + assert.deepEqual(await readFile(join(outputRoot, renamedRawPath)), raw) + await assert.rejects(access(join(outputRoot, rawPath)), { code: 'ENOENT' }) + return true + }) + await rm(source) + await waitFor(async () => { + await assert.rejects(access(join(outputRoot, renamedRawPath)), { code: 'ENOENT' }) + await assert.rejects(access(join(outputRoot, route, 'index.html')), { code: 'ENOENT' }) + const search = await readFile(join(outputRoot, 'runtime/docs/search.json'), 'utf8') + const pack = await readFile(join(outputRoot, 'runtime/llms.txt'), 'utf8') + return !search.includes(sentence) && !pack.includes(sentence) }) - assert.equal(await readFile(source, 'utf8'), updated) } finally { if (child && child.exitCode === null) { const exited = new Promise<void>((resolve) => diff --git a/tools/audit-content.ts b/tools/audit-content.ts index 8fca5a47..8844d410 100644 --- a/tools/audit-content.ts +++ b/tools/audit-content.ts @@ -1,6 +1,6 @@ import { resolve } from 'node:path' import { fileURLToPath } from 'node:url' -import { runSiteAudit } from './audits/common.ts' +import { runSiteAudit, withSourceInventory } from './audits/common.ts' import type { AuditContext, Reporter } from './audits/common.ts' import { runRuntimeAudit } from './audits/runtime.ts' import { runSilkAudit, runStdlibAudit } from './audits/silk.ts' @@ -14,6 +14,7 @@ export function auditContext(env: NodeJS.ProcessEnv = process.env): AuditContext } } export function runContentAudit(context = auditContext(), reporter: Reporter = console): number { + context = withSourceInventory(context) // Match the former package script's order and && short-circuit behavior. const audits = [runRuntimeAudit, runSilkAudit, runStdlibAudit, ...(['sage', 'slg', 'virtnosis'] as const).map(collection => diff --git a/tools/audits/common.ts b/tools/audits/common.ts index fae1a830..9f6e1df7 100644 --- a/tools/audits/common.ts +++ b/tools/audits/common.ts @@ -1,10 +1,34 @@ import { existsSync, readFileSync, readdirSync, realpathSync } from 'node:fs' import { dirname, isAbsolute, relative, resolve } from 'node:path' -import { collections, type Collection } from '../../src/lib/collections.ts' +import { load } from 'js-yaml' +import { collections, type Collection } from '#lib/collections.ts' export interface Issue { path: string; message: string } -export interface AuditContext { siteRoot: string; outputRoot: string; runtimeRepo?: string } -export interface CollectionConfig { source: string; index: string; kind: string } +export interface AuditContext { siteRoot: string; outputRoot: string; runtimeRepo?: string; inventory?: SourceInventory } +interface SourceItem { id: string; file: string } +export type SourceInventory = Record<Collection, SourceItem[]> +export interface CollectionConfig { source: string; items: SourceItem[]; kind: string } + +export function buildSourceInventory(siteRoot: string): SourceInventory { + const inventory = Object.fromEntries(Object.keys(collections).map(key => [key, []])) as unknown as SourceInventory + for (const path of markdownFiles(pathJoin(siteRoot, 'src')).sort()) { + if (!path.endsWith('/page.md')) continue + const frontmatter = /^---\n([\s\S]*?)\n---(?:\n|$)/.exec(read(path)) + if (!frontmatter) continue + const data = load(frontmatter[1]!) as Record<string, unknown> | undefined + if (!data || typeof data.docsCollection !== 'string' || !Object.hasOwn(collections, data.docsCollection)) continue + if (typeof data.sourcePath !== 'string' || !/\.(md|txt)$/.test(data.sourcePath) || normalizeRelPath(data.sourcePath) !== data.sourcePath) { + throw new Error(`${path}: invalid or missing sourcePath`) + } + inventory[data.docsCollection as Collection].push({ id: data.sourcePath.replace(/\.(md|txt)$/, ''), file: data.sourcePath }) + } + return inventory +} + +// Scope reuse to this invocation, never a process-global cache of source metadata. +export function withSourceInventory(context: AuditContext): AuditContext { + return context.inventory ? context : { ...context, inventory: buildSourceInventory(context.siteRoot) } +} export type Reporter = Pick<Console, 'log' | 'error'> // Translate the Python regex constructs used by these audits, without changing policy. @@ -49,7 +73,7 @@ export function pathJoin(...parts: string[]): string { } export function collectionConfig(context: AuditContext, collection: Collection): CollectionConfig { const root = pathJoin(context.outputRoot, collections[collection].base.slice(1)) - return { source: pathJoin(root, 'source'), index: pathJoin(root, 'index.json'), kind: collection === 'silkWiki' ? 'wiki' : 'docs' } + return { source: pathJoin(root, 'source'), items: (context.inventory ?? buildSourceInventory(context.siteRoot))[collection], kind: collection === 'silkWiki' ? 'wiki' : 'docs' } } export function markdownFiles(root: string, recursive = true): string[] { if (!existsSync(root)) return [] @@ -60,15 +84,10 @@ export function markdownFiles(root: string, recursive = true): string[] { } return files } -interface Index { sections?: { items?: { id: string; file: string }[] }[] } -export function indexItems(path: string): { id: string; file: string }[] { - const data: Index = JSON.parse(read(path)) - return (data.sections ?? []).flatMap(section => section.items ?? []) -} -export const loadIds = (path: string): Set<string> => new Set(indexItems(path).map(item => item.id)) -export function checkIndex(config: CollectionConfig): Issue[] { - return indexItems(config.index).filter(item => !existsSync(pathJoin(config.source, item.file))) - .map(item => ({ path: config.index, message: `Index refers to missing file: ${item.file}` })) +export const collectionIds = (config: CollectionConfig): Set<string> => new Set(config.items.map(item => item.id)) +export function checkRawOutputs(config: CollectionConfig): Issue[] { + return config.items.filter(item => !existsSync(pathJoin(config.source, item.file))) + .map(item => ({ path: pathJoin(config.source, item.file), message: 'Missing raw output for source page; run build scripts first.' })) } export function normalizeRelPath(input: string): string | undefined { if (!input) return undefined @@ -166,10 +185,9 @@ export function reportIssues(issues: Issue[], root: string, success: string, rep } export function runSiteAudit(context: AuditContext, collection: Exclude<Collection, 'silkWiki'>, reporter: Reporter = console): number { const config = collectionConfig(context, collection) - const title = { runtime: 'Runtime', silk: 'Silk', sage: 'Sage', slg: 'Slg', virtnosis: 'Virtnosis' }[collection] - if (!existsSync(config.index)) { reporter.error(`Missing ${title} docs/index.json; run build scripts first.`); return 2 } + return reportIssues([ - ...checkIndex(config), ...checkPLinks(config, { docs: loadIds(config.index) }), + ...checkRawOutputs(config), ...checkPLinks(config, { docs: collectionIds(config) }), ...checkDocLinks(config.source, context.outputRoot, { docs: config.source }), ...checkLines(config.source, 'viewer'), ...checkLines(config.source, 'manpage'), ...checkLines(config.source, 'editorial'), ], context.outputRoot, `OK: ${collection} site audit passed`, reporter) diff --git a/tools/audits/runtime.ts b/tools/audits/runtime.ts index 5c7dff62..ea254979 100644 --- a/tools/audits/runtime.ts +++ b/tools/audits/runtime.ts @@ -1,5 +1,5 @@ import { existsSync } from 'node:fs' -import { collectionConfig, markdownFiles, pathJoin, pattern, read, reportIssues, runSiteAudit } from './common.ts' +import { collectionConfig, markdownFiles, pathJoin, pattern, read, reportIssues, runSiteAudit, withSourceInventory } from './common.ts' import type { AuditContext, Issue, Reporter } from './common.ts' const curated = new Map(['ai', 'application', 'extension', 'fs', 'hooks', 'mcp', 'notification', 'secure-storage', 'window'].map(name => [`oro:${name}`, `${name}.md`])) @@ -59,6 +59,7 @@ export function runtimeIssues(context: AuditContext): Issue[] { return issues } export function runRuntimeAudit(context: AuditContext, reporter: Reporter = console): number { + context = withSourceInventory(context) const rc = runSiteAudit(context, 'runtime', reporter) if (rc !== 0) return rc return reportIssues(runtimeIssues(context), context.outputRoot, 'OK: runtime docs audit passed', reporter, 'runtime docs issues') diff --git a/tools/audits/silk.ts b/tools/audits/silk.ts index fc71bcf3..b555dda6 100644 --- a/tools/audits/silk.ts +++ b/tools/audits/silk.ts @@ -1,23 +1,20 @@ import { existsSync } from 'node:fs' import { relative } from 'node:path' -import { checkDocLinks, checkIndex, checkLines, checkPLinks, collectionConfig, lines, loadIds, markdownFiles, pathJoin, pattern, read, reportIssues, trim } from './common.ts' +import { checkDocLinks, checkRawOutputs, checkLines, checkPLinks, collectionConfig, lines, collectionIds, withSourceInventory, markdownFiles, pathJoin, pattern, read, reportIssues, trim } from './common.ts' import type { AuditContext, Issue, Reporter } from './common.ts' function checkText(source: string, expression: RegExp, message: string): Issue[] { return markdownFiles(source).filter(path => expression.test(read(path))).map(path => ({ path, message })) } export function runSilkAudit(context: AuditContext, reporter: Reporter = console): number { + context = withSourceInventory(context) const configs = [collectionConfig(context, 'silk'), collectionConfig(context, 'silkWiki')] - if (configs.some(config => !existsSync(config.index))) { - reporter.error('Missing Silk index.json files; run build scripts first.') - return 2 - } const docs = configs[0]! const wiki = configs[1]! - const ids = { docs: loadIds(docs.index), wiki: loadIds(wiki.index) } + const ids = { docs: collectionIds(docs), wiki: collectionIds(wiki) } const sources = { docs: docs.source, wiki: wiki.source, spec: pathJoin(docs.source, 'spec') } const issues = [ - ...configs.flatMap(checkIndex), + ...configs.flatMap(checkRawOutputs), ...configs.flatMap(config => checkPLinks(config, ids, true)), ...configs.flatMap(config => checkDocLinks(config.source, context.outputRoot, sources)), ...configs.flatMap(config => checkText(config.source, pattern('\\bconst\\s+region\\s+arena\\b|\\bexport\\s+const\\s+region\\s+arena\\b|\\bwith\\s+arena\\b\\s*\\{|\\bfrom\\s+arena\\b|\\bglobal_arena\\b', 'i'), 'Found arena identifier in examples (use regions + neutral names).')), diff --git a/tools/import-public.ts b/tools/import-public.ts index 26c1ca86..c02650cf 100644 --- a/tools/import-public.ts +++ b/tools/import-public.ts @@ -3,7 +3,7 @@ import { linkReferences, type Reference } from './migration/references.ts' import { readFile, readdir, writeFile, mkdir, unlink } from 'node:fs/promises' import { load as parseYaml } from 'js-yaml' import { resolve, join, dirname } from 'node:path' -import { collections, docUrl, type Collection } from '../src/lib/collections.ts' +import { collections, docUrl, type Collection } from '#lib/collections.ts' import { publicContent, description, diff --git a/tools/migration/content.ts b/tools/migration/content.ts index 6f6eff61..c0300163 100644 --- a/tools/migration/content.ts +++ b/tools/migration/content.ts @@ -1,7 +1,7 @@ import MarkdownIt from 'markdown-it' import { sanitizeMarkdown, sanitizeSpecMarkdown } from './public-copy.ts' -import { canonicalLink } from '../../src/lib/urls.ts' -import { collections, type Collection } from '../../src/lib/collections.ts' +import { canonicalLink } from '#lib/urls.ts' +import { collections, type Collection } from '#lib/collections.ts' const parser = new MarkdownIt({ html: true }) export function publicContent( text: string, diff --git a/tools/migration/migrate.ts b/tools/migration/migrate.ts index fb5dcae6..49692171 100644 --- a/tools/migration/migrate.ts +++ b/tools/migration/migrate.ts @@ -7,8 +7,8 @@ import { collections, docUrl, type Collection, -} from '../../src/lib/collections.ts' -import { canonicalLink } from '../../src/lib/urls.ts' +} from '#lib/collections.ts' +import { canonicalLink } from '#lib/urls.ts' import MarkdownIt from 'markdown-it' import { publicContent, description } from './content.ts' const legacy = resolve(process.argv[2] || '.') diff --git a/tools/migration/references.ts b/tools/migration/references.ts index d92f5ec8..50730db7 100644 --- a/tools/migration/references.ts +++ b/tools/migration/references.ts @@ -1,10 +1,10 @@ import MarkdownIt from 'markdown-it' -import { canonicalLink } from '../../src/lib/urls.ts' +import { canonicalLink } from '#lib/urls.ts' import { collections, docUrl, type Collection, -} from '../../src/lib/collections.ts' +} from '#lib/collections.ts' export interface Reference { collection: Collection id: string diff --git a/tools/source-pages.ts b/tools/source-pages.ts index a4b2d6e1..1be1ba5c 100644 --- a/tools/source-pages.ts +++ b/tools/source-pages.ts @@ -1,6 +1,6 @@ import { readFile, writeFile, mkdir, readdir, stat } from 'node:fs/promises' import { dirname, join } from 'node:path' -import type { Collection } from '../src/lib/collections.ts' +import type { Collection } from '#lib/collections.ts' export async function stageCollection(collection: Collection, dest: string, site: string): Promise<void> { const { exportCollection } = await import('./import-public.ts') From 3fcbc14ff293765f5ae9e97e94c3cd86a9ba267a Mon Sep 17 00:00:00 2001 From: Bret Comnes <bret@comnes.org> Date: Mon, 14 Sep 2026 22:07:53 -0700 Subject: [PATCH 4/5] refactor: infer docs titles and generate metadata-owned redirects --- README.md | 45 ++++++- docs/migration.md | 15 +++ src/globals/global.data.ts | 4 +- src/layouts/root.layout.ts | 3 +- src/layouts/spec.layout.ts | 3 +- src/lib/docs.ts | 7 +- src/lib/redirects.ts | 73 +++++++++++ src/lib/titles.ts | 19 +++ src/redirects.pages.ts | 47 ++++--- src/runtime/docs/cli/build/page.md | 1 - src/runtime/docs/cli/config/page.md | 1 - src/runtime/docs/cli/env/page.md | 1 - src/runtime/docs/cli/help/page.md | 1 - src/runtime/docs/cli/init/page.md | 1 - src/runtime/docs/cli/install-app/page.md | 1 - src/runtime/docs/cli/list-devices/page.md | 1 - src/runtime/docs/cli/mcp/page.md | 1 - src/runtime/docs/cli/oroc/page.md | 1 - src/runtime/docs/cli/print-build-dir/page.md | 1 - src/runtime/docs/cli/run/page.md | 1 - src/runtime/docs/cli/setup/page.md | 1 - src/runtime/docs/cli/update/bundle/page.md | 1 - src/runtime/docs/cli/update/extract/page.md | 1 - src/runtime/docs/cli/update/info/page.md | 1 - src/runtime/docs/cli/update/init/page.md | 1 - src/runtime/docs/cli/update/keygen/page.md | 1 - src/runtime/docs/cli/update/page.md | 1 - src/runtime/docs/cli/update/server/page.md | 1 - src/runtime/docs/cli/update/sign/page.md | 1 - src/runtime/docs/cli/update/validate/page.md | 1 - src/runtime/docs/cli/update/verify/page.md | 1 - src/runtime/docs/cli/version/page.md | 1 - src/runtime/docs/cli/versions/page.md | 1 - src/runtime/docs/config/copy-map/page.md | 1 - src/runtime/docs/config/overview/page.md | 1 - src/runtime/docs/config/reference/page.md | 1 - .../docs/guides/build-and-package/page.md | 1 - .../docs/guides/calling-http-apis/page.md | 1 - .../configure-your-runtime-project/page.md | 1 - .../custom-protocols-and-routing/page.md | 1 - .../docs/guides/desktop-integrations/page.md | 1 - .../docs/guides/files-and-sandboxing/page.md | 1 - .../guides/from-zero-to-first-run/page.md | 1 - .../guides/frontend-build-pipeline/page.md | 1 - src/runtime/docs/guides/hello-world/page.md | 1 - .../lifecycle-hooks-and-deep-links/page.md | 1 - .../guides/local-data-with-sqlite/page.md | 1 - .../guides/mcp-and-agent-automation/page.md | 1 - .../page.md | 1 - .../docs/guides/native-extensions/page.md | 1 - .../page.md | 1 - .../docs/guides/project-layout/page.md | 1 - .../page.md | 1 - .../secure-storage-and-sessions/page.md | 1 - .../shared-workers-across-windows/page.md | 1 - .../guides/testing-and-diagnostics/page.md | 1 - .../docs/guides/windows-and-messaging/page.md | 1 - .../worker-threads-for-heavy-work/page.md | 1 - src/runtime/docs/javascript/ai/page.md | 1 - .../docs/javascript/all-modules/page.md | 1 - .../docs/javascript/application/page.md | 1 - src/runtime/docs/javascript/asn1/page.md | 1 - src/runtime/docs/javascript/assert/page.md | 1 - src/runtime/docs/javascript/async/page.md | 1 - .../docs/javascript/async_hooks/page.md | 1 - .../docs/javascript/background/page.md | 1 - src/runtime/docs/javascript/buffer/page.md | 1 - src/runtime/docs/javascript/cdp/page.md | 1 - .../docs/javascript/child_process/page.md | 1 - src/runtime/docs/javascript/clipboard/page.md | 1 - src/runtime/docs/javascript/commonjs/page.md | 1 - src/runtime/docs/javascript/conduit/page.md | 1 - src/runtime/docs/javascript/console/page.md | 1 - src/runtime/docs/javascript/constants/page.md | 1 - src/runtime/docs/javascript/cookies/page.md | 1 - src/runtime/docs/javascript/crypto/page.md | 1 - src/runtime/docs/javascript/dbus/page.md | 1 - src/runtime/docs/javascript/dgram/page.md | 1 - .../docs/javascript/diagnostics/page.md | 1 - src/runtime/docs/javascript/did/page.md | 1 - src/runtime/docs/javascript/dns/page.md | 1 - .../docs/javascript/enumeration/page.md | 1 - src/runtime/docs/javascript/errno/page.md | 1 - src/runtime/docs/javascript/errors/page.md | 1 - src/runtime/docs/javascript/events/page.md | 1 - src/runtime/docs/javascript/extension/page.md | 1 - src/runtime/docs/javascript/fetch/page.md | 1 - src/runtime/docs/javascript/fs/page.md | 1 - src/runtime/docs/javascript/gc/page.md | 1 - src/runtime/docs/javascript/hci/page.md | 1 - src/runtime/docs/javascript/hooks/page.md | 1 - src/runtime/docs/javascript/http/page.md | 1 - src/runtime/docs/javascript/https/page.md | 1 - src/runtime/docs/javascript/i18n/page.md | 1 - src/runtime/docs/javascript/ip/page.md | 1 - src/runtime/docs/javascript/ipc/page.md | 1 - src/runtime/docs/javascript/ipfs/page.md | 1 - src/runtime/docs/javascript/iroh/page.md | 1 - src/runtime/docs/javascript/language/page.md | 1 - src/runtime/docs/javascript/latica/page.md | 1 - src/runtime/docs/javascript/location/page.md | 1 - src/runtime/docs/javascript/mcp/page.md | 1 - src/runtime/docs/javascript/mime/page.md | 1 - src/runtime/docs/javascript/module/page.md | 1 - .../docs/javascript/navigation/page.md | 1 - src/runtime/docs/javascript/net/page.md | 1 - src/runtime/docs/javascript/network/page.md | 1 - .../docs/javascript/notification/page.md | 1 - src/runtime/docs/javascript/npm/page.md | 1 - src/runtime/docs/javascript/os/page.md | 1 - src/runtime/docs/javascript/overview/page.md | 1 - src/runtime/docs/javascript/path/page.md | 1 - src/runtime/docs/javascript/process/page.md | 1 - .../docs/javascript/protocol-handlers/page.md | 1 - .../docs/javascript/querystring/page.md | 1 - .../docs/javascript/secure-storage/page.md | 1 - src/runtime/docs/javascript/semver/page.md | 1 - .../docs/javascript/service-worker/page.md | 1 - .../docs/javascript/shared-worker/page.md | 1 - src/runtime/docs/javascript/signal/page.md | 1 - src/runtime/docs/javascript/sqlite/page.md | 1 - src/runtime/docs/javascript/stream/page.md | 1 - .../docs/javascript/string_decoder/page.md | 1 - src/runtime/docs/javascript/tar/page.md | 1 - src/runtime/docs/javascript/tcp/page.md | 1 - src/runtime/docs/javascript/test/page.md | 1 - src/runtime/docs/javascript/timers/page.md | 1 - src/runtime/docs/javascript/tls/page.md | 1 - src/runtime/docs/javascript/toml/page.md | 1 - src/runtime/docs/javascript/tty/page.md | 1 - src/runtime/docs/javascript/url/page.md | 1 - src/runtime/docs/javascript/usb/page.md | 1 - src/runtime/docs/javascript/util/page.md | 1 - src/runtime/docs/javascript/vm/page.md | 1 - src/runtime/docs/javascript/window/page.md | 1 - src/runtime/docs/javascript/worker/page.md | 1 - .../docs/javascript/worker_threads/page.md | 1 - src/runtime/docs/javascript/xpc/page.md | 1 - src/runtime/docs/javascript/zlib/page.md | 1 - src/runtime/docs/page.md | 1 - src/sage/docs/cli/configuration/page.md | 1 - src/sage/docs/cli/diagnostics/page.md | 1 - .../docs/cli/environment-and-files/page.md | 1 - src/sage/docs/cli/inputs-and-modes/page.md | 1 - src/sage/docs/cli/keys-and-commands/page.md | 1 - src/sage/docs/cli/options/page.md | 1 - src/sage/docs/cli/sage/page.md | 1 - src/sage/docs/cli/syntax-and-cache/page.md | 1 - src/sage/docs/guides/getting-started/page.md | 1 - src/sage/docs/guides/pager-workflows/page.md | 1 - .../docs/guides/plugins-quickstart/page.md | 1 - src/sage/docs/javascript/all-modules/page.md | 1 - src/sage/docs/javascript/crypto/page.md | 1 - src/sage/docs/javascript/dom/page.md | 1 - src/sage/docs/javascript/env/page.md | 1 - src/sage/docs/javascript/fetch/page.md | 1 - src/sage/docs/javascript/fs/page.md | 1 - src/sage/docs/javascript/module-index/page.md | 1 - src/sage/docs/javascript/navigator/page.md | 1 - src/sage/docs/javascript/overview/page.md | 1 - src/sage/docs/javascript/path/page.md | 1 - src/sage/docs/javascript/performance/page.md | 1 - src/sage/docs/javascript/process/page.md | 1 - src/sage/docs/javascript/runtime/page.md | 1 - src/sage/docs/javascript/url/page.md | 1 - src/sage/docs/javascript/uuid/page.md | 1 - src/sage/docs/javascript/web/page.md | 1 - src/sage/docs/man/sage-1/page.md | 1 - src/sage/docs/man/sage-7/page.md | 1 - src/sage/docs/man/sage-plugin-api-3/page.md | 1 - src/sage/docs/page.md | 1 - src/silk/docs/compiler/abi-libsilk/page.md | 1 - src/silk/docs/compiler/architecture/page.md | 1 - src/silk/docs/compiler/async-runtime/page.md | 1 - src/silk/docs/compiler/backend-amdgpu/page.md | 1 - src/silk/docs/compiler/backend-gpu/page.md | 1 - src/silk/docs/compiler/backend-nvidia/page.md | 1 - src/silk/docs/compiler/backend-wasm/page.md | 1 - src/silk/docs/compiler/build-scripts/page.md | 1 - src/silk/docs/compiler/builtin-deps/page.md | 1 - src/silk/docs/compiler/cache-silk/page.md | 1 - src/silk/docs/compiler/cli-silk/page.md | 1 - src/silk/docs/compiler/diagnostics/page.md | 1 - .../compiler/implementation-status/page.md | 1 - src/silk/docs/compiler/ir-overview/page.md | 1 - .../docs/compiler/libsilk-quickstart/page.md | 1 - src/silk/docs/compiler/limits/page.md | 1 - src/silk/docs/compiler/lsp-silk/page.md | 1 - .../compiler/package-distribution/page.md | 1 - .../docs/compiler/package-manifests/page.md | 1 - .../docs/compiler/stdlib-integration/page.md | 1 - .../docs/compiler/testing-strategy/page.md | 1 - src/silk/docs/compiler/vendored-deps/page.md | 1 - src/silk/docs/compiler/zig-api/page.md | 1 - src/silk/docs/guides/cli/page.md | 1 - src/silk/docs/guides/formal-silk/page.md | 1 - src/silk/docs/guides/hello-world/page.md | 1 - src/silk/docs/guides/language-tour/page.md | 1 - .../docs/guides/modules-and-packages/page.md | 1 - .../guides/practical-logger-module/page.md | 2 +- .../docs/guides/project-dependencies/page.md | 1 - src/silk/docs/guides/purpose/page.md | 1 - src/silk/docs/guides/standard-library/page.md | 1 - src/silk/docs/guides/testing/page.md | 1 - src/silk/docs/language/asm/page.md | 1 - src/silk/docs/language/atomics/page.md | 1 - src/silk/docs/language/attributes/page.md | 1 - src/silk/docs/language/borrow-checker/page.md | 1 - src/silk/docs/language/buffers/page.md | 1 - src/silk/docs/language/build-metadata/page.md | 1 - src/silk/docs/language/cheat-sheet/page.md | 1 - src/silk/docs/language/concurrency/page.md | 1 - .../docs/language/const-functions/page.md | 1 - src/silk/docs/language/conventions/page.md | 1 - .../docs/language/dependent-types/page.md | 1 - src/silk/docs/language/doc-comments/page.md | 1 - .../docs/language/duration-instant/page.md | 1 - src/silk/docs/language/enums/page.md | 1 - src/silk/docs/language/errors/page.md | 1 - src/silk/docs/language/ext/page.md | 1 - .../language/flow-blocks-statements/page.md | 1 - src/silk/docs/language/flow-break/page.md | 1 - src/silk/docs/language/flow-continue/page.md | 1 - .../flow-expression-statements/page.md | 1 - src/silk/docs/language/flow-for/page.md | 1 - src/silk/docs/language/flow-if-else/page.md | 1 - src/silk/docs/language/flow-loop/page.md | 1 - src/silk/docs/language/flow-match/page.md | 1 - src/silk/docs/language/flow-overview/page.md | 1 - src/silk/docs/language/flow-return/page.md | 1 - src/silk/docs/language/flow-while/page.md | 1 - .../docs/language/formal-verification/page.md | 1 - .../language/function-disciplines/page.md | 1 - src/silk/docs/language/generics/page.md | 1 - src/silk/docs/language/gpu-execution/page.md | 1 - .../docs/language/gpu-launch-blocks/page.md | 1 - src/silk/docs/language/grammar/page.md | 1 - src/silk/docs/language/interfaces/page.md | 1 - .../docs/language/literals-aggregate/page.md | 1 - .../docs/language/literals-boolean/page.md | 1 - .../docs/language/literals-character/page.md | 1 - .../docs/language/literals-duration/page.md | 1 - .../docs/language/literals-numeric/page.md | 1 - .../docs/language/literals-overview/page.md | 1 - .../docs/language/literals-regexp/page.md | 1 - .../docs/language/literals-string/page.md | 1 - src/silk/docs/language/memory-model/page.md | 1 - src/silk/docs/language/mutability/page.md | 1 - src/silk/docs/language/operators/page.md | 1 - src/silk/docs/language/optional/page.md | 1 - .../language/packages-imports-exports/page.md | 1 - src/silk/docs/language/regions/page.md | 1 - .../docs/language/struct-requirements/page.md | 1 - .../language/structs-impls-layout/page.md | 1 - src/silk/docs/language/syntax-tour/page.md | 1 - .../docs/language/target-metadata/page.md | 1 - src/silk/docs/language/testing/page.md | 1 - .../docs/language/toolchain-metadata/page.md | 1 - src/silk/docs/language/type-unions/page.md | 1 - src/silk/docs/language/typed-errors/page.md | 1 - src/silk/docs/language/types/page.md | 1 - src/silk/docs/language/using/page.md | 1 - src/silk/docs/language/varargs/page.md | 1 - src/silk/docs/man/libsilk.7/page.md | 1 - src/silk/docs/man/silk-build.1/page.md | 1 - src/silk/docs/man/silk-cache.1/page.md | 1 - src/silk/docs/man/silk-cc.1/page.md | 1 - src/silk/docs/man/silk-check.1/page.md | 1 - src/silk/docs/man/silk-codesign.1/page.md | 1 - src/silk/docs/man/silk-devices.1/page.md | 1 - src/silk/docs/man/silk-doc.1/page.md | 1 - src/silk/docs/man/silk-env.1/page.md | 1 - src/silk/docs/man/silk-error.1/page.md | 1 - src/silk/docs/man/silk-format.1/page.md | 1 - src/silk/docs/man/silk-graph.1/page.md | 1 - src/silk/docs/man/silk-guide.1/page.md | 1 - src/silk/docs/man/silk-help.1/page.md | 1 - src/silk/docs/man/silk-lsp.1/page.md | 1 - src/silk/docs/man/silk-man.1/page.md | 1 - src/silk/docs/man/silk-package.1/page.md | 1 - src/silk/docs/man/silk-proto.1/page.md | 1 - src/silk/docs/man/silk-repl.1/page.md | 1 - src/silk/docs/man/silk-size.1/page.md | 1 - src/silk/docs/man/silk-targets.1/page.md | 1 - src/silk/docs/man/silk-test.1/page.md | 1 - src/silk/docs/man/silk.1/page.md | 1 - src/silk/docs/man/silk.7/page.md | 1 - .../docs/man/silk_abi_get_version.3/page.md | 1 - .../page.md | 1 - src/silk/docs/man/silk_bytes.3/page.md | 1 - src/silk/docs/man/silk_compiler.3/page.md | 1 - src/silk/docs/man/silk_error.3/page.md | 1 - src/silk/docs/man/slc.1/page.md | 1 - src/silk/docs/man/slcc.1/page.md | 1 - src/silk/docs/page.md | 1 - src/silk/docs/std/abort-controller/page.md | 1 - src/silk/docs/std/abort_controller/page.md | 1 - src/silk/docs/std/algorithms/page.md | 1 - src/silk/docs/std/args/page.md | 1 - src/silk/docs/std/arrays/page.md | 1 - src/silk/docs/std/atomic/page.md | 1 - src/silk/docs/std/bits/page.md | 1 - src/silk/docs/std/boolean/page.md | 1 - src/silk/docs/std/boxed-values/page.md | 1 - src/silk/docs/std/buffer/page.md | 1 - src/silk/docs/std/build/page.md | 1 - src/silk/docs/std/bytes/page.md | 1 - src/silk/docs/std/conventions/page.md | 1 - src/silk/docs/std/crypto-aead/page.md | 1 - src/silk/docs/std/crypto-box/page.md | 1 - src/silk/docs/std/crypto-hash/page.md | 1 - src/silk/docs/std/crypto-random/page.md | 1 - src/silk/docs/std/crypto-secretbox/page.md | 1 - src/silk/docs/std/crypto-sign/page.md | 1 - src/silk/docs/std/crypto/page.md | 1 - src/silk/docs/std/dylib/page.md | 1 - src/silk/docs/std/env/page.md | 1 - src/silk/docs/std/ffi-c/page.md | 1 - src/silk/docs/std/ffi-c_owned/page.md | 1 - src/silk/docs/std/filesystem/page.md | 1 - src/silk/docs/std/flag/page.md | 1 - src/silk/docs/std/fmt/page.md | 1 - src/silk/docs/std/formal/page.md | 1 - src/silk/docs/std/fs-stream/page.md | 1 - src/silk/docs/std/fs/page.md | 1 - src/silk/docs/std/function/page.md | 1 - src/silk/docs/std/ggml/page.md | 1 - src/silk/docs/std/gpu-device/page.md | 1 - src/silk/docs/std/gpu-isa/page.md | 1 - src/silk/docs/std/gpu/page.md | 1 - src/silk/docs/std/graphics-metal/page.md | 1 - src/silk/docs/std/graphics-opengl/page.md | 1 - src/silk/docs/std/graphics-opengles/page.md | 1 - src/silk/docs/std/graphics-vulkan/page.md | 1 - src/silk/docs/std/graphics-window/page.md | 1 - src/silk/docs/std/graphics/page.md | 1 - src/silk/docs/std/http/page.md | 1 - src/silk/docs/std/https/page.md | 1 - src/silk/docs/std/idl-web/page.md | 1 - src/silk/docs/std/image-color/page.md | 1 - src/silk/docs/std/image-jpeg/page.md | 1 - src/silk/docs/std/image-png/page.md | 1 - src/silk/docs/std/image/page.md | 1 - src/silk/docs/std/interfaces/page.md | 1 - src/silk/docs/std/io-async/page.md | 1 - src/silk/docs/std/io-stream/page.md | 1 - src/silk/docs/std/io/page.md | 1 - src/silk/docs/std/js-ecma/page.md | 1 - src/silk/docs/std/json/page.md | 1 - src/silk/docs/std/limits/page.md | 1 - src/silk/docs/std/list/page.md | 1 - src/silk/docs/std/map/page.md | 1 - src/silk/docs/std/math-matrix/page.md | 1 - src/silk/docs/std/math-vector/page.md | 1 - src/silk/docs/std/math/page.md | 1 - src/silk/docs/std/memory/page.md | 1 - src/silk/docs/std/mime/page.md | 1 - src/silk/docs/std/module-catalog/page.md | 1 - src/silk/docs/std/net-stream/page.md | 1 - src/silk/docs/std/net/page.md | 1 - src/silk/docs/std/networking/page.md | 1 - src/silk/docs/std/number/page.md | 1 - src/silk/docs/std/optional/page.md | 1 - src/silk/docs/std/os/page.md | 1 - src/silk/docs/std/overview/page.md | 1 - src/silk/docs/std/package-structure/page.md | 1 - src/silk/docs/std/path/page.md | 1 - src/silk/docs/std/process-child/page.md | 1 - src/silk/docs/std/process/page.md | 1 - src/silk/docs/std/protobuf/page.md | 1 - src/silk/docs/std/queue/page.md | 1 - src/silk/docs/std/range/page.md | 1 - src/silk/docs/std/readline/page.md | 1 - src/silk/docs/std/regex/page.md | 1 - src/silk/docs/std/result/page.md | 1 - src/silk/docs/std/runtime-atomic/page.md | 1 - src/silk/docs/std/runtime-build/page.md | 1 - src/silk/docs/std/runtime-dylib/page.md | 1 - src/silk/docs/std/runtime-env/page.md | 1 - src/silk/docs/std/runtime-event_loop/page.md | 1 - src/silk/docs/std/runtime-fs/page.md | 1 - src/silk/docs/std/runtime-globals/page.md | 1 - src/silk/docs/std/runtime-gpu/page.md | 1 - .../docs/std/runtime-graphics-metal/page.md | 1 - src/silk/docs/std/runtime-io/page.md | 1 - .../docs/std/runtime-linux-event_loop/page.md | 1 - src/silk/docs/std/runtime-mem/page.md | 1 - src/silk/docs/std/runtime-net/page.md | 1 - src/silk/docs/std/runtime-number/page.md | 1 - .../docs/std/runtime-posix-atomic/page.md | 1 - src/silk/docs/std/runtime-posix-dylib/page.md | 1 - src/silk/docs/std/runtime-posix-env/page.md | 1 - .../docs/std/runtime-posix-event_loop/page.md | 1 - src/silk/docs/std/runtime-posix-fs/page.md | 1 - src/silk/docs/std/runtime-posix-io/page.md | 1 - src/silk/docs/std/runtime-posix-mem/page.md | 1 - src/silk/docs/std/runtime-posix-net/page.md | 1 - .../docs/std/runtime-posix-process/page.md | 1 - .../docs/std/runtime-posix-signal/page.md | 1 - src/silk/docs/std/runtime-posix-sync/page.md | 1 - src/silk/docs/std/runtime-posix-task/page.md | 1 - src/silk/docs/std/runtime-posix-time/page.md | 1 - src/silk/docs/std/runtime-process/page.md | 1 - src/silk/docs/std/runtime-readline/page.md | 1 - src/silk/docs/std/runtime-regex/page.md | 1 - src/silk/docs/std/runtime-signal/page.md | 1 - src/silk/docs/std/runtime-sync/page.md | 1 - src/silk/docs/std/runtime-task/page.md | 1 - src/silk/docs/std/runtime-time/page.md | 1 - src/silk/docs/std/runtime-unicode/page.md | 1 - src/silk/docs/std/runtime-wasi-cwd/page.md | 1 - src/silk/docs/std/runtime-wasi-env/page.md | 1 - .../docs/std/runtime-wasi-event_loop/page.md | 1 - src/silk/docs/std/runtime-wasi-fs/page.md | 1 - src/silk/docs/std/runtime-wasi-io/page.md | 1 - src/silk/docs/std/runtime-wasi-mem/page.md | 1 - src/silk/docs/std/runtime-wasi-net/page.md | 1 - .../docs/std/runtime-wasi-preopen/page.md | 1 - .../docs/std/runtime-wasi-process/page.md | 1 - src/silk/docs/std/runtime-wasi-signal/page.md | 1 - src/silk/docs/std/runtime-wasi-sync/page.md | 1 - src/silk/docs/std/runtime-wasi-task/page.md | 1 - src/silk/docs/std/runtime-wasi-time/page.md | 1 - src/silk/docs/std/runtime-window/page.md | 1 - src/silk/docs/std/runtime-z3/page.md | 1 - src/silk/docs/std/runtime/page.md | 1 - src/silk/docs/std/semver/page.md | 1 - src/silk/docs/std/set/page.md | 1 - src/silk/docs/std/signal/page.md | 1 - src/silk/docs/std/sqlite/page.md | 1 - src/silk/docs/std/ssh/page.md | 1 - src/silk/docs/std/ssh2/page.md | 1 - src/silk/docs/std/stack/page.md | 1 - src/silk/docs/std/stream/page.md | 1 - src/silk/docs/std/strings/page.md | 1 - src/silk/docs/std/sync/page.md | 1 - src/silk/docs/std/tar-async/page.md | 1 - src/silk/docs/std/tar/page.md | 1 - src/silk/docs/std/task/page.md | 1 - src/silk/docs/std/temporal/page.md | 1 - src/silk/docs/std/test/page.md | 1 - src/silk/docs/std/time/page.md | 1 - src/silk/docs/std/tls/page.md | 1 - src/silk/docs/std/toml/page.md | 1 - src/silk/docs/std/unicode/page.md | 1 - src/silk/docs/std/url/page.md | 1 - src/silk/docs/std/uuid-random/page.md | 1 - src/silk/docs/std/uuid/page.md | 1 - src/silk/docs/std/vector/page.md | 1 - src/silk/docs/std/wasm/page.md | 1 - src/silk/docs/std/websocket/page.md | 1 - src/silk/docs/std/window-gtk/page.md | 1 - src/silk/docs/std/window-ios/page.md | 1 - src/silk/docs/std/window-macos/page.md | 1 - src/silk/docs/std/window/page.md | 1 - src/silk/docs/std/xml/page.md | 1 - src/silk/docs/std/z3/page.md | 1 - src/silk/docs/usage/cli-examples/page.md | 1 - src/silk/docs/usage/editor-coc-nvim/page.md | 1 - src/silk/docs/usage/editor-ctags/page.md | 1 - src/silk/docs/usage/editor-textmate/page.md | 1 - src/silk/docs/usage/editor-vim/page.md | 1 - src/silk/docs/usage/getting-started/page.md | 1 - src/silk/docs/usage/github-actions/page.md | 1 - src/silk/docs/usage/github-linguist/page.md | 1 - src/silk/docs/usage/guide-examples/page.md | 1 - .../usage/howto-custom-stdlib-root/page.md | 1 - .../usage/howto-dynamic-libraries/page.md | 1 - src/silk/docs/usage/howto-lumen-trail/page.md | 1 - .../docs/usage/howto-run-wasi-node/page.md | 1 - src/silk/docs/usage/pure-silk-gpu-ml/page.md | 1 - src/silk/docs/usage/pure-silk-gpu/page.md | 1 - .../usage/tutorials/01-first-program/page.md | 1 - .../tutorials/02-structs-and-impls/page.md | 1 - .../tutorials/03-arrays-and-slices/page.md | 1 - .../usage/tutorials/04-filesystem/page.md | 1 - .../usage/tutorials/05-concurrency/page.md | 1 - .../06-async-io-streams-abort/page.md | 1 - .../usage/tutorials/07-formal-silk/page.md | 1 - src/silk/spec/2026/page.md | 2 +- src/silk/wiki/language/borrow-checker/page.md | 1 - src/silk/wiki/language/buffers/page.md | 1 - src/silk/wiki/language/cheat-sheet/page.md | 1 - src/silk/wiki/language/concurrency/page.md | 1 - .../wiki/language/const-functions/page.md | 1 - src/silk/wiki/language/conventions/page.md | 1 - .../wiki/language/dependent-types/page.md | 1 - src/silk/wiki/language/doc-comments/page.md | 1 - .../wiki/language/duration-instant/page.md | 1 - src/silk/wiki/language/enums/page.md | 1 - src/silk/wiki/language/errors/page.md | 1 - src/silk/wiki/language/ext/page.md | 1 - .../language/flow-blocks-statements/page.md | 1 - src/silk/wiki/language/flow-break/page.md | 1 - src/silk/wiki/language/flow-continue/page.md | 1 - .../flow-expression-statements/page.md | 1 - src/silk/wiki/language/flow-for/page.md | 1 - src/silk/wiki/language/flow-if-else/page.md | 1 - src/silk/wiki/language/flow-loop/page.md | 1 - src/silk/wiki/language/flow-match/page.md | 1 - src/silk/wiki/language/flow-overview/page.md | 1 - src/silk/wiki/language/flow-return/page.md | 1 - src/silk/wiki/language/flow-while/page.md | 1 - .../wiki/language/formal-verification/page.md | 1 - .../language/function-disciplines/page.md | 1 - src/silk/wiki/language/generics/page.md | 1 - src/silk/wiki/language/grammar/page.md | 1 - src/silk/wiki/language/interfaces/page.md | 1 - .../wiki/language/literals-aggregate/page.md | 1 - .../wiki/language/literals-boolean/page.md | 1 - .../wiki/language/literals-character/page.md | 1 - .../wiki/language/literals-duration/page.md | 1 - .../wiki/language/literals-numeric/page.md | 1 - .../wiki/language/literals-overview/page.md | 1 - .../wiki/language/literals-string/page.md | 1 - src/silk/wiki/language/memory-model/page.md | 1 - src/silk/wiki/language/mutability/page.md | 1 - src/silk/wiki/language/operators/page.md | 1 - src/silk/wiki/language/optional/page.md | 1 - .../language/packages-imports-exports/page.md | 1 - src/silk/wiki/language/regions/page.md | 1 - .../wiki/language/struct-requirements/page.md | 1 - .../language/structs-impls-layout/page.md | 1 - src/silk/wiki/language/syntax-tour/page.md | 1 - src/silk/wiki/language/testing/page.md | 1 - src/silk/wiki/language/typed-errors/page.md | 1 - src/silk/wiki/language/types/page.md | 1 - src/silk/wiki/language/varargs/page.md | 1 - src/silk/wiki/page.md | 1 - src/silk/wiki/std/algorithms/page.md | 1 - src/silk/wiki/std/args/page.md | 1 - src/silk/wiki/std/arrays/page.md | 1 - src/silk/wiki/std/bits/page.md | 1 - src/silk/wiki/std/buffer/page.md | 1 - src/silk/wiki/std/conventions/page.md | 1 - src/silk/wiki/std/crypto/page.md | 1 - src/silk/wiki/std/env/page.md | 1 - src/silk/wiki/std/filesystem/page.md | 1 - src/silk/wiki/std/fmt/page.md | 1 - src/silk/wiki/std/formal/page.md | 1 - src/silk/wiki/std/interfaces/page.md | 1 - src/silk/wiki/std/io/page.md | 1 - src/silk/wiki/std/json/page.md | 1 - src/silk/wiki/std/map/page.md | 1 - src/silk/wiki/std/memory/page.md | 1 - src/silk/wiki/std/networking/page.md | 1 - src/silk/wiki/std/overview/page.md | 1 - src/silk/wiki/std/package-structure/page.md | 1 - src/silk/wiki/std/path/page.md | 1 - src/silk/wiki/std/process/page.md | 1 - src/silk/wiki/std/result/page.md | 1 - src/silk/wiki/std/runtime/page.md | 1 - src/silk/wiki/std/semver/page.md | 1 - src/silk/wiki/std/set/page.md | 1 - src/silk/wiki/std/strings/page.md | 1 - src/silk/wiki/std/sync/page.md | 1 - src/silk/wiki/std/task/page.md | 1 - src/silk/wiki/std/temporal/page.md | 1 - src/silk/wiki/std/tls/page.md | 1 - src/silk/wiki/std/toml/page.md | 1 - src/silk/wiki/std/url/page.md | 1 - src/silk/wiki/std/uuid/page.md | 1 - src/silk/wiki/std/vector/page.md | 1 - src/slg/docs/cli/diagnostics/page.md | 1 - .../docs/cli/input-types-and-parsing/page.md | 1 - src/slg/docs/cli/options-reference/page.md | 1 - .../docs/cli/output-and-exit-codes/page.md | 1 - src/slg/docs/cli/parallelism/page.md | 1 - .../docs/cli/patterns-and-matching/page.md | 1 - src/slg/docs/cli/slg/page.md | 1 - .../docs/cli/traversal-and-ignores/page.md | 1 - src/slg/docs/guides/getting-started/page.md | 1 - src/slg/docs/guides/search-recipes/page.md | 1 - src/slg/docs/man/slg-1/page.md | 1 - src/slg/docs/page.md | 1 - .../docs/cli/virtnosis-agent/page.md | 1 - src/virtnosis/docs/cli/vnactl/page.md | 1 - src/virtnosis/docs/guides/deployment/page.md | 1 - .../docs/guides/getting-started/page.md | 1 - .../docs/guides/install-and-package/page.md | 1 - .../docs/guides/operator-guide/page.md | 1 - .../docs/guides/output-and-automation/page.md | 1 - src/virtnosis/docs/guides/systemd/page.md | 1 - src/virtnosis/docs/man/virtnosis-7/page.md | 1 - .../docs/man/virtnosis-agent-1/page.md | 1 - .../man/virtnosis-agent-protocol-7/page.md | 1 - .../docs/man/virtnosis-scan-report-7/page.md | 1 - src/virtnosis/docs/man/vnactl-1/page.md | 1 - src/virtnosis/docs/page.md | 1 - .../docs/reference/architecture/page.md | 1 - .../docs/reference/development/page.md | 1 - src/virtnosis/docs/reference/overview/page.md | 1 - .../docs/reference/repository-docs/page.md | 1 - .../docs/reference/scan-analysis/page.md | 1 - tests/browser/docs.spec.ts | 8 +- tests/content.test.ts | 51 +++++++- tests/docs-watch.test.ts | 7 +- tests/import-roundtrip.test.ts | 34 ++++- tests/redirects-watch.test.ts | 121 ++++++++++++++++++ tests/redirects.test.ts | 106 +++++++++++++++ tests/site/output.test.ts | 56 +++++--- tests/titles.test.ts | 23 ++++ tests/tooling/watch.test.ts | 2 +- tools/import-public.ts | 30 +++-- tools/migration/content.ts | 16 +-- tools/migration/migrate.ts | 10 +- 606 files changed, 594 insertions(+), 673 deletions(-) create mode 100644 src/lib/redirects.ts create mode 100644 src/lib/titles.ts create mode 100644 tests/redirects-watch.test.ts create mode 100644 tests/redirects.test.ts create mode 100644 tests/titles.test.ts diff --git a/README.md b/README.md index 1df5bcfb..34090f30 100644 --- a/README.md +++ b/README.md @@ -61,12 +61,22 @@ highlighting, and legacy heading IDs. DOMStack's other default extensions are not implicitly enabled; review fragment and rendered-output compatibility before adding plugins. -Each documentation page declares `title`, `description`, `docsCollection`, -`section`, `order`, `sourcePath`, `githubRepo`, and `githubRef`. Preserve +Each documentation page declares `description`, `docsCollection`, `section`, +`order`, `sourcePath`, `githubRepo`, and `githubRef`. Its first Markdown H1 is the +default title; do not repeat it in frontmatter. Preserve `sourcePath`: it defines the stable raw Markdown endpoint and import identity. The `start` document lives at its collection root; the specification lives at `src/silk/spec/2026/page.md`. Order is explicit and does not depend on filenames. New imported pages are appended; review their section and order after syncing. +DOMStack infers the first H1 as inline Markdown. `src/lib/titles.ts` converts that +value to plain text for document/social metadata, navigation, search titles, and +LLM-pack headings, while the article keeps its formatted heading and anchor. +An optional frontmatter `title` overrides the inferred title; use it only for an +intentional difference (inline Markdown is reduced to plain text there too). +An H1 edit changes navigation metadata, while a body edit below it does not. +Imports infer titles from H1s, retain explicit overrides, and use a filename +fallback only for new documents without an H1. Raw Markdown remains unchanged. + Use `layout: "docs"` for documentation pages in every collection (`spec` for the specification). All docs share one lightweight navigation dependency: navigation changes rebuild all docs, while body-only edits remain isolated to the changed @@ -79,6 +89,37 @@ redirect pages retain Silk's old logger-guide and specification aliases. The articles, sidebar, previous/next navigation, and ToC work without JavaScript; search, tabs, copy controls, and Ask AI progressively enhance them. +### Redirects from old URLs + +Follow the [DOMStack redirect-pages recipe](https://domstack.net/docs/cookbook/redirect-pages/): +keep old paths on the **destination page**, rather than in a separate route map. +For Markdown, add frontmatter: + +```yaml +redirectFrom: + - /old-guide/ + - /old-guide.html +``` + +HTML pages can declare the same array in their `page.vars.ts` object. Global data +validates and collects these aliases; `src/redirects.pages.ts` subscribes only to +`redirects` and renders each old URL through the existing `redirect` layout. The +target comes from the destination page's actual URL, so retained aliases follow +it when it moves. Removing an alias or destination removes its generated redirect +in watch mode. Body edits do not change the redirect collection. + +Use same-origin paths beginning with `/`, with trailing `/` for directory URLs. +Queries, fragments, unsafe paths, duplicate aliases, and aliases colliding with +source pages are rejected. Choose paths that do not overlap assets or other +generated outputs. Redirect pages have a canonical target and a no-JavaScript +meta-refresh/fallback link; with JavaScript they preserve the incoming query and +fragment. These are static client-side redirects, not HTTP 301 responses. + +Legacy `?p=` document IDs still use the separate client resolver; do not put them +in `redirectFrom`. Manual content imports preserve existing page metadata, +including aliases. The logger guide and specification now declare their old +paths this way without changing their Markdown bodies or raw exports. + ## Refreshing upstream content Ingestion is separate from building and CI. These commands read explicit upstream diff --git a/docs/migration.md b/docs/migration.md index 593ada13..f32c275f 100644 --- a/docs/migration.md +++ b/docs/migration.md @@ -59,6 +59,21 @@ it does not alter runtime discovery, rendering, or subscriptions. Markdown frontmatter continues to use runtime metadata validation rather than per-page TypeScript companions. +Path redirects follow the DOMStack `redirectFrom` cookbook pattern: old paths +live in destination-page metadata, global data validates a separate redirects +projection, and a typed pages factory uses the existing redirect layout. The +logger-guide and specification aliases now use this path; legacy `?p=` links +retain their query-aware client resolver. Alias changes and destination moves +update generated pages, while body-only edits leave redirects untouched. + +All 585 documentation pages now use their Markdown H1 as the default title, +removing redundant frontmatter titles without changing article bodies. Because +DOMStack beta.6 infers raw inline Markdown, shared title helpers reduce it to +plain text at metadata consumers and in ingestion. Formatted H1s and anchors +remain unchanged; intentional frontmatter overrides remain supported. This also +removes stale link syntax from 31 metadata titles. Imports no longer regenerate +redundant title fields and preserve explicit overrides during upstream refreshes. + ## Acceptance checks `npm run check` runs: diff --git a/src/globals/global.data.ts b/src/globals/global.data.ts index 5fa54ea4..3718a5ae 100644 --- a/src/globals/global.data.ts +++ b/src/globals/global.data.ts @@ -1,7 +1,9 @@ import type { GlobalDataFunction } from '@domstack/static/types.js' import { collections, type Collection } from '#lib/collections.ts' +import { collectRedirects } from '#lib/redirects.ts' import { editUrl, plainText, projectCollection, validateDocVars, type Doc, type DocsData } from '#lib/docs.ts' const globalData: GlobalDataFunction<DocsData, Record<string, unknown>, string> = async ({ pages }) => { + const redirects = collectRedirects(pages) const docs: Record<Collection, Doc[]> = { runtime: [], silk: [], silkWiki: [], virtnosis: [], sage: [], slg: [], } @@ -21,7 +23,7 @@ const globalData: GlobalDataFunction<DocsData, Record<string, unknown>, string> editUrl: editUrl(source), }) } - const data = { routes: pages.map(p => p.pageInfo.url).sort(), navigation: {} } as DocsData + const data = { redirects, routes: pages.map(p => p.pageInfo.url).sort(), navigation: {} } as DocsData for (const collection of Object.keys(collections) as Collection[]) { const list = docs[collection] list.sort((a, b) => a.order - b.order || a.id.localeCompare(b.id, 'en')) diff --git a/src/layouts/root.layout.ts b/src/layouts/root.layout.ts index e13cd2a3..3431e8cc 100644 --- a/src/layouts/root.layout.ts +++ b/src/layouts/root.layout.ts @@ -1,4 +1,5 @@ import { rootContent } from '#lib/rendering.ts' +import { plainTitle } from '#lib/titles.ts' import { html, raw, render } from 'fragtml' import type { LayoutFunction } from '@domstack/static/types.js' import { header, footer } from '#lib/navigation.ts' @@ -30,7 +31,7 @@ const root: LayoutFunction<RootVars, string> = ({ const editorial = (v.bodyClass || '').includes('editorial-layout') const product = collection?.product || v.product || '' const title = collection - ? `${v.title} · ${v.layout === 'spec' ? 'Silk Spec' : collection.title} · ${v.siteName ?? 'Oro Computer'}` + ? `${plainTitle(v.title)} · ${v.layout === 'spec' ? 'Silk Spec' : collection.title} · ${v.siteName ?? 'Oro Computer'}` : v.title if (!collection) children = rootContent(children) const canonical = new URL(v.redirect || page.url, v.siteUrl).href diff --git a/src/layouts/spec.layout.ts b/src/layouts/spec.layout.ts index c89f8e0c..511fddca 100644 --- a/src/layouts/spec.layout.ts +++ b/src/layouts/spec.layout.ts @@ -1,6 +1,7 @@ import { html, raw, render } from 'fragtml' import type { LayoutFunction } from '@domstack/static/types.js' import { article } from '#lib/rendering.ts' +import { plainTitle } from '#lib/titles.ts' import { collections } from '#lib/collections.ts' import { rawUrl, type DocVars } from '#lib/docs.ts' export { pageOutputs } from '#lib/docs-page-outputs.ts' @@ -11,7 +12,7 @@ const spec: LayoutFunction<SpecVars, string> = ({ vars: v, children }) => { const markdownUrl = rawUrl({ collection: v.docsCollection, sourcePath: v.sourcePath }) const year = v.sourcePath.match(/(?:^|\/)(\d{4})\.(?:md|txt)$/)?.[1] const productLabel = collections[v.docsCollection].title.replace(/ (?:Docs|Wiki)$/, '') - const label = v.specLabel ?? (year ? `${productLabel} Spec (${year})` : v.title) + const label = v.specLabel ?? (year ? `${productLabel} Spec (${year})` : plainTitle(v.title)) const upstreamPath = v.sourcePath.split('/').map(encodeURIComponent).join('/') const upstreamUrl = `https://github.com/${v.githubRepo}/blob/${encodeURIComponent(v.githubRef)}/docs/${upstreamPath}` return render( diff --git a/src/lib/docs.ts b/src/lib/docs.ts index 32888bf0..9099cef8 100644 --- a/src/lib/docs.ts +++ b/src/lib/docs.ts @@ -1,4 +1,6 @@ import { load } from 'cheerio' +import type { Redirect } from './redirects.ts' +import { plainTitle } from './titles.ts' import { collections, sectionTitle, type Collection } from './collections.ts' export interface DocVars { docsCollection: Collection @@ -35,6 +37,7 @@ export interface SearchIndex { items: { id: string; title: string; file: string; url: string; section: string; summary: string; text: string }[] } export type DocsData = { + redirects: Redirect[] routes: string[] navigation: Record<Collection, Navigation> } & @@ -53,7 +56,9 @@ export function validateDocVars(v: Record<string, unknown>, source: string): Doc const path = v.sourcePath as string if (!/\.(md|txt)$/.test(path) || path.startsWith('/') || path.includes('\\') || path.split('/').some(p => !p || p === '.' || p === '..')) throw new Error(`${source}: invalid sourcePath ${path}`) - return v as unknown as DocVars + const title = plainTitle(v.title as string) + if (!title) throw new Error(`${source}: title must contain visible text (supply an H1 or explicit title)`) + return { ...v, title } as unknown as DocVars } export function projectCollection(docs: Doc[]) { const bySource: Record<string, NavDoc> = Object.create(null) diff --git a/src/lib/redirects.ts b/src/lib/redirects.ts new file mode 100644 index 00000000..2bfb06fb --- /dev/null +++ b/src/lib/redirects.ts @@ -0,0 +1,73 @@ +import type { PageInfo } from '@domstack/static/types.js' + +export type RedirectPage = { + vars: Record<string, unknown> + pageInfo: Pick<PageInfo, 'url'> & Partial<Pick<PageInfo, 'outputRelname'>> & { + pageFile: Pick<PageInfo['pageFile'], 'relname'> + } +} + +export type Redirect = { from: string, to: string } + +function validatePath(from: string): void { + const invalid = () => new Error(`Invalid redirectFrom ${JSON.stringify(from)}: expected a safe same-origin URL path`) + if (!from.startsWith('/') || from.startsWith('//')) throw invalid() + let decoded: string + try { + decoded = decodeURIComponent(from) + } catch { + throw invalid() + } + // Reject encoded separators and nested escapes rather than relying on host decoding rules. + if (/%(?:2f|5c|25)/i.test(from) || /[\s\p{Cc}?#\\]/u.test(decoded) || + decoded.includes('//') || decoded.split('/').some(part => part === '.' || part === '..')) { + throw invalid() + } +} + +/** Convert a validated public alias to a relative static output name. */ +export function redirectOutputName(from: string): string { + validatePath(from) + const relative = from.slice(1) + return !relative || relative.endsWith('/') ? `${relative}index.html` : relative +} + +/** Project source metadata only; no page bodies or rendering dependencies are needed. */ +export function collectRedirects(pages: readonly RedirectPage[]): Redirect[] { + const existingOutputs = new Map<string, string>() + for (const { pageInfo } of pages) { + // outputRelname is a filesystem name, not a percent-encoded URL. + const output = pageInfo.outputRelname ?? decodeURIComponent(redirectOutputName(pageInfo.url)) + existingOutputs.set(output, pageInfo.pageFile.relname) + } + + const owners = new Map<string, { from: string, source: string }>() + const redirects: Redirect[] = [] + for (const { vars, pageInfo } of pages) { + const aliases = vars.redirectFrom + if (aliases === undefined) continue + const source = pageInfo.pageFile.relname + if (!Array.isArray(aliases)) throw new TypeError(`redirectFrom on ${JSON.stringify(source)} must be an array of strings`) + for (const from of aliases) { + if (typeof from !== 'string') throw new TypeError(`redirectFrom entries on ${JSON.stringify(source)} must be strings`) + let output: string + try { + output = redirectOutputName(from) + } catch (error) { + throw new Error(`${(error as Error).message} on ${JSON.stringify(source)}`) + } + const outputKeys = [...new Set([output, decodeURIComponent(output)])] + const owner = outputKeys.map(key => owners.get(key)).find(value => value !== undefined) + if (owner) { + throw new Error(`Duplicate redirectFrom ${JSON.stringify(from)} on ${JSON.stringify(source)}: ${JSON.stringify(owner.from)} on ${JSON.stringify(owner.source)} resolves to the same output ${JSON.stringify(output)}`) + } + const existing = outputKeys.map(key => existingOutputs.get(key)).find(value => value !== undefined) + if (existing !== undefined) { + throw new Error(`redirectFrom ${JSON.stringify(from)} on ${JSON.stringify(source)} collides with existing page ${JSON.stringify(existing)} at output ${JSON.stringify(output)}`) + } + for (const key of outputKeys) owners.set(key, { from, source }) + redirects.push({ from, to: pageInfo.url }) + } + } + return redirects.sort((a, b) => a.from < b.from ? -1 : a.from > b.from ? 1 : 0) +} diff --git a/src/lib/titles.ts b/src/lib/titles.ts new file mode 100644 index 00000000..88b80e1a --- /dev/null +++ b/src/lib/titles.ts @@ -0,0 +1,19 @@ +import MarkdownIt from 'markdown-it' +import { load } from 'cheerio' + +const parser = new MarkdownIt({ html: true }) + +/** Convert an inline Markdown title to text for navigation and document metadata. */ +export function plainTitle(value: string): string { + const $ = load(parser.renderInline(value), {}, false) + $('img').each((_index, image) => { + $(image).replaceWith($('<span>').text($(image).attr('alt') || '')) + }) + return $.text().replace(/\s+/g, ' ').trim() +} + +export function titleFromMarkdown(markdown: string): string { + const tokens = parser.parse(markdown, {}) + const index = tokens.findIndex(token => token.type === 'heading_open' && token.tag === 'h1') + return index < 0 ? '' : plainTitle(tokens[index + 1].content) +} diff --git a/src/redirects.pages.ts b/src/redirects.pages.ts index b42f57cd..2a9a70a3 100644 --- a/src/redirects.pages.ts +++ b/src/redirects.pages.ts @@ -1,22 +1,27 @@ -export default [ - { - outputName: 'silk/docs/guides/toy-logger-module/index.html', - vars: { - layout: 'redirect', - title: 'Practical Logger Module Walkthrough', - description: 'This guide has moved.', - redirect: '/silk/docs/guides/practical-logger-module/', - }, - children: '', +import type { DataDeps, PagesForLayout } from '@domstack/static/types.js' +import type globalVars from './globals/global.vars.ts' +import type {} from './layouts/registry.ts' +import type { DocsData } from '#lib/docs.ts' +import { redirectOutputName } from '#lib/redirects.ts' + +type RedirectData = Pick<DocsData, 'redirects'> +export const dataDeps = ['redirects'] satisfies DataDeps<RedirectData> + +const redirects: PagesForLayout< + 'redirect', + { title: string; description: string; redirect: string }, + typeof globalVars, + RedirectData, + Record<string, never> +> = ({ data }) => data.redirects.map(({ from, to }) => ({ + outputName: redirectOutputName(from), + vars: { + layout: 'redirect', + title: 'Redirecting…', + description: 'This page has moved.', + redirect: to, }, - { - outputName: 'silk/docs/spec/2026/index.html', - vars: { - layout: 'redirect', - title: 'Silk Specification (2026)', - description: 'The Silk language specification.', - redirect: '/silk/spec/2026/', - }, - children: '', - }, -] + children: '', +})) + +export default redirects diff --git a/src/runtime/docs/cli/build/page.md b/src/runtime/docs/cli/build/page.md index a4b73991..99f1947a 100644 --- a/src/runtime/docs/cli/build/page.md +++ b/src/runtime/docs/cli/build/page.md @@ -1,6 +1,5 @@ --- layout: "docs" -title: "oroc build" description: "Build an Oro Runtime application." docsCollection: "runtime" section: "cli" diff --git a/src/runtime/docs/cli/config/page.md b/src/runtime/docs/cli/config/page.md index aad4a0e5..4e3199e7 100644 --- a/src/runtime/docs/cli/config/page.md +++ b/src/runtime/docs/cli/config/page.md @@ -1,6 +1,5 @@ --- layout: "docs" -title: "oroc config" description: "Inspect configuration values." docsCollection: "runtime" section: "cli" diff --git a/src/runtime/docs/cli/env/page.md b/src/runtime/docs/cli/env/page.md index f6b60a71..19ad2549 100644 --- a/src/runtime/docs/cli/env/page.md +++ b/src/runtime/docs/cli/env/page.md @@ -1,6 +1,5 @@ --- layout: "docs" -title: "oroc env" description: "Print environment variables relevant to the Oro CLI and build configuration." docsCollection: "runtime" section: "cli" diff --git a/src/runtime/docs/cli/help/page.md b/src/runtime/docs/cli/help/page.md index 00a41e3d..46aad336 100644 --- a/src/runtime/docs/cli/help/page.md +++ b/src/runtime/docs/cli/help/page.md @@ -1,6 +1,5 @@ --- layout: "docs" -title: "oroc help" description: "Discover commands, options, and workflow entry points from the CLI help index." docsCollection: "runtime" section: "cli" diff --git a/src/runtime/docs/cli/init/page.md b/src/runtime/docs/cli/init/page.md index a10adb40..cd0352c2 100644 --- a/src/runtime/docs/cli/init/page.md +++ b/src/runtime/docs/cli/init/page.md @@ -1,6 +1,5 @@ --- layout: "docs" -title: "oroc init" description: "Create a new project. If the path is not provided, the new project is created in the current directory." docsCollection: "runtime" section: "cli" diff --git a/src/runtime/docs/cli/install-app/page.md b/src/runtime/docs/cli/install-app/page.md index e5be13d2..094c243d 100644 --- a/src/runtime/docs/cli/install-app/page.md +++ b/src/runtime/docs/cli/install-app/page.md @@ -1,6 +1,5 @@ --- layout: "docs" -title: "oroc install-app" description: "Install the app to the device or host target." docsCollection: "runtime" section: "cli" diff --git a/src/runtime/docs/cli/list-devices/page.md b/src/runtime/docs/cli/list-devices/page.md index fe580c1f..497d02e1 100644 --- a/src/runtime/docs/cli/list-devices/page.md +++ b/src/runtime/docs/cli/list-devices/page.md @@ -1,6 +1,5 @@ --- layout: "docs" -title: "oroc list-devices" description: "Get the list of connected devices." docsCollection: "runtime" section: "cli" diff --git a/src/runtime/docs/cli/mcp/page.md b/src/runtime/docs/cli/mcp/page.md index 4e6b4615..b75c87cf 100644 --- a/src/runtime/docs/cli/mcp/page.md +++ b/src/runtime/docs/cli/mcp/page.md @@ -1,6 +1,5 @@ --- layout: "docs" -title: "oroc mcp" description: "Run a Model Context Protocol (MCP) server for agent tooling." docsCollection: "runtime" section: "cli" diff --git a/src/runtime/docs/cli/oroc/page.md b/src/runtime/docs/cli/oroc/page.md index 5422aee6..311bd2e6 100644 --- a/src/runtime/docs/cli/oroc/page.md +++ b/src/runtime/docs/cli/oroc/page.md @@ -1,6 +1,5 @@ --- layout: "docs" -title: "oroc" description: "oroc is the Oro Runtime command line tool. It builds, runs, packages, and inspects Oro Runtime projects." docsCollection: "runtime" section: "cli" diff --git a/src/runtime/docs/cli/print-build-dir/page.md b/src/runtime/docs/cli/print-build-dir/page.md index d3db8bf3..71346fff 100644 --- a/src/runtime/docs/cli/print-build-dir/page.md +++ b/src/runtime/docs/cli/print-build-dir/page.md @@ -1,6 +1,5 @@ --- layout: "docs" -title: "oroc print-build-dir" description: "Print the build directory path." docsCollection: "runtime" section: "cli" diff --git a/src/runtime/docs/cli/run/page.md b/src/runtime/docs/cli/run/page.md index 229cf4e1..a1115222 100644 --- a/src/runtime/docs/cli/run/page.md +++ b/src/runtime/docs/cli/run/page.md @@ -1,6 +1,5 @@ --- layout: "docs" -title: "oroc run" description: "Run an Oro Runtime application." docsCollection: "runtime" section: "cli" diff --git a/src/runtime/docs/cli/setup/page.md b/src/runtime/docs/cli/setup/page.md index 60c6a73d..21c4a009 100644 --- a/src/runtime/docs/cli/setup/page.md +++ b/src/runtime/docs/cli/setup/page.md @@ -1,6 +1,5 @@ --- layout: "docs" -title: "oroc setup" description: "Setup build tools for the host or a target platform." docsCollection: "runtime" section: "cli" diff --git a/src/runtime/docs/cli/update/bundle/page.md b/src/runtime/docs/cli/update/bundle/page.md index 9c8b2e54..5103214e 100644 --- a/src/runtime/docs/cli/update/bundle/page.md +++ b/src/runtime/docs/cli/update/bundle/page.md @@ -1,6 +1,5 @@ --- layout: "docs" -title: "oroc update bundle" description: "Build a tar archive containing a directory for use as an update artifact." docsCollection: "runtime" section: "cli" diff --git a/src/runtime/docs/cli/update/extract/page.md b/src/runtime/docs/cli/update/extract/page.md index a8a21672..9bdfa9ce 100644 --- a/src/runtime/docs/cli/update/extract/page.md +++ b/src/runtime/docs/cli/update/extract/page.md @@ -1,6 +1,5 @@ --- layout: "docs" -title: "oroc update extract" description: "Extract a tar archive produced by oroc update bundle into a destination directory." docsCollection: "runtime" section: "cli" diff --git a/src/runtime/docs/cli/update/info/page.md b/src/runtime/docs/cli/update/info/page.md index 036b4858..454c65e6 100644 --- a/src/runtime/docs/cli/update/info/page.md +++ b/src/runtime/docs/cli/update/info/page.md @@ -1,6 +1,5 @@ --- layout: "docs" -title: "oroc update info" description: "Query update servers or static manifests over HTTP, TCP, or UDP." docsCollection: "runtime" section: "cli" diff --git a/src/runtime/docs/cli/update/init/page.md b/src/runtime/docs/cli/update/init/page.md index eed4cd65..94b990d5 100644 --- a/src/runtime/docs/cli/update/init/page.md +++ b/src/runtime/docs/cli/update/init/page.md @@ -1,6 +1,5 @@ --- layout: "docs" -title: "oroc update init" description: "Scaffold a minimal update manifest JSON file." docsCollection: "runtime" section: "cli" diff --git a/src/runtime/docs/cli/update/keygen/page.md b/src/runtime/docs/cli/update/keygen/page.md index c3f7c34f..2146174e 100644 --- a/src/runtime/docs/cli/update/keygen/page.md +++ b/src/runtime/docs/cli/update/keygen/page.md @@ -1,6 +1,5 @@ --- layout: "docs" -title: "oroc update keygen" description: "Generate an Ed25519 keypair for signing update manifests." docsCollection: "runtime" section: "cli" diff --git a/src/runtime/docs/cli/update/page.md b/src/runtime/docs/cli/update/page.md index 7f237611..6d9fb40b 100644 --- a/src/runtime/docs/cli/update/page.md +++ b/src/runtime/docs/cli/update/page.md @@ -1,6 +1,5 @@ --- layout: "docs" -title: "oroc update" description: "Update tooling for manifests, signatures, and bundles." docsCollection: "runtime" section: "cli" diff --git a/src/runtime/docs/cli/update/server/page.md b/src/runtime/docs/cli/update/server/page.md index eae65fae..f232aada 100644 --- a/src/runtime/docs/cli/update/server/page.md +++ b/src/runtime/docs/cli/update/server/page.md @@ -1,6 +1,5 @@ --- layout: "docs" -title: "oroc update server" description: "Run an update server that speaks the Oro Application Update Protocol." docsCollection: "runtime" section: "cli" diff --git a/src/runtime/docs/cli/update/sign/page.md b/src/runtime/docs/cli/update/sign/page.md index 48aa9a82..4c94a50f 100644 --- a/src/runtime/docs/cli/update/sign/page.md +++ b/src/runtime/docs/cli/update/sign/page.md @@ -1,6 +1,5 @@ --- layout: "docs" -title: "oroc update sign" description: "Sign an update manifest and emit a detached manifest.sig file." docsCollection: "runtime" section: "cli" diff --git a/src/runtime/docs/cli/update/validate/page.md b/src/runtime/docs/cli/update/validate/page.md index 9d5395c7..259c9797 100644 --- a/src/runtime/docs/cli/update/validate/page.md +++ b/src/runtime/docs/cli/update/validate/page.md @@ -1,6 +1,5 @@ --- layout: "docs" -title: "oroc update validate" description: "Validate an update manifest JSON file against the expected schema shape." docsCollection: "runtime" section: "cli" diff --git a/src/runtime/docs/cli/update/verify/page.md b/src/runtime/docs/cli/update/verify/page.md index 8bd65747..44b4ae78 100644 --- a/src/runtime/docs/cli/update/verify/page.md +++ b/src/runtime/docs/cli/update/verify/page.md @@ -1,6 +1,5 @@ --- layout: "docs" -title: "oroc update verify" description: "Verify a manifest and signature pair using an Ed25519 public key." docsCollection: "runtime" section: "cli" diff --git a/src/runtime/docs/cli/version/page.md b/src/runtime/docs/cli/version/page.md index bca957f5..12975726 100644 --- a/src/runtime/docs/cli/version/page.md +++ b/src/runtime/docs/cli/version/page.md @@ -1,6 +1,5 @@ --- layout: "docs" -title: "oroc version" description: "Inspect or bump the project version defined in your configuration file." docsCollection: "runtime" section: "cli" diff --git a/src/runtime/docs/cli/versions/page.md b/src/runtime/docs/cli/versions/page.md index 2db4edaf..cafd3db5 100644 --- a/src/runtime/docs/cli/versions/page.md +++ b/src/runtime/docs/cli/versions/page.md @@ -1,6 +1,5 @@ --- layout: "docs" -title: "oroc versions" description: "Print Oro CLI/runtime and dependency versions." docsCollection: "runtime" section: "cli" diff --git a/src/runtime/docs/config/copy-map/page.md b/src/runtime/docs/config/copy-map/page.md index 7697f99a..6afeeb05 100644 --- a/src/runtime/docs/config/copy-map/page.md +++ b/src/runtime/docs/config/copy-map/page.md @@ -1,6 +1,5 @@ --- layout: "docs" -title: "copy_map" description: "Copy-maps let you explicitly map build inputs into your app bundle. They are referenced from oro.toml:" docsCollection: "runtime" section: "config" diff --git a/src/runtime/docs/config/overview/page.md b/src/runtime/docs/config/overview/page.md index d09f52cd..0043bde3 100644 --- a/src/runtime/docs/config/overview/page.md +++ b/src/runtime/docs/config/overview/page.md @@ -1,6 +1,5 @@ --- layout: "docs" -title: "Configuration overview" description: "Oro Runtime projects are configured with a file named oro.toml (TOML) in the project root." docsCollection: "runtime" section: "config" diff --git a/src/runtime/docs/config/reference/page.md b/src/runtime/docs/config/reference/page.md index 080618cd..5ecf1f61 100644 --- a/src/runtime/docs/config/reference/page.md +++ b/src/runtime/docs/config/reference/page.md @@ -1,6 +1,5 @@ --- layout: "docs" -title: "Configuration reference" description: "This page documents the most commonly used oro.toml sections and keys." docsCollection: "runtime" section: "config" diff --git a/src/runtime/docs/guides/build-and-package/page.md b/src/runtime/docs/guides/build-and-package/page.md index d83d5336..47a5d458 100644 --- a/src/runtime/docs/guides/build-and-package/page.md +++ b/src/runtime/docs/guides/build-and-package/page.md @@ -1,6 +1,5 @@ --- layout: "docs" -title: "Build and package" description: "This guide summarizes the workflows downstream app developers use most:" docsCollection: "runtime" section: "guides" diff --git a/src/runtime/docs/guides/calling-http-apis/page.md b/src/runtime/docs/guides/calling-http-apis/page.md index a3c640a1..04d31814 100644 --- a/src/runtime/docs/guides/calling-http-apis/page.md +++ b/src/runtime/docs/guides/calling-http-apis/page.md @@ -1,6 +1,5 @@ --- layout: "docs" -title: "Calling HTTP APIs" description: "Most production applications spend their time moving between three layers:" docsCollection: "runtime" section: "guides" diff --git a/src/runtime/docs/guides/configure-your-runtime-project/page.md b/src/runtime/docs/guides/configure-your-runtime-project/page.md index 30fa94da..03d280de 100644 --- a/src/runtime/docs/guides/configure-your-runtime-project/page.md +++ b/src/runtime/docs/guides/configure-your-runtime-project/page.md @@ -1,6 +1,5 @@ --- layout: "docs" -title: "Configure your runtime project" description: "Oro Runtime projects are controlled by oro.toml, with optional machine-local overrides in .ororc. Treat those files as part of the app contract: they define what ships, how the window behaves, which p" docsCollection: "runtime" section: "guides" diff --git a/src/runtime/docs/guides/custom-protocols-and-routing/page.md b/src/runtime/docs/guides/custom-protocols-and-routing/page.md index 6bb3a382..3de31572 100644 --- a/src/runtime/docs/guides/custom-protocols-and-routing/page.md +++ b/src/runtime/docs/guides/custom-protocols-and-routing/page.md @@ -1,6 +1,5 @@ --- layout: "docs" -title: "Custom protocols and routing" description: "Some apps need more than a single https://-style origin. Custom protocols let you give internal resources a stable shape and route them through service-worker logic instead of hard-coding filesystem p" docsCollection: "runtime" section: "guides" diff --git a/src/runtime/docs/guides/desktop-integrations/page.md b/src/runtime/docs/guides/desktop-integrations/page.md index ac84389b..22b6e6c3 100644 --- a/src/runtime/docs/guides/desktop-integrations/page.md +++ b/src/runtime/docs/guides/desktop-integrations/page.md @@ -1,6 +1,5 @@ --- layout: "docs" -title: "Desktop integrations" description: "Oro Runtime applications stay web-first, but the point of the runtime is that you do not stop at the browser boundary. This guide shows how to add four integrations users actually notice: notification" docsCollection: "runtime" section: "guides" diff --git a/src/runtime/docs/guides/files-and-sandboxing/page.md b/src/runtime/docs/guides/files-and-sandboxing/page.md index 67873437..e388b76b 100644 --- a/src/runtime/docs/guides/files-and-sandboxing/page.md +++ b/src/runtime/docs/guides/files-and-sandboxing/page.md @@ -1,6 +1,5 @@ --- layout: "docs" -title: "Files and sandboxing" description: "Most serious applications need two kinds of file access:" docsCollection: "runtime" section: "guides" diff --git a/src/runtime/docs/guides/from-zero-to-first-run/page.md b/src/runtime/docs/guides/from-zero-to-first-run/page.md index 9b4ca603..e56a44aa 100644 --- a/src/runtime/docs/guides/from-zero-to-first-run/page.md +++ b/src/runtime/docs/guides/from-zero-to-first-run/page.md @@ -1,6 +1,5 @@ --- layout: "docs" -title: "From zero to first run" description: "This guide starts from an empty directory and gets you to a runnable Oro Runtime application using the installed toolchain. The goal is not just to boot a page, but to end with a project that already " docsCollection: "runtime" section: "guides" diff --git a/src/runtime/docs/guides/frontend-build-pipeline/page.md b/src/runtime/docs/guides/frontend-build-pipeline/page.md index f69261f8..8e874e11 100644 --- a/src/runtime/docs/guides/frontend-build-pipeline/page.md +++ b/src/runtime/docs/guides/frontend-build-pipeline/page.md @@ -1,6 +1,5 @@ --- layout: "docs" -title: "Frontend build pipeline" description: "Most production Oro Runtime applications do not ship raw source files. They run a web build first, then copy the built artifacts into the runtime bundle. This guide shows a clean pipeline that works f" docsCollection: "runtime" section: "guides" diff --git a/src/runtime/docs/guides/hello-world/page.md b/src/runtime/docs/guides/hello-world/page.md index f63a91c5..10e17928 100644 --- a/src/runtime/docs/guides/hello-world/page.md +++ b/src/runtime/docs/guides/hello-world/page.md @@ -1,6 +1,5 @@ --- layout: "docs" -title: "Hello world" description: "This guide builds a small Oro Runtime app that does three things immediately:" docsCollection: "runtime" section: "guides" diff --git a/src/runtime/docs/guides/lifecycle-hooks-and-deep-links/page.md b/src/runtime/docs/guides/lifecycle-hooks-and-deep-links/page.md index 820f79be..3e45a847 100644 --- a/src/runtime/docs/guides/lifecycle-hooks-and-deep-links/page.md +++ b/src/runtime/docs/guides/lifecycle-hooks-and-deep-links/page.md @@ -1,6 +1,5 @@ --- layout: "docs" -title: "Lifecycle hooks and deep links" description: "Lifecycle hooks are where the application stops being a generic page and starts reacting like a native application. Use them for readiness, connectivity, backgrounding, and OS-delivered URLs." docsCollection: "runtime" section: "guides" diff --git a/src/runtime/docs/guides/local-data-with-sqlite/page.md b/src/runtime/docs/guides/local-data-with-sqlite/page.md index ffec88c1..b4e4e5e7 100644 --- a/src/runtime/docs/guides/local-data-with-sqlite/page.md +++ b/src/runtime/docs/guides/local-data-with-sqlite/page.md @@ -1,6 +1,5 @@ --- layout: "docs" -title: "Local data with SQLite" description: "Once an app moves beyond a few JSON files, SQLite is the right default. It gives you transactions, indexes, and queryable data without adding another service to your deployment story." docsCollection: "runtime" section: "guides" diff --git a/src/runtime/docs/guides/mcp-and-agent-automation/page.md b/src/runtime/docs/guides/mcp-and-agent-automation/page.md index 21622762..1579c9c5 100644 --- a/src/runtime/docs/guides/mcp-and-agent-automation/page.md +++ b/src/runtime/docs/guides/mcp-and-agent-automation/page.md @@ -1,6 +1,5 @@ --- layout: "docs" -title: "MCP and agent automation" description: "Oro Runtime supports MCP in two complementary ways:" docsCollection: "runtime" section: "guides" diff --git a/src/runtime/docs/guides/mobile-targets-and-device-installs/page.md b/src/runtime/docs/guides/mobile-targets-and-device-installs/page.md index 80bfe8d4..db9ebeaa 100644 --- a/src/runtime/docs/guides/mobile-targets-and-device-installs/page.md +++ b/src/runtime/docs/guides/mobile-targets-and-device-installs/page.md @@ -1,6 +1,5 @@ --- layout: "docs" -title: "Mobile targets and device installs" description: "Oro Runtime can target Android and Apple devices from the same project model. The key is to separate three concerns:" docsCollection: "runtime" section: "guides" diff --git a/src/runtime/docs/guides/native-extensions/page.md b/src/runtime/docs/guides/native-extensions/page.md index 8ede3007..81cf59c4 100644 --- a/src/runtime/docs/guides/native-extensions/page.md +++ b/src/runtime/docs/guides/native-extensions/page.md @@ -1,6 +1,5 @@ --- layout: "docs" -title: "Native extensions" description: "Use a native extension when app code needs a capability that should not live in JavaScript: an existing C/C++ library, platform-specific code, long-running native work, or a Wasm module that should be" docsCollection: "runtime" section: "guides" diff --git a/src/runtime/docs/guides/offline-first-with-service-workers/page.md b/src/runtime/docs/guides/offline-first-with-service-workers/page.md index cd70331f..8d80957d 100644 --- a/src/runtime/docs/guides/offline-first-with-service-workers/page.md +++ b/src/runtime/docs/guides/offline-first-with-service-workers/page.md @@ -1,6 +1,5 @@ --- layout: "docs" -title: "Offline-first with service workers" description: "For applications that need to keep working without reliable connectivity, service workers are the right boundary. Use them to cache the application shell, serve known assets, and provide controlled fa" docsCollection: "runtime" section: "guides" diff --git a/src/runtime/docs/guides/project-layout/page.md b/src/runtime/docs/guides/project-layout/page.md index facaa515..7d483c98 100644 --- a/src/runtime/docs/guides/project-layout/page.md +++ b/src/runtime/docs/guides/project-layout/page.md @@ -1,6 +1,5 @@ --- layout: "docs" -title: "Project layout" description: "An Oro Runtime project is a directory with:" docsCollection: "runtime" section: "guides" diff --git a/src/runtime/docs/guides/release-packaging-and-signed-updates/page.md b/src/runtime/docs/guides/release-packaging-and-signed-updates/page.md index 35bd4d7f..b1f27016 100644 --- a/src/runtime/docs/guides/release-packaging-and-signed-updates/page.md +++ b/src/runtime/docs/guides/release-packaging-and-signed-updates/page.md @@ -1,6 +1,5 @@ --- layout: "docs" -title: "Release packaging and signed updates" description: "Shipping the app is only half of the release story. The other half is producing update artifacts that can be verified, served, and diagnosed later without improvisation." docsCollection: "runtime" section: "guides" diff --git a/src/runtime/docs/guides/secure-storage-and-sessions/page.md b/src/runtime/docs/guides/secure-storage-and-sessions/page.md index 21afd2b0..3033fb02 100644 --- a/src/runtime/docs/guides/secure-storage-and-sessions/page.md +++ b/src/runtime/docs/guides/secure-storage-and-sessions/page.md @@ -1,6 +1,5 @@ --- layout: "docs" -title: "Secure storage and sessions" description: "Application data and application secrets are not the same thing. Put notes, caches, and drafts in the filesystem or SQLite. Put refresh tokens, client secrets, and other credentials in oro:secure-stor" docsCollection: "runtime" section: "guides" diff --git a/src/runtime/docs/guides/shared-workers-across-windows/page.md b/src/runtime/docs/guides/shared-workers-across-windows/page.md index 540b96b7..15db4464 100644 --- a/src/runtime/docs/guides/shared-workers-across-windows/page.md +++ b/src/runtime/docs/guides/shared-workers-across-windows/page.md @@ -1,6 +1,5 @@ --- layout: "docs" -title: "Shared workers across windows" description: "If one background coordinator should serve multiple windows at the same time, use a shared worker instead of one worker per window. This is a strong fit for search indexing, presence state, websocket " docsCollection: "runtime" section: "guides" diff --git a/src/runtime/docs/guides/testing-and-diagnostics/page.md b/src/runtime/docs/guides/testing-and-diagnostics/page.md index 2c7562a0..f0f31ae9 100644 --- a/src/runtime/docs/guides/testing-and-diagnostics/page.md +++ b/src/runtime/docs/guides/testing-and-diagnostics/page.md @@ -1,6 +1,5 @@ --- layout: "docs" -title: "Testing and diagnostics" description: "If the runtime app is real, it needs two things early:" docsCollection: "runtime" section: "guides" diff --git a/src/runtime/docs/guides/windows-and-messaging/page.md b/src/runtime/docs/guides/windows-and-messaging/page.md index d75a373b..9f637a31 100644 --- a/src/runtime/docs/guides/windows-and-messaging/page.md +++ b/src/runtime/docs/guides/windows-and-messaging/page.md @@ -1,6 +1,5 @@ --- layout: "docs" -title: "Windows and messaging" description: "Oro Runtime apps can create multiple windows. Windows are identified by a numeric index." docsCollection: "runtime" section: "guides" diff --git a/src/runtime/docs/guides/worker-threads-for-heavy-work/page.md b/src/runtime/docs/guides/worker-threads-for-heavy-work/page.md index afcf860c..b2289d80 100644 --- a/src/runtime/docs/guides/worker-threads-for-heavy-work/page.md +++ b/src/runtime/docs/guides/worker-threads-for-heavy-work/page.md @@ -1,6 +1,5 @@ --- layout: "docs" -title: "Worker threads for heavy work" description: "The main window should stay responsive. If a task is CPU-heavy or processes large blobs of text or binary data, move it to oro:worker_threads." docsCollection: "runtime" section: "guides" diff --git a/src/runtime/docs/javascript/ai/page.md b/src/runtime/docs/javascript/ai/page.md index 26f1e667..fbc9444b 100644 --- a/src/runtime/docs/javascript/ai/page.md +++ b/src/runtime/docs/javascript/ai/page.md @@ -1,6 +1,5 @@ --- layout: "docs" -title: "oro:ai" description: "oro:ai exposes local AI helpers. It currently exports two modules:" docsCollection: "runtime" section: "javascript" diff --git a/src/runtime/docs/javascript/all-modules/page.md b/src/runtime/docs/javascript/all-modules/page.md index 70ca91b5..26ec71f2 100644 --- a/src/runtime/docs/javascript/all-modules/page.md +++ b/src/runtime/docs/javascript/all-modules/page.md @@ -1,6 +1,5 @@ --- layout: "docs" -title: "JavaScript API modules" description: "Oro Runtime exposes native capabilities as explicit ES module imports under the oro:* namespace. Treat those imports as the boundary between ordinary web code and host capabilities." docsCollection: "runtime" section: "javascript" diff --git a/src/runtime/docs/javascript/application/page.md b/src/runtime/docs/javascript/application/page.md index 2c36343d..96ea35a2 100644 --- a/src/runtime/docs/javascript/application/page.md +++ b/src/runtime/docs/javascript/application/page.md @@ -1,6 +1,5 @@ --- layout: "docs" -title: "oro:application" description: "oro:application exposes application-level APIs: creating windows, querying windows, menus, and runtime metadata." docsCollection: "runtime" section: "javascript" diff --git a/src/runtime/docs/javascript/asn1/page.md b/src/runtime/docs/javascript/asn1/page.md index 34b6780d..9a7f4e3a 100644 --- a/src/runtime/docs/javascript/asn1/page.md +++ b/src/runtime/docs/javascript/asn1/page.md @@ -1,6 +1,5 @@ --- layout: "docs" -title: "oro:asn1" description: "oro:asn1 parses ASN.1 source text and files into structured module data." docsCollection: "runtime" section: "javascript" diff --git a/src/runtime/docs/javascript/assert/page.md b/src/runtime/docs/javascript/assert/page.md index 4352bf0b..bbc0d3eb 100644 --- a/src/runtime/docs/javascript/assert/page.md +++ b/src/runtime/docs/javascript/assert/page.md @@ -1,6 +1,5 @@ --- layout: "docs" -title: "oro:assert" description: "oro:assert provides Node-compatible assertion helpers for tests, runtime checks, and invariants." docsCollection: "runtime" section: "javascript" diff --git a/src/runtime/docs/javascript/async/page.md b/src/runtime/docs/javascript/async/page.md index c01df7b5..b7757e09 100644 --- a/src/runtime/docs/javascript/async/page.md +++ b/src/runtime/docs/javascript/async/page.md @@ -1,6 +1,5 @@ --- layout: "docs" -title: "oro:async" description: "oro:async exposes async context propagation, deferred values, and resource tracking primitives." docsCollection: "runtime" section: "javascript" diff --git a/src/runtime/docs/javascript/async_hooks/page.md b/src/runtime/docs/javascript/async_hooks/page.md index 2e14e095..3457c260 100644 --- a/src/runtime/docs/javascript/async_hooks/page.md +++ b/src/runtime/docs/javascript/async_hooks/page.md @@ -1,6 +1,5 @@ --- layout: "docs" -title: "oro:async_hooks" description: "oro:async_hooks exposes hook-based async lifecycle inspection compatible with Node-style instrumentation." docsCollection: "runtime" section: "javascript" diff --git a/src/runtime/docs/javascript/background/page.md b/src/runtime/docs/javascript/background/page.md index b5827198..6c24bee9 100644 --- a/src/runtime/docs/javascript/background/page.md +++ b/src/runtime/docs/javascript/background/page.md @@ -1,6 +1,5 @@ --- layout: "docs" -title: "oro:background" description: "oro:background lets you inspect and coordinate the runtime background task surface." docsCollection: "runtime" section: "javascript" diff --git a/src/runtime/docs/javascript/buffer/page.md b/src/runtime/docs/javascript/buffer/page.md index e7be624c..6dc0ce6e 100644 --- a/src/runtime/docs/javascript/buffer/page.md +++ b/src/runtime/docs/javascript/buffer/page.md @@ -1,6 +1,5 @@ --- layout: "docs" -title: "oro:buffer" description: "oro:buffer provides Buffer, Blob, and related byte-oriented helpers." docsCollection: "runtime" section: "javascript" diff --git a/src/runtime/docs/javascript/cdp/page.md b/src/runtime/docs/javascript/cdp/page.md index 01231070..982fe885 100644 --- a/src/runtime/docs/javascript/cdp/page.md +++ b/src/runtime/docs/javascript/cdp/page.md @@ -1,6 +1,5 @@ --- layout: "docs" -title: "oro:cdp" description: "oro:cdp controls the runtime Chrome DevTools Protocol endpoint used for inspection and debugging." docsCollection: "runtime" section: "javascript" diff --git a/src/runtime/docs/javascript/child_process/page.md b/src/runtime/docs/javascript/child_process/page.md index a43fc9b5..14bfd7fa 100644 --- a/src/runtime/docs/javascript/child_process/page.md +++ b/src/runtime/docs/javascript/child_process/page.md @@ -1,6 +1,5 @@ --- layout: "docs" -title: "oro:child_process" description: "oro:child_process launches and manages subprocesses with a Node-compatible API." docsCollection: "runtime" section: "javascript" diff --git a/src/runtime/docs/javascript/clipboard/page.md b/src/runtime/docs/javascript/clipboard/page.md index cf5b9abf..fdce0a05 100644 --- a/src/runtime/docs/javascript/clipboard/page.md +++ b/src/runtime/docs/javascript/clipboard/page.md @@ -1,6 +1,5 @@ --- layout: "docs" -title: "oro:clipboard" description: "oro:clipboard reads and writes clipboard text from the current application context." docsCollection: "runtime" section: "javascript" diff --git a/src/runtime/docs/javascript/commonjs/page.md b/src/runtime/docs/javascript/commonjs/page.md index 5cb27a9f..e8a42a67 100644 --- a/src/runtime/docs/javascript/commonjs/page.md +++ b/src/runtime/docs/javascript/commonjs/page.md @@ -1,6 +1,5 @@ --- layout: "docs" -title: "oro:commonjs" description: "oro:commonjs/* exposes the runtime’s CommonJS loader, cache, and resolution helpers." docsCollection: "runtime" section: "javascript" diff --git a/src/runtime/docs/javascript/conduit/page.md b/src/runtime/docs/javascript/conduit/page.md index 569d0938..f4c50d1d 100644 --- a/src/runtime/docs/javascript/conduit/page.md +++ b/src/runtime/docs/javascript/conduit/page.md @@ -1,6 +1,5 @@ --- layout: "docs" -title: "oro:conduit" description: "oro:conduit manages the runtime WebSocket conduit used for internal cross-surface messaging." docsCollection: "runtime" section: "javascript" diff --git a/src/runtime/docs/javascript/console/page.md b/src/runtime/docs/javascript/console/page.md index 6d7cfa4e..e4e20262 100644 --- a/src/runtime/docs/javascript/console/page.md +++ b/src/runtime/docs/javascript/console/page.md @@ -1,6 +1,5 @@ --- layout: "docs" -title: "oro:console" description: "oro:console exposes the runtime console implementation and patch helpers." docsCollection: "runtime" section: "javascript" diff --git a/src/runtime/docs/javascript/constants/page.md b/src/runtime/docs/javascript/constants/page.md index 474abf9e..54453630 100644 --- a/src/runtime/docs/javascript/constants/page.md +++ b/src/runtime/docs/javascript/constants/page.md @@ -1,6 +1,5 @@ --- layout: "docs" -title: "oro:constants" description: "oro:constants publishes the runtime’s platform, errno, and low-level constant tables." docsCollection: "runtime" section: "javascript" diff --git a/src/runtime/docs/javascript/cookies/page.md b/src/runtime/docs/javascript/cookies/page.md index c79d25c6..b2b53b37 100644 --- a/src/runtime/docs/javascript/cookies/page.md +++ b/src/runtime/docs/javascript/cookies/page.md @@ -1,6 +1,5 @@ --- layout: "docs" -title: "oro:cookies" description: "oro:cookies reads and writes cookies for application-controlled origins." docsCollection: "runtime" section: "javascript" diff --git a/src/runtime/docs/javascript/crypto/page.md b/src/runtime/docs/javascript/crypto/page.md index 95e0524e..03c80f3f 100644 --- a/src/runtime/docs/javascript/crypto/page.md +++ b/src/runtime/docs/javascript/crypto/page.md @@ -1,6 +1,5 @@ --- layout: "docs" -title: "oro:crypto" description: "oro:crypto exposes hashing, random bytes, and bundled sodium-backed helpers." docsCollection: "runtime" section: "javascript" diff --git a/src/runtime/docs/javascript/dbus/page.md b/src/runtime/docs/javascript/dbus/page.md index 1c2bc803..234e06be 100644 --- a/src/runtime/docs/javascript/dbus/page.md +++ b/src/runtime/docs/javascript/dbus/page.md @@ -1,6 +1,5 @@ --- layout: "docs" -title: "oro:dbus" description: "oro:dbus connects to DBus and lets JavaScript code call methods, watch signals, and manage names." docsCollection: "runtime" section: "javascript" diff --git a/src/runtime/docs/javascript/dgram/page.md b/src/runtime/docs/javascript/dgram/page.md index 95276493..d2d15323 100644 --- a/src/runtime/docs/javascript/dgram/page.md +++ b/src/runtime/docs/javascript/dgram/page.md @@ -1,6 +1,5 @@ --- layout: "docs" -title: "oro:dgram" description: "oro:dgram provides UDP sockets and multicast helpers with a Node-compatible API." docsCollection: "runtime" section: "javascript" diff --git a/src/runtime/docs/javascript/diagnostics/page.md b/src/runtime/docs/javascript/diagnostics/page.md index 4fda187f..1905555d 100644 --- a/src/runtime/docs/javascript/diagnostics/page.md +++ b/src/runtime/docs/javascript/diagnostics/page.md @@ -1,6 +1,5 @@ --- layout: "docs" -title: "oro:diagnostics" description: "oro:diagnostics exposes channels, metrics, and runtime/window diagnostic queries." docsCollection: "runtime" section: "javascript" diff --git a/src/runtime/docs/javascript/did/page.md b/src/runtime/docs/javascript/did/page.md index aaafb2fa..90ac5dde 100644 --- a/src/runtime/docs/javascript/did/page.md +++ b/src/runtime/docs/javascript/did/page.md @@ -1,6 +1,5 @@ --- layout: "docs" -title: "oro:did" description: "oro:did parses and manipulates decentralized identifiers and DID URLs." docsCollection: "runtime" section: "javascript" diff --git a/src/runtime/docs/javascript/dns/page.md b/src/runtime/docs/javascript/dns/page.md index 59fd64ea..6be0bd57 100644 --- a/src/runtime/docs/javascript/dns/page.md +++ b/src/runtime/docs/javascript/dns/page.md @@ -1,6 +1,5 @@ --- layout: "docs" -title: "oro:dns" description: "oro:dns provides DNS lookup helpers and promise-based resolution APIs." docsCollection: "runtime" section: "javascript" diff --git a/src/runtime/docs/javascript/enumeration/page.md b/src/runtime/docs/javascript/enumeration/page.md index 34cf6a3c..f414bbec 100644 --- a/src/runtime/docs/javascript/enumeration/page.md +++ b/src/runtime/docs/javascript/enumeration/page.md @@ -1,6 +1,5 @@ --- layout: "docs" -title: "oro:enumeration" description: "oro:enumeration is a small typed-set helper used throughout the runtime surface." docsCollection: "runtime" section: "javascript" diff --git a/src/runtime/docs/javascript/errno/page.md b/src/runtime/docs/javascript/errno/page.md index d849a87b..69850d67 100644 --- a/src/runtime/docs/javascript/errno/page.md +++ b/src/runtime/docs/javascript/errno/page.md @@ -1,6 +1,5 @@ --- layout: "docs" -title: "oro:errno" description: "oro:errno converts errno values to names and messages." docsCollection: "runtime" section: "javascript" diff --git a/src/runtime/docs/javascript/errors/page.md b/src/runtime/docs/javascript/errors/page.md index 30ce6be7..2c2a8e09 100644 --- a/src/runtime/docs/javascript/errors/page.md +++ b/src/runtime/docs/javascript/errors/page.md @@ -1,6 +1,5 @@ --- layout: "docs" -title: "oro:errors" description: "oro:errors exports DOM-style and runtime-specific error classes and constants." docsCollection: "runtime" section: "javascript" diff --git a/src/runtime/docs/javascript/events/page.md b/src/runtime/docs/javascript/events/page.md index f2b52ff2..34a08c12 100644 --- a/src/runtime/docs/javascript/events/page.md +++ b/src/runtime/docs/javascript/events/page.md @@ -1,6 +1,5 @@ --- layout: "docs" -title: "oro:events" description: "oro:events provides EventEmitter, EventTarget, and event primitives used across the runtime." docsCollection: "runtime" section: "javascript" diff --git a/src/runtime/docs/javascript/extension/page.md b/src/runtime/docs/javascript/extension/page.md index c3646546..a5054674 100644 --- a/src/runtime/docs/javascript/extension/page.md +++ b/src/runtime/docs/javascript/extension/page.md @@ -1,6 +1,5 @@ --- layout: "docs" -title: "oro:extension" description: "oro:extension loads app-bundled native extensions and Wasm extensions, then exposes their registered runtime state to JavaScript." docsCollection: "runtime" section: "javascript" diff --git a/src/runtime/docs/javascript/fetch/page.md b/src/runtime/docs/javascript/fetch/page.md index b1879ced..7f2fabc6 100644 --- a/src/runtime/docs/javascript/fetch/page.md +++ b/src/runtime/docs/javascript/fetch/page.md @@ -1,6 +1,5 @@ --- layout: "docs" -title: "oro:fetch" description: "oro:fetch exposes the runtime fetch stack and standard request/response primitives." docsCollection: "runtime" section: "javascript" diff --git a/src/runtime/docs/javascript/fs/page.md b/src/runtime/docs/javascript/fs/page.md index aad0d63b..0c69b532 100644 --- a/src/runtime/docs/javascript/fs/page.md +++ b/src/runtime/docs/javascript/fs/page.md @@ -1,6 +1,5 @@ --- layout: "docs" -title: "oro:fs" description: "oro:fs provides filesystem APIs modeled on POSIX and Node.js." docsCollection: "runtime" section: "javascript" diff --git a/src/runtime/docs/javascript/gc/page.md b/src/runtime/docs/javascript/gc/page.md index ce73b1d5..c7351816 100644 --- a/src/runtime/docs/javascript/gc/page.md +++ b/src/runtime/docs/javascript/gc/page.md @@ -1,6 +1,5 @@ --- layout: "docs" -title: "oro:gc" description: "oro:gc lets you register finalizers and control object retention hooks." docsCollection: "runtime" section: "javascript" diff --git a/src/runtime/docs/javascript/hci/page.md b/src/runtime/docs/javascript/hci/page.md index 4b94449e..83eeefd3 100644 --- a/src/runtime/docs/javascript/hci/page.md +++ b/src/runtime/docs/javascript/hci/page.md @@ -1,6 +1,5 @@ --- layout: "docs" -title: "oro:hci" description: "oro:hci exposes host controller interface helpers for low-level Bluetooth adapter access." docsCollection: "runtime" section: "javascript" diff --git a/src/runtime/docs/javascript/hooks/page.md b/src/runtime/docs/javascript/hooks/page.md index b07b0fe2..fe44778a 100644 --- a/src/runtime/docs/javascript/hooks/page.md +++ b/src/runtime/docs/javascript/hooks/page.md @@ -1,6 +1,5 @@ --- layout: "docs" -title: "oro:hooks" description: "oro:hooks provides a consistent way to subscribe to runtime-delivered lifecycle and system events." docsCollection: "runtime" section: "javascript" diff --git a/src/runtime/docs/javascript/http/page.md b/src/runtime/docs/javascript/http/page.md index 947d653e..8831cf3a 100644 --- a/src/runtime/docs/javascript/http/page.md +++ b/src/runtime/docs/javascript/http/page.md @@ -1,6 +1,5 @@ --- layout: "docs" -title: "oro:http" description: "oro:http provides Node-compatible HTTP client and server APIs." docsCollection: "runtime" section: "javascript" diff --git a/src/runtime/docs/javascript/https/page.md b/src/runtime/docs/javascript/https/page.md index 9059ce23..bb8bcae3 100644 --- a/src/runtime/docs/javascript/https/page.md +++ b/src/runtime/docs/javascript/https/page.md @@ -1,6 +1,5 @@ --- layout: "docs" -title: "oro:https" description: "oro:https provides HTTPS client and server APIs on top of the runtime TLS stack." docsCollection: "runtime" section: "javascript" diff --git a/src/runtime/docs/javascript/i18n/page.md b/src/runtime/docs/javascript/i18n/page.md index 081e45cb..83aeee42 100644 --- a/src/runtime/docs/javascript/i18n/page.md +++ b/src/runtime/docs/javascript/i18n/page.md @@ -1,6 +1,5 @@ --- layout: "docs" -title: "oro:i18n" description: "oro:i18n resolves UI languages, localized messages, and locale-aware metadata." docsCollection: "runtime" section: "javascript" diff --git a/src/runtime/docs/javascript/ip/page.md b/src/runtime/docs/javascript/ip/page.md index 4bf1cbd2..94bb23db 100644 --- a/src/runtime/docs/javascript/ip/page.md +++ b/src/runtime/docs/javascript/ip/page.md @@ -1,6 +1,5 @@ --- layout: "docs" -title: "oro:ip" description: "oro:ip normalizes and validates IP address inputs." docsCollection: "runtime" section: "javascript" diff --git a/src/runtime/docs/javascript/ipc/page.md b/src/runtime/docs/javascript/ipc/page.md index a0d1dea7..f3cfed19 100644 --- a/src/runtime/docs/javascript/ipc/page.md +++ b/src/runtime/docs/javascript/ipc/page.md @@ -1,6 +1,5 @@ --- layout: "docs" -title: "oro:ipc" description: "oro:ipc exposes low-level runtime IPC helpers used to talk to the native host process." docsCollection: "runtime" section: "javascript" diff --git a/src/runtime/docs/javascript/ipfs/page.md b/src/runtime/docs/javascript/ipfs/page.md index bd0f9616..21de63f7 100644 --- a/src/runtime/docs/javascript/ipfs/page.md +++ b/src/runtime/docs/javascript/ipfs/page.md @@ -1,6 +1,5 @@ --- layout: "docs" -title: "oro:ipfs" description: "oro:ipfs manages the embedded IPFS node and common content operations." docsCollection: "runtime" section: "javascript" diff --git a/src/runtime/docs/javascript/iroh/page.md b/src/runtime/docs/javascript/iroh/page.md index 3151a402..6458a5d1 100644 --- a/src/runtime/docs/javascript/iroh/page.md +++ b/src/runtime/docs/javascript/iroh/page.md @@ -1,6 +1,5 @@ --- layout: "docs" -title: "oro:iroh" description: "oro:iroh exposes the runtime’s Iroh transport bindings for peer-to-peer connections and streams." docsCollection: "runtime" section: "javascript" diff --git a/src/runtime/docs/javascript/language/page.md b/src/runtime/docs/javascript/language/page.md index 12f98156..15abc6ff 100644 --- a/src/runtime/docs/javascript/language/page.md +++ b/src/runtime/docs/javascript/language/page.md @@ -1,6 +1,5 @@ --- layout: "docs" -title: "oro:language" description: "oro:language resolves language names, tags, and related metadata." docsCollection: "runtime" section: "javascript" diff --git a/src/runtime/docs/javascript/latica/page.md b/src/runtime/docs/javascript/latica/page.md index c6b2be64..e6fb86e3 100644 --- a/src/runtime/docs/javascript/latica/page.md +++ b/src/runtime/docs/javascript/latica/page.md @@ -1,6 +1,5 @@ --- layout: "docs" -title: "oro:latica" description: "oro:latica/* exposes the runtime’s Latica networking primitives, packet helpers, and crypto utilities." docsCollection: "runtime" section: "javascript" diff --git a/src/runtime/docs/javascript/location/page.md b/src/runtime/docs/javascript/location/page.md index db0005d4..eecf350f 100644 --- a/src/runtime/docs/javascript/location/page.md +++ b/src/runtime/docs/javascript/location/page.md @@ -1,6 +1,5 @@ --- layout: "docs" -title: "oro:location" description: "oro:location normalizes the current runtime location and origin semantics across platforms." docsCollection: "runtime" section: "javascript" diff --git a/src/runtime/docs/javascript/mcp/page.md b/src/runtime/docs/javascript/mcp/page.md index 7d8c62ed..4db3510e 100644 --- a/src/runtime/docs/javascript/mcp/page.md +++ b/src/runtime/docs/javascript/mcp/page.md @@ -1,6 +1,5 @@ --- layout: "docs" -title: "oro:mcp" description: "oro:mcp provides runtime MCP helpers for registering tools/resources and controlling the embedded HTTP/SSE bridge." docsCollection: "runtime" section: "javascript" diff --git a/src/runtime/docs/javascript/mime/page.md b/src/runtime/docs/javascript/mime/page.md index 6da3823f..ec57e2e6 100644 --- a/src/runtime/docs/javascript/mime/page.md +++ b/src/runtime/docs/javascript/mime/page.md @@ -1,6 +1,5 @@ --- layout: "docs" -title: "oro:mime" description: "oro:mime looks up MIME types, extensions, and content-type metadata." docsCollection: "runtime" section: "javascript" diff --git a/src/runtime/docs/javascript/module/page.md b/src/runtime/docs/javascript/module/page.md index 95995a19..b74b6169 100644 --- a/src/runtime/docs/javascript/module/page.md +++ b/src/runtime/docs/javascript/module/page.md @@ -1,6 +1,5 @@ --- layout: "docs" -title: "oro:module" description: "oro:module exposes module-loader helpers and builtin-module inspection." docsCollection: "runtime" section: "javascript" diff --git a/src/runtime/docs/javascript/navigation/page.md b/src/runtime/docs/javascript/navigation/page.md index 8b3792bf..0959f1e0 100644 --- a/src/runtime/docs/javascript/navigation/page.md +++ b/src/runtime/docs/javascript/navigation/page.md @@ -1,6 +1,5 @@ --- layout: "docs" -title: "oro:navigation" description: "oro:navigation surfaces the Navigation API state that the runtime makes available to application code." docsCollection: "runtime" section: "javascript" diff --git a/src/runtime/docs/javascript/net/page.md b/src/runtime/docs/javascript/net/page.md index 5b64a6c0..26f41566 100644 --- a/src/runtime/docs/javascript/net/page.md +++ b/src/runtime/docs/javascript/net/page.md @@ -1,6 +1,5 @@ --- layout: "docs" -title: "oro:net" description: "oro:net provides Node-compatible TCP clients and servers." docsCollection: "runtime" section: "javascript" diff --git a/src/runtime/docs/javascript/network/page.md b/src/runtime/docs/javascript/network/page.md index 1959bd77..48524a0c 100644 --- a/src/runtime/docs/javascript/network/page.md +++ b/src/runtime/docs/javascript/network/page.md @@ -1,6 +1,5 @@ --- layout: "docs" -title: "oro:network" description: "oro:network exposes a higher-level networking surface built on the Latica stack." docsCollection: "runtime" section: "javascript" diff --git a/src/runtime/docs/javascript/notification/page.md b/src/runtime/docs/javascript/notification/page.md index dec78cb5..8ac8c0a8 100644 --- a/src/runtime/docs/javascript/notification/page.md +++ b/src/runtime/docs/javascript/notification/page.md @@ -1,6 +1,5 @@ --- layout: "docs" -title: "oro:notification" description: "oro:notification provides an API to display desktop and mobile notifications and request permission to use them." docsCollection: "runtime" section: "javascript" diff --git a/src/runtime/docs/javascript/npm/page.md b/src/runtime/docs/javascript/npm/page.md index 82f412bf..74c737fa 100644 --- a/src/runtime/docs/javascript/npm/page.md +++ b/src/runtime/docs/javascript/npm/page.md @@ -1,6 +1,5 @@ --- layout: "docs" -title: "oro:npm/*" description: "oro:npm/* supports package-resolution and service-worker plumbing for NPM-backed modules." docsCollection: "runtime" section: "javascript" diff --git a/src/runtime/docs/javascript/os/page.md b/src/runtime/docs/javascript/os/page.md index c2d6ac21..6933e449 100644 --- a/src/runtime/docs/javascript/os/page.md +++ b/src/runtime/docs/javascript/os/page.md @@ -1,6 +1,5 @@ --- layout: "docs" -title: "oro:os" description: "oro:os exposes platform, CPU, temporary-directory, and system metadata helpers." docsCollection: "runtime" section: "javascript" diff --git a/src/runtime/docs/javascript/overview/page.md b/src/runtime/docs/javascript/overview/page.md index 9b9de6c3..23e104fb 100644 --- a/src/runtime/docs/javascript/overview/page.md +++ b/src/runtime/docs/javascript/overview/page.md @@ -1,6 +1,5 @@ --- layout: "docs" -title: "JavaScript APIs overview" description: "Oro Runtime apps run inside the platform WebView. You use standard web APIs (DOM, ES modules, fetch, URLs, WebCrypto, WebAssembly) and import Oro-specific native capabilities as explicit ES modules un" docsCollection: "runtime" section: "javascript" diff --git a/src/runtime/docs/javascript/path/page.md b/src/runtime/docs/javascript/path/page.md index 8c148534..b6d0589c 100644 --- a/src/runtime/docs/javascript/path/page.md +++ b/src/runtime/docs/javascript/path/page.md @@ -1,6 +1,5 @@ --- layout: "docs" -title: "oro:path" description: "oro:path provides cross-platform path manipulation utilities." docsCollection: "runtime" section: "javascript" diff --git a/src/runtime/docs/javascript/process/page.md b/src/runtime/docs/javascript/process/page.md index 2575cf6f..9b97cdd2 100644 --- a/src/runtime/docs/javascript/process/page.md +++ b/src/runtime/docs/javascript/process/page.md @@ -1,6 +1,5 @@ --- layout: "docs" -title: "oro:process" description: "oro:process exposes runtime process state, env access, signals, and scheduling helpers." docsCollection: "runtime" section: "javascript" diff --git a/src/runtime/docs/javascript/protocol-handlers/page.md b/src/runtime/docs/javascript/protocol-handlers/page.md index 3be73848..dbc7990a 100644 --- a/src/runtime/docs/javascript/protocol-handlers/page.md +++ b/src/runtime/docs/javascript/protocol-handlers/page.md @@ -1,6 +1,5 @@ --- layout: "docs" -title: "oro:protocol-handlers" description: "oro:protocol-handlers exposes runtime helpers for custom protocol and service-worker routing." docsCollection: "runtime" section: "javascript" diff --git a/src/runtime/docs/javascript/querystring/page.md b/src/runtime/docs/javascript/querystring/page.md index 86398f08..cb6b85b0 100644 --- a/src/runtime/docs/javascript/querystring/page.md +++ b/src/runtime/docs/javascript/querystring/page.md @@ -1,6 +1,5 @@ --- layout: "docs" -title: "oro:querystring" description: "oro:querystring parses and serializes URL query strings." docsCollection: "runtime" section: "javascript" diff --git a/src/runtime/docs/javascript/secure-storage/page.md b/src/runtime/docs/javascript/secure-storage/page.md index a63c99e8..5073db78 100644 --- a/src/runtime/docs/javascript/secure-storage/page.md +++ b/src/runtime/docs/javascript/secure-storage/page.md @@ -1,6 +1,5 @@ --- layout: "docs" -title: "oro:secure-storage" description: "oro:secure-storage stores secrets scoped by origin (for example tokens, credentials, API keys)." docsCollection: "runtime" section: "javascript" diff --git a/src/runtime/docs/javascript/semver/page.md b/src/runtime/docs/javascript/semver/page.md index fb68406c..401e8662 100644 --- a/src/runtime/docs/javascript/semver/page.md +++ b/src/runtime/docs/javascript/semver/page.md @@ -1,6 +1,5 @@ --- layout: "docs" -title: "oro:semver" description: "oro:semver parses, validates, and compares semantic versions." docsCollection: "runtime" section: "javascript" diff --git a/src/runtime/docs/javascript/service-worker/page.md b/src/runtime/docs/javascript/service-worker/page.md index 6d321176..74d50723 100644 --- a/src/runtime/docs/javascript/service-worker/page.md +++ b/src/runtime/docs/javascript/service-worker/page.md @@ -1,6 +1,5 @@ --- layout: "docs" -title: "oro:service-worker" description: "oro:service-worker/* exposes the service-worker environment, lifecycle objects, and helpers." docsCollection: "runtime" section: "javascript" diff --git a/src/runtime/docs/javascript/shared-worker/page.md b/src/runtime/docs/javascript/shared-worker/page.md index 4a9a7e66..7f2f2c38 100644 --- a/src/runtime/docs/javascript/shared-worker/page.md +++ b/src/runtime/docs/javascript/shared-worker/page.md @@ -1,6 +1,5 @@ --- layout: "docs" -title: "oro:shared-worker" description: "oro:shared-worker/* exposes the shared-worker environment and runtime helpers." docsCollection: "runtime" section: "javascript" diff --git a/src/runtime/docs/javascript/signal/page.md b/src/runtime/docs/javascript/signal/page.md index a393b99e..5910bfe6 100644 --- a/src/runtime/docs/javascript/signal/page.md +++ b/src/runtime/docs/javascript/signal/page.md @@ -1,6 +1,5 @@ --- layout: "docs" -title: "oro:signal" description: "oro:signal exposes process-signal constants, conversion helpers, and event listeners." docsCollection: "runtime" section: "javascript" diff --git a/src/runtime/docs/javascript/sqlite/page.md b/src/runtime/docs/javascript/sqlite/page.md index b01135cf..1a099efd 100644 --- a/src/runtime/docs/javascript/sqlite/page.md +++ b/src/runtime/docs/javascript/sqlite/page.md @@ -1,6 +1,5 @@ --- layout: "docs" -title: "oro:sqlite" description: "oro:sqlite opens SQLite databases and exposes sync and async query helpers." docsCollection: "runtime" section: "javascript" diff --git a/src/runtime/docs/javascript/stream/page.md b/src/runtime/docs/javascript/stream/page.md index a550ef37..7c25c897 100644 --- a/src/runtime/docs/javascript/stream/page.md +++ b/src/runtime/docs/javascript/stream/page.md @@ -1,6 +1,5 @@ --- layout: "docs" -title: "oro:stream" description: "oro:stream exposes Node-style streams, Web streams, and pipeline helpers." docsCollection: "runtime" section: "javascript" diff --git a/src/runtime/docs/javascript/string_decoder/page.md b/src/runtime/docs/javascript/string_decoder/page.md index 5a04ac8c..51558714 100644 --- a/src/runtime/docs/javascript/string_decoder/page.md +++ b/src/runtime/docs/javascript/string_decoder/page.md @@ -1,6 +1,5 @@ --- layout: "docs" -title: "oro:string_decoder" description: "oro:string_decoder decodes split byte streams into text without corrupting multibyte characters." docsCollection: "runtime" section: "javascript" diff --git a/src/runtime/docs/javascript/tar/page.md b/src/runtime/docs/javascript/tar/page.md index 8d021ba9..d5efed47 100644 --- a/src/runtime/docs/javascript/tar/page.md +++ b/src/runtime/docs/javascript/tar/page.md @@ -1,6 +1,5 @@ --- layout: "docs" -title: "oro:tar" description: "oro:tar opens, creates, streams, and extracts tar archives." docsCollection: "runtime" section: "javascript" diff --git a/src/runtime/docs/javascript/tcp/page.md b/src/runtime/docs/javascript/tcp/page.md index 35037201..580f5357 100644 --- a/src/runtime/docs/javascript/tcp/page.md +++ b/src/runtime/docs/javascript/tcp/page.md @@ -1,6 +1,5 @@ --- layout: "docs" -title: "oro:tcp" description: "oro:tcp exposes lower-level TCP client and server helpers alongside the higher-level oro:net API." docsCollection: "runtime" section: "javascript" diff --git a/src/runtime/docs/javascript/test/page.md b/src/runtime/docs/javascript/test/page.md index cf7e793f..39e1bc75 100644 --- a/src/runtime/docs/javascript/test/page.md +++ b/src/runtime/docs/javascript/test/page.md @@ -1,6 +1,5 @@ --- layout: "docs" -title: "oro:test" description: "oro:test provides the runtime test harness used by application and module tests." docsCollection: "runtime" section: "javascript" diff --git a/src/runtime/docs/javascript/timers/page.md b/src/runtime/docs/javascript/timers/page.md index 86553d1e..e38221f9 100644 --- a/src/runtime/docs/javascript/timers/page.md +++ b/src/runtime/docs/javascript/timers/page.md @@ -1,6 +1,5 @@ --- layout: "docs" -title: "oro:timers" description: "oro:timers exposes timer primitives, promise-based sleeps, and scheduler helpers." docsCollection: "runtime" section: "javascript" diff --git a/src/runtime/docs/javascript/tls/page.md b/src/runtime/docs/javascript/tls/page.md index fa84749b..18a36da7 100644 --- a/src/runtime/docs/javascript/tls/page.md +++ b/src/runtime/docs/javascript/tls/page.md @@ -1,6 +1,5 @@ --- layout: "docs" -title: "oro:tls" description: "oro:tls exposes TLS sockets, servers, and certificate-pin helpers." docsCollection: "runtime" section: "javascript" diff --git a/src/runtime/docs/javascript/toml/page.md b/src/runtime/docs/javascript/toml/page.md index 94aba3ac..f5e8cc3a 100644 --- a/src/runtime/docs/javascript/toml/page.md +++ b/src/runtime/docs/javascript/toml/page.md @@ -1,6 +1,5 @@ --- layout: "docs" -title: "oro:toml" description: "oro:toml parses and serializes TOML documents." docsCollection: "runtime" section: "javascript" diff --git a/src/runtime/docs/javascript/tty/page.md b/src/runtime/docs/javascript/tty/page.md index 2f2dbe3e..d2376805 100644 --- a/src/runtime/docs/javascript/tty/page.md +++ b/src/runtime/docs/javascript/tty/page.md @@ -1,6 +1,5 @@ --- layout: "docs" -title: "oro:tty" description: "oro:tty exposes terminal streams and TTY detection helpers." docsCollection: "runtime" section: "javascript" diff --git a/src/runtime/docs/javascript/url/page.md b/src/runtime/docs/javascript/url/page.md index 7da6a506..6e382ce2 100644 --- a/src/runtime/docs/javascript/url/page.md +++ b/src/runtime/docs/javascript/url/page.md @@ -1,6 +1,5 @@ --- layout: "docs" -title: "oro:url" description: "oro:url exposes the WHATWG URL implementation used by the runtime." docsCollection: "runtime" section: "javascript" diff --git a/src/runtime/docs/javascript/usb/page.md b/src/runtime/docs/javascript/usb/page.md index e04b9e4a..d9143763 100644 --- a/src/runtime/docs/javascript/usb/page.md +++ b/src/runtime/docs/javascript/usb/page.md @@ -1,6 +1,5 @@ --- layout: "docs" -title: "oro:usb" description: "oro:usb installs and exposes the runtime WebUSB surface for window contexts." docsCollection: "runtime" section: "javascript" diff --git a/src/runtime/docs/javascript/util/page.md b/src/runtime/docs/javascript/util/page.md index 0695b322..9f5eb7a5 100644 --- a/src/runtime/docs/javascript/util/page.md +++ b/src/runtime/docs/javascript/util/page.md @@ -1,6 +1,5 @@ --- layout: "docs" -title: "oro:util" description: "oro:util exposes inspection, debug, and type-checking helpers." docsCollection: "runtime" section: "javascript" diff --git a/src/runtime/docs/javascript/vm/page.md b/src/runtime/docs/javascript/vm/page.md index 8b738142..0593d2e7 100644 --- a/src/runtime/docs/javascript/vm/page.md +++ b/src/runtime/docs/javascript/vm/page.md @@ -1,6 +1,5 @@ --- layout: "docs" -title: "oro:vm" description: "oro:vm runs JavaScript in isolated runtime contexts and manages context windows and workers." docsCollection: "runtime" section: "javascript" diff --git a/src/runtime/docs/javascript/window/page.md b/src/runtime/docs/javascript/window/page.md index 7db23f23..b5b610d7 100644 --- a/src/runtime/docs/javascript/window/page.md +++ b/src/runtime/docs/javascript/window/page.md @@ -1,6 +1,5 @@ --- layout: "docs" -title: "oro:window" description: "oro:window provides the ApplicationWindow class and window-specific methods." docsCollection: "runtime" section: "javascript" diff --git a/src/runtime/docs/javascript/worker/page.md b/src/runtime/docs/javascript/worker/page.md index b404f530..a9b40258 100644 --- a/src/runtime/docs/javascript/worker/page.md +++ b/src/runtime/docs/javascript/worker/page.md @@ -1,6 +1,5 @@ --- layout: "docs" -title: "oro:worker" description: "oro:worker re-exports the runtime worker classes for dedicated, shared, and service workers." docsCollection: "runtime" section: "javascript" diff --git a/src/runtime/docs/javascript/worker_threads/page.md b/src/runtime/docs/javascript/worker_threads/page.md index f89e483b..eb661944 100644 --- a/src/runtime/docs/javascript/worker_threads/page.md +++ b/src/runtime/docs/javascript/worker_threads/page.md @@ -1,6 +1,5 @@ --- layout: "docs" -title: "oro:worker_threads" description: "oro:worker_threads exposes worker-thread primitives, ports, and environment data helpers." docsCollection: "runtime" section: "javascript" diff --git a/src/runtime/docs/javascript/xpc/page.md b/src/runtime/docs/javascript/xpc/page.md index d04e3b1c..255ca8c3 100644 --- a/src/runtime/docs/javascript/xpc/page.md +++ b/src/runtime/docs/javascript/xpc/page.md @@ -1,6 +1,5 @@ --- layout: "docs" -title: "oro:xpc" description: "oro:xpc connects to macOS XPC services and encodes structured XPC payloads." docsCollection: "runtime" section: "javascript" diff --git a/src/runtime/docs/javascript/zlib/page.md b/src/runtime/docs/javascript/zlib/page.md index fae2dfcb..20abebae 100644 --- a/src/runtime/docs/javascript/zlib/page.md +++ b/src/runtime/docs/javascript/zlib/page.md @@ -1,6 +1,5 @@ --- layout: "docs" -title: "oro:zlib" description: "oro:zlib compresses and decompresses buffers and exposes zlib stream helpers." docsCollection: "runtime" section: "javascript" diff --git a/src/runtime/docs/page.md b/src/runtime/docs/page.md index 2ee641f7..f2c9cd6a 100644 --- a/src/runtime/docs/page.md +++ b/src/runtime/docs/page.md @@ -1,6 +1,5 @@ --- layout: "docs" -title: "Oro Runtime Docs" description: "Oro Runtime is a cross-platform runtime for building native applications as web applications: HTML/CSS for UI, JavaScript for behavior, and a small native core for OS integration." docsCollection: "runtime" section: "overview" diff --git a/src/sage/docs/cli/configuration/page.md b/src/sage/docs/cli/configuration/page.md index a988feaa..da859669 100644 --- a/src/sage/docs/cli/configuration/page.md +++ b/src/sage/docs/cli/configuration/page.md @@ -1,6 +1,5 @@ --- layout: "docs" -title: "Configuration" description: "sage reads configuration from .sagerc, a TOML file." docsCollection: "sage" section: "cli" diff --git a/src/sage/docs/cli/diagnostics/page.md b/src/sage/docs/cli/diagnostics/page.md index 2062dbcd..f62d7087 100644 --- a/src/sage/docs/cli/diagnostics/page.md +++ b/src/sage/docs/cli/diagnostics/page.md @@ -1,6 +1,5 @@ --- layout: "docs" -title: "Diagnostics" description: "This page documents the public exit codes plus the most important user-visible warnings and errors." docsCollection: "sage" section: "cli" diff --git a/src/sage/docs/cli/environment-and-files/page.md b/src/sage/docs/cli/environment-and-files/page.md index b4d916d2..b406ad5b 100644 --- a/src/sage/docs/cli/environment-and-files/page.md +++ b/src/sage/docs/cli/environment-and-files/page.md @@ -1,6 +1,5 @@ --- layout: "docs" -title: "Environment and files" description: "This page collects every environment variable and important filesystem location used by sage." docsCollection: "sage" section: "cli" diff --git a/src/sage/docs/cli/inputs-and-modes/page.md b/src/sage/docs/cli/inputs-and-modes/page.md index 0d7f1a4f..64e1b004 100644 --- a/src/sage/docs/cli/inputs-and-modes/page.md +++ b/src/sage/docs/cli/inputs-and-modes/page.md @@ -1,6 +1,5 @@ --- layout: "docs" -title: "Inputs and modes" description: "This page is the exact downstream input model for sage." docsCollection: "sage" section: "cli" diff --git a/src/sage/docs/cli/keys-and-commands/page.md b/src/sage/docs/cli/keys-and-commands/page.md index 81b56bb1..895827cf 100644 --- a/src/sage/docs/cli/keys-and-commands/page.md +++ b/src/sage/docs/cli/keys-and-commands/page.md @@ -1,6 +1,5 @@ --- layout: "docs" -title: "Keys and commands" description: "This is the full interactive key and command reference for sage." docsCollection: "sage" section: "cli" diff --git a/src/sage/docs/cli/options/page.md b/src/sage/docs/cli/options/page.md index f133b05a..53d6f623 100644 --- a/src/sage/docs/cli/options/page.md +++ b/src/sage/docs/cli/options/page.md @@ -1,6 +1,5 @@ --- layout: "docs" -title: "Options" description: "This page documents every public CLI flag on sage." docsCollection: "sage" section: "cli" diff --git a/src/sage/docs/cli/sage/page.md b/src/sage/docs/cli/sage/page.md index b9083916..a7fb7cc3 100644 --- a/src/sage/docs/cli/sage/page.md +++ b/src/sage/docs/cli/sage/page.md @@ -1,6 +1,5 @@ --- layout: "docs" -title: "sage" description: "sage is the canonical CLI entrypoint for the pager." docsCollection: "sage" section: "cli" diff --git a/src/sage/docs/cli/syntax-and-cache/page.md b/src/sage/docs/cli/syntax-and-cache/page.md index 9eda656a..17641d4a 100644 --- a/src/sage/docs/cli/syntax-and-cache/page.md +++ b/src/sage/docs/cli/syntax-and-cache/page.md @@ -1,6 +1,5 @@ --- layout: "docs" -title: "Syntax and cache" description: "sage can apply syntax highlighting to local paths and URL-backed content." docsCollection: "sage" section: "cli" diff --git a/src/sage/docs/guides/getting-started/page.md b/src/sage/docs/guides/getting-started/page.md index 58d0768f..4369678d 100644 --- a/src/sage/docs/guides/getting-started/page.md +++ b/src/sage/docs/guides/getting-started/page.md @@ -1,6 +1,5 @@ --- layout: "docs" -title: "Getting started" description: "This guide covers the downstream story: build sage, install it, page real inputs, then move into configuration and plugins." docsCollection: "sage" section: "guides" diff --git a/src/sage/docs/guides/pager-workflows/page.md b/src/sage/docs/guides/pager-workflows/page.md index cc27697e..e8d3cc70 100644 --- a/src/sage/docs/guides/pager-workflows/page.md +++ b/src/sage/docs/guides/pager-workflows/page.md @@ -1,6 +1,5 @@ --- layout: "docs" -title: "Pager workflows" description: "sage is most useful when you treat it as a CLI tool first and a programmable runtime second. These patterns cover the common downstream workflows." docsCollection: "sage" section: "guides" diff --git a/src/sage/docs/guides/plugins-quickstart/page.md b/src/sage/docs/guides/plugins-quickstart/page.md index c9cdc2d2..bd23985d 100644 --- a/src/sage/docs/guides/plugins-quickstart/page.md +++ b/src/sage/docs/guides/plugins-quickstart/page.md @@ -1,6 +1,5 @@ --- layout: "docs" -title: "Plugins quickstart" description: "sage can load JavaScript plugins in the interactive TUI path. Plugins are a good fit when you want:" docsCollection: "sage" section: "guides" diff --git a/src/sage/docs/javascript/all-modules/page.md b/src/sage/docs/javascript/all-modules/page.md index 5cbeb4de..408cf0f7 100644 --- a/src/sage/docs/javascript/all-modules/page.md +++ b/src/sage/docs/javascript/all-modules/page.md @@ -1,6 +1,5 @@ --- layout: "docs" -title: "All module specifiers" description: "Public, stable module specifiers:" docsCollection: "sage" section: "javascript" diff --git a/src/sage/docs/javascript/crypto/page.md b/src/sage/docs/javascript/crypto/page.md index b5c25d70..0561b9a6 100644 --- a/src/sage/docs/javascript/crypto/page.md +++ b/src/sage/docs/javascript/crypto/page.md @@ -1,6 +1,5 @@ --- layout: "docs" -title: "sage:crypto" description: "sage:crypto provides random bytes and UUID v4 generation." docsCollection: "sage" section: "javascript" diff --git a/src/sage/docs/javascript/dom/page.md b/src/sage/docs/javascript/dom/page.md index c20485b2..63f366cf 100644 --- a/src/sage/docs/javascript/dom/page.md +++ b/src/sage/docs/javascript/dom/page.md @@ -1,6 +1,5 @@ --- layout: "docs" -title: "sage:core/dom" description: "sage:core/dom provides DOMException and structuredClone." docsCollection: "sage" section: "javascript" diff --git a/src/sage/docs/javascript/env/page.md b/src/sage/docs/javascript/env/page.md index 4029fa40..0f4944a9 100644 --- a/src/sage/docs/javascript/env/page.md +++ b/src/sage/docs/javascript/env/page.md @@ -1,6 +1,5 @@ --- layout: "docs" -title: "sage:env" description: "sage:env reads and mutates the host process environment." docsCollection: "sage" section: "javascript" diff --git a/src/sage/docs/javascript/fetch/page.md b/src/sage/docs/javascript/fetch/page.md index b2dbd00d..46955cd8 100644 --- a/src/sage/docs/javascript/fetch/page.md +++ b/src/sage/docs/javascript/fetch/page.md @@ -1,6 +1,5 @@ --- layout: "docs" -title: "sage:fetch" description: "sage:fetch is the host-backed WHATWG-style network module." docsCollection: "sage" section: "javascript" diff --git a/src/sage/docs/javascript/fs/page.md b/src/sage/docs/javascript/fs/page.md index cbaece9a..ed4f5271 100644 --- a/src/sage/docs/javascript/fs/page.md +++ b/src/sage/docs/javascript/fs/page.md @@ -1,6 +1,5 @@ --- layout: "docs" -title: "sage:fs" description: "sage:fs provides bounded filesystem access for plugins." docsCollection: "sage" section: "javascript" diff --git a/src/sage/docs/javascript/module-index/page.md b/src/sage/docs/javascript/module-index/page.md index d14f834c..aef2e0a8 100644 --- a/src/sage/docs/javascript/module-index/page.md +++ b/src/sage/docs/javascript/module-index/page.md @@ -1,6 +1,5 @@ --- layout: "docs" -title: "Module index" description: "This is the stable built-in module surface for Sage plugins." docsCollection: "sage" section: "javascript" diff --git a/src/sage/docs/javascript/navigator/page.md b/src/sage/docs/javascript/navigator/page.md index 16ef38b7..d8022c19 100644 --- a/src/sage/docs/javascript/navigator/page.md +++ b/src/sage/docs/javascript/navigator/page.md @@ -1,6 +1,5 @@ --- layout: "docs" -title: "sage:navigator" description: "sage:navigator exposes a browser-like navigator object." docsCollection: "sage" section: "javascript" diff --git a/src/sage/docs/javascript/overview/page.md b/src/sage/docs/javascript/overview/page.md index 02fc523c..61f16ea4 100644 --- a/src/sage/docs/javascript/overview/page.md +++ b/src/sage/docs/javascript/overview/page.md @@ -1,6 +1,5 @@ --- layout: "docs" -title: "JavaScript APIs overview" description: "sage can load JavaScript plugins in the interactive TUI path. Plugins run as ES modules on top of QuickJS and can extend the pager with custom commands, event handlers, bounded filesystem state, child" docsCollection: "sage" section: "javascript" diff --git a/src/sage/docs/javascript/path/page.md b/src/sage/docs/javascript/path/page.md index f6a57ba8..d21582f2 100644 --- a/src/sage/docs/javascript/path/page.md +++ b/src/sage/docs/javascript/path/page.md @@ -1,6 +1,5 @@ --- layout: "docs" -title: "sage:path" description: "sage:path is a small POSIX-style path helper module." docsCollection: "sage" section: "javascript" diff --git a/src/sage/docs/javascript/performance/page.md b/src/sage/docs/javascript/performance/page.md index 708e80bf..a96b62ec 100644 --- a/src/sage/docs/javascript/performance/page.md +++ b/src/sage/docs/javascript/performance/page.md @@ -1,6 +1,5 @@ --- layout: "docs" -title: "sage:performance" description: "sage:performance provides a small Performance implementation." docsCollection: "sage" section: "javascript" diff --git a/src/sage/docs/javascript/process/page.md b/src/sage/docs/javascript/process/page.md index 2f680408..e1729f7e 100644 --- a/src/sage/docs/javascript/process/page.md +++ b/src/sage/docs/javascript/process/page.md @@ -1,6 +1,5 @@ --- layout: "docs" -title: "sage:process" description: "sage:process exposes process metadata plus bounded shell execution." docsCollection: "sage" section: "javascript" diff --git a/src/sage/docs/javascript/runtime/page.md b/src/sage/docs/javascript/runtime/page.md index 6675169d..a964428b 100644 --- a/src/sage/docs/javascript/runtime/page.md +++ b/src/sage/docs/javascript/runtime/page.md @@ -1,6 +1,5 @@ --- layout: "docs" -title: "JavaScript runtime" description: "This page describes the full plugin runtime model: how plugins load, what globals are installed, what events exist, and where the limits are." docsCollection: "sage" section: "javascript" diff --git a/src/sage/docs/javascript/url/page.md b/src/sage/docs/javascript/url/page.md index f7b29622..0a62528c 100644 --- a/src/sage/docs/javascript/url/page.md +++ b/src/sage/docs/javascript/url/page.md @@ -1,6 +1,5 @@ --- layout: "docs" -title: "sage:url" description: "sage:url implements WHATWG-style URL and URLSearchParams." docsCollection: "sage" section: "javascript" diff --git a/src/sage/docs/javascript/uuid/page.md b/src/sage/docs/javascript/uuid/page.md index 64e76128..7bf6fb23 100644 --- a/src/sage/docs/javascript/uuid/page.md +++ b/src/sage/docs/javascript/uuid/page.md @@ -1,6 +1,5 @@ --- layout: "docs" -title: "sage:uuid" description: "sage:uuid provides explicit UUID helper functions." docsCollection: "sage" section: "javascript" diff --git a/src/sage/docs/javascript/web/page.md b/src/sage/docs/javascript/web/page.md index c6fe290d..80edd9ad 100644 --- a/src/sage/docs/javascript/web/page.md +++ b/src/sage/docs/javascript/web/page.md @@ -1,6 +1,5 @@ --- layout: "docs" -title: "sage:core/web" description: "sage:core/web provides a host-free, in-memory set of WHATWG-style web primitives." docsCollection: "sage" section: "javascript" diff --git a/src/sage/docs/man/sage-1/page.md b/src/sage/docs/man/sage-1/page.md index 84fc05d8..93979cec 100644 --- a/src/sage/docs/man/sage-1/page.md +++ b/src/sage/docs/man/sage-1/page.md @@ -1,6 +1,5 @@ --- layout: "docs" -title: "sage(1)" description: "sage(1) is the command reference for the pager itself. This page mirrors the man page in website form so downstream readers do not have to context-switch into man." docsCollection: "sage" section: "man" diff --git a/src/sage/docs/man/sage-7/page.md b/src/sage/docs/man/sage-7/page.md index b7edb0e1..021b52b4 100644 --- a/src/sage/docs/man/sage-7/page.md +++ b/src/sage/docs/man/sage-7/page.md @@ -1,6 +1,5 @@ --- layout: "docs" -title: "sage(7)" description: "sage(7) is the conceptual manual page for the pager. It explains how the CLI behaves beyond the flag list in sage(1)." docsCollection: "sage" section: "man" diff --git a/src/sage/docs/man/sage-plugin-api-3/page.md b/src/sage/docs/man/sage-plugin-api-3/page.md index 21a8441e..f65fc0ee 100644 --- a/src/sage/docs/man/sage-plugin-api-3/page.md +++ b/src/sage/docs/man/sage-plugin-api-3/page.md @@ -1,6 +1,5 @@ --- layout: "docs" -title: "sage-plugin-api(3)" description: "sage-plugin-api(3) is the manual page for the JavaScript plugin runtime. This page mirrors the man page in website form and points into the fuller module documentation." docsCollection: "sage" section: "man" diff --git a/src/sage/docs/page.md b/src/sage/docs/page.md index 34271360..73a91268 100644 --- a/src/sage/docs/page.md +++ b/src/sage/docs/page.md @@ -1,6 +1,5 @@ --- layout: "docs" -title: "Sage Docs" description: "sage is a fast, ergonomic terminal pager with a strong CLI story: open one file, a directory worth of files, piped stdin, or remote content, then navigate with a responsive TUI, incremental search, sy" docsCollection: "sage" section: "overview" diff --git a/src/silk/docs/compiler/abi-libsilk/page.md b/src/silk/docs/compiler/abi-libsilk/page.md index 3cc12519..d88237ab 100644 --- a/src/silk/docs/compiler/abi-libsilk/page.md +++ b/src/silk/docs/compiler/abi-libsilk/page.md @@ -1,6 +1,5 @@ --- layout: "docs" -title: "C99 ABI and libsilk.a" description: "This document defines the C99 ABI and the interface of the libsilk.a static library." docsCollection: "silk" section: "compiler" diff --git a/src/silk/docs/compiler/architecture/page.md b/src/silk/docs/compiler/architecture/page.md index ced65db5..95269040 100644 --- a/src/silk/docs/compiler/architecture/page.md +++ b/src/silk/docs/compiler/architecture/page.md @@ -1,6 +1,5 @@ --- layout: "docs" -title: "Compiler Architecture" description: "This document describes the intended architecture of the Silk compiler implemented in Zig." docsCollection: "silk" section: "compiler" diff --git a/src/silk/docs/compiler/async-runtime/page.md b/src/silk/docs/compiler/async-runtime/page.md index 19f35a50..c4eae828 100644 --- a/src/silk/docs/compiler/async-runtime/page.md +++ b/src/silk/docs/compiler/async-runtime/page.md @@ -1,6 +1,5 @@ --- layout: "docs" -title: "Async Runtime (Hosted)" description: "Current host-build note:" docsCollection: "silk" section: "compiler" diff --git a/src/silk/docs/compiler/backend-amdgpu/page.md b/src/silk/docs/compiler/backend-amdgpu/page.md index fc6205f8..30c34bd6 100644 --- a/src/silk/docs/compiler/backend-amdgpu/page.md +++ b/src/silk/docs/compiler/backend-amdgpu/page.md @@ -1,6 +1,5 @@ --- layout: "docs" -title: "AMDGPU Backend" description: "This document specifies the initial AMD GPU backend surface for Silk. The backend is implemented in Zig and emits AMDHSA code-object bytes directly from Silk-owned data structures. It must not depend " docsCollection: "silk" section: "compiler" diff --git a/src/silk/docs/compiler/backend-gpu/page.md b/src/silk/docs/compiler/backend-gpu/page.md index 837f8ccb..963e2a49 100644 --- a/src/silk/docs/compiler/backend-gpu/page.md +++ b/src/silk/docs/compiler/backend-gpu/page.md @@ -1,6 +1,5 @@ --- layout: "docs" -title: "Target-neutral GPU compilation" description: "This document defines the shared compiler contract between Silk source and processor-specific GPU backends. AMDGPU is the first consumer; the GPU-v1 closure adds an NVIDIA PTX consumer. Both consume t" docsCollection: "silk" section: "compiler" diff --git a/src/silk/docs/compiler/backend-nvidia/page.md b/src/silk/docs/compiler/backend-nvidia/page.md index c0cf6659..b41b1711 100644 --- a/src/silk/docs/compiler/backend-nvidia/page.md +++ b/src/silk/docs/compiler/backend-nvidia/page.md @@ -1,6 +1,5 @@ --- layout: "docs" -title: "NVIDIA GPU backend" description: "This document specifies Silk's NVIDIA provider for the target-neutral GPU-v1 contract in backend-gpu.md." docsCollection: "silk" section: "compiler" diff --git a/src/silk/docs/compiler/backend-wasm/page.md b/src/silk/docs/compiler/backend-wasm/page.md index cbcc15be..9d214bdf 100644 --- a/src/silk/docs/compiler/backend-wasm/page.md +++ b/src/silk/docs/compiler/backend-wasm/page.md @@ -1,6 +1,5 @@ --- layout: "docs" -title: "WebAssembly Back-End (wasm32 / wasm64)" description: "This document describes the shipped WebAssembly back-end, the target conventions it uses today, and the remaining ABI boundaries for wasm targets." docsCollection: "silk" section: "compiler" diff --git a/src/silk/docs/compiler/build-scripts/page.md b/src/silk/docs/compiler/build-scripts/page.md index 64f89505..36f532a7 100644 --- a/src/silk/docs/compiler/build-scripts/page.md +++ b/src/silk/docs/compiler/build-scripts/page.md @@ -1,6 +1,5 @@ --- layout: "docs" -title: "Build Modules (build.slk)" description: "This document specifies Silk’s build module concept: a package-local Silk module named build.slk that can generate a package build plan at build time." docsCollection: "silk" section: "compiler" diff --git a/src/silk/docs/compiler/builtin-deps/page.md b/src/silk/docs/compiler/builtin-deps/page.md index ab63a782..654c534a 100644 --- a/src/silk/docs/compiler/builtin-deps/page.md +++ b/src/silk/docs/compiler/builtin-deps/page.md @@ -1,6 +1,5 @@ --- layout: "docs" -title: "Built-In Dependencies" description: "Silk aims to be buildable with minimal reliance on system-installed dependencies. For the hosted POSIX baseline, Silk ships built-in dependency sources and pinned archives:" docsCollection: "silk" section: "compiler" diff --git a/src/silk/docs/compiler/cache-silk/page.md b/src/silk/docs/compiler/cache-silk/page.md index d51ce920..2ea5d352 100644 --- a/src/silk/docs/compiler/cache-silk/page.md +++ b/src/silk/docs/compiler/cache-silk/page.md @@ -1,6 +1,5 @@ --- layout: "docs" -title: "silk Cache Management" description: "This document describes the managed cache model used by the silk toolchain and the silk cache command surface for inspecting and maintaining that cache." docsCollection: "silk" section: "compiler" diff --git a/src/silk/docs/compiler/cli-silk/page.md b/src/silk/docs/compiler/cli-silk/page.md index a2e7e9b1..3dbc66e6 100644 --- a/src/silk/docs/compiler/cli-silk/page.md +++ b/src/silk/docs/compiler/cli-silk/page.md @@ -1,6 +1,5 @@ --- layout: "docs" -title: "silk CLI" description: "This document describes the command-line interface of the silk compiler from the downstream user’s perspective." docsCollection: "silk" section: "compiler" diff --git a/src/silk/docs/compiler/diagnostics/page.md b/src/silk/docs/compiler/diagnostics/page.md index d4f97f4c..f5c9d4b6 100644 --- a/src/silk/docs/compiler/diagnostics/page.md +++ b/src/silk/docs/compiler/diagnostics/page.md @@ -1,6 +1,5 @@ --- layout: "docs" -title: "Compiler Diagnostics" description: "This document specifies the human-readable diagnostic format emitted by the Silk toolchain, including:" docsCollection: "silk" section: "compiler" diff --git a/src/silk/docs/compiler/implementation-status/page.md b/src/silk/docs/compiler/implementation-status/page.md index 390e8628..11fa368c 100644 --- a/src/silk/docs/compiler/implementation-status/page.md +++ b/src/silk/docs/compiler/implementation-status/page.md @@ -1,6 +1,5 @@ --- layout: "docs" -title: "Notes" description: "This page is a downstream-facing snapshot of what the reference Silk compiler and toolchain support end-to-end today. It is intentionally high-level: each language, standard-library, and compiler page" docsCollection: "silk" section: "compiler" diff --git a/src/silk/docs/compiler/ir-overview/page.md b/src/silk/docs/compiler/ir-overview/page.md index 8b318184..a50fa571 100644 --- a/src/silk/docs/compiler/ir-overview/page.md +++ b/src/silk/docs/compiler/ir-overview/page.md @@ -1,6 +1,5 @@ --- layout: "docs" -title: "Intermediate Representation (IR) – Overview" description: "This document introduces the initial intermediate representation (IR) used by the Silk compiler. The IR is intentionally small and focused for now so that we can start supporting more advanced program" docsCollection: "silk" section: "compiler" diff --git a/src/silk/docs/compiler/libsilk-quickstart/page.md b/src/silk/docs/compiler/libsilk-quickstart/page.md index 888f376f..9fe2894a 100644 --- a/src/silk/docs/compiler/libsilk-quickstart/page.md +++ b/src/silk/docs/compiler/libsilk-quickstart/page.md @@ -1,6 +1,5 @@ --- layout: "docs" -title: "libsilk quickstart" description: "This page is the shortest path to embedding the Silk compiler from C or C++." docsCollection: "silk" section: "compiler" diff --git a/src/silk/docs/compiler/limits/page.md b/src/silk/docs/compiler/limits/page.md index 78d43cd6..ad6dea8e 100644 --- a/src/silk/docs/compiler/limits/page.md +++ b/src/silk/docs/compiler/limits/page.md @@ -1,6 +1,5 @@ --- layout: "docs" -title: "Compiler Limits" description: "This document enumerates the current hard limits in the Silk compiler and its tooling. These limits are implementation guardrails (primarily to keep memory usage bounded when compiling untrusted input" docsCollection: "silk" section: "compiler" diff --git a/src/silk/docs/compiler/lsp-silk/page.md b/src/silk/docs/compiler/lsp-silk/page.md index 7a0a4a31..b8a8327d 100644 --- a/src/silk/docs/compiler/lsp-silk/page.md +++ b/src/silk/docs/compiler/lsp-silk/page.md @@ -1,6 +1,5 @@ --- layout: "docs" -title: "Silk Language Server (LSP)" description: "This document specifies the current Language Server Protocol (LSP) implementation for Silk." docsCollection: "silk" section: "compiler" diff --git a/src/silk/docs/compiler/package-distribution/page.md b/src/silk/docs/compiler/package-distribution/page.md index dcb060f3..489db350 100644 --- a/src/silk/docs/compiler/package-distribution/page.md +++ b/src/silk/docs/compiler/package-distribution/page.md @@ -1,6 +1,5 @@ --- layout: "docs" -title: "Silk Package Distribution" description: "The manifest, CLI, install, inspection/linting, and binary-dependency consumption behavior described here are implemented in the current toolchain. This document describes the package authoring, publi" docsCollection: "silk" section: "compiler" diff --git a/src/silk/docs/compiler/package-manifests/page.md b/src/silk/docs/compiler/package-manifests/page.md index e70c857d..77ce9cdc 100644 --- a/src/silk/docs/compiler/package-manifests/page.md +++ b/src/silk/docs/compiler/package-manifests/page.md @@ -1,6 +1,5 @@ --- layout: "docs" -title: "Package Manifests (silk.toml)" description: "This document specifies Silk’s package manifest format and how the silk compiler consumes it." docsCollection: "silk" section: "compiler" diff --git a/src/silk/docs/compiler/stdlib-integration/page.md b/src/silk/docs/compiler/stdlib-integration/page.md index fd205e2c..14cc8dd9 100644 --- a/src/silk/docs/compiler/stdlib-integration/page.md +++ b/src/silk/docs/compiler/stdlib-integration/page.md @@ -1,6 +1,5 @@ --- layout: "docs" -title: "Standard Library Integration" description: "This document describes how the std:: package integrates with the compiler and the CLI." docsCollection: "silk" section: "compiler" diff --git a/src/silk/docs/compiler/testing-strategy/page.md b/src/silk/docs/compiler/testing-strategy/page.md index c478c9c9..3a9e0960 100644 --- a/src/silk/docs/compiler/testing-strategy/page.md +++ b/src/silk/docs/compiler/testing-strategy/page.md @@ -1,6 +1,5 @@ --- layout: "docs" -title: "Testing Strategy (Zig + C99 + Silk)" description: "This document defines how we validate the compiler, ABI, and standard library." docsCollection: "silk" section: "compiler" diff --git a/src/silk/docs/compiler/vendored-deps/page.md b/src/silk/docs/compiler/vendored-deps/page.md index b6672495..6d696a26 100644 --- a/src/silk/docs/compiler/vendored-deps/page.md +++ b/src/silk/docs/compiler/vendored-deps/page.md @@ -1,6 +1,5 @@ --- layout: "docs" -title: "Built-In Dependencies (Legacy Link)" description: "This page moved to builtin deps. The canonical built-in dependency documentation describes the shipped dependency sources, generated archives, provider selection, staging layout, and zig build deps wo" docsCollection: "silk" section: "compiler" diff --git a/src/silk/docs/compiler/zig-api/page.md b/src/silk/docs/compiler/zig-api/page.md index a4b6e08c..a51bb339 100644 --- a/src/silk/docs/compiler/zig-api/page.md +++ b/src/silk/docs/compiler/zig-api/page.md @@ -1,6 +1,5 @@ --- layout: "docs" -title: "Zig Embedding API" description: "This page documents the Zig-facing embedding surface exported as the silk module." docsCollection: "silk" section: "compiler" diff --git a/src/silk/docs/guides/cli/page.md b/src/silk/docs/guides/cli/page.md index 0e51f90d..88048ed7 100644 --- a/src/silk/docs/guides/cli/page.md +++ b/src/silk/docs/guides/cli/page.md @@ -1,6 +1,5 @@ --- layout: "docs" -title: "CLI and toolchain" description: "Silk’s CLI is designed around a small number of commands that compose well:" docsCollection: "silk" section: "guides" diff --git a/src/silk/docs/guides/formal-silk/page.md b/src/silk/docs/guides/formal-silk/page.md index b0deb13a..28f6fc63 100644 --- a/src/silk/docs/guides/formal-silk/page.md +++ b/src/silk/docs/guides/formal-silk/page.md @@ -1,6 +1,5 @@ --- layout: "docs" -title: "Formal Silk" description: "Formal Silk is Silk’s compile-time formal verification language. It lets you write machine-checked specifications next to ordinary code, and have the compiler prove those specifications using the Z3 S" docsCollection: "silk" section: "guides" diff --git a/src/silk/docs/guides/hello-world/page.md b/src/silk/docs/guides/hello-world/page.md index b923c200..2d74bcb3 100644 --- a/src/silk/docs/guides/hello-world/page.md +++ b/src/silk/docs/guides/hello-world/page.md @@ -1,6 +1,5 @@ --- layout: "docs" -title: "Hello world" description: "This page teaches the Silk “shape of a program”: explicit imports, a normal main, and a workflow that makes it cheap to iterate." docsCollection: "silk" section: "guides" diff --git a/src/silk/docs/guides/language-tour/page.md b/src/silk/docs/guides/language-tour/page.md index ec1c3e59..5d1a71e0 100644 --- a/src/silk/docs/guides/language-tour/page.md +++ b/src/silk/docs/guides/language-tour/page.md @@ -1,6 +1,5 @@ --- layout: "docs" -title: "Language tour" description: "This is a guided walkthrough of the core ideas you’ll use in real Silk programs: explicit structure, readable types, predictable control flow, and clear boundaries." docsCollection: "silk" section: "guides" diff --git a/src/silk/docs/guides/modules-and-packages/page.md b/src/silk/docs/guides/modules-and-packages/page.md index cb3cc681..44323b29 100644 --- a/src/silk/docs/guides/modules-and-packages/page.md +++ b/src/silk/docs/guides/modules-and-packages/page.md @@ -1,6 +1,5 @@ --- layout: "docs" -title: "Modules, Packages, and Publication" description: "Silk code is organized around explicit module sets. A module set is the group of .slk files the compiler loads, resolves, checks, and builds together. Packages give those files a public namespace, imp" docsCollection: "silk" section: "guides" diff --git a/src/silk/docs/guides/practical-logger-module/page.md b/src/silk/docs/guides/practical-logger-module/page.md index b3f64be3..266ed685 100644 --- a/src/silk/docs/guides/practical-logger-module/page.md +++ b/src/silk/docs/guides/practical-logger-module/page.md @@ -1,6 +1,6 @@ --- layout: "docs" -title: "Practical Logger Module Walkthrough" +redirectFrom: ["/silk/docs/guides/toy-logger-module/"] description: "This walkthrough builds a small structured logger package that can be imported from Silk and exposed to C through a generated header. It starts with the normal Silk API in src/lib.slk, then adds src/c" docsCollection: "silk" section: "guides" diff --git a/src/silk/docs/guides/project-dependencies/page.md b/src/silk/docs/guides/project-dependencies/page.md index ad77ce43..cae7286e 100644 --- a/src/silk/docs/guides/project-dependencies/page.md +++ b/src/silk/docs/guides/project-dependencies/page.md @@ -1,6 +1,5 @@ --- layout: "docs" -title: "Project Dependencies" description: "Silk projects build dependencies from package roots on disk. A dependency can be an explicit local path, a package found under a packages/ search root, or an installed package root. The examples/proje" docsCollection: "silk" section: "guides" diff --git a/src/silk/docs/guides/purpose/page.md b/src/silk/docs/guides/purpose/page.md index e9a49fb3..6e2d23f4 100644 --- a/src/silk/docs/guides/purpose/page.md +++ b/src/silk/docs/guides/purpose/page.md @@ -1,6 +1,5 @@ --- layout: "docs" -title: "What Silk is for" description: "Silk is for systems code that has to be understood, shipped, embedded, and trusted after it grows beyond a single file." docsCollection: "silk" section: "guides" diff --git a/src/silk/docs/guides/standard-library/page.md b/src/silk/docs/guides/standard-library/page.md index a6bd8df1..6f841bd2 100644 --- a/src/silk/docs/guides/standard-library/page.md +++ b/src/silk/docs/guides/standard-library/page.md @@ -1,6 +1,5 @@ --- layout: "docs" -title: "Standard library" description: "Silk’s standard library lives under the reserved std:: namespace. This is where “practical systems programming” shows up: I/O, filesystem, networking, parsing, collections, time, and the shared conven" docsCollection: "silk" section: "guides" diff --git a/src/silk/docs/guides/testing/page.md b/src/silk/docs/guides/testing/page.md index 901b59c8..34fe3c00 100644 --- a/src/silk/docs/guides/testing/page.md +++ b/src/silk/docs/guides/testing/page.md @@ -1,6 +1,5 @@ --- layout: "docs" -title: "Testing" description: "Silk testing is language-level: tests live next to the code they exercise. The compiler discovers them, runs them with silk test, and emits TAP output (TAP v13) so results are easy to consume in CI an" docsCollection: "silk" section: "guides" diff --git a/src/silk/docs/language/asm/page.md b/src/silk/docs/language/asm/page.md index 9456a4c1..a584f409 100644 --- a/src/silk/docs/language/asm/page.md +++ b/src/silk/docs/language/asm/page.md @@ -1,6 +1,5 @@ --- layout: "docs" -title: "Inline Assembly (asm)" description: "Silk provides an asm keyword for embedding inline assembly in a way that is explicit in source code and assembled at compile time." docsCollection: "silk" section: "language" diff --git a/src/silk/docs/language/atomics/page.md b/src/silk/docs/language/atomics/page.md index ebf20147..505a5494 100644 --- a/src/silk/docs/language/atomics/page.md +++ b/src/silk/docs/language/atomics/page.md @@ -1,6 +1,5 @@ --- layout: "docs" -title: "Atomics" description: "Silk atomics are compiler-backed operations for low-level thread synchronization. They are distinct from ordinary loads/stores and from volatile memory access:" docsCollection: "silk" section: "language" diff --git a/src/silk/docs/language/attributes/page.md b/src/silk/docs/language/attributes/page.md index 95d2eac9..fd8a8802 100644 --- a/src/silk/docs/language/attributes/page.md +++ b/src/silk/docs/language/attributes/page.md @@ -1,6 +1,5 @@ --- layout: "docs" -title: "Attributes (attr(...))" description: "Silk supports first-class attributes that can annotate declarations and can also be queried at compile time for conditional compilation." docsCollection: "silk" section: "language" diff --git a/src/silk/docs/language/borrow-checker/page.md b/src/silk/docs/language/borrow-checker/page.md index 55e119a2..75605be6 100644 --- a/src/silk/docs/language/borrow-checker/page.md +++ b/src/silk/docs/language/borrow-checker/page.md @@ -1,6 +1,5 @@ --- layout: "docs" -title: "Borrow Checking (Static Alias and Lifetime Safety)" description: "This document specifies Silk’s intended borrow-checking model for references." docsCollection: "silk" section: "language" diff --git a/src/silk/docs/language/buffers/page.md b/src/silk/docs/language/buffers/page.md index d34dd95e..70d7e431 100644 --- a/src/silk/docs/language/buffers/page.md +++ b/src/silk/docs/language/buffers/page.md @@ -1,6 +1,5 @@ --- layout: "docs" -title: "Buffers" description: "Buffer(T) provides low-level access to a contiguous block of memory. It is intentionally unsafe and used as a foundation for higher-level collections and strings." docsCollection: "silk" section: "language" diff --git a/src/silk/docs/language/build-metadata/page.md b/src/silk/docs/language/build-metadata/page.md index 6c57a2c0..6b672f9e 100644 --- a/src/silk/docs/language/build-metadata/page.md +++ b/src/silk/docs/language/build-metadata/page.md @@ -1,6 +1,5 @@ --- layout: "docs" -title: "Build Metadata (BUILD_KIND, BUILD_MODE, BUILD_VERSION)" description: "Silk exposes a small set of compiler-provided build metadata values to both runtime code and Formal Silk (compile-time verification) so programs can adapt to build configuration and so theories can ex" docsCollection: "silk" section: "language" diff --git a/src/silk/docs/language/cheat-sheet/page.md b/src/silk/docs/language/cheat-sheet/page.md index d4c16dfe..51429e3c 100644 --- a/src/silk/docs/language/cheat-sheet/page.md +++ b/src/silk/docs/language/cheat-sheet/page.md @@ -1,6 +1,5 @@ --- layout: "docs" -title: "Language Cheat Sheet" description: "This document summarizes the key syntax and concepts from the Silk language in a condensed form. It is meant as a quick reference; detailed semantics live in the other docs/language/ files." docsCollection: "silk" section: "language" diff --git a/src/silk/docs/language/concurrency/page.md b/src/silk/docs/language/concurrency/page.md index 5c182b24..cf78b16a 100644 --- a/src/silk/docs/language/concurrency/page.md +++ b/src/silk/docs/language/concurrency/page.md @@ -1,6 +1,5 @@ --- layout: "docs" -title: "Concurrency" description: "Concurrency in Silk is built around two orthogonal function modifiers:" docsCollection: "silk" section: "language" diff --git a/src/silk/docs/language/const-functions/page.md b/src/silk/docs/language/const-functions/page.md index 091784c8..180f7036 100644 --- a/src/silk/docs/language/const-functions/page.md +++ b/src/silk/docs/language/const-functions/page.md @@ -1,6 +1,5 @@ --- layout: "docs" -title: "Const Functions (const fn)" description: "Parser: implemented" docsCollection: "silk" section: "language" diff --git a/src/silk/docs/language/conventions/page.md b/src/silk/docs/language/conventions/page.md index 10cf8d7a..46261f07 100644 --- a/src/silk/docs/language/conventions/page.md +++ b/src/silk/docs/language/conventions/page.md @@ -1,6 +1,5 @@ --- layout: "docs" -title: "Language Spec Conventions" description: "This document defines conventions used across docs/language/. It exists to keep the language specification consistent and easy to navigate for both:" docsCollection: "silk" section: "language" diff --git a/src/silk/docs/language/dependent-types/page.md b/src/silk/docs/language/dependent-types/page.md index 66fdaf01..27fd7408 100644 --- a/src/silk/docs/language/dependent-types/page.md +++ b/src/silk/docs/language/dependent-types/page.md @@ -1,6 +1,5 @@ --- layout: "docs" -title: "Dependent Types (Const Parameters and Type-Level Computation)" description: "This document specifies Silk’s intended support for “dependent-type-like” patterns where types mention compile-time values (most notably integers)." docsCollection: "silk" section: "language" diff --git a/src/silk/docs/language/doc-comments/page.md b/src/silk/docs/language/doc-comments/page.md index d25408e7..d8c21b7f 100644 --- a/src/silk/docs/language/doc-comments/page.md +++ b/src/silk/docs/language/doc-comments/page.md @@ -1,6 +1,5 @@ --- layout: "docs" -title: "Silkdoc (Documentation Comments)" description: "This document specifies Silkdoc, Silk’s documentation-comment format. Silkdoc comments are intended for tools (documentation generators, editors, and the language server). They do not affect program s" docsCollection: "silk" section: "language" diff --git a/src/silk/docs/language/duration-instant/page.md b/src/silk/docs/language/duration-instant/page.md index db8dc9aa..10f1d869 100644 --- a/src/silk/docs/language/duration-instant/page.md +++ b/src/silk/docs/language/duration-instant/page.md @@ -1,6 +1,5 @@ --- layout: "docs" -title: "Duration & Instant" description: "Duration and Instant are time-related types with special literal and operator support." docsCollection: "silk" section: "language" diff --git a/src/silk/docs/language/enums/page.md b/src/silk/docs/language/enums/page.md index a59f6590..92a053f9 100644 --- a/src/silk/docs/language/enums/page.md +++ b/src/silk/docs/language/enums/page.md @@ -1,6 +1,5 @@ --- layout: "docs" -title: "enum Types" description: "An enum defines a tagged union type: a value that is exactly one of several named variants, optionally carrying a payload." docsCollection: "silk" section: "language" diff --git a/src/silk/docs/language/errors/page.md b/src/silk/docs/language/errors/page.md index 409c1cb7..6366975b 100644 --- a/src/silk/docs/language/errors/page.md +++ b/src/silk/docs/language/errors/page.md @@ -1,6 +1,5 @@ --- layout: "docs" -title: "Errors" description: "This document summarizes the Silk error-handling model at a level suitable for compiler implementation. It is based on the language design captured in docs/ (optionals, verification, ext, ABI)." docsCollection: "silk" section: "language" diff --git a/src/silk/docs/language/ext/page.md b/src/silk/docs/language/ext/page.md index 1262d4be..12214896 100644 --- a/src/silk/docs/language/ext/page.md +++ b/src/silk/docs/language/ext/page.md @@ -1,6 +1,5 @@ --- layout: "docs" -title: "External Declarations (ext)" description: "Silk’s external declaration feature lets Silk code call foreign functions and access foreign variables." docsCollection: "silk" section: "language" diff --git a/src/silk/docs/language/flow-blocks-statements/page.md b/src/silk/docs/language/flow-blocks-statements/page.md index 5efd59ab..78b50a5a 100644 --- a/src/silk/docs/language/flow-blocks-statements/page.md +++ b/src/silk/docs/language/flow-blocks-statements/page.md @@ -1,6 +1,5 @@ --- layout: "docs" -title: "Blocks and Statement Composition" description: "Blocks group statements, establish lexical scopes, and provide the “body” form for structured control-flow constructs like if, while, and the match statement used for typed errors." docsCollection: "silk" section: "language" diff --git a/src/silk/docs/language/flow-break/page.md b/src/silk/docs/language/flow-break/page.md index 6507e668..895462d0 100644 --- a/src/silk/docs/language/flow-break/page.md +++ b/src/silk/docs/language/flow-break/page.md @@ -1,6 +1,5 @@ --- layout: "docs" -title: "break" description: "break exits the nearest enclosing loop." docsCollection: "silk" section: "language" diff --git a/src/silk/docs/language/flow-continue/page.md b/src/silk/docs/language/flow-continue/page.md index 904a6028..0480b8f5 100644 --- a/src/silk/docs/language/flow-continue/page.md +++ b/src/silk/docs/language/flow-continue/page.md @@ -1,6 +1,5 @@ --- layout: "docs" -title: "continue" description: "continue skips the remainder of the current loop iteration and jumps to the next iteration of the nearest enclosing loop." docsCollection: "silk" section: "language" diff --git a/src/silk/docs/language/flow-expression-statements/page.md b/src/silk/docs/language/flow-expression-statements/page.md index 25c274b5..128a1bc6 100644 --- a/src/silk/docs/language/flow-expression-statements/page.md +++ b/src/silk/docs/language/flow-expression-statements/page.md @@ -1,6 +1,5 @@ --- layout: "docs" -title: "Expression Statements" description: "Expression statements allow expressions to be used for their side effects." docsCollection: "silk" section: "language" diff --git a/src/silk/docs/language/flow-for/page.md b/src/silk/docs/language/flow-for/page.md index 826c06c6..c07d232f 100644 --- a/src/silk/docs/language/flow-for/page.md +++ b/src/silk/docs/language/flow-for/page.md @@ -1,6 +1,5 @@ --- layout: "docs" -title: "for Loop" description: "The for loop iterates over a range or iterable and executes a block once per element." docsCollection: "silk" section: "language" diff --git a/src/silk/docs/language/flow-if-else/page.md b/src/silk/docs/language/flow-if-else/page.md index c7f8571b..a5ec1c6a 100644 --- a/src/silk/docs/language/flow-if-else/page.md +++ b/src/silk/docs/language/flow-if-else/page.md @@ -1,6 +1,5 @@ --- layout: "docs" -title: "if / else" description: "The if / else construct provides branching based on a boolean condition." docsCollection: "silk" section: "language" diff --git a/src/silk/docs/language/flow-loop/page.md b/src/silk/docs/language/flow-loop/page.md index c7978296..580bb717 100644 --- a/src/silk/docs/language/flow-loop/page.md +++ b/src/silk/docs/language/flow-loop/page.md @@ -1,6 +1,5 @@ --- layout: "docs" -title: "loop Loop" description: "The loop statement executes a block repeatedly until it is terminated by a break or return." docsCollection: "silk" section: "language" diff --git a/src/silk/docs/language/flow-match/page.md b/src/silk/docs/language/flow-match/page.md index a0045bd2..547de0c9 100644 --- a/src/silk/docs/language/flow-match/page.md +++ b/src/silk/docs/language/flow-match/page.md @@ -1,6 +1,5 @@ --- layout: "docs" -title: "match Expression (and Statement)" description: "The match expression provides structured pattern matching." docsCollection: "silk" section: "language" diff --git a/src/silk/docs/language/flow-overview/page.md b/src/silk/docs/language/flow-overview/page.md index d21203b2..dbfba9ef 100644 --- a/src/silk/docs/language/flow-overview/page.md +++ b/src/silk/docs/language/flow-overview/page.md @@ -1,6 +1,5 @@ --- layout: "docs" -title: "Flow Control Overview" description: "Flow control describes how Silk programs sequence work, branch, loop, and exit. This concept spans several surface constructs and their static rules (typing, scoping, and diagnostics)." docsCollection: "silk" section: "language" diff --git a/src/silk/docs/language/flow-return/page.md b/src/silk/docs/language/flow-return/page.md index 337310e3..62d3a3c3 100644 --- a/src/silk/docs/language/flow-return/page.md +++ b/src/silk/docs/language/flow-return/page.md @@ -1,6 +1,5 @@ --- layout: "docs" -title: "return" description: "The return statement exits a function, optionally with a value." docsCollection: "silk" section: "language" diff --git a/src/silk/docs/language/flow-while/page.md b/src/silk/docs/language/flow-while/page.md index 4189a3c1..9861e0f5 100644 --- a/src/silk/docs/language/flow-while/page.md +++ b/src/silk/docs/language/flow-while/page.md @@ -1,6 +1,5 @@ --- layout: "docs" -title: "while Loop" description: "The while loop repeatedly executes a block while a boolean condition holds." docsCollection: "silk" section: "language" diff --git a/src/silk/docs/language/formal-verification/page.md b/src/silk/docs/language/formal-verification/page.md index b753a5d6..e3767106 100644 --- a/src/silk/docs/language/formal-verification/page.md +++ b/src/silk/docs/language/formal-verification/page.md @@ -1,6 +1,5 @@ --- layout: "docs" -title: "Formal Silk" description: "Formal Silk is Silk’s compile-time formal verification language. It is written using syntax that does not exist at runtime and is discharged at compile time using the Z3 SMT solver." docsCollection: "silk" section: "language" diff --git a/src/silk/docs/language/function-disciplines/page.md b/src/silk/docs/language/function-disciplines/page.md index ff1fa9aa..6f062cab 100644 --- a/src/silk/docs/language/function-disciplines/page.md +++ b/src/silk/docs/language/function-disciplines/page.md @@ -1,6 +1,5 @@ --- layout: "docs" -title: "Function Disciplines (pure, task, async)" description: "This document specifies Silk’s intended “function discipline” system: how functions declare whether they are pure, asynchronous, or safe to run as parallel tasks." docsCollection: "silk" section: "language" diff --git a/src/silk/docs/language/generics/page.md b/src/silk/docs/language/generics/page.md index b1b03c46..81595a04 100644 --- a/src/silk/docs/language/generics/page.md +++ b/src/silk/docs/language/generics/page.md @@ -1,6 +1,5 @@ --- layout: "docs" -title: "Generics (Monomorphized)" description: "This document specifies Silk’s parameterized type and declaration syntax." docsCollection: "silk" section: "language" diff --git a/src/silk/docs/language/gpu-execution/page.md b/src/silk/docs/language/gpu-execution/page.md index 7a4e4990..e0c86729 100644 --- a/src/silk/docs/language/gpu-execution/page.md +++ b/src/silk/docs/language/gpu-execution/page.md @@ -1,6 +1,5 @@ --- layout: "docs" -title: "GPU execution placement" description: "Silk functions run on the program's host CPU unless their declaration carries the GPU placement attribute:" docsCollection: "silk" section: "language" diff --git a/src/silk/docs/language/gpu-launch-blocks/page.md b/src/silk/docs/language/gpu-launch-blocks/page.md index 5352ef09..3b9c362c 100644 --- a/src/silk/docs/language/gpu-launch-blocks/page.md +++ b/src/silk/docs/language/gpu-launch-blocks/page.md @@ -1,6 +1,5 @@ --- layout: "docs" -title: "GPU launch blocks" description: "Silk provides a checked host-side form for launching one GPU kernel without importing a launch function or repeating the kernel name as a string:" docsCollection: "silk" section: "language" diff --git a/src/silk/docs/language/grammar/page.md b/src/silk/docs/language/grammar/page.md index cc808c5e..6de88806 100644 --- a/src/silk/docs/language/grammar/page.md +++ b/src/silk/docs/language/grammar/page.md @@ -1,6 +1,5 @@ --- layout: "docs" -title: "Formal Grammar Spec" description: "This document contains the formal grammar and lexical specification for Silk as used by the compiler implementation." docsCollection: "silk" section: "language" diff --git a/src/silk/docs/language/interfaces/page.md b/src/silk/docs/language/interfaces/page.md index 67b83b5a..c76b7576 100644 --- a/src/silk/docs/language/interfaces/page.md +++ b/src/silk/docs/language/interfaces/page.md @@ -1,6 +1,5 @@ --- layout: "docs" -title: "Interfaces" description: "Interfaces allow types to declare that they implement a particular contract. They are the foundation for standard-library “protocols” such as readers, writers, iterators, and allocators." docsCollection: "silk" section: "language" diff --git a/src/silk/docs/language/literals-aggregate/page.md b/src/silk/docs/language/literals-aggregate/page.md index b07dbddc..379042d9 100644 --- a/src/silk/docs/language/literals-aggregate/page.md +++ b/src/silk/docs/language/literals-aggregate/page.md @@ -1,6 +1,5 @@ --- layout: "docs" -title: "Aggregate Literals" description: "Aggregate literals cover arrays and structs." docsCollection: "silk" section: "language" diff --git a/src/silk/docs/language/literals-boolean/page.md b/src/silk/docs/language/literals-boolean/page.md index e4ad6459..1e147b13 100644 --- a/src/silk/docs/language/literals-boolean/page.md +++ b/src/silk/docs/language/literals-boolean/page.md @@ -1,6 +1,5 @@ --- layout: "docs" -title: "Boolean Literals" description: "Boolean literals are the two built-in logical values:" docsCollection: "silk" section: "language" diff --git a/src/silk/docs/language/literals-character/page.md b/src/silk/docs/language/literals-character/page.md index 43e4e8fd..f5273633 100644 --- a/src/silk/docs/language/literals-character/page.md +++ b/src/silk/docs/language/literals-character/page.md @@ -1,6 +1,5 @@ --- layout: "docs" -title: "Character Literals" description: "Character literals represent Unicode scalar values (code points) and have type char (types)." docsCollection: "silk" section: "language" diff --git a/src/silk/docs/language/literals-duration/page.md b/src/silk/docs/language/literals-duration/page.md index c8a435c8..deeb4fcd 100644 --- a/src/silk/docs/language/literals-duration/page.md +++ b/src/silk/docs/language/literals-duration/page.md @@ -1,6 +1,5 @@ --- layout: "docs" -title: "Duration Literals" description: "The Duration and Instant types have specialized literal support." docsCollection: "silk" section: "language" diff --git a/src/silk/docs/language/literals-numeric/page.md b/src/silk/docs/language/literals-numeric/page.md index 736a36bc..28135f23 100644 --- a/src/silk/docs/language/literals-numeric/page.md +++ b/src/silk/docs/language/literals-numeric/page.md @@ -1,6 +1,5 @@ --- layout: "docs" -title: "Numeric Literals" description: "Numeric literals produce integer (int, u8, i128, …) and floating-point (f32, f64, f128) values." docsCollection: "silk" section: "language" diff --git a/src/silk/docs/language/literals-overview/page.md b/src/silk/docs/language/literals-overview/page.md index c1a7939c..856a1e33 100644 --- a/src/silk/docs/language/literals-overview/page.md +++ b/src/silk/docs/language/literals-overview/page.md @@ -1,6 +1,5 @@ --- layout: "docs" -title: "Literals Overview" description: "This document provides a high-level overview of literals in Silk, with details split into dedicated documents for each category." docsCollection: "silk" section: "language" diff --git a/src/silk/docs/language/literals-regexp/page.md b/src/silk/docs/language/literals-regexp/page.md index 6cda1b4f..947c4139 100644 --- a/src/silk/docs/language/literals-regexp/page.md +++ b/src/silk/docs/language/literals-regexp/page.md @@ -1,6 +1,5 @@ --- layout: "docs" -title: "Regular Expression Literals" description: "Regular expression literals represent regexp values: compiled regular expression bytecode that can be used by std::regex helpers." docsCollection: "silk" section: "language" diff --git a/src/silk/docs/language/literals-string/page.md b/src/silk/docs/language/literals-string/page.md index 2fe1141c..36472960 100644 --- a/src/silk/docs/language/literals-string/page.md +++ b/src/silk/docs/language/literals-string/page.md @@ -1,6 +1,5 @@ --- layout: "docs" -title: "String Literals" description: "String literals represent string values: immutable, length-tracked sequences of bytes that are typically interpreted as UTF-8 text." docsCollection: "silk" section: "language" diff --git a/src/silk/docs/language/memory-model/page.md b/src/silk/docs/language/memory-model/page.md index 6087009c..2afe4001 100644 --- a/src/silk/docs/language/memory-model/page.md +++ b/src/silk/docs/language/memory-model/page.md @@ -1,6 +1,5 @@ --- layout: "docs" -title: "Memory Model (Stack, Heap, and Moves)" description: "This document specifies Silk’s intended memory model: how values are allocated, passed, and how (future) heap-managed values interact with the type system." docsCollection: "silk" section: "language" diff --git a/src/silk/docs/language/mutability/page.md b/src/silk/docs/language/mutability/page.md index 22abc3db..5ebc280d 100644 --- a/src/silk/docs/language/mutability/page.md +++ b/src/silk/docs/language/mutability/page.md @@ -1,6 +1,5 @@ --- layout: "docs" -title: "Mutability" description: "Mutability in Silk is “safe by default”: values are immutable unless explicitly marked mutable under clear rules using the mut keyword." docsCollection: "silk" section: "language" diff --git a/src/silk/docs/language/operators/page.md b/src/silk/docs/language/operators/page.md index 1517fa68..15ad91bb 100644 --- a/src/silk/docs/language/operators/page.md +++ b/src/silk/docs/language/operators/page.md @@ -1,6 +1,5 @@ --- layout: "docs" -title: "Operators" description: "This document summarizes the operator set and precedence for Silk." docsCollection: "silk" section: "language" diff --git a/src/silk/docs/language/optional/page.md b/src/silk/docs/language/optional/page.md index 6ae0278f..db924240 100644 --- a/src/silk/docs/language/optional/page.md +++ b/src/silk/docs/language/optional/page.md @@ -1,6 +1,5 @@ --- layout: "docs" -title: "Optional" description: "The Optional type provides a safe way to represent values that may or may not be present, instead of relying on sentinel values such as null." docsCollection: "silk" section: "language" diff --git a/src/silk/docs/language/packages-imports-exports/page.md b/src/silk/docs/language/packages-imports-exports/page.md index 25679610..2c0e52c2 100644 --- a/src/silk/docs/language/packages-imports-exports/page.md +++ b/src/silk/docs/language/packages-imports-exports/page.md @@ -1,6 +1,5 @@ --- layout: "docs" -title: "Packages, Imports, and Exports" description: "This document specifies the initial surface syntax for packages, imports, and exports in Silk. The semantics are intentionally minimal for now and will be extended as the compiler’s resolver and linke" docsCollection: "silk" section: "language" diff --git a/src/silk/docs/language/regions/page.md b/src/silk/docs/language/regions/page.md index a9e36520..85074105 100644 --- a/src/silk/docs/language/regions/page.md +++ b/src/silk/docs/language/regions/page.md @@ -1,6 +1,5 @@ --- layout: "docs" -title: "Regions" description: "Regions provide a fixed-size, statically allocated block of memory that can be used as an allocation context for new." docsCollection: "silk" section: "language" diff --git a/src/silk/docs/language/struct-requirements/page.md b/src/silk/docs/language/struct-requirements/page.md index f45e7e97..879eeca8 100644 --- a/src/silk/docs/language/struct-requirements/page.md +++ b/src/silk/docs/language/struct-requirements/page.md @@ -1,6 +1,5 @@ --- layout: "docs" -title: "Struct Requirements (#require)" description: "Use #require on a struct to state requirements that must hold for all values constructed for that struct type." docsCollection: "silk" section: "language" diff --git a/src/silk/docs/language/structs-impls-layout/page.md b/src/silk/docs/language/structs-impls-layout/page.md index 5d73011b..25f119a0 100644 --- a/src/silk/docs/language/structs-impls-layout/page.md +++ b/src/silk/docs/language/structs-impls-layout/page.md @@ -1,6 +1,5 @@ --- layout: "docs" -title: "Structs, Impl Blocks, and Memory Layout" description: "Structs and impl blocks are separated:" docsCollection: "silk" section: "language" diff --git a/src/silk/docs/language/syntax-tour/page.md b/src/silk/docs/language/syntax-tour/page.md index 540cfd48..8c25302a 100644 --- a/src/silk/docs/language/syntax-tour/page.md +++ b/src/silk/docs/language/syntax-tour/page.md @@ -1,6 +1,5 @@ --- layout: "docs" -title: "Silk Syntax Tour (Soup to Nuts)" description: "This document is an example-driven tour of Silk’s surface syntax, from a single-file “hello world” through modules/packages, declarations, statements, expressions, and the Formal Silk verification dir" docsCollection: "silk" section: "language" diff --git a/src/silk/docs/language/target-metadata/page.md b/src/silk/docs/language/target-metadata/page.md index 0517b642..11803725 100644 --- a/src/silk/docs/language/target-metadata/page.md +++ b/src/silk/docs/language/target-metadata/page.md @@ -1,6 +1,5 @@ --- layout: "docs" -title: "Target Metadata (OS_PLATFORM, OS_ARCH, OS_IS_UNIX, OS_IS_POSIX)" description: "Silk exposes a small set of compiler-provided target metadata values to both runtime code and Formal Silk (compile-time verification)." docsCollection: "silk" section: "language" diff --git a/src/silk/docs/language/testing/page.md b/src/silk/docs/language/testing/page.md index 582db39a..93310573 100644 --- a/src/silk/docs/language/testing/page.md +++ b/src/silk/docs/language/testing/page.md @@ -1,6 +1,5 @@ --- layout: "docs" -title: "Testing" description: "This document specifies the initial language-level testing surface for Silk." docsCollection: "silk" section: "language" diff --git a/src/silk/docs/language/toolchain-metadata/page.md b/src/silk/docs/language/toolchain-metadata/page.md index f60a9f53..824fbef0 100644 --- a/src/silk/docs/language/toolchain-metadata/page.md +++ b/src/silk/docs/language/toolchain-metadata/page.md @@ -1,6 +1,5 @@ --- layout: "docs" -title: "Toolchain Metadata (SILK_VERSION, SILK_ABI_VERSION, SILK_GIT_COMMIT)" description: "Silk exposes a small set of compiler-provided toolchain metadata values to:" docsCollection: "silk" section: "language" diff --git a/src/silk/docs/language/type-unions/page.md b/src/silk/docs/language/type-unions/page.md index 5ba64d90..f6eab3bf 100644 --- a/src/silk/docs/language/type-unions/page.md +++ b/src/silk/docs/language/type-unions/page.md @@ -1,6 +1,5 @@ --- layout: "docs" -title: "Type Unions (T1 | T2 | ...)" description: "Silk supports type unions in type annotations. A union type represents a value that is exactly one of several member types." docsCollection: "silk" section: "language" diff --git a/src/silk/docs/language/typed-errors/page.md b/src/silk/docs/language/typed-errors/page.md index f096e726..d2e948be 100644 --- a/src/silk/docs/language/typed-errors/page.md +++ b/src/silk/docs/language/typed-errors/page.md @@ -1,6 +1,5 @@ --- layout: "docs" -title: "Typed Errors (error, panic, and T | ErrorType...)" description: "Silk’s typed error system exists to eliminate the “trust gap” between a function’s signature and its real behavior. There are no hidden exceptions and no implicit panic channel: if a function can term" docsCollection: "silk" section: "language" diff --git a/src/silk/docs/language/types/page.md b/src/silk/docs/language/types/page.md index a4636e93..79fcaa40 100644 --- a/src/silk/docs/language/types/page.md +++ b/src/silk/docs/language/types/page.md @@ -1,6 +1,5 @@ --- layout: "docs" -title: "Types" description: "This document specifies the Silk type system used by the compiler front-end and type checker." docsCollection: "silk" section: "language" diff --git a/src/silk/docs/language/using/page.md b/src/silk/docs/language/using/page.md index d3271f1d..0ddea89d 100644 --- a/src/silk/docs/language/using/page.md +++ b/src/silk/docs/language/using/page.md @@ -1,6 +1,5 @@ --- layout: "docs" -title: "using (Aliases and Method Reuse)" description: "using introduces a local alias to an existing symbol, and (in interface / impl bodies) can import method signatures/implementations under a new name." docsCollection: "silk" section: "language" diff --git a/src/silk/docs/language/varargs/page.md b/src/silk/docs/language/varargs/page.md index 63dd5d88..f98134ca 100644 --- a/src/silk/docs/language/varargs/page.md +++ b/src/silk/docs/language/varargs/page.md @@ -1,6 +1,5 @@ --- layout: "docs" -title: "Varargs (Variable Arguments)" description: "Silk supports declaring functions that accept a variable number of trailing arguments (“varargs”). This is used heavily by std::io::print / std::io::println for formatted output." docsCollection: "silk" section: "language" diff --git a/src/silk/docs/man/libsilk.7/page.md b/src/silk/docs/man/libsilk.7/page.md index 6b825583..6619d769 100644 --- a/src/silk/docs/man/libsilk.7/page.md +++ b/src/silk/docs/man/libsilk.7/page.md @@ -1,6 +1,5 @@ --- layout: "docs" -title: "[libsilk(7)](?p=man/libsilk.7) — C99 ABI for the Silk Compiler" description: "NOTE: This is the Markdown source for a man 7 page describing the C99 embedding ABI exposed by libsilk.a. The roff-formatted manpage should be generated from this content." docsCollection: "silk" section: "man" diff --git a/src/silk/docs/man/silk-build.1/page.md b/src/silk/docs/man/silk-build.1/page.md index f571ecc7..8672fcab 100644 --- a/src/silk/docs/man/silk-build.1/page.md +++ b/src/silk/docs/man/silk-build.1/page.md @@ -1,6 +1,5 @@ --- layout: "docs" -title: "[silk-build(1)](?p=man/silk-build.1) — Build Silk Artifacts" description: "NOTE: This is the Markdown source for the eventual man 1 page for silk build. The roff-formatted manpage should be generated from this content." docsCollection: "silk" section: "man" diff --git a/src/silk/docs/man/silk-cache.1/page.md b/src/silk/docs/man/silk-cache.1/page.md index 2006ee2a..eb845df0 100644 --- a/src/silk/docs/man/silk-cache.1/page.md +++ b/src/silk/docs/man/silk-cache.1/page.md @@ -1,6 +1,5 @@ --- layout: "docs" -title: "[silk-cache(1)](?p=man/silk-cache.1) — Inspect and Maintain the Managed Silk Cache" description: "NOTE: This is the Markdown source for the eventual man 1 page for silk cache. The roff-formatted manpage should be generated from this content." docsCollection: "silk" section: "man" diff --git a/src/silk/docs/man/silk-cc.1/page.md b/src/silk/docs/man/silk-cc.1/page.md index 383ff775..b2585d70 100644 --- a/src/silk/docs/man/silk-cc.1/page.md +++ b/src/silk/docs/man/silk-cc.1/page.md @@ -1,6 +1,5 @@ --- layout: "docs" -title: "[silk-cc(1)](?p=man/silk-cc.1) — C Compiler Wrapper for libsilk" description: "NOTE: This is the Markdown source for the eventual man 1 page for silk cc. The roff-formatted manpage should be generated from this content." docsCollection: "silk" section: "man" diff --git a/src/silk/docs/man/silk-check.1/page.md b/src/silk/docs/man/silk-check.1/page.md index f32e5970..be67907c 100644 --- a/src/silk/docs/man/silk-check.1/page.md +++ b/src/silk/docs/man/silk-check.1/page.md @@ -1,6 +1,5 @@ --- layout: "docs" -title: "[silk-check(1)](?p=man/silk-check.1) — Parse and Type-Check" description: "NOTE: This is the Markdown source for the eventual man 1 page for silk check. The roff-formatted manpage should be generated from this content." docsCollection: "silk" section: "man" diff --git a/src/silk/docs/man/silk-codesign.1/page.md b/src/silk/docs/man/silk-codesign.1/page.md index a9806de6..dc5f975a 100644 --- a/src/silk/docs/man/silk-codesign.1/page.md +++ b/src/silk/docs/man/silk-codesign.1/page.md @@ -1,6 +1,5 @@ --- layout: "docs" -title: "[silk-codesign(1)](?p=man/silk-codesign.1) - Sign And Verify Platform Artifacts" description: "NOTE: This is the Markdown source for the eventual man 1 page for silk codesign. The roff-formatted manpage should be generated from this content." docsCollection: "silk" section: "man" diff --git a/src/silk/docs/man/silk-devices.1/page.md b/src/silk/docs/man/silk-devices.1/page.md index 792bca2c..ad49be69 100644 --- a/src/silk/docs/man/silk-devices.1/page.md +++ b/src/silk/docs/man/silk-devices.1/page.md @@ -1,6 +1,5 @@ --- layout: "docs" -title: "[silk-devices(1)](?p=man/silk-devices.1) - Manage Platform Devices And App Lifecycles" description: "NOTE: This is the Markdown source for the eventual man 1 page for silk devices. The roff-formatted manpage should be generated from this content." docsCollection: "silk" section: "man" diff --git a/src/silk/docs/man/silk-doc.1/page.md b/src/silk/docs/man/silk-doc.1/page.md index 86bcf0e2..201b54ef 100644 --- a/src/silk/docs/man/silk-doc.1/page.md +++ b/src/silk/docs/man/silk-doc.1/page.md @@ -1,6 +1,5 @@ --- layout: "docs" -title: "[silk-doc(1)](?p=man/silk-doc.1) — Generate Documentation (Markdown or Manpages)" description: "NOTE: This is the Markdown source for the eventual man 1 page for silk doc. The roff-formatted manpage should be generated from this content." docsCollection: "silk" section: "man" diff --git a/src/silk/docs/man/silk-env.1/page.md b/src/silk/docs/man/silk-env.1/page.md index 69b46824..edff3af7 100644 --- a/src/silk/docs/man/silk-env.1/page.md +++ b/src/silk/docs/man/silk-env.1/page.md @@ -1,6 +1,5 @@ --- layout: "docs" -title: "[silk-env(1)](?p=man/silk-env.1) — Print silk CLI Environment" description: "NOTE: This is the Markdown source for the eventual man 1 page for silk env. The roff-formatted manpage should be generated from this content." docsCollection: "silk" section: "man" diff --git a/src/silk/docs/man/silk-error.1/page.md b/src/silk/docs/man/silk-error.1/page.md index e76e4f5a..b6f5b5b2 100644 --- a/src/silk/docs/man/silk-error.1/page.md +++ b/src/silk/docs/man/silk-error.1/page.md @@ -1,6 +1,5 @@ --- layout: "docs" -title: "[silk-error(1)](?p=man/silk-error.1) — Explain Compiler Diagnostic Codes" description: "NOTE: This is the Markdown source for the eventual man 1 page for silk error. The roff-formatted manpage should be generated from this content." docsCollection: "silk" section: "man" diff --git a/src/silk/docs/man/silk-format.1/page.md b/src/silk/docs/man/silk-format.1/page.md index c7c3ce43..1f2dfff3 100644 --- a/src/silk/docs/man/silk-format.1/page.md +++ b/src/silk/docs/man/silk-format.1/page.md @@ -1,6 +1,5 @@ --- layout: "docs" -title: "[silk-format(1)](?p=man/silk-format.1) — Format Silk Source Files" description: "NOTE: This is the Markdown source for the eventual man 1 page for silk format. The roff-formatted manpage should be generated from this content." docsCollection: "silk" section: "man" diff --git a/src/silk/docs/man/silk-graph.1/page.md b/src/silk/docs/man/silk-graph.1/page.md index cac82b3e..57ac270c 100644 --- a/src/silk/docs/man/silk-graph.1/page.md +++ b/src/silk/docs/man/silk-graph.1/page.md @@ -1,6 +1,5 @@ --- layout: "docs" -title: "[silk-graph(1)](?p=man/silk-graph.1) - Inspect Module Graphs" description: "NOTE: This is the Markdown source for the eventual man 1 page for silk graph. The roff-formatted manpage should be generated from this content." docsCollection: "silk" section: "man" diff --git a/src/silk/docs/man/silk-guide.1/page.md b/src/silk/docs/man/silk-guide.1/page.md index 4195fce5..a312e077 100644 --- a/src/silk/docs/man/silk-guide.1/page.md +++ b/src/silk/docs/man/silk-guide.1/page.md @@ -1,6 +1,5 @@ --- layout: "docs" -title: "[silk-guide(1)](?p=man/silk-guide.1) — Search Curated Silk Example Guides" description: "NOTE: This is the Markdown source for the eventual man 1 page for silk guide. The roff-formatted manpage should be generated from this content." docsCollection: "silk" section: "man" diff --git a/src/silk/docs/man/silk-help.1/page.md b/src/silk/docs/man/silk-help.1/page.md index 0697d4c1..81e2bab7 100644 --- a/src/silk/docs/man/silk-help.1/page.md +++ b/src/silk/docs/man/silk-help.1/page.md @@ -1,6 +1,5 @@ --- layout: "docs" -title: "[silk-help(1)](?p=man/silk-help.1) - Show Silk CLI Help" description: "NOTE: This is the Markdown source for the eventual man 1 page for silk help. The roff-formatted manpage should be generated from this content." docsCollection: "silk" section: "man" diff --git a/src/silk/docs/man/silk-lsp.1/page.md b/src/silk/docs/man/silk-lsp.1/page.md index da740d7b..a56ab50d 100644 --- a/src/silk/docs/man/silk-lsp.1/page.md +++ b/src/silk/docs/man/silk-lsp.1/page.md @@ -1,6 +1,5 @@ --- layout: "docs" -title: "[silk-lsp(1)](?p=man/silk-lsp.1) — Language Server Protocol (LSP) Server" description: "NOTE: This is the Markdown source for the eventual man 1 page for silk-lsp. The roff-formatted manpage should be generated from this content." docsCollection: "silk" section: "man" diff --git a/src/silk/docs/man/silk-man.1/page.md b/src/silk/docs/man/silk-man.1/page.md index b439d990..ca8adb66 100644 --- a/src/silk/docs/man/silk-man.1/page.md +++ b/src/silk/docs/man/silk-man.1/page.md @@ -1,6 +1,5 @@ --- layout: "docs" -title: "[silk-man(1)](?p=man/silk-man.1) — View Manpages Derived from Source Docs" description: "NOTE: This is the Markdown source for the eventual man 1 page for silk man. The roff-formatted manpage should be generated from this content." docsCollection: "silk" section: "man" diff --git a/src/silk/docs/man/silk-package.1/page.md b/src/silk/docs/man/silk-package.1/page.md index 33fc4bf9..ce7850fb 100644 --- a/src/silk/docs/man/silk-package.1/page.md +++ b/src/silk/docs/man/silk-package.1/page.md @@ -1,6 +1,5 @@ --- layout: "docs" -title: "[silk-package(1)](?p=man/silk-package.1) — Inspect And Lint Silk Packages" description: "NOTE: This is the Markdown source for the eventual man 1 page for silk package. The roff-formatted manpage should be generated from this content." docsCollection: "silk" section: "man" diff --git a/src/silk/docs/man/silk-proto.1/page.md b/src/silk/docs/man/silk-proto.1/page.md index 43c5c691..b9d84ee0 100644 --- a/src/silk/docs/man/silk-proto.1/page.md +++ b/src/silk/docs/man/silk-proto.1/page.md @@ -1,6 +1,5 @@ --- layout: "docs" -title: "[silk-proto(1)](?p=man/silk-proto.1) — compile proto3 schemas to Silk" description: "NOTE: This is the Markdown source for the eventual man 1 page for silk proto. The roff-formatted manpage should be generated from this content." docsCollection: "silk" section: "man" diff --git a/src/silk/docs/man/silk-repl.1/page.md b/src/silk/docs/man/silk-repl.1/page.md index 14af7530..64fa75fa 100644 --- a/src/silk/docs/man/silk-repl.1/page.md +++ b/src/silk/docs/man/silk-repl.1/page.md @@ -1,6 +1,5 @@ --- layout: "docs" -title: "[silk-repl(1)](?p=man/silk-repl.1) - Interactive Silk REPL" description: "NOTE: This is the Markdown source for the eventual man 1 page for silk repl. The roff-formatted manpage should be generated from this content." docsCollection: "silk" section: "man" diff --git a/src/silk/docs/man/silk-size.1/page.md b/src/silk/docs/man/silk-size.1/page.md index 06d254fa..de435cda 100644 --- a/src/silk/docs/man/silk-size.1/page.md +++ b/src/silk/docs/man/silk-size.1/page.md @@ -1,6 +1,5 @@ --- layout: "docs" -title: "[silk-size(1)](?p=man/silk-size.1) - Inspect Artifact Sizes" description: "NOTE: This is the Markdown source for the eventual man 1 page for silk size. The roff-formatted manpage should be generated from this content." docsCollection: "silk" section: "man" diff --git a/src/silk/docs/man/silk-targets.1/page.md b/src/silk/docs/man/silk-targets.1/page.md index df841f59..47356e68 100644 --- a/src/silk/docs/man/silk-targets.1/page.md +++ b/src/silk/docs/man/silk-targets.1/page.md @@ -1,6 +1,5 @@ --- layout: "docs" -title: "[silk-targets(1)](?p=man/silk-targets.1) - Inspect Target Capabilities" description: "NOTE: This is the Markdown source for the eventual man 1 page for silk targets. The roff-formatted manpage should be generated from this content." docsCollection: "silk" section: "man" diff --git a/src/silk/docs/man/silk-test.1/page.md b/src/silk/docs/man/silk-test.1/page.md index 5c0b1958..8be8c907 100644 --- a/src/silk/docs/man/silk-test.1/page.md +++ b/src/silk/docs/man/silk-test.1/page.md @@ -1,6 +1,5 @@ --- layout: "docs" -title: "[silk-test(1)](?p=man/silk-test.1) — Run Language-Level Tests" description: "NOTE: This is the Markdown source for the eventual man 1 page for silk test. The roff-formatted manpage should be generated from this content." docsCollection: "silk" section: "man" diff --git a/src/silk/docs/man/silk.1/page.md b/src/silk/docs/man/silk.1/page.md index 66e0ef18..53dae295 100644 --- a/src/silk/docs/man/silk.1/page.md +++ b/src/silk/docs/man/silk.1/page.md @@ -1,6 +1,5 @@ --- layout: "docs" -title: "[silk(1)](?p=man/silk.1) — Silk Language Compiler" description: "NOTE: This is the Markdown source for the eventual man 1 page for silk. The roff-formatted manpage should be generated from this content." docsCollection: "silk" section: "man" diff --git a/src/silk/docs/man/silk.7/page.md b/src/silk/docs/man/silk.7/page.md index 4cc85552..6cb8aace 100644 --- a/src/silk/docs/man/silk.7/page.md +++ b/src/silk/docs/man/silk.7/page.md @@ -1,6 +1,5 @@ --- layout: "docs" -title: "[silk(7)](?p=man/silk.7) — Silk Toolchain Overview" description: "NOTE: This is the Markdown source for the eventual man 7 page for Silk. The roff-formatted manpage should be generated from this content." docsCollection: "silk" section: "man" diff --git a/src/silk/docs/man/silk_abi_get_version.3/page.md b/src/silk/docs/man/silk_abi_get_version.3/page.md index 145726bb..47494fd0 100644 --- a/src/silk/docs/man/silk_abi_get_version.3/page.md +++ b/src/silk/docs/man/silk_abi_get_version.3/page.md @@ -1,6 +1,5 @@ --- layout: "docs" -title: "[silk_abi_get_version(3)](?p=man/silk_abi_get_version.3) — Query the libsilk ABI Version" description: "NOTE: This is the Markdown source for the eventual man 3 page for silk_abi_get_version. The roff-formatted manpage should be generated from this content." docsCollection: "silk" section: "man" diff --git a/src/silk/docs/man/silk_amdgpu_aql_dispatch_packet_build.3/page.md b/src/silk/docs/man/silk_amdgpu_aql_dispatch_packet_build.3/page.md index 9d79f34b..eeadf25a 100644 --- a/src/silk/docs/man/silk_amdgpu_aql_dispatch_packet_build.3/page.md +++ b/src/silk/docs/man/silk_amdgpu_aql_dispatch_packet_build.3/page.md @@ -1,6 +1,5 @@ --- layout: "docs" -title: "[silk_amdgpu_aql_dispatch_packet_build(3)](?p=man/silk_amdgpu_aql_dispatch_packet_build.3) — Serialize AMDGPU AQL Dispatch Packets" description: "NOTE: This is the Markdown source for the eventual man 3 page for the AMDGPU AQL packet helper. The roff-formatted manpage should be generated from this content." docsCollection: "silk" section: "man" diff --git a/src/silk/docs/man/silk_bytes.3/page.md b/src/silk/docs/man/silk_bytes.3/page.md index 20dfeb99..28bb680c 100644 --- a/src/silk/docs/man/silk_bytes.3/page.md +++ b/src/silk/docs/man/silk_bytes.3/page.md @@ -1,6 +1,5 @@ --- layout: "docs" -title: "[silk_bytes(3)](?p=man/silk_bytes.3) — Manage Owned Build Output Buffers" description: "NOTE: This is the Markdown source for the eventual man 3 page for SilkBytes output buffers. The roff-formatted manpage should be generated from this content." docsCollection: "silk" section: "man" diff --git a/src/silk/docs/man/silk_compiler.3/page.md b/src/silk/docs/man/silk_compiler.3/page.md index e817c5f3..01d5ce77 100644 --- a/src/silk/docs/man/silk_compiler.3/page.md +++ b/src/silk/docs/man/silk_compiler.3/page.md @@ -1,6 +1,5 @@ --- layout: "docs" -title: "[silk_compiler(3)](?p=man/silk_compiler.3) — Embed the Silk Compiler" description: "NOTE: This is the Markdown source for the eventual man 3 page for the SilkCompiler embedding API. The roff-formatted manpage should be generated from this content." docsCollection: "silk" section: "man" diff --git a/src/silk/docs/man/silk_error.3/page.md b/src/silk/docs/man/silk_error.3/page.md index 403bc989..c7e85d70 100644 --- a/src/silk/docs/man/silk_error.3/page.md +++ b/src/silk/docs/man/silk_error.3/page.md @@ -1,6 +1,5 @@ --- layout: "docs" -title: "[silk_error(3)](?p=man/silk_error.3) — Retrieve and Format Compiler Errors" description: "NOTE: This is the Markdown source for the eventual man 3 page for SilkError formatting and retrieval. The roff-formatted manpage should be generated from this content." docsCollection: "silk" section: "man" diff --git a/src/silk/docs/man/slc.1/page.md b/src/silk/docs/man/slc.1/page.md index 01ba9898..f23415d0 100644 --- a/src/silk/docs/man/slc.1/page.md +++ b/src/silk/docs/man/slc.1/page.md @@ -1,6 +1,5 @@ --- layout: "docs" -title: "[slc(1)](?p=man/slc.1) — Alias of silk build" description: "NOTE: This is the Markdown source for the eventual man 1 page for slc. The roff-formatted manpage should be generated from this content." docsCollection: "silk" section: "man" diff --git a/src/silk/docs/man/slcc.1/page.md b/src/silk/docs/man/slcc.1/page.md index 80829dc1..fa217d8f 100644 --- a/src/silk/docs/man/slcc.1/page.md +++ b/src/silk/docs/man/slcc.1/page.md @@ -1,6 +1,5 @@ --- layout: "docs" -title: "[slcc(1)](?p=man/slcc.1) — Alias of silk cc" description: "NOTE: This is the Markdown source for the eventual man 1 page for slcc. The roff-formatted manpage should be generated from this content." docsCollection: "silk" section: "man" diff --git a/src/silk/docs/page.md b/src/silk/docs/page.md index dd4487db..0f5b32fe 100644 --- a/src/silk/docs/page.md +++ b/src/silk/docs/page.md @@ -1,6 +1,5 @@ --- layout: "docs" -title: "Silk Documentation" description: "Silk is a high performance general purpose programming language with formal verification built in. Silk targets computer systems, mobile / tablet devices, WASM / WASI runtimes, and the web." docsCollection: "silk" section: "overview" diff --git a/src/silk/docs/std/abort-controller/page.md b/src/silk/docs/std/abort-controller/page.md index eb49e9b8..896d1433 100644 --- a/src/silk/docs/std/abort-controller/page.md +++ b/src/silk/docs/std/abort-controller/page.md @@ -1,6 +1,5 @@ --- layout: "docs" -title: "std::abort_controller" description: "This module provides a WHATWG-style AbortController / AbortSignal pair for cooperative cancellation across async functions and OS-thread-backed task concurrency." docsCollection: "silk" section: "std" diff --git a/src/silk/docs/std/abort_controller/page.md b/src/silk/docs/std/abort_controller/page.md index e702125a..9ceb557e 100644 --- a/src/silk/docs/std/abort_controller/page.md +++ b/src/silk/docs/std/abort_controller/page.md @@ -1,6 +1,5 @@ --- layout: "docs" -title: "std::abort_controller" description: "This is the canonical module doc for std::abort_controller." docsCollection: "silk" section: "std" diff --git a/src/silk/docs/std/algorithms/page.md b/src/silk/docs/std/algorithms/page.md index 4bd8baeb..783733dc 100644 --- a/src/silk/docs/std/algorithms/page.md +++ b/src/silk/docs/std/algorithms/page.md @@ -1,6 +1,5 @@ --- layout: "docs" -title: "std::algorithms" description: "This describes intended algorithm APIs; it is not implemented yet." docsCollection: "silk" section: "std" diff --git a/src/silk/docs/std/args/page.md b/src/silk/docs/std/args/page.md index 07bad5ad..4760c57c 100644 --- a/src/silk/docs/std/args/page.md +++ b/src/silk/docs/std/args/page.md @@ -1,6 +1,5 @@ --- layout: "docs" -title: "std::args" description: "A small native-argv helper surface is implemented in std/args.slk to make early programs ergonomic while string[] parameters and richer slice/iterator features are still future work." docsCollection: "silk" section: "std" diff --git a/src/silk/docs/std/arrays/page.md b/src/silk/docs/std/arrays/page.md index 24a42a55..687ebc8e 100644 --- a/src/silk/docs/std/arrays/page.md +++ b/src/silk/docs/std/arrays/page.md @@ -1,6 +1,5 @@ --- layout: "docs" -title: "std::arrays" description: "A generic Slice(T) view type is provided for early FFI-friendly bridging; higher-level owning containers live in std::vector." docsCollection: "silk" section: "std" diff --git a/src/silk/docs/std/atomic/page.md b/src/silk/docs/std/atomic/page.md index f0bc2a78..7c510903 100644 --- a/src/silk/docs/std/atomic/page.md +++ b/src/silk/docs/std/atomic/page.md @@ -1,6 +1,5 @@ --- layout: "docs" -title: "std::atomic" description: "std::atomic provides the public Silk API for low-level atomic operations." docsCollection: "silk" section: "std" diff --git a/src/silk/docs/std/bits/page.md b/src/silk/docs/std/bits/page.md index 8a463b7d..d4c60d69 100644 --- a/src/silk/docs/std/bits/page.md +++ b/src/silk/docs/std/bits/page.md @@ -1,6 +1,5 @@ --- layout: "docs" -title: "std::bits" description: "A small bit-manipulation and byte-order helper subset is implemented in std/bits.slk for the current backend subset." docsCollection: "silk" section: "std" diff --git a/src/silk/docs/std/boolean/page.md b/src/silk/docs/std/boolean/page.md index 634890de..a1f824a4 100644 --- a/src/silk/docs/std/boolean/page.md +++ b/src/silk/docs/std/boolean/page.md @@ -1,6 +1,5 @@ --- layout: "docs" -title: "std::boolean" description: "std::boolean provides a no-allocation boxed wrapper around the built-in bool primitive for method-oriented APIs." docsCollection: "silk" section: "std" diff --git a/src/silk/docs/std/boxed-values/page.md b/src/silk/docs/std/boxed-values/page.md index 9526d2b5..d72bce34 100644 --- a/src/silk/docs/std/boxed-values/page.md +++ b/src/silk/docs/std/boxed-values/page.md @@ -1,6 +1,5 @@ --- layout: "docs" -title: "Boxed Value Types" description: "This document records the current design direction for boxed stdlib wrappers around language primitive values and primitive-adjacent built-ins." docsCollection: "silk" section: "std" diff --git a/src/silk/docs/std/buffer/page.md b/src/silk/docs/std/buffer/page.md index 431660dd..485f58ff 100644 --- a/src/silk/docs/std/buffer/page.md +++ b/src/silk/docs/std/buffer/page.md @@ -1,6 +1,5 @@ --- layout: "docs" -title: "std::buffer" description: "std::buffer provides:" docsCollection: "silk" section: "std" diff --git a/src/silk/docs/std/build/page.md b/src/silk/docs/std/build/page.md index 10a99763..e76ec4f1 100644 --- a/src/silk/docs/std/build/page.md +++ b/src/silk/docs/std/build/page.md @@ -1,6 +1,5 @@ --- layout: "docs" -title: "std::build" description: "(manifest builder + step graph)." docsCollection: "silk" section: "std" diff --git a/src/silk/docs/std/bytes/page.md b/src/silk/docs/std/bytes/page.md index 18e23150..72bd3866 100644 --- a/src/silk/docs/std/bytes/page.md +++ b/src/silk/docs/std/bytes/page.md @@ -1,6 +1,5 @@ --- layout: "docs" -title: "std::bytes" description: "std::bytes is the byte-oriented facade for allocation-free work over borrowed memory. It reuses std::arrays::ByteSlice as the concrete slice type and gives CLI/search/build tools short, stable names f" docsCollection: "silk" section: "std" diff --git a/src/silk/docs/std/conventions/page.md b/src/silk/docs/std/conventions/page.md index 402cd468..fbd1afb5 100644 --- a/src/silk/docs/std/conventions/page.md +++ b/src/silk/docs/std/conventions/page.md @@ -1,6 +1,5 @@ --- layout: "docs" -title: "std:: Conventions" description: "This defines the intended conventions for the Silk standard library. New and refactored std:: APIs must follow this document; older surfaces may temporarily diverge but must be migrated as they are to" docsCollection: "silk" section: "std" diff --git a/src/silk/docs/std/crypto-aead/page.md b/src/silk/docs/std/crypto-aead/page.md index 81399939..6da6306e 100644 --- a/src/silk/docs/std/crypto-aead/page.md +++ b/src/silk/docs/std/crypto-aead/page.md @@ -1,6 +1,5 @@ --- layout: "docs" -title: "std::crypto::aead" description: "Source: std/crypto/aead.slk" docsCollection: "silk" section: "std" diff --git a/src/silk/docs/std/crypto-box/page.md b/src/silk/docs/std/crypto-box/page.md index 0abd26f1..4face351 100644 --- a/src/silk/docs/std/crypto-box/page.md +++ b/src/silk/docs/std/crypto-box/page.md @@ -1,6 +1,5 @@ --- layout: "docs" -title: "std::crypto::box" description: "Source: std/crypto/box.slk" docsCollection: "silk" section: "std" diff --git a/src/silk/docs/std/crypto-hash/page.md b/src/silk/docs/std/crypto-hash/page.md index 7ba99136..0facbdc2 100644 --- a/src/silk/docs/std/crypto-hash/page.md +++ b/src/silk/docs/std/crypto-hash/page.md @@ -1,6 +1,5 @@ --- layout: "docs" -title: "std::crypto::hash" description: "Source: std/crypto/hash.slk" docsCollection: "silk" section: "std" diff --git a/src/silk/docs/std/crypto-random/page.md b/src/silk/docs/std/crypto-random/page.md index fbe372fe..5a2cfac6 100644 --- a/src/silk/docs/std/crypto-random/page.md +++ b/src/silk/docs/std/crypto-random/page.md @@ -1,6 +1,5 @@ --- layout: "docs" -title: "std::crypto::random" description: "Source: std/crypto/random.slk" docsCollection: "silk" section: "std" diff --git a/src/silk/docs/std/crypto-secretbox/page.md b/src/silk/docs/std/crypto-secretbox/page.md index 24a613c4..393b1b17 100644 --- a/src/silk/docs/std/crypto-secretbox/page.md +++ b/src/silk/docs/std/crypto-secretbox/page.md @@ -1,6 +1,5 @@ --- layout: "docs" -title: "std::crypto::secretbox" description: "Source: std/crypto/secretbox.slk" docsCollection: "silk" section: "std" diff --git a/src/silk/docs/std/crypto-sign/page.md b/src/silk/docs/std/crypto-sign/page.md index 7977b8ce..13497d18 100644 --- a/src/silk/docs/std/crypto-sign/page.md +++ b/src/silk/docs/std/crypto-sign/page.md @@ -1,6 +1,5 @@ --- layout: "docs" -title: "std::crypto::sign" description: "Source: std/crypto/sign.slk" docsCollection: "silk" section: "std" diff --git a/src/silk/docs/std/crypto/page.md b/src/silk/docs/std/crypto/page.md index 5d60a592..aac9764c 100644 --- a/src/silk/docs/std/crypto/page.md +++ b/src/silk/docs/std/crypto/page.md @@ -1,6 +1,5 @@ --- layout: "docs" -title: "std::crypto" description: "std::crypto provides cryptographic primitives through a selectable security provider. The builtin provider uses target-matched built-in libsodium archives on the hosted POSIX baseline; the Apple platf" docsCollection: "silk" section: "std" diff --git a/src/silk/docs/std/dylib/page.md b/src/silk/docs/std/dylib/page.md index 95cbfb15..d2fd93fa 100644 --- a/src/silk/docs/std/dylib/page.md +++ b/src/silk/docs/std/dylib/page.md @@ -1,6 +1,5 @@ --- layout: "docs" -title: "std::dylib" description: "std::dylib is the opt-in standard-library facade for loading dynamic libraries and resolving symbols at runtime." docsCollection: "silk" section: "std" diff --git a/src/silk/docs/std/env/page.md b/src/silk/docs/std/env/page.md index 7c6c3b74..c12d49e4 100644 --- a/src/silk/docs/std/env/page.md +++ b/src/silk/docs/std/env/page.md @@ -1,6 +1,5 @@ --- layout: "docs" -title: "std::env" description: "std::env provides access to process environment variables." docsCollection: "silk" section: "std" diff --git a/src/silk/docs/std/ffi-c/page.md b/src/silk/docs/std/ffi-c/page.md index a8e82926..f45e5ffb 100644 --- a/src/silk/docs/std/ffi-c/page.md +++ b/src/silk/docs/std/ffi-c/page.md @@ -1,6 +1,5 @@ --- layout: "docs" -title: "std::ffi::c (C FFI helpers)" description: "This module provides small, explicit helpers for interoperating with C APIs from Silk via ext declarations." docsCollection: "silk" section: "std" diff --git a/src/silk/docs/std/ffi-c_owned/page.md b/src/silk/docs/std/ffi-c_owned/page.md index 227b8521..87be526f 100644 --- a/src/silk/docs/std/ffi-c_owned/page.md +++ b/src/silk/docs/std/ffi-c_owned/page.md @@ -1,6 +1,5 @@ --- layout: "docs" -title: "std::ffi::c_owned" description: "Source: std/ffi/c_owned.slk" docsCollection: "silk" section: "std" diff --git a/src/silk/docs/std/filesystem/page.md b/src/silk/docs/std/filesystem/page.md index 8a1accbb..8f897f8c 100644 --- a/src/silk/docs/std/filesystem/page.md +++ b/src/silk/docs/std/filesystem/page.md @@ -1,6 +1,5 @@ --- layout: "docs" -title: "std::fs" description: "std::fs provides a small hosted filesystem API backed by std::runtime::fs. It exposes low-level File handles, path/file metadata queries, whole-file helpers, directory iteration, and byte-oriented I/O" docsCollection: "silk" section: "std" diff --git a/src/silk/docs/std/flag/page.md b/src/silk/docs/std/flag/page.md index ac7f866c..161e18ca 100644 --- a/src/silk/docs/std/flag/page.md +++ b/src/silk/docs/std/flag/page.md @@ -1,6 +1,5 @@ --- layout: "docs" -title: "std::flag" description: "std::flag provides a small, robust command line argument parser modeled after Go’s flag package, but shaped to match std:: conventions (explicit Result(...) errors, no leaky out-params, and a clear se" docsCollection: "silk" section: "std" diff --git a/src/silk/docs/std/fmt/page.md b/src/silk/docs/std/fmt/page.md index 50bbb773..ac91e72f 100644 --- a/src/silk/docs/std/fmt/page.md +++ b/src/silk/docs/std/fmt/page.md @@ -1,6 +1,5 @@ --- layout: "docs" -title: "std::fmt" description: "The initial formatting engine is implemented in std/fmt.slk and is intentionally scoped to the current compiler/backend subset (no generics, no runtime interface dispatch)." docsCollection: "silk" section: "std" diff --git a/src/silk/docs/std/formal/page.md b/src/silk/docs/std/formal/page.md index d2831d8b..f635c578 100644 --- a/src/silk/docs/std/formal/page.md +++ b/src/silk/docs/std/formal/page.md @@ -1,6 +1,5 @@ --- layout: "docs" -title: "std::formal" description: "This module provides the small, stable Formal Silk vocabulary that is broadly reusable across std:: and downstream verified code." docsCollection: "silk" section: "std" diff --git a/src/silk/docs/std/fs-stream/page.md b/src/silk/docs/std/fs-stream/page.md index 14f3d9ee..d68ce93b 100644 --- a/src/silk/docs/std/fs-stream/page.md +++ b/src/silk/docs/std/fs-stream/page.md @@ -1,6 +1,5 @@ --- layout: "docs" -title: "std::fs::stream" description: "Source: std/fs/stream.slk" docsCollection: "silk" section: "std" diff --git a/src/silk/docs/std/fs/page.md b/src/silk/docs/std/fs/page.md index 2c1904e9..e11966be 100644 --- a/src/silk/docs/std/fs/page.md +++ b/src/silk/docs/std/fs/page.md @@ -1,6 +1,5 @@ --- layout: "docs" -title: "std::fs" description: "This is the canonical module doc for std::fs." docsCollection: "silk" section: "std" diff --git a/src/silk/docs/std/function/page.md b/src/silk/docs/std/function/page.md index 845e1e3d..c7ff7630 100644 --- a/src/silk/docs/std/function/page.md +++ b/src/silk/docs/std/function/page.md @@ -1,6 +1,5 @@ --- layout: "docs" -title: "std::function" description: "std::function provides a boxed holder for first-class Silk function values." docsCollection: "silk" section: "std" diff --git a/src/silk/docs/std/ggml/page.md b/src/silk/docs/std/ggml/page.md index cd61a9a1..5bd4ed10 100644 --- a/src/silk/docs/std/ggml/page.md +++ b/src/silk/docs/std/ggml/page.md @@ -1,6 +1,5 @@ --- layout: "docs" -title: "std::ggml" description: "std::ggml exposes a small, ABI-safe Silk wrapper over a pinned subset of upstream ggml. The current module is intentionally narrow: it is meant to let Silk programs allocate ggml contexts, build basic" docsCollection: "silk" section: "std" diff --git a/src/silk/docs/std/gpu-device/page.md b/src/silk/docs/std/gpu-device/page.md index 44357296..4ccce1d0 100644 --- a/src/silk/docs/std/gpu-device/page.md +++ b/src/silk/docs/std/gpu-device/page.md @@ -1,6 +1,5 @@ --- layout: "docs" -title: "std::gpu::device" description: "std::gpu::device is the semantic operation surface available inside attr(device=gpu) function bodies. Unlike std::gpu::isa, its API is expressed in terms of kernel parameters and work-item behavior ra" docsCollection: "silk" section: "std" diff --git a/src/silk/docs/std/gpu-isa/page.md b/src/silk/docs/std/gpu-isa/page.md index f1b05f4a..f00f3a35 100644 --- a/src/silk/docs/std/gpu-isa/page.md +++ b/src/silk/docs/std/gpu-isa/page.md @@ -1,6 +1,5 @@ --- layout: "docs" -title: "std::gpu::isa" description: "std::gpu::isa is the typed Silk spelling of the initial dependency-light AMDGPU instruction subset. It exists for kernel bring-up while ordinary Silk expressions are connected to the general GPU selec" docsCollection: "silk" section: "std" diff --git a/src/silk/docs/std/gpu/page.md b/src/silk/docs/std/gpu/page.md index 5617187c..81f8454e 100644 --- a/src/silk/docs/std/gpu/page.md +++ b/src/silk/docs/std/gpu/page.md @@ -1,6 +1,5 @@ --- layout: "docs" -title: "std::gpu" description: "std::gpu is the public host-side API for pure-Silk GPU discovery, device memory, streams, kernel launch, and synchronization. GPU-v1 mixed Linux x86_64 executables use the provider recorded in their b" docsCollection: "silk" section: "std" diff --git a/src/silk/docs/std/graphics-metal/page.md b/src/silk/docs/std/graphics-metal/page.md index 87e2d9eb..a0704e0f 100644 --- a/src/silk/docs/std/graphics-metal/page.md +++ b/src/silk/docs/std/graphics-metal/page.md @@ -1,6 +1,5 @@ --- layout: "docs" -title: "std::graphics::metal" description: "Source: std/graphics/metal.slk" docsCollection: "silk" section: "std" diff --git a/src/silk/docs/std/graphics-opengl/page.md b/src/silk/docs/std/graphics-opengl/page.md index 0a866fa9..45c1dc9b 100644 --- a/src/silk/docs/std/graphics-opengl/page.md +++ b/src/silk/docs/std/graphics-opengl/page.md @@ -1,6 +1,5 @@ --- layout: "docs" -title: "std::graphics::opengl" description: "Source: std/graphics/opengl.slk" docsCollection: "silk" section: "std" diff --git a/src/silk/docs/std/graphics-opengles/page.md b/src/silk/docs/std/graphics-opengles/page.md index 46d5cca7..64de37bc 100644 --- a/src/silk/docs/std/graphics-opengles/page.md +++ b/src/silk/docs/std/graphics-opengles/page.md @@ -1,6 +1,5 @@ --- layout: "docs" -title: "std::graphics::opengles" description: "Source: std/graphics/opengles.slk" docsCollection: "silk" section: "std" diff --git a/src/silk/docs/std/graphics-vulkan/page.md b/src/silk/docs/std/graphics-vulkan/page.md index cba05b64..b3610f05 100644 --- a/src/silk/docs/std/graphics-vulkan/page.md +++ b/src/silk/docs/std/graphics-vulkan/page.md @@ -1,6 +1,5 @@ --- layout: "docs" -title: "std::graphics::vulkan" description: "Source: std/graphics/vulkan.slk" docsCollection: "silk" section: "std" diff --git a/src/silk/docs/std/graphics-window/page.md b/src/silk/docs/std/graphics-window/page.md index 01ec077f..7861099b 100644 --- a/src/silk/docs/std/graphics-window/page.md +++ b/src/silk/docs/std/graphics-window/page.md @@ -1,6 +1,5 @@ --- layout: "docs" -title: "std::graphics::window" description: "Source: std/graphics/window.slk" docsCollection: "silk" section: "std" diff --git a/src/silk/docs/std/graphics/page.md b/src/silk/docs/std/graphics/page.md index b6043941..f31b91c0 100644 --- a/src/silk/docs/std/graphics/page.md +++ b/src/silk/docs/std/graphics/page.md @@ -1,6 +1,5 @@ --- layout: "docs" -title: "std::graphics — Graphics API Bindings" description: "std::graphics is a namespace for low-level, FFI-oriented bindings to common graphics APIs and platform-specific facades where a generated SDK registry is not available." docsCollection: "silk" section: "std" diff --git a/src/silk/docs/std/http/page.md b/src/silk/docs/std/http/page.md index e944434f..ba5a1562 100644 --- a/src/silk/docs/std/http/page.md +++ b/src/silk/docs/std/http/page.md @@ -1,6 +1,5 @@ --- layout: "docs" -title: "std::http" description: "std::http provides HTTP/1.1 request/response parsing, a small blocking client/server connection API on top of std::net::TCPStream, and ergonomic URL/stream client helpers." docsCollection: "silk" section: "std" diff --git a/src/silk/docs/std/https/page.md b/src/silk/docs/std/https/page.md index fddee54d..8ebab586 100644 --- a/src/silk/docs/std/https/page.md +++ b/src/silk/docs/std/https/page.md @@ -1,6 +1,5 @@ --- layout: "docs" -title: "std::https" description: "std::https provides a small HTTPS client/server connection API on top of std::tls (currently the built-in mbedTLS provider) and std::net::TCPStream, plus URL and stream convenience helpers." docsCollection: "silk" section: "std" diff --git a/src/silk/docs/std/idl-web/page.md b/src/silk/docs/std/idl-web/page.md index 3712e611..ff3d815e 100644 --- a/src/silk/docs/std/idl-web/page.md +++ b/src/silk/docs/std/idl-web/page.md @@ -1,6 +1,5 @@ --- layout: "docs" -title: "Web IDL (std::idl::web)" description: "This module provides a Web IDL parser plus an ergonomic, query-oriented API for inspecting the parsed document." docsCollection: "silk" section: "std" diff --git a/src/silk/docs/std/image-color/page.md b/src/silk/docs/std/image-color/page.md index 6b040d60..cdbe4ec5 100644 --- a/src/silk/docs/std/image-color/page.md +++ b/src/silk/docs/std/image-color/page.md @@ -1,6 +1,5 @@ --- layout: "docs" -title: "std::image::color" description: "Source: std/image/color.slk" docsCollection: "silk" section: "std" diff --git a/src/silk/docs/std/image-jpeg/page.md b/src/silk/docs/std/image-jpeg/page.md index 7960490f..e7ef3398 100644 --- a/src/silk/docs/std/image-jpeg/page.md +++ b/src/silk/docs/std/image-jpeg/page.md @@ -1,6 +1,5 @@ --- layout: "docs" -title: "std::image::jpeg" description: "Source: std/image/jpeg.slk" docsCollection: "silk" section: "std" diff --git a/src/silk/docs/std/image-png/page.md b/src/silk/docs/std/image-png/page.md index 9b9fa960..04b9433b 100644 --- a/src/silk/docs/std/image-png/page.md +++ b/src/silk/docs/std/image-png/page.md @@ -1,6 +1,5 @@ --- layout: "docs" -title: "std::image::png" description: "Source: std/image/png.slk" docsCollection: "silk" section: "std" diff --git a/src/silk/docs/std/image/page.md b/src/silk/docs/std/image/page.md index 9403f223..6f118285 100644 --- a/src/silk/docs/std/image/page.md +++ b/src/silk/docs/std/image/page.md @@ -1,6 +1,5 @@ --- layout: "docs" -title: "std::image — Image Codecs + Color" description: "std::image provides:" docsCollection: "silk" section: "std" diff --git a/src/silk/docs/std/interfaces/page.md b/src/silk/docs/std/interfaces/page.md index 38a425e6..29305a75 100644 --- a/src/silk/docs/std/interfaces/page.md +++ b/src/silk/docs/std/interfaces/page.md @@ -1,6 +1,5 @@ --- layout: "docs" -title: "std::interfaces" description: "This module defines small, non-generic standard-library interfaces (“protocols”) that can be used today to express common capabilities across std:: types." docsCollection: "silk" section: "std" diff --git a/src/silk/docs/std/io-async/page.md b/src/silk/docs/std/io-async/page.md index 7e7e3955..8715b485 100644 --- a/src/silk/docs/std/io-async/page.md +++ b/src/silk/docs/std/io-async/page.md @@ -1,6 +1,5 @@ --- layout: "docs" -title: "std::io::async" description: "Source: std/io/async.slk" docsCollection: "silk" section: "std" diff --git a/src/silk/docs/std/io-stream/page.md b/src/silk/docs/std/io-stream/page.md index 03a48a3d..6a2ef5be 100644 --- a/src/silk/docs/std/io-stream/page.md +++ b/src/silk/docs/std/io-stream/page.md @@ -1,6 +1,5 @@ --- layout: "docs" -title: "std::io::stream" description: "Source: std/io/stream.slk" docsCollection: "silk" section: "std" diff --git a/src/silk/docs/std/io/page.md b/src/silk/docs/std/io/page.md index 2c94eaf1..df79f980 100644 --- a/src/silk/docs/std/io/page.md +++ b/src/silk/docs/std/io/page.md @@ -1,6 +1,5 @@ --- layout: "docs" -title: "std::io" description: "Basic stdin reads, stdout/stderr writes, an fd-backed BufferedWriter, and a minimal std::io::async subset are implemented in std/io.slk via std::runtime::io." docsCollection: "silk" section: "std" diff --git a/src/silk/docs/std/js-ecma/page.md b/src/silk/docs/std/js-ecma/page.md index c65c97b7..f051d4ec 100644 --- a/src/silk/docs/std/js-ecma/page.md +++ b/src/silk/docs/std/js-ecma/page.md @@ -1,6 +1,5 @@ --- layout: "docs" -title: "ECMAScript FFI (std::js::ecma)" description: "This module defines a small, environment-agnostic interface for interacting with an ECMAScript engine from Silk." docsCollection: "silk" section: "std" diff --git a/src/silk/docs/std/json/page.md b/src/silk/docs/std/json/page.md index 535f26b9..3aa4f3b7 100644 --- a/src/silk/docs/std/json/page.md +++ b/src/silk/docs/std/json/page.md @@ -1,6 +1,5 @@ --- layout: "docs" -title: "std::json" description: "std::json provides an RFC 8259-style JSON parser plus deterministic JSON emission over an index-based DOM." docsCollection: "silk" section: "std" diff --git a/src/silk/docs/std/limits/page.md b/src/silk/docs/std/limits/page.md index 90d9c50a..cd062eba 100644 --- a/src/silk/docs/std/limits/page.md +++ b/src/silk/docs/std/limits/page.md @@ -1,6 +1,5 @@ --- layout: "docs" -title: "std::limits" description: "This module provides shared numeric limits for Silk primitive types." docsCollection: "silk" section: "std" diff --git a/src/silk/docs/std/list/page.md b/src/silk/docs/std/list/page.md index 3dea475d..2fe5ddc2 100644 --- a/src/silk/docs/std/list/page.md +++ b/src/silk/docs/std/list/page.md @@ -1,6 +1,5 @@ --- layout: "docs" -title: "std::list" description: "This module provides list-shaped wrappers over the queue core from std::queue." docsCollection: "silk" section: "std" diff --git a/src/silk/docs/std/map/page.md b/src/silk/docs/std/map/page.md index ada27524..d625b169 100644 --- a/src/silk/docs/std/map/page.md +++ b/src/silk/docs/std/map/page.md @@ -1,6 +1,5 @@ --- layout: "docs" -title: "std::map — Maps and Dictionaries" description: "std::map provides the standard associative container surfaces:" docsCollection: "silk" section: "std" diff --git a/src/silk/docs/std/math-matrix/page.md b/src/silk/docs/std/math-matrix/page.md index 2c519f90..481bc0a5 100644 --- a/src/silk/docs/std/math-matrix/page.md +++ b/src/silk/docs/std/math-matrix/page.md @@ -1,6 +1,5 @@ --- layout: "docs" -title: "std::math::matrix" description: "Source: std/math/matrix.slk" docsCollection: "silk" section: "std" diff --git a/src/silk/docs/std/math-vector/page.md b/src/silk/docs/std/math-vector/page.md index cbfa0b15..adebe2b0 100644 --- a/src/silk/docs/std/math-vector/page.md +++ b/src/silk/docs/std/math-vector/page.md @@ -1,6 +1,5 @@ --- layout: "docs" -title: "std::math::vector" description: "Source: std/math/vector.slk" docsCollection: "silk" section: "std" diff --git a/src/silk/docs/std/math/page.md b/src/silk/docs/std/math/page.md index cf40320e..debcc643 100644 --- a/src/silk/docs/std/math/page.md +++ b/src/silk/docs/std/math/page.md @@ -1,6 +1,5 @@ --- layout: "docs" -title: "std::math" description: "This module provides linear algebra utilities intended for graphics and general-purpose computation." docsCollection: "silk" section: "std" diff --git a/src/silk/docs/std/memory/page.md b/src/silk/docs/std/memory/page.md index 19173ec9..61432ba0 100644 --- a/src/silk/docs/std/memory/page.md +++ b/src/silk/docs/std/memory/page.md @@ -1,6 +1,5 @@ --- layout: "docs" -title: "std::memory" description: "This describes intended memory APIs; it is not implemented yet." docsCollection: "silk" section: "std" diff --git a/src/silk/docs/std/mime/page.md b/src/silk/docs/std/mime/page.md index b92bab8a..a57e04a3 100644 --- a/src/silk/docs/std/mime/page.md +++ b/src/silk/docs/std/mime/page.md @@ -1,6 +1,5 @@ --- layout: "docs" -title: "std::mime" description: "std::mime maps file names, extensions, and content-type strings to MIME metadata suitable for HTTP responses, file indexing tools, and package publication helpers. Its shape is influenced by the local" docsCollection: "silk" section: "std" diff --git a/src/silk/docs/std/module-catalog/page.md b/src/silk/docs/std/module-catalog/page.md index 700c89ae..87b0c00a 100644 --- a/src/silk/docs/std/module-catalog/page.md +++ b/src/silk/docs/std/module-catalog/page.md @@ -1,6 +1,5 @@ --- layout: "docs" -title: "std:: Module Catalog" description: "This page is the canonical inventory of shipped modules under std/." docsCollection: "silk" section: "std" diff --git a/src/silk/docs/std/net-stream/page.md b/src/silk/docs/std/net-stream/page.md index 90a72fa4..9524e7cc 100644 --- a/src/silk/docs/std/net-stream/page.md +++ b/src/silk/docs/std/net-stream/page.md @@ -1,6 +1,5 @@ --- layout: "docs" -title: "std::net::stream" description: "Source: std/net/stream.slk" docsCollection: "silk" section: "std" diff --git a/src/silk/docs/std/net/page.md b/src/silk/docs/std/net/page.md index 959aa701..ffb318af 100644 --- a/src/silk/docs/std/net/page.md +++ b/src/silk/docs/std/net/page.md @@ -1,6 +1,5 @@ --- layout: "docs" -title: "std::net" description: "This is the canonical module doc for std::net." docsCollection: "silk" section: "std" diff --git a/src/silk/docs/std/networking/page.md b/src/silk/docs/std/networking/page.md index 71f91d73..361ae663 100644 --- a/src/silk/docs/std/networking/page.md +++ b/src/silk/docs/std/networking/page.md @@ -1,6 +1,5 @@ --- layout: "docs" -title: "std::net" description: "A small endian/byte-order helper subset plus hosted IPv4/IPv6 TCP and IPv4/IPv6 UDP socket APIs are implemented in std/net.slk." docsCollection: "silk" section: "std" diff --git a/src/silk/docs/std/number/page.md b/src/silk/docs/std/number/page.md index c156a8e8..eff8ea55 100644 --- a/src/silk/docs/std/number/page.md +++ b/src/silk/docs/std/number/page.md @@ -1,6 +1,5 @@ --- layout: "docs" -title: "std::number" description: "This module provides small, dependency-light number parsing and formatting helpers, plus a boxed Number value type." docsCollection: "silk" section: "std" diff --git a/src/silk/docs/std/optional/page.md b/src/silk/docs/std/optional/page.md index 1e23e14b..e7701428 100644 --- a/src/silk/docs/std/optional/page.md +++ b/src/silk/docs/std/optional/page.md @@ -1,6 +1,5 @@ --- layout: "docs" -title: "std::optional" description: "Optional(T) / T? is a language type, not a stdlib-defined enum. The compiler already provides the method-oriented combinator surface on optional values. std::optional exists as a stdlib namespace of f" docsCollection: "silk" section: "std" diff --git a/src/silk/docs/std/os/page.md b/src/silk/docs/std/os/page.md index 02001f27..e58b8b86 100644 --- a/src/silk/docs/std/os/page.md +++ b/src/silk/docs/std/os/page.md @@ -1,6 +1,5 @@ --- layout: "docs" -title: "std::os" description: "std::os provides:" docsCollection: "silk" section: "std" diff --git a/src/silk/docs/std/overview/page.md b/src/silk/docs/std/overview/page.md index d6bdab96..c64c48d9 100644 --- a/src/silk/docs/std/overview/page.md +++ b/src/silk/docs/std/overview/page.md @@ -1,6 +1,5 @@ --- layout: "docs" -title: "Standard Library Overview (std::)" description: "The docs/std/ directory specifies the intended API and structure. A minimal in-tree stdlib source tree also exists under std/ (used by the toolchain to satisfy import std::...;)." docsCollection: "silk" section: "std" diff --git a/src/silk/docs/std/package-structure/page.md b/src/silk/docs/std/package-structure/page.md index 1c64955e..9d2d3d3e 100644 --- a/src/silk/docs/std/package-structure/page.md +++ b/src/silk/docs/std/package-structure/page.md @@ -1,6 +1,5 @@ --- layout: "docs" -title: "std:: Module Structure" description: "This describes the intended organization and build integration for std::. A first, minimal slice of the build integration is implemented (auto-resolving std::... imports from a configurable stdlib roo" docsCollection: "silk" section: "std" diff --git a/src/silk/docs/std/path/page.md b/src/silk/docs/std/path/page.md index c2273bf7..f48c150f 100644 --- a/src/silk/docs/std/path/page.md +++ b/src/silk/docs/std/path/page.md @@ -1,6 +1,5 @@ --- layout: "docs" -title: "std::path" description: "std::path provides path manipulation utilities, borrowed path views, and the owned PathBuf builder/buffer." docsCollection: "silk" section: "std" diff --git a/src/silk/docs/std/process-child/page.md b/src/silk/docs/std/process-child/page.md index 070d75d9..c4155802 100644 --- a/src/silk/docs/std/process-child/page.md +++ b/src/silk/docs/std/process-child/page.md @@ -1,6 +1,5 @@ --- layout: "docs" -title: "std::process::child" description: "Source: std/process/child.slk" docsCollection: "silk" section: "std" diff --git a/src/silk/docs/std/process/page.md b/src/silk/docs/std/process/page.md index 5c6de204..707fb1a9 100644 --- a/src/silk/docs/std/process/page.md +++ b/src/silk/docs/std/process/page.md @@ -1,6 +1,5 @@ --- layout: "docs" -title: "std::process" description: "(hosted POSIX baseline)." docsCollection: "silk" section: "std" diff --git a/src/silk/docs/std/protobuf/page.md b/src/silk/docs/std/protobuf/page.md index 51c0d98a..a2bac8b2 100644 --- a/src/silk/docs/std/protobuf/page.md +++ b/src/silk/docs/std/protobuf/page.md @@ -1,6 +1,5 @@ --- layout: "docs" -title: "std::protobuf" description: "std::protobuf provides dependency-free Protocol Buffers binary wire helpers for Silk code and for modules generated by silk proto." docsCollection: "silk" section: "std" diff --git a/src/silk/docs/std/queue/page.md b/src/silk/docs/std/queue/page.md index ac0a3a6b..507528df 100644 --- a/src/silk/docs/std/queue/page.md +++ b/src/silk/docs/std/queue/page.md @@ -1,6 +1,5 @@ --- layout: "docs" -title: "std::queue" description: "This module provides queue-oriented containers built on a shared owning deque core." docsCollection: "silk" section: "std" diff --git a/src/silk/docs/std/range/page.md b/src/silk/docs/std/range/page.md index 7e443f61..36f5a520 100644 --- a/src/silk/docs/std/range/page.md +++ b/src/silk/docs/std/range/page.md @@ -1,6 +1,5 @@ --- layout: "docs" -title: "std::range" description: "std::range provides a boxed, method-bearing representation of the built-in range primitive." docsCollection: "silk" section: "std" diff --git a/src/silk/docs/std/readline/page.md b/src/silk/docs/std/readline/page.md index a6de121e..202d7c93 100644 --- a/src/silk/docs/std/readline/page.md +++ b/src/silk/docs/std/readline/page.md @@ -1,6 +1,5 @@ --- layout: "docs" -title: "std::readline" description: "std::readline provides a small, ergonomic readline-style API for reading a single line of user input with interactive editing and history when stdin is connected to a TTY." docsCollection: "silk" section: "std" diff --git a/src/silk/docs/std/regex/page.md b/src/silk/docs/std/regex/page.md index 5c361386..5607967d 100644 --- a/src/silk/docs/std/regex/page.md +++ b/src/silk/docs/std/regex/page.md @@ -1,6 +1,5 @@ --- layout: "docs" -title: "std::regex" description: "This module provides regular expression helpers built on top of:" docsCollection: "silk" section: "std" diff --git a/src/silk/docs/std/result/page.md b/src/silk/docs/std/result/page.md index 7866f582..57de3edd 100644 --- a/src/silk/docs/std/result/page.md +++ b/src/silk/docs/std/result/page.md @@ -1,6 +1,5 @@ --- layout: "docs" -title: "std::result" description: "The language’s error model is explicit and typed (errors). std::result standardizes the common “success or error” return shape so that APIs across std:: compose cleanly." docsCollection: "silk" section: "std" diff --git a/src/silk/docs/std/runtime-atomic/page.md b/src/silk/docs/std/runtime-atomic/page.md index f914a326..274abe75 100644 --- a/src/silk/docs/std/runtime-atomic/page.md +++ b/src/silk/docs/std/runtime-atomic/page.md @@ -1,6 +1,5 @@ --- layout: "docs" -title: "std::runtime::atomic" description: "std::runtime::atomic is the stdlib runtime interface used by std::atomic." docsCollection: "silk" section: "std" diff --git a/src/silk/docs/std/runtime-build/page.md b/src/silk/docs/std/runtime-build/page.md index c7e4a955..198e630e 100644 --- a/src/silk/docs/std/runtime-build/page.md +++ b/src/silk/docs/std/runtime-build/page.md @@ -1,6 +1,5 @@ --- layout: "docs" -title: "std::runtime::build" description: "Source: std/runtime/build.slk" docsCollection: "silk" section: "std" diff --git a/src/silk/docs/std/runtime-dylib/page.md b/src/silk/docs/std/runtime-dylib/page.md index f9c34432..e75cb3bb 100644 --- a/src/silk/docs/std/runtime-dylib/page.md +++ b/src/silk/docs/std/runtime-dylib/page.md @@ -1,6 +1,5 @@ --- layout: "docs" -title: "std::runtime::dylib" description: "std::runtime::dylib is the runtime interface used by std::dylib." docsCollection: "silk" section: "std" diff --git a/src/silk/docs/std/runtime-env/page.md b/src/silk/docs/std/runtime-env/page.md index 15f30d15..c64e71ed 100644 --- a/src/silk/docs/std/runtime-env/page.md +++ b/src/silk/docs/std/runtime-env/page.md @@ -1,6 +1,5 @@ --- layout: "docs" -title: "std::runtime::env" description: "Source: std/runtime/env.slk" docsCollection: "silk" section: "std" diff --git a/src/silk/docs/std/runtime-event_loop/page.md b/src/silk/docs/std/runtime-event_loop/page.md index 8dcd7f33..f5f36867 100644 --- a/src/silk/docs/std/runtime-event_loop/page.md +++ b/src/silk/docs/std/runtime-event_loop/page.md @@ -1,6 +1,5 @@ --- layout: "docs" -title: "std::runtime::event_loop" description: "Source: std/runtime/event_loop.slk" docsCollection: "silk" section: "std" diff --git a/src/silk/docs/std/runtime-fs/page.md b/src/silk/docs/std/runtime-fs/page.md index 87c4044c..30b89ef8 100644 --- a/src/silk/docs/std/runtime-fs/page.md +++ b/src/silk/docs/std/runtime-fs/page.md @@ -1,6 +1,5 @@ --- layout: "docs" -title: "std::runtime::fs" description: "Source: std/runtime/fs.slk" docsCollection: "silk" section: "std" diff --git a/src/silk/docs/std/runtime-globals/page.md b/src/silk/docs/std/runtime-globals/page.md index 53182449..ae60d62e 100644 --- a/src/silk/docs/std/runtime-globals/page.md +++ b/src/silk/docs/std/runtime-globals/page.md @@ -1,6 +1,5 @@ --- layout: "docs" -title: "std::runtime::globals" description: "Source: std/runtime/globals.slk" docsCollection: "silk" section: "std" diff --git a/src/silk/docs/std/runtime-gpu/page.md b/src/silk/docs/std/runtime-gpu/page.md index dd48223f..fb3d841a 100644 --- a/src/silk/docs/std/runtime-gpu/page.md +++ b/src/silk/docs/std/runtime-gpu/page.md @@ -1,6 +1,5 @@ --- layout: "docs" -title: "std::runtime::gpu" description: "std::runtime::gpu is the internal swappable runtime interface beneath std::gpu. It forwards to bundled silk_rt_gpu_* functions on the hosted Linux baseline and is not the preferred application import." docsCollection: "silk" section: "std" diff --git a/src/silk/docs/std/runtime-graphics-metal/page.md b/src/silk/docs/std/runtime-graphics-metal/page.md index 6c3b4ed2..325e5f91 100644 --- a/src/silk/docs/std/runtime-graphics-metal/page.md +++ b/src/silk/docs/std/runtime-graphics-metal/page.md @@ -1,6 +1,5 @@ --- layout: "docs" -title: "std::runtime::graphics::metal" description: "std::runtime::graphics::metal is the low-level runtime boundary used by std::graphics::metal. It is not the application API; application code should import std::graphics::metal or std::graphics::windo" docsCollection: "silk" section: "std" diff --git a/src/silk/docs/std/runtime-io/page.md b/src/silk/docs/std/runtime-io/page.md index 4a262545..ed38bf5b 100644 --- a/src/silk/docs/std/runtime-io/page.md +++ b/src/silk/docs/std/runtime-io/page.md @@ -1,6 +1,5 @@ --- layout: "docs" -title: "std::runtime::io" description: "Source: std/runtime/io.slk" docsCollection: "silk" section: "std" diff --git a/src/silk/docs/std/runtime-linux-event_loop/page.md b/src/silk/docs/std/runtime-linux-event_loop/page.md index ca1ee63a..936a3945 100644 --- a/src/silk/docs/std/runtime-linux-event_loop/page.md +++ b/src/silk/docs/std/runtime-linux-event_loop/page.md @@ -1,6 +1,5 @@ --- layout: "docs" -title: "std::runtime::linux::event_loop" description: "Source: std/runtime/linux/event_loop.slk" docsCollection: "silk" section: "std" diff --git a/src/silk/docs/std/runtime-mem/page.md b/src/silk/docs/std/runtime-mem/page.md index 7456775d..87608cf1 100644 --- a/src/silk/docs/std/runtime-mem/page.md +++ b/src/silk/docs/std/runtime-mem/page.md @@ -1,6 +1,5 @@ --- layout: "docs" -title: "std::runtime::mem" description: "Source: std/runtime/mem.slk" docsCollection: "silk" section: "std" diff --git a/src/silk/docs/std/runtime-net/page.md b/src/silk/docs/std/runtime-net/page.md index 51481649..972b7f2e 100644 --- a/src/silk/docs/std/runtime-net/page.md +++ b/src/silk/docs/std/runtime-net/page.md @@ -1,6 +1,5 @@ --- layout: "docs" -title: "std::runtime::net" description: "Source: std/runtime/net.slk" docsCollection: "silk" section: "std" diff --git a/src/silk/docs/std/runtime-number/page.md b/src/silk/docs/std/runtime-number/page.md index 914f40a4..64ba7954 100644 --- a/src/silk/docs/std/runtime-number/page.md +++ b/src/silk/docs/std/runtime-number/page.md @@ -1,6 +1,5 @@ --- layout: "docs" -title: "std::runtime::number" description: "Source: std/runtime/number.slk" docsCollection: "silk" section: "std" diff --git a/src/silk/docs/std/runtime-posix-atomic/page.md b/src/silk/docs/std/runtime-posix-atomic/page.md index b512b72d..8f0c9820 100644 --- a/src/silk/docs/std/runtime-posix-atomic/page.md +++ b/src/silk/docs/std/runtime-posix-atomic/page.md @@ -1,6 +1,5 @@ --- layout: "docs" -title: "std::runtime::posix::atomic" description: "std::runtime::posix::atomic is the hosted POSIX implementation module for std::runtime::atomic." docsCollection: "silk" section: "std" diff --git a/src/silk/docs/std/runtime-posix-dylib/page.md b/src/silk/docs/std/runtime-posix-dylib/page.md index 899d9f3e..883383db 100644 --- a/src/silk/docs/std/runtime-posix-dylib/page.md +++ b/src/silk/docs/std/runtime-posix-dylib/page.md @@ -1,6 +1,5 @@ --- layout: "docs" -title: "std::runtime::posix::dylib" description: "std::runtime::posix::dylib is the hosted POSIX dynamic-loader backend for std::runtime::dylib." docsCollection: "silk" section: "std" diff --git a/src/silk/docs/std/runtime-posix-env/page.md b/src/silk/docs/std/runtime-posix-env/page.md index 9a6c544c..f0360e32 100644 --- a/src/silk/docs/std/runtime-posix-env/page.md +++ b/src/silk/docs/std/runtime-posix-env/page.md @@ -1,6 +1,5 @@ --- layout: "docs" -title: "std::runtime::posix::env" description: "Source: std/runtime/posix/env.slk" docsCollection: "silk" section: "std" diff --git a/src/silk/docs/std/runtime-posix-event_loop/page.md b/src/silk/docs/std/runtime-posix-event_loop/page.md index 8eff4607..0ced66bd 100644 --- a/src/silk/docs/std/runtime-posix-event_loop/page.md +++ b/src/silk/docs/std/runtime-posix-event_loop/page.md @@ -1,6 +1,5 @@ --- layout: "docs" -title: "std::runtime::posix::event_loop" description: "Source: std/runtime/posix/event_loop.slk" docsCollection: "silk" section: "std" diff --git a/src/silk/docs/std/runtime-posix-fs/page.md b/src/silk/docs/std/runtime-posix-fs/page.md index 9fe180ac..977d6b39 100644 --- a/src/silk/docs/std/runtime-posix-fs/page.md +++ b/src/silk/docs/std/runtime-posix-fs/page.md @@ -1,6 +1,5 @@ --- layout: "docs" -title: "std::runtime::posix::fs" description: "Source: std/runtime/posix/fs.slk" docsCollection: "silk" section: "std" diff --git a/src/silk/docs/std/runtime-posix-io/page.md b/src/silk/docs/std/runtime-posix-io/page.md index 79e482bf..ee4eeb49 100644 --- a/src/silk/docs/std/runtime-posix-io/page.md +++ b/src/silk/docs/std/runtime-posix-io/page.md @@ -1,6 +1,5 @@ --- layout: "docs" -title: "std::runtime::posix::io" description: "Source: std/runtime/posix/io.slk" docsCollection: "silk" section: "std" diff --git a/src/silk/docs/std/runtime-posix-mem/page.md b/src/silk/docs/std/runtime-posix-mem/page.md index 0f7d0204..ee405663 100644 --- a/src/silk/docs/std/runtime-posix-mem/page.md +++ b/src/silk/docs/std/runtime-posix-mem/page.md @@ -1,6 +1,5 @@ --- layout: "docs" -title: "std::runtime::posix::mem" description: "Source: std/runtime/posix/mem.slk" docsCollection: "silk" section: "std" diff --git a/src/silk/docs/std/runtime-posix-net/page.md b/src/silk/docs/std/runtime-posix-net/page.md index 507e7eab..09773958 100644 --- a/src/silk/docs/std/runtime-posix-net/page.md +++ b/src/silk/docs/std/runtime-posix-net/page.md @@ -1,6 +1,5 @@ --- layout: "docs" -title: "std::runtime::posix::net" description: "Source: std/runtime/posix/net.slk" docsCollection: "silk" section: "std" diff --git a/src/silk/docs/std/runtime-posix-process/page.md b/src/silk/docs/std/runtime-posix-process/page.md index 52c67927..8cf35571 100644 --- a/src/silk/docs/std/runtime-posix-process/page.md +++ b/src/silk/docs/std/runtime-posix-process/page.md @@ -1,6 +1,5 @@ --- layout: "docs" -title: "std::runtime::posix::process" description: "Source: std/runtime/posix/process.slk" docsCollection: "silk" section: "std" diff --git a/src/silk/docs/std/runtime-posix-signal/page.md b/src/silk/docs/std/runtime-posix-signal/page.md index 55ec4c2a..26e5c556 100644 --- a/src/silk/docs/std/runtime-posix-signal/page.md +++ b/src/silk/docs/std/runtime-posix-signal/page.md @@ -1,6 +1,5 @@ --- layout: "docs" -title: "std::runtime::posix::signal" description: "Source: std/runtime/posix/signal.slk" docsCollection: "silk" section: "std" diff --git a/src/silk/docs/std/runtime-posix-sync/page.md b/src/silk/docs/std/runtime-posix-sync/page.md index fa196132..883c6712 100644 --- a/src/silk/docs/std/runtime-posix-sync/page.md +++ b/src/silk/docs/std/runtime-posix-sync/page.md @@ -1,6 +1,5 @@ --- layout: "docs" -title: "std::runtime::posix::sync" description: "Source: std/runtime/posix/sync.slk" docsCollection: "silk" section: "std" diff --git a/src/silk/docs/std/runtime-posix-task/page.md b/src/silk/docs/std/runtime-posix-task/page.md index ef7c68f0..fcf21df2 100644 --- a/src/silk/docs/std/runtime-posix-task/page.md +++ b/src/silk/docs/std/runtime-posix-task/page.md @@ -1,6 +1,5 @@ --- layout: "docs" -title: "std::runtime::posix::task" description: "Source: std/runtime/posix/task.slk" docsCollection: "silk" section: "std" diff --git a/src/silk/docs/std/runtime-posix-time/page.md b/src/silk/docs/std/runtime-posix-time/page.md index fa59d7ca..1571c895 100644 --- a/src/silk/docs/std/runtime-posix-time/page.md +++ b/src/silk/docs/std/runtime-posix-time/page.md @@ -1,6 +1,5 @@ --- layout: "docs" -title: "std::runtime::posix::time" description: "Source: std/runtime/posix/time.slk" docsCollection: "silk" section: "std" diff --git a/src/silk/docs/std/runtime-process/page.md b/src/silk/docs/std/runtime-process/page.md index 25612e39..7b71318a 100644 --- a/src/silk/docs/std/runtime-process/page.md +++ b/src/silk/docs/std/runtime-process/page.md @@ -1,6 +1,5 @@ --- layout: "docs" -title: "std::runtime::process" description: "Source: std/runtime/process.slk" docsCollection: "silk" section: "std" diff --git a/src/silk/docs/std/runtime-readline/page.md b/src/silk/docs/std/runtime-readline/page.md index e8fad17b..19293604 100644 --- a/src/silk/docs/std/runtime-readline/page.md +++ b/src/silk/docs/std/runtime-readline/page.md @@ -1,6 +1,5 @@ --- layout: "docs" -title: "std::runtime::readline" description: "Source: std/runtime/readline.slk" docsCollection: "silk" section: "std" diff --git a/src/silk/docs/std/runtime-regex/page.md b/src/silk/docs/std/runtime-regex/page.md index 5050fca6..e13a53e0 100644 --- a/src/silk/docs/std/runtime-regex/page.md +++ b/src/silk/docs/std/runtime-regex/page.md @@ -1,6 +1,5 @@ --- layout: "docs" -title: "std::runtime::regex" description: "Source: std/runtime/regex.slk" docsCollection: "silk" section: "std" diff --git a/src/silk/docs/std/runtime-signal/page.md b/src/silk/docs/std/runtime-signal/page.md index 94331761..0168426d 100644 --- a/src/silk/docs/std/runtime-signal/page.md +++ b/src/silk/docs/std/runtime-signal/page.md @@ -1,6 +1,5 @@ --- layout: "docs" -title: "std::runtime::signal" description: "Source: std/runtime/signal.slk" docsCollection: "silk" section: "std" diff --git a/src/silk/docs/std/runtime-sync/page.md b/src/silk/docs/std/runtime-sync/page.md index 6618734a..e1089cf0 100644 --- a/src/silk/docs/std/runtime-sync/page.md +++ b/src/silk/docs/std/runtime-sync/page.md @@ -1,6 +1,5 @@ --- layout: "docs" -title: "std::runtime::sync" description: "Source: std/runtime/sync.slk" docsCollection: "silk" section: "std" diff --git a/src/silk/docs/std/runtime-task/page.md b/src/silk/docs/std/runtime-task/page.md index 35c12520..bf4eb3ea 100644 --- a/src/silk/docs/std/runtime-task/page.md +++ b/src/silk/docs/std/runtime-task/page.md @@ -1,6 +1,5 @@ --- layout: "docs" -title: "std::runtime::task" description: "Source: std/runtime/task.slk" docsCollection: "silk" section: "std" diff --git a/src/silk/docs/std/runtime-time/page.md b/src/silk/docs/std/runtime-time/page.md index ca8ae678..53abbf4e 100644 --- a/src/silk/docs/std/runtime-time/page.md +++ b/src/silk/docs/std/runtime-time/page.md @@ -1,6 +1,5 @@ --- layout: "docs" -title: "std::runtime::time" description: "Source: std/runtime/time.slk" docsCollection: "silk" section: "std" diff --git a/src/silk/docs/std/runtime-unicode/page.md b/src/silk/docs/std/runtime-unicode/page.md index d9b109cb..01023f3e 100644 --- a/src/silk/docs/std/runtime-unicode/page.md +++ b/src/silk/docs/std/runtime-unicode/page.md @@ -1,6 +1,5 @@ --- layout: "docs" -title: "std::runtime::unicode" description: "Source: std/runtime/unicode.slk" docsCollection: "silk" section: "std" diff --git a/src/silk/docs/std/runtime-wasi-cwd/page.md b/src/silk/docs/std/runtime-wasi-cwd/page.md index f4f3f6b6..f539590f 100644 --- a/src/silk/docs/std/runtime-wasi-cwd/page.md +++ b/src/silk/docs/std/runtime-wasi-cwd/page.md @@ -1,6 +1,5 @@ --- layout: "docs" -title: "std::runtime::wasi::cwd" description: "Source: std/runtime/wasi/cwd.slk" docsCollection: "silk" section: "std" diff --git a/src/silk/docs/std/runtime-wasi-env/page.md b/src/silk/docs/std/runtime-wasi-env/page.md index aff0b49f..84e2f0e9 100644 --- a/src/silk/docs/std/runtime-wasi-env/page.md +++ b/src/silk/docs/std/runtime-wasi-env/page.md @@ -1,6 +1,5 @@ --- layout: "docs" -title: "std::runtime::wasi::env" description: "Source: std/runtime/wasi/env.slk" docsCollection: "silk" section: "std" diff --git a/src/silk/docs/std/runtime-wasi-event_loop/page.md b/src/silk/docs/std/runtime-wasi-event_loop/page.md index 5392cd16..dd1a59df 100644 --- a/src/silk/docs/std/runtime-wasi-event_loop/page.md +++ b/src/silk/docs/std/runtime-wasi-event_loop/page.md @@ -1,6 +1,5 @@ --- layout: "docs" -title: "std::runtime::wasi::event_loop" description: "Source: std/runtime/wasi/event_loop.slk" docsCollection: "silk" section: "std" diff --git a/src/silk/docs/std/runtime-wasi-fs/page.md b/src/silk/docs/std/runtime-wasi-fs/page.md index 4d14a0b7..9b15f795 100644 --- a/src/silk/docs/std/runtime-wasi-fs/page.md +++ b/src/silk/docs/std/runtime-wasi-fs/page.md @@ -1,6 +1,5 @@ --- layout: "docs" -title: "std::runtime::wasi::fs" description: "Source: std/runtime/wasi/fs.slk" docsCollection: "silk" section: "std" diff --git a/src/silk/docs/std/runtime-wasi-io/page.md b/src/silk/docs/std/runtime-wasi-io/page.md index 89e66693..4b0fccfe 100644 --- a/src/silk/docs/std/runtime-wasi-io/page.md +++ b/src/silk/docs/std/runtime-wasi-io/page.md @@ -1,6 +1,5 @@ --- layout: "docs" -title: "std::runtime::wasi::io" description: "Source: std/runtime/wasi/io.slk" docsCollection: "silk" section: "std" diff --git a/src/silk/docs/std/runtime-wasi-mem/page.md b/src/silk/docs/std/runtime-wasi-mem/page.md index d7ee727a..c085eef7 100644 --- a/src/silk/docs/std/runtime-wasi-mem/page.md +++ b/src/silk/docs/std/runtime-wasi-mem/page.md @@ -1,6 +1,5 @@ --- layout: "docs" -title: "std::runtime::wasi::mem" description: "Source: std/runtime/wasi/mem.slk" docsCollection: "silk" section: "std" diff --git a/src/silk/docs/std/runtime-wasi-net/page.md b/src/silk/docs/std/runtime-wasi-net/page.md index 294628a3..81106b95 100644 --- a/src/silk/docs/std/runtime-wasi-net/page.md +++ b/src/silk/docs/std/runtime-wasi-net/page.md @@ -1,6 +1,5 @@ --- layout: "docs" -title: "std::runtime::wasi::net" description: "Source: std/runtime/wasi/net.slk" docsCollection: "silk" section: "std" diff --git a/src/silk/docs/std/runtime-wasi-preopen/page.md b/src/silk/docs/std/runtime-wasi-preopen/page.md index fabd1ae6..5693be81 100644 --- a/src/silk/docs/std/runtime-wasi-preopen/page.md +++ b/src/silk/docs/std/runtime-wasi-preopen/page.md @@ -1,6 +1,5 @@ --- layout: "docs" -title: "std::runtime::wasi::preopen" description: "Source: std/runtime/wasi/preopen.slk" docsCollection: "silk" section: "std" diff --git a/src/silk/docs/std/runtime-wasi-process/page.md b/src/silk/docs/std/runtime-wasi-process/page.md index 24ec40cd..97eae4d4 100644 --- a/src/silk/docs/std/runtime-wasi-process/page.md +++ b/src/silk/docs/std/runtime-wasi-process/page.md @@ -1,6 +1,5 @@ --- layout: "docs" -title: "std::runtime::wasi::process" description: "Source: std/runtime/wasi/process.slk" docsCollection: "silk" section: "std" diff --git a/src/silk/docs/std/runtime-wasi-signal/page.md b/src/silk/docs/std/runtime-wasi-signal/page.md index c7e79716..21b070a6 100644 --- a/src/silk/docs/std/runtime-wasi-signal/page.md +++ b/src/silk/docs/std/runtime-wasi-signal/page.md @@ -1,6 +1,5 @@ --- layout: "docs" -title: "std::runtime::wasi::signal" description: "Source: std/runtime/wasi/signal.slk" docsCollection: "silk" section: "std" diff --git a/src/silk/docs/std/runtime-wasi-sync/page.md b/src/silk/docs/std/runtime-wasi-sync/page.md index aa8a5a38..fa1583be 100644 --- a/src/silk/docs/std/runtime-wasi-sync/page.md +++ b/src/silk/docs/std/runtime-wasi-sync/page.md @@ -1,6 +1,5 @@ --- layout: "docs" -title: "std::runtime::wasi::sync" description: "Source: std/runtime/wasi/sync.slk" docsCollection: "silk" section: "std" diff --git a/src/silk/docs/std/runtime-wasi-task/page.md b/src/silk/docs/std/runtime-wasi-task/page.md index fc9a8aea..f192b2e2 100644 --- a/src/silk/docs/std/runtime-wasi-task/page.md +++ b/src/silk/docs/std/runtime-wasi-task/page.md @@ -1,6 +1,5 @@ --- layout: "docs" -title: "std::runtime::wasi::task" description: "Source: std/runtime/wasi/task.slk" docsCollection: "silk" section: "std" diff --git a/src/silk/docs/std/runtime-wasi-time/page.md b/src/silk/docs/std/runtime-wasi-time/page.md index 1f7cee6b..02a8760e 100644 --- a/src/silk/docs/std/runtime-wasi-time/page.md +++ b/src/silk/docs/std/runtime-wasi-time/page.md @@ -1,6 +1,5 @@ --- layout: "docs" -title: "std::runtime::wasi::time" description: "Source: std/runtime/wasi/time.slk" docsCollection: "silk" section: "std" diff --git a/src/silk/docs/std/runtime-window/page.md b/src/silk/docs/std/runtime-window/page.md index b78b860e..c28f6e1a 100644 --- a/src/silk/docs/std/runtime-window/page.md +++ b/src/silk/docs/std/runtime-window/page.md @@ -1,6 +1,5 @@ --- layout: "docs" -title: "std::runtime::window" description: "std::runtime::window is the low-level runtime boundary used by std::window. It is not intended as the ergonomic application API; import std::window or a platform facade under std::window::* instead." docsCollection: "silk" section: "std" diff --git a/src/silk/docs/std/runtime-z3/page.md b/src/silk/docs/std/runtime-z3/page.md index 2599e327..8a90e290 100644 --- a/src/silk/docs/std/runtime-z3/page.md +++ b/src/silk/docs/std/runtime-z3/page.md @@ -1,6 +1,5 @@ --- layout: "docs" -title: "std::runtime::z3" description: "Source: std/runtime/z3.slk" docsCollection: "silk" section: "std" diff --git a/src/silk/docs/std/runtime/page.md b/src/silk/docs/std/runtime/page.md index 3e341cde..cc9121e9 100644 --- a/src/silk/docs/std/runtime/page.md +++ b/src/silk/docs/std/runtime/page.md @@ -1,6 +1,5 @@ --- layout: "docs" -title: "std::runtime" description: "std::runtime defines a runtime interface layer that sits underneath the rest of the standard library." docsCollection: "silk" section: "std" diff --git a/src/silk/docs/std/semver/page.md b/src/silk/docs/std/semver/page.md index 4a3f68b4..612d6e31 100644 --- a/src/silk/docs/std/semver/page.md +++ b/src/silk/docs/std/semver/page.md @@ -1,6 +1,5 @@ --- layout: "docs" -title: "std::semver" description: "std::semver provides a SemVer 2.0.0 parser and precedence comparison." docsCollection: "silk" section: "std" diff --git a/src/silk/docs/std/set/page.md b/src/silk/docs/std/set/page.md index b951f261..4bddfa75 100644 --- a/src/silk/docs/std/set/page.md +++ b/src/silk/docs/std/set/page.md @@ -1,6 +1,5 @@ --- layout: "docs" -title: "std::set — Sets" description: "std::set provides standard set container surfaces:" docsCollection: "silk" section: "std" diff --git a/src/silk/docs/std/signal/page.md b/src/silk/docs/std/signal/page.md index 67a905ad..f1cecea3 100644 --- a/src/silk/docs/std/signal/page.md +++ b/src/silk/docs/std/signal/page.md @@ -1,6 +1,5 @@ --- layout: "docs" -title: "std::signal" description: "std::signal provides a small, pollable signal-watching surface intended for terminal/TUI programs." docsCollection: "silk" section: "std" diff --git a/src/silk/docs/std/sqlite/page.md b/src/silk/docs/std/sqlite/page.md index d0178df9..bc4f685b 100644 --- a/src/silk/docs/std/sqlite/page.md +++ b/src/silk/docs/std/sqlite/page.md @@ -1,6 +1,5 @@ --- layout: "docs" -title: "std::sqlite" description: "std::sqlite provides SQLite database primitives for the hosted POSIX baseline. On supported hosted target layouts, silk build auto-links the built-in libsqlite3.a so outputs do not depend on a system " docsCollection: "silk" section: "std" diff --git a/src/silk/docs/std/ssh/page.md b/src/silk/docs/std/ssh/page.md index cc9e6e95..2de6dca9 100644 --- a/src/silk/docs/std/ssh/page.md +++ b/src/silk/docs/std/ssh/page.md @@ -1,6 +1,5 @@ --- layout: "docs" -title: "std::ssh" description: "std::ssh is the ergonomic stdlib entrypoint for Silk's hosted SSH client surface. It forwards the current libssh2-backed implementation that lives in std::ssh2, so downstream code can import std::ssh " docsCollection: "silk" section: "std" diff --git a/src/silk/docs/std/ssh2/page.md b/src/silk/docs/std/ssh2/page.md index 22b77db4..d98a854d 100644 --- a/src/silk/docs/std/ssh2/page.md +++ b/src/silk/docs/std/ssh2/page.md @@ -1,6 +1,5 @@ --- layout: "docs" -title: "std::ssh2" description: "std::ssh2 provides the current libssh2-backed SSH2 implementation for the hosted POSIX baseline. On supported hosted target layouts, silk build auto-links the built-in libssh2.a so outputs do not depe" docsCollection: "silk" section: "std" diff --git a/src/silk/docs/std/stack/page.md b/src/silk/docs/std/stack/page.md index 0843e54e..357bb190 100644 --- a/src/silk/docs/std/stack/page.md +++ b/src/silk/docs/std/stack/page.md @@ -1,6 +1,5 @@ --- layout: "docs" -title: "std::stack" description: "This module provides stack-oriented wrappers over std::queue’s deque core." docsCollection: "silk" section: "std" diff --git a/src/silk/docs/std/stream/page.md b/src/silk/docs/std/stream/page.md index 33eee0d0..ea591e13 100644 --- a/src/silk/docs/std/stream/page.md +++ b/src/silk/docs/std/stream/page.md @@ -1,6 +1,5 @@ --- layout: "docs" -title: "std::stream" description: "This module provides a Web Streams-inspired API for byte streams designed to work well with Silk’s async/task model." docsCollection: "silk" section: "std" diff --git a/src/silk/docs/std/strings/page.md b/src/silk/docs/std/strings/page.md index 0003d4f1..2b7f8964 100644 --- a/src/silk/docs/std/strings/page.md +++ b/src/silk/docs/std/strings/page.md @@ -1,6 +1,5 @@ --- layout: "docs" -title: "std::strings" description: "A small but growing subset is implemented in std/strings.slk to support early toolchain bring-up; the rest of this document describes the intended long-term API." docsCollection: "silk" section: "std" diff --git a/src/silk/docs/std/sync/page.md b/src/silk/docs/std/sync/page.md index 24a34f07..e6ad2fe2 100644 --- a/src/silk/docs/std/sync/page.md +++ b/src/silk/docs/std/sync/page.md @@ -1,6 +1,5 @@ --- layout: "docs" -title: "std::sync" description: "This module provides a small hosted baseline for synchronization primitives used by the current task lowering on linux/x86_64." docsCollection: "silk" section: "std" diff --git a/src/silk/docs/std/tar-async/page.md b/src/silk/docs/std/tar-async/page.md index 265b389b..0af62e36 100644 --- a/src/silk/docs/std/tar-async/page.md +++ b/src/silk/docs/std/tar-async/page.md @@ -1,6 +1,5 @@ --- layout: "docs" -title: "std::tar::async" description: "Source: std/tar/async.slk" docsCollection: "silk" section: "std" diff --git a/src/silk/docs/std/tar/page.md b/src/silk/docs/std/tar/page.md index ff8c46f3..a0b533d4 100644 --- a/src/silk/docs/std/tar/page.md +++ b/src/silk/docs/std/tar/page.md @@ -1,6 +1,5 @@ --- layout: "docs" -title: "std::tar" description: "std::tar provides a portable, streaming tar reader/writer for building and inspecting tar archives without loading whole archives into memory." docsCollection: "silk" section: "std" diff --git a/src/silk/docs/std/task/page.md b/src/silk/docs/std/task/page.md index 14b51aff..aa6ddcbc 100644 --- a/src/silk/docs/std/task/page.md +++ b/src/silk/docs/std/task/page.md @@ -1,6 +1,5 @@ --- layout: "docs" -title: "std::task" description: "This module provides a small hosted baseline for task/runtime utilities on linux/x86_64." docsCollection: "silk" section: "std" diff --git a/src/silk/docs/std/temporal/page.md b/src/silk/docs/std/temporal/page.md index ee5ea94e..ccb2a4fb 100644 --- a/src/silk/docs/std/temporal/page.md +++ b/src/silk/docs/std/temporal/page.md @@ -1,6 +1,5 @@ --- layout: "docs" -title: "std::temporal" description: "A small, ergonomic subset is implemented in std/temporal.slk:" docsCollection: "silk" section: "std" diff --git a/src/silk/docs/std/test/page.md b/src/silk/docs/std/test/page.md index 87789f78..36ac755e 100644 --- a/src/silk/docs/std/test/page.md +++ b/src/silk/docs/std/test/page.md @@ -1,6 +1,5 @@ --- layout: "docs" -title: "std::test" description: "This module provides test-only helpers that record test failures without aborting the process." docsCollection: "silk" section: "std" diff --git a/src/silk/docs/std/time/page.md b/src/silk/docs/std/time/page.md index fe8b72e5..a1ca1a6d 100644 --- a/src/silk/docs/std/time/page.md +++ b/src/silk/docs/std/time/page.md @@ -1,6 +1,5 @@ --- layout: "docs" -title: "std::time" description: "std::time is a small CLI-oriented facade over the broader std::temporal module. It exposes monotonic timing and basic duration helpers without requiring tools to import calendar/date functionality." docsCollection: "silk" section: "std" diff --git a/src/silk/docs/std/tls/page.md b/src/silk/docs/std/tls/page.md index eda9b1ed..d312f3bb 100644 --- a/src/silk/docs/std/tls/page.md +++ b/src/silk/docs/std/tls/page.md @@ -1,6 +1,5 @@ --- layout: "docs" -title: "std::tls" description: "std::tls provides TLS client/server primitives for the hosted POSIX baseline using the built-in mbedTLS provider." docsCollection: "silk" section: "std" diff --git a/src/silk/docs/std/toml/page.md b/src/silk/docs/std/toml/page.md index 31a6077c..4b528a19 100644 --- a/src/silk/docs/std/toml/page.md +++ b/src/silk/docs/std/toml/page.md @@ -1,6 +1,5 @@ --- layout: "docs" -title: "std::toml" description: "std::toml provides a TOML v1.0-style parser plus deterministic emission over an index-based DOM." docsCollection: "silk" section: "std" diff --git a/src/silk/docs/std/unicode/page.md b/src/silk/docs/std/unicode/page.md index f5db55ce..237b913b 100644 --- a/src/silk/docs/std/unicode/page.md +++ b/src/silk/docs/std/unicode/page.md @@ -1,6 +1,5 @@ --- layout: "docs" -title: "std::unicode" description: "This module provides practical Unicode helpers focused on:" docsCollection: "silk" section: "std" diff --git a/src/silk/docs/std/url/page.md b/src/silk/docs/std/url/page.md index ea011ad6..d42cc7c4 100644 --- a/src/silk/docs/std/url/page.md +++ b/src/silk/docs/std/url/page.md @@ -1,6 +1,5 @@ --- layout: "docs" -title: "std::url" description: "std::url provides a WHATWG-URL-compatible URL parser and serializer plus URLSearchParams behavior (application/x-www-form-urlencoded)." docsCollection: "silk" section: "std" diff --git a/src/silk/docs/std/uuid-random/page.md b/src/silk/docs/std/uuid-random/page.md index f6baa2c0..e1b727b4 100644 --- a/src/silk/docs/std/uuid-random/page.md +++ b/src/silk/docs/std/uuid-random/page.md @@ -1,6 +1,5 @@ --- layout: "docs" -title: "std::uuid::random" description: "Source: std/uuid/random.slk" docsCollection: "silk" section: "std" diff --git a/src/silk/docs/std/uuid/page.md b/src/silk/docs/std/uuid/page.md index cfc1f5e2..44dc058d 100644 --- a/src/silk/docs/std/uuid/page.md +++ b/src/silk/docs/std/uuid/page.md @@ -1,6 +1,5 @@ --- layout: "docs" -title: "std::uuid" description: "std::uuid provides a robust UUID/ULID-like identifier primitive with full support for UUID versions 1, 3, 4, 5, 6, 7, and 8 (RFC 4122 + RFC 9562 family)." docsCollection: "silk" section: "std" diff --git a/src/silk/docs/std/vector/page.md b/src/silk/docs/std/vector/page.md index db7d2ea5..10e35ceb 100644 --- a/src/silk/docs/std/vector/page.md +++ b/src/silk/docs/std/vector/page.md @@ -1,6 +1,5 @@ --- layout: "docs" -title: "std::vector" description: "This module provides a generic, growable vector type Vector(T) used broadly across std::." docsCollection: "silk" section: "std" diff --git a/src/silk/docs/std/wasm/page.md b/src/silk/docs/std/wasm/page.md index 2d24184f..7731b0e0 100644 --- a/src/silk/docs/std/wasm/page.md +++ b/src/silk/docs/std/wasm/page.md @@ -1,6 +1,5 @@ --- layout: "docs" -title: "WebAssembly Runtime (std::wasm)" description: "std::wasm is the standard library surface for executing WebAssembly (WASM) modules from Silk." docsCollection: "silk" section: "std" diff --git a/src/silk/docs/std/websocket/page.md b/src/silk/docs/std/websocket/page.md index 9771c633..19566c89 100644 --- a/src/silk/docs/std/websocket/page.md +++ b/src/silk/docs/std/websocket/page.md @@ -1,6 +1,5 @@ --- layout: "docs" -title: "std::websocket" description: "std::websocket provides an RFC 6455 WebSocket implementation on top of std::net::TCPStream (client + server handshake, framing, ping/pong, close, fragmentation)." docsCollection: "silk" section: "std" diff --git a/src/silk/docs/std/window-gtk/page.md b/src/silk/docs/std/window-gtk/page.md index ae7d49ae..2887b553 100644 --- a/src/silk/docs/std/window-gtk/page.md +++ b/src/silk/docs/std/window-gtk/page.md @@ -1,6 +1,5 @@ --- layout: "docs" -title: "std::window::gtk" description: "std::window::gtk is the GTK-specific facade for applications that want to select the Linux GTK provider explicitly while still using the portable std::window types." docsCollection: "silk" section: "std" diff --git a/src/silk/docs/std/window-ios/page.md b/src/silk/docs/std/window-ios/page.md index 06e8e8aa..c6f130f7 100644 --- a/src/silk/docs/std/window-ios/page.md +++ b/src/silk/docs/std/window-ios/page.md @@ -1,6 +1,5 @@ --- layout: "docs" -title: "std::window::ios" description: "std::window::ios is the iOS-specific facade for applications that want to select the iOS provider explicitly while still using the portable std::window types." docsCollection: "silk" section: "std" diff --git a/src/silk/docs/std/window-macos/page.md b/src/silk/docs/std/window-macos/page.md index 52e30c60..b4ee5c18 100644 --- a/src/silk/docs/std/window-macos/page.md +++ b/src/silk/docs/std/window-macos/page.md @@ -1,6 +1,5 @@ --- layout: "docs" -title: "std::window::macos" description: "std::window::macos is the macOS-specific facade for applications that want to select the macOS provider explicitly while still using the portable std::window types." docsCollection: "silk" section: "std" diff --git a/src/silk/docs/std/window/page.md b/src/silk/docs/std/window/page.md index f5d4745f..9e7fd861 100644 --- a/src/silk/docs/std/window/page.md +++ b/src/silk/docs/std/window/page.md @@ -1,6 +1,5 @@ --- layout: "docs" -title: "std::window" description: "std::window is the opt-in standard-library windowing facade. Importing and reaching this module's runtime calls is the signal that an executable wants platform window support; unrelated std:: users do" docsCollection: "silk" section: "std" diff --git a/src/silk/docs/std/xml/page.md b/src/silk/docs/std/xml/page.md index d6010984..649b27e4 100644 --- a/src/silk/docs/std/xml/page.md +++ b/src/silk/docs/std/xml/page.md @@ -1,6 +1,5 @@ --- layout: "docs" -title: "std::xml — XML Parsing (libxml2)" description: "std::xml provides a small, DOM-style XML parsing and traversal API backed by libxml2." docsCollection: "silk" section: "std" diff --git a/src/silk/docs/std/z3/page.md b/src/silk/docs/std/z3/page.md index e8f0163a..c852af2d 100644 --- a/src/silk/docs/std/z3/page.md +++ b/src/silk/docs/std/z3/page.md @@ -1,6 +1,5 @@ --- layout: "docs" -title: "std::runtime::z3 — Z3 SMT Solver (C API Bindings)" description: "std::runtime::z3 provides low-level ext bindings for the Z3 C API. It is intended for user-space programs that want to call into Z3 directly." docsCollection: "silk" section: "std" diff --git a/src/silk/docs/usage/cli-examples/page.md b/src/silk/docs/usage/cli-examples/page.md index a7ae3c72..058c2aab 100644 --- a/src/silk/docs/usage/cli-examples/page.md +++ b/src/silk/docs/usage/cli-examples/page.md @@ -1,6 +1,5 @@ --- layout: "docs" -title: "CLI usage examples" description: "This page is a grab bag of practical workflows for the silk toolchain. It focuses on how people actually use the CLI: quick feedback (check), tests that integrate with CI (test), and explicit build ou" docsCollection: "silk" section: "usage" diff --git a/src/silk/docs/usage/editor-coc-nvim/page.md b/src/silk/docs/usage/editor-coc-nvim/page.md index ff7012c2..0994819a 100644 --- a/src/silk/docs/usage/editor-coc-nvim/page.md +++ b/src/silk/docs/usage/editor-coc-nvim/page.md @@ -1,6 +1,5 @@ --- layout: "docs" -title: "coc.nvim Integration for Silk" description: "This page describes the coc.nvim client for the silk-lsp language server." docsCollection: "silk" section: "usage" diff --git a/src/silk/docs/usage/editor-ctags/page.md b/src/silk/docs/usage/editor-ctags/page.md index 963b2f4b..ba16f7e0 100644 --- a/src/silk/docs/usage/editor-ctags/page.md +++ b/src/silk/docs/usage/editor-ctags/page.md @@ -1,6 +1,5 @@ --- layout: "docs" -title: "Universal Ctags Support" description: "The Silk compiler repository ships a Universal Ctags configuration for Silk at its root (.ctags)." docsCollection: "silk" section: "usage" diff --git a/src/silk/docs/usage/editor-textmate/page.md b/src/silk/docs/usage/editor-textmate/page.md index e787c745..717f43a4 100644 --- a/src/silk/docs/usage/editor-textmate/page.md +++ b/src/silk/docs/usage/editor-textmate/page.md @@ -1,6 +1,5 @@ --- layout: "docs" -title: "TextMate Grammar (tmLanguage)" description: "The Silk compiler repository ships a TextMate grammar for Silk under textmate/silk.tmLanguage.json. It provides syntax highlighting for editors that consume tmLanguage grammars (TextMate, VS Code, Sub" docsCollection: "silk" section: "usage" diff --git a/src/silk/docs/usage/editor-vim/page.md b/src/silk/docs/usage/editor-vim/page.md index 2976c4ee..afa17fd6 100644 --- a/src/silk/docs/usage/editor-vim/page.md +++ b/src/silk/docs/usage/editor-vim/page.md @@ -1,6 +1,5 @@ --- layout: "docs" -title: "Vim Integration for Silk" description: "This document describes the built-in Vim support for Silk shipped with the Silk compiler repository." docsCollection: "silk" section: "usage" diff --git a/src/silk/docs/usage/getting-started/page.md b/src/silk/docs/usage/getting-started/page.md index af468aa2..29148e96 100644 --- a/src/silk/docs/usage/getting-started/page.md +++ b/src/silk/docs/usage/getting-started/page.md @@ -1,6 +1,5 @@ --- layout: "docs" -title: "Getting started" description: "This page gets you from “a file” to “a runnable program”, and points you at the docs you’ll use most often." docsCollection: "silk" section: "usage" diff --git a/src/silk/docs/usage/github-actions/page.md b/src/silk/docs/usage/github-actions/page.md index a7ebdca3..66b7188c 100644 --- a/src/silk/docs/usage/github-actions/page.md +++ b/src/silk/docs/usage/github-actions/page.md @@ -1,6 +1,5 @@ --- layout: "docs" -title: "GitHub Actions: Install Released silk" description: "This guide shows how to install the released Silk CLI in another GitHub Actions workflow without rebuilding the compiler from source." docsCollection: "silk" section: "usage" diff --git a/src/silk/docs/usage/github-linguist/page.md b/src/silk/docs/usage/github-linguist/page.md index 5c5e0576..32086f54 100644 --- a/src/silk/docs/usage/github-linguist/page.md +++ b/src/silk/docs/usage/github-linguist/page.md @@ -1,6 +1,5 @@ --- layout: "docs" -title: "GitHub Linguist Support" description: "The Silk compiler repository includes a .gitattributes entry that tags *.slk files as Silk sources for GitHub Linguist." docsCollection: "silk" section: "usage" diff --git a/src/silk/docs/usage/guide-examples/page.md b/src/silk/docs/usage/guide-examples/page.md index f5c91dac..54ce5eb6 100644 --- a/src/silk/docs/usage/guide-examples/page.md +++ b/src/silk/docs/usage/guide-examples/page.md @@ -1,6 +1,5 @@ --- layout: "docs" -title: "silk guide" description: "silk guide is the curated example discovery surface for common Silk tasks." docsCollection: "silk" section: "usage" diff --git a/src/silk/docs/usage/howto-custom-stdlib-root/page.md b/src/silk/docs/usage/howto-custom-stdlib-root/page.md index 510e435f..1b03dd4d 100644 --- a/src/silk/docs/usage/howto-custom-stdlib-root/page.md +++ b/src/silk/docs/usage/howto-custom-stdlib-root/page.md @@ -1,6 +1,5 @@ --- layout: "docs" -title: "How-To: Use a Custom Stdlib Root (and Runtime)" description: "The std::... modules are loaded from a stdlib root (a directory containing a std/ tree). Because std::runtime is part of that source tree, selecting a different stdlib root is also how you select a di" docsCollection: "silk" section: "usage" diff --git a/src/silk/docs/usage/howto-dynamic-libraries/page.md b/src/silk/docs/usage/howto-dynamic-libraries/page.md index 73924f5e..db1f5ec3 100644 --- a/src/silk/docs/usage/howto-dynamic-libraries/page.md +++ b/src/silk/docs/usage/howto-dynamic-libraries/page.md @@ -1,6 +1,5 @@ --- layout: "docs" -title: "How To Load Dynamic Libraries" description: "This guide shows how to load a dynamic library at runtime, resolve a symbol, convert it to a typed C function pointer, and call it from Silk." docsCollection: "silk" section: "usage" diff --git a/src/silk/docs/usage/howto-lumen-trail/page.md b/src/silk/docs/usage/howto-lumen-trail/page.md index bced37eb..b404463a 100644 --- a/src/silk/docs/usage/howto-lumen-trail/page.md +++ b/src/silk/docs/usage/howto-lumen-trail/page.md @@ -1,6 +1,5 @@ --- layout: "docs" -title: "Build LumenTrail, an iOS Objective-C App With Silk Stdlib Code" description: "This how-to uses examples/projects/lumen-trail/ to show the current iOS embedding flow on Apple Silicon macOS through the LumenTrail simulator app:" docsCollection: "silk" section: "usage" diff --git a/src/silk/docs/usage/howto-run-wasi-node/page.md b/src/silk/docs/usage/howto-run-wasi-node/page.md index 1a5df9a9..757d0494 100644 --- a/src/silk/docs/usage/howto-run-wasi-node/page.md +++ b/src/silk/docs/usage/howto-run-wasi-node/page.md @@ -1,6 +1,5 @@ --- layout: "docs" -title: "How-To: Run wasm32-wasi Output in Node.js" description: "This guide shows how to:" docsCollection: "silk" section: "usage" diff --git a/src/silk/docs/usage/pure-silk-gpu-ml/page.md b/src/silk/docs/usage/pure-silk-gpu-ml/page.md index f7592536..b93186a1 100644 --- a/src/silk/docs/usage/pure-silk-gpu-ml/page.md +++ b/src/silk/docs/usage/pure-silk-gpu-ml/page.md @@ -1,6 +1,5 @@ --- layout: "docs" -title: "Pure-Silk learned-threshold GPU classifier" description: "examples/pure_silk_gpu_ml.slk is a small but real supervised-learning workflow. It uses a one-dimensional nearest-centroid model:" docsCollection: "silk" section: "usage" diff --git a/src/silk/docs/usage/pure-silk-gpu/page.md b/src/silk/docs/usage/pure-silk-gpu/page.md index eac726b8..64fb0d20 100644 --- a/src/silk/docs/usage/pure-silk-gpu/page.md +++ b/src/silk/docs/usage/pure-silk-gpu/page.md @@ -1,6 +1,5 @@ --- layout: "docs" -title: "Pure-Silk CPU/GPU program" description: "The following workflow keeps application code entirely in Silk. main and ordinary functions compile for the host CPU; attr(device=gpu) functions are compiled into target GPU artifacts embedded in the " docsCollection: "silk" section: "usage" diff --git a/src/silk/docs/usage/tutorials/01-first-program/page.md b/src/silk/docs/usage/tutorials/01-first-program/page.md index e6e7af94..06b5f07a 100644 --- a/src/silk/docs/usage/tutorials/01-first-program/page.md +++ b/src/silk/docs/usage/tutorials/01-first-program/page.md @@ -1,6 +1,5 @@ --- layout: "docs" -title: "Tutorial 1: your first program" description: "This tutorial gets you from “a file” to “a runnable program” with the smallest useful workflow:" docsCollection: "silk" section: "usage" diff --git a/src/silk/docs/usage/tutorials/02-structs-and-impls/page.md b/src/silk/docs/usage/tutorials/02-structs-and-impls/page.md index f4796778..f45c03c6 100644 --- a/src/silk/docs/usage/tutorials/02-structs-and-impls/page.md +++ b/src/silk/docs/usage/tutorials/02-structs-and-impls/page.md @@ -1,6 +1,5 @@ --- layout: "docs" -title: "Tutorial 2: structs and impl" description: "This tutorial covers:" docsCollection: "silk" section: "usage" diff --git a/src/silk/docs/usage/tutorials/03-arrays-and-slices/page.md b/src/silk/docs/usage/tutorials/03-arrays-and-slices/page.md index 6ded24f5..abab9990 100644 --- a/src/silk/docs/usage/tutorials/03-arrays-and-slices/page.md +++ b/src/silk/docs/usage/tutorials/03-arrays-and-slices/page.md @@ -1,6 +1,5 @@ --- layout: "docs" -title: "Tutorial 3: Arrays and Slices" description: "This tutorial covers:" docsCollection: "silk" section: "usage" diff --git a/src/silk/docs/usage/tutorials/04-filesystem/page.md b/src/silk/docs/usage/tutorials/04-filesystem/page.md index cffefa9e..c9195566 100644 --- a/src/silk/docs/usage/tutorials/04-filesystem/page.md +++ b/src/silk/docs/usage/tutorials/04-filesystem/page.md @@ -1,6 +1,5 @@ --- layout: "docs" -title: "Tutorial 4: filesystem basics (std::fs)" description: "This tutorial demonstrates a very common “systems script” pattern:" docsCollection: "silk" section: "usage" diff --git a/src/silk/docs/usage/tutorials/05-concurrency/page.md b/src/silk/docs/usage/tutorials/05-concurrency/page.md index 23de4189..e37f76f7 100644 --- a/src/silk/docs/usage/tutorials/05-concurrency/page.md +++ b/src/silk/docs/usage/tutorials/05-concurrency/page.md @@ -1,6 +1,5 @@ --- layout: "docs" -title: "Tutorial 5: concurrency basics (async, task, yield, await)" description: "Silk’s concurrency model is built from two orthogonal modifiers:" docsCollection: "silk" section: "usage" diff --git a/src/silk/docs/usage/tutorials/06-async-io-streams-abort/page.md b/src/silk/docs/usage/tutorials/06-async-io-streams-abort/page.md index 69f0abda..4422c81d 100644 --- a/src/silk/docs/usage/tutorials/06-async-io-streams-abort/page.md +++ b/src/silk/docs/usage/tutorials/06-async-io-streams-abort/page.md @@ -1,6 +1,5 @@ --- layout: "docs" -title: "Tutorial 6: Async I/O + Streams + Abort Signals" description: "This tutorial shows how to compose the current concurrency + stdlib building blocks into practical I/O pipelines:" docsCollection: "silk" section: "usage" diff --git a/src/silk/docs/usage/tutorials/07-formal-silk/page.md b/src/silk/docs/usage/tutorials/07-formal-silk/page.md index 74d68d45..11d590f2 100644 --- a/src/silk/docs/usage/tutorials/07-formal-silk/page.md +++ b/src/silk/docs/usage/tutorials/07-formal-silk/page.md @@ -1,6 +1,5 @@ --- layout: "docs" -title: "Tutorial 7: Formal Silk in real code" description: "This tutorial shows how Formal Silk fits into ordinary systems code:" docsCollection: "silk" section: "usage" diff --git a/src/silk/spec/2026/page.md b/src/silk/spec/2026/page.md index 9b54ef52..eaeaacc1 100644 --- a/src/silk/spec/2026/page.md +++ b/src/silk/spec/2026/page.md @@ -1,6 +1,6 @@ --- layout: "spec" -title: "Silk Specification (2026)" +redirectFrom: ["/silk/docs/spec/2026/"] description: "This is the single-file edition of the Silk language specification for 2026." docsCollection: "silk" section: "spec" diff --git a/src/silk/wiki/language/borrow-checker/page.md b/src/silk/wiki/language/borrow-checker/page.md index 23f99e2e..fc4c6907 100644 --- a/src/silk/wiki/language/borrow-checker/page.md +++ b/src/silk/wiki/language/borrow-checker/page.md @@ -1,6 +1,5 @@ --- layout: "docs" -title: "Borrow checker (design)" description: "Silk’s long-term design includes a borrow-checker-style static safety layer over references and mutation. Silk currently enforces a simpler, explicit mut borrow contract (see mutability)." docsCollection: "silkWiki" section: "language" diff --git a/src/silk/wiki/language/buffers/page.md b/src/silk/wiki/language/buffers/page.md index bbb0cd71..234287e7 100644 --- a/src/silk/wiki/language/buffers/page.md +++ b/src/silk/wiki/language/buffers/page.md @@ -1,6 +1,5 @@ --- layout: "docs" -title: "Buffers (Buffer(T)) (design)" description: "The long-term design includes an intrinsic Buffer(T) type for low-level, unsafe contiguous memory access, intended to sit underneath safe collections." docsCollection: "silkWiki" section: "language" diff --git a/src/silk/wiki/language/cheat-sheet/page.md b/src/silk/wiki/language/cheat-sheet/page.md index 3a8871ca..48eeb66d 100644 --- a/src/silk/wiki/language/cheat-sheet/page.md +++ b/src/silk/wiki/language/cheat-sheet/page.md @@ -1,6 +1,5 @@ --- layout: "docs" -title: "Cheat sheet" description: "If you want a fast, high-signal overview of Silk surface syntax, start with the canonical cheat sheet:" docsCollection: "silkWiki" section: "language" diff --git a/src/silk/wiki/language/concurrency/page.md b/src/silk/wiki/language/concurrency/page.md index d9ff9c31..880ca6f0 100644 --- a/src/silk/wiki/language/concurrency/page.md +++ b/src/silk/wiki/language/concurrency/page.md @@ -1,6 +1,5 @@ --- layout: "docs" -title: "Concurrency (async, task, await, yield)" description: "Silk concurrency is built around:" docsCollection: "silkWiki" section: "language" diff --git a/src/silk/wiki/language/const-functions/page.md b/src/silk/wiki/language/const-functions/page.md index eb8e6c94..155d2c8b 100644 --- a/src/silk/wiki/language/const-functions/page.md +++ b/src/silk/wiki/language/const-functions/page.md @@ -1,6 +1,5 @@ --- layout: "docs" -title: "Const Functions (const fn)" description: "const fn marks a function as eligible for compile-time evaluation." docsCollection: "silkWiki" section: "language" diff --git a/src/silk/wiki/language/conventions/page.md b/src/silk/wiki/language/conventions/page.md index 0f3ce3e2..109dd98c 100644 --- a/src/silk/wiki/language/conventions/page.md +++ b/src/silk/wiki/language/conventions/page.md @@ -1,6 +1,5 @@ --- layout: "docs" -title: "Conventions" description: "This page summarizes the conventions used throughout the Silk language docs: notation, naming, and the “implementation status” pattern." docsCollection: "silkWiki" section: "language" diff --git a/src/silk/wiki/language/dependent-types/page.md b/src/silk/wiki/language/dependent-types/page.md index 1ce6ccc4..4c82d117 100644 --- a/src/silk/wiki/language/dependent-types/page.md +++ b/src/silk/wiki/language/dependent-types/page.md @@ -1,6 +1,5 @@ --- layout: "docs" -title: "Dependent types (const parameters) (design)" description: "This page covers Silk’s intended support for types that mention compile-time values (especially integers), such as dependent-length collections." docsCollection: "silkWiki" section: "language" diff --git a/src/silk/wiki/language/doc-comments/page.md b/src/silk/wiki/language/doc-comments/page.md index 9a14afc0..00b13521 100644 --- a/src/silk/wiki/language/doc-comments/page.md +++ b/src/silk/wiki/language/doc-comments/page.md @@ -1,6 +1,5 @@ --- layout: "docs" -title: "Doc comments" description: "Silk supports both line and block doc comments. They attach to the following declaration (like many C/Rust-style doc systems)." docsCollection: "silkWiki" section: "language" diff --git a/src/silk/wiki/language/duration-instant/page.md b/src/silk/wiki/language/duration-instant/page.md index 33b8bddb..8fb454be 100644 --- a/src/silk/wiki/language/duration-instant/page.md +++ b/src/silk/wiki/language/duration-instant/page.md @@ -1,6 +1,5 @@ --- layout: "docs" -title: "Duration and Instant" description: "Duration represents a signed time span and Instant represents a signed point-in-time on a monotonic timeline. the backend treats both as distinct Silk types that lower to i64 nanoseconds." docsCollection: "silkWiki" section: "language" diff --git a/src/silk/wiki/language/enums/page.md b/src/silk/wiki/language/enums/page.md index 37756ce6..13cba9b6 100644 --- a/src/silk/wiki/language/enums/page.md +++ b/src/silk/wiki/language/enums/page.md @@ -1,6 +1,5 @@ --- layout: "docs" -title: "Enums" description: "enum defines a nominal sum type with a fixed set of variants." docsCollection: "silkWiki" section: "language" diff --git a/src/silk/wiki/language/errors/page.md b/src/silk/wiki/language/errors/page.md index bf870666..eb0b2d3d 100644 --- a/src/silk/wiki/language/errors/page.md +++ b/src/silk/wiki/language/errors/page.md @@ -1,6 +1,5 @@ --- layout: "docs" -title: "Errors and assertions" description: "Silk favors explicit, typed error modeling (optionals and Result-style return shapes) and uses typed errors (error, panic, T | ErrorType...) for unrecoverable logic bugs and contract violations." docsCollection: "silkWiki" section: "language" diff --git a/src/silk/wiki/language/ext/page.md b/src/silk/wiki/language/ext/page.md index 859a6359..bb330b53 100644 --- a/src/silk/wiki/language/ext/page.md +++ b/src/silk/wiki/language/ext/page.md @@ -1,6 +1,5 @@ --- layout: "docs" -title: "External declarations (ext)" description: "ext declares foreign symbols so Silk code can call C (or wasm imports) access foreign variables." docsCollection: "silkWiki" section: "language" diff --git a/src/silk/wiki/language/flow-blocks-statements/page.md b/src/silk/wiki/language/flow-blocks-statements/page.md index 5d79118c..22f87f52 100644 --- a/src/silk/wiki/language/flow-blocks-statements/page.md +++ b/src/silk/wiki/language/flow-blocks-statements/page.md @@ -1,6 +1,5 @@ --- layout: "docs" -title: "Blocks and statements" description: "Blocks ({ ... }) group statements and introduce a new scope." docsCollection: "silkWiki" section: "language" diff --git a/src/silk/wiki/language/flow-break/page.md b/src/silk/wiki/language/flow-break/page.md index dc002578..553bfd08 100644 --- a/src/silk/wiki/language/flow-break/page.md +++ b/src/silk/wiki/language/flow-break/page.md @@ -1,6 +1,5 @@ --- layout: "docs" -title: "break" description: "break; exits the nearest enclosing loop." docsCollection: "silkWiki" section: "language" diff --git a/src/silk/wiki/language/flow-continue/page.md b/src/silk/wiki/language/flow-continue/page.md index c5d61f6b..19cdd8bd 100644 --- a/src/silk/wiki/language/flow-continue/page.md +++ b/src/silk/wiki/language/flow-continue/page.md @@ -1,6 +1,5 @@ --- layout: "docs" -title: "continue" description: "continue; skips the remainder of the current loop body and advances to the next iteration." docsCollection: "silkWiki" section: "language" diff --git a/src/silk/wiki/language/flow-expression-statements/page.md b/src/silk/wiki/language/flow-expression-statements/page.md index 1463a23e..2aab425a 100644 --- a/src/silk/wiki/language/flow-expression-statements/page.md +++ b/src/silk/wiki/language/flow-expression-statements/page.md @@ -1,6 +1,5 @@ --- layout: "docs" -title: "Expression statements" description: "Many expressions can appear as standalone statements when followed by ; (assignment, calls, ++/--, and other “statement-like” expressions)." docsCollection: "silkWiki" section: "language" diff --git a/src/silk/wiki/language/flow-for/page.md b/src/silk/wiki/language/flow-for/page.md index 2e70ad55..5152155c 100644 --- a/src/silk/wiki/language/flow-for/page.md +++ b/src/silk/wiki/language/flow-for/page.md @@ -1,6 +1,5 @@ --- layout: "docs" -title: "for loops" description: "for loops iterate over:" docsCollection: "silkWiki" section: "language" diff --git a/src/silk/wiki/language/flow-if-else/page.md b/src/silk/wiki/language/flow-if-else/page.md index 5c6d8d1a..47c69b00 100644 --- a/src/silk/wiki/language/flow-if-else/page.md +++ b/src/silk/wiki/language/flow-if-else/page.md @@ -1,6 +1,5 @@ --- layout: "docs" -title: "if / else" description: "Use if / else for boolean branching." docsCollection: "silkWiki" section: "language" diff --git a/src/silk/wiki/language/flow-loop/page.md b/src/silk/wiki/language/flow-loop/page.md index 62f6d7b6..7f6367c7 100644 --- a/src/silk/wiki/language/flow-loop/page.md +++ b/src/silk/wiki/language/flow-loop/page.md @@ -1,6 +1,5 @@ --- layout: "docs" -title: "loop" description: "loop { ... } is an infinite loop that exits via break or return." docsCollection: "silkWiki" section: "language" diff --git a/src/silk/wiki/language/flow-match/page.md b/src/silk/wiki/language/flow-match/page.md index 72a4fc7c..2b265306 100644 --- a/src/silk/wiki/language/flow-match/page.md +++ b/src/silk/wiki/language/flow-match/page.md @@ -1,6 +1,5 @@ --- layout: "docs" -title: "match" description: "match provides structured pattern matching." docsCollection: "silkWiki" section: "language" diff --git a/src/silk/wiki/language/flow-overview/page.md b/src/silk/wiki/language/flow-overview/page.md index 5864b6e3..381c27f1 100644 --- a/src/silk/wiki/language/flow-overview/page.md +++ b/src/silk/wiki/language/flow-overview/page.md @@ -1,6 +1,5 @@ --- layout: "docs" -title: "Flow control overview" description: "Silk has familiar structured control flow:" docsCollection: "silkWiki" section: "language" diff --git a/src/silk/wiki/language/flow-return/page.md b/src/silk/wiki/language/flow-return/page.md index 14c7cebc..86a67725 100644 --- a/src/silk/wiki/language/flow-return/page.md +++ b/src/silk/wiki/language/flow-return/page.md @@ -1,6 +1,5 @@ --- layout: "docs" -title: "return" description: "Use return to exit the current function." docsCollection: "silkWiki" section: "language" diff --git a/src/silk/wiki/language/flow-while/page.md b/src/silk/wiki/language/flow-while/page.md index 479434c8..a8072c55 100644 --- a/src/silk/wiki/language/flow-while/page.md +++ b/src/silk/wiki/language/flow-while/page.md @@ -1,6 +1,5 @@ --- layout: "docs" -title: "while" description: "Use while for condition-controlled looping." docsCollection: "silkWiki" section: "language" diff --git a/src/silk/wiki/language/formal-verification/page.md b/src/silk/wiki/language/formal-verification/page.md index 6e7d0ab8..2d27bd7c 100644 --- a/src/silk/wiki/language/formal-verification/page.md +++ b/src/silk/wiki/language/formal-verification/page.md @@ -1,6 +1,5 @@ --- layout: "docs" -title: "Formal verification (Formal Silk)" description: "Silk includes syntax for writing contracts and verification metadata:" docsCollection: "silkWiki" section: "language" diff --git a/src/silk/wiki/language/function-disciplines/page.md b/src/silk/wiki/language/function-disciplines/page.md index 01dac4e3..231e58b5 100644 --- a/src/silk/wiki/language/function-disciplines/page.md +++ b/src/silk/wiki/language/function-disciplines/page.md @@ -1,6 +1,5 @@ --- layout: "docs" -title: "Function disciplines (pure, async, task)" description: "Function modifiers declare constraints and concurrency behavior:" docsCollection: "silkWiki" section: "language" diff --git a/src/silk/wiki/language/generics/page.md b/src/silk/wiki/language/generics/page.md index 24903961..8152241b 100644 --- a/src/silk/wiki/language/generics/page.md +++ b/src/silk/wiki/language/generics/page.md @@ -1,6 +1,5 @@ --- layout: "docs" -title: "Generics (monomorphized)" description: "Silk generics are compile-time and monomorphized: each applied type like Vector(int) produces a concrete instantiation at build time (no runtime type parameters)." docsCollection: "silkWiki" section: "language" diff --git a/src/silk/wiki/language/grammar/page.md b/src/silk/wiki/language/grammar/page.md index 448997a4..2e87f864 100644 --- a/src/silk/wiki/language/grammar/page.md +++ b/src/silk/wiki/language/grammar/page.md @@ -1,6 +1,5 @@ --- layout: "docs" -title: "Grammar" description: "grammar is the canonical “what the parser accepts” reference for Silk surface syntax." docsCollection: "silkWiki" section: "language" diff --git a/src/silk/wiki/language/interfaces/page.md b/src/silk/wiki/language/interfaces/page.md index 4fac3397..598bb91b 100644 --- a/src/silk/wiki/language/interfaces/page.md +++ b/src/silk/wiki/language/interfaces/page.md @@ -1,6 +1,5 @@ --- layout: "docs" -title: "Interfaces" description: "Interfaces declare method signatures that types (or modules) can conform to via impl ... as ... (or module ... as ...). This is the basis for protocol-like surfaces such as iterators and Drop." docsCollection: "silkWiki" section: "language" diff --git a/src/silk/wiki/language/literals-aggregate/page.md b/src/silk/wiki/language/literals-aggregate/page.md index 41f53ce7..fdddcaa7 100644 --- a/src/silk/wiki/language/literals-aggregate/page.md +++ b/src/silk/wiki/language/literals-aggregate/page.md @@ -1,6 +1,5 @@ --- layout: "docs" -title: "Aggregate literals (arrays and structs)" description: "Aggregate literals build compound values directly in source code:" docsCollection: "silkWiki" section: "language" diff --git a/src/silk/wiki/language/literals-boolean/page.md b/src/silk/wiki/language/literals-boolean/page.md index 5559f5ba..19e3265d 100644 --- a/src/silk/wiki/language/literals-boolean/page.md +++ b/src/silk/wiki/language/literals-boolean/page.md @@ -1,6 +1,5 @@ --- layout: "docs" -title: "Boolean literals" description: "Silk has the boolean type bool with literals true and false." docsCollection: "silkWiki" section: "language" diff --git a/src/silk/wiki/language/literals-character/page.md b/src/silk/wiki/language/literals-character/page.md index 19863c90..bb0cf119 100644 --- a/src/silk/wiki/language/literals-character/page.md +++ b/src/silk/wiki/language/literals-character/page.md @@ -1,6 +1,5 @@ --- layout: "docs" -title: "Character literals" description: "char represents a Unicode scalar value. Character literals write a char value directly in source code." docsCollection: "silkWiki" section: "language" diff --git a/src/silk/wiki/language/literals-duration/page.md b/src/silk/wiki/language/literals-duration/page.md index 69c081c6..80bfc708 100644 --- a/src/silk/wiki/language/literals-duration/page.md +++ b/src/silk/wiki/language/literals-duration/page.md @@ -1,6 +1,5 @@ --- layout: "docs" -title: "Duration literals" description: "Duration literals represent time spans with unit suffixes (ms, s, min, etc) and produce a Duration value." docsCollection: "silkWiki" section: "language" diff --git a/src/silk/wiki/language/literals-numeric/page.md b/src/silk/wiki/language/literals-numeric/page.md index 7046dfa8..cbd4923b 100644 --- a/src/silk/wiki/language/literals-numeric/page.md +++ b/src/silk/wiki/language/literals-numeric/page.md @@ -1,6 +1,5 @@ --- layout: "docs" -title: "Numeric literals" description: "Silk supports integer and floating-point literals, including base prefixes suffixes as defined in the canonical spec." docsCollection: "silkWiki" section: "language" diff --git a/src/silk/wiki/language/literals-overview/page.md b/src/silk/wiki/language/literals-overview/page.md index 25b4da8c..972fe599 100644 --- a/src/silk/wiki/language/literals-overview/page.md +++ b/src/silk/wiki/language/literals-overview/page.md @@ -1,6 +1,5 @@ --- layout: "docs" -title: "Literals" description: "Literals are the simplest way to write values directly in source code: numbers, booleans, chars, strings, durations, and aggregates like arrays struct literals." docsCollection: "silkWiki" section: "language" diff --git a/src/silk/wiki/language/literals-string/page.md b/src/silk/wiki/language/literals-string/page.md index dcc7b5a6..5f9ca635 100644 --- a/src/silk/wiki/language/literals-string/page.md +++ b/src/silk/wiki/language/literals-string/page.md @@ -1,6 +1,5 @@ --- layout: "docs" -title: "String literals" description: "string is Silk’s built-in UTF‑8 byte sequence type. String literals write a string value directly in source code." docsCollection: "silkWiki" section: "language" diff --git a/src/silk/wiki/language/memory-model/page.md b/src/silk/wiki/language/memory-model/page.md index ad4b54e7..6c899e5e 100644 --- a/src/silk/wiki/language/memory-model/page.md +++ b/src/silk/wiki/language/memory-model/page.md @@ -1,6 +1,5 @@ --- layout: "docs" -title: "Memory model" description: "This page is a learning-oriented companion to the canonical memory model: memory model." docsCollection: "silkWiki" section: "language" diff --git a/src/silk/wiki/language/mutability/page.md b/src/silk/wiki/language/mutability/page.md index 93f7495e..913fcb3c 100644 --- a/src/silk/wiki/language/mutability/page.md +++ b/src/silk/wiki/language/mutability/page.md @@ -1,6 +1,5 @@ --- layout: "docs" -title: "Mutability (mut)" description: "Silk is safe-by-default: bindings and borrows are immutable unless you opt in to mutation." docsCollection: "silkWiki" section: "language" diff --git a/src/silk/wiki/language/operators/page.md b/src/silk/wiki/language/operators/page.md index 8b52672d..07d2f122 100644 --- a/src/silk/wiki/language/operators/page.md +++ b/src/silk/wiki/language/operators/page.md @@ -1,6 +1,5 @@ --- layout: "docs" -title: "Operators" description: "Silk’s operators cover arithmetic, comparisons, logical operators, assignment, casts, ranges, optionals (?., ??), and typed-error propagation (?)." docsCollection: "silkWiki" section: "language" diff --git a/src/silk/wiki/language/optional/page.md b/src/silk/wiki/language/optional/page.md index 8eb1afa5..46731526 100644 --- a/src/silk/wiki/language/optional/page.md +++ b/src/silk/wiki/language/optional/page.md @@ -1,6 +1,5 @@ --- layout: "docs" -title: "Optionals (T?)" description: "Optionals represent “maybe a value” without sentinel nulls." docsCollection: "silkWiki" section: "language" diff --git a/src/silk/wiki/language/packages-imports-exports/page.md b/src/silk/wiki/language/packages-imports-exports/page.md index 1f19ec83..518b2d9b 100644 --- a/src/silk/wiki/language/packages-imports-exports/page.md +++ b/src/silk/wiki/language/packages-imports-exports/page.md @@ -1,6 +1,5 @@ --- layout: "docs" -title: "Packages, imports, and exports" description: "Silk has explicit module/package structure:" docsCollection: "silkWiki" section: "language" diff --git a/src/silk/wiki/language/regions/page.md b/src/silk/wiki/language/regions/page.md index 11cca9f2..c125fe12 100644 --- a/src/silk/wiki/language/regions/page.md +++ b/src/silk/wiki/language/regions/page.md @@ -1,6 +1,5 @@ --- layout: "docs" -title: "Regions (with)" description: "Regions provide a fixed-size, statically allocated backing store that can be used as an allocation context for new." docsCollection: "silkWiki" section: "language" diff --git a/src/silk/wiki/language/struct-requirements/page.md b/src/silk/wiki/language/struct-requirements/page.md index ddb9d987..179c40af 100644 --- a/src/silk/wiki/language/struct-requirements/page.md +++ b/src/silk/wiki/language/struct-requirements/page.md @@ -1,6 +1,5 @@ --- layout: "docs" -title: "Struct requirements (#require)" description: "Use #require on a struct to state requirements that must hold for all values constructed for that type." docsCollection: "silkWiki" section: "language" diff --git a/src/silk/wiki/language/structs-impls-layout/page.md b/src/silk/wiki/language/structs-impls-layout/page.md index 4d3a266e..def828f9 100644 --- a/src/silk/wiki/language/structs-impls-layout/page.md +++ b/src/silk/wiki/language/structs-impls-layout/page.md @@ -1,6 +1,5 @@ --- layout: "docs" -title: "Structs and impl" description: "struct is Silk’s primary record type: named fields stored together as one value. impl blocks attach methods (and special methods like constructor and drop) to a type." docsCollection: "silkWiki" section: "language" diff --git a/src/silk/wiki/language/syntax-tour/page.md b/src/silk/wiki/language/syntax-tour/page.md index 4a459923..d5357328 100644 --- a/src/silk/wiki/language/syntax-tour/page.md +++ b/src/silk/wiki/language/syntax-tour/page.md @@ -1,6 +1,5 @@ --- layout: "docs" -title: "Syntax tour" description: "The canonical syntax tour is a soup-to-nuts walkthrough of Silk surface syntax, with many examples and cross-links:" docsCollection: "silkWiki" section: "language" diff --git a/src/silk/wiki/language/testing/page.md b/src/silk/wiki/language/testing/page.md index fcdc4185..b44d8385 100644 --- a/src/silk/wiki/language/testing/page.md +++ b/src/silk/wiki/language/testing/page.md @@ -1,6 +1,5 @@ --- layout: "docs" -title: "Testing (test)" description: "Silk supports top-level test declarations that are discovered and executed by silk test." docsCollection: "silkWiki" section: "language" diff --git a/src/silk/wiki/language/typed-errors/page.md b/src/silk/wiki/language/typed-errors/page.md index b2772a96..40384ca5 100644 --- a/src/silk/wiki/language/typed-errors/page.md +++ b/src/silk/wiki/language/typed-errors/page.md @@ -1,6 +1,5 @@ --- layout: "docs" -title: "Typed errors (error, panic, and T | ErrorType...)" description: "Typed errors make “this function can fail” explicit in the type system:" docsCollection: "silkWiki" section: "language" diff --git a/src/silk/wiki/language/types/page.md b/src/silk/wiki/language/types/page.md index 36075d40..c4d65058 100644 --- a/src/silk/wiki/language/types/page.md +++ b/src/silk/wiki/language/types/page.md @@ -1,6 +1,5 @@ --- layout: "docs" -title: "Types" description: "Silk is a statically typed language with a small set of built-in primitive types and first-class user-defined types (struct, enum, interface)." docsCollection: "silkWiki" section: "language" diff --git a/src/silk/wiki/language/varargs/page.md b/src/silk/wiki/language/varargs/page.md index 45ab7b84..31390d03 100644 --- a/src/silk/wiki/language/varargs/page.md +++ b/src/silk/wiki/language/varargs/page.md @@ -1,6 +1,5 @@ --- layout: "docs" -title: "Varargs (...args)" description: "Silk supports “varargs” parameters to accept a variable number of trailing arguments, used by std::io::print / std::io::println." docsCollection: "silkWiki" section: "language" diff --git a/src/silk/wiki/page.md b/src/silk/wiki/page.md index 1a1ef0e6..c1615753 100644 --- a/src/silk/wiki/page.md +++ b/src/silk/wiki/page.md @@ -1,6 +1,5 @@ --- layout: "docs" -title: "Silk Wiki" description: "The Silk Wiki is the learning-first, example-driven side of the Silk documentation set." docsCollection: "silkWiki" section: "overview" diff --git a/src/silk/wiki/std/algorithms/page.md b/src/silk/wiki/std/algorithms/page.md index 0b370d22..be568329 100644 --- a/src/silk/wiki/std/algorithms/page.md +++ b/src/silk/wiki/std/algorithms/page.md @@ -1,6 +1,5 @@ --- layout: "docs" -title: "std::algorithms" description: "std::algorithms provides common algorithms over collections. Today, a small Supported forms exists for scalar types." docsCollection: "silkWiki" section: "std" diff --git a/src/silk/wiki/std/args/page.md b/src/silk/wiki/std/args/page.md index 3fc8e7ce..78c57ea5 100644 --- a/src/silk/wiki/std/args/page.md +++ b/src/silk/wiki/std/args/page.md @@ -1,6 +1,5 @@ --- layout: "docs" -title: "std::args" description: "std::args provides helpers for working with the hosted main(argc, argv) entrypoint shape." docsCollection: "silkWiki" section: "std" diff --git a/src/silk/wiki/std/arrays/page.md b/src/silk/wiki/std/arrays/page.md index d4b45493..ce1885b6 100644 --- a/src/silk/wiki/std/arrays/page.md +++ b/src/silk/wiki/std/arrays/page.md @@ -1,6 +1,5 @@ --- layout: "docs" -title: "std::arrays" description: "std::arrays defines borrowed views like Slice(T) and helpers for working with fixed arrays and slices." docsCollection: "silkWiki" section: "std" diff --git a/src/silk/wiki/std/bits/page.md b/src/silk/wiki/std/bits/page.md index 58127744..35cc18d0 100644 --- a/src/silk/wiki/std/bits/page.md +++ b/src/silk/wiki/std/bits/page.md @@ -1,6 +1,5 @@ --- layout: "docs" -title: "std::bits" description: "std::bits is the standard bit-manipulation and byte-order helper module." docsCollection: "silkWiki" section: "std" diff --git a/src/silk/wiki/std/buffer/page.md b/src/silk/wiki/std/buffer/page.md index 4b523a61..38f74b71 100644 --- a/src/silk/wiki/std/buffer/page.md +++ b/src/silk/wiki/std/buffer/page.md @@ -1,6 +1,5 @@ --- layout: "docs" -title: "std::buffer" description: "In the in-tree stdlib, std::buffer provides a packed byte buffer (BufferU8) plus width-oriented scalar buffer aliases built on std::vector::Vector(T) (for example BufferI32)." docsCollection: "silkWiki" section: "std" diff --git a/src/silk/wiki/std/conventions/page.md b/src/silk/wiki/std/conventions/page.md index ef5bf21b..eebfedc3 100644 --- a/src/silk/wiki/std/conventions/page.md +++ b/src/silk/wiki/std/conventions/page.md @@ -1,6 +1,5 @@ --- layout: "docs" -title: "std:: conventions" description: "std:: modules follow shared conventions for naming, ownership/allocation, error reporting." docsCollection: "silkWiki" section: "std" diff --git a/src/silk/wiki/std/crypto/page.md b/src/silk/wiki/std/crypto/page.md index 70ac3ee3..6b94ad23 100644 --- a/src/silk/wiki/std/crypto/page.md +++ b/src/silk/wiki/std/crypto/page.md @@ -1,6 +1,5 @@ --- layout: "docs" -title: "std::crypto" description: "std::crypto provides cryptography primitives (hosted baseline via libsodium in the current design)." docsCollection: "silkWiki" section: "std" diff --git a/src/silk/wiki/std/env/page.md b/src/silk/wiki/std/env/page.md index fcaa7750..421c8021 100644 --- a/src/silk/wiki/std/env/page.md +++ b/src/silk/wiki/std/env/page.md @@ -1,6 +1,5 @@ --- layout: "docs" -title: "std::env" description: "std::env provides access to process environment variables and common directory helpers." docsCollection: "silkWiki" section: "std" diff --git a/src/silk/wiki/std/filesystem/page.md b/src/silk/wiki/std/filesystem/page.md index 8dd1924b..92f4f40d 100644 --- a/src/silk/wiki/std/filesystem/page.md +++ b/src/silk/wiki/std/filesystem/page.md @@ -1,6 +1,5 @@ --- layout: "docs" -title: "std::fs" description: "std::fs provides a small hosted POSIX-oriented filesystem API (Supported forms subset)." docsCollection: "silkWiki" section: "std" diff --git a/src/silk/wiki/std/fmt/page.md b/src/silk/wiki/std/fmt/page.md index 1882b5f5..4b0d8ae9 100644 --- a/src/silk/wiki/std/fmt/page.md +++ b/src/silk/wiki/std/fmt/page.md @@ -1,6 +1,5 @@ --- layout: "docs" -title: "std::fmt" description: "std::fmt defines the formatting model used by std::io::print/println by string-building helpers. It follows a Zig-std.fmt-style format-string syntax." docsCollection: "silkWiki" section: "std" diff --git a/src/silk/wiki/std/formal/page.md b/src/silk/wiki/std/formal/page.md index 84ec4332..513f6718 100644 --- a/src/silk/wiki/std/formal/page.md +++ b/src/silk/wiki/std/formal/page.md @@ -1,6 +1,5 @@ --- layout: "docs" -title: "std::formal" description: "std::formal provides reusable Formal Silk theories (“standard lemmas”) used by stdlib code and downstream verified code." docsCollection: "silkWiki" section: "std" diff --git a/src/silk/wiki/std/interfaces/page.md b/src/silk/wiki/std/interfaces/page.md index c6a5c690..35c436b9 100644 --- a/src/silk/wiki/std/interfaces/page.md +++ b/src/silk/wiki/std/interfaces/page.md @@ -1,6 +1,5 @@ --- layout: "docs" -title: "std::interfaces" description: "std::interfaces defines shared std protocol interfaces such as Drop, Len, and Iterator(T)." docsCollection: "silkWiki" section: "std" diff --git a/src/silk/wiki/std/io/page.md b/src/silk/wiki/std/io/page.md index f7abb126..1d41cd42 100644 --- a/src/silk/wiki/std/io/page.md +++ b/src/silk/wiki/std/io/page.md @@ -1,6 +1,5 @@ --- layout: "docs" -title: "std::io" description: "std::io provides basic stdin/stdout/stderr I/O and a small formatting surface (print/println)." docsCollection: "silkWiki" section: "std" diff --git a/src/silk/wiki/std/json/page.md b/src/silk/wiki/std/json/page.md index 310a9396..1cd5f2eb 100644 --- a/src/silk/wiki/std/json/page.md +++ b/src/silk/wiki/std/json/page.md @@ -1,6 +1,5 @@ --- layout: "docs" -title: "std::json" description: "std::json provides JSON parsing and stringifying (implementation + expanded subset)." docsCollection: "silkWiki" section: "std" diff --git a/src/silk/wiki/std/map/page.md b/src/silk/wiki/std/map/page.md index b3999a1c..28e4d0d2 100644 --- a/src/silk/wiki/std/map/page.md +++ b/src/silk/wiki/std/map/page.md @@ -1,6 +1,5 @@ --- layout: "docs" -title: "std::map" description: "std::map provides associative containers:" docsCollection: "silkWiki" section: "std" diff --git a/src/silk/wiki/std/memory/page.md b/src/silk/wiki/std/memory/page.md index 53cce93a..29b9f26e 100644 --- a/src/silk/wiki/std/memory/page.md +++ b/src/silk/wiki/std/memory/page.md @@ -1,6 +1,5 @@ --- layout: "docs" -title: "std::memory" description: "std::memory provides low-level helpers and the long-term allocator design." docsCollection: "silkWiki" section: "std" diff --git a/src/silk/wiki/std/networking/page.md b/src/silk/wiki/std/networking/page.md index c60aa22b..687bf7cd 100644 --- a/src/silk/wiki/std/networking/page.md +++ b/src/silk/wiki/std/networking/page.md @@ -1,6 +1,5 @@ --- layout: "docs" -title: "std::net" description: "std::net provides networking primitives (hosted POSIX baseline)." docsCollection: "silkWiki" section: "std" diff --git a/src/silk/wiki/std/overview/page.md b/src/silk/wiki/std/overview/page.md index 9a1e8a15..c887f56a 100644 --- a/src/silk/wiki/std/overview/page.md +++ b/src/silk/wiki/std/overview/page.md @@ -1,6 +1,5 @@ --- layout: "docs" -title: "Standard library overview (std::)" description: "std:: is the Silk standard library namespace. The docs/std/ tree specifies the intended API and structure; an in-tree stdlib implementation exists under std/ for Silk currently." docsCollection: "silkWiki" section: "std" diff --git a/src/silk/wiki/std/package-structure/page.md b/src/silk/wiki/std/package-structure/page.md index ba003a78..02778521 100644 --- a/src/silk/wiki/std/package-structure/page.md +++ b/src/silk/wiki/std/package-structure/page.md @@ -1,6 +1,5 @@ --- layout: "docs" -title: "std:: package structure" description: "This page describes how std:: modules are organized and how the compiler finds and links them (including std-root selection and archive wiring)." docsCollection: "silkWiki" section: "std" diff --git a/src/silk/wiki/std/path/page.md b/src/silk/wiki/std/path/page.md index 1c559cc2..323cb667 100644 --- a/src/silk/wiki/std/path/page.md +++ b/src/silk/wiki/std/path/page.md @@ -1,6 +1,5 @@ --- layout: "docs" -title: "std::path" description: "std::path provides path manipulation helpers." docsCollection: "silkWiki" section: "std" diff --git a/src/silk/wiki/std/process/page.md b/src/silk/wiki/std/process/page.md index 3706eca2..8878f809 100644 --- a/src/silk/wiki/std/process/page.md +++ b/src/silk/wiki/std/process/page.md @@ -1,6 +1,5 @@ --- layout: "docs" -title: "std::process" description: "std::process provides process-oriented primitives (hosted baseline)." docsCollection: "silkWiki" section: "std" diff --git a/src/silk/wiki/std/result/page.md b/src/silk/wiki/std/result/page.md index 57c1c88b..eb0ffa16 100644 --- a/src/silk/wiki/std/result/page.md +++ b/src/silk/wiki/std/result/page.md @@ -1,6 +1,5 @@ --- layout: "docs" -title: "std::result" description: "std::result standardizes the common “success or error” return shape as Result(T, E) so APIs across std:: compose cleanly." docsCollection: "silkWiki" section: "std" diff --git a/src/silk/wiki/std/runtime/page.md b/src/silk/wiki/std/runtime/page.md index db2ade2f..b175d2ac 100644 --- a/src/silk/wiki/std/runtime/page.md +++ b/src/silk/wiki/std/runtime/page.md @@ -1,6 +1,5 @@ --- layout: "docs" -title: "std::runtime" description: "std::runtime is the interface layer that isolates OS/environment-specific primitives (I/O, filesystem, time, threads, allocation) from higher-level std::... modules." docsCollection: "silkWiki" section: "std" diff --git a/src/silk/wiki/std/semver/page.md b/src/silk/wiki/std/semver/page.md index 00d18ce0..afe1bbd3 100644 --- a/src/silk/wiki/std/semver/page.md +++ b/src/silk/wiki/std/semver/page.md @@ -1,6 +1,5 @@ --- layout: "docs" -title: "std::semver" description: "std::semver implements Semantic Versioning (SemVer 2.0.0):" docsCollection: "silkWiki" section: "std" diff --git a/src/silk/wiki/std/set/page.md b/src/silk/wiki/std/set/page.md index 013463ee..b45d43a1 100644 --- a/src/silk/wiki/std/set/page.md +++ b/src/silk/wiki/std/set/page.md @@ -1,6 +1,5 @@ --- layout: "docs" -title: "std::set" description: "std::set provides set containers:" docsCollection: "silkWiki" section: "std" diff --git a/src/silk/wiki/std/strings/page.md b/src/silk/wiki/std/strings/page.md index 480178c6..9e4b2cb5 100644 --- a/src/silk/wiki/std/strings/page.md +++ b/src/silk/wiki/std/strings/page.md @@ -1,6 +1,5 @@ --- layout: "docs" -title: "std::strings" description: "std::strings provides utilities and types built on top of the core string type (UTF‑8 bytes), including simple comparisons and owned string construction." docsCollection: "silkWiki" section: "std" diff --git a/src/silk/wiki/std/sync/page.md b/src/silk/wiki/std/sync/page.md index 706e3a36..5b41b864 100644 --- a/src/silk/wiki/std/sync/page.md +++ b/src/silk/wiki/std/sync/page.md @@ -1,6 +1,5 @@ --- layout: "docs" -title: "std::sync" description: "std::sync provides synchronization primitives (hosted baseline)." docsCollection: "silkWiki" section: "std" diff --git a/src/silk/wiki/std/task/page.md b/src/silk/wiki/std/task/page.md index 75a99571..74239ebc 100644 --- a/src/silk/wiki/std/task/page.md +++ b/src/silk/wiki/std/task/page.md @@ -1,6 +1,5 @@ --- layout: "docs" -title: "std::task" description: "std::task provides hosted task/runtime helpers, including sleep/yield operations." docsCollection: "silkWiki" section: "std" diff --git a/src/silk/wiki/std/temporal/page.md b/src/silk/wiki/std/temporal/page.md index ecbe89bf..20307a59 100644 --- a/src/silk/wiki/std/temporal/page.md +++ b/src/silk/wiki/std/temporal/page.md @@ -1,6 +1,5 @@ --- layout: "docs" -title: "std::temporal" description: "std::temporal provides Instant/Duration helpers and time-related utilities." docsCollection: "silkWiki" section: "std" diff --git a/src/silk/wiki/std/tls/page.md b/src/silk/wiki/std/tls/page.md index f7f0ba98..1c1e03a6 100644 --- a/src/silk/wiki/std/tls/page.md +++ b/src/silk/wiki/std/tls/page.md @@ -1,6 +1,5 @@ --- layout: "docs" -title: "std::tls" description: "std::tls provides TLS client/server primitives (hosted baseline via mbedTLS)." docsCollection: "silkWiki" section: "std" diff --git a/src/silk/wiki/std/toml/page.md b/src/silk/wiki/std/toml/page.md index 4a19e4b6..4076821d 100644 --- a/src/silk/wiki/std/toml/page.md +++ b/src/silk/wiki/std/toml/page.md @@ -1,6 +1,5 @@ --- layout: "docs" -title: "std::toml" description: "std::toml provides TOML parsing (implementation + expanded subset)." docsCollection: "silkWiki" section: "std" diff --git a/src/silk/wiki/std/url/page.md b/src/silk/wiki/std/url/page.md index ddc1a2c8..14c13a14 100644 --- a/src/silk/wiki/std/url/page.md +++ b/src/silk/wiki/std/url/page.md @@ -1,6 +1,5 @@ --- layout: "docs" -title: "std::url" description: "std::url provides a WHATWG URL parser/serializer and URLSearchParams-style behavior." docsCollection: "silkWiki" section: "std" diff --git a/src/silk/wiki/std/uuid/page.md b/src/silk/wiki/std/uuid/page.md index e0a1290b..e0fd0a4a 100644 --- a/src/silk/wiki/std/uuid/page.md +++ b/src/silk/wiki/std/uuid/page.md @@ -1,6 +1,5 @@ --- layout: "docs" -title: "std::uuid" description: "std::uuid provides UUID primitives (parsing, formatting, and variants)." docsCollection: "silkWiki" section: "std" diff --git a/src/silk/wiki/std/vector/page.md b/src/silk/wiki/std/vector/page.md index 34d8c4bd..060f5b84 100644 --- a/src/silk/wiki/std/vector/page.md +++ b/src/silk/wiki/std/vector/page.md @@ -1,6 +1,5 @@ --- layout: "docs" -title: "std::vector" description: "std::vector provides a generic, growable owning container Vector(T) used widely throughout std::." docsCollection: "silkWiki" section: "std" diff --git a/src/slg/docs/cli/diagnostics/page.md b/src/slg/docs/cli/diagnostics/page.md index 1419d583..a8d63441 100644 --- a/src/slg/docs/cli/diagnostics/page.md +++ b/src/slg/docs/cli/diagnostics/page.md @@ -1,6 +1,5 @@ --- layout: "docs" -title: "Diagnostics" description: "This page documents the public exit codes plus the most important user-visible diagnostics." docsCollection: "slg" section: "cli" diff --git a/src/slg/docs/cli/input-types-and-parsing/page.md b/src/slg/docs/cli/input-types-and-parsing/page.md index c4e3a1f1..dc6adfc4 100644 --- a/src/slg/docs/cli/input-types-and-parsing/page.md +++ b/src/slg/docs/cli/input-types-and-parsing/page.md @@ -1,6 +1,5 @@ --- layout: "docs" -title: "Input types and parsing" description: "This page is the exact downstream input model for slg." docsCollection: "slg" section: "cli" diff --git a/src/slg/docs/cli/options-reference/page.md b/src/slg/docs/cli/options-reference/page.md index 67fc464f..a87a471d 100644 --- a/src/slg/docs/cli/options-reference/page.md +++ b/src/slg/docs/cli/options-reference/page.md @@ -1,6 +1,5 @@ --- layout: "docs" -title: "Options reference" description: "This page lists every public CLI flag on slg." docsCollection: "slg" section: "cli" diff --git a/src/slg/docs/cli/output-and-exit-codes/page.md b/src/slg/docs/cli/output-and-exit-codes/page.md index f5c92a9c..5aa2a595 100644 --- a/src/slg/docs/cli/output-and-exit-codes/page.md +++ b/src/slg/docs/cli/output-and-exit-codes/page.md @@ -1,6 +1,5 @@ --- layout: "docs" -title: "Output and exit codes" description: "This page documents what slg prints, where it prints it, and how it exits." docsCollection: "slg" section: "cli" diff --git a/src/slg/docs/cli/parallelism/page.md b/src/slg/docs/cli/parallelism/page.md index e5d58e50..c3a5323f 100644 --- a/src/slg/docs/cli/parallelism/page.md +++ b/src/slg/docs/cli/parallelism/page.md @@ -1,6 +1,5 @@ --- layout: "docs" -title: "Parallelism" description: "slg can traverse and search in parallel, but the control surface is explicit and intentionally bounded." docsCollection: "slg" section: "cli" diff --git a/src/slg/docs/cli/patterns-and-matching/page.md b/src/slg/docs/cli/patterns-and-matching/page.md index e238c546..846ca041 100644 --- a/src/slg/docs/cli/patterns-and-matching/page.md +++ b/src/slg/docs/cli/patterns-and-matching/page.md @@ -1,6 +1,5 @@ --- layout: "docs" -title: "Patterns and matching" description: "This page documents how slg interprets patterns once parsing is complete." docsCollection: "slg" section: "cli" diff --git a/src/slg/docs/cli/slg/page.md b/src/slg/docs/cli/slg/page.md index 0af734d8..51e3b858 100644 --- a/src/slg/docs/cli/slg/page.md +++ b/src/slg/docs/cli/slg/page.md @@ -1,6 +1,5 @@ --- layout: "docs" -title: "slg" description: "slg is the canonical CLI entrypoint for Silk Line Grep." docsCollection: "slg" section: "cli" diff --git a/src/slg/docs/cli/traversal-and-ignores/page.md b/src/slg/docs/cli/traversal-and-ignores/page.md index 9121900a..6ca88109 100644 --- a/src/slg/docs/cli/traversal-and-ignores/page.md +++ b/src/slg/docs/cli/traversal-and-ignores/page.md @@ -1,6 +1,5 @@ --- layout: "docs" -title: "Traversal and ignores" description: "This page documents exactly what slg walks, skips, and re-enables." docsCollection: "slg" section: "cli" diff --git a/src/slg/docs/guides/getting-started/page.md b/src/slg/docs/guides/getting-started/page.md index ac29eb5f..f527aa1e 100644 --- a/src/slg/docs/guides/getting-started/page.md +++ b/src/slg/docs/guides/getting-started/page.md @@ -1,6 +1,5 @@ --- layout: "docs" -title: "Getting started" description: "This guide covers the downstream story: build slg, install it, run a few real searches, then move into the exact CLI reference." docsCollection: "slg" section: "guides" diff --git a/src/slg/docs/guides/search-recipes/page.md b/src/slg/docs/guides/search-recipes/page.md index 1bd9a912..70b56743 100644 --- a/src/slg/docs/guides/search-recipes/page.md +++ b/src/slg/docs/guides/search-recipes/page.md @@ -1,6 +1,5 @@ --- layout: "docs" -title: "Search recipes" description: "These are practical slg workflows for code trees, logs, and large repositories." docsCollection: "slg" section: "guides" diff --git a/src/slg/docs/man/slg-1/page.md b/src/slg/docs/man/slg-1/page.md index a6ca5a72..8c9042fa 100644 --- a/src/slg/docs/man/slg-1/page.md +++ b/src/slg/docs/man/slg-1/page.md @@ -1,6 +1,5 @@ --- layout: "docs" -title: "slg (1) — Silk Line Grep" description: "This page is the reader-friendly website form of the shipped slg(1) manual." docsCollection: "slg" section: "man" diff --git a/src/slg/docs/page.md b/src/slg/docs/page.md index e57fc74f..4ecc3dd0 100644 --- a/src/slg/docs/page.md +++ b/src/slg/docs/page.md @@ -1,6 +1,5 @@ --- layout: "docs" -title: "slg Docs" description: "slg is a fast recursive line grep utility for files and directories." docsCollection: "slg" section: "overview" diff --git a/src/virtnosis/docs/cli/virtnosis-agent/page.md b/src/virtnosis/docs/cli/virtnosis-agent/page.md index 66b0e251..a970ea80 100644 --- a/src/virtnosis/docs/cli/virtnosis-agent/page.md +++ b/src/virtnosis/docs/cli/virtnosis-agent/page.md @@ -1,6 +1,5 @@ --- layout: "docs" -title: "virtnosis-agent" description: "virtnosis-agent is the local control-plane daemon for Virtnosis." docsCollection: "virtnosis" section: "cli" diff --git a/src/virtnosis/docs/cli/vnactl/page.md b/src/virtnosis/docs/cli/vnactl/page.md index 75855c89..45992b3d 100644 --- a/src/virtnosis/docs/cli/vnactl/page.md +++ b/src/virtnosis/docs/cli/vnactl/page.md @@ -1,6 +1,5 @@ --- layout: "docs" -title: "vnactl" description: "vnactl is the operator and automation client for virtnosis-agent." docsCollection: "virtnosis" section: "cli" diff --git a/src/virtnosis/docs/guides/deployment/page.md b/src/virtnosis/docs/guides/deployment/page.md index 29032623..314ec2c4 100644 --- a/src/virtnosis/docs/guides/deployment/page.md +++ b/src/virtnosis/docs/guides/deployment/page.md @@ -1,6 +1,5 @@ --- layout: "docs" -title: "Deployment Guide" description: "This guide covers local agent deployment, shared socket deployment, and the important permission and auth choices." docsCollection: "virtnosis" section: "guides" diff --git a/src/virtnosis/docs/guides/getting-started/page.md b/src/virtnosis/docs/guides/getting-started/page.md index 5b4645df..7537b244 100644 --- a/src/virtnosis/docs/guides/getting-started/page.md +++ b/src/virtnosis/docs/guides/getting-started/page.md @@ -1,6 +1,5 @@ --- layout: "docs" -title: "Getting Started" description: "This guide gets you from an installed Virtnosis CLI to a useful first scan." docsCollection: "virtnosis" section: "guides" diff --git a/src/virtnosis/docs/guides/install-and-package/page.md b/src/virtnosis/docs/guides/install-and-package/page.md index 3bfc4df2..f0e33ab0 100644 --- a/src/virtnosis/docs/guides/install-and-package/page.md +++ b/src/virtnosis/docs/guides/install-and-package/page.md @@ -1,6 +1,5 @@ --- layout: "docs" -title: "Install and Package" description: "This guide covers source builds, local installs, docs installs, and the packaging-oriented make targets shipped in the repository." docsCollection: "virtnosis" section: "guides" diff --git a/src/virtnosis/docs/guides/operator-guide/page.md b/src/virtnosis/docs/guides/operator-guide/page.md index 39aac8bd..cec30265 100644 --- a/src/virtnosis/docs/guides/operator-guide/page.md +++ b/src/virtnosis/docs/guides/operator-guide/page.md @@ -1,6 +1,5 @@ --- layout: "docs" -title: "Operator Guide" description: "This guide focuses on day-to-day use of Virtnosis as an operator, responder, or CI consumer." docsCollection: "virtnosis" section: "guides" diff --git a/src/virtnosis/docs/guides/output-and-automation/page.md b/src/virtnosis/docs/guides/output-and-automation/page.md index ad2603ff..bbeb0a83 100644 --- a/src/virtnosis/docs/guides/output-and-automation/page.md +++ b/src/virtnosis/docs/guides/output-and-automation/page.md @@ -1,6 +1,5 @@ --- layout: "docs" -title: "Output and Automation" description: "Virtnosis output is designed to stay machine-consumable even when the scan is partial, bounded, or degraded." docsCollection: "virtnosis" section: "guides" diff --git a/src/virtnosis/docs/guides/systemd/page.md b/src/virtnosis/docs/guides/systemd/page.md index 5bec62b2..e189fa78 100644 --- a/src/virtnosis/docs/guides/systemd/page.md +++ b/src/virtnosis/docs/guides/systemd/page.md @@ -1,6 +1,5 @@ --- layout: "docs" -title: "Systemd Guide" description: "This guide documents the systemd deployment story for Virtnosis." docsCollection: "virtnosis" section: "guides" diff --git a/src/virtnosis/docs/man/virtnosis-7/page.md b/src/virtnosis/docs/man/virtnosis-7/page.md index b6c22e3c..bfb8408c 100644 --- a/src/virtnosis/docs/man/virtnosis-7/page.md +++ b/src/virtnosis/docs/man/virtnosis-7/page.md @@ -1,6 +1,5 @@ --- layout: "docs" -title: "virtnosis(7)" description: "virtnosis — libvirt security analysis and diagnosis architecture" docsCollection: "virtnosis" section: "man" diff --git a/src/virtnosis/docs/man/virtnosis-agent-1/page.md b/src/virtnosis/docs/man/virtnosis-agent-1/page.md index 2bdb7899..eb2f87f0 100644 --- a/src/virtnosis/docs/man/virtnosis-agent-1/page.md +++ b/src/virtnosis/docs/man/virtnosis-agent-1/page.md @@ -1,6 +1,5 @@ --- layout: "docs" -title: "virtnosis-agent(1)" description: "virtnosis-agent — Virtnosis local agent and daemon" docsCollection: "virtnosis" section: "man" diff --git a/src/virtnosis/docs/man/virtnosis-agent-protocol-7/page.md b/src/virtnosis/docs/man/virtnosis-agent-protocol-7/page.md index 97aba8ca..4b5044ef 100644 --- a/src/virtnosis/docs/man/virtnosis-agent-protocol-7/page.md +++ b/src/virtnosis/docs/man/virtnosis-agent-protocol-7/page.md @@ -1,6 +1,5 @@ --- layout: "docs" -title: "virtnosis-agent-protocol(7)" description: "virtnosis-agent-protocol — control protocol and transport model for Virtnosis" docsCollection: "virtnosis" section: "man" diff --git a/src/virtnosis/docs/man/virtnosis-scan-report-7/page.md b/src/virtnosis/docs/man/virtnosis-scan-report-7/page.md index 7455d0a4..229f7d1d 100644 --- a/src/virtnosis/docs/man/virtnosis-scan-report-7/page.md +++ b/src/virtnosis/docs/man/virtnosis-scan-report-7/page.md @@ -1,6 +1,5 @@ --- layout: "docs" -title: "virtnosis-scan-report(7)" description: "virtnosis-scan-report — output model and reporting semantics for Virtnosis scans" docsCollection: "virtnosis" section: "man" diff --git a/src/virtnosis/docs/man/vnactl-1/page.md b/src/virtnosis/docs/man/vnactl-1/page.md index 4e7f090a..0531a1c6 100644 --- a/src/virtnosis/docs/man/vnactl-1/page.md +++ b/src/virtnosis/docs/man/vnactl-1/page.md @@ -1,6 +1,5 @@ --- layout: "docs" -title: "vnactl(1)" description: "vnactl — Virtnosis agent control client" docsCollection: "virtnosis" section: "man" diff --git a/src/virtnosis/docs/page.md b/src/virtnosis/docs/page.md index d24f4904..214cc299 100644 --- a/src/virtnosis/docs/page.md +++ b/src/virtnosis/docs/page.md @@ -1,6 +1,5 @@ --- layout: "docs" -title: "Virtnosis Docs" description: "Virtnosis is a read-only libvirt security analysis and diagnosis toolset." docsCollection: "virtnosis" section: "overview" diff --git a/src/virtnosis/docs/reference/architecture/page.md b/src/virtnosis/docs/reference/architecture/page.md index ad079ed0..8ad4156e 100644 --- a/src/virtnosis/docs/reference/architecture/page.md +++ b/src/virtnosis/docs/reference/architecture/page.md @@ -1,6 +1,5 @@ --- layout: "docs" -title: "Architecture" description: "This document explains the product architecture from a systems perspective." docsCollection: "virtnosis" section: "reference" diff --git a/src/virtnosis/docs/reference/development/page.md b/src/virtnosis/docs/reference/development/page.md index 79134fa5..7168cb45 100644 --- a/src/virtnosis/docs/reference/development/page.md +++ b/src/virtnosis/docs/reference/development/page.md @@ -1,6 +1,5 @@ --- layout: "docs" -title: "Development Guide" description: "This guide is for contributors working inside virtnosis/." docsCollection: "virtnosis" section: "reference" diff --git a/src/virtnosis/docs/reference/overview/page.md b/src/virtnosis/docs/reference/overview/page.md index 17514b13..e7f248e8 100644 --- a/src/virtnosis/docs/reference/overview/page.md +++ b/src/virtnosis/docs/reference/overview/page.md @@ -1,6 +1,5 @@ --- layout: "docs" -title: "Overview" description: "Virtnosis is a read-only libvirt security analysis and diagnosis toolset." docsCollection: "virtnosis" section: "reference" diff --git a/src/virtnosis/docs/reference/repository-docs/page.md b/src/virtnosis/docs/reference/repository-docs/page.md index f93bfb88..347b3910 100644 --- a/src/virtnosis/docs/reference/repository-docs/page.md +++ b/src/virtnosis/docs/reference/repository-docs/page.md @@ -1,6 +1,5 @@ --- layout: "docs" -title: "Repository Documents" description: "This page maps the documentation layers that exist in the virtnosis repository and explains which ones are public/operator-facing versus contributor/internal." docsCollection: "virtnosis" section: "reference" diff --git a/src/virtnosis/docs/reference/scan-analysis/page.md b/src/virtnosis/docs/reference/scan-analysis/page.md index b9a2cfed..bbb16685 100644 --- a/src/virtnosis/docs/reference/scan-analysis/page.md +++ b/src/virtnosis/docs/reference/scan-analysis/page.md @@ -1,6 +1,5 @@ --- layout: "docs" -title: "Scan Analysis" description: "This guide explains what Virtnosis scans, what “deep” means, and how to interpret partial versus confirmed findings." docsCollection: "virtnosis" section: "reference" diff --git a/tests/browser/docs.spec.ts b/tests/browser/docs.spec.ts index 5235c62a..3b5586d8 100644 --- a/tests/browser/docs.spec.ts +++ b/tests/browser/docs.spec.ts @@ -27,9 +27,13 @@ test('legacy queries and aliases preserve fragments', async ({ page }) => { await expect(page).toHaveURL(/\/runtime\/docs\/guides\/hello-world\/#next$/) await page.goto('/silk/docs/?p=spec/2026#language-cheat-sheet') await expect(page).toHaveURL(/\/silk\/spec\/2026\/#language-cheat-sheet$/) - await page.goto('/silk/docs/guides/toy-logger-module/#main') + await page.goto('/silk/docs/guides/toy-logger-module/?ref=legacy#main') await expect(page).toHaveURL( - /\/silk\/docs\/guides\/practical-logger-module\/#main$/, + /\/silk\/docs\/guides\/practical-logger-module\/\?ref=legacy#main$/, + ) + await page.goto('/silk/docs/spec/2026/?ref=legacy#language-cheat-sheet') + await expect(page).toHaveURL( + /\/silk\/spec\/2026\/\?ref=legacy#language-cheat-sheet$/, ) await page.goto('/silk/wiki/?p=start#main') await expect(page).toHaveURL(/\/silk\/wiki\/#main$/) diff --git a/tests/content.test.ts b/tests/content.test.ts index e473cfea..3440320b 100644 --- a/tests/content.test.ts +++ b/tests/content.test.ts @@ -14,6 +14,7 @@ import { load } from 'cheerio' import { canonicalLink } from '#lib/urls.ts' import { docUrl } from '#lib/collections.ts' import { markdown } from '#lib/markdown.ts' +import { titleFromMarkdown } from '#lib/titles.ts' import { publicContent } from '../tools/migration/content.ts' import { importCollection, @@ -86,7 +87,7 @@ test('staged imports preserve metadata and ownership boundaries and prune remove const wiki = join(site, 'src/silk/wiki/page.md') const metadata = { layout: 'docs', - title: 'Old', + description: 'Old', docsCollection: 'silk', section: 'language', @@ -116,7 +117,8 @@ test('staged imports preserve metadata and ownership boundaries and prune remove const { metadata: next, body } = splitPage(await readFile(page, 'utf8')) assert.equal(next.order, 42) assert.equal(next.section, 'language') - assert.equal(next.title, 'New title') + assert.equal(Object.hasOwn(next, 'title'), false) + assert.equal(titleFromMarkdown(body), 'New title') assert.ok(body.includes('(/silk/docs/)')) await assert.rejects(access(stale)) await access(wiki) @@ -127,6 +129,41 @@ test('staged imports preserve metadata and ownership boundaries and prune remove await rm(site, { recursive: true, force: true }) } }) +test('imports preserve explicit overrides, infer changed headings, and fall back without H1', async () => { + const site = await mkdtemp(join(tmpdir(), 'oro-import-titles-')) + try { + const stage = join(site, 'staged') + await mkdir(stage, { recursive: true }) + await mkdir(join(site, 'src'), { recursive: true }) + await writeFile(join(stage, 'example.md'), '# First\n') + await writeFile(join(stage, 'fallback.md'), 'No heading.\n') + await importCollection('silk', stage, site) + const file = join(site, 'src/silk/docs/example/page.md') + const fallback = splitPage(await readFile(join(site, 'src/silk/docs/fallback/page.md'), 'utf8')) + assert.equal(fallback.metadata.title, 'fallback') + await writeFile(join(stage, 'example.md'), '# [`Second`](/silk/docs/example/)\n') + await importCollection('silk', stage, site) + const inferred = splitPage(await readFile(file, 'utf8')) + assert.equal(Object.hasOwn(inferred.metadata, 'title'), false) + assert.equal(titleFromMarkdown(inferred.body), 'Second') + await writeFile(file, pageText({ ...inferred.metadata, title: 'Editorial `override`', redirectFrom: ['/old/'] }, inferred.body)) + await writeFile(join(stage, 'example.md'), '# Third\n') + await importCollection('silk', stage, site) + const overridden = splitPage(await readFile(file, 'utf8')) + assert.equal(overridden.metadata.title, 'Editorial `override`') + assert.deepEqual(overridden.metadata.redirectFrom, ['/old/']) + assert.equal(titleFromMarkdown(overridden.body), 'Third') + for (const title of ['', ' ', null, 42]) { + const invalid = pageText({ ...overridden.metadata, title }, overridden.body) + await writeFile(file, invalid) + await assert.rejects(importCollection('silk', stage, site), /Invalid explicit title/) + assert.equal(await readFile(file, 'utf8'), invalid) + } + } finally { + await rm(site, { recursive: true, force: true }) + } +}) + test('fence protection handles longer closing delimiters and indented code', () => { for (const source of [ '```js\n// Works today\nconst t = "{{ foo }}"\n````\n', @@ -171,7 +208,9 @@ test('absolute raw Markdown URLs resolve across collections and keep fragments', test('refreshed linked API headings produce plain titles and new pages can reference each other', async () => { const site = await mkdtemp(join(tmpdir(), 'oro-import-headings-')) try { - await mkdir(join(site, 'src'), { recursive: true }) + const wiki = join(site, 'src/silk/wiki/page.md') + await mkdir(join(wiki, '..'), { recursive: true }) + await writeFile(wiki, pageText({ docsCollection: 'silkWiki', sourcePath: 'start.md' }, '# [`Wiki API`](/silk/wiki/)\n')) const stage = join(site, 'staged/std') await mkdir(stage, { recursive: true }) await writeFile( @@ -180,13 +219,15 @@ test('refreshed linked API headings produce plain titles and new pages can refer ) await writeFile( join(stage, 'beta.md'), - '# `std::beta`\n\nUse `std::alpha`.\n', + '# `std::beta`\n\nUse `std::alpha` and `Wiki API`.\n', ) await importCollection('silk', join(site, 'staged'), site) const file = join(site, 'src/silk/docs/std/alpha/page.md') const first = await readFile(file, 'utf8') - assert.equal(splitPage(first).metadata.title, 'std::alpha') + assert.equal(Object.hasOwn(splitPage(first).metadata, 'title'), false) + assert.equal(titleFromMarkdown(splitPage(first).body), 'std::alpha') assert.ok(first.includes('[`std::beta`](/silk/docs/std/beta/)')) + assert.ok((await readFile(join(site, 'src/silk/docs/std/beta/page.md'), 'utf8')).includes('[`Wiki API`](/silk/wiki/)')) await importCollection('silk', join(site, 'staged'), site) assert.equal(await readFile(file, 'utf8'), first) } finally { diff --git a/tests/docs-watch.test.ts b/tests/docs-watch.test.ts index 4288842b..7a2103fb 100644 --- a/tests/docs-watch.test.ts +++ b/tests/docs-watch.test.ts @@ -24,10 +24,9 @@ test('body edits stay isolated while navigation edits rebuild shared docs consum await proxy(name + '.layout.ts', 'layouts/' + name + '.layout.ts') for (const name of (await readdir(new URL('../src/', import.meta.url), { recursive: true })).filter(name => name.endsWith('.template.ts'))) await proxy(name, name) - const pageSource = (collection: string, id: string, title: string, body: string) => `--- + const pageSource = (collection: string, id: string, heading: string, body: string, title?: string) => `--- layout: "docs" -title: "${title}" -description: "Summary" +${title === undefined ? '' : `title: ${JSON.stringify(title)}\n`}description: "Summary" docsCollection: "${collection}" section: "overview" order: ${id === 'start' ? 0 : 1} @@ -35,7 +34,7 @@ sourcePath: "${id}.md" githubRepo: "oro-computer/${collection}" githubRef: "master" --- -# ${id} +# ${heading} ## Stable anchor diff --git a/tests/import-roundtrip.test.ts b/tests/import-roundtrip.test.ts index ed2e3ed8..dd896827 100644 --- a/tests/import-roundtrip.test.ts +++ b/tests/import-roundtrip.test.ts @@ -1,10 +1,38 @@ import { test } from 'node:test' import assert from 'node:assert/strict' -import { cp, mkdtemp, readdir, readFile, rm } from 'node:fs/promises' +import { cp, mkdir, mkdtemp, readdir, readFile, rm, writeFile } from 'node:fs/promises' import { tmpdir } from 'node:os' -import { join } from 'node:path' +import { dirname, join } from 'node:path' import { collections, type Collection } from '#lib/collections.ts' -import { exportCollection, importCollection } from '../tools/import-public.ts' +import { exportCollection, importCollection, splitPage } from '../tools/import-public.ts' +test('redirectFrom survives importing changed upstream bodies', async () => { + const site = await mkdtemp(join(tmpdir(), 'oro-import-redirects-')) + const pages = [ + ['silk/docs/guides/practical-logger-module/page.md', '/silk/docs/guides/toy-logger-module/'], + ['silk/spec/2026/page.md', '/silk/docs/spec/2026/'], + ] + try { + const stage = join(site, 'staged') + for (const [file, alias] of pages) { + const text = await readFile(join('src', file), 'utf8') + const { metadata, body } = splitPage(text) + assert.deepEqual(metadata.redirectFrom, [alias]) + await mkdir(dirname(join(site, 'src', file)), { recursive: true }) + await writeFile(join(site, 'src', file), text) + await mkdir(dirname(join(stage, metadata.sourcePath)), { recursive: true }) + await writeFile(join(stage, metadata.sourcePath), body + '\nUpstream redirect preservation regression.\n') + } + await importCollection('silk', stage, site) + for (const [file, alias] of pages) { + const { metadata, body } = splitPage(await readFile(join(site, 'src', file), 'utf8')) + assert.deepEqual(metadata.redirectFrom, [alias], file) + assert.match(body, /Upstream redirect preservation regression\./, file) + } + } finally { + await rm(site, { recursive: true, force: true }) + } +}) + test('all 585 public documents survive an unchanged refresh byte for byte', async () => { const site = await mkdtemp(join(tmpdir(), 'oro-import-roundtrip-')) try { diff --git a/tests/redirects-watch.test.ts b/tests/redirects-watch.test.ts new file mode 100644 index 00000000..25c2d625 --- /dev/null +++ b/tests/redirects-watch.test.ts @@ -0,0 +1,121 @@ +import { test } from 'node:test' +import assert from 'node:assert/strict' +import { access, mkdir, mkdtemp, readFile, rename, rm, stat, writeFile } from 'node:fs/promises' +import { tmpdir } from 'node:os' +import { dirname, join } from 'node:path' +import { setTimeout as delay } from 'node:timers/promises' +import { DomStack } from '@domstack/static' +import { load } from 'cheerio' + +test('redirectFrom aliases follow source edits, moves and deletion in watch mode', { timeout: 30000 }, async () => { + const fixture = await mkdtemp(join(tmpdir(), 'oro-redirects-watch-')) + const src = join(fixture, 'src') + const dest = join(fixture, 'public') + const site = new DomStack(src, dest) + async function bounded<T>(label: string, work: Promise<T>): Promise<T> { + let timer: ReturnType<typeof setTimeout> | undefined + try { + return await Promise.race([ + work, + new Promise<never>((_, reject) => { + timer = setTimeout(() => reject(new Error(`Timed out: ${label}`)), 8000) + }), + ]) + } finally { + clearTimeout(timer) + } + } + async function waitFor(label: string, check: () => Promise<void>) { + const deadline = Date.now() + 8000 + let failure: unknown + do { + try { + await check() + await bounded('watcher settled', site.settled()) + await check() + return + } catch (error) { + failure = error + } + await delay(25) + } while (Date.now() < deadline) + throw new Error(`Timed out: ${label}`, { cause: failure }) + } + const aliases = ['/legacy/', '/legacy.html', '/obsolete/'] + const output = (alias: string) => join(dest, alias.slice(1), ...(alias.endsWith('/') ? ['index.html'] : [])) + const source = (aliases: string[], body: string) => `---\nlayout: "root"\ntitle: "Watch target"\nredirectFrom: ${JSON.stringify(aliases)}\n---\n<p>${body}</p>\n` + async function assertRedirect(alias: string, target: string) { + const $ = load(await readFile(output(alias), 'utf8'), { scriptingEnabled: false }) + assert.equal($('html').attr('lang'), 'en') + assert.equal($('body > header.site-top').length, 1) + assert.equal($('header nav[aria-label="Primary navigation"]').length, 1) + assert.equal($('body > main#main a[data-redirect]').length, 1) + assert.equal($('body > footer.site-footer').length, 1) + assert.equal($('body > a.skip-link').attr('href'), '#main') + assert.equal($('link[rel="canonical"]').attr('href'), `https://oro.computer${target}`) + assert.equal($('meta[property="og:url"]').attr('content'), `https://oro.computer${target}`) + assert.equal($('noscript meta[http-equiv="refresh"]').attr('content'), `0;url=${target}`) + assert.equal($('meta[http-equiv="refresh"]').length, 1) + assert.equal($('a[data-redirect]').attr('href'), target) + assert.equal($('a[data-redirect]').text(), 'Continue to the page') + } + try { + // Re-export production consumers, not test implementations of their data subscriptions. + for (const [target, real] of [ + ['globals/global.data.ts', 'globals/global.data.ts'], + ['globals/global.vars.ts', 'globals/global.vars.ts'], + ['markdown-it.settings.ts', 'markdown-it.settings.ts'], + ['root.layout.ts', 'layouts/root.layout.ts'], + ['redirect.layout.ts', 'layouts/redirect.layout.ts'], + ['redirects.pages.ts', 'redirects.pages.ts'], + ]) { + const url = new URL('../src/' + real, import.meta.url).href + await mkdir(dirname(join(src, target)), { recursive: true }) + await writeFile(join(src, target), `export { default } from ${JSON.stringify(url)}\nexport * from ${JSON.stringify(url)}\n`) + } + await mkdir(join(src, 'target')) + const original = join(src, 'target/page.md') + await writeFile(original, source(aliases, 'Original body')) + // watch() resolves only after the initial build and filesystem watcher readiness. + const initial = await bounded('watcher readiness', site.watch({ serve: false })) + assert.deepEqual(initial.pageBuildResults?.errors, []) + for (const alias of aliases) await assertRedirect(alias, '/target/') + const snapshots = await Promise.all(aliases.map(async alias => ({ + html: await readFile(output(alias), 'utf8'), + mtime: (await stat(output(alias), { bigint: true })).mtimeNs, + }))) + + await writeFile(original, source(aliases, 'Changed body')) + await waitFor('body edit rendered', async () => { + assert.match(await readFile(join(dest, 'target/index.html'), 'utf8'), /Changed body/) + }) + for (const [index, alias] of aliases.entries()) { + assert.equal(await readFile(output(alias), 'utf8'), snapshots[index].html) + assert.equal((await stat(output(alias), { bigint: true })).mtimeNs, snapshots[index].mtime) + } + + const retained = aliases.slice(0, 2) + await writeFile(original, source(retained, 'Changed body')) + await waitFor('removed alias cleaned', async () => { + await assert.rejects(access(output('/obsolete/')), { code: 'ENOENT' }) + for (const alias of retained) await assertRedirect(alias, '/target/') + }) + + await rename(join(src, 'target'), join(src, 'renamed')) + await waitFor('same aliases point to renamed target', async () => { + assert.match(await readFile(join(dest, 'renamed/index.html'), 'utf8'), /Changed body/) + for (const alias of retained) await assertRedirect(alias, '/renamed/') + await assert.rejects(access(join(dest, 'target/index.html')), { code: 'ENOENT' }) + await assert.rejects(access(output('/obsolete/')), { code: 'ENOENT' }) + }) + + await rm(join(src, 'renamed/page.md')) + await waitFor('deleted source and aliases cleaned', async () => { + for (const alias of aliases) await assert.rejects(access(output(alias)), { code: 'ENOENT' }) + await assert.rejects(access(join(dest, 'renamed/index.html')), { code: 'ENOENT' }) + }) + } finally { + await bounded('watcher shutdown', site.stopWatching()) + await rm(fixture, { recursive: true, force: true }) + } +}) diff --git a/tests/redirects.test.ts b/tests/redirects.test.ts new file mode 100644 index 00000000..6dc16deb --- /dev/null +++ b/tests/redirects.test.ts @@ -0,0 +1,106 @@ +import { test } from 'node:test' +import assert from 'node:assert/strict' +import { collectRedirects, redirectOutputName, type RedirectPage } from '#lib/redirects.ts' + +function page(redirectFrom: unknown, source = 'current/page.md', url = '/current/'): RedirectPage { + return { vars: { redirectFrom }, pageInfo: { url, pageFile: { relname: source } } } +} + +test('maps root, directory, and file aliases without rewriting escaped names', () => { + for (const [from, output] of [ + ['/', 'index.html'], ['/old/', 'old/index.html'], ['/old/index.html', 'old/index.html'], + ['/old.html', 'old.html'], ['/old', 'old'], ['/caf%C3%A9/', 'caf%C3%A9/index.html'], + ['/a&b.html', 'a&b.html'], + ]) assert.equal(redirectOutputName(from), output) +}) + +test('accepts absent or empty metadata and any source-backed page structure', () => { + assert.deepEqual(collectRedirects([]), []) + assert.deepEqual(collectRedirects([page(undefined), page([])]), []) + for (const source of ['current/page.html', 'current/page.md', 'current/page.ts']) { + assert.deepEqual(collectRedirects([page(['/old/'], source)]), [{ from: '/old/', to: '/current/' }]) + } +}) + +test('projects deterministic JSON-safe metadata independently of page bodies', () => { + const first = page(['/z/', '/a/']) + const second = page(['/b.html'], 'other.md', '/other.html') + const expected = [ + { from: '/a/', to: '/current/' }, + { from: '/b.html', to: '/other.html' }, + { from: '/z/', to: '/current/' }, + ] + assert.deepEqual(collectRedirects([first, second]), expected) + const changed = { ...first, vars: { redirectFrom: ['/a/', '/z/'], title: 'Changed', ignored: 1n }, + get body(): never { throw new Error('Body must not be read') } } + assert.deepEqual(JSON.parse(JSON.stringify(collectRedirects([second, changed]))), expected) + assert.deepEqual(first.vars.redirectFrom, ['/z/', '/a/']) +}) + +test('rejects non-array metadata and non-string entries with source context', () => { + for (const value of [null, false, '/old/', {}, 1, [null], [1], ['/ok/', {}], Array(1)]) { + assert.throws(() => collectRedirects([page(value)]), error => { + assert.ok(error instanceof TypeError) + assert.match(error.message, /redirectFrom.*current\/page.md.*(?:array|strings)/) + return true + }) + } +}) + +test('rejects unsafe paths in both exports, reporting the declaring source', () => { + for (const from of [ + '', 'old/', '//example.com/', 'https://example.com/', '/old path/', '/old\t/', + '/old\n/', '/old\0/', '/old\u007f/', '/old\u0085/', '/old\u00a0/', + '/old?query', '/old#hash', '/old\\path', '/./old', '/old/../new', + '/%2e/', '/old/%2E%2e/new', '/.%2e/', '/%252e%252e/', + '/old%2fnew/', '/old%5Cnew/', '/%252f/', '/%20/', '/%0a/', + '/%3f/', '/%23/', '/%00/', '/old//new/', '/%', '/%zz/', '/%C0%AF/', + ]) { + assert.throws(() => redirectOutputName(from), /Invalid redirectFrom/, from) + assert.throws(() => collectRedirects([page([from])]), /Invalid redirectFrom.*current\/page.md/, from) + } +}) + +test('rejects duplicate aliases, including equivalent output spellings', () => { + for (const aliases of [ + ['/old/', '/old/'], ['/old/', '/old/index.html'], ['/', '/index.html'], + ['/old/', '/%6fld/'], ['/caf%C3%A9/', '/café/'], + ]) assert.throws(() => collectRedirects([page(aliases)]), /Duplicate redirectFrom.*current\/page.md/) + assert.throws(() => collectRedirects([ + page(['/old/'], 'first.md', '/first/'), page(['/old/index.html'], 'second.html', '/second/'), + ]), /Duplicate redirectFrom.*second.html.*first.md/) +}) + +test('rejects self and existing-page collisions regardless of input order', () => { + for (const alias of ['/current/', '/current/index.html', '/%63urrent/']) { + assert.throws(() => collectRedirects([page([alias])]), /collides with existing page.*current\/page.md/) + } + const owner = page(['/taken/']) + const existing = page(undefined, 'taken/page.html', '/taken/') + for (const pages of [[owner, existing], [existing, owner]]) { + assert.throws(() => collectRedirects(pages), /current\/page.md.*collides with existing page.*taken\/page.html/) + } + assert.throws(() => collectRedirects([page(['/']), page(undefined, 'page.html', '/')]), /collides/) +}) + +test('uses actual outputRelname when provided, including literal Unicode names', () => { + const existing = page(undefined, 'special/page.html', '/different-public-url/') + existing.pageInfo.outputRelname = 'café/index.html' + assert.throws(() => collectRedirects([page(['/caf%C3%A9/']), existing]), /collides.*special\/page.html/) + existing.pageInfo.outputRelname = 'caf%C3%A9/index.html' + assert.throws(() => collectRedirects([page(['/caf%C3%A9/']), existing]), /collides.*special\/page.html/) + assert.deepEqual(collectRedirects([page(['/different-public-url/']), existing]), [ + { from: '/different-public-url/', to: '/current/' }, + ]) +}) + +test('preserves target URLs and aliases as data, without HTML escaping', () => { + assert.deepEqual(collectRedirects([page(['/old&name.html'], 'quoted"source.md', '/new&name.html')]), [ + { from: '/old&name.html', to: '/new&name.html' }, + ]) + assert.throws(() => collectRedirects([page(['bad'], 'quoted"source.md')]), error => { + assert.ok(error instanceof Error) + assert.ok(error.message.includes(JSON.stringify('quoted"source.md'))) + return true + }) +}) diff --git a/tests/site/output.test.ts b/tests/site/output.test.ts index 130be014..4e1e6c3b 100644 --- a/tests/site/output.test.ts +++ b/tests/site/output.test.ts @@ -32,35 +32,61 @@ test('all original routes and documents have static HTML and unchanged raw endpo assert.equal(raw.trim(), body.trim(), doc.source) } }) -test('docs and spec page outputs preserve raw bytes and nested .txt filenames', async () => { +test('docs and spec builds normalize inferred and explicit titles while preserving raw bytes', async () => { const fixture = await mkdtemp(join(tmpdir(), 'oro-page-outputs-')) const src = join(fixture, 'src') const dest = join(fixture, 'public') try { - for (const name of ['globals/global.data.ts', 'globals/global.vars.ts', 'markdown-it.settings.ts', 'layouts/root.layout.ts', 'layouts/docs.layout.ts', 'layouts/spec.layout.ts']) { + for (const name of ['globals/global.data.ts', 'globals/global.vars.ts', 'markdown-it.settings.ts', 'layouts/root.layout.ts', 'layouts/docs.layout.ts', 'layouts/spec.layout.ts', 'silk/docs/search.json.template.ts', 'silk/llms.txt.template.ts']) { const target = join(src, name) const url = new URL('../../src/' + name, import.meta.url).href await mkdir(dirname(target), { recursive: true }) await writeFile(target, `export { default } from ${JSON.stringify(url)}\nexport * from ${JSON.stringify(url)}\n`) } - const body = '\n\n# Exact bytes\r\n\r\nUnicode: café — λ. \r\n\n---\n\n{{ untouched }}\n\n' + const body = '\n\n# [Exact `bytes`](https://example.com) & **markup**\r\n\r\nUnicode: café — λ. \r\n\n---\n\n{{ untouched }}\n\n' + const source = (layout: string, title?: string, markdown = body) => `---\nlayout: "${layout}"\n${title === undefined ? '' : `title: ${JSON.stringify(title)}\n`}description: "Summary"\ndocsCollection: "silk"\nsection: "spec"\norder: 0\nsourcePath: "${layout}/bytes.txt"\ngithubRepo: "oro-computer/silk"\ngithubRef: "master"\n---` + markdown for (const layout of ['docs', 'spec']) { const target = join(src, 'silk', layout, 'bytes', 'page.md') await mkdir(dirname(target), { recursive: true }) - await writeFile(target, `---\nlayout: "${layout}"\ntitle: "Exact bytes"\ndescription: "Summary"\ndocsCollection: "silk"\nsection: "spec"\norder: 0\nsourcePath: "${layout}/bytes.txt"\ngithubRepo: "oro-computer/silk"\ngithubRef: "master"\n---` + body) + await writeFile(target, source(layout)) } - const siteData = await identifyPages(src) - assert.deepEqual(siteData.errors, []) - const result = await buildPagesDirect(src, dest, siteData) - assert.deepEqual(result.errors, []) - for (const layout of ['docs', 'spec']) { - await access(join(dest, 'silk', layout, 'bytes', 'index.html')) - assert.deepEqual( - await readFile(join(dest, 'silk/docs/source', layout, 'bytes.txt')), - Buffer.from(body), - layout, - ) + for (const override of [undefined, 'Different *override*']) { + if (override !== undefined) { + for (const layout of ['docs', 'spec']) + await writeFile(join(src, 'silk', layout, 'bytes', 'page.md'), source(layout, override)) + } + const siteData = await identifyPages(src) + assert.deepEqual(siteData.errors, []) + const result = await buildPagesDirect(src, dest, siteData) + assert.deepEqual(result.errors, []) + const expected = override === undefined ? 'Exact bytes & markup' : 'Different override' + for (const layout of ['docs', 'spec']) { + const $ = load(await readFile(join(dest, 'silk', layout, 'bytes', 'index.html'), 'utf8')) + const fullTitle = `${expected} · ${layout === 'spec' ? 'Silk Spec' : 'Silk Docs'} · Oro Computer` + assert.equal($('title').text(), fullTitle) + assert.equal($('meta[property="og:title"]').attr('content'), fullTitle) + assert.equal($('.prose h1 a[href="https://example.com"] code').text(), 'bytes') + assert.equal($('.prose h1 strong').text(), 'markup') + assert.equal($('.prose h1').attr('id'), 'exact-bytes--markup') + if (layout === 'spec') assert.equal($('.docs-sidebar-title').text(), expected) + else assert.equal($('.docs-sidebar a[href="/silk/docs/bytes/"]').text(), expected) + assert.deepEqual( + await readFile(join(dest, 'silk/docs/source', layout, 'bytes.txt')), + Buffer.from(body), + layout, + ) + } + const search = JSON.parse(await readFile(join(dest, 'silk/docs/search.json'), 'utf8')) + assert.equal(search.items.length, 2) + assert.deepEqual(search.items.map((item: { title: string }) => item.title), [expected, expected]) + const pack = await readFile(join(dest, 'silk/llms.txt'), 'utf8') + assert.equal(pack.split(`## ${expected}\n\nURL: `).length - 1, 2) + assert.ok(pack.includes(body)) } + await writeFile(join(src, 'silk/docs/bytes/page.md'), source('docs', undefined, '\n\n## Not an H1\n\nBody only.\n')) + const invalidSite = await identifyPages(src) + assert.deepEqual(invalidSite.errors, []) + await assert.rejects(buildPagesDirect(src, dest, invalidSite), /silk\/docs\/bytes\/page\.md: title must be a string \(non-empty\)/) } finally { await rm(fixture, { recursive: true, force: true }) } diff --git a/tests/titles.test.ts b/tests/titles.test.ts new file mode 100644 index 00000000..e3eb5c23 --- /dev/null +++ b/tests/titles.test.ts @@ -0,0 +1,23 @@ +import { test } from 'node:test' +import assert from 'node:assert/strict' +import { plainTitle, titleFromMarkdown } from '#lib/titles.ts' + +test('plainTitle preserves visible inline text without Markdown or HTML markup', () => { + for (const [inline, expected] of [ + ['[linked `code`](https://example.com)', 'linked code'], + ['**Bold** and *emphasis* with `code`', 'Bold and emphasis with code'], + ['Fish & chips — <tag>', 'Fish & chips — <tag>'], + ['![Image **label**](image.png) and ![](empty.png)', 'Image label and'], + ['<span>HTML <em>title</em></span> <!-- hidden -->', 'HTML title'], + [' Multiple\n spaces\tand   gaps ', 'Multiple spaces and gaps'], + ['', ''], + ]) assert.equal(plainTitle(inline), expected, inline) +}) + +test('titleFromMarkdown uses the first real H1 and ignores fenced headings', () => { + assert.equal(titleFromMarkdown('```md\n# Not a title\n```\n\n~~~\n# Also fenced\n~~~\n\n## Subtitle\n\n# [Real `title`](https://example.com) & **more**\n\n# Later'), 'Real title & more') + assert.equal(titleFromMarkdown('Setext *title*\n===\n'), 'Setext title') + assert.equal(titleFromMarkdown('## Only a subtitle\n\n```md\n# Fenced\n```'), '') + assert.equal(titleFromMarkdown('Body without a heading.'), '') + assert.equal(titleFromMarkdown(''), '') +}) diff --git a/tests/tooling/watch.test.ts b/tests/tooling/watch.test.ts index 86460985..268f73c1 100644 --- a/tests/tooling/watch.test.ts +++ b/tests/tooling/watch.test.ts @@ -95,7 +95,7 @@ test('a standalone checkout rebuilds articles, sidebar data and exports in watch assert.equal((await stat(siblingPath, { bigint: true })).mtimeNs, siblingMtime) // Only frontmatter changes: the Markdown heading and raw body stay identical. - const retitled = updated.replace('title: "Hello world"', 'title: "Watch refresh"') + const retitled = updated.replace(/^---\r?\n/, '---\ntitle: "Watch refresh"\n') assert.notEqual(retitled, updated) await writeFile(source, retitled) await waitFor(async () => { diff --git a/tools/import-public.ts b/tools/import-public.ts index c02650cf..b6ad4f2e 100644 --- a/tools/import-public.ts +++ b/tools/import-public.ts @@ -4,11 +4,16 @@ import { readFile, readdir, writeFile, mkdir, unlink } from 'node:fs/promises' import { load as parseYaml } from 'js-yaml' import { resolve, join, dirname } from 'node:path' import { collections, docUrl, type Collection } from '#lib/collections.ts' -import { - publicContent, - description, - title as pageTitle, -} from './migration/content.ts' +import { publicContent, description } from './migration/content.ts' +import { plainTitle, titleFromMarkdown } from '#lib/titles.ts' + +function explicitTitle(metadata: Record<string, any>, file: string): string | undefined { + if (!Object.hasOwn(metadata, 'title')) return undefined + if (typeof metadata.title !== 'string' || !plainTitle(metadata.title)) + throw new Error(`Invalid explicit title in ${file}: expected nonempty visible text`) + return metadata.title +} + export function splitPage(text: string): { metadata: Record<string, any> body: string @@ -55,7 +60,7 @@ export async function importCollection( catalog.push({ collection: metadata.docsCollection, id: metadata.sourcePath.replace(/\.(md|txt)$/, ''), - title: metadata.title, + title: plainTitle(explicitTitle(metadata, path) ?? '') || titleFromMarkdown(body) || metadata.sourcePath.replace(/\.(md|txt)$/, ''), }) if (metadata.docsCollection === collection) existing.set(metadata.sourcePath, { path, metadata, body, text }) @@ -71,10 +76,10 @@ export async function importCollection( const previous = existing.get(file) const unchanged = previous?.body === input const body = unchanged ? input : publicContent(input, collection, file) - const title = unchanged - ? previous.metadata.title - : pageTitle(body) || file.replace(/\.(md|txt)$/, '') - return { file, previous, unchanged, body, title } + const heading = titleFromMarkdown(body) + const override = explicitTitle(previous?.metadata || {}, file) + const title = override === undefined ? heading || file.replace(/\.(md|txt)$/, '') : plainTitle(override) + return { file, previous, unchanged, body, title, heading, override } }), ) for (const entry of staged) @@ -88,7 +93,7 @@ export async function importCollection( Math.max(0, ...[...existing.values()].map((e) => e.metadata.order)) + 1 const pending: { path: string; text: string; previous?: string }[] = [] const routes = new Set<string>() - for (const { file, previous, unchanged, body, title } of staged) { + for (const { file, previous, unchanged, body, title, heading, override } of staged) { const path = previous?.path || join(src, docUrl(collection, file), 'page.md') if (routes.has(path)) @@ -101,7 +106,6 @@ export async function importCollection( const metadata = { ...(previous?.metadata || { layout: collection === 'silk' && file === 'spec/2026.md' ? 'spec' : 'docs', - title, description: '', docsCollection: collection, section: file.includes('/') ? file.split('/')[0] : 'overview', @@ -110,7 +114,7 @@ export async function importCollection( githubRepo: c.repo, githubRef: 'master', }), - title, + ...(override === undefined && !heading ? { title } : {}), description: description(text), } pending.push({ diff --git a/tools/migration/content.ts b/tools/migration/content.ts index c0300163..828043d7 100644 --- a/tools/migration/content.ts +++ b/tools/migration/content.ts @@ -76,18 +76,4 @@ export function description(text: string): string { return '' } -/** Read visible heading text, including linked/code-formatted API names. */ -export function title(text: string): string { - const tokens = parser.parse(text, {}) - const index = tokens.findIndex( - (t) => t.type === 'heading_open' && t.tag === 'h1', - ) - if (index < 0) return '' - return (tokens[index + 1].children || []) - .map((t) => - t.type === 'softbreak' ? ' ' : t.type === 'html_inline' ? '' : t.content, - ) - .join('') - .replace(/\s+/g, ' ') - .trim() -} +export { titleFromMarkdown, titleFromMarkdown as title } from '#lib/titles.ts' diff --git a/tools/migration/migrate.ts b/tools/migration/migrate.ts index 49692171..b94c9fcd 100644 --- a/tools/migration/migrate.ts +++ b/tools/migration/migrate.ts @@ -9,6 +9,7 @@ import { type Collection, } from '#lib/collections.ts' import { canonicalLink } from '#lib/urls.ts' +import { plainTitle, titleFromMarkdown } from '#lib/titles.ts' import MarkdownIt from 'markdown-it' import { publicContent, description } from './content.ts' const legacy = resolve(process.argv[2] || '.') @@ -33,7 +34,7 @@ for (const [key, c] of Object.entries(collections)) { catalog.push({ collection: key as Collection, id: item.id, - title: item.title, + title: plainTitle(item.title), }) } for (const [key, c] of Object.entries(collections)) { @@ -76,13 +77,16 @@ for (const [key, c] of Object.entries(collections)) { catalog, ) const info = indexed.get(file) || { - title: original.match(/^# (.+)$/m)?.[1] || id, + title: titleFromMarkdown(body) || id, section: id.split('/')[0], order: order++, } + const heading = titleFromMarkdown(body) + const title = plainTitle(info.title) + if (!title) throw new Error(`Invalid title for ${file}`) const vars = { layout: collection === 'silk' && id === 'spec/2026' ? 'spec' : 'docs', - title: info.title.replace(/`/g, ''), + ...(title !== heading ? { title } : {}), description: description(body), docsCollection: collection, section: info.section, From 515761e37e1ffd4ca1e1208270acc5f346163cd2 Mon Sep 17 00:00:00 2001 From: Bret Comnes <bret@comnes.org> Date: Tue, 15 Sep 2026 20:35:42 -0700 Subject: [PATCH 5/5] perf: incrementally index global data with DOMStack beta.7 --- README.md | 27 +++- docs/migration.md | 18 ++- package-lock.json | 8 +- package.json | 2 +- src/globals/global.data.ts | 74 ++++++--- tests/docs-index.test.ts | 283 ++++++++++++++++++++++++++++++++++ tests/redirects-watch.test.ts | 3 + tests/tooling/watch.test.ts | 105 ++++++++++++- 8 files changed, 484 insertions(+), 36 deletions(-) create mode 100644 tests/docs-index.test.ts diff --git a/README.md b/README.md index 34090f30..4b347cf3 100644 --- a/README.md +++ b/README.md @@ -30,8 +30,9 @@ are output files; do not commit `public/`. Homepage styles live in `src/style.css`; learn styles in `src/layouts/learn.layout.css`. - `src/lib/`: rendering, URL, collection, and navigation helpers. - `src/globals/global.vars.ts`: shared site configuration. -- `src/globals/global.data.ts`: validated collection metadata and precomputed navigation, - search, and LLM-export projections derived from source pages. +- `src/globals/global.data.ts`: a watch-session index keyed by DOMStack `sourceId`, + caching validated document metadata, Markdown, and rendered search text. Navigation, + search, and LLM-export views are derived from those cached entries. - `src/layouts/docs.layout.ts`: the shared documentation renderer, consuming one lightweight navigation key for all collections. - `src/{product}/llms.txt.template.ts`: product LLM packs; Silk includes its wiki. @@ -89,6 +90,28 @@ redirect pages retain Silk's old logger-guide and specification aliases. The articles, sidebar, previous/next navigation, and ToC work without JavaScript; search, tabs, copy controls, and Ask AI progressively enhance them. +### Incremental global data + +DOMStack beta.7 supplies private `previousState`, reset/delta `changes`, and +`setState()` to the data callback. Initial builds and resets process all documents; +watch deltas replace only `changes.upserted` entries and delete `changes.removed` +IDs. Pages leaving a docs collection retain only their route/redirect metadata. +The cache contains plain data, never page instances or renderers, and DOMStack +commits its snapshot only after a successful build. It does not persist across +watch sessions or change the clean-build/ingestion workflow. + +Collection views are still rebuilt from cached document references, and existing +DOMStack fingerprints plus `dataDeps` remain the only downstream invalidation +system. There are no extra application hashes or changed-key declarations. +Source initialization, projection, state cloning, and fingerprinting still have +collection-wide costs; a body edit no longer rereads/renders the whole corpus for +search. The standalone watcher test measures these reads/renders directly. + +Beta.7's dependency tracking is conservative and incomplete for package import +aliases and static re-exports. Restart the watcher after changing shared helpers +reached through `#lib/*` or re-exports, or inputs read outside tracked imports. +Editing `global.data.ts` itself resets the index; ordinary page edits are tracked. + ### Redirects from old URLs Follow the [DOMStack redirect-pages recipe](https://domstack.net/docs/cookbook/redirect-pages/): diff --git a/docs/migration.md b/docs/migration.md index f32c275f..bcc470e1 100644 --- a/docs/migration.md +++ b/docs/migration.md @@ -1,7 +1,7 @@ # DOMStack migration status The repository implementation now builds the entire Oro website with -`@domstack/static@beta`. The lockfile records the resolved beta so `npm ci` +`@domstack/static@12.0.0-beta.7`. The lockfile records the pinned beta so `npm ci` remains reproducible. Production cutover is complete; deployment evidence is recorded below. ## Implemented @@ -26,8 +26,20 @@ plus its collection's search and LLM templates, which retain per-collection dependencies. DOMStack 12.0.0-beta.6 supplies the `pageOutputs` hook shared by `docs` and `spec`; no collection subscription is needed for raw exports. Watch rebuilds skip unchanged raw writes and clean up removed or renamed outputs. -Global data still processes all documents for search; this change narrows output -writes, not that computation. Ingestion remains separate from building. +Global data now uses beta.7's optional stateful API to cache processed documents +by `sourceId`. Initial/reset builds index all docs; deltas reread and render only +upserted docs and remove deleted entries. Lightweight route/redirect records also +cover non-doc pages. Collection views reference cached entries, while existing +fingerprints and `dataDeps` alone decide downstream invalidation. State is saved +only after successful validation and committed by DOMStack after a successful +build. Source initialization, state transfer, projections, and fingerprinting +still have whole-site costs. Ingestion remains separate from building. + +The actual watcher regression measured 585 initial Markdown reads/search renders, +then one of each for a body edit, title override, or raw-path change, and zero +for deletion. All 1,238 clean outputs matched the pre-index beta.7 build byte for +byte. Restart watch mode for aliased/re-exported helper changes that beta.7 does +not track; no framework patch or duplicate invalidation system is introduced. Shared article transforms remain page-local rather than storing rendered articles in global data. Markdown keeps the existing alerts, highlighting, and legacy heading-ID policy; enabling diff --git a/package-lock.json b/package-lock.json index ab113b8f..2b37545d 100644 --- a/package-lock.json +++ b/package-lock.json @@ -6,7 +6,7 @@ "": { "name": "oro-website", "devDependencies": { - "@domstack/static": "12.0.0-beta.6", + "@domstack/static": "12.0.0-beta.7", "@playwright/test": "^1.55.0", "@types/markdown-it": "^14.1.2", "@types/node": "^24.0.0", @@ -75,9 +75,9 @@ } }, "node_modules/@domstack/static": { - "version": "12.0.0-beta.6", - "resolved": "https://registry.npmjs.org/@domstack/static/-/static-12.0.0-beta.6.tgz", - "integrity": "sha512-Rti3mJT8ja6hZEP1NOggZaBBzlmr9X/OnccBQdlGtfagbFlrX0DyuMWYq9upXWmDUy2cmjBU/zDJYja9uCfjnQ==", + "version": "12.0.0-beta.7", + "resolved": "https://registry.npmjs.org/@domstack/static/-/static-12.0.0-beta.7.tgz", + "integrity": "sha512-tbsSGef9m9dPM/QAtYNdcyLMIRBGNKgDX8Krxr04sStDk94C/W0GAb8rQxemSl575Dplrv5gBWENqN3f7NQhPQ==", "dev": true, "license": "MIT", "workspaces": [ diff --git a/package.json b/package.json index 984c7d19..3d08577a 100644 --- a/package.json +++ b/package.json @@ -25,7 +25,7 @@ "check": "npm run typecheck && npm test && npm run build && npm run audit && npm run audit:content && npm run test:site && npm run test:browser && npm run test:tooling && npm run test:reproducibility" }, "devDependencies": { - "@domstack/static": "12.0.0-beta.6", + "@domstack/static": "12.0.0-beta.7", "@playwright/test": "^1.55.0", "@types/markdown-it": "^14.1.2", "@types/node": "^24.0.0", diff --git a/src/globals/global.data.ts b/src/globals/global.data.ts index 3718a5ae..9c8c4057 100644 --- a/src/globals/global.data.ts +++ b/src/globals/global.data.ts @@ -1,29 +1,60 @@ import type { GlobalDataFunction } from '@domstack/static/types.js' import { collections, type Collection } from '#lib/collections.ts' -import { collectRedirects } from '#lib/redirects.ts' +import { collectRedirects, type RedirectPage } from '#lib/redirects.ts' import { editUrl, plainText, projectCollection, validateDocVars, type Doc, type DocsData } from '#lib/docs.ts' -const globalData: GlobalDataFunction<DocsData, Record<string, unknown>, string> = async ({ pages }) => { - const redirects = collectRedirects(pages) - const docs: Record<Collection, Doc[]> = { - runtime: [], silk: [], silkWiki: [], virtnosis: [], sage: [], slg: [], + +type IndexedPage = RedirectPage & { doc?: Doc } +export type DocsIndex = Map<string, IndexedPage> + +const globalData: GlobalDataFunction<DocsData, Record<string, unknown>, string, DocsIndex> = async ({ + pages, previousState, changes, setState, +}) => { + const reset = changes.kind === 'reset' || previousState === undefined + const index: DocsIndex = reset ? new Map() : new Map(previousState) + const inputs = changes.kind === 'delta' && !reset ? changes.upserted : pages + if (changes.kind === 'delta') { + for (const sourceId of changes.removed) index.delete(sourceId) + } + + for (const page of inputs) { + const { url, outputRelname, pageFile } = page.pageInfo + const source = page.sourceId + // Retain only cloneable projections, never PageData or renderer instances. + const entry: IndexedPage = { + pageInfo: { url, outputRelname, pageFile: { relname: pageFile.relname } }, + vars: { redirectFrom: page.vars.redirectFrom }, + } + if (page.vars.docsCollection !== undefined) { + const v = validateDocVars(page.vars, source) + if (page.pageInfo.type !== 'md') throw new Error(`${source}: documentation must be Markdown`) + entry.doc = { + collection: v.docsCollection, + id: v.sourcePath.replace(/\.(md|txt)$/, ''), + title: v.title, description: v.description, section: v.section, order: v.order, + url, sourcePath: v.sourcePath, + markdown: await page.readMarkdownContent(), + searchText: plainText(await page.renderInnerPage()), + githubRepo: v.githubRepo, githubRef: v.githubRef, + editUrl: editUrl(source), + } } - for (const page of pages) { - if (page.vars.docsCollection === undefined) continue - const source = page.pageInfo.pageFile.relname - const v = validateDocVars(page.vars, source) - if (page.pageInfo.type !== 'md') throw new Error(`${source}: documentation must be Markdown`) - docs[v.docsCollection].push({ - collection: v.docsCollection, - id: v.sourcePath.replace(/\.(md|txt)$/, ''), - title: v.title, description: v.description, section: v.section, order: v.order, - url: page.pageInfo.url, sourcePath: v.sourcePath, - markdown: await page.readMarkdownContent(), - searchText: plainText(await page.renderInnerPage()), - githubRepo: v.githubRepo, githubRef: v.githubRef, - editUrl: editUrl(source), - }) + index.set(source, entry) + } + + // Cheap views reference cached documents; existing data fingerprints decide + // whether their consumers rebuild, without a second invalidation system. + const indexedPages = [...index.values()] + const docs: Record<Collection, Doc[]> = { + runtime: [], silk: [], silkWiki: [], virtnosis: [], sage: [], slg: [], + } + for (const { doc } of indexedPages) { + if (doc) docs[doc.collection].push(doc) } - const data = { redirects, routes: pages.map(p => p.pageInfo.url).sort(), navigation: {} } as DocsData + const data = { + redirects: collectRedirects(indexedPages), + routes: indexedPages.map(page => page.pageInfo.url).sort(), + navigation: {}, + } as DocsData for (const collection of Object.keys(collections) as Collection[]) { const list = docs[collection] list.sort((a, b) => a.order - b.order || a.id.localeCompare(b.id, 'en')) @@ -34,6 +65,7 @@ const globalData: GlobalDataFunction<DocsData, Record<string, unknown>, string> items: list.map(d => ({ id: d.id, title: d.title, file: d.sourcePath, url: d.url, section: d.section, summary: d.description, text: d.searchText })), } } + setState(index) return data } export default globalData diff --git a/tests/docs-index.test.ts b/tests/docs-index.test.ts new file mode 100644 index 00000000..0dfd6001 --- /dev/null +++ b/tests/docs-index.test.ts @@ -0,0 +1,283 @@ +import { test } from 'node:test' +import assert from 'node:assert/strict' +import globalData, { type DocsIndex } from '../src/globals/global.data.ts' +import type { DocsData, DocVars } from '#lib/docs.ts' + +type Params = Parameters<typeof globalData>[0] +type Page = Params['pages'][number] +type PageDouble = Pick<Page, 'sourceId' | 'vars' | 'readMarkdownContent' | 'renderInnerPage'> & { + pageInfo: Pick<Page['pageInfo'], 'type' | 'url' | 'outputRelname'> & { + pageFile: Pick<Page['pageInfo']['pageFile'], 'relname'> + } + markdown: string + html: string + calls: { read: number; render: number } +} +type Changes = { kind: 'reset'; reason: string; events: [] } | + { kind: 'delta'; upserted: PageDouble[]; removed: string[]; events: [] } +const reset: Changes = { kind: 'reset', reason: 'test', events: [] } +const delta = (upserted: PageDouble[] = [], removed: string[] = []): Changes => + ({ kind: 'delta', upserted, removed, events: [] }) + +function page(name: string, vars: Partial<DocVars> & Record<string, unknown> = {}): PageDouble { + return { + sourceId: `runtime/docs/${name}.md`, + pageInfo: { + type: 'md', url: `/runtime/docs/${name}/`, outputRelname: `runtime/docs/${name}/index.html`, + pageFile: { relname: `runtime/docs/${name}.md` }, + }, + vars: { + docsCollection: 'runtime', title: name, description: `${name} summary`, section: 'overview', + order: 0, sourcePath: `${name}.md`, githubRepo: 'oro-computer/runtime', githubRef: 'master', + ...vars, + }, + markdown: `# ${name}\n`, html: `<h1>${name}</h1>`, calls: { read: 0, render: 0 }, + async readMarkdownContent() { this.calls.read++; return this.markdown }, + async renderInnerPage() { this.calls.render++; return this.html }, + } +} + +function copy(input: PageDouble): PageDouble { + return { + ...page('copy'), sourceId: input.sourceId, pageInfo: structuredClone(input.pageInfo), + vars: structuredClone(input.vars), markdown: input.markdown, html: input.html, + } +} + +async function callback(params: { + pages: PageDouble[]; changes: Changes; previousState: DocsIndex | undefined + setState: Params['setState'] +}) { + // PageData has framework internals; the callback needs only the typed surface above. + return globalData(params as unknown as Params) +} + +async function invoke(pages: PageDouble[], changes: Changes, previousState?: DocsIndex) { + const snapshots: DocsIndex[] = [] + let staged: DocsIndex | undefined + const data = await callback({ + pages, changes, previousState, + setState(next) { staged = next; snapshots.push(structuredClone(next)) }, + }) + assert.equal(snapshots.length, 1) + assert.ok(staged instanceof Map) + assert.deepEqual(staged, snapshots[0]) + return { data, state: staged, snapshot: snapshots[0] } +} +type Result = Awaited<ReturnType<typeof invoke>> + +async function equivalent(pages: PageDouble[], changes: Changes, previous?: Result): Promise<Result> { + const before = previous && structuredClone(previous.state) + const previousData = previous && structuredClone(previous.data) + const result = await invoke(pages, changes, previous?.state) + const clean = await invoke(pages.map(copy), reset) + assert.deepEqual(result.data, clean.data) + assert.deepEqual(result.snapshot, clean.snapshot) + if (previous) { + assert.deepEqual(previous.state, before, 'last successful state must remain unchanged') + assert.deepEqual(previous.state, previous.snapshot) + assert.deepEqual(structuredClone(previous.data), previousData) + assert.notEqual(result.state, previous.state) + assert.notEqual(result.data.navigation, previous.data.navigation) + assert.notEqual(result.data.runtimeExports, previous.data.runtimeExports) + assert.notEqual(result.data.runtimeSearch, previous.data.runtimeSearch) + } + return result +} + +function counts(pages: PageDouble[], expected: number[]) { + assert.deepEqual(pages.map(p => p.calls), expected.map(n => ({ read: n, render: n }))) +} +function clear(pages: PageDouble[]) { + for (const p of pages) p.calls = { read: 0, render: 0 } +} + +function assertAbsent(data: DocsData, sourcePath: string, id: string, url: string) { + for (const nav of Object.values(data.navigation)) { + assert.equal(nav.bySource[sourcePath], undefined) + assert.equal(nav.legacy[id], undefined) + assert.ok(nav.sections.every(section => section.items.every(item => item.sourcePath !== sourcePath))) + } + assert.ok(!data.routes.includes(url)) + assert.ok(data.redirects.every(redirect => redirect.to !== url)) +} + +test('reset caches only cloneable projections, including non-doc routes and redirects', async () => { + const a = page('a', { redirectFrom: ['/old-a/'] }) + const b = page('b', { order: 1 }) + const landing = page('landing', { docsCollection: undefined, redirectFrom: ['/old-landing/'] }) + landing.pageInfo.type = 'html' + a.vars.unusedRenderer = () => 'must not enter the cache' + const result = await invoke([b, landing, a], reset) + delete a.vars.unusedRenderer + const clean = await invoke([b, landing, a].map(copy), reset) + assert.deepEqual(result.data, clean.data) + assert.deepEqual(result.snapshot, clean.snapshot) + counts([a, b, landing], [1, 1, 0]) + assert.deepEqual([...result.state.keys()], [b.sourceId, landing.sourceId, a.sourceId]) + assert.deepEqual(result.snapshot.get(landing.sourceId), { + pageInfo: { url: landing.pageInfo.url, outputRelname: landing.pageInfo.outputRelname, + pageFile: { relname: landing.sourceId } }, + vars: { redirectFrom: ['/old-landing/'] }, + }) + for (const entry of result.state.values()) { + assert.deepEqual(Object.keys(entry).sort(), entry.doc ? ['doc', 'pageInfo', 'vars'] : ['pageInfo', 'vars']) + assert.deepEqual(Object.keys(entry.pageInfo).sort(), ['outputRelname', 'pageFile', 'url']) + assert.deepEqual(Object.keys(entry.vars), ['redirectFrom']) + } + assert.deepEqual(result.data.runtimeExports.map(d => d.id), ['a', 'b']) + assert.equal(result.data.navigation.runtime.bySource['a.md'].next?.id, 'b') + assert.equal(result.data.navigation.runtime.bySource['b.md'].previous?.id, 'a') + assert.deepEqual(result.data.redirects, [ + { from: '/old-a/', to: a.pageInfo.url }, { from: '/old-landing/', to: landing.pageInfo.url }, + ]) +}) + +test('a delta without previous state falls back to all pages', async () => { + const pages = [page('a'), page('b'), page('landing', { docsCollection: undefined })] + await equivalent(pages, delta([pages[1]], ['runtime/docs/deleted.md'])) + counts(pages, [1, 1, 0]) +}) + +test('body upsert reads and renders only one page; empty delta does no body work', async () => { + const pages = [page('a'), page('b', { order: 1 })] + const initial = await equivalent(pages, reset) + clear(pages) + pages[0].markdown = '# a\n\nChanged body\n' + pages[0].html = '<h1>a</h1>\n<p>Changed <strong>body</strong></p>' + const updated = await equivalent(pages, delta([pages[0]]), initial) + counts(pages, [1, 0]) + // Navigation is the fingerprint input: body-only edits must not change it. + assert.deepEqual(updated.data.navigation, initial.data.navigation) + assert.notDeepEqual(updated.data.runtimeExports, initial.data.runtimeExports) + assert.notDeepEqual(updated.data.runtimeSearch, initial.data.runtimeSearch) + assert.equal(updated.data.runtimeSearch.items[0].text, 'a Changed body') + assert.notEqual(updated.state.get(pages[0].sourceId), initial.state.get(pages[0].sourceId)) + assert.equal(updated.state.get(pages[1].sourceId), initial.state.get(pages[1].sourceId)) + clear(pages) + const empty = await equivalent(pages, delta(), updated) + counts(pages, [0, 0]) + assert.deepEqual(empty.data, updated.data) + assert.notEqual(empty.data.navigation.runtime, updated.data.navigation.runtime) + assert.notEqual(empty.data.navigation.runtime.bySource['a.md'], updated.data.navigation.runtime.bySource['a.md']) +}) + +test('title, ordering, collection, source path, route and redirect updates replace old memberships', async () => { + const a = page('a', { redirectFrom: ['/old-a/'] }) + const b = page('b', { order: 1 }) + const c = page('c', { docsCollection: 'silk', order: 2 }) + const pages = [a, b, c] + let result = await equivalent(pages, reset) + clear(pages) + a.vars.title = 'Renamed A' + result = await equivalent(pages, delta([a]), result) + counts(pages, [1, 0, 0]) + assert.equal(result.data.runtimeExports[0].title, 'Renamed A') + assert.equal(result.data.runtimeSearch.items[0].title, 'Renamed A') + assert.equal(result.data.navigation.runtime.bySource['b.md'].previous?.title, 'Renamed A') + + a.vars.order = 3 + result = await equivalent(pages, delta([a]), result) + assert.deepEqual(result.data.runtimeExports.map(d => d.id), ['b', 'a']) + assert.equal(result.data.navigation.runtime.bySource['a.md'].previous?.id, 'b') + assert.equal(result.data.navigation.runtime.bySource['b.md'].previous, null) + + const oldUrl = a.pageInfo.url + Object.assign(a.vars, { docsCollection: 'silk', sourcePath: 'guides/renamed.txt', section: 'guides', + order: 0, redirectFrom: ['/new-alias/'] }) + a.pageInfo = { ...a.pageInfo, url: '/silk/docs/renamed/', outputRelname: 'silk/docs/renamed/index.html' } + result = await equivalent(pages, delta([a]), result) + assertAbsent(result.data, 'a.md', 'a', oldUrl) + assert.deepEqual(result.data.runtimeExports.map(d => d.id), ['b']) + assert.deepEqual(result.data.runtimeSearch.items.map(d => d.id), ['b']) + assert.deepEqual(result.data.silkExports.map(d => d.id), ['guides/renamed', 'c']) + assert.equal(result.data.navigation.runtime.bySource['b.md'].next, null) + assert.equal(result.data.navigation.silk.bySource['c.md'].previous?.id, 'guides/renamed') + assert.equal(result.data.navigation.silk.bySource['guides/renamed.txt'].section, 'guides') + assert.deepEqual(result.data.redirects, [{ from: '/new-alias/', to: a.pageInfo.url }]) + + a.vars.redirectFrom = undefined + result = await equivalent(pages, delta([a]), result) + assert.deepEqual(result.data.redirects, []) + a.vars.docsCollection = undefined + a.pageInfo.type = 'html' + clear(pages) + result = await equivalent(pages, delta([a]), result) + counts(pages, [0, 0, 0]) + assert.equal(result.state.get(a.sourceId)?.doc, undefined) + assert.equal(result.data.navigation.silk.bySource['guides/renamed.txt'], undefined) + assert.equal(result.data.navigation.silk.legacy['guides/renamed'], undefined) + assert.deepEqual(result.data.silkExports.map(d => d.id), ['c']) + assert.deepEqual(result.data.silkSearch.items.map(d => d.id), ['c']) + assert.ok(result.data.routes.includes(a.pageInfo.url)) +}) + +test('additions, deletions and reset process the correct pages and discard stale state', async () => { + const a = page('a', { redirectFrom: ['/old-a/'] }) + const b = page('b') + const landing = page('landing', { docsCollection: undefined, redirectFrom: ['/landing-alias/'] }) + let result = await equivalent([a], reset) + clear([a, b, landing]) + result = await equivalent([a, b, landing], delta([b, landing]), result) + counts([a, b, landing], [0, 1, 0]) + clear([a, b, landing]) + result = await equivalent([b], delta([], [a.sourceId, landing.sourceId, 'already-gone.md']), result) + counts([a, b, landing], [0, 0, 0]) + assert.deepEqual([...result.state.keys()], [b.sourceId]) + assertAbsent(result.data, 'a.md', 'a', a.pageInfo.url) + assert.deepEqual(result.data.redirects, []) + assert.deepEqual(result.data.routes, [b.pageInfo.url]) + + const c = page('c', { docsCollection: 'silkWiki' }) + result = await equivalent([b, c], reset, result) + counts([b, c], [1, 1]) + assert.equal(result.data.silkWikiSearch.kind, 'wiki') + result = await equivalent([c], reset, result) + assert.deepEqual([...result.state.keys()], [c.sourceId]) + result = await equivalent([], delta([], [c.sourceId]), result) + assert.equal(result.state.size, 0) + assert.deepEqual(result.data.routes, []) + await equivalent([], reset, result) +}) + +test('validation failures never stage or mutate successful state, and corrected retries match reset', async t => { + const cases: { name: string; breakPage: (p: PageDouble) => void; error: RegExp }[] = [ + { name: 'invalid metadata', breakPage: p => { p.vars.order = NaN }, error: /order must be finite/ }, + { name: 'unknown collection', breakPage: p => { p.vars.docsCollection = 'unknown' }, error: /unknown docsCollection/ }, + { name: 'invalid source path', breakPage: p => { p.vars.sourcePath = '../bad.md' }, error: /invalid sourcePath/ }, + { name: 'non-Markdown doc', breakPage: p => { p.pageInfo.type = 'html' }, error: /documentation must be Markdown/ }, + { name: 'duplicate source', breakPage: p => { p.vars.sourcePath = 'a.md' }, error: /Duplicate document:/ }, + { name: 'duplicate id', breakPage: p => { p.vars.sourcePath = 'a.txt' }, error: /Duplicate document id/ }, + { name: 'unsafe redirect', breakPage: p => { p.vars.redirectFrom = ['//unsafe/'] }, error: /Invalid redirectFrom/ }, + { name: 'duplicate redirect', breakPage: p => { p.vars.redirectFrom = ['/old-a/'] }, error: /Duplicate redirectFrom/ }, + { name: 'output collision', breakPage: p => { p.vars.redirectFrom = ['/runtime/docs/a/'] }, error: /collides with existing page/ }, + ] + for (const scenario of cases) await t.test(scenario.name, async () => { + const a = page('a', { redirectFrom: ['/old-a/'] }) + const b = page('b', { order: 1 }) + const removed = page('removed') + const initial = await equivalent([a, b, removed], reset) + const beforeData = structuredClone(initial.data) + const changed = copy(a) + changed.markdown = 'Updated before failure\n' + changed.html = '<p>Updated before failure</p>' + const invalid = copy(b) + scenario.breakPage(invalid) + for (const changes of [delta([changed, invalid], [removed.sourceId]), reset]) { + let staged = 0 + await assert.rejects(() => callback({ + pages: [changed, invalid], changes, previousState: initial.state, + setState() { staged++ }, + }), scenario.error) + assert.equal(staged, 0) + assert.deepEqual(initial.state, initial.snapshot) + assert.deepEqual(structuredClone(initial.data), beforeData) + assert.ok(initial.state.has(removed.sourceId)) + } + clear([changed, b]) + const retry = await equivalent([changed, b], delta([changed, b], [removed.sourceId]), initial) + counts([changed, b], [1, 1]) + assert.equal(retry.state.has(removed.sourceId), false) + assert.equal(retry.data.runtimeExports[0].markdown, changed.markdown) + }) +}) diff --git a/tests/redirects-watch.test.ts b/tests/redirects-watch.test.ts index 25c2d625..987bdeb4 100644 --- a/tests/redirects-watch.test.ts +++ b/tests/redirects-watch.test.ts @@ -79,6 +79,9 @@ test('redirectFrom aliases follow source edits, moves and deletion in watch mode // watch() resolves only after the initial build and filesystem watcher readiness. const initial = await bounded('watcher readiness', site.watch({ serve: false })) assert.deepEqual(initial.pageBuildResults?.errors, []) + // Beta.7 queues events observed during initial discovery/building. + await delay(0) + await bounded('startup events settled', site.settled()) for (const alias of aliases) await assertRedirect(alias, '/target/') const snapshots = await Promise.all(aliases.map(async alias => ({ html: await readFile(output(alias), 'utf8'), diff --git a/tests/tooling/watch.test.ts b/tests/tooling/watch.test.ts index 268f73c1..ea973096 100644 --- a/tests/tooling/watch.test.ts +++ b/tests/tooling/watch.test.ts @@ -10,13 +10,14 @@ import { writeFile, rm, symlink, + rename, } from 'node:fs/promises' import { spawn } from 'node:child_process' import { tmpdir } from 'node:os' import { join, resolve } from 'node:path' import { setTimeout as delay } from 'node:timers/promises' -test('a standalone checkout rebuilds articles, sidebar data and exports in watch mode', async () => { +test('a standalone checkout rebuilds articles, sidebar data and exports in watch mode', { timeout: 240000 }, async (t) => { const site = await mkdtemp(join(tmpdir(), 'oro-standalone-')) let child: ReturnType<typeof spawn> | undefined let logs = '' @@ -25,6 +26,50 @@ test('a standalone checkout rebuilds articles, sidebar data and exports in watch await cp('package.json', join(site, 'package.json')) await cp('CNAME', join(site, 'CNAME')) await symlink(resolve('node_modules'), join(site, 'node_modules'), 'dir') + // Instrument the real producer, not a simplified copy. Relative imports and + // the local default export are understood by beta.7's dependency tracker. + const globalPath = join(site, 'src/globals/global.data.ts') + await rename(globalPath, join(site, 'src/globals/watch-global-helper.ts')) + await writeFile(join(site, 'watch-revision.json'), JSON.stringify('initial')) + await writeFile(globalPath, ` + import actual from './watch-global-helper.ts' + import { readFile, writeFile, rename } from 'node:fs/promises' + import { resolve } from 'node:path' + const globalData = async (context) => { + const revision = JSON.parse(await readFile(resolve('watch-revision.json'), 'utf8')) + const snapshot = { + revision, kind: context.changes.kind, events: context.changes.events, + upserted: context.changes.upserted?.map(page => page.sourceId) ?? [], + removed: context.changes.removed ?? [], reads: [], renders: [], + } + const restore = [] + for (const page of new Set([...context.pages, ...(context.changes.upserted ?? [])])) { + for (const [method, counter] of [['readMarkdownContent', 'reads'], ['renderInnerPage', 'renders']]) { + const descriptor = Object.getOwnPropertyDescriptor(page, method) + const original = page[method] + page[method] = function (...args) { + snapshot[counter].push(page.sourceId) + return original.apply(this, args) + } + restore.push(() => { + if (descriptor) Object.defineProperty(page, method, descriptor) + else delete page[method] + }) + } + } + try { + return await actual(context) + } finally { + for (const undo of restore) undo() + // Atomic current snapshots, outside the watched tree; no module-level + // counters that can survive reloads or accumulate across revisions. + const target = resolve('watch-telemetry-' + revision + '.json') + await writeFile(target + '.tmp', JSON.stringify(snapshot)) + await rename(target + '.tmp', target) + } + } + export default globalData + `) await writeFile( join(site, 'watch.mjs'), ` @@ -61,6 +106,40 @@ test('a standalone checkout rebuilds articles, sidebar data and exports in watch // Wait until the initial all-pages build has finished, then edit only a source. await waitFor(async () => logs.includes('ORO_WATCH_READY')) const source = join(site, 'src', route, 'page.md') + const sourceId = route + 'page.md' + const completedBuilds = () => logs.match(/Build Success!/g)?.length ?? 0 + let beforeBuild = completedBuilds() + async function beginRevision(revision: string) { + beforeBuild = completedBuilds() + await writeFile(join(site, 'watch-revision.json'), JSON.stringify(revision)) + } + async function checkTelemetry(revision: string, count: number, removed = false) { + await waitFor(async () => revision === 'initial' || completedBuilds() > beforeBuild) + const snapshot = JSON.parse(await readFile(join(site, `watch-telemetry-${revision}.json`), 'utf8')) + t.diagnostic(JSON.stringify({ revision, kind: snapshot.kind, + reads: snapshot.reads.length, renders: snapshot.renders.length, + upserted: snapshot.upserted.length, removed: snapshot.removed.length, + events: snapshot.events })) + await t.test(`${revision}: actual global-data work`, () => { + assert.equal(snapshot.revision, revision) + assert.equal(snapshot.kind, revision === 'initial' ? 'reset' : 'delta') + assert.equal(snapshot.reads.length, count, `${revision}: Markdown reads`) + assert.equal(snapshot.renders.length, count, `${revision}: inner renders`) + if (revision === 'initial') { + assert.equal(new Set(snapshot.reads).size, count) + assert.deepEqual(snapshot.renders, snapshot.reads) + assert.deepEqual(snapshot.events, []) + } else { + assert.deepEqual(snapshot.upserted, removed ? [] : [sourceId]) + assert.deepEqual(snapshot.removed, removed ? [sourceId] : []) + assert.deepEqual(snapshot.reads, removed ? [] : [sourceId]) + assert.deepEqual(snapshot.renders, removed ? [] : [sourceId]) + assert.ok(snapshot.events.length > 0) + assert.ok(snapshot.events.every((event: { filepath: string }) => event.filepath === source)) + } + }) + } + await checkTelemetry('initial', 585) const original = await readFile(source, 'utf8') const outputRoot = join(site, 'public') const rawPath = 'runtime/docs/source/guides/hello-world.md' @@ -78,7 +157,7 @@ test('a standalone checkout rebuilds articles, sidebar data and exports in watch const siblingMtime = (await stat(siblingPath, { bigint: true })).mtimeNs const sentence = 'A unique watch-mode verification sentence.' const updated = original + '\n' + sentence + '\n' - await delay(100) + await beginRevision('body') await writeFile(source, updated) await waitFor(async () => { const output = await Promise.all([ @@ -86,8 +165,7 @@ test('a standalone checkout rebuilds articles, sidebar data and exports in watch ].map(path => readFile(join(outputRoot, path), 'utf8'))) return output.every(text => text.includes(sentence)) }) - // Allow the debounced build to finish before checking files it must not touch. - await delay(500) + await checkTelemetry('body', 1) const bodyRaw = await rawMtimes() assert.deepEqual(Object.keys(bodyRaw), Object.keys(initialRaw)) assert.deepEqual(Object.keys(bodyRaw).filter(path => bodyRaw[path] !== initialRaw[path]), [rawPath]) @@ -97,6 +175,7 @@ test('a standalone checkout rebuilds articles, sidebar data and exports in watch // Only frontmatter changes: the Markdown heading and raw body stay identical. const retitled = updated.replace(/^---\r?\n/, '---\ntitle: "Watch refresh"\n') assert.notEqual(retitled, updated) + await beginRevision('title') await writeFile(source, retitled) await waitFor(async () => { const output = await Promise.all([ @@ -104,19 +183,28 @@ test('a standalone checkout rebuilds articles, sidebar data and exports in watch ].map(path => readFile(join(outputRoot, path), 'utf8'))) return output.every(text => text.includes('Watch refresh')) }) - await delay(500) + await checkTelemetry('title', 1) assert.deepEqual(await rawMtimes(), bodyRaw) const renamedRawPath = 'runtime/docs/source/guides/watch-renamed.txt' const renamed = retitled.replace('sourcePath: "guides/hello-world.md"', 'sourcePath: "guides/watch-renamed.txt"') assert.notEqual(renamed, retitled) const raw = await readFile(join(outputRoot, rawPath)) + await beginRevision('rename') await writeFile(source, renamed) await waitFor(async () => { assert.deepEqual(await readFile(join(outputRoot, renamedRawPath)), raw) await assert.rejects(access(join(outputRoot, rawPath)), { code: 'ENOENT' }) return true }) + await checkTelemetry('rename', 1) + const renamedRaw = await rawMtimes() + assert.deepEqual(Object.keys(renamedRaw).sort(), + Object.keys(bodyRaw).filter(path => path !== rawPath).concat(renamedRawPath).sort()) + for (const path of Object.keys(bodyRaw).filter(path => path !== rawPath)) { + assert.equal(renamedRaw[path], bodyRaw[path], `rename must not rewrite ${path}`) + } + await beginRevision('delete') await rm(source) await waitFor(async () => { await assert.rejects(access(join(outputRoot, renamedRawPath)), { code: 'ENOENT' }) @@ -124,7 +212,14 @@ test('a standalone checkout rebuilds articles, sidebar data and exports in watch const search = await readFile(join(outputRoot, 'runtime/docs/search.json'), 'utf8') const pack = await readFile(join(outputRoot, 'runtime/llms.txt'), 'utf8') return !search.includes(sentence) && !pack.includes(sentence) + && !search.includes('Watch refresh') && !pack.includes('Watch refresh') + && !search.includes('guides/watch-renamed.txt') && !pack.includes('guides/watch-renamed.txt') }) + await checkTelemetry('delete', 0, true) + const deletedRaw = await rawMtimes() + const { [renamedRawPath]: removedMtime, ...remainingRaw } = renamedRaw + assert.ok(removedMtime) + assert.deepEqual(deletedRaw, remainingRaw) } finally { if (child && child.exitCode === null) { const exited = new Promise<void>((resolve) =>