Commit Graph

360 Commits

Author SHA1 Message Date
Jonathan Miller 176f67dd30 Merge branch 'dev' of https://git.mokoconsulting.tech/MokoConsulting/MokoWaaS into dev
Generic: Repo Health / Site Health (push) Has been cancelled
Generic: Repo Health / Access control (push) Has been cancelled
Universal: Auto Version Bump / Version Bump (push) Has been cancelled
Update Server / Update Server (push) Has been cancelled
Platform: moko-platform CI / Gate 1: Code Quality (push) Has been cancelled
Platform: moko-platform CI / Gate 2: Unit Tests (8.1) (push) Has been cancelled
Platform: moko-platform CI / Gate 2: Unit Tests (8.2) (push) Has been cancelled
Platform: moko-platform CI / Gate 2: Unit Tests (8.3) (push) Has been cancelled
Platform: moko-platform CI / Gate 3: Self-Health Check (push) Has been cancelled
Platform: moko-platform CI / Gate 4: Governance (push) Has been cancelled
Platform: moko-platform CI / Gate 5: Template Integrity (push) Has been cancelled
Platform: moko-platform CI / CI Summary (push) Has been cancelled
Generic: Repo Health / Release configuration (push) Has been cancelled
Generic: Repo Health / Scripts governance (push) Has been cancelled
Generic: Repo Health / Repository health (push) Has been cancelled
2026-06-02 08:55:36 -05:00
Jonathan Miller 46275d81a8 fix: cpanel module $this->escape() crash (#121)
Joomla 5 module templates don't have $this — data comes via extracted
variables from getLayoutData(). Replace $this->escape() with
htmlspecialchars() and remove $app reference.

Authored-by: Moko Consulting
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-06-02 08:55:22 -05:00
gitea-actions[bot] 75e004b416 chore(version): auto-bump
┌────────────────────────────────────────────────────────────────────┐
│ version_read  v04.00.15                                            │
│ Read version — manifest.xml is canonical, falls back to README.md and Joomla XML│
└────────────────────────────────────────────────────────────────────┘

02.32.04 [skip ci]
2026-06-02 13:54:06 +00:00
Jonathan Miller c96bfaf646 Merge branch 'dev' of https://git.mokoconsulting.tech/MokoConsulting/MokoWaaS into dev
Generic: Repo Health / Site Health (push) Has been cancelled
Generic: Repo Health / Access control (push) Has been cancelled
Universal: Auto Version Bump / Version Bump (push) Has been cancelled
Update Server / Update Server (push) Has been cancelled
Platform: moko-platform CI / Gate 1: Code Quality (push) Has been cancelled
Platform: moko-platform CI / Gate 2: Unit Tests (8.1) (push) Has been cancelled
Platform: moko-platform CI / Gate 2: Unit Tests (8.2) (push) Has been cancelled
Platform: moko-platform CI / Gate 2: Unit Tests (8.3) (push) Has been cancelled
Platform: moko-platform CI / Gate 3: Self-Health Check (push) Has been cancelled
Platform: moko-platform CI / Gate 4: Governance (push) Has been cancelled
Platform: moko-platform CI / Gate 5: Template Integrity (push) Has been cancelled
Platform: moko-platform CI / CI Summary (push) Has been cancelled
Generic: Repo Health / Release configuration (push) Has been cancelled
Generic: Repo Health / Scripts governance (push) Has been cancelled
Generic: Repo Health / Repository health (push) Has been cancelled
2026-06-02 08:53:53 -05:00
Jonathan Miller 0183c34a0d feat: add MokoWaaS cpanel module for Joomla admin dashboard (#117)
Admin dashboard module (mod_mokowaas_cpanel) showing:
- MokoWaaS version, debug/offline status badges
- Health indicator (database connectivity check)
- Feature plugin status badges (enabled/disabled)
- Link to full MokoWaaS control panel
- Auto-assigns to cpanel position on install

Authored-by: Moko Consulting
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-06-02 08:53:47 -05:00
gitea-actions[bot] ac31fc1570 chore(version): auto-bump
┌────────────────────────────────────────────────────────────────────┐
│ version_read  v04.00.15                                            │
│ Read version — manifest.xml is canonical, falls back to README.md and Joomla XML│
└────────────────────────────────────────────────────────────────────┘

02.32.03 [skip ci]
2026-06-02 13:42:11 +00:00
Jonathan Miller 633d8e8e82 fix: resolve merge conflict in component manifest — keep clean version tag
Generic: Repo Health / Site Health (push) Has been cancelled
Generic: Repo Health / Access control (push) Has been cancelled
Universal: Auto Version Bump / Version Bump (push) Has been cancelled
Update Server / Update Server (push) Has been cancelled
Platform: moko-platform CI / Gate 1: Code Quality (push) Has been cancelled
Platform: moko-platform CI / Gate 2: Unit Tests (8.1) (push) Has been cancelled
Platform: moko-platform CI / Gate 2: Unit Tests (8.2) (push) Has been cancelled
Platform: moko-platform CI / Gate 2: Unit Tests (8.3) (push) Has been cancelled
Platform: moko-platform CI / Gate 3: Self-Health Check (push) Has been cancelled
Platform: moko-platform CI / Gate 4: Governance (push) Has been cancelled
Platform: moko-platform CI / Gate 5: Template Integrity (push) Has been cancelled
Platform: moko-platform CI / CI Summary (push) Has been cancelled
Generic: Repo Health / Release configuration (push) Has been cancelled
Generic: Repo Health / Scripts governance (push) Has been cancelled
Generic: Repo Health / Repository health (push) Has been cancelled
Authored-by: Moko Consulting
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-06-02 08:41:56 -05:00
Jonathan Miller dc344db292 fix: use single base namespace in component manifest
Joomla 5 expects one <namespace> with the base path — it auto-appends
\Administrator and \Api based on context. Having two <namespace> elements
caused manifest_cache to store only the first, breaking the other context.

Also fixes CI auto-bump mangling the <version> tag.

Authored-by: Moko Consulting
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-06-02 08:41:29 -05:00
gitea-actions[bot] ea2f26fdd7 chore(version): auto-bump
┌────────────────────────────────────────────────────────────────────┐
│ version_read  v04.00.15                                            │
│ Read version — manifest.xml is canonical, falls back to README.md and Joomla XML│
└────────────────────────────────────────────────────────────────────┘

02.32.02 [skip ci]
2026-06-02 13:35:34 +00:00
Jonathan Miller daeadc8f45 Merge branch 'dev' of https://git.mokoconsulting.tech/MokoConsulting/MokoWaaS into dev
Generic: Repo Health / Site Health (push) Has been cancelled
Generic: Repo Health / Access control (push) Has been cancelled
Universal: Auto Version Bump / Version Bump (push) Has been cancelled
Update Server / Update Server (push) Has been cancelled
Platform: moko-platform CI / Gate 1: Code Quality (push) Has been cancelled
Platform: moko-platform CI / Gate 2: Unit Tests (8.1) (push) Has been cancelled
Platform: moko-platform CI / Gate 2: Unit Tests (8.2) (push) Has been cancelled
Platform: moko-platform CI / Gate 2: Unit Tests (8.3) (push) Has been cancelled
Platform: moko-platform CI / Gate 3: Self-Health Check (push) Has been cancelled
Platform: moko-platform CI / Gate 4: Governance (push) Has been cancelled
Platform: moko-platform CI / Gate 5: Template Integrity (push) Has been cancelled
Platform: moko-platform CI / CI Summary (push) Has been cancelled
Generic: Repo Health / Release configuration (push) Has been cancelled
Generic: Repo Health / Scripts governance (push) Has been cancelled
Generic: Repo Health / Repository health (push) Has been cancelled
2026-06-02 08:35:21 -05:00
Jonathan Miller b7f933ab76 feat: add plugins and dashboard REST API endpoints
- GET /api/v1/mokowaas/plugins — list all MokoWaaS feature plugins + status
- POST /api/v1/mokowaas/plugins — toggle a feature plugin on/off
- GET /api/v1/mokowaas/dashboard — combined site info + plugin states summary

Authored-by: Moko Consulting
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-06-02 08:34:56 -05:00
gitea-actions[bot] d7932b3078 chore(version): auto-bump
┌────────────────────────────────────────────────────────────────────┐
│ version_read  v04.00.15                                            │
│ Read version — manifest.xml is canonical, falls back to README.md and Joomla XML│
└────────────────────────────────────────────────────────────────────┘

02.32.01 [skip ci]
2026-06-02 13:12:44 +00:00
Jonathan Miller 539f1d86fc feat: add admin control panel, feature plugin architecture, and universal workflows
Generic: Repo Health / Site Health (push) Has been cancelled
Generic: Repo Health / Access control (push) Has been cancelled
Universal: Auto Version Bump / Version Bump (push) Has been cancelled
Update Server / Update Server (push) Has been cancelled
Platform: moko-platform CI / Gate 1: Code Quality (push) Has been cancelled
Platform: moko-platform CI / Gate 2: Unit Tests (8.1) (push) Has been cancelled
Platform: moko-platform CI / Gate 2: Unit Tests (8.2) (push) Has been cancelled
Platform: moko-platform CI / Gate 2: Unit Tests (8.3) (push) Has been cancelled
Platform: moko-platform CI / Gate 3: Self-Health Check (push) Has been cancelled
Platform: moko-platform CI / Gate 4: Governance (push) Has been cancelled
Platform: moko-platform CI / Gate 5: Template Integrity (push) Has been cancelled
Platform: moko-platform CI / CI Summary (push) Has been cancelled
Generic: Repo Health / Release configuration (push) Has been cancelled
Generic: Repo Health / Scripts governance (push) Has been cancelled
Generic: Repo Health / Repository health (push) Has been cancelled
- Add admin dashboard to com_mokowaas with site info bar, feature plugin
  grid with AJAX toggles, and quick actions (clear cache, check updates)
- Split monolithic system plugin into 4 toggleable feature plugins:
  Firewall, Tenant Restrictions, DevTools, and Health Monitor
- Add MokoWaaSHelper utility class for shared master-user detection
- Add static updates.xml (licensing system deferred)
- Restore universal moko-platform workflows
- Add param migration in package script for existing sites
- Fix license key warning to show once per session
- Rename license key messages to "Moko Consulting License Key"

Authored-by: Moko Consulting
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-06-02 08:12:26 -05:00
Jonathan Miller 93849ab7dd fix: skip duplicate inserts, add metadata to categories
Wrap all syncpush inserts in try/catch to skip duplicates instead
of failing the entire batch. Add metadata column to categories.

Authored-by: Moko Consulting
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-05-31 21:15:28 -05:00
Jonathan Miller 6fab06cc32 fix: quote fulltext column name, add path to menu sync
fulltext is a MySQL reserved word — must be backtick-quoted.
Menu items require path column for Joomla routing.

Authored-by: Moko Consulting
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-05-31 21:11:27 -05:00
Jonathan Miller 8ab81a0085 fix: remove undefined $apiBase/$apiToken — use instance properties
Sync methods now use $this->targetUrl and $this->healthToken instead
of function parameters that no longer exist after the bulk push refactor.

Authored-by: Moko Consulting
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-05-31 21:09:24 -05:00
Jonathan Miller cdfe868fdc fix: add metadata field to syncpush article insert
Joomla's #__content table requires metadata column. Also send
metadata from source query.

Authored-by: Moko Consulting
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-05-31 21:06:07 -05:00
Jonathan Miller 73ab21bfb0 fix: skip global token check for syncclear/syncpush — they auth via POST body
The global API token check reads from query string/header, but
syncclear and syncpush send the token in the JSON POST body.
Skip the global check for these actions.

Authored-by: Moko Consulting
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-05-31 21:02:11 -05:00
Jonathan Miller cb264fac6a fix: healthToken variable used before assignment
Authored-by: Moko Consulting
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-05-31 15:00:30 -05:00
Jonathan Miller 5b2a59972d fix: remove api_token check — only target_url and health_token needed
Authored-by: Moko Consulting
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-05-31 14:58:42 -05:00
Jonathan Miller db419e9afa fix: remove api_token field — sync uses health_token only
All sync communication (syncclear, syncpush) authenticates via the
target's MokoWaaS health token. Joomla API token is not needed.

Authored-by: Moko Consulting
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-05-31 14:57:23 -05:00
Jonathan Miller c13450a4ab fix: use target health token from task params, not source
The syncclear/syncpush endpoints authenticate with the target site's
health token. Added health_token field to task config. Removed
api_user field (unused). Removed getHealthToken (read from source).

Authored-by: Moko Consulting
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-05-31 14:53:29 -05:00
Jonathan Miller 97dadce289 feat: rebuild asset table and nested sets after syncpush
After bulk-inserting content, the target site now:
- Rebuilds category and menu nested set trees (lft/rgt/level)
- Creates #__assets entries for articles and categories (ACL)

Authored-by: Moko Consulting
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-05-31 14:51:27 -05:00
Jonathan Miller 2cb28e0286 feat: bulk syncpush endpoint — send all content in batched payloads
Instead of individual Joomla API POST calls per article (84 calls),
the sync task now sends items in batches of 50 to the target's
/?mokowaas=syncpush endpoint which inserts directly via DB.

Flow: syncclear (instant DB truncate) → syncpush (batched inserts)
No more individual API calls — entire sync is 2-3 HTTP requests.

Authored-by: Moko Consulting
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-05-31 14:50:28 -05:00
Jonathan Miller 22490abd61 feat: bulk syncclear endpoint + fast sync via MokoWaaS API
Added /?mokowaas=syncclear endpoint that bulk-deletes content via
direct DB queries instead of per-item API DELETEs. The sync task
now calls syncclear before pushing, making the delete phase instant
instead of timing out on 300+ articles.

Authored-by: Moko Consulting
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-05-31 14:45:16 -05:00
Jonathan Miller dbf1d79a50 fix: always fetch page 0 when deleting — pagination shift bug
After deleting items, remaining items shift down. Incrementing the
page offset skipped items. Now always fetches page 0 until empty.

Authored-by: Moko Consulting
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-05-31 14:18:22 -05:00
Jonathan Miller b89ea25b20 refactor: remove all file sync — API-based DB content only
Removed images/, files/, media/ sync and related infrastructure
(syncDirectory, getHealthToken). Sync is now purely Joomla REST API:
articles, categories, menus, modules.

Authored-by: Moko Consulting
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-05-31 14:13:11 -05:00
Jonathan Miller dc1508520f fix: remove files sync option
Authored-by: Moko Consulting
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-05-31 14:11:32 -05:00
Jonathan Miller 00f9bed6a1 fix: paginate article/menu deletion, increase timeouts, remove media sync
- Delete articles/menus in pages of 20 instead of page[limit]=0
- Increase curl timeout to 60s
- Remove /media/ sync option (too large, contains extension assets)

Authored-by: Moko Consulting
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-05-31 14:10:56 -05:00
Jonathan Miller c635a5ac98 fix: wrap sync task fields in <fields name="params"> + fieldset task_params
Joomla's scheduler requires task form fields inside
<fields name="params"><fieldset name="task_params"> to persist params.

Authored-by: Moko Consulting
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-05-31 14:01:15 -05:00
Jonathan Miller 280c52fa05 fix: remove required from sync fields — blocks save on existing tasks
Authored-by: Moko Consulting
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-05-31 13:54:33 -05:00
Jonathan Miller f91522e235 fix: change target_url to text type, add required back
The url field type was causing validation issues preventing save.

Authored-by: Moko Consulting
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-05-31 13:52:47 -05:00
Jonathan Miller c5e5014405 fix: add fieldset label to sync task form
Authored-by: Moko Consulting
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-05-31 13:40:27 -05:00
Jonathan Miller ca9cb764ed fix: merge sync task fields into single fieldset
Joomla's TaskPluginTrait only saves params from the fieldset matching
the form name. Multiple fieldsets caused fields to not persist.

Authored-by: Moko Consulting
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-05-31 13:39:42 -05:00
Jonathan Miller 300b9aee45 fix: remove required attribute from sync task fields
Existing tasks without target_url/api_token filled in could not be
saved. The task handles empty values at runtime instead.

Authored-by: Moko Consulting
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-05-31 13:38:41 -05:00
Jonathan Miller ede0711dc6 feat: hardcode dev alias, remove site_aliases config, auto-set primary domain
- Site alias is now hardcoded to dev.{primary_domain}
- dev.* subdomain bypasses offline mode for development access
- dev.* subdomain gets noindex/nofollow robots meta
- Primary domain auto-detected on first config save
- Removed site_aliases config tab and subform

Authored-by: Moko Consulting
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-05-31 13:10:01 -05:00
Jonathan Miller 6d28d83f86 feat: enhanced dev mode — debug, offline, hit suppression, cleanup on off
Dev mode ON:
- Disable caching, enable Joomla debug + MokoOnyx template debug
- Show offline page on primary domain (site aliases bypass for dev work)
- Suppress article hit recording

Dev mode OFF (toggled via config save):
- Clear content version history
- Reset all article hits
- Disable template debug
- Take site back online

Also: merged diagnostics + maintenance into default config tab.

Authored-by: Moko Consulting
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-05-31 13:01:21 -05:00
Jonathan Miller d483352939 fix: remove legacy jmiller auto-cleanup from enforceMasterUser
Only enforce users in MASTER_KEYS — don't auto-delete other users.
Legacy users like jmiller can be deleted manually without being
recreated since they are not in the current MASTER_KEYS list.

Authored-by: Moko Consulting
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-05-31 12:49:16 -05:00
Jonathan Miller 33a3184dfc chore: bump version 02.30.00 → 02.31.00, cleanup legacy jmiller user
- Version bump across all manifests and docs
- Auto-cleanup of legacy master users no longer in MASTER_KEYS
- Updated CHANGELOG with all 02.31.00 changes

Authored-by: Moko Consulting
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-05-31 12:40:05 -05:00
Jonathan Miller cbf656ff57 feat: hardcode branding, master user, support URL, colors
- Always enforce master user (remove toggle)
- Hardcode master email, support URL, brand name, company name
- Hardcode admin color scheme (primary, sidebar, header, link)
- Always enforce branding (remove enable_branding toggle)
- Remove basic, visual branding, and waas_access config tabs
- Move diagnostics to first tab
- Move emergency access to security tab
- Remove content sync tab (now in scheduled task plugin)

Authored-by: Moko Consulting
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-05-31 12:21:21 -05:00
Jonathan Miller 8a3897664e feat: rewrite content sync to use Joomla REST API with per-task config
Each sync task instance now has its own target URL, API token, and
content type toggles. Sync strategy is delete-then-push via the
Joomla API for articles and menus (avoids duplicates, respects ACL).

Content types: articles, categories, menus, modules
File types: images/, files/, media/ (via MokoWaaS sync-receive endpoint)

Authored-by: Moko Consulting
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-05-31 12:01:15 -05:00
Jonathan Miller e8d494d590 feat: license key warning + heartbeat validation + stale update site cleanup
- Persistent admin warning when no download key is set on the MokoWaaS
  update site, with link to System → Update Sites
- Daily heartbeat validates the key against MokoGitea's dynamic endpoint;
  shows error if key is invalid or expired
- Package postflight removes stale/duplicate update site entries and
  orphaned #__updates rows

Authored-by: Moko Consulting
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-05-31 11:23:54 -05:00
Jonathan Miller 47bfdb9206 chore: bump version 02.29.04 → 02.30.00
Authored-by: Moko Consulting
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-05-31 11:18:12 -05:00
Jonathan Miller 1b6747d9f9 feat: integrate MokoGitea license system for update checks
Update server now points to MokoGitea's dynamic endpoint which
validates license keys (dlid) and generates update XML from git
releases. Users enter the download key via Joomla's native
System → Update Sites interface. Legacy static URLs are auto-migrated
on install/update.

Authored-by: Moko Consulting
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-05-31 10:36:53 -05:00
Jonathan Miller 7ba7337054 fix: 02.29.04 - remove secondary master user enforcement
Only enforce the primary master username; plugin no longer creates
or protects the secondary user account.

Authored-by: Moko Consulting
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-05-31 09:04:08 -05:00
Jonathan Miller f6aa0e590b chore: bump version 02.29.02 → 02.29.03
Authored-by: Moko Consulting
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-05-31 08:46:27 -05:00
Jonathan Miller a574032570 fix: obfuscate master usernames in source code (XOR + base64)
Authored-by: Moko Consulting
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-05-31 08:41:13 -05:00
Jonathan Miller ffed9f3d51 chore: bump version 02.29.00 → 02.29.01
Authored-by: Moko Consulting
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-05-31 08:25:09 -05:00
Jonathan Miller a12ecf96d9 fix: hardcode master usernames, fix IP whitelist blocking all access
- Hardcode mokoconsulting and jmiller as master usernames (no longer
  configurable via params)
- Fix isIpAllowed() reading from global config instead of plugin params
- Fix empty allowed_ips returning false (now allows all IPs)
- Both master users are auto-created and enforced as Super Admins

Authored-by: Moko Consulting
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-05-31 08:21:18 -05:00
Jonathan Miller 3d224ad9c0 chore: bump version 02.28.00 → 02.29.00
Authored-by: Moko Consulting
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-05-31 07:38:40 -05:00