Skip to main content
A Lua project is a Node.js package whose entry file, src/index.ts, holds one LuaAgent; the CLI compiles everything the agent references and records server-side ids and versions beside your code. This page lists every file lua init writes, who edits it, and what lua compile adds. Verified against lua-cli 3.33.0.

Files after lua init

lua init --with-examples adds examples/ with README.md, skills/ (three skills, their tools under skills/tools/), webhooks/, jobs/, preprocessors/, postprocessors/, services/, and workflows/. Nothing under examples/ is compiled until you import it from the agent.

Who edits what

What lua compile adds

lua test, lua chat -e sandbox, and lua push compile first, so dist-v2/ appears after any of them. dist/ exists only if you run npm run build (plain tsc); the CLI never reads it.

Ignore files

The scaffold’s ignore list is published as .npmignore (npm renames a package’s .gitignore when it publishes), and lua init copies it under that name. It ignores dist/, dist-v2/, *.js, *.js.map, node_modules/, .env, .env.local, .vscode/, .idea/, .lua/, .DS_Store, and Thumbs.db. lua compile writes a .gitignore containing only dist-v2/. Before your first commit, copy the full list: cp .npmignore .gitignore.

lua.skill.yaml

lua.skill.yaml maps the project to its agent and records what has been pushed; it holds no configuration, so the persona, tools, and skills live only in code.
lua.skill.yaml
The CLI writes ids the first time a primitive reaches the server and bumps version on each push. Don’t edit version by hand: push and sync overwrite it with the server’s active version before the push reads it. To choose the next version, pass lua push <type> --set-version <ver>; --force bumps the patch number. Every field is listed in the lua.skill.yaml reference.

Naming

  • Tool name: lowercase letters, digits, hyphens, and underscores, starting with a letter; the compiler warns otherwise. The scaffold uses snake_case (get_weather). It is what the model calls and what lua test --name selects.
  • Skill, webhook, and job name: kebab-case (weather, order-status, daily-summary). Each is the primitive’s identifier on the server, so renaming one creates a new primitive.
  • Files: a convention, not a rule. The scaffold uses src/skills/tools/<Name>Tool.ts with a default-exported class, src/skills/<name>.skill.ts, src/webhooks/<Name>Webhook.ts, and src/jobs/<Name>Job.ts.
  • Entry file: the compiler looks for index.ts, src/index.ts, agent.ts, src/agent.ts, main.ts, then src/main.ts, and uses the first one that exists.

See also