O site kshana.dev
web/ é a árvore que o GitHub Pages serve como https://kshana.dev: as páginas (index.html, missions.html, capabilities.html, evidence.html, developers.html, editions.html), a documentação em docs/ e o Kshana Studio em studio/ (servido em https://kshana.dev/studio/), o aplicativo que executa o motor no navegador como WebAssembly (WASM), sem computação no servidor e sem nada enviado. O Studio tem duas visões de um mesmo motor: a visão Simple (studio/index.html, a resposta primeiro, em palavras simples) e a visão Advanced (studio/advanced/index.html, o painel completo), que compartilha o motor, o worker, os módulos e os dados da visão Simple por meio de <base href="../">.
Desde a 0.35.0, o Studio tem mais quatro visões, cada uma em sua própria página com <base href="../">, sem indexação por buscadores e com uma pasta de amostras sintéticas que o seu teste lê:
studio/trust/: a visão marítima de confiança, uma pontuação de confiança do receptor para o fluxo de posições de uma embarcação, com uma trilha de demonstração emtrust/demo/.studio/training/: o debriefing de treinamento de tripulação, que reproduz NMEA sintético com um evento de jamming, drag-off, time-spoof ou replay (training/demo/).studio/interference/: o mapa de interferência e a exposição de rotas (interference/demo/).studio/tools/: uma página de cartões de ferramentas com exemplos (tools/examples/,tools/samples/), incluindo pacotes de evidências assinados (#evidence), a exportação para test bench (#bench), o mapeamento de compliance (#compliance), a verificação OSNMA do Galileo (#osnma) e os canais do assistente de IA (#ai).
De onde vêm os arquivos#
Três tipos de arquivo ficam aqui, e eles são alterados de três maneiras diferentes.
Arquivos portados. As páginas,
docs/,css/,js/,assets/, os dados do site emdata/(land.json,search.json,series.json) e tudo emstudio/são escritos porweb/tools/port_site.pya partir de um build do site e do código-fonte do Studio.PORT-MANIFEST.jsonlista cada um com o seu checksum SHA-256 (Secure Hash Algorithm, 256 bits). Não os edite aqui:site.test.mjsfalha diante de uma edição manual. Altere a fonte e execute o port novamente:python3 web/tools/port_site.py --site <built site folder> --studio <Studio folder> python3 web/tools/port_site.py --site <built site folder> --studio <Studio folder> --checkO port é determinístico: uma segunda execução não escreve nada, e
--checktermina com 1 seweb/não for o que o port escreveria. Ele repassa sem alteração os arquivos de rastreamento do build do site (o canonical, o cartão social e as tags schema.org de cada página,robots.txt,sitemap.xml,llms.txt,llms-full.txt), confere-os, escrevelegacy-redirects.js,404.htmle a página de encaminhamento no endereço antigo do Studio (playground/index.html, para/studio/), e aponta cada página para as fontes e bibliotecas de script locais (abaixo).Arquivos que
web/possui. São fontes por mérito próprio, e o port nunca os toca:capabilities.jsoné a fonte estruturada dos cartões de capacidades e da grade de padrões. Edite esse arquivo, não o HTML.data/verification-matrix.jsoné gerado (cargo run --bin gen_validation_artifacts) e fixado portests/verification_artifacts_doc_sync.rs; não o edite à mão.data/card-matrix-map.json,data/oracle-references.jsonedata/standards-matrix-map.jsonsão mapeamentos mantidos à mão que o mesmo teste confere com a matriz gerada. As cópias do Studio emstudio/data/são esses arquivos, byte a byte.og-card.svg,og-card.pngeog-card.rendered-from.jsonsão o cartão social (python3 tools/gen_og_card.py).CNAME,.well-known/security.txt,favicon.svg.fonts/evendor/: os arquivos de fonte e a biblioteca de script que as páginas usam, obtidos uma única vez portools/fetch_third_party.pye versionados (veja "Sem requisições a terceiros").build.sh,smoke.mjs,site.test.mjs,legacy-urls.test.mjsetools/.
Saídas de build, ignoradas pelo git e produzidas por
build.sh:pkg/(o pacotewasm-pack, a partir do qual também se constrói o pacote npm),studio/pkg/(o mesmo pacote, onde o Studio o importa) escenarios/(todo cenário de referência, no endereço de onde o site anterior, de página única, os servia).
Compilar e servir localmente#
./web/build.sh # compiles the WASM module and stages it for the Studio
python3 -m http.server -d web 8000 # serve over HTTP (required for WASM)
# open http://localhost:8000/
Sem a toolchain WASM, KSHANA_WASM_PKG=<a built pkg folder> ./web/build.sh prepara um pacote existente em vez de compilar um. O fluxo de trabalho do Pages nunca usa isso.
Testes#
node web/smoke.mjs # the WASM bindings (needs web/pkg)
node web/site.test.mjs # the ported tree: manifest, version, counts, links, inline JSON
node web/tools/inline-json.test.mjs # the guard for corrupt inline page data (an unescaped version bump)
node web/legacy-urls.test.mjs # every old kshana.dev address still resolves
for f in web/studio/lib/*.test.mjs; do node "$f"; done # the Studio's modules
Cada módulo em studio/lib/ é lógica pura com um *.test.mjs correspondente; os drivers do DOM (Document Object Model, a árvore de elementos da página) do Studio são studio/app.js (a visão Simple) e studio/advanced.js (a visão Advanced). A integração contínua executa cada um deles como uma etapa própria e falha se um arquivo de teste em web/ não tiver etapa.
Sem requisições a terceiros#
O kshana.dev serve as suas próprias fontes, estilos e scripts. Uma página não faz nenhuma requisição a um host de fontes ou a um host de scripts, de modo que o endereço de um visitante não é entregue a nenhum deles.
O site e o Studio são escritos para usar o Google Fonts e um host de scripts. O port substitui o link do Google Fonts de cada página pela folha de estilo correspondente em fonts/ (as mesmas regras @font-face e os mesmos arquivos de fonte, todos os subconjuntos, de modo que o texto seja renderizado como antes) e cada endereço de host de scripts pelo arquivo em vendor/. fonts/FONTS.json e vendor/VENDOR.json registram de onde veio cada arquivo e o seu checksum; as fontes estão sob a SIL Open Font License (fonts/OFL-*.txt) e o three.js sob a licença MIT (vendor/three@…/LICENSE).
tools/fetch_third_party.py --from <site folder> --from <Studio folder> é a única etapa que usa a rede. Execute-a novamente apenas quando uma página pedir um conjunto de fontes ou uma versão de biblioteca que não esteja aqui: o port recusa e informa isso. site.test.mjs falha se qualquer página, folha de estilo ou script portado nomear um host de fontes ou carregar qualquer coisa de outro host.
A página 404#
O GitHub Pages responde a um endereço inexistente com /404.html e o status 404. O port cria essa página a partir da própria estrutura da página inicial (navegação, rodapé, busca) em torno de uma mensagem curta com links para a Home, a Docs e o Studio. Todo endereço nela é escrito a partir da raiz do site, porque ela é servida em qualquer profundidade.
Endereços antigos#
Até a v0.28.0, o site era uma página única, e tudo ficava atrás de um fragmento em / (/#playground, /#ledger, links de compartilhamento como /#s=…, incorporações como /?embed=1&…; o nome antigo de uma aba em um link de incorporação, como tab=fom, abre a aba do Studio que a substituiu). tools/legacy-urls.json lista todo endereço desse tipo que o material publicado usa e para onde ele leva agora; a página inicial carrega legacy-redirects.js, gerado a partir dessa lista, para encaminhá-los até lá. Acrescente um caso à lista antes de aposentar qualquer endereço.
Implantação#
O fluxo de trabalho pages do GitHub Actions implanta uma tag de release, não main: release.yml o dispara assim que uma release é publicada, e um disparo manual reimplanta uma tag nomeada. Ele executa build.sh, prepara web/ sem os testes, o script de build, tools/, o manifesto e este arquivo, e publica o resultado no GitHub Pages.