Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
79 commits
Select commit Hold shift + click to select a range
126a613
Add initial lock implementation
defunctl Jun 23, 2026
3fbad29
WIP: foundation-database
defunctl Jun 23, 2026
b83f270
Add missing phpstan stubfile
defunctl Jun 23, 2026
51469bd
Properly fix phpstan issues
defunctl Jun 23, 2026
92bbcc1
Add more test coverage
defunctl Jun 23, 2026
8bdae5d
Ignore generated codeception files when linting
defunctl Jun 23, 2026
07ecb42
Lint everything
defunctl Jun 23, 2026
7ce88ed
Add missing methods
defunctl Jun 23, 2026
35af811
Bump di52 in container to >=4.1
defunctl Jun 24, 2026
ab63542
Add wpcli and integration test suites, use phpcov to combine code cov…
defunctl Jun 24, 2026
ca2d996
Use pcov for code coverage now that slic 2.3.0 is out
defunctl Jun 25, 2026
3e2fe48
Update docs to remove xdebug coverage in place of pcov
defunctl Jun 25, 2026
49c8a4b
Clean up DatabaseProvider + add agents rules
defunctl Jun 26, 2026
6c7e8ac
Convert migrations to a collection
defunctl Jun 26, 2026
9c064de
Convert to single point of entry, Migrator to run migrations
defunctl Jun 26, 2026
9f8fc55
Add more column types to TableDefinition.php
defunctl Jun 26, 2026
6d5425d
Add foundation cli `make:database-migration` and `make:database-table…
defunctl Jun 26, 2026
0fb1370
Add foundation cli `make:database-provider`, refactor namespaces, add…
defunctl Jun 26, 2026
cc63d8a
Add `foundation-identifier` package
defunctl Jun 29, 2026
df126ac
Bring in dataprovider attribute
defunctl Jun 29, 2026
9a7b880
Merge remote-tracking branch 'origin/main' into feat/add-new-packages
defunctl Jul 1, 2026
3d9824a
Merge branch 'main' into feat/add-new-packages
defunctl Jul 2, 2026
4f0247d
Add foundation-shutdown
defunctl Aug 18, 2026
a053cc8
Add foundation-shutdown to AGENTS.md
defunctl Aug 18, 2026
db530be
Add decorators, add fastcgi_finish_request, litespeed_finish_request …
defunctl Aug 18, 2026
0bbe799
Skip response finisher mocks when native functions exist
defunctl Aug 18, 2026
ef4fa94
Merge main into feature/foundation-shutdown
defunctl Aug 19, 2026
92f742f
Merge main into feat/add-new-packages
defunctl Aug 19, 2026
0b8e560
Add additional lock docs, add test_database_lock_replaces_expired_own…
defunctl Aug 19, 2026
5e1bc40
Add foundation-lock-redis
defunctl Aug 19, 2026
0ae2266
Fix numerous bugs and improve foundation-database locking
defunctl Aug 19, 2026
371e574
Fix database configuration and generator reliability
defunctl Aug 19, 2026
3e74faf
WIP: checkpoint new package implementation
defunctl Aug 20, 2026
a4bb2a9
WIP: simplify migration arch (remove Runner)
defunctl Aug 20, 2026
f5e3fc1
Work around WP-CLI bug where it returns `0`, even if the command retu…
defunctl Aug 20, 2026
57443d7
Simplify/clarify Migrations further + improve docs
defunctl Aug 20, 2026
19efa61
Move valueobjects into their own namespace
defunctl Aug 20, 2026
e8bc332
Refactor Schema to not take a Closure but an interface
defunctl Aug 20, 2026
ddfc2bc
Fix Migrate command possibly loading when WP-CLI is not there.
defunctl Aug 20, 2026
1bde1d0
Remove singleton command example
defunctl Aug 20, 2026
a649c94
Add `foundation.prefix` configuration option to support multiple plug…
defunctl Aug 20, 2026
b17057c
Fix: failed multi-row queries appear successful.
defunctl Aug 20, 2026
d2e7664
Fix: arbitrary older batches can be rolled back while newer batches r…
defunctl Aug 20, 2026
719fb8e
Fix: removed --force from src/Cli/Commands/Make/Database/MigrationCom…
defunctl Aug 20, 2026
95da477
Fix: where(..., null) in src/Database/Query/QueryBuilder.php:57: = us…
defunctl Aug 20, 2026
d1fe269
Normalize zero-precision datetime definitions
defunctl Aug 21, 2026
a34afed
Fail when migration ledger writes cannot be confirmed
defunctl Aug 21, 2026
ac98534
Fail when rolled-back ledger records remain
defunctl Aug 21, 2026
5cd505e
Clarify lock token expiration updates
defunctl Aug 21, 2026
aa255ea
Remove unversioned table collection API
defunctl Aug 21, 2026
745a22b
Harden generated PHP source updates
defunctl Aug 21, 2026
f232ba8
Normalize lock driver failure handling
defunctl Aug 21, 2026
1407682
Quote qualified query columns by segment
defunctl Aug 21, 2026
9a8f7a5
Clarify physical database table names
defunctl Aug 21, 2026
9de1823
Clarify the migration contract
defunctl Aug 21, 2026
05ad5fa
Remove raw SQL schema reconciliation API
defunctl Aug 21, 2026
0e2745a
Extract database schema reconciliation
defunctl Aug 21, 2026
c37223a
Update database schema documentation
defunctl Aug 21, 2026
b3ad94e
Document SLIC workflow version policy
defunctl Aug 21, 2026
b058262
Refactor WP-CLI command prefix injection
defunctl Aug 21, 2026
53f5916
Simplify generated table migrations
defunctl Aug 21, 2026
6d52d80
WIP: foundation-docs
defunctl Aug 21, 2026
dfbd958
Fix: correct docs to migration order
defunctl Aug 24, 2026
f201b4d
Merge PR #13: Add foundation-shutdown
defunctl Aug 24, 2026
f530435
Add foundation-shutdown docs
defunctl Aug 24, 2026
44265b8
Ensure plugins are not uninstalling or WordPress isn't installing bef…
defunctl Aug 24, 2026
41d1c8a
Refactor shutdown idempotency marker
defunctl Aug 24, 2026
2b6bdc5
Prefix all custom provider keys with their class so they won't collid…
defunctl Aug 24, 2026
bfdd14c
Fix shutdown provider example
defunctl Aug 24, 2026
77825ca
Add example for shared container identifiers and agent instructions f…
defunctl Aug 24, 2026
001cb5b
Move coverage report into its own job with write permissions
defunctl Aug 24, 2026
00d05f6
Add `foundation-view`
defunctl Aug 24, 2026
49f4d8b
Fix product-summary.php confusing test
defunctl Aug 24, 2026
fe46578
Update docs and comments
defunctl Aug 24, 2026
f7433e0
Merge pull request #16 from stellarwp/feat/add-foundation-view
defunctl Aug 24, 2026
ce56f2f
Add reopened and permissions to close-pull-request.yml + update packa…
defunctl Aug 24, 2026
0504acd
Add Cloudflare pages preparation/workflows
defunctl Aug 24, 2026
5b239ec
Update prod docs URL to `foundation.nexcess.dev`
defunctl Aug 24, 2026
ef04128
Update to use CF org secrets
defunctl Aug 24, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
5 changes: 5 additions & 0 deletions .env.testing.slic
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,11 @@ SLIC_PHP_VERSION=8.3
ENVIRONMENT=tests
TEST_LOG_CHANNEL=stack
TEST_LOG_LEVEL=debug
TEST_COMMAND_PREFIX=nxtest

REDIS_HOST=redis
REDIS_PORT=6379
REDIS_TEST_DATABASE=15

WP_VERSION=latest
WP_ROOT_FOLDER=/var/www/html
Expand Down
2 changes: 2 additions & 0 deletions .gitattributes
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,8 @@
/.gitignore export-ignore
/.github export-ignore
/docs export-ignore
/dev export-ignore
/src/Docs export-ignore
/.env.testing.slic export-ignore
/.env.slic.local export-ignore
/.env.slic.run export-ignore
Expand Down
4 changes: 2 additions & 2 deletions .github/bin/repo-map.sh
Original file line number Diff line number Diff line change
Expand Up @@ -28,10 +28,10 @@ else
fi

# Use jq to generate the JSON array directly without line breaks
packages_json=$(find "$root/src" -name composer.json -print0 |
packages_json=$(find "$root/src" -mindepth 2 -maxdepth 2 \( -name composer.json -o -name package.json \) -print0 |
while IFS= read -r -d $'\0' file; do
# Extract the package name and directory
package_name=$(jq -r '.name' < "$file" | sed 's/stellarwp\///')
package_name=$(jq -r '.name' < "$file" | sed -E 's/^@?stellarwp\///')
relative_directory=$(realpath --relative-to="$root/src" "$(dirname "$file")")

# Build the JSON object for each package
Expand Down
94 changes: 94 additions & 0 deletions .github/workflows/docs-preview.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,94 @@
name: Documentation Preview

on:
pull_request:
types: [opened, synchronize, reopened]
paths:
- 'src/Docs/**'
- '.github/workflows/docs-preview.yml'

concurrency:
group: docs-preview-${{ github.event.pull_request.number }}
cancel-in-progress: true

jobs:
preview:
runs-on: ubuntu-latest

permissions:
contents: read
deployments: write
pull-requests: write

steps:
- name: Checkout code
uses: actions/checkout@v7

- name: Set up Node.js
uses: actions/setup-node@v7
with:
node-version-file: 'src/Docs/.nvmrc'
cache: npm
cache-dependency-path: 'src/Docs/package-lock.json'

- name: Install dependencies
working-directory: src/Docs
run: npm ci

- name: Build documentation
working-directory: src/Docs
run: npm run build

- name: Deploy preview
id: deploy
if: github.event.pull_request.head.repo.full_name == github.repository && github.actor != 'dependabot[bot]'
uses: cloudflare/wrangler-action@v4
with:
apiToken: ${{ secrets.CLOUDFLARE_DEPLOY_TOKEN }}
accountId: ${{ secrets.CLOUDFLARE_DEPLOY_ACCOUNT_ID }}
gitHubToken: ${{ secrets.GITHUB_TOKEN }}
packageManager: npm
workingDirectory: src/Docs
command: pages deploy dist --project-name=foundation-docs --branch=pr-${{ github.event.pull_request.number }}

- name: Comment preview URL
if: github.event.pull_request.head.repo.full_name == github.repository && github.actor != 'dependabot[bot]'
uses: actions/github-script@v9
env:
PREVIEW_URL: ${{ steps.deploy.outputs.pages-deployment-alias-url || steps.deploy.outputs.deployment-url }}
PREVIEW_SHA: ${{ github.event.pull_request.head.sha }}
with:
script: |
const marker = '<!-- foundation-docs-preview -->';
const body = [
marker,
'## Documentation preview',
'',
`[Review this documentation update](${process.env.PREVIEW_URL})`,
'',
`Updated for commit \`${process.env.PREVIEW_SHA.slice(0, 7)}\`.`,
].join('\n');
const comments = await github.paginate(github.rest.issues.listComments, {
owner: context.repo.owner,
repo: context.repo.repo,
issue_number: context.issue.number,
});
const existing = comments.find((comment) =>
comment.user?.login === 'github-actions[bot]' && comment.body?.includes(marker)
);

if (existing) {
await github.rest.issues.updateComment({
owner: context.repo.owner,
repo: context.repo.repo,
comment_id: existing.id,
body,
});
} else {
await github.rest.issues.createComment({
owner: context.repo.owner,
repo: context.repo.repo,
issue_number: context.issue.number,
body,
});
}
4 changes: 2 additions & 2 deletions .github/workflows/quality.yml
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@ jobs:
with:
php-version: '8.3'
coverage: pcov
extensions: redis

- name: Detect File Changes
uses: dorny/paths-filter@v4
Expand All @@ -36,8 +37,7 @@ jobs:

- name: Run code style checks
if: ${{ steps.filter.outputs.php == 'true' }}
run: composer lint ${{ steps.filter.outputs.php_files }}
run: composer lint

- name: Run static analysis
run: composer analyze

62 changes: 56 additions & 6 deletions .github/workflows/tests.yml
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,7 @@ jobs:
with:
php-version: ${{ matrix.php }}
coverage: none
extensions: redis

- name: Install Composer dependencies
uses: ramsey/composer-install@v4
Expand Down Expand Up @@ -106,29 +107,78 @@ jobs:
run: |
"${SLIC_BIN}" run feature --ext DotReporter

- name: Run integration tests
if: github.event_name != 'pull_request'
run: |
"${SLIC_BIN}" run integration --ext DotReporter

- name: Run Redis tests
if: github.event_name != 'pull_request'
run: |
"${SLIC_BIN}" run redis --ext DotReporter

- name: Run wpunit tests
if: github.event_name != 'pull_request'
run: |
"${SLIC_BIN}" run wpunit --ext DotReporter

- name: Enable PCOV for coverage
if: github.event_name == 'pull_request'
- name: Run wpcli tests
if: github.event_name != 'pull_request'
run: |
"${SLIC_BIN}" pcov on
"${SLIC_BIN}" run wpcli --ext DotReporter

- name: Run Codeception tests with coverage
if: github.event_name == 'pull_request'
run: |
"${SLIC_BIN}" run --coverage --coverage-xml clover.xml --disable-coverage-php --ext DotReporter
composer run coverage:phpcov-install
composer run coverage:prepare
"${SLIC_BIN}" pcov on --yes
"${SLIC_BIN}" run unit --coverage coverage/unit.cov --ext DotReporter
"${SLIC_BIN}" run feature --coverage coverage/feature.cov --ext DotReporter
"${SLIC_BIN}" run redis --coverage coverage/redis.cov --ext DotReporter
"${SLIC_BIN}" run integration --coverage coverage/integration.cov --ext DotReporter
"${SLIC_BIN}" run wpunit --coverage coverage/wpunit.cov --ext DotReporter
"${SLIC_BIN}" run wpcli --coverage coverage/wpcli.cov --ext DotReporter
"${SLIC_BIN}" composer run coverage:merge

- name: Test minimum supported Predis version
run: |
"${SLIC_BIN}" composer update predis/predis:3.0.0 --with-all-dependencies
"${SLIC_BIN}" run redis --ext DotReporter

- name: Monitor coverage
- name: Upload coverage report
if: github.event_name == 'pull_request'
uses: actions/upload-artifact@v7
with:
name: coverage-report
path: clover.xml
if-no-files-found: error
retention-days: 1

coverage:
if: github.event_name == 'pull_request'
needs: slic
runs-on: ubuntu-latest
name: Monitor coverage

permissions:
contents: read
pull-requests: write
statuses: write

steps:
- name: Download coverage report
uses: actions/download-artifact@v8
with:
name: coverage-report

- name: Monitor coverage
uses: slavcodev/coverage-monitor-action@v1
with:
github_token: ${{ secrets.GITHUB_TOKEN }}
comment_footer: false
coverage_format: clover
coverage_path: tests/_output/clover.xml
coverage_path: clover.xml
threshold_alert: 90
threshold_warning: 95
threshold_metric: "lines"
3 changes: 2 additions & 1 deletion .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -59,6 +59,7 @@ vendor
/coverage/
/tests/_output/*
!/tests/_output/.gitkeep
/tests/CodeceptionSupport/
!/tests/_output/coverage/
!/tests/_output/coverage/.gitignore
/tests/_data/temp/*
!/tests/_data/temp/.gitkeep
Loading