From 400398ca7d46916f3c1354acc2cb0568b3d3bb78 Mon Sep 17 00:00:00 2001 From: Clover Date: Mon, 8 Jun 2026 20:21:32 -0700 Subject: [PATCH] =?UTF-8?q?v0.9.6:=20`help`=20canonical=20+=20prefix-free?= =?UTF-8?q?=20short=20commands=20(nc-find=E2=86=92nfind=20guard)=20+=20HCI?= =?UTF-8?q?SITEDIR=20auto-init?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Hands-on ergonomics for Bryan's Gundersen testing. All three changes are backward-compatible — every old name still works. 1. `help` is now the canonical reference command (live, never-drifts table from bin/ + each tool's help block). `cheat` kept as a thin alias. 2. Prefix-free short commands: nc-table→table, nc-parse→parse, nc-msgs→msgs, nc-status→status, nc-engine→engine, nc-xlate→xlate, nc-inbound→inbound, plus the write tools (create-thread, set-field, insert-protocol, make-jump, provision-jumps, tclgen, document, revisions, diff-interface, smat-diff, regression). COLLISION GUARD: nc-find→`nfind` (NOT `find` — would shadow the system find on PATH); nc-paths keeps `paths`. Every nc-* name retained as a backward-compat alias. Tab-completion + the help/cheat table updated. 3. HCISITEDIR auto-init in the shared preflight (bin/_nc_common.sh): HCIROOT + HCISITE still required, but $HCIROOT/$HCISITE is created if missing rather than erroring. Conservative + idempotent; respects an operator-set HCISITEDIR. VERSION→0.9.6, MANIFEST regenerated (--check clean), bash -n clean. Co-Authored-By: Clover (Claude Opus 4.8) --- CHANGELOG.md | 35 +++++++ MANIFEST | 83 +++++++++------ VERSION | 2 +- bin/_nc_common.sh | 39 +++++++ bin/cheat | 198 +---------------------------------- bin/create-thread | 10 ++ bin/diff-interface | 10 ++ bin/document | 10 ++ bin/engine | 10 ++ bin/help | 229 +++++++++++++++++++++++++++++++++++++++++ bin/inbound | 10 ++ bin/insert-protocol | 10 ++ bin/make-jump | 10 ++ bin/msgs | 10 ++ bin/nc-completion.bash | 32 +++++- bin/nc-create-thread | 11 +- bin/nc-diff-interface | 11 +- bin/nc-document | 11 +- bin/nc-engine | 11 +- bin/nc-find | 11 +- bin/nc-inbound | 11 +- bin/nc-insert-protocol | 11 +- bin/nc-make-jump | 11 +- bin/nc-msgs | 11 +- bin/nc-parse | 11 +- bin/nc-paths | 11 +- bin/nc-provision-jumps | 11 +- bin/nc-regression | 11 +- bin/nc-revisions | 11 +- bin/nc-set-field | 11 +- bin/nc-smat-diff | 11 +- bin/nc-status | 11 +- bin/nc-table | 11 +- bin/nc-tclgen | 11 +- bin/nc-xlate | 11 +- bin/nfind | 10 ++ bin/parse | 10 ++ bin/provision-jumps | 10 ++ bin/regression | 10 ++ bin/revisions | 10 ++ bin/set-field | 10 ++ bin/smat-diff | 10 ++ bin/status | 10 ++ bin/table | 10 ++ bin/tclgen | 10 ++ bin/xlate | 10 ++ install-larry.sh | 5 +- larry.sh | 2 +- 48 files changed, 689 insertions(+), 346 deletions(-) create mode 100755 bin/create-thread create mode 100755 bin/diff-interface create mode 100755 bin/document create mode 100755 bin/engine create mode 100755 bin/help create mode 100755 bin/inbound create mode 100755 bin/insert-protocol create mode 100755 bin/make-jump create mode 100755 bin/msgs create mode 100755 bin/nfind create mode 100755 bin/parse create mode 100755 bin/provision-jumps create mode 100755 bin/regression create mode 100755 bin/revisions create mode 100755 bin/set-field create mode 100755 bin/smat-diff create mode 100755 bin/status create mode 100755 bin/table create mode 100755 bin/tclgen create mode 100755 bin/xlate diff --git a/CHANGELOG.md b/CHANGELOG.md index 6a11544..df03c7c 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,6 +4,41 @@ All notable changes to `cloverleaf-larry` / `larry-anywhere` are recorded here. Versioning is loose-semver; bumps trigger the in-process self-update on every running client via `LARRY_BASE_URL` + `MANIFEST`. +## v0.9.6 — 2026-06-08 + +Hands-on ergonomics for Bryan's Gundersen testing (Clover). Three changes, all +backward-compatible — every old name still works. + +- **`help` is the canonical command** (twin of `cheat`). Same live, never-drifts + table generated from the `bin/` wrapper set + each tool's help block. `cheat` + is kept as a thin alias (`cheat` now execs `help`), so existing docs/muscle + memory are unaffected. `help ` and `help -h` behave like the `cheat` + equivalents; `help nc-table` / `help nc-find` map to the canonical `table` / + `nfind` rows. +- **Prefix-free short commands** — the `nc-*` on-PATH commands lost the prefix + for faster manual typing: `nc-table`→`table`, `nc-parse`→`parse`, + `nc-msgs`→`msgs`, `nc-status`→`status`, `nc-engine`→`engine`, `nc-xlate`→`xlate`, + `nc-inbound`→`inbound`, plus the write tools (`create-thread`, `set-field`, + `insert-protocol`, `make-jump`, `provision-jumps`, `tclgen`, `document`, + `revisions`, `diff-interface`, `smat-diff`, `regression`). + - **COLLISION GUARD:** `nc-find`'s prefix-free name is **`nfind`**, NOT `find` + — a bare `find` would shadow the system `find(1)` on PATH. (`nc-paths` keeps + its existing prefix-free name `paths`; `where`/`tbn`/`tbp`/`tbh`/`tbpr` + unchanged.) All other target names (`table`, `parse`, `status`, …) were + verified NOT to collide with a common system command. + - Every old `nc-*` name is retained as a **backward-compat alias** (thin wrapper + that execs the new short command), so existing scripts and habits keep working. + - Tab-completion and the live `help`/`cheat` table updated to the new names; + `nc-*` aliases are hidden from the table (shown once, canonically) but still + complete and still resolve under `help nc-`. +- **`HCISITEDIR` auto-init** — `$HCIROOT` and `$HCISITE` are still required (the + tools error as before if unset), but `$HCISITEDIR="$HCIROOT/$HCISITE"` is now + **created automatically if missing**, in the shared preflight every wrapper + sources (`bin/_nc_common.sh::_nc_init_sitedir`). Conservative: acts only when + both `HCIROOT` (a real dir) and `HCISITE` are set; respects an operator-set + `HCISITEDIR`; idempotent; mkdir failure is a non-fatal warning so the tool's + own clearer error still surfaces. + ## v0.9.5 — 2026-06-08 **`cheat` — a one-screen, never-drifts reference for every short command — plus a diff --git a/MANIFEST b/MANIFEST index 163fd9c..1089332 100644 --- a/MANIFEST +++ b/MANIFEST @@ -23,17 +23,17 @@ # scripts/make-manifest.sh and bump VERSION. # Top-level scripts -larry.sh 93e72650cf031ea3ec6a3cce3a323d2a712bfd7a1cbaed15eac9e0da9cc8f824 +larry.sh 81a87ab2232c202990933ccc82c12b125c69ff1b41e65e9c12ee63f88b57128c larry-tunnel.sh 6b050e4eeab15669f4858eaf3b807f168f211ced07815db9521bc40a093f6aaa larry-auth.sh a220cdf7878569dc3028951ee57fc8d5e706a8ca5c6aa45347b58facb386f831 larry-rollback.sh 91b5e9aa6c79266bf306dcfba4ca791c07971bd6924d67a779037531648aa6d0 -install-larry.sh b7ca41ac5b6e3a687ba22d1246dc102fe70a3ed47d6d0a3b0fdedb44cb37debd +install-larry.sh daf2814a41052783cd8bf4252cec9276878860be8945a7fe678182c51d7eac05 uninstall-larry.sh c53ad2d8354c7adeb243b541f027f3f481e4a8661eecfd7af14d7ca53cfcaad9 # Metadata -VERSION 8780409dbc52c96276102c5a079a7d3e325510d7bf87af5257508ecc088a3730 +VERSION fd51233354c9a61adaf49572b45f44f7e9cc76fc2465ea25beca00ef95856ee1 MANUAL.md 5ff54d6d5fae826f8b3da1eb3be6476076bb15f9b1417a4de285e59ea37e1b1f -CHANGELOG.md 75e80341189204a3320eb60da1db7c190b5e34f94c3359895ef2744153107dcd +CHANGELOG.md 8573fa4c1911f665f71f792d992ab331e5bb2aa5462ebd29c12994781588843e # Agent personas (system-prompt overlays) agents/larry.md 0a1ef737e7fc133ab35be09f79c3a4df33de814e0404b69b950932d0c8a01be1 @@ -123,11 +123,36 @@ lib/nc-regression.sh 70999a60608439f7bf1a3abb9f5e9854b5ea03025ef29ddbca683896346 # … run directly (no `larry tools` prefix). _nc_common.sh is the shared # resolver (sourced, not a command); nc-completion.bash is the 3-level # (command/site/thread) completion, enumerated LIVE from the NetConfig tree. -bin/_nc_common.sh 591b60d091e9c8a5e1068844dffe2e19f44d262fcf1132dc47e425d4673495e1 -bin/nc-completion.bash 3a5b1b29f34f2382556d9f8620882ab7edbb2d27dfa35177793889b289d22a9a -# v0.9.5: `cheat` — one-screen reference generated LIVE from this bin/ set + -# each tool's help block (never drifts). On PATH; `cheat`, `cheat `, -h. -bin/cheat 94a164da2aebe15b68f52ed675ff75547235c35eaa25f96df73fbe1c695b93a2 +bin/_nc_common.sh 7afcafbb38b8e2554858e5c2825cd56c8694d2e3b8ecb72526ae9cb8b88eb34d +bin/nc-completion.bash e2de2938bf358145583967b3b124f75911a4877340cd280e2c69c6ea4300352d +# v0.9.5/0.9.6: `help` — one-screen reference generated LIVE from this bin/ set + +# each tool's help block (never drifts). On PATH; `help`, `help `, -h. +# `cheat` is a kept backward-compat alias of `help` (same output). +bin/help f8e6f48f5266922b9bf9d1ce15b96527540604e580c0134e8a64c44091130be7 +bin/cheat 578d6de462b1875853a58f4dbe75a695d8ea9a8603f1428de0b59727294882a8 +# v0.9.6: prefix-free short commands (drop the nc- prefix for hands-on typing). +# `find` would shadow system find, so nc-find's prefix-free name is `nfind`. +bin/parse 09b6d35dc63299f48729eff89e021d04e0c0c55ef8281f2452158c5c3e81bf9f +bin/nfind 0f4fe1d63e22dca42e76225ada005f336f67dfea4f432ed7749cef76c300c9c3 +bin/inbound d278a1713592c95be8687ac7ea0932305baf4bbddf69469388bfcfeb05c800d0 +bin/status 44a031a05a37d2000f37653201daeac47bf9dc2d5c33e9746d8a78b267ab5097 +bin/engine 45de61808ce7c71ef66caead52f7d44dec5bd7d9e2caa531d9f8bc179a050b93 +bin/xlate 93b8833e9ab3529f754e8c2c17d0760aa0e955796ef2db1f8c54510c67a22214 +bin/table 7c19ba0366dd9dd8114a4474b4cc9a7a700049c6154d35210b0e2851d48131e1 +bin/msgs f39831ecea2f0e1ae5a8cf67661d0d98b78ffd47a6262816acd8857e858a70a5 +bin/create-thread d4ff24af4bea42f2df9be8a64e4594fddccd4f2a946ebd7d29021817d9e76d5f +bin/set-field ced157e7c993a1ca244e953cbf32c0ee954a77d49d15ea1a67481b6b5b1ef242 +bin/insert-protocol 018ed84e4dc2e7648e39e6968d82f278233cafdd1ec8472cc895d5ed0ec34bcf +bin/make-jump c7fe79a759036874e57dcadb58b1f88f3628e027478beda461bdd258b12e4ff0 +bin/provision-jumps b1e97976988e66fed71ebcb71ceadda1a8d542fff9dde3953f5d916d10dad090 +bin/tclgen e159d7e36d93ab6dcf4a94cb795f33341282b5b9eddb3cd0f1d18dff13180c20 +bin/document ce361ab92b2e236cf3598c24891b2088c844eb7cd35650bb5b632a3ded3ca6bb +bin/revisions ed9227b4130e60e7097b614a5a93fd3d3e8ca848d4c47fd35abf478242cb4d6d +bin/diff-interface 39a52186475e5983bf72295f672e2bc5d2b449e3298940b8883bbf8a37c62c3f +bin/smat-diff d553aa6d169ba98f11ea5f63f32f15e5bfcc77ad2a570288d739cd675307a94d +bin/regression 2adf5ade4199077ccf6a0b8426f83ac15531d9dabe74084b98bb305dec5ee160 +# v0.9.4 short commands + v0.9.6 nc-* are now backward-compat ALIASES of the +# prefix-free names above (so existing muscle memory / scripts keep working). bin/tbn 60e69288a502f1280e6bf4bc6dc19568858b34024ba26c34f8ff7ed52457d02c bin/tbp 8cdc82de0bbbee8da97d4ab958f7b5ead5aed8c7658c3d73ff9106df6383bf29 bin/tbh 79556fe72d58393c2a00e744b892c5a1a69bae3be6fcdd0ba46dd108ee67c092 @@ -135,26 +160,26 @@ bin/tbpr dca260c16e10944eaedbcb3c59f43e4631586d521742a2f124128ec4090bf117 bin/where 4a69061b9ab5b09d4d1ca6b48e1cf597d8c6c8ac88092e8e5a1d523a506de907 bin/paths 3abe6c6ff548f8df6a5df83d48da77bb4da4e39df1d2c3b04cd9960c5fde20a5 bin/route_test 75e0ee675dba3dec8f36d374ed62d7b4c006fc1516fbcc8364d22e842cea31f1 -bin/nc-parse c50ae884fdee50e9b089f0f92e3fd79d968b53f85c452a6d8a89a230bff12d29 -bin/nc-paths b6fb67cb97530f54c6efb6b2dadc41700b1f9c7b5599b9e6d5d166fd68789a72 -bin/nc-find b8298c8289bbb476f55ae142e41ae0432f6d2e5719ba1d95177ccf9299b3e6cf -bin/nc-inbound af62c41b1448fbad39135ffb8d3b0035ef17871249fa6ae99701c83c47c67c89 -bin/nc-status 73c4ae9dc92d4d86b660df3edc9c9207013188ab8bda18965559b7221cac607b -bin/nc-engine e774ab31685b7b9ff900605f6695c5b4430764903ea2a4ffc6bd60714f8f47fb -bin/nc-xlate 0336cc1fb3ef0985db91c8cc418b99ca03010b497d8d54b2b651367530ae86fa -bin/nc-table f069b95f6ca563d833f2c2b9ec77995918242a6bb501dfd52ad1aad1147a6305 -bin/nc-create-thread 81091802664449122cd30c7a1862220b7f8227cf26e54c300d29a449e242be88 -bin/nc-set-field 8254a6bcb205b0a23c211845413d0f954f160675b4b94a9443412a1747c18ac3 -bin/nc-insert-protocol 64052ef5ab2ea222866f4d4276d933e6467305520858ff6503a408bd7551e011 -bin/nc-make-jump e88b977c34fa326f0c32f434dafc61cf9782bf951b2904b02d6287523e4a0406 -bin/nc-provision-jumps f7b556099298c0b343b9f0698a9f5533533692095b62ffb0b145f00d1f7c720f -bin/nc-tclgen 789731c5509d7060ebc4b8a769d82fa620771af06be206e441be23929a66f947 -bin/nc-document 66f386d38ccca924d97a2935d8fc9fbcbf0aef6333f5193d340684667468d241 -bin/nc-revisions 0e2432045e722aa46380f3fbb55d8115668f9d6bf3eb00ba2ccb9e8513af5a44 -bin/nc-diff-interface ef07e61bc5a9c8f3c46b023a09d7ec2c7c43538e391a99dbc8cbabace6c9f850 -bin/nc-smat-diff 4e878b096c282a7f3cd36da73d05405d7cd82c198fd10c17b362e23743b75f43 -bin/nc-regression 070cf2e9f0f0339e7c387b60fcea0ba8dc58f0b7431c59272a3deb16e4876b7f -bin/nc-msgs 173e89bfc9fb1b86b1c27fe634b7560b25597621f47e5c38f35e7e3dbdec8a6e +bin/nc-parse a07676441b4fcc7a7e4d239adeec03ad659a4dcd91942f2dd52642c1e17d6657 +bin/nc-paths e0ad5d429f7beb417743164b04528a5434b5870040a24de13c6f10320cf5b148 +bin/nc-find f6a75598c914eb82f6d058508e421f7ae8b0988ea3ede7da0fcdf5f3040541c6 +bin/nc-inbound fbb4e05810e15ae28cc46d631d14d37f92e0bea46a02ff4e3a672bcd4948fb87 +bin/nc-status e54b3971619312557aa6bed9757e1cc9699bdaa97fe2bee6e201d76b08e6870c +bin/nc-engine 98f317a105b0e7657f0c17e1d1ebbb289bdd5ec850d526743b6888585e266944 +bin/nc-xlate a7d856fc83dead70362666e6b6a8069f35cc227c7707b89ace3f1d3dce27bfeb +bin/nc-table 0efea594b41f2fe536904b05fa919593aec10988cfc65c500724e198cd0873bf +bin/nc-create-thread b08827a522074821f664ff9a9878a35e2737888319540b8211944b76147aaf80 +bin/nc-set-field d2c364b4a1d2220af8353c35beeb77123602c9e7bc9d84007f3e503a0ee5f859 +bin/nc-insert-protocol d8a47d4093536c58a089a5fbc456d1eb968009910892fbfac4cb67f436821fa9 +bin/nc-make-jump 0bcffd2568d60238881c190f1a03264cf074e20ca80712d137094fb52eaa70c4 +bin/nc-provision-jumps 4396316ea4a90ee39b71421f46b3c0d147eb4899bb265fd7b03a5d58e935ea41 +bin/nc-tclgen 95156cc5dc9bc3d5c1cc7cfb6e0d679e4fb45ba18154dd631b56e802379c41a6 +bin/nc-document df587d8e7eabb9a53556ffc6f0dc3939a99c765705787ebcfe2f2294eb92a2d9 +bin/nc-revisions d6131e0d633e94be2fb580b56ed5adc17ad0053759c516bc2269c5946a289bc3 +bin/nc-diff-interface 61974a43c46c3ad84fa3a3c3d9d2e955dd2d00b318422a18012d8b66013f1d4b +bin/nc-smat-diff 46b00c00bd128bcccddf44a19b1948f5e70ba7c3f31e04259a3b2800436ae77b +bin/nc-regression 59a5f25fcea642433613f0933fe06dd9fa25b372e5d130e119cb466a076099bb +bin/nc-msgs 8a938cefedbb2bad9496c6f84831788b6ac45d34e8b16fc60d8aa47c25adea76 bin/hl7-field cb56984dfc9342563e05cdf0e3514a64df2099d24adeaa1d5b22cc6ce298eb73 bin/hl7-diff 2d965567ea4f737d97ea92313dfacd84b745cea74313d1be565a3234240b76f3 bin/len2nl d73136e353d7964f097b4a50993ba2a3364550e13b7ae5a1b43af00ed8eddbe3 diff --git a/VERSION b/VERSION index b0bb878..85b7c69 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -0.9.5 +0.9.6 diff --git a/bin/_nc_common.sh b/bin/_nc_common.sh index 44ad679..d9fb426 100755 --- a/bin/_nc_common.sh +++ b/bin/_nc_common.sh @@ -42,6 +42,45 @@ _nc_hciroot() { printf '%s' "${HCIROOT:-}"; return 0 } +# --- HCISITEDIR auto-init (v0.9.6) ------------------------------------------- +# Contract: $HCIROOT and $HCISITE are expected to ALREADY exist — the tools +# themselves still error if those are unset/missing (that check is intentional +# and unchanged). But $HCISITEDIR ("$HCIROOT/$HCISITE") is a DERIVED path the +# operator may not have created yet. Rather than letting a downstream tool die +# on a missing site dir, we materialize it here, in the one preflight every +# short-command wrapper sources. +# +# Safety rails (deliberately conservative — we never invent a path): +# • Only acts when BOTH $HCIROOT and $HCISITE are non-empty AND $HCIROOT is a +# real directory. If HCIROOT/HCISITE are unset/bogus we do NOTHING and let +# the tool's own preflight produce its usual, clearer error. +# • If $HCISITEDIR is already exported we respect it verbatim (operator override). +# • Creates the dir only if missing; idempotent; mkdir failure is non-fatal +# (warn once to stderr) so a read-only/edge env still reaches the tool. +# • Always exports HCISITEDIR so the backing lib tools (which read it) see it. +_nc_init_sitedir() { + # Respect an explicit operator-set HCISITEDIR. + if [ -n "${HCISITEDIR:-}" ]; then export HCISITEDIR; return 0; fi + local root="${HCIROOT:-}" site="${HCISITE:-}" + # Both must be present and HCIROOT must really exist — otherwise stay silent + # and let the tool's own "no \$HCIROOT / set HCISITE" error fire. + [ -n "$root" ] && [ -n "$site" ] && [ -d "$root" ] || return 0 + local sitedir="$root/$site" + if [ ! -d "$sitedir" ]; then + if mkdir -p "$sitedir" 2>/dev/null; then + printf 'cloverleaf-larry: created missing HCISITEDIR %s\n' "$sitedir" >&2 + else + printf 'cloverleaf-larry: warning — could not create HCISITEDIR %s (continuing)\n' "$sitedir" >&2 + # still export the intended value; the tool will report the real problem. + fi + fi + export HCISITEDIR="$sitedir" + return 0 +} +# Run at source time so every wrapper that dots this file gets HCISITEDIR ready +# before it execs the backing lib tool. +_nc_init_sitedir + # --- live site enumeration ---------------------------------------------------- # A "site" = an immediate subdir of $HCIROOT that contains a NetConfig file. # This is what nc-find / nc-paths actually walk, so completion stays truthful. diff --git a/bin/cheat b/bin/cheat index ccbbf5c..c3ac8f6 100755 --- a/bin/cheat +++ b/bin/cheat @@ -1,197 +1,9 @@ #!/usr/bin/env bash -# cheat — one-screen reference for ALL Cloverleaf-Larry short commands. -# Generated LIVE from the bin/ wrapper set + each tool's help block, so it can -# NEVER drift from what is actually installed on PATH. No static list. -# -# cheat # the full table: command · what it does · one example -# cheat tbn # just the row(s) whose name contains 'tbn' -# cheat hl7 # filter — every command matching 'hl7' -# cheat -h # this help -# -# For each command shown, `cheat` derives: -# • the description — from the wrapper's own `# name — …` header line, or (for -# the thin nc-*/hl7-* pass-through wrappers) from line 1 of -# the underlying lib/.sh, whichever is more specific. -# • ONE real example — the first indented `# …` example in the wrapper's -# help block; else the first `# Usage:` form of the backing -# lib tool, rewritten to the bare on-PATH command; else -# ` -h`. -# Run ` -h` (or ` --help`) on any row for the full, authoritative help. +# cheat — backward-compat ALIAS for `help` (v0.9.6). `help` is the canonical +# command; `cheat` is kept so existing muscle memory / docs keep working. All +# args pass straight through, so `cheat tbn`, `cheat hl7`, `cheat -h` behave +# exactly like the `help` equivalents. set -o pipefail - -# --- locate our own bin/ dir (follow one symlink level, like the wrappers) --- _self="${BASH_SOURCE[0]}"; [ -L "$_self" ] && _self="$(readlink "$_self")" _BINDIR="$(cd "$(dirname "$_self")" && pwd)" -# Reuse the shared lib resolver so the example-from-lib path finds lib/.sh. -[ -f "$_BINDIR/_nc_common.sh" ] && . "$_BINDIR/_nc_common.sh" - -if [ "${1:-}" = "-h" ] || [ "${1:-}" = "--help" ]; then - awk 'NR==1{next} /^#/{sub(/^# ?/,""); print; next} {exit}' "${BASH_SOURCE[0]}" - exit 0 -fi - -_filter="${1:-}" - -# Resolve the lib/ dir once (best-effort; example-from-lib degrades gracefully). -_LIB="" -if command -v _nc_resolve_lib >/dev/null 2>&1; then - _LIB="$(_nc_resolve_lib 2>/dev/null || true)" -fi - -# --- header line of a wrapper: the `# ` comment (line 2) ------- -# Returns the text after the em-dash separator. The codebase convention is a -# literal em-dash (—, U+2014) between the command name and its description; we -# split ONLY on that so hyphenated command names (csv-to-table, hl7-field) stay -# intact. A wrapper whose first comment has no em-dash yields no desc here (the -# caller then falls back to the backing lib tool's description). -_wrapper_desc() { - # LC_ALL=C → byte-oriented index()/substr() so the 3-byte em-dash (—) is - # skipped exactly (under a UTF-8 locale substr counts chars and over-skips). - LC_ALL=C awk ' - NR==1 { next } # shebang - /^#/ { - line = $0 - sub(/^# ?/, "", line) - i = index(line, "\xe2\x80\x94") # UTF-8 bytes for — (em-dash) - if (i > 0) { - rest = substr(line, i + 3) - sub(/^[[:space:]]+/, "", rest) - print rest - exit - } - } - !/^#/ { exit } - ' "$1" -} - -# Is this wrapper one of the thin pass-through wrappers whose own description is -# the generic boilerplate? If so we prefer the backing lib tool's description. -_is_boilerplate_desc() { - case "$1" in - *"direct, on-PATH wrapper for lib/"*) return 0 ;; - *) return 1 ;; - esac -} - -# Description of the backing lib tool (line 1 after its `# tool.sh — `). -_lib_desc() { - local tool="$1" f="$_LIB/$1.sh" - [ -n "$_LIB" ] && [ -f "$f" ] || return 1 - LC_ALL=C awk ' - /^#/ { - line = $0; sub(/^# ?/, "", line) - i = index(line, "\xe2\x80\x94") # UTF-8 bytes for — (em-dash) - if (i > 0) { - rest = substr(line, i + 3) - sub(/^[[:space:]]+/, "", rest) - print rest; exit - } - } - !/^#/ { exit } - ' "$f" -} - -# First indented `# …` example inside a wrapper's help block. The header -# line ("# — …") is excluded by requiring (a) at least TWO spaces after the -# `#` (real example blocks are indented `# …`) and (b) no em-dash on the -# line (the header carries the em-dash; example lines never do). -_wrapper_example() { - local cmd="$1" - LC_ALL=C awk -v cmd="$cmd" ' - NR==1 { next } - /^#/ { - raw = $0 - body = raw; sub(/^#/, "", body) # keep indentation - if (body !~ ("^[[:space:]][[:space:]]+" cmd "([[:space:]]|$)")) { next } - if (index(body, "\xe2\x80\x94") > 0) next # skip the header (has —) - sub(/^[[:space:]]+/, "", body) - sub(/[[:space:]]+#.*$/, "", body) # drop trailing "# comment" - print body; exit - } - !/^#/ { exit } - ' "$2" -} - -# First `# Usage:` form of the backing lib tool, rewritten to the bare command. -# e.g. " nc-find.sh --name PATTERN # …" -> "nc-find --name PATTERN" -_lib_example() { - local cmd="$1" tool="$2" f="$_LIB/$2.sh" - [ -n "$_LIB" ] && [ -f "$f" ] || return 1 - LC_ALL=C awk -v tool="$tool" -v cmd="$cmd" ' - /^#[[:space:]]*Usage:/ { inu=1; next } - inu && /^#/ { - line = $0; sub(/^#/, "", line) - if (line ~ /[^[:space:]]/) { - sub(/^[[:space:]]+/, "", line) - sub(/[[:space:]]+#.*$/, "", line) # drop trailing comment - if (line ~ ("^" tool "\\.sh")) { - sub("^" tool "\\.sh", cmd, line) # nc-find.sh … -> nc-find … - print line; exit - } - } - next - } - inu && !/^#/ { exit } - ' "$f" -} - -# --- gather the command list (skip helpers / sourced files / fetched bins) --- -_cmds=() -for _p in "$_BINDIR"/*; do - [ -f "$_p" ] && [ -x "$_p" ] || continue - _b="$(basename "$_p")" - case "$_b" in - _nc_common.sh|nc-completion.bash|cheat|jq|jq.exe) continue ;; - *.bash) continue ;; - esac - _cmds+=("$_b") -done - -# Sort for stable output. -IFS=$'\n' _cmds=($(printf '%s\n' "${_cmds[@]}" | sort)); unset IFS - -# --- build rows ------------------------------------------------------------- -_rows="" -for _c in "${_cmds[@]}"; do - if [ -n "$_filter" ] && ! printf '%s' "$_c" | grep -qiF "$_filter"; then - continue - fi - _wf="$_BINDIR/$_c" - - # description - _desc="$(_wrapper_desc "$_wf")" - if [ -z "$_desc" ] || _is_boilerplate_desc "$_desc"; then - _ld="$(_lib_desc "$_c")" - [ -n "$_ld" ] && _desc="$_ld" - fi - [ -z "$_desc" ] && _desc="(no description)" - # collapse whitespace, trim to one clause for the table - _desc="$(printf '%s' "$_desc" | tr -s '[:space:]' ' ' | sed 's/^ *//; s/ *$//')" - - # example - _ex="$(_wrapper_example "$_c" "$_wf")" - if [ -z "$_ex" ]; then - _ex="$(_lib_example "$_c" "$_c")" - fi - [ -z "$_ex" ] && _ex="$_c -h" - _ex="$(printf '%s' "$_ex" | tr -s '[:space:]' ' ' | sed 's/^ *//; s/ *$//')" - - _rows="${_rows}${_c}"$'\t'"${_desc}"$'\t'"${_ex}"$'\n' -done - -if [ -z "$_rows" ]; then - echo "cheat: no commands match '${_filter}'" >&2 - exit 1 -fi - -# --- render: aligned three-column table ------------------------------------- -printf 'Cloverleaf-Larry short commands (run -h for full help)\n\n' -printf '%s' "$_rows" | awk -F'\t' ' - { c[NR]=$1; d[NR]=$2; e[NR]=$3; n=NR; if (length($1)>w) w=length($1) } - END { - for (i=1;i<=n;i++) { - printf " %-*s %s\n", w, c[i], d[i] - printf " %-*s e.g. %s\n", w, "", e[i] - } - } -' +exec bash "$_BINDIR/help" "$@" diff --git a/bin/create-thread b/bin/create-thread new file mode 100755 index 0000000..244c4f7 --- /dev/null +++ b/bin/create-thread @@ -0,0 +1,10 @@ +#!/usr/bin/env bash +# create-thread — direct, on-PATH wrapper for lib/nc-create-thread.sh (no `larry tools` prefix needed). +# Short, prefix-free name (v0.9.6). Backward-compat alias: `nc-create-thread` (same tool). +# All args pass straight through; -h/--help is handled by the underlying tool. +set -o pipefail +_self="${BASH_SOURCE[0]}"; [ -L "$_self" ] && _self="$(readlink "$_self")" +. "$(cd "$(dirname "$_self")" && pwd)/_nc_common.sh" +lib="$(_nc_resolve_lib)" || { echo "create-thread: lib/ toolkit not found (set LARRY_LIB_DIR or LARRY_HOME)" >&2; exit 1; } +if [ $# -eq 0 ]; then exec bash "$lib/nc-create-thread.sh" --help; fi +exec bash "$lib/nc-create-thread.sh" "$@" diff --git a/bin/diff-interface b/bin/diff-interface new file mode 100755 index 0000000..90e9840 --- /dev/null +++ b/bin/diff-interface @@ -0,0 +1,10 @@ +#!/usr/bin/env bash +# diff-interface — direct, on-PATH wrapper for lib/nc-diff-interface.sh (no `larry tools` prefix needed). +# Short, prefix-free name (v0.9.6). Backward-compat alias: `nc-diff-interface` (same tool). +# All args pass straight through; -h/--help is handled by the underlying tool. +set -o pipefail +_self="${BASH_SOURCE[0]}"; [ -L "$_self" ] && _self="$(readlink "$_self")" +. "$(cd "$(dirname "$_self")" && pwd)/_nc_common.sh" +lib="$(_nc_resolve_lib)" || { echo "diff-interface: lib/ toolkit not found (set LARRY_LIB_DIR or LARRY_HOME)" >&2; exit 1; } +if [ $# -eq 0 ]; then exec bash "$lib/nc-diff-interface.sh" --help; fi +exec bash "$lib/nc-diff-interface.sh" "$@" diff --git a/bin/document b/bin/document new file mode 100755 index 0000000..b0ebf0a --- /dev/null +++ b/bin/document @@ -0,0 +1,10 @@ +#!/usr/bin/env bash +# document — direct, on-PATH wrapper for lib/nc-document.sh (no `larry tools` prefix needed). +# Short, prefix-free name (v0.9.6). Backward-compat alias: `nc-document` (same tool). +# All args pass straight through; -h/--help is handled by the underlying tool. +set -o pipefail +_self="${BASH_SOURCE[0]}"; [ -L "$_self" ] && _self="$(readlink "$_self")" +. "$(cd "$(dirname "$_self")" && pwd)/_nc_common.sh" +lib="$(_nc_resolve_lib)" || { echo "document: lib/ toolkit not found (set LARRY_LIB_DIR or LARRY_HOME)" >&2; exit 1; } +if [ $# -eq 0 ]; then exec bash "$lib/nc-document.sh" --help; fi +exec bash "$lib/nc-document.sh" "$@" diff --git a/bin/engine b/bin/engine new file mode 100755 index 0000000..8954a5a --- /dev/null +++ b/bin/engine @@ -0,0 +1,10 @@ +#!/usr/bin/env bash +# engine — direct, on-PATH wrapper for lib/nc-engine.sh (no `larry tools` prefix needed). +# Short, prefix-free name (v0.9.6). Backward-compat alias: `nc-engine` (same tool). +# All args pass straight through; -h/--help is handled by the underlying tool. +set -o pipefail +_self="${BASH_SOURCE[0]}"; [ -L "$_self" ] && _self="$(readlink "$_self")" +. "$(cd "$(dirname "$_self")" && pwd)/_nc_common.sh" +lib="$(_nc_resolve_lib)" || { echo "engine: lib/ toolkit not found (set LARRY_LIB_DIR or LARRY_HOME)" >&2; exit 1; } +if [ $# -eq 0 ]; then exec bash "$lib/nc-engine.sh" --help; fi +exec bash "$lib/nc-engine.sh" "$@" diff --git a/bin/help b/bin/help new file mode 100755 index 0000000..0cd1a55 --- /dev/null +++ b/bin/help @@ -0,0 +1,229 @@ +#!/usr/bin/env bash +# help — one-screen reference for ALL Cloverleaf-Larry short commands. +# Generated LIVE from the bin/ wrapper set + each tool's help block, so it can +# NEVER drift from what is actually installed on PATH. No static list. +# (Canonical command is `help`; `cheat` is a kept alias — same output.) +# +# help # the full table: command · what it does · one example +# help tbn # just the row(s) whose name contains 'tbn' +# help hl7 # filter — every command matching 'hl7' +# help -h # this help +# +# For each command shown, `help` derives: +# • the description — from the wrapper's own `# name — …` header line, or (for +# the thin nc-*/hl7-* pass-through wrappers) from line 1 of +# the underlying lib/.sh, whichever is more specific. +# • ONE real example — the first indented `# …` example in the wrapper's +# help block; else the first `# Usage:` form of the backing +# lib tool, rewritten to the bare on-PATH command; else +# ` -h`. +# Run ` -h` (or ` --help`) on any row for the full, authoritative help. +set -o pipefail + +# --- locate our own bin/ dir (follow one symlink level, like the wrappers) --- +_self="${BASH_SOURCE[0]}"; [ -L "$_self" ] && _self="$(readlink "$_self")" +_BINDIR="$(cd "$(dirname "$_self")" && pwd)" +# Reuse the shared lib resolver so the example-from-lib path finds lib/.sh. +[ -f "$_BINDIR/_nc_common.sh" ] && . "$_BINDIR/_nc_common.sh" + +if [ "${1:-}" = "-h" ] || [ "${1:-}" = "--help" ]; then + awk 'NR==1{next} /^#/{sub(/^# ?/,""); print; next} {exit}' "${BASH_SOURCE[0]}" + exit 0 +fi + +_filter="${1:-}" + +# v0.9.6: nc-* are backward-compat aliases hidden from the table, so a user who +# types `help nc-table` (old muscle memory) would otherwise get "no match". +# Translate an `nc-` filter to the canonical short name it aliases so the +# right row still shows: nc-find → nfind, every other nc-. +case "$_filter" in + nc-find) _filter="nfind" ;; + nc-paths) _filter="paths" ;; + nc-*) _filter="${_filter#nc-}" ;; +esac + +# Resolve the lib/ dir once (best-effort; example-from-lib degrades gracefully). +_LIB="" +if command -v _nc_resolve_lib >/dev/null 2>&1; then + _LIB="$(_nc_resolve_lib 2>/dev/null || true)" +fi + +# --- header line of a wrapper: the `# ` comment (line 2) ------- +# Returns the text after the em-dash separator. The codebase convention is a +# literal em-dash (—, U+2014) between the command name and its description; we +# split ONLY on that so hyphenated command names (csv-to-table, hl7-field) stay +# intact. A wrapper whose first comment has no em-dash yields no desc here (the +# caller then falls back to the backing lib tool's description). +_wrapper_desc() { + # LC_ALL=C → byte-oriented index()/substr() so the 3-byte em-dash (—) is + # skipped exactly (under a UTF-8 locale substr counts chars and over-skips). + LC_ALL=C awk ' + NR==1 { next } # shebang + /^#/ { + line = $0 + sub(/^# ?/, "", line) + i = index(line, "\xe2\x80\x94") # UTF-8 bytes for — (em-dash) + if (i > 0) { + rest = substr(line, i + 3) + sub(/^[[:space:]]+/, "", rest) + print rest + exit + } + } + !/^#/ { exit } + ' "$1" +} + +# Is this wrapper one of the thin pass-through wrappers whose own description is +# the generic boilerplate? If so we prefer the backing lib tool's description. +_is_boilerplate_desc() { + case "$1" in + *"direct, on-PATH wrapper for lib/"*) return 0 ;; + *) return 1 ;; + esac +} + +# Backing lib tool name for a wrapper (v0.9.6). The prefix-free short commands +# (table, nfind, …) no longer share a basename with their lib tool (table → +# lib/nc-table.sh), so we read the actual `lib/.sh` the wrapper execs from +# the wrapper body. Falls back to the command name (legacy 1:1 wrappers). +_backing_tool() { + local wf="$1" cmd="$2" t + t="$(LC_ALL=C sed -n 's#.*lib/\([A-Za-z0-9_-]\{1,\}\)\.sh.*#\1#p' "$wf" 2>/dev/null | head -1)" + [ -n "$t" ] && { printf '%s' "$t"; return 0; } + printf '%s' "$cmd" +} + +# Description of the backing lib tool (line 1 after its `# tool.sh — `). +_lib_desc() { + local tool="$1" f="$_LIB/$1.sh" + [ -n "$_LIB" ] && [ -f "$f" ] || return 1 + LC_ALL=C awk ' + /^#/ { + line = $0; sub(/^# ?/, "", line) + i = index(line, "\xe2\x80\x94") # UTF-8 bytes for — (em-dash) + if (i > 0) { + rest = substr(line, i + 3) + sub(/^[[:space:]]+/, "", rest) + print rest; exit + } + } + !/^#/ { exit } + ' "$f" +} + +# First indented `# …` example inside a wrapper's help block. The header +# line ("# — …") is excluded by requiring (a) at least TWO spaces after the +# `#` (real example blocks are indented `# …`) and (b) no em-dash on the +# line (the header carries the em-dash; example lines never do). +_wrapper_example() { + local cmd="$1" + LC_ALL=C awk -v cmd="$cmd" ' + NR==1 { next } + /^#/ { + raw = $0 + body = raw; sub(/^#/, "", body) # keep indentation + if (body !~ ("^[[:space:]][[:space:]]+" cmd "([[:space:]]|$)")) { next } + if (index(body, "\xe2\x80\x94") > 0) next # skip the header (has —) + sub(/^[[:space:]]+/, "", body) + sub(/[[:space:]]+#.*$/, "", body) # drop trailing "# comment" + print body; exit + } + !/^#/ { exit } + ' "$2" +} + +# First `# Usage:` form of the backing lib tool, rewritten to the bare command. +# e.g. " nc-find.sh --name PATTERN # …" -> "nc-find --name PATTERN" +_lib_example() { + local cmd="$1" tool="$2" f="$_LIB/$2.sh" + [ -n "$_LIB" ] && [ -f "$f" ] || return 1 + LC_ALL=C awk -v tool="$tool" -v cmd="$cmd" ' + /^#[[:space:]]*Usage:/ { inu=1; next } + inu && /^#/ { + line = $0; sub(/^#/, "", line) + if (line ~ /[^[:space:]]/) { + sub(/^[[:space:]]+/, "", line) + sub(/[[:space:]]+#.*$/, "", line) # drop trailing comment + if (line ~ ("^" tool "\\.sh")) { + sub("^" tool "\\.sh", cmd, line) # nc-find.sh … -> nc-find … + print line; exit + } + } + next + } + inu && !/^#/ { exit } + ' "$f" +} + +# --- gather the command list (skip helpers / sourced files / fetched bins) --- +_cmds=() +for _p in "$_BINDIR"/*; do + [ -f "$_p" ] && [ -x "$_p" ] || continue + _b="$(basename "$_p")" + case "$_b" in + # sourced helpers / fetched bins / the help command(s) themselves + _nc_common.sh|nc-completion.bash|help|cheat|jq|jq.exe) continue ;; + *.bash) continue ;; + # v0.9.6: nc-* are now backward-compat ALIASES of the prefix-free short + # commands (nc-table→table, nc-find→nfind, …). Hide the aliases from the + # table so each tool shows once, under its canonical short name. The user + # filter still finds them: `help nc-table` matches both the alias name and + # the (un-skipped) canonical row, but the row shown is the canonical one. + nc-*) continue ;; + esac + _cmds+=("$_b") +done + +# Sort for stable output. +IFS=$'\n' _cmds=($(printf '%s\n' "${_cmds[@]}" | sort)); unset IFS + +# --- build rows ------------------------------------------------------------- +_rows="" +for _c in "${_cmds[@]}"; do + if [ -n "$_filter" ] && ! printf '%s' "$_c" | grep -qiF "$_filter"; then + continue + fi + _wf="$_BINDIR/$_c" + + # backing lib tool (table -> nc-table, nfind -> nc-find, …; legacy 1:1 ok) + _tool="$(_backing_tool "$_wf" "$_c")" + + # description + _desc="$(_wrapper_desc "$_wf")" + if [ -z "$_desc" ] || _is_boilerplate_desc "$_desc"; then + _ld="$(_lib_desc "$_tool")" + [ -n "$_ld" ] && _desc="$_ld" + fi + [ -z "$_desc" ] && _desc="(no description)" + # collapse whitespace, trim to one clause for the table + _desc="$(printf '%s' "$_desc" | tr -s '[:space:]' ' ' | sed 's/^ *//; s/ *$//')" + + # example + _ex="$(_wrapper_example "$_c" "$_wf")" + if [ -z "$_ex" ]; then + _ex="$(_lib_example "$_c" "$_tool")" + fi + [ -z "$_ex" ] && _ex="$_c -h" + _ex="$(printf '%s' "$_ex" | tr -s '[:space:]' ' ' | sed 's/^ *//; s/ *$//')" + + _rows="${_rows}${_c}"$'\t'"${_desc}"$'\t'"${_ex}"$'\n' +done + +if [ -z "$_rows" ]; then + echo "help: no commands match '${_filter}'" >&2 + exit 1 +fi + +# --- render: aligned three-column table ------------------------------------- +printf 'Cloverleaf-Larry short commands (run -h for full help)\n\n' +printf '%s' "$_rows" | awk -F'\t' ' + { c[NR]=$1; d[NR]=$2; e[NR]=$3; n=NR; if (length($1)>w) w=length($1) } + END { + for (i=1;i<=n;i++) { + printf " %-*s %s\n", w, c[i], d[i] + printf " %-*s e.g. %s\n", w, "", e[i] + } + } +' diff --git a/bin/inbound b/bin/inbound new file mode 100755 index 0000000..7c9176c --- /dev/null +++ b/bin/inbound @@ -0,0 +1,10 @@ +#!/usr/bin/env bash +# inbound — direct, on-PATH wrapper for lib/nc-inbound.sh (no `larry tools` prefix needed). +# Short, prefix-free name (v0.9.6). Backward-compat alias: `nc-inbound` (same tool). +# All args pass straight through; -h/--help is handled by the underlying tool. +set -o pipefail +_self="${BASH_SOURCE[0]}"; [ -L "$_self" ] && _self="$(readlink "$_self")" +. "$(cd "$(dirname "$_self")" && pwd)/_nc_common.sh" +lib="$(_nc_resolve_lib)" || { echo "inbound: lib/ toolkit not found (set LARRY_LIB_DIR or LARRY_HOME)" >&2; exit 1; } +if [ $# -eq 0 ]; then exec bash "$lib/nc-inbound.sh" --help; fi +exec bash "$lib/nc-inbound.sh" "$@" diff --git a/bin/insert-protocol b/bin/insert-protocol new file mode 100755 index 0000000..355e53a --- /dev/null +++ b/bin/insert-protocol @@ -0,0 +1,10 @@ +#!/usr/bin/env bash +# insert-protocol — direct, on-PATH wrapper for lib/nc-insert-protocol.sh (no `larry tools` prefix needed). +# Short, prefix-free name (v0.9.6). Backward-compat alias: `nc-insert-protocol` (same tool). +# All args pass straight through; -h/--help is handled by the underlying tool. +set -o pipefail +_self="${BASH_SOURCE[0]}"; [ -L "$_self" ] && _self="$(readlink "$_self")" +. "$(cd "$(dirname "$_self")" && pwd)/_nc_common.sh" +lib="$(_nc_resolve_lib)" || { echo "insert-protocol: lib/ toolkit not found (set LARRY_LIB_DIR or LARRY_HOME)" >&2; exit 1; } +if [ $# -eq 0 ]; then exec bash "$lib/nc-insert-protocol.sh" --help; fi +exec bash "$lib/nc-insert-protocol.sh" "$@" diff --git a/bin/make-jump b/bin/make-jump new file mode 100755 index 0000000..cca29a5 --- /dev/null +++ b/bin/make-jump @@ -0,0 +1,10 @@ +#!/usr/bin/env bash +# make-jump — direct, on-PATH wrapper for lib/nc-make-jump.sh (no `larry tools` prefix needed). +# Short, prefix-free name (v0.9.6). Backward-compat alias: `nc-make-jump` (same tool). +# All args pass straight through; -h/--help is handled by the underlying tool. +set -o pipefail +_self="${BASH_SOURCE[0]}"; [ -L "$_self" ] && _self="$(readlink "$_self")" +. "$(cd "$(dirname "$_self")" && pwd)/_nc_common.sh" +lib="$(_nc_resolve_lib)" || { echo "make-jump: lib/ toolkit not found (set LARRY_LIB_DIR or LARRY_HOME)" >&2; exit 1; } +if [ $# -eq 0 ]; then exec bash "$lib/nc-make-jump.sh" --help; fi +exec bash "$lib/nc-make-jump.sh" "$@" diff --git a/bin/msgs b/bin/msgs new file mode 100755 index 0000000..116bac3 --- /dev/null +++ b/bin/msgs @@ -0,0 +1,10 @@ +#!/usr/bin/env bash +# msgs — direct, on-PATH wrapper for lib/nc-msgs.sh (no `larry tools` prefix needed). +# Short, prefix-free name (v0.9.6). Backward-compat alias: `nc-msgs` (same tool). +# All args pass straight through; -h/--help is handled by the underlying tool. +set -o pipefail +_self="${BASH_SOURCE[0]}"; [ -L "$_self" ] && _self="$(readlink "$_self")" +. "$(cd "$(dirname "$_self")" && pwd)/_nc_common.sh" +lib="$(_nc_resolve_lib)" || { echo "msgs: lib/ toolkit not found (set LARRY_LIB_DIR or LARRY_HOME)" >&2; exit 1; } +if [ $# -eq 0 ]; then exec bash "$lib/nc-msgs.sh" --help; fi +exec bash "$lib/nc-msgs.sh" "$@" diff --git a/bin/nc-completion.bash b/bin/nc-completion.bash index 603564e..beb5e95 100644 --- a/bin/nc-completion.bash +++ b/bin/nc-completion.bash @@ -150,7 +150,22 @@ _nc_complete_nc_find() { # nc-paths shares the paths completer. _nc_complete_nc_paths() { _nc_complete_paths; } -# Register. Short commands first (the headline ergonomics), then full names. +# nfind is the prefix-free name for nc-find (NOT `find` — that would shadow the +# system find on PATH). Same mode-aware completer. +_nc_complete_nfind() { _nc_complete_nc_find; } + +# The remaining prefix-free short commands (v0.9.6: table, parse, status, …) take +# "a site OR a thread" as their natural first argument, so the union completer is +# the right default. (Their nc-* aliases get the SAME completer below.) +_nc_complete_table() { _nc_complete_names; } +_nc_complete_parse() { _nc_complete_names; } +_nc_complete_msgs() { _nc_complete_threads_only; } +_nc_complete_status() { _nc_complete_names; } +_nc_complete_engine() { _nc_complete_names; } +_nc_complete_xlate() { _nc_complete_names; } + +# Register. Canonical prefix-free short commands first (the headline ergonomics); +# then the kept nc-* aliases get the SAME completer so muscle memory still tabs. complete -F _nc_complete_tbn tbn complete -F _nc_complete_tbp tbp complete -F _nc_complete_tbh tbh @@ -158,5 +173,20 @@ complete -F _nc_complete_tbpr tbpr complete -F _nc_complete_where where complete -F _nc_complete_paths paths complete -F _nc_complete_route_test route_test +complete -F _nc_complete_nfind nfind +complete -F _nc_complete_table table +complete -F _nc_complete_parse parse +complete -F _nc_complete_msgs msgs +complete -F _nc_complete_status status +complete -F _nc_complete_engine engine +complete -F _nc_complete_xlate xlate + +# Backward-compat aliases — same completer as their canonical short command. complete -F _nc_complete_nc_find nc-find complete -F _nc_complete_nc_paths nc-paths +complete -F _nc_complete_table nc-table +complete -F _nc_complete_parse nc-parse +complete -F _nc_complete_msgs nc-msgs +complete -F _nc_complete_status nc-status +complete -F _nc_complete_engine nc-engine +complete -F _nc_complete_xlate nc-xlate diff --git a/bin/nc-create-thread b/bin/nc-create-thread index afdf93c..c690257 100755 --- a/bin/nc-create-thread +++ b/bin/nc-create-thread @@ -1,9 +1,8 @@ #!/usr/bin/env bash -# nc-create-thread — direct, on-PATH wrapper for lib/nc-create-thread.sh (no `larry tools` prefix needed). -# All args pass straight through; -h/--help is handled by the underlying tool. +# nc-create-thread — backward-compat ALIAS for the prefix-free `create-thread` (v0.9.6). +# The canonical command is now `create-thread`; `nc-create-thread` is kept so existing muscle +# memory / scripts / docs keep working. All args pass straight through. set -o pipefail _self="${BASH_SOURCE[0]}"; [ -L "$_self" ] && _self="$(readlink "$_self")" -. "$(cd "$(dirname "$_self")" && pwd)/_nc_common.sh" -lib="$(_nc_resolve_lib)" || { echo "nc-create-thread: lib/ toolkit not found (set LARRY_LIB_DIR or LARRY_HOME)" >&2; exit 1; } -if [ $# -eq 0 ]; then exec bash "$lib/nc-create-thread.sh" --help; fi -exec bash "$lib/nc-create-thread.sh" "$@" +_BINDIR="$(cd "$(dirname "$_self")" && pwd)" +exec bash "$_BINDIR/create-thread" "$@" diff --git a/bin/nc-diff-interface b/bin/nc-diff-interface index 8ef49a3..d6d83c4 100755 --- a/bin/nc-diff-interface +++ b/bin/nc-diff-interface @@ -1,9 +1,8 @@ #!/usr/bin/env bash -# nc-diff-interface — direct, on-PATH wrapper for lib/nc-diff-interface.sh (no `larry tools` prefix needed). -# All args pass straight through; -h/--help is handled by the underlying tool. +# nc-diff-interface — backward-compat ALIAS for the prefix-free `diff-interface` (v0.9.6). +# The canonical command is now `diff-interface`; `nc-diff-interface` is kept so existing muscle +# memory / scripts / docs keep working. All args pass straight through. set -o pipefail _self="${BASH_SOURCE[0]}"; [ -L "$_self" ] && _self="$(readlink "$_self")" -. "$(cd "$(dirname "$_self")" && pwd)/_nc_common.sh" -lib="$(_nc_resolve_lib)" || { echo "nc-diff-interface: lib/ toolkit not found (set LARRY_LIB_DIR or LARRY_HOME)" >&2; exit 1; } -if [ $# -eq 0 ]; then exec bash "$lib/nc-diff-interface.sh" --help; fi -exec bash "$lib/nc-diff-interface.sh" "$@" +_BINDIR="$(cd "$(dirname "$_self")" && pwd)" +exec bash "$_BINDIR/diff-interface" "$@" diff --git a/bin/nc-document b/bin/nc-document index 0bea22f..7fac991 100755 --- a/bin/nc-document +++ b/bin/nc-document @@ -1,9 +1,8 @@ #!/usr/bin/env bash -# nc-document — direct, on-PATH wrapper for lib/nc-document.sh (no `larry tools` prefix needed). -# All args pass straight through; -h/--help is handled by the underlying tool. +# nc-document — backward-compat ALIAS for the prefix-free `document` (v0.9.6). +# The canonical command is now `document`; `nc-document` is kept so existing muscle +# memory / scripts / docs keep working. All args pass straight through. set -o pipefail _self="${BASH_SOURCE[0]}"; [ -L "$_self" ] && _self="$(readlink "$_self")" -. "$(cd "$(dirname "$_self")" && pwd)/_nc_common.sh" -lib="$(_nc_resolve_lib)" || { echo "nc-document: lib/ toolkit not found (set LARRY_LIB_DIR or LARRY_HOME)" >&2; exit 1; } -if [ $# -eq 0 ]; then exec bash "$lib/nc-document.sh" --help; fi -exec bash "$lib/nc-document.sh" "$@" +_BINDIR="$(cd "$(dirname "$_self")" && pwd)" +exec bash "$_BINDIR/document" "$@" diff --git a/bin/nc-engine b/bin/nc-engine index 1f3e473..451b426 100755 --- a/bin/nc-engine +++ b/bin/nc-engine @@ -1,9 +1,8 @@ #!/usr/bin/env bash -# nc-engine — direct, on-PATH wrapper for lib/nc-engine.sh (no `larry tools` prefix needed). -# All args pass straight through; -h/--help is handled by the underlying tool. +# nc-engine — backward-compat ALIAS for the prefix-free `engine` (v0.9.6). +# The canonical command is now `engine`; `nc-engine` is kept so existing muscle +# memory / scripts / docs keep working. All args pass straight through. set -o pipefail _self="${BASH_SOURCE[0]}"; [ -L "$_self" ] && _self="$(readlink "$_self")" -. "$(cd "$(dirname "$_self")" && pwd)/_nc_common.sh" -lib="$(_nc_resolve_lib)" || { echo "nc-engine: lib/ toolkit not found (set LARRY_LIB_DIR or LARRY_HOME)" >&2; exit 1; } -if [ $# -eq 0 ]; then exec bash "$lib/nc-engine.sh" --help; fi -exec bash "$lib/nc-engine.sh" "$@" +_BINDIR="$(cd "$(dirname "$_self")" && pwd)" +exec bash "$_BINDIR/engine" "$@" diff --git a/bin/nc-find b/bin/nc-find index f0f2c5a..d671758 100755 --- a/bin/nc-find +++ b/bin/nc-find @@ -1,9 +1,8 @@ #!/usr/bin/env bash -# nc-find — direct, on-PATH wrapper for lib/nc-find.sh (no `larry tools` prefix needed). -# All args pass straight through; -h/--help is handled by the underlying tool. +# nc-find — backward-compat ALIAS for the prefix-free `nfind` (v0.9.6). +# The canonical command is now `nfind`; `nc-find` is kept so existing muscle +# memory / scripts / docs keep working. All args pass straight through. set -o pipefail _self="${BASH_SOURCE[0]}"; [ -L "$_self" ] && _self="$(readlink "$_self")" -. "$(cd "$(dirname "$_self")" && pwd)/_nc_common.sh" -lib="$(_nc_resolve_lib)" || { echo "nc-find: lib/ toolkit not found (set LARRY_LIB_DIR or LARRY_HOME)" >&2; exit 1; } -if [ $# -eq 0 ]; then exec bash "$lib/nc-find.sh" --help; fi -exec bash "$lib/nc-find.sh" "$@" +_BINDIR="$(cd "$(dirname "$_self")" && pwd)" +exec bash "$_BINDIR/nfind" "$@" diff --git a/bin/nc-inbound b/bin/nc-inbound index 024bdc8..f69c4d0 100755 --- a/bin/nc-inbound +++ b/bin/nc-inbound @@ -1,9 +1,8 @@ #!/usr/bin/env bash -# nc-inbound — direct, on-PATH wrapper for lib/nc-inbound.sh (no `larry tools` prefix needed). -# All args pass straight through; -h/--help is handled by the underlying tool. +# nc-inbound — backward-compat ALIAS for the prefix-free `inbound` (v0.9.6). +# The canonical command is now `inbound`; `nc-inbound` is kept so existing muscle +# memory / scripts / docs keep working. All args pass straight through. set -o pipefail _self="${BASH_SOURCE[0]}"; [ -L "$_self" ] && _self="$(readlink "$_self")" -. "$(cd "$(dirname "$_self")" && pwd)/_nc_common.sh" -lib="$(_nc_resolve_lib)" || { echo "nc-inbound: lib/ toolkit not found (set LARRY_LIB_DIR or LARRY_HOME)" >&2; exit 1; } -if [ $# -eq 0 ]; then exec bash "$lib/nc-inbound.sh" --help; fi -exec bash "$lib/nc-inbound.sh" "$@" +_BINDIR="$(cd "$(dirname "$_self")" && pwd)" +exec bash "$_BINDIR/inbound" "$@" diff --git a/bin/nc-insert-protocol b/bin/nc-insert-protocol index 7e754bb..4bb69f2 100755 --- a/bin/nc-insert-protocol +++ b/bin/nc-insert-protocol @@ -1,9 +1,8 @@ #!/usr/bin/env bash -# nc-insert-protocol — direct, on-PATH wrapper for lib/nc-insert-protocol.sh (no `larry tools` prefix needed). -# All args pass straight through; -h/--help is handled by the underlying tool. +# nc-insert-protocol — backward-compat ALIAS for the prefix-free `insert-protocol` (v0.9.6). +# The canonical command is now `insert-protocol`; `nc-insert-protocol` is kept so existing muscle +# memory / scripts / docs keep working. All args pass straight through. set -o pipefail _self="${BASH_SOURCE[0]}"; [ -L "$_self" ] && _self="$(readlink "$_self")" -. "$(cd "$(dirname "$_self")" && pwd)/_nc_common.sh" -lib="$(_nc_resolve_lib)" || { echo "nc-insert-protocol: lib/ toolkit not found (set LARRY_LIB_DIR or LARRY_HOME)" >&2; exit 1; } -if [ $# -eq 0 ]; then exec bash "$lib/nc-insert-protocol.sh" --help; fi -exec bash "$lib/nc-insert-protocol.sh" "$@" +_BINDIR="$(cd "$(dirname "$_self")" && pwd)" +exec bash "$_BINDIR/insert-protocol" "$@" diff --git a/bin/nc-make-jump b/bin/nc-make-jump index d0e324f..32d1621 100755 --- a/bin/nc-make-jump +++ b/bin/nc-make-jump @@ -1,9 +1,8 @@ #!/usr/bin/env bash -# nc-make-jump — direct, on-PATH wrapper for lib/nc-make-jump.sh (no `larry tools` prefix needed). -# All args pass straight through; -h/--help is handled by the underlying tool. +# nc-make-jump — backward-compat ALIAS for the prefix-free `make-jump` (v0.9.6). +# The canonical command is now `make-jump`; `nc-make-jump` is kept so existing muscle +# memory / scripts / docs keep working. All args pass straight through. set -o pipefail _self="${BASH_SOURCE[0]}"; [ -L "$_self" ] && _self="$(readlink "$_self")" -. "$(cd "$(dirname "$_self")" && pwd)/_nc_common.sh" -lib="$(_nc_resolve_lib)" || { echo "nc-make-jump: lib/ toolkit not found (set LARRY_LIB_DIR or LARRY_HOME)" >&2; exit 1; } -if [ $# -eq 0 ]; then exec bash "$lib/nc-make-jump.sh" --help; fi -exec bash "$lib/nc-make-jump.sh" "$@" +_BINDIR="$(cd "$(dirname "$_self")" && pwd)" +exec bash "$_BINDIR/make-jump" "$@" diff --git a/bin/nc-msgs b/bin/nc-msgs index fd6e6f0..cfed265 100755 --- a/bin/nc-msgs +++ b/bin/nc-msgs @@ -1,9 +1,8 @@ #!/usr/bin/env bash -# nc-msgs — direct, on-PATH wrapper for lib/nc-msgs.sh (no `larry tools` prefix needed). -# All args pass straight through; -h/--help is handled by the underlying tool. +# nc-msgs — backward-compat ALIAS for the prefix-free `msgs` (v0.9.6). +# The canonical command is now `msgs`; `nc-msgs` is kept so existing muscle +# memory / scripts / docs keep working. All args pass straight through. set -o pipefail _self="${BASH_SOURCE[0]}"; [ -L "$_self" ] && _self="$(readlink "$_self")" -. "$(cd "$(dirname "$_self")" && pwd)/_nc_common.sh" -lib="$(_nc_resolve_lib)" || { echo "nc-msgs: lib/ toolkit not found (set LARRY_LIB_DIR or LARRY_HOME)" >&2; exit 1; } -if [ $# -eq 0 ]; then exec bash "$lib/nc-msgs.sh" --help; fi -exec bash "$lib/nc-msgs.sh" "$@" +_BINDIR="$(cd "$(dirname "$_self")" && pwd)" +exec bash "$_BINDIR/msgs" "$@" diff --git a/bin/nc-parse b/bin/nc-parse index 7ea92cf..32a784d 100755 --- a/bin/nc-parse +++ b/bin/nc-parse @@ -1,9 +1,8 @@ #!/usr/bin/env bash -# nc-parse — direct, on-PATH wrapper for lib/nc-parse.sh (no `larry tools` prefix needed). -# All args pass straight through; -h/--help is handled by the underlying tool. +# nc-parse — backward-compat ALIAS for the prefix-free `parse` (v0.9.6). +# The canonical command is now `parse`; `nc-parse` is kept so existing muscle +# memory / scripts / docs keep working. All args pass straight through. set -o pipefail _self="${BASH_SOURCE[0]}"; [ -L "$_self" ] && _self="$(readlink "$_self")" -. "$(cd "$(dirname "$_self")" && pwd)/_nc_common.sh" -lib="$(_nc_resolve_lib)" || { echo "nc-parse: lib/ toolkit not found (set LARRY_LIB_DIR or LARRY_HOME)" >&2; exit 1; } -if [ $# -eq 0 ]; then exec bash "$lib/nc-parse.sh" --help; fi -exec bash "$lib/nc-parse.sh" "$@" +_BINDIR="$(cd "$(dirname "$_self")" && pwd)" +exec bash "$_BINDIR/parse" "$@" diff --git a/bin/nc-paths b/bin/nc-paths index e29b832..d3f701f 100755 --- a/bin/nc-paths +++ b/bin/nc-paths @@ -1,9 +1,8 @@ #!/usr/bin/env bash -# nc-paths — direct, on-PATH wrapper for lib/nc-paths.sh (no `larry tools` prefix needed). -# All args pass straight through; -h/--help is handled by the underlying tool. +# nc-paths — backward-compat ALIAS for the prefix-free `paths` (v0.9.6). +# The canonical command is now `paths`; `nc-paths` is kept so existing muscle +# memory / scripts / docs keep working. All args pass straight through. set -o pipefail _self="${BASH_SOURCE[0]}"; [ -L "$_self" ] && _self="$(readlink "$_self")" -. "$(cd "$(dirname "$_self")" && pwd)/_nc_common.sh" -lib="$(_nc_resolve_lib)" || { echo "nc-paths: lib/ toolkit not found (set LARRY_LIB_DIR or LARRY_HOME)" >&2; exit 1; } -if [ $# -eq 0 ]; then exec bash "$lib/nc-paths.sh" --help; fi -exec bash "$lib/nc-paths.sh" "$@" +_BINDIR="$(cd "$(dirname "$_self")" && pwd)" +exec bash "$_BINDIR/paths" "$@" diff --git a/bin/nc-provision-jumps b/bin/nc-provision-jumps index a4a8e9e..818ea01 100755 --- a/bin/nc-provision-jumps +++ b/bin/nc-provision-jumps @@ -1,9 +1,8 @@ #!/usr/bin/env bash -# nc-provision-jumps — direct, on-PATH wrapper for lib/nc-provision-jumps.sh (no `larry tools` prefix needed). -# All args pass straight through; -h/--help is handled by the underlying tool. +# nc-provision-jumps — backward-compat ALIAS for the prefix-free `provision-jumps` (v0.9.6). +# The canonical command is now `provision-jumps`; `nc-provision-jumps` is kept so existing muscle +# memory / scripts / docs keep working. All args pass straight through. set -o pipefail _self="${BASH_SOURCE[0]}"; [ -L "$_self" ] && _self="$(readlink "$_self")" -. "$(cd "$(dirname "$_self")" && pwd)/_nc_common.sh" -lib="$(_nc_resolve_lib)" || { echo "nc-provision-jumps: lib/ toolkit not found (set LARRY_LIB_DIR or LARRY_HOME)" >&2; exit 1; } -if [ $# -eq 0 ]; then exec bash "$lib/nc-provision-jumps.sh" --help; fi -exec bash "$lib/nc-provision-jumps.sh" "$@" +_BINDIR="$(cd "$(dirname "$_self")" && pwd)" +exec bash "$_BINDIR/provision-jumps" "$@" diff --git a/bin/nc-regression b/bin/nc-regression index 86b73be..e155d9a 100755 --- a/bin/nc-regression +++ b/bin/nc-regression @@ -1,9 +1,8 @@ #!/usr/bin/env bash -# nc-regression — direct, on-PATH wrapper for lib/nc-regression.sh (no `larry tools` prefix needed). -# All args pass straight through; -h/--help is handled by the underlying tool. +# nc-regression — backward-compat ALIAS for the prefix-free `regression` (v0.9.6). +# The canonical command is now `regression`; `nc-regression` is kept so existing muscle +# memory / scripts / docs keep working. All args pass straight through. set -o pipefail _self="${BASH_SOURCE[0]}"; [ -L "$_self" ] && _self="$(readlink "$_self")" -. "$(cd "$(dirname "$_self")" && pwd)/_nc_common.sh" -lib="$(_nc_resolve_lib)" || { echo "nc-regression: lib/ toolkit not found (set LARRY_LIB_DIR or LARRY_HOME)" >&2; exit 1; } -if [ $# -eq 0 ]; then exec bash "$lib/nc-regression.sh" --help; fi -exec bash "$lib/nc-regression.sh" "$@" +_BINDIR="$(cd "$(dirname "$_self")" && pwd)" +exec bash "$_BINDIR/regression" "$@" diff --git a/bin/nc-revisions b/bin/nc-revisions index 34900c2..dc69d13 100755 --- a/bin/nc-revisions +++ b/bin/nc-revisions @@ -1,9 +1,8 @@ #!/usr/bin/env bash -# nc-revisions — direct, on-PATH wrapper for lib/nc-revisions.sh (no `larry tools` prefix needed). -# All args pass straight through; -h/--help is handled by the underlying tool. +# nc-revisions — backward-compat ALIAS for the prefix-free `revisions` (v0.9.6). +# The canonical command is now `revisions`; `nc-revisions` is kept so existing muscle +# memory / scripts / docs keep working. All args pass straight through. set -o pipefail _self="${BASH_SOURCE[0]}"; [ -L "$_self" ] && _self="$(readlink "$_self")" -. "$(cd "$(dirname "$_self")" && pwd)/_nc_common.sh" -lib="$(_nc_resolve_lib)" || { echo "nc-revisions: lib/ toolkit not found (set LARRY_LIB_DIR or LARRY_HOME)" >&2; exit 1; } -if [ $# -eq 0 ]; then exec bash "$lib/nc-revisions.sh" --help; fi -exec bash "$lib/nc-revisions.sh" "$@" +_BINDIR="$(cd "$(dirname "$_self")" && pwd)" +exec bash "$_BINDIR/revisions" "$@" diff --git a/bin/nc-set-field b/bin/nc-set-field index 64c1568..70dcdfb 100755 --- a/bin/nc-set-field +++ b/bin/nc-set-field @@ -1,9 +1,8 @@ #!/usr/bin/env bash -# nc-set-field — direct, on-PATH wrapper for lib/nc-set-field.sh (no `larry tools` prefix needed). -# All args pass straight through; -h/--help is handled by the underlying tool. +# nc-set-field — backward-compat ALIAS for the prefix-free `set-field` (v0.9.6). +# The canonical command is now `set-field`; `nc-set-field` is kept so existing muscle +# memory / scripts / docs keep working. All args pass straight through. set -o pipefail _self="${BASH_SOURCE[0]}"; [ -L "$_self" ] && _self="$(readlink "$_self")" -. "$(cd "$(dirname "$_self")" && pwd)/_nc_common.sh" -lib="$(_nc_resolve_lib)" || { echo "nc-set-field: lib/ toolkit not found (set LARRY_LIB_DIR or LARRY_HOME)" >&2; exit 1; } -if [ $# -eq 0 ]; then exec bash "$lib/nc-set-field.sh" --help; fi -exec bash "$lib/nc-set-field.sh" "$@" +_BINDIR="$(cd "$(dirname "$_self")" && pwd)" +exec bash "$_BINDIR/set-field" "$@" diff --git a/bin/nc-smat-diff b/bin/nc-smat-diff index a37b9fd..0b0e277 100755 --- a/bin/nc-smat-diff +++ b/bin/nc-smat-diff @@ -1,9 +1,8 @@ #!/usr/bin/env bash -# nc-smat-diff — direct, on-PATH wrapper for lib/nc-smat-diff.sh (no `larry tools` prefix needed). -# All args pass straight through; -h/--help is handled by the underlying tool. +# nc-smat-diff — backward-compat ALIAS for the prefix-free `smat-diff` (v0.9.6). +# The canonical command is now `smat-diff`; `nc-smat-diff` is kept so existing muscle +# memory / scripts / docs keep working. All args pass straight through. set -o pipefail _self="${BASH_SOURCE[0]}"; [ -L "$_self" ] && _self="$(readlink "$_self")" -. "$(cd "$(dirname "$_self")" && pwd)/_nc_common.sh" -lib="$(_nc_resolve_lib)" || { echo "nc-smat-diff: lib/ toolkit not found (set LARRY_LIB_DIR or LARRY_HOME)" >&2; exit 1; } -if [ $# -eq 0 ]; then exec bash "$lib/nc-smat-diff.sh" --help; fi -exec bash "$lib/nc-smat-diff.sh" "$@" +_BINDIR="$(cd "$(dirname "$_self")" && pwd)" +exec bash "$_BINDIR/smat-diff" "$@" diff --git a/bin/nc-status b/bin/nc-status index b4a6a18..e94242a 100755 --- a/bin/nc-status +++ b/bin/nc-status @@ -1,9 +1,8 @@ #!/usr/bin/env bash -# nc-status — direct, on-PATH wrapper for lib/nc-status.sh (no `larry tools` prefix needed). -# All args pass straight through; -h/--help is handled by the underlying tool. +# nc-status — backward-compat ALIAS for the prefix-free `status` (v0.9.6). +# The canonical command is now `status`; `nc-status` is kept so existing muscle +# memory / scripts / docs keep working. All args pass straight through. set -o pipefail _self="${BASH_SOURCE[0]}"; [ -L "$_self" ] && _self="$(readlink "$_self")" -. "$(cd "$(dirname "$_self")" && pwd)/_nc_common.sh" -lib="$(_nc_resolve_lib)" || { echo "nc-status: lib/ toolkit not found (set LARRY_LIB_DIR or LARRY_HOME)" >&2; exit 1; } -if [ $# -eq 0 ]; then exec bash "$lib/nc-status.sh" --help; fi -exec bash "$lib/nc-status.sh" "$@" +_BINDIR="$(cd "$(dirname "$_self")" && pwd)" +exec bash "$_BINDIR/status" "$@" diff --git a/bin/nc-table b/bin/nc-table index 363e0b3..7e0f8a2 100755 --- a/bin/nc-table +++ b/bin/nc-table @@ -1,9 +1,8 @@ #!/usr/bin/env bash -# nc-table — direct, on-PATH wrapper for lib/nc-table.sh (no `larry tools` prefix needed). -# All args pass straight through; -h/--help is handled by the underlying tool. +# nc-table — backward-compat ALIAS for the prefix-free `table` (v0.9.6). +# The canonical command is now `table`; `nc-table` is kept so existing muscle +# memory / scripts / docs keep working. All args pass straight through. set -o pipefail _self="${BASH_SOURCE[0]}"; [ -L "$_self" ] && _self="$(readlink "$_self")" -. "$(cd "$(dirname "$_self")" && pwd)/_nc_common.sh" -lib="$(_nc_resolve_lib)" || { echo "nc-table: lib/ toolkit not found (set LARRY_LIB_DIR or LARRY_HOME)" >&2; exit 1; } -if [ $# -eq 0 ]; then exec bash "$lib/nc-table.sh" --help; fi -exec bash "$lib/nc-table.sh" "$@" +_BINDIR="$(cd "$(dirname "$_self")" && pwd)" +exec bash "$_BINDIR/table" "$@" diff --git a/bin/nc-tclgen b/bin/nc-tclgen index 0b975d0..d473f80 100755 --- a/bin/nc-tclgen +++ b/bin/nc-tclgen @@ -1,9 +1,8 @@ #!/usr/bin/env bash -# nc-tclgen — direct, on-PATH wrapper for lib/nc-tclgen.sh (no `larry tools` prefix needed). -# All args pass straight through; -h/--help is handled by the underlying tool. +# nc-tclgen — backward-compat ALIAS for the prefix-free `tclgen` (v0.9.6). +# The canonical command is now `tclgen`; `nc-tclgen` is kept so existing muscle +# memory / scripts / docs keep working. All args pass straight through. set -o pipefail _self="${BASH_SOURCE[0]}"; [ -L "$_self" ] && _self="$(readlink "$_self")" -. "$(cd "$(dirname "$_self")" && pwd)/_nc_common.sh" -lib="$(_nc_resolve_lib)" || { echo "nc-tclgen: lib/ toolkit not found (set LARRY_LIB_DIR or LARRY_HOME)" >&2; exit 1; } -if [ $# -eq 0 ]; then exec bash "$lib/nc-tclgen.sh" --help; fi -exec bash "$lib/nc-tclgen.sh" "$@" +_BINDIR="$(cd "$(dirname "$_self")" && pwd)" +exec bash "$_BINDIR/tclgen" "$@" diff --git a/bin/nc-xlate b/bin/nc-xlate index 9b807b8..4ed882e 100755 --- a/bin/nc-xlate +++ b/bin/nc-xlate @@ -1,9 +1,8 @@ #!/usr/bin/env bash -# nc-xlate — direct, on-PATH wrapper for lib/nc-xlate.sh (no `larry tools` prefix needed). -# All args pass straight through; -h/--help is handled by the underlying tool. +# nc-xlate — backward-compat ALIAS for the prefix-free `xlate` (v0.9.6). +# The canonical command is now `xlate`; `nc-xlate` is kept so existing muscle +# memory / scripts / docs keep working. All args pass straight through. set -o pipefail _self="${BASH_SOURCE[0]}"; [ -L "$_self" ] && _self="$(readlink "$_self")" -. "$(cd "$(dirname "$_self")" && pwd)/_nc_common.sh" -lib="$(_nc_resolve_lib)" || { echo "nc-xlate: lib/ toolkit not found (set LARRY_LIB_DIR or LARRY_HOME)" >&2; exit 1; } -if [ $# -eq 0 ]; then exec bash "$lib/nc-xlate.sh" --help; fi -exec bash "$lib/nc-xlate.sh" "$@" +_BINDIR="$(cd "$(dirname "$_self")" && pwd)" +exec bash "$_BINDIR/xlate" "$@" diff --git a/bin/nfind b/bin/nfind new file mode 100755 index 0000000..95dd0f9 --- /dev/null +++ b/bin/nfind @@ -0,0 +1,10 @@ +#!/usr/bin/env bash +# nfind — direct, on-PATH wrapper for lib/nc-find.sh (no `larry tools` prefix needed). +# Short, prefix-free name (v0.9.6). Backward-compat alias: `nc-find` (same tool). +# All args pass straight through; -h/--help is handled by the underlying tool. +set -o pipefail +_self="${BASH_SOURCE[0]}"; [ -L "$_self" ] && _self="$(readlink "$_self")" +. "$(cd "$(dirname "$_self")" && pwd)/_nc_common.sh" +lib="$(_nc_resolve_lib)" || { echo "nfind: lib/ toolkit not found (set LARRY_LIB_DIR or LARRY_HOME)" >&2; exit 1; } +if [ $# -eq 0 ]; then exec bash "$lib/nc-find.sh" --help; fi +exec bash "$lib/nc-find.sh" "$@" diff --git a/bin/parse b/bin/parse new file mode 100755 index 0000000..8139d50 --- /dev/null +++ b/bin/parse @@ -0,0 +1,10 @@ +#!/usr/bin/env bash +# parse — direct, on-PATH wrapper for lib/nc-parse.sh (no `larry tools` prefix needed). +# Short, prefix-free name (v0.9.6). Backward-compat alias: `nc-parse` (same tool). +# All args pass straight through; -h/--help is handled by the underlying tool. +set -o pipefail +_self="${BASH_SOURCE[0]}"; [ -L "$_self" ] && _self="$(readlink "$_self")" +. "$(cd "$(dirname "$_self")" && pwd)/_nc_common.sh" +lib="$(_nc_resolve_lib)" || { echo "parse: lib/ toolkit not found (set LARRY_LIB_DIR or LARRY_HOME)" >&2; exit 1; } +if [ $# -eq 0 ]; then exec bash "$lib/nc-parse.sh" --help; fi +exec bash "$lib/nc-parse.sh" "$@" diff --git a/bin/provision-jumps b/bin/provision-jumps new file mode 100755 index 0000000..fd8a58b --- /dev/null +++ b/bin/provision-jumps @@ -0,0 +1,10 @@ +#!/usr/bin/env bash +# provision-jumps — direct, on-PATH wrapper for lib/nc-provision-jumps.sh (no `larry tools` prefix needed). +# Short, prefix-free name (v0.9.6). Backward-compat alias: `nc-provision-jumps` (same tool). +# All args pass straight through; -h/--help is handled by the underlying tool. +set -o pipefail +_self="${BASH_SOURCE[0]}"; [ -L "$_self" ] && _self="$(readlink "$_self")" +. "$(cd "$(dirname "$_self")" && pwd)/_nc_common.sh" +lib="$(_nc_resolve_lib)" || { echo "provision-jumps: lib/ toolkit not found (set LARRY_LIB_DIR or LARRY_HOME)" >&2; exit 1; } +if [ $# -eq 0 ]; then exec bash "$lib/nc-provision-jumps.sh" --help; fi +exec bash "$lib/nc-provision-jumps.sh" "$@" diff --git a/bin/regression b/bin/regression new file mode 100755 index 0000000..754a276 --- /dev/null +++ b/bin/regression @@ -0,0 +1,10 @@ +#!/usr/bin/env bash +# regression — direct, on-PATH wrapper for lib/nc-regression.sh (no `larry tools` prefix needed). +# Short, prefix-free name (v0.9.6). Backward-compat alias: `nc-regression` (same tool). +# All args pass straight through; -h/--help is handled by the underlying tool. +set -o pipefail +_self="${BASH_SOURCE[0]}"; [ -L "$_self" ] && _self="$(readlink "$_self")" +. "$(cd "$(dirname "$_self")" && pwd)/_nc_common.sh" +lib="$(_nc_resolve_lib)" || { echo "regression: lib/ toolkit not found (set LARRY_LIB_DIR or LARRY_HOME)" >&2; exit 1; } +if [ $# -eq 0 ]; then exec bash "$lib/nc-regression.sh" --help; fi +exec bash "$lib/nc-regression.sh" "$@" diff --git a/bin/revisions b/bin/revisions new file mode 100755 index 0000000..c4a9b6d --- /dev/null +++ b/bin/revisions @@ -0,0 +1,10 @@ +#!/usr/bin/env bash +# revisions — direct, on-PATH wrapper for lib/nc-revisions.sh (no `larry tools` prefix needed). +# Short, prefix-free name (v0.9.6). Backward-compat alias: `nc-revisions` (same tool). +# All args pass straight through; -h/--help is handled by the underlying tool. +set -o pipefail +_self="${BASH_SOURCE[0]}"; [ -L "$_self" ] && _self="$(readlink "$_self")" +. "$(cd "$(dirname "$_self")" && pwd)/_nc_common.sh" +lib="$(_nc_resolve_lib)" || { echo "revisions: lib/ toolkit not found (set LARRY_LIB_DIR or LARRY_HOME)" >&2; exit 1; } +if [ $# -eq 0 ]; then exec bash "$lib/nc-revisions.sh" --help; fi +exec bash "$lib/nc-revisions.sh" "$@" diff --git a/bin/set-field b/bin/set-field new file mode 100755 index 0000000..04b446a --- /dev/null +++ b/bin/set-field @@ -0,0 +1,10 @@ +#!/usr/bin/env bash +# set-field — direct, on-PATH wrapper for lib/nc-set-field.sh (no `larry tools` prefix needed). +# Short, prefix-free name (v0.9.6). Backward-compat alias: `nc-set-field` (same tool). +# All args pass straight through; -h/--help is handled by the underlying tool. +set -o pipefail +_self="${BASH_SOURCE[0]}"; [ -L "$_self" ] && _self="$(readlink "$_self")" +. "$(cd "$(dirname "$_self")" && pwd)/_nc_common.sh" +lib="$(_nc_resolve_lib)" || { echo "set-field: lib/ toolkit not found (set LARRY_LIB_DIR or LARRY_HOME)" >&2; exit 1; } +if [ $# -eq 0 ]; then exec bash "$lib/nc-set-field.sh" --help; fi +exec bash "$lib/nc-set-field.sh" "$@" diff --git a/bin/smat-diff b/bin/smat-diff new file mode 100755 index 0000000..b673841 --- /dev/null +++ b/bin/smat-diff @@ -0,0 +1,10 @@ +#!/usr/bin/env bash +# smat-diff — direct, on-PATH wrapper for lib/nc-smat-diff.sh (no `larry tools` prefix needed). +# Short, prefix-free name (v0.9.6). Backward-compat alias: `nc-smat-diff` (same tool). +# All args pass straight through; -h/--help is handled by the underlying tool. +set -o pipefail +_self="${BASH_SOURCE[0]}"; [ -L "$_self" ] && _self="$(readlink "$_self")" +. "$(cd "$(dirname "$_self")" && pwd)/_nc_common.sh" +lib="$(_nc_resolve_lib)" || { echo "smat-diff: lib/ toolkit not found (set LARRY_LIB_DIR or LARRY_HOME)" >&2; exit 1; } +if [ $# -eq 0 ]; then exec bash "$lib/nc-smat-diff.sh" --help; fi +exec bash "$lib/nc-smat-diff.sh" "$@" diff --git a/bin/status b/bin/status new file mode 100755 index 0000000..adae48a --- /dev/null +++ b/bin/status @@ -0,0 +1,10 @@ +#!/usr/bin/env bash +# status — direct, on-PATH wrapper for lib/nc-status.sh (no `larry tools` prefix needed). +# Short, prefix-free name (v0.9.6). Backward-compat alias: `nc-status` (same tool). +# All args pass straight through; -h/--help is handled by the underlying tool. +set -o pipefail +_self="${BASH_SOURCE[0]}"; [ -L "$_self" ] && _self="$(readlink "$_self")" +. "$(cd "$(dirname "$_self")" && pwd)/_nc_common.sh" +lib="$(_nc_resolve_lib)" || { echo "status: lib/ toolkit not found (set LARRY_LIB_DIR or LARRY_HOME)" >&2; exit 1; } +if [ $# -eq 0 ]; then exec bash "$lib/nc-status.sh" --help; fi +exec bash "$lib/nc-status.sh" "$@" diff --git a/bin/table b/bin/table new file mode 100755 index 0000000..e01a64e --- /dev/null +++ b/bin/table @@ -0,0 +1,10 @@ +#!/usr/bin/env bash +# table — direct, on-PATH wrapper for lib/nc-table.sh (no `larry tools` prefix needed). +# Short, prefix-free name (v0.9.6). Backward-compat alias: `nc-table` (same tool). +# All args pass straight through; -h/--help is handled by the underlying tool. +set -o pipefail +_self="${BASH_SOURCE[0]}"; [ -L "$_self" ] && _self="$(readlink "$_self")" +. "$(cd "$(dirname "$_self")" && pwd)/_nc_common.sh" +lib="$(_nc_resolve_lib)" || { echo "table: lib/ toolkit not found (set LARRY_LIB_DIR or LARRY_HOME)" >&2; exit 1; } +if [ $# -eq 0 ]; then exec bash "$lib/nc-table.sh" --help; fi +exec bash "$lib/nc-table.sh" "$@" diff --git a/bin/tclgen b/bin/tclgen new file mode 100755 index 0000000..8dd4991 --- /dev/null +++ b/bin/tclgen @@ -0,0 +1,10 @@ +#!/usr/bin/env bash +# tclgen — direct, on-PATH wrapper for lib/nc-tclgen.sh (no `larry tools` prefix needed). +# Short, prefix-free name (v0.9.6). Backward-compat alias: `nc-tclgen` (same tool). +# All args pass straight through; -h/--help is handled by the underlying tool. +set -o pipefail +_self="${BASH_SOURCE[0]}"; [ -L "$_self" ] && _self="$(readlink "$_self")" +. "$(cd "$(dirname "$_self")" && pwd)/_nc_common.sh" +lib="$(_nc_resolve_lib)" || { echo "tclgen: lib/ toolkit not found (set LARRY_LIB_DIR or LARRY_HOME)" >&2; exit 1; } +if [ $# -eq 0 ]; then exec bash "$lib/nc-tclgen.sh" --help; fi +exec bash "$lib/nc-tclgen.sh" "$@" diff --git a/bin/xlate b/bin/xlate new file mode 100755 index 0000000..03eba0c --- /dev/null +++ b/bin/xlate @@ -0,0 +1,10 @@ +#!/usr/bin/env bash +# xlate — direct, on-PATH wrapper for lib/nc-xlate.sh (no `larry tools` prefix needed). +# Short, prefix-free name (v0.9.6). Backward-compat alias: `nc-xlate` (same tool). +# All args pass straight through; -h/--help is handled by the underlying tool. +set -o pipefail +_self="${BASH_SOURCE[0]}"; [ -L "$_self" ] && _self="$(readlink "$_self")" +. "$(cd "$(dirname "$_self")" && pwd)/_nc_common.sh" +lib="$(_nc_resolve_lib)" || { echo "xlate: lib/ toolkit not found (set LARRY_LIB_DIR or LARRY_HOME)" >&2; exit 1; } +if [ $# -eq 0 ]; then exec bash "$lib/nc-xlate.sh" --help; fi +exec bash "$lib/nc-xlate.sh" "$@" diff --git a/install-larry.sh b/install-larry.sh index 0abc619..0ad9018 100755 --- a/install-larry.sh +++ b/install-larry.sh @@ -261,7 +261,10 @@ fetch lib/journal.sh "$LARRY_HOME/lib/journal.sh" # completion available immediately, before the first `larry` launch. fetch bin/_nc_common.sh "$LARRY_HOME/bin/_nc_common.sh" fetch bin/nc-completion.bash "$LARRY_HOME/bin/nc-completion.bash" -for _w in cheat tbn tbp tbh tbpr where paths route_test \ +for _w in help cheat tbn tbp tbh tbpr where paths route_test \ + parse nfind inbound status engine xlate table msgs \ + create-thread set-field insert-protocol make-jump provision-jumps \ + tclgen document revisions diff-interface smat-diff regression \ nc-parse nc-paths nc-find nc-inbound nc-status nc-engine nc-xlate nc-table \ nc-create-thread nc-set-field nc-insert-protocol nc-make-jump nc-provision-jumps \ nc-tclgen nc-document nc-revisions nc-diff-interface nc-smat-diff nc-regression \ diff --git a/larry.sh b/larry.sh index 0263e94..8a03ab5 100755 --- a/larry.sh +++ b/larry.sh @@ -99,7 +99,7 @@ set -o pipefail # ───────────────────────────────────────────────────────────────────────────── # Config # ───────────────────────────────────────────────────────────────────────────── -LARRY_VERSION="0.9.5" +LARRY_VERSION="0.9.6" LARRY_HOME="${LARRY_HOME:-$HOME/.larry}" # ─────────────────────────────────────────────────────────────────────────────