@omega.js/extension 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (684) hide show
  1. package/LICENSE +98 -0
  2. package/README.md +194 -0
  3. package/bin/omega +2 -0
  4. package/bin/omega-extension +2 -0
  5. package/bin/omg +2 -0
  6. package/dist/assets/css/bundles/.gitkeep +0 -0
  7. package/dist/assets/css/components/content/index.scss +5 -0
  8. package/dist/assets/css/components/options/index.scss +9 -0
  9. package/dist/assets/css/components/pages/index.scss +5 -0
  10. package/dist/assets/css/components/popup/index.scss +9 -0
  11. package/dist/assets/css/core/_animations.scss +64 -0
  12. package/dist/assets/css/core/_fontawesome.scss +146 -0
  13. package/dist/assets/css/core/_initialize.scss +23 -0
  14. package/dist/assets/css/core/_utilities.scss +80 -0
  15. package/dist/assets/css/omega-extension.scss +43 -0
  16. package/dist/assets/css/shell/_index.scss +207 -0
  17. package/dist/assets/css/tokens/_index.scss +166 -0
  18. package/dist/assets/js/core/app-shell.js +136 -0
  19. package/dist/assets/js/libs/initialize-tooltips.js +31 -0
  20. package/dist/assets/js/libs/recaptcha.js +94 -0
  21. package/dist/assets/js/main.js +4 -0
  22. package/dist/assets/themes/_template/README.md +115 -0
  23. package/dist/assets/themes/_template/_config.scss +60 -0
  24. package/dist/assets/themes/_template/_theme.js +14 -0
  25. package/dist/assets/themes/_template/_theme.scss +28 -0
  26. package/dist/assets/themes/_template/css/base/_root.scss +19 -0
  27. package/dist/assets/themes/_template/css/components/_components.scss +23 -0
  28. package/dist/assets/themes/base/README.md +5 -0
  29. package/dist/assets/themes/base/_components/data/org-chart/component.html +33 -0
  30. package/dist/assets/themes/base/_components/data/org-chart/component.json5 +33 -0
  31. package/dist/assets/themes/base/_components/data/org-chart/component.scss +183 -0
  32. package/dist/assets/themes/base/_components/heading/masthead/component.html +22 -0
  33. package/dist/assets/themes/base/_components/heading/masthead/component.json5 +30 -0
  34. package/dist/assets/themes/base/_components/heading/section-head/component.html +18 -0
  35. package/dist/assets/themes/base/_components/heading/section-head/component.json5 +27 -0
  36. package/dist/assets/themes/base/_components/pricing/features/component.html +29 -0
  37. package/dist/assets/themes/base/_components/pricing/features/component.json5 +30 -0
  38. package/dist/assets/themes/base/_hero/orbit/index.html +30 -0
  39. package/dist/assets/themes/base/_hero/orbit/script.js +33 -0
  40. package/dist/assets/themes/base/_hero/orbit/style.scss +133 -0
  41. package/dist/assets/themes/base/_includes/admin/sections/sidebar.html +3 -0
  42. package/dist/assets/themes/base/_includes/admin/sections/topbar.html +3 -0
  43. package/dist/assets/themes/base/_includes/backend/sections/sidebar.html +3 -0
  44. package/dist/assets/themes/base/_includes/backend/sections/topbar.html +3 -0
  45. package/dist/assets/themes/base/_includes/frontend/components/connection-card.html +49 -0
  46. package/dist/assets/themes/base/_includes/frontend/components/post-card.html +54 -0
  47. package/dist/assets/themes/base/_includes/frontend/sections/account-connections.html +42 -0
  48. package/dist/assets/themes/base/_includes/frontend/sections/account-section-header.html +11 -0
  49. package/dist/assets/themes/base/_includes/frontend/sections/footer.html +154 -0
  50. package/dist/assets/themes/base/_includes/frontend/sections/nav.html +276 -0
  51. package/dist/assets/themes/base/_includes/global/sections/account.html +72 -0
  52. package/dist/assets/themes/base/_includes/global/sections/app-sidebar.html +248 -0
  53. package/dist/assets/themes/base/_includes/global/sections/app-topbar.html +228 -0
  54. package/dist/assets/themes/base/_includes/global/sections/page-header.html +99 -0
  55. package/dist/assets/themes/base/_layouts/admin/core/minimal-viewport-locked.html +22 -0
  56. package/dist/assets/themes/base/_layouts/admin/core/minimal.html +23 -0
  57. package/dist/assets/themes/base/_layouts/backend/core/base.html +57 -0
  58. package/dist/assets/themes/base/_layouts/backend/core/minimal-viewport-locked.html +32 -0
  59. package/dist/assets/themes/base/_layouts/backend/core/minimal.html +32 -0
  60. package/dist/assets/themes/base/_layouts/backend/pages/dashboard/index.html +230 -0
  61. package/dist/assets/themes/base/_layouts/frontend/core/base.html +31 -0
  62. package/dist/assets/themes/base/_layouts/frontend/core/cover.html +40 -0
  63. package/dist/assets/themes/base/_layouts/frontend/core/minimal.html +47 -0
  64. package/dist/assets/themes/base/_layouts/frontend/pages/404.html +54 -0
  65. package/dist/assets/themes/base/_layouts/frontend/pages/about.html +144 -0
  66. package/dist/assets/themes/base/_layouts/frontend/pages/account/index.html +2104 -0
  67. package/dist/assets/themes/base/_layouts/frontend/pages/alternatives/alternative.html +319 -0
  68. package/dist/assets/themes/base/_layouts/frontend/pages/alternatives/index.html +186 -0
  69. package/dist/assets/themes/base/_layouts/frontend/pages/app.html +142 -0
  70. package/dist/assets/themes/base/_layouts/frontend/pages/auth/reset.html +53 -0
  71. package/dist/assets/themes/base/_layouts/frontend/pages/auth/signin.html +90 -0
  72. package/dist/assets/themes/base/_layouts/frontend/pages/auth/signup.html +141 -0
  73. package/dist/assets/themes/base/_layouts/frontend/pages/auth/token.html +44 -0
  74. package/dist/assets/themes/base/_layouts/frontend/pages/blog/categories/category.html +88 -0
  75. package/dist/assets/themes/base/_layouts/frontend/pages/blog/categories/index.html +88 -0
  76. package/dist/assets/themes/base/_layouts/frontend/pages/blog/index.html +255 -0
  77. package/dist/assets/themes/base/_layouts/frontend/pages/blog/post.html +261 -0
  78. package/dist/assets/themes/base/_layouts/frontend/pages/blog/tags/index.html +84 -0
  79. package/dist/assets/themes/base/_layouts/frontend/pages/blog/tags/tag.html +88 -0
  80. package/dist/assets/themes/base/_layouts/frontend/pages/collection/category.html +72 -0
  81. package/dist/assets/themes/base/_layouts/frontend/pages/collection/document.html +54 -0
  82. package/dist/assets/themes/base/_layouts/frontend/pages/collection/index.html +84 -0
  83. package/dist/assets/themes/base/_layouts/frontend/pages/connections/callback.html +55 -0
  84. package/dist/assets/themes/base/_layouts/frontend/pages/contact.html +214 -0
  85. package/dist/assets/themes/base/_layouts/frontend/pages/download.html +793 -0
  86. package/dist/assets/themes/base/_layouts/frontend/pages/extension/index.html +253 -0
  87. package/dist/assets/themes/base/_layouts/frontend/pages/extension/installed.html +198 -0
  88. package/dist/assets/themes/base/_layouts/frontend/pages/feedback.html +171 -0
  89. package/dist/assets/themes/base/_layouts/frontend/pages/index.html +66 -0
  90. package/dist/assets/themes/base/_layouts/frontend/pages/legal/document.html +78 -0
  91. package/dist/assets/themes/base/_layouts/frontend/pages/payment/checkout.html +459 -0
  92. package/dist/assets/themes/base/_layouts/frontend/pages/payment/confirmation.html +131 -0
  93. package/dist/assets/themes/base/_layouts/frontend/pages/portal/email-preferences.html +104 -0
  94. package/dist/assets/themes/base/_layouts/frontend/pages/pricing.html +596 -0
  95. package/dist/assets/themes/base/_layouts/frontend/pages/status.html +361 -0
  96. package/dist/assets/themes/base/_layouts/frontend/pages/team/index.html +210 -0
  97. package/dist/assets/themes/base/_layouts/frontend/pages/team/member.html +125 -0
  98. package/dist/assets/themes/base/_layouts/frontend/pages/updates/index.html +119 -0
  99. package/dist/assets/themes/base/_layouts/frontend/pages/updates/update.html +118 -0
  100. package/dist/assets/themes/base/_sections/about/hero/section.html +68 -0
  101. package/dist/assets/themes/base/_sections/about/hero/section.json5 +58 -0
  102. package/dist/assets/themes/base/_sections/about/letter/section.html +60 -0
  103. package/dist/assets/themes/base/_sections/about/letter/section.json5 +56 -0
  104. package/dist/assets/themes/base/_sections/about/photo-band/section.html +24 -0
  105. package/dist/assets/themes/base/_sections/about/photo-band/section.json5 +23 -0
  106. package/dist/assets/themes/base/_sections/about/principles/section.html +17 -0
  107. package/dist/assets/themes/base/_sections/about/principles/section.json5 +34 -0
  108. package/dist/assets/themes/base/_sections/about/timeline/section.html +20 -0
  109. package/dist/assets/themes/base/_sections/about/timeline/section.json5 +34 -0
  110. package/dist/assets/themes/base/_sections/marketing/bento/section.html +91 -0
  111. package/dist/assets/themes/base/_sections/marketing/bento/section.json5 +152 -0
  112. package/dist/assets/themes/base/_sections/marketing/cta/section.html +44 -0
  113. package/dist/assets/themes/base/_sections/marketing/cta/section.json5 +47 -0
  114. package/dist/assets/themes/base/_sections/marketing/faq/section.html +52 -0
  115. package/dist/assets/themes/base/_sections/marketing/faq/section.json5 +68 -0
  116. package/dist/assets/themes/base/_sections/marketing/hero/section.html +349 -0
  117. package/dist/assets/themes/base/_sections/marketing/hero/section.json5 +335 -0
  118. package/dist/assets/themes/base/_sections/marketing/newsletter-cta/section.html +38 -0
  119. package/dist/assets/themes/base/_sections/marketing/newsletter-cta/section.js +86 -0
  120. package/dist/assets/themes/base/_sections/marketing/newsletter-cta/section.json5 +29 -0
  121. package/dist/assets/themes/base/_sections/marketing/pricing-cards/section.html +115 -0
  122. package/dist/assets/themes/base/_sections/marketing/pricing-cards/section.json5 +72 -0
  123. package/dist/assets/themes/base/_sections/marketing/product-demo/section.html +62 -0
  124. package/dist/assets/themes/base/_sections/marketing/product-demo/section.js +44 -0
  125. package/dist/assets/themes/base/_sections/marketing/product-demo/section.json5 +52 -0
  126. package/dist/assets/themes/base/_sections/marketing/prose/section.html +22 -0
  127. package/dist/assets/themes/base/_sections/marketing/prose/section.json5 +41 -0
  128. package/dist/assets/themes/base/_sections/marketing/showcase/section.html +35 -0
  129. package/dist/assets/themes/base/_sections/marketing/showcase/section.json5 +52 -0
  130. package/dist/assets/themes/base/_sections/marketing/stats/section.html +32 -0
  131. package/dist/assets/themes/base/_sections/marketing/stats/section.json5 +44 -0
  132. package/dist/assets/themes/base/_sections/marketing/testimonials/section.html +54 -0
  133. package/dist/assets/themes/base/_sections/marketing/testimonials/section.json5 +70 -0
  134. package/dist/assets/themes/base/_sections/marketing/trusted-by/section.html +30 -0
  135. package/dist/assets/themes/base/_sections/marketing/trusted-by/section.json5 +38 -0
  136. package/dist/assets/themes/base/_sections/verts/unit/section.html +7 -0
  137. package/dist/assets/themes/base/_sections/verts/unit/section.js +22 -0
  138. package/dist/assets/themes/base/_sections/verts/unit/section.json5 +24 -0
  139. package/dist/assets/themes/base/_sections/verts/unit/section.scss +24 -0
  140. package/dist/assets/themes/base/_theme.js +13 -0
  141. package/dist/assets/themes/base/_theme.scss +4 -0
  142. package/dist/assets/themes/bootstrap/_theme.js +16 -0
  143. package/dist/assets/themes/bootstrap/_theme.scss +11 -0
  144. package/dist/assets/themes/bootstrap/js/index.esm.js +19 -0
  145. package/dist/assets/themes/bootstrap/js/index.umd.js +34 -0
  146. package/dist/assets/themes/bootstrap/js/src/alert.js +87 -0
  147. package/dist/assets/themes/bootstrap/js/src/base-component.js +86 -0
  148. package/dist/assets/themes/bootstrap/js/src/button.js +72 -0
  149. package/dist/assets/themes/bootstrap/js/src/carousel.js +474 -0
  150. package/dist/assets/themes/bootstrap/js/src/collapse.js +297 -0
  151. package/dist/assets/themes/bootstrap/js/src/dom/data.js +55 -0
  152. package/dist/assets/themes/bootstrap/js/src/dom/event-handler.js +317 -0
  153. package/dist/assets/themes/bootstrap/js/src/dom/manipulator.js +71 -0
  154. package/dist/assets/themes/bootstrap/js/src/dom/selector-engine.js +126 -0
  155. package/dist/assets/themes/bootstrap/js/src/dropdown.js +458 -0
  156. package/dist/assets/themes/bootstrap/js/src/modal.js +378 -0
  157. package/dist/assets/themes/bootstrap/js/src/offcanvas.js +282 -0
  158. package/dist/assets/themes/bootstrap/js/src/popover.js +97 -0
  159. package/dist/assets/themes/bootstrap/js/src/scrollspy.js +296 -0
  160. package/dist/assets/themes/bootstrap/js/src/tab.js +315 -0
  161. package/dist/assets/themes/bootstrap/js/src/toast.js +224 -0
  162. package/dist/assets/themes/bootstrap/js/src/tooltip.js +632 -0
  163. package/dist/assets/themes/bootstrap/js/src/util/backdrop.js +151 -0
  164. package/dist/assets/themes/bootstrap/js/src/util/component-functions.js +35 -0
  165. package/dist/assets/themes/bootstrap/js/src/util/config.js +65 -0
  166. package/dist/assets/themes/bootstrap/js/src/util/focustrap.js +115 -0
  167. package/dist/assets/themes/bootstrap/js/src/util/index.js +306 -0
  168. package/dist/assets/themes/bootstrap/js/src/util/sanitizer.js +117 -0
  169. package/dist/assets/themes/bootstrap/js/src/util/scrollbar.js +114 -0
  170. package/dist/assets/themes/bootstrap/js/src/util/swipe.js +146 -0
  171. package/dist/assets/themes/bootstrap/js/src/util/template-factory.js +160 -0
  172. package/dist/assets/themes/bootstrap/overrides/_accordion.scss +21 -0
  173. package/dist/assets/themes/bootstrap/overrides/_avatars.scss +51 -0
  174. package/dist/assets/themes/bootstrap/overrides/_blog-images.scss +45 -0
  175. package/dist/assets/themes/bootstrap/overrides/_buttons-adaptive.scss +141 -0
  176. package/dist/assets/themes/bootstrap/overrides/_color-shades.scss +25 -0
  177. package/dist/assets/themes/bootstrap/overrides/_cursor-utilities.scss +13 -0
  178. package/dist/assets/themes/bootstrap/overrides/_index.scss +30 -0
  179. package/dist/assets/themes/bootstrap/overrides/_links.scss +26 -0
  180. package/dist/assets/themes/bootstrap/overrides/_soft-colors.scss +99 -0
  181. package/dist/assets/themes/bootstrap/overrides/_spacing-extended.scss +74 -0
  182. package/dist/assets/themes/bootstrap/overrides/_spinners.scss +22 -0
  183. package/dist/assets/themes/bootstrap/overrides/_typography-utilities.scss +40 -0
  184. package/dist/assets/themes/bootstrap/scss/_accordion.scss +153 -0
  185. package/dist/assets/themes/bootstrap/scss/_alert.scss +68 -0
  186. package/dist/assets/themes/bootstrap/scss/_badge.scss +38 -0
  187. package/dist/assets/themes/bootstrap/scss/_breadcrumb.scss +40 -0
  188. package/dist/assets/themes/bootstrap/scss/_button-group.scss +147 -0
  189. package/dist/assets/themes/bootstrap/scss/_buttons.scss +216 -0
  190. package/dist/assets/themes/bootstrap/scss/_card.scss +238 -0
  191. package/dist/assets/themes/bootstrap/scss/_carousel.scss +226 -0
  192. package/dist/assets/themes/bootstrap/scss/_close.scss +66 -0
  193. package/dist/assets/themes/bootstrap/scss/_containers.scss +41 -0
  194. package/dist/assets/themes/bootstrap/scss/_dropdown.scss +250 -0
  195. package/dist/assets/themes/bootstrap/scss/_forms.scss +9 -0
  196. package/dist/assets/themes/bootstrap/scss/_functions.scss +302 -0
  197. package/dist/assets/themes/bootstrap/scss/_grid.scss +39 -0
  198. package/dist/assets/themes/bootstrap/scss/_helpers.scss +12 -0
  199. package/dist/assets/themes/bootstrap/scss/_images.scss +42 -0
  200. package/dist/assets/themes/bootstrap/scss/_list-group.scss +199 -0
  201. package/dist/assets/themes/bootstrap/scss/_maps.scss +174 -0
  202. package/dist/assets/themes/bootstrap/scss/_mixins.scss +42 -0
  203. package/dist/assets/themes/bootstrap/scss/_modal.scss +240 -0
  204. package/dist/assets/themes/bootstrap/scss/_nav.scss +197 -0
  205. package/dist/assets/themes/bootstrap/scss/_navbar.scss +289 -0
  206. package/dist/assets/themes/bootstrap/scss/_offcanvas.scss +147 -0
  207. package/dist/assets/themes/bootstrap/scss/_pagination.scss +109 -0
  208. package/dist/assets/themes/bootstrap/scss/_placeholders.scss +51 -0
  209. package/dist/assets/themes/bootstrap/scss/_popover.scss +196 -0
  210. package/dist/assets/themes/bootstrap/scss/_progress.scss +68 -0
  211. package/dist/assets/themes/bootstrap/scss/_reboot.scss +611 -0
  212. package/dist/assets/themes/bootstrap/scss/_root.scss +187 -0
  213. package/dist/assets/themes/bootstrap/scss/_spinners.scss +85 -0
  214. package/dist/assets/themes/bootstrap/scss/_tables.scss +171 -0
  215. package/dist/assets/themes/bootstrap/scss/_toasts.scss +73 -0
  216. package/dist/assets/themes/bootstrap/scss/_tooltip.scss +119 -0
  217. package/dist/assets/themes/bootstrap/scss/_transitions.scss +27 -0
  218. package/dist/assets/themes/bootstrap/scss/_type.scss +106 -0
  219. package/dist/assets/themes/bootstrap/scss/_utilities.scss +806 -0
  220. package/dist/assets/themes/bootstrap/scss/_variables-dark.scss +102 -0
  221. package/dist/assets/themes/bootstrap/scss/_variables.scss +1753 -0
  222. package/dist/assets/themes/bootstrap/scss/bootstrap-grid.scss +62 -0
  223. package/dist/assets/themes/bootstrap/scss/bootstrap-reboot.scss +10 -0
  224. package/dist/assets/themes/bootstrap/scss/bootstrap-utilities.scss +19 -0
  225. package/dist/assets/themes/bootstrap/scss/bootstrap.scss +52 -0
  226. package/dist/assets/themes/bootstrap/scss/forms/_floating-labels.scss +97 -0
  227. package/dist/assets/themes/bootstrap/scss/forms/_form-check.scss +189 -0
  228. package/dist/assets/themes/bootstrap/scss/forms/_form-control.scss +214 -0
  229. package/dist/assets/themes/bootstrap/scss/forms/_form-range.scss +91 -0
  230. package/dist/assets/themes/bootstrap/scss/forms/_form-select.scss +80 -0
  231. package/dist/assets/themes/bootstrap/scss/forms/_form-text.scss +11 -0
  232. package/dist/assets/themes/bootstrap/scss/forms/_input-group.scss +132 -0
  233. package/dist/assets/themes/bootstrap/scss/forms/_labels.scss +36 -0
  234. package/dist/assets/themes/bootstrap/scss/forms/_validation.scss +12 -0
  235. package/dist/assets/themes/bootstrap/scss/helpers/_clearfix.scss +3 -0
  236. package/dist/assets/themes/bootstrap/scss/helpers/_color-bg.scss +7 -0
  237. package/dist/assets/themes/bootstrap/scss/helpers/_colored-links.scss +30 -0
  238. package/dist/assets/themes/bootstrap/scss/helpers/_focus-ring.scss +5 -0
  239. package/dist/assets/themes/bootstrap/scss/helpers/_icon-link.scss +25 -0
  240. package/dist/assets/themes/bootstrap/scss/helpers/_position.scss +36 -0
  241. package/dist/assets/themes/bootstrap/scss/helpers/_ratio.scss +26 -0
  242. package/dist/assets/themes/bootstrap/scss/helpers/_stacks.scss +15 -0
  243. package/dist/assets/themes/bootstrap/scss/helpers/_stretched-link.scss +15 -0
  244. package/dist/assets/themes/bootstrap/scss/helpers/_text-truncation.scss +7 -0
  245. package/dist/assets/themes/bootstrap/scss/helpers/_visually-hidden.scss +8 -0
  246. package/dist/assets/themes/bootstrap/scss/helpers/_vr.scss +8 -0
  247. package/dist/assets/themes/bootstrap/scss/mixins/_alert.scss +18 -0
  248. package/dist/assets/themes/bootstrap/scss/mixins/_backdrop.scss +14 -0
  249. package/dist/assets/themes/bootstrap/scss/mixins/_banner.scss +7 -0
  250. package/dist/assets/themes/bootstrap/scss/mixins/_border-radius.scss +78 -0
  251. package/dist/assets/themes/bootstrap/scss/mixins/_box-shadow.scss +18 -0
  252. package/dist/assets/themes/bootstrap/scss/mixins/_breakpoints.scss +127 -0
  253. package/dist/assets/themes/bootstrap/scss/mixins/_buttons.scss +70 -0
  254. package/dist/assets/themes/bootstrap/scss/mixins/_caret.scss +69 -0
  255. package/dist/assets/themes/bootstrap/scss/mixins/_clearfix.scss +9 -0
  256. package/dist/assets/themes/bootstrap/scss/mixins/_color-mode.scss +21 -0
  257. package/dist/assets/themes/bootstrap/scss/mixins/_color-scheme.scss +7 -0
  258. package/dist/assets/themes/bootstrap/scss/mixins/_container.scss +11 -0
  259. package/dist/assets/themes/bootstrap/scss/mixins/_deprecate.scss +10 -0
  260. package/dist/assets/themes/bootstrap/scss/mixins/_forms.scss +163 -0
  261. package/dist/assets/themes/bootstrap/scss/mixins/_gradients.scss +47 -0
  262. package/dist/assets/themes/bootstrap/scss/mixins/_grid.scss +151 -0
  263. package/dist/assets/themes/bootstrap/scss/mixins/_image.scss +16 -0
  264. package/dist/assets/themes/bootstrap/scss/mixins/_list-group.scss +26 -0
  265. package/dist/assets/themes/bootstrap/scss/mixins/_lists.scss +7 -0
  266. package/dist/assets/themes/bootstrap/scss/mixins/_pagination.scss +10 -0
  267. package/dist/assets/themes/bootstrap/scss/mixins/_reset-text.scss +17 -0
  268. package/dist/assets/themes/bootstrap/scss/mixins/_resize.scss +6 -0
  269. package/dist/assets/themes/bootstrap/scss/mixins/_table-variants.scss +24 -0
  270. package/dist/assets/themes/bootstrap/scss/mixins/_text-truncate.scss +8 -0
  271. package/dist/assets/themes/bootstrap/scss/mixins/_transition.scss +26 -0
  272. package/dist/assets/themes/bootstrap/scss/mixins/_utilities.scss +97 -0
  273. package/dist/assets/themes/bootstrap/scss/mixins/_visually-hidden.scss +38 -0
  274. package/dist/assets/themes/bootstrap/scss/tests/jasmine.js +16 -0
  275. package/dist/assets/themes/bootstrap/scss/tests/mixins/_auto-import-of-variables-dark.test.scss +7 -0
  276. package/dist/assets/themes/bootstrap/scss/tests/mixins/_color-modes.test.scss +69 -0
  277. package/dist/assets/themes/bootstrap/scss/tests/mixins/_media-query-color-mode-full.test.scss +8 -0
  278. package/dist/assets/themes/bootstrap/scss/tests/mixins/_utilities.test.scss +393 -0
  279. package/dist/assets/themes/bootstrap/scss/tests/sass-true/register.js +14 -0
  280. package/dist/assets/themes/bootstrap/scss/tests/sass-true/runner.js +17 -0
  281. package/dist/assets/themes/bootstrap/scss/tests/utilities/_api.test.scss +75 -0
  282. package/dist/assets/themes/bootstrap/scss/utilities/_api.scss +47 -0
  283. package/dist/assets/themes/bootstrap/scss/vendor/_rfs.scss +348 -0
  284. package/dist/assets/themes/classy/README.md +89 -0
  285. package/dist/assets/themes/classy/_config.scss +245 -0
  286. package/dist/assets/themes/classy/_theme.js +31 -0
  287. package/dist/assets/themes/classy/_theme.scss +57 -0
  288. package/dist/assets/themes/classy/css/app/_panels.scss +183 -0
  289. package/dist/assets/themes/classy/css/base/_fonts.scss +79 -0
  290. package/dist/assets/themes/classy/css/base/_no-raise.scss +49 -0
  291. package/dist/assets/themes/classy/css/base/_root.scss +113 -0
  292. package/dist/assets/themes/classy/css/base/_typography.scss +154 -0
  293. package/dist/assets/themes/classy/css/base/_utilities.scss +284 -0
  294. package/dist/assets/themes/classy/css/components/_alerts.scss +51 -0
  295. package/dist/assets/themes/classy/css/components/_badges.scss +46 -0
  296. package/dist/assets/themes/classy/css/components/_buttons.scss +175 -0
  297. package/dist/assets/themes/classy/css/components/_cards.scss +41 -0
  298. package/dist/assets/themes/classy/css/components/_dropdowns.scss +48 -0
  299. package/dist/assets/themes/classy/css/components/_forms.scss +171 -0
  300. package/dist/assets/themes/classy/css/components/_receipt.scss +45 -0
  301. package/dist/assets/themes/classy/css/layout/_footer.scss +298 -0
  302. package/dist/assets/themes/classy/css/layout/_general.scss +209 -0
  303. package/dist/assets/themes/classy/css/layout/_nav.scss +154 -0
  304. package/dist/assets/themes/classy/css/layout/_shell.scss +458 -0
  305. package/dist/assets/themes/classy/css/marketing/_bento.scss +238 -0
  306. package/dist/assets/themes/classy/css/marketing/_content.scss +1328 -0
  307. package/dist/assets/themes/classy/css/marketing/_downloads.scss +246 -0
  308. package/dist/assets/themes/classy/css/marketing/_hero.scss +311 -0
  309. package/dist/assets/themes/classy/css/marketing/_sections.scss +649 -0
  310. package/dist/assets/themes/classy/css/pages/404/index.scss +67 -0
  311. package/dist/assets/themes/classy/css/pages/_auth.scss +235 -0
  312. package/dist/assets/themes/classy/css/pages/admin/firebase/index.scss +22 -0
  313. package/dist/assets/themes/classy/css/pages/blog/[slug].scss +56 -0
  314. package/dist/assets/themes/classy/css/pages/cookies.scss +2 -0
  315. package/dist/assets/themes/classy/css/pages/dashboard/account/index.scss +31 -0
  316. package/dist/assets/themes/classy/css/pages/feedback/index.scss +39 -0
  317. package/dist/assets/themes/classy/css/pages/legal/_document.scss +192 -0
  318. package/dist/assets/themes/classy/css/pages/payment/checkout/index.scss +585 -0
  319. package/dist/assets/themes/classy/css/pages/payment/confirmation/index.scss +9 -0
  320. package/dist/assets/themes/classy/css/pages/privacy.scss +2 -0
  321. package/dist/assets/themes/classy/css/pages/status/index.scss +164 -0
  322. package/dist/assets/themes/classy/css/pages/terms.scss +2 -0
  323. package/dist/assets/themes/classy/css/pages/updates/index.scss +128 -0
  324. package/dist/assets/themes/classy/fonts/inter-italic-latin-ext.woff2 +0 -0
  325. package/dist/assets/themes/classy/fonts/inter-italic-latin.woff2 +0 -0
  326. package/dist/assets/themes/classy/fonts/inter-normal-latin-ext.woff2 +0 -0
  327. package/dist/assets/themes/classy/fonts/inter-normal-latin.woff2 +0 -0
  328. package/dist/assets/themes/classy/fonts/newsreader-italic-latin-ext.woff2 +0 -0
  329. package/dist/assets/themes/classy/fonts/newsreader-italic-latin.woff2 +0 -0
  330. package/dist/assets/themes/classy/fonts/newsreader-normal-latin-ext.woff2 +0 -0
  331. package/dist/assets/themes/classy/fonts/newsreader-normal-latin.woff2 +0 -0
  332. package/dist/assets/themes/classy/js/hero-demo-form.js +56 -0
  333. package/dist/assets/themes/neobrutalism/README.md +118 -0
  334. package/dist/assets/themes/neobrutalism/_config.scss +139 -0
  335. package/dist/assets/themes/neobrutalism/_layouts/frontend/core/base.html +30 -0
  336. package/dist/assets/themes/neobrutalism/_layouts/frontend/pages/index.html +275 -0
  337. package/dist/assets/themes/neobrutalism/_theme.js +24 -0
  338. package/dist/assets/themes/neobrutalism/_theme.scss +61 -0
  339. package/dist/assets/themes/neobrutalism/css/base/_mixins.scss +46 -0
  340. package/dist/assets/themes/neobrutalism/css/base/_root.scss +169 -0
  341. package/dist/assets/themes/neobrutalism/css/base/_typography.scss +61 -0
  342. package/dist/assets/themes/neobrutalism/css/base/_utilities.scss +89 -0
  343. package/dist/assets/themes/neobrutalism/css/components/_billing-toggle.scss +74 -0
  344. package/dist/assets/themes/neobrutalism/css/components/_buttons.scss +148 -0
  345. package/dist/assets/themes/neobrutalism/css/components/_cards.scss +47 -0
  346. package/dist/assets/themes/neobrutalism/css/components/_forms.scss +88 -0
  347. package/dist/assets/themes/neobrutalism/css/components/_marketing.scss +244 -0
  348. package/dist/assets/themes/neobrutalism/css/layout/_general.scss +213 -0
  349. package/dist/assets/themes/neobrutalism/css/layout/_navigation.scss +171 -0
  350. package/dist/assets/themes/neobrutalism/css/pages/index.scss +203 -0
  351. package/dist/assets/themes/neobrutalism/css/pages/pricing/index.scss +58 -0
  352. package/dist/assets/themes/neobrutalism/css/pages/test/libraries/layers/index.scss +7 -0
  353. package/dist/assets/themes/neobrutalism/js/pages/test/libraries/layers/index.js +9 -0
  354. package/dist/assets/themes/newsflash/README.md +117 -0
  355. package/dist/assets/themes/newsflash/_components/heading/lede/component.html +14 -0
  356. package/dist/assets/themes/newsflash/_components/heading/lede/component.json5 +23 -0
  357. package/dist/assets/themes/newsflash/_components/heading/rule-head/component.html +17 -0
  358. package/dist/assets/themes/newsflash/_components/heading/rule-head/component.json5 +23 -0
  359. package/dist/assets/themes/newsflash/_components/news/byline/component.html +12 -0
  360. package/dist/assets/themes/newsflash/_components/news/byline/component.json5 +18 -0
  361. package/dist/assets/themes/newsflash/_components/news/story-card/component.html +25 -0
  362. package/dist/assets/themes/newsflash/_components/news/story-card/component.json5 +21 -0
  363. package/dist/assets/themes/newsflash/_config.scss +147 -0
  364. package/dist/assets/themes/newsflash/_layouts/frontend/core/base.html +51 -0
  365. package/dist/assets/themes/newsflash/_layouts/frontend/pages/blog/index.html +299 -0
  366. package/dist/assets/themes/newsflash/_layouts/frontend/pages/blog/post.html +235 -0
  367. package/dist/assets/themes/newsflash/_layouts/frontend/pages/index.html +328 -0
  368. package/dist/assets/themes/newsflash/_sections/marketing/desks/section.html +39 -0
  369. package/dist/assets/themes/newsflash/_sections/marketing/desks/section.json5 +49 -0
  370. package/dist/assets/themes/newsflash/_sections/marketing/newsletter-cta/section.html +103 -0
  371. package/dist/assets/themes/newsflash/_sections/marketing/newsletter-cta/section.json5 +50 -0
  372. package/dist/assets/themes/newsflash/_sections/marketing/rundown/section.html +28 -0
  373. package/dist/assets/themes/newsflash/_sections/marketing/rundown/section.json5 +40 -0
  374. package/dist/assets/themes/newsflash/_theme.js +24 -0
  375. package/dist/assets/themes/newsflash/_theme.scss +70 -0
  376. package/dist/assets/themes/newsflash/css/base/_fonts.scss +80 -0
  377. package/dist/assets/themes/newsflash/css/base/_mixins.scss +51 -0
  378. package/dist/assets/themes/newsflash/css/base/_root.scss +257 -0
  379. package/dist/assets/themes/newsflash/css/base/_typography.scss +49 -0
  380. package/dist/assets/themes/newsflash/css/base/_utilities.scss +122 -0
  381. package/dist/assets/themes/newsflash/css/components/_badges.scss +65 -0
  382. package/dist/assets/themes/newsflash/css/components/_billing-toggle.scss +61 -0
  383. package/dist/assets/themes/newsflash/css/components/_buttons.scss +139 -0
  384. package/dist/assets/themes/newsflash/css/components/_cards.scss +47 -0
  385. package/dist/assets/themes/newsflash/css/components/_editorial.scss +173 -0
  386. package/dist/assets/themes/newsflash/css/components/_forms.scss +75 -0
  387. package/dist/assets/themes/newsflash/css/components/_infinite-scroll.scss +102 -0
  388. package/dist/assets/themes/newsflash/css/components/_panels.scss +156 -0
  389. package/dist/assets/themes/newsflash/css/components/_ticker.scss +67 -0
  390. package/dist/assets/themes/newsflash/css/layout/_general.scss +330 -0
  391. package/dist/assets/themes/newsflash/css/layout/_navigation.scss +168 -0
  392. package/dist/assets/themes/newsflash/css/pages/404/index.scss +79 -0
  393. package/dist/assets/themes/newsflash/css/pages/blog/[slug].scss +186 -0
  394. package/dist/assets/themes/newsflash/css/pages/blog/index.scss +17 -0
  395. package/dist/assets/themes/newsflash/css/pages/index.scss +157 -0
  396. package/dist/assets/themes/newsflash/css/pages/pricing/index.scss +55 -0
  397. package/dist/assets/themes/newsflash/css/pages/test/libraries/layers/index.scss +7 -0
  398. package/dist/assets/themes/newsflash/fonts/fraunces-italic-latin-ext.woff2 +0 -0
  399. package/dist/assets/themes/newsflash/fonts/fraunces-italic-latin.woff2 +0 -0
  400. package/dist/assets/themes/newsflash/fonts/fraunces-normal-latin-ext.woff2 +0 -0
  401. package/dist/assets/themes/newsflash/fonts/fraunces-normal-latin.woff2 +0 -0
  402. package/dist/assets/themes/newsflash/fonts/schibsted-grotesk-italic-latin-ext.woff2 +0 -0
  403. package/dist/assets/themes/newsflash/fonts/schibsted-grotesk-italic-latin.woff2 +0 -0
  404. package/dist/assets/themes/newsflash/fonts/schibsted-grotesk-normal-latin-ext.woff2 +0 -0
  405. package/dist/assets/themes/newsflash/fonts/schibsted-grotesk-normal-latin.woff2 +0 -0
  406. package/dist/assets/themes/newsflash/js/pages/blog/[slug].js +29 -0
  407. package/dist/assets/themes/newsflash/js/pages/test/libraries/layers/index.js +9 -0
  408. package/dist/background.js +684 -0
  409. package/dist/build.js +268 -0
  410. package/dist/cli-run.js +25 -0
  411. package/dist/cli.js +30 -0
  412. package/dist/commands/build.js +67 -0
  413. package/dist/commands/clean.js +29 -0
  414. package/dist/commands/deploy.js +97 -0
  415. package/dist/commands/install.js +58 -0
  416. package/dist/commands/lib/dependencies.js +33 -0
  417. package/dist/commands/lib/deploy-precheck.js +57 -0
  418. package/dist/commands/lib/ensure-target.js +151 -0
  419. package/dist/commands/lib/push-secrets.js +60 -0
  420. package/dist/commands/migrate.js +77 -0
  421. package/dist/commands/test.js +110 -0
  422. package/dist/commands/update.js +21 -0
  423. package/dist/commands/version.js +12 -0
  424. package/dist/config/manifest.json +117 -0
  425. package/dist/config/page-template.html +21 -0
  426. package/dist/content.js +37 -0
  427. package/dist/defaults/.github/workflows/publish.yml +86 -0
  428. package/dist/defaults/.nvmrc +1 -0
  429. package/dist/defaults/.vscode/settings.json +8 -0
  430. package/dist/defaults/AGENTS.md +113 -0
  431. package/dist/defaults/CHANGELOG.md +15 -0
  432. package/dist/defaults/CLAUDE.md +1 -0
  433. package/dist/defaults/_.gitignore +75 -0
  434. package/dist/defaults/config/description.md +46 -0
  435. package/dist/defaults/config/messages.json +20 -0
  436. package/dist/defaults/config/omega.json5 +64 -0
  437. package/dist/defaults/docs/README.md +17 -0
  438. package/dist/defaults/gulpfile.js +6 -0
  439. package/dist/defaults/hooks/build/post.js +8 -0
  440. package/dist/defaults/hooks/build/pre.js +8 -0
  441. package/dist/defaults/src/assets/css/bundles/.gitkeep +0 -0
  442. package/dist/defaults/src/assets/css/components/content/index.scss +11 -0
  443. package/dist/defaults/src/assets/css/components/offscreen/index.scss +4 -0
  444. package/dist/defaults/src/assets/css/components/options/index.scss +14 -0
  445. package/dist/defaults/src/assets/css/components/pages/index.scss +10 -0
  446. package/dist/defaults/src/assets/css/components/popup/index.scss +10 -0
  447. package/dist/defaults/src/assets/css/components/sidepanel/index.scss +6 -0
  448. package/dist/defaults/src/assets/css/main.scss +32 -0
  449. package/dist/defaults/src/assets/images/.gitkeep +0 -0
  450. package/dist/defaults/src/assets/js/components/background/index.js +25 -0
  451. package/dist/defaults/src/assets/js/components/content/index.js +22 -0
  452. package/dist/defaults/src/assets/js/components/offscreen/index.js +25 -0
  453. package/dist/defaults/src/assets/js/components/options/index.js +22 -0
  454. package/dist/defaults/src/assets/js/components/pages/index.js +22 -0
  455. package/dist/defaults/src/assets/js/components/popup/index.js +22 -0
  456. package/dist/defaults/src/assets/js/components/sidepanel/index.js +20 -0
  457. package/dist/defaults/src/assets/vendor/.gitkeep +0 -0
  458. package/dist/defaults/src/manifest.json +131 -0
  459. package/dist/defaults/src/views/offscreen/index.html +3 -0
  460. package/dist/defaults/src/views/options/index.html +8 -0
  461. package/dist/defaults/src/views/pages/index.html +10 -0
  462. package/dist/defaults/src/views/popup/index.html +4 -0
  463. package/dist/defaults/src/views/sidepanel/index.html +4 -0
  464. package/dist/defaults/test/README.md +41 -0
  465. package/dist/defaults/test/_init.js +10 -0
  466. package/dist/defaults/test/boot/externally-connectable.test.js +28 -0
  467. package/dist/gulp/config/locales.js +12 -0
  468. package/dist/gulp/main.js +78 -0
  469. package/dist/gulp/tasks/_.js +18 -0
  470. package/dist/gulp/tasks/audit.js +222 -0
  471. package/dist/gulp/tasks/bundle.js +687 -0
  472. package/dist/gulp/tasks/defaults.js +281 -0
  473. package/dist/gulp/tasks/distribute.js +172 -0
  474. package/dist/gulp/tasks/fontawesome.js +25 -0
  475. package/dist/gulp/tasks/html.js +163 -0
  476. package/dist/gulp/tasks/icons.js +126 -0
  477. package/dist/gulp/tasks/package.js +742 -0
  478. package/dist/gulp/tasks/publish.js +417 -0
  479. package/dist/gulp/tasks/sass.js +252 -0
  480. package/dist/gulp/tasks/serve.js +103 -0
  481. package/dist/gulp/tasks/translate.js +252 -0
  482. package/dist/gulp/tasks/utils/build-json.js +43 -0
  483. package/dist/gulp/tasks/utils/template-transform.js +50 -0
  484. package/dist/gulp/templates/BUILD_INSTRUCTIONS.md +69 -0
  485. package/dist/index.js +46 -0
  486. package/dist/lib/affiliatizer.js +224 -0
  487. package/dist/lib/analytics.js +26 -0
  488. package/dist/lib/auth-helpers.js +213 -0
  489. package/dist/lib/extension.js +116 -0
  490. package/dist/lib/icons.js +36 -0
  491. package/dist/lib/logger-lite.js +35 -0
  492. package/dist/lib/logger.js +4 -0
  493. package/dist/lib/messaging.js +48 -0
  494. package/dist/lib/safe-install.js +4 -0
  495. package/dist/lib/theme.js +73 -0
  496. package/dist/lib/verts.js +68 -0
  497. package/dist/offscreen.js +31 -0
  498. package/dist/omega-bin.js +6 -0
  499. package/dist/options.js +80 -0
  500. package/dist/page.js +80 -0
  501. package/dist/popup.js +80 -0
  502. package/dist/sidepanel.js +80 -0
  503. package/dist/test/assert.js +4 -0
  504. package/dist/test/fixtures/consumer-extension/dist/background.js +23 -0
  505. package/dist/test/fixtures/consumer-extension/dist/manifest.json +20 -0
  506. package/dist/test/fixtures/consumer-extension/dist/options.html +10 -0
  507. package/dist/test/fixtures/consumer-extension/dist/popup.bundle.js +5 -0
  508. package/dist/test/fixtures/consumer-extension/dist/popup.html +12 -0
  509. package/dist/test/harness/extension/background.js +26 -0
  510. package/dist/test/harness/extension/manifest.json +27 -0
  511. package/dist/test/harness/extension/options.html +12 -0
  512. package/dist/test/harness/extension/popup.html +12 -0
  513. package/dist/test/harness/extension/sidepanel.html +12 -0
  514. package/dist/test/index.js +63 -0
  515. package/dist/test/runner.js +99 -0
  516. package/dist/test/runners/boot.js +221 -0
  517. package/dist/test/runners/chromium.js +391 -0
  518. package/dist/test/runners/helpers.js +24 -0
  519. package/dist/test/suites/background/messaging.test.js +44 -0
  520. package/dist/test/suites/background/storage.test.js +46 -0
  521. package/dist/test/suites/background/sw-context.test.js +49 -0
  522. package/dist/test/suites/boot/build-json-bake.test.js +80 -0
  523. package/dist/test/suites/boot/extension-loads.test.js +58 -0
  524. package/dist/test/suites/build/affiliatizer.test.js +64 -0
  525. package/dist/test/suites/build/app-launch.test.js +65 -0
  526. package/dist/test/suites/build/attach-log-file.test.js +99 -0
  527. package/dist/test/suites/build/auth-emulator-gate.test.js +118 -0
  528. package/dist/test/suites/build/auth-triggers.test.js +71 -0
  529. package/dist/test/suites/build/boot-discovery.test.js +134 -0
  530. package/dist/test/suites/build/boot-timeout.test.js +92 -0
  531. package/dist/test/suites/build/build-error-notification.test.js +122 -0
  532. package/dist/test/suites/build/build-json-bake.test.js +302 -0
  533. package/dist/test/suites/build/build-verb.test.js +138 -0
  534. package/dist/test/suites/build/bundle-targets.test.js +66 -0
  535. package/dist/test/suites/build/cache-warming.test.js +44 -0
  536. package/dist/test/suites/build/cli.test.js +150 -0
  537. package/dist/test/suites/build/default-boot-test.test.js +100 -0
  538. package/dist/test/suites/build/defaults-scaffold.test.js +287 -0
  539. package/dist/test/suites/build/deploy-dispatch.test.js +76 -0
  540. package/dist/test/suites/build/distribute-task.test.js +111 -0
  541. package/dist/test/suites/build/ensure-target.test.js +141 -0
  542. package/dist/test/suites/build/env-delivery.test.js +239 -0
  543. package/dist/test/suites/build/env-watch.test.js +86 -0
  544. package/dist/test/suites/build/expect.test.js +48 -0
  545. package/dist/test/suites/build/exports.test.js +53 -0
  546. package/dist/test/suites/build/extension-fallback.test.js +82 -0
  547. package/dist/test/suites/build/framework-deps.test.js +176 -0
  548. package/dist/test/suites/build/global-handlers.test.js +70 -0
  549. package/dist/test/suites/build/icon-sheet.test.js +74 -0
  550. package/dist/test/suites/build/logger-lite.test.js +61 -0
  551. package/dist/test/suites/build/manager.test.js +249 -0
  552. package/dist/test/suites/build/mode-helpers.test.js +136 -0
  553. package/dist/test/suites/build/omega-shell.test.js +103 -0
  554. package/dist/test/suites/build/omega-tokens.test.js +76 -0
  555. package/dist/test/suites/build/package-task.test.js +831 -0
  556. package/dist/test/suites/build/setup-scripts.test.js +172 -0
  557. package/dist/test/suites/build/strip-dev-blocks.test.js +122 -0
  558. package/dist/test/suites/build/template-replace.test.js +116 -0
  559. package/dist/test/suites/build/test-discovery.test.js +64 -0
  560. package/dist/test/suites/build/test-target-no-match.test.js +119 -0
  561. package/dist/test/suites/build/theme-resolve.test.js +115 -0
  562. package/dist/test/suites/build/translate.test.js +85 -0
  563. package/dist/test/suites/build/url-helpers.test.js +119 -0
  564. package/dist/test/suites/build/verb-logs.test.js +43 -0
  565. package/dist/test/suites/build/verts-binding.test.js +67 -0
  566. package/dist/test/suites/build/wakeup-ping.test.js +90 -0
  567. package/dist/test/suites/build/wave5-messenger.test.js +80 -0
  568. package/dist/test/suites/view/options-and-sidepanel.test.js +16 -0
  569. package/dist/test/suites/view/popup-context.test.js +53 -0
  570. package/dist/test/suites/view/sidepanel.test.js +16 -0
  571. package/dist/test/utils/extended-mode-warning.js +13 -0
  572. package/dist/utils/attach-log-file.js +4 -0
  573. package/dist/utils/mode-helpers.js +117 -0
  574. package/dist/utils/url-helpers.js +69 -0
  575. package/dist/vendor/account/engine.js +182 -0
  576. package/dist/vendor/account/features.js +220 -0
  577. package/dist/vendor/account/index.js +53 -0
  578. package/dist/vendor/account/schema.js +272 -0
  579. package/dist/vendor/account/subscription.js +38 -0
  580. package/dist/vendor/config/company.js +31 -0
  581. package/dist/vendor/config/defaults.js +173 -0
  582. package/dist/vendor/config/demo.js +18 -0
  583. package/dist/vendor/config/desktop-artifacts.js +110 -0
  584. package/dist/vendor/config/edit.js +769 -0
  585. package/dist/vendor/config/env-delivery.js +145 -0
  586. package/dist/vendor/config/env-rules.js +93 -0
  587. package/dist/vendor/config/env-schema.js +1078 -0
  588. package/dist/vendor/config/env.js +445 -0
  589. package/dist/vendor/config/hooks.js +97 -0
  590. package/dist/vendor/config/index.js +237 -0
  591. package/dist/vendor/config/instances.js +208 -0
  592. package/dist/vendor/config/load.js +490 -0
  593. package/dist/vendor/config/merge.js +68 -0
  594. package/dist/vendor/config/order.js +139 -0
  595. package/dist/vendor/config/ports.js +374 -0
  596. package/dist/vendor/config/providers.js +32 -0
  597. package/dist/vendor/config/repo.js +142 -0
  598. package/dist/vendor/config/retired-keys.js +430 -0
  599. package/dist/vendor/config/schema.js +1610 -0
  600. package/dist/vendor/config/secrets.js +50 -0
  601. package/dist/vendor/config/seed.js +34 -0
  602. package/dist/vendor/config/site-global.js +205 -0
  603. package/dist/vendor/config/validate.js +554 -0
  604. package/dist/vendor/config/winback.js +61 -0
  605. package/dist/vendor/devkit/actions-secrets.js +145 -0
  606. package/dist/vendor/devkit/attach-log-file.js +262 -0
  607. package/dist/vendor/devkit/bundle.js +292 -0
  608. package/dist/vendor/devkit/ci-workflows.js +520 -0
  609. package/dist/vendor/devkit/clean-dirs.js +28 -0
  610. package/dist/vendor/devkit/cli-router.js +156 -0
  611. package/dist/vendor/devkit/defaults-engine.js +372 -0
  612. package/dist/vendor/devkit/deploy-precheck.js +54 -0
  613. package/dist/vendor/devkit/deploy-record.js +180 -0
  614. package/dist/vendor/devkit/deploy.js +286 -0
  615. package/dist/vendor/devkit/empty-modules-plugin.js +64 -0
  616. package/dist/vendor/devkit/env-watch.js +132 -0
  617. package/dist/vendor/devkit/framework-deps.js +46 -0
  618. package/dist/vendor/devkit/icons.js +178 -0
  619. package/dist/vendor/devkit/license.js +155 -0
  620. package/dist/vendor/devkit/local.js +1905 -0
  621. package/dist/vendor/devkit/logger.js +128 -0
  622. package/dist/vendor/devkit/merge-line-files.js +296 -0
  623. package/dist/vendor/devkit/npm-registry.js +52 -0
  624. package/dist/vendor/devkit/omega-bin.js +345 -0
  625. package/dist/vendor/devkit/safe-install.js +18 -0
  626. package/dist/vendor/devkit/scaffold-guard.js +96 -0
  627. package/dist/vendor/devkit/strip-dev-blocks-plugin.js +29 -0
  628. package/dist/vendor/devkit/strip-dev-blocks.js +32 -0
  629. package/dist/vendor/devkit/target-dependencies.js +137 -0
  630. package/dist/vendor/devkit/target-secrets.js +165 -0
  631. package/dist/vendor/devkit/test/assert.js +120 -0
  632. package/dist/vendor/devkit/test/define-cases.js +104 -0
  633. package/dist/vendor/devkit/test/extended-mode-warning.js +22 -0
  634. package/dist/vendor/devkit/test/runner-core.js +554 -0
  635. package/dist/vendor/devkit/test/scope.js +162 -0
  636. package/dist/vendor/devkit/translate/cache.js +84 -0
  637. package/dist/vendor/devkit/translate/engine.js +243 -0
  638. package/dist/vendor/devkit/translate/index.js +49 -0
  639. package/dist/vendor/devkit/translate/languages.js +134 -0
  640. package/dist/vendor/devkit/translate/providers.js +188 -0
  641. package/dist/vendor/devkit/update.js +569 -0
  642. package/docs/affiliatizer.md +81 -0
  643. package/docs/audit.md +67 -0
  644. package/docs/auth.md +149 -0
  645. package/docs/build-system.md +176 -0
  646. package/docs/cdp-debugging.md +42 -0
  647. package/docs/cli.md +73 -0
  648. package/docs/common-mistakes.md +10 -0
  649. package/docs/components.md +87 -0
  650. package/docs/css.md +133 -0
  651. package/docs/defaults.md +72 -0
  652. package/docs/environment-detection.md +79 -0
  653. package/docs/extension.md +93 -0
  654. package/docs/hooks.md +111 -0
  655. package/docs/icons.md +47 -0
  656. package/docs/index.md +291 -0
  657. package/docs/logging.md +33 -0
  658. package/docs/managers.md +100 -0
  659. package/docs/offscreen.md +57 -0
  660. package/docs/publishing.md +182 -0
  661. package/docs/shared/agent-docs.md +89 -0
  662. package/docs/shared/analytics.md +612 -0
  663. package/docs/shared/brands.md +51 -0
  664. package/docs/shared/breaking-changes.md +497 -0
  665. package/docs/shared/config.md +1387 -0
  666. package/docs/shared/deploys.md +215 -0
  667. package/docs/shared/icons.md +201 -0
  668. package/docs/shared/local-dev.md +147 -0
  669. package/docs/shared/logging.md +202 -0
  670. package/docs/shared/monitoring.md +153 -0
  671. package/docs/shared/publishing.md +183 -0
  672. package/docs/shared/rulings.md +34 -0
  673. package/docs/shared/testing.md +147 -0
  674. package/docs/shared/theming.md +604 -0
  675. package/docs/shared/translation.md +291 -0
  676. package/docs/shared/updates.md +61 -0
  677. package/docs/templating.md +66 -0
  678. package/docs/test-boot-layer.md +143 -0
  679. package/docs/test-framework.md +411 -0
  680. package/docs/themes.md +89 -0
  681. package/docs/translations.md +73 -0
  682. package/docs/verts.md +67 -0
  683. package/docs/xss-prevention.md +95 -0
  684. package/package.json +159 -0
@@ -0,0 +1,147 @@
1
+ # Local dev loop (master plan §8)
2
+
3
+ How to work on the frameworks and see edits live in consumers — one repo, one window, one command. The mechanics live in **`@omega.js/devkit/local`** (`packages/devkit/src/local.js`), the single home for monorepo resolution, brand/app detection, file:-linking, and the watch lock.
4
+
5
+ ## Root watch: `npm start`
6
+
7
+ `npm start` at the monorepo root runs `scripts/watch-all.js`, which starts every package's `prepare:watch` (src→dist rebuild-on-change) **concurrently**, with per-package output prefixes:
8
+
9
+ ```
10
+ Watching 4 packages (src→dist): backend, client, desktop, extension
11
+ [client ] [02:25:05] 'prepare-package': Ready for changes!
12
+ ```
13
+
14
+ - **Discovery, not hardcoding**: any `packages/*` with a `prepare:watch` script is watched. Packages without one (`account`, `analytics`, `config`, `devkit`, `mcp-router`, `monitoring`, `template-kit`) serve `src/` directly — file:-linked consumers see those edits live with no watch at all.
15
+ - **Vendor propagation**: a per-package `prepare:watch` only sees its OWN src, but the vendorable shared packages (`devkit`, `config`, `account`, `template-kit`, `analytics`, `monitoring` — `VENDORABLE_PACKAGES` in `packages/devkit/tools/vendor.js` is the list) also live as copies inside every framework's `dist/vendor/*`. The orchestrator watches those srcs too (`startVendorPropagation`) and re-runs `npm run prepare` in every watchable package on change — debounced, coalescing, one failure never stops the pass. Without it, a devkit edit strands dist-running frameworks on stale vendored code until a manual rebuild (the cp184 `http://localhost:5002` no-redirect bug). Running processes still need a restart to load the fresh dist, same as any src edit.
16
+ - **Single-instance**: the orchestrator takes `.omega/dev-watch.lock` (pid inside). A second `npm start` — or an `omega dev --local` session — sees the live lock and exits cleanly instead of double-watching. Stale locks (dead pid) are swept automatically.
17
+ - **Shutdown**: SIGINT/SIGTERM kills every watch child and releases the lock. A watch child dying on its own is announced loudly; the others stay up.
18
+ - **Its log**: the whole watcher — its own lines and every child watch's prefixed output — tees to `.temp/logs/watch-all.log`, truncated per launch (attached AFTER the lock, so a losing second instance never wipes the live one's log). "Is it alive, did it respawn, what did it rebuild" is a `grep`, never a restart ([logging.md](logging.md)).
19
+
20
+ ## Brand-root one command: `omega dev` (web + backend together)
21
+
22
+ At a **brand root** (the dir with `config/omega.json5`), every framework's `omega` bin dispatches to `@omega.js/manager` — whose `dev` command boots the whole local stack at once (`npm start` is the packaged form, `npm run dev` its alias — the manage cycle is `npm run manage`, i.e. `omega manage`; a bare `omega` prints help and runs nothing, [#229](https://github.com/Omega-JS-Stack/omega/issues/229)):
23
+
24
+ ```
25
+ omega dev # website dev server + backend FULL emulator suite
26
+ omega dev --target=web # one leg
27
+ omega dev --target=web,backend # explicit set
28
+ omega dev --all # every target with a dev leg (desktop/extension opt-in)
29
+ omega dev --full # boot on the WHOLE manage walk, not just the boot lane
30
+ ```
31
+
32
+ - **Boot opens with ONE freshness sweep, before anything spawns** ([#340](https://github.com/Omega-JS-Stack/omega/issues/340)): `omega dev` checks every selected lane's framework closure itself (devkit's `freshnessSweep`, deps-first, one check per package dir), so a heal — `npm run prepare`, which PURGES dist before recopying — happens once, with no sibling lane mid-`require('../dist/…')` through it. Each leg still checks itself at CLI boot; swept first, that check is a no-op. A stale MONOREPO-linked dist stops the boot here instead of taking a leg down later.
33
+ - **Boot opens with a manage cycle** ([#44](https://github.com/Omega-JS-Stack/omega/issues/44)): before any leg spawns, `omega dev` reconciles the brand — its boot lane, below — so brand-level sources reach the targets instead of sitting stale (see the redistribution contract below). Errors in that cycle stop the boot loudly; nothing serves on top of a broken brand.
34
+ - **The boot walks the LOCAL lane, in about a second** ([#228](https://github.com/Omega-JS-Stack/omega/issues/228)): `workspace` (structure + config health), `assets` (derived logo/icon variants) and `disperse` (signing artifacts) — the file work the dev legs actually consume. It is the DELIVERY lane, not a boot-only one ([#678](https://github.com/Omega-JS-Stack/omega/issues/678)): a brand-root `omega deploy` runs the same `BOOT_SERVICES` walk before it fans out, so brand inputs reach the targets on both triggers from one list. Cloud reconciliation and the rebuild lane (cloud, campaigns, payment, update, account, …) cost a minute-plus and reach no dev leg, so they belong to `npm run manage` — or `omega dev --full`, which boots on the whole walk. A service is manage-lane unless `BOOT_SERVICES` names it, so nothing new can slow a boot by accident. The boot still prints the preflight walkthrough for the FULL setup (it is local and instant), then one line pointing at `npm run manage`.
35
+ - **The boot cycle never waits on a human** ([#228](https://github.com/Omega-JS-Stack/omega/issues/228)): it runs non-interactive, so any step that needs a person — a console confirm, a consent flow, a secret paste — steps aside into the run summary's ⚑ pending list, each item naming its `npm run manage -- --service=<name>` rerun. The dev legs boot regardless of what is pending; only real errors (broken config, an unloadable brand) stop the boot. A never-setup brand and a fully setup one behave identically here — the difference shows up as a longer pending list, not as a stalled terminal. A dead Google grant is pending too, not an error: the service warns into the same list and the walk carries on. One consequence on a `--full` boot: its web build uses the committed translation cache only (`--cached-only`, the same determinism law the pipeline and deploys follow), so new strings translate on the next interactive manage or build.
36
+ - **Default set = `web` + `backend`** — the local web loop. GUI/watcher targets (desktop opens an Electron window; extension runs a build watcher) never boot unless named via `--target=`/`--all` ([#780](https://github.com/Omega-JS-Stack/omega/issues/780)). The default also adapts: a web-only brand boots just web, no warning.
37
+ - **Legs**: web → the target's `npm start` (`omega dev`, :4000); backend → `npm run emulator` (auth/firestore/functions/database/hosting + seeded personas). Backend boots first so its port map is published before web reads it, and the order is optional either way ([#346](https://github.com/Omega-JS-Stack/omega/issues/346)): the web dev server rewrites each page's port map into the response as it serves it, so a backend that publishes later reaches the browser on the next request instead of never.
38
+ - **Multi-instance web ports offset deterministically**: each instance wants the classic base + its position in the `targets.web` instances array (targets/website → :4000, targets/website-admin → :4001), so instances dev side-by-side from their own target dirs; the N7 allocator still bumps if the offset port happens to be taken, and pins (`--port` / config `ports.website`) win verbatim. Single-object brands stay on :4000 exactly as before.
39
+ - **Per-target Node**: each leg spawns under its target's own `.nvmrc` major (web and backend pin different ones).
40
+ - **A leg targets the `https` port, never `hosting`** ([#795](https://github.com/Omega-JS-Stack/omega/issues/795)): the ports file publishes both, and only `https` is the public origin under the local certificate; `hosting` is the internal plain-http port the mkcert proxy forwards to, so a consumer process aimed there is talking to the proxy's back door instead of the address every other surface uses. Every leg `omega dev` spawns carries `NODE_EXTRA_CA_CERTS=<mkcert -CAROOT>/rootCA.pem` (a shell-set value wins verbatim; a host without mkcert gets no key at all), so a brand's own Node process VERIFIES that certificate rather than dying on it. A leg that never speaks TLS ignores the variable, and since this is verification and not a bypass, Node prints no warning. The emulator's and `omega serve`'s own children take the same variable in place of the old `NODE_TLS_REJECT_UNAUTHORIZED=0`, whose boot warning is gone with it; that bypass survives in exactly one place, a host whose mkcert root vanished under certificates already on disk.
41
+ - **One terminal covers FRAMEWORK edits too** ([#587](https://github.com/Omega-JS-Stack/omega/issues/587)): when the brand's `@omega.js/*` deps RESOLVE into a monorepo checkout, the boot starts that monorepo's watch as a session child — no flag, no second terminal, so editing a framework's `src/` rebuilds its `dist/` while the stack runs. Resolution answers the question, never the manifest (a `file:` spec can be stale, and workspace hoisting puts the copy at the brand root): `resolveLinkedMonorepo(brandRoot)`. Lock-aware — a watch already running (root `npm start`, or another brand's session) is REUSED, never doubled — session-scoped, so it dies with the stack, and its output rides the `[watch]` tag into `logs/dev.log`. A registry-installed brand has nothing to watch and says so in one line. It starts AFTER the freshness sweep on purpose: the sweep's verdict depends on whether a watch holds the lock ([#281](https://github.com/Omega-JS-Stack/omega/issues/281)/[#398](https://github.com/Omega-JS-Stack/omega/issues/398)), so starting one first would change the answer it just gave. A FRESH watch's initial prepare rewrites every package's `dist/` as it runs, so the boot WAITS for that pass to land ([#670](https://github.com/Omega-JS-Stack/omega/issues/670)) — the helper's `ready` promise resolves once every watched package has printed its `Ready for changes!` line (or the moment the watch child exits without reporting, or after 120s with one warning naming the stragglers), and only then do the legs boot, so nothing loads a CLI out from under the rewrite. **An ALREADY-RUNNING watch gates the same way** ([#622](https://github.com/Omega-JS-Stack/omega/issues/622)) — the branch a linked brand normally takes, since the root `npm start` is usually already up: with no child stdout to read, the boot tails that watch's own `.temp/logs/watch-all.log` (believed only when its pid header IS the lock owner's) through the same tracker, and also waits out a vendor-propagation pass holding `.omega/vendor-propagation.lock`. A settled watch answers off the file with no wait at all; a watch that dies mid-wait settles it at once. Same helper as the website target's `--local` prelude — one implementation, two callers.
42
+ - **Every seeded persona is a FULL account** ([#327](https://github.com/Omega-JS-Stack/omega/issues/327)): identical in shape AND in substance to a real user — a name, a place, a phone, a company, a birthday, and the device and IP it signed up from — so a persona renders like a customer on every surface that shows a person. The profile is DERIVED from the persona key (`packages/backend/src/test/test-accounts.js` `seededProfile`), so it is the same on every boot and a new persona is born complete; anything a persona names for itself wins. Paid personas carry the provider record a real purchase leaves (provider, resource, order, term start, the event that last wrote it), which is what payment-gated surfaces — the billing card's save offer — read before they show anything. Established personas also carry the two lists an account accumulates ([#343](https://github.com/Omega-JS-Stack/omega/issues/343)): the REFERRALS an affiliate link earned (`{ uid, timestamp }`, exactly as a signup appends them, and naming other personas — so whether a referral converted is the referred account's own subscription state) — carried by the DEDICATED `referrer` persona and nothing else ([#363](https://github.com/Omega-JS-Stack/omega/issues/363)), because a persona demonstrates exactly its own scenario — and the ACTIVE SESSIONS of the two or three devices they are signed in on (Realtime Database records under `sessions/app`, seeded on boot and restored by "Reset to seed", because they live outside the user doc). Demo-safe by construction: documentation-range IPs, fictional 555 numbers, invented companies.
43
+ - **The dev palette** (the DEV pull-tab the web framework renders in development): one-click sign-in as the seeded personas, including the four billing-journey accounts ([#215](https://github.com/Omega-JS-Stack/omega/issues/215)), and a "Reset to seed" button on any signed-in test account — a development-only backend route rebuilds the account from its canonical seed shape. The switcher's roster is the SEED's own ([#400](https://github.com/Omega-JS-Stack/omega/issues/400)): the backend labels each human-facing persona (`palette: '<Label>'` in `packages/backend/src/test/test-accounts.js`) and serves that list, in declaration order, at `GET /omega/test/roster`; the palette fetches it on build and keeps no copy, so a persona seeded today is switchable today and the machinery an automated suite drives never appears. The WHOLE seed is read, both halves ([#712](https://github.com/Omega-JS-Stack/omega/issues/712)): a project's own personas from its `test/_init.js` carry the same label and are offered after the framework's, so a consumer persona is switchable the moment it is seeded. The address the palette signs in on is the brand's HOST, and so is the one the seeder creates ([#708](https://github.com/Omega-JS-Stack/omega/issues/708)) — ONE derivation, `@omega.js/config`'s `resolvedBrandHost` (an instance's `url`, else `brand.url`), because a brand answering support mail on the apex while the site sits on a subdomain used to seed accounts the palette could never sign in as. There is no fallback list: with no emulator up the dropdown holds its placeholder alone and the "Signed in as" line carries the reason on a second line, under whoever you are signed in as (that readout is composed, so an auth state settling after the failure lands beside it rather than on top of it). A page opened while the emulator is still booting does not stay stuck there ([#402](https://github.com/Omega-JS-Stack/omega/issues/402)): a spinner and a "Backend starting…" line sit at the top of the panel and the roster is fetched again every two seconds, forever, until it answers; the attempt that lands fills the dropdown, preselects the signed-in persona, and clears both the indicator and the explanation, so no reload is needed. A built-in **Storage** section ([#390](https://github.com/Omega-JS-Stack/omega/issues/390)) covers the client blob: a target dropdown ("All" first, then every top-level key, re-derived from the LIVE blob each time the panel opens) with Log and Clear buttons acting on the selected target — Log prints the parsed value into the console, Clear removes it, and nothing asks you to confirm. Source: `packages/web/core/js/core/dev-palette.js`. Pages contribute their own controls via `registerDevSection` (`core/js/core/dev-sections.js`, [#234](https://github.com/Omega-JS-Stack/omega/issues/234)): sections render on open and merge by id — the checkout page's controls (product, frequency, pre-delay, trial, card provider, reCAPTCHA, the decline toggle) live in the palette's Checkout section, and every one of them applies the same way — Apply & reload navigates with its param set, the decline arm included (`_dev_decline`, which stays armed until you apply it away); the page's old gear dropdown is gone.
44
+ - **The palette is the ONLY dev-testing surface** (Ian's ruling, [#342](https://github.com/Omega-JS-Stack/omega/issues/342), extending [#329](https://github.com/Omega-JS-Stack/omega/issues/329)): no client-side test personas as code objects, no helper hung on `window`, no dev switch you can only reach by already knowing its name — hidden functions get forgotten in six months. Alongside Checkout the panel now carries **Tools** (log opening tags, toggle theme), **Icons** (re-run the missing-icon audit), **Download** (open the onboarding walkthrough for a platform), **Extension** (fire a browser's install click) and **OAuth** (rehearse a returning provider redirect: returning user, new user, credential conflict). The account page carries NO control of its own: its referrals and sessions lists were the last client-side fixtures (`?_dev_prefill`), and the personas carry both now ([#343](https://github.com/Omega-JS-Stack/omega/issues/343)) — switching persona IS the affordance. Every one of them is a `@dev-only` block, so a production build ships neither the control nor what it unlocks. The rule outlives the sweep as a guard: `packages/web/test/dev-hooks-guard.test.js` fails on a new `_dev_*` hook or `window.<helper>` in client code, on a listed hook no palette section actually offers, and on any hook read outside a `@dev-only` block.
45
+ - **Google/OAuth signin uses the redirect flow here, same as production** ([#156](https://github.com/Omega-JS-Stack/omega/issues/156)): the auth emulator returns its credential through storage on the origin it is served from, so `omega dev` proxies the emulator under the SITE origin and the return leg survives the browser's storage partitioning. Details in [docs/web/index.md](../web/index.md).
46
+ - Output is line-prefixed per target (`[backend] …`, `[web] …`); one Ctrl-C stops everything; a leg dying alone is announced and its siblings stay up.
47
+ - **No production build runs under a live dev server** ([#617](https://github.com/Omega-JS-Stack/omega/issues/617)): `omega dev` and `omega build` write the SAME `dist/`, and a build landing under a running website dev server replaces the pages it keeps serving — production-stamped, `dev: null`, no re-render until a restart. So `omega build` in a website target REFUSES in one line while that target's dev run holds it, and so does anything that runs it (`omega test`'s project lane, `omega audit`, the manage cycle's rebuild lane, and `omega deploy`'s local/direct lanes — mid-session, scope manage: `npm run manage -- --service=<name>`). Stop the leg first. The dev run is known by the ports file it already publishes and retracts on shutdown, so there is no second lock — and a crash leftover (dead pid) is ignored, never a wedged build. Web only for now: the same guard reaches another framework the day the mechanism is shared, never as a fourth copy.
48
+
49
+ ## What refreshes when — the redistribution contract
50
+
51
+ Brand-level sources are not read by the targets directly; most of them are **redistributed** by the manage cycle, and target watchers only watch their own dir. So:
52
+
53
+ | You edited | What moves it | When it lands |
54
+ |---|---|---|
55
+ | `assets/logo/*.svg`, `assets/templates/*.psd` | assets service → derived variants in the gitignored `.omega/assets/`, mtime-diffed (only stale outputs regenerate) | a manage cycle: restart `omega dev`, or run `npm run manage` in the brand |
56
+ | `.omega/assets/*` (the derived set) | the web build's static channel copies them into the site as `assets/images/brand/*` + `assets/images/favicon`, and mirrors the shipped `favicon.ico` to the site root so the browser's `/favicon.ico` probe resolves (`packages/web/src/static-assets.js`) | the web build's `static` phase — the dev server copies at BOOT, no watcher, so a restart picks them up |
57
+ | signing certs | disperse service → each target's gitignored certs dir | the delivery lane: a boot, a `npm run manage`, or a brand-root `omega deploy` |
58
+ | brand `.env` | nothing copies it — every verb composes its target's runtime env (the backend's staged `dist/.env`) from the cascade, filtered by the env schema ([#678](https://github.com/Omega-JS-Stack/omega/issues/678)) | the next build; **the dev watchers reload the env cascade on change** — the backend restages `dist/.env`, and the web + extension dev lanes reload it into `process.env` for the next rebuild ([#681](https://github.com/Omega-JS-Stack/omega/issues/681)). A **NEW** key and an **EDITED** value both land on that rebuild, and a key dropped from the file is dropped from the process — the reload drops what a file layer owns and re-reads the cascade ([#724](https://github.com/Omega-JS-Stack/omega/issues/724)); a **shell**-set value still wins over every file. One limit worth knowing: **desktop is pre-wired only** (its dev pipeline builds once, and the electron child snapshots env at spawn, so nothing there consumes a reload yet) |
59
+ | `config/omega.json5` (brand or local) | nothing — targets read it directly, there is no mirror to disperse | the reading process's own reload (a running backend restages on it; a dev-server restart is always enough) |
60
+ | a target's own `src/` | that target's watcher | live |
61
+
62
+ The short version: **anything under the brand root that isn't inside a target needs the manage cycle**, and `omega dev` now runs one at boot ([#44](https://github.com/Omega-JS-Stack/omega/issues/44)) — so the loop for a brandmark edit is *edit the svg → restart `omega dev`*. Mid-session, `npm run manage` (or `npx omega manage --service=assets`) does the same without stopping the stack, then restart the web leg to pick up the copies.
63
+
64
+ ## One-command consumer sessions: `omega dev --local`
65
+
66
+ In a brand's website target, `omega dev --local` runs the full local-mode prelude before the normal dev server:
67
+
68
+ 1. **Resolve the monorepo** — `OMEGA_MONOREPO` env override → self-location (works whenever the running framework is linked from the monorepo, or the consumer lives inside it) → `~/Developer/Repositories/Omega/omega`.
69
+ 2. **Find the brand root** — walk up from cwd to the first directory with both a `package.json` and `targets/<name>/package.json` (the Omega monorepo itself never counts); standalone projects resolve to themselves.
70
+ 3. **Link brand-wide** — for every project (brand root + `targets/*`), every `@omega.js/*` dependency in the ONE authored manifest (src/dist pillar — a backend's `functions/` is staged output and carries no authored manifest) is flipped to a `file:` spec and installed. **Idempotent**: deps already resolving to the monorepo copy are skipped (resolution walks up node_modules, so npm-workspace hoisting is handled), and an already-correct committed `file:` spec is never rewritten. **Transactional**: an install failure restores every flipped manifest to its pre-link spec.
71
+ 4. **Start the monorepo watch** — spawned as a session-scoped child (dies with the dev server; the lock prevents doubles). Watch output streams into the dev log under a `[watch]` prefix. Same helper the brand root uses (below): `startMonorepoWatch()` owns the session scoping, each caller keeps its own Ctrl-C policy.
72
+
73
+ Then the standard `omega dev` loop runs. Result: edit any framework's `src/` and the consumer picks it up live — no N windows, no N × `mgr i local`.
74
+
75
+ **Upstream-first (Ian 2026-07-27).** The live link is not just a convenience — it is how framework holes get found and fixed. Building a real consumer app regularly exposes gaps in OMEGA; when a defect or missing piece would hit EVERY consumer (a broken core style, a wrong default, a missing option), fix it in the framework right here through the link, not in the consumer project — a consumer-side patch has to be rediscovered and repeated in the next project. The test: would the next consumer need the same change? Then it belongs upstream. Brand-specific looks, content, and one-off behavior stay in the brand. The same rule ships to brand sessions in the brand guide (`docs/manager/brand.md`).
76
+
77
+ **Permission first (Ian 2026-07-27).** Upstream-first says WHERE a fix belongs, never that a consumer session may make it unprompted. A session working in a consumer project that finds a framework-level hole SURFACES the proposed framework change — what is broken, what it would change, why every consumer needs it — and WAITS for Ian's go before touching the monorepo (or files it as an issue when Ian is not in the loop). No consumer session edits the framework silently as a side effect of its own task.
78
+
79
+ ## Per-target linking: `mgr i local`
80
+
81
+ **Linking is one-time and durable (Ian 2026-07-28) — never re-run it per change or per session.** The `file:` specs resolve to real symlinks into the monorepo, so once a brand is linked, every framework edit is live the moment its `dist/` rebuilds (the monorepo watch or any prepare). The web dev server watches the resolved `@omega.js/client` dist and rebuilds the site bundle on ANY change there — including a prepare's wholesale delete-and-recreate, which the watch survives by re-arming onto the new directory ([#378](https://github.com/Omega-JS-Stack/omega/issues/378)) — so client changes reach a RUNNING site with no restart. Framework PROCESS code (the dev server itself, a backend leg) still loads at boot: those edits need the normal stack restart. Re-running `i local` is a HEAL for a link something overwrote (a registry install, a fresh clone) — reruns all-skip and cost nothing, but they are never part of the edit loop.
82
+
83
+ Unchanged contract for consumers, now monorepo-backed: `mgr i local` (web, desktop, extension — web gained its install command in cp194) and `mgr i local` / `mgr install --local` (backend) call the same `linkLocalPackages()`. Backend links its target-root manifest like every other target (`functions/` is staged output; the CLI normalizes a `functions/` cwd up to the target root). `mgr i live/prod` still installs from the registry and is untouched.
84
+
85
+ **Linking is brand-tree-wide by construction (cp194):** npm resolves the WHOLE workspace tree on any install anchored in a brand monorepo, so linking one target while a sibling still carries an unpublished registry spec (`@omega.js/backend: *`) 404s before anything links — only reachable in a brand OUTSIDE the omega monorepo, the real consumer topology. `linkLocalPackages()` therefore flips every target's `@omega.js/*` specs to `file:` first (dev/prod placement preserved; specs computed from REAL paths so symlinked/aliased dirs can't dangle), then runs ONE `npm install` for the tree. One call from any target links the whole brand; reruns all-skip.
86
+
87
+ **The brand root itself is part of the tree (cp195):** onboard scaffolds `@omega.js/manager` into the brand root's devDependencies — the omega-bin dispatcher resolves brand-level verbs (`omega dev`, manage, the scaffolded `start`/`manage` scripts) FROM the brand root, and without the declaration nothing installs the manager outside the monorepo (inside it, workspace hoisting masked the gap). `linkLocalPackages()` links it like any target dep (`discoverTargets` already includes the brand root).
88
+
89
+ **Outside brands may COMMIT relative `file:` specs — the real brand does (cp229):** `../omega-brand` (folder renamed from omegajs.dev, cp235) declares every `@omega.js/*` dep as `file:../../../omega/packages/<name>` (brand root: `file:../omega/packages/manager`), the same pattern the in-repo brands already use at their own depth. Clone the two repos side by side and a plain `npm install` links the whole tree with zero linker involvement; `linkLocalPackages()` all-skips because the specs already resolve into the monorepo. At first publish the specs flip to exact `0.1.0` registry pins (versions re-reset to 0.1.0 at cp238 — 0.x until live publishes are proven — so the flip stays seamless).
90
+
91
+ ## Vendoring vs runtime deps (what ships where)
92
+
93
+ Two different mechanisms keep consumers working:
94
+
95
+ | Kind | Packages | Mechanism |
96
+ |------|----------|-----------|
97
+ | Private shared internals | `devkit`, `config`, `account`, `template-kit`, `analytics`, `monitoring` (devDependencies of the frameworks) | Vendored into `dist/vendor/<pkg>` at prepare time by `@omega.js/devkit/vendor`; requires rewritten to relative paths. Never published. |
98
+ | Published runtime deps | `@omega.js/client` (dependency of web + backend + desktop + extension), `@omega.js/backend` and `@omega.js/mcp-router` (dependencies of manager) | Normal npm dependency — **never vendored** (a vendored copy would pin a stale snapshot and duplicate the shared client singleton). Requires stay as package requires. |
99
+
100
+ The vendor tool derives the split from the host's package.json: anything in `dependencies`/`peerDependencies`/`optionalDependencies` is published-runtime and skipped; devDependency workspace packages get vendored. All six DIST-BUILDING publishables (backend, client, desktop, extension, manager, web) run the vendor after-hook; the seventh, `@omega.js/mcp-router`, ships its `src/` as-is and vendors nothing. Two mirrored gates prove self-containment: CI's pack-smoke and the local `npm run release:check` — both pack, scratch-install with tarball `overrides` for the published runtime deps, resolve, and grep the whole shipped tree for raw private `@omega.js/*` refs — the alternation is DERIVED from `VENDORABLE_PACKAGES`, never written out ([#713](https://github.com/Omega-JS-Stack/omega/issues/713): the hand-written four sat two names behind the list, so a raw `analytics`/`monitoring` require could ship undetected). The publish runbook lives in [docs/shared/publishing.md](publishing.md).
101
+
102
+ ## API surface (`@omega.js/devkit/local`)
103
+
104
+ | Export | Purpose |
105
+ |--------|---------|
106
+ | `resolveMonorepoRoot()` | env → self-location walk-up → conventional path; throws with guidance if none |
107
+ | `findBrandRoot(dir)` / `discoverTargets(root)` | brand-root walk-up / brand root + `targets/*` list |
108
+ | `frameworkPackagesOf(targetDir)` | `@omega.js/*` deps incl. `functions/package.json`, with dev/prod placement + owning dir |
109
+ | `linkLocalPackages({ dir, monorepoRoot, logger, dryRun })` | idempotent brand-tree file:-link (spec flip + one install, transactional — a failed install restores every manifest); returns `[{ name, dir, target, action: link\|skip\|missing }]` across the tree |
110
+ | `restoreRegistrySpecs({ dir, logger, dryRun, range })` | the publish-day INVERSE (`omega i live` in every framework): every `file:` spec flips to the EXACT `<linked version>` (read from the file: target — no monorepo needed, no caret: the family is lockstep, [#794](https://github.com/Omega-JS-Stack/omega/issues/794)) or the explicit `range`, used verbatim; then one registry install, same transactional restore on failure |
111
+ | `resolveLinkedMonorepo(brandRoot)` | the monorepo a brand's `@omega.js/*` deps actually RESOLVE into, or null for a registry install |
112
+ | `startMonorepoWatch({ monorepoRoot, logger })` | lock-aware, SESSION-SCOPED spawn of the root watch (dies with the caller); `{ alreadyRunning, pid, child, ready }` — `ready` resolves with `'ready'`, `'exit'` or `'timeout'` on BOTH branches (#670, #622) |
113
+ | `awaitRunningWatchReady({ monorepoRoot, pid, logger })` | the same verdict for a watch this process did not start: its tee'd log + the propagation marker, 120s bound |
114
+ | `vendorPropagationActive(monorepoRoot)` | is a propagation pass purging framework dists right now (stale marker = no) |
115
+ | `createWatchReadyTracker()` | the pure line parser behind `ready`: `push(line)`, `isReady()`, `pending()` |
116
+ | `startVendorPropagation({ packagesDir, packages, dependents, runPrepare?, log?, debounceMs? })` | watch vendorable srcs → re-prepare dependents (debounced, coalescing); `{ watched, poke, close }` — `poke` is the fs-free test seam; a running pass holds `.omega/vendor-propagation.lock` |
117
+ | `acquireWatchLock` / `releaseWatchLock` / `readLiveWatchPid` | the `.omega/dev-watch.lock` single-instance protocol (owned by watch-all) |
118
+
119
+ ## Freshness guard (cp247, hardened in [#195](https://github.com/Omega-JS-Stack/omega/issues/195))
120
+
121
+ Every framework CLI boot (web/backend/desktop/extension/manager — `freshnessBoot` in devkit `local.js`, wired in each `cli-run`) checks whether a locally-linked framework's `dist/` is stale. What happens next depends on who OWNS that dist ([#281](https://github.com/Omega-JS-Stack/omega/issues/281), narrowed by [#398](https://github.com/Omega-JS-Stack/omega/issues/398)): a link into this monorepo **whose watch is running** is read-only and the boot stops loudly (below), while every other local checkout — a plain link, and a monorepo link with the watch DOWN — heals in place, a loud auto `npm run prepare` in the package, after which the invocation RE-EXECS once (`OMEGA_FRESH_REEXEC` loop guard) so no verb ever runs stale framework code.
122
+
123
+ **Linked monorepo packages are READ-ONLY to consumer builds while their watch runs** ([#281](https://github.com/Omega-JS-Stack/omega/issues/281), Ian's call 2026-08-17). A consumer that resolves an `@omega.js/*` dependency to a link into this monorepo never prepares that package out from under the process that owns the build: no dist purge, no cache refetch (backend's prepare refetches `.cache/email/disposable-domains.json` over the network), not even a heal lock inside the package. That checkout is SHARED, by a fleet of agents, several brands and the monorepo's own processes, and a prepare deletes the `dist/` a sibling process is mid-`require` on, with nothing in `git status` to show for it. **Dist freshness is owned by the monorepo watch** (root `npm start`) whenever that watch exists.
124
+
125
+ **With the watch DOWN, the boot heals the link itself** ([#398](https://github.com/Omega-JS-Stack/omega/issues/398), Ian's call 2026-08-20). The stop is right only while something else owns the rebuild; with no watch running it is pure friction — the guard already knows the watch is down (the `.omega/dev-watch.lock` pid probe it warns from), so a stale linked dist takes the ordinary heal: one `npm run prepare` in place under the package's heal lock, `rebuilt` by `self`, then the boot's re-exec. The hazard #281 named is narrowed, not dismissed: the heal lock still serializes the CLIs booting on that package, and the largest concurrent writer is by definition not running. The once-per-process watch-down warning STAYS on this path — a stale linked dist is healed once at boot, and a framework edit made during the session still needs `npm start` for live rebuilds. **And a heal that FAILS is a loud stop, not a shrug**: the outcome is `heal-failed`, and the boot exits 1 naming the package, the staleness, the prepare's exit status and the `npm run prepare` to run by hand in that checkout. A plain checkout keeps the old warn-and-continue (its dist is the developer's own, and nothing shared hangs on this boot), but a monorepo link has no watch coming to land the build, so continuing would serve code nobody built — the silent fallback #281 forbids. `omega dev`'s hoisted sweep returns those entries as `healFailed` and stops the fan-out before any leg spawns, exactly as it does for `staleLinked`.
126
+
127
+ **The INSTALL path is guarded at the prepare script** ([#350](https://github.com/Omega-JS-Stack/omega/issues/350)). npm runs a `file:`-linked dependency's `prepare` INSIDE the linked checkout, so `omega i local`, `omega dev --local` and any plain `npm install` in a linked brand rebuilt a monorepo package in place through the one door a CLI guard cannot see — npm invokes prepare, devkit never gets a say. Every dist-building package's prepare now opens with devkit's gate: `node -e "require('@omega.js/devkit/prepare-guard')() && require('prepare-package')()"` (`packages/devkit/tools/prepare-guard.js`). When npm's install root (`npm_config_local_prefix`, `INIT_CWD` as the fallback) lies OUTSIDE the monorepo that contains the package, the build is skipped — a false return short-circuits the `&&`, exit 0, so the consumer's install completes normally — with one stderr line naming the package, the install that reached in, and the watch that owns the dist. It fires for every TREE-TOUCHING command from outside — `install`, `ci`, `update`, `rebuild`, `dedupe`, the five npm reports in `npm_command` that re-run a linked package's prepare (npm 11.12.1) — and for nothing else: the monorepo's own root install, workspace installs (`-w packages/web`), an install typed inside a package or an in-repo app, `npm run prepare`, and the `npm pack`/`npm publish` prepare lane all build exactly as before, so a published tarball still carries a freshly built dist. npm buffers lifecycle output, so the notice surfaces under `--foreground-scripts`.
128
+
129
+ **The gate keeps itself wired.** prepare-package OWNS `scripts.prepare`: every full build rewrites the manifest with its own canonical one-liner, which would silently drop the gate on the monorepo's next prepare. So each package's `preparePackage.hooks.after` is now a two-command chain — the vendor hook, then `require('@omega.js/devkit/prepare-guard').rewire()` — which runs after that manifest write in BOTH the `prepare` and `prepare:watch` lanes and puts the gated line back, in prepare-package's own formatting so a settled `package.json` never churns. It is idempotent and narrow: it writes only when the manifest holds prepare-package's exact string, and never touches a prepare it does not own. Pinned by devkit `test/prepare-guard.test.js` (22 tests: the decision table, the notice, and real-npm/real-prepare-package fixture runs — including the red baselines, an unguarded consumer install rebuilding the linked package and a real build overwriting the gate).
130
+
131
+ The consequence is deliberate: with that watch running, a linked dist that is missing, unbuilt or stale FAILS the consumer build loudly, before the verb runs, naming the package, the evidence, the checkout it will not touch, and the watch already on the job:
132
+
133
+ ```
134
+ omega: @omega.js/backend is linked into the omega monorepo and its dist is not built (dist/ is missing).
135
+ omega: linked packages are read-only to consumer builds, so this build will not rebuild /Users/ian/…/omega/packages/backend.
136
+ omega: the monorepo watch (`npm start` in /Users/ian/…/omega) is running but has not landed that build yet: give it a moment, then re-run this command.
137
+ ```
138
+
139
+ There is no silent fallback and no staging copy: the build runs on a dist the watch built, or it stops and waits for it. `OMEGA_SKIP_FRESHNESS` remains the one opt-out, for harnesses that manage their own builds.
140
+
141
+ **The boot checks the host AND its `@omega.js/*` runtime deps** ([#198](https://github.com/Omega-JS-Stack/omega/issues/198)): each `cli-run` names its host package, and `freshnessCheckList` walks that host's `dependencies` (never devDependencies) through local checkouts — cycle-safe, each dep resolved from ITS depender so the walk follows the real node_modules chain — producing a DEPS-FIRST, host-last check order (web → `client`, web; manager → `client`, `backend`, manager). The host alone was never enough: web's bundle carries `@omega.js/client`'s dist verbatim, so a boot that healed web and stopped there still served the browser a stale client. A rebuild ANYWHERE in that list re-execs the invocation once; a dep that resolves into `node_modules` is classified `registry` and its own deps are not walked. **Every heal re-execs, whoever built it**: the outcome is `rebuilt` with a `by: self|watch|peer` discriminator (this boot's own prepare, the monorepo watch landing its copy inside the grace, or a peer CLI that won the heal lock) — a process that booted from the pre-heal dist is just as stale when someone else fixed it. Registry installs (realpath inside node_modules) and non-buildable dirs skip instantly; `OMEGA_SKIP_FRESHNESS` is the opt-out seam. A monorepo-linked entry that comes back stale under a live watch ends the walk where it stands: the boot prints the read-only stop above and exits 1, deps included, so a stale `client` never reaches its dependent's build. Pinned by devkit `test/local-freshness.test.js` (49 tests incl. linked-consumer integration proofs).
142
+
143
+ **Detection is per-file evidence, never a whole-tree mtime compare** (`distStaleReason`, 1–36ms per package). Every file under `src/` must exist at its mapped `dist/` path with an mtime at least as new — a MISSING dist file is stale whatever the timestamps say — and every dist file must have a src counterpart, or a leftover from a deleted source reads stale. The exceptions are the paths prepare itself generates: `dist/vendor/**` plus every destination the host declares in `omega.vendorAssets` (that is how desktop/extension carry a `dist/assets` tree the web package owns) — and nothing else, because vendor-docs writes the package ROOT `docs/` and prepare-package rewrites the ROOT `package.json`, so a `dist/docs/**` or `dist/package.json` is a leftover like any other. One subtree is exempt from the orphan question alone ([#352](https://github.com/Omega-JS-Stack/omega/issues/352)): `dist/test/fixtures/**`, where a package's own self-tests seed runtime state (backend writes its fixture project's `firestore.rules` and `service-account.json` there) that shadows no consumer require and outlives a crashed run — a file there WITH a src counterpart still answers the mtime question. The embedded `dist/vendor/<name>` copies are still compared against each private package's `src/` — they only refresh on a full prepare. The declared `omega.vendorAssets` destinations get the same positive question ([#199](https://github.com/Omega-JS-Stack/omega/issues/199)): each is compared against its source package's `from` tree (web's `core/`/`themes/` for desktop/extension), monorepo-only, so the exemption from the orphan scan is no longer a free pass: a boot acts on a stale vendored copy — heal or stop — instead of serving it. The old newest-mtime heuristic read "fresh" whenever ANYTHING touched dist after a src edit, and the vendor after-hook does exactly that: on 2026-08-05 `packages/web/dist` served a stale `commands/setup.js` and was missing new files for a day with both automatic layers silent.
144
+
145
+ **A live watch buys a bounded grace, not blind trust.** Stale with the root-watch lock held → recheck for ~2s so an in-flight watcher copy can land (dim note, `rebuilt` by `watch` if it does — still a heal, so the boot re-execs onto it), then the verdict: a monorepo link stops the invocation, any other local checkout heals here. **A dead watcher is loud**: a monorepo-linked boot with no live lock prints one stderr line naming the fix (`npm start` in the monorepo) — the boot's own heal ([#398](https://github.com/Omega-JS-Stack/omega/issues/398)) repairs a STALE dist once, at boot, and nothing propagates a src edit made afterwards, so the warning still carries the whole story (it fires on a fresh dist too, so it states that standing deal rather than claiming a heal that may not have happened). Both surfaced from the freshness path, so all five framework CLIs get them for free.
146
+
147
+ **Heals are locked per package** (a local checkout outside this monorepo, a monorepo link with the watch down, and the watch's own prepares): a mkdir-as-mutex at `<package>/.omega/heal.lock` with the owner pid inside (the `withStateLock` idiom from `deploy-record.js`; pid liveness replaces its mtime age because a real prepare holds the lock for minutes). The loser waits, then RE-CHECKS freshness — the winner's build makes it a no-op, so two or ten CLIs booting on the same stale link produce one build. Abandoned locks (owner gone — an EPERM pid is LIVE, never stolen) are stolen; a wait past the deadline proceeds unlocked rather than failing a boot, and lock bookkeeping that cannot be written (read-only fs, full disk) degrades to unlocked instead of throwing out of a heal. **The vendor-propagation watcher takes the same lock** around its own `npm run prepare` spawn (`startVendorPropagation`, held for the child's whole life, awaited async so the watcher keeps serving its other watches) — that spawn is devkit's own, so it locks; only prepare-package's INTERNAL src→dist copying stays unlocked third-party territory, and it converges on the watcher's next change event.
@@ -0,0 +1,202 @@
1
+ # Logging — the tag contract and the file contract
2
+
3
+ Two contracts live here. **What a line says**: every log line carries one identity tag.
4
+ **Where a line lands**: every dev server, build, test runner, emulator and watcher tees
5
+ its whole run to a greppable file ([#197](https://github.com/Omega-JS-Stack/omega/issues/197)).
6
+ The tag contract first, the file contract from [The file tee](#the-file-tee) down.
7
+
8
+ ## The tag contract
9
+
10
+ Every log line in the ecosystem carries ONE identity tag: `[@omega.js/<package>:<module>]`.
11
+ The module segment is the file's identity (`push`, `watcher`, `auth:sync` — sub-modules
12
+ join with `:`). Ratified 2026-07-29 ([#12](https://github.com/Omega-JS-Stack/omega/issues/12)).
13
+
14
+ ### The debug level (`OMEGA_DEBUG`)
15
+
16
+ `debug` is the ONE opt-in level ([#230](https://github.com/Omega-JS-Stack/omega/issues/230)): a
17
+ backend `ctx.debug(...)` line is dropped whole — console AND the log file — unless
18
+ `OMEGA_DEBUG` is set (truthy STRING semantics, the house's `TEST_EXTENDED_MODE` idiom:
19
+ `OMEGA_DEBUG=0` reads as on; read live per line). Fat payloads belong there: full user
20
+ records, raw webhook bodies. Two related quieting rules from the same issue: boot-time
21
+ environment notes (the TEST banner, the resolved-mode line) are suppressed under the
22
+ emulator (`FUNCTIONS_EMULATOR`) and latched once-per-process everywhere else, and the
23
+ `omega dev` leg output collapses consecutive duplicate lines into one plus a
24
+ `(repeated N×)` note.
25
+
26
+ ### PII and secrets
27
+
28
+ **A log line names a user by address or uid, never by serializing the document.** A user
29
+ document carries `api.privateKey`, the consent records, the signup IP and the attribution,
30
+ and a backend line lands in Cloud Logging for the whole retention window — one
31
+ `JSON.stringify(user)` stores a live credential there in plain text
32
+ ([#632](https://github.com/Omega-JS-Stack/omega/issues/632)). The rule covers every object
33
+ a caller hands in, not just user docs: log the identifier, not the payload — a payload's
34
+ SHAPE (its top-level key names, a count) is fair game when the line needs it. A secret that
35
+ has to be acknowledged at all renders through backend's `redactSecret()`
36
+ (`***<last 4> (<n> chars)`), and a fat payload worth having while debugging goes to the
37
+ `debug` level above, never to `log`.
38
+
39
+ **A third party's credential is a credential.** An OAuth token exchange response holds the
40
+ access, refresh and id tokens; the identity a provider answers with is the user's PII. Both
41
+ used to ride `ctx.log` on every connection link
42
+ ([#641](https://github.com/Omega-JS-Stack/omega/issues/641)) — a line names the provider,
43
+ the uid and whether the exchange succeeded, and nothing else. The same rule reaches an
44
+ HTTP helper's own switches: `wonderful-fetch`'s `log: true` prints its whole configuration,
45
+ headers included, so it never rides a request carrying ANY credential header — an
46
+ `authorization` token, or the `omega-admin-key` an internal call authenticates with
47
+ ([#702](https://github.com/Omega-JS-Stack/omega/issues/702)). Backend's
48
+ `test/security/fetch-log-secrets.test.js` scans the source and fails that pairing.
49
+
50
+ ### The two surfaces
51
+
52
+ - **Build-time** (CLI, gulp, tests, the manager's services): the devkit logger prints a
53
+ timestamp bracket first — `[HH:MM:SS] [@omega.js/web:watcher] message`. Construction
54
+ stays `new Logger('watcher')`; the package segment derives at construction from the
55
+ constructing file's nearest `package.json` (stack-based, cached, non-throwing —
56
+ fallback `@omega.js/devkit`). Home: `packages/devkit/src/logger.js`.
57
+ - **Runtime** (browser, electron renderer/main, extension): NO timestamp — devtools
58
+ stamps lines. Each runtime surface has its own logger emitting its own package
59
+ segment: client `createLogger()` (`packages/client/src/modules/logger.js`), web
60
+ core/js `createLogger()` (`packages/web/core/js/libs/logger.js`), and the
61
+ desktop/extension `logger-lite` lineage.
62
+ - **Backend** (Cloud Functions) is server-side runtime: in PRODUCTION Cloud Logging
63
+ stamps every entry, so every level emits the tag ALONE —
64
+ `[@omega.js/backend:<module>] <invocation-id>[ <logPrefix>]: message`. Outside
65
+ production (the emulator's `>` prefix carries no time; plain local runs have
66
+ nothing at all) the same `[HH:MM:SS]` bracket the build-time logger prints opens
67
+ the line ([#130](https://github.com/Omega-JS-Stack/omega/issues/130)). The module
68
+ segment is the invocation's function name, which the context already knows
69
+ (`options.functionName || FUNCTION_TARGET`). Home:
70
+ `packages/backend/src/manager/helpers/context/logging.js`. A shared backend module
71
+ that logs outside a ctx carries its own file identity.
72
+
73
+ ### Markers and exemptions
74
+
75
+ - `[DRY RUN]` survives as a MARKER after the tag, never as an identity tag (casing
76
+ unified; the lowercase form is retired).
77
+ - The manager's reconciliation report is product output, not logging — it stays
78
+ untagged by design (ruling 2026-07-29). That covers ALL its rows: the indented
79
+ `✓ / ~ / +` lines AND the `[DRY RUN]` rows printed through the same report
80
+ (there the marker may open the line, since the report carries no tags at all).
81
+ - Backend's record classifiers (`skip`, `expire`, `authenticated`, `test-mode`, …)
82
+ classify one function's records, not modules. They survive as leading WORDS, never
83
+ brackets (`ctx.log('local: Clearing...')`) — a bracket there would read as a second
84
+ identity tag ([#121](https://github.com/Omega-JS-Stack/omega/issues/121)).
85
+ - Test harnesses and fixtures are exempt; web's `core/js/pages/test/` demo pages are
86
+ NOT (they ship).
87
+
88
+ ### Enforcement
89
+
90
+ `scripts/log-tags.test.js` (runs in root `test:packages`) scans `packages/*/src` and
91
+ `packages/web/core/js` for any log call whose message starts with a static bracket tag
92
+ that is not `@omega.js/…` or the dry-run marker. It self-tests its own red path. New
93
+ code uses the surface's shared logger — never a hand-written bracket prefix.
94
+
95
+ ## The file tee
96
+
97
+ Nothing an OMEGA surface prints is terminal-only. ONE abstraction does it —
98
+ `packages/devkit/src/attach-log-file.js`, vendored into every framework — and every
99
+ surface attaches it at its entry point.
100
+
101
+ - **Both sinks, always.** A chunk reaches the terminal exactly as written (colors
102
+ intact) and the file with ANSI escapes stripped, so `grep` and `tail -f` read clean.
103
+ - **Synchronous fd writes.** A stream's buffer dies with the process, dropping exactly
104
+ the lines that describe a crash. The per-write syscall buys the crash tail.
105
+ - **Truncate on attach.** A new launch clears the previous run's log — no history, no
106
+ rotation (the ruled retention, see below).
107
+ - **Stackable.** `createTee()` returns an independent tee; an attach captures the
108
+ CURRENT writers, so tees nest and each detach restores exactly what it found (LIFO).
109
+ The default export is the process-wide singleton, which is what a CLI verb wants.
110
+ - **`createChildLog()` for spawned children.** A child's stdout/stderr never pass
111
+ through this process' writers; the caller mirrors each buffer to the terminal —
112
+ which the verb's own tee then catches, making the verb log a SUPERSET of the child
113
+ file — and hands it to a child log, which adds the one thing the tee has no use for — a
114
+ mid-run `roll()`, requested by touching a reset sentinel, so a days-long emulator
115
+ log can be freshened without restarting it.
116
+ - **CI is a no-op.** Under `CI=true` / `GITHUB_ACTIONS=true` the tee declines: the
117
+ runner captures its own output and no `logs/` is left in the workspace.
118
+ - **A log it cannot open is a lost log, never a lost process.** The tee warns once and
119
+ the run continues untouched.
120
+
121
+ ## Where every log lives
122
+
123
+ `<targetRoot>` is a target dir in a brand (`targets/website`, `targets/backend`, …);
124
+ `<brandRoot>` is the brand monorepo root.
125
+
126
+ | Surface | File | What's in it |
127
+ |---|---|---|
128
+ | **Per target** — every framework, same three names | | |
129
+ | `omega dev` (web) · `omega serve` / `omega emulator` (backend) · `npm start` (desktop, extension) | `<targetRoot>/logs/dev.log` | the whole dev run: boot, ports, watcher rebuilds, the crash — plus every child chunk the verb mirrored (see below) |
130
+ | `omega build` (web, backend) · production gulp build (desktop, extension) | `<targetRoot>/logs/build.log` | the whole production build |
131
+ | `omega test` | `<targetRoot>/logs/test.log` | suite names, pass/fail, harness boot lines |
132
+ | **Backend children** — firebase's own processes, beside firebase-tools' debug logs. The verb mirrors every child chunk to its own terminal, so the `logs/<verb>.log` above is a SUPERSET of these; a child file is the child-ONLY view (and the one that `roll()`s mid-run) | | |
133
+ | the firebase emulator child | `<targetRoot>/dist/emulator.log` | emulator traffic: function invocations, Firestore/auth calls |
134
+ | the `firebase serve` child | `<targetRoot>/dist/dev.log` | serve output; rolls on each reload |
135
+ | the test runner child | `<targetRoot>/dist/test.log` | the runner's own output under `omega test` |
136
+ | `omega deploy` | `<targetRoot>/dist/deploy.log` | the deploy transcript |
137
+ | `omega logs` | `<targetRoot>/dist/production.log` | the Cloud Logging tail |
138
+ | firebase-tools itself | `<targetRoot>/*-debug.log` | `firestore-debug.log`, `firebase-debug.log`, `ui-debug.log`, … — theirs, never swept by us |
139
+ | **Desktop extras** | | |
140
+ | the running app itself (main + preload + renderer converge) | `<targetRoot>/logs/runtime.log` (dev) · the OS log dir (packaged) | lifecycle, window and updater lines; kept across boots, rotating at 10 MB — `packages/desktop/docs/logging.md` |
141
+ | `npx omega logs [runtime\|dev\|build\|test]` (desktop's own verb — read, not write) | tails whichever of the four `<targetRoot>/logs/` files was named, `runtime` by default | the print/follow/open surface for all of the above; backend's `omega logs` is a different verb (the Cloud Logging tail, one row up) |
142
+ | `npm run release` | `<targetRoot>/logs/ci.log` | the GH Actions release run, streamed locally |
143
+ | Windows code-signing | `<targetRoot>/logs/signing.log` | JSONL signing events (local fallback; on CI it lands in the runner home) |
144
+ | **Brand root** — every verb tees to its OWN `logs/<verb>.log` ([#623](https://github.com/Omega-JS-Stack/omega/issues/623)), so one verb never truncates another's record. A FAN-OUT log holds the walk's own verdict — its header, its loud skips, its summary — because `runCommand` spawns each target with stdio inherit, so a target's output goes past the tee into that target's own log above | | |
145
+ | `omega manage` (the service walk) | `<brandRoot>/logs/manage.log` | the whole service walk |
146
+ | `omega dev` (the fan-out) | `<brandRoot>/logs/dev.log` | the boot walk, then every dev leg's prefixed output (consecutive duplicate lines collapse to one ` (repeated N×)` note) |
147
+ | `omega build` / `omega clean` (the fan-outs) | `<brandRoot>/logs/build.log` · `<brandRoot>/logs/clean.log` | the walk order, every loud skip, the per-target summary |
148
+ | `omega deploy` (the fan-out) | `<brandRoot>/logs/deploy.log` | the delivery lane, then which target published in which order and the summary — the backend's own transcript additionally lands in `targets/backend/dist/deploy.log` (the other targets keep no per-target deploy log) |
149
+ | `omega update` (the fan-out) | `<brandRoot>/logs/update.log` | which target was checked and what it reported/applied |
150
+ | `omega test` (the fan-out) | `<brandRoot>/logs/test.log` | which target ran which scope, and the aggregate verdict |
151
+ | `omega pipeline` (the live full-cycle test) | `<brandRoot>/logs/pipeline.log` | the child invocation, the deploy/verify legs, the scorecard and the PASS/FAIL verdict |
152
+ | the brand's cross-stack e2e (`@omega.js/devkit/test/e2e-harness`) | `<brandRoot>/test/e2e/.logs/` | `steps.log` (one `PASS` / `FAIL` per step — see below), `emulator.log`, `dev.log`, `page.log` |
153
+ | **This monorepo** | | |
154
+ | every root test lane (`npm test`, `npm run test:packages`, …) | `.temp/logs/<lane>.log` | the lane's own lines plus every child command's output — `test:packages` → `.temp/logs/test-packages.log` |
155
+ | `npm start` (the watcher) | `.temp/logs/watch-all.log` | is it alive, did it respawn, what did it rebuild |
156
+ | every e2e runner's per-step verdicts | `.temp/<lane>/steps.log` | one `PASS` / `FAIL` line per step — see below |
157
+ | every e2e runner's environment | `.temp/<lane>/` | `emulator.log`, `page.log`, `sw.log`, `screenshots/`, the journey's numbered stage logs |
158
+
159
+ The e2e lane dirs are `.temp/flows-e2e/`, `.temp/auth-token-e2e/`, `.temp/verts-e2e/`,
160
+ `.temp/desktop-auth-e2e/`, `.temp/extension-auth-e2e/`, and `.temp/journey/`.
161
+
162
+ ### steps.log — which step failed
163
+
164
+ Every e2e runner writes its verdicts incrementally
165
+ (`packages/devkit/src/test/steps-log.js`, re-exported for the root runners as
166
+ `scripts/steps-log.js`, and used by the journey harness and the brand e2e
167
+ harness alike), so a SIGKILLed lane still names the step it died on:
168
+
169
+ ```
170
+ PASS the playground emulator boots (hosting :5002, auth :9099)
171
+ FAIL the popup reaches the background SW — timed out after 30s
172
+ FAIL preflight — a playground emulator stack is already running (hosting :5002)
173
+ ```
174
+
175
+ `preflight` is the runner dying before or outside any step — the live-stack guard, a
176
+ harness throw on the way up. One line, same shape, so one grep finds every failure:
177
+
178
+ ```bash
179
+ grep '^FAIL' .temp/*/steps.log brands/*/e2e/.logs/steps.log
180
+ ```
181
+
182
+ ### Retention (ruled 2026-08-05)
183
+
184
+ **Clear on launch, sweep what is stale.** Every log truncates when its surface starts;
185
+ nothing rotates and no history is kept — the question a log answers is "what did the
186
+ run that just happened do?". The backend additionally sweeps its own stale `dist/*.log`
187
+ files and reset sentinels at every verb start, and deliberately leaves firebase-tools'
188
+ `*-debug.log` files alone (a crashed run is diagnosed from them). `logs/` is gitignored
189
+ everywhere, scaffolded brands included.
190
+
191
+ ### Grep the logs — do not re-run the process
192
+
193
+ The whole point of the tee is that the answer is already on disk. A running dev server,
194
+ emulator or watcher belongs to the user: never restart one, and never re-run a suite,
195
+ just to see output.
196
+
197
+ ```bash
198
+ tail -50 targets/website/logs/dev.log # is the dev server up, what did it last build
199
+ grep -i error targets/backend/dist/emulator.log # what the emulator actually served
200
+ grep '^FAIL' .temp/*/steps.log # which e2e step broke
201
+ tail -100 .temp/logs/test-packages.log # what the last lane printed
202
+ ```
@@ -0,0 +1,153 @@
1
+ # Monitoring — the one error-reporting contract
2
+
3
+ `@omega.js/monitoring` is the ONE home of error-reporting policy across every OMEGA target
4
+ ([#380](https://github.com/Omega-JS-Stack/omega/issues/380)). Private workspace package, CJS,
5
+ vendored into the frameworks at prepare time — the same deal `@omega.js/analytics` gets.
6
+
7
+ Before it, three surfaces each carried their own copy of "should we report, what release is this,
8
+ what may we send": @omega.js/client's `modules/sentry.js`, @omega.js/backend's hand-rolled
9
+ `Sentry.init`, and @omega.js/desktop's `lib/sentry/` split. They disagreed — on the release format,
10
+ on whether an email rides, on whether a dev build reports. Now they share one core and each host
11
+ supplies only what it alone can know.
12
+
13
+ ## The doctrine (Ian, 2026-08-20)
14
+
15
+ - **Server and framework errors ALWAYS report.** Backend routes, cron, event triggers, desktop main,
16
+ extension background: our code, our fault, no filter.
17
+ - **Client-side, only OUR framework code reports.** A web page shares its global with user-land
18
+ scripts, ad and chat widgets, and whatever browser extension a visitor installed. None of it is
19
+ ours to answer for, so a browser event reports only when an `@omega.js` bundle is on its stack.
20
+ - **Capture lives at SEAMS**, never in scattered try/catch: process hooks, the route error handler
21
+ (`RouteContext.report()`), the event-trigger catch, the SDK's own global handlers.
22
+ - **PII is scrubbed by default.** The uid rides (it is the join key to the account); the email is
23
+ OFF unless a config explicitly opts in.
24
+ - **Everything is OFF when the DSN is unset** — and when it is off, the SDK is never `require()`d
25
+ or imported at all.
26
+
27
+ ## Config
28
+
29
+ One block, `monitoring`, in omega.json5, with the monitor named as a KEY under `providers`
30
+ ([#425](https://github.com/Omega-JS-Stack/omega/issues/425) — the same shape every role uses). DSN
31
+ presence IS the enable signal at runtime — there is no separate runtime `enabled` flag (the same
32
+ convention every other role section follows: a block's credentials are its switch); the role-level
33
+ `enabled: false` is the manager's skip switch for the provisioning service. Per-surface DSNs are
34
+ `targets.<type>.monitoring.providers.sentry.dsn` overrides.
35
+
36
+ ```jsonc
37
+ monitoring: {
38
+ enabled: true, // role-level, optional — false skips the monitoring service
39
+ providers: {
40
+ sentry: { // presence picks the monitor; no entry = none chosen
41
+ org: 'acme', // provisioning only (the manager's monitoring service writes it)
42
+ dsn: 'https://…@o1.ingest.sentry.io/1',
43
+ environment: null, // null = the host's gate names it ('production' / 'development')
44
+ sampleRate: 1, // error events kept, 0..1 — the sampling knob
45
+ tracesSampleRate: 0.1,
46
+ replaysSessionSampleRate: 0, // browser only — session replay is opt-IN (0 = off, and off is the default)
47
+ replaysOnErrorSampleRate: 0, // browser only — replay of an ERRORING session; either rate above 0 loads the integration
48
+ scrubEmail: true, // set false to opt IN to sending emails
49
+ attachScreenshot: false, // desktop only
50
+ bundlePatterns: ['/assets/js/'], // browser only — the URLs that identify our bundles
51
+ },
52
+ },
53
+ }
54
+ ```
55
+
56
+ Full schema: [config.md](config.md).
57
+
58
+ ## The entries
59
+
60
+ | Entry | Who requires it | What it does |
61
+ |---|---|---|
62
+ | `./core` | everything | Pure policy: config resolution, release tag, user scrub, the bundle filter. No `process`, no SDK, no DOM — it is safe inside a page bundle. |
63
+ | `./env` | Node/Electron hosts | The `process.env` half of core's gate seam: the four switches below. |
64
+ | `./node` | `@omega.js/backend` | Boots `@sentry/node` and hands the module back (or `null`). |
65
+ | `./browser` | `@omega.js/client` | Builds the `@sentry/browser` init options — integrations plus the ONE `beforeSend` that decides what leaves a page. |
66
+ | `./main` `./renderer` `./preload` | `@omega.js/desktop` | The `@sentry/electron` per-context wrappers. |
67
+ | `.` | `@omega.js/desktop` | The Electron context delegator: `process.type === 'renderer'` picks the renderer module, anything else the main one. |
68
+
69
+ Core is pure ON PURPOSE. The browser bundle imports it, so an env read there would be a
70
+ ReferenceError on a live page — every environment signal is passed IN as a gate, and `env.js` is
71
+ where the reads live for hosts that have a process. A package test pins this.
72
+
73
+ ## The switches
74
+
75
+ In the order they win:
76
+
77
+ | Env var | Effect |
78
+ |---|---|
79
+ | `OMEGA_SENTRY_ENABLED=false` | Kill switch. Nothing reports, ever. |
80
+ | `OMEGA_TEST_RUNNER` | A test run never pollutes a live project. |
81
+ | `OMEGA_SENTRY_FORCE=true` | Report from a non-production run (local proving). |
82
+ | `OMEGA_BUILD_MODE=true` | The default production signal, for a host with no runtime one. |
83
+
84
+ The production signal is the host's to supply. @omega.js/desktop has no runtime answer — "should we
85
+ ship telemetry" is a property of its BUILD — so it falls through to `OMEGA_BUILD_MODE`.
86
+ @omega.js/backend has one (`Manager.isProduction()`, env-derived and stable for the life of the
87
+ process) and passes it in, alongside its own `reportErrorsInDev` option.
88
+
89
+ ## Release tags
90
+
91
+ **ONE format on every target (Ian, 2026-08-20): `<brand.id>@<version>`.** A Sentry release is only
92
+ comparable across the backend, the desktop app and the browser bundles when all three spell it the
93
+ same way, so `core.releaseTag({ id, version })` builds that shape and nothing else — miss either
94
+ half and there is NO tag (a bare version is not a second format). `brand.id` is required config, so
95
+ a missing id is a config hole, not a supported case.
96
+
97
+ Each host supplies its own version identity:
98
+
99
+ | Host | Version source |
100
+ |---|---|
101
+ | `@omega.js/backend` | the functions package version. The id is `brand.id`, falling back to the project id on a config missing one (which already warns at boot). |
102
+ | `@omega.js/desktop` (main + renderer) | `app.getVersion()` — the packaged app version, with `brand.id` read off the resolved config |
103
+ | `@omega.js/client` in `@omega.js/extension` | the extension target's package version, baked into the build blob as `config.version` |
104
+ | `@omega.js/client` in `@omega.js/web` | the website target's package version, read off the target root's package.json and emitted in the page `Configuration` block as `version` |
105
+ | `@omega.js/client` in the `@omega.js/desktop` renderer | the desktop target's package version, folded into `OMEGA_BUILD_JSON.config` at bake time (the renderer only ever sees `buildJson.config`) |
106
+
107
+ The client reads `config.version` and falls back to `config.buildTime`. Every host above bakes a
108
+ version now, so the fallback covers only a blob that carries none — a surface embedding the client
109
+ by hand. Nothing tags a build stamp by design.
110
+
111
+ ## Where capture happens
112
+
113
+ | Surface | Seam |
114
+ |---|---|
115
+ | Backend routes | `RouteContext.report()` — 5xx captures automatically, 4xx never ([backend guide](../backend/index.md)) |
116
+ | Backend event triggers | `helpers/event-middleware.js` — a handler that throws, or a handler file that will not load, goes through the SAME `report()` door. A deliberate block (an `HttpsError`, or an explicit numeric 4xx code) is the trigger's 4xx and never captures — a string `.code` (`ENOENT`, `messaging/invalid-token`) is a system error, not a block, and reports. |
117
+ | Backend payment webhooks | the REFUSAL family's shared seam (`acknowledgeRefusal()` in `events/firestore/payments-webhooks/on-write.js`) captures ONE `warning` per refused event, tagged with the reason and the provider. A refusal is a decision, not a fault, so it never reports as an exception; a processed event reports nothing; and only IDS ride — the refusal stamp's own fields plus the event's ([#550](https://github.com/Omega-JS-Stack/omega/issues/550)). |
118
+ | Desktop main | `@sentry/electron/main`'s own `OnUncaughtException` + `onUnhandledRejection` integrations. Desktop's process handlers log to `runtime.log` and are ADDITIVE — never a second capture. |
119
+ | Desktop renderer | the SDK's window `error` / `unhandledrejection` handlers |
120
+ | Browser (web, extension) | the SDK's global handlers, filtered by `beforeSend` to our bundles |
121
+
122
+ ## The browser filter
123
+
124
+ `core.createBundleFilter(patterns)` checks every stack-frame filename an event carries against the
125
+ configured URL fragments. Default: `/assets/js/`, which is where both @omega.js/web and
126
+ @omega.js/extension serve every framework bundle (the client runtime included).
127
+
128
+ An event with **no matching frame is dropped**, and that includes an event with no frames at all — a
129
+ cross-origin `Script error.` is exactly the third-party noise this exists to kill. Deliberate
130
+ `omega.sentry().captureException(…)` calls are unaffected: they are thrown from page bundles, which
131
+ ARE our bundles. The corollary: a deliberate capture must pass an Error CONSTRUCTED in framework
132
+ code — hand it a frameless one (a bare cross-browser `fetch` TypeError, say, which some engines
133
+ raise with no usable stack) and the filter drops it, by design.
134
+
135
+ What survives the filter is scrubbed of credential-bearing auth params: `browser.scrubAuthParams()`
136
+ strips `?authPrivateKey` and `?authCustomToken` from every navigation breadcrumb (`data.from`/`data.to`,
137
+ which the SDK records around `history.replaceState` — including the strip that removes the key) and
138
+ from `event.request.url` (which `httpContext` attaches at capture time). A module constant, not
139
+ config: a page never opts its own credentials back into an event ([#661](https://github.com/Omega-JS-Stack/omega/issues/661)).
140
+
141
+ ## How the config reaches a browser
142
+
143
+ The client reads a `sentry: { enabled, config }` namespace on its init blob, and every framework
144
+ maps it from `monitoring.providers.sentry`:
145
+
146
+ | Framework | Where |
147
+ |---|---|
148
+ | `@omega.js/web` | the `Configuration` block in `core/_includes/core/foot.html` — `resolved.monitoring.providers.sentry` → `sentry`. A real DSN is emitted AFTER the `resolved.client` loop, so the canonical home outranks a stale `client.sentry` ([#485](https://github.com/Omega-JS-Stack/omega/issues/485)); with no DSN there, the off state rides before the loop, so a brand not yet migrated off `client.sentry` keeps reporting |
149
+ | `@omega.js/extension` | `src/gulp/tasks/bundle.js` (`composeBuildConfig`, baked into every bundle) |
150
+
151
+ The client's `sentry.config` is the PROVIDER block, flat — nothing role-level ever rides into
152
+ `Sentry.init`. Node/Electron hosts pass the whole `monitoring` section instead and core's
153
+ `providerOptions()` reaches in for them: one home for the nesting, on the runtime side.