Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
54 commits
Select commit Hold shift + click to select a range
865fcf8
Update packages
ahegyes Oct 30, 2026
b62f423
Remove the pre-re-architecture plugin shells
ahegyes Oct 30, 2026
8bf3fe8
Re-base the root CI on the template's workflows
ahegyes Oct 30, 2026
fb80d7b
Bring the monorepo root up to the template's conventions
ahegyes Oct 30, 2026
91f81d5
Add Linked Orders from the plugin template
ahegyes Oct 30, 2026
2f1e361
Remove the template's demo from Linked Orders
ahegyes Oct 30, 2026
48ac4a3
Test Linked Orders' settings, data and capabilities against v1's
ahegyes Oct 30, 2026
3d17b48
Test v1's two settings read paths as v1 resolved them
ahegyes Oct 30, 2026
1a240fb
Port Linked Orders' settings, data and capabilities from v1
ahegyes Oct 30, 2026
23aa026
Test Linked Orders' order links, nodes and child creation
ahegyes Oct 30, 2026
022c2f1
Expect null for a refund's support, as v1 returned
ahegyes Oct 30, 2026
7c2d6ba
Port Linked Orders' linking API, order node and child creation
ahegyes Oct 30, 2026
9d2cc76
Test Linked Orders' child creation, autocompletion and SOS Pro
ahegyes Oct 30, 2026
6e04c05
Expect WooCommerce's full note and the new components at boot
ahegyes Oct 30, 2026
b914ae9
Port Linked Orders' child creation, autocompletion and SOS Pro
ahegyes Oct 30, 2026
88dc77c
Test Linked Orders' meta box and orders list on both storages
ahegyes Oct 30, 2026
63f347d
Load the admin APIs the meta box rows need, and order by depth
ahegyes Oct 30, 2026
a680eb2
Port Linked Orders' meta box and orders list to both storages
ahegyes Oct 30, 2026
bd5a531
Test Linked Orders' v1 root functions, constants and boot hooks
ahegyes Oct 30, 2026
a5ed596
Keep Linked Orders' v1 root functions, constants and boot hooks
ahegyes Oct 30, 2026
65d67e4
Test that Linked Orders' readme repeats its entry file
ahegyes Oct 30, 2026
51aadc2
Distribute Linked Orders through wordpress.org
ahegyes Oct 30, 2026
d0fc5bc
Test Linked Orders' screens end to end on the order tables
ahegyes Oct 30, 2026
846f4f4
Run every order-touching row on all four order storages
ahegyes Oct 30, 2026
5e05c5d
Describe Linked Orders in its own docs
ahegyes Oct 30, 2026
6951c00
Test an uninstall without the plugin, lone-root links and request ids
ahegyes Oct 30, 2026
8d82948
Track the children the parent-id row creates
ahegyes Oct 30, 2026
ad6b28b
Fix what the review found in uninstall, linking and the list
ahegyes Oct 30, 2026
a72c57f
Log that linking refuses a child with children
ahegyes Oct 30, 2026
c7885fa
Test the depth filter's last word, nested queries and skipped includes
ahegyes Oct 30, 2026
ec0bcaf
Fix what Codex found in the depth reader, list queries and CI
ahegyes Oct 30, 2026
b529296
Test extension fields in v1's groups and numbering before the save
ahegyes Oct 30, 2026
a9fcda6
Read any field of v1's settings groups from its option
ahegyes Oct 30, 2026
ff9a997
Test trashed depths and the posts editor's post in the meta box
ahegyes Oct 30, 2026
e6c4476
Count trashed orders at the depth filter's deepest level
ahegyes Oct 30, 2026
652ce94
Test that autocompletion passes the completed order through its filters
ahegyes Oct 30, 2026
52be137
Pass the completed order itself through autocompletion's filters
ahegyes Oct 30, 2026
b0d5523
Test the deepest level over every status and an untouched list query
ahegyes Oct 30, 2026
f35aa77
Test the deepest level with a status registered as a post status only
ahegyes Oct 30, 2026
aac49d4
Count every status at the deepest level and leave unfiltered lists be
ahegyes Oct 30, 2026
e955851
Reword the readme's manual installation step
ahegyes Oct 30, 2026
1c0fa83
Test links racing another request's link to the same parent
ahegyes Oct 30, 2026
7e520c5
Lock links so a concurrent link keeps the parent's other children
ahegyes Oct 30, 2026
12d2f1e
Test a concurrent link with WooCommerce's order data caching on
ahegyes Oct 30, 2026
3c95719
Clear WooCommerce's order data cache before a link re-reads its orders
ahegyes Oct 30, 2026
e283db8
Run the new-site migration row as a request of its own
ahegyes Oct 30, 2026
e5b4436
Test the row actions against a plugin that resets them first
ahegyes Oct 30, 2026
20fded8
Add the row actions before v1 Quote Requests resets them
ahegyes Oct 30, 2026
5ecb368
Test a link's re-read of the child, with data caching pinned per row
ahegyes Oct 30, 2026
a152c16
Bypass WooCommerce's order data caching without its internal API
ahegyes Oct 30, 2026
ba3fd97
Test that a link waits for another request's link to finish
ahegyes Oct 30, 2026
e63c23b
Align the wait row's assignments
ahegyes Oct 30, 2026
9613cb2
Wait for another request's link before refusing a link
ahegyes Oct 30, 2026
2698fb6
Drop the accommodations for v1 Quote Requests
ahegyes Oct 30, 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
6 changes: 2 additions & 4 deletions .github/ISSUE_TEMPLATE/bug_report.yml
Original file line number Diff line number Diff line change
Expand Up @@ -7,9 +7,7 @@ body:
attributes:
label: Affected plugin (or scaffold)
options:
- internal-comments
- linked-orders-for-woocommerce
- locked-payment-methods-for-woocommerce
- Monorepo scaffold (root composer/npm scripts, wp-env, CI workflows)
- Other / unsure
validations:
Expand Down Expand Up @@ -57,15 +55,15 @@ body:
id: wc-version
attributes:
label: WooCommerce version (if applicable)
placeholder: '10.7.0'
placeholder: '11.2.1'

- type: textarea
id: reproduction
attributes:
label: Steps to reproduce
placeholder: |
1. `git clone … && cd wordpress-plugins`
2. `npm run install:all && npm run wp-env:start`
2. `npm run setup && npm run wp-env:tests:start`
3. Observe Z
validations:
required: true
Expand Down
2 changes: 0 additions & 2 deletions .github/ISSUE_TEMPLATE/feature_request.yml
Original file line number Diff line number Diff line change
Expand Up @@ -7,9 +7,7 @@ body:
attributes:
label: Target plugin (or scaffold)
options:
- internal-comments
- linked-orders-for-woocommerce
- locked-payment-methods-for-woocommerce
- Monorepo scaffold (root composer/npm scripts, wp-env, CI workflows)
- New plugin proposal
validations:
Expand Down
18 changes: 5 additions & 13 deletions .github/PULL_REQUEST_TEMPLATE.md
Original file line number Diff line number Diff line change
Expand Up @@ -11,21 +11,13 @@
- [ ] Documentation
- [ ] Dependency update

## Affected plugin(s)

- [ ] internal-comments
- [ ] linked-orders-for-woocommerce
- [ ] locked-payment-methods-for-woocommerce
- [ ] Monorepo scaffold (root scripts, wp-env, CI workflows)

## Checklist

- [ ] Changelog fragment added (`composer changelog:add` at root, or in the affected plugin dir)
- [ ] Changelog fragment added (`composer changelog:add` in the changed plugin's directory, or at the root for the monorepo itself)
- [ ] Tests added/updated
- [ ] `composer plugins:quality-check` (or per-plugin `composer quality-check`) passes locally
- [ ] Plugin header + `readme.txt` updated if runtime requirements changed

## Breaking changes for mirror consumers
- [ ] `composer quality-check` passes locally in every changed plugin
- [ ] Plugin header and `readme.txt` updated if runtime requirements changed

<!-- Fill in if this PR changes the scoping pipeline, composer scripts, CI workflow contracts, or anything that downstream consumers of the split-published mirrors (wp-internal-comments / wc-linked-orders / wc-locked-payment-methods) would notice. Otherwise delete. -->
## Breaking changes

<!-- Fill in if this PR changes a plugin's public contract (hooks, functions, option or meta keys, capabilities), the scoping pipeline or the CI workflows. Otherwise delete. -->
113 changes: 24 additions & 89 deletions .github/dependabot.yml
Original file line number Diff line number Diff line change
@@ -1,120 +1,55 @@
version: 2
updates:
# Root tooling
# The mirrors are read-only, so the plugins' dependencies and workflow pins are updated here.
- package-ecosystem: composer
directory: /
directories:
- /
- /plugins/*
schedule:
interval: weekly
day: monday
time: '06:00'
timezone: UTC
open-pull-requests-limit: 5
cooldown:
default-days: 7
groups:
php-dev-deps-root:
patterns: ['*']
php-dev-deps:
patterns:
- '*'
dependency-type: development

- package-ecosystem: npm
directory: /
directories:
- /
- /plugins/*
schedule:
interval: weekly
day: monday
time: '06:00'
timezone: UTC
open-pull-requests-limit: 5
cooldown:
default-days: 7
groups:
npm-dev-deps-root:
patterns: ['*']
npm-dev-deps:
patterns:
- '*'
dependency-type: development

- package-ecosystem: github-actions
directory: /
directories:
- /
- /plugins/*
schedule:
interval: weekly
day: monday
time: '06:00'
timezone: UTC
open-pull-requests-limit: 5
cooldown:
default-days: 7
groups:
github-actions:
patterns: ['*']

# Per-plugin Composer
- package-ecosystem: composer
directory: /plugins/internal-comments
schedule:
interval: weekly
day: monday
time: '06:00'
timezone: UTC
open-pull-requests-limit: 5
groups:
php-dev-deps-internal-comments:
patterns: ['*']
dependency-type: development

- package-ecosystem: composer
directory: /plugins/linked-orders-for-woocommerce
schedule:
interval: weekly
day: monday
time: '06:00'
timezone: UTC
open-pull-requests-limit: 5
groups:
php-dev-deps-linked-orders-for-woocommerce:
patterns: ['*']
dependency-type: development

- package-ecosystem: composer
directory: /plugins/locked-payment-methods-for-woocommerce
schedule:
interval: weekly
day: monday
time: '06:00'
timezone: UTC
open-pull-requests-limit: 5
groups:
php-dev-deps-locked-payment-methods-for-woocommerce:
patterns: ['*']
dependency-type: development

# Per-plugin npm
- package-ecosystem: npm
directory: /plugins/internal-comments
schedule:
interval: weekly
day: monday
time: '06:00'
timezone: UTC
open-pull-requests-limit: 5
groups:
npm-dev-deps-internal-comments:
patterns: ['*']
dependency-type: development

- package-ecosystem: npm
directory: /plugins/linked-orders-for-woocommerce
schedule:
interval: weekly
day: monday
time: '06:00'
timezone: UTC
open-pull-requests-limit: 5
groups:
npm-dev-deps-linked-orders-for-woocommerce:
patterns: ['*']
dependency-type: development

- package-ecosystem: npm
directory: /plugins/locked-payment-methods-for-woocommerce
schedule:
interval: weekly
day: monday
time: '06:00'
timezone: UTC
open-pull-requests-limit: 5
groups:
npm-dev-deps-locked-payment-methods-for-woocommerce:
patterns: ['*']
dependency-type: development
patterns:
- '*'
31 changes: 31 additions & 0 deletions .github/workflows/audit.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
name: Supply-Chain Audit

on:
push:
branches: [trunk]
pull_request:
schedule:
# Weekly Monday at 07:00 UTC — staggered after dependabot (06:00) so PRs from
# dependency bumps surface audit results in the same morning batch.
- cron: '0 7 * * 1'

permissions:
contents: read

jobs:
plugins:
name: Plugins
uses: ./.github/workflows/plugins.yml

audit:
name: Audit (${{ matrix.project }})
needs: plugins
strategy:
fail-fast: false
matrix:
project: ${{ fromJSON(needs.plugins.outputs.projects) }}
# npm gate audits production deps only — the dev-tooling graph (wp-scripts/playwright trees) is advisory via dependabot alerts.
uses: ahegyes/wordpress-configs/.github/workflows/reusable-supply-chain-audit.yml@8d53efd292e4abee4a9c57b0e379434f54bedbe9
with:
project-path: ${{ matrix.project }}
npm-audit-flags: '--omit=dev --audit-level=high'
25 changes: 7 additions & 18 deletions .github/workflows/codeql.yml
Original file line number Diff line number Diff line change
Expand Up @@ -8,27 +8,16 @@ on:
schedule:
- cron: '0 6 * * 1'

concurrency:
group: ${{ github.workflow }}-${{ github.ref }}
cancel-in-progress: true

permissions: {}

jobs:
analyze:
name: Analyze (${{ matrix.language }})
runs-on: ubuntu-latest
permissions:
actions: read
contents: read
security-events: write
strategy:
fail-fast: false
matrix:
language: [actions]
# PHP scanning will be added once CodeQL's PHP support stabilizes.
# Track at https://docs.github.com/en/code-security/code-scanning/creating-an-advanced-setup-for-code-scanning/codeql-code-scanning-for-compiled-languages
steps:
- uses: actions/checkout@v6

- uses: github/codeql-action/init@v4
with:
languages: ${{ matrix.language }}

- uses: github/codeql-action/analyze@v4
with:
category: '/language:${{ matrix.language }}'
uses: ahegyes/wordpress-configs/.github/workflows/reusable-codeql.yml@8d53efd292e4abee4a9c57b0e379434f54bedbe9
86 changes: 86 additions & 0 deletions .github/workflows/plugins.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,86 @@
name: Plugins

# Every directory under plugins/ is a plugin whose main file and mirror its own files name, so a new plugin joins every lane without an edit to the workflows that call this one.
on:
workflow_call:
outputs:
plugins:
description: 'JSON array of the plugin directories under plugins/, each named after its slug.'
value: ${{ jobs.list.outputs.plugins }}
projects:
description: 'JSON array of the Composer projects: the repository root, then each plugin directory.'
value: ${{ jobs.list.outputs.projects }}
readmes:
description: 'JSON array of the plugin directories that hold a readme.txt, which wordpress.org distribution needs.'
value: ${{ jobs.list.outputs.readmes }}
mirrors:
description: 'JSON array of { plugin, repo } objects, the mirror each plugin splits to, as its composer.json name gives it.'
value: ${{ jobs.list.outputs.mirrors }}
wordpress:
description: 'JSON array of { plugin, wp } objects: the newest WordPress release of every branch from each plugin''s Requires at least up.'
value: ${{ jobs.list.outputs.wordpress }}

permissions:
contents: read

jobs:
list:
name: List the plugins
runs-on: ubuntu-latest
timeout-minutes: 5
outputs:
plugins: ${{ steps.plugins.outputs.plugins }}
projects: ${{ steps.plugins.outputs.projects }}
readmes: ${{ steps.plugins.outputs.readmes }}
mirrors: ${{ steps.plugins.outputs.mirrors }}
wordpress: ${{ steps.wordpress.outputs.wordpress }}
steps:
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
with:
persist-credentials: false

- name: List the plugin directories
id: plugins
run: |
plugins=$(find plugins -mindepth 1 -maxdepth 1 -type d -printf '%f\n' | sort | jq -Rsc 'split("\n") | map(select(length > 0)) | if length == 0 then error("plugins/ holds no plugin.") else . end')
mirrors='[]'
readmes='[]'
for plugin in $(jq -r '.[]' <<< "$plugins"); do
if ! [[ "$plugin" =~ ^[a-z0-9]+(-[a-z0-9]+)*$ ]] || [ ! -f "plugins/$plugin/$plugin.php" ]; then
echo "::error::plugins/$plugin must be a kebab-case slug holding its main file, $plugin.php."
exit 1
fi
repo=$(jq -r '.name // empty' "plugins/$plugin/composer.json")
if ! [[ "$repo" =~ ^ahegyes/[a-z0-9]+(-[a-z0-9]+)*$ ]]; then
echo "::error::plugins/$plugin/composer.json's name must be its mirror, ahegyes/<repository> — got '$repo'."
exit 1
fi
mirrors=$(jq -c --arg plugin "$plugin" --arg repo "${repo#ahegyes/}" '. + [{ plugin: $plugin, repo: $repo }]' <<< "$mirrors")
if [ -f "plugins/$plugin/readme.txt" ]; then
readmes=$(jq -c --arg plugin "$plugin" '. + [$plugin]' <<< "$readmes")
fi
done
{
echo "plugins=$plugins"
echo "projects=$(jq -c '["."] + map("plugins/" + .)' <<< "$plugins")"
echo "readmes=$readmes"
echo "mirrors=$mirrors"
} >> "$GITHUB_OUTPUT"

# WordPress's version API offers the newest release of every branch, so new releases and raised floors join without an edit here.
- name: List the newest WordPress release of every branch from each plugin's floor up
id: wordpress
env:
PLUGINS: ${{ steps.plugins.outputs.plugins }}
run: |
offers=$(curl -fsS https://api.wordpress.org/core/version-check/1.7/)
pairs='[]'
for plugin in $(jq -r '.[]' <<< "$PLUGINS"); do
floor=$(sed -nE 's|^[[:space:]/*#@]*Requires at least:[[:space:]]*([0-9]+(\.[0-9]+)*).*$|\1|p' "plugins/$plugin/$plugin.php" | head -n 1)
if [ -z "$floor" ]; then
echo "::error::plugins/$plugin/$plugin.php declares no Requires at least header."
exit 1
fi
pairs=$(printf '%s' "$offers" | jq -c --arg floor "$floor" --arg plugin "$plugin" --argjson pairs "$pairs" '[.offers[].version | select((split(".")[0:2] | map(tonumber)) >= ($floor | split(".")[0:2] | map(tonumber)))] | unique | if length == 0 then error("No WordPress release at or above \($floor) for \($plugin).") else $pairs + map({ plugin: $plugin, wp: . }) end')
done
echo "wordpress=$pairs" >> "$GITHUB_OUTPUT"
Loading
Loading