Créez, installez et exécutez votre première application Crew en environ cinq minutes. Nous allons créer une application avec un manifeste, un agent, un skill et une simple page d'interface utilisateur de tableau de bord.
kirocrew gateway)my-dashboard/ ├── app.json ← manifest (required) ├── agents/ │ └── sample-agent.json ← agent definition ├── skills/ │ └── sample-skill/ │ └── SKILL.md ← skill knowledge file ├── ui/ ← frontend (if app has UI) │ ├── package.json │ ├── vite.config.ts │ ├── src/App.tsx │ └── .gitignore └── README.md
Chaque application a besoin d'un app.json à la racine du dépôt. C'est la source unique de vérité pour l'identité, les ressources et la fiche du magasin.
{ "name": "my-dashboard", "version": "0.1.0", "displayName": "My Dashboard", "description": "A Crew app: My Dashboard", "author": "yourname", "agents": ["agents/sample-agent.json"], "skills": ["skills/sample-skill"], "ui": { "entry": "dist/index.mjs", "pages": [ { "route": "/apps/my-dashboard", "label": "My Dashboard", "icon": "Package" } ] }, "permissions": { "api": ["/api/crons", "/api/status"], "events": ["notification"] } }
Consultez la référence du manifeste pour tous les champs.
ui/src/App.tsx est le point d'entrée React de votre application. C'est un composant React standard qui utilise les hooks @kirocrew/app-sdk et des composants d'interface utilisateur partagés.
import { useAppApi, useAppEvents } from '@kirocrew/app-sdk' import { Card, CardTitle, PageHeader, StatCard } from '@kirocrew/app-sdk/ui' import { useState, useEffect } from 'react' export default function MyDashboard() { const api = useAppApi() const [data, setData] = useState(null) useEffect(() => { api.get('/api/status').then(setData) }, []) useAppEvents('notification', (event) => { console.log('New notification:', event) }) return ( <> <PageHeader title="My Dashboard" subtitle="Custom app page" /> <div className="px-6 pb-8 overflow-y-auto flex-1 min-h-0"> <div className="grid gap-3.5 grid-cols-[repeat(auto-fit,minmax(150px,1fr))] mb-6"> <StatCard label="Status" value={data ? 'Online' : '...'} accent /> </div> <Card> <CardTitle>Content</CardTitle> <p className="text-sm text-muted">Your app content here.</p> </Card> </div> </> ) }
agents/sample-agent.json :
{ "name": "my-agent", "model": "auto", "description": "Analyzes data and generates reports", "prompt": "You are a data analyst assistant.", "tools": ["@kirocrew-core"] }
La référence d'outil @kirocrew-core indique à Crew d'inclure le serveur MCP principal (spawn, learn, task, wait, register hook, send message).
skills/sample-skill/SKILL.md :
--- name: sample-skill description: A sample skill that teaches the agent about my domain. triggers: [sample, domain] always: false --- # Sample skill When the user asks about the sample domain: 1. Do the domain-specific first thing 2. Then check for the domain-specific second thing 3. Return the result in the standard format
La liste triggers correspond aux mots du message de l'utilisateur. Lorsqu'un déclencheur apparaît dans un message, le corps du skill est chargé pour ce tour.
cd my-dashboard/ui npm install npm run build
Cela produit dist/index.mjs — le paquet ESM chargé par le tableau de bord.
Votre vite.config.ts doit marquer React, ReactDOM, lucide-react et @kirocrew/app-sdk comme externes :
import { defineConfig } from 'vite' import react from '@vitejs/plugin-react' export default defineConfig({ plugins: [react()], build: { lib: { entry: 'src/App.tsx', formats: ['es'], fileName: 'index', }, rollupOptions: { external: ['react', 'react-dom', 'react/jsx-runtime', 'lucide-react', /^@kirocrew\/app-sdk/], }, }, })
# Install via REST API curl -X POST http://localhost:5476/api/apps/install \ -H 'Content-Type: application/json' \ -d '{"source": "./my-dashboard"}' # Enable curl -X POST http://localhost:5476/api/apps/my-dashboard/enable
Ou utilisez l'interface utilisateur de l'App Store dans le tableau de bord → Installer depuis un chemin local.
Votre application apparaît dans la barre latérale du tableau de bord Crew.
Activez le mode développement :
kirocrew app dev my-dashboard
Maintenant, le flux de travail est le suivant :
ui/src/App.tsxcd ui && npm run buildui/ et diffuse un événement WebSocket app_reload à chaque changement)Les changements d'agent et de skill prennent effet dès la prochaine invocation de l'agent — aucune recompilation n'est nécessaire.
Pour une itération plus rapide, créez un lien symbolique vers votre arborescence source afin que les changements de fichiers apparaissent directement :
ln -sfn /path/to/my-dashboard/ui ~/.kiro/crew/apps/my-dashboard/ui
Si votre application a besoin de son propre serveur HTTP :
{ "backend": { "entryPoint": "backend/server.py", "port": "auto", "healthCheck": "/health", "routes": "/api/apps/my-dashboard", "type": "python" } }
La passerelle lance votre backend comme sous-processus, fait un proxy inverse de /apps/my-dashboard/api/* vers celui-ci, et signe chaque requête proxifiée avec un en-tête HMAC. Votre backend vérifie la signature à l'aide de kirocrew-client :
from kirocrew_client import verify_proxy_request if not verify_proxy_request(request, 'my-dashboard'): return Response(status=401)
La signature porte sur timestamp:method:/api/path[?query]:sha256(body) avec le secret de l'application comme clé. Les horodatages doivent se situer à ±60 s de l'heure actuelle.
Déclarez-la dans le manifeste :
{ "crons": [ { "name": "daily-check", "cron_expr": "0 9 * * 1-5", "message": "Run the daily check for my-dashboard", "agent": "my-agent" } ] }
Crew enregistre la tâche cron à l'activation et la désenregistre à la désactivation. Elle appartient à created_by='app:my-dashboard' dans le registre.
Pour les étapes de compilation au moment de l'installation :
{ "setup": { "onInstall": "cd ui && npm install && npm run build", "onUpdate": "cd ui && npm install && npm run build" } }
Les scripts s'exécutent avec set -euo pipefail, NONINTERACTIVE=1, et un environnement minimal. Ils doivent se terminer par le code 0 en cas de succès.
Disponibles dans @kirocrew/app-sdk :
| Hook | Purpose |
|---|---|
useAppApi() | Client HTTP à portée limitée par permission (GET/POST/PUT/PATCH/DELETE) |
useAppEvents(event, cb) | S'abonner aux événements WebSocket en temps réel |
useTheme() | Thème réactif (mode, accent, colorTheme) |
useAppInfo() | Métadonnées de l'application (nom, version, permissions) |
useNavigate() | Naviguer vers les routes Crew |
useNotify() | Afficher des notifications toast |
useNavBadge() | Mettre à jour le compte du badge de la barre latérale |
useChatLauncher() | Naviguer vers le clavardage avec un agent et un message optionnels |
Disponibles dans @kirocrew/app-sdk/ui :
Card, CardTitle, Btn, SendBtn, Input, SearchInput, Badge, AimBadge, StatCard, Skeleton, ContentSkeleton, EmptyState, PageHeader, Toggle, InfoTip, SegmentedControl, MarkdownRenderer.
Créez votre première application