Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
16 commits
Select commit Hold shift + click to select a range
94e0d83
feat(2.4.0): community ad patterns + 49-tag vocabulary + authoritativ…
ttlequals0 May 14, 2026
82ff17e
fix(2.4.0): address /code-review findings on community-patterns branch
ttlequals0 May 14, 2026
4969436
fix(2.4.0): coerce user-supplied bulk-op fields to int before reflecting
ttlequals0 May 14, 2026
abec974
docs(2.4.0): add patterns/CONTRIBUTING.md, patterns/README.md, regene…
ttlequals0 May 14, 2026
cac7f5f
docs(2.4.0): full /humanizer audit pass on community-patterns docs
ttlequals0 May 15, 2026
c0c0680
feat(2.4.0): add podcast-level tag editor UI on the feed-detail page
ttlequals0 May 15, 2026
8aa59b7
fix(2.4.0): close plan-vs-implementation gaps found in post-build audit
ttlequals0 May 15, 2026
097a8e6
chore(2.4.0): /simplify pass on post-PR changes
ttlequals0 May 15, 2026
6bdfe8d
chore(2.4.1): bump version + CHANGELOG for post-2.4.0 changes
ttlequals0 May 15, 2026
a24f4bf
fix(2.4.1): address all 5 PR audit gaps + /simplify pass
ttlequals0 May 15, 2026
dd2e1b2
chore(2.4.2): bump version + CHANGELOG for audit-gap fixes
ttlequals0 May 15, 2026
f6adb83
fix(2.4.3): four operational issues found in production logs
ttlequals0 May 15, 2026
02e3e35
feat(2.4.4): bulk submit-to-community, purge-all endpoint, single-pat…
ttlequals0 May 15, 2026
97bcc8f
fix(validator): strip PR-added files from existing-patterns baseline
ttlequals0 May 15, 2026
584b1ef
feat(2.4.5): bundle download replaces per-tab submit, sync soft-404, …
ttlequals0 May 15, 2026
e2647e1
fix(2.4.6): intro/outro_variants double-encoding + bundle export defe…
ttlequals0 May 15, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions .github/labeler.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
pattern:
- 'patterns/community/**/*.json'
23 changes: 23 additions & 0 deletions .github/workflows/labeler.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
name: Auto-label PRs

# pull_request_target runs in the context of the BASE branch and has write
# access to the PR. The actions/labeler action only reads the file diff and
# applies labels — no untrusted PR input flows into shell commands here.

on:
pull_request_target:
types: [opened, synchronize, reopened]

permissions:
contents: read
pull-requests: write

jobs:
label:
name: Apply path-based labels
runs-on: ubuntu-latest
steps:
- uses: actions/labeler@v5
with:
repo-token: ${{ secrets.GITHUB_TOKEN }}
configuration-path: .github/labeler.yml
74 changes: 74 additions & 0 deletions .github/workflows/regenerate-manifest.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,74 @@
name: Regenerate community pattern manifest

# Triggers when a push to main changes anything under patterns/community/
# (typically a merged PR that added, removed, or updated a pattern file).
# The workflow rebuilds patterns/community/index.json from the source pattern
# files and commits the updated manifest back to main.

on:
push:
branches:
- main
paths:
- 'patterns/community/**.json'
- '!patterns/community/index.json' # avoid recursive triggers from our own commits

# Prevent overlapping runs. If two pattern PRs merge back-to-back, the second
# run waits for the first so the manifest is consistent.
concurrency:
group: regenerate-manifest
cancel-in-progress: false

permissions:
contents: write # required to commit the manifest back to main

jobs:
regenerate:
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@v4
with:
# Use a PAT or GITHUB_TOKEN that can push back to main.
# Default GITHUB_TOKEN works for same-repo pushes that don't trigger
# further workflows; if branch protection requires PRs, swap for a
# PAT secret.
token: ${{ secrets.GITHUB_TOKEN }}
fetch-depth: 0

- name: Setup Python
uses: actions/setup-python@v5
with:
python-version: '3.12'
cache: 'pip'

- name: Install dependencies
run: |
python -m pip install --upgrade pip
pip install -r requirements.txt

- name: Regenerate manifest
run: |
python -m src.tools.generate_manifest

- name: Check for manifest changes
id: check
run: |
if git diff --quiet patterns/community/index.json; then
echo "changed=false" >> "$GITHUB_OUTPUT"
else
echo "changed=true" >> "$GITHUB_OUTPUT"
fi

- name: Commit and push updated manifest
if: steps.check.outputs.changed == 'true'
run: |
git config user.name "minuspod-bot"
git config user.email "[email protected]"
git add patterns/community/index.json
git commit -m "chore: regenerate community pattern manifest [skip ci]"
git push

- name: Report no-op
if: steps.check.outputs.changed == 'false'
run: echo "Manifest already up to date. Nothing to commit."
84 changes: 84 additions & 0 deletions .github/workflows/validate-community-patterns.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,84 @@
name: Community Pattern Validation

on:
pull_request:
types: [opened, synchronize, reopened]
paths:
- 'patterns/community/**'

permissions:
contents: read
pull-requests: write

jobs:
validate:
name: Validate community pattern submissions
runs-on: ubuntu-latest
steps:
- name: Checkout PR
uses: actions/checkout@v6
with:
fetch-depth: 2

- name: List changed JSON files under patterns/community/
id: changed
env:
BASE_SHA: ${{ github.event.pull_request.base.sha }}
HEAD_SHA: ${{ github.event.pull_request.head.sha }}
run: |
set -e
changed=$(git diff --diff-filter=AM --name-only "$BASE_SHA" "$HEAD_SHA" \
| grep -E '^patterns/community/.+\.json$' \
| grep -v 'patterns/community/index.json' \
| tr '\n' ' ' || true)
echo "files=$changed" >> "$GITHUB_OUTPUT"
echo "Changed files: $changed"

- name: Setup Python
if: steps.changed.outputs.files != ''
uses: actions/setup-python@v6
with:
python-version: '3.11'
cache: pip

- name: Install lightweight deps
if: steps.changed.outputs.files != ''
run: |
python -m pip install --upgrade pip
# The validator imports only stdlib + utils/community_tags, which
# itself uses stdlib only. No requirements.txt install required.

- name: Run validator
if: steps.changed.outputs.files != ''
id: validate
env:
CHANGED_FILES: ${{ steps.changed.outputs.files }}
run: |
set +e
python -m src.tools.community_pattern_validator \
--pr-files $CHANGED_FILES \
--comment-output /tmp/comment.md \
--status-output /tmp/status.txt
echo "exit=$?" >> "$GITHUB_OUTPUT"

- name: Post results comment
if: always() && steps.changed.outputs.files != ''
uses: actions/github-script@v8
with:
script: |
const fs = require('fs');
const path = '/tmp/comment.md';
if (!fs.existsSync(path)) return;
const body = fs.readFileSync(path, 'utf8');
await github.rest.issues.createComment({
issue_number: context.issue.number,
owner: context.repo.owner,
repo: context.repo.repo,
body,
});

- name: Fail job on rejection
if: steps.changed.outputs.files != '' && steps.validate.outputs.exit != '0'
run: |
echo "Community pattern validation rejected one or more files."
exit 1
Loading