بنقرة واحدة
discourse-upcoming-changes
// Use when adding a new upcoming change feature flag to Discourse - handles site settings, translations, images, and code access patterns
// Use when adding a new upcoming change feature flag to Discourse - handles site settings, translations, images, and code access patterns
Write and structure RSpec tests for Discourse core, plugins, themes, or theme components. Use when creating or modifying model specs, controller specs, service specs, job specs, system tests, or integration tests. Covers fabricators, page objects, test structure, and theme test setup.
MUST load before writing or reviewing any database migration (db/migrate, db/post_migrate, plugin migrations)
Use when modifying, debugging, or extending the upcoming changes framework code and system itself.
Capture screenshots of the local Discourse site across the two core themes (Foundation, Horizon) and color modes (light, dark). Use when the user asks for "screenshots of themes", "light/dark mode shots", or similar.
Use when refreshing the default LLM presets shipped with Discourse AI — model versions, pricing, context windows, vision flags, and the matching `model_description` i18n keys.
Generate a Discourse-style commit message and PR description from current changes
| name | discourse-upcoming-changes |
| description | Use when adding a new upcoming change feature flag to Discourse - handles site settings, translations, images, and code access patterns |
Upcoming changes are feature flags that allow gradual rollout of new Discourse features. They require a site setting, translation, optional image, and can be targeted to specific groups.
Use when:
REQUIRED: Before adding the site setting, use AskUserQuestion to gather missing information. Only ask questions for information the user has NOT already provided. The user can always type a value directly via the "Other" option.
Batch 1 (ask first, max 4 questions):
| Question | Header | Options |
|---|---|---|
| Status | "Status" | "conceptual" (Planned, hidden) / "experimental" (Very early) / "alpha" (Internal) / "beta" (Broader) |
| Impact Type | "Impact" | "feature" (New functionality) / "other" (Non-feature change) |
| Audience | "Audience" | "all_members" / "staff" / "moderators" / "admin" |
| Image | "Image" | "No image needed" / "I'll provide the path later" |
Note: For Status, "stable" and "permanent" are available via "Other". For Audience, "developers" is available via "Other".
After Batch 1: Gather any remaining information before continuing:
IMPORTANT: Do NOT read the entire config/site_settings.yml file - it's too large. Instead, use Grep to search for upcoming_change: to find existing examples and the right location to add the new setting.
Add to config/site_settings.yml in the appropriate section (often under experimental:):
enable_your_feature_name:
default: false
hidden: true
client: true
upcoming_change:
status: "<status from question>"
impact: "<type>,<audience>"
learn_more_url: "<URL from question>"
Status options: conceptual, experimental, alpha, beta, stable, permanent
Impact format: <type>,<audience>
feature or otheradmin, moderators, staff, all_members, developersLearn more URL: Add learn_more_url: "https://..." for documentation link. This should generally be a Discourse Meta URL in the format https://meta.discourse.org/t/-/999999 . If the user pastes a topic URL with a slug, remove the slug and replace with a - as shown.
Optional: Add allow_enabled_for: to restrict which "Enabled for" dropdown options the admin can choose. Accepts any subset of everyone, staff, specific_groups. "No one" is always available. If everyone is included it must be the only value. Omit the key to allow all options (the default).
upcoming_change:
status: "experimental"
impact: "feature,all_members"
allow_enabled_for:
- staff
- specific_groups
| Value | Dropdown options |
|---|---|
| (omitted) | No one, Everyone, Staff, Specific group(s) |
[everyone] | No one, Everyone |
[staff] | No one, Staff |
[specific_groups] | No one, Specific group(s) |
[staff, specific_groups] | No one, Staff, Specific group(s) |
Add to config/locales/server.en.yml under site_settings::
en:
site_settings:
enable_your_feature_name: "Description of what this upcoming change enables or modifies"
Ask user to provide an image, then process it using the skill's optimization script:
Copy image to destination:
cp "<source_image>" "public/images/upcoming_changes/<setting_name>.png"
Convert, resize, and compress using the skill's optimization script:
bin/rails runner ~/.claude/skills/discourse-upcoming-changes/scripts/optimize_upcoming_change_image.rb public/images/upcoming_changes/<setting_name>.png
This script:
OptimizedImage.downsizeFileHelper.optimize_image!Final path: public/images/upcoming_changes/<setting_name>.png
Ruby - Check if enabled for user:
user.upcoming_change_enabled?(:enable_your_feature_name)
# Or with explicit user (nil for anonymous):
UpcomingChanges.enabled_for_user?(:enable_your_feature_name, user)
UpcomingChanges.enabled_for_user?(:enable_your_feature_name, nil)
JavaScript - Check setting value:
// In component/controller with @service siteSettings
this.siteSettings.enable_your_feature_name;
Plugins follow the same pattern with different file locations.
Add to plugins/your-plugin/config/settings.yml:
plugins:
enable_your_feature_name:
default: false
hidden: true
client: true
upcoming_change:
status: "experimental"
impact: "feature,all_members"
Add to plugins/your-plugin/config/locales/server.en.yml:
en:
site_settings:
enable_your_feature_name: "Description of what this upcoming change enables or modifies"
Images still go in core: public/images/upcoming_changes/enable_your_feature_name.png
| Item | Core Location | Plugin Location |
|---|---|---|
| Site setting | config/site_settings.yml | plugins/<name>/config/settings.yml |
| Translation | config/locales/server.en.yml | plugins/<name>/config/locales/server.en.yml |
| Image | public/images/upcoming_changes/<name>.png | Same as core |
| Status | Value | Description |
|---|---|---|
| conceptual | -100 | Planned but hidden from upcoming changes |
| experimental | 0 | Very early testing |
| alpha | 100 | Internal testing |
| beta | 200 | Broader testing |
| stable | 300 | Ready for production |
| permanent | 500 | Permanent feature |
| Mistake | Fix |
|---|---|
Missing client: true | Add it - required for JS access |
Missing hidden: true | Add it - upcoming changes should be hidden |
| Image name mismatch | Filename must exactly match setting name |
| Image too large (>300KB) | Re-run the optimization script |
| Wrong translation key | Must be under en.site_settings. |
Plugin using site_settings.yml | Plugins use settings.yml (no site_ prefix) |
Plugin missing plugins: key | Settings must be under plugins: key in plugins |