@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,140 @@
1
+ /**
2
+ * Ensure @omega.js/backend's segments exist on the Beehiiv publication.
3
+ *
4
+ * Beehiiv has NO segment-create API — the read side lists what exists,
5
+ * and creation happens through the dashboard UI. Interactive runs offer
6
+ * to drive that UI via the companion Chrome extension (trusted-event
7
+ * browser automation; see lib/segment-automation.js) or to open the
8
+ * dashboard for manual creation, then RE-verify against the API so
9
+ * "created" means Beehiiv says so. Non-interactive and dry runs never
10
+ * mutate: missing segments warn with human-readable conditions.
11
+ */
12
+ const chalk = require('chalk').default;
13
+ const { select } = require('../../../vendor/devkit/prompt.js');
14
+ const { openBrowserAndPoll } = require('../../../vendor/devkit/flows.js');
15
+ const { segmentsFor } = require('../../../lib/backend-marketing.js');
16
+ const { AutomationClient } = require('../../../lib/automation-client.js');
17
+ const { formatCondition, automateCreateSegment } = require('../lib/segment-automation.js');
18
+ const { canPrompt } = require('../../../lib/run-gates.js');
19
+
20
+ const BEEHIIV_SEGMENTS = segmentsFor('beehiiv');
21
+ const SEGMENTS_URL = 'https://app.beehiiv.com/segments';
22
+
23
+ /** Names of the @omega.js/backend segments missing from the publication. */
24
+ async function listMissing(api, publicationId) {
25
+ const existing = await api.getSegments(publicationId);
26
+ const existingByName = new Set(existing.map((s) => s.name));
27
+ return BEEHIIV_SEGMENTS.filter((s) => !existingByName.has(s.name));
28
+ }
29
+
30
+ module.exports = async function ensureSegments(context) {
31
+ const { beehiivApi: api, serviceData, options = {} } = context;
32
+
33
+ const publicationId = serviceData.publicationId;
34
+ if (!publicationId) {
35
+ console.log(chalk.dim(' ⊘ No publication yet — nothing to verify segments on'));
36
+ return {};
37
+ }
38
+
39
+ const missing = await listMissing(api, publicationId);
40
+
41
+ if (missing.length === 0) {
42
+ console.log(` ${chalk.green('✓')} All ${BEEHIIV_SEGMENTS.length} segments exist`);
43
+ return { output: { segments: { total: BEEHIIV_SEGMENTS.length, missing: [] } } };
44
+ }
45
+
46
+ console.log(` ${chalk.yellow('⚠')} ${missing.length} segment(s) missing — Beehiiv has no segment-create API:`);
47
+ for (const segment of missing) {
48
+ const joiner = segment.logic === 'or' ? ' OR ' : ' AND ';
49
+ const criteria = segment.conditions.map((c) => formatCondition(c)).join(joiner);
50
+ console.log(` ${chalk.dim('•')} ${chalk.cyan(segment.display)} ${chalk.dim(`(${segment.name})`)}`);
51
+ console.log(` ${chalk.dim('→')} ${criteria}`);
52
+ }
53
+
54
+ const warned = (created = []) => ({
55
+ status: 'warned',
56
+ reason: `${missing.length} segment(s) missing: ${missing.map((s) => s.name).join(', ')}`,
57
+ output: { segments: { total: BEEHIIV_SEGMENTS.length, missing: missing.map((s) => s.name), ...(created.length ? { created } : {}) } },
58
+ });
59
+
60
+ // Headless/dry runs stop at the instructions (build them at SEGMENTS_URL)
61
+ if (!canPrompt(options)) {
62
+ console.log(` ${chalk.dim(`→ Build them at ${SEGMENTS_URL}`)}`);
63
+ return warned();
64
+ }
65
+
66
+ const action = await select({
67
+ message: 'Create missing segments?',
68
+ choices: [
69
+ { name: 'Automate via extension', value: 'automate' },
70
+ { name: 'Open dashboard (manual)', value: 'manual' },
71
+ { name: 'Skip', value: 'skip' },
72
+ ],
73
+ default: 'automate',
74
+ });
75
+
76
+ if (action === 'skip') {
77
+ return warned();
78
+ }
79
+
80
+ const created = [];
81
+
82
+ if (action === 'manual') {
83
+ await openBrowserAndPoll({
84
+ url: SEGMENTS_URL,
85
+ label: 'the Beehiiv segments page',
86
+ promptMessage: `Create ${missing.length} missing segment(s) in Beehiiv`,
87
+ waitMessage: 'Press ENTER when done',
88
+ manualOnly: true,
89
+ });
90
+ } else {
91
+ // Automate via extension — open the dashboard first so the user can
92
+ // select the right publication before the automation drives the UI
93
+ await openBrowserAndPoll({
94
+ url: SEGMENTS_URL,
95
+ label: 'the Beehiiv segments page',
96
+ promptMessage: 'Select the correct publication in Beehiiv, then confirm to start automation',
97
+ waitMessage: 'Press ENTER when ready',
98
+ manualOnly: true,
99
+ });
100
+
101
+ console.log(` ${chalk.dim('Connecting to extension...')}`);
102
+ const client = new AutomationClient();
103
+
104
+ try {
105
+ await client.connect();
106
+ console.log(` ${chalk.dim('→')} Extension connected`);
107
+
108
+ for (const segment of missing) {
109
+ try {
110
+ console.log(` ${chalk.dim(`Creating ${segment.display}...`)}`);
111
+ await automateCreateSegment(client, segment);
112
+ console.log(` ${chalk.green('✓')} Created ${chalk.cyan(segment.display)}`);
113
+ created.push(segment.name);
114
+ } catch (e) {
115
+ console.log(` ${chalk.red('✗')} Failed to create ${chalk.cyan(segment.display)}: ${e.message}`);
116
+ }
117
+ }
118
+ } catch (e) {
119
+ console.log(` ${chalk.red('✗')} Automation failed: ${e.message}`);
120
+ } finally {
121
+ await client.disconnect();
122
+ }
123
+ }
124
+
125
+ // Re-verify — "created" is what Beehiiv reports, not what the automation
126
+ // believes it did
127
+ const remaining = await listMissing(api, publicationId);
128
+
129
+ if (remaining.length === 0) {
130
+ console.log(` ${chalk.green('✓')} All ${BEEHIIV_SEGMENTS.length} segments exist`);
131
+ return { output: { segments: { total: BEEHIIV_SEGMENTS.length, missing: [], ...(created.length ? { created } : {}) } } };
132
+ }
133
+
134
+ console.log(` ${chalk.yellow('⚠')} ${remaining.length} segment(s) still missing: ${remaining.map((s) => s.name).join(', ')}`);
135
+ return {
136
+ status: 'warned',
137
+ reason: `${remaining.length} segment(s) still missing: ${remaining.map((s) => s.name).join(', ')}`,
138
+ output: { segments: { total: BEEHIIV_SEGMENTS.length, missing: remaining.map((s) => s.name), ...(created.length ? { created } : {}) } },
139
+ };
140
+ };
@@ -0,0 +1,108 @@
1
+ /**
2
+ * Ensure the publication's webhook delivers subscription events to the
3
+ * parent @omega.js/backend's forwarder.
4
+ *
5
+ * Publications can be shared across sibling brands, so the webhook always
6
+ * points at the parent (`parent` in omega.json5, 'self' for the parent
7
+ * brand) — the parent reads the brands collection and fans each event out.
8
+ * The webhook is matched by its managed description first (stable across
9
+ * parent moves), then by URL; drift in url/event_types/enabled is patched
10
+ * with the minimum diff.
11
+ */
12
+ const chalk = require('chalk').default;
13
+ const { dryRunPlan } = require('../../../lib/run-gates.js');
14
+
15
+ // Subscription events @omega.js/backend's consent pipeline consumes (they flip
16
+ // consent.marketing.status to 'revoked' and propagate the unsub to SendGrid)
17
+ const DESIRED_EVENT_TYPES = [
18
+ 'subscription.unsubscribed',
19
+ 'subscription.deleted',
20
+ 'subscription.paused',
21
+ ];
22
+
23
+ const WEBHOOK_DESCRIPTION = '@omega.js/backend consent pipeline (managed by OMEGA — do not edit manually)';
24
+
25
+ module.exports = async function ensureWebhook(context) {
26
+ const { beehiivApi: api, brandConfig, domain, serviceData, options = {} } = context;
27
+
28
+ const publicationId = serviceData.publicationId;
29
+ if (!publicationId) {
30
+ console.log(chalk.dim(' ⊘ No publication yet — nothing to configure a webhook on'));
31
+ return {};
32
+ }
33
+
34
+ const parent = brandConfig.parent;
35
+ if (parent === false) {
36
+ // Tri-state: explicit false = deliberate opt-out, no nudge
37
+ console.log(chalk.dim(' ⊘ parent = false — webhook opted out'));
38
+ return {};
39
+ }
40
+ if (!parent) {
41
+ console.log(chalk.dim(' ⊘ No parent configured — nothing to point the webhook at'));
42
+ console.log(chalk.dim(" → Set parent in omega.json5 ('self' when this brand runs the central backend)"));
43
+ return {};
44
+ }
45
+
46
+ if (!process.env.OMEGA_WEBHOOK_KEY) {
47
+ // Unreachable by design (#635): the key is OMEGA's own (`generated:` in
48
+ // the env schema) and the newsletter service's setup mints it through the
49
+ // shared contract before any operation runs. Absent here = broken wiring.
50
+ throw new Error('OMEGA_WEBHOOK_KEY absent after the newsletter setup ran — its REQUIRES entry or its requestServiceInput call is missing');
51
+ }
52
+
53
+ const parentHost = parent === 'self'
54
+ ? domain
55
+ : parent.replace(/^https?:\/\//, '').replace(/\/$/, '');
56
+ const desiredUrl = `https://api.${parentHost}/omega/marketing/webhook/forward?provider=beehiiv&key=${process.env.OMEGA_WEBHOOK_KEY}`;
57
+
58
+ const webhooks = await api.listWebhooks(publicationId);
59
+
60
+ // The managed description is the primary key — it survives URL changes
61
+ // when a brand moves parents
62
+ const existing = webhooks.find((wh) => wh.description === WEBHOOK_DESCRIPTION)
63
+ || webhooks.find((wh) => wh.url === desiredUrl);
64
+
65
+ if (existing) {
66
+ const patch = {};
67
+ if (existing.url !== desiredUrl) {
68
+ patch.url = desiredUrl;
69
+ }
70
+ const currentEvents = new Set(existing.event_types || []);
71
+ const eventsMatch = DESIRED_EVENT_TYPES.every((e) => currentEvents.has(e))
72
+ && (existing.event_types || []).every((e) => DESIRED_EVENT_TYPES.includes(e));
73
+ if (!eventsMatch) {
74
+ patch.event_types = DESIRED_EVENT_TYPES;
75
+ }
76
+ if (existing.enabled === false) {
77
+ patch.enabled = true;
78
+ }
79
+
80
+ if (Object.keys(patch).length === 0) {
81
+ console.log(` ${chalk.green('✓')} Webhook up to date ${chalk.dim(`(${existing.id})`)}`);
82
+ return { output: { webhook: { id: existing.id, url: 'converged' } } };
83
+ }
84
+
85
+ if (options.dryRun) {
86
+ return dryRunPlan(`patch: ${Object.keys(patch).join(', ')}`, { output: { webhook: { planned: Object.keys(patch) } } });
87
+ }
88
+
89
+ await api.updateWebhook(publicationId, existing.id, patch);
90
+ console.log(` ${chalk.green('✓')} Webhook updated ${chalk.dim(`(${existing.id})`)}`);
91
+ return { output: { webhook: { id: existing.id, updated: Object.keys(patch) } } };
92
+ }
93
+
94
+ if (options.dryRun) {
95
+ return dryRunPlan('create the consent-pipeline webhook', { output: { webhook: { planned: ['create'] } } });
96
+ }
97
+
98
+ const created = await api.createWebhook(publicationId, {
99
+ url: desiredUrl,
100
+ event_types: DESIRED_EVENT_TYPES,
101
+ description: WEBHOOK_DESCRIPTION,
102
+ });
103
+ const newId = created?.data?.id || created?.id || '(unknown id)';
104
+ console.log(` ${chalk.green('✓')} Webhook created ${chalk.dim(`(${newId})`)}`);
105
+ console.log(` ${chalk.dim('→')} ${chalk.dim(`https://api.${parentHost}/omega/marketing/webhook/forward`)}`);
106
+
107
+ return { output: { webhook: { id: newId, created: true } } };
108
+ };
@@ -0,0 +1,64 @@
1
+ /**
2
+ * Newsletter service (Beehiiv provider) — the brand's newsletter publication: access verified (or
3
+ * auto-matched by name), @omega.js/backend's custom fields provisioned, @omega.js/backend's segments
4
+ * ensured (Beehiiv has no segment-create API — missing ones get readable
5
+ * instructions, and interactive runs offer to create them by driving the
6
+ * dashboard UI through the companion Chrome extension), and the
7
+ * publication webhook pointed at the parent @omega.js/backend's forwarder.
8
+ *
9
+ * Publications are created manually in the dashboard (no API) — the service
10
+ * prints the exact values to copy when none matches.
11
+ *
12
+ * Auth: BEEHIIV_API_KEY in the brand .env; the webhook operation
13
+ * additionally needs OMEGA_WEBHOOK_KEY, which the setup MINTS through the
14
+ * shared contract (it is OMEGA's own key, #635). No API key → clean skip.
15
+ */
16
+ const { chosenProvider } = require('../../vendor/config/index.js');
17
+
18
+ const { serviceInputSpec } = require('../../config.js');
19
+ const { createServiceRunner } = require('../../lib/service-runner.js');
20
+ const { requestServiceInput } = require('../../lib/service-input.js');
21
+ const { BeehiivAPI } = require('./lib/beehiiv-api.js');
22
+
23
+ module.exports.run = createServiceRunner({
24
+ serviceDir: __dirname,
25
+ setup: async (context) => {
26
+ const newsletter = context.brandConfig.marketing?.newsletter || {};
27
+
28
+ if (newsletter.enabled === false) {
29
+ return { skip: true, reason: 'marketing.newsletter.enabled = false' };
30
+ }
31
+
32
+ // The vendor is a KEY under marketing.newsletter.providers (#425) — no
33
+ // entry means none chosen and this service skips.
34
+ const provider = chosenProvider(newsletter.providers);
35
+ if (!provider) {
36
+ return { skip: true, reason: 'no marketing.newsletter.providers entry' };
37
+ }
38
+ if (provider !== 'beehiiv') {
39
+ return { skip: true, reason: `marketing.newsletter.providers.${provider} is not a known newsletter provider` };
40
+ }
41
+
42
+ const domain = (context.brandConfig.brand?.url || '').replace(/^https?:\/\//, '').replace(/\/$/, '');
43
+ if (!domain) {
44
+ return { skip: true, reason: 'no brand.url configured' };
45
+ }
46
+
47
+ if (!context.beehiivApi) {
48
+ const gate = await requestServiceInput(context, serviceInputSpec('newsletter', { names: ['BEEHIIV_API_KEY'] }));
49
+ if (gate) return gate;
50
+ }
51
+
52
+ // The webhook key is OMEGA's OWN (#635): the shared helper mints it in
53
+ // place when this service runs before the workspace one did, so the
54
+ // webhook operation can read it unconditionally.
55
+ const webhookKeyGate = await requestServiceInput(context, serviceInputSpec('newsletter', { names: ['OMEGA_WEBHOOK_KEY'] }));
56
+ if (webhookKeyGate) return webhookKeyGate;
57
+
58
+ // Tests inject a fake client via context.beehiivApi
59
+ return {
60
+ beehiivApi: context.beehiivApi || new BeehiivAPI(),
61
+ domain,
62
+ };
63
+ },
64
+ });
@@ -0,0 +1,124 @@
1
+ /**
2
+ * Beehiiv v2 API client — publications, custom fields, segments (list-only;
3
+ * Beehiiv has no segment-create API), and per-publication webhooks. Named-
4
+ * method surface so tests can fake it method-for-method.
5
+ *
6
+ * Auth: BEEHIIV_API_KEY in the brand .env.
7
+ */
8
+ const BEEHIIV_API_BASE = 'https://api.beehiiv.com/v2';
9
+
10
+ class BeehiivAPI {
11
+ constructor(options = {}) {
12
+ this.apiKey = options.apiKey || process.env.BEEHIIV_API_KEY;
13
+ }
14
+
15
+ async makeRequest(endpoint, options = {}) {
16
+ const response = await fetch(`${BEEHIIV_API_BASE}${endpoint}`, {
17
+ ...options,
18
+ headers: {
19
+ 'Authorization': `Bearer ${this.apiKey}`,
20
+ 'Content-Type': 'application/json',
21
+ ...options.headers,
22
+ },
23
+ });
24
+
25
+ if (response.status === 204) {
26
+ return null;
27
+ }
28
+
29
+ const data = await response.json();
30
+
31
+ if (!response.ok) {
32
+ const message = data.message || data.error || response.statusText;
33
+ throw new Error(`Beehiiv API error (${response.status}): ${message}`);
34
+ }
35
+
36
+ return data;
37
+ }
38
+
39
+ /** Fetch every page of a paginated collection endpoint. */
40
+ async getAllPages(basePath) {
41
+ const all = [];
42
+ let page = 1;
43
+
44
+ while (true) {
45
+ const data = await this.makeRequest(`${basePath}?page=${page}&limit=100`);
46
+ all.push(...(data.data || []));
47
+
48
+ if (page >= (data.total_pages || 1)) {
49
+ break;
50
+ }
51
+ page += 1;
52
+ }
53
+
54
+ return all;
55
+ }
56
+
57
+ // ========== Publications ==========
58
+
59
+ async getPublication(publicationId) {
60
+ try {
61
+ const data = await this.makeRequest(`/publications/${publicationId}`);
62
+ return data.data;
63
+ } catch (error) {
64
+ if (error.message.includes('404') || error.message.includes('not found')) {
65
+ return null;
66
+ }
67
+ throw error;
68
+ }
69
+ }
70
+
71
+ async listPublications() {
72
+ const data = await this.makeRequest('/publications');
73
+ return data.data || [];
74
+ }
75
+
76
+ // ========== Custom fields ==========
77
+
78
+ async getCustomFields(publicationId) {
79
+ return this.getAllPages(`/publications/${publicationId}/custom_fields`);
80
+ }
81
+
82
+ /** kind: 'string' | 'integer' | 'boolean' | 'datetime' */
83
+ async createCustomField(publicationId, name, display, kind) {
84
+ return this.makeRequest(`/publications/${publicationId}/custom_fields`, {
85
+ method: 'POST',
86
+ body: JSON.stringify({ name, display, kind }),
87
+ });
88
+ }
89
+
90
+ async deleteCustomField(publicationId, fieldId) {
91
+ return this.makeRequest(`/publications/${publicationId}/custom_fields/${fieldId}`, {
92
+ method: 'DELETE',
93
+ });
94
+ }
95
+
96
+ // ========== Segments (list-only — Beehiiv has no create API) ==========
97
+
98
+ async getSegments(publicationId) {
99
+ return this.getAllPages(`/publications/${publicationId}/segments`);
100
+ }
101
+
102
+ // ========== Webhooks (per-publication) ==========
103
+
104
+ async listWebhooks(publicationId) {
105
+ return this.getAllPages(`/publications/${publicationId}/webhooks`);
106
+ }
107
+
108
+ /** payload: { url, event_types[], description?, http_method? } */
109
+ async createWebhook(publicationId, payload) {
110
+ return this.makeRequest(`/publications/${publicationId}/webhooks`, {
111
+ method: 'POST',
112
+ body: JSON.stringify(payload),
113
+ });
114
+ }
115
+
116
+ async updateWebhook(publicationId, webhookId, payload) {
117
+ return this.makeRequest(`/publications/${publicationId}/webhooks/${webhookId}`, {
118
+ method: 'PATCH',
119
+ body: JSON.stringify(payload),
120
+ });
121
+ }
122
+ }
123
+
124
+ module.exports = { BeehiivAPI };