buildsuite artifact identity fields default from punkproject.toml (punkshell 0.37.0)
G-117/G-123 lineage: project, project_url and packager in emitted
punkbin-artifact.toml records (runtime family + library tier, both
suites) now default from the enclosing project's punkproject.toml
[project] table via a bounded walk-up from the build root
(common.punkprojectField) - a copied suite reads its own project's
manifest. Chains: project: -Dproject > manifest name > "punkshell"
(was hardcoded); project_url: -Dprojecturl > manifest url >
"unrecorded"; packager: -Dpackager > PUNKBIN_PACKAGER > manifest
packager > git identity > fossil user default (new fossil-only
fallback) > "unrecorded". Verified end-to-end: suite_tcl90
kit-family + library emissions and the suite_tcl86 library emission
carry the manifest values, -D overrides win, family_check green.
Root punkproject.toml gains an active url; dev project.new's seeded
manifest now carries commented url/packager placeholders documenting
the consumption site (punk::mix::commandset::project 0.4.1).
Assisted-by: harness=opencode; primary-model=huggingface/moonshotai/Kimi-K3; api-location=unknown
constoriginurl=b.option([]constu8,"originurl","canonical artifact repo url the library artifacts are built FOR ('origin' field; default punkbin)")orelse"https://www.gitea1.intx.com.au/jn/punkbin";
constoriginurl=b.option([]constu8,"originurl","canonical artifact repo url the library artifacts are built FOR ('origin' field; default punkbin)")orelse"https://www.gitea1.intx.com.au/jn/punkbin";
constprojecturl=b.option([]constu8,"projecturl","project url recorded in the artifact records ('project_url' field; default unrecorded)")orelse"unrecorded";
constproject=b.option([]constu8,"project","project name recorded in the artifact records ('project' field; default: punkproject.toml [project] name, else punkshell)")orelsecommon.punkprojectField(b,"name")orelse"punkshell";
constprojecturl=b.option([]constu8,"projecturl","project url recorded in the artifact records ('project_url' field; default: punkproject.toml [project] url, else unrecorded)")orelsecommon.punkprojectField(b,"url")orelse"unrecorded";
constpackager=blk:{
constpackager=blk:{
if(b.option([]constu8,"packager","declared packager identity for the artifact records (-Dpackager > env PUNKBIN_PACKAGER > git identity > unrecorded)"))|p|break:blkp;
if(b.option([]constu8,"packager","declared packager identity for the artifact records (-Dpackager > env PUNKBIN_PACKAGER > punkproject.toml [project] packager > git identity > fossil user default > unrecorded)"))|p|break:blkp;
constfamilyrev=b.option(u32,"familyrev","assembly revision N for the -r<N> family artifact names (kit-family-artifacts; default 2 - r1 published 2026-07-22)")orelse2;
constfamilyrev=b.option(u32,"familyrev","assembly revision N for the -r<N> family artifact names (kit-family-artifacts; default 2 - r1 published 2026-07-22)")orelse2;
constoriginurl=b.option([]constu8,"originurl","canonical artifact repo url the family artifacts are built FOR ('origin' field; default punkbin)")orelse"https://www.gitea1.intx.com.au/jn/punkbin";
constoriginurl=b.option([]constu8,"originurl","canonical artifact repo url the family artifacts are built FOR ('origin' field; default punkbin)")orelse"https://www.gitea1.intx.com.au/jn/punkbin";
constprojecturl=b.option([]constu8,"projecturl","project url recorded in the artifact records ('project_url' field; default unrecorded)")orelse"unrecorded";
constproject=b.option([]constu8,"project","project name recorded in the artifact records ('project' field; default: punkproject.toml [project] name, else punkshell)")orelsecommon.punkprojectField(b,"name")orelse"punkshell";
constprojecturl=b.option([]constu8,"projecturl","project url recorded in the artifact records ('project_url' field; default: punkproject.toml [project] url, else unrecorded)")orelsecommon.punkprojectField(b,"url")orelse"unrecorded";
constpackager=blk:{
constpackager=blk:{
if(b.option([]constu8,"packager","declared packager identity for the artifact records (-Dpackager > env PUNKBIN_PACKAGER > git identity > unrecorded)"))|p|break:blkp;
if(b.option([]constu8,"packager","declared packager identity for the artifact records (-Dpackager > env PUNKBIN_PACKAGER > punkproject.toml [project] packager > git identity > fossil user default > unrecorded)"))|p|break:blkp;
#0.4.1 - project.new's seeded punkproject.toml now carries commented-out url/packager placeholder fields with '#' documentation lines naming their consumption site (buildsuite artifact emission: punkbin-artifact.toml project_url/packager fields, G-117/G-123 lineage) - generated projects learn where those fields are used; default behaviour unchanged (both stay undeclared until uncommented)
#0.4.0 - G-087 stage 4: project.new copies the layout from punk::mix::commandset::layout::lib::layout_materialize's effective content folder - overlay chains (custom-over-vendor merging, .anti deletion markers, name@base derived layouts) are composed into a disposable staging dir (deleted after use); single-folder chains with no .anti markers keep the direct store-folder path (no behaviour change for punk.project / module-carried layouts). Template scanning uses the new path-based layoutfolder_scan_for_template_files against the effective folder. The src/PROJECT_LAYOUTS_* install exclusion was retired with the marker folder (G-087 stage 5) and the misnamed antipaths variable folded into exclude_paths.
#0.4.0 - G-087 stage 4: project.new copies the layout from punk::mix::commandset::layout::lib::layout_materialize's effective content folder - overlay chains (custom-over-vendor merging, .anti deletion markers, name@base derived layouts) are composed into a disposable staging dir (deleted after use); single-folder chains with no .anti markers keep the direct store-folder path (no behaviour change for punk.project / module-carried layouts). Template scanning uses the new path-based layoutfolder_scan_for_template_files against the effective folder. The src/PROJECT_LAYOUTS_* install exclusion was retired with the marker folder (G-087 stage 5) and the misnamed antipaths variable folded into exclude_paths.
#0.4.0 - G-087 stage 5: project.new seeds generated-project version metadata post-materialization (all only-if-missing, never from payload): punkproject.toml ([project] name + version 0.1.0), CHANGELOG.md with a matching ## [0.1.0] header (keeps the injected make.tcl projectversion advisory quiet), and punkorigin.toml - an interim generation-provenance baseline (utc, layout name + resolved store target, punk::mix::templates version, punkshell version when derivable from the generating shell's checkout via punkboot::utils, origin projectroot path hint) for the G-027 pull-update design to adopt.
#0.4.0 - G-087 stage 5: project.new seeds generated-project version metadata post-materialization (all only-if-missing, never from payload): punkproject.toml ([project] name + version 0.1.0), CHANGELOG.md with a matching ## [0.1.0] header (keeps the injected make.tcl projectversion advisory quiet), and punkorigin.toml - an interim generation-provenance baseline (utc, layout name + resolved store target, punk::mix::templates version, punkshell version when derivable from the generating shell's checkout via punkboot::utils, origin projectroot path hint) for the G-027 pull-update design to adopt.
#0.3.1 - fix: project.new validates module names (projectname-derived default and explicit -modules entries, modulename-version forms accepted) before any folder/fossil-repo creation - a dashed project name (e.g infra-man) previously failed late inside module.new after the project tree and fossil repo already existed
#0.3.1 - fix: project.new validates module names (projectname-derived default and explicit -modules entries, modulename-version forms accepted) before any folder/fossil-repo creation - a dashed project name (e.g infra-man) previously failed late inside module.new after the project tree and fossil repo already existed