You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
{{ message }}
Repository navigation
Commit 19fb131
Browse filesBrowse the repository at this point in the historyBrowse files
1.0.0-gamma.5: 3 automatic repairs before a stop (named levers, then the AI's own fix); a site nested in a folder is taken from that folder (from d68e89f)
Copy file name to clipboardExpand all lines: .claude-plugin/marketplace.json
+1-1Lines changed: 1 addition & 1 deletion
Original file line number
Diff line number
Diff line change
@@ -14,7 +14,7 @@
14
14
"source": "./",
15
15
"displayName": "html2wp — HTML to WordPress",
16
16
"description": "BETA. Convert a static HTML site into a standalone WordPress block theme, verified against the original at three viewport widths — and reviewed by you before handover. The conversion runs through a verified Astro 5 build, so the Astro project is a real output too — compared pixel by pixel against the source before anything WordPress-shaped is generated.",
Copy file name to clipboardExpand all lines: .claude-plugin/plugin.json
+1-1Lines changed: 1 addition & 1 deletion
Original file line number
Diff line number
Diff line change
@@ -2,7 +2,7 @@
2
2
"name": "html2wp",
3
3
"displayName": "html2wp — HTML to WordPress",
4
4
"description": "BETA. Convert a static HTML site — or anything that builds to one (Lovable, Bolt, v0, Next export) — into a standalone WordPress block theme: verified pixel by pixel, pages, blog, forms, menus, SEO and redirects, with no plugin required and verification gates at every stage. Two modes: Full (every gate repaired until green, then your own page-by-page review) and Flash (every stage once, no repair loop, the gates reported). The gates catch most fidelity drift, not all of it.",
check-manifest `--flash`, stage3-remote's WordPress, check-prereqs, the Woo
425
425
audit's cart probe). `assets/repair-levers.json` maps each key to its
426
-
levers, in order — the only repairs Flash may try for it. A failure with no
427
-
signature has no lever: record it.
428
-
-**The budget:** 4 attempts per run, at most 2 per stage, never the same lever
429
-
on the same failure twice. `progress.sh` counts them and refuses (exit 3)
430
-
anything beyond — that refusal is the rule.
426
+
levers, in order — tried first, each once.
427
+
-**Then the AI's own fix (`ai-fix`).** When a failure that would stop the run
428
+
has spent its named levers, or no script named it (signature `unnamed`),
429
+
the attempts left are yours: read the failing command's output and logs,
430
+
find the cause, change only what causes it — never a gate, a check or its
431
+
thresholds — run the failing command once, and say in the close note what
432
+
you changed and why: `progress.sh repair <stage> ai-fix <signature|unnamed>`.
433
+
A failure that is only recorded red (`warn`) gets its named levers, not
434
+
`ai-fix`.
435
+
-**The budget:** 9 attempts per run, at most 3 per stage, never the same
436
+
named lever on the same failure twice. `progress.sh` counts them and refuses
437
+
(exit 3) anything beyond — that refusal is the rule. A run stops only after
438
+
its stage's 3 attempts; the app then offers Repair and continue, where the
439
+
owner may pick a stronger model first.
431
440
-**A repair happens INSIDE the stage that failed,** before the stage is
432
441
closed — never as a second run of it:
433
442
@@ -487,7 +496,7 @@ container has no `apply_patch` command.
487
496
| mode |`progress.sh mode flash`| — | — |
488
497
| -4 |`whats-here.sh {workspace}` (a finished or part-finished workspace: follow its route — a Continue resumes, never restarts); `allowance.sh` (print its line verbatim); `detect-project.py <project> --out {workspace}/detect.json`| — | kind `none`; a site over the page allowance (say it, with the service's words) |
489
498
| -3 |`$S/check-prereqs.sh` — in the app exactly `/opt/html2wp/skills/html2wp/assets/scripts/check-prereqs.sh`| — | a missing tool (it prints what to install) |
490
-
| -1 | by kind — `static-html`: `rsync -a --exclude .git --exclude node_modules --exclude .html2wp <project>/ {input}/`; `web-app`: `prerender-spa.py --project <project> --out {input} --no-verify --flash` (a group of pages — a route table's `/product/:id`, or pages sharing a path with one varying last segment like a TanStack `/blog/<slug>` — is recorded once, on its first page, and each other page shares that recording only when its controls are the same; the pages are captured in `--jobs` browsers, entrance motion is waited for at most 6 s; it says "N of M" as it goes); `static-site`: `static-site.py --project <project> --out {input}` (exit 3 → `prerender-spa.py … --no-verify --flash` instead, once); `html2wp-astro`: `detect-project.py <project> --prepare {workspace}`| — | no pages written (exit 2; 1 from static-site.py) |
499
+
| -1 | by kind — `static-html`: `rsync -a --exclude .git --exclude node_modules --exclude .html2wp <root>/ {input}/` — `<root>` is detect.json's `root`, never `<project>` itself (a site nested in a folder, `<project>/<name>/index.html`, is taken from that folder); `web-app`: `prerender-spa.py --project <project> --out {input} --no-verify --flash` (a group of pages — a route table's `/product/:id`, or pages sharing a path with one varying last segment like a TanStack `/blog/<slug>` — is recorded once, on its first page, and each other page shares that recording only when its controls are the same; the pages are captured in `--jobs` browsers, entrance motion is waited for at most 6 s; it says "N of M" as it goes); `static-site`: `static-site.py --project <project> --out {input}` (exit 3 → `prerender-spa.py … --no-verify --flash` instead, once); `html2wp-astro`: `detect-project.py <project> --prepare {workspace}`| — | no pages written (exit 2; 1 from static-site.py) |
491
500
| 0 |`cp -a {input} {workspace}/input-untouched`; `analyze-input.mjs {input} --out={workspace}/analysis.json`; `flash-manifest.py --analysis {workspace}/analysis.json --input {input} --workspace {workspace}`; decide (below); `check-manifest.py --manifest={workspace}/conversion-manifest.json --flash`| — | analyze exit 2 (refusal, key collision); check-manifest still red after its lever |
492
501
| -1b | a shop: `capture-commerce-specimen.py --dist {input} --out {workspace}/style-specimens`; no shop: `skip` (it comes after stage 0 because stage 0 decides the shop) | a nonzero exit | — |
493
502
| 0.5 |`optimize-images.py --input {input} --remote --apply --out {workspace}/optimize-images-report.json` (`skip` for `html2wp-astro`) | a nonzero exit | — |
@@ -510,7 +519,7 @@ Flash writes no `anchors` and no Gate-0 summary into the manifest — the
510
519
decisions go into the report.
511
520
512
521
**The stop path** — only when there is no theme to deliver and the stage's
513
-
levers are spent (or it has none): `progress.sh fail <stage> "<why>"`; write
522
+
3 attempts are spent (named levers, then `ai-fix`): `progress.sh fail <stage> "<why>"`; write
514
523
`CONVERSION-REPORT.md` with what ran, what stopped it (the script's own words),
515
524
the repairs tried and what the owner can do; when stage 3 opened a service
516
525
job, `send-verdicts.sh {workspace} --outcome=abandoned`; then
@@ -679,8 +688,8 @@ message (and Continue) on a stopped run comes with `H2WP_MODE=repair-stop`.
679
688
the log is gone — that is reading, not a repair). What the owner wrote may
680
689
name the fix; it still goes through a lever.
681
690
2.**Spend the levers of that stage** ("Flash repairs", above): each owner
682
-
message allows 2 attempts on the stage that stopped the run, apart from the
683
-
run's own 4 —
691
+
message allows 3 attempts on the stage that stopped the run (its named
692
+
levers, then `ai-fix`), apart from the run's own 9 —
Copy file name to clipboardExpand all lines: skills/html2wp/assets/repair-levers.json
+16-4Lines changed: 16 additions & 4 deletions
Original file line number
Diff line number
Diff line change
@@ -1,9 +1,9 @@
1
1
{
2
2
"schema": "h2wp-repair-levers/1",
3
-
"about": "Flash's repair budget (SKILL.md, \"Flash repairs\"). A refusing script prints `h2wp-signature: <key>`; the key names the failure, and its levers are the only repairs Flash may try for it, in this order. progress.sh repair counts every attempt: 4 per run, at most 2 per stage, never the same lever on the same failure twice. A remedy is followed by the failing command again, then progress.sh repaired.",
4
-
"pool": 4,
5
-
"perStage": 2,
6
-
"perOwnerMessage": 2,
3
+
"about": "Flash's repair budget (SKILL.md, \"Flash repairs\"). A refusing script prints `h2wp-signature: <key>`; the key names the failure, and its levers are the only repairs Flash may try for it, in this order. progress.sh repair counts every attempt: 9 per run, at most 3 per stage (3 per owner message on a stopped run), never the same named lever on the same failure twice; when a failure's named levers are spent, or no script named it (`unnamed`), the attempts left are the AI's own diagnosed fix (`ai-fix`). A remedy is followed by the failing command again, then progress.sh repaired.",
4
+
"pool": 9,
5
+
"perStage": 3,
6
+
"perOwnerMessage": 3,
7
7
"signatures": {
8
8
"manifest-undecided": {
9
9
"stages": [
@@ -97,6 +97,13 @@
97
97
"levers": [
98
98
"prereqs-again"
99
99
]
100
+
},
101
+
"unnamed": {
102
+
"stages": [
103
+
"*"
104
+
],
105
+
"what": "a failure that stops the run and that no script named with h2wp-signature",
106
+
"levers": []
100
107
}
101
108
},
102
109
"levers": {
@@ -156,6 +163,11 @@
156
163
"label": "check the prerequisites again",
157
164
"remedy": "The owner installed what check-prereqs named; run it again.",
158
165
"again": "$S/check-prereqs.sh"
166
+
},
167
+
"ai-fix": {
168
+
"label": "the AI's own diagnosed fix",
169
+
"remedy": "Read the failing command's output and logs, find the cause, and change only what causes it (never a gate, a check or its thresholds). Say in the close note what you changed and why.",
0 commit comments