npx skills add ...
npx skills add nvidia/skills --skill jetson-link-docs
Bind pre-downloaded Jetson reference docs (developer guide, design guide, pinmux, schematics) into the active profile documents block. Use after staging docs on disk; not for downloading.
npx skills add nvidia/skills --skill jetson-link-docs
This skill writes the documents: block of the active Jetson /
IGX target-platform profile YAML so downstream skills
(/jetson-generate-kb, /jetson-customize-pinmux, 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 <documents.root_path>/ 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
<documents.root_path>/.
/jetson-init-target finishes and the user has documents
on disk to register.jetson-generate-kb) reports "no documents
recorded" and the user wants to fix that.Resolve the active profile + <workspace> per the contract in
../../context/target-platform-contract.md.
Cache the loaded profile in memory — this skill mutates it in
the "Write the documents: block back to the profile" step.
Load
../../references/platform_template.yaml.
Parse the documents: block. Each per-document field is marked
<OPTIONAL: description>. Use the marker description as prompt text
verbatim. Match markers with the regex
^<(REQUIRED|OPTIONAL|DERIVED):\s*(.*)>$ after YAML parsing strips
surrounding quotes.
Skip custom_carrier_schematic and custom_carrier_pinmux_xls
entirely when the active profile has no custom_carrier: block —
both are meaningless without one. This filter applies through the "Scan and auto-match" and "Manual prompts for unmatched fields" steps.
documents.root_pathDefault: <workspace>/Documents. If the profile already records
documents.root_path, use it. Otherwise, if <workspace>/Documents/
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 /
cancel 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.
Read the Product Token column from
../../references/bsp-platforms-catalogue.md
for the row matching reference_devkit.name. The token is a
case-insensitive glob fragment (e.g. *orin*nano*, *agx*thor*)
consumed by the fallback patterns in the "Scan and auto-match" step.
If reference_devkit.name 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 <custom-token> from custom_carrier.name
using this recipe: lowercase, replace each space with *, wrap in
* on both ends. E.g. "Acme Vision X1" → *acme*vision*x1*.
Skip this step entirely if documents.root_path did not resolve in
the "Resolve documents.root_path" 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 <OPTIONAL:…> field using the case-insensitive globs below.
Use the lower-case module.id / carrier.id / custom_carrier.id
strings from the profile in the SKU column.
| Field | SKU glob (primary) | Product-token glob (fallback) |
|---|---|---|
bsp_developer_guide | *developer*guide*.pdf, *BSP*guide*.pdf | (no fallback — pattern is product-agnostic) |
soc_tech_ref_manual | *TRM*.pdf, *tech*ref*manual*.pdf | (no fallback — same) |
module_data_sheet | *<module.id>*data*sheet*.pdf, *<module.id>*datasheet*.pdf | <token>data*sheet*.pdf, <token>datasheet*.pdf |
module_design_guide | *<module.id>*design*guide*.pdf, *<module.id>*PDG*.pdf | <token>design*guide*.pdf, <token>PDG*.pdf |
module_thermal_design_guide | *<module.id>*thermal*.pdf (covers "Thermal Design Guide" / "TDG") | <token>thermal*.pdf |
module_schematic | *<module.id>*schem*.pdf | <token>schem*.pdf |
carrier_board_spec | *<carrier.id>*board*spec*.pdf, *<carrier.id>*spec*.pdf | <token>carrier*spec*.pdf |
carrier_schematic | *<carrier.id>*schem*.pdf | <token>carrier*schem*.pdf |
custom_carrier_schematic | *<custom_carrier.id>*schem*.pdf (only if custom carrier) | <custom-token>schem*.pdf (only if custom carrier) |
ref_devkit_pinmux_xls | *<carrier.id>*pinmux*.xls* (matches .xls, .xlsx, .xlsm) | <token>pinmux*.xls* |
custom_carrier_pinmux_xls | *<custom_carrier.id>*pinmux*.xls* (only if custom carrier) | <custom-token>pinmux*.xls* (only if custom carrier) |
<token> is the catalogue-resolved product token; <custom-token>
is derived from custom_carrier.name per the "Resolve the product token" step. Tokens already
include leading/trailing *, so the table does not repeat them.
For each field that has auto-match results:
use this? (yes/no, default yes). On yes, record it and skip
the manual prompt for that field. On no, fall through to the
manual prompt in the "Manual prompts for unmatched fields" step.skip / NA option. Never silently bind a multi-hit candidate.If documents.root_path is folder-organised one level deeper than
flat (NVIDIA archives often are: Schematics/, Design-Guides/,
Pinmux/, 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 (documents.root_path exists but no fields auto-bound),
surface the limitation to the user and offer to fall through to
manual prompts.
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 NA 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 skip / NA 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 http://, https://, or ftp://) are accepted
verbatim and not validated.
documents: block back to the profileEdit target-platform/<active>.yaml in place. Preserve all other
top-level blocks (reference_devkit:, custom_carrier:,
bsp_image:, source:) and their comments verbatim. Write only the
fields the user provided — omit skipped / NA fields entirely (no
NA placeholders, no empty keys).
Edge behavior: when every field was skipped (including
documents.root_path), drop the documents: block entirely from
the profile — never write documents: {} or a block of NA values.
When only documents.root_path 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 documents: block, merge:
existing bindings are preserved unless the user picks a new file or
NA; newly bound fields are added.
Print a summary:
documents.root_path — resolved value (or "default — omitted").jetson-generate-kb re-reads documents.* 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.
jetson-set-target / jetson-init-target.*orin*nano* 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.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 documents.root_path
scans will degrade silently from "5 auto-binds" to "fewer auto-
binds").documents: block back to the profile" step mutates an existing
YAML file. Plain yaml.safe_load + yaml.safe_dump loses comments,
block ordering, and quoting style — use ruamel.yaml or
equivalent so hand-edited fields and comments survive.../../context/target-platform-contract.md.documents.root_path,
under default <workspace>/Documents/, or as user-provided paths /
URLs during manual prompts. A missing root only disables auto-scan; it
is not a hard prerequisite.ruamel.yaml or another round-tripping YAML writer for the profile
edit step.../../references/platform_template.yaml — no ad-hoc keys.documents.root_path will under-bind and require manual selection.documents.root_path 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.Jetson-Linux-Developer-Guide*.pdf files → keep the active version,
rename the stale one.ruamel.yaml and rerun against a fresh
pristine copy.documents.root_path — documents.* are relative paths only; move
the file under the root and retry.../../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 documents: block (source of truth for prompts and field list).../jetson-init-target/SKILL.md — sibling skill that authors target identity (reference_devkit:, optional custom_carrier:).../jetson-init-image/SKILL.md — sibling skill that authors bsp_image:.../jetson-init-source/SKILL.md — sibling skill: clones shared repos and handles source.root_path overrides.../jetson-generate-kb/SKILL.md — sibling skill: consumes the documents: block this skill writes.