A template source is a Git repository whoseDocumentation Index
Fetch the complete documentation index at: https://docs.tensor9.com/llms.txt
Use this file to discover all available pages before exploring further.
*.tensor9.{tf,sh,kubectl}
and *.t9.{tf,sh,kubectl} files become Tensor9 ops command templates
in your control plane. You register the source once; later, as the repo
evolves, you re-sync to discover new templates, upgrade modified ones,
or retire those removed upstream.
This is the canonical way to maintain a library. The open-source
tensor9ine/cmdlib repo is laid out exactly this way and is a good
starting point if you’re new to authoring templates.
- Templates live in code review. Pull requests against the repo gate every change before customers ever see it.
- Resync surfaces drift. When the repo lands new templates or
modifies existing ones,
tensor9 ops template source resyncshows the four-bucket diff (unchanged, modified, new, removed) without committing anything. - Upgrades are explicit.
tensor9 ops template source upgradeis a separate step. Diff first, then apply only the picks you want, scoped by file or action kind.
A reference layout
Thecmdlib repo groups templates by category. Each subdirectory
contributes one template per .tensor9.* file inside it:
linux/ and darwin/ carry a disk-usage.tensor9.tf. They
coexist because Tensor9 prefixes the parent directory name onto the
imported template, producing linux-disk-usage and darwin-disk-usage
as distinct templates. See “Conflict resolution” below for the cases
where the prefix alone does not disambiguate.
Registering a source
gh to clone the repo at HEAD, walks every
matching file in the tree, ships the raw bytes to the appliance for
parsing, and persists one template per file plus a single
OpsCmdTmplSrc row binding the source to its templates.
Useful flags:
| Flag | Purpose |
|---|---|
--branch | Override the branch (default: the repo’s default branch). |
--dirs | Comma-separated directories to track (default: every dir containing .tensor9.* files). |
--dry-run | Walk and print what would be imported. No control-plane writes. |
--conflict-policy | How to handle template-name conflicts in the target app. See below. |
gh auth login must succeed first. The action will fail with a clear
message if the GitHub CLI is missing or unauthenticated.
Conflict resolution
The persisted template name is the dir-prefixed file stem (linux-disk-usage from linux/disk-usage.tensor9.tf). A name
conflict happens when that stem already exists in the target app
because, say, the same source was registered before and you are
re-importing.
--conflict-policy controls the bulk behavior:
| Value | Effect |
|---|---|
fail (default) | Abort the whole register on the first conflicting name. Safest for first-time imports. |
skip-all | Skip every conflicting file. The non-conflicting subset still imports. |
duplicate-all | Auto-rename each conflicting file with a -N suffix (linux-disk-usage-2, then -3, etc.). |
Resyncing against HEAD
| Bucket | Meaning |
|---|---|
Unchanged | Tracked template whose source file at HEAD has the same content hash. No action needed. |
Modified | Tracked template whose source file at HEAD has a different content hash. Run tensor9 ops template source upgrade to mint a new lineage version. |
New available | File at HEAD that no tracked template owns. Run tensor9 ops template source upgrade --actions add to import. |
Removed upstream | Tracked template whose source file vanished from HEAD. Run tensor9 ops template source upgrade --actions retire-here to drop the source binding. |
Resync walks the whole repo, not just the directories you selected
at register time. If a new sibling directory landed upstream after you
registered (a
darwin/ next to your originally-selected linux/), its
files surface as New available automatically. You do not need to
re-register the source to track new dirs.Applying the diff: upgrade
tensor9 ops template source upgrade applies every action
the diff implies: evolve modified templates, add newly-available
ones, retire-here those removed upstream. Tracked template lineages
are versioned, so an upgrade mints v1.1.0 (or the appropriate
semver bump) without breaking customers who pre-approved v1.0.0.
Scoping with --only and --actions
Two filters narrow what the upgrade does:
--actions accepts any subset of upgrade, add, retire-here. --only
restricts to a CSV of file names matching what
tensor9 ops template source resync listed.
What “retire-here” means
When a source file vanishes from upstream, customers who ran the template before still have valid pre-approvals against the persisted template versions.retire-here deprecates the latest version (so new
runs surface a deprecation notice) and drops the binding from the
source’s tracked id list. The template lineage itself stays in your
control plane until you explicitly revoke or evolve it. Customers can
keep using already-approved versions until pre-approvals expire.
Inventory
retrieve shows the GitHub coordinates, last-synced commit, selected
directories, and the imported template id list.
Retiring a source
tensor9 ops template source resync or
tensor9 ops template source upgrade. Use --auto to skip the
confirmation prompt in scripts.
End-to-end example
Related
- Authoring templates: the file format, variables, data access tags, permission tiers.
- Submitting and tracking ops commands: use a registered template to actually run something.