@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,106 @@
1
+ /**
2
+ * Ensure the brand's Chatsy agent has the correct settings + knowledge.
3
+ *
4
+ * Knowledge = baseline (data/baseline-knowledge.md with brand values +
5
+ * generated pricing) + the brand repo's config/chatsy.md when present
6
+ * (omega-manager read `.brands/{id}/chatsy.md`). The agent image comes
7
+ * from brand.images.brandmark — omega-manager hardcoded the company CDN;
8
+ * without a brandmark the image field simply isn't managed.
9
+ *
10
+ * Diff-synced on the managed leaf fields and patched with a leaf mask so
11
+ * Chatsy-owned fields (owner, id, metadata, other settings) survive —
12
+ * omega-manager merge-wrote on every run with no dry-run guard, and
13
+ * silently created an orphan agent document when the id was wrong; a
14
+ * missing agent is a visible error now (agents are created in the Chatsy
15
+ * dashboard).
16
+ */
17
+ const { join } = require('node:path');
18
+ const fs = require('node:fs');
19
+ const chalk = require('chalk').default;
20
+ const { getBaselineKnowledge } = require('../lib/baseline-knowledge.js');
21
+ const { absoluteBrandImage } = require('../../../lib/brand.js');
22
+
23
+ module.exports = async function ensureChat(context) {
24
+ const { brandConfig, brandRoot, db, agentId, options } = context;
25
+ const dryRun = options?.dryRun || false;
26
+
27
+ const brandName = brandConfig.brand.name;
28
+ const websiteUrl = brandConfig.brand.url;
29
+
30
+ // Brand-specific knowledge file (plain text, appended after the baseline)
31
+ const knowledgePath = join(brandRoot, 'config', 'chatsy.md');
32
+ const brandKnowledge = (fs.existsSync(knowledgePath) ? fs.readFileSync(knowledgePath, 'utf8') : '')
33
+ .trim()
34
+ .replaceAll('{website}', websiteUrl);
35
+
36
+ const baseline = getBaselineKnowledge(brandConfig);
37
+ const knowledge = brandKnowledge ? `${baseline}\n\n${brandKnowledge}` : baseline;
38
+
39
+ const image = absoluteBrandImage(brandConfig, 'brandmark');
40
+
41
+ const desired = {
42
+ name: `${brandName} Support`,
43
+ settings: {
44
+ welcomeMessage: `Welcome to the ${brandName} Support chat! How can I help you?`,
45
+ agent: {
46
+ language: 'EN',
47
+ ...(image ? { image } : {}),
48
+ },
49
+ autoTranslate: true,
50
+ brand: {
51
+ name: brandName,
52
+ about: brandConfig.brand.description || '',
53
+ website: websiteUrl,
54
+ knowledge,
55
+ },
56
+ },
57
+ };
58
+
59
+ const fieldPaths = [
60
+ 'name',
61
+ 'settings.welcomeMessage',
62
+ 'settings.agent.language',
63
+ ...(image ? ['settings.agent.image'] : []),
64
+ 'settings.autoTranslate',
65
+ 'settings.brand.name',
66
+ 'settings.brand.about',
67
+ 'settings.brand.website',
68
+ 'settings.brand.knowledge',
69
+ ];
70
+
71
+ const agent = await db.getDoc(`agents/${agentId}`);
72
+
73
+ if (!agent) {
74
+ console.log(` ${chalk.red('✗')} Agent ${chalk.cyan(agentId)} not found in Chatsy — check inbound.chat.providers.chatsy.agentId (agents are created at ${chalk.cyan('https://chatsy.ai')})`);
75
+ return { status: 'error', error: `agent ${agentId} not found` };
76
+ }
77
+
78
+ const settings = agent.settings || {};
79
+ const drifted = agent.name !== desired.name
80
+ || settings.welcomeMessage !== desired.settings.welcomeMessage
81
+ || settings.agent?.language !== 'EN'
82
+ || (image && settings.agent?.image !== image)
83
+ || settings.autoTranslate !== true
84
+ || settings.brand?.name !== brandName
85
+ || settings.brand?.about !== desired.settings.brand.about
86
+ || settings.brand?.website !== websiteUrl
87
+ || settings.brand?.knowledge !== knowledge;
88
+
89
+ if (!drifted) {
90
+ console.log(` ${chalk.green('✓')} Agent ${chalk.dim(agentId)} in sync ${chalk.dim(`(${desired.name})`)}`);
91
+ console.log(` ${chalk.dim(`Knowledge: ${knowledge.length} chars (baseline + ${brandKnowledge.length} brand-specific)`)}`);
92
+ return { state: { agentId }, output: { chat: { synced: true } } };
93
+ }
94
+
95
+ if (dryRun) {
96
+ console.log(` ${chalk.yellow('[DRY RUN]')} Would update agent ${chalk.cyan(agentId)} ${chalk.dim(`(${desired.name}, ${knowledge.length} chars knowledge)`)}`);
97
+ return { output: { chat: { planned: 'update' } } };
98
+ }
99
+
100
+ await db.patchDoc(`agents/${agentId}`, desired, fieldPaths);
101
+
102
+ console.log(` ${chalk.green('✓')} Agent ${chalk.dim(agentId)} updated ${chalk.dim(`(${desired.name})`)}`);
103
+ console.log(` ${chalk.dim(`Knowledge: ${knowledge.length} chars (baseline + ${brandKnowledge.length} brand-specific)`)}`);
104
+
105
+ return { state: { agentId }, output: { chat: { updated: true } } };
106
+ };
@@ -0,0 +1,45 @@
1
+ /**
2
+ * Ensure the brand's Chatsy owner account has the configured plan.
3
+ *
4
+ * The agent's owner UID identifies the user account; that user's
5
+ * subscription is set to inbound.chat.providers.chatsy.plan (DEFAULTS: Chatsy's Max top tier)
6
+ * via the shared owner-plan reconciliation. omega-manager resolved the
7
+ * plan by reading the chatsy brand's own config from `.brands/` (company
8
+ * mode); the port takes it from the brand's config with the top tier as
9
+ * the default.
10
+ */
11
+ const chalk = require('chalk').default;
12
+ const { ensureOwnerPlan } = require('../../../lib/owner-plan.js');
13
+
14
+ module.exports = async function ensureUser(context) {
15
+ const { brandConfig, db, agentId, options } = context;
16
+
17
+ const plan = brandConfig.inbound?.chat?.providers?.chatsy?.plan;
18
+ if (!plan?.id) {
19
+ console.log(` ${chalk.red('✗')} No inbound.chat.providers.chatsy.plan configured`);
20
+ return { status: 'error', error: 'no inbound.chat.providers.chatsy.plan.id configured' };
21
+ }
22
+
23
+ // The agent document carries the owner UID
24
+ const agent = await db.getDoc(`agents/${agentId}`);
25
+
26
+ if (!agent) {
27
+ console.log(` ${chalk.red('✗')} Agent ${chalk.cyan(agentId)} not found in Chatsy — check inbound.chat.providers.chatsy.agentId`);
28
+ return { status: 'error', error: `agent ${agentId} not found` };
29
+ }
30
+
31
+ const ownerUid = agent.owner;
32
+
33
+ if (!ownerUid) {
34
+ console.log(` ${chalk.red('✗')} Agent ${chalk.cyan(agentId)} has no owner field`);
35
+ return { status: 'error', error: `agent ${agentId} has no owner` };
36
+ }
37
+
38
+ const result = await ensureOwnerPlan({ db, ownerUid, plan, dryRun: options?.dryRun || false });
39
+
40
+ if (result === 'planned') {
41
+ return { output: { user: { planned: plan.id } } };
42
+ }
43
+
44
+ return { state: { accountId: ownerUid }, output: { user: { plan: plan.id, [result]: true } } };
45
+ };
@@ -0,0 +1,139 @@
1
+ /**
2
+ * Chat service (`inbound.chat.providers.chatsy`) — the brand's support chat
3
+ * agent on Chatsy (chatsy.ai): keeps the agent's settings + knowledge in sync
4
+ * (baseline knowledge with brand values filled in + generated pricing + the
5
+ * brand repo's config/chatsy.md appended) and sets the agent-owner account to
6
+ * the configured plan (Chatsy's top tier by default) so the brand has full
7
+ * access. Agents live in Chatsy's own Firestore, so this service is for
8
+ * the Chatsy operator: it needs a service account for Chatsy's Firebase
9
+ * project.
10
+ *
11
+ * Auth tiers (2b, Ian 2026-07-13):
12
+ * 1. Operator SA — CHATSY_SERVICE_ACCOUNT in the brand .env (path to the
13
+ * service-account JSON, absolute or brand-root-relative). Full create
14
+ * + manage: a missing agentId with `inbound.chat.providers.chatsy.templateAgentId` configured
15
+ * (the company layer's shape donor) MINTS the brand's own agent —
16
+ * product user (email = brand contact email, password via the account
17
+ * service's owner channels) + doc shape-templated from the donor —
18
+ * and writes the new id back into omega.json5. The ensures then
19
+ * converge name/knowledge/plan in the same run.
20
+ * 2. User API key — CHATSY_API_KEY (the product accepts
21
+ * user.api.privateKey): recognized, management via the product's
22
+ * public API lands when those routes are verified.
23
+ * 3. Dashboard — interactive runs offer the setup flow (open chatsy.ai,
24
+ * paste the agent id back — comment-preserving writeback, with a
25
+ * Disable option that sets `chatsy: false`). Non-interactive and dry
26
+ * runs skip cleanly.
27
+ */
28
+ const chalk = require('chalk').default;
29
+ const { serviceInputSpec } = require('../../config.js');
30
+ const { createServiceRunner } = require('../../lib/service-runner.js');
31
+ const { requestServiceInput } = require('../../lib/service-input.js');
32
+ const { FirestoreREST, loadServiceAccount } = require('../../lib/firestore-rest.js');
33
+ const { createAuthAdmin } = require('../../lib/auth-admin.js');
34
+ const { resolveConfigValue, landValue } = require('../../lib/config-flow.js');
35
+ const { createProductAsset } = require('../../lib/product-create.js');
36
+ const { createPasswordResolver } = require('../account/lib/resolve-password.js');
37
+
38
+ const CHATSY_URL = 'https://chatsy.ai';
39
+
40
+ module.exports.run = createServiceRunner({
41
+ serviceDir: __dirname,
42
+ setup: async (context) => {
43
+ const config = context.brandConfig.inbound?.chat?.providers?.chatsy;
44
+
45
+ if (config === false || config?.enabled === false) {
46
+ return { skip: true, reason: 'inbound.chat.providers.chatsy.enabled = false' };
47
+ }
48
+
49
+ // A shared agent managed by another brand must not be rewritten here
50
+ if (config?.updateAgentInfo === false) {
51
+ return { skip: true, reason: 'agent managed by another brand (inbound.chat.providers.chatsy.updateAgentInfo = false)' };
52
+ }
53
+
54
+ // The chat widget lives on the brand's website
55
+ if (!context.brandConfig.targets?.web) {
56
+ return { skip: true, reason: 'no web target' };
57
+ }
58
+
59
+ // Operator credentials first — create-on-missing needs them before the
60
+ // id resolution. Tests inject fakes via context.chatsyDb/-AuthAdmin.
61
+ let db = context.chatsyDb;
62
+ let authAdmin = context.chatsyAuthAdmin;
63
+ if (!db) {
64
+ const envPath = process.env.CHATSY_SERVICE_ACCOUNT;
65
+ if (envPath) {
66
+ const serviceAccount = loadServiceAccount(envPath, context.brandRoot);
67
+ db = new FirestoreREST(serviceAccount);
68
+ authAdmin = createAuthAdmin(serviceAccount);
69
+ }
70
+ }
71
+
72
+ const brand = context.brandConfig.brand || {};
73
+ const dryRun = context.options?.dryRun || false;
74
+ let agentId = config?.agentId;
75
+
76
+ // 2b create-on-missing: operator SA + a template donor → a missing agent
77
+ // means MINT the brand's own (product user + doc), write the id back,
78
+ // and let the ensures below converge it in this same run.
79
+ if (!agentId && db && authAdmin && config?.templateAgentId && brand.contact?.email) {
80
+ const created = await createProductAsset({
81
+ db,
82
+ authAdmin,
83
+ collection: 'agents',
84
+ templateId: config.templateAgentId,
85
+ email: brand.contact.email,
86
+ resolvePassword: createPasswordResolver({
87
+ brandRoot: context.brandRoot,
88
+ domain: new URL(brand.url || 'https://invalid.test').hostname,
89
+ brand,
90
+ dryRun,
91
+ }),
92
+ dryRun,
93
+ log: (line) => console.log(` ${line}`),
94
+ });
95
+
96
+ if (!created) {
97
+ return { skip: true, reason: 'dry run — agent creation planned (from inbound.chat.providers.chatsy.templateAgentId)' };
98
+ }
99
+
100
+ landValue(context, 'inbound.chat.providers.chatsy.agentId', created.id);
101
+ console.log(` ${chalk.green('✓')} inbound.chat.providers.chatsy.agentId = ${chalk.cyan(created.id)} written to omega.json5`);
102
+ agentId = created.id;
103
+ }
104
+
105
+ if (!agentId) {
106
+ agentId = await resolveConfigValue(context, {
107
+ path: 'inbound.chat.providers.chatsy.agentId',
108
+ label: 'Chatsy chat agent',
109
+ instructions: [
110
+ `1. Create an account at ${chalk.cyan(CHATSY_URL)} (if you haven't already)`,
111
+ `2. Create a chat agent for ${chalk.cyan(brand.name || context.brandId)}`,
112
+ ],
113
+ entry: { url: CHATSY_URL, message: 'Chatsy agent ID:' },
114
+ disablePath: 'inbound.chat.providers.chatsy',
115
+ });
116
+ }
117
+ if (!agentId) {
118
+ return { skip: true, reason: 'no inbound.chat.providers.chatsy.agentId configured — set inbound.chat.providers.chatsy.templateAgentId + the operator SA to mint one automatically, create one at https://chatsy.ai (paste back interactively), or set it in omega.json5' };
119
+ }
120
+
121
+ if (!db) {
122
+ if (process.env.CHATSY_API_KEY) {
123
+ return {
124
+ skip: true,
125
+ reason: 'CHATSY_API_KEY recognized, but product-API management is not wired yet — use the operator SA (CHATSY_SERVICE_ACCOUNT) or the dashboard',
126
+ };
127
+ }
128
+
129
+ // The shared setup contract (#608): the operator SA is asked for right
130
+ // here — most brands are not the Chatsy operator and answer Disable,
131
+ // which retires the ask for good.
132
+ const gate = await requestServiceInput(context, serviceInputSpec('chat'));
133
+ if (gate) return gate;
134
+ db = new FirestoreREST(loadServiceAccount(process.env.CHATSY_SERVICE_ACCOUNT, context.brandRoot));
135
+ }
136
+
137
+ return { db, agentId };
138
+ },
139
+ });
@@ -0,0 +1,137 @@
1
+ /**
2
+ * Baseline knowledge for Chatsy chat agents — the shared knowledge every
3
+ * brand agent gets, loaded from baseline-knowledge.md with the brand's
4
+ * values filled in. Brand-specific knowledge from the brand repo's
5
+ * config/chatsy.md is appended after this by the chat operation.
6
+ *
7
+ * Placeholders: {website} (brand.url), {description} (brand.description),
8
+ * {pricing} (generated from payment.products), and {sponsorshipsUrl}
9
+ * (inbound.chat.providers.chatsy.sponsorshipsUrl, default {website}/contact — omega-manager
10
+ * hardcoded the company sponsorship page here).
11
+ */
12
+ const { join } = require('node:path');
13
+ const fs = require('node:fs');
14
+
15
+ const BASELINE_KNOWLEDGE = fs.readFileSync(join(__dirname, '..', 'data', 'baseline-knowledge.md'), 'utf8').trimEnd();
16
+
17
+ /**
18
+ * Format what a product promises as a human-readable string
19
+ * ([#647](https://github.com/Omega-JS-Stack/omega/issues/647)).
20
+ *
21
+ * A product's `features` map names only VALUES; the top-level `features`
22
+ * catalog is what says what each id is CALLED, so the agent quotes the brand's
23
+ * own words rather than a raw key. A `false` (or absent) value is not part of
24
+ * the tier and is never mentioned.
25
+ *
26
+ * @param {Object} values - the product's `features` map, e.g. { requests: 100, support: true }
27
+ * @param {Object} catalog - the top-level `features` catalog
28
+ * @returns {string} - e.g., "100 API Requests, unlimited Saves, Priority support"
29
+ */
30
+ function formatFeatures(values, catalog) {
31
+ if (!values) {
32
+ return '';
33
+ }
34
+
35
+ return Object.entries(values)
36
+ .filter(([, value]) => value !== false && value !== '' && value !== undefined && value !== null)
37
+ .map(([key, value]) => {
38
+ const name = catalog?.[key]?.name || key;
39
+
40
+ if (value === -1) {
41
+ return `unlimited ${name}`;
42
+ }
43
+ if (value === true) {
44
+ return name;
45
+ }
46
+ return `${value} ${name}`;
47
+ })
48
+ .join(', ');
49
+ }
50
+
51
+ /**
52
+ * Format a product's prices as a human-readable string
53
+ *
54
+ * @param {Object} prices - e.g., { monthly: 9, annually: 90 }
55
+ * @returns {string} - e.g., "$9/month or $90/year"
56
+ */
57
+ function formatPrices(prices) {
58
+ if (!prices) {
59
+ return '';
60
+ }
61
+
62
+ const labels = {
63
+ daily: 'day',
64
+ weekly: 'week',
65
+ monthly: 'month',
66
+ annually: 'year',
67
+ once: 'one-time',
68
+ };
69
+
70
+ return Object.entries(prices)
71
+ .map(([interval, amount]) => `$${amount}/${labels[interval] || interval}`)
72
+ .join(' or ');
73
+ }
74
+
75
+ /**
76
+ * Generate the pricing section from payment.products config
77
+ */
78
+ function generatePricing(brandConfig) {
79
+ const products = brandConfig.payment?.products;
80
+
81
+ if (!products || products.length === 0) {
82
+ return '';
83
+ }
84
+
85
+ const lines = ['Pricing / plans:'];
86
+
87
+ for (const product of products) {
88
+ if (product.archived) {
89
+ continue;
90
+ }
91
+
92
+ const parts = [`- ${product.name}`];
93
+
94
+ if (product.prices && Object.keys(product.prices).length > 0) {
95
+ parts.push(`(${formatPrices(product.prices)})`);
96
+ } else {
97
+ parts.push('(free)');
98
+ }
99
+
100
+ const features = formatFeatures(product.features, brandConfig.features);
101
+ if (features) {
102
+ parts.push(`- ${features}`);
103
+ }
104
+
105
+ if (product.trial?.days) {
106
+ parts.push(`(${product.trial.days}-day free trial)`);
107
+ }
108
+
109
+ lines.push(parts.join(' '));
110
+ }
111
+
112
+ lines.push('- We offer a risk-free free trial of any paid plan. You can cancel any time during your free trial and you will not be charged.');
113
+ lines.push(`- You can find more information at {website}/pricing`);
114
+
115
+ return lines.join('\n');
116
+ }
117
+
118
+ /**
119
+ * Get the baseline knowledge string with placeholders replaced
120
+ *
121
+ * @param {Object} brandConfig - The full brand config object
122
+ * @returns {string} - Baseline knowledge with placeholders replaced
123
+ */
124
+ function getBaselineKnowledge(brandConfig) {
125
+ const websiteUrl = brandConfig.brand.url;
126
+ const pricing = generatePricing(brandConfig);
127
+ const description = brandConfig.brand.description || brandConfig.brand.name;
128
+ const sponsorshipsUrl = brandConfig.inbound?.chat?.providers?.chatsy?.sponsorshipsUrl || `${websiteUrl}/contact`;
129
+
130
+ return BASELINE_KNOWLEDGE
131
+ .replace('{description}', description)
132
+ .replace('{pricing}', pricing)
133
+ .replace('{sponsorshipsUrl}', sponsorshipsUrl)
134
+ .replaceAll('{website}', websiteUrl);
135
+ }
136
+
137
+ module.exports = { getBaselineKnowledge };