afkaar-gen 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +65 -0
- package/SKILL.md +80 -0
- package/bin/interactive.js +10 -0
- package/interactive.html +575 -0
- package/package.json +42 -0
- package/references/architecture.md +185 -0
- package/references/figma-mode.md +57 -0
- package/references/inspiration-mode.md +71 -0
- package/references/integrations.md +111 -0
- package/references/iteration-mode.md +60 -0
- package/references/questions.md +198 -0
- package/references/security-checklist.md +218 -0
- package/references/seo-guide.md +183 -0
package/README.md
ADDED
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
# afkaar-gen — AI Agent Skill
|
|
2
|
+
|
|
3
|
+
Generate beautiful PHP flat-file business websites (digital agency style) with an AI coding agent.
|
|
4
|
+
|
|
5
|
+
## Installation
|
|
6
|
+
|
|
7
|
+
### For AI agents (Claude, opencode, etc.)
|
|
8
|
+
|
|
9
|
+
This skill can be installed via npm:
|
|
10
|
+
|
|
11
|
+
```bash
|
|
12
|
+
npx opencode add skill afkaar-gen
|
|
13
|
+
```
|
|
14
|
+
|
|
15
|
+
Or manually by copying to your skills directory:
|
|
16
|
+
|
|
17
|
+
```bash
|
|
18
|
+
git clone https://github.com/iyed/afkaar_gen.git ~/.claude/skills/afkaar-gen
|
|
19
|
+
```
|
|
20
|
+
|
|
21
|
+
### Usage with AI
|
|
22
|
+
|
|
23
|
+
Ask your AI agent:
|
|
24
|
+
|
|
25
|
+
> "Generate a website like afkars for my business"
|
|
26
|
+
> "Create a digital agency website"
|
|
27
|
+
> "Use afkaar-gen to build my site"
|
|
28
|
+
|
|
29
|
+
The agent will:
|
|
30
|
+
1. Scan your message for uploads (logos, screenshots, URLs)
|
|
31
|
+
2. Ask you simple selection-based questions (A/B/C/D)
|
|
32
|
+
3. Generate a complete PHP flat-file site
|
|
33
|
+
4. Apply security best practices and SEO
|
|
34
|
+
|
|
35
|
+
## Features
|
|
36
|
+
|
|
37
|
+
- 4 inspiration modes: questionnaire, URL fetch, Figma, iteration
|
|
38
|
+
- 17 questions in 4 grouped steps with A/B/C/D selections
|
|
39
|
+
- PHP flat-file stack (no database needed, Hostinger-ready)
|
|
40
|
+
- 20 security measures (CSRF, bcrypt, CSP, rate limiting, etc.)
|
|
41
|
+
- SEO: sitemap.xml, JSON-LD, Open Graph, GTM
|
|
42
|
+
- Lazy loading, responsive design, accessibility
|
|
43
|
+
- Optional admin panel (CRUD services/references/leads/blog)
|
|
44
|
+
- Customizable services and integrations (WhatsApp, Calendly, Stripe...)
|
|
45
|
+
|
|
46
|
+
## Structure
|
|
47
|
+
|
|
48
|
+
```
|
|
49
|
+
afkaar-gen/
|
|
50
|
+
├── SKILL.md # Main skill instructions
|
|
51
|
+
├── package.json # npm package
|
|
52
|
+
├── references/
|
|
53
|
+
│ ├── architecture.md # Full directory structure & schemas
|
|
54
|
+
│ ├── security-checklist.md # 20 security measures
|
|
55
|
+
│ ├── seo-guide.md # SEO, sitemap, JSON-LD
|
|
56
|
+
│ ├── questions.md # 17 selection-based questions
|
|
57
|
+
│ ├── integrations.md # WhatsApp, Stripe, Calendly...
|
|
58
|
+
│ ├── inspiration-mode.md # URL fetch & analysis
|
|
59
|
+
│ ├── figma-mode.md # Figma screenshot/API
|
|
60
|
+
│ └── iteration-mode.md # Modify existing site
|
|
61
|
+
```
|
|
62
|
+
|
|
63
|
+
## License
|
|
64
|
+
|
|
65
|
+
MIT
|
package/SKILL.md
ADDED
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: afkaar-gen
|
|
3
|
+
description: >
|
|
4
|
+
Génère un site vitrine PHP flat-file (type agence digitale) en posant
|
|
5
|
+
des questions simples. Utilise quand l'utilisateur dit : "génère un
|
|
6
|
+
site", "create a site like afkars", "comme afkars", ou donne une
|
|
7
|
+
URL/mockup d'inspiration.
|
|
8
|
+
---
|
|
9
|
+
|
|
10
|
+
# afkaar-gen — Générateur de site vitrine PHP flat-file
|
|
11
|
+
|
|
12
|
+
## Règles de dialogue (TRÈS IMPORTANT)
|
|
13
|
+
|
|
14
|
+
- **AVANT toute question, scanner les uploads du message** : base64 images (les lire via Read), URLs, fichiers attachés
|
|
15
|
+
- **Ne JAMAIS demander ce qui a déjà été fourni** — si l'utilisateur a envoyé un logo en image, ne pas demander "avez-vous un logo ?"
|
|
16
|
+
- **Toujours proposer des choix (A/B/C/D)** — l'utilisateur répond par une lettre
|
|
17
|
+
- **Ne jamais poser une question ouverte sans suggestions**
|
|
18
|
+
- **Si l'utilisateur répond hors choix** → l'accepter et continuer
|
|
19
|
+
- **Si "je sais pas"** → prendre l'option par défaut (marquée ★)
|
|
20
|
+
- **Regrouper 3-4 questions par message**, pas 1 par 1
|
|
21
|
+
- **Langage simple** : pas de "slug", "JSON", "SEO" — dire "adresse de la page", "texte pour Google"
|
|
22
|
+
- **Enchaîner** : question → réponse → immédiatement la suivante
|
|
23
|
+
|
|
24
|
+
## Flux
|
|
25
|
+
|
|
26
|
+
0. **Scanner les uploads déjà présents** (AVANT toute question !) :
|
|
27
|
+
- Si le message contient une image base64 → la lire avec l'outil Read (Claude voit l'image), extraire logo, couleurs, style
|
|
28
|
+
- Si le message contient une URL (http/https) → mode inspiration URL, fetch + analyse
|
|
29
|
+
- Si le message contient un lien Figma → mode Figma (demander screenshot si pas token)
|
|
30
|
+
- Si le message contient des fichiers attachés → les lire et extraire les infos
|
|
31
|
+
- Les infos trouvées pré-remplissent le questionnaire → l'agent ne repose pas les questions déjà répondues
|
|
32
|
+
1. **Détecter langue** (FR/EN). Si indéterminé → FR.
|
|
33
|
+
2. **Détecter le mode** (non fait à l'étape 0) :
|
|
34
|
+
- Sinon → mode questionnaire
|
|
35
|
+
3. **Lancer questionnaire** (4 étapes, TOUJOURS avec suggestions A/B/C/D, voir `references/questions.md`)
|
|
36
|
+
- **Ne PAS reposer une question si l'utilisateur a déjà fourni l'info** (logo, URL, couleurs...)
|
|
37
|
+
4. **Afficher résumé structuré**, demander confirmation
|
|
38
|
+
5. **Générer le site** (structure dans `references/architecture.md`)
|
|
39
|
+
6. **Valider** (`php -l`, checklist sécurité, credentials dans config.php uniquement)
|
|
40
|
+
7. **README + instructions déploiement**
|
|
41
|
+
|
|
42
|
+
## Règles absolues
|
|
43
|
+
|
|
44
|
+
- Chaque `<img>` DOIT avoir `loading="lazy"` + `decoding="async"`
|
|
45
|
+
- Tous les credentials (API keys, tokens, passwords) UNIQUEMENT dans `config.php`
|
|
46
|
+
- Les fichiers `data/*.json` ne contiennent JAMAIS de secrets
|
|
47
|
+
- Tout output utilisateur passe par `htmlspecialchars()` (helper `e()`)
|
|
48
|
+
- CSRF token 32 bytes sur TOUS les formulaires
|
|
49
|
+
- Anti brute-force : session (5/10min) + IP (12/15min)
|
|
50
|
+
- Honeypot + timer 3s sur formulaire contact
|
|
51
|
+
- `.htaccess` bloque `data/`, `core/`, `templates/`
|
|
52
|
+
- Aucun commentaire dans le code généré
|
|
53
|
+
- PHP `declare(strict_types=1)` en tête de chaque fichier
|
|
54
|
+
- Pas de mention d'hébergeur spécifique dans le code
|
|
55
|
+
|
|
56
|
+
## Si mode "itération" (modifier site existant)
|
|
57
|
+
|
|
58
|
+
- Lire les fichiers existants
|
|
59
|
+
- Appliquer uniquement les modifications demandées
|
|
60
|
+
- Ne pas régénérer l'intégralité
|
|
61
|
+
|
|
62
|
+
## Validation post-génération
|
|
63
|
+
|
|
64
|
+
Vérifier que :
|
|
65
|
+
- `php -l` passe sur tous les fichiers `.php`
|
|
66
|
+
- `index.php` ne fait pas d'erreur PHP
|
|
67
|
+
- `config.php` a `APP_URL`, `MAIL_TO`, `MAIL_FROM` définis
|
|
68
|
+
- `.htaccess` bloque `data/`, `core/`, `templates/`
|
|
69
|
+
- Aucun mot de passe / clé API dans `data/*.json`
|
|
70
|
+
- Toutes les images ont `loading="lazy"`
|
|
71
|
+
- Le formulaire contact a `csrf_check()`
|
|
72
|
+
- Les templates utilisent `e()` pour tout output
|
|
73
|
+
- Le `sitemap.xml` route existe dans le routeur
|
|
74
|
+
|
|
75
|
+
## Gestion des fichiers
|
|
76
|
+
|
|
77
|
+
Pour toute opération de fichier, utiliser les outils suivants :
|
|
78
|
+
- **Créer un dossier** : `New-Item -ItemType Directory -Path "chemin" -Force`
|
|
79
|
+
- **Créer/écrire un fichier** : utiliser l'outil Write
|
|
80
|
+
- **Copier un template** : lire le fichier source avec Read, puis écrire avec Write
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
const { exec } = require('child_process');
|
|
3
|
+
const path = require('path');
|
|
4
|
+
const htmlPath = path.join(__dirname, '..', 'interactive.html');
|
|
5
|
+
const cmd = process.platform === 'win32' ? `start "" "${htmlPath}"` :
|
|
6
|
+
process.platform === 'darwin' ? `open "${htmlPath}"` :
|
|
7
|
+
`xdg-open "${htmlPath}"`;
|
|
8
|
+
exec(cmd, err => {
|
|
9
|
+
if (err) console.log('Ouvrez ce fichier dans votre navigateur :\n' + htmlPath);
|
|
10
|
+
});
|