plex-tui 0.3.0__tar.gz → 0.3.12__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (50) hide show
  1. {plex_tui-0.3.0 → plex_tui-0.3.12}/.github/workflows/aur.yml +1 -1
  2. {plex_tui-0.3.0 → plex_tui-0.3.12}/.github/workflows/bump.yml +19 -1
  3. plex_tui-0.3.12/.github/workflows/post-release-aur.yml +159 -0
  4. plex_tui-0.3.12/.github/workflows/post-release-homebrew.yml +154 -0
  5. plex_tui-0.3.12/.github/workflows/publish-aur.yml +102 -0
  6. {plex_tui-0.3.0 → plex_tui-0.3.12}/AGENTS.md +26 -2
  7. {plex_tui-0.3.0 → plex_tui-0.3.12}/CHANGELOG.md +27 -0
  8. {plex_tui-0.3.0 → plex_tui-0.3.12}/PACKAGING.md +17 -5
  9. {plex_tui-0.3.0 → plex_tui-0.3.12}/PKG-INFO +8 -1
  10. {plex_tui-0.3.0 → plex_tui-0.3.12}/README.md +7 -0
  11. {plex_tui-0.3.0 → plex_tui-0.3.12}/RELEASE.md +57 -7
  12. plex_tui-0.3.12/ROADMAP.md +60 -0
  13. {plex_tui-0.3.0 → plex_tui-0.3.12}/packaging/aur/.SRCINFO +3 -4
  14. {plex_tui-0.3.0 → plex_tui-0.3.12}/packaging/aur/PKGBUILD +2 -4
  15. {plex_tui-0.3.0 → plex_tui-0.3.12}/packaging/aur/README.md +4 -0
  16. {plex_tui-0.3.0 → plex_tui-0.3.12}/pyproject.toml +1 -1
  17. {plex_tui-0.3.0 → plex_tui-0.3.12}/scripts/check_release.py +9 -4
  18. plex_tui-0.3.12/scripts/update_aur_package.py +67 -0
  19. plex_tui-0.3.12/scripts/update_homebrew_formula.py +192 -0
  20. {plex_tui-0.3.0 → plex_tui-0.3.12}/src/plextui/__init__.py +1 -1
  21. {plex_tui-0.3.0 → plex_tui-0.3.12}/src/plextui/app.py +164 -45
  22. {plex_tui-0.3.0 → plex_tui-0.3.12}/tests/test_app_helpers.py +91 -11
  23. {plex_tui-0.3.0 → plex_tui-0.3.12}/tests/test_app_navigation.py +1 -1
  24. plex_tui-0.3.12/tests/test_release_checks.py +210 -0
  25. plex_tui-0.3.0/ROADMAP.md +0 -39
  26. plex_tui-0.3.0/tests/test_release_checks.py +0 -109
  27. {plex_tui-0.3.0 → plex_tui-0.3.12}/.github/workflows/ci.yml +0 -0
  28. {plex_tui-0.3.0 → plex_tui-0.3.12}/.github/workflows/publish-pypi.yml +0 -0
  29. {plex_tui-0.3.0 → plex_tui-0.3.12}/.github/workflows/publish-testpypi.yml +0 -0
  30. {plex_tui-0.3.0 → plex_tui-0.3.12}/.gitignore +0 -0
  31. {plex_tui-0.3.0 → plex_tui-0.3.12}/LICENSE +0 -0
  32. {plex_tui-0.3.0 → plex_tui-0.3.12}/Makefile +0 -0
  33. {plex_tui-0.3.0 → plex_tui-0.3.12}/config.example.toml +0 -0
  34. {plex_tui-0.3.0 → plex_tui-0.3.12}/docs/assets/grid-view.png +0 -0
  35. {plex_tui-0.3.0 → plex_tui-0.3.12}/docs/assets/list-view.png +0 -0
  36. {plex_tui-0.3.0 → plex_tui-0.3.12}/packaging/homebrew/README.md +0 -0
  37. {plex_tui-0.3.0 → plex_tui-0.3.12}/src/plextui/__main__.py +0 -0
  38. {plex_tui-0.3.0 → plex_tui-0.3.12}/src/plextui/artwork.py +0 -0
  39. {plex_tui-0.3.0 → plex_tui-0.3.12}/src/plextui/auth.py +0 -0
  40. {plex_tui-0.3.0 → plex_tui-0.3.12}/src/plextui/config.py +0 -0
  41. {plex_tui-0.3.0 → plex_tui-0.3.12}/src/plextui/models.py +0 -0
  42. {plex_tui-0.3.0 → plex_tui-0.3.12}/src/plextui/player.py +0 -0
  43. {plex_tui-0.3.0 → plex_tui-0.3.12}/src/plextui/plex_service.py +0 -0
  44. {plex_tui-0.3.0 → plex_tui-0.3.12}/src/plextui/smoke.py +0 -0
  45. {plex_tui-0.3.0 → plex_tui-0.3.12}/tests/test_artwork.py +0 -0
  46. {plex_tui-0.3.0 → plex_tui-0.3.12}/tests/test_auth.py +0 -0
  47. {plex_tui-0.3.0 → plex_tui-0.3.12}/tests/test_cli.py +0 -0
  48. {plex_tui-0.3.0 → plex_tui-0.3.12}/tests/test_config.py +0 -0
  49. {plex_tui-0.3.0 → plex_tui-0.3.12}/tests/test_player.py +0 -0
  50. {plex_tui-0.3.0 → plex_tui-0.3.12}/tests/test_plex_service.py +0 -0
@@ -43,7 +43,7 @@ jobs:
43
43
  - name: Generate .SRCINFO
44
44
  working-directory: packaging/aur
45
45
  run: |
46
- sudo -u builder makepkg --printsrcinfo > .SRCINFO.generated
46
+ sudo -u builder makepkg --printsrcinfo | sudo -u builder tee .SRCINFO.generated > /dev/null
47
47
  diff -u .SRCINFO .SRCINFO.generated
48
48
 
49
49
  - name: Run namcap
@@ -27,7 +27,7 @@ jobs:
27
27
  new_tag: ${{ steps.bump.outputs.new_version }}
28
28
  previous_tag: ${{ steps.bump.outputs.previous_version }}
29
29
  skipped: ${{ steps.bump.outputs.skipped }}
30
- release_requested: ${{ steps.bump.outputs.should_release }}
30
+ release_requested: ${{ steps.release-intent.outputs.release_requested }}
31
31
 
32
32
  steps:
33
33
  - name: Check out repository
@@ -44,6 +44,24 @@ jobs:
44
44
  # Floating pointer tags are owned by release-creator so they only move
45
45
  # when a GitHub Release is intentionally published.
46
46
 
47
+ - name: Detect release request
48
+ id: release-intent
49
+ env:
50
+ PR_TITLE: ${{ github.event.pull_request.title }}
51
+ run: |
52
+ set -euo pipefail
53
+
54
+ text="$(printf '%s\n' "$PR_TITLE" | tr '[:upper:]' '[:lower:]')"
55
+ release_requested=false
56
+ for marker in "#release" "#publish" "#ship"; do
57
+ if grep -qF "$marker" <<< "$text"; then
58
+ release_requested=true
59
+ break
60
+ fi
61
+ done
62
+
63
+ echo "release_requested=$release_requested" >> "$GITHUB_OUTPUT"
64
+
47
65
  create-release:
48
66
  name: Create GitHub Release
49
67
  needs: bump-version
@@ -0,0 +1,159 @@
1
+ name: Post-release AUR Update
2
+
3
+ on:
4
+ workflow_run:
5
+ workflows: ["Version Bump and Release"]
6
+ types: ["completed"]
7
+ workflow_dispatch:
8
+ inputs:
9
+ tag:
10
+ description: "Release tag to package, such as v0.3.0. Defaults to the release created by the completed bump workflow."
11
+ required: false
12
+ type: string
13
+
14
+ env:
15
+ FORCE_JAVASCRIPT_ACTIONS_TO_NODE24: true
16
+
17
+ jobs:
18
+ aur-pr:
19
+ if: github.event_name == 'workflow_dispatch' || github.event.workflow_run.conclusion == 'success'
20
+ runs-on: ubuntu-latest
21
+ permissions:
22
+ contents: write
23
+ pull-requests: write
24
+
25
+ steps:
26
+ - name: Check out repository
27
+ uses: actions/checkout@v5
28
+
29
+ - name: Check packaging PR token
30
+ env:
31
+ PACKAGING_PR_TOKEN: ${{ secrets.PACKAGING_PR_TOKEN }}
32
+ run: |
33
+ if [ -z "$PACKAGING_PR_TOKEN" ]; then
34
+ echo "PACKAGING_PR_TOKEN secret is required to create and auto-merge packaging PRs" >&2
35
+ exit 1
36
+ fi
37
+
38
+ - name: Determine release tag
39
+ id: release
40
+ env:
41
+ GH_TOKEN: ${{ github.token }}
42
+ REQUESTED_TAG: ${{ github.event.inputs.tag }}
43
+ WORKFLOW_HEAD_SHA: ${{ github.event.workflow_run.head_sha }}
44
+ run: |
45
+ set -euo pipefail
46
+
47
+ if [ -n "$REQUESTED_TAG" ]; then
48
+ tag="$REQUESTED_TAG"
49
+ else
50
+ tag="$(gh release list --limit 1 --json tagName --jq '.[0].tagName // ""')"
51
+ fi
52
+
53
+ if ! [[ "$tag" =~ ^v[0-9]+\.[0-9]+\.[0-9]+$ ]]; then
54
+ echo "Release tag must look like vX.Y.Z: $tag" >&2
55
+ exit 1
56
+ fi
57
+
58
+ if ! gh release view "$tag" --json tagName --jq '.tagName' >/dev/null; then
59
+ echo "GitHub Release does not exist for $tag" >&2
60
+ exit 1
61
+ fi
62
+
63
+ if [ -n "$WORKFLOW_HEAD_SHA" ]; then
64
+ git fetch --force origin "refs/tags/$tag:refs/tags/$tag"
65
+ tag_sha="$(git rev-list -n 1 "$tag")"
66
+ if [ "$tag_sha" != "$WORKFLOW_HEAD_SHA" ]; then
67
+ {
68
+ echo "publish=false"
69
+ } >> "$GITHUB_OUTPUT"
70
+ echo "Latest release $tag points at $tag_sha, not completed workflow SHA $WORKFLOW_HEAD_SHA. Nothing to publish."
71
+ exit 0
72
+ fi
73
+ fi
74
+
75
+ version="${tag#v}"
76
+ {
77
+ echo "publish=true"
78
+ echo "tag=$tag"
79
+ echo "version=$version"
80
+ } >> "$GITHUB_OUTPUT"
81
+
82
+ - name: Download source archive and checksum
83
+ if: steps.release.outputs.publish == 'true'
84
+ id: archive
85
+ env:
86
+ TAG: ${{ steps.release.outputs.tag }}
87
+ run: |
88
+ set -euo pipefail
89
+
90
+ url="https://github.com/${GITHUB_REPOSITORY}/archive/refs/tags/${TAG}.tar.gz"
91
+ curl --fail --location --retry 5 --retry-delay 2 --output source.tar.gz "$url"
92
+ sha256="$(sha256sum source.tar.gz | awk '{print $1}')"
93
+ echo "sha256=$sha256" >> "$GITHUB_OUTPUT"
94
+
95
+ - name: Update PKGBUILD
96
+ if: steps.release.outputs.publish == 'true'
97
+ run: |
98
+ python scripts/update_aur_package.py \
99
+ "${{ steps.release.outputs.version }}" \
100
+ "${{ steps.archive.outputs.sha256 }}"
101
+
102
+ - name: Regenerate and validate AUR package
103
+ if: steps.release.outputs.publish == 'true'
104
+ run: |
105
+ set -euo pipefail
106
+
107
+ docker run --rm \
108
+ -v "$PWD:/workspace" \
109
+ -w /workspace/packaging/aur \
110
+ archlinux:base-devel \
111
+ bash -lc '
112
+ set -euo pipefail
113
+ pacman -Syu --noconfirm git namcap sudo
114
+ useradd --create-home --shell /bin/bash builder
115
+ echo "builder ALL=(ALL) NOPASSWD: ALL" > /etc/sudoers.d/builder
116
+ chown -R builder:builder /workspace/packaging/aur
117
+ sudo -u builder makepkg --printsrcinfo | sudo -u builder tee .SRCINFO > /dev/null
118
+ sudo -u builder makepkg --clean --syncdeps --noconfirm --check
119
+ namcap PKGBUILD ./*.pkg.tar.*
120
+ '
121
+
122
+ sudo chown -R "$(id -u):$(id -g)" packaging/aur
123
+
124
+ - name: Remove generated package artifacts
125
+ if: steps.release.outputs.publish == 'true'
126
+ run: |
127
+ rm -f source.tar.gz
128
+ find packaging/aur -maxdepth 1 -type f \
129
+ \( -name "*.pkg.tar.*" -o -name "*.tar.gz" \) \
130
+ -delete
131
+
132
+ - name: Create packaging pull request
133
+ if: steps.release.outputs.publish == 'true'
134
+ id: create-pr
135
+ uses: peter-evans/create-pull-request@v7
136
+ with:
137
+ token: ${{ secrets.PACKAGING_PR_TOKEN }}
138
+ branch: automation/aur-${{ steps.release.outputs.tag }}
139
+ delete-branch: true
140
+ commit-message: Update AUR package to ${{ steps.release.outputs.tag }}
141
+ title: Update AUR package to ${{ steps.release.outputs.tag }}
142
+ body: |
143
+ Updates Arch AUR packaging metadata for `${{ steps.release.outputs.tag }}`.
144
+
145
+ Validation performed by this workflow:
146
+ - downloaded the release source archive and computed the sha256
147
+ - regenerated `packaging/aur/.SRCINFO`
148
+ - ran `makepkg --clean --syncdeps --noconfirm --check`
149
+ - ran `namcap`
150
+
151
+ This is a packaging-only PR and intentionally has no semver bump marker.
152
+
153
+ - name: Enable packaging pull request auto-merge
154
+ if: steps.create-pr.outputs.pull-request-number != ''
155
+ env:
156
+ GH_TOKEN: ${{ secrets.PACKAGING_PR_TOKEN }}
157
+ PR_NUMBER: ${{ steps.create-pr.outputs.pull-request-number }}
158
+ run: |
159
+ gh pr merge "$PR_NUMBER" --auto --squash --delete-branch
@@ -0,0 +1,154 @@
1
+ name: Post-release Homebrew Publish
2
+
3
+ on:
4
+ workflow_run:
5
+ workflows: ["Version Bump and Release"]
6
+ types: ["completed"]
7
+ workflow_dispatch:
8
+ inputs:
9
+ tag:
10
+ description: "Release tag to package, such as v0.3.0. Defaults to the release created by the completed bump workflow."
11
+ required: false
12
+ type: string
13
+
14
+ env:
15
+ FORCE_JAVASCRIPT_ACTIONS_TO_NODE24: true
16
+
17
+ jobs:
18
+ publish-tap:
19
+ if: github.event_name == 'workflow_dispatch' || github.event.workflow_run.conclusion == 'success'
20
+ runs-on: macos-latest
21
+ permissions:
22
+ contents: read
23
+
24
+ steps:
25
+ - name: Check out repository
26
+ uses: actions/checkout@v5
27
+
28
+ - name: Set up Python
29
+ uses: actions/setup-python@v6
30
+ with:
31
+ python-version: "3.13"
32
+
33
+ - name: Check packaging PR token
34
+ env:
35
+ PACKAGING_PR_TOKEN: ${{ secrets.PACKAGING_PR_TOKEN }}
36
+ run: |
37
+ if [ -z "$PACKAGING_PR_TOKEN" ]; then
38
+ echo "PACKAGING_PR_TOKEN secret is required to publish the Homebrew tap" >&2
39
+ exit 1
40
+ fi
41
+
42
+ - name: Determine release tag
43
+ id: release
44
+ env:
45
+ GH_TOKEN: ${{ github.token }}
46
+ REQUESTED_TAG: ${{ github.event.inputs.tag }}
47
+ WORKFLOW_HEAD_SHA: ${{ github.event.workflow_run.head_sha }}
48
+ run: |
49
+ set -euo pipefail
50
+
51
+ if [ -n "$REQUESTED_TAG" ]; then
52
+ tag="$REQUESTED_TAG"
53
+ else
54
+ tag="$(gh release list --limit 1 --json tagName --jq '.[0].tagName // ""')"
55
+ fi
56
+
57
+ if ! [[ "$tag" =~ ^v[0-9]+\.[0-9]+\.[0-9]+$ ]]; then
58
+ echo "Release tag must look like vX.Y.Z: $tag" >&2
59
+ exit 1
60
+ fi
61
+
62
+ if ! gh release view "$tag" --json tagName --jq '.tagName' >/dev/null; then
63
+ echo "GitHub Release does not exist for $tag" >&2
64
+ exit 1
65
+ fi
66
+
67
+ if [ -n "$WORKFLOW_HEAD_SHA" ]; then
68
+ git fetch --force origin "refs/tags/$tag:refs/tags/$tag"
69
+ tag_sha="$(git rev-list -n 1 "$tag")"
70
+ if [ "$tag_sha" != "$WORKFLOW_HEAD_SHA" ]; then
71
+ {
72
+ echo "publish=false"
73
+ } >> "$GITHUB_OUTPUT"
74
+ echo "Latest release $tag points at $tag_sha, not completed workflow SHA $WORKFLOW_HEAD_SHA. Nothing to publish."
75
+ exit 0
76
+ fi
77
+ fi
78
+
79
+ version="${tag#v}"
80
+ {
81
+ echo "publish=true"
82
+ echo "tag=$tag"
83
+ echo "version=$version"
84
+ } >> "$GITHUB_OUTPUT"
85
+
86
+ - name: Tap Homebrew repository
87
+ if: steps.release.outputs.publish == 'true'
88
+ id: tap
89
+ env:
90
+ PACKAGING_PR_TOKEN: ${{ secrets.PACKAGING_PR_TOKEN }}
91
+ run: |
92
+ brew tap so1omon563/plex-tui "https://x-access-token:${PACKAGING_PR_TOKEN}@github.com/so1omon563/homebrew-plex-tui.git"
93
+ echo "path=$(brew --repo so1omon563/plex-tui)" >> "$GITHUB_OUTPUT"
94
+
95
+ - name: Update formula source
96
+ if: steps.release.outputs.publish == 'true'
97
+ run: |
98
+ python scripts/update_homebrew_formula.py \
99
+ "${{ steps.tap.outputs.path }}/Formula/plex-tui.rb" \
100
+ "${{ steps.release.outputs.version }}"
101
+
102
+ - name: Audit formula
103
+ if: steps.release.outputs.publish == 'true'
104
+ working-directory: ${{ steps.tap.outputs.path }}
105
+ run: |
106
+ brew audit --strict --online so1omon563/plex-tui/plex-tui
107
+
108
+ - name: Commit tap update
109
+ if: steps.release.outputs.publish == 'true'
110
+ id: commit
111
+ working-directory: ${{ steps.tap.outputs.path }}
112
+ env:
113
+ VERSION: ${{ steps.release.outputs.version }}
114
+ run: |
115
+ set -euo pipefail
116
+
117
+ if git diff --quiet -- Formula/plex-tui.rb; then
118
+ echo "changed=false" >> "$GITHUB_OUTPUT"
119
+ echo "Homebrew tap is already up to date."
120
+ exit 0
121
+ fi
122
+
123
+ branch="automation/plex-tui-v${VERSION}"
124
+ git switch -c "$branch"
125
+ git config user.name "github-actions[bot]"
126
+ git config user.email "41898282+github-actions[bot]@users.noreply.github.com"
127
+ git add Formula/plex-tui.rb
128
+ git commit -m "Update plex-tui to ${VERSION}"
129
+ git push origin "$branch"
130
+
131
+ echo "changed=true" >> "$GITHUB_OUTPUT"
132
+ echo "branch=$branch" >> "$GITHUB_OUTPUT"
133
+
134
+ - name: Open and merge tap pull request
135
+ if: steps.release.outputs.publish == 'true' && steps.commit.outputs.changed == 'true'
136
+ working-directory: ${{ steps.tap.outputs.path }}
137
+ env:
138
+ GH_TOKEN: ${{ secrets.PACKAGING_PR_TOKEN }}
139
+ VERSION: ${{ steps.release.outputs.version }}
140
+ BRANCH: ${{ steps.commit.outputs.branch }}
141
+ run: |
142
+ set -euo pipefail
143
+
144
+ pr_url="$(gh pr create \
145
+ --repo so1omon563/homebrew-plex-tui \
146
+ --base main \
147
+ --head "$BRANCH" \
148
+ --title "Update plex-tui to ${VERSION}" \
149
+ --body "Automated Homebrew tap update for plex-tui ${VERSION}.")"
150
+
151
+ gh pr merge "$pr_url" \
152
+ --repo so1omon563/homebrew-plex-tui \
153
+ --squash \
154
+ --delete-branch
@@ -0,0 +1,102 @@
1
+ name: Publish AUR Package
2
+
3
+ on:
4
+ workflow_run:
5
+ workflows: ["AUR Package"]
6
+ types: ["completed"]
7
+ workflow_dispatch:
8
+
9
+ env:
10
+ FORCE_JAVASCRIPT_ACTIONS_TO_NODE24: true
11
+
12
+ jobs:
13
+ publish:
14
+ if: |
15
+ github.event_name == 'workflow_dispatch' ||
16
+ (
17
+ github.event.workflow_run.conclusion == 'success' &&
18
+ github.event.workflow_run.head_branch == 'main' &&
19
+ github.event.workflow_run.event == 'push'
20
+ )
21
+ runs-on: ubuntu-latest
22
+ permissions:
23
+ contents: read
24
+
25
+ steps:
26
+ - name: Check out repository
27
+ uses: actions/checkout@v5
28
+ with:
29
+ ref: ${{ github.event.workflow_run.head_sha || github.sha }}
30
+
31
+ - name: Read package version
32
+ id: package
33
+ run: |
34
+ set -euo pipefail
35
+
36
+ version="$(sed -n 's/^pkgver=//p' packaging/aur/PKGBUILD)"
37
+ release="$(sed -n 's/^pkgrel=//p' packaging/aur/PKGBUILD)"
38
+
39
+ if ! [[ "$version" =~ ^[0-9]+\.[0-9]+\.[0-9]+$ ]]; then
40
+ echo "pkgver must look like X.Y.Z: $version" >&2
41
+ exit 1
42
+ fi
43
+ if ! [[ "$release" =~ ^[0-9]+$ ]]; then
44
+ echo "pkgrel must be numeric: $release" >&2
45
+ exit 1
46
+ fi
47
+
48
+ echo "version=$version" >> "$GITHUB_OUTPUT"
49
+ echo "release=$release" >> "$GITHUB_OUTPUT"
50
+
51
+ - name: Configure AUR SSH
52
+ env:
53
+ AUR_SSH_PRIVATE_KEY: ${{ secrets.AUR_SSH_PRIVATE_KEY }}
54
+ run: |
55
+ set -euo pipefail
56
+
57
+ if [ -z "$AUR_SSH_PRIVATE_KEY" ]; then
58
+ echo "AUR_SSH_PRIVATE_KEY secret is required to publish to AUR" >&2
59
+ exit 1
60
+ fi
61
+
62
+ install -m 700 -d ~/.ssh
63
+ printf '%s\n' "$AUR_SSH_PRIVATE_KEY" > ~/.ssh/aur
64
+ chmod 600 ~/.ssh/aur
65
+ ssh-keyscan -H aur.archlinux.org >> ~/.ssh/known_hosts
66
+
67
+ cat > ~/.ssh/config <<'EOF'
68
+ Host aur.archlinux.org
69
+ IdentityFile ~/.ssh/aur
70
+ IdentitiesOnly yes
71
+ User aur
72
+ EOF
73
+ chmod 600 ~/.ssh/config
74
+
75
+ - name: Clone AUR package repository
76
+ run: |
77
+ git clone ssh://aur@aur.archlinux.org/plex-tui.git aur-package
78
+
79
+ - name: Copy package metadata
80
+ run: |
81
+ cp packaging/aur/PKGBUILD aur-package/PKGBUILD
82
+ cp packaging/aur/.SRCINFO aur-package/.SRCINFO
83
+
84
+ - name: Commit and push AUR package
85
+ working-directory: aur-package
86
+ env:
87
+ VERSION: ${{ steps.package.outputs.version }}
88
+ RELEASE: ${{ steps.package.outputs.release }}
89
+ run: |
90
+ set -euo pipefail
91
+
92
+ git config user.name "github-actions[bot]"
93
+ git config user.email "41898282+github-actions[bot]@users.noreply.github.com"
94
+
95
+ if git diff --quiet -- PKGBUILD .SRCINFO; then
96
+ echo "AUR package repository is already up to date."
97
+ exit 0
98
+ fi
99
+
100
+ git add PKGBUILD .SRCINFO
101
+ git commit -m "Update to ${VERSION}-${RELEASE}"
102
+ git push origin master
@@ -80,8 +80,32 @@ Pull requests should include:
80
80
 
81
81
  Use PRs for repository changes. When publishing local commits, branch from
82
82
  `main` with a scoped name such as `codex/release-prep`, push that branch, and
83
- open a draft PR instead of pushing directly to `main`. Treat `main` as a
84
- protected branch even before GitHub branch protection or rulesets are enabled.
83
+ open a draft PR instead of pushing directly to `main`.
84
+
85
+ `main` is protected by repository rulesets. Changes must flow through PRs; force
86
+ pushes and branch deletion are blocked. `plex-tui` requires the Python 3.11 and
87
+ 3.13 CI checks before merge. The Homebrew tap also requires PRs for `main`.
88
+ Rulesets intentionally require zero approving reviews so automation PRs can
89
+ merge after required checks pass without self-approval.
90
+
91
+ By default, PR titles or bodies should include exactly one semver bump marker:
92
+ `#patch`, `#minor`, or `#major`. Most changes should advance tags when merged,
93
+ even when they do not publish a GitHub Release. Add `#release` only when the
94
+ merge should create the GitHub Release and publish package channels. Exceptions
95
+ are allowed for packaging-only follow-ups, automation repair, docs-only
96
+ maintenance, or other changes that should not create a new version tag; call out
97
+ the reason in the PR body when omitting a bump marker.
98
+
99
+ When preparing or estimating a release version, fetch remote tags first with
100
+ `git fetch --tags origin` and base the decision on the latest origin tag, not
101
+ only local tags or the latest GitHub Release. Non-release PRs with `#patch`,
102
+ `#minor`, or `#major` still create tags, so release prep files should match the
103
+ tag that the release PR merge will create.
104
+
105
+ GitHub Release publishing is controlled by release markers in PR titles only:
106
+ `#release`, `#publish`, or `#ship`. Keep those markers out of ordinary PR titles
107
+ unless the merge should publish PyPI, Homebrew, and AUR. PR bodies may mention
108
+ release markers for explanation without publishing.
85
109
 
86
110
  GitHub CLI notes:
87
111
 
@@ -2,6 +2,33 @@
2
2
 
3
3
  ## Unreleased
4
4
 
5
+ ## 0.3.12 - 2026-06-12
6
+
7
+ - Added release workflow guards so tag-only patch bumps do not republish the
8
+ latest GitHub Release through Homebrew or AUR automation.
9
+ - Limited publish markers to PR titles so release examples in PR bodies do not
10
+ accidentally create GitHub Releases.
11
+ - Protected `main` in the app and Homebrew tap repositories while keeping
12
+ automation PRs mergeable without manual approval.
13
+ - Documented protected release automation, packaging dry-runs, and default
14
+ semver bump expectations for future PRs.
15
+
16
+ ## 0.3.6 - 2026-06-12
17
+
18
+ - Polished grid cards so poster placeholders, cached artwork, titles,
19
+ subtitles, and selected status align more evenly in the media pane.
20
+ - Improved the details pane hierarchy with clearer playback readiness,
21
+ explicit empty metadata/stream states, tighter preference rows, and wrapped
22
+ summaries.
23
+ - Improved Settings detail feedback with consistent controls guidance, clearer
24
+ armed-confirmation text, and more useful saved-setting summaries.
25
+ - Polished playback diagnostics with clearer active playback status, structured
26
+ playback error details, and more direct debug-log follow-up guidance.
27
+ - Added shieldcn.dev README badges for CI, release, PyPI, AUR, Homebrew tap,
28
+ and license status.
29
+ - Documented release-prep guidance for fetching origin tags before deciding the
30
+ next release version.
31
+
5
32
  ## 0.3.0 - 2026-06-12
6
33
 
7
34
  - Added `plex-tui --diagnostics` for collecting environment and playback setup details.
@@ -90,13 +90,25 @@ Validation is handled by `.github/workflows/aur.yml`, which runs inside
90
90
  For each new app release:
91
91
 
92
92
  1. Publish and validate PyPI.
93
- 2. Update the Homebrew tap formula URL/hash and Python resources.
94
- 3. Update `packaging/aur/PKGBUILD` and `packaging/aur/.SRCINFO`.
95
- 4. Run packaging validation workflows.
96
- 5. Push the AUR package repo update after the workflow passes.
93
+ 2. Let the `Post-release Homebrew Publish` workflow update, validate, and merge
94
+ the Homebrew tap formula.
95
+ 3. Let the `Post-release AUR Update` workflow update AUR metadata, open the
96
+ packaging PR, approve it, and enable auto-merge.
97
+ 4. After the packaging PR merges and the `AUR Package` workflow passes on
98
+ `main`, the `Publish AUR Package` workflow pushes the validated `PKGBUILD`
99
+ and `.SRCINFO` to AUR.
100
+
101
+ The AUR automation requires:
102
+
103
+ - `PACKAGING_PR_TOKEN`: a token that can create, approve, and auto-merge the
104
+ generated packaging PR when branch protection requires those actions.
105
+ - `AUR_SSH_PRIVATE_KEY`: the private SSH key for pushing to
106
+ `ssh://aur@aur.archlinux.org/plex-tui.git`.
107
+
108
+ The Homebrew automation uses `PACKAGING_PR_TOKEN`; that token must also be able
109
+ to push branches and merge pull requests in `so1omon563/homebrew-plex-tui`.
97
110
 
98
111
  ## Known Follow-Up
99
112
 
100
- - Automate Homebrew tap updates after PyPI publishing.
101
113
  - Investigate faster Homebrew installs without compromising formula quality.
102
114
  - Consider standalone artifacts only after the app behavior stabilizes.
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: plex-tui
3
- Version: 0.3.0
3
+ Version: 0.3.12
4
4
  Summary: A small standalone Plex terminal UI.
5
5
  Project-URL: Homepage, https://github.com/so1omon563/plex-tui
6
6
  Project-URL: Issues, https://github.com/so1omon563/plex-tui/issues
@@ -36,6 +36,13 @@ Description-Content-Type: text/markdown
36
36
 
37
37
  # plex-tui
38
38
 
39
+ [![CI](https://shieldcn.dev/github/so1omon563/plex-tui/ci.png)](https://github.com/so1omon563/plex-tui/actions/workflows/ci.yml)
40
+ [![Release](https://shieldcn.dev/github/so1omon563/plex-tui/release.png)](https://github.com/so1omon563/plex-tui/releases/latest)
41
+ [![PyPI](https://shieldcn.dev/badge/dynamic/json.png?url=https%3A%2F%2Fpypi.org%2Fpypi%2Fplex-tui%2Fjson&query=%24.info.version&label=PyPI&logo=pypi)](https://pypi.org/project/plex-tui/)
42
+ [![AUR](https://shieldcn.dev/badge/dynamic/json.png?url=https%3A%2F%2Faur.archlinux.org%2Frpc%2Fv5%2Finfo%2Fplex-tui&query=%24.results%5B0%5D.Version&label=AUR&logo=archlinux)](https://aur.archlinux.org/packages/plex-tui)
43
+ [![Homebrew](https://shieldcn.dev/badge/Homebrew-tap-blue.png?logo=homebrew)](https://github.com/so1omon563/homebrew-plex-tui)
44
+ [![License](https://shieldcn.dev/github/so1omon563/plex-tui/license.png)](LICENSE)
45
+
39
46
  A standalone Python/Textual terminal UI for browsing Plex and launching playback
40
47
  through `mpv`.
41
48
 
@@ -1,5 +1,12 @@
1
1
  # plex-tui
2
2
 
3
+ [![CI](https://shieldcn.dev/github/so1omon563/plex-tui/ci.png)](https://github.com/so1omon563/plex-tui/actions/workflows/ci.yml)
4
+ [![Release](https://shieldcn.dev/github/so1omon563/plex-tui/release.png)](https://github.com/so1omon563/plex-tui/releases/latest)
5
+ [![PyPI](https://shieldcn.dev/badge/dynamic/json.png?url=https%3A%2F%2Fpypi.org%2Fpypi%2Fplex-tui%2Fjson&query=%24.info.version&label=PyPI&logo=pypi)](https://pypi.org/project/plex-tui/)
6
+ [![AUR](https://shieldcn.dev/badge/dynamic/json.png?url=https%3A%2F%2Faur.archlinux.org%2Frpc%2Fv5%2Finfo%2Fplex-tui&query=%24.results%5B0%5D.Version&label=AUR&logo=archlinux)](https://aur.archlinux.org/packages/plex-tui)
7
+ [![Homebrew](https://shieldcn.dev/badge/Homebrew-tap-blue.png?logo=homebrew)](https://github.com/so1omon563/homebrew-plex-tui)
8
+ [![License](https://shieldcn.dev/github/so1omon563/plex-tui/license.png)](LICENSE)
9
+
3
10
  A standalone Python/Textual terminal UI for browsing Plex and launching playback
4
11
  through `mpv`.
5
12