Sanitized single-commit public mirror of recipe-maintainer. - Removed test-ssh/.testenv (live creds); added test-ssh/.testenv.example placeholders. - Removed plans/ and planned-updates/ (deployment-planning docs) so no client/ deployment domains appear in the public repo. - All other secret stores were already gitignored. - docs.coopcloud.tech retained as a submodule (public upstream).
3.7 KiB
description, argument-hint, allowed-tools
| description | argument-hint | allowed-tools | ||||||||
|---|---|---|---|---|---|---|---|---|---|---|
| Plan and apply a recipe upgrade end-to-end, no human review in the middle | <recipe-name> |
|
Recipe Upgrade Full
Run the planning phase and the apply phase for a single recipe back-to-back, with no human-in-the-loop review between them. Designed for autonomous/cron use, and as the per-recipe worker spawned by /recipe-upgrade-cron-all.
The recipe name is: $ARGUMENTS
Read and follow the instructions in .claude/commands/includes/logging.md.
Read and follow the instructions in .claude/commands/includes/guidelines.md.
Behaviour differences from running plan + apply manually
- No mid-skill confirmation. Do not ask the user to review the plan before applying — proceed straight through.
- Uncommitted local changes ⇒ abort this recipe.
recipe-upgrade-plan.mdstep 2 normally asks the user to choose commit / stash / discard. In this skill, do NOT prompt: log the dirty state and exit with statusskipped: dirty-worktree. The next cron run can pick the recipe up after a human cleans it. - In-use lock for parallel safety. Hold an
in-use/<recipe>.lockfile for the duration so any concurrentcontext_reset.py(e.g. from a sibling subagent) protects this recipe. - Exit cleanly when up to date. If
abra recipe upgrade <recipe> -m -nreports no upgrades, remove the lock and exit with statusskipped: up-to-date.
Steps
1. Acquire the in-use lock
mkdir -p /workspace/in-use
touch /workspace/in-use/$ARGUMENTS.lock
The lock MUST be released on every exit path below — success, failure, or early skip. The simplest way is to release it as the very last action in step 4, AND in every early-exit branch.
2. Run the planning phase
Follow steps 1–9 of .claude/commands/recipe-upgrade-plan.md verbatim, with these overrides:
- Step 2 override (dirty worktree): if
git -C ~/.abra/recipes/$ARGUMENTS status --shortis non-empty, do NOT prompt. Instead:- Log the dirty state (modified/staged/untracked files).
- Remove
/workspace/in-use/$ARGUMENTS.lock. - Emit final status
SKIPPED — uncommitted local changes in ~/.abra/recipes/$ARGUMENTSand stop.
- Step 4 override (no upgrades): if
abra recipe upgrade $ARGUMENTS -m -nshows nothing to upgrade:- Remove
/workspace/in-use/$ARGUMENTS.lock. - Emit final status
SKIPPED — already up to dateand stop.
- Remove
- Step 10 (the "tell the user and stop" step) is omitted — fall through to step 3 below instead.
3. Run the apply phase
Follow all steps of .claude/commands/recipe-upgrade-apply.md verbatim. Step 2 of the apply skill will find the plan file that step 9 of the plan phase just wrote.
If any step in the apply phase fails (lint, deploy, tests, commit, PR):
- Log the failure with enough detail to diagnose.
- Skip the remaining apply steps (commit/tag/PR will already be guarded by the existing "only if all tests passed" conditions).
- Continue to step 4 below — do NOT abort the lock release.
4. Release the lock and report
rm -f /workspace/in-use/$ARGUMENTS.lock
Print a single-line final status that the calling skill (/recipe-upgrade-cron-all) can parse. Use one of these exact prefixes:
RESULT: SUCCESS — <recipe> upgraded <old-version> → <new-version>, PR: <gitea-pr-url>RESULT: SUCCESS-NO-PR — <recipe> upgraded but PR creation failed: <reason>RESULT: FAILED — <recipe> at step <step-name>: <one-line-reason>RESULT: SKIPPED — <recipe>: <up-to-date | dirty-worktree | other reason>
Follow with the normal human-readable summary (image tag changes, test results, etc.) that recipe-upgrade-apply step 13 produces.