From 221c2c4fffa6c4d2c417b51f6fb1580088ccf364 Mon Sep 17 00:00:00 2001 From: Julian Noble Date: Sat, 25 Jul 2026 15:56:11 +1000 Subject: [PATCH] G-112 rename core: bake/bakehouse stage-true vocabulary, deprecated aliases, vfslibs fold vfs -> bake (kit assembly; vfslibs phase folded in so a bake cannot ship stale binary libs), project retired -> bakehouse (packages + bake, -dirty-abort default ON, refusal names the granular developer flow). project/vfs remain as deprecated aliases: one-line stderr notice + pre-dispatch mapping; alias argdocs mirror their targets so flags parse identically. vfslibs survives as a standalone narrowing (in-session decision recorded in the goal file). SUBOPTS/SUMMARIES/HELPTEXTS/SUBGROUPS/known_commands, end-of-run guidance, plain gethelp and workflow text rewritten to the two-persona model (groups: build & bake / promotion gates / source maintenance / deprecated aliases). Verified: tabled + PUNKBOOT_PLAIN help; dirty-tree refusal via bakehouse and via the project alias; alias help renders. punkshell 0.23.0 + CHANGELOG. Assisted-by: harness=claude; primary-model=claude-fable-5; api-location=anthropic.com --- CHANGELOG.md | 12 ++ goals/G-112-maketcl-subcommand-rename.md | 25 +++ punkproject.toml | 2 +- src/make.tcl | 236 ++++++++++++++++------- 4 files changed, 205 insertions(+), 70 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 85773191..decb57c6 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,6 +5,18 @@ The latest `## [X.Y.Z]` header must match the `version` field in `punkproject.to Entries are newest-first; one bullet per notable change. See the root `AGENTS.md` "Project Versioning" section for the bump policy. +## [0.23.0] - 2026-07-25 + +- make.tcl stage-true subcommand rename (G-112): `vfs` becomes `bake` (kit assembly, now + including the vfslibs phase so a bake cannot ship stale binary libs), `project` is retired + in favour of `bakehouse` - a consumer umbrella chaining packages + bake that REFUSES + uncommitted src by default (-dirty-abort defaults ON; the refusal names the granular + developer flow: packages -> test -> bootsupport/vfscommonupdate -> commit -> bake). + `project` and `vfs` remain as deprecated aliases printing a one-line notice (kept until + the 8.6 arc completes). `vfslibs` survives as a standalone narrowing for declaration + iteration. Help/usage tables regrouped (build & bake / promotion gates / source + maintenance / deprecated aliases); `workflow` output teaches the two-persona model. + ## [0.22.2] - 2026-07-25 - make.tcl colour output is terminal-aware (G-113): piped/redirected runs produce fully diff --git a/goals/G-112-maketcl-subcommand-rename.md b/goals/G-112-maketcl-subcommand-rename.md index f2c7e2c9..5a358cfc 100644 --- a/goals/G-112-maketcl-subcommand-rename.md +++ b/goals/G-112-maketcl-subcommand-rename.md @@ -70,6 +70,31 @@ RESOLVED at activation 2026-07-25 (user-directed dispositions): - Deprecation window for the `project`/`vfs` aliases: keep until the 8.6 arc (G-099/G-100/G-101 era) completes - revisit removal when that arc closes. +## Progress + +- 2026-07-25 rename core landed (punkshell 0.23.0): vfs -> bake with the + vfslibs phase folded in (dispatch gate now {bakehouse bake vfslibs}), project + retired -> bakehouse (packages + bake; -dirty-abort boolean default ON via a + dedicated OPT_DIRTYABORT_ON fragment; refusal message names the granular + developer flow), project/vfs kept as deprecated aliases (one-line stderr + notice + command-word mapping before dispatch; alias definitions mirror their + targets' options so flags parse identically; degraded fallback mode forces + bakehouse's dirty default ON since its flag-only -dirty-abort cannot express + 0). SUBOPTS/SUMMARIES/HELPTEXTS/SUBGROUPS/known_commands updated; groups + renamed to teach the model (build & bake / promotion gates / source + maintenance / deprecated aliases); end-of-run guidance, plain punkboot_gethelp + and ::punkboot::workflow_text rewritten to the two-persona flow. + Verified: tabled + PUNKBOOT_PLAIN help render the new vocabulary; bakehouse + and the project alias refuse a dirty tree with the granular-flow message; + help bake/vfs render (alias helptexts marked DEPRECATED). +- IN-SESSION DECISION (per the activation disposition): `vfslibs` SURVIVES as a + standalone narrowing - it serves quick iteration on the + src/runtime/vendorlib_vfs.toml declarations without a full bake, matching the + modules/libs narrowings of packages; its helptext names it a phase of bake. +- Remaining for acceptance: doc + layout-copy sweep (Scope docs, three layout + make.tcl copies via sync channels), clean-tree bake-vs-vfs byte comparison, + punkexe suites against a kit built via the new names. + ## Notes - Activation freshness 2026-07-25: goals_xref.tcl score G-112 re-run at the diff --git a/punkproject.toml b/punkproject.toml index ba156baf..198e410a 100644 --- a/punkproject.toml +++ b/punkproject.toml @@ -1,4 +1,4 @@ [project] name = "punkshell" -version = "0.22.2" +version = "0.23.0" license = "BSD-2-Clause" diff --git a/src/make.tcl b/src/make.tcl index c9bd881b..08a5656a 100644 --- a/src/make.tcl +++ b/src/make.tcl @@ -153,7 +153,7 @@ namespace eval ::punkboot { variable foldername [file tail $scriptfolder] variable pkg_requirements [list]; variable pkg_missing [list];variable pkg_loaded [list] variable help_flags [list -help --help /? -h] - variable known_commands [list project modules libs packages vfs vfslibs bin info check shell vendorupdate bootsupport vfscommonupdate projectversion workflow] + variable known_commands [list bakehouse packages modules libs bake vfslibs bin info check shell vendorupdate bootsupport vfscommonupdate projectversion workflow project vfs] } @@ -1519,10 +1519,14 @@ proc ::punkboot::punkboot_gethelp {args} { append h "" \n append h " $scriptname -help or $scriptname --help or $scriptname /? or just $scriptname" \n append h " - This help." \n \n - append h " $scriptname project ?-k?" \n - append h " - this is the literal word project - and confirms you want to run the project build - which includes src/vfs/* checks and builds" \n + append h " $scriptname bakehouse ?-k? ?-dirty-abort 1|0?" \n + append h " - consumer build from a clean checkout: runs the packages stage (modules + libs) then bakes kit/zipkit executables to /bin" \n + append h " - refuses uncommitted src by default (-dirty-abort defaults ON: the bakehouse bakes from the committed recipe; pass -dirty-abort 0 to override)" \n append h " - the optional -k flag will terminate running processes matching the executable being built (if applicable)" \n - append h " - builds/copies .tm modules from src to /modules etc and pkgIndex.tcl based libraries from src to /lib etc." \n \n + append h " - does NOT run the promotion gates (bootsupport, vfscommonupdate) - on a clean checkout they are already satisfied by the committed tree" \n \n + append h " $scriptname bake ?-k?" \n + append h " - assemble kit/zipkit executables from the promoted payload (src/vfs) and src/runtime runtimes into /bin" \n + append h " - includes the vfslibs phase; does not rebuild modules/libs and does not run the promotion gates" \n \n append h " $scriptname modules" \n append h " - build (or copy if build not required) .tm modules from src/modules src/vendormodules etc to their corresponding locations under " \n append h " This does not scan src/runtime and src/vfs folders to build kit/zipkit/cookfs executables" \n \n @@ -1544,10 +1548,10 @@ proc ::punkboot::punkboot_gethelp {args} { append h " $scriptname vfslibs" \n append h " - propagate declared vendored platform-library packages into kit vfs lib_tcl trees" \n append h " - declarations (per-package per-kit, with superseded-version removal) live in src/runtime/vendorlib_vfs.toml" \n - append h " - also runs automatically as part of '$scriptname project'" \n \n + append h " - also runs automatically as a phase of '$scriptname bake' (and therefore of '$scriptname bakehouse')" \n \n append h " $scriptname vfscommonupdate" \n - append h " - update the src/vfs/_vfscommon.vfs from compiled src/modules and src/lib etc" \n - append h " - before calling this (followed by make project) - you can test using '(.exe) dev'" \n + append h " - promotion gate: update the src/vfs/_vfscommon.vfs from compiled src/modules and src/lib etc" \n + append h " - before calling this (followed by '$scriptname bake') - you can test using '(.exe) dev'" \n append h " this will load modules from your /module /lib paths instead of from the kit/zipkit" \n \n append h " $scriptname info" \n append h " - show the name and base folder of the project to be built" \n \n @@ -1561,14 +1565,18 @@ proc ::punkboot::punkboot_gethelp {args} { append h " - print an ASCII data-flow overview of the build/release workflow (edit -> packages -> bootsupport -> kits)" \n \n append h " $scriptname help ?subcommand?" \n append h " - show usage for $scriptname or one of its subcommands (equivalent: $scriptname -help)" \n \n + append h " Deprecated aliases (transition window):" \n + append h " $scriptname project -> runs bakehouse (with a one-line notice)" \n + append h " $scriptname vfs -> runs bake (with a one-line notice)" \n \n append h " Flags:" \n append h " -confirm 0|1" \n append h " - interactive y/n confirmation policy (default 1: prompt when stdin is a terminal, abort fast when it is not)." \n append h " Use -confirm 0 for unattended runs: the bootsupport minor-staleness gate and the vfscommonupdate REPLACE" \n append h " confirmation proceed without prompting; kits with a source/target kit-type mismatch are skipped." \n append h " -dirty-abort" \n - append h " - abort build/promotion commands (project packages modules libs vfs vfslibs bin bootsupport vfscommonupdate) when src/ has" \n - append h " uncommitted VCS changes. Default is warn-only: artifacts built from dirty src have no committed provenance." \n + append h " - abort build/promotion commands (bakehouse packages modules libs bake vfslibs bin bootsupport vfscommonupdate) when src/ has" \n + append h " uncommitted VCS changes. Default is warn-only EXCEPT bakehouse (defaults ON there; -dirty-abort 0 overrides):" \n + append h " artifacts built from dirty src have no committed provenance." \n append h " Warnings carry a plain PROVENANCE-WARNING: prefix (greppable in redirected output) and are recapped at the end of the run." \n append h " Use '$scriptname check' to see the current provenance status. To evaluate uncommitted source without building," \n append h " use ' src' or ' src shell'." \n \n @@ -1592,7 +1600,20 @@ All commands run from the projectroot with a native tclsh, e.g: tclsh src/make.tcl -confirm 0 (see [K6]) -RELEASE SEQUENCE (the order that satisfies the staleness + provenance gates) +TWO PERSONAS (stage-true subcommand model - one build stage, two promotion +gates, one bake) +---------------------------------------------------------------------------- + CONSUMER (clean checkout, wants baked kits): + tclsh src/make.tcl bakehouse -confirm 0 + = packages + bake in one uninterrupted run. The promotion gates are already + satisfied by the committed tree. bakehouse REFUSES uncommitted src by + default (-dirty-abort defaults ON: the bakehouse bakes from the committed + recipe; -dirty-abort 0 overrides). + DEVELOPER (changing payload): pass the gates explicitly - the commit is the + publishing act, not a build step. That is the RELEASE SEQUENCE below. + Deprecated aliases (transition window): 'project' -> bakehouse, 'vfs' -> bake. + +RELEASE SEQUENCE (the developer order that satisfies the staleness + provenance gates) ---------------------------------------------------------------------------- (1) edit src/modules/foo-999999.0a1.0.tm code change [K1] @@ -1603,7 +1624,7 @@ RELEASE SEQUENCE (the order that satisfies the staleness + provenance gates) (5) build tclsh src/make.tcl modules -confirm 0 (or 'packages' = modules + libs) (6) build tclsh src/make.tcl bootsupport -confirm 0 run twice: 2nd pass must copy 0 files [K4] (7) build tclsh src/make.tcl vfscommonupdate -confirm 0 - (8) build tclsh src/make.tcl project -confirm 0 kits; close running kit shells first [K5] + (8) build tclsh src/make.tcl bake -confirm 0 kits; close running kit shells first [K5] (9) commit tracked build outputs src/bootsupport, thin-layout script/ manifest copies (src/project_layouts + templates modpod payload), @@ -1634,13 +1655,13 @@ DIAGRAM 1 - DATA FLOW: SOURCE -> BUILT PACKAGES -> PROPAGATION TARGETS (the module set make.tcl itself src/vfs/_vfscommon.vfs/modules/ + libs boots from; staleness-gated. (VCS-tracked kit payload source) Project layouts store NO module | - snapshots - 'dev project.new' | make.tcl project (or: make.tcl vfs) - injects bootsupport into generated v + snapshots - 'dev project.new' | make.tcl bake (kit-assembly stage; + injects bootsupport into generated v consumer umbrella: bakehouse) projects from the generating src/_build/.exe --deploy--> bin/.exe shell at generation time - G-087) (see DIAGRAM 2) [K5] -DIAGRAM 1b - THIN-LAYOUT SYNC (part of modules/libs/packages/project runs) +DIAGRAM 1b - THIN-LAYOUT SYNC (part of modules/libs/packages/bakehouse runs) ---------------------------------------------------------------------------- src/make.tcl src/build.tcl src/bootsupport/modules*/include_modules.config @@ -1656,7 +1677,7 @@ DIAGRAM 1b - THIN-LAYOUT SYNC (part of modules/libs/packages/project runs) kit outside any project can list and generate the punk.project layout) -DIAGRAM 2 - KIT ASSEMBLY DETAIL (inside 'make.tcl project' / 'make.tcl vfs') +DIAGRAM 2 - KIT ASSEMBLY DETAIL (the 'make.tcl bake' stage; incl. vfslibs phase) ---------------------------------------------------------------------------- src/runtime/mapvfs.config which vfs folder pairs with which runtime -> kit name @@ -1707,7 +1728,7 @@ KEY / NOTES a pass copies 0 files (a converged second pass also proves prune tooling ran). [K5] The deploy step cannot replace a kit exe that is currently executing. Close - running kit shells before step 8, or rerun 'make.tcl vfs -confirm 0' + running kit shells before step 8, or rerun 'make.tcl bake -confirm 0' afterwards - the freshly built kits wait in src/_build. punkcheck records mean the rerun only redoes the failed deploys. @@ -1719,7 +1740,7 @@ KEY / NOTES - src/tests/runtests.tcl exercises the src/ trees directly (dev modules). - '.exe dev' (or ' src') runs a built shell against the project dev modules - useful for testing built packages before they are - baked into kits via vfscommonupdate + project. + baked into kits via vfscommonupdate + bake. [K8] What is VCS-tracked where (checkin targets after a build): tracked: src/** (sources, src/bootsupport, src/project_layouts copies, @@ -1821,22 +1842,24 @@ if {[info exists ::env(PUNKBOOT_PLAIN)] && [string is true -strict $::env(PUNKBO #single source for the subcommand one-line summaries: each subcommand definition's #@cmd -summary and the top-level subcommand -choicelabels are both built from this. variable SUMMARIES { - project "Full project build - packages plus kit/zipkit executables from src/vfs and src/runtime" + bakehouse "Consumer build from a clean checkout: packages then bake - refuses uncommitted src by default" packages "Build .tm modules and pkgIndex.tcl libraries from src into (no kit executables)" modules "Build .tm modules from src/modules, src/vendormodules etc into /modules etc" libs "Build pkgIndex.tcl libraries from src/lib, src/vendorlib etc into /lib etc" - vfs "Build kit/zipkit executables from src/vfs and src/runtime into /bin" + bake "Assemble kit/zipkit executables from promoted payload (src/vfs) and runtimes into /bin" vfslibs "Propagate declared vendored platform-library packages into kit vfs lib_tcl trees" - bin "Install executables from src/bin into /bin, then build kits as for vfs" + bin "Install executables from src/bin into /bin, then build kits as for bake" vendorupdate "Update src/vendormodules based on src/vendormodules/include_modules.config" - bootsupport "Update src/bootsupport modules from built project modules" - vfscommonupdate "Replace src/vfs/_vfscommon.vfs modules and libs with the project's built modules and libs" + bootsupport "Promotion gate: update src/bootsupport modules from built project modules" + vfscommonupdate "Promotion gate: replace src/vfs/_vfscommon.vfs modules and libs with the project's built set" info "Show the name and base folder of the project to be built" check "Show module/library paths and any potentially problematic packages for running this script" projectversion "Advisory check: CHANGELOG.md vs punkproject.toml and src/ changes since last version bump" - workflow "Print an ASCII data-flow overview of the build/release workflow (edit -> packages -> bootsupport -> kits)" + workflow "Print an ASCII data-flow overview of the build/release workflow (edit -> packages -> gates -> bake)" shell "Run the punk shell using bootsupport libraries" help "Show usage for make.tcl or one of its subcommands" + project "DEPRECATED alias for bakehouse (one-line notice, then runs bakehouse)" + vfs "DEPRECATED alias for bake (one-line notice, then runs bake)" } #@cmd -help bodies for the constructed definitions below. Authored BLOCK-FORM #(first value line whitespace-only) so the @normalize directive in each @@ -1845,14 +1868,20 @@ if {[info exists ::env(PUNKBOOT_PLAIN)] && [string is true -strict $::env(PUNKBO #normalization (head-form values here would leak this file's indentation into #the rendered Description column). variable HELPTEXTS { - project + bakehouse " - Run the full project build - includes src/vfs/* checks and builds. - Builds/copies .tm modules and pkgIndex.tcl based libraries from src to - /modules, /lib etc, propagates declared vendored - platform-libraries into kit vfs trees (as for vfslibs), then scans - src/runtime and src/vfs folders to build kit/zipkit executables and - installs them to /bin." + Consumer umbrella: run the packages stage (modules + libs) then bake + the kit/zipkit executables - the full path from a CLEAN checkout to + installed kits in /bin. + The bakehouse bakes from the committed recipe: by default it refuses + to run when src/ has uncommitted changes (-dirty-abort defaults ON), + pointing at the granular developer flow (packages -> test -> + bootsupport/vfscommonupdate -> commit -> bake). Pass -dirty-abort 0 + to build anyway with PROVENANCE-WARNINGs. + Deliberately does NOT run the promotion gates (bootsupport, + vfscommonupdate): payload promotion is a confirm-gated, committed + act - on a clean checkout the gates are already satisfied by the + committed tree." packages " Build (or copy if build not required) both .tm and pkgIndex.tcl based @@ -1872,23 +1901,32 @@ if {[info exists ::env(PUNKBOOT_PLAIN)] && [string is true -strict $::env(PUNKBO . This does not scan src/runtime and src/vfs folders to build kit/zipkit executables." - vfs + bake " - Scan src/vfs and src/runtime folders and build kit/zipkit executables - into /bin. - Does not first rebuild modules/libs - use 'make.tcl project' for the - full pipeline." + Assemble kit/zipkit executables: scan src/vfs and src/runtime folders, + build each configured kit from the promoted payload + (src/vfs/_vfscommon.vfs + custom vfs folders) and its runtime, and + install to /bin. + Includes the vfslibs phase (declared vendored platform-library + propagation into kit vfs lib_tcl trees) so a bake cannot ship + stale binary libs. + Does not rebuild modules/libs and does not run the promotion gates - + built modules reach the kit payload only via 'make.tcl + vfscommonupdate' (committed for provenance). Consumer full path from + a clean checkout: 'make.tcl bakehouse'." vfslibs " Propagate declared vendored platform-library packages into kit vfs lib_tcl trees. Declarations (per-package per-kit, with superseded-version removal) live in src/runtime/vendorlib_vfs.toml. - Also runs automatically as part of 'make.tcl project'." + Also runs automatically as a phase of 'make.tcl bake' (and therefore + of 'make.tcl bakehouse'); this standalone narrowing serves quick + iteration on the declarations." bin " Install executables from src/bin to /bin, then check vfs - folders and build kit/zipkit executables as for the vfs subcommand." + folders and build kit/zipkit executables as for the bake subcommand." vendorupdate " Update the src/vendormodules based on src/vendormodules/include_modules.config. @@ -1907,7 +1945,7 @@ if {[info exists ::env(PUNKBOOT_PLAIN)] && [string is true -strict $::env(PUNKBO vfscommonupdate " Update the src/vfs/_vfscommon.vfs from compiled src/modules and src/lib etc. - Before calling this (followed by 'make.tcl project') - you can test using + Before calling this (followed by 'make.tcl bake') - you can test using '(.exe) dev' - this will load modules from your /modules, /lib paths instead of from the kit/zipkit. Replacing the _vfscommon.vfs contents requires confirmation - see -confirm." @@ -1933,6 +1971,16 @@ if {[info exists ::env(PUNKBOOT_PLAIN)] && [string is true -strict $::env(PUNKBO The text is embedded in make.tcl (::punkboot::workflow_text) so it is available wherever make.tcl runs; its MAINTENANCE key states the update contract for keeping it in step with build behaviour." + project + " + DEPRECATED alias for 'bakehouse' (G-112 stage-true rename) - prints a + one-line notice and runs bakehouse (packages + bake, -dirty-abort + default ON). Retained for a transition window." + vfs + " + DEPRECATED alias for 'bake' (G-112 stage-true rename) - prints a + one-line notice and runs bake (kit assembly including the vfslibs + phase). Retained for a transition window." } #shared option fragments composed into the per-subcommand definitions below variable OPT_CONFIRM { @@ -1966,15 +2014,26 @@ if {[info exists ::env(PUNKBOOT_PLAIN)] && [string is true -strict $::env(PUNKBO "Terminate running processes matching the executable being built (if applicable) so the build can install over it." } + #bakehouse (and its deprecated alias project) defaults the dirty gate ON: + #the bakehouse bakes from the committed recipe (G-112 two-persona model). + variable OPT_DIRTYABORT_ON { + -dirty-abort -type boolean -default 1 -help\ + "Abort when src/ has uncommitted VCS changes - DEFAULT ON for this + subcommand: the bakehouse bakes from the committed recipe. A + consumer build on a clean checkout runs uninterrupted; uncommitted + developer changes get a refusal naming the granular flow + (packages -> test -> bootsupport/vfscommonupdate -> commit -> bake). + Pass -dirty-abort 0 to build anyway with PROVENANCE-WARNINGs." + } #which shared option fragments each subcommand declares #(shell and help have bespoke definitions below: shell passes trailing args # through to the repl untouched, help takes a subject value) variable SUBOPTS { - project {OPT_FORCEKILL OPT_DIRTYABORT OPT_CONFIRM} + bakehouse {OPT_FORCEKILL OPT_DIRTYABORT_ON OPT_CONFIRM} packages {OPT_DIRTYABORT OPT_CONFIRM} modules {OPT_DIRTYABORT OPT_CONFIRM} libs {OPT_DIRTYABORT OPT_CONFIRM} - vfs {OPT_FORCEKILL OPT_DIRTYABORT OPT_CONFIRM} + bake {OPT_FORCEKILL OPT_DIRTYABORT OPT_CONFIRM} vfslibs {OPT_DIRTYABORT OPT_CONFIRM} bin {OPT_FORCEKILL OPT_DIRTYABORT OPT_CONFIRM} vendorupdate {OPT_CONFIRM} @@ -1984,14 +2043,17 @@ if {[info exists ::env(PUNKBOOT_PLAIN)] && [string is true -strict $::env(PUNKBO check {} projectversion {} workflow {} + project {OPT_FORCEKILL OPT_DIRTYABORT_ON OPT_CONFIRM} + vfs {OPT_FORCEKILL OPT_DIRTYABORT OPT_CONFIRM} } #synopsis fragments matching the shared option fragments (explicit @form -synopsis #so usage shows the real invocation 'make.tcl ...' rather than the #internal definition id) variable OPT_SYNOPSES { - OPT_FORCEKILL "?-k?" - OPT_DIRTYABORT "?-dirty-abort?" - OPT_CONFIRM "?-confirm 0|1?" + OPT_FORCEKILL "?-k?" + OPT_DIRTYABORT "?-dirty-abort?" + OPT_DIRTYABORT_ON "?-dirty-abort 1|0?" + OPT_CONFIRM "?-confirm 0|1?" } foreach {sub optvars} $SUBOPTS { set synparts [list "make.tcl $sub"] @@ -2034,10 +2096,12 @@ if {[info exists ::env(PUNKBOOT_PLAIN)] && [string is true -strict $::env(PUNKBO "subject -type string -optional 0 -choices [list [dict keys $SUMMARIES]] -help {Subcommand to show usage for.}" #top-level definition: the subcommand table rendered by 'make.tcl' / 'make.tcl -help' variable SUBGROUPS { - "build & promotion" {project packages modules libs vfs vfslibs bin} - "source maintenance" {vendorupdate bootsupport vfscommonupdate} + "build & bake" {bakehouse packages modules libs bake vfslibs bin} + "promotion gates" {bootsupport vfscommonupdate} + "source maintenance" {vendorupdate} "informational" {info check projectversion workflow help} "interactive" {shell} + "deprecated aliases" {project vfs} } punk::args::define\ "@id -id (script)::punkboot"\ @@ -2062,7 +2126,7 @@ if {[info exists ::env(PUNKBOOT_PLAIN)] && [string is true -strict $::env(PUNKBO #resolve a mechanism used here (e.g pre-@normalize snapshots) degrades to the #plain fallback immediately instead of erroring at first parse/usage. punk::args::get_spec (script)::punkboot - punk::args::get_spec (script)::punkboot::project + punk::args::get_spec (script)::punkboot::bakehouse punk::args::get_spec (script)::punkboot::help punk::args::get_spec (script)::punkboot::shell unset -nocomplain sub optvars defparts ov @@ -2219,6 +2283,30 @@ if {$do_help} { exit $help_exitcode } +#G-112 deprecated aliases - one-line mapping before any dispatch: +# project -> bakehouse (packages + bake, -dirty-abort default ON) +# vfs -> bake (kit assembly including the vfslibs phase) +#Kept for a transition window (until the 8.6 arc completes - see the G-112 +#dispositions). The alias definitions above mirror their targets' options so +#flags parse identically; only the command word maps here. +if {[info exists ::punkboot::command]} { + switch -- $::punkboot::command { + project { + puts stderr "make.tcl: 'project' is DEPRECATED - use 'bakehouse' (packages + bake; refuses uncommitted src by default). Running bakehouse." + set ::punkboot::command bakehouse + } + vfs { + puts stderr "make.tcl: 'vfs' is DEPRECATED - use 'bake' (kit assembly incl. the vfslibs phase). Running bake." + set ::punkboot::command bake + } + } + if {!$::punkboot::punkargs_ok && $::punkboot::command eq "bakehouse"} { + #degraded fallback scan has flag-only -dirty-abort (no way to pass 0): + #bakehouse's documented default is ON, so force it here. + set ::punkboot::opt_dirty_abort 1 + } +} + set forcekill $::punkboot::opt_forcekill #puts stdout "::argv $::argv" # ---------------------------------------- @@ -2383,7 +2471,7 @@ if {![llength [info commands ::punkboot::exit_original]]} { } } -if {$::punkboot::command in {project packages modules libs vfs vfslibs bin bootsupport vfscommonupdate}} { +if {$::punkboot::command in {bakehouse packages modules libs bake vfslibs bin bootsupport vfscommonupdate}} { set dirty_abort $::punkboot::opt_dirty_abort lassign [::punkboot::get_src_provenance_warnings $projectroot "make.tcl $::punkboot::command"] have_scoped_dirty_check dirty_warnings if {$have_scoped_dirty_check} { @@ -2392,7 +2480,16 @@ if {$::punkboot::command in {project packages modules libs vfs vfslibs bin boots puts stderr " To evaluate uncommitted source without building, use ' src' or ' src shell'." if {$dirty_abort} { set ::punkboot::provenance_warnings_pending [list] ;#no recap needed - aborting adjacent to the warning - puts stderr "-aborted- (-dirty-abort given and src has uncommitted changes - commit first, or rerun without -dirty-abort to build with a warning)" + if {$::punkboot::command eq "bakehouse"} { + puts stderr "-aborted- bakehouse refuses to bake from uncommitted src (the bakehouse bakes from the committed recipe)." + puts stderr " Developer flow for uncommitted changes:" + puts stderr " make.tcl packages -> test (' src', src/tests/runtests.tcl)" + puts stderr " make.tcl bootsupport + make.tcl vfscommonupdate (promotion gates)" + puts stderr " commit -> make.tcl bake" + puts stderr " To build anyway without committed provenance: make.tcl bakehouse -dirty-abort 0" + } else { + puts stderr "-aborted- (-dirty-abort given and src has uncommitted changes - commit first, or rerun without -dirty-abort to build with a warning)" + } exit 1 } #Grace period for an attentive human to ctrl-c - only when stdin is a terminal @@ -3175,7 +3272,7 @@ if {$::punkboot::command eq "bootsupport"} { #Project layouts store no bootsupport module snapshots - 'dev project.new' injects bootsupport #into generated projects from the generating shell at generation time. Layout-carried scripts #and bootsupport manifests are kept current by the thin-layout sync step (see DIAGRAM 1b in - #::punkboot::workflow_text), which runs during modules/libs/packages/project builds. + #::punkboot::workflow_text), which runs during modules/libs/packages/bakehouse builds. puts stdout " bootsupport done " flush stderr @@ -3187,7 +3284,7 @@ if {$::punkboot::command eq "bootsupport"} { -if {$::punkboot::command ni {project modules libs packages vfs vfslibs bin}} { +if {$::punkboot::command ni {bakehouse packages modules libs bake vfslibs bin}} { puts stderr "Command $::punkboot::command not implemented - aborting." flush stderr after 100 @@ -3200,7 +3297,7 @@ if {$::punkboot::command ni {project modules libs packages vfs vfslibs bin}} { #install src vendor contents (from version controlled src folder) to base of project (same target folders as our own src/modules etc ie to paths that go on the auto_path and in tcl::tm::list) -if {$::punkboot::command in {project packages modules}} { +if {$::punkboot::command in {bakehouse packages modules}} { set vendormodulefolders [glob -nocomplain -dir $sourcefolder -type d -tails vendormodules vendormodules_tcl*] foreach vf $vendormodulefolders { lassign [split $vf _] _vm tclx @@ -3240,7 +3337,7 @@ if {$::punkboot::command in {project packages modules}} { } } -if {$::punkboot::command in {project packages libs}} { +if {$::punkboot::command in {bakehouse packages libs}} { #exclude README.md from source folder - but only the root one #-exclude-paths takes relative patterns e.g # */test.txt will only match test.txt exactly one level deep. @@ -3309,7 +3406,7 @@ if {$::punkboot::command in {project packages libs}} { } } -if {$::punkboot::command in {project vfslibs}} { +if {$::punkboot::command in {bakehouse bake vfslibs}} { #G-037: propagate declared vendored platform-library packages into kit vfs lib_tcl trees. #Participation is per-package per-kit (kit vfs package sets intentionally differ - e.g. twapi #versions vary per kit) - declared in src/runtime/vendorlib_vfs.toml, never blanket-copied. @@ -3400,7 +3497,7 @@ if {$::punkboot::command in {project vfslibs}} { } } -if {$::punkboot::command in {project packages libs}} { +if {$::punkboot::command in {bakehouse packages libs}} { ######################################################## lappend projectlibfolders lib #exclude README.md from source folder - but only the root one @@ -3473,7 +3570,7 @@ if {$::punkboot::command in {project packages libs}} { } -if {$::punkboot::command in {project packages modules libs}} { +if {$::punkboot::command in {bakehouse packages modules libs}} { ######################################################## #templates - thin-layout sync (G-087 stage 3; see DIAGRAM 1b in ::punkboot::workflow_text) #sync boot scripts (build.tcl, make.tcl) and bootsupport include_modules.config manifests into the @@ -3584,7 +3681,7 @@ if {$::punkboot::command in {project packages modules libs}} { } } -if {$::punkboot::command in {project packages modules}} { +if {$::punkboot::command in {bakehouse packages modules}} { #consolidated /modules /modules_tclX folder used for target where X is tcl major version #the make process will process for any _tclX not just the major version of the current interpreter @@ -3623,7 +3720,7 @@ if {$::punkboot::command in {project packages modules}} { } } -if {$::punkboot::command in {project packages modules libs}} { +if {$::punkboot::command in {bakehouse packages modules libs}} { set installername "make.tcl" # ---------------------------------------- if {[punk::repo::is_fossil_root $projectroot]} { @@ -3671,14 +3768,15 @@ if {$::punkboot::command in {project packages modules libs}} { #review set installername "make.tcl" -if {$::punkboot::command ni {project vfs bin}} { - #command = modules +if {$::punkboot::command ni {bakehouse bake bin}} { + #command = packages/modules/libs/vfslibs - stops before kit assembly puts stdout "vfs folders not checked" - puts stdout " - use 'make.tcl vfscommonupdate' to copy built modules into base vfs folder" - puts stdout " - use 'make.tcl project' to build executable kits/zipkits from vfs folders as well if you have runtimes installed" - puts stdout " Note that without the vfscommonupdate step, 'make.tcl project' will include any manual changes in the *custom* vfs folders but" - puts stdout " without the latest built modules." - puts stdout " calling 'builtexename(.exe) dev' will allow testing of built modules before they are put into the kits/zipkits via 'vfscommonupdate' then 'project'" + puts stdout " - use 'make.tcl vfscommonupdate' to promote built modules into the base vfs folder (promotion gate - commit for provenance)" + puts stdout " - use 'make.tcl bake' to build executable kits/zipkits from the vfs folders if you have runtimes installed" + puts stdout " Note that without the vfscommonupdate step, 'make.tcl bake' will include any manual changes in the *custom* vfs folders but" + puts stdout " without the latest built modules." + puts stdout " calling 'builtexename(.exe) dev' will allow testing of built modules before they are baked into the kits/zipkits via 'vfscommonupdate' then 'bake'" + puts stdout " - consumer full path from a clean checkout: 'make.tcl bakehouse'" puts stdout "-done-" exit 0 } @@ -5123,11 +5221,11 @@ if {[llength $failed_kits]} { set had_kits [expr {[llength $installed_kits] || [llength $failed_kits] || [llength $skipped_kits]}] if {$had_kits} { puts stdout " module builds and kit/zipkit builds processed (vfs config: src/runtime/mapvfs.config)" - puts stdout " - use 'make.tcl modules' to build modules without scanning/building the vfs folders into executable kits/zipkits" - puts stdout " - use 'make.tcl vfscommonupdate' to copy built modules into the base vfs folder /src/vfs/_vfscommon.vfs" - puts stdout " - Note that without the vfscommonupdate step, 'make tcl vfs' (included in 'make tcl project') will build vfs based executables" - puts stdout " that include your current custom vfs folders in src/vfs, but with a _vfscommon.vfs that doesn't have the latest built modules" - puts stdout " calling 'builtexename(.exe) dev' will allow testing of built modules before they are put into the kits/zipkits via 'vfscommonupdate' then 'project'" + puts stdout " - use 'make.tcl modules' to build modules without baking the vfs folders into executable kits/zipkits" + puts stdout " - use 'make.tcl vfscommonupdate' to promote built modules into the base vfs folder /src/vfs/_vfscommon.vfs (promotion gate)" + puts stdout " - Note that without the vfscommonupdate step, 'make.tcl bake' (the kit-assembly stage of 'make.tcl bakehouse') will build vfs based executables" + puts stdout " that include your current custom vfs folders in src/vfs, but with a _vfscommon.vfs that doesn't have the latest built modules" + puts stdout " calling 'builtexename(.exe) dev' will allow testing of built modules before they are baked into the kits/zipkits via 'vfscommonupdate' then 'bake'" } else { puts stdout " module builds processed" puts stdout ""