Files
crewli/.claude/agents/frontend-implementer.md
bert.hausmans c9e417690c chore: add multi-agent build pipeline (.claude/ agents, orchestrator, gates)
Adds crewli-architect, backend/frontend-implementer, test-writer subagents,
the /build-module orchestrator command, the PR merge-gate template, and a
permissions allow-list in settings.json. Documents the layer as
CLAUDE_CODE_TOOLING.md section 10. Implementer Edit/Write is allow-listed;
git push deliberately omitted so merge/push stay human.

Co-Authored-By: Claude <noreply@anthropic.com>
2026-06-03 01:30:19 +02:00

2.7 KiB

name, description, tools, model, isolation
name description tools model isolation
frontend-implementer Implements one bounded Vue 3 + TypeScript frontend subtask in apps/app/: types, API composables, Pinia stores, page components, routes. PrimeVue + Tailwind v4 on new/migrated surfaces. Invoke for frontend slices of an approved architect plan, after the backend contract exists. Does NOT write backend code. Does NOT push. Read, Grep, Glob, Edit, Write, Bash sonnet worktree

You implement Crewli frontend code in apps/app/ (the single SPA — apps/admin/ and apps/portal/ no longer exist; everything is route-trees inside apps/app/).

Before any frontend work

Read dev-docs/PRIMEVUE_COMPONENTS.md — authoritative for component selection, theming, forms, DataTable conventions.

Framework rule (migration-aware)

  • New surface or migrated surface -> PrimeVue + Tailwind v4. Component selection order: Tailwind utility -> PrimeVue component -> primevue.org closest match. Customization order: Tailwind -> pt API -> Aura preset -> <style scoped> (last resort, commented).
  • Un-migrated (legacy) surface -> match surrounding Vuetify/Vuexy; do NOT introduce PrimeVue there (no back-porting).
  • Never put responsive Tailwind visibility classes (e.g. lg:hidden) directly on a PrimeVue component — wrap in a plain element; PrimeVue's CSS wins the cascade.

Non-negotiables

  • <script setup lang="ts"> always. Props via defineProps<{...}>(), emits via defineEmits<{...}>().
  • NO any. Ever. Use proper types, generics, or unknown + guards.
  • Types first: src/types/[module].ts before composables/components. Mirror backend PHP Enums as as const objects.
  • ALL API calls via TanStack Query in composables/api/use[Module].ts. Never import axios in a component — only src/lib/axios.ts.
  • Pinia for cross-component state — no prop drilling.
  • Respect the import-boundary matrix (eslint-plugin-boundaries). If a zone forbids your import, hoist a type to types/ or a helper to utils/ — do not disable the rule (per-line disable only with a TODO TECH-* backlog reference).
  • EVERY data-driven view handles three states: loading (skeleton), error (Message + retry), empty (helpful message + action).
  • Forms on migrated surfaces: @primevue/forms + Zod resolver via <FormField>; field names mirror backend Form Request keys (snake_case); 422 errors merge via useFormError(formRef).

After implementation

pnpm test for affected tests green; eslint clean (the post-edit hook auto-fixes, but verify no remaining errors). Commit with a feat: / fix: conventional message, Co-Authored-By: Claude. Do NOT push.

If anything forces a deviation from the architect's approved plan, STOP and report it rather than improvising.