Skip to content

@aosengine/create-aosengine

Interfaces

ArgSpec

What a command accepts.

Properties

alias?
ts
readonly optional alias?: Readonly<Record<string, string>>;

Single-character aliases, for example { t: 'template' }.

boolean?
ts
readonly optional boolean?: readonly string[];

Option names that are true, false (via --no-x) or absent.

value?
ts
readonly optional value?: readonly string[];

Option names that consume the following token, for example port.


ParsedArgs

The result of parseArgs.

Properties

flags
ts
readonly flags: Readonly<Record<string, string | boolean>>;

Declared options that were present.

positionals
ts
readonly positionals: readonly string[];

Everything that was not an option, in order.

unknown
ts
readonly unknown: readonly string[];

Tokens that looked like options but were not declared.


ScaffoldOptions

Everything scaffold needs.

Properties

aam
ts
readonly aam: boolean;

Wire up the AvatarOS Asset Manager in .env.example.

manifest
ts
readonly manifest: TemplateManifest;

The template's declaration.

name
ts
readonly name: string;

The new game's package name.

targetDir
ts
readonly targetDir: string;

Absolute, forward-slashed directory to create.

templateDir
ts
readonly templateDir: string;

Absolute, forward-slashed template directory.

title
ts
readonly title: string;

The new game's human title.

versions
ts
readonly versions: VersionContext;

How engine dependencies are pinned.


ScaffoldResult

What scaffold wrote.

Properties

files
ts
readonly files: string[];

Every file written, relative to the target directory, sorted.

tokens
ts
readonly tokens: TokenMap;

Tokens that were substituted.


Template

One template, located on disk.

Properties

dir
ts
readonly dir: string;

Absolute, forward-slashed directory.

manifest
ts
readonly manifest: TemplateManifest;

The template's own declaration, with defaults filled in.

name
ts
readonly name: string;

Directory name, which is also what --template takes.


TemplateManifest

What a template declares about itself.

Properties

description
ts
readonly description: string;

One line for the template chooser.

exclude
ts
readonly exclude: readonly string[];

Paths, relative to the template root, that are never copied.

name
ts
readonly name: string;

Directory name, for example fps.

rename
ts
readonly rename: Readonly<Record<string, string>>;

Paths renamed on the way out, for example _gitignore to .gitignore.

title
ts
readonly title: string;

Human title, used in the generated README and index.html.

tokens
ts
readonly tokens: TokenMap;

Default token values, overridden by the command line.


VersionContext

Everything engineDependency needs to decide.

Properties

gameDir
ts
readonly gameDir: string;

Absolute path to the game being created, for relative file: links.

mode
ts
readonly mode: LinkMode;

Published range, or file: links back into a checkout.

repoRoot?
ts
readonly optional repoRoot?: string;

The engine repository root, required in file mode.

version
ts
readonly version: string;

The version to publish against, in semver mode.

Type Aliases

LinkMode

ts
type LinkMode = "file" | "semver";

How engine dependencies are pointed at the engine.


TokenMap

ts
type TokenMap = Readonly<Record<string, string>>;

Values substituted into a template.

Variables

CREATE_HELP

ts
const CREATE_HELP: string;

One screen of help.


CREATE_SPEC

ts
const CREATE_SPEC: object;

Options create-aosengine accepts.

Type Declaration

alias
ts
readonly alias: object;
alias.f
ts
readonly f: "force" = 'force';
alias.h
ts
readonly h: "help" = 'help';
alias.t
ts
readonly t: "template" = 'template';
alias.v
ts
readonly v: "version" = 'version';
boolean
ts
readonly boolean: readonly ["install", "git", "aam", "third-person", "force", "help", "version"];
value
ts
readonly value: readonly ["template", "title"];

DEFAULT_MANIFEST

ts
const DEFAULT_MANIFEST: Omit<TemplateManifest, "name" | "title">;

What a template gets when it ships no template.json.


GITIGNORE

ts
const GITIGNORE: "node_modules/\ndist/\nbuild/\n.aosengine/\n.vite/\ncoverage/\ntest-results/\nplaywright-report/\n*.tsbuildinfo\n\n# Local environment. .env.example is committed; .env is not.\n.env\n.env.*.local\n.env.local\n\n.DS_Store\nThumbs.db\n";

The .gitignore every generated game gets, when the template has none.


PACKAGE

ts
const PACKAGE: "@aosengine/create-aosengine";

Package identity marker.

Example

ts
import { PACKAGE } from '@aosengine/create-aosengine';

console.log(PACKAGE); // '@aosengine/create-aosengine'

SHIPPED_AS

ts
const SHIPPED_AS: Readonly<Record<string, string>>;

Files npm refuses to ship verbatim, and the names they travel under.


SKIP_DIRS

ts
const SKIP_DIRS: Set<string>;

Directory names never copied out of a template.


SKIP_FILES

ts
const SKIP_FILES: Set<string>;

File names never copied out of a template.


TEXT_EXTENSIONS

ts
const TEXT_EXTENSIONS: Set<string>;

Extensions treated as text, and therefore token-substituted.


TEXT_NAMES

ts
const TEXT_NAMES: Set<string>;

Files with no extension that are still text.

Functions

absPosix()

ts
function absPosix(...parts): string;

Resolve to an absolute, forward-slashed path.

Parameters

ParameterTypeDescription
...partsstring[]Path segments, resolved left to right against process.cwd().

Returns

string

An absolute path with / separators.


agentsMd()

ts
function agentsMd(title, name): string;

The game-scoped AGENTS.md, written when the template does not ship one.

Parameters

ParameterTypeDescription
titlestringThe game's title.
namestringThe game's package name.

Returns

string

The file contents.


applyTokens()

ts
function applyTokens(text, tokens): string;

Replace every in a string.

Unknown tokens are left alone rather than blanked, so a mistake is visible in the generated file instead of silently producing an empty string.

Parameters

ParameterTypeDescription
textstringThe template text.
tokensTokenMapValues to substitute.

Returns

string

The substituted text.


engineDependency()

ts
function engineDependency(
   name, 
   spec, 
   ctx
): string;

The version specifier a generated game should use for one dependency.

Anything that is not an engine package, and any engine package pinned to a real version, is left exactly as the template wrote it. Pinning is a hard rule here, not a preference.

Parameters

ParameterTypeDescription
namestringThe dependency name.
specstringWhat the template declared.
ctxVersionContextPublishing mode, version and paths.

Returns

string

The specifier to write into the game's package.json.


envExample()

ts
function envExample(aam): string;

The .env.example a generated game gets.

Parameters

ParameterTypeDescription
aambooleanWhether the AvatarOS Asset Manager keys are included.

Returns

string

The file contents.


findRepoRoot()

ts
function findRepoRoot(startDir): string | undefined;

Find the aosengine monorepo root above startDir, if there is one.

When the scaffolder is run from inside a checkout of the engine, generated games get file: links back at packages/ instead of published versions.

Parameters

ParameterTypeDescription
startDirstringAbsolute directory to start from.

Returns

string | undefined

The absolute, forward-slashed repository root, or undefined.


findTemplate()

ts
function findTemplate(cwd, name): Template | undefined;

Find one template by name.

Parameters

ParameterTypeDescription
cwdstringWhere the command was run.
namestringThe --template value.

Returns

Template | undefined

The template, or undefined when it is not installed.


flagBool()

ts
function flagBool(
   flags, 
   name, 
   fallback
): boolean;

Read a boolean flag.

Parameters

ParameterTypeDescription
flagsReadonly<Record<string, string | boolean | undefined>>Parsed flags.
namestringOption name.
fallbackbooleanValue to use when the option is absent.

Returns

boolean

The flag value.


flagNumber()

ts
function flagNumber(
   flags, 
   name, 
   fallback
): number;

Read a numeric flag.

Parameters

ParameterTypeDescription
flagsReadonly<Record<string, string | boolean | undefined>>Parsed flags.
namestringOption name.
fallbacknumberValue to use when the option is absent or unparseable.

Returns

number

The flag value.


flagString()

ts
function flagString(
   flags, 
   name, 
   fallback
): string;

Read a string flag.

Parameters

ParameterTypeDescription
flagsReadonly<Record<string, string | boolean | undefined>>Parsed flags.
namestringOption name.
fallbackstringValue to use when the option is absent.

Returns

string

The flag value.


gamePackageJson()

ts
function gamePackageJson(
   template, 
   name, 
   ctx
): Record<string, unknown>;

Build the game's own package.json from the template's.

Everything that only makes sense inside the monorepo is dropped: the workspace private flag, the files allow-list, and any workspaces key a template might have inherited.

Parameters

ParameterTypeDescription
templateReadonly<Record<string, unknown>>The template's parsed manifest.
namestringThe new game's package name.
ctxVersionContextPublishing mode, version and paths.

Returns

Record<string, unknown>

The manifest to write, pretty-printed by the caller.


hoistExtendedTsconfig()

ts
function hoistExtendedTsconfig(
   targetDir, 
   templateDir, 
   written
): void;

Make a copied tsconfig.json stand on its own.

Templates are workspace members, so their tsconfig.json usually extends the repository's tsconfig.base.json by a relative path that means nothing once the game is somewhere else. The base is copied in next to it and the extends string is rewritten — textually, so the comments survive.

One level only: a base that itself extends something outside the repository is not a shape this repository has.

Parameters

ParameterTypeDescription
targetDirstringAbsolute game directory.
templateDirstringAbsolute template directory the extends resolves against.
writtenstring[]Accumulator of written paths.

Returns

void


isEnginePackage()

ts
function isEnginePackage(name): boolean;

Is this an engine package?

Parameters

ParameterTypeDescription
namestringA dependency name.

Returns

boolean

True for @aosengine/*.


isTextFile()

ts
function isTextFile(fileName): boolean;

Is this file text, and therefore token-substituted?

Parameters

ParameterTypeDescription
fileNamestringA base name.

Returns

boolean

True when the file should be read as UTF-8 and substituted.


leftoverTokens()

ts
function leftoverTokens(text): string[];

Every still present in a string.

Parameters

ParameterTypeDescription
textstringSubstituted text.

Returns

string[]

Distinct token names, sorted; empty when substitution was complete.


listTemplates()

ts
function listTemplates(cwd): Template[];

List every template that is actually installed.

Parameters

ParameterTypeDescription
cwdstringWhere the command was run.

Returns

Template[]

Templates, sorted by name, first root wins on a duplicate.


main()

ts
function main(argv, cwd): Promise<number>;

Run the scaffolder.

Parameters

ParameterTypeDescription
argvreadonly string[]Arguments after the executable and script.
cwdstringDirectory the target path is resolved against.

Returns

Promise<number>

The process exit code.


normaliseManifest()

ts
function normaliseManifest(name, raw): TemplateManifest;

Read a template.json, filling in everything it left out.

Parameters

ParameterTypeDescription
namestringThe template directory name.
rawunknownThe parsed template.json, or undefined when there is none.

Returns

TemplateManifest

A complete manifest.


outputName()

ts
function outputName(fileName, rename): string;

The name a file takes in the generated game.

npm strips .gitignore out of a published tarball, so templates ship theirs as _gitignore; this puts the dot back. A template's own rename map wins.

Parameters

ParameterTypeDescription
fileNamestringThe name inside the template.
renameReadonly<Record<string, string | undefined>>The template's explicit renames.

Returns

string

The name to write.


ownVersion()

ts
function ownVersion(): string;

This package's version, read from its own manifest.

Returns

string

The version string, or 0.0.0 when the manifest is unreadable.


packageDirOf()

ts
function packageDirOf(moduleUrl): string;

The directory of the npm package a module belongs to.

Parameters

ParameterTypeDescription
moduleUrlstringA module's import.meta.url.

Returns

string

The absolute, forward-slashed package directory.


parseArgs()

ts
function parseArgs(argv, spec?): ParsedArgs;

Parse an argv slice.

Parameters

ParameterTypeDescription
argvreadonly string[]Arguments after the command name.
specArgSpecWhat this command accepts.

Returns

ParsedArgs

Positionals, flags and anything undeclared.


readManifest()

ts
function readManifest(dir, name): TemplateManifest;

Read a template's template.json, tolerating its absence.

Parameters

ParameterTypeDescription
dirstringAbsolute template directory.
namestringDirectory name, used as the fallback identity.

Returns

TemplateManifest

A complete manifest.


relativeSpecifier()

ts
function relativeSpecifier(fromDir, toPath): string;

A relative path from one directory to another, for file: dependencies.

Falls back to the absolute path when the two are on different Windows drives, where no relative path exists.

Parameters

ParameterTypeDescription
fromDirstringAbsolute directory the path is written in.
toPathstringAbsolute target.

Returns

string

A relative path starting with ./ or ../, or an absolute one.


rewriteDependencies()

ts
function rewriteDependencies(pkg, ctx): Record<string, unknown>;

Rewrite every dependency block of a template's package.json.

Parameters

ParameterTypeDescription
pkgReadonly<Record<string, unknown>>The parsed manifest. Not mutated.
ctxVersionContextPublishing mode, version and paths.

Returns

Record<string, unknown>

A new manifest with engine dependencies rewritten.


scaffold()

ts
function scaffold(options): ScaffoldResult;

Copy a template into a new directory, substituting as it goes.

Parameters

ParameterTypeDescription
optionsScaffoldOptionsWhere from, where to, and what to substitute.

Returns

ScaffoldResult

Which files were written.

Throws

When the template is missing a package.json.


stripDanglingSchema()

ts
function stripDanglingSchema(
   targetDir, 
   templateDir, 
   relativePath
): void;

Remove a $schema key whose relative path does not survive the copy.

A template's src/assets.json points $schema at the repository's docs/schemas/assets.schema.json so editors complete it. That path dangles the moment the file is somewhere else, and parseManifest rejects unknown top-level keys, so the generated game would not boot. Absolute URLs are left alone: those keep working.

The edit is textual, so key order and formatting survive.

Parameters

ParameterTypeDescription
targetDirstringAbsolute game directory.
templateDirstringAbsolute template directory.
relativePathstringThe JSON file, relative to both roots.

Returns

void


templateRoots()

ts
function templateRoots(cwd): string[];

Every directory that might hold templates, best first.

Parameters

ParameterTypeDescription
cwdstringWhere the command was run.

Returns

string[]

Absolute, forward-slashed candidate directories.


toPackageName()

ts
function toPackageName(raw): string;

Turn a directory name into a package name npm will accept.

Parameters

ParameterTypeDescription
rawstringWhat the user typed, for example My FPS!.

Returns

string

A lowercase, dash-separated name, for example my-fps.


toPosix()

ts
function toPosix(path): string;

Forward-slash a path and drop any trailing separator.

Parameters

ParameterTypeDescription
pathstringAny path, in any separator style.

Returns

string

The same path with / separators and no trailing slash.


toTitle()

ts
function toTitle(name): string;

Turn a package name into a human title.

Parameters

ParameterTypeDescription
namestringA package name, for example my-fps.

Returns

string

A title, for example My Fps.