@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,350 @@
1
+ /**
2
+ * Config-landing interactive flows — omega-manager's schema-prompter engine
3
+ * reshaped for the new world. When a required config value is missing and
4
+ * the session is interactive (and not a dry run), offer the setup flow —
5
+ * select from an API list (brand matches sorted first, create-new via API
6
+ * handler or browser) or paste back an id from a dashboard — and land the
7
+ * result in omega.json5 via the comment-preserving writeback. The in-memory
8
+ * brandConfig is patched too, so the rest of the run sees the value.
9
+ *
10
+ * Non-interactive or dry-run sessions get null back and each service keeps
11
+ * its clean skip; every flow leads with a uniform Yes / Skip / Disable
12
+ * gate ("Disable" writes `<section>: false` so the service stops asking).
13
+ *
14
+ * Tri-state standard (#33, Ian's call): a missing/null value means ASK
15
+ * (this module), `false` at the path — or any ancestor section — means the
16
+ * user OPTED OUT (silent skip, never prompt or warn again), and any other
17
+ * value means USE IT. Every flow can land the `false`: the gate's Disable
18
+ * writes it (disablePath defaults to the value's own path), and selection
19
+ * flows may offer an inline opt-out choice via `spec.optOut`.
20
+ */
21
+ const chalk = require('chalk').default;
22
+ const { input, select } = require('../vendor/devkit/prompt.js');
23
+ const { openBrowser } = require('../vendor/devkit/flows.js');
24
+ const { writeBrandConfig } = require('./config-write.js');
25
+ const { canPrompt } = require('./run-gates.js');
26
+
27
+ const CREATE_NEW = '__CREATE_NEW__';
28
+ const OPT_OUT = '__OPT_OUT__';
29
+
30
+ /**
31
+ * Read a dot-notation path for the tri-state standard: `false` at the path
32
+ * or any ancestor section means opted out; missing segments are undefined.
33
+ */
34
+ function readTriState(obj, path) {
35
+ let node = obj;
36
+ for (const key of path.split('.')) {
37
+ if (node === false) {
38
+ return { optedOut: true, value: undefined };
39
+ }
40
+ if (node == null) {
41
+ return { optedOut: false, value: undefined };
42
+ }
43
+ node = node[key];
44
+ }
45
+ return { optedOut: node === false, value: node === false ? undefined : node };
46
+ }
47
+
48
+ /**
49
+ * Set a dot-notation path on an object, creating intermediate objects.
50
+ */
51
+ function setAtPath(obj, path, value) {
52
+ const keys = path.split('.');
53
+ const last = keys.pop();
54
+ let node = obj;
55
+ for (const key of keys) {
56
+ if (typeof node[key] !== 'object' || node[key] === null) {
57
+ node[key] = {};
58
+ }
59
+ node = node[key];
60
+ }
61
+ node[last] = value;
62
+ }
63
+
64
+ /**
65
+ * Whether an item's display name fuzzily matches the brand (id, name, or
66
+ * domain, ignoring case/spaces/hyphens) — those sort to the top of lists.
67
+ */
68
+ function matchesBrand(itemName, brand) {
69
+ if (!brand) {
70
+ return false;
71
+ }
72
+
73
+ const brandId = (brand.id || '').toLowerCase().replace(/-/g, '');
74
+ const brandName = (brand.name || '').toLowerCase().replace(/\s+/g, '');
75
+ const brandUrl = (brand.url || '').toLowerCase().replace(/^https?:\/\//, '').replace(/\./g, '');
76
+ const name = itemName.toLowerCase().replace(/[\s-]/g, '');
77
+
78
+ return Boolean(
79
+ (brandId && (name.includes(brandId) || brandId.includes(name)))
80
+ || (brandName && (name.includes(brandName) || brandName.includes(name)))
81
+ || (brandUrl && name.includes(brandUrl)),
82
+ );
83
+ }
84
+
85
+ /**
86
+ * Build a select() choices array from API items: "create new" first, then
87
+ * the default item (cursor lands there), then brand matches, then the rest
88
+ * alphabetically.
89
+ *
90
+ * @param {Array} items - Raw API items
91
+ * @param {Object} brand - brandConfig.brand (for match sorting)
92
+ * @param {Object} spec
93
+ * @param {Function} [spec.getName] - item → display name
94
+ * @param {Function} [spec.getValue] - item → choice value
95
+ * @param {*} [spec.defaultValue] - Value whose item sorts to the top
96
+ * @param {string} [spec.createNewLabel] - Adds a "+ Create new …" choice
97
+ * @returns {{ choices: Array, defaultValue: * }} - defaultValue resolved for select()
98
+ */
99
+ function sortChoicesForBrand(items, brand, spec = {}) {
100
+ const { getName, getValue, defaultValue, createNewLabel } = spec;
101
+ const nameOf = (item) => (getName ? getName(item) : String(item));
102
+ const valueOf = (item) => (getValue ? getValue(item) : item);
103
+ const isDefault = (item) => defaultValue !== undefined && defaultValue !== null && valueOf(item) === defaultValue;
104
+
105
+ const sorted = [...items].sort((a, b) => {
106
+ const aMatches = matchesBrand(nameOf(a), brand);
107
+ const bMatches = matchesBrand(nameOf(b), brand);
108
+ if (aMatches !== bMatches) {
109
+ return aMatches ? -1 : 1;
110
+ }
111
+ if (isDefault(a) !== isDefault(b)) {
112
+ return isDefault(a) ? -1 : 1;
113
+ }
114
+ return nameOf(a).toLowerCase().localeCompare(nameOf(b).toLowerCase());
115
+ });
116
+
117
+ const defaultItem = sorted.find(isDefault) || null;
118
+ const choices = [];
119
+
120
+ if (createNewLabel) {
121
+ choices.push({ name: `+ Create new ${createNewLabel}`, value: CREATE_NEW });
122
+ }
123
+ if (defaultItem) {
124
+ choices.push({ name: nameOf(defaultItem), value: valueOf(defaultItem) });
125
+ }
126
+ for (const item of sorted) {
127
+ if (item === defaultItem) {
128
+ continue;
129
+ }
130
+ choices.push({ name: nameOf(item), value: valueOf(item) });
131
+ }
132
+
133
+ // Cursor: the default item when given, else the best real item (the
134
+ // brand match after sorting) — never "+ Create new" by accident
135
+ const cursorItem = defaultItem || sorted[0] || null;
136
+
137
+ return { choices, defaultValue: cursorItem ? valueOf(cursorItem) : undefined };
138
+ }
139
+
140
+ /**
141
+ * Land a value: write it into omega.json5 (comment-preserving) and patch
142
+ * the in-memory brandConfig so the rest of the run sees it.
143
+ */
144
+ function landValue(context, path, value) {
145
+ writeBrandConfig(context, { [path]: value });
146
+ setAtPath(context.brandConfig, path, value);
147
+ }
148
+
149
+ /**
150
+ * The uniform Yes / Skip / Disable gate every config-landing flow leads
151
+ * with — the ONE place that wording lives, so a flow built by hand
152
+ * (the pixel provisioning's token ask) and the shared setup contract
153
+ * (lib/service-input.js, #608) open exactly like resolveConfigValue.
154
+ * "Disable" lands `false` at disablePath (the tri-state opt-out) and says
155
+ * where to delete it.
156
+ *
157
+ * @param {Object} context - Service context
158
+ * @param {Object} spec
159
+ * @param {string} spec.label - Human name ("Meta Pixel", "GA4 property")
160
+ * @param {string[]} [spec.instructions] - Numbered guidance lines
161
+ * @param {string} spec.disablePath - Where Disable writes `false`
162
+ * @returns {Promise<'yes'|'skip'|'disable'>} - The chosen outcome; callers that
163
+ * only proceed on Yes compare against 'yes', the ones that report WHICH
164
+ * step-aside happened (#608) read the other two.
165
+ */
166
+ async function confirmSetup(context, spec) {
167
+ const { label, instructions, disablePath } = spec;
168
+ const brandName = context.brandConfig.brand?.name || context.brandId;
169
+
170
+ console.log(` ${chalk.yellow('!')} ${label} not configured for ${chalk.cyan(brandName)}`);
171
+ for (const line of instructions || []) {
172
+ console.log(` ${line}`);
173
+ }
174
+
175
+ const action = await select({
176
+ message: 'Set up now?',
177
+ choices: [
178
+ { name: 'Yes', value: 'yes' },
179
+ { name: 'Skip for now', value: 'skip' },
180
+ { name: 'Disable (stop prompting)', value: 'disable' },
181
+ ],
182
+ default: 'yes',
183
+ });
184
+
185
+ if (action === 'disable') {
186
+ landValue(context, disablePath, false);
187
+ console.log(` ${chalk.yellow('!')} ${label} disabled in omega.json5 (${disablePath}: false — delete the line to be asked again)`);
188
+ }
189
+
190
+ return action;
191
+ }
192
+
193
+ /**
194
+ * Selection flow: list items from the API, pick one (or create new via
195
+ * API handler / browser + refresh). Returns the picked value or null.
196
+ */
197
+ async function runSelection(context, spec) {
198
+ const { label, choices: listItems, getName, getValue, defaultValue, createNew } = spec;
199
+
200
+ const items = await listItems(context);
201
+ const built = sortChoicesForBrand(items, context.brandConfig.brand, {
202
+ getName,
203
+ getValue,
204
+ defaultValue,
205
+ createNewLabel: createNew ? (createNew.label || label) : null,
206
+ });
207
+
208
+ // Inline opt-out (tri-state): picking it lands `false` — resolveConfigValue
209
+ // handles the landing so this stays a pure selection
210
+ if (spec.optOut) {
211
+ built.choices.push({ name: spec.optOut.label || `No ${label} — don't ask again`, value: OPT_OUT });
212
+ }
213
+
214
+ const picked = await select({
215
+ message: spec.message || `Select ${label}:`,
216
+ choices: built.choices,
217
+ default: built.defaultValue,
218
+ });
219
+
220
+ if (picked !== CREATE_NEW) {
221
+ return picked;
222
+ }
223
+
224
+ // Create new via API handler
225
+ if (createNew.handler) {
226
+ console.log(` ${chalk.dim('→')} Creating new ${createNew.label || label}...`);
227
+ const value = await createNew.handler(context);
228
+ console.log(` ${chalk.green('✓')} Created`);
229
+ return value;
230
+ }
231
+
232
+ // Create new via browser, then re-list or paste back
233
+ console.log(` ${chalk.dim('→')} Opening browser to create a new ${createNew.label || label}...`);
234
+ console.log(` ${chalk.dim('→')} URL: ${chalk.cyan(createNew.url)}`);
235
+ await openBrowser(createNew.url);
236
+ await input({ message: 'Press ENTER when done...' });
237
+
238
+ if (createNew.refreshChoices) {
239
+ console.log(` ${chalk.dim('→')} Refreshing list...`);
240
+ const fresh = await listItems(context);
241
+ const rebuilt = sortChoicesForBrand(fresh, context.brandConfig.brand, { getName, getValue, defaultValue });
242
+ return select({
243
+ message: `Select the new ${createNew.label || label}:`,
244
+ choices: rebuilt.choices,
245
+ default: rebuilt.defaultValue,
246
+ });
247
+ }
248
+
249
+ return input({ message: `Enter the ${createNew.label || label} you just created:` });
250
+ }
251
+
252
+ /**
253
+ * Entry flow: open the dashboard and take a pasted-back value.
254
+ */
255
+ async function runEntry(context, spec) {
256
+ const { url, message, validate } = spec.entry;
257
+
258
+ if (url) {
259
+ await openBrowser(url);
260
+ }
261
+
262
+ const value = await input({
263
+ message,
264
+ validate: validate || ((val) => (val?.trim() ? true : 'Required')),
265
+ });
266
+
267
+ return value.trim();
268
+ }
269
+
270
+ /**
271
+ * Resolve a required config value interactively and land it in omega.json5.
272
+ *
273
+ * Tri-state (#33): returns the value already in config if present
274
+ * (idempotent); returns null WITHOUT prompting when the value — or any
275
+ * ancestor section — is `false` (the user opted out); returns null without
276
+ * prompting when non-interactive or dry-run, and when the user skips or
277
+ * disables — callers keep their existing clean-skip handling.
278
+ *
279
+ * @param {Object} context - Service context (brandConfig, brandRoot, options)
280
+ * @param {Object} spec
281
+ * @param {string} spec.path - omega.json5 dot path the value lands at
282
+ * @param {string} spec.label - Human name ("GA4 property", "Chatsy chat agent")
283
+ * @param {string[]} [spec.instructions] - Numbered guidance lines shown before the gate
284
+ * @param {string} [spec.message] - Selection prompt (default "Select <label>:")
285
+ * @param {Function} [spec.choices] - async (context) → items (selection mode)
286
+ * @param {Function} [spec.getName] - item → display name
287
+ * @param {Function} [spec.getValue] - item → value
288
+ * @param {*} [spec.defaultValue] - Sorts its item to the top of the list
289
+ * @param {Object} [spec.createNew] - { label, handler } (API) or { label, url, refreshChoices } (browser)
290
+ * @param {Object} [spec.entry] - { url, message, validate } (paste-back mode)
291
+ * @param {Object} [spec.optOut] - { label } inline selection choice → lands `false`
292
+ * @param {string} [spec.disablePath] - Where Disable/opt-out writes `false`
293
+ * (defaults to spec.path — section paths let one opt-out cover a service)
294
+ * @param {boolean} [spec.gate] - false = skip the Yes/Skip/Disable gate (a
295
+ * chained value whose flow the user already said Yes to)
296
+ * @returns {Promise<*>} - The landed value, or null
297
+ */
298
+ async function resolveConfigValue(context, spec) {
299
+ const { path, label } = spec;
300
+ const disablePath = spec.disablePath || path;
301
+
302
+ const { optedOut, value: existing } = readTriState(context.brandConfig, path);
303
+ if (optedOut) {
304
+ return null;
305
+ }
306
+ if (existing !== undefined && existing !== null) {
307
+ return existing;
308
+ }
309
+
310
+ if (!canPrompt(context.options)) {
311
+ return null;
312
+ }
313
+
314
+ if (spec.gate !== false) {
315
+ const action = await confirmSetup(context, {
316
+ label,
317
+ instructions: spec.instructions,
318
+ disablePath,
319
+ });
320
+ if (action !== 'yes') {
321
+ return null;
322
+ }
323
+ }
324
+
325
+ const value = spec.choices
326
+ ? await runSelection(context, spec)
327
+ : await runEntry(context, spec);
328
+
329
+ if (value === OPT_OUT) {
330
+ landValue(context, disablePath, false);
331
+ console.log(` ${chalk.yellow('!')} ${label}: opted out (${disablePath}: false — delete the line to be asked again)`);
332
+ return null;
333
+ }
334
+
335
+ if (value === undefined || value === null || value === '') {
336
+ return null;
337
+ }
338
+
339
+ landValue(context, path, value);
340
+ return value;
341
+ }
342
+
343
+ module.exports = {
344
+ resolveConfigValue,
345
+ confirmSetup,
346
+ readTriState,
347
+ sortChoicesForBrand,
348
+ setAtPath,
349
+ landValue,
350
+ };
@@ -0,0 +1,41 @@
1
+ /**
2
+ * Brand-config writeback — the manager side of @omega.js/config's
3
+ * comment-preserving editor. Services resolve IDs against external APIs
4
+ * (SendGrid list, Beehiiv publication, payment product IDs, the Firebase SDK
5
+ * config) and land them in config/omega.json5, their one authoritative home;
6
+ * state keeps the resolved values as a cache/self-heal layer. This helper
7
+ * gives every service the same dry-run gate and logging.
8
+ */
9
+
10
+ const chalk = require('chalk').default;
11
+ const { writeConfigValues } = require('../vendor/config/index.js');
12
+ const { dryRunPlan } = require('./run-gates.js');
13
+
14
+ /**
15
+ * Write resolved values into the brand's omega.json5. Already-equal values
16
+ * are skipped by the editor, so calling this on every run is idempotent and
17
+ * reruns leave the file byte-identical. Dry-run reports what would land and
18
+ * touches nothing.
19
+ *
20
+ * @param {Object} context - Handler context ({ brandRoot, options }).
21
+ * @param {Object<string, *>} edits - Dot-path → value (see @omega.js/config
22
+ * edit paths: dots, numeric indexes, and [key=value] array matchers).
23
+ * @returns {string[]} The paths actually written (empty on dry-run or no-op).
24
+ */
25
+ function writeBrandConfig(context, edits) {
26
+ const dryRun = context.options?.dryRun || false;
27
+ const report = writeConfigValues(context.brandRoot, edits, { dryRun });
28
+
29
+ if (report.applied.length === 0) {
30
+ return [];
31
+ }
32
+
33
+ if (dryRun) {
34
+ return dryRunPlan(`write ${report.applied.join(', ')} to omega.json5`, []);
35
+ }
36
+
37
+ console.log(` ${chalk.green('✓')} omega.json5 ← ${chalk.cyan(report.applied.join(', '))}`);
38
+ return report.applied;
39
+ }
40
+
41
+ module.exports = { writeBrandConfig };
@@ -0,0 +1,75 @@
1
+ /**
2
+ * Custom targets (#603) — the ONE home for a target the framework does not
3
+ * own: a Render API, a worker, a script. It is declared like any other target
4
+ * (`targets.<name>: { type: 'custom' }`, or the array form for instances), and
5
+ * everything it can DO comes from its own package.json scripts:
6
+ *
7
+ * start · build · test · deploy · clean
8
+ *
9
+ * The manager runs each verb through `npm run <verb>` when the script is
10
+ * there and SKIPS IT LOUDLY when it is not — a verb that quietly did nothing
11
+ * is indistinguishable from one that worked. Nothing is inferred, defaulted,
12
+ * or synthesized: no script, no verb. This module holds only what a custom
13
+ * target IS (its names, its dirs, the scripts it declares); the run itself has
14
+ * one home for every target type, `framework-bin.js`'s `resolveTargetRun`.
15
+ *
16
+ * What a custom target does NOT get is every framework service op — there is
17
+ * no framework to reconcile. Discovery leaves `entry.target` null, so the
18
+ * `filter((entry) => entry.target)` every service already applies skips them
19
+ * by construction; the ONE deliberate exception reads `entry.custom`: the
20
+ * workspace service recognizes the dir (agent docs, settings, the structure
21
+ * check) instead of warning it unmapped. Nothing is composed into its own .env
22
+ * file (#678); it INHERITS the brand keys instead — manage.js loads the env
23
+ * chain into process.env before it spawns anything, so a custom target started
24
+ * by `omega dev`/`omega deploy` has them. A standalone run inside the target
25
+ * dir does not: there is no @omega.js/config in there to walk the cascade.
26
+ */
27
+ const path = require('node:path');
28
+ const jetpack = require('fs-jetpack');
29
+
30
+ const { isCustomTargetEntry, normalizeTargetInstances, instanceTargetDir } = require('../vendor/config/index.js');
31
+
32
+ /**
33
+ * The custom target NAMES a brand config declares.
34
+ *
35
+ * @param {object} brandConfig - The merged brand config.
36
+ * @returns {string[]} Target names, in config order.
37
+ */
38
+ function customTargetNames(brandConfig) {
39
+ const targets = brandConfig?.targets;
40
+ if (!targets || typeof targets !== 'object') {
41
+ return [];
42
+ }
43
+
44
+ return Object.keys(targets).filter((name) => isCustomTargetEntry(targets[name]));
45
+ }
46
+
47
+ /**
48
+ * The target DIRS those declarations expect under targets/ — the shared
49
+ * multi-instance mapping (`main` → the bare dir, any other id → `<name>-<id>`).
50
+ *
51
+ * @param {object} brandConfig - The merged brand config.
52
+ * @returns {string[]} Directory basenames.
53
+ */
54
+ function customTargetDirs(brandConfig) {
55
+ return customTargetNames(brandConfig).flatMap((name) => normalizeTargetInstances(brandConfig.targets[name])
56
+ .map((instance) => instanceTargetDir(name, instance.id)));
57
+ }
58
+
59
+ /**
60
+ * A target dir's package.json scripts — the whole verb surface of a custom
61
+ * target. An unreadable or absent package.json declares nothing.
62
+ *
63
+ * @param {string} targetPath - Absolute path to the target dir.
64
+ * @returns {Object<string, string>} Script name → command.
65
+ */
66
+ function targetScripts(targetPath) {
67
+ const pkg = jetpack.read(path.join(targetPath, 'package.json'), 'json');
68
+ return (pkg && typeof pkg.scripts === 'object' && pkg.scripts) || {};
69
+ }
70
+
71
+ module.exports = {
72
+ customTargetNames,
73
+ customTargetDirs,
74
+ targetScripts,
75
+ };
@@ -0,0 +1,19 @@
1
+ /**
2
+ * Domain helpers — apex/subdomain resolution via the public suffix list
3
+ * (omega-manager's src/lib/domain-utils.js, trimmed to what the manager uses).
4
+ */
5
+ const psl = require('psl');
6
+
7
+ /**
8
+ * Get the apex (registrable) domain for any domain.
9
+ * e.g. 'api.mybrand.com' → 'mybrand.com', 'sub.example.co.uk' → 'example.co.uk'
10
+ *
11
+ * @param {string} domain - Full domain (no protocol)
12
+ * @returns {string} Apex domain
13
+ */
14
+ function getApexDomain(domain) {
15
+ const parsed = psl.parse(domain);
16
+ return parsed.domain || domain;
17
+ }
18
+
19
+ module.exports = { getApexDomain };
@@ -0,0 +1,39 @@
1
+ /**
2
+ * Wall-clock formatting for the manage walk — the ONE duration renderer the
3
+ * per-service lines and the run summary's total share.
4
+ *
5
+ * formatDuration(340) → '340ms'
6
+ * formatDuration(14_200) → '14s'
7
+ * formatDuration(94_000) → '1m 34s'
8
+ */
9
+
10
+ /**
11
+ * Format elapsed milliseconds for humans.
12
+ *
13
+ * @param {number} ms - Elapsed milliseconds
14
+ * @returns {string}
15
+ */
16
+ function formatDuration(ms) {
17
+ if (ms < 1000) {
18
+ return `${Math.round(ms)}ms`;
19
+ }
20
+
21
+ const seconds = Math.floor(ms / 1000);
22
+
23
+ if (seconds < 60) {
24
+ return `${seconds}s`;
25
+ }
26
+
27
+ const minutes = Math.floor(seconds / 60);
28
+ const remainingSeconds = seconds % 60;
29
+
30
+ if (minutes < 60) {
31
+ return `${minutes}m ${remainingSeconds}s`;
32
+ }
33
+
34
+ const hours = Math.floor(minutes / 60);
35
+ const remainingMinutes = minutes % 60;
36
+ return `${hours}h ${remainingMinutes}m ${remainingSeconds}s`;
37
+ }
38
+
39
+ module.exports = { formatDuration };