feat: add package system (PackageLoader) and first-party packages#1995
Merged
feat: add package system (PackageLoader) and first-party packages#1995
Conversation
20-task plan covering polish for SentryForWheels, finishing Hotwire's missing helper, and building Basecoat Phases 2-5 (dialog, field, table, tabs, dropdown, pagination, sidebar, breadcrumb). Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Adds the Wheels 3.x plugin.json manifest to suppress deprecation warnings and an index.cfm status/reference page for the plugin admin UI. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Add plugin.json manifest to suppress Wheels 3.x deprecation warning. Fix mixin attribute: remove invalid dispatch and microsofttablehelper scopes, leaving only controller and view. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
…ile handle leak, timestamp
- Change $sentryGetUser() from public to private ($ prefix = internal)
- Wrap initSentry() body in named exclusive lock to prevent double-init races
- Fix HTTP status check: Left(statuscode,3) != "200" instead of find("200",...)
- Fix file handle leak: replace fileOpen/fileReadLine/fileClose with FileRead+ListToArray in try/catch
- Add Z suffix to ISO 8601 timestamp in getTimeVars()
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
- Remove 'culprit' key from exception event payload (deprecated in SDK v7) - Change exception type from 'exType & " Error"' to just 'exType' to avoid double-labeling (e.g., "Application Error Error") Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Renders JSON path configuration for Hotwire Native apps. Accepts optional settings struct (tabs, etc.) and rules array. Falls back to sensible defaults: all pages use default context with pull-to-refresh; /new$ and /edit$ paths open as modals without pull-to-refresh. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
…mp, user context, breadcrumbs Covers: - DSN parsing via public API (valid modern, valid legacy, invalid throws) - ISO 8601 Z-suffix timestamp format - sentrySetUser stores and overwrites request.sentryUserOverride - addBreadcrumb appends in order and includes optional data struct - getEnvironment/getRelease accessors return init values Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Covers all public helpers: hotwireIncludes, turboFrame/turboFrameEnd, all 8 turbo stream actions (verifying template presence/absence on remove and refresh), and all 4 Stimulus attribute helpers. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
…E.md - Add plugin.json with correct metadata (mixins: controller,view, wheelsVersion: 3.0) - Fix Basecoat.cfc mixin attribute: remove stale dispatch and microsofttablehelper scopes - Replace Hotwire-content ARCHITECTURE.md with Basecoat-specific architecture doc - Add Phase 2 dialog family (uiDialog, uiDialogFooter, uiDialogEnd) with native <dialog>, ARIA attributes, optional trigger button - Add Phase 3 uiField with full type support: text/email/password/number/tel/url/textarea/select/checkbox/switch; error state; description; auto-generated IDs - Add Phase 4: uiTable family, uiTabs family, uiDropdown (CSS-only details/summary), uiPagination with ellipsis/window logic - Add Phase 5: uiBreadcrumb family, uiSidebar family Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
- BasecoatSimpleSpec: Phase 1+2 — button class construction (compound variants, icon-only, anchor, turboConfirm, disabled), badge variants, alert (title/description/destructive), card family, progress, spinner, skeleton, tooltip, separator - BasecoatComplexSpec: Phase 2-5 — dialog ARIA attributes (labelledby/describedby, ID matching, trigger/no-trigger, close button), field layout (label-above vs flex-row for checkbox/switch, error state, description, auto-IDs), table wrappers, tabs data-attributes, dropdown details/summary, pagination (disabled prev/next, window, current page), breadcrumb (aria-label, linked/current), sidebar (active state, icons, section heading) Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
…wheels-basecoat Rename SentryForWheels/ folder to sentry/, rename SentryForWheels.cfc to Sentry.cfc, update all internal component paths, plugin.json names, box.json slugs, and documentation references. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Contributor
Wheels Test Matrix
Results for commit 31d05e9. |
Contributor
Wheels Test Results 12 files - 20 1 120 suites - 2 240 5m 7s ⏱️ - 10m 8s Results for commit 8630129. ± Comparison against base commit 5b30582. This pull request removes 44344 tests. |
Replace the legacy plugins/ directory with a new packages/ → vendor/ activation model. PackageLoader discovers vendor/*/package.json on startup with per-package error isolation, collects mixins into the existing injection pipeline, and supports ServiceProvider and middleware registration. - Add vendor/wheels/PackageLoader.cfc for package discovery and loading - Move sentry, hotwire, basecoat from plugins/ to packages/ - Replace plugin.json with package.json (adds provides.mixins/services/middleware) - Wire $loadPackages() into onapplicationstart.cfc and EventMethods.cfc - Add deprecation warning when plugins/ directory has loaded plugins - Tested: Lucee 6 + Lucee 7 × H2 = 2268 pass, 0 fail, 0 error Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
- Add "Run per-package tests" step to CI that copies each package to vendor/, restarts the engine, runs the package's test specs, then cleans up. Uses h2 for Lucee, sqlite for others. Non-blocking warnings. - Update prepare-base.sh to include packages/ in release artifact. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
SQLite works across all engines (Lucee, Adobe, BoxLang) unlike H2 which is Lucee-only. Standardize on sqlite as the embedded DB for package tests. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
- Add PackageLoaderSpec.cfc with 10 BDD specs covering discovery, error isolation, manifest parsing, and mixin collection - Add test fixtures in tests/_assets/packages/ (goodpkg, brokenpkg, nomanifest, nomixin) - Add componentPrefix param to PackageLoader.init() for test flexibility - Create packages/sentry/CLAUDE.md - Update packages/hotwire/CLAUDE.md and packages/basecoat/CLAUDE.md to reflect package architecture (s/Plugin/Package/) - Add Package System section to main CLAUDE.md with activation docs Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This was referenced Mar 28, 2026
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
PackageLoader.cfcdiscoversvendor/*/package.jsonon startup with per-package error isolation, mixin collection, ServiceProvider/middleware supportpackages/withpackage.jsonmanifests (replacingplugin.json). Activate by copying tovendor/plugins/still works via existingPlugins.cfcbut logs a deprecation warningvendor/, runs its specs, cleans uppackages/included in release artifactArchitecture
Test plan
🤖 Generated with Claude Code