FM-SCRUB-SCHEMA-URL + FM-CAL-DASHBOARD-LINK: scrub operator hostname; surface Sync Calendar from dashboard + scene controls#49
Merged
Conversation
…on + add grep guard
…ontrols Two discoverability affordances for SyncCalendarApplication so the operator doesn't have to dig through Module Settings to find it: 1. Dashboard Calendar tab gets a primary-action "Open Sync Calendar" button above the date-sync status panel. Wired via the data-action="open-sync-calendar" pattern; handler calls the singleton openSyncCalendar() helper from sync-calendar.mjs. 2. Scene-controls toolbar adds a second tool (calendar-days icon) to the existing chronicle-sync group, inheriting the GM-only gate already enforced at the top of the getSceneControlButtons hook. Registered in both v12 array and v13 object shapes. i18n: adds CHRONICLE.Dashboard.Calendar.OpenSyncCalendar + OpenSyncCalendarHint and a new CHRONICLE.SceneControl.SyncCalendar namespace. CSS: .calendar-tab-actions launch row sized to be the first thing the operator sees on the Calendar tab. Regression pins in tools/test-sync-calendar-discoverability.mjs (11 static-source tests) prevent silent removal of either affordance. Closes the "Sync Calendar discoverability" BACKLOG entry.
Adds CHRONICLE.Dashboard.Calendar.OpenSyncCalendar + OpenSyncCalendarHint and a new top-level CHRONICLE.SceneControl.SyncCalendar namespace. Dashboard template gets a primary-action launch row above the Calendar tab's date-sync status panel. 11 static-source regression pins ensure neither the dashboard button nor the scene-control tool can be silently removed.
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.
Bundles two related dispatches that landed in the same session on the same feature branch.
Dispatch 1 — FM-SCRUB-SCHEMA-URL (security)
Operator's production hostname appears in
chronicle-package.json:2(the$schemaadvisory field). That file ships with every module install — every consumer sees the URL. Operator policy: no instance-specific hostnames in shipped artifacts.Fix (1 commit, 2 files):
chronicle-package.json$schemafield entirely (Option A from the dispatch). The schema is server-enforced in Chronicle'sdescriptor.go::loadDescriptor; the field's only value was IDE hint-on-edit, which the operator doesn't need.tools/test-no-instance-hostname.mjs(new)Dispatch 2 — FM-CAL-DASHBOARD-LINK (operator-visible)
Surface
SyncCalendarApplicationfrom two new affordances so the operator doesn't have to dig through Game Settings → Module Settings to find it. Closes the "Sync Calendar discoverability" BACKLOG entry surfaced during the #25 debug session.Affordances:
data-action="open-sync-calendar"ApplicationV2 pattern; handler calls the singletonopenSyncCalendar()helper fromsync-calendar.mjs(GM-only by contract).sync-calendartool. A second tool inside the existingchronicle-syncgroup (calendar-days icon). Registered in both v12 array and v13 object shapes. Inherits the GM-only guard at the top of thegetSceneControlButtonshook.Files (5 commits, 6 files):
scripts/module.mjsopenSyncCalendar; extend the existing scene-controls hook to register thesync-calendartool in both v12+v13 shapes.scripts/sync-dashboard.mjsopenSyncCalendar; wire'open-sync-calendar'action handler; add#onOpenSyncCalendarActionprivate static method.templates/sync-dashboard.hbs.calendar-tab-actionslaunch row at top of the Calendar tab body, before the existing{{#if calendar.available}}block.lang/en.jsonCHRONICLE.Dashboard.Calendar.OpenSyncCalendar+OpenSyncCalendarHint, and a newCHRONICLE.SceneControl.SyncCalendarnamespace.styles/chronicle-sync.css.calendar-tab-actions/.primary-action/.action-hint— sized so the operator's first glance lands on the button.tools/test-sync-calendar-discoverability.mjs(new)Acceptance
grep -rn "bnuuy" --include="*.json" --include="*.mjs" --include="*.md" --include="*.hbs" --include="*.css" --include="*.yml" .returns nothing.chronicle-package.jsonparses as valid JSON; descriptor still passesloadDescriptor(only advisory$schemaremoved).SyncCalendarApplicationis now reachable from two new GM-only entry points without opening Module Settings.Tests
Out of scope
chronicle-package.json's structure (only the offending line dropped).Commits
Generated by Claude Code