4.5 KiB
4.5 KiB
Context: architecture, current and target
Current (no build step)
Ten hand-written HTML pages, each linking its own CSS and one ES module:
| Route | Page | Script | Stylesheets |
|---|---|---|---|
/ |
index.html |
— | chapters.css, landing.css |
/full-guide/ |
full-guide/index.html |
app.js (50 KB) |
styles.css, responsive.css, audit.css |
/summary/ |
summary/index.html |
— | chapters.css |
/models/ |
models/index.html |
— | chapters.css |
/agents/ |
agents/index.html |
— | chapters.css |
/skills/ |
skills/index.html |
skills/app.js |
skills/styles.css |
/rules/ |
rules/index.html |
rules/app.js |
rules/styles.css |
/skills-review/ |
skills-review/index.html |
skills-review/app.js |
skills-review/styles.css, change-lens.css |
/hands-on/starter/ |
lab fixture | own | own |
/hands-on/rules/ |
lab fixture | own | own |
Weight is concentrated: app.js 50 KB, responsive.css 30 KB,
skills-review/catalog.js 27 KB, skills-review/submitted-catalog.js 18 KB.
What each big file actually is
app.js— not really application code. It is a bilingual content database (phases,handsOnPrompts,modelGuide,skillSources,skillInstallPrompts, each keyed{en, pt}) plus ~12 smallrender*functions that swapinnerHTMLon tab clicks. ~50en:keys. The content should become data; only the tab behaviour is interactive.responsive.css— a 30 KB append-only layer of overrides bolted on top ofstyles.css. Expect large parts to be dead once layout moves into components. Do not port it verbatim.skills-review/catalog.js— the real data model of the review desk: one entry per submitted skill withid,author,title,status,focus,wins[],improve[],extras,improved(full markdown). 24 entries acrosscatalog.js+submitted-catalog.js. This is already a content collection in all but name.skills-review/files.js/submitted-files.js— generated file manifests.vote.js— the vote widget island; talks tovote-service/.
Target (Astro)
src/
content/ catalog entries, chapter copy, EN/PT strings (typed collections)
layouts/ BaseLayout, ChapterLayout, GuideLayout
components/ .astro by default; islands only where marked
styles/ tokens.css, base.css, then per-component styles
pages/ routes mirroring today's URLs exactly
public/
hands-on/ lab fixtures copied verbatim, never processed
Non-negotiables for the target
- URLs do not change.
/full-guide/,/skills-review/,/hands-on/starter/and the rest must resolve exactly as they do now, trailing slash included. Existing links (includingdocs/, SilverBullet, and shared URLs with?author=…&skill=…&view=…query params) must keep working. - Zero JS by default. Seven of the ten pages ship no JavaScript today. They must still ship none. Islands are opt-in, per component, and justified.
hands-on/stays vanilla. It goes inpublic/untouched. It is a lab fixture, not a component.- No external runtime requests.
audit-ui.mjsenforces this and it is part of the site's thesis. Self-host anything you add. - The review desk's query-param deep links keep working —
?author=,?skill=,?view=,?file=,?compare=,?render=. They are documented in the page footer and shared externally.
Companion service
vote-service/ is a Go API on its own Kubernetes deploy cycle, reached by the
review desk over window.SKILLS_REVIEW_VOTE_API. The refactor does not touch
it. Keep the global, or replace it with a build-time PUBLIC_VOTE_API env var —
but if you do, update vote-service/README.md in the same change.