.skills/discourse-upcoming-changes/SKILL.md
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>"
Status options: conceptual, experimental, alpha, beta, stable, permanent
Impact format: <type>,<audience>
feature or otheradmin, moderators, staff, all_members, developersOptional: Add learn_more_url: "https://..." for documentation link.
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 |