@omega.js/manager 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 (416) hide show
  1. package/.claude-plugin/marketplace.json +14 -0
  2. package/LICENSE +98 -0
  3. package/README.md +165 -0
  4. package/bin/omega +2 -0
  5. package/bin/omg +2 -0
  6. package/claude-plugin/.claude-plugin/plugin.json +11 -0
  7. package/claude-plugin/.mcp.json +9 -0
  8. package/claude-plugin/README.md +139 -0
  9. package/claude-plugin/hooks/gate/mark.sh +58 -0
  10. package/claude-plugin/hooks/gate/run.sh +97 -0
  11. package/claude-plugin/hooks/guard/run.sh +249 -0
  12. package/claude-plugin/hooks/hooks.json +63 -0
  13. package/claude-plugin/hooks/inject/run.sh +127 -0
  14. package/claude-plugin/hooks/lib/omega-gate.sh +20 -0
  15. package/claude-plugin/hooks/lib/omega-scope.sh +41 -0
  16. package/claude-plugin/hooks/lib/omega-skills.sh +209 -0
  17. package/claude-plugin/hooks/quality/run.sh +132 -0
  18. package/claude-plugin/hooks/shape/run.sh +45 -0
  19. package/claude-plugin/mcp-router-launch.js +29 -0
  20. package/claude-plugin/skills/README.md +48 -0
  21. package/claude-plugin/skills/accessibility/SKILL.md +31 -0
  22. package/claude-plugin/skills/analytics/SKILL.md +30 -0
  23. package/claude-plugin/skills/backend/SKILL.md +25 -0
  24. package/claude-plugin/skills/brandcheck/SKILL.md +29 -0
  25. package/claude-plugin/skills/browser/SKILL.md +64 -0
  26. package/claude-plugin/skills/client/SKILL.md +24 -0
  27. package/claude-plugin/skills/desktop/SKILL.md +25 -0
  28. package/claude-plugin/skills/extension/SKILL.md +25 -0
  29. package/claude-plugin/skills/main/SKILL.md +54 -0
  30. package/claude-plugin/skills/manager/SKILL.md +25 -0
  31. package/claude-plugin/skills/seo/SKILL.md +36 -0
  32. package/claude-plugin/skills/theme/SKILL.md +33 -0
  33. package/claude-plugin/skills/web/SKILL.md +29 -0
  34. package/dist/cli-run.js +34 -0
  35. package/dist/cli.js +29 -0
  36. package/dist/commands/build.js +17 -0
  37. package/dist/commands/clean.js +16 -0
  38. package/dist/commands/company.js +46 -0
  39. package/dist/commands/deploy.js +143 -0
  40. package/dist/commands/dev.js +437 -0
  41. package/dist/commands/devlog.js +25 -0
  42. package/dist/commands/help.js +48 -0
  43. package/dist/commands/manage.js +53 -0
  44. package/dist/commands/migrate.js +76 -0
  45. package/dist/commands/onboard.js +31 -0
  46. package/dist/commands/pipeline.js +319 -0
  47. package/dist/commands/test.js +380 -0
  48. package/dist/commands/update.js +128 -0
  49. package/dist/commands/version.js +8 -0
  50. package/dist/company-init.js +167 -0
  51. package/dist/company.js +283 -0
  52. package/dist/config.js +1359 -0
  53. package/dist/devlog/index.js +226 -0
  54. package/dist/devlog/lib/collect-commits.js +136 -0
  55. package/dist/devlog/lib/generate-post.js +201 -0
  56. package/dist/devlog/lib/ghostii.js +122 -0
  57. package/dist/devlog/lib/project-map.js +98 -0
  58. package/dist/devlog/lib/publish-website.js +88 -0
  59. package/dist/index.js +45 -0
  60. package/dist/lib/agents-md.js +201 -0
  61. package/dist/lib/analytics-secret.js +22 -0
  62. package/dist/lib/argv.js +21 -0
  63. package/dist/lib/auth-admin.js +120 -0
  64. package/dist/lib/automation-client.js +210 -0
  65. package/dist/lib/backend-marketing.js +49 -0
  66. package/dist/lib/brand.js +240 -0
  67. package/dist/lib/bundle-id.js +53 -0
  68. package/dist/lib/claude-settings.js +125 -0
  69. package/dist/lib/company-scaffold.js +213 -0
  70. package/dist/lib/company.js +227 -0
  71. package/dist/lib/config-flow.js +350 -0
  72. package/dist/lib/config-write.js +41 -0
  73. package/dist/lib/custom-target.js +75 -0
  74. package/dist/lib/domain-utils.js +19 -0
  75. package/dist/lib/duration.js +39 -0
  76. package/dist/lib/env-order.js +236 -0
  77. package/dist/lib/env-secret.js +78 -0
  78. package/dist/lib/firestore-rest.js +326 -0
  79. package/dist/lib/framework-bin.js +156 -0
  80. package/dist/lib/gitignore.js +63 -0
  81. package/dist/lib/google-auth.js +495 -0
  82. package/dist/lib/google-token.js +66 -0
  83. package/dist/lib/jwt.js +31 -0
  84. package/dist/lib/legacy-oauth.js +59 -0
  85. package/dist/lib/node-version.js +127 -0
  86. package/dist/lib/owner-plan.js +78 -0
  87. package/dist/lib/package-scripts.js +152 -0
  88. package/dist/lib/preflight.js +470 -0
  89. package/dist/lib/product-create.js +144 -0
  90. package/dist/lib/run-command.js +74 -0
  91. package/dist/lib/run-gates.js +70 -0
  92. package/dist/lib/run-output.js +42 -0
  93. package/dist/lib/run-summary.js +384 -0
  94. package/dist/lib/scaffold.js +427 -0
  95. package/dist/lib/service-input.js +207 -0
  96. package/dist/lib/service-runner.js +466 -0
  97. package/dist/lib/stale.js +24 -0
  98. package/dist/lib/target-selection.js +155 -0
  99. package/dist/lib/verb-fanout.js +128 -0
  100. package/dist/lib/verify-live.js +188 -0
  101. package/dist/manage.js +311 -0
  102. package/dist/omega-bin.js +7 -0
  103. package/dist/onboard.js +532 -0
  104. package/dist/services/account/ensure/users.js +259 -0
  105. package/dist/services/account/index.js +97 -0
  106. package/dist/services/account/lib/backend-client.js +107 -0
  107. package/dist/services/account/lib/password.js +36 -0
  108. package/dist/services/account/lib/resolve-password.js +100 -0
  109. package/dist/services/advertising/ensure/sites.js +101 -0
  110. package/dist/services/advertising/index.js +101 -0
  111. package/dist/services/advertising/lib/adsense-api.js +41 -0
  112. package/dist/services/ai/ensure/keys.js +21 -0
  113. package/dist/services/ai/index.js +36 -0
  114. package/dist/services/analytics/ensure/google-firebase-link.js +230 -0
  115. package/dist/services/analytics/ensure/google-streams.js +256 -0
  116. package/dist/services/analytics/ensure/meta-pixel.js +22 -0
  117. package/dist/services/analytics/ensure/tiktok-pixel.js +22 -0
  118. package/dist/services/analytics/index.js +134 -0
  119. package/dist/services/analytics/lib/analytics-api.js +156 -0
  120. package/dist/services/analytics/lib/meta-api.js +83 -0
  121. package/dist/services/analytics/lib/pixel-account.js +78 -0
  122. package/dist/services/analytics/lib/pixel-provision.js +152 -0
  123. package/dist/services/analytics/lib/pixel-specs.js +57 -0
  124. package/dist/services/analytics/lib/pixel-token.js +88 -0
  125. package/dist/services/analytics/lib/property-flow.js +77 -0
  126. package/dist/services/analytics/lib/tiktok-api.js +157 -0
  127. package/dist/services/analytics/lib/tiktok-auth.js +153 -0
  128. package/dist/services/assets/ensure/logo-gen.js +68 -0
  129. package/dist/services/assets/index.js +109 -0
  130. package/dist/services/assets/lib/assets-config.js +168 -0
  131. package/dist/services/assets/lib/brandmark-api.js +160 -0
  132. package/dist/services/assets/lib/derived.js +113 -0
  133. package/dist/services/assets/lib/font-loader.js +67 -0
  134. package/dist/services/assets/lib/reconcile.js +122 -0
  135. package/dist/services/assets/lib/reset.js +118 -0
  136. package/dist/services/assets/lib/svg-logo-generator.js +154 -0
  137. package/dist/services/assets/lib/svg-to-black.js +32 -0
  138. package/dist/services/assets/write/favicons.js +82 -0
  139. package/dist/services/assets/write/icons.js +64 -0
  140. package/dist/services/assets/write/process.js +96 -0
  141. package/dist/services/assets/write/reconcile.js +30 -0
  142. package/dist/services/assets/write/social-icons.js +108 -0
  143. package/dist/services/assets/write/templates.js +345 -0
  144. package/dist/services/bookmark/ensure/sync.js +255 -0
  145. package/dist/services/bookmark/index.js +17 -0
  146. package/dist/services/campaigns/ensure/contact-person.js +40 -0
  147. package/dist/services/campaigns/ensure/custom-fields.js +84 -0
  148. package/dist/services/campaigns/ensure/domain-auth.js +92 -0
  149. package/dist/services/campaigns/ensure/event-webhook.js +89 -0
  150. package/dist/services/campaigns/ensure/link-branding.js +187 -0
  151. package/dist/services/campaigns/ensure/list.js +50 -0
  152. package/dist/services/campaigns/ensure/segments.js +109 -0
  153. package/dist/services/campaigns/ensure/sender-identity.js +153 -0
  154. package/dist/services/campaigns/ensure/unsubscribe-groups.js +116 -0
  155. package/dist/services/campaigns/index.js +79 -0
  156. package/dist/services/campaigns/lib/dns-sync.js +81 -0
  157. package/dist/services/campaigns/lib/segment-query.js +138 -0
  158. package/dist/services/campaigns/lib/sendgrid-api.js +287 -0
  159. package/dist/services/captcha/ensure/site-key.js +83 -0
  160. package/dist/services/captcha/index.js +78 -0
  161. package/dist/services/captcha/lib/console-url.js +45 -0
  162. package/dist/services/captcha/lib/recaptcha-api.js +36 -0
  163. package/dist/services/certificates/ensure/api-key.js +22 -0
  164. package/dist/services/certificates/ensure/bundle-ids.js +115 -0
  165. package/dist/services/certificates/ensure/certificates.js +187 -0
  166. package/dist/services/certificates/ensure/profiles.js +143 -0
  167. package/dist/services/certificates/index.js +225 -0
  168. package/dist/services/certificates/lib/apple-api.js +183 -0
  169. package/dist/services/certificates/lib/certificate-manager.js +252 -0
  170. package/dist/services/certificates/lib/identifier-manager.js +107 -0
  171. package/dist/services/certificates/lib/keychain.js +135 -0
  172. package/dist/services/certificates/lib/manual-walkthrough.js +165 -0
  173. package/dist/services/certificates/lib/profile-manager.js +115 -0
  174. package/dist/services/chat/data/baseline-knowledge.md +96 -0
  175. package/dist/services/chat/ensure/chat.js +106 -0
  176. package/dist/services/chat/ensure/user.js +45 -0
  177. package/dist/services/chat/index.js +139 -0
  178. package/dist/services/chat/lib/baseline-knowledge.js +137 -0
  179. package/dist/services/cloud/ensure/authentication.js +267 -0
  180. package/dist/services/cloud/ensure/billing.js +120 -0
  181. package/dist/services/cloud/ensure/cloud-messaging.js +105 -0
  182. package/dist/services/cloud/ensure/database.js +60 -0
  183. package/dist/services/cloud/ensure/firestore.js +79 -0
  184. package/dist/services/cloud/ensure/functions.js +49 -0
  185. package/dist/services/cloud/ensure/hosting.js +398 -0
  186. package/dist/services/cloud/ensure/oauth-consent.js +248 -0
  187. package/dist/services/cloud/ensure/project-settings.js +72 -0
  188. package/dist/services/cloud/ensure/sdk-config.js +95 -0
  189. package/dist/services/cloud/ensure/service-account.js +152 -0
  190. package/dist/services/cloud/ensure/services.js +103 -0
  191. package/dist/services/cloud/ensure/storage.js +47 -0
  192. package/dist/services/cloud/index.js +130 -0
  193. package/dist/services/cloud/lib/access-heal.js +130 -0
  194. package/dist/services/cloud/lib/firebase-api.js +662 -0
  195. package/dist/services/cloud/lib/project-flow.js +102 -0
  196. package/dist/services/directory/ensure/entry.js +48 -0
  197. package/dist/services/directory/index.js +64 -0
  198. package/dist/services/directory/lib/blocks.js +104 -0
  199. package/dist/services/disperse/index.js +45 -0
  200. package/dist/services/disperse/write/certs.js +117 -0
  201. package/dist/services/domain/ensure/nameservers.js +179 -0
  202. package/dist/services/domain/index.js +69 -0
  203. package/dist/services/domain/lib/namecheap-api.js +167 -0
  204. package/dist/services/domain/lib/registrars.js +46 -0
  205. package/dist/services/domain/lib/whitelist-walkthrough.js +76 -0
  206. package/dist/services/edge/ensure/cache-rules.js +105 -0
  207. package/dist/services/edge/ensure/dns-records.js +304 -0
  208. package/dist/services/edge/ensure/email-routing.js +292 -0
  209. package/dist/services/edge/ensure/rules-configuration.js +98 -0
  210. package/dist/services/edge/ensure/rules-managed-transforms.js +101 -0
  211. package/dist/services/edge/ensure/rules-redirect.js +107 -0
  212. package/dist/services/edge/ensure/rules-response-headers.js +90 -0
  213. package/dist/services/edge/ensure/rules-security.js +142 -0
  214. package/dist/services/edge/ensure/speed-scheduled-tests.js +98 -0
  215. package/dist/services/edge/ensure/workers.js +219 -0
  216. package/dist/services/edge/ensure/zone-settings.js +108 -0
  217. package/dist/services/edge/ensure/zone.js +183 -0
  218. package/dist/services/edge/index.js +73 -0
  219. package/dist/services/edge/lib/cloudflare-api.js +84 -0
  220. package/dist/services/edge/lib/dns-records-helpers.js +518 -0
  221. package/dist/services/edge/lib/read-cache.js +16 -0
  222. package/dist/services/edge/lib/ruleset-helper.js +108 -0
  223. package/dist/services/edge/workers/omega-api-proxy.js +43 -0
  224. package/dist/services/email/data/baseline-filter.md +4 -0
  225. package/dist/services/email/data/baseline-knowledge.md +86 -0
  226. package/dist/services/email/ensure/agent.js +107 -0
  227. package/dist/services/email/ensure/user.js +45 -0
  228. package/dist/services/email/index.js +138 -0
  229. package/dist/services/email/lib/baseline.js +82 -0
  230. package/dist/services/email/lib/knowledge-file.js +53 -0
  231. package/dist/services/forms/ensure/form.js +46 -0
  232. package/dist/services/forms/ensure/user.js +45 -0
  233. package/dist/services/forms/index.js +138 -0
  234. package/dist/services/migrations/ensure/notifications.js +189 -0
  235. package/dist/services/migrations/ensure/orders.js +34 -0
  236. package/dist/services/migrations/ensure/payment-provider.js +132 -0
  237. package/dist/services/migrations/ensure/payments-intents.js +34 -0
  238. package/dist/services/migrations/ensure/state-retirement.js +266 -0
  239. package/dist/services/migrations/ensure/targets-rename.js +124 -0
  240. package/dist/services/migrations/ensure/users.js +1176 -0
  241. package/dist/services/migrations/index.js +101 -0
  242. package/dist/services/migrations/lib/attribution-touch.js +64 -0
  243. package/dist/services/migrations/lib/ensure-metadata.js +144 -0
  244. package/dist/services/migrations/lib/migration-runner.js +473 -0
  245. package/dist/services/migrations/lib/sanitize-strings.js +112 -0
  246. package/dist/services/migrations/lib/schema-validator.js +154 -0
  247. package/dist/services/monitoring/ensure/dsn.js +54 -0
  248. package/dist/services/monitoring/ensure/projects.js +135 -0
  249. package/dist/services/monitoring/index.js +54 -0
  250. package/dist/services/monitoring/lib/sentry-api.js +94 -0
  251. package/dist/services/newsletter/ensure/custom-fields.js +90 -0
  252. package/dist/services/newsletter/ensure/publication.js +94 -0
  253. package/dist/services/newsletter/ensure/segments.js +140 -0
  254. package/dist/services/newsletter/ensure/webhook.js +108 -0
  255. package/dist/services/newsletter/index.js +64 -0
  256. package/dist/services/newsletter/lib/beehiiv-api.js +124 -0
  257. package/dist/services/newsletter/lib/segment-automation.js +577 -0
  258. package/dist/services/payment/ensure/chargebee-account.js +30 -0
  259. package/dist/services/payment/ensure/chargebee-products.js +359 -0
  260. package/dist/services/payment/ensure/chargebee-webhook.js +113 -0
  261. package/dist/services/payment/ensure/paypal-account.js +36 -0
  262. package/dist/services/payment/ensure/paypal-products.js +374 -0
  263. package/dist/services/payment/ensure/paypal-webhook.js +128 -0
  264. package/dist/services/payment/ensure/stripe-account.js +93 -0
  265. package/dist/services/payment/ensure/stripe-disputes.js +56 -0
  266. package/dist/services/payment/ensure/stripe-products.js +245 -0
  267. package/dist/services/payment/ensure/stripe-radar.js +74 -0
  268. package/dist/services/payment/ensure/stripe-webhook.js +130 -0
  269. package/dist/services/payment/index.js +163 -0
  270. package/dist/services/payment/lib/chargebee-api.js +338 -0
  271. package/dist/services/payment/lib/payment-utils.js +116 -0
  272. package/dist/services/payment/lib/paypal-api.js +354 -0
  273. package/dist/services/payment/lib/provider-setup.js +134 -0
  274. package/dist/services/payment/lib/stripe-api.js +152 -0
  275. package/dist/services/repo/ensure/org.js +70 -0
  276. package/dist/services/repo/ensure/pages.js +72 -0
  277. package/dist/services/repo/ensure/repo.js +90 -0
  278. package/dist/services/repo/index.js +52 -0
  279. package/dist/services/repo/lib/github-api.js +196 -0
  280. package/dist/services/search/ensure/ga-link.js +57 -0
  281. package/dist/services/search/ensure/property.js +137 -0
  282. package/dist/services/search/ensure/sitemaps.js +70 -0
  283. package/dist/services/search/index.js +61 -0
  284. package/dist/services/search/lib/search-console-api.js +92 -0
  285. package/dist/services/seo/ensure/github-repos.js +271 -0
  286. package/dist/services/seo/index.js +55 -0
  287. package/dist/services/seo/lib/gh-api.js +161 -0
  288. package/dist/services/seo/templates/developer-tool/.github/workflows/maintenance.yml +25 -0
  289. package/dist/services/seo/templates/developer-tool/.nvmrc +1 -0
  290. package/dist/services/seo/templates/developer-tool/_README.md.js +121 -0
  291. package/dist/services/seo/templates/developer-tool/_package.json.js +33 -0
  292. package/dist/services/seo/templates/developer-tool/src/index.js +120 -0
  293. package/dist/services/seo/templates/index.js +57 -0
  294. package/dist/services/server/ensure/brands.js +63 -0
  295. package/dist/services/server/index.js +42 -0
  296. package/dist/services/testing/ensure/target-checks.js +97 -0
  297. package/dist/services/testing/index.js +11 -0
  298. package/dist/services/testing/lib/checks.js +467 -0
  299. package/dist/services/update/index.js +20 -0
  300. package/dist/services/update/lib/cache.js +59 -0
  301. package/dist/services/update/lib/fingerprint.js +157 -0
  302. package/dist/services/update/write/targets.js +206 -0
  303. package/dist/services/workspace/ensure/agents.js +42 -0
  304. package/dist/services/workspace/ensure/claude-settings.js +34 -0
  305. package/dist/services/workspace/ensure/config.js +54 -0
  306. package/dist/services/workspace/ensure/defaults.js +60 -0
  307. package/dist/services/workspace/ensure/env-keys.js +55 -0
  308. package/dist/services/workspace/ensure/env-order.js +66 -0
  309. package/dist/services/workspace/ensure/env-rules.js +97 -0
  310. package/dist/services/workspace/ensure/gitignore.js +18 -0
  311. package/dist/services/workspace/ensure/scripts.js +126 -0
  312. package/dist/services/workspace/ensure/structure.js +97 -0
  313. package/dist/services/workspace/ensure/translation-sdk.js +148 -0
  314. package/dist/services/workspace/ensure/workflows.js +54 -0
  315. package/dist/services/workspace/index.js +8 -0
  316. package/dist/vendor/account/engine.js +182 -0
  317. package/dist/vendor/account/features.js +220 -0
  318. package/dist/vendor/account/index.js +53 -0
  319. package/dist/vendor/account/schema.js +272 -0
  320. package/dist/vendor/account/subscription.js +38 -0
  321. package/dist/vendor/config/company.js +31 -0
  322. package/dist/vendor/config/defaults.js +173 -0
  323. package/dist/vendor/config/demo.js +18 -0
  324. package/dist/vendor/config/desktop-artifacts.js +110 -0
  325. package/dist/vendor/config/edit.js +769 -0
  326. package/dist/vendor/config/env-delivery.js +145 -0
  327. package/dist/vendor/config/env-rules.js +93 -0
  328. package/dist/vendor/config/env-schema.js +1078 -0
  329. package/dist/vendor/config/env.js +445 -0
  330. package/dist/vendor/config/hooks.js +97 -0
  331. package/dist/vendor/config/index.js +237 -0
  332. package/dist/vendor/config/instances.js +208 -0
  333. package/dist/vendor/config/load.js +490 -0
  334. package/dist/vendor/config/merge.js +68 -0
  335. package/dist/vendor/config/order.js +139 -0
  336. package/dist/vendor/config/ports.js +374 -0
  337. package/dist/vendor/config/providers.js +32 -0
  338. package/dist/vendor/config/repo.js +142 -0
  339. package/dist/vendor/config/retired-keys.js +430 -0
  340. package/dist/vendor/config/schema.js +1610 -0
  341. package/dist/vendor/config/secrets.js +50 -0
  342. package/dist/vendor/config/seed.js +34 -0
  343. package/dist/vendor/config/site-global.js +205 -0
  344. package/dist/vendor/config/validate.js +554 -0
  345. package/dist/vendor/config/winback.js +61 -0
  346. package/dist/vendor/devkit/attach-log-file.js +262 -0
  347. package/dist/vendor/devkit/certs.js +199 -0
  348. package/dist/vendor/devkit/ci-workflows.js +520 -0
  349. package/dist/vendor/devkit/cli-router.js +156 -0
  350. package/dist/vendor/devkit/command-path.js +46 -0
  351. package/dist/vendor/devkit/deploy-record.js +180 -0
  352. package/dist/vendor/devkit/flows.js +317 -0
  353. package/dist/vendor/devkit/local-https.js +360 -0
  354. package/dist/vendor/devkit/local.js +1905 -0
  355. package/dist/vendor/devkit/logger.js +128 -0
  356. package/dist/vendor/devkit/omega-bin.js +345 -0
  357. package/dist/vendor/devkit/prompt.js +187 -0
  358. package/dist/vendor/devkit/safe-install.js +18 -0
  359. package/dist/vendor/devkit/stop-signals.js +28 -0
  360. package/dist/vendor/devkit/test/scope.js +162 -0
  361. package/dist/vendor/devkit/translate/cache.js +84 -0
  362. package/dist/vendor/devkit/translate/engine.js +243 -0
  363. package/dist/vendor/devkit/translate/index.js +49 -0
  364. package/dist/vendor/devkit/translate/languages.js +134 -0
  365. package/dist/vendor/devkit/translate/providers.js +188 -0
  366. package/dist/vendor/devkit/update.js +569 -0
  367. package/docs/AGENTS.md +200 -0
  368. package/docs/account.md +45 -0
  369. package/docs/advertising.md +46 -0
  370. package/docs/ai.md +34 -0
  371. package/docs/analytics.md +69 -0
  372. package/docs/assets.md +57 -0
  373. package/docs/bookmark.md +26 -0
  374. package/docs/brand.md +151 -0
  375. package/docs/campaigns.md +96 -0
  376. package/docs/captcha.md +46 -0
  377. package/docs/certificates.md +68 -0
  378. package/docs/chat.md +47 -0
  379. package/docs/cloud.md +110 -0
  380. package/docs/company.md +64 -0
  381. package/docs/directory.md +140 -0
  382. package/docs/disperse.md +46 -0
  383. package/docs/domain.md +56 -0
  384. package/docs/edge.md +234 -0
  385. package/docs/email.md +42 -0
  386. package/docs/forms.md +48 -0
  387. package/docs/index.md +109 -0
  388. package/docs/migration.md +203 -0
  389. package/docs/migrations.md +56 -0
  390. package/docs/monitoring.md +41 -0
  391. package/docs/newsletter.md +48 -0
  392. package/docs/payment.md +83 -0
  393. package/docs/repo.md +48 -0
  394. package/docs/search.md +44 -0
  395. package/docs/seo.md +34 -0
  396. package/docs/server.md +37 -0
  397. package/docs/shared/agent-docs.md +89 -0
  398. package/docs/shared/analytics.md +612 -0
  399. package/docs/shared/brands.md +51 -0
  400. package/docs/shared/breaking-changes.md +497 -0
  401. package/docs/shared/config.md +1387 -0
  402. package/docs/shared/deploys.md +215 -0
  403. package/docs/shared/icons.md +201 -0
  404. package/docs/shared/local-dev.md +147 -0
  405. package/docs/shared/logging.md +202 -0
  406. package/docs/shared/monitoring.md +153 -0
  407. package/docs/shared/publishing.md +183 -0
  408. package/docs/shared/rulings.md +34 -0
  409. package/docs/shared/testing.md +147 -0
  410. package/docs/shared/theming.md +604 -0
  411. package/docs/shared/translation.md +291 -0
  412. package/docs/shared/updates.md +61 -0
  413. package/docs/testing.md +34 -0
  414. package/docs/update.md +36 -0
  415. package/docs/workspace.md +64 -0
  416. package/package.json +88 -0
@@ -0,0 +1,262 @@
1
+ // attachLogFile(filePath, options) — tee process.stdout + process.stderr to a log file.
2
+ //
3
+ // Every chunk reaches BOTH sinks: the terminal exactly as written (colors intact) and the
4
+ // file with ANSI escapes stripped, so `grep`/`tail -f` reads clean. The file opens
5
+ // truncated — a new launch clears the previous run's log (no history kept).
6
+ //
7
+ // Writes go to an open fd SYNCHRONOUSLY. A stream's buffer dies with the process, which
8
+ // dropped exactly the lines describing a crash; the per-write syscall buys the crash tail.
9
+ //
10
+ // `append: true` opens the file for APPEND instead, for a log MORE THAN ONE process writes
11
+ // (the signing box's runner log: a `runner start` parent, then every `sign-windows` its
12
+ // listener spawns). Default is unchanged — one launch, one log.
13
+ //
14
+ // attach(filePath, { env, attachInCI, append }) — `env` is the environment the CI check
15
+ // reads (the test seam), `attachInCI` keeps the tee on a runner, `append` keeps what the
16
+ // last process wrote.
17
+ //
18
+ // The default export is a process-wide SINGLETON (the common case: one CLI verb tees its
19
+ // whole run to one file). `createTee()` returns an INDEPENDENT tee. Tees STACK: an attach
20
+ // captures the CURRENT writers — the raw stream, or an outer tee's patched writer — so
21
+ // writes fan out through every layer and each detach restores the exact writers it found.
22
+ // That is what keeps an inner tee's detach from stealing (and truncating) the outer tee's
23
+ // file, the way a shared singleton did.
24
+ //
25
+ // Skipped in CI: a runner has its own log capture and wants no logs/ left in the workspace.
26
+ // `attachInCI: true` opts out of that skip, for a sink whose file is the POINT rather than
27
+ // workspace debris (the signing box's own runner log, which a CI job is exactly when it
28
+ // matters). Default is unchanged: every other caller still skips.
29
+ //
30
+ // `createChildLog()` is the sibling sink for output that never passes through this
31
+ // process' writers at all — a SPAWNED child's piped stdout/stderr. See below.
32
+
33
+ // Libraries
34
+ const fs = require('fs');
35
+ const path = require('path');
36
+ const Logger = require('./logger');
37
+
38
+ // Variables
39
+ const logger = new Logger('attach-log-file');
40
+ const ANSI_PATTERN = /\x1B\[[0-9;]*[a-zA-Z]/g;
41
+ const NOOP_DETACH = function () {};
42
+
43
+ function stripAnsi(value) {
44
+ return String(value).replace(ANSI_PATTERN, '');
45
+ }
46
+
47
+ // Same predicate the rest of the repo uses for "a runner is driving this".
48
+ function isCI(env) {
49
+ return env.GITHUB_ACTIONS === 'true' || env.CI === 'true';
50
+ }
51
+
52
+ // Factory — each call returns an independent tee with its own closure state.
53
+ function createTee() {
54
+ let activePath = null;
55
+ let activeDetach = null;
56
+ let warned = false;
57
+
58
+ function attach(filePath, options) {
59
+ const env = (options && options.env) || process.env;
60
+ const attachInCI = Boolean(options && options.attachInCI);
61
+
62
+ if (!filePath || (isCI(env) && !attachInCI)) { return NOOP_DETACH; }
63
+
64
+ const abs = path.resolve(filePath);
65
+
66
+ // Already teeing this exact file — do not patch a second time (that would write
67
+ // every line twice).
68
+ if (activePath === abs) { return activeDetach; }
69
+ if (activeDetach) { activeDetach(); }
70
+
71
+ let fd;
72
+ try {
73
+ fs.mkdirSync(path.dirname(abs), { recursive: true });
74
+ fd = fs.openSync(abs, options && options.append ? 'a' : 'w');
75
+ fs.writeSync(fd, `# omega log — ${new Date().toISOString()} — pid=${process.pid}\n`);
76
+ } catch (e) {
77
+ // A log file we cannot open is a lost log, never a lost process — the tee exists to
78
+ // observe the run, so it declines and the run continues untouched.
79
+ if (!warned) {
80
+ warned = true;
81
+ logger.warn(`Could not open log file ${abs} — continuing without one (${e.message})`);
82
+ }
83
+ return NOOP_DETACH;
84
+ }
85
+
86
+ // Whatever is installed right now, captured by reference so detach restores it exactly.
87
+ const priorStdoutWrite = process.stdout.write;
88
+ const priorStderrWrite = process.stderr.write;
89
+
90
+ function writeToFile(chunk) {
91
+ try {
92
+ fs.writeSync(fd, stripAnsi(chunk));
93
+ } catch (e) {
94
+ // A broken log sink never breaks the writer it wraps.
95
+ }
96
+ }
97
+
98
+ process.stdout.write = function (chunk, ...rest) {
99
+ writeToFile(chunk);
100
+ return priorStdoutWrite.call(process.stdout, chunk, ...rest);
101
+ };
102
+ process.stderr.write = function (chunk, ...rest) {
103
+ writeToFile(chunk);
104
+ return priorStderrWrite.call(process.stderr, chunk, ...rest);
105
+ };
106
+
107
+ function closeFd() {
108
+ try {
109
+ fs.closeSync(fd);
110
+ } catch (e) {
111
+ // Already closed, or the process is tearing down.
112
+ }
113
+ }
114
+
115
+ // The fd outlives a crash otherwise — the writes already landed, this is the handle.
116
+ process.on('exit', closeFd);
117
+
118
+ let detached = false;
119
+ function detach() {
120
+ if (detached) { return; }
121
+ detached = true;
122
+
123
+ process.stdout.write = priorStdoutWrite;
124
+ process.stderr.write = priorStderrWrite;
125
+ process.off('exit', closeFd);
126
+ closeFd();
127
+
128
+ if (activeDetach === detach) {
129
+ activePath = null;
130
+ activeDetach = null;
131
+ }
132
+ }
133
+
134
+ activePath = abs;
135
+ activeDetach = detach;
136
+
137
+ return detach;
138
+ }
139
+
140
+ return {
141
+ attach,
142
+ detach: () => { if (activeDetach) { activeDetach(); } },
143
+ };
144
+ }
145
+
146
+ // createChildLog(options) — the sink for a SPAWNED process' output.
147
+ //
148
+ // The tee above patches this process' writers; a child's stdout/stderr never
149
+ // pass through them — they arrive as buffers on a pipe. The caller mirrors each
150
+ // buffer to the terminal untouched and hands it here, where it lands
151
+ // ANSI-stripped in a file that opens truncated, same as the tee's.
152
+ //
153
+ // The roll is what the tee has no need for: a child that stays up for days (a
154
+ // Firebase emulator) has to be truncatable MID-RUN, so a sibling process asks
155
+ // for a fresh log by touching `resetPath` and the poll below honors it within
156
+ // `pollMs`. Ported from BEM's emulator/serve commands, which carried a copy each.
157
+ //
158
+ // Writes go to an open fd synchronously, for the same reason the tee's do: the
159
+ // lines describing a crash are the ones a buffered stream drops.
160
+ //
161
+ // Every operation is best-effort — a broken log sink must never break the
162
+ // process it observes. It does say so ONCE though: a file that would not open
163
+ // warns on the first write it drops, so a silently empty log is never a
164
+ // surprise, and stays quiet after that.
165
+ //
166
+ // @param {object} options
167
+ // @param {string} options.logPath - File the child's output lands in (truncated on open)
168
+ // @param {string} [options.resetPath] - Sentinel another process touches to request a fresh log
169
+ // @param {number} [options.pollMs=500] - Sentinel poll interval
170
+ // @returns {{ path: string, write: Function, roll: Function, close: Function }}
171
+ function createChildLog(options) {
172
+ const logPath = path.resolve(options.logPath);
173
+ const resetPath = options.resetPath ? path.resolve(options.resetPath) : null;
174
+ const pollMs = options.pollMs || 500;
175
+
176
+ let fd = null;
177
+ let openError = null;
178
+ let warned = false;
179
+
180
+ function removeSentinel() {
181
+ if (!resetPath) { return; }
182
+ try {
183
+ fs.unlinkSync(resetPath);
184
+ } catch (e) {
185
+ // Not there — the normal case.
186
+ }
187
+ }
188
+
189
+ function closeFd() {
190
+ if (fd === null) { return; }
191
+ try {
192
+ fs.closeSync(fd);
193
+ } catch (e) {
194
+ // Already closed, or the process is tearing down.
195
+ }
196
+ fd = null;
197
+ }
198
+
199
+ // Reopen with 'w' rather than truncating in place: an external truncate leaves
200
+ // the writer's offset where it was, so the file comes back sparse.
201
+ function roll() {
202
+ closeFd();
203
+ try {
204
+ fs.mkdirSync(path.dirname(logPath), { recursive: true });
205
+ fd = fs.openSync(logPath, 'w');
206
+ openError = null;
207
+ } catch (e) {
208
+ // A log we cannot open is a lost log, never a lost process — but a
209
+ // SILENT one is a run whose output nobody knows went nowhere, so the
210
+ // first dropped write says so (once), same as the tee's own warn.
211
+ fd = null;
212
+ openError = e;
213
+ }
214
+ }
215
+
216
+ function write(chunk) {
217
+ if (fd === null) {
218
+ if (openError && !warned) {
219
+ warned = true;
220
+ logger.warn(`Could not open log file ${logPath} — child output is not being recorded (${openError.message})`);
221
+ }
222
+ return;
223
+ }
224
+ try {
225
+ fs.writeSync(fd, stripAnsi(chunk));
226
+ } catch (e) {
227
+ // A broken log sink never breaks the stream it mirrors.
228
+ }
229
+ }
230
+
231
+ roll();
232
+
233
+ // A sentinel a crashed run left behind would roll the fresh log on the first poll.
234
+ removeSentinel();
235
+
236
+ const timer = resetPath ? setInterval(() => {
237
+ if (!fs.existsSync(resetPath)) { return; }
238
+ roll();
239
+ removeSentinel();
240
+ }, pollMs) : null;
241
+
242
+ function close() {
243
+ if (timer) { clearInterval(timer); }
244
+ closeFd();
245
+ removeSentinel();
246
+ }
247
+
248
+ return { path: logPath, write, roll, close };
249
+ }
250
+
251
+ // Process-wide singleton — the production entry point.
252
+ const singleton = createTee();
253
+
254
+ function attachLogFile(filePath, options) {
255
+ return singleton.attach(filePath, options);
256
+ }
257
+
258
+ module.exports = attachLogFile;
259
+ module.exports.detach = singleton.detach;
260
+ module.exports.stripAnsi = stripAnsi;
261
+ module.exports.createTee = createTee;
262
+ module.exports.createChildLog = createChildLog;
@@ -0,0 +1,199 @@
1
+ /**
2
+ * Signing-artifact delivery — the copy layer of the ONE delivery step (#678).
3
+ *
4
+ * Sources are the certificates service's outputs under a signing tree,
5
+ * `<sourceRoot>/.omega/certificates/apple/` (the company workspace's root for
6
+ * a company-managed brand, the brand root otherwise); destinations are the
7
+ * target's own certs dir (desktop: config/certs/ per EM v1.4.1+, mobile:
8
+ * build/certs/). Copies are byte-compared first, so a converged run rewrites
9
+ * nothing, and every certs dir gets a self-protecting .gitignore (`*`) — signing
10
+ * material can never be committed, even in a target the framework's setup
11
+ * hasn't touched yet.
12
+ *
13
+ * Delivery is WARN-ONLY on a miss: a rule with no source reports `missing` and
14
+ * leaves the dest alone. The dests are documented HUMAN drop points (desktop's
15
+ * signing docs tell an operator to copy their .p12/.p8 straight into
16
+ * config/certs/), and `omega company init` scaffolds the signing tree EMPTY —
17
+ * so a delete-on-missing pass would eat hand-placed signing material on the
18
+ * next build.
19
+ *
20
+ * This module DELIVERS and reports; it logs nothing and classifies nothing.
21
+ * Which misses are tolerable (`optional`) is on the rules, which callers read
22
+ * through resolveCertRules — the manager's disperse writer turns them into its
23
+ * per-rule lines, a desktop build into whatever its own voice is.
24
+ */
25
+ const { join, dirname } = require('node:path');
26
+ const jetpack = require('fs-jetpack');
27
+
28
+ // Paths: source relative to .omega/certificates/apple/, dest relative to the
29
+ // target dir. `{env.VAR}` and `{brand.id}` placeholders supported on both sides.
30
+ const CERT_FILE_MAP = {
31
+ desktop: [
32
+ // macOS code signing — Developer ID Application (.p12 with private key)
33
+ {
34
+ source: 'certificates/DEVELOPER_ID_APPLICATION_G2.p12',
35
+ dest: 'config/certs/developer-id-application.p12',
36
+ },
37
+ // macOS installer signing (only used if shipping a .pkg installer)
38
+ {
39
+ source: 'certificates/DEVELOPER_ID_INSTALLER_G2.p12',
40
+ dest: 'config/certs/developer-id-installer.p12',
41
+ optional: true,
42
+ },
43
+ // Notarization API key — App Store Connect .p8
44
+ {
45
+ source: 'AuthKey_{env.APPLE_API_KEY_ID}.p8',
46
+ dest: 'config/certs/AuthKey_{env.APPLE_API_KEY_ID}.p8',
47
+ },
48
+ // Per-brand provisioning profile (only present if cert generation produced one)
49
+ {
50
+ source: 'profiles/{brand.id}/DEVELOPER_ID_APPLICATION_G2/MACOS.mobileprovision',
51
+ dest: 'config/certs/{brand.id}.provisionprofile',
52
+ optional: true,
53
+ },
54
+ ],
55
+ mobile: [
56
+ // iOS App Store distribution — used by xcodebuild
57
+ {
58
+ source: 'certificates/IOS_DISTRIBUTION.p12',
59
+ dest: 'build/certs/ios-distribution.p12',
60
+ },
61
+ // Notarization / API access from CI
62
+ {
63
+ source: 'AuthKey_{env.APPLE_API_KEY_ID}.p8',
64
+ dest: 'build/certs/AuthKey_{env.APPLE_API_KEY_ID}.p8',
65
+ },
66
+ // Per-brand iOS provisioning profile
67
+ {
68
+ source: 'profiles/{brand.id}/IOS_DISTRIBUTION/IOS.mobileprovision',
69
+ dest: 'build/certs/{brand.id}.mobileprovision',
70
+ optional: true,
71
+ },
72
+ ],
73
+ };
74
+
75
+ /**
76
+ * Resolve `{env.VAR}` and `{brand.key}` placeholders. Returns null when an
77
+ * env placeholder is unset — the rule can't produce a real path, and a
78
+ * literal `AuthKey_.p8` miss would only confuse.
79
+ */
80
+ function resolveTemplate(template, brand) {
81
+ let missing = false;
82
+
83
+ const resolved = template.replace(/\{([^}]+)\}/g, (match, path) => {
84
+ const [source, ...keyParts] = path.split('.');
85
+ const key = keyParts.join('.');
86
+ if (source === 'env') {
87
+ const value = process.env[key] || '';
88
+ if (!value) missing = true;
89
+ return value;
90
+ }
91
+ if (source === 'brand') return brand?.[key] || '';
92
+ return match;
93
+ });
94
+
95
+ return missing ? null : resolved;
96
+ }
97
+
98
+ /**
99
+ * Ensure the certs dir ignores everything it holds — signing material must
100
+ * never land in git, regardless of whether the framework's own .gitignore
101
+ * exists yet.
102
+ */
103
+ function ensureCertsIgnore(destDir) {
104
+ const ignorePath = join(destDir, '.gitignore');
105
+ if (!jetpack.exists(ignorePath)) {
106
+ jetpack.write(ignorePath, '*\n!.gitignore\n');
107
+ }
108
+ }
109
+
110
+ /**
111
+ * The signing tree a source root holds — the ONE home of that path.
112
+ *
113
+ * @param {string} sourceRoot - Company root (company-managed brands) or brand root.
114
+ * @returns {string} Absolute path to .omega/certificates/apple/.
115
+ */
116
+ function certsSourceDir(sourceRoot) {
117
+ return join(sourceRoot, '.omega', 'certificates', 'apple');
118
+ }
119
+
120
+ /**
121
+ * A target's signing rules with their placeholders resolved.
122
+ *
123
+ * @param {object} input
124
+ * @param {string} input.target - Target type ('desktop'/'mobile'); anything
125
+ * else has no signing rules and returns [].
126
+ * @param {object} [input.brand] - Brand config block (`{brand.id}` resolves from it).
127
+ * @returns {Array<{ source, dest, optional, sourceRel, destRel }>} `sourceRel`/
128
+ * `destRel` are null when an env placeholder is unset; `dest` is the template.
129
+ */
130
+ function resolveCertRules({ target, brand = null }) {
131
+ return (CERT_FILE_MAP[target] || []).map((rule) => {
132
+ const sourceRel = resolveTemplate(rule.source, brand);
133
+ const destRel = sourceRel === null ? null : resolveTemplate(rule.dest, brand);
134
+
135
+ return {
136
+ source: rule.source,
137
+ dest: rule.dest,
138
+ optional: !!rule.optional,
139
+ sourceRel,
140
+ destRel,
141
+ };
142
+ });
143
+ }
144
+
145
+ /**
146
+ * Copy a target's signing artifacts out of the signing tree.
147
+ *
148
+ * @param {object} input
149
+ * @param {string} input.sourceRoot - Company root or brand root holding .omega/certificates/apple/.
150
+ * @param {string} input.targetDir - The target's own directory (destinations resolve inside it).
151
+ * @param {string} input.target - Target type ('desktop'/'mobile').
152
+ * @param {object} [input.brand] - Brand config block, for `{brand.id}` rules.
153
+ * @param {boolean} [input.dryRun] - Plan only: `copied` says what WOULD be
154
+ * written, nothing is written.
155
+ * @returns {{ copied: string[], current: string[], missing: string[] }}
156
+ * Target-relative paths — copied (written this pass), current (already
157
+ * byte-identical), missing (no source, or an unresolved placeholder: that rule
158
+ * reports its dest TEMPLATE).
159
+ */
160
+ function deliverCerts({ sourceRoot, targetDir, target, brand = null, dryRun = false }) {
161
+ const appleDir = certsSourceDir(sourceRoot);
162
+ const copied = [];
163
+ const current = [];
164
+ const missing = [];
165
+
166
+ for (const rule of resolveCertRules({ target, brand })) {
167
+ // An unset env placeholder (e.g. APPLE_API_KEY_ID) means the rule has no
168
+ // real path to resolve to — it reports its template, which names the gap
169
+ if (rule.destRel === null) {
170
+ missing.push(rule.dest);
171
+ continue;
172
+ }
173
+
174
+ const destPath = join(targetDir, rule.destRel);
175
+ const sourcePath = join(appleDir, rule.sourceRel);
176
+ if (!jetpack.exists(sourcePath)) {
177
+ missing.push(rule.destRel);
178
+ continue;
179
+ }
180
+
181
+ const sourceBytes = jetpack.read(sourcePath, 'buffer');
182
+ const destBytes = jetpack.exists(destPath) ? jetpack.read(destPath, 'buffer') : null;
183
+
184
+ if (destBytes && sourceBytes.equals(destBytes)) {
185
+ current.push(rule.destRel);
186
+ continue;
187
+ }
188
+
189
+ copied.push(rule.destRel);
190
+ if (dryRun) continue;
191
+
192
+ jetpack.copy(sourcePath, destPath, { overwrite: true });
193
+ ensureCertsIgnore(dirname(destPath));
194
+ }
195
+
196
+ return { copied, current, missing };
197
+ }
198
+
199
+ module.exports = { deliverCerts, resolveCertRules, certsSourceDir, CERT_FILE_MAP };