WSM JS API and Runner

Use `wsm runner` and `require("wsm")` for scriptable workspace automation.

Sections

Terminology & Glossary
πŸ“– Documentation
Navigation
6 sectionsv0.1
πŸ“„ WSM JS API and Runner β€” glaze help wsm-js-api-and-runner
wsm-js-api-and-runner

WSM JS API and Runner

Use `wsm runner` and `require("wsm")` for scriptable workspace automation.

Appworkspace-managerjavascriptapi-designrunner--print-result--output-mode

WSM includes an embedded JavaScript runtime (goja). Scripts can call workspace operations through require("wsm") without shelling out to CLI subcommands.

Running Scripts

wsm runner my-script.js

Control result printing:

wsm runner my-script.js --print-result=false

Use machine-oriented rows:

wsm runner my-script.js --output-mode data --output json --print-result=false

Module Overview

Inside runner scripts:

const wsm = require("wsm");
const manager = wsm.createManager({ defaultJobs: 8 });

Top-level exports:

ExportTypeNotes
wsm.versionstringCurrent module version ("0.2.0")
wsm.constsobjectBranch/resolution constants
wsm.createManager(options)functionReturns a manager object
wsm.discover(input)functionConvenience alias
wsm.createWorkspace(input)functionConvenience alias
wsm.status(input)functionConvenience alias

Manager options:

OptionTypeDefaultNotes
defaultJobsnumber8Used when per-call jobs is omitted

Manager API Surface

Flat manager methods:

MethodPurpose
manager.discover(input)Repository discovery
manager.createWorkspace(input)Workspace creation
manager.status(input)Workspace status
manager.listWorkspaces()Workspace registry listing
manager.listRepositories(input)Repository registry listing
manager.loadWorkspace(name)Returns workspace handle
manager.info(input)Workspace metadata
manager.addRepository(input)Add repo to workspace
manager.removeRepository(input)Remove repo from workspace
manager.deleteWorkspace(input)Delete workspace
manager.forkWorkspace(input)Fork workspace
manager.mergeWorkspace(input)Merge workspace
manager.commit(input)Commit operation
manager.diff(input)Diff operation
manager.log(input)Log operation

Namespaced aliases:

NamespaceMethod
manager.registrylistRepositories, listWorkspaces
manager.workspacescreate, list, status, info, add, remove, delete, fork, merge
manager.gitstatus, commit, diff, log
manager.git.branchcreate, switch, list
manager.git.rebaserun, status, continue, abort

Flat and namespaced methods route to shared closures in module code, so behavior stays aligned.

Workspace Handle API

Load and operate in a workspace-scoped context:

const ws = manager.loadWorkspace("my-workspace");
const info = ws.info();
const log = ws.git.log({ limit: 20, oneline: true });

Handle methods:

MethodPurpose
ws.name()Workspace name
ws.path()Workspace path
ws.info(input?)Workspace info
ws.status(input?)Workspace status
ws.addRepository(input)Add repo
ws.removeRepository(input)Remove repo
ws.delete(input?)Delete this workspace
ws.merge(input?)Merge this workspace
ws.git.*Scoped git/branch/rebase methods

Common Inputs

Examples (camelCase keys):

manager.discover({ paths: ["/work/repos"], recursive: true, maxDepth: 3 });

manager.createWorkspace({
  name: "ws-api-demo",
  repos: ["repo1", "repo2"],
  branchPrefix: "feat",
  dryRun: false,
});

manager.workspaces.add({
  workspaceName: "ws-api-demo",
  repoName: "repo3",
  force: true,
});

manager.git.commit({
  workspaceName: "ws-api-demo",
  message: "Apply coordinated update",
  addAll: true,
  push: false,
});

Error and Batch Semantics

Validation errors are thrown as JS TypeError before workflow execution for required fields, for example:

  • createWorkspace requires name and repos.
  • workspaces.add requires workspaceName and repoName.
  • workspaces.merge requires workspaceName.
  • git.commit requires message or template.
  • git.branch.create/switch require branchName.

Execution failures (workspace not found, git failures, etc.) throw regular JS errors from Go workflow/service errors.

Batch-oriented operations return arrays/rows rather than throwing per repository row failure. Row objects contain success/error signals, for example:

  • branch operations: results[] with repository-level success and error.
  • rebase status/action: rows[] with repository-level state or action result.

Type Contract

Completion-level declarations are maintained in:

  • pkg/wsmjs/spec/wsm.d.ts.tmpl
  • pkg/wsmjs/spec/wsm.d.ts (generated snapshot)

Regenerate and validate with:

go generate ./pkg/wsmjs/spec
go test ./pkg/wsmjs/spec

Example Script

const wsm = require("wsm");
const manager = wsm.createManager({ defaultJobs: 4 });

const repos = manager.registry.listRepositories({});
const workspaces = manager.registry.listWorkspaces();

({
  ok: true,
  version: wsm.version,
  repositories: repos.length,
  workspaces: workspaces.length,
  remote: wsm.consts.remote.ORIGIN,
});

Troubleshooting

ProblemCauseFix
Cannot find module 'wsm'Script not run via runnerUse wsm runner <script.js>
Missing result in data modeScript ends with statementEnd with expression object, for example ({ ok: true })
Validation TypeErrorRequired fields missingSupply required input keys
Unexpected mixed human outputWrong modeUse --output-mode data --output json --print-result=false

See Also

  • wsm help wsm-command-reference
  • wsm help wsm-architecture-overview
  • wsm help wsm-troubleshooting