From f5deb4d1b8306b270495d0498f60ff22b13a4423 Mon Sep 17 00:00:00 2001 From: Julian Noble Date: Sat, 25 Jul 2026 02:58:59 +1000 Subject: [PATCH] G-118 item 10: launch subcommand family docs as punk::args definitions (moduledoc punkexe) New punk::args::moduledoc::punkexe 0.1.0: (script)::punkexe dispatch definition (package modes, subcommand enumeration, default reclassification) + (script)::punkexe::tclsh full contract (stock arg-form parity incl the deliberate no -e boundary (G-077), lib: refusal, piperepl ::tclsh state array + env gates, intended divergences recorded per item decisions 2/6/8) + summary definitions for script/shell/punk/shellspy. G-032-compatible: the launcher help/parse wiring renders from these ids later. punk::args 0.12.7: update_definitions handles tag-prefixed id namespaces first-class - namespace_docpackages consulted with the tagged key (usage/ real_id on registered-but-unloaded (script)::* ids no longer no-such-id), generic tag strip for the real-namespace probes, unqualified-ns warning no longer fires for tag ids. args/ns/repl suites 352 pass 0 fail. punk::repl 0.5.3: code-interp setup catch-requires the punkexe moduledoc beside tclcore (both sites) so the docs are queryable in any punk shell. ARCHITECTURE.md: tclsh subcommand bullet in the boot/launch chain (architecture_lint clean). punkproject 0.20.1 + CHANGELOG. Verified: fresh-interp usage-first render (real_id path); rebuilt punk902z kit self-carries 0.1.0 (5298-char tclsh render); piped punk session renders (script)::punkexe with no manual require. Assisted-by: harness=claude; primary-model=claude-fable-5; api-location=anthropic.com --- ARCHITECTURE.md | 1 + CHANGELOG.md | 19 + goals/G-118-tclsh-subcommand-review.md | 23 +- punkproject.toml | 2 +- src/modules/punk/args-999999.0a1.0.tm | 22 +- src/modules/punk/args-buildversion.txt | 3 +- .../args/moduledoc/punkexe-999999.0a1.0.tm | 343 ++++++++++++++++++ .../args/moduledoc/punkexe-buildversion.txt | 3 + src/modules/punk/repl-999999.0a1.0.tm | 2 + src/modules/punk/repl-buildversion.txt | 3 +- .../punk/{args-0.12.6.tm => args-0.12.7.tm} | 28 +- .../punk/args/moduledoc/punkexe-0.1.0.tm | 343 ++++++++++++++++++ .../modules/punk/mix/templates-0.2.0.tm | Bin 263085 -> 270581 bytes .../punk/{repl-0.5.2.tm => repl-0.5.3.tm} | 4 +- 14 files changed, 784 insertions(+), 12 deletions(-) create mode 100644 src/modules/punk/args/moduledoc/punkexe-999999.0a1.0.tm create mode 100644 src/modules/punk/args/moduledoc/punkexe-buildversion.txt rename src/vfs/_vfscommon.vfs/modules/punk/{args-0.12.6.tm => args-0.12.7.tm} (99%) create mode 100644 src/vfs/_vfscommon.vfs/modules/punk/args/moduledoc/punkexe-0.1.0.tm rename src/vfs/_vfscommon.vfs/modules/punk/{repl-0.5.2.tm => repl-0.5.3.tm} (99%) diff --git a/ARCHITECTURE.md b/ARCHITECTURE.md index 2997e9ab..6e133a24 100644 --- a/ARCHITECTURE.md +++ b/ARCHITECTURE.md @@ -46,6 +46,7 @@ app package from src/lib/ (app-punkshell, app-punkscript, app-repl, app-shellsp - **Package modes pick module provenance.** `internal` uses module snapshots baked into the kit at build time; `dev` loads build outputs from repo-root `modules/` and `lib/`; `src` loads the unbuilt working tree (`src/modules`, `src/lib`, `src/bootsupport`, `src/vendormodules`) with `package prefer latest` so magic-version dev modules (`999999.0a1.0`) beat stamped snapshots. `src` mode is the standard way to verify working-tree changes without a rebuild. Source: `bin/AGENTS.md` "Launch package modes". - **Static package capture (G-058, achieved).** Boot probe-loads the runtime's statically linked packages in a throwaway interp and records what each provides; every interp the shell fabricates (boot, codethread, shellthread workers) seeds `package ifneeded {load {} }` from that record, and `punk::packagepreference` resolves static-vs-bundled version-aware. Sources: `src/vfs/AGENTS.md`, `goals/archive/G-058-static-runtime-packages.md`. - **`script` subcommand (G-015, achieved).** The lean non-interactive path: default punk shell module/alias environment, no shellfilter stacks/transforms, honest exit codes, launch plumbing emits nothing on stdout/stderr (exec-style callers see only the script's own output). Supports `lib:` scriptlib resolution. App package: `src/lib/app-punkscript/`. +- **`tclsh` subcommand (G-118).** Plain-tclsh emulation with NO punk modules loaded: stock argument-form parity (`-encoding name file`; any other leading `-` argument means no script, everything stays in `::argv`; no `-e` one-liner - deliberate stock parity, see G-077 for the punk-level one-liner direction), `lib:` refused with a pointer at `script`, missing script file is a clean exit 1. On piperepl-patched runtimes (the punk family runtimes - `src/buildsuites/suite_tcl90/patches/`) the C-level machinery publishes `::tclsh` launch state (`istty`, `dorepl`, `evalinput`, `inputbuffer`, `reopened`) allowing piped input to hand over to a live console repl at eof; runtimes without the machinery evaluate piped stdin whole-buffer with honest exit codes and fail fast on console stdin. The subcommand-family contract (tclsh/script/shell/punk/shellspy) is documented as punk::args definitions in `src/modules/punk/args/moduledoc/punkexe-999999.0a1.0.tm` (ids `(script)::punkexe` + per-subcommand; view via `punk::args::usage`), consumable by the future launcher help wiring (G-032). Pipe-testable behaviour pinned by `src/tests/shell/testsuites/punkexe/tclshcmd.test`. - **`bin/` launch surface.** Built kits plus polyglot `.cmd` utilities (`punk-runtime`, `punk-getzig`, `punk-tclargs`, `dtplite`) generated from `src/scriptapps/` sources by the `punk::mix` scriptwrap machinery - outputs are never hand-edited. `bin/punk-runtime.cmd` fetches/lists/selects plain runtimes under `bin/runtime//` from the punkbin artifact server with sha1 verification. Source: `bin/AGENTS.md`. ## Interp and thread topology diff --git a/CHANGELOG.md b/CHANGELOG.md index ab271fcd..682e3a0b 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,6 +5,25 @@ 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.20.1] - 2026-07-25 + +- Launch subcommand family documentation (G-118 item 10): new module + `punk::args::moduledoc::punkexe` carries the punk executable launch contract as punk::args + definitions - ids `(script)::punkexe` (dispatch: package modes, subcommand enumeration, + default script/shell reclassification) and `(script)::punkexe::tclsh/script/shell/punk/shellspy`. + The tclsh definition is the full contract: stock argument-form parity (incl. the deliberate + no `-e` one-liner boundary), `lib:` refusal, piperepl `::tclsh` launch-state array + (istty/dorepl/evalinput/inputbuffer/reopened) and env gates, plus the intended divergences + (early `tcl_interactive` link; whole-buffer piped eval with honest exit codes on + machinery-less runtimes). View via `punk::args::usage {(script)::punkexe}` in any punk shell + (repl code-interp setup loads the module; punk::repl 0.5.3). Authored G-032-compatible: the + future launcher help/parse wiring renders from these definitions. +- punk::args 0.12.7: tag-prefixed id namespaces (`(script)::...`, `(autodef)::...`) resolve + first-class in `update_definitions` - `punk::args::usage` on a registered-but-unloaded + script-level id no longer errors `no such id`, and the spurious + `warning: update_definitions received unqualified ns: (script)` stderr noise is gone. +- ARCHITECTURE.md: `tclsh` subcommand bullet added to the boot/launch chain section. + ## [0.20.0] - 2026-07-24 - `tclsh` subcommand review fixes (G-118 items 3/4/5/9): no-script forms set `::argv0` to the diff --git a/goals/G-118-tclsh-subcommand-review.md b/goals/G-118-tclsh-subcommand-review.md index 7b1767c7..00a4e143 100644 --- a/goals/G-118-tclsh-subcommand-review.md +++ b/goals/G-118-tclsh-subcommand-review.md @@ -43,4 +43,25 @@ All 11 items dispositioned by the user 2026-07-24 (activation session). Items 1 - 2026-07-24 items 3/4/5/9 LANDED (punkproject 0.20.0): no-script forms set ::argv0 to [info nameofexecutable] (both repl and piped-eval paths); missing script file pre-checked with clean not-found + exit 1; machinery-absent console stdin fails fast via the app-punkscript terminal probe (piped degraded eval unchanged; patch-missing notice reworded to "note:", deliberate TCLSH_PIPEREPL=0 opt-out now quiet, old debug lines deleted); project_main.tcl carries the full mirrored dispatch (script-arg/dash/-encoding/lib: forms - previously single-arg-only with stale gate default) and both layout _config copies byte-synced. Verified: all mapvfs kits rebuilt; tclshcmd.test extended to 19 (tclsh_noscript_argv0, tclsh_script_notfound); shell/*** suite 64 pass / 2 goal-gated skips / 0 fail. - 2026-07-24 overlap reconciliation (user-prompted review): cross-references recorded with G-025 (kit-layer stamp counterpart - see G-117 Notes for the record-survives-kit-wrap + filename-namespacing considerations), G-032 (item 10 refined: docs authored as G-032-compatible punk::args definitions), G-031 (item 9 duplication interim), G-077 (tclsh -e boundary note). - 2026-07-24 items 1 + 7 LANDED and verified (G-117 cycle suite rebuild): reopen notice now TCLSH_PIPEREPL_DEBUG-gated with all reopen-path messages on stderr; ::tclsh(reopened) published (family_check gate probe asserts 0 at gate-open start / absent on plain+opt-out on all three family members; tclshcmd.test tclsh_pr_noarg_machinery pins it against the rebuilt punk9_beta). The console-reopen FLIP to 1 and the notice's console-side silence remain item-11 console-harness verification. -- Remaining for acceptance: item 10 definitions (G-032-compatible) also carrying the documented-as-intended records (items 2, 6, 8) and the G-077 boundary; console-driven test (item 11); ARCHITECTURE.md tclsh-subcommand bullet rides the item-10 docs change-set. +- 2026-07-25 item 10 LANDED (punkproject 0.20.1): launch-subcommand-family documentation + authored as G-032-compatible punk::args definitions in NEW module + punk::args::moduledoc::punkexe (0.1.0; deferred PUNKARGS registration, argdoc child, + make.tcl (script)::punkboot id convention): (script)::punkexe top-level (package-mode + leader documented in help text, subcommand enumeration with choicelabels, default + script/shell reclassification) + (script)::punkexe::tclsh full contract (multi-form + scriptfile/stdin with explicit synopses) + summary-level script/shell/punk/shellspy + definitions. The tclsh definition carries the documented-as-intended records: item 2 + (early tcl_interactive link + load-bearing write path), item 6 (whole-buffer piped + eval with honest exit codes on machinery-less runtimes, per-command C repl loop with + machinery), item 8 (istty read-only by convention, no trace), and the G-077 boundary + (no -e one-liner - deliberate stock parity inside this subcommand). Supporting work: + punk::args 0.12.7 update_definitions handles tag-prefixed id namespaces first-class + (namespace_docpackages consulted with the tagged key; punk::args::usage on + (script)::* ids no longer errors no-such-id; spurious unqualified-ns stderr warning + gone - args/ns/repl suites 352 pass 0 fail); punk::repl 0.5.3 loads the module + catch-guarded at both code-interp setup sites (docs queryable in any punk shell); + ARCHITECTURE.md boot/launch tclsh-subcommand bullet added (architecture_lint clean). + Verified: usage-first render in fresh interp (real_id path), src + rebuilt-kit + (punk902z script probe: 0.1.0, 5298-char tclsh render) + repl-wired (piped punk + session renders (script)::punkexe without manual require). +- Remaining for acceptance: console-driven test (item 11). diff --git a/punkproject.toml b/punkproject.toml index 27c09155..665add79 100644 --- a/punkproject.toml +++ b/punkproject.toml @@ -1,4 +1,4 @@ [project] name = "punkshell" -version = "0.20.0" +version = "0.20.1" license = "BSD-2-Clause" diff --git a/src/modules/punk/args-999999.0a1.0.tm b/src/modules/punk/args-999999.0a1.0.tm index 8e0c01c5..d63a6ba8 100644 --- a/src/modules/punk/args-999999.0a1.0.tm +++ b/src/modules/punk/args-999999.0a1.0.tm @@ -4765,8 +4765,26 @@ tcl::namespace::eval punk::args { } else { set needed [list] foreach pkgns $nslist { - if {[string match (autodef)* $pkgns]} { - set pkgns [string range $pkgns 9 end] + if {[string match {(*)*} $pkgns]} { + #tag-prefixed id 'namespace' e.g (autodef)::myensemble, or a + #script-level id family e.g (script)::punkboot, (script)::punkexe. + #Not a real namespace: the scan records documenting packages under + #the TAGGED key (namespace qualifiers of the tagged id), so consult + #namespace_docpackages with the original key first, then strip the + #tag for the real-namespace probes below ((autodef) ids also map to + #a real namespace; a bare tag or tag-only qualifier has nothing more + #to probe). + if {[dict exists $namespace_docpackages $pkgns]} { + foreach docns [dict get $namespace_docpackages $pkgns] { + if {$docns ni $loaded_packages && $docns ni $needed} { + lappend needed $docns + } + } + } + set pkgns [string range $pkgns [expr {[string first ) $pkgns]+1}] end] + if {$pkgns eq ""} { + continue + } } if {![string match ::* $pkgns]} { puts stderr "warning: update_definitions received unqualified ns: $pkgns" diff --git a/src/modules/punk/args-buildversion.txt b/src/modules/punk/args-buildversion.txt index 912b8ced..cf922e6e 100644 --- a/src/modules/punk/args-buildversion.txt +++ b/src/modules/punk/args-buildversion.txt @@ -1,6 +1,7 @@ -0.12.6 +0.12.7 #First line must be a semantic version number #all other lines are ignored. +#0.12.7 - update_definitions: tag-prefixed id 'namespaces' ((autodef)::x plus script-level id families like (script)::punkboot / (script)::punkexe - the make.tcl G-030 convention, now also the launch-dispatch doc home per G-118 item 10) are handled first-class in the nslist walk. Previously only the (autodef) tag was stripped; other tags fell through to the unqualified-ns branch, emitting a spurious "warning: update_definitions received unqualified ns: (script)" on stderr for EVERY id query and probing a garbage ::(script)... namespace - and, decisively, the namespace_docpackages association was never consulted with the TAGGED key the scan records, so real_id/usage on a registered-but-not-yet-loaded script-level id returned ""/no-such-id even though get_spec resolved it. Now: docpackages lookup with the original tagged key (loads the documenting package - punk::args::usage works for (script)::punkexe::* ids on first query), then generic tag strip for the real-namespace probes, with a bare/tag-only qualifier skipping them silently. Real unqualified namespaces still warn. #0.12.6 - arg_error error-message placement (user direction 2026-07-18): the supplied error message and any per-form match detail it carries ("Bad arguments ... Candidate forms ..." + per-form failure lines) now render exactly once, BELOW the usage display, for both the table and string return forms. Previously the block rendered above the usage AND was appended again below it (the historical "put original error at bottom of table too"), duplicating potentially long multi-form detail. The bottom append is also now suppressed when the message is empty (usage-only calls no longer gain a trailing newline + empty line). tableobject returns are unchanged (they never carried the message). Also (same user direction, format explicitly not frozen - no external consumers yet): the string renderer's argument rows are now single-line 'name TYPE:... ?DEFAULT:...? ?MULTI:yes?' - the multi-line table-cell type constraints (-minsize/-maxsize/-range(s), previously line-broken mid-row so DEFAULT:/MULTI: landed glued to the last constraint line, e.g 'i -return string dict filter' arg vars) parenthesize onto the base type as TYPE:list(-minsize 2 -maxsize 2), empty DEFAULT/MULTI fields are omitted instead of rendering empty labels (MULTI shows 'yes' rather than the check glyph), and whitespace-only help blocks no longer emit indented filler lines. The /arbitrary-flag indicator rows get the same DEFAULT-omission. Choices also gain structure in the string renderer (previously a flat join left choice names and multi-line choicelabels at inconsistent depths, machine-indistinguishable once ANSI is stripped - only the table/ANSI prefix highlighting disambiguated): each choice renders as a markdown-subset bullet '- `choice`' at fixed indent 6 (the backticked token may carry a trailing choiceinfo marker glyph), the label's first line follows the closing backtick on the bullet line after ' - ', label continuations indent to 8 (2 past the bullet dash), and groups head their bullets as "Group 'name':". The resulting structural contract for parsers: column-0 lines bearing TYPE: are argument rows, indented lines are documentation, '- `...`' bullets are choices. Table cells unchanged (construction shared, restructure applied at the string-path consumption site). Feeds punk::ns 0.9.0 cmdhelp -return text (LLM-oriented plain text). Pinned in rendering.test (rendering_stringmode_singleline_argrows, rendering_stringmode_choice_bullets); errorselection.test message pins gained leading * (message no longer starts the raised string); cmdhelp.test message pins sample the last line. No API change. #0.12.5 - eg usability: punk::args::eg resolves relative/unqualified command names (via punk::ns::cmdinfo from the calling context when punk::ns is loaded - handles subcommand words too - else global qualification). Rationale: in a namespace where punk::args::eg shadows the global 'eg' alias (e.g whilst in ::punk::args itself) 'eg list' hit the raw-id API and returned empty while 'i list' resolved - Tcl name resolution, not an alias deficiency. Unknown ids now return a message naming the id instead of empty; punk::ns::eg hands the typed name through when resolution yields no docid so the message can name it. The usage-table 'Example: eg ' header row (the short indication an @examples block exists) now uses scheme colour CLR(check) instead of hardcoded white - the raw id is kept (not @cmd -name, which is display text and not always invocable e.g 'Autoloading Built-in: parray'); a frame-embedded bottom-right marker awaits textblock table footer-block support (candidate goal). New examples.test pins: relative-name resolution, unknown-id message. #0.12.5 - synopsis notation documented + internal @form -synopsis overrides retired. ::punk::args::parse and ::parse_status dropped their @form -synopsis overrides - they had gone stale (omitted -cache/-caller) and their only added value (the -form member hint) is now expressed properly via -typesynopsis {...} on the -form option; the auto-generated lines stay current as options are added (drift pin: synopsis.test synopsis_parse_generated). @form -synopsis remains fully supported for documentors: define's directive help now documents that it is display-only text needing no Tcl-list validity, that display helpers substitute the command head, and the known warranted case (script-level/constructed ids rendering the raw id - the G-030 lesson recorded in src/modules/AGENTS.md; head-render preference for @cmd -name remains an open generation deficiency). ::punk::args::synopsis -help gains a notation legend ([...] optional, italic argname/ placeholders, unitalicised literals, (a|b) alternate grouping to disambiguate from -f|--file alias pipes, {a b} multi-word literal protection, --opt=, text*/*text) and a new @examples block comparing Tcl man-page ?...? style (ambiguous when nested - same delimiter both ends) with the bracket style, viewable via punk::args::eg. New synopsis.test pins: non-list custom -synopsis passthrough + ns head-replacement survival, parse generated-line drift pin, examples block presence. diff --git a/src/modules/punk/args/moduledoc/punkexe-999999.0a1.0.tm b/src/modules/punk/args/moduledoc/punkexe-999999.0a1.0.tm new file mode 100644 index 00000000..35d7f482 --- /dev/null +++ b/src/modules/punk/args/moduledoc/punkexe-999999.0a1.0.tm @@ -0,0 +1,343 @@ +# -*- tcl -*- +# Maintenance Instruction: leave the 999999.xxx.x as is and use punkshell 'dev make' or bin/punkmake to update from -buildversion.txt +# module template: punkshell/src/decktemplates/vendor/punk/modules/template_module-0.0.3.tm +# +# Please consider using a BSD or MIT style license for greatest compatibility with the Tcl ecosystem. +# Code using preferred Tcl licenses can be eligible for inclusion in Tcllib, Tklib and the punk package repository. +# ++ +++ +++ +++ +++ +++ +++ +++ +++ +++ +++ +# (C) 2026 +# +# @@ Meta Begin +# Application punk::args::moduledoc::punkexe 999999.0a1.0 +# Meta platform tcl +# Meta license BSD +# @@ Meta End + + +# ++ +++ +++ +++ +++ +++ +++ +++ +++ +++ +++ +# doctools header +# ++ +++ +++ +++ +++ +++ +++ +++ +++ +++ +++ +#*** !doctools +#[manpage_begin punkshell_module_punk::args::moduledoc::punkexe 0 999999.0a1.0] +#[copyright "2026"] +#[titledesc {punk executable launch documentation}] [comment {-- Name section and table of contents description --}] +#[moddesc {-}] [comment {-- Description at end of page heading --}] +#[require punk::args::moduledoc::punkexe] +#[keywords module launch subcommand tclsh] +#[description] +#[para] punk::args definitions documenting the punk executable launch dispatch +#[para] (the subcommand family implemented in the kit boot script src/vfs/_config/punk_main.tcl) + +# ++ +++ +++ +++ +++ +++ +++ +++ +++ +++ +++ + +#*** !doctools +#[section Overview] +#[para] These definitions are the documentation home for the launch subcommand +#[para] family of the punk executables: tclsh, script, shell, punk, shellspy +#[para] (G-118 item 10). They are authored to be consumable by the future +#[para] launcher help/parse wiring (goal G-032) - rendering, option parsing and +#[para] degradation wiring stay with that goal. Id convention follows the +#[para] make.tcl precedent for script-level surfaces: (script)::punkexe and +#[para] (script)::punkexe::, with explicit @form -synopsis overrides +#[para] since a constructed id is not an invocable command name. + +# ++ +++ +++ +++ +++ +++ +++ +++ +++ +++ +++ +## Requirements +# ++ +++ +++ +++ +++ +++ +++ +++ +++ +++ +++ + +#*** !doctools +#[subsection dependencies] +#[para] packages used by punk::args::moduledoc::punkexe +#[list_begin itemized] + +package require Tcl 8.6- +#*** !doctools +#[item] [package {Tcl 8.6}] + +#*** !doctools +#[list_end] + +# ++ +++ +++ +++ +++ +++ +++ +++ +++ +++ +++ + +#*** !doctools +#[section API] + + +tcl::namespace::eval punk::args::moduledoc::punkexe { + # ++ +++ +++ +++ +++ +++ +++ +++ +++ +++ +++ + # Base namespace + # ++ +++ +++ +++ +++ +++ +++ +++ +++ +++ +++ + #*** !doctools + #[subsection {Namespace punk::args::moduledoc::punkexe}] + #[para] punk::args definitions for the punk executable launch dispatch + #[list_begin definitions] + + variable PUNKARGS + + namespace eval argdoc { + #Top-level launch dispatch (kit boot script punk_main.tcl, mirrored in + #project_main.tcl for generated projects). Display-first definitions: + #the dispatch itself does not parse via punk::args yet (goal G-032). + # -- --- --- --- --- --- --- --- --- --- --- --- --- --- + lappend PUNKARGS [list { + @id -id (script)::punkexe + @cmd -name punkexe\ + -summary\ + "punk executable launch: package modes and subcommand dispatch."\ + -help\ + "Launch surface of the punk shell executables ('' below + stands for any punk kit executable, e.g punk905, or a generated + project's kit). + + An optional FIRST argument selects package modes: one or more of + the tokens dev, os, src, internal joined with '-' when combined + (e.g 'dev', 'src', 'dev-src'). Modes decide which module sources + the shell trusts and their precedence; 'internal' (kit-bundled + modules) is always appended when absent. Details: bin/AGENTS.md + 'launch package modes' in the punkshell source tree. + + The next argument selects a subcommand from the choices below. + When the first non-mode argument is not a known subcommand: + with no arguments at all the interactive punk shell is launched + ('shell'); any other first argument is treated as a script + invocation (handled as for the 'script' subcommand)." + @form -synopsis " ?packagemode? ?subcommand? ?arg ...?" + @leaders -min 0 -max 1 + subcommand -type string -optional 1 -choicerestricted 0 -choices {tclsh script shell punk shellspy} -choicelabels { + tclsh + " Run as a (near) stock tclsh - no punk modules loaded." + script + " Run a script non-interactively in the punk script environment; honest exit codes." + shell + " Interactive punk shell (repl); can run a script first and stay interactive." + punk + " punk shell launch; piped-stdin friendly (echo cmds | punk)." + shellspy + " Experimental shellspy command-line processor." + } -help\ + "Subcommand to run. Each subcommand's own contract is documented + under its definition id (script)::punkexe::." + @values -min 0 -max -1 + arg -type any -optional 1 -multiple 1 -help\ + "Arguments for the selected subcommand." + }] + # -- --- --- --- --- --- --- --- --- --- --- --- --- --- + + #tclsh subcommand: full contract (G-118). The documented-as-intended + #divergences below record G-118 item decisions: item 2 (tcl_interactive + #early link), item 6 (piped whole-buffer eval + honest exit codes), + #item 8 (istty read-only by convention). The 'no -e one-liner' note is + #the G-077 boundary: stock parity INSIDE this subcommand is deliberate; + #one-liner affordances belong to the top-level/'script' surfaces (G-077). + # -- --- --- --- --- --- --- --- --- --- --- --- --- --- + lappend PUNKARGS [list { + @id -id (script)::punkexe::tclsh + @cmd -name "punkexe tclsh"\ + -summary\ + "Run the punk executable as a (near) stock tclsh - no punk modules."\ + -help\ + "Run the executable as a plain tclsh: no punk modules are loaded + and behaviour matches stock 'tclsh' as closely as the kit boot + allows. The subcommand is an EXTENSION of standard tclsh + behaviour, not an exact emulator - the divergences are listed + below and are intended. + + Stock argument-form parity (tclMain.c): the only recognised + leading option is '-encoding name scriptfile', and only when + scriptfile does not itself begin with '-'. Any other leading '-' + argument means NO script file: all arguments stay in ::argv and + input comes from stdin. In particular there is no -e/-c + one-liner flag - ' tclsh -e (script)' puts '-e' and the + script text into ::argv and reads stdin, exactly like stock + tclsh. That parity is deliberate; one-liner affordances belong + to the punk-level launch surfaces, not this subcommand. + + A scriptfile of the form 'lib:name' is refused with a pointer to + the 'script' subcommand: scriptlib resolution is a punk + facility and the tclsh subcommand keeps plain-tclsh semantics. + A missing scriptfile is a clean error (exit 1); errors raised by + an existing script keep their full trace. + + Piperepl runtimes: kits on a 'punk' family runtime carry the + TCLSH_PIPEREPL patch (disable with env TCLSH_PIPEREPL=0; a kit + on an unpatched runtime notes the missing patch on stderr for + the forms that would use it). With the gate open the runtime + publishes launch state in the ::tclsh array before any script + runs: + istty launch-time fact: was stdin a tty? Never updated + afterwards (still 0 after a console reopen). + Read-only by convention - no readonly trace is + installed; a script write corrupts the + Tcl-visible value without affecting behaviour. + Its existence is also the patch-presence probe. + dorepl linked control: a script (or piped input) sets + this to 1 to enter the interactive repl after + the script/stdin completes - on piped launches + stdin is reopened from the console (CONIN$ on + windows, /dev/tty elsewhere). + evalinput linked control: piped input a script-arg run + did not consume is BUFFERED, not evaluated, + unless the script sets evalinput to 1. + inputbuffer set at console reopen: holds the unconsumed + piped input. + reopened 0 at gate-open startup; republished as 1 after + a successful console reopen. + Env TCLSH_PIPEREPL_DEBUG=1 enables patch diagnostics on stderr + (e.g the console-reopen notice, silent by default). + + Intended divergences from stock tclsh: + - tcl_interactive: with the piperepl gate open it is linked + to the tty flag BEFORE the startup script runs; a + script-arg launch from a console therefore reads 1 where + stock reads 0 (piped launches read 0 either way). The + early link is load-bearing: a piped script that sets + dorepl writes ::tcl_interactive to opt into prompts/echo + in the reopened repl. + - piped no-arg evaluation WITHOUT the machinery (unpatched + runtime, or TCLSH_PIPEREPL=0): stdin is read to eof and + evaluated as one script - output appears at eof on slow + pipes, a mid-script error aborts the remainder, and the + exit code is honest (nonzero on error) where stock tclsh + streams per command, continues after errors and exits 0. + (With the machinery present, evaluation is the stock + per-command repl loop.) On machinery-less runtimes the + interactive form (console stdin, no script) fails fast + with a usage error instead of blocking in a console read." + + @form -form {scriptfile} -synopsis " tclsh ?-encoding name? scriptfile ?arg ...?" + @leaders -min 0 -max 0 + @opts + -encoding -type string -optional 1 -typesynopsis name -help\ + "Encoding used to read scriptfile (as for 'source -encoding'). + Recognised only immediately after 'tclsh' and only when the + following argument does not begin with '-'; an incomplete + -encoding form falls through to the no-script form (stock + behaviour)." + @values -min 1 -max -1 + scriptfile -type string -optional 0 -help\ + "Script file to source and exit. ::argv0 and 'info script' are + the (normalized) script path; remaining args are ::argv. The + script may set ::tclsh(dorepl) 1 (piperepl runtimes) to enter + the interactive repl after it completes." + arg -type any -optional 1 -multiple 1 -help\ + "Arguments passed to the script in ::argv." + + @form -form {stdin} -synopsis " tclsh ?arg ...?" + @values -min 0 -max -1 + arg -type any -optional 1 -multiple 1 -help\ + "With no script file all arguments (including any leading '-' + arguments) stay in ::argv; ::argv0 is the executable path. + Input comes from stdin: the interactive repl on a console + (piperepl runtimes), evaluation of piped input otherwise." + }] + # -- --- --- --- --- --- --- --- --- --- --- --- --- --- + + #Sibling subcommands: summary-level contracts. Deep punk::args parse + #definitions for these surfaces are G-032's lane ('script' is its + #natural first parsed subcommand). + # -- --- --- --- --- --- --- --- --- --- --- --- --- --- + lappend PUNKARGS [list { + @id -id (script)::punkexe::script + @cmd -name "punkexe script"\ + -summary\ + "Run a script non-interactively in the punk script environment."\ + -help\ + "Run a Tcl script and exit with an honest exit code + (app-punkscript): script errors exit nonzero and the launch + plumbing emits nothing of its own on stdout/stderr, so + exec-style callers see only the script's output. The default + punk module/alias environment is loaded (unlike 'tclsh'). + + The script comes from the file argument, from piped stdin when + no argument is given (terminal stdin without a script argument + is a usage error - no interactive fallback), or via scriptlib + resolution when the argument has the form 'lib:name' (resolved + from the scriptlib locations associated with the executable, + including extensionless and shebang'd scripts)." + @form -synopsis " script ?scriptfile|lib:name? ?arg ...?" + @values -min 0 -max -1 + scriptfile -type string -optional 1 -help\ + "Script file path, or lib:name for scriptlib resolution. + Omitted: the script is read from piped stdin." + arg -type any -optional 1 -multiple 1 -help\ + "Arguments passed to the script in ::argv." + }] + # -- --- --- --- --- --- --- --- --- --- --- --- --- --- + lappend PUNKARGS [list { + @id -id (script)::punkexe::shell + @cmd -name "punkexe shell"\ + -summary\ + "Interactive punk shell (repl)."\ + -help\ + "Launch the interactive punk shell (app-punkshell). With + arguments, a script can be run first with the interactive + shell maintained afterwards. This is also the default when the + executable is launched with no arguments at all." + @form -synopsis " shell ?arg ...?" + @values -min 0 -max -1 + arg -type any -optional 1 -multiple 1 -help\ + "Arguments passed through to the shell launch." + }] + # -- --- --- --- --- --- --- --- --- --- --- --- --- --- + lappend PUNKARGS [list { + @id -id (script)::punkexe::punk + @cmd -name "punkexe punk"\ + -summary\ + "punk shell launch; piped-stdin friendly."\ + -help\ + "Launch the punk shell. With arguments the app-punkshell launch + path is used (as for 'shell'); without arguments the + interactive shell is launched directly. Commands piped into + stdin are supported (e.g: echo 'puts hello' | punk) + and stderr is kept clean of launch chatter so exec-style + callers do not misreport failure." + @form -synopsis " punk ?arg ...?" + @values -min 0 -max -1 + arg -type any -optional 1 -multiple 1 -help\ + "Arguments passed through to the shell launch." + }] + # -- --- --- --- --- --- --- --- --- --- --- --- --- --- + lappend PUNKARGS [list { + @id -id (script)::punkexe::shellspy + @cmd -name "punkexe shellspy"\ + -summary\ + "Experimental shellspy command-line processor."\ + -help\ + "Pass all arguments to the experimental shellspy command-line + processor (app-shellspy). Note: 'shellspy' is only this launch + subcommand - it is not the project name (the project is + punkshell)." + @form -synopsis " shellspy ?arg ...?" + @values -min 0 -max -1 + arg -type any -optional 1 -multiple 1 -help\ + "Arguments for the shellspy processor." + }] + # -- --- --- --- --- --- --- --- --- --- --- --- --- --- + } + + #*** !doctools + #[list_end] [comment {--- end definitions namespace punk::args::moduledoc::punkexe ---}] +} + +# ----------------------------------------------------------------------------- +# register namespace(s) to have PUNKARGS,PUNKARGS_aliases variables checked +# ----------------------------------------------------------------------------- +# variable PUNKARGS +# variable PUNKARGS_aliases +namespace eval ::punk::args::register { + #use fully qualified so 8.6 doesn't find existing var in global namespace + lappend ::punk::args::register::NAMESPACES ::punk::args::moduledoc::punkexe ::punk::args::moduledoc::punkexe::argdoc +} +# ----------------------------------------------------------------------------- + +# ++ +++ +++ +++ +++ +++ +++ +++ +++ +++ +++ +## Ready +package provide punk::args::moduledoc::punkexe [tcl::namespace::eval punk::args::moduledoc::punkexe { + variable pkg punk::args::moduledoc::punkexe + variable version + set version 999999.0a1.0 +}] +return + +#*** !doctools +#[manpage_end] diff --git a/src/modules/punk/args/moduledoc/punkexe-buildversion.txt b/src/modules/punk/args/moduledoc/punkexe-buildversion.txt new file mode 100644 index 00000000..f47d01c8 --- /dev/null +++ b/src/modules/punk/args/moduledoc/punkexe-buildversion.txt @@ -0,0 +1,3 @@ +0.1.0 +#First line must be a semantic version number +#all other lines are ignored. diff --git a/src/modules/punk/repl-999999.0a1.0.tm b/src/modules/punk/repl-999999.0a1.0.tm index 8f93b1b8..6c6de153 100644 --- a/src/modules/punk/repl-999999.0a1.0.tm +++ b/src/modules/punk/repl-999999.0a1.0.tm @@ -4290,6 +4290,7 @@ namespace eval repl { package require punk::lib package require punk::args catch {package require punk::args::moduledoc::tclcore} ;#while tclcore is highly desirable, and should be installed with punk::args - it's not critical + catch {package require punk::args::moduledoc::punkexe} ;#launch subcommand family documentation (G-118) - not critical package require textblock } @@ -4470,6 +4471,7 @@ namespace eval repl { catch {package require punk::args::moduledoc::parser} #----------- catch {package require punk::args::moduledoc::tclcore} ;#while tclcore is highly desirable, and should be installed with punk::args - it's not critical + catch {package require punk::args::moduledoc::punkexe} ;#launch subcommand family documentation (G-118) - not critical } errM]} { puts stderr "========================" puts stderr "code interp error:" diff --git a/src/modules/punk/repl-buildversion.txt b/src/modules/punk/repl-buildversion.txt index fe8bc22f..6907aa46 100644 --- a/src/modules/punk/repl-buildversion.txt +++ b/src/modules/punk/repl-buildversion.txt @@ -1,6 +1,7 @@ -0.5.2 +0.5.3 #First line must be a semantic version number #all other lines are ignored. +#0.5.3 - code interp setup loads punk::args::moduledoc::punkexe (catch-guarded beside the tclcore moduledoc requires, both code-interp setup sites) so the launch subcommand family documentation ids ((script)::punkexe and (script)::punkexe::tclsh/script/shell/punk/shellspy - G-118 item 10) are queryable via punk::args::usage in any punk shell without a manual package require. Not critical - absence degrades silently like tclcore. #0.5.2 - G-076: repl_handler now handles a dead console DELIVERED as a readable event (runtimes carrying the upstream f10d91c2d3 fix - first such 9.0-line version 9.0.5): the previously unguarded full 'chan configure' probe at handler entry errored ('couldn't read console mode: broken pipe'), backgrounding the error and leaving the repl idle with its reader inactive. The probe is now guarded, and terminal input loss routes through new repl::console_input_lost - the same teardown console_watchdog uses (cancel any watchdog schedule, deregister reader, close channel to stop the core reader thread, finish via the eof done-path; no reopen attempt). console_watchdog now shares this helper (probe unchanged, message unchanged). Verified with the G-039 kill procedure on a zig-built core-9-0-branch (9.0.5) runtime with the watchdog disarmed via the shipping gate: clean exit 0.2s after conhost kill through app-punkshell's no-console eof handling; pre-fix runtimes are unaffected (the defect never delivers the event - the watchdog remains their rescue path). #0.5.2 - fixed the codethread seeding template in repl::start: it namespace-eval'd the full ::punk::nav::ns::ns_current VARIABLE name (creating a stray namespace of that name in every code interp - visible as a phantom 'ns_current' child when browsing the nav namespace with n/) instead of just ensuring the parent ::punk::nav::ns exists before setting the variable. Seeding semantics unchanged (the subshell namespace carry-over: a new codethread's code interp starts in the launching context's ns_current when it exists, else ::). Guarded by the new punk/repl testsuite repl/nscurrent.test (real codethread via repl::init driven with synchronous runscript sends: inscope evaluation of ns_current, retention across submissions, n/-navigation retained, auto-create-with-notice for a missing current namespace, stray-namespace absence, and a source-text guard on the template pending an end-to-end piped subshell test). #0.5.1 - G-076: repl::start's dead-console watchdog arming now also requires punk::lib::check::has_tclbug_console_deadspin to report the runtime affected (shared version gate with the 'help tcl' warning; requires punk::lib 0.4.2+). Behaviour today is unchanged (gate variable check::tclbug_console_deadspin_fixed_in is empty = every Tcl 9 windows runtime affected); once a released Tcl containing the verified upstream fix for f10d91c2d3 is recorded there, such runtimes stop arming the watchdog. diff --git a/src/vfs/_vfscommon.vfs/modules/punk/args-0.12.6.tm b/src/vfs/_vfscommon.vfs/modules/punk/args-0.12.7.tm similarity index 99% rename from src/vfs/_vfscommon.vfs/modules/punk/args-0.12.6.tm rename to src/vfs/_vfscommon.vfs/modules/punk/args-0.12.7.tm index 3d9acb4c..0b52a7c3 100644 --- a/src/vfs/_vfscommon.vfs/modules/punk/args-0.12.6.tm +++ b/src/vfs/_vfscommon.vfs/modules/punk/args-0.12.7.tm @@ -8,7 +8,7 @@ # (C) 2024 # # @@ Meta Begin -# Application punk::args 0.12.6 +# Application punk::args 0.12.7 # Meta platform tcl # Meta license # @@ Meta End @@ -18,7 +18,7 @@ # doctools header # ++ +++ +++ +++ +++ +++ +++ +++ +++ +++ +++ #*** !doctools -#[manpage_begin punkshell_module_punk::args 0 0.12.6] +#[manpage_begin punkshell_module_punk::args 0 0.12.7] #[copyright "2024"] #[titledesc {args parsing}] [comment {-- Name section and table of contents description --}] #[moddesc {args to nested dict of opts and values}] [comment {-- Description at end of page heading --}] @@ -4765,8 +4765,26 @@ tcl::namespace::eval punk::args { } else { set needed [list] foreach pkgns $nslist { - if {[string match (autodef)* $pkgns]} { - set pkgns [string range $pkgns 9 end] + if {[string match {(*)*} $pkgns]} { + #tag-prefixed id 'namespace' e.g (autodef)::myensemble, or a + #script-level id family e.g (script)::punkboot, (script)::punkexe. + #Not a real namespace: the scan records documenting packages under + #the TAGGED key (namespace qualifiers of the tagged id), so consult + #namespace_docpackages with the original key first, then strip the + #tag for the real-namespace probes below ((autodef) ids also map to + #a real namespace; a bare tag or tag-only qualifier has nothing more + #to probe). + if {[dict exists $namespace_docpackages $pkgns]} { + foreach docns [dict get $namespace_docpackages $pkgns] { + if {$docns ni $loaded_packages && $docns ni $needed} { + lappend needed $docns + } + } + } + set pkgns [string range $pkgns [expr {[string first ) $pkgns]+1}] end] + if {$pkgns eq ""} { + continue + } } if {![string match ::* $pkgns]} { puts stderr "warning: update_definitions received unqualified ns: $pkgns" @@ -14071,7 +14089,7 @@ package provide punk::args [tcl::namespace::eval punk::args { tcl::namespace::path {::punk::args::lib ::punk::args::system} variable pkg punk::args variable version - set version 0.12.6 + set version 0.12.7 }] return diff --git a/src/vfs/_vfscommon.vfs/modules/punk/args/moduledoc/punkexe-0.1.0.tm b/src/vfs/_vfscommon.vfs/modules/punk/args/moduledoc/punkexe-0.1.0.tm new file mode 100644 index 00000000..0fd5cef0 --- /dev/null +++ b/src/vfs/_vfscommon.vfs/modules/punk/args/moduledoc/punkexe-0.1.0.tm @@ -0,0 +1,343 @@ +# -*- tcl -*- +# Maintenance Instruction: leave the 999999.xxx.x as is and use punkshell 'dev make' or bin/punkmake to update from -buildversion.txt +# module template: punkshell/src/decktemplates/vendor/punk/modules/template_module-0.0.3.tm +# +# Please consider using a BSD or MIT style license for greatest compatibility with the Tcl ecosystem. +# Code using preferred Tcl licenses can be eligible for inclusion in Tcllib, Tklib and the punk package repository. +# ++ +++ +++ +++ +++ +++ +++ +++ +++ +++ +++ +# (C) 2026 +# +# @@ Meta Begin +# Application punk::args::moduledoc::punkexe 0.1.0 +# Meta platform tcl +# Meta license BSD +# @@ Meta End + + +# ++ +++ +++ +++ +++ +++ +++ +++ +++ +++ +++ +# doctools header +# ++ +++ +++ +++ +++ +++ +++ +++ +++ +++ +++ +#*** !doctools +#[manpage_begin punkshell_module_punk::args::moduledoc::punkexe 0 0.1.0] +#[copyright "2026"] +#[titledesc {punk executable launch documentation}] [comment {-- Name section and table of contents description --}] +#[moddesc {-}] [comment {-- Description at end of page heading --}] +#[require punk::args::moduledoc::punkexe] +#[keywords module launch subcommand tclsh] +#[description] +#[para] punk::args definitions documenting the punk executable launch dispatch +#[para] (the subcommand family implemented in the kit boot script src/vfs/_config/punk_main.tcl) + +# ++ +++ +++ +++ +++ +++ +++ +++ +++ +++ +++ + +#*** !doctools +#[section Overview] +#[para] These definitions are the documentation home for the launch subcommand +#[para] family of the punk executables: tclsh, script, shell, punk, shellspy +#[para] (G-118 item 10). They are authored to be consumable by the future +#[para] launcher help/parse wiring (goal G-032) - rendering, option parsing and +#[para] degradation wiring stay with that goal. Id convention follows the +#[para] make.tcl precedent for script-level surfaces: (script)::punkexe and +#[para] (script)::punkexe::, with explicit @form -synopsis overrides +#[para] since a constructed id is not an invocable command name. + +# ++ +++ +++ +++ +++ +++ +++ +++ +++ +++ +++ +## Requirements +# ++ +++ +++ +++ +++ +++ +++ +++ +++ +++ +++ + +#*** !doctools +#[subsection dependencies] +#[para] packages used by punk::args::moduledoc::punkexe +#[list_begin itemized] + +package require Tcl 8.6- +#*** !doctools +#[item] [package {Tcl 8.6}] + +#*** !doctools +#[list_end] + +# ++ +++ +++ +++ +++ +++ +++ +++ +++ +++ +++ + +#*** !doctools +#[section API] + + +tcl::namespace::eval punk::args::moduledoc::punkexe { + # ++ +++ +++ +++ +++ +++ +++ +++ +++ +++ +++ + # Base namespace + # ++ +++ +++ +++ +++ +++ +++ +++ +++ +++ +++ + #*** !doctools + #[subsection {Namespace punk::args::moduledoc::punkexe}] + #[para] punk::args definitions for the punk executable launch dispatch + #[list_begin definitions] + + variable PUNKARGS + + namespace eval argdoc { + #Top-level launch dispatch (kit boot script punk_main.tcl, mirrored in + #project_main.tcl for generated projects). Display-first definitions: + #the dispatch itself does not parse via punk::args yet (goal G-032). + # -- --- --- --- --- --- --- --- --- --- --- --- --- --- + lappend PUNKARGS [list { + @id -id (script)::punkexe + @cmd -name punkexe\ + -summary\ + "punk executable launch: package modes and subcommand dispatch."\ + -help\ + "Launch surface of the punk shell executables ('' below + stands for any punk kit executable, e.g punk905, or a generated + project's kit). + + An optional FIRST argument selects package modes: one or more of + the tokens dev, os, src, internal joined with '-' when combined + (e.g 'dev', 'src', 'dev-src'). Modes decide which module sources + the shell trusts and their precedence; 'internal' (kit-bundled + modules) is always appended when absent. Details: bin/AGENTS.md + 'launch package modes' in the punkshell source tree. + + The next argument selects a subcommand from the choices below. + When the first non-mode argument is not a known subcommand: + with no arguments at all the interactive punk shell is launched + ('shell'); any other first argument is treated as a script + invocation (handled as for the 'script' subcommand)." + @form -synopsis " ?packagemode? ?subcommand? ?arg ...?" + @leaders -min 0 -max 1 + subcommand -type string -optional 1 -choicerestricted 0 -choices {tclsh script shell punk shellspy} -choicelabels { + tclsh + " Run as a (near) stock tclsh - no punk modules loaded." + script + " Run a script non-interactively in the punk script environment; honest exit codes." + shell + " Interactive punk shell (repl); can run a script first and stay interactive." + punk + " punk shell launch; piped-stdin friendly (echo cmds | punk)." + shellspy + " Experimental shellspy command-line processor." + } -help\ + "Subcommand to run. Each subcommand's own contract is documented + under its definition id (script)::punkexe::." + @values -min 0 -max -1 + arg -type any -optional 1 -multiple 1 -help\ + "Arguments for the selected subcommand." + }] + # -- --- --- --- --- --- --- --- --- --- --- --- --- --- + + #tclsh subcommand: full contract (G-118). The documented-as-intended + #divergences below record G-118 item decisions: item 2 (tcl_interactive + #early link), item 6 (piped whole-buffer eval + honest exit codes), + #item 8 (istty read-only by convention). The 'no -e one-liner' note is + #the G-077 boundary: stock parity INSIDE this subcommand is deliberate; + #one-liner affordances belong to the top-level/'script' surfaces (G-077). + # -- --- --- --- --- --- --- --- --- --- --- --- --- --- + lappend PUNKARGS [list { + @id -id (script)::punkexe::tclsh + @cmd -name "punkexe tclsh"\ + -summary\ + "Run the punk executable as a (near) stock tclsh - no punk modules."\ + -help\ + "Run the executable as a plain tclsh: no punk modules are loaded + and behaviour matches stock 'tclsh' as closely as the kit boot + allows. The subcommand is an EXTENSION of standard tclsh + behaviour, not an exact emulator - the divergences are listed + below and are intended. + + Stock argument-form parity (tclMain.c): the only recognised + leading option is '-encoding name scriptfile', and only when + scriptfile does not itself begin with '-'. Any other leading '-' + argument means NO script file: all arguments stay in ::argv and + input comes from stdin. In particular there is no -e/-c + one-liner flag - ' tclsh -e (script)' puts '-e' and the + script text into ::argv and reads stdin, exactly like stock + tclsh. That parity is deliberate; one-liner affordances belong + to the punk-level launch surfaces, not this subcommand. + + A scriptfile of the form 'lib:name' is refused with a pointer to + the 'script' subcommand: scriptlib resolution is a punk + facility and the tclsh subcommand keeps plain-tclsh semantics. + A missing scriptfile is a clean error (exit 1); errors raised by + an existing script keep their full trace. + + Piperepl runtimes: kits on a 'punk' family runtime carry the + TCLSH_PIPEREPL patch (disable with env TCLSH_PIPEREPL=0; a kit + on an unpatched runtime notes the missing patch on stderr for + the forms that would use it). With the gate open the runtime + publishes launch state in the ::tclsh array before any script + runs: + istty launch-time fact: was stdin a tty? Never updated + afterwards (still 0 after a console reopen). + Read-only by convention - no readonly trace is + installed; a script write corrupts the + Tcl-visible value without affecting behaviour. + Its existence is also the patch-presence probe. + dorepl linked control: a script (or piped input) sets + this to 1 to enter the interactive repl after + the script/stdin completes - on piped launches + stdin is reopened from the console (CONIN$ on + windows, /dev/tty elsewhere). + evalinput linked control: piped input a script-arg run + did not consume is BUFFERED, not evaluated, + unless the script sets evalinput to 1. + inputbuffer set at console reopen: holds the unconsumed + piped input. + reopened 0 at gate-open startup; republished as 1 after + a successful console reopen. + Env TCLSH_PIPEREPL_DEBUG=1 enables patch diagnostics on stderr + (e.g the console-reopen notice, silent by default). + + Intended divergences from stock tclsh: + - tcl_interactive: with the piperepl gate open it is linked + to the tty flag BEFORE the startup script runs; a + script-arg launch from a console therefore reads 1 where + stock reads 0 (piped launches read 0 either way). The + early link is load-bearing: a piped script that sets + dorepl writes ::tcl_interactive to opt into prompts/echo + in the reopened repl. + - piped no-arg evaluation WITHOUT the machinery (unpatched + runtime, or TCLSH_PIPEREPL=0): stdin is read to eof and + evaluated as one script - output appears at eof on slow + pipes, a mid-script error aborts the remainder, and the + exit code is honest (nonzero on error) where stock tclsh + streams per command, continues after errors and exits 0. + (With the machinery present, evaluation is the stock + per-command repl loop.) On machinery-less runtimes the + interactive form (console stdin, no script) fails fast + with a usage error instead of blocking in a console read." + + @form -form {scriptfile} -synopsis " tclsh ?-encoding name? scriptfile ?arg ...?" + @leaders -min 0 -max 0 + @opts + -encoding -type string -optional 1 -typesynopsis name -help\ + "Encoding used to read scriptfile (as for 'source -encoding'). + Recognised only immediately after 'tclsh' and only when the + following argument does not begin with '-'; an incomplete + -encoding form falls through to the no-script form (stock + behaviour)." + @values -min 1 -max -1 + scriptfile -type string -optional 0 -help\ + "Script file to source and exit. ::argv0 and 'info script' are + the (normalized) script path; remaining args are ::argv. The + script may set ::tclsh(dorepl) 1 (piperepl runtimes) to enter + the interactive repl after it completes." + arg -type any -optional 1 -multiple 1 -help\ + "Arguments passed to the script in ::argv." + + @form -form {stdin} -synopsis " tclsh ?arg ...?" + @values -min 0 -max -1 + arg -type any -optional 1 -multiple 1 -help\ + "With no script file all arguments (including any leading '-' + arguments) stay in ::argv; ::argv0 is the executable path. + Input comes from stdin: the interactive repl on a console + (piperepl runtimes), evaluation of piped input otherwise." + }] + # -- --- --- --- --- --- --- --- --- --- --- --- --- --- + + #Sibling subcommands: summary-level contracts. Deep punk::args parse + #definitions for these surfaces are G-032's lane ('script' is its + #natural first parsed subcommand). + # -- --- --- --- --- --- --- --- --- --- --- --- --- --- + lappend PUNKARGS [list { + @id -id (script)::punkexe::script + @cmd -name "punkexe script"\ + -summary\ + "Run a script non-interactively in the punk script environment."\ + -help\ + "Run a Tcl script and exit with an honest exit code + (app-punkscript): script errors exit nonzero and the launch + plumbing emits nothing of its own on stdout/stderr, so + exec-style callers see only the script's output. The default + punk module/alias environment is loaded (unlike 'tclsh'). + + The script comes from the file argument, from piped stdin when + no argument is given (terminal stdin without a script argument + is a usage error - no interactive fallback), or via scriptlib + resolution when the argument has the form 'lib:name' (resolved + from the scriptlib locations associated with the executable, + including extensionless and shebang'd scripts)." + @form -synopsis " script ?scriptfile|lib:name? ?arg ...?" + @values -min 0 -max -1 + scriptfile -type string -optional 1 -help\ + "Script file path, or lib:name for scriptlib resolution. + Omitted: the script is read from piped stdin." + arg -type any -optional 1 -multiple 1 -help\ + "Arguments passed to the script in ::argv." + }] + # -- --- --- --- --- --- --- --- --- --- --- --- --- --- + lappend PUNKARGS [list { + @id -id (script)::punkexe::shell + @cmd -name "punkexe shell"\ + -summary\ + "Interactive punk shell (repl)."\ + -help\ + "Launch the interactive punk shell (app-punkshell). With + arguments, a script can be run first with the interactive + shell maintained afterwards. This is also the default when the + executable is launched with no arguments at all." + @form -synopsis " shell ?arg ...?" + @values -min 0 -max -1 + arg -type any -optional 1 -multiple 1 -help\ + "Arguments passed through to the shell launch." + }] + # -- --- --- --- --- --- --- --- --- --- --- --- --- --- + lappend PUNKARGS [list { + @id -id (script)::punkexe::punk + @cmd -name "punkexe punk"\ + -summary\ + "punk shell launch; piped-stdin friendly."\ + -help\ + "Launch the punk shell. With arguments the app-punkshell launch + path is used (as for 'shell'); without arguments the + interactive shell is launched directly. Commands piped into + stdin are supported (e.g: echo 'puts hello' | punk) + and stderr is kept clean of launch chatter so exec-style + callers do not misreport failure." + @form -synopsis " punk ?arg ...?" + @values -min 0 -max -1 + arg -type any -optional 1 -multiple 1 -help\ + "Arguments passed through to the shell launch." + }] + # -- --- --- --- --- --- --- --- --- --- --- --- --- --- + lappend PUNKARGS [list { + @id -id (script)::punkexe::shellspy + @cmd -name "punkexe shellspy"\ + -summary\ + "Experimental shellspy command-line processor."\ + -help\ + "Pass all arguments to the experimental shellspy command-line + processor (app-shellspy). Note: 'shellspy' is only this launch + subcommand - it is not the project name (the project is + punkshell)." + @form -synopsis " shellspy ?arg ...?" + @values -min 0 -max -1 + arg -type any -optional 1 -multiple 1 -help\ + "Arguments for the shellspy processor." + }] + # -- --- --- --- --- --- --- --- --- --- --- --- --- --- + } + + #*** !doctools + #[list_end] [comment {--- end definitions namespace punk::args::moduledoc::punkexe ---}] +} + +# ----------------------------------------------------------------------------- +# register namespace(s) to have PUNKARGS,PUNKARGS_aliases variables checked +# ----------------------------------------------------------------------------- +# variable PUNKARGS +# variable PUNKARGS_aliases +namespace eval ::punk::args::register { + #use fully qualified so 8.6 doesn't find existing var in global namespace + lappend ::punk::args::register::NAMESPACES ::punk::args::moduledoc::punkexe ::punk::args::moduledoc::punkexe::argdoc +} +# ----------------------------------------------------------------------------- + +# ++ +++ +++ +++ +++ +++ +++ +++ +++ +++ +++ +## Ready +package provide punk::args::moduledoc::punkexe [tcl::namespace::eval punk::args::moduledoc::punkexe { + variable pkg punk::args::moduledoc::punkexe + variable version + set version 0.1.0 +}] +return + +#*** !doctools +#[manpage_end] diff --git a/src/vfs/_vfscommon.vfs/modules/punk/mix/templates-0.2.0.tm b/src/vfs/_vfscommon.vfs/modules/punk/mix/templates-0.2.0.tm index 2a452ae9eb2a8801b7e7f75aefb23029caa34a23..65c4a3150e0fd942f51e16187f4bec77ddc17314 100644 GIT binary patch delta 30387 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�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 diff --git a/src/vfs/_vfscommon.vfs/modules/punk/repl-0.5.2.tm b/src/vfs/_vfscommon.vfs/modules/punk/repl-0.5.3.tm similarity index 99% rename from src/vfs/_vfscommon.vfs/modules/punk/repl-0.5.2.tm rename to src/vfs/_vfscommon.vfs/modules/punk/repl-0.5.3.tm index be2506bc..911a7d4e 100644 --- a/src/vfs/_vfscommon.vfs/modules/punk/repl-0.5.2.tm +++ b/src/vfs/_vfscommon.vfs/modules/punk/repl-0.5.3.tm @@ -4290,6 +4290,7 @@ namespace eval repl { package require punk::lib package require punk::args catch {package require punk::args::moduledoc::tclcore} ;#while tclcore is highly desirable, and should be installed with punk::args - it's not critical + catch {package require punk::args::moduledoc::punkexe} ;#launch subcommand family documentation (G-118) - not critical package require textblock } @@ -4470,6 +4471,7 @@ namespace eval repl { catch {package require punk::args::moduledoc::parser} #----------- catch {package require punk::args::moduledoc::tclcore} ;#while tclcore is highly desirable, and should be installed with punk::args - it's not critical + catch {package require punk::args::moduledoc::punkexe} ;#launch subcommand family documentation (G-118) - not critical } errM]} { puts stderr "========================" puts stderr "code interp error:" @@ -4565,7 +4567,7 @@ namespace eval ::punk::args::register { package provide punk::repl [namespace eval punk::repl { variable version - set version 0.5.2 + set version 0.5.3 }] #repl::start $program_read_stdin_pipe