ReaderTerminal ⛶
⬆ upassets/svg/[email protected]common.jscordova_plugins.jscordova.jsdefault-node_modules_ionic_core_components_animation_js.jsdefault-node_modules_ionic_core_dist_esm_data-GIsHsYIB_js.jsdefault-node_modules_ionic_core_dist_esm_input_utils-zWijNCrx_js-node_modules_ionic_core_dist-2e0994.jsdefault-src_app_pages_left_left_page_ts.jsdefault-src_app_pages_map_map_page_ts.jsdefault-src_app_pages_times_times_page_ts.jsicon_address.pngicon_cav.pngicon_hazard.pngicon_intersection.pngicon_premise_hazard.pngicon_premise.pngicon_problem.pngicon_ttimes_01_REC.pngicon_ttimes_02_NTF.pngicon_ttimes_03_ENR.pngicon_ttimes_04_ARR.pngicon_ttimes_05_PTC.pngicon_ttimes_06_DPT.pngicon_ttimes_07_ARD.pngicon_ttimes_08_TOC.pngindex.htmlloadingAnimation.gifmain.jsnode_modules_capacitor_app_dist_esm_web_js.jsnode_modules_capacitor_app-launcher_dist_esm_web_js.jsnode_modules_capacitor_device_dist_esm_web_js.jsnode_modules_capacitor_geolocation_dist_esm_web_js.jsnode_modules_capacitor_splash-screen_dist_esm_web_js.jsnode_modules_ionic_core_components_ios_transition_js.jsnode_modules_ionic_core_components_md_transition_js.jsnode_modules_ionic_core_dist_esm_index-CWbP1eJz_js.jsnode_modules_ionic_core_dist_esm_input-shims-C3lNp93k_js.jsnode_modules_ionic_core_dist_esm_ion-accordion_2_entry_js.jsnode_modules_ionic_core_dist_esm_ion-action-sheet_entry_js.jsnode_modules_ionic_core_dist_esm_ion-alert_entry_js.jsnode_modules_ionic_core_dist_esm_ion-app_8_entry_js.jsnode_modules_ionic_core_dist_esm_ion-avatar_3_entry_js.jsnode_modules_ionic_core_dist_esm_ion-back-button_entry_js.jsnode_modules_ionic_core_dist_esm_ion-backdrop_entry_js.jsnode_modules_ionic_core_dist_esm_ion-breadcrumb_2_entry_js.jsnode_modules_ionic_core_dist_esm_ion-button_2_entry_js.jsnode_modules_ionic_core_dist_esm_ion-card_5_entry_js.jsnode_modules_ionic_core_dist_esm_ion-checkbox_entry_js.jsnode_modules_ionic_core_dist_esm_ion-chip_entry_js.jsnode_modules_ionic_core_dist_esm_ion-col_3_entry_js.jsnode_modules_ionic_core_dist_esm_ion-datetime_3_entry_js.jsnode_modules_ionic_core_dist_esm_ion-datetime-button_entry_js.jsnode_modules_ionic_core_dist_esm_ion-fab_3_entry_js.jsnode_modules_ionic_core_dist_esm_ion-img_entry_js.jsnode_modules_ionic_core_dist_esm_ion-infinite-scroll_2_entry_js.jsnode_modules_ionic_core_dist_esm_ion-input_entry_js.jsnode_modules_ionic_core_dist_esm_ion-input-otp_entry_js.jsnode_modules_ionic_core_dist_esm_ion-input-password-toggle_entry_js.jsnode_modules_ionic_core_dist_esm_ion-item_8_entry_js.jsnode_modules_ionic_core_dist_esm_ion-item-option_3_entry_js.jsnode_modules_ionic_core_dist_esm_ion-loading_entry_js.jsnode_modules_ionic_core_dist_esm_ion-menu_3_entry_js.jsnode_modules_ionic_core_dist_esm_ion-modal_entry_js.jsnode_modules_ionic_core_dist_esm_ion-nav_2_entry_js.jsnode_modules_ionic_core_dist_esm_ion-picker_entry_js.jsnode_modules_ionic_core_dist_esm_ion-picker-column_entry_js.jsnode_modules_ionic_core_dist_esm_ion-picker-column-option_entry_js.jsnode_modules_ionic_core_dist_esm_ion-popover_entry_js.jsnode_modules_ionic_core_dist_esm_ion-progress-bar_entry_js.jsnode_modules_ionic_core_dist_esm_ion-radio_2_entry_js.jsnode_modules_ionic_core_dist_esm_ion-range_entry_js.jsnode_modules_ionic_core_dist_esm_ion-refresher_2_entry_js.jsnode_modules_ionic_core_dist_esm_ion-reorder_2_entry_js.jsnode_modules_ionic_core_dist_esm_ion-ripple-effect_entry_js.jsnode_modules_ionic_core_dist_esm_ion-route_4_entry_js.jsnode_modules_ionic_core_dist_esm_ion-searchbar_entry_js.jsnode_modules_ionic_core_dist_esm_ion-segment_2_entry_js.jsnode_modules_ionic_core_dist_esm_ion-segment-content_entry_js.jsnode_modules_ionic_core_dist_esm_ion-segment-view_entry_js.jsnode_modules_ionic_core_dist_esm_ion-select_3_entry_js.jsnode_modules_ionic_core_dist_esm_ion-select-modal_entry_js.jsnode_modules_ionic_core_dist_esm_ion-spinner_entry_js.jsnode_modules_ionic_core_dist_esm_ion-split-pane_entry_js.jsnode_modules_ionic_core_dist_esm_ion-tab_2_entry_js.jsnode_modules_ionic_core_dist_esm_ion-tab-bar_2_entry_js.jsnode_modules_ionic_core_dist_esm_ion-text_entry_js.jsnode_modules_ionic_core_dist_esm_ion-textarea_entry_js.jsnode_modules_ionic_core_dist_esm_ion-toast_entry_js.jsnode_modules_ionic_core_dist_esm_ion-toggle_entry_js.jsnode_modules_ionic_core_dist_esm_status-tap-7t9T91bG_js.jsPIX_bottom_left_btn_bkgrnd_slide2.pngpolyfills.jsruntime.jssrc_app_components_address-header_address-header_component_ts.jssrc_app_pages_comments_comments_page_ts-src_app_pages_details_details_page_ts.jssrc_app_pages_comments_comments_page_ts.jssrc_app_pages_details_details_page_ts.jssrc_app_pages_routes_routes_page_ts.jssrc_app_pages_split_split_page_ts.jsstyles.cssttimes_row_col2.pngttimes_row_col4.pngvendor.js
Pick a file in Files to edit it here.
Terminal⛶ Full

 The whole pipeline is now written. Here's what that gets you:

  The one-time migration (your next hub-open does this automatically):
  migrate.ps1 becomes the box-side dashboard-app.ps1. Since your stable launcher cats that file every time you open the hub, opening it once will: download +
  checksum-verify the new app → uninstall the old crap (the .NET ReactorSync service, ReactorSyncTray, the Pull/Push/Run scheduled tasks, the WPF hub, the old
  launcher dir) → install the WinUI app with fresh shortcuts + Add/Remove Programs entry → launch it. It keeps your ssh key + config, and it
  downloads-then-verifies before removing anything, so a failed download leaves your current hub intact.

  Self-update forever after: UpdateService.cs — on launch the app checks latest.json on the box; if there's a newer version it shows a "Restart & update" bar,
  pulls the zip over scp, verifies the SHA-256, swaps itself, and relaunches. No reinstall, ever again. Every future change (including the real sync data, which
  is next) ships by just bumping <Version> and pushing.

  What I validated: publish-to-box.sh passes bash -n; the migrator matches your existing working PS scripts. I cannot compile the C#/XAML here (Linux) — CI is
  the compiler, and the first run may need a version-pin nudge, which I'll fix.

  Three live steps remain, and they need your go because they touch your real repo + laptop:

  1. Push to main → triggers CI to build/zip the app. (Safe, reversible — just a build.)
  2. publish-to-box.sh 11 on the box → stages the artifact into your control plane.
  3. Flip dashboard-app.ps1 → this is the switch that makes your next hub-open migrate. Rollback is one command on my side (re-seed the old WPF hub), so it's not
  a trap.

  Say "go" and I'll push, watch CI, fix anything red, then stage + flip — and tell you to open your hub.

  Or, if you'd rather eyeball the actual .exe before I flip your live hub, say so — I'll push + build, hand you the CI artifact to run once, and only flip after
  you confirm it opens. Which way?

 Baked for 11m 4s


❯ 
⏵⏵ bypass permissions on (shift+tab to cycle) · ← for agents
FilesEditorTerminal