jetson-link-docs
Overview
This skill
writes the
block of the active Jetson /
IGX target-platform profile YAML so downstream skills
(
,
, camera / pcie /
uphy, etc.) can resolve doc paths by name. It walks the user through
every document slot in the profile schema, tries to auto-bind each
slot to a file under
via case-insensitive
glob matching, and writes the resulting paths back into the active
profile.
Scope is
registering pointers only — this skill does
not fetch
or download. The files must already exist on disk under
.
When to invoke
- After finishes and the user has documents
on disk to register.
- The user wants to add, change, or remove document references on an
existing profile.
- A downstream skill (e.g. ) reports "no documents
recorded" and the user wants to fix that.
Procedure
Resolve the active target
Resolve the active profile +
per the contract in
../../context/target-platform-contract.md
.
Cache the loaded profile in memory — this skill mutates it in
the "Write the
block back to the profile" step.
Load the document-slot schema
Load
../../references/platform_template.yaml
.
Parse the
block. Each per-document field is marked
. Use the marker description as prompt text
verbatim. Match markers with the regex
^<(REQUIRED|OPTIONAL|DERIVED):\s*(.*)>$
after YAML parsing strips
surrounding quotes.
Skip
and
custom_carrier_pinmux_xls
entirely when the active profile has no
block —
both are meaningless without one. This filter applies through the "Scan and auto-match" and "Manual prompts for unmatched fields" steps.
Resolve
Default:
. If the profile already records
, use it. Otherwise, if
exists, use it (the field is
omitted from the written profile —
downstream skills fall back to the workspace default). If neither is
available, prompt the user for an absolute path, or accept Enter /
to skip the auto-scan. A user-provided path that doesn't
exist is treated as skipped (warn, don't refuse — the field is
OPTIONAL); manual prompts in the "Manual prompts for unmatched fields" step still run.
Resolve the product token
Read the
Product Token column from
../../references/bsp-platforms-catalogue.md
for the row matching
. The token is a
case-insensitive glob fragment (e.g.
,
)
consumed by the fallback patterns in the "Scan and auto-match" step.
If
has no row in the catalogue, log a warning
and proceed without a product-token fallback — the "Scan and auto-match" step still works
with strictly SKU-keyed matching.
For custom carriers, derive
from
using this recipe: lowercase, replace each space with
, wrap in
on both ends. E.g. "Acme Vision X1" →
.
Scan and auto-match
Skip this step entirely if
did not resolve in
the "Resolve
" step (no scan target → no auto-suggest; fall through to manual
prompts in the "Manual prompts for unmatched fields" step).
Scan the directory once (one level deep) and try to auto-match each
remaining
field using the case-insensitive globs below.
Use the lower-case
/
/
strings from the profile in the SKU column.
| Field | SKU glob (primary) | Product-token glob (fallback) |
|---|
| , | (no fallback — pattern is product-agnostic) |
| , | (no fallback — same) |
| *<module.id>*data*sheet*.pdf
, *<module.id>*datasheet*.pdf
| , |
| *<module.id>*design*guide*.pdf
, | , |
module_thermal_design_guide
| *<module.id>*thermal*.pdf
(covers "Thermal Design Guide" / "TDG") | |
| | |
| *<carrier.id>*board*spec*.pdf
, | |
| | <token>carrier*schem*.pdf
|
| *<custom_carrier.id>*schem*.pdf
(only if custom carrier) | (only if custom carrier) |
| *<carrier.id>*pinmux*.xls*
(matches , , ) | |
custom_carrier_pinmux_xls
| *<custom_carrier.id>*pinmux*.xls*
(only if custom carrier) | <custom-token>pinmux*.xls*
(only if custom carrier) |
is the catalogue-resolved product token;
is derived from
per the "Resolve the product token" step. Tokens already
include leading/trailing
, so the table does not repeat them.
Match policy per field
For each field that has auto-match results:
- Take the union of hits across the SKU glob and the product-
token glob, then deduplicate by absolute path — a file matched
by both globs counts once.
- Exactly 1 unique hit → show the path and prompt
use this? (yes/no, default yes)
. On , record it and skip
the manual prompt for that field. On , fall through to the
manual prompt in the "Manual prompts for unmatched fields" step.
- 0 hits → skip auto-suggest entirely for that field; fall
through to the "Manual prompts for unmatched fields" step.
- 2+ unique hits → present them as a numbered list in the "Manual prompts for unmatched fields" step so
the user can pick by number rather than typing a path; include a
option. Never silently bind a multi-hit candidate.
- Never silently bind without user confirmation —
wrong-schematic / wrong-pinmux bindings are real and costly.
If
is folder-organised one level deeper than
flat (NVIDIA archives often are:
,
,
, etc.), the file globs may return zero hits even when the
right documents exist. v0.2 only scans one level deep — when 0 hits
is suspicious (
exists but no fields auto-bound),
surface the limitation to the user and offer to fall through to
manual prompts.
Manual prompts for unmatched fields
For every field that wasn't auto-bound (and wasn't filtered out in
the "Load the document-slot schema" step), prompt using the marker description from the "Load the document-slot schema" step as prompt
text, in document order. Accept Enter and
interchangeably as
"skip this field". When the "Match policy per field" step produced 2+ candidate hits for a
field, present them as a numbered list with a
option
rather than asking for a free-text path.
Validate that user-provided paths exist on disk (warn if not, but do
not refuse — the user may be recording a planned path). URLs (values
starting with
,
, or
) are accepted
verbatim and not validated.
Write the block back to the profile
Edit
target-platform/<active>.yaml
in place. Preserve all other
top-level blocks (
,
,
,
) and their comments verbatim. Write only the
fields the user provided — omit skipped /
fields entirely (no
placeholders, no empty keys).
Edge behavior: when every field was skipped (including
), drop the
block entirely from
the profile — never write
or a block of
values.
When only
was provided (no per-document
binding), record it alone — the path has value as a hint for future
re-runs. On re-run with an existing
block, merge:
existing bindings are preserved unless the user picks a new file or
; newly bound fields are added.
Confirm
Print a summary:
- Profile path written.
- — resolved value (or "default — omitted").
- Auto-bound fields: count + per-field one-line list.
- Manually entered fields: count + list.
- Skipped fields: count.
- A reminder that re-reads and
should be re-run if a KB exists.
If a downstream skill triggered this run, tell the user to re-issue
their original request; do not silently re-trigger it.
Gotchas
- Active profile must exist. This skill writes back to whichever
profile is active. If no profile is active, refuse and route to
/ .
- Product-token globs are intentionally broad. A token like
matches both Orin-Nano-specific docs and combined
Orin-NX/Nano docs (e.g.
Jetson-Orin-NX-Nano-Design-Guide_…
). That
is usually correct for module-side docs (NVIDIA ships combined
manuals), but verify on schematic / pinmux / spec fields where
wrong-product binding is costly.
- Update
bsp-platforms-catalogue.md
when adding new product
rows. The Product Token column is consumed by the "Resolve the product token" step; a
missing token degrades the auto-scan to SKU-only matching (the
skill warns and continues, but doc-rich
scans will degrade silently from "5 auto-binds" to "fewer auto-
binds").
- Use a round-tripping YAML loader. the "Write the block back to the profile" step mutates an existing
YAML file. Plain + loses comments,
block ordering, and quoting style — use or
equivalent so hand-edited fields and comments survive.
- Re-runnable. Re-running merges new bindings; existing
bindings are preserved unless the user explicitly changes them.
Safe to invoke as part of a profile refresh.
Prerequisites
- Active target profile resolved per
../../context/target-platform-contract.md
.
- Documents available either under the recorded ,
under default , or as user-provided paths /
URLs during manual prompts. A missing root only disables auto-scan; it
is not a hard prerequisite.
- or another round-tripping YAML writer for the profile
edit step.
Limitations
- Registers pointers only; never downloads, copies, or renames files.
- Per-document field set is fixed to the schema in
../../references/platform_template.yaml
— no ad-hoc keys.
- Glob matching is filename-only; bad filenames in
will under-bind and require manual selection.
Troubleshooting
- missing — auto-scan is skipped. Provide an
absolute root path, enter individual document paths / URLs manually,
or skip the fields you do not want to bind.
- Multiple files match a single slot — the skill stops and prompts;
pick or rename the file. Example: two
Jetson-Linux-Developer-Guide*.pdf
files → keep the active version,
rename the stale one.
- Profile comments lost after write — a non-round-tripping YAML
writer was used; switch to and rerun against a fresh
pristine copy.
- Validation fails because a binding points outside
— are relative paths only; move
the file under the root and retry.
References
../../context/target-platform-contract.md
— target-platform contract; this skill consumes and mutates the active profile.
../../references/bsp-platforms-catalogue.md
— source of the Product Token column for the "Resolve the product token" step.
../../references/platform_template.yaml
— schema for the block (source of truth for prompts and field list).
../jetson-init-target/SKILL.md
— sibling skill that authors target identity (, optional ).
../jetson-init-image/SKILL.md
— sibling skill that authors .
../jetson-init-source/SKILL.md
— sibling skill: clones shared repos and handles overrides.
../jetson-generate-kb/SKILL.md
— sibling skill: consumes the block this skill writes.