Skip to content

chore: release v0.2.0#112

Merged
RedStar071 merged 180 commits intoreleasefrom
main
Apr 7, 2026
Merged

chore: release v0.2.0#112
RedStar071 merged 180 commits intoreleasefrom
main

Conversation

@github-actions
Copy link
Copy Markdown
Contributor

@github-actions github-actions Bot commented Apr 5, 2026

This PR will deploy the following changes to production (wolfstar.rocks).

Next version: v0.2.0 (current: v0.1.0)

Features

  • feat(shelve): add initial configuration for Shelve integration (1b225d98)
  • feat: add pull request template for improved contribution guidelines (e9f0471c)
  • feat(api): add sentry metrics for latency and error tracking (feat(api): add sentry metrics for latency and error tracking #116) (02ccf5ff)
  • feat: add bottom fade effect for clipped content in FeatureCarousel (feat: add bottom fade effect for clipped content in FeatureCarousel #79) (5a5000ce)
  • feat: add GitHub Actions workflow for automated release PR creation (136e9f48)
  • feat: add telemetry service URL for Netlify in Nuxt configuration (a50f1b1d)
  • feat: implement createApiComposable for reusable API data fetching and state management (2124b5fa)
  • feat: add useCommands and useLanguages composables for improved data fetching and state management (a082e97b)
  • feat: add Prisma Client generation step to CI workflow (28d3348f)
  • feat: add badges for Beta and Dev versions based on environment (c6bcaff2)

Fixes

  • fix(knip): add @shelve/cli to ignoreDependencies for CLI usage (ff79dfd6)
  • fix(discord): address code review issues in computePermissions/isAdmin/getManageable (8d43c3ed)
  • fix(discord): handle undefined rawPermissions in isAdmin function (962e5f02)
  • fix(discord): handle undefined permissions in isAdmin and computePermissions functions (532bc087)
  • fix(discord): use OAuth hasManageGuild fallback when member.permissions absent (50b058e2)
  • fix(discord): handle undefined permissions field in isAdmin function (6ee225ec)
  • fix(.gitignore): remove duplicate entry for .nvmrc (827e4950)
  • fix(cards): change reload button to navigate to login page (6bdfbfb8)
  • fix(api): improve error handling for Discord API calls in discord.ts (ce767b74)
  • fix(a11y): reapply default underline to NuxtLink elements in Events.vue (8132ebd0)
  • fix(ui): update header structure and improve event descriptions in guild settings (760df4fa)
  • fix(ui): improve spatial hierarchy in guild settings components (34f933b1)
  • fix(api): add diagnostic warnings in flattenGuild for non-array properties (1d19bd1d)
  • fix: clean up health check and add explicit cache keys (fix: clean up health check and add explicit cache keys #100) (d5ad6eb0)
  • fix(api): guard Array.isArray before .map() in flattenGuild to prevent TypeError (61503796)
  • fix: use correct command for prisma (434a16c0)
  • fix: remove @vue-macros/nuxt for fixing error on build (446859c2)
  • fix: update shouldOgImage type to boolean and modify OG image route ignore pattern (5fbdca85)
  • fix(oauth): read guild_id from query params instead of route params (8725751c)
  • fix(profile): resolve visual bugs and reduce motion toggle behavior (e05e1326)
  • fix(header): remove redundant aria-label from UBadge components (ece11d86)
  • fix: exclude _nuxt_icon API from configuration to improve asset handling (50c0a805)
  • fix: improve user avatar alt text and loading state handling (18b6b84a)
  • fix: update OAuth middleware definition for consistency (58f60be2)
  • fix: make OAuth middleware function asynchronous (3891eb0e)
  • fix: improve handling of redirect URLs in OAuth middleware (fcf6bfda)
  • fix: readd error to log (bbe73c59)
  • fix: revert the change to auth required to false (5375da9e)
  • fix(ui): enhance text legibility by updating layout structure in privacy page (ab9a544b)
  • fix(csp): add iconify API to connect-src directive (8b9d11d4)
  • fix: improve OAuth flow error handling and session management (417cc237)
  • fix(ui): improve text legibility on terms and privacy pages (baf3b054)
  • fix: update badge visibility for preview and canary environments (004aedb1)
  • fix: update postinstall script to include vp config (add18b83)
  • fix: update test:bench script to use vp test for consistency (17886de5)
  • fix(api): handle refresh promise rejection in PermissionNodeManager.run (1b61d487)
  • fix(api): synchronize guild permission checking with old site behavior (5158f0bd)

Other Changes

  • refactor(workflows): update contribution guidelines checker and PR code quality configurations (refactor(workflows): update contribution guidelines checker and PR code quality configurations #123) (fcb21a3b)
  • chore: remove CODEOWNERS file (chore: remove CODEOWNERS file #122) (4e2e463c)
  • chore(deps): update dependency std-env to v4 (chore(deps): update dependency std-env to v4 #92) (4e8d3b24)
  • refactor: replace fileURLToPath with import.meta.dirname (refactor: replace fileURLToPath with import.meta.dirname #120) (7904ea02)
  • refactor(config): remove footer configuration from app.config.ts (3ccf7886)
  • refactor(commands): normalize design tokens and strip decorative overload (refactor(commands): normalize design tokens and strip decorative overload #117) (32e5d27d)
  • docs: add design context and guidelines for WolfStar.rocks (b25f1d9c)
  • chore: remove obsolete provenance CI workflow (3356bca8)
  • chore: update .gitignore to include additional agent files and maintain organization (19931fd1)
  • refactor: enhance conditional class bindings for build environment display (449d6d92)
  • ci: use voidzero-dev/setup-vp instead of setup-node + pnpm/action-setup (ci: use voidzero-dev/setup-vp instead of setup-node + pnpm/action-setup #109) (ac2b6174)
  • refactor: optimize guild transformation logic and update default values (18f445ee)
  • refactor: remove unused Discord component tests from accessibility and SSR specs (f8fbfd62)
  • chore: update glob pattern for module entry files in knip config (48a018fe)
  • refactor: update contribution guidelines checker and PR code quality workflow files (92dde526)
  • refactor: update command parameter types in PermissionNodeManager and command matchers (951936a6)
  • chore: remove semantic pull request validation workflow (4ab48318)
  • ci: add Copilot contribution guidelines checker workflow (ci: add Copilot contribution guidelines checker workflow #107) (1efd1b16)
  • chore: update color enums and refine knip config ignoreMembers (845d3289)
  • chore: clean up unused imports and commented code in types.ts (9d639d63)
  • ci: add Copilot code quality review workflow (ec8a94f0)
  • docs: update linter command description in CONTRIBUTING.md (6f9a33af)
  • docs: add automatic label sync workflow (31b75380)
  • chore: add additional ignoreMembers for color values in knip config (1c6ee898)
  • chore: consolidate knip config and fix unused code (ceb40a0e)
  • chore: add .node-version to Vite config ignore list (91bb909a)
  • docs: update development and code quality instructions in CONTRIBUTING and copilot-instructions (d08e2e04)
  • refactor: disable SRI and adjust SSG script hashing in nuxt.config.ts (e2b66478)
  • refactor: update package.json scripts and clean up pnpm workspace configuration (1d085773)
  • chore: add .node-version file pinned to node 24 (16933906)
  • docs: remove unsupported onSuccess reference from CONTRIBUTING.md (4177bc54)
  • docs: remove unsupported onSuccess from handler options guidance (eec99761)
  • docs: revamp contributing guide and simplify copilot instructions (5272420f)
  • refactor: update OG image path handling and increase snapshot diff tolerance (136df097)
  • refactor: add NUXT_PUBLIC_SITE_URL environment variable for CI jobs (38f4d865)
  • refactor: simplify SEO description in Privacy Policy metadata (a514341d)
  • refactor: simplify SEO description in Terms of Service metadata (4f0df00b)
  • refactor: improve wording in privacy policy link for clarity (5fee2495)
  • refactor: update OgImage layout for improved alignment; simplify SEO description (1dc84cfb)
  • refactor: enhance OgImage layout and improve styling; add hydration tests (e72ab852)
  • refactor: implement og-image alias fix module and update pnpm workspace for vite-builder patch (b9d60c54)
  • refactor: add @takumi-rs/wasm to ignored dependencies in Knip configuration (3b8dfaae)
  • refactor: update Takumi dependencies to version 1.0.0-beta.20 and adjust peer dependency rules (0223ed27)
  • refactor: replace div with OgLayout component for improved structure (2375a0f3)
  • refactor: update OG image configuration to enhance security settings (ecaf8d17)
  • refactor: enhance OG image snapshot tests with detailed cases and improved naming (572f2124)
  • refactor: remove fixture-test-runtime-config and update @nuxt/test-utils patching in pnpm workspace (f811722e)
  • refactor: remove alias resolution for site-config in Vite configuration (c97307c0)
  • refactor: remove og-image module as part of migration to nuxt-og-image v6 (8bc6a133)
  • refactor: migrate nuxt-og-image to v6 and @nuxtjs/seo to v5 (1f6af1ae)
  • chore(deps): update all non-major dependencies (chore(deps): update all non-major dependencies #88) (d323a532)
  • chore(renovate): switch to danielroe preset (47bc2734)
  • refactor: replace AuthState with ClientOnly for improved rendering logic (31aceb72)
  • chore: update package overrides and dependencies in pnpm-workspace.yaml (53d20d25)
  • refactor(logging): migrate logging from consola to evlog by disabling Sentry's Consola reporter (0bc6d3e9)
  • refactor(logging): update payload structure in emit function for improved logging (eb4b3c96)
  • refactor(logging): improve error handling in commands and languages watch (45749d40)
  • chore(deps): remove unused dependency consola (056662ff)
  • chore(lockfile): downgrade vite plus aliases (22583f3a)
  • refactor(logging): enhance logging across guild-related components and pages (0544bcb6)
  • refactor(logging): migrate client logger from consola to evlog (5d05f70c)
  • chore: update skills agent (6982c8cd)
  • chore: remove Renovate configuration file (055e5981)
  • refactor(profile): update premium tab visibility and enhance loading indicator (0254d85b)
  • refactor: simplify NuxtPage component by removing unnecessary transition props (47479196)
  • refactor: simplify token retrieval by consolidating logic in getCurrentToken function (0527396b)
  • refactor: enhance SWR-style hydration refresh logic in useLanguages composable (a66f3e5a)
  • refactor: replace mockCachedFetch with registerEndpoint for improved test isolation (95a5cd69)
  • refactor: remove unused Vue props configuration and API exclusions in nuxt.config.ts (fb7c7612)
  • refactor: centralize batch size for guild transformations to improve rate limit handling (de064a17)
  • refactor: simplify data handling and improve performance (714edc65)
  • docs: rewrite copilot instructions in JabRef operational style (60c9d0b2)
  • chore: remove GEMINI.md file (a0d49605)
  • chore: add @playwright/test to the list of ignored dependencies in Knip configuration (b3cc0458)
  • chore: add NUXT_SESSION_PASSWORD environment variable for CI jobs (40403287)
  • chore: remove unused site configuration mock (af008693)
  • chore: enable Vite environment API in Nuxt configuration (cc756897)
  • chore: add back override vite (04594280)
  • chore: update vite (1435739c)
  • chore: remove Vite hooks install script for Husky (28bff2c2)
  • chore: remove husky from dependencies and update prepare script (d2d4b388)
  • chore: migrate Husky hooks to Vite hooks and update pre-commit script (caa501f6)
  • chore: add pre-commit hook to run vp staged (57584dec)
  • style: normalize spacing in vue files (82a45473)
  • chore(deps): update vite-plus to v0.1.13 (03e92bcb)
  • refactor: remove vitest-environment-nuxt dependency from package.json (738ad8b4)
  • refactor: migrate to vite-plus and to vite 8 from old configuration (17eecc6d)

Uncategorized

  • Initial plan (f40f8e4a)
  • [autofix.ci] apply automated fixes (abe7a058)
  • [autofix.ci] apply automated fixes (dd606c3b)
  • [autofix.ci] apply automated fixes (46fe3d68)
  • Initial plan (6357c182)
  • [autofix.ci] apply automated fixes (e8ee404d)
  • [autofix.ci] apply automated fixes (9a497fd8)
  • [autofix.ci] apply automated fixes (777b1480)
  • Add renovate.json (6aef6279)
  • [autofix.ci] apply automated fixes (de71a2ed)
  • [autofix.ci] apply automated fixes (ece8fc0d)
  • revert: undo terms and privacy changes from baf3b05 (e2b3fdc4)
  • Initial plan (0d5b7fd8)
  • Initial plan (4350700f)

Merging this PR will:

  • Deploy to wolfstar.rocks via Netlify
  • Create a v0.2.0 tag and GitHub Release

Copilot AI and others added 30 commits March 19, 2026 23:20
Fix getManageable to use guilds.getMember(guild.id, userId) instead of
users.getGuildMember(guild.id) which incorrectly used the bot token on
an OAuth-only endpoint. When member fetch fails, fall back to OAuth
permissions instead of returning false.

Fix isAdmin to handle missing member.permissions field by accepting
oauthPermissions as fallback.

Fix PermissionNodeManager to properly await async refresh() before
run() executes, preventing race condition on first use.

Co-authored-by: RedStar071 <76824516+RedStar071@users.noreply.github.com>
Co-authored-by: RedStar071 <76824516+RedStar071@users.noreply.github.com>
The profile page was hiding guilds where the user has `MANAGE_GUILD` but
isn't the owner — unlike the old site which displayed them. Two root
causes:

### `server/utils/discord.ts`

- **`getManageable()`** called `users.getGuildMember(guild.id)` — an
OAuth-only endpoint — with the **bot token**, silently failing for every
guild the bot is in. Changed to `guilds.getMember(guild.id, userId)` and
falls back to OAuth `permissions` bitfield when the member fetch fails
instead of returning `false`.

```diff
- const member = await useApi().users.getGuildMember(guild.id).catch(() => undefined);
- if (!member) return false;
+ const member = await useApi().guilds.getMember(guild.id, userId).catch(() => undefined);
+ if (!member) return hasManageGuild;
```

- **`isAdmin()`** now accepts optional `oauthPermissions: bigint`
fallback for when the bot-fetched member object lacks the `permissions`
field (only present in OAuth member responses).
- **`manage()`** threads `oauthPermissions` through to `isAdmin()`.

### `server/database/settings/structures/PermissionNodeManager.ts`

- `refresh()` is async but was fire-and-forget in the constructor —
`run()` could execute against an empty `sorted` Collection, making the
`conf` command permission node check a no-op (`null ?? true` → always
`true`).
- Store the refresh promise in `#refreshPromise` and `await` it at the
top of `run()`. On rejection, clear the stored promise so subsequent
calls aren't stuck on a stale error.

```typescript
public async run(member: APIGuildMember, command: WolfCommand) {
    if (this.#refreshPromise) {
        try { await this.#refreshPromise; }
        catch { this.#refreshPromise = null; }
    }
    return (await this.runUser(member, command)) ?? (await this.runRole(member, command));
}
```

`canManage()` (API route handlers) is unaffected — it receives members
from `getCurrentMember()` which already uses the user's OAuth token.

<!-- START COPILOT ORIGINAL PROMPT -->



<details>

<summary>Original prompt</summary>

> 
> ----
> 
> *This section details on the original issue you should resolve*
> 
> <issue_title>request: synchronize server view permissions in profile
as same behavior of old site</issue_title>
> <issue_description>### Is there an existing issue or pull request for
this?
> 
> - [x] I have searched the existing issues and pull requests
> 
> ### Feature description
> 
> allows you to view servers even if you are not the owner or do not
have `ADMINISTRATOR` permissions, as shown here:
> 
> Old Site:
> <img width="1383" height="139" alt="Image"
src="https://github.com/user-attachments/assets/9fc02b2d-b7ca-4e7a-8747-3cff16321d92"
/>
> New Site (missing the servers no has support a like old behavior):
> <img width="1412" height="672" alt="Image"
src="https://github.com/user-attachments/assets/1ebde389-8cda-463b-8a33-58919af9e6a3"
/>
> 
> ### Desired solution
> 
> support old behavior for managing server no has owner or role with
permission `ADMINISTRATOR`
> 
> ### Alternatives considered
> 
> no alternative i has considered
> 
> ### Additional context
> 
> _No response_</issue_description>
> 
> <agent_instructions>fix NodePermissionsManager and file
server/utils/discord.ts</agent_instructions>
> 
> ## Comments on the Issue (you are @copilot in this section)
> 
> <comments>
> </comments>
> 


</details>


> **Custom agent used: wolfstar-dev-agent**
> WolfStar Development Agent - Enhanced with Context7 MCP and Beast Mode



<!-- START COPILOT CODING AGENT SUFFIX -->

- Fixes #67

<!-- START COPILOT CODING AGENT TIPS -->
---

📍 Connect Copilot coding agent with [Jira](https://gh.io/cca-jira-docs),
[Azure Boards](https://gh.io/cca-azure-boards-docs) or
[Linear](https://gh.io/cca-linear-docs) to delegate work to Copilot in
one click without leaving your project management tool.
)

<!-- This is an auto-generated comment: release notes by coderabbit.ai
-->
## Summary by CodeRabbit

* **Chores**
* Consolidated developer tooling and scripts into a unified vite-plus
workflow, updated CI flows, pinned workspace overrides, and adjusted
package lifecycle hooks.
* Moved pre-commit staging to a new hook and updated editor
recommendations/settings.

* **Tests**
* Centralized test configuration into the new Vite-based setup and
standardized test invocations across CI.

* **Style**
* Widespread non-functional whitespace and formatting cleanup across
many components and pages.
<!-- end of auto-generated comment: release notes by coderabbit.ai -->
@github-actions
Copy link
Copy Markdown
Contributor Author

github-actions Bot commented Apr 7, 2026

🔍 Code Quality Overview — 3ccf788

Commit: refactor(config): remove footer configuration from app.config.ts
Author: @RedStar071


What changed

File Change
app/app.config.ts 73 lines removed — footer column definitions extracted out
app/components/app/Footer.vue Now consumes useFooter() composable instead of inline config

Summary

A clean, focused refactor. The static footer navigation links (Support Server, GitHub, Blog, Donate, Terms, Privacy) were previously defined in app.config.ts and are now owned by the dedicated app/composables/useFooter.ts composable. Footer.vue is updated to call useFooter() and destructure columns from it. app.config.ts is now minimal — only the UI theme is defined there.

What's good:

  • Separation of concerns is improved; footer link configuration is now colocated with the composable that owns it.
  • app.config.ts is cleaner and focused on UI theming only.
  • The destructuring in Footer.vue (const { columns } = useFooter()) is idiomatic.

Minor observation (non-blocking):
The columns array in useFooter.ts is fully static — it has no reactive dependencies. Wrapping it in computed<FooterColumn[]>(() => [...]) adds a reactivity layer that Vue will compute once and cache but never invalidate. A simple top-level const would be slightly more efficient and clearer in intent:

// Current
const columns = computed<FooterColumn[]>(() => [...]);

// Consider
const columns: FooterColumn[] = [...];

This is only worth changing if the columns ever need to depend on reactive state (e.g., i18n, auth status); if that's anticipated, keeping computed makes sense as a forward-compatible choice.


CI Status

CI checks are still in progress for this commit. The previous commit's CI (6bdfbfb8) completed with ✅ all checks passing (lint, tests, contribution guidelines, code quality). No regressions are expected from this focused refactor, but confirm CI green before merging to release.

Generated by WolfStar Code Quality Reviewer ·

<!-- This is an auto-generated comment: release notes by coderabbit.ai
-->

## Summary by CodeRabbit

* **Chores**
* Updated build and test configuration files to use modern JavaScript
module utilities for determining the project root directory. This
improves code maintainability and ensures better compatibility with
current Node.js development standards.

<!-- end of auto-generated comment: release notes by coderabbit.ai -->
@github-actions
Copy link
Copy Markdown
Contributor Author

github-actions Bot commented Apr 7, 2026

🔍 Code Quality Overview — fix(.gitignore): remove duplicate entry for .nvmrc

Commit: 827e4950 · Author: @RedStar071


📁 Files Changed

File Type Risk
.gitignore Config / housekeeping 🟢 None

This is a pure housekeeping commit — removes a duplicate .nvmrc entry from .gitignore. No source code, components, composables, server routes, or tests were modified. No correctness, performance, or accessibility concerns.


🚦 CI Status (at time of review)

Job Status
🔠 Lint project ✅ Passed
🧪 Unit tests ✅ Passed
🧹 Unused code check ✅ Passed
🧪 Component tests ✅ Passed
🛡️ GitGuardian Security ✅ Passed
🖥️ Browser tests 🔄 In progress
⚡ Benchmarks 🔄 In progress
♿ Accessibility audit (light) 🔄 In progress
♿ Accessibility audit (dark) 🔄 In progress

All completed checks are green. The remaining jobs (browser tests, benchmarks, accessibility audits) are still running but are expected to pass as the commit touches no application logic.


No quality concerns. This is a safe, self-contained housekeeping fix.

Generated by WolfStar Code Quality Reviewer ·

renovate Bot and others added 4 commits April 7, 2026 11:43
This PR contains the following updates:

| Package | Change |
[Age](https://docs.renovatebot.com/merge-confidence/) |
[Confidence](https://docs.renovatebot.com/merge-confidence/) |
|---|---|---|---|
| [std-env](https://redirect.github.com/unjs/std-env) | [`^3.10.0` →
`^4.0.0`](https://renovatebot.com/diffs/npm/std-env/3.10.0/4.0.0) |
![age](https://developer.mend.io/api/mc/badges/age/npm/std-env/4.0.0?slim=true)
|
![confidence](https://developer.mend.io/api/mc/badges/confidence/npm/std-env/3.10.0/4.0.0?slim=true)
|

---

> [!WARNING]
> Some dependencies could not be looked up. Check the [Dependency
Dashboard](../issues/83) for more information.

---

### Release Notes

<details>
<summary>unjs/std-env (std-env)</summary>

###
[`v4.0.0`](https://redirect.github.com/unjs/std-env/blob/HEAD/CHANGELOG.md#v400-rc1)

[Compare
Source](https://redirect.github.com/unjs/std-env/compare/v3.10.0...v4.0.0)

[compare
changes](https://redirect.github.com/unjs/std-env/compare/v3.10.0...v4.0.0-rc.1)

##### 🚀 Enhancements

- Agent detection
([#&#8203;179](https://redirect.github.com/unjs/std-env/pull/179))
- Check `MODE` variable for `isDevelopment` and `isProduction` flags
([#&#8203;114](https://redirect.github.com/unjs/std-env/pull/114))

##### 🔥 Performance

- No need to pass env ref
([44bab37](https://redirect.github.com/unjs/std-env/commit/44bab37))

##### 🩹 Fixes

- Jenkins detection
([#&#8203;171](https://redirect.github.com/unjs/std-env/pull/171))

##### 💅 Refactors

- ⚠️ Remove env and process shims
([d4de8a4](https://redirect.github.com/unjs/std-env/commit/d4de8a4))
- ⚠️ Improve codebase
([653b127](https://redirect.github.com/unjs/std-env/commit/653b127))
- Default `nodeEnv` to `undefined`
([c78098a](https://redirect.github.com/unjs/std-env/commit/c78098a))
- Remove `toBoolean` util
([23bfb8f](https://redirect.github.com/unjs/std-env/commit/23bfb8f))

##### 📦 Build

- ⚠️ Esm-only dist
([d31cca3](https://redirect.github.com/unjs/std-env/commit/d31cca3))

##### 🏡 Chore

- Migrate to oxlint, oxfmt and tsgo
([3de70cf](https://redirect.github.com/unjs/std-env/commit/3de70cf))
- Update lockfile
([c6e909c](https://redirect.github.com/unjs/std-env/commit/c6e909c))
- Update
([06201cc](https://redirect.github.com/unjs/std-env/commit/06201cc))
- Apply automated updates
([8f0d79f](https://redirect.github.com/unjs/std-env/commit/8f0d79f))
- Update deps
([8168254](https://redirect.github.com/unjs/std-env/commit/8168254))
- Prepare for v4 rc
([58118f5](https://redirect.github.com/unjs/std-env/commit/58118f5))

##### ⚠️ Breaking Changes

- ⚠️ Remove env and process shims
([d4de8a4](https://redirect.github.com/unjs/std-env/commit/d4de8a4))
- ⚠️ Improve codebase
([653b127](https://redirect.github.com/unjs/std-env/commit/653b127))
- ⚠️ Esm-only dist
([d31cca3](https://redirect.github.com/unjs/std-env/commit/d31cca3))

##### ❤️ Contributors

- Pooya Parsa ([@&#8203;pi0](https://redirect.github.com/pi0))
- Mark R. Florkowski
([@&#8203;markflorkowski](https://redirect.github.com/markflorkowski))
- Gustavo Perdomo <gperdomor@gmail.com>

</details>

---

### Configuration

📅 **Schedule**: Branch creation - "on Monday" (UTC), Automerge - At any
time (no schedule defined).

🚦 **Automerge**: Disabled by config. Please merge this manually once you
are satisfied.

♻ **Rebasing**: Whenever PR becomes conflicted, or you tick the
rebase/retry checkbox.

🔕 **Ignore**: Close this PR and you won't be reminded about this update
again.

---

- [ ] <!-- rebase-check -->If you want to rebase/retry this PR, check
this box

---

This PR was generated by [Mend Renovate](https://mend.io/renovate/).
View the [repository job
log](https://developer.mend.io/github/wolfstar-project/wolfstar.rocks).

<!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiI0My45NC4xIiwidXBkYXRlZEluVmVyIjoiNDMuOTQuMSIsInRhcmdldEJyYW5jaCI6Im1haW4iLCJsYWJlbHMiOlsiY2hvcmUiLCJkZXBlbmRlbmNpZXMiXX0=-->

---------

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
Co-authored-by: autofix-ci[bot] <114827586+autofix-ci[bot]@users.noreply.github.com>
Co-authored-by: RedStar <redstar071@proton.me>
Co-authored-by: kodiakhq[bot] <49736102+kodiakhq[bot]@users.noreply.github.com>
<!-- This is an auto-generated comment: release notes by coderabbit.ai
-->

## Summary by CodeRabbit

* **Chores**
  * Updated code ownership configuration.

<!-- end of auto-generated comment: release notes by coderabbit.ai -->

Co-authored-by: LoryPelli <87276663+lorypelli@users.noreply.github.com>
…de quality configurations (#123)

<!-- This is an auto-generated comment: release notes by coderabbit.ai
-->

## Summary by CodeRabbit

* **Chores**
* Updated code quality workflow configuration to prevent no-op outputs
from being reported as issues in pull requests.

<!-- end of auto-generated comment: release notes by coderabbit.ai -->
@github-actions
Copy link
Copy Markdown
Contributor Author

github-actions Bot commented Apr 7, 2026

🤖 Code Quality Overview — e9f0471c

Commit: feat: add pull request template for improved contribution guidelines
Files changed: 1 (.github/PULL_REQUEST_TEMPLATE.md, +28 lines) — documentation-only


CI Status

Check Status
🔠 Lint ✅ Passed
🧪 Unit tests ✅ Passed
🧪 Component tests ✅ Passed
🖥️ Browser tests ✅ Passed
🧹 Unused code check ✅ Passed
♿ Accessibility audit (light) ✅ Passed
♿ Accessibility audit (dark) 🔄 In progress
⚡ Benchmarks 🔄 In progress
🔒 GitGuardian ✅ Passed
📊 Codecov ✅ Passed

Change Assessment

The PR template is well-structured and follows good contribution hygiene practices. A couple of minor observations:

  • Duplicate context slots: The ### 🧭 Context section contains two adjacent comment placeholders (<!-- Brief background … --> and <!-- High-level summary … -->). Consider merging these into one prompt to avoid ambiguity about what goes where.
  • Checklist placement: The pre-submission checklist is wrapped in an HTML comment block, meaning it will not render as interactive checkboxes. This is a reasonable design choice if the intent is guidance-only, but contributors won't be able to tick items. If you want trackable checkboxes, move the list outside the comment block.

No bugs, security concerns, or accessibility issues — this is a safe, low-risk change. ✅

Generated by WolfStar Code Quality Reviewer ·

Copy link
Copy Markdown
Contributor Author

@github-actions github-actions Bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Code quality review — v0.2.0 release PR (latest update)

CI status

Check Status
🔠 Lint ✅ passed
🧪 Unit tests ✅ passed
🧪 Component tests ✅ passed
🧹 Unused code (Knip) ✅ passed
🔒 GitGuardian ✅ passed
📊 Codecov (patch + project) ✅ passed
🌐 Netlify deploy preview ✅ ready
🖥️ Browser tests ⏳ in progress
♿ Accessibility audit (light) ⏳ in progress
♿ Accessibility audit (dark) ⏳ in progress
⚡ Benchmarks ⏳ in progress

New commit since last review

The only change since the previous review is e9f0471cfeat: add pull request template (.github/PULL_REQUEST_TEMPLATE.md, +28 lines, documentation-only).

The template is well-structured:

  • Linked issue, context, and description sections
  • A thoughtful AI-usage note encouraging contributors to write in their own voice
  • A contributor checklist (conventional commits, documentation, tests, etc.)

No code changes, no regressions. ✅


Open items from prior reviews (carry-over)

The following non-blocking items were flagged in earlier reviews and remain unaddressed — worth tracking as follow-up work before or shortly after the v0.2.0 release:

  1. fix(cards) — label/action mismatch: the reload button now navigates to /login but still uses the arrow-path icon and "Reload Page" label. This is a WCAG 2.5.3 issue; suggested fix: icon="heroicons:arrow-right-on-rectangle" + label "Log In".
  2. createApiComposable.tsisStale check runs at setup time, not inside onMounted, so SWR refreshes can be silently skipped on data that goes stale after hydration.
  3. PermissionNodeManager.ts#refreshPromise is never cleared after resolution, adding a microtask overhead on every subsequent run() call.
  4. server/utils/discord.ts?? false after Array.includes() is redundant (always boolean).
  5. useUser.ts?? null fallback is inconsistent with the Ref<string | undefined> return type.

None of these are blockers for the release. The PR is in good shape pending the browser tests, accessibility audits, and benchmarks completing green.

Generated by WolfStar Code Quality Reviewer for PR #112

Generated by WolfStar Code Quality Reviewer for issue #112

Copilot AI and others added 7 commits April 7, 2026 14:35
Fixes WOLFSTAR-ROCKS-45

When a Discord API guild member response lacks the permissions field,
BigInt(undefined) throws TypeError. Fix by marking permissions as optional
in the type assertion and defaulting to "0" (no permissions) when absent.

Agent-Logs-Url: https://github.com/wolfstar-project/wolfstar.rocks/sessions/f906e866-c8c7-4fb8-b14d-f685843f3cef

Co-authored-by: RedStar071 <76824516+RedStar071@users.noreply.github.com>
…ns absent

The bot-token GET /guilds/{id}/members/{id} endpoint never returns a
permissions field (only interaction-attached members and the user-token
GET /users/@me/guilds/{id}/member do). Thread the pre-computed
hasManageGuild from oauthGuild.permissions through manage() and isAdmin()
so it is used as the correct fallback instead of hard-coding false.

Fixes WOLFSTAR-ROCKS-45

Agent-Logs-Url: https://github.com/wolfstar-project/wolfstar.rocks/sessions/aeb08cef-6762-4b9b-b020-f862b543de3b

Co-authored-by: RedStar071 <76824516+RedStar071@users.noreply.github.com>
…n/getManageable

- Remove early Administrator return from computePermissions; return full bitfield
- isAdmin: check Administrator || ManageGuild so admins are never denied access
- isAdmin: fix cast to permissions?: string so type matches runtime reality
- getManageable: replace useApi().users.getGuildMember (wrong endpoint/token)
  with getMember(guild.id, userId) bot-token helper

Agent-Logs-Url: https://github.com/wolfstar-project/wolfstar.rocks/sessions/579a9929-ecc6-4ba2-9c5a-06fdad52f33f

Co-authored-by: RedStar071 <76824516+RedStar071@users.noreply.github.com>
`BigInt(undefined)` throws at runtime when the Discord API returns a
guild member without a `permissions` field, causing the entire
`/api/users` guild transformation to fail for affected users.

## Root Cause

The `permissions` field is absent by Discord API design on members
fetched via the bot-token endpoint `GET
/guilds/{guild.id}/members/{user.id}`. It is only present on
interaction-attached member objects and `GET
/users/@me/guilds/{guild.id}/member` (user-token). Since `getManageable`
uses the bot-token fetch internally, `permissions` is never available
there.

## Changes

- **`server/utils/discord.ts`** — `computePermissions`: removed the
early `Administrator`-only return; the function now always returns the
full accumulated permission bitfield from all roles.
- **`server/utils/discord.ts`** — `isAdmin`: fixed `cast<{ permissions?:
string }>` (was `string`, hiding the optional field); when `permissions`
is absent, falls back to computing permissions from the member's roles
via `computePermissions`; explicitly checks `Administrator ||
ManageGuild` so users with the Administrator permission are never
falsely denied.
- **`server/utils/discord.ts`** — `getManageable`: replaced
`useApi().users.getGuildMember(guild.id)` (wrong endpoint — user-token
route, missing `userId`) with `getMember(guild.id, userId)`, the
existing cached bot-token helper.

```typescript
// Before — crashes when permissions is absent
const memberRolePermissions = BigInt(cast<{ permissions: string }>(member).permissions);

// After — falls back to role-based computation when permissions is absent;
// Administrator correctly implies ManageGuild access
const rawPermissions = cast<{ permissions?: string }>(member).permissions;
const memberRolePermissions =
    rawPermissions !== undefined
        ? BigInt(rawPermissions)
        : computePermissions(member.roles, guild.roles);
return (
    PermissionsBits.has(memberRolePermissions, PermissionFlagsBits.Administrator) ||
    PermissionsBits.has(memberRolePermissions, PermissionFlagsBits.ManageGuild)
);
```

The `cast<T>()` utility is a TypeScript-only type assertion with no
runtime validation, so the `string` annotation was silently masking an
optional field that the Discord API does not populate for bot-token
guild member fetches.
Copy link
Copy Markdown
Contributor Author

@github-actions github-actions Bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Code quality review — v0.2.0 release PR (latest update)

CI status

Check Status
🔠 Lint ✅ passed
🧪 Unit tests ✅ passed
🧪 Component tests ✅ passed
🧹 Unused code (Knip) ✅ passed
⚡ Benchmarks ✅ passed
🔒 GitGuardian ✅ passed
📊 Codecov ✅ passed
⚡ CodSpeed ✅ passed
🌐 Netlify deploy preview ✅ ready
🖥️ Browser tests ⏳ in progress
♿ Accessibility audit (light) ⏳ in progress
♿ Accessibility audit (dark) ⏳ in progress

Browser tests and both accessibility audits are still running. Wait for these to complete before merging.


New changes since last review

Three fix(discord) commits addressing the permission system (6ee225ec50b058e28d43c3ed):

What changed in server/utils/discord.ts:

  • computePermissions: early-Administrator short-circuit removed; now always returns full computed bitfield. ✅
  • isAdmin: correctly checks Administrator || ManageGuild and falls back to computePermissions(member.roles, guild.roles) when rawPermissions is absent (bot-token members). ✅
  • getManageable: replaces useApi().users.getGuildMember (wrong token context) with getMember(guild.id, userId) bot-token helper; uses hasManageGuild from OAuth data when bot-token fetch fails. ✅

These are all correct fixes for a subtle Discord API behaviour. The permission logic is now sound.

One micro-nit in the new code (non-blocking): member.roles.map((r) => r) in isAdmin is an identity map — member.roles can be passed directly to hasAtLeastOneKeyInMap since it's already an iterable.


Carry-over items from prior reviews (still open)

These were flagged in earlier reviews and remain unaddressed. None are release-blockers, but worth tracking as follow-up issues:

  1. PermissionNodeManager.ts line 33–38#refreshPromise is only cleared on error (} catch { this.#refreshPromise = null }), not on success. Every subsequent run() call re-awaits the same already-resolved promise (extra microtask). Adding this.#refreshPromise = null in a finally block would eliminate this overhead.

  2. createApiComposable.ts / useUser.ts — The isStale guard (if (import.meta.client && asyncData.data.value?.isStale)) is evaluated at composable setup time, outside onMounted. Data that is fresh at setup but becomes stale before mount will silently skip the SWR refresh.

  3. server/utils/discord.ts lines 165, 169data.features.includes(GuildFeature.Partnered) ?? false / ...Verified ?? false: Array.includes() always returns boolean, so ?? false is redundant.

  4. fix(cards) — label/action mismatch — the reload button navigates to /login but still carries the arrow-path icon and "Reload Page" label. WCAG 2.5.3 issue; suggested fix: icon="heroicons:arrow-right-on-rectangle" + label "Log In".

Generated by WolfStar Code Quality Reviewer for PR #112

Note

🔒 Integrity filter blocked 6 items

The following items were blocked because they don't meet the GitHub integrity level.

  • 6b57ea3 list_commits: has lower integrity than agent requires. The agent cannot read data with integrity below "approved".
  • 962e5f0 list_commits: has lower integrity than agent requires. The agent cannot read data with integrity below "approved".
  • 532bc08 list_commits: has lower integrity than agent requires. The agent cannot read data with integrity below "approved".
  • e9f0471 list_commits: has lower integrity than agent requires. The agent cannot read data with integrity below "approved".
  • fcb21a3 list_commits: has lower integrity than agent requires. The agent cannot read data with integrity below "approved".
  • 4e2e463 list_commits: has lower integrity than agent requires. The agent cannot read data with integrity below "approved".

To allow these resources, lower min-integrity in your GitHub frontmatter:

tools:
  github:
    min-integrity: approved  # merged | approved | unapproved | none

Generated by WolfStar Code Quality Reviewer for issue #112

@github-actions
Copy link
Copy Markdown
Contributor Author

github-actions Bot commented Apr 7, 2026

🔍 Code Quality Review — fix(discord): handle missing permissions field in isAdmin (6b57ea3)

Files changed: server/utils/discord.ts (+36 / −12)


✅ CI Status

All 8 quality checks passed on this commit:

Job Result
🔠 Lint project ✅ success
🧪 Unit tests ✅ success
🧪 Component tests ✅ success
🖥️ Browser tests ✅ success
♿ Accessibility audit (light) ✅ success
♿ Accessibility audit (dark) ✅ success
🧹 Unused code check ✅ success
⚡ Benchmarks ✅ success

✅ What's good

  • Bug fix is correct. BigInt(undefined) was a guaranteed runtime crash on every bot-token guild member fetch. The permissions !== undefined guard with computePermissions fallback is the right approach.
  • Wrong endpoint fixed. useApi().users.getGuildMember(guild.id) was using the user-token route and missing userId; the replacement getMember(guild.id, userId) correctly uses the cached bot-token helper.
  • computePermissions is clean. Iterating all guild roles and accumulating the bitfield via |= is correct and handles the @everyone role properly.
  • Administrator || ManageGuild check is correct. An Administrator implies all permissions including ManageGuild, so checking both explicitly (rather than relying on implication) is safe and readable.

🔶 Observations worth addressing

1. Unnecessary identity map in isAdmin

// Current
member.roles.map((r) => r)

// Simpler
member.roles

Array.prototype.map((r) => r) creates a new array copy with identical values. The hasAtLeastOneKeyInMap second argument just needs an iterable of strings; passing member.roles directly is equivalent and avoids the allocation.

2. No tests for the new fallback path

isAdmin (and by extension getManageable) is on the critical path for access control. The two new code paths — permissions absent → computePermissions fallback, and getMember throws → fall back to hasManageGuild — are not covered by tests. Given this is a security-sensitive function, adding unit tests for both branches would be valuable:

// Example cases to cover:
// - member with permissions field present → BigInt path
// - member with permissions field absent → computePermissions path  
// - member is guild owner
// - getMember throws → graceful fallback to oauthGuild permissions

3. Silent error swallow in getManageable

const member = await getMember(guild.id, userId).catch(() => undefined);

Transient Discord API errors or 5xx responses will be silently discarded, falling back to hasManageGuild. While this is better than crashing, it means Sentry won't capture real API failures here. Consider capturing non-"unknown member" errors:

const member = await getMember(guild.id, userId).catch((err) => {
    if (err?.code !== 10_007) Sentry.captureException(err);
    return undefined;
});

4. cast is redundant on APIGuildMember

APIGuildMember from discord-api-types/v10 already defines permissions?: string as an optional field. The cast<{ permissions?: string }>(member) call is therefore doing nothing — member.permissions is already typed correctly and can be accessed directly without the cast utility. This is minor, but cast should be reserved for when you genuinely need to override the type system.


Summary

The core fix is correct and all CI checks are green. The four observations above are non-blocking: items 1 and 4 are style/clarity, item 2 is a test-coverage gap on security-sensitive logic worth addressing in a follow-up, and item 3 is an observability improvement for production debugging.

Generated by WolfStar Code Quality Reviewer ·

@github-actions
Copy link
Copy Markdown
Contributor Author

github-actions Bot commented Apr 7, 2026

✅ Contribution Guidelines Check

This automated release PR meets the repository's contribution guidelines:

  • PR titlechore: release v0.2.0 follows [Conventional Commits]((www.conventionalcommits.org/redacted) format with a valid type and lowercase description ✓
  • PR description — Comprehensive release notes with categorized changes (Features, Fixes, Refactors, etc.) and clear deployment context ✓
  • Commit messages — All individual commits in the changelog follow type(scope): description format ✓

This is an automated release PR generated by github-actions[bot]; the screenshot requirement for frontend changes applies to individual contributor PRs, not release aggregations.

The contribution-ready label has been confirmed. 🚀

Generated by Contribution Guidelines Checker for issue #112 ·

To install this agentic workflow, run

gh aw add githubnext/agentics/workflows/contribution-guidelines-checker.md@1f672aef974f4246124860fc532f82fe8a93a57e

@github-actions
Copy link
Copy Markdown
Contributor Author

github-actions Bot commented Apr 7, 2026

🔍 Code Quality Overview — feat(shelve): add initial configuration for Shelve integration

Commit: 1b225d98 · Author: @RedStar071


What changed

File Type Description
shelve.config.json ➕ Added Shelve project configuration (project name + team slug)
package.json ✏️ Modified Added @shelve/cli ^4.1.7 to devDependencies
pnpm-lock.yaml ✏️ Modified Lockfile updated for new dependency

This is a minimal, focused change: it bootstraps Shelve — an environment-variable management CLI — for this project.


CI Status

Workflow Status
ci (push) 🔄 In progress
ci (PR) 🔄 In progress
release-pr ✅ Passed

CI is still running. No prior failures are visible for this set of changes.


Observations

  1. shelve.config.json committed to the repo — The file only contains the project name (wolfstar.rocks) and team slug (wolfstar-team), which are non-sensitive identifiers. No tokens or secrets are present. ✅

  2. $schema points to an external URLhttps://raw.githubusercontent.com/HugoRCD/shelve/main/packages/types/schema.json is a GitHub raw URL that could drift if the upstream schema changes. Consider pinning to a specific release tag or SHA if schema stability is important.

  3. @shelve/cli in devDependencies — Correct placement; CLI tools should not be in dependencies. The postinstall script already runs vp config, so if Shelve pull/push is hooked there, ensure CI environments have SHELVE_TOKEN (or equivalent) set to avoid install-time failures.

  4. No application code changed — This commit carries zero risk of UI/UX regression, accessibility issues, or server-side bugs.


ℹ️ No blocking issues found. This change is safe to proceed once CI completes.

Generated by WolfStar Code Quality Reviewer ·

Copy link
Copy Markdown
Contributor Author

@github-actions github-actions Bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Code quality review — v0.2.0 release PR

CI status

Check Status
🔠 Lint ✅ passed
🧪 Unit tests ✅ passed
🧪 Component tests ✅ passed
🧹 Unused code (Knip) failing
🔒 GitGuardian ✅ passed
🖥️ Browser tests 🔄 in progress
♿ Accessibility audit (light/dark) 🔄 in progress
⚡ Benchmarks 🔄 in progress

Required fix

The 🧹 Unused code check is failing due to one issue:

  • @shelve/cli is flagged as an unused devDependency (package.json:119). This package is CLI-only (invoked as shelve pull/push) and is not imported anywhere — Knip can't detect CLI-only tools automatically.

Fix: add one line to knip.ts > ignoreDependencies:

/** Shelve CLI — used for secrets management via `shelve pull/push`, not imported directly */
"`@shelve/cli`",

Non-blocking cleanup (optional follow-up)

Knip reports 7 configuration hints about stale entries in knip.ts (ignoreDependencies / ignoreUnresolved). These don't cause the CI failure on their own but indicate drift worth cleaning up in a follow-up commit.


This is the only blocking issue. All code-quality changes in this release (evlog migration, createApiComposable, OAuth hardening, vite-plus migration) look well-structured and consistent with the repo's patterns.

Generated by WolfStar Code Quality Reviewer for issue #112

Comment thread knip.ts
Comment thread package.json
@RedStar071 RedStar071 merged commit a8d5f61 into release Apr 7, 2026
42 of 43 checks passed
Copy link
Copy Markdown
Contributor Author

@github-actions github-actions Bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Code Review — v0.2.0 Release PR

CI status at review time

Check Status
🔠 Lint ✅ Passed
🧪 Unit tests ✅ Passed
🧪 Component tests ✅ Passed
⚡ Benchmarks ✅ Passed
🧹 Unused code ✅ Passed
🔒 GitGuardian ✅ Passed
🌐 Netlify preview ✅ Ready (deploy-preview-112)
🖥️ Browser tests 🔄 In progress
♿ Accessibility audits (light + dark) 🔄 In progress

Overall the quality baseline is strong. All static checks pass. I reviewed the key new runtime code (sentry-metrics.ts, discord.ts, wrappedEventHandler.ts, ApiTransformers.ts, createApiComposable.ts, oauth-state.ts) and left inline notes on five non-blocking observations.

Summary of inline comments

  1. Snowflake ID normalization gap (sentry-metrics.ts:14) — the {20,} quantifier misses 17–19 digit Discord IDs, so route metrics like GET /api/guilds/:id/settings would fan out per guild in Sentry. Worth patching before substantial production traffic hits the endpoint.

  2. credentials: "include" on server-to-server fetch (discord.ts) — harmless today but misleading in a Node.js context; remove or replace with credentials: "omit".

  3. Redundant identity .map((r) => r) (discord.ts) — minor allocation with no functional purpose; pass member.roles directly.

  4. Unreachable ?? [] after .map() (ApiTransformers.ts) — dead guard; the defensive check should be (arr ?? []).map(...) not arr.map(...) ?? [].

  5. any | Error | H3Error union (wrappedEventHandler.ts) — any subsumes the others; prefer Error | H3Error | unknown.

Submitting as COMMENT rather than APPROVE since browser tests and accessibility audits are still running — please confirm they pass before merging.

Generated by WolfStar Code Quality Reviewer for issue #112

@codspeed-hq
Copy link
Copy Markdown

codspeed-hq Bot commented Apr 23, 2026

Unable to generate the performance report

There was an internal error while processing the run's data. We're working on fixing the issue. Feel free to contact us on Discord or at support@codspeed.io if the issue persists.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants