aios-core
Version:
Synkra AIOS: AI-Orchestrated System for Full Stack Development - Core Framework
479 lines (369 loc) • 14 kB
Markdown
# Build Production-Ready Component
> Task ID: atlas-build-component
> Agent: Atlas (Design System Builder)
> Version: 1.0.0
## Execution Modes
**Choose your execution mode:**
### 1. YOLO Mode - Fast, Autonomous (0-1 prompts)
- Autonomous decision making with logging
- Minimal user interaction
- **Best for:** Simple, deterministic tasks
### 2. Interactive Mode - Balanced, Educational (5-10 prompts) **[DEFAULT]**
- Explicit decision checkpoints
- Educational explanations
- **Best for:** Learning, complex decisions
### 3. Pre-Flight Planning - Comprehensive Upfront Planning
- Task analysis phase (identify all ambiguities)
- Zero ambiguity execution
- **Best for:** Ambiguous requirements, critical work
**Parameter:** `mode` (optional, default: `interactive`)
## Task Definition (AIOS Task Format V1.0)
```yaml
task: buildComponent()
responsável: Uma (Empathizer)
responsavel_type: Agente
atomic_layer: Molecule
**Entrada:**
- campo: name
tipo: string
origem: User Input
obrigatório: true
validação: Must be non-empty, lowercase, kebab-case
- campo: options
tipo: object
origem: User Input
obrigatório: false
validação: Valid JSON object with allowed keys
- campo: force
tipo: boolean
origem: User Input
obrigatório: false
validação: Default: false
**Saída:**
- campo: created_file
tipo: string
destino: File system
persistido: true
- campo: validation_report
tipo: object
destino: Memory
persistido: false
- campo: success
tipo: boolean
destino: Return value
persistido: false
```
## Pre-Conditions
**Purpose:** Validate prerequisites BEFORE task execution (blocking)
**Checklist:**
```yaml
pre-conditions:
- [ ] Target does not already exist; required inputs provided; permissions granted
tipo: pre-condition
blocker: true
validação: |
Check target does not already exist; required inputs provided; permissions granted
error_message: "Pre-condition failed: Target does not already exist; required inputs provided; permissions granted"
```
## Post-Conditions
**Purpose:** Validate execution success AFTER task completes
**Checklist:**
```yaml
post-conditions:
- [ ] Resource created successfully; validation passed; no errors logged
tipo: post-condition
blocker: true
validação: |
Verify resource created successfully; validation passed; no errors logged
error_message: "Post-condition failed: Resource created successfully; validation passed; no errors logged"
```
## Acceptance Criteria
**Purpose:** Definitive pass/fail criteria for task completion
**Checklist:**
```yaml
acceptance-criteria:
- [ ] Resource exists and is valid; no duplicate resources created
tipo: acceptance-criterion
blocker: true
validação: |
Assert resource exists and is valid; no duplicate resources created
error_message: "Acceptance criterion not met: Resource exists and is valid; no duplicate resources created"
```
## Tools
**External/shared resources used by this task:**
- **Tool:** component-generator
- **Purpose:** Generate new components from templates
- **Source:** .aios-core/scripts/component-generator.js
- **Tool:** file-system
- **Purpose:** File creation and validation
- **Source:** Node.js fs module
## Scripts
**Agent-specific code for this task:**
- **Script:** create-component.js
- **Purpose:** Component creation workflow
- **Language:** JavaScript
- **Location:** .aios-core/scripts/create-component.js
## Error Handling
**Strategy:** retry
**Common Errors:**
1. **Error:** Resource Already Exists
- **Cause:** Target file/resource already exists in system
- **Resolution:** Use force flag or choose different name
- **Recovery:** Prompt user for alternative name or force overwrite
2. **Error:** Invalid Input
- **Cause:** Input name contains invalid characters or format
- **Resolution:** Validate input against naming rules (kebab-case, lowercase, no special chars)
- **Recovery:** Sanitize input or reject with clear error message
3. **Error:** Permission Denied
- **Cause:** Insufficient permissions to create resource
- **Resolution:** Check file system permissions, run with elevated privileges if needed
- **Recovery:** Log error, notify user, suggest permission fix
## Performance
**Expected Metrics:**
```yaml
duration_expected: 2-5 min (estimated)
cost_estimated: $0.001-0.003
token_usage: ~1,000-3,000 tokens
```
**Optimization Notes:**
- Parallelize independent operations; reuse atom results; implement early exits
## Metadata
```yaml
story: N/A
version: 1.0.0
dependencies:
- N/A
tags:
- automation
- workflow
updated_at: 2025-11-17
```
## Description
Generate production-ready React TypeScript component from design tokens. Output follows Shadcn-style Tailwind utility patterns with `cva` variants, optional Radix composition, tests, Storybook stories, and documentation. All styling uses tokens/variables (zero hardcoded values) and supports loading/accessibility states out of the box.
## Prerequisites
- Setup completed (*setup command run successfully)
- Tokens loaded and accessible
- React and TypeScript configured
## Workflow
### Interactive Elicitation
This task uses interactive elicitation to configure component.
1. **Select Component Type**
- Atomic level (atom, molecule, organism)
- Component name (Button, Input, Card, etc)
- Confirm token availability for this component
2. **Configure Component Features**
- Variants needed (primary, secondary, destructive)
- Sizes needed (sm, md, lg)
- States needed (hover, disabled, loading, error)
- Additional props
3. **Review Generation Plan**
- Show files to be generated
- Confirm test coverage requirements
- Ask for Storybook stories (if enabled)
### Steps
1. **Validate Prerequisites**
- Check tokens are loaded
- Verify component doesn't already exist (or confirm overwrite)
- Validate component name (PascalCase)
- Validation: Ready to generate
2. **Load Token References**
- Identify which tokens this component needs
- Validate token availability
- Generate token import statements
- Validation: All required tokens exist
3. **Generate Component File**
- Create React component using `React.forwardRef` + `Slot` (Radix pattern)
- Import `cva` + `cn` helpers (`class-variance-authority`, `tailwind-merge`)
- Implement variants, sizes, density, and loading states
- Wire ARIA attributes, keyboard handling, dark mode parity
- Validation: Valid TypeScript (strict), lint clean, no hardcoded CSS values
4. **Author Variant Catalogue**
- Define `cva` config (base classes, variants, compound variants, defaults)
- Map variant classes to tokens (Tailwind utilities referencing design tokens)
- Generate story-friendly helper types (VariantProps)
- Validation: Variants align with consolidated tokens and atomic level
5. **Generate Unit Tests**
- Create test file ({Component}.test.tsx) with RTL + jest-axe
- Snapshot default render, variant permutations, responsive classes
- Test loading/disabled state interactions and event handlers
- Aim for >85% coverage including accessibility assertions
- Validation: Tests pass locally (npm test) with coverage gated
6. **Generate Storybook Stories (Optional)**
- If Storybook enabled, create {Component}.stories.tsx (Storybook 8 syntax)
- Provide CSF stories for each variant/size & loading state
- Configure controls, play functions, a11y addon
- Validation: `npm run storybook` renders without warnings
7. **Run Accessibility Checks**
- Validate ARIA attributes + keyboard flows (Tab/Shift+Tab/Space/Enter)
- Check WCAG 2.2 AA + APCA contrast, including dark mode tokens
- Ensure focus-visible styles present and themable
- Validation: jest-axe passes, manual keyboard traversal verified
8. **Generate Component Documentation**
- Create {Component}.md in docs/ with overview + variant tables
- Document props, TypeScript types, default variants, composition notes
- Include usage for light/dark themes, loading state, accessibility guidance
- Validation: Docs align with generated code and tokens
9. **Update Component Index**
- Add to design-system/index.ts
- Export component for easy import
- Update barrel exports
- Validation: Component importable
10. **Update State File**
- Add component to patterns_built in .state.yaml
- Record atomic level, variants, test coverage
- Increment component count
- Validation: State tracking updated
## Output
- **{Component}.tsx**: React TypeScript component (forwardRef + cva)
- **{Component}.test.tsx**: Unit + accessibility tests
- **{Component}.stories.tsx**: Storybook stories (optional)
- **{Component}.md**: Component reference documentation
- **ui/index.ts**: Barrel export updated
- **.state.yaml**: Updated with component metadata + variant catalog
### Output Format
```typescript
// button.tsx
import * as React from 'react';
import { Slot } from '@radix-ui/react-slot';
import { cva, type VariantProps } from 'class-variance-authority';
import { cn } from '@/lib/utils';
import { Spinner } from '@/components/ui/spinner';
export const buttonVariants = cva(
'inline-flex items-center justify-center rounded-md text-sm font-medium transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-offset-2 disabled:pointer-events-none disabled:opacity-70',
{
variants: {
variant: {
primary: 'bg-primary text-primary-foreground hover:bg-primary/90',
secondary: 'bg-secondary text-secondary-foreground hover:bg-secondary/90',
outline: 'border border-border bg-transparent hover:bg-muted'
},
size: {
sm: 'h-9 px-3',
md: 'h-10 px-4',
lg: 'h-12 px-6 text-base',
icon: 'h-10 w-10'
}
},
defaultVariants: {
variant: 'primary',
size: 'md'
}
}
);
export interface ButtonProps
extends React.ButtonHTMLAttributes<HTMLButtonElement>,
VariantProps<typeof buttonVariants> {
asChild?: boolean;
isLoading?: boolean;
loadingIcon?: React.ReactNode;
}
const Button = React.forwardRef<HTMLButtonElement, ButtonProps>(
(
{ className, variant, size, asChild = false, isLoading = false, loadingIcon, children, ...props },
ref
) => {
const Comp = asChild ? Slot : 'button';
return (
<Comp
ref={ref}
className={cn(buttonVariants({ variant, size }), className, isLoading && 'pointer-events-none')}
data-state={isLoading ? 'loading' : props['data-state']}
aria-busy={isLoading}
{...props}
>
{isLoading && (loadingIcon ?? <Spinner className="mr-2 h-4 w-4 animate-spin" />)}
<span className="inline-flex items-center gap-1">{children}</span>
</Comp>
);
}
);
Button.displayName = 'Button';
export { Button };
```
## Success Criteria
- [ ] Component compiles without TypeScript errors (strict) and passes lint
- [ ] Variants implemented via `cva` with token-backed Tailwind utilities
- [ ] Props fully typed (VariantProps + custom props) with TSDoc
- [ ] Loading/disabled states, accessibility attributes, and dark mode supported
- [ ] Unit + jest-axe tests pass with ≥85% coverage
- [ ] Storybook stories render (if enabled) with controls + docs tab
- [ ] Component documentation published with variant/density tables
- [ ] .state.yaml updated with variant catalogue + QA status
## Error Handling
- **Token not found**: Report which token is missing, suggest alternatives
- **Component exists**: Ask to overwrite or use different name
- **TypeScript errors**: Display errors, suggest fixes
- **Test failures**: Show failing tests, don't complete until fixed
- **Accessibility violations**: Warn and suggest improvements
## Security Considerations
- Sanitize component name (prevent injection)
- Validate token references
- Escape user content in examples
- No eval() or dynamic code execution
## Examples
### Example 1: Build Button Component
```bash
*build button
```
Output:
```
🏗️ Atlas: Building Button component...
📋 Configuration:
- Type: Atom
- Variants: primary, secondary, outline
- Sizes: sm, md, lg, icon
- Loading state: enabled (spinner)
- Tests: RTL + jest-axe (>85% coverage)
- Storybook: Yes
✓ Generated button.tsx (Shadcn-style, cva variants)
✓ Generated button.test.tsx (22 tests, jest-axe assertions)
✓ Generated button.stories.tsx (8 stories, controls + docs)
✓ Generated button.md (usage + theming guidance)
🧪 Running tests...
✓ renders default button (matches snapshot)
✓ applies variant classes via cva
✓ shows spinner + disables interactions when loading
✓ passes accessibility audit (jest-axe)
✓ supports asChild slot rendering
Coverage: 96.4%
♿ Accessibility check:
✓ ARIA attributes present
✓ Color contrast: 4.8:1 (WCAG AA ✓)
✓ Keyboard navigable
✓ Focus indicators visible
✅ Button component ready!
Import: `import { Button } from '@/components/ui/button';`
Usage: `<Button variant="primary" isLoading>Saving</Button>`
Atlas says: "Built right. Built once."
```
### Example 2: Build Input Component
```bash
*build input
```
Output includes additional features:
- Validation states (error, success)
- Helper text prop
- Label integration
- Icon slots
## Notes
- All components strictly typed with TypeScript
- Zero hardcoded values enforced (tokens only)
- Accessibility is non-negotiable (WCAG AA minimum)
- Test coverage >80% required
- Tailwind utilities + tokens ensure zero hardcoded values
- Variants and sizes extend via `cva` without editing component body
- Components are tree-shakeable and server-component friendly
- Storybook stories enable visual + interaction testing
- Documentation mirrors props/types for instant onboarding
- Components follow Atomic Design principles
- Atlas ensures quality at every step