angora-compose-page — independently scanned and version-tracked by SaferSkills.
SaferSkills independently audited angora-compose-page (Agent Skill) and scored it 100/100 (green). The audit ran 55 deterministic rules across Security, Supply Chain, Maintenance, Transparency, and Community; it found 0 high-severity and 0 lower-severity findings. The full rule-by-rule trace and per-finding evidence are below. Free, methodology-open.
Findings & checks · 0 flagged
Every scanned point with the score it earned and what moved between them.
First recorded scan — no prior version to compare against.
The primary manifest — the file an agent reads to learn what this artifact does.
Build or update a full site page from approved components. Pages are living documents — this skill handles both creation and evolution.
This skill does two things:
src/pages/design-system/layouts/ using real components with placeholder content. These are specimens, not production pages.src/pages/ with production content, database queries, SEO, and site layout wrappers.Intent check: When the user says "update the home page" or similar, clarify before proceeding: "Do you mean the home layout in the design system (/design-system/layouts/home), or the actual website home page at src/pages/index.astro?"
src/components/*.astro to know what's available. Only use approved, built components.seamless, fullWidth (drops flow width constraint), narrow (constrains to --container-narrow), withWrap (re-constrains children of full-width sections), withPadding (adds vertical padding without seamless), title (renders <h2> with automatic aria-labelledby).src/pages/design-system/wireframes/<page-name>.astro. If it exists, read it — especially the data source annotations in frontmatter.src/pages/design-system/layouts/<page-name>.astro. If a layout exists, it's an approved composition showing how components assemble for this page. Use it as the reference — match its section order, component choices, and visual rhythm. The real page replaces placeholder content with real data but follows the same structure.src/pages/<page-name>.astro. If it exists, read it first. This is an evolution, not a rewrite.src/layouts/ for existing site layouts (header/footer wrappers).This skill can be invoked with:
If no wireframe exists, recommend one ("Want me to sketch a wireframe first with /angora-wireframe?") but don't force it.
Before building, determine the data source for every section on the page.
If a wireframe exists with data source annotations, read them:
/*
Data sources:
sections:
- component: Hero
data: static
- component: Testimonials
data: table:testimonials
- component: Pricing
data: table:pricing_tiers
*/If no wireframe or annotations, ask for each section:
For template sections, verify the table exists by globbing src/data/schema/tables/*.ts — each file is a table definition.
If a required table doesn't exist, flag it: "The testimonials table doesn't exist yet. This needs schema work first. Run /angora-schema testimonials to design it."
Recognize when cards link to individual pages (blog posts, case studies, cities, team members). This is a first-class pattern:
src/pages/<collection>.astro
SELECT * FROM <table> WHERE status = 'published'/collection/[slug]src/pages/<collection>/[slug].astro
getStaticPaths() to generate pages from databaseSELECT * FROM <table> WHERE status = 'published'<title>, <meta name="description">, OG tags---
import db from '../../data/db.ts';
import { <table> } from '../../data/schema/tables/<table>';
import { eq } from 'drizzle-orm';
export function getStaticPaths() {
const items = db.select().from(<table>).where(eq(<table>.status, 'published')).all();
return items.map(item => ({
params: { slug: item.slug },
props: { item },
}));
}
const { item } = Astro.props;
---
<html>
<head>
<title>{item.metaTitle || item.title}</title>
<meta name="description" content={item.metaDescription || ''} />
</head>
...
</html>Ask: "Should this page have the site header/footer, or is it a standalone landing page?"
Check for src/layouts/ — if no layout exists and user wants header/footer, flag it: "No site layout exists yet. Want me to create one, or should we build this as a standalone page for now?"
Site layouts go in src/layouts/ (Astro convention). A site layout wraps page content with shared header/footer/nav.
src/pages/<page-name>.astro — the site pagesrc/pages/<collection>/[slug].astro — for list/detail patternsWhen a page includes forms (contact, signup, settings), use the form layout primitives:
grid-gap spacinggrow={false} for button rowsEvery field inside a FieldGroup should be wrapped in a FormRow. Don't use raw <div> wrappers for form layout.
<main class="section-flow"> wraps all sections. The section-flow utility lives in global.css and controls inter-section spacing (gap controlled by --section-gap). For editorial content (blog posts, articles), use <article class="prose-flow"> instead.section-flow and prose-flow include prose automatically via @apply prose. Raw HTML elements get typographic styling from prose at low specificity (:where()) — component classes always win. Don't add prose separately. The only local prose usage is for nested content zones that need their own vertical rhythm.section-flow. They render their own semantic element with data-component and flow attributes (data-seamless, data-full-width). Don't wrap landmarks in <Section>.title, seamless, narrow, fullWidth, withWrap. Use <Section fullWidth withWrap> when a section needs edge-to-edge background but children should stay constrained to container width.<Section seamless> for sections with background colors/images. Adjacent seamless sections get 0 gap so backgrounds butt up.<title>, <meta name="description">, OG tagsLayout.astro for design system pages. For site pages, include <meta name="color-scheme" content="light dark"> if the site supports dark mode, or <meta name="color-scheme" content="light"> if light-onlydark:brightness-80 dark:contrast-125 on <img> elements to dim slightly. Avoid images with baked-in white backgrounds — they become glowing rectangles in dark mode. Prefer transparent or neutral backgrounds for logos and illustrationsWhen building a layout in src/pages/design-system/layouts/, enforce these additional rules:
.astro file. No extracted sub-components, no helper modules. If the layout feels too complex for one file, the components are too coarse — refine them in /angora-component.<div>, a component is missing. Allowed: just section-flow on <main>. Not allowed: spacing wrappers (<div class="mt-8">), grid layouts (<div class="grid grid-cols-2">), visual treatments (<div class="bg-card rounded-lg">), styled headings, width constraints, Button wrapper divs, class overrides on components, raw markup.<script> tags for interactivity. If a section needs interactivity, it should use a Preact island via the component itself.<Section>? Content components inside <Section>? No arbitrary values? No double-wrapping? Background rhythm makes sense?Present the completed page to the user and suggest they review in browser (pnpm dev). Then run /angora-design-system-audit automatically — this is verification, not a change. Present findings and proposed fixes. Wait for approval before applying fixes. (Accessibility is covered at the component and layout level by pnpm test:a11y — no need to re-test assembled pages.)
~30 seconds. Free. No account. Every finding cites a rule and a line of evidence.