npm run sync— Sync template bundles (run after editing templates/ or bundles.json)python scripts/validate_templates.py— Validate template JSON filespython scripts/sync_bundles.py— Regenerate manifest and copy assets to packages
- Monorepo with Nx, Python packages, and Astro site
templates/— Source workflow JSON files and thumbnails (index.json is the manifest)packages/— Python packages: core (loader), media_* (templates by type: api, image, video, other)site/— Astro static site (independently managed; see below)scripts/— Python validation/sync scripts for CI and local dev
The site/ directory is an independent Astro 5 project with Vue 3 interactive islands.
For full site-specific instructions, see site/AGENTS.md.
Island architecture summary:
.astrofor static/SSR content and data fetching —.vuewithclient:loadfor interactive UI- Serialize content collections to plain JSON objects before passing as props to Vue islands
- Each
client:loadVue component is a separate Vue app —provide/inject/$emitdon't cross islands - Cross-island state: shared composables in
site/src/composables/with module-levelref()singletons - Astro→Vue bridge: Vue island attaches
addEventListenerto Astro DOM elements by ID inonMounted()— no<script>tags withdispatchEventin.astrofiles
- Python: Ruff linter, line-length 100, target py312. Select rules: E, F
- Templates: JSON workflow files with embedded model metadata. Thumbnails named
{template}-1.webp - Naming: snake_case for Python/templates
- Bump version in root
pyproject.tomlwhen adding/modifying templates
- All Vue components use
<script setup lang="ts">with Composition API only — no Options API, no mixins - Cross-component communication via shared composables (
site/src/composables/) with module-level reactive refs — NEVER usedocument.dispatchEvent(new CustomEvent(...))or event bus patterns between Vue components - Astro-to-Vue bridge: attach listeners to specific DOM elements by ID in
onMounted(), not via inline<script>tags withdispatchEvent - Props via
defineProps<T>(), emits viadefineEmits<T>(), reactivity viaref(),computed(),watch()