Browse Source
G-030 (proposed): make.tcl - the first surface a developer sees - parses
subcommands/options via punk::args and showcases the tabled usage for
help and argument errors; every interactive y/n prompt gains a declared
flag equivalent (interactive stdin prompts as today; flag proceeds;
non-interactive stdin without the flag fails fast with usage instead of
hanging or half-aborting) so agents drive make.tcl with arguments rather
than piped y/n; punk::args joins the bootstrap-tracked staleness set.
Degradation is a hard requirement: boot stays self-contained and the
repair commands (check/bootsupport/modules) keep working with plain
fallback help when the bootsupport punk::args or the ANSI rendering
stack is stale/unavailable - this week''s stale-fileutil and
stale-textblock incidents are the cautionary tales.
G-015 detail: recorded the runx -tcl result-shape observation (dict keyed
{result stdout stderr}, no exitcode key unlike exec mode).
G-020 detail: stamped the 2026-07-07 decision - acceptance gates on a
full testable Windows system without requiring other platforms first.
Assisted-by: harness=claude; primary-model=claude-fable-5; api-location=anthropic.com
master
4 changed files with 91 additions and 3 deletions
@ -0,0 +1,75 @@
|
||||
# G-030 make.tcl dogfoods punk::args: tabled usage, declared subcommands, prompt-free flags |
||||
|
||||
Status: proposed |
||||
Scope: src/make.tcl (dispatch, help, prompts), src/bootsupport/AGENTS.md + src/modules/AGENTS.md (bootstrap-tracked staleness contract), src/modules/punk/args-999999.0a1.0.tm (only as consumed) |
||||
Acceptance: as in root GOALS.md index (canonical). |
||||
|
||||
## Context |
||||
|
||||
make.tcl is the first surface a developer meets in a punkshell-derived project, |
||||
but its command handling predates the ecosystem's own tooling: a hand-built |
||||
help text, a bare `known_commands` list, ad-hoc argument handling per |
||||
subcommand, and interactive y/n prompts (`vfscommonupdate`'s REPLACE |
||||
confirmation, the project-build confirmations, bootsupport staleness prompts). |
||||
Eating our own dogfood - punk::args definitions per subcommand with the tabled |
||||
usage rendering - both showcases the ecosystem where it is most visible and |
||||
makes the parsing declarative. |
||||
|
||||
The prompts are the practical payoff: agent-driven builds currently pipe `y` |
||||
into stdin (fragile, undiscoverable - observed 2026-07-07 while rebuilding |
||||
tomlish.exe). With punk::args parsing, prompt-free operation is just another |
||||
declared option per subcommand, and non-interactive stdin without the flag can |
||||
fail fast with usage instead of hanging on a read or half-aborting. |
||||
|
||||
Precedents already in-tree: src/tests/runtests.tcl parses via punk::args |
||||
((script)::runtests definition), and the tomlish cmdline app presents tabled |
||||
usage as its first surface. |
||||
|
||||
## Approach |
||||
|
||||
- One PUNKARGS definition per subcommand (@cmd -summary/-help + opts), plus a |
||||
top-level definition enumerating subcommands - replacing punkboot_gethelp |
||||
and the hand-maintained help strings. `make.tcl`, `make.tcl -help`, and |
||||
per-subcommand help all render through punk::args::usage. |
||||
- Prompt policy: interactive stdin -> prompt as today (default); flag supplied |
||||
(e.g. -confirm 0 / -y, naming decision recorded here) -> proceed without |
||||
prompting; non-interactive stdin without the flag -> usage error, fast. |
||||
The bootsupport staleness prompt keeps its abort/prompt/proceed |
||||
classification but gains the same flag route. |
||||
- **Degradation is a hard requirement** (the 2026-07-06/07 incidents are the |
||||
cautionary tale: a stale bundled fileutil disabled the very make.tcl step |
||||
needed to fix it). The boot phase stays self-contained; punk::args is |
||||
guarded-lazily required post-boot (the punkboot::utils pattern documented in |
||||
src/bootsupport/AGENTS.md); when unavailable, dispatch and the repair |
||||
commands (check, bootsupport, modules) keep working with plain-text fallback |
||||
help. Note the tabled rendering also pulls punk::ansi/textblock/punk::char - |
||||
exactly the modules whose same-version staleness broke shellfilter this week |
||||
- so rendering must degrade independently of parsing (punk::args plain |
||||
output when the ANSI stack is unhealthy). |
||||
- Staleness tracking: punk::args joins the bootstrap-tracked buildversion set |
||||
(currently punkcheck, punk::repo, punk::mix, punk::tdl) with the same |
||||
bump-at-least-minor-on-call-site-API-change discipline; whether the |
||||
rendering stack is also tracked or left to degrade is an implementation |
||||
decision to record here (initial lean: track punk::args only - it is the |
||||
parsing contract; rendering degrades). |
||||
- Layout copies of make.tcl follow through the existing punkcheck-tracked |
||||
sync (custom/_project) and the G-012/G-027 channels for the rest - noted in |
||||
completion reports, never hand-synced. |
||||
|
||||
## Alternatives considered |
||||
|
||||
- Ad-hoc -y flags bolted onto the current hand parsing - rejected: solves the |
||||
agent problem but leaves the first-surface help un-showcased and the parsing |
||||
divergent from the ecosystem's own conventions. |
||||
- Requiring punk::args at boot (no fallback) - rejected: make.tcl must be able |
||||
to repair the very bootsupport snapshot it loads punk::args from. |
||||
|
||||
## Notes |
||||
|
||||
- Related: G-015 (agents driving punk tooling non-interactively), G-024 |
||||
(mapvfs toml errors deserve the same declared-argument quality), G-025 (the |
||||
version-report subcommand should be born punk::args-defined), G-027 (pull |
||||
updates deliver the improved make.tcl to derived projects). |
||||
- Observation parked here from the same session: runtests/make.tcl-adjacent |
||||
tooling that returns result dicts should document their key shape (see the |
||||
runx -tcl exitcode note in G-015's detail). |
||||
Loading…
Reference in new issue