* fix: keep download counts consistent across skill pages
* fix: stabilize empty search ordering across sorts
* fix: show disabled-account reason on login redirect
* fix: mute report input placeholder text
* fix: return skill detail to my skills page
* test: stabilize auth context filter coverage
* feat(publish): increase single file limit to 10MB
* feat(publish): expand allowed file extensions
* feat(publish): extend secret scanning to new text file types
* feat(publish): add content validation for new file types
* refactor(publish): inject configurable limits into SkillPackageArchiveExtractor
* feat(publish): support zip with single root directory wrapper
* feat(publish): expand determineContentType for new file types
* test(publish): update tests for new upload constraints
* fix(web): add REJECTED status label and styling to my-skills page
The resolveStatusLabel and resolveStatusClassName functions were missing
the REJECTED case, causing rejected skills to show raw status string
with no color styling.
* fix: prevent deleting the last remaining version of a skill
Backend: added version count check in SkillGovernanceService.deleteVersion()
Frontend: hide delete button when only one version remains
* test: fix and add tests for last-version deletion guard
- Fix deleteVersion_removesDraftFilesAndBundle: mock findBySkillId to
return 2 versions so the new guard doesn't block the happy path
- Add deleteVersion_rejectsLastRemainingVersion: verify that deleting
the only remaining version is rejected with the correct error code
---------
* fix: keep download counts consistent across skill pages
* fix: stabilize empty search ordering across sorts
* fix: show disabled-account reason on login redirect
* fix: mute report input placeholder text
* fix: return skill detail to my skills page
* test: stabilize auth context filter coverage
* feat(publish): increase single file limit to 10MB
* feat(publish): expand allowed file extensions
* feat(publish): extend secret scanning to new text file types
* feat(publish): add content validation for new file types
* refactor(publish): inject configurable limits into SkillPackageArchiveExtractor
* feat(publish): support zip with single root directory wrapper
* feat(publish): expand determineContentType for new file types
* test(publish): update tests for new upload constraints
- Change skill uniqueness constraint from (namespace_id, slug) to
(namespace_id, slug, owner_id) to support per-user skill records
- Reject publish when another owner has a published skill with same slug
- Reject review approval when same-slug conflict exists
- Auto-withdraw pending review versions when submitting a new version
- Resolve visible skill by preferring published skill, then current
user's own skill, to fix wrong skill returned for same-slug queries
- Invalidate all skill query cache on publish to prevent stale data
- Backend: /api/v1/auth/me now fetches fresh roles from DB and updates
session when roles have changed, so users see role changes on page
refresh without re-login
- Frontend: invalidate ['auth', 'me'] cache after admin user mutations
(role change, status change, approve, disable, enable) and account merge
- Login: fix reversed eye icon (Eye=visible, EyeOff=hidden)
- Login: hide browser-native password reveal button to avoid duplicate