You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
New tcl f5 CLI suite for working with BIG-IP configurations. The
initial drop ships 17 top-level verbs plus 5 irule sub-verbs covering the
full operator lifecycle:
Acquire: fetch (pull SCF/UCS from a live BIG-IP via REST or SSH), extract / ucs2scf (unpack a local UCS archive into SCF).
Analyse: stats, graph (DOT / JSON / Mermaid dependency graphs), explain, diff (semantic, ignores ordering and iRule whitespace), validate / lint (with a built-in rule registry, irule lint,
SARIF output), cleanup (find and remove unreferenced objects), and grep (find every object related to a name, regex, or CIDR).
Transform: rename, redact (stable, reversible IP redaction with
a sidecar map and CIDR-relationship preservation), unredact, pcap-remap (apply a redaction map to a PCAP / PCAPNG capture, including
F5 trailer rewrites), tmsh / scf2tmsh, split, merge, convert.
Round-trip: pull, push (single-object iControl REST round-trip),
plus irule trace and irule extract for iRule-focused inspection.
New f5 explain-flow and f5 explain-pcap verbs trace a request
or PCAP flow through the BIG-IP configuration — virtuals, profile chains,
iRule decisions, LTM policy decisions, pools, and members — and narrate
the path. Ships alongside an installable Claude skill at ai/claude/skills/explain-flow/ that shares its narration prompt with
the CLI.
New f5 enrich-pcapng and f5 enrich-wireshark verbs annotate
packet captures with BIG-IP object metadata.
New LTM policy parser and evaluator — parses ltm policy stanzas
into a structured model and evaluates rules against captured request
state, with first-match / all-match / best-match strategies and a
reasonable operand surface (HTTP host/URI/method/header, SNI, TCP
address) and action surface (forward, redirect, URI replace, header
insert/remove, TCP reset).
New tcl completion verb emits bash / zsh / fish completion scripts
for the tcl CLI, with a --hint flag for the install snippet.
New string insert command and relative-qualified ensemble dispatch
(tcl::string::reverse etc. now work without a leading ::).
Tier-5 parity for string is and format brings the WASM runtime up
to Tcl 9.0 semantics: full class table for string is (including dict, list, wordchar, entier, true, false, prefix matching, -strict, -failindex); full format specifier surface (#, , b, u, p, h, hh, %c Unicode, positional %n$, alt-form hex,
Tcl-style 0 / - flag interaction, missing-arg / mid-spec / mix
errors).
Improvements
Closed all 77 bytecode-identity xfails: proc lifting, switch lowering,
and the rest of the codegen pipeline now match tclsh 9.0 byte-for-byte
across the reference snippet suite.
WASM codegen now supports dynamic variable names — set ::$n v, incr ::$n, lappend $local x and friends route through the runtime
variable resolver instead of being collapsed to a literal slot.
Five Tier-2 WASM trap stems (parse, error, cmdAH, cmdIL, list)
now run end to end, adding 4316 newly-passing tcltest cases against the
Tcl 9 baseline (cmdAH alone contributes 3885).
test-slow now provisions missing host dependencies (tclsh 8.6 / 9.0, Node / npm, kotlinc) idempotently across Debian/Ubuntu, RHEL
family, and macOS, captures missing Tcl 9.0 bytecode reference files,
and fetches dependencies in parallel.
The MCP server (ai/mcp/tcl_mcp_server.py) exposes the new f5 verbs
to AI-assisted workflows.
Bug Fixes
return -code error / compiled INST_RETURN_IMM — corrected the stack
contract so the result value is read from OBJ_UNDER_TOS and the options
dict from OBJ_AT_TOS, matching tclsh. Fixes empty-message errors
from compiled error calls.
{*} expansion inside command substitutions no longer drops arguments.
for and mathop honour next-clause break / continue control codes,
and shift-count validation matches the INT_MAX cap that Tcl 9 enforces
in INST_LSHIFT / INST_RSHIFT.
Array-reference codegen — bare $arr(idx) with a literal index now
normalises to ${arr(idx)} so it compiles to an array load, while
substituted-index forms ($a(\$cmd)) still round-trip correctly.
Indirect set $expr value now evaluates the variable name at runtime
instead of being treated as a literal.
namespace origin and namespace forget now match Tcl 9 semantics: origin walks the imported-command redirect chain to its source FQN,
and forget properly tombstones the importing namespace's command
table so a follow-up rename no longer fails with "command already
exists".
Variable-trace callbacks now receive the full op word (read / write
/ unset / array) instead of the internal single-character code, and
callbacks that capture $op into long-lived variables no longer dangle
into freed parser buffers.
info locals returns the active proc frame's local names (it
previously fell through to the empty-string fallback).
Breaking Changes
The irule CLI binary alias is removed. iRules-specific verbs
(event-order, event-info) move to f5 irule … sub-verbs and default
to the f5-irules dialect; generally useful verbs (command-info, convert, help, diff, the core analysis verbs) stay on tcl and
continue to accept --dialect f5-irules for iRules input.