thatguygriffandClaude Opus 5 3ec2440bd1
CI / Tests (PHP 8.1) (pull_request) Successful in 1m1s
CI / No Debug Code (pull_request) Successful in 2s
Cache Service Probe / Cache Service Probe (pull_request) Successful in 2s
Cache Service Probe / cache@v6 (pull_request) Successful in 3s
Cache Service Probe / cache@v4 + ACTIONS_CACHE_SERVICE_V2 (pull_request) Successful in 59s
Cache Service Probe / cache@v6 + ACTIONS_CACHE_SERVICE_V2 (pull_request) Successful in 1m7s
CI / Tests (PHP 8.2) (pull_request) Successful in 1m1s
CI / Coding Standards (pull_request) Successful in 4m47s
CI / Tests (PHP 8.3) (pull_request) Successful in 2m58s
CI / PHPStan (pull_request) Failing after 12m12s
CI / Build Plugin Zip (pull_request) Skipped
Probe which actions/cache variant can reach the v2 cache service
The first probe answered the original question and raised a better one.
ACTIONS_CACHE_URL is unset but ACTIONS_RESULTS_URL points at
gitea-unsupervised-git-http.gitea.svc.cluster.local:3000, so the runner
does serve a cache — the v2 service, not v1. actions/cache resolves to
v4.3.0, which can speak v2, but only when ACTIONS_CACHE_SERVICE_V2 is
set, and the runner does not set it. So the action falls back to v1,
finds no endpoint, and trips its GHES gate on the way past.

Three variants to find one that reaches the service that is already
running: v4 with the flag forced, v6.1.0 which is current, and v6 with
the flag. Any that saves is a fix that lives in this repository.

Co-Authored-By: Claude Opus 5 <[email protected]>
Claude-Session: https://claude.ai/code/session_01Uw545F1vveNJKjzLxdi2ks
2026-08-20 15:16:25 -03:00

Unsupervised Scheduler

A WordPress plugin for instructor/student lesson scheduling — private lessons and group classes — with offerings, intake questions, versioned policies, account registration, and online payments.

Version: 1.0.0 · Requires: WordPress 6.0+, PHP 8.1+ · License: GPL-2.0-or-later

Pre-release. The booking platform is being built feature-by-feature; see Implementation status below.

Overview

The plugin is organised package-by-domain under src/ (PSR-4 Unsupervised\Schedular\). Each domain owns its value objects, repositories, REST endpoints, and admin/front-end controllers. All data access goes through repository classes against custom {prefix}us_* tables; permissions are enforced with WordPress capabilities, never role-name checks. There is no front-end build step (vanilla JS/CSS in assets/).

Every feature has a spec in docs/features/ describing its data model, REST API, classes, and tests. For contributor/architecture guidance see CLAUDE.md.

Implementation status

Feature Spec Status
User roles & capabilities (studio admin / instructor / student) user-roles.md Implemented
Offerings (private-lesson types & group classes) offerings.md Implemented
Availability (durations, weekly recurrence, calendar) availability-management.md Implemented
Registration questions (per-offering intake) registration-questions.md Implemented
Policies (drafting, versioning, tracked acceptance) policies.md Implemented
Account registration (invite or open self-approval, email confirmation, signup policy acceptance) account-registration.md Implemented
Lesson booking (offering → questions → policies) lesson-booking.md Implemented
Group classes (capacity-enforced enrolment) group-classes.md Implemented
Student administration (studio-admin view) student-administration.md Implemented
Payments (Stripe card charge + e-transfer/comp + receipts + HST) payments.md Implemented
Payment reporting (monthly per-instructor + HST + CSV) payment-reporting.md Implemented

Shortcodes

Shortcode Purpose
[us_booking] Student calendar + private-lesson registration flow
[us_group_classes] Browse and enrol in group classes
[us_student_login] Front-end student login
[us_student_register] Account registration — invite-based, or open self-signup with email confirmation + admin approval (accepts signup policies)

REST API

All endpoints live under /wp-json/us-scheduler/v1/ (e.g. /offerings, /availability, /bookings, /enrollments, /policies, /questions). Permissions are enforced via permission_callback capability checks. See each feature doc for the routes and required capabilities.

Roles & capabilities

Three custom roles — Studio Admin (us_studio_admin), Instructor (us_instructor), and Student (us_student) — plus a user_has_cap filter that grants every studio-admin capability to WordPress administrators, so the site owner runs the studio without a separate role. Full capability matrix in user-roles.md.

Installation

  1. Build a distributable zip (see Development):
    composer build      # -> dist/unsupervised-schedular-<version>.zip
    
  2. In wp-admin: Plugins → Add New → Upload Plugin, choose the zip, install, and activate.

Activation creates the us_* database tables and registers the roles. CI also publishes an installable zip artifact on every merge to main.

Development

composer install                  # install dependencies
composer test                     # PHPUnit (run after every change)
composer lint                     # PHPStan (level 6)
composer cs                       # PHPCS (WordPress coding standards)
composer cs:fix                   # auto-fix coding standards
composer build                    # build the plugin zip into dist/

# a single test file / single test
./vendor/bin/phpunit tests/Unit/Offering/OfferingRepositoryTest.php
./vendor/bin/phpunit --filter testInsertReturnsId

Tests use Brain\Monkey and Mockery to stub WordPress and $wpdb without a full WP install. To run the plugin in a real WordPress without Docker, wp-now works well: npx @wp-now/cli@latest start.

CI

Gitea Actions (.gitea/workflows/ci.yml) runs on every push and pull request: lint (PHPCS), static-analysis (PHPStan), test (PHPUnit on PHP 8.1/8.2/8.3), and no-debug (rejects debug statements in src/). On merge to main a build job publishes the installable plugin zip as an artifact.

License

GPL-2.0-or-later.

S
Description
Wordpress plugin for Instructor/Student lesson booking. Allows for availability definition and booking.
Readme
1.6 MiB
v1.6.0
Latest
2026-09-18 13:01:22 +00:00
Languages
PHP 93.6%
JavaScript 5.4%
CSS 0.9%
Shell 0.1%