▍ humdrum codex / custard v0.3.0
license AGPL-3.0

docs: JJ and verb release support.

b899af008a6868dfca936888c81cb7166ce8bdf2
humdrum <me@humdrum.me> · 2026-07-02 15:04

parent 39c8f278

4 files changed

- → release-verb-support-jj-soft-bookmark-mode-not-just-git-tag-origin.md +3 −3
@@ -4,7 +4,7 @@ title: 'release verb: support jj/soft + bookmark mode (not just git tag + origin)'
 status: "\U0001F7E6 Backlog"
 assignee: []
 created_date: '2026-06-25 04:14'
-updated_date: '2026-06-25 04:58'
+updated_date: '2026-06-29 22:00'
 labels:
   - bug
 dependencies: []
@@ -20,7 +20,7 @@ <!-- SECTION:DESCRIPTION:END -->
 
 ## Acceptance Criteria
 <!-- AC:BEGIN -->
-- [ ] #1 release verb works on a jj+soft repo (no origin remote)
+- [x] #1 release verb works on a jj+soft repo (no origin remote)
 - [ ] #2 bookmark source mode creates+pushes release/vX.Y.Z via jj, not git tag
 - [ ] #3 tag mode still works for git/origin repos (no regression)
 <!-- AC:END -->
@@ -28,5 +28,5 @@
 ## Implementation Notes
 
 <!-- SECTION:NOTES:BEGIN -->
-DevFlow ADR 0002 decided Option C: jj/soft repos release via bookmark mode — push a release/vX.Y.Z bookmark directly (jj git push -b release/vX.Y.Z); the Soft Serve webhook + server (source: bookmark) publish the brew. So the CLI 'release' verb (git tag + git push origin) is NOT the jj path — it serves git/origin/tag repos only. Scope: either (a) teach the verb a jj/bookmark path so 'custard release vX.Y.Z' works uniformly (set+push release/ bookmark via jj when source=bookmark / remote=soft), or (b) just fix origin->soft for tag repos and document the manual jj bookmark-release path. Milestones are LOCAL jj tags (never pushed) — out of scope for release.
+UPDATE 2026-06-29 (env standardization on origin): The remote-name half of this task is resolved at the environment level, not in code. Per DevFlow ADR 0003, every jj/git repo now standardizes its remote name to 'origin' (the old 'soft'-named-remote convention is retired). custard's release verb already hardcodes 'git push origin' (internal/cli/verbs.go, internal/release/release.go), so it now works uniformly across git and jj+Soft-Serve repos — no remote-name detection needed. AC #1 (release verb works on a jj+soft repo) is satisfied: the repo's remote is 'origin', matching custard's hardcoded push. Note: 'soft' as the SSH host alias / Soft Serve product / clone URL (soft:<repo>) is unchanged — only the remote *name* moved soft->origin. REMAINING WORK: only the bookmark-mode half (AC #2) — the CLI 'release' verb always emits a git tag and ignores '.custard.yaml' brew.source=bookmark on the client side (it's honored only server-side in internal/release). To fully support pure-jj bookmark releases, the verb should set+push 'release/vX.Y.Z' via jj when source=bookmark, per DevFlow ADR 0002 Option C.
 <!-- SECTION:NOTES:END -->
- → release-verb-m-flag-for-custom-annotated-tag-message.md +25 −0
@@ -0,0 +1,25 @@
+---
+id: TASK-012
+title: 'release verb: -m flag for custom annotated-tag message'
+status: "\U0001F7E6 Backlog"
+assignee: []
+created_date: '2026-06-29 22:08'
+labels:
+  - feature
+dependencies: []
+priority: low
+ordinal: 12000
+---
+
+## Description
+
+<!-- SECTION:DESCRIPTION:BEGIN -->
+custard release vX.Y.Z hardcodes the annotated-tag message to the version string (internal/cli/verbs.go:166 — 'git tag -a <ver> -m <ver> <commit>'). Release() only reads args[0]; extra args like -m "msg" are silently ignored. Add a -m/--message flag so the release can carry a real message; fall back to the version when absent.
+<!-- SECTION:DESCRIPTION:END -->
+
+## Acceptance Criteria
+<!-- AC:BEGIN -->
+- [ ] #1 custard release vX.Y.Z -m "msg" sets the annotated tag message to msg
+- [ ] #2 no -m given falls back to the version string (current behavior, unchanged)
+- [ ] #3 unknown/extra args error instead of being silently ignored
+<!-- AC:END -->
docs/JUJUTSU.md +5 −0
@@ -22,6 +22,11 @@ # push changes
 jj git push --bookmark main    # or --all
 ```
 
+`jj git clone` names the remote `origin` (pointing at `soft:<repo>`), the same as stock git.
+Keep it named `origin`: custard's `release` verb pushes with `git push origin`, so the remote
+must be `origin` for releases to work. (`soft:` here is just the SSH host alias for the clone
+URL — not the remote's name.)
+
 ## Concept mapping
 
 | jj concept | What lands in git / custard |
docs/MIGRATION.md +11 −0
@@ -20,6 +20,17 @@ # 4. set visibility (public repos show on the forge)
 ssh soft repo private <name> true|false
 ```
 
+> **Remote naming — `origin` is always the primary.** Decide which forge is primary,
+> then name accordingly (see DevFlow `decisions/0003`; custard's `release` verb pushes
+> with `git push origin`, so the release target must be `origin`):
+> - **Soft Serve primary** (full move) → Soft is `origin`, GitHub (if kept) becomes `github`:
+>   `git remote set-url origin soft:<name>` then `git remote rename origin github` first
+>   if you're demoting an existing GitHub `origin`. The clone URL is `soft:<name>` — the
+>   `soft:` is the SSH host alias, not the remote name.
+> - **GitHub stays primary** (Soft as a backup mirror) → leave GitHub as `origin`, add
+>   Soft as `soft`: `git remote add soft soft:<name>`. Push to the mirror explicitly
+>   (`git push soft …`); custard release stays pointed at the GitHub `origin`.
+
 ## Step 2 — drop GitHub-only cruft (full self-host)
 
 - `.github/workflows/*` — GitHub Actions → replaced by `.custard.yaml` `ci` + `custard check/preview`.