VAM Scripter

v1.2.0

Provides a JavaScript-like scripting environment inside Virt-A-Mate for automating poses, animations, audio, interactions, and scene control with lifecycle a...

0· 157·1 current·1 all-time

Install

OpenClaw Prompt Flow

Install with OpenClaw

Best for remote or guided setup. Copy the exact prompt, then paste it into OpenClaw for nffdasilva/vam-scripter.

Previewing Install & Setup.
Prompt PreviewInstall & Setup
Install the skill "VAM Scripter" (nffdasilva/vam-scripter) from ClawHub.
Skill page: https://clawhub.ai/nffdasilva/vam-scripter
Keep the work scoped to this skill only.
After install, inspect the skill metadata and help me finish setup.
Use only the metadata you can verify from ClawHub; do not invent missing requirements.
Ask before making any broader environment changes.

Command Line

CLI Commands

Use the direct CLI path if you want to install manually and keep every step visible.

OpenClaw CLI

Bare skill slug

openclaw skills install vam-scripter

ClawHub CLI

Package manager switcher

npx clawhub@latest install vam-scripter
Security Scan
VirusTotalVirusTotal
Benign
View report →
OpenClawOpenClaw
Benign
high confidence
Purpose & Capability
The name/description (VAM Scripter) matches the provided SKILL.md, API reference, and example scripts. All required functionality (scene, player, keybindings, fs, Time, Random, etc.) is appropriate for an in‑game scripting environment — nothing in the manifest asks for unrelated system access, cloud credentials, or external tooling.
Instruction Scope
SKILL.md and the example scripts limit actions to the VAM API: atom transforms, audio actions, keybindings, timers, and scene‑scoped filesystem reads/writes. The instructions do not ask the agent to read host env vars or system files outside the scene, nor to transmit data to arbitrary external endpoints. (Note: scene.getAudioClip uses a 'URL' type in examples — that implies VAM may reference external audio resources at runtime, but the skill itself does not include any hardcoded network endpoints or exfiltration steps.)
Install Mechanism
There is no install spec that downloads or executes external code; the package is instruction‑ and example‑file based and intended to be copied into the user's skills folder. No archives or remote URLs are fetched by the skill metadata itself.
Credentials
The skill declares no required environment variables, binaries, or credentials. The only persistent access is to scene‑scoped files via the fs module, which the documentation restricts to .txt/.json and scene storage.
Persistence & Privilege
The skill is not marked always:true and does not request elevated platform privileges. It writes/reads a scene file (app-state.json) within the VAM Scripter directory to persist state, which is expected behavior for such a plugin and scoped to the scene area rather than system configuration or other skills.
Assessment
This skill appears coherent and implements in‑game scripting examples for Virt‑A‑Mate. Before installing, review the example scripts (especially state-persistence.js) to confirm you are comfortable with scene‑scoped file writes (app-state.json). If you are concerned about external audio resources, check any uses of getAudioClip(..., "URL", ...) inside your VAM instance to see whether it will fetch remote assets. Because the package comes from an unknown owner, only install if you trust the source or after inspecting the files; otherwise copy individual example scripts you need rather than installing wholesale.

Like a lobster shell, security has layers — review code before you run it.

automationvk9740tsa7htdsh6rtrcy1s720d835zsslatestvk9740tsa7htdsh6rtrcy1s720d835zssscriptervk9740tsa7htdsh6rtrcy1s720d835zssvamvk9740tsa7htdsh6rtrcy1s720d835zss
157downloads
0stars
5versions
Updated 1mo ago
v1.2.0
MIT-0

VAM Scripter Skill

Virt-A-Mate Scripter v1.5.1 Language Support

Scripter is a JavaScript-inspired scripting language that runs inside Virt-A-Mate. It provides high-performance scripting without reflection, enabling automation of poses, animations, audio, and interactions.

gotolm

Scripter v1.5.1 - JavaScript-inspired VAM scripting language.

Syntax Overview

Scripter syntax closely resembles JavaScript with these characteristics:

Module System

import { module } from "vam-scripter";
export const name = value;

Variables

const name = value;  // immutable binding
let name = value;    // mutable binding
var name = value;    // mutable binding

Functions

function name(args) { body }
() => { body }       // arrow function syntax

Control Flow

if (condition) { ... } else { ... }
for (init; condition; update) { ... }
while (condition) { ... }
break; continue;

Exception Handling

try { ... } catch (e) { ... }
throw error;

Data Structures

[1, 2, 3]                        // array
{ key: value }                   // object

Core Modules

vam-scripter Module

The main module imported as "vam-scripter" exports:

ExportTypeDescription
scripterObjectMain plugin interface, lifecycle hooks
sceneObjectScene access (atoms, audio clips)
TimeObjectUnity Time properties
RandomObjectRandom number generation
DateTimeObjectDate/Time operations
playerObjectPlayer (VR/monitor status, hand/head transforms)
keybindingsObjectKeybinding management
InputObjectInput handling
fsObjectFile system operations

scripter Module

Provides lifecycle hooks and plugin management.

Property/MethodArgumentsReturnsDescription
scripter.onUpdate(fn)fn: () => voidFunctionLinkRun every frame
scripter.onLateUpdate(fn)fn: () => voidFunctionLinkRun after Update
scripter.onFixedUpdate(fn)fn: () => voidFunctionLinkRun on physics updates
scripter.onEnable(fn)fn: () => voidFunctionLinkRun when enabled
scripter.onDisable(fn)fn: () => voidFunctionLinkRun when disabled
scripter.onDestroy(fn)fn: () => voidFunctionLinkRun when destroyed
scripter.declareFloatParam(config)config: {name, default, min, max, constrain, onChange}FloatParamDeclarationCreate float parameter
scripter.declareStringParam(config)config: {name, default, onChange}StringParamDeclarationCreate string parameter
scripter.declareBoolParam(config)config: {name, default, onChange}BoolParamDeclarationCreate boolean parameter
scripter.declareAction(name, fn)name: string, fn: () => voidActionDeclarationCreate action
scripter.containingAtom-AtomReferenceReference to the atom housing the script

scene Module

Provides access to atoms and audio clips in the scene.

Property/MethodArgumentsReturnsDescription
scene.getAtom(name)name: stringAtomReferenceGet atom by name/UID
scene.getAtoms()-Array<AtomReference>Get all atoms
scene.getAtomIds()-Array<string>Get all atom UIDs
scene.getAudioClip(type, category, clip)type: "Embedded|URL", category: string, clip: stringNamedAudioClipReferenceGet audio clip

player Module

Provides access to player state and transforms.

PropertyTypeDescription
player.isVRbooleanTrue if in VR mode
player.lHandTransformReferenceLeft hand position/rotation
player.rHandTransformReferenceRight hand position/rotation
player.headTransformReferenceHead position/rotation

keybindings Module

Manages keybindings and commands.

Property/MethodArgumentsReturnsDescription
keybindings.invokeCommand(name)name: stringvoidInvoke a keybinding action
keybindings.declareCommand(name, fn)name: string, fn: () => voidKeybindingDeclarationDeclare a new keybinding

fs Module

File system operations for script persistence.

Property/MethodArgumentsReturnsDescription
fs.writeSceneFileSync(path, content)path: string, content: stringvoidWrite to scene-specific file
fs.readSceneFileSync(path)path: stringstring|undefinedRead scene-specific file
fs.unlinkSceneFileSync(path)path: stringvoidDelete scene-specific file

Time Module

Unity Time properties.

PropertyTypeDescription
Time.timefloatTime since level load
Time.deltaTimefloatTime since last frame
Time.fixedDeltaTimefloatFixed timestep for physics

Random Module

Random number generation.

Property/MethodArgumentsReturnsDescription
Random.value-floatRandom float 0.0-1.0
Random.range(min, max)min, max: int|floatint|floatRandom number in range

Math Module

Math utilities (available as Math).

MethodArgumentsReturnsDescription
Math.abs, Math.ceil, Math.floornumbernumberBasic math
Math.sin, Math.cos, Math.tannumbernumberTrigonometry
Math.sqrt, Math.pow(base, exp)numbernumberPowers/square root
Math.log, Math.log10numbernumberLogarithms
Math.max, Math.min(...args)numbersnumberMin/max
Math.random()-floatRandom 0-1
Math.lerp(start, end, t)numbersnumberLinear interpolation
Math.clamp(value, min, max)numbersnumberClamp value
Math.round, Math.signnumbernumberRounding/sign

Reference Types

AtomReference

Property/MethodArgumentsReturnsDescription
atom.name-stringAtom name
atom.type-stringAtom type
atom.on-booleanIs atom on
atom.getStorableIds()-Array<string>Get storable IDs
atom.getStorable(name)name: stringStorableReferenceGet storable
atom.getController(name)name: stringControllerReferenceGet controller
atom.distance(other)other: AtomReferencefloatDistance to another atom

TransformReference

Property/MethodArgumentsReturnsDescription
transform.position-Vector3Position
transform.rotation-QuaternionRotation
transform.forward-Vector3Forward direction
transform.up-Vector3Up direction
transform.right-Vector3Right direction
transform.lookAt(target)target: TransformReferencevoidRotate to face target
transform.lookAt(x, y, z)coords: Vector3voidRotate to face position

StorableReference

Property/MethodArgumentsReturnsDescription
storable.getId()-stringGet storable ID
storable.getType()-stringGet storable type
storable.getAudioAction(name)name: stringAudioActionReferenceGet audio action

ControllerReference

Property/MethodArgumentsReturnsDescription
controller.name-stringController name
controller.transform-TransformReferenceController transform

AudioActionReference

Property/MethodArgumentsReturnsDescription
audioAction.play(clip)clip: NamedAudioClipReferencevoidPlay audio clip
audioAction.stop()-voidStop audio

NamedAudioClipReference

Property/MethodArgumentsReturnsDescription
clip.name-stringClip name
clip.clip-AudioClipUnity audio clip

Common Patterns

Simple Update Loop

import { scripter, scene } from "vam-scripter";

const ball = scene.getAtom("Ball");
const person = scene.getAtom("Person");

scripter.onUpdate(() => {
    // Run every frame
});

Interaction Detection

import { scripter, scene } from "vam-scripter";

const ball = scene.getAtom("Ball");
const person = scene.getAtom("Person");
const personVoice = person.getStorable("HeadAudioSource").getAudioAction("PlayNow");
const surprisedSound = scene.getAudioClip("URL", "web", "surprised.wav");

scripter.onUpdate(() => {
    if (ball.distance(person) < 0.5) {
        personVoice.play(surprisedSound);
    }
});

Keybinding Handler

import { keybindings, scripter } from "vam-scripter";

const action = scripter.declareAction("MyAction", () => {
    // Handle action
});

keybindings.declareCommand("MyActionKey", () => {
    keybindings.invokeCommand("MyAction");
});

Parameter-Driven Animation

import { scripter, scene } from "vam-scripter";

const person = scene.getAtom("Person");
const head = person.getController("head");

const speedParam = scripter.declareFloatParam({
    name: "Animation Speed",
    default: 1.0,
    min: 0.1,
    max: 5.0,
    onChange: (value) => {
        // Parameter changed
    }
});

File Operations

import { fs, scripter } from "vam-scripter";

const state = JSON.parse(fs.readSceneFileSync("state.json") || "{}");

scripter.onUpdate(() => {
    // Use state
});

scripter.onDisable(() => {
    fs.writeSceneFileSync("state.json", JSON.stringify(state));
});

Date/Time Operations

const now = DateTime.now;
const year = now.year;
const month = now.month;
const day = now.day;

// DateTime properties: year, month, day, hour, minute, second, dayOfWeek

Development Notes

  • scripts must be loaded as index.js
  • Use import { ... } from "vam-scripter" to access modules
  • The language is case-sensitive (JavaScript-style)
  • Use // for single-line comments and /* */ for multi-line
  • All modules are singletons - each import gets the same reference

Files

  • SKILL.md - This documentation
  • scripts/ - Sample scripts and patterns
  • references/ - API reference details

Comments

Loading comments...