Changelog
0.14.0
- Added a per-host
identityFileSSH option to point at a private key file (ssh -i) in the objectsshform; it impliesIdentitiesOnly=yesso only that key is used, with no fallback to agent identities or default~/.ssh/id_*files. Stringsshaliases keep using~/.ssh/config - Added a per-host
multiplexingoption to toggle SSH connection multiplexing (ControlMaster/ControlPath), auto-detected when unset — disabled on Windows, where native OpenSSH has no control-socket support, and enabled elsewhere; fixes thegetsockname failed: Not a socketfailure on Windows - Documented Windows usage:
recipes/rsyncrequires anrsyncbinary (WSL, Git Bash or MSYS2), andidentityFilepaths should use forward slashes or~to avoid backslash escaping - Fixed SSH connection/auth failures (exit
255) being misreported as "Catapult is not initialized on this server" —status,deployand the programmatic API now surface the real SSH error instead - Fixed
sshprinting a fullExecaErrorstack trace on connection failure — it now shows only ssh's own output plus a concise message and propagates the real exit code
Released at 2026-07-28
0.13.0
- Added
config:validateto validate deploy configuration files without running deployment tasks - Added strict JSON configuration support with runtime schema validation, built-in recipe loading, declarative tasks, direct
pipeline,remove,before, andaftercontrols, anddeploy.config.json/deploy.jsonauto-detection - Fixed the recipe documentation to use dynamic imports for store-dependent pipeline wiring, such as enabling
caddy_reload_after_publishbefore loading the Caddy recipe in the VitePress example
Released at 2026-07-16
0.12.0
- Added
recipes/caddyfor validating, formatting, reloading, showing, and uploading Caddy configuration, with optional reloads afterdeploy:publish - Added
recipes/systemdfor genericsystemctlandjournalctlservice tasks - Changed
initto generatedeploy.config.ts/deploy.config.jsby default instead ofdeploy.ts/deploy.js - Updated the VitePress example with a Caddyfile and
recipes/caddyconfiguration - Added docs site favicon and touch icon assets
Released at 2026-06-29
0.11.0
- Added
recipes/nestjs— wires the standarddeploy:installanddeploy:buildtasks for NestJS apps built on the remote server, with.envshared by default - Added
recipes/tanstack— wires the standard remote install/build pipeline for TanStack Start apps, with.envshared by default - Added
recipes/nextjs— builds Next.js on the remote server and prepares standalone output by symlinkingpublicand.next/staticinto.next/standalone/when present - Added
recipes/nextjs_static— runsnext buildlocally for static export deployments and setssource_pathto./out/. - Added
recipes/nuxt_static— runsnuxt generatelocally and setssource_pathto./.output/public/. - Added
recipes/astro_static— replaces the previous local-build Astro recipe for static sites, runningastro build --mode <astro_mode>locally and deploying./dist/. - Refactored
recipes/astrointo a remote-build recipe for standalone Astro server apps; static Astro deployments should now userecipes/astro_static - Fixed
recipes/pm2display tasks —pm2:logsandpm2:shownow readecosystem.config.cjsfrom the current remote release instead of the local working directory - Static local-build recipes now rely on the built-in SCP-based
deploy:update_codeby default;recipes/rsyncremains optional when rsync transfers are preferred - Recipe docs and the bundled
catapultjsagent skill reference now cover the new NestJS, TanStack Start, Next.js, Nuxt static, Astro standalone, and Astro static recipes, including PM2 runtime examples and upstream hosting/output references
Released at 2026-06-20
0.10.0
- Added programmatic API —
new Catapult(config)from@catapultjs/deployexposesdeploy(),rollback(),setup(),status(),task(),listReleases(),listRevisions(),listTasks()andpipeline(), withtask:start/task:done/task:error/host:doneevents;task()captures and returns the logger output of display tasks likepm2:logs runTask()now accepts an optionallogger— taskloggeroutput can be redirected, e.g. captured in memory- The npm package now ships a
catapultjsagent skill with progressive references (config, recipe, programmatic API) — copyskills/catapultjsinto.claude/skills/to get assisted Catapult work in Claude Code deployHost(),rollbackHost(),initializeHost(),isHostSetup(),getCurrentRelease(),getReleaseNames(),getRevisions()andcollectHostStatus()are now exported from the main entry point
Released at 2026-06-15
0.9.0
- Added
--jsonflag tostatus,pipeline,version,list:releases,list:revisionsandlist:tasks— outputs the result as JSON for scripting and CI usage status --jsonnow runs against all configured hosts without prompting for a selectiononStatushooks can now return an object — entries are printed as aligned key/value lines in text mode and merged into the host entry ofstatus --json; output logged via theloggerargument is omitted in JSON moderecipes/pm2now reports the pm2 version through the newonStatusdata contract — included instatus --json- Docs: the API reference page now lists every function in the "On this page" sidebar
Released at 2026-06-11
0.8.0
- Added
recipes/adonisjs_local— builds the AdonisJS app locally, uploads the artifact, then installs production dependencies on the server initnow accepts--skip-install— creates the deploy config without installing@catapultjs/deploy- Commands that require an initialized server now detect missing setup and guide you to run
deploy:setup deploynow prompts to rundeploy:setupautomatically when the target host is not initializeddeploy:setupnow has asetupalias
Released at 2026-06-05
0.7.0
deploy:log_revisionnow falls back toDEPLOY_USERwhengit config user.nameis unavailable on the machine running Catapult- Config auto-detection now also supports
deploy.config.tsanddeploy.config.js - Default pipeline tasks have been split into dedicated files under
recipes/deploy/*.ts - The default pipeline is now registered from
recipes/common.tsand loaded automatically fromdefineConfig()
Released at 2026-06-01
0.6.0
Strategyremoved- Added
recipes/astro— runsastro buildlocally, then uploads the generated artifacts to the new release - Added
recipes/vitepress— runsvitepress buildlocally, then uploads the generated static files to the new release - Added
recipes/nuxt— exposesdeploy:buildfornuxt buildand a manualnuxt:generatetask - Added
recipes/directus— exposes Directus database migration and schema snapshot tasks - Added
recipes/redis— exposesredis:db:flushfor one or many configured DBs, plusredis:db:flush_allforFLUSHALL recipes/gitnow clones or resets directly intoreleases/<release>while keeping a bare mirror in.catapult/reporecipes/rsyncnow always syncs the contents of the configured source directory into the release, normalises the trailing slash automatically, and keeps--deleterecipes/adonisjsnow wires the built-indeploy:installanddeploy:buildtasks, with migrations exposed asace:*tasks- Pipeline insertion now deduplicates tasks — if a task is added again with
before()orafter(), the previous occurrence is removed and the last position wins - Added
--config/-cglobal flag — points to an alternative deploy config file (default:deploy.ts)
Released at 2026-05-11
0.5.0
rollbackcommand now accepts--interactive/-iflag — lists available releases and prompts for selection, with the current release marked and disabled--hostflag now has a-Hshort alias — available on all commands--branchflag ondeploynow has a-bshort alias- Added
local(command, options?)to the task DSL — executes a shell command on the local machine, with optionalcwd; flushes queued SSH commands first - Fixed
upload()anddownload()not interpolating template variables (e.g.) inremotePath
Released at 2026-04-24
0.4.0
- Added
Verbose.TRACElevel (2) betweenNORMALandDEBUG—NORMALnow only shows task progress,TRACEshows SSH commands,DEBUGstreams stdout; existing indices shifted (DEBUGis now3) Verbose.SILENT(0) no longer displays anything — task progress previously shown atSILENTis now gated atNORMAL- CLI flags extended:
-vvvsetsVerbose.DEBUG(level 3);-v→NORMAL,-vv→TRACE isVerbose()signature changed: now takes aVerboselevel and returnsboolean— e.g.isVerbose(Verbose.TRACE)- Added
upload(localPath, remotePath)anddownload(remotePath, localPath)to the task DSL — transfer files via SCP, reusing the SSH multiplexing socket upload()anddownload()now resolve relativeremotePathvalues againsthost.deployPath
Released at 2026-04-23
0.3.0
- Added
list:revisionscommand — displays the last 10 deployments from.catapult/revisions.login a table (release, branch, commit, author, date) sshcommand now opens the session directly indeployPathinstead of the home directory- Removed
--ansiglobal flag — it only affected Ace's UI components, not the deploy logger, so it was misleading - Added
Verboseenum (Verbose.SILENT,Verbose.NORMAL,Verbose.DEBUG) — replaces the raw0 | 1 | 2type for theverboseconfig option; available via@catapultjs/deploy/enums - Added
@catapultjs/deploy/enumsexport — exposesStrategy,PackageManagerandVerbose
Released at 2026-04-17
0.2.0
- Added
catapult/typesexport — types can now be imported directly fromcatapult/types recipes/adonisjs:adonisjs:migratenow runs beforedeploy:publishregardless of the active strategy — replaces the previoushasTaskconditional that placed it afterdeploy:build:copyoradonisjs:build- Fixed:
adonisjs:migratenow passes--forcetoace migration:run, which is required in non-interactive deployment environments - Fixed: default
strategywas incorrectly falling back toStrategy.BUILDinstead ofStrategy.DIRECTwhen not set indefineConfig
Released at 2026-04-15
0.1.0
- Added
Strategyenum (Strategy.BUILD|Strategy.DIRECT) — controls where install/build tasks run before being copied to the release - Added
strategyoption todefineConfig(default:Strategy.DIRECT) — when set toStrategy.BUILD, two new tasks are inserted into the pipeline:deploy:build:shared(symlinks shared paths into the build directory) anddeploy:build:copy(copies build output into the release) - Added
template variable — resolves to{deployPath}/.catapult/builder::: - Added
git:updatetask inrecipes/git— maintains a cached bare mirror of the repository on the server;deploy:update_codenow clones from this local mirror instead of the remote TaskContext: replaceddeployCtxwith two top-level fields —config(the resolved config object) andrelease(the release name string)deploy:log_revisionnow writes structured JSON to.catapult/revisions.loginstead of a plain text line inrevisions.logcata statusnow displays the last deployment revision (branch, commit, author, date) when available- Renamed CLI command
list:pipeline→pipeline - Server paths reorganised under
.catapult/—deploy.lockis now at.catapult/deploy.lock, and new pathsrepo(.catapult/repo) andbuilder(.catapult/builder) are exposed onTaskContext.paths paths.cataConfigadded — resolves to{deployPath}/.catapult- Added
has(key)to the store — returnstrueif the key is set recipes/pm2: removedpm2:ecosystemtask —ecosystem.config.cjsis now read directly from the release path; renamedpm2:start→pm2:startOrReload(starts or reloads); added a newpm2:starttask that only starts processesrecipes/nodejs,recipes/bun: tasks now operate onwhenstrategyisBuild; pipeline positions updated (nodejs:install/bun:installafterdeploy:update_code, build task afterdeploy:build:shared)recipes/adonisjs: tasks are now strategy-aware;adonisjs:migrateis inserted afterdeploy:build:copywhen using the Build strategy
Released at 2026-04-15
0.0.6
- Added
runcommand — executes a shell command on one or more hosts via SSH (npx cata run "pm2 list") - Added
desc(description)function — sets a description for the nexttask()call, displayed incata list:tasks - Added
afterFailurehook — called when a deployment fails, receives{ hosts, error } packageManageris now auto-detected from lock files (bun.lock,pnpm-lock.yaml,yarn.lock,package-lock.json) if not set indefineConfigrecipes/pm2: addedpm2:deletetask — deletes all processes from PM2
Released at 2026-04-11
0.0.5
- Added
recipes/nodejs— registersnodejs:install,nodejs:install:production,nodejs:buildandnodejs:testtasks, inserted automatically afterdeploy:shared - Added
recipes/bun— same tasks prefixed withbun:, for Bun-based projects packageManageris now adefineConfigoption ('npm' | 'pnpm' | 'yarn' | 'bun', default'npm') instead of a store key —pm(),pmInstall()andpmInstallProd()read from configpmInstall()andpmInstallProd()now handlebun(bun install --frozen-lockfile,bun install --production)healthcheckUrl,healthcheckRetriesandhealthcheckDelayMsreplaced by ahealthcheckobject on eachHost({ url?, retries?, delayMs? }) — allows per-host healthcheck configurationkeepReleasesis now optional indefineConfig(default:5)
Released at 2026-04-10
0.0.4
defineConfignow returns a function and must be used asexport default defineConfig({...})— the CLI calls it explicitly, giving full control over execution order- Added a
loggerinstance toTaskContext,onStatus()andonSetup()callbacks — no more direct imports needed inside tasks and recipes ssh()now accepts a{ color: true }option that prependsexport FORCE_COLOR=1to the remote command, enabling colored output from tools like PM2recipes/pm2: addedpm2:showtask — displays detailed PM2 process info for each app defined inecosystem.config.cjsrecipes/pm2:pm2:logsandpm2:listnow use{ color: true }for colored terminal outputtaskcommand now accepts-v/-vvverbose flags (consistent withdeploy)- Fixed:
deploy:unlockis no longer called whendeploy:lockitself fails — a lock held by another deployment is no longer removed on error
Released at 2026-04-09
0.0.3
verboseconfig option changed frombooleanto0 | 1 | 2: level1prints SSH commands, level2also streams stdout- Added
--verbose/-vand-vvCLI flags on thedeploycommand to override the config verbosity at runtime recipes/pm2: addedpm2:ecosystemtask — symlinksecosystem.config.cjsfrom the release into the base deploy path so PM2 always references a stable pathrecipes/pm2:pm2:startandpm2:saverefactored to usecd()/run()DSLdeploy:shared: leading slashes are now stripped fromshared_dirsandshared_filesentries to prevent double slashes in paths
Released at 2026-04-08
0.0.2
deploy:healthcheckis now automatically removed from the pipeline when no host defines ahealthcheckUrl- Added
detectPackageManager— thecata initandcata statuscommands now auto-detect the package manager from lock files - Internal refactoring: task runner and store split into dedicated classes
- Added unit tests
Released at 2026-04-05
0.0.1
Initial release.
- SSH deployment pipeline with
deploy:lock,deploy:release,deploy:update_code,deploy:shared,deploy:publish,deploy:log_revision,deploy:healthcheck,deploy:unlock,deploy:cleanup - Built-in recipes:
git,rsync,adonisjs,pm2 - Commands:
deploy,deploy:setup,rollback,status,task,ssh,list:pipeline,list:tasks,list:releases,init,version before(),after(),remove(),setPipeline()for pipeline customisationset()/get()store for recipe configurationpm(),pmInstall(),pmInstallProd()package manager helpersonSetup()andonStatus()lifecycle hooks- Automatic rollback on deployment failure
- Multi-server support with host selection prompt
--hostand--branchCLI flags
Released at 2026-04-03