Deliver
This path is for delivering a new version, of the whole project or of a single module, and then publishing it on the public channel. You come here when a version is ready and you want the agent to run the delivery for you.
What you ask the agent
« Prepare the delivery of the site module as a patch and show me the plan. »
« What would the tag be if we delivered the whole project as a minor? »
« Set up delivery of the site module: build with pnpm build, artifacts in dist/*.zip. »
effortless_release_delivery_setstack=sitebuild_command=pnpm buildartifacts=dist/*.zip
« Turn on the tag and the documentation update in the release configuration. »
« Declare acme/site-dev as the internal repository and acme/site as the public one for the site module. »
effortless_release_channels_setstack=siteinternal=acme/site-devpublic=acme/site
« Deliver the site module: bump the version, commit and push, tag, build and artifacts. »
effortless_release_applysteps=bump_version,git_flow,tag_release,deliverystack=site
(the agent asks for your agreement first)
« Publish the site-v1.4.1 version, already delivered internally, to the public channel. »
(the agent asks for your agreement first)
What the agent does
Plan a delivery
effortless_release_plancomputes the plan without writing anything: current and target version, tag, repository, branch, version files.bumpispatch(default),minorormajor.stacktargets a module; withoutstack, the plan covers the whole project.- The tag depends on the target:
vX.Y.Zfor the whole project or for a module with its own repository,<module>-vX.Y.Zfor a module that lives in the project's repository.
Configure the delivery
effortless_release_config_showreads the effective release configuration.effortless_release_config_setsets three options:git_flow(commit and push step),tag(tag creation) andupdate_docs(documentation update). At least one is required.effortless_release_delivery_setrecords, for a module (ordefault), the build command (build_command) and the artifacts to upload (artifacts, comma-separated globs). Withoutartifacts, the ones already recorded are kept. An undeclared module is refused.
Run the delivery
This step acts for real: version files are written, then commit, push, tag, GitHub release, build. The agent runs it only after your explicit agreement.
effortless_release_applytakessteps(amongbump_version,git_flow,tag_release,update_docs,delivery),bumpand, for a module,stack.- Steps always run in that order. A failing step stops the chain: the following ones are reported as "not run". A step the engine cannot do (for example without
gh) is reported as "to do by hand", with what remains to be done. - Bump the version checks every version file before writing any. Commit and push only merges onto the main branch by fast-forward. Tag and GitHub release refuses to place a tag on uncommitted files: the tag would point at the previous commit, without the new version.
- The agent reads the result step by step and summarizes it for you.
Declare the internal and public channels
effortless_release_channels_setsets the two release repositories of a target (stack, ordefaultfor the whole project):internal(empty = the origin repository) andpublic(empty = no public channel). An omitted parameter is left unchanged. A repository is writtenowner/name.
Publish publicly
Public publication promotes a version already delivered internally, as it is: same tag, same artifacts, no new bump. It cannot be undone. The agent starts it only after your explicit agreement.
effortless_release_promotetakestag(the tag already delivered internally),stackfor a module, andconfirm, which must repeat exactly the same tag.- The engine downloads the internal release, republishes it on the public repository and records the publication in the journal.
Read the history
effortless_deliveriesreturns the delivery journal, most recent first: date, channel, module, tag, version, repository, outcome. It also returns the channels of each target. It needs no network.
What you get
- Version files at the new value, a commit, an annotated tag and, if the repository is on GitHub and
ghis available, a release with its artifacts. - Every delivery, successful or stopped, and every publication, is recorded in
.effortless/deliveries.json, versioned with the project. - In the app, the Delivery screen shows the same plan, configuration, channels and the Delivery history.
When the agent is refused
| Situation | What the refusal says | What to do |
|---|---|---|
| The project is in semi-auto mode | release_apply returns an "execution tool disabled" message (flagged gated); release_promote is refused with release:gated | Switch the project to full mode, then ask for the delivery again. |
| The module does not exist | release:unknownModule (plan, execution, channels); deploiement:stackUnknown for the delivery configuration | Pass the id of a declared module, or default / no stack for the whole project. |
| No step selected | deploiement:noStepSelected | Pick at least one valid step in steps (unknown ids are ignored). |
| A step fails during execution | deploiement:applyStopped, with the failing step's detail | Fix the cause named in the detail, then run again. Steps already done are not undone. |
| Tag requested while files are uncommitted | tag_release step fails: "Tag … not placed" | Replay with the git_flow step, or commit first. |
release_config_set with no option | deploiement:configNoField | Pass at least git_flow, tag or update_docs. |
| Delivery configuration without a module | deploiement:stackRequired | Pass stack; effortless_stack_list names the declared ones. |
| Badly written repository | release:repoInvalid | Write the repository as owner/name, or an empty value to remove the channel. |
| No public repository declared | release:noPublicChannel | Declare it with effortless_release_channels_set. |
confirm differs from the tag | release:confirmMismatch | Give back exactly the tag, after your explicit agreement. |
| The version was not delivered internally | release:notInternal | Deliver the version internally first ("Tag and GitHub release" step). |
| The version is already public | release:alreadyPublic | Nothing to do. For a new version, deliver it internally first. |
gh missing or failing during a publication | release:ghMissing or release:ghFailed | Install gh and sign in, then run again. |