Spikard
Goldziher/spikard
Scaffold Spikard projects and generate code from OpenAPI, AsyncAPI, OpenRPC, GraphQL, and Protobuf schemas using the Spikard CLI or its MCP server.
Pre-flight a LunCoSim .mo, .usda, .sysml, .kerml, .wgsl, or .rhai asset with ValidateAsset or the production CLI, or inspect one Twin's resolver namespaces with ValidateTwin.
$ npx skills add LunCoSim/lunco-sim --skill validate-assets -a claude-codeProject install by default; add -g for ~/.claude/skills/.
$ gh skill install LunCoSim/lunco-sim validate-assets --agent claude-codeProject scope by default; add --scope user for a personal install. Needs GitHub CLI 2.90.0 or later (public preview).
$ git clone --depth 1 https://github.com/LunCoSim/lunco-sim.git skills-src && mkdir -p .claude/skills && cp -r skills-src/skills/validate-assets .claude/skills/validate-assets && rm -rf skills-srcUse ~/.claude/skills/ instead of .claude/skills for a personal install. The folder must contain SKILL.md.
Claude Code skills documentation · loads skills from .claude/skills/
Install the "validate-assets" agent skill from https://github.com/LunCoSim/lunco-sim/tree/main/skills/validate-assets into .claude/skills/validate-assets/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "validate-assets", then confirm the skill loads.Claude Code copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$skill-installer install https://github.com/LunCoSim/lunco-sim/tree/main/skills/validate-assetsType this inside Codex. $skill-installer <name> installs a curated skill from openai/skills. The installer writes to $CODEX_HOME/skills (default ~/.codex/skills). Restart Codex if the skill does not show up.
$ npx skills add LunCoSim/lunco-sim --skill validate-assets -a codexProject install goes to .agents/skills/; add -g for ~/.codex/skills/.
$ gh skill install LunCoSim/lunco-sim validate-assets --agent codexProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/LunCoSim/lunco-sim.git skills-src && mkdir -p .agents/skills && cp -r skills-src/skills/validate-assets .agents/skills/validate-assets && rm -rf skills-srcUse ~/.agents/skills/ instead of .agents/skills for a personal install.
Codex skills documentation · loads skills from .agents/skills/
Install the "validate-assets" agent skill from https://github.com/LunCoSim/lunco-sim/tree/main/skills/validate-assets into .agents/skills/validate-assets/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "validate-assets", then confirm the skill loads.Codex copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ npx skills add LunCoSim/lunco-sim --skill validate-assets -a cursorProject install goes to .agents/skills/; add -g for ~/.cursor/skills/.
$ gh skill install LunCoSim/lunco-sim validate-assets --agent cursorProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/LunCoSim/lunco-sim.git skills-src && mkdir -p .cursor/skills && cp -r skills-src/skills/validate-assets .cursor/skills/validate-assets && rm -rf skills-srcUse ~/.cursor/skills/ instead of .cursor/skills for a personal install.
Cursor skills documentation · loads skills from .cursor/skills/, .agents/skills/, .claude/skills/, .codex/skills/
Install the "validate-assets" agent skill from https://github.com/LunCoSim/lunco-sim/tree/main/skills/validate-assets into .cursor/skills/validate-assets/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "validate-assets", then confirm the skill loads.Cursor copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ gemini skills install https://github.com/LunCoSim/lunco-sim.git --path skills/validate-assets--scope user (default) or --scope workspace; --path is the subfolder of the repo that holds the skill; --consent skips the security confirmation prompt.
$ npx skills add LunCoSim/lunco-sim --skill validate-assets -a gemini-cliProject install goes to .agents/skills/; add -g for ~/.gemini/skills/.
$ gh skill install LunCoSim/lunco-sim validate-assets --agent gemini-cliProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/LunCoSim/lunco-sim.git skills-src && mkdir -p .gemini/skills && cp -r skills-src/skills/validate-assets .gemini/skills/validate-assets && rm -rf skills-srcUse ~/.gemini/skills/ instead of .gemini/skills for a personal install, then run /skills reload.
Gemini CLI skills documentation · loads skills from .gemini/skills/, .agents/skills/
Install the "validate-assets" agent skill from https://github.com/LunCoSim/lunco-sim/tree/main/skills/validate-assets into .gemini/skills/validate-assets/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "validate-assets", then confirm the skill loads.Gemini CLI copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ gh skill install LunCoSim/lunco-sim validate-assetsInstalls for Copilot at project scope by default; add --scope user for a personal install. Preview a skill first with gh skill preview. Needs GitHub CLI 2.90.0 or later (public preview).
$ npx skills add LunCoSim/lunco-sim --skill validate-assets -a github-copilotProject install goes to .agents/skills/; add -g for ~/.copilot/skills/.
$ git clone --depth 1 https://github.com/LunCoSim/lunco-sim.git skills-src && mkdir -p .github/skills && cp -r skills-src/skills/validate-assets .github/skills/validate-assets && rm -rf skills-srcUse ~/.copilot/skills/ instead of .github/skills for a personal install. Commit .github/skills so cloud agent and code review can use it.
GitHub Copilot skills documentation · loads skills from .github/skills/, .claude/skills/, .agents/skills/
Install the "validate-assets" agent skill from https://github.com/LunCoSim/lunco-sim/tree/main/skills/validate-assets into .github/skills/validate-assets/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "validate-assets", then confirm the skill loads.GitHub Copilot copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ npx skills add LunCoSim/lunco-sim --skill validate-assets -a opencodeOpenCode documents no install command of its own. Project install goes to .agents/skills/; add -g for ~/.config/opencode/skills/.
$ gh skill install LunCoSim/lunco-sim validate-assets --agent opencodeProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/LunCoSim/lunco-sim.git skills-src && mkdir -p .opencode/skills && cp -r skills-src/skills/validate-assets .opencode/skills/validate-assets && rm -rf skills-srcUse ~/.config/opencode/skills/ instead of .opencode/skills for a personal install.
OpenCode skills documentation · loads skills from .opencode/skills/, .claude/skills/, .agents/skills/
Install the "validate-assets" agent skill from https://github.com/LunCoSim/lunco-sim/tree/main/skills/validate-assets into .opencode/skills/validate-assets/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "validate-assets", then confirm the skill loads.OpenCode copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
validate-assetsPre-flight a LunCoSim .mo, .usda, .sysml, .kerml, .wgsl, or .rhai asset with ValidateAsset or the production CLI, or inspect one Twin's resolver namespaces with ValidateTwin.
Validate Assets is an agent skill from LunCoSim/lunco-sim. Pre-flight a LunCoSim .mo, .usda, .sysml, .kerml, .wgsl, or .rhai asset with ValidateAsset or the production CLI, or inspect one Twin's resolver namespaces with ValidateTwin. Use for parse, reference, schema, shader-parameter, Modelica, SysML, namespace, or authored-lint checks. These are read-only queries; use RunLint for a loaded scene and test-via-api for runtime behavior.
Its SKILL.md is about 5.1k tokens, which your agent loads only when the skill is triggered. It is a single SKILL.md file with no bundled scripts.
It sits in Backend & APIs, covering GraphQL and Linting and formatting. It works with Rust. The repository describes itself as: Collaborative Multiphysics Cosimulator For Space Missions 🌎🚀🌚. The licence is Apache-2.0.
3 steps, taken from the first numbered list in SKILL.md.
Read from SKILL.md and the folder at commit d1c6f00. It shows what the files ask for, not the result of running them.
Pre-approves nothing: there is no allowed-tools line, so your agent's usual permission prompts apply.
From allowed-tools in the SKILL.md frontmatter.
Shell commands in SKILL.md call:
curlkindFrom the folder's file list and the shell code blocks in SKILL.md.
No URLs in SKILL.md. Its commands use curl, which can reach the network depending on how they are called.
From URLs in SKILL.md, links to its own repository left out.
Names no API keys, tokens, secrets or passwords.
From names ending in _API_KEY, _TOKEN, _SECRET, _KEY or _PASSWORD in SKILL.md.
Validate Assets loads about 5.1k tokens when it runs. Until then it costs about 103 tokens; SKILL.md has 2,384 words of instructions outside code blocks.
Estimates: characters ÷ 4, the usual rule of thumb; real counts depend on the model's tokenizer. Scripts and assets cost tokens only if the agent reads them.
The automated check found no risky patterns in SKILL.md.
Automated static check — not a guarantee. Review scripts before installing. It scans the text of SKILL.md for risky patterns (piping downloads into a shell, reading credential files, hidden Unicode, destructive commands); files beside SKILL.md are not scanned.
The full file from LunCoSim/lunco-sim at commit d1c6f00, republished under its Apache-2.0 licence (© LunCoSim). 2,384 words, ~5,085 tokens.
.claude/skills/validate-assets/SKILL.md (or your agent's skills folder).ValidateAsset answers one question — does this file parse, and would the
engine accept it? — without mounting a scene or starting simulation. Runtime
queries prepare fresh source facts asynchronously, then apply the authored lint
policy serially in the captured runtime context. Browser preparation uses the
cooperative executor; it does not promise a separate CPU worker.
Implementation: crates/lunco-scene-validation/src/validate.rs.
Related: author-usd-component (author the
file), use-asset-library (get it discovered),
build-vehicle (wheels), test-via-api
(drive the running app once it validates), and
sysml-requirements (Twin source sets and
verification cases).
"$LUNCOSIM_BIN" --validate \
assets/models/LunCo/Electrical/Battery.mo \
assets/vessels/rovers/skid_rover.usda \
assets/shaders/rover_hull.wgsl \
requirements/system.sysmlThe flag is intercepted in crates/lunco-luncosim/src/bin/luncosim.rs
before the Bevy App is built, and the process exits — nothing is
rendered, no window opens, no port is bound. Run it anywhere, any time.
For a WGSL file, this pre-flight validates the file's standalone source/schema
contract. It cannot decide whether the file is a fragment or vertex stage when
it is not referenced by a USD material. That role is authored by the USD
Shader prim (info:wgsl:sourceAsset and optional
info:wgsl:vertexAsset) and is checked by the production USD/render boundary.
Use an authored USD + Rhai scene test for that contract; do not add a Rust test
that reads a repository shader path to simulate it.
This ownership rule applies to every asset type: if a test names a shipped or
Twin asset, author the fixture and assertion beside the asset as USD/Rhai and
observe it through ValidateAsset or the live API. Calling
lunco-assets-core/lunco-storage from a Rust test is the correct access path
for an asset-owning mechanism, but it does not turn an authored asset contract
into a Rust mechanism test. Rust fixtures should be inline or temporary and
should test only the generic parser, resolver, or storage behavior.
| Exit code | Meaning |
|---|---|
| 0 | every report ok |
| 1 | at least one report failed |
| 2 | --validate given with no paths |
--validate up to the first argument
starting with --.--validate=path and -v are not parsed.OK <path> (<kind>) / FAIL <path> (<kind>), then
indented error: and warning: lines on stdout.curl -s -X POST http://127.0.0.1:4101/api/commands \
-H "Content-Type: application/json" \
-d '{"type":"ExecuteCommand","command":"ValidateAsset","params":{"path":"lunco://models/LunCo/Electrical/Battery.mo"}}'The initial request admits one operation and returns
{"state":"pending","operation_id":N}. Poll the same query with only
{"operation_id":N} until it returns ready or failed. ready contains
report and source_revisions from the actual reads; failed contains its
actual diagnostic. Both terminal results are consumed once. Unknown,
consumed, or retired operation IDs reject visibly. Never resubmit path while
waiting: that would admit a different operation.
curl -s -X POST http://127.0.0.1:4101/api/commands \
-H 'Content-Type: application/json' \
-d '{"type":"ExecuteCommand","command":"ValidateAsset","params":{"operation_id":1}}'Use the returned ID in place of 1. Admission is bounded by the shared
AsyncWorkAdmission; running tasks and unconsumed results retain their permit.
lunco-scene-validation registers the providers. The CLI remains a native
synchronous entry point over the same validators.
{"path":"…", "kind":"modelica|usd|sysml|wgsl|rhai|unknown",
"ok":true, "errors":[], "warnings":[], "info":{}}Runtime ready.report contains this shape; native CLI reports use it directly.
ok == errors.is_empty(). Warnings never fail a file. path echoes what you
passed, not the resolved disk path — if you need to know which file was read,
pass an unambiguous one.
Use ValidateTwin when the question spans the complete Twin rather than one
file. It reads the indexed Twin folder and compares only names that share a
real resolver namespace and scope. The report includes each entry's owner,
source, domain, scope, and resolution rule, plus the complete collision group.
Equal names in independent Modelica roots, asset directories, or USD stages are
not reported.
curl -s -X POST http://127.0.0.1:4101/api/commands \
-H 'content-type: application/json' \
-d '{"type":"ExecuteCommand","command":"ValidateTwin","params":{"path":"/work/rover-twin","policy":"error"}}'path is required: use the current twin://<assigned-authority> for a
mounted Twin on either platform; native callers may also supply a directory or
standard file URI. Browser native-directory inspection is not available.
Poll its returned operation ID using the same protocol as ValidateAsset.
policy is optional: warn (the default) makes namespace collisions warnings;
error makes those collisions fail the report. Source-read failures fail the
prepared report. The query does not rename files or choose a winner. Its Rhai policy
is assets/scripting/policy/lint_twin.rhai, so a running session can replace
lint.twin for the next explicit check.
For the active Twin in a running scene, use the live command instead:
cmd("RunLint", #{scope: "twin", policy: "warn"});
query("GetDiagnostics", #{scope: "twin"});RunLint and ValidateTwin share namespace facts and Rhai policy. Runtime
ValidateTwin captures indexed source identity, owner, mount, and policy at
admission and rejects publication after retirement or indexed source-set changes. Twin RunLint also uses the shared async preparation owner on native and
mounted browser sources. Its queued Ack identifies the lint revision; inspect
GetDiagnostics until that scope is ready or failed. Source failures fail the
scope independently of collision severity. Captured owner, mount, scene, policy,
and Rhai context fence publication; superseded or retired work is discarded.
Loaded-stage lint works on either platform.
For a composed document, ValidateAsset is still the file-level gate. Use the
live Rhai model_authoring facades for the next question: whether the exact
assembly is understandable and ready to use. Call model_context first, then
readiness_report with the Twin's explicit policy; use port_graph/
wiring_plan for cross-domain endpoints and publish_component before an
explicit Save-As. These facades validate composed document identity and
generation and return dry plans; they do not replace ValidateAsset, mutate
the stage, or silently save. See the model-authoring guide.
| Ext | Checks | Can it FAIL? |
|---|---|---|
.mo | rumoca parse_to_syntax + AST facts + authored lint.modelica policy | yes |
.sysml/.kerml | SysML parser/resolver + typed requirement/verification facts + authored lint.sysml policy | yes |
.usd/.usda/.usdc | byte-layer preparation → compose the reference closure → strict WheelParams::read on every PhysxVehicleWheelAPI prim | yes |
.wgsl | ParamSchema::parse — reflect the struct Material uniform + //!@ annotations | no — warnings only |
.rhai | rhai::Engine::new().compile(), nothing executed | yes |
| anything else | unsupported extension error | yes |
USD extensions enter the same byte-layer owner. Text layers compose normally. Binary USDC currently fails the dependency inspector's UTF-8/text-layer boundary with a diagnostic; recognizing its extension does not establish binary composition support.
For a Twin source set, use ValidateSysml for source status, diagnostics, and
source identity; use AnalyzeSysml when a policy needs typed semantic facts.
Manifest bindings are a separate active-Twin contract read and are joined with
SysML identities by Rhai policy. See
sysml-requirements.
.mo — the branch-free policy is the pointRumoca's solver path is branch-free. ValidateAsset parses once through the
shared lunco-modelica-ast boundary, passes AST-derived declaration and
conditional-construct facts to the reloadable lint.modelica Rhai policy, and
returns its findings as errors. The policy covers conditional expressions,
structural equation branches, and algorithm if/when constructs. An if in a
binding or modifier is not an equation/algorithm construct and is not reported.
Fix a reported branch by rewriting the model with branch-free arithmetic such
as max()/min(). Battery, network, and brownout equations belong in Modelica,
not a tick script.
info carries {model, params, inputs, outputs:null}. outputs is always
null — outputs are not knowable before a compile.
Lint boundary: parse failures remain visible as parser errors. Recovered AST facts are best-effort and carry
kind = "unknown"when declaration ownership cannot be proven; the policy reports that case as a warning rather than guessing.
.usda — this is the one that catches broken referencesThree stages, first failure short-circuits:
usda_to_data — this file's own syntax.subLayers + references + payload, including arcs inside variant
blocks). A dangling @lunco://…@ is a hard error here. This is the single
best reason to run it: bare paths silently no-load at runtime,
but a missing target fails loudly right here.WheelParams::read on every prim with PhysxVehicleWheelAPI — the same
strict reader the spawner uses. The error names every missing attribute:
wheel /Rover/Wheel_FL would refuse to spawn — missing required attributes: …info.wheel_prims lists each wheel with ok and, when failing, missing.
Three things it does not catch: binary leaf references (
.glb/.obj/.stlare not layers, so a broken mesh path passes); suspension-inherited wheel attrs — the reader is called with no attachment suspension, so a wheel that only validates once its suspension arc composes at spawn time is judged without it; and collider relationships, which are where many mechanism bugs live. The composed USD lint does catch an unowned renderable vehicle gprim and an enabled collider shape that the runtime reader cannot build.That remaining limit is worth knowing. The static lint cannot see that two colliders on the same vehicle overlap, or that a strut hangs lower than the foot that is supposed to carry it — facts about assembled motion and contact, not just ownership and shape support. Clearance is a runtime check: run the scene under
luncosim testand assert the mechanism moved (seeauthor-usd-physics). A vehicle can pass static validation and still land on its shins.
.wgsl — cannot fail, read the warningsThere is no naga validation — deliberately. A syntactically broken shader
that still contains a parsable struct Material reports ok: true. What you get
is the reflected param schema (info.shader_params with name/type/offset/
ui/default, plus uniform_size) and two possible warnings:
no reflectable Material struct — the shader exposes no tunable params and
cannot be driven by SetObjectProperty.not prop-pickable: engine fields beyond sun_vis — it uses //!@engine
params only the terrain pipeline fills, so the prop-material picker skips it.
It still works as a scene shader. See
use-asset-library § Shaders.Runtime logical lunco:// and current twin:// addresses use the registered
Bevy asset reader and the shared USD dependency-closure reader. Literal #,
%, and Unicode path characters retain their typed asset identity. Native
paths and standard file URIs use captured FileDocumentAdmission and bounded
storage reads on the preparation task, then validate exact ownership before
publication. A raw native path is checked as given before native engine-root
resolution; prefer a root-qualified logical address to avoid CWD ambiguity.
Browser callers use registered logical sources; unsupported unmounted USD file sources reject explicitly. Native CLI resolution remains native path first, then the engine asset owner; it has no live Twin mount registry.
The host may configure the public QueryPreparationLimits resource. Its
StageClosureLimits bound files, depth, and bytes; query reads are serial by
default. Twin preparation passes its remaining aggregate budget into each
closure before any dependency read. A completed query records actual source
content revisions, rather than treating dispatch-time paths as fresh reads.
Everything above is what the loader would refuse: parse, compose,
WheelParams. Compiled, because it is the loader's own code. A second tier runs
on the same call and answers a different question — is this right? Those
rules live in assets/scripting/policy/lint_<domain>.rhai and are reached
through the lint.<domain> hook, so adding, tightening or silencing one is an
edit to a script, not a rebuild.
Findings arrive in the same report: error severity joins errors (and flips
ok), everything else joins warnings. Each line is prefixed with its domain
and rule id, which is what you grep for:
[usd/nested-body-no-joint] /Rover/Motor_FL — applies PhysicsRigidBodyAPI inside
the body </Rover> but no joint names it — it is a SEPARATE body held by nothing
and will fall out of the vehicle. …The USD rules include nested-body-no-joint (error), joint-target-not-a-body (error),
collision-enabled-without-api (error for ordinary geometry; wheel realizations
use their dedicated contract rules),
raycast-wheel-collision-contract (error),
physical-wheel-collision-contract (error),
vehicle-part-collision-contract (error),
dynamic-body-no-collider (warn), mass-outside-any-body (warn),
conditionally-stable-joint-drive (error),
joint-drive-negative-stiffness
(error), joint-drive-negative-damping (error), invalid-gear-drive (error),
and invalid-network-synthesizer (error). Collection ownership is derived
from the composed member role schemas by the same runtime classifier; an
absent selector does not make a physical actuator collection a Modelica
network. See
author-usd-physics
for the authoring rule they enforce and
docs/architecture/lint-substrate.md
for the design.
RunLintValidateAsset lints a file. After a scene is loaded, spawned into and
edited, no file describes what is running; lint that with the verb:
cmd("RunLint", #{}); // explicit loaded-stage lint
query("GetDiagnostics", #{scope: "loaded_stages"}); // poll complete; read diagnostics[]or {"type":"ExecuteCommand","command":"RunLint"} over HTTP/MCP. Nothing lints automatically at load,
on a physics tick, or on a background cadence — deliberately. An editor,
launcher, or caller explicitly repeats the command after an authored change, and
bind_policy("lint.usd", "lint_usd", my_rules); // next RunLint obeysre-shapes the rules for the next explicit lint run without a rebuild. Loaded
lint evidence can be deferred for one or more frames; wait until complete:true
before using ok:true as a clean result.
RunLint also checks the live projected port surface through the shared
PortRegistry, passing its owner collision facts to the authored lint.usd
policy. A port-owner-collision error identifies the composed entity,
inputs:/outputs: path, owner source/domain/backend, and the actual registry
precedence that wins reads or writes. Repeated inspection views of one owner
are deduplicated. This is live-only: ValidateAsset cannot see runtime owners
that are introduced by projection. Repair it in USD/Rhai authoring so one
semantic public name has one owner; rename a separate actuator (for example to
dock_release) instead of adding retries, fallbacks, or vehicle-specific Rust
input handlers.
USD connections have a second, explicit preflight contract. Static file lint
reports invalid property paths, missing source prims/properties, and authored
type mismatches. Loaded RunLint additionally checks runtime-provider
connections against the exact projected inputs:/outputs: port name and
reports a missing port as an error or an explicitly pending surface as a
warning. A runtime source without the standard direction namespace is an
error. Rust only supplies these facts; the Rhai USD policy chooses rule IDs,
severity, and wording. ValidateAsset cannot prove dynamic runtime names.
Control-binding validity is projected from the canonical
lunco_control_core::parse_user_intent parser and reported by the same Rhai USD policy.
The Rust validator does not maintain a second intent spelling list or produce
policy wording; unknown bindings are surfaced as
control-binding-unknown-intent findings.
edit .usda / .mo / .wgsl / .rhai
↓
--validate ← seconds, no GPU. Catches: syntax, broken refs, missing
↓ wheel attrs, if/when in Modelica, unparsable rhai.
load the scene ← test-via-api
↓
drive it / assert ← author-scenario, drivetrain_parityValidate every file you touched before you launch anything. A --validate
run costs seconds; a luncosim launch that dies on a typo costs a compile.
--validate is for.ValidateAsset to lunica and concluding the command doesn't
exist. It is luncosim-only; use the CLI..wgsl ok: true as "the shader compiles" — no naga runs.
Only a real load proves the pipeline builds.models/X.mo from an arbitrary CWD and trusting which file
was read — path in the report echoes your input, not the resolved path.twin:// address — unresolvable; use the filesystem path.ok and ignoring warnings on a .wgsl — that file can never
report ok: false, so the warnings ARE the result.if to a .mo equation section to "handle a case" — rewrite it
branch-free; the lint is enforcing a real solver constraint, not a style rule.[usd/…] lint error as "the file is broken syntax". It parsed and
composed fine — it says the file would load and then behave wrongly. Fix the
authoring, don't chase the parser.cmd("RunLint", #{}) is the check for those.assets/scripting/policy/lint_*.rhai;
only new FACTS are Rust, and only when no existing fact can answer the
question (facts.prims[].schemas answers most of them).© LunCoSim, Apache-2.0. Rendered from Markdown: HTML in the file is shown as text, images as links, and headings moved down two levels. Raw file
Just SKILL.md in skills/validate-assets of LunCoSim/lunco-sim.
Open the folder on GitHubat commit d1c6f00
Validate Assets next to the 5 skills that share the most tags, products or categories with it. Stars are the repository's; “used in” counts other GitHub owners with a copy.
| Skill | Stars | Used in | Tokens | Auto-check | Licence | Repo updated |
|---|---|---|---|---|---|---|
| Validate Assets this skillLunCoSim/lunco-sim | 107 | — | ~5.1k | Automated safety check: Pass | Apache-2.0 | |
| SpikardGoldziher/spikard | 123 | — | ~799 | Automated safety check: Pass | MIT | |
| Shopify AI Toolkit Wrapperjeremylongshore/tons-of-skills-marketplace | 2.8k | — | ~1.5k | Automated safety check: Pass | MIT | |
| Lintwheelos/apollo-lite | 171 | — | ~482 | Automated safety check: Pass | Apache-2.0 | |
| Reviewapollographql/apollo-mcp-server | 313 | — | ~2.9k | Automated safety check: Pass | MIT | |
| Mobile Platform Offline Validateforcedotcom/sf-skills | 1.1k | — | ~2k | Automated safety check: Pass | Apache-2.0 |
Goldziher/spikard
Scaffold Spikard projects and generate code from OpenAPI, AsyncAPI, OpenRPC, GraphQL, and Protobuf schemas using the Spikard CLI or its MCP server.
jeremylongshore/tons-of-skills-marketplace
Integrate Shopify's AI Toolkit MCP server with Claude Code for GraphQL validation, Liquid linting, and documentation search.
wheelos/apollo-lite
Apollo-Lite lint and formatting workflow. An agent skill from wheelos/apollo-lite.
apollographql/apollo-mcp-server
Review a GitHub pull request for a Rust codebase. An agent skill from apollographql/apollo-mcp-server.
forcedotcom/sf-skills
Review a Lightning Web Component for mobile offline compatibility — the Komaci offline static analyzer that pre-primes the data graph for Salesforce Mobile App Plus and Field Service Mobile App.
LeoYeAI/openclaw-master-skills
Self-healing China mirror source resolver. An agent skill from LeoYeAI/openclaw-master-skills.
LunCoSim/lunco-sim
Generate concise LunCoSim nightly GitHub release notes with platform downloads, installation guidance, an AI-agent mission prompt, and a changelog link.
LunCoSim/lunco-sim
Build or repair a reusable scene component through a live LunCoSim Editor session.
LunCoSim/lunco-sim
Build or review a componentized LunCoSim USD assembly with a realistic, dimensionally checkable presentation.
LunCoSim/lunco-sim
Author and review LunCoSim behavioral, asset-backed, component, mission, visual, and requirements-verification tests.
LunCoSim/lunco-sim
Create, extend, register, or debug a reusable LunCoSim Rhai tool library for live USD authoring, component linting, inspection, or test support.
LunCoSim/lunco-sim
Author an interactive tutorial, guided lesson, onboarding flow, coach-mark tour, or objectives checklist in LunCoSim.
Works with
Categories
Pre-flight a LunCoSim .mo, .usda, .sysml, .kerml, .wgsl, or .rhai asset with ValidateAsset or the production CLI, or inspect one Twin's resolver namespaces with ValidateTwin. Validate Assets is an agent skill from LunCoSim/lunco-sim.rhai asset with ValidateAsset or the production CLI, or inspect one Twin's resolver namespaces with ValidateTwin.
Validate Assets fits situations like: shader-parameter; authored-lint checks.
Run `npx skills add LunCoSim/lunco-sim --skill validate-assets -a claude-code`. Or copy the skill folder (skills/validate-assets in LunCoSim/lunco-sim) into .claude/skills/validate-assets in your project. Claude Code loads it when a task matches its description.
Run `npx skills add LunCoSim/lunco-sim --skill validate-assets -a codex`. Or copy the skill folder (skills/validate-assets in LunCoSim/lunco-sim) into .agents/skills/validate-assets in your project. Codex loads it when a task matches its description.
Cursor, Gemini CLI, GitHub Copilot and OpenCode also load SKILL.md folders. With the skills CLI, run `npx skills add LunCoSim/lunco-sim --skill validate-assets -a cursor` (or -a gemini-cli, github-copilot or opencode for the others). To copy it by hand, put the folder in .cursor/skills/validate-assets, .gemini/skills/validate-assets, .github/skills/validate-assets and .opencode/skills/validate-assets in your project.
Going by SKILL.md and its folder, Validate Assets needs the command-line tools its instructions call (curl and kind).
SKILL.md contains no URLs. Its commands use curl, which can reach the network depending on how they are called. This is read from the text; nothing was executed.
Our automated static check of SKILL.md found no risky patterns, such as piping downloads into a shell, reading credential files or hidden Unicode. It is not a guarantee. Review the folder before installing.
Validate Assets is published under the Apache-2.0 licence (the repository's licence). It allows redistribution, so the full SKILL.md is shown on this page.
About 5.1k tokens (SKILL.md is roughly 20k characters). Agents keep only the skill's name and description in context until a task matches; then they load SKILL.md in full.
Skills that share tags, products or a category with Validate Assets: Spikard (Goldziher/spikard, 123 stars), Shopify AI Toolkit Wrapper (jeremylongshore/tons-of-skills-marketplace, 2.8k stars), Lint (wheelos/apollo-lite, 171 stars) and Review (apollographql/apollo-mcp-server, 313 stars). The comparison table on this page puts their stars, adoption, token cost, safety result and licence side by side.
LunCoSim (a GitHub organization) maintains it in LunCoSim/lunco-sim, which has 107 GitHub stars. The repository holds 40 skills in this directory. The repository was last updated on October 9, 2026.
Source: LunCoSim/lunco-sim on GitHub. Facts on this page come from the repository at the commit we read; the author's words are quoted as theirs.