@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,338 @@
1
+ /**
2
+ * Chargebee REST API wrapper — HTTP Basic Auth with the API key as username,
3
+ * form-encoded POST bodies, JSON responses wrapped in a type key (e.g.
4
+ * { item: { ... } }). Ported from omega-manager minus the subscription
5
+ * inspection and unused price/plan helpers (they belong to the migrations
6
+ * port).
7
+ */
8
+ class ChargebeeAPI {
9
+ constructor(site, apiKey) {
10
+ this.site = site;
11
+ this.baseUrl = `https://${site}.chargebee.com/api/v2`;
12
+ this.authHeader = `Basic ${Buffer.from(`${apiKey}:`).toString('base64')}`;
13
+ }
14
+
15
+ /**
16
+ * Make an authenticated request to Chargebee API.
17
+ *
18
+ * @param {string} method - HTTP method
19
+ * @param {string} path - API path (e.g. '/items/my-item')
20
+ * @param {Object} [params] - Query params (GET) or form body (POST)
21
+ * @returns {Object} Parsed JSON response
22
+ */
23
+ async makeRequest(method, path, params = {}) {
24
+ const options = {
25
+ method,
26
+ headers: { 'Authorization': this.authHeader },
27
+ };
28
+
29
+ let url = `${this.baseUrl}${path}`;
30
+
31
+ // Flatten nested params for form encoding: { a: { b: 'c' } } → 'a[b]=c'
32
+ const flat = flattenParams(params);
33
+
34
+ if (method === 'GET') {
35
+ const qs = new URLSearchParams(flat).toString();
36
+ if (qs) {
37
+ url += `?${qs}`;
38
+ }
39
+ } else {
40
+ options.headers['Content-Type'] = 'application/x-www-form-urlencoded';
41
+ options.body = new URLSearchParams(flat).toString();
42
+ }
43
+
44
+ const response = await fetch(url, options);
45
+
46
+ if (!response.ok) {
47
+ const text = await response.text();
48
+ throw new Error(`Chargebee API error (${response.status} ${method} ${path}): ${text}`);
49
+ }
50
+
51
+ // Some endpoints return 204 No Content
52
+ if (response.status === 204) {
53
+ return null;
54
+ }
55
+
56
+ return response.json();
57
+ }
58
+
59
+ /**
60
+ * Paginate through a Chargebee list endpoint, collecting all items.
61
+ *
62
+ * Chargebee returns { list: [ { item: {...} }, ... ], next_offset: '...' }
63
+ * The unwrapKey extracts the inner object from each list entry.
64
+ *
65
+ * @param {string} path - API path (e.g. '/items')
66
+ * @param {string} unwrapKey - Key to unwrap from each list entry (e.g. 'item')
67
+ * @param {Object} [params] - Additional query params (filters, etc.)
68
+ * @returns {Array} All unwrapped items across all pages
69
+ */
70
+ async paginate(path, unwrapKey, params = {}) {
71
+ const allItems = [];
72
+ let offset;
73
+
74
+ while (true) {
75
+ const queryParams = { ...params, 'limit': 100 };
76
+ if (offset) {
77
+ queryParams.offset = offset;
78
+ }
79
+
80
+ const response = await this.makeRequest('GET', path, queryParams);
81
+ const entries = response?.list || [];
82
+
83
+ for (const entry of entries) {
84
+ allItems.push(unwrapKey ? entry[unwrapKey] : entry);
85
+ }
86
+
87
+ offset = response?.next_offset;
88
+ if (!offset || entries.length === 0) {
89
+ break;
90
+ }
91
+ }
92
+
93
+ return allItems;
94
+ }
95
+
96
+ // ---------------------------------------------------------------------------
97
+ // Item Families
98
+ // ---------------------------------------------------------------------------
99
+
100
+ /**
101
+ * Get an item family by ID
102
+ */
103
+ async getItemFamily(familyId) {
104
+ const data = await this.makeRequest('GET', `/item_families/${familyId}`);
105
+ return data?.item_family;
106
+ }
107
+
108
+ /**
109
+ * Create an item family
110
+ */
111
+ async createItemFamily({ id, name, description }) {
112
+ const params = { id, name };
113
+ if (description) {
114
+ params.description = description;
115
+ }
116
+ const data = await this.makeRequest('POST', '/item_families', params);
117
+ return data?.item_family;
118
+ }
119
+
120
+ /**
121
+ * Update an item family
122
+ */
123
+ async updateItemFamily(familyId, updates) {
124
+ const data = await this.makeRequest('POST', `/item_families/${familyId}`, updates);
125
+ return data?.item_family;
126
+ }
127
+
128
+ // ---------------------------------------------------------------------------
129
+ // Items
130
+ // ---------------------------------------------------------------------------
131
+
132
+ /**
133
+ * Get an item by ID
134
+ */
135
+ async getItem(itemId) {
136
+ const data = await this.makeRequest('GET', `/items/${itemId}`);
137
+ return data?.item;
138
+ }
139
+
140
+ /**
141
+ * Create an item
142
+ *
143
+ * @param {Object} options
144
+ * @param {string} options.id - Custom item ID (e.g. 'somiibo-plus')
145
+ * @param {string} options.name - Display name
146
+ * @param {string} options.type - 'plan' | 'addon' | 'charge'
147
+ * @param {string} options.itemFamilyId - Parent item family ID
148
+ * @param {string} [options.description] - Item description
149
+ */
150
+ async createItem({ id, name, type, itemFamilyId, description, externalName, redirectUrl, metadata }) {
151
+ const params = {
152
+ id,
153
+ name,
154
+ type,
155
+ item_family_id: itemFamilyId,
156
+ };
157
+ if (description) {
158
+ params.description = description;
159
+ }
160
+ if (externalName) {
161
+ params.external_name = externalName;
162
+ }
163
+ if (redirectUrl) {
164
+ params.redirect_url = redirectUrl;
165
+ }
166
+ if (metadata) {
167
+ params.metadata = JSON.stringify(metadata);
168
+ }
169
+ const data = await this.makeRequest('POST', '/items', params);
170
+ return data?.item;
171
+ }
172
+
173
+ /**
174
+ * Update an item
175
+ */
176
+ async updateItem(itemId, updates) {
177
+ const data = await this.makeRequest('POST', `/items/${itemId}`, updates);
178
+ return data?.item;
179
+ }
180
+
181
+ // ---------------------------------------------------------------------------
182
+ // Item Prices
183
+ // ---------------------------------------------------------------------------
184
+
185
+ /**
186
+ * List item prices for a specific item (paginated)
187
+ */
188
+ async listItemPricesForItem(itemId) {
189
+ return this.paginate('/item_prices', 'item_price', {
190
+ 'item_id[is]': itemId,
191
+ });
192
+ }
193
+
194
+ /**
195
+ * Create an item price
196
+ *
197
+ * @param {Object} options
198
+ * @param {string} options.id - Custom price ID (e.g. 'somiibo-plus-monthly')
199
+ * @param {string} options.itemId - Parent item ID
200
+ * @param {string} options.name - Display name
201
+ * @param {string} options.pricingModel - 'flat_fee' | 'per_unit' | etc.
202
+ * @param {number} options.price - Price in cents
203
+ * @param {number} [options.period] - Billing period count (e.g. 1)
204
+ * @param {string} [options.periodUnit] - 'month' | 'year' | 'week' | 'day'
205
+ * @param {number} [options.trialPeriod] - Trial period count
206
+ * @param {string} [options.trialPeriodUnit] - 'day' | 'month'
207
+ * @param {string} [options.currencyCode] - Currency (default: 'USD')
208
+ * @param {string} [options.externalName] - Customer-facing name
209
+ */
210
+ async createItemPrice({ id, itemId, name, pricingModel = 'flat_fee', price, period, periodUnit, trialPeriod, trialPeriodUnit, currencyCode = 'USD', externalName }) {
211
+ const params = {
212
+ id,
213
+ item_id: itemId,
214
+ name,
215
+ pricing_model: pricingModel,
216
+ price,
217
+ currency_code: currencyCode,
218
+ };
219
+
220
+ if (period) {
221
+ params.period = period;
222
+ }
223
+ if (periodUnit) {
224
+ params.period_unit = periodUnit;
225
+ }
226
+ if (trialPeriod) {
227
+ params.trial_period = trialPeriod;
228
+ }
229
+ if (trialPeriodUnit) {
230
+ params.trial_period_unit = trialPeriodUnit;
231
+ }
232
+ if (externalName) {
233
+ params.external_name = externalName;
234
+ }
235
+
236
+ const data = await this.makeRequest('POST', '/item_prices', params);
237
+ return data?.item_price;
238
+ }
239
+
240
+ /**
241
+ * Update an item price
242
+ */
243
+ async updateItemPrice(itemPriceId, updates) {
244
+ const data = await this.makeRequest('POST', `/item_prices/${itemPriceId}`, updates);
245
+ return data?.item_price;
246
+ }
247
+
248
+ // ---------------------------------------------------------------------------
249
+ // Legacy Plans (read-only — for reporting existing plan-model data)
250
+ // ---------------------------------------------------------------------------
251
+
252
+ /**
253
+ * Get a plan by ID
254
+ */
255
+ async getPlan(planId) {
256
+ const data = await this.makeRequest('GET', `/plans/${planId}`);
257
+ return data?.plan;
258
+ }
259
+
260
+ // ---------------------------------------------------------------------------
261
+ // Webhooks
262
+ // ---------------------------------------------------------------------------
263
+
264
+ /**
265
+ * List all webhook endpoints
266
+ */
267
+ async listWebhooks() {
268
+ return this.paginate('/webhook_endpoints', 'webhook_endpoint');
269
+ }
270
+
271
+ /**
272
+ * Create a webhook endpoint
273
+ *
274
+ * @param {Object} options
275
+ * @param {string} options.url - Webhook URL
276
+ * @param {string} [options.name] - Display name
277
+ * @param {string[]} [options.eventTypes] - Array of event type names
278
+ */
279
+ async createWebhook({ url, name, eventTypes }) {
280
+ const params = { url };
281
+ if (name) {
282
+ params.name = name;
283
+ }
284
+ if (eventTypes?.length) {
285
+ // Chargebee expects enabled_events as JSON array string
286
+ params.enabled_events = JSON.stringify(eventTypes);
287
+ }
288
+ const data = await this.makeRequest('POST', '/webhook_endpoints', params);
289
+ return data?.webhook_endpoint;
290
+ }
291
+
292
+ /**
293
+ * Update a webhook endpoint
294
+ */
295
+ async updateWebhook(webhookId, updates) {
296
+ const data = await this.makeRequest('POST', `/webhook_endpoints/${webhookId}`, updates);
297
+ return data?.webhook_endpoint;
298
+ }
299
+
300
+ /**
301
+ * Delete a webhook endpoint
302
+ */
303
+ async deleteWebhook(webhookId) {
304
+ const data = await this.makeRequest('POST', `/webhook_endpoints/${webhookId}/delete`);
305
+ return data?.webhook_endpoint;
306
+ }
307
+ }
308
+
309
+ // ---------------------------------------------------------------------------
310
+ // Helpers
311
+ // ---------------------------------------------------------------------------
312
+
313
+ /**
314
+ * Flatten nested object for form-encoding.
315
+ * { a: { b: 'c' } } → { 'a[b]': 'c' }
316
+ * Handles one level of nesting (Chargebee's convention).
317
+ */
318
+ function flattenParams(obj, prefix = '') {
319
+ const result = {};
320
+
321
+ for (const [key, value] of Object.entries(obj)) {
322
+ if (value === undefined || value === null) {
323
+ continue;
324
+ }
325
+
326
+ const fullKey = prefix ? `${prefix}[${key}]` : key;
327
+
328
+ if (typeof value === 'object' && !Array.isArray(value)) {
329
+ Object.assign(result, flattenParams(value, fullKey));
330
+ } else {
331
+ result[fullKey] = String(value);
332
+ }
333
+ }
334
+
335
+ return result;
336
+ }
337
+
338
+ module.exports = { ChargebeeAPI };
@@ -0,0 +1,116 @@
1
+ /**
2
+ * Shared helpers for the payment operations — the paid-product filter, the
3
+ * provider-facing product identity (display name + image), the backend
4
+ * webhook URL, and the event-set diff. omega-manager duplicated these across
5
+ * the stripe/paypal/chargebee handlers (and hardcoded the company CDN for
6
+ * product images — the image is brand.images.brandmark config now).
7
+ */
8
+ const { absoluteBrandImage } = require('../../../lib/brand.js');
9
+
10
+ /**
11
+ * Products the providers manage: priced and not archived. Free tiers have
12
+ * no prices; archived products keep their provider objects but stop being
13
+ * reconciled.
14
+ *
15
+ * @param {Object} brandConfig - Merged brand config
16
+ * @returns {Array} Paid, non-archived products
17
+ */
18
+ function paidProducts(brandConfig) {
19
+ return (brandConfig.payment?.products || []).filter((p) => p.prices && !p.archived);
20
+ }
21
+
22
+ /**
23
+ * The provider-facing product name: "{Brand} - {Product}".
24
+ *
25
+ * @param {Object} brandConfig - Merged brand config
26
+ * @param {Object} product - Product entry from payment.products
27
+ * @returns {string} Display name
28
+ */
29
+ function productDisplayName(brandConfig, product) {
30
+ return `${brandConfig.brand.name} - ${product.name}`;
31
+ }
32
+
33
+ /**
34
+ * The product image URL — brand.images.brandmark when configured, else null
35
+ * (providers keep whatever image they have; the diff skips images entirely).
36
+ *
37
+ * @param {Object} brandConfig - Merged brand config
38
+ * @returns {string|null} Image URL or null
39
+ */
40
+ function productImage(brandConfig) {
41
+ return absoluteBrandImage(brandConfig, 'brandmark');
42
+ }
43
+
44
+ /**
45
+ * The brand backend's payment webhook URL for a provider.
46
+ * Requires OMEGA_WEBHOOK_KEY in the brand .env.
47
+ *
48
+ * @param {Object} brandConfig - Merged brand config
49
+ * @param {string} provider - 'stripe' | 'paypal' | 'chargebee'
50
+ * @param {string} [brandId] - Included as &brand= (chargebee only)
51
+ * @returns {string} Webhook URL
52
+ */
53
+ function buildWebhookUrl(brandConfig, provider, brandId) {
54
+ const domain = brandConfig.brand.url.replace(/^https?:\/\//, '');
55
+ const key = process.env.OMEGA_WEBHOOK_KEY;
56
+ const brandParam = brandId ? `&brand=${brandId}` : '';
57
+
58
+ return `https://api.${domain}/omega/payments/webhook?provider=${provider}${brandParam}&key=${key}`;
59
+ }
60
+
61
+ /**
62
+ * Webhook URL with the key query param redacted — the ONLY form safe to print
63
+ * (campaigns/newsletter build the same URL and never print it at all).
64
+ *
65
+ * @param {string} url - A buildWebhookUrl() result
66
+ * @returns {string} URL with key=***
67
+ */
68
+ function redactWebhookUrl(url) {
69
+ return url.replace(/([?&]key=)[^&]*/, '$1***');
70
+ }
71
+
72
+ /**
73
+ * The endpoints on the brand's OWN webhook host that are NOT the desired URL —
74
+ * legacy twins (omega-manager's `?processor=` form, an old key) that keep
75
+ * receiving every event and answering 400. Exactly one endpoint per host
76
+ * survives a manage run; endpoints on other hosts belong to whatever else the
77
+ * account runs and are never touched (#570).
78
+ *
79
+ * @param {Array} endpoints - Provider webhook objects carrying a `url`
80
+ * @param {string} desiredUrl - A buildWebhookUrl() result
81
+ * @returns {Array} The stale endpoints, in list order
82
+ */
83
+ function staleWebhookEndpoints(endpoints, desiredUrl) {
84
+ const desired = new URL(desiredUrl);
85
+
86
+ return endpoints.filter((endpoint) => {
87
+ if (!endpoint.url || endpoint.url === desiredUrl) {
88
+ return false;
89
+ }
90
+
91
+ const url = URL.parse(endpoint.url);
92
+
93
+ return !!url && url.host === desired.host && url.pathname === desired.pathname;
94
+ });
95
+ }
96
+
97
+ /**
98
+ * Diff current webhook events against desired.
99
+ *
100
+ * @param {string[]} currentEvents - Events on the endpoint now
101
+ * @param {string[]} desiredEvents - Events the backend handles
102
+ * @returns {{ missing: string[], extra: string[] }|null} Diff, or null when converged
103
+ */
104
+ function diffEventSets(currentEvents, desiredEvents) {
105
+ const currentSet = new Set(currentEvents);
106
+ const desiredSet = new Set(desiredEvents);
107
+
108
+ const missing = desiredEvents.filter((e) => !currentSet.has(e));
109
+ const extra = [...currentSet].filter((e) => !desiredSet.has(e));
110
+
111
+ return (missing.length > 0 || extra.length > 0)
112
+ ? { missing, extra }
113
+ : null;
114
+ }
115
+
116
+ module.exports = { paidProducts, productDisplayName, productImage, buildWebhookUrl, redactWebhookUrl, staleWebhookEndpoints, diffEventSets };