diff --git a/CHANGELOG.md b/CHANGELOG.md index df3d67a9..a217e483 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -17,6 +17,7 @@ Sections dated before 2026-09-19 predate the cycle and stay as they are. ## Unreleased +- fix(init): **local by default, no Dev Container.** `init-project.sh` now parks the `.devcontainer/` that `mxcli new`/`init` always writes under `.mxtk-backup/` (keep it with `MXTK_KEEP_DEVCONTAINER=1`), and the README says "say no" to VS Code's reopen prompt. Field incident 2026-10-08: a first-time user followed the docs and landed in the container with "claude: command not found" (the template installs `claude` to `~/.local/bin` and never puts it on PATH) and a fresh login prompt. Local use was always the intent. — MendixMau - perf(routing): **CLAUDE.local.md routing carries triggers only.** The `baseline` view (the copy loaded into every session of every project) now cuts each row's "when" cell at its first " — " and replaces the three-paragraph preamble with two lines pointing at `ROUTING.md` for the full text; `readme-baseline` (README, runbook) is unchanged. Fresh scaffold: CLAUDE.local.md 17.5 KB → 11.7 KB (−33%). Field run 2026-10-07 (existing app, one main session per run, 2 runs per side, an entity + 2 microflows + 2 pages): 10/10 steps applied each side, new mx errors 5 vs 5 (the same CE2421 page-binding slip in both), cost $1.39 vs $1.38; the slim lanes opened the MDL pre-flight skill as often or more. Also drops two stray merge-artifact lines from this section. — MendixMau - perf(ui-loop): **fewer mxbuilds, no fixed sleeps, legible screenshots.** Field run 2026-10-07 (a requirements-driven build): `exec.sh` was 22% of tool time at two mxbuilds per exec, journeys and page waits slept a fixed time, and screenshots were 11.5% of re-read tokens. `exec.sh` now skips the pre-flight baseline mxbuild when the model is byte-identical to its last *clean* pass: the verification stamp gains an `errors:` field (`model-stamp.sh check --clean` accepts only `errors: 0`, so a delta-gate pass over pre-existing errors never counts; `SKIP_BASELINE=0` is unchanged). New `tests/e2e/settle.js` waits for the page's own state (no visible Mendix progress/loading indicator, DOM size stable) instead of a fixed time; `journey-runner.js` uses it after each action (an explicit `settleMs` still wins) and `page-audit.js` per page. Probed in a real browser: on a page that loads in 1.8 s the old 1200 ms sleep and networkidle+600 both captured it half-loaded, settle waited for it; on a fast page settle took 775 ms vs 1200. `SETTLE_MODE=fixed` restores the old waits for an A/B run. `page-audit.js` also saves a viewport shot `page-audit-.top.png` beside the full-page one, and `ui-loop.md` says to look at viewport shots: a tall full-page shot reaches the model at ~1024 px high, text unreadable. `shrink-image-read.sh` now works off macOS (ImageMagick or Pillow, python when jq is absent; it was a silent no-op without `sips`). — MendixMau - perf(ui-loop): **a stale app reloads instead of restarting, journeys stop sleeping, worst pages are looked at first.** Field run 2026-10-07, existing app. `test-stack-up.sh` records which model the running app was built from (`.claude/loop/served-model`); when the model has changed since, it hot-reloads with `mxcli docker reload` (adding `--skip-check` when the exec.sh gate already passed this model) and restarts only if that fails: 93 s instead of 179 s. `ui-loop.md` and the script header carry the measured table and point at `mxcli run --local --watch` as the fast loop (~18 s per page change). `journey-runner.js` waits on page state after a combobox action instead of fixed pauses, and a combobox step now opens the widget it names: it used to open the page's first combobox, so on a form with three every step but the first failed. `page-audit.js` clicks the first copy of a nav item a user could actually click, not just the first match: with the sidebar collapsed, every in-nav page faulted while the same item sat in the top menu bar. It also writes `page-audit-look-order.txt`, all pages worst first (`module-review.md` §4a: order, not selection, every page is still looked at). `design-audit.js` drops its fixed 1.2 s wait. Same 7-step journey on the same app: 56 s with `SETTLE_MODE=fixed`, 24 s with settle, 11/11 pass both ways, 3 runs each. — MendixMau diff --git a/README.md b/README.md index 120e7d90..04230061 100644 --- a/README.md +++ b/README.md @@ -111,13 +111,14 @@ network hop with path translation on every file argument. The toolkit does none Git Bash runs where Studio Pro, `mxcli` and your model already live, and ships with Git for Windows. `doctor.sh` detects WSL and warns. -**This is about the shell you type in, not about Docker.** Docker Desktop on Windows runs its -engine on a WSL2 backend, and VS Code will offer to "install Docker on WSL" the first time you -reopen an `mxcli new` project in its Dev Container — say yes. That is the `devcontainer` lane -(`CONVERSION-RUNBOOK.md` → *Where you run this*), headless and fully supported; `doctor.sh` -detects it and records it. The warning above applies only when you run the toolkit's scripts -*yourself* from a WSL prompt against a Studio Pro on the Windows side. Real question, 2026-09-07: -"the toolkit says not WSL, but `mxcli new`'s Dev Container wants Docker on WSL — yes or no?" Yes. +**This is about the shell you type in, not about Docker.** `mxcli new` writes a `.devcontainer/` +and VS Code then offers to "Reopen in Container" — **say no, work locally.** The container is a +second machine (no `claude` login, no dotfiles, a fragile install step), and the toolkit's path +is plain local use: `bin/init-project.sh` parks that folder under `.mxtk-backup/` so the prompt +stops. If you already clicked yes: F1 → "Dev Containers: Reopen Folder Locally", nothing is lost. +Real incident, 2026-10-08: a first-time user landed in the container with "claude: command not +found" and a fresh login prompt. The `devcontainer` lane in `CONVERSION-RUNBOOK.md` stays +supported for those who want it (`MXTK_KEEP_DEVCONTAINER=1`), it is just not the default. **The lanes mix freely on one project.** Do the headless stages in the Dev Container, then open the same `.mpr` in Studio Pro from Git Bash for the steps MDL cannot express and UI polish, and go back. diff --git a/bin/init-project.sh b/bin/init-project.sh index 4c6b2269..f0056183 100755 --- a/bin/init-project.sh +++ b/bin/init-project.sh @@ -689,6 +689,21 @@ else echo " $DENYFILE by hand, or this project's name is invisible to the guard." fi +# --- no Dev Container ---------------------------------------------------------------- +# `mxcli new` / `mxcli init` always writes `.devcontainer/`, and VS Code then offers (and later +# remembers) "Reopen in Container". That container is a second machine: no `claude` login, no +# dotfiles, and its install step is fragile. The toolkit's path is plain local use, so the +# folder is moved aside here. Real incident, 2026-10-08: a first-time user landed in the +# container with "claude: command not found" and a fresh login prompt, and asked how to get +# rid of it. Keep it with MXTK_KEEP_DEVCONTAINER=1. Nothing is deleted: the folder is parked +# under .mxtk-backup/ so it can be restored by hand. +if [ -d "$PROJECT_DIR/.devcontainer" ] && [ -z "${MXTK_KEEP_DEVCONTAINER:-}" ]; then + mkdir -p "$PROJECT_DIR/.mxtk-backup" + mv "$PROJECT_DIR/.devcontainer" "$PROJECT_DIR/.mxtk-backup/devcontainer-$(date +%Y%m%d-%H%M%S)" + echo "Moved .devcontainer/ to .mxtk-backup/ — work locally; VS Code will not ask to reopen in a container." + echo " (MXTK_KEEP_DEVCONTAINER=1 keeps it.)" +fi + GUIDE="$SCRIPT_DIR/../toolkit-guide.html" # First-touch sentinel. This is the same file every agent must test before opening the guide # (see CLAUDE.md "First-touch rule"); writing it here is what stops the next session — and the