250 lines
6.6 KiB
Markdown
250 lines
6.6 KiB
Markdown
# 10 — Agent Execution Breadcrumbs
|
|
|
|
Step-by-step ordered checklist for an agent executing a .wpress migration to Stack A.
|
|
Each step has: input, command, expected output, verification. Complete each before next.
|
|
|
|
## Pre-flight
|
|
|
|
- [ ] .wpress file confirmed at `$PROJECT/.planning/*.wpress`
|
|
- [ ] python3 --version >= 3.8
|
|
- [ ] docker compose version confirmed
|
|
- [ ] DOMAIN and PROJECT env vars set
|
|
|
|
## Step 1 — Extract archive
|
|
|
|
**INPUT:** `$WPRESS` (path to .wpress file)
|
|
|
|
**CMD:**
|
|
```bash
|
|
python3 $SOPS/wp-divi-pipeline-to-am-stack/scripts/extract_wpress.py "$WPRESS" "$PROJECT/.planning/wpress-extract/"
|
|
```
|
|
|
|
**VERIFY:**
|
|
```bash
|
|
ls $PROJECT/.planning/wpress-extract/
|
|
```
|
|
|
|
Expected: `database.sql` and `wp-content/` present
|
|
|
|
**BLOCK:** If database.sql missing, .wpress format differs — check extract_wpress.py logs.
|
|
|
|
---
|
|
|
|
## Step 2 — Analyze database
|
|
|
|
**INPUT:** `$PROJECT/.planning/wpress-extract/database.sql`
|
|
|
|
**CMD:**
|
|
```bash
|
|
python3 $SOPS/wp-divi-pipeline-to-am-stack/scripts/analyze_db.py "$PROJECT/.planning/wpress-extract/" "$PROJECT/.planning/data/"
|
|
```
|
|
|
|
**VERIFY:**
|
|
```bash
|
|
cat $PROJECT/.planning/data/pages.json | python3 -m json.tool | head -20
|
|
cat $PROJECT/.planning/data/site-info.json
|
|
```
|
|
|
|
Expected: page objects with slug + title visible; divi_version: 4 or 5
|
|
|
|
**BLOCK:** If pages.json empty, check table prefix detection in analyze_db.py output.
|
|
|
|
---
|
|
|
|
## Step 3 — Extract nav menus
|
|
|
|
**INPUT:** `$PROJECT/.planning/wpress-extract/database.sql`
|
|
|
|
**CMD:**
|
|
```bash
|
|
python3 $SOPS/wp-divi-pipeline-to-am-stack/scripts/extract_nav.py "$PROJECT/.planning/wpress-extract/" "$PROJECT/.planning/data/"
|
|
```
|
|
|
|
**VERIFY:**
|
|
```bash
|
|
cat $PROJECT/.planning/data/nav.json | python3 -m json.tool
|
|
```
|
|
|
|
Expected: array of `{label, href, display_order, is_cta}` objects. At least 3 items.
|
|
|
|
**NOTE:** `is_cta=1` for "Book", "Get Started", "Contact", "Sign Up" type items.
|
|
|
|
---
|
|
|
|
## Step 4 — Extract page content
|
|
|
|
**INPUT:** `$PROJECT/.planning/data/pages.json` + `wpress-extract/`
|
|
|
|
**CMD:** (choose based on Divi version from Step 2)
|
|
|
|
Divi 5:
|
|
```bash
|
|
python3 $SOPS/wp-divi-pipeline-to-am-stack/scripts/extract_divi5.py "$PROJECT/.planning/data/pages.json" "$PROJECT/.planning/data/content/"
|
|
```
|
|
|
|
Divi 4:
|
|
```bash
|
|
python3 $SOPS/wp-divi-pipeline-to-am-stack/scripts/extract_divi4.py "$PROJECT/.planning/data/pages.json" "$PROJECT/.planning/data/content/"
|
|
```
|
|
|
|
**VERIFY:**
|
|
```bash
|
|
ls $PROJECT/.planning/data/content/
|
|
cat $PROJECT/.planning/data/content/home.json | python3 -m json.tool | head -40
|
|
```
|
|
|
|
Expected: one .json file per page (home.json, about.json, etc.); sections array with type fields visible.
|
|
|
|
---
|
|
|
|
## Step 5 — Extract media
|
|
|
|
**INPUT:** `$PROJECT/.planning/wpress-extract/wp-content/uploads/`
|
|
|
|
**CMD:**
|
|
```bash
|
|
python3 $SOPS/wp-divi-pipeline-to-am-stack/scripts/extract_media.py "$PROJECT/.planning/wpress-extract/" "$PROJECT/.planning/data/" "$PROJECT/assets/images/"
|
|
```
|
|
|
|
**VERIFY:**
|
|
```bash
|
|
ls $PROJECT/assets/images/ | head -10
|
|
cat $PROJECT/.planning/data/media-manifest.json | python3 -m json.tool | head -20
|
|
```
|
|
|
|
Expected: .webp files present; media-manifest.json shows `original_url → /assets/images/x.webp` mapping.
|
|
|
|
---
|
|
|
|
## Step 6 — Stage seed_databases.py skeleton
|
|
|
|
**INPUT:** All .json files in `$PROJECT/.planning/data/content/` + `nav.json` + `media-manifest.json`
|
|
|
|
**CMD:**
|
|
```bash
|
|
python3 $SOPS/wp-divi-pipeline-to-am-stack/scripts/stage_seed.py "$PROJECT/.planning/data/" "$PROJECT/build/seed_databases.py" --domain "$DOMAIN"
|
|
```
|
|
|
|
**VERIFY:**
|
|
```bash
|
|
python3 -c "import ast; ast.parse(open('$PROJECT/build/seed_databases.py').read()); print('syntax OK')"
|
|
grep "def seed_pages" $PROJECT/build/seed_databases.py
|
|
```
|
|
|
|
Expected: seed_databases.py is valid Python; contains seed_pages, seed_nav functions.
|
|
|
|
**NOTE:** Content stubs are in place. Human/agent reviews + fills in prose before running.
|
|
|
|
---
|
|
|
|
## Step 7 — Review and fill content
|
|
|
|
**MANUAL:** Open `$PROJECT/build/seed_databases.py`
|
|
|
|
For each page's `sections_json`:
|
|
- [ ] Confirm `hero_h1` and `hero_lead` match the brand (not raw Divi copy-paste)
|
|
- [ ] Confirm each section has correct type (see 09-stack-a-output.md mapping)
|
|
- [ ] Replace any em-dashes (—) with commas or periods
|
|
- [ ] Replace any Divi shortcode residue (`[et_pb_`, `vc_`, etc.)
|
|
- [ ] Ensure no "Netherlands" or location-specific copy if site is global
|
|
- [ ] Confirm nav items in `seed_nav()` match final site IA
|
|
- [ ] Verify all image paths are `/assets/images/{name}.webp`
|
|
- [ ] Verify all CTAs point to correct slugs (`/about`, `/contact`, etc.)
|
|
|
|
---
|
|
|
|
## Step 8 — Run seed_databases.py
|
|
|
|
**CMD:**
|
|
```bash
|
|
cd $PROJECT && python3 build/seed_databases.py
|
|
```
|
|
|
|
**VERIFY:**
|
|
```bash
|
|
ls -lh src/api/data/
|
|
```
|
|
|
|
Expected: Output line shows counts > 0: `seeded: pages=N nav=N blog=N ...`. Database files exist.
|
|
|
|
**BLOCK:** Any count=0 means that seeder function has an error — fix before continuing.
|
|
|
|
---
|
|
|
|
## Step 9 — Scaffold PHP templates
|
|
|
|
**CMD:** Copy reference templates from vibrantyou.yoga as starting point:
|
|
|
|
```bash
|
|
VYOGA="/home/sirdrez/arisingmedia-websites/vibrantyou.yoga"
|
|
cp $VYOGA/src/api/router.php $PROJECT/src/api/router.php
|
|
cp $VYOGA/src/api/contact.php $PROJECT/src/api/contact.php
|
|
cp $VYOGA/src/api/templates/static.php $PROJECT/src/api/templates/static.php
|
|
cp $VYOGA/src/api/templates/home.php $PROJECT/src/api/templates/home.php
|
|
cp $VYOGA/src/api/components/_header.php $PROJECT/src/api/components/_header.php
|
|
cp $VYOGA/src/api/components/_footer.php $PROJECT/src/api/components/_footer.php
|
|
cp -r $VYOGA/assets/css $PROJECT/assets/
|
|
cp -r $VYOGA/assets/js $PROJECT/assets/
|
|
cp $VYOGA/Dockerfile $PROJECT/
|
|
cp $VYOGA/docker-compose.yml $PROJECT/
|
|
cp -r $VYOGA/infra $PROJECT/
|
|
```
|
|
|
|
**VERIFY:**
|
|
```bash
|
|
php -l $PROJECT/src/api/router.php
|
|
```
|
|
|
|
Expected: `No syntax errors detected`
|
|
|
|
**NOTE:** Update brand name, colors, and any site-specific logic in templates.
|
|
|
|
**NOTE:** `_header.php` reads from nav.sqlite — no hardcoded nav needed.
|
|
|
|
---
|
|
|
|
## Step 10 — Build and test
|
|
|
|
**CMD:**
|
|
```bash
|
|
cd $PROJECT && docker compose build --no-cache && docker compose up -d
|
|
```
|
|
|
|
**VERIFY:**
|
|
```bash
|
|
sleep 5
|
|
curl -I http://localhost:8000/
|
|
curl -s http://localhost:8000/ | grep -i "title\|h1" | head -3
|
|
```
|
|
|
|
Expected: HTTP 200; site name visible in page.
|
|
|
|
---
|
|
|
|
## Step 11 — Protection + SEO check
|
|
|
|
**CMD:**
|
|
```bash
|
|
bash /home/sirdrez/arisingmedia-websites/.am-webdesign-sops/tools/verify-protection.sh http://localhost:8000
|
|
```
|
|
|
|
**VERIFY:** Exit 0, no FAIL lines
|
|
|
|
---
|
|
|
|
## Step 12 — Lighthouse + cleanup
|
|
|
|
**MANUAL:**
|
|
- Open Firefox: `firefox http://localhost:8000/`
|
|
- Run Lighthouse (DevTools > Lighthouse)
|
|
|
|
**TARGET:**
|
|
- Performance >= 90
|
|
- SEO >= 95
|
|
- Accessibility >= 90
|
|
|
|
**CLEANUP:**
|
|
```bash
|
|
cd $PROJECT && docker compose down
|
|
```
|