Skip to content

Commit be4f0be

Browse files
Merge pull request #335 from wphillipmoore/release/1.1.8
release: 1.1.8
2 parents 6c0e7d2 + 07f0c83 commit be4f0be

26 files changed

Lines changed: 937 additions & 229 deletions
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
name: Add to project
2+
3+
on:
4+
issues:
5+
types: [opened]
6+
7+
jobs:
8+
add-to-project:
9+
runs-on: ubuntu-latest
10+
steps:
11+
- uses: actions/add-to-project@v1
12+
with:
13+
project-url: https://github.com/users/wphillipmoore/projects/3
14+
github-token: ${{ secrets.PROJECT_TOKEN }}

.github/workflows/ci.yml

Lines changed: 5 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -108,26 +108,10 @@ jobs:
108108

109109
- name: Version divergence gate (PRs targeting develop)
110110
if: github.event_name == 'pull_request' && github.base_ref == 'develop'
111-
run: |
112-
git fetch origin main --depth=1
113-
main_version=$(python3 -c "
114-
import tomllib, subprocess
115-
text = subprocess.run(
116-
['git', 'show', 'origin/main:pyproject.toml'],
117-
capture_output=True, text=True, check=True
118-
).stdout
119-
print(tomllib.loads(text)['project']['version'])
120-
")
121-
head_version=$(python3 -c "
122-
import tomllib
123-
from pathlib import Path
124-
print(tomllib.loads(Path('pyproject.toml').read_text())['project']['version'])
125-
")
126-
if [ "$main_version" = "$head_version" ]; then
127-
echo "FAIL: PR version ($head_version) must differ from main ($main_version)."
128-
exit 1
129-
fi
130-
echo "OK: PR version ($head_version) differs from main ($main_version)."
111+
uses: wphillipmoore/standard-actions/actions/release-gates/version-divergence@develop
112+
with:
113+
head-version-command: python3 -c "import tomllib; from pathlib import Path; print(tomllib.loads(Path('pyproject.toml').read_text())['project']['version'])"
114+
main-version-command: git show origin/main:pyproject.toml | python3 -c "import sys, tomllib; print(tomllib.loads(sys.stdin.read())['project']['version'])"
131115

132116
test-and-validate:
133117
name: test-and-validate
@@ -263,7 +247,7 @@ jobs:
263247
run: uv sync --frozen --group dev
264248

265249
- name: Setup MQ environment
266-
uses: wphillipmoore/mq-dev-environment/.github/actions/setup-mq@main
250+
uses: wphillipmoore/mq-rest-admin-dev-environment/.github/actions/setup-mq@main
267251
with:
268252
project-name: pymqrest
269253

.github/workflows/docs.yml

Lines changed: 5 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -24,13 +24,6 @@ jobs:
2424
with:
2525
fetch-depth: 0
2626

27-
- name: Checkout mq-rest-admin-common
28-
uses: actions/checkout@v4
29-
with:
30-
repository: wphillipmoore/mq-rest-admin-common
31-
ref: develop
32-
path: .mq-rest-admin-common
33-
3427
- name: Set up Python
3528
uses: wphillipmoore/standard-actions/actions/python/setup@develop
3629
with:
@@ -40,27 +33,9 @@ jobs:
4033
- name: Install dependencies
4134
run: uv sync --frozen --group docs
4235

43-
- name: Configure git identity
44-
run: |
45-
git config user.name "github-actions[bot]"
46-
git config user.email "github-actions[bot]@users.noreply.github.com"
47-
48-
- name: Determine version
49-
id: version
50-
run: |
51-
if [ "${{ github.ref }}" = "refs/heads/main" ]; then
52-
VERSION=$(uv run python -c "from importlib.metadata import version; v=version('pymqrest'); print('.'.join(v.split('.')[:2]))")
53-
echo "version=$VERSION" >> "$GITHUB_OUTPUT"
54-
echo "alias=latest" >> "$GITHUB_OUTPUT"
55-
else
56-
echo "version=dev" >> "$GITHUB_OUTPUT"
57-
echo "alias=" >> "$GITHUB_OUTPUT"
58-
fi
59-
6036
- name: Deploy docs
61-
run: |
62-
if [ -n "${{ steps.version.outputs.alias }}" ]; then
63-
uv run mike deploy -F docs/site/mkdocs.yml --push --update-aliases ${{ steps.version.outputs.version }} ${{ steps.version.outputs.alias }}
64-
else
65-
uv run mike deploy -F docs/site/mkdocs.yml --push ${{ steps.version.outputs.version }}
66-
fi
37+
uses: wphillipmoore/standard-actions/actions/docs-deploy@develop
38+
with:
39+
version-command: uv run python -c "from importlib.metadata import version; v=version('pymqrest'); print('.'.join(v.split('.')[:2]))"
40+
mike-command: uv run mike
41+
checkout-common: "true"

.github/workflows/publish.yml

Lines changed: 29 additions & 127 deletions
Original file line numberDiff line numberDiff line change
@@ -91,142 +91,44 @@ jobs:
9191
scan-type: sbom
9292
output-file: dist/pymqrest-${{ steps.version.outputs.version }}.cdx.json
9393

94-
- name: Configure git identity
94+
- name: Tag and release
9595
if: steps.tag_check.outputs.exists == 'false'
96-
run: |
97-
git config user.name "github-actions[bot]"
98-
git config user.email "github-actions[bot]@users.noreply.github.com"
99-
100-
- name: Create git tag
101-
if: steps.tag_check.outputs.exists == 'false'
102-
run: |
103-
git tag -a "${{ steps.version.outputs.tag }}" \
104-
-m "Release ${{ steps.version.outputs.version }}"
105-
git push origin "${{ steps.version.outputs.tag }}"
106-
107-
- name: Tag develop for changelog boundaries
108-
if: steps.tag_check.outputs.exists == 'false'
109-
run: |
110-
git fetch origin develop
111-
git tag "develop-${{ steps.version.outputs.tag }}" origin/develop
112-
git push origin "develop-${{ steps.version.outputs.tag }}"
113-
114-
- name: Create GitHub Release
115-
if: steps.tag_check.outputs.exists == 'false'
116-
env:
117-
GH_TOKEN: ${{ github.token }}
118-
run: |
119-
gh release create "${{ steps.version.outputs.tag }}" \
120-
--title "pymqrest ${{ steps.version.outputs.version }}" \
121-
--notes "$(cat <<'EOF'
122-
## Installation
96+
uses: wphillipmoore/standard-actions/actions/publish/tag-and-release@develop
97+
with:
98+
version: ${{ steps.version.outputs.version }}
99+
release-title: pymqrest
100+
release-notes: |
101+
## Installation
123102
124-
```bash
125-
pip install pymqrest==${{ steps.version.outputs.version }}
126-
```
103+
```bash
104+
pip install pymqrest==${{ steps.version.outputs.version }}
105+
```
127106
128-
## Links
107+
## Links
129108
130-
- [PyPI](https://pypi.org/project/pymqrest/${{ steps.version.outputs.version }}/)
131-
- [Documentation](https://wphillipmoore.github.io/mq-rest-admin-python/)
132-
EOF
133-
)" \
134-
dist/*
135-
136-
- name: Compute next patch version
137-
id: next_version
138-
run: |
139-
next=$(python3 -c "
140-
v = '${{ steps.version.outputs.version }}'.split('.')
141-
v[2] = str(int(v[2]) + 1)
142-
print('.'.join(v))
143-
")
144-
echo "version=$next" >> "$GITHUB_OUTPUT"
145-
echo "branch=chore/bump-version-$next" >> "$GITHUB_OUTPUT"
146-
147-
- name: Check if develop already has next version
148-
id: bump_check
149-
run: |
150-
git fetch origin develop
151-
current=$(git show origin/develop:pyproject.toml | python3 -c "
152-
import sys, tomllib
153-
print(tomllib.loads(sys.stdin.read())['project']['version'])
154-
")
155-
if [ "$current" = "${{ steps.next_version.outputs.version }}" ]; then
156-
echo "needed=false" >> "$GITHUB_OUTPUT"
157-
else
158-
echo "needed=true" >> "$GITHUB_OUTPUT"
159-
fi
109+
- [PyPI](https://pypi.org/project/pymqrest/${{ steps.version.outputs.version }}/)
110+
- [Documentation](https://wphillipmoore.github.io/mq-rest-admin-python/)
111+
release-artifacts: dist/*
160112

161113
- name: Generate app token for bump PR
162-
if: steps.bump_check.outputs.needed == 'true'
114+
if: steps.tag_check.outputs.exists == 'false'
163115
id: app-token
164116
uses: actions/create-github-app-token@v1
165117
with:
166118
app-id: ${{ secrets.APP_ID }}
167119
private-key: ${{ secrets.APP_PRIVATE_KEY }}
168120

169-
- name: Create version bump PR
170-
if: steps.bump_check.outputs.needed == 'true'
171-
env:
172-
GH_TOKEN: ${{ steps.app-token.outputs.token }}
173-
run: |
174-
git checkout -b "${{ steps.next_version.outputs.branch }}" origin/develop
175-
git merge origin/main --no-edit
176-
177-
python3 -c "
178-
from pathlib import Path
179-
import re
180-
p = Path('pyproject.toml')
181-
content = p.read_text()
182-
content = re.sub(
183-
r'^(version\s*=\s*\").*(\"\s*)$',
184-
r'\g<1>${{ steps.next_version.outputs.version }}\2',
185-
content,
186-
count=1,
187-
flags=re.MULTILINE,
188-
)
189-
p.write_text(content)
190-
"
191-
192-
uv lock --upgrade
193-
uv export --no-hashes -o requirements.txt
194-
uv export --no-hashes --group dev -o requirements-dev.txt
195-
196-
git add pyproject.toml uv.lock requirements.txt requirements-dev.txt
197-
git commit -m "chore: bump version to ${{ steps.next_version.outputs.version }}"
198-
git push origin "${{ steps.next_version.outputs.branch }}"
199-
200-
pr_url=$(gh pr create \
201-
--base develop \
202-
--head "${{ steps.next_version.outputs.branch }}" \
203-
--title "chore: bump version to ${{ steps.next_version.outputs.version }}" \
204-
--body "Automated patch version bump after publishing ${{ steps.version.outputs.version }}.
205-
206-
This merges \`main\` back into \`develop\` to pick up the changelog and any
207-
other release-branch artifacts, then sets the working version to the next
208-
expected patch release. Change this to a minor or major bump if the next
209-
release warrants it.
210-
211-
Dependencies are refreshed to their latest compatible versions
212-
via \`uv lock --upgrade\`.")
213-
214-
pr_number="${pr_url##*/}"
215-
gh pr edit "$pr_number" --body "Automated patch version bump after publishing ${{ steps.version.outputs.version }}.
216-
217-
This merges \`main\` back into \`develop\` to pick up the changelog and any
218-
other release-branch artifacts, then sets the working version to the next
219-
expected patch release. Change this to a minor or major bump if the next
220-
release warrants it.
221-
222-
Dependencies are refreshed to their latest compatible versions
223-
via \`uv lock --upgrade\`.
224-
225-
Ref #${pr_number}"
226-
227-
gh pr close "$pr_number"
228-
gh pr reopen "$pr_number"
229-
230-
gh pr merge \
231-
--auto --merge --delete-branch \
232-
"${{ steps.next_version.outputs.branch }}"
121+
- name: Version bump PR
122+
if: steps.tag_check.outputs.exists == 'false'
123+
uses: wphillipmoore/standard-actions/actions/publish/version-bump-pr@develop
124+
with:
125+
current-version: ${{ steps.version.outputs.version }}
126+
version-file: pyproject.toml
127+
version-regex: '^(version\s*=\s*\").*(\"\s*)$'
128+
version-replacement: '\g<1>{version}\2'
129+
version-regex-multiline: "true"
130+
develop-version-command: python3 -c "import sys, tomllib; print(tomllib.loads(sys.stdin.read())['project']['version'])"
131+
post-bump-command: uv lock --upgrade && uv export --no-hashes -o requirements.txt && uv export --no-hashes --group dev -o requirements-dev.txt
132+
extra-files: uv.lock requirements.txt requirements-dev.txt
133+
app-token: ${{ steps.app-token.outputs.token }}
134+
pr-body-extra: Dependencies are refreshed to their latest compatible versions via `uv lock --upgrade`.

CHANGELOG.md

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,32 @@ All notable changes to this project will be documented in this file.
55
The format is based on [Keep a Changelog](https://keepachangelog.com/)
66
and this project adheres to [Semantic Versioning](https://semver.org/).
77

8+
## [1.1.8] - 2026-02-19
9+
10+
### Bug fixes
11+
12+
- sync shared tooling to v1.0.2
13+
- revert Python 3.10 CI matrix expansion (#323)
14+
- sync hook and lint scripts from standards-and-conventions (#324)
15+
16+
### CI
17+
18+
- auto-add issues to GitHub Project (#319)
19+
20+
### Documentation
21+
22+
- rename mq-dev-environment references to mq-rest-admin-dev-environment (#325)
23+
24+
### Features
25+
26+
- sync shared tooling from standard-tooling v1.0.0
27+
- extend CI matrix to Python 3.10+ to discover minimum supported version (#322)
28+
29+
### Refactoring
30+
31+
- use shared docs-deploy composite action (#329)
32+
- use shared composite actions for publish and release gates (#333)
33+
834
## [1.1.7] - 2026-02-17
935

1036
### Bug fixes

CLAUDE.md

Lines changed: 36 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -140,13 +140,13 @@ The `publish.yml` workflow triggers on push to `main` and publishes to PyPI via
140140
### Local MQ Container
141141

142142
The MQ development environment is owned by the
143-
[mq-dev-environment](https://github.com/wphillipmoore/mq-dev-environment)
143+
[mq-rest-admin-dev-environment](https://github.com/wphillipmoore/mq-rest-admin-dev-environment)
144144
repository. Clone it as a sibling directory before running lifecycle
145145
scripts:
146146

147147
```bash
148148
# Prerequisite (one-time)
149-
git clone https://github.com/wphillipmoore/mq-dev-environment.git ../mq-dev-environment
149+
git clone https://github.com/wphillipmoore/mq-rest-admin-dev-environment.git ../mq-rest-admin-dev-environment
150150

151151
# Start the containerized MQ queue managers
152152
./scripts/dev/mq_start.sh
@@ -165,7 +165,7 @@ git clone https://github.com/wphillipmoore/mq-dev-environment.git ../mq-dev-envi
165165
```
166166

167167
The lifecycle scripts are thin wrappers that delegate to
168-
`../mq-dev-environment`. Override the path with `MQ_DEV_ENV_PATH`.
168+
`../mq-rest-admin-dev-environment`. Override the path with `MQ_DEV_ENV_PATH`.
169169

170170
Container details:
171171
- Queue managers: `QM1` and `QM2`
@@ -324,6 +324,39 @@ This approach ensures all AI agents (Codex, Claude, etc.) have access to the sam
324324
- `docs/repository-standards.md` - Project-specific standards (included from AGENTS.md)
325325
- `docs/standards-and-conventions.md` - Canonical standards reference (includes external repo)
326326

327+
## Commit and PR Scripts
328+
329+
**NEVER use raw `git commit`** — always use `scripts/dev/commit.sh`.
330+
**NEVER use raw `gh pr create`** — always use `scripts/dev/submit-pr.sh`.
331+
332+
### Committing
333+
334+
```bash
335+
scripts/dev/commit.sh --type feat --scope session --message "add retry logic" --agent claude
336+
scripts/dev/commit.sh --type fix --message "correct attribute mapping" --agent claude
337+
```
338+
339+
- `--type` (required): `feat|fix|docs|style|refactor|test|chore|ci|build`
340+
- `--message` (required): commit description
341+
- `--agent` (required): `claude` or `codex` — resolves the correct `Co-Authored-By` identity
342+
- `--scope` (optional): conventional commit scope
343+
- `--body` (optional): detailed commit body
344+
345+
### Submitting PRs
346+
347+
```bash
348+
scripts/dev/submit-pr.sh --issue 42 --summary "Add retry logic to session"
349+
scripts/dev/submit-pr.sh --issue 42 --linkage Ref --summary "Update docs" --docs-only
350+
```
351+
352+
- `--issue` (required): GitHub issue number (just the number)
353+
- `--summary` (required): one-line PR summary
354+
- `--linkage` (optional, default: `Fixes`): `Fixes|Closes|Resolves|Ref`
355+
- `--title` (optional): PR title (default: most recent commit subject)
356+
- `--notes` (optional): additional notes
357+
- `--docs-only` (optional): applies docs-only testing exception
358+
- `--dry-run` (optional): print generated PR without executing
359+
327360
## Key References
328361

329362
**Canonical Standards**: https://github.com/wphillipmoore/standards-and-conventions

0 commit comments

Comments
 (0)