@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.
- package/.claude-plugin/marketplace.json +14 -0
- package/LICENSE +98 -0
- package/README.md +165 -0
- package/bin/omega +2 -0
- package/bin/omg +2 -0
- package/claude-plugin/.claude-plugin/plugin.json +11 -0
- package/claude-plugin/.mcp.json +9 -0
- package/claude-plugin/README.md +139 -0
- package/claude-plugin/hooks/gate/mark.sh +58 -0
- package/claude-plugin/hooks/gate/run.sh +97 -0
- package/claude-plugin/hooks/guard/run.sh +249 -0
- package/claude-plugin/hooks/hooks.json +63 -0
- package/claude-plugin/hooks/inject/run.sh +127 -0
- package/claude-plugin/hooks/lib/omega-gate.sh +20 -0
- package/claude-plugin/hooks/lib/omega-scope.sh +41 -0
- package/claude-plugin/hooks/lib/omega-skills.sh +209 -0
- package/claude-plugin/hooks/quality/run.sh +132 -0
- package/claude-plugin/hooks/shape/run.sh +45 -0
- package/claude-plugin/mcp-router-launch.js +29 -0
- package/claude-plugin/skills/README.md +48 -0
- package/claude-plugin/skills/accessibility/SKILL.md +31 -0
- package/claude-plugin/skills/analytics/SKILL.md +30 -0
- package/claude-plugin/skills/backend/SKILL.md +25 -0
- package/claude-plugin/skills/brandcheck/SKILL.md +29 -0
- package/claude-plugin/skills/browser/SKILL.md +64 -0
- package/claude-plugin/skills/client/SKILL.md +24 -0
- package/claude-plugin/skills/desktop/SKILL.md +25 -0
- package/claude-plugin/skills/extension/SKILL.md +25 -0
- package/claude-plugin/skills/main/SKILL.md +54 -0
- package/claude-plugin/skills/manager/SKILL.md +25 -0
- package/claude-plugin/skills/seo/SKILL.md +36 -0
- package/claude-plugin/skills/theme/SKILL.md +33 -0
- package/claude-plugin/skills/web/SKILL.md +29 -0
- package/dist/cli-run.js +34 -0
- package/dist/cli.js +29 -0
- package/dist/commands/build.js +17 -0
- package/dist/commands/clean.js +16 -0
- package/dist/commands/company.js +46 -0
- package/dist/commands/deploy.js +143 -0
- package/dist/commands/dev.js +437 -0
- package/dist/commands/devlog.js +25 -0
- package/dist/commands/help.js +48 -0
- package/dist/commands/manage.js +53 -0
- package/dist/commands/migrate.js +76 -0
- package/dist/commands/onboard.js +31 -0
- package/dist/commands/pipeline.js +319 -0
- package/dist/commands/test.js +380 -0
- package/dist/commands/update.js +128 -0
- package/dist/commands/version.js +8 -0
- package/dist/company-init.js +167 -0
- package/dist/company.js +283 -0
- package/dist/config.js +1359 -0
- package/dist/devlog/index.js +226 -0
- package/dist/devlog/lib/collect-commits.js +136 -0
- package/dist/devlog/lib/generate-post.js +201 -0
- package/dist/devlog/lib/ghostii.js +122 -0
- package/dist/devlog/lib/project-map.js +98 -0
- package/dist/devlog/lib/publish-website.js +88 -0
- package/dist/index.js +45 -0
- package/dist/lib/agents-md.js +201 -0
- package/dist/lib/analytics-secret.js +22 -0
- package/dist/lib/argv.js +21 -0
- package/dist/lib/auth-admin.js +120 -0
- package/dist/lib/automation-client.js +210 -0
- package/dist/lib/backend-marketing.js +49 -0
- package/dist/lib/brand.js +240 -0
- package/dist/lib/bundle-id.js +53 -0
- package/dist/lib/claude-settings.js +125 -0
- package/dist/lib/company-scaffold.js +213 -0
- package/dist/lib/company.js +227 -0
- package/dist/lib/config-flow.js +350 -0
- package/dist/lib/config-write.js +41 -0
- package/dist/lib/custom-target.js +75 -0
- package/dist/lib/domain-utils.js +19 -0
- package/dist/lib/duration.js +39 -0
- package/dist/lib/env-order.js +236 -0
- package/dist/lib/env-secret.js +78 -0
- package/dist/lib/firestore-rest.js +326 -0
- package/dist/lib/framework-bin.js +156 -0
- package/dist/lib/gitignore.js +63 -0
- package/dist/lib/google-auth.js +495 -0
- package/dist/lib/google-token.js +66 -0
- package/dist/lib/jwt.js +31 -0
- package/dist/lib/legacy-oauth.js +59 -0
- package/dist/lib/node-version.js +127 -0
- package/dist/lib/owner-plan.js +78 -0
- package/dist/lib/package-scripts.js +152 -0
- package/dist/lib/preflight.js +470 -0
- package/dist/lib/product-create.js +144 -0
- package/dist/lib/run-command.js +74 -0
- package/dist/lib/run-gates.js +70 -0
- package/dist/lib/run-output.js +42 -0
- package/dist/lib/run-summary.js +384 -0
- package/dist/lib/scaffold.js +427 -0
- package/dist/lib/service-input.js +207 -0
- package/dist/lib/service-runner.js +466 -0
- package/dist/lib/stale.js +24 -0
- package/dist/lib/target-selection.js +155 -0
- package/dist/lib/verb-fanout.js +128 -0
- package/dist/lib/verify-live.js +188 -0
- package/dist/manage.js +311 -0
- package/dist/omega-bin.js +7 -0
- package/dist/onboard.js +532 -0
- package/dist/services/account/ensure/users.js +259 -0
- package/dist/services/account/index.js +97 -0
- package/dist/services/account/lib/backend-client.js +107 -0
- package/dist/services/account/lib/password.js +36 -0
- package/dist/services/account/lib/resolve-password.js +100 -0
- package/dist/services/advertising/ensure/sites.js +101 -0
- package/dist/services/advertising/index.js +101 -0
- package/dist/services/advertising/lib/adsense-api.js +41 -0
- package/dist/services/ai/ensure/keys.js +21 -0
- package/dist/services/ai/index.js +36 -0
- package/dist/services/analytics/ensure/google-firebase-link.js +230 -0
- package/dist/services/analytics/ensure/google-streams.js +256 -0
- package/dist/services/analytics/ensure/meta-pixel.js +22 -0
- package/dist/services/analytics/ensure/tiktok-pixel.js +22 -0
- package/dist/services/analytics/index.js +134 -0
- package/dist/services/analytics/lib/analytics-api.js +156 -0
- package/dist/services/analytics/lib/meta-api.js +83 -0
- package/dist/services/analytics/lib/pixel-account.js +78 -0
- package/dist/services/analytics/lib/pixel-provision.js +152 -0
- package/dist/services/analytics/lib/pixel-specs.js +57 -0
- package/dist/services/analytics/lib/pixel-token.js +88 -0
- package/dist/services/analytics/lib/property-flow.js +77 -0
- package/dist/services/analytics/lib/tiktok-api.js +157 -0
- package/dist/services/analytics/lib/tiktok-auth.js +153 -0
- package/dist/services/assets/ensure/logo-gen.js +68 -0
- package/dist/services/assets/index.js +109 -0
- package/dist/services/assets/lib/assets-config.js +168 -0
- package/dist/services/assets/lib/brandmark-api.js +160 -0
- package/dist/services/assets/lib/derived.js +113 -0
- package/dist/services/assets/lib/font-loader.js +67 -0
- package/dist/services/assets/lib/reconcile.js +122 -0
- package/dist/services/assets/lib/reset.js +118 -0
- package/dist/services/assets/lib/svg-logo-generator.js +154 -0
- package/dist/services/assets/lib/svg-to-black.js +32 -0
- package/dist/services/assets/write/favicons.js +82 -0
- package/dist/services/assets/write/icons.js +64 -0
- package/dist/services/assets/write/process.js +96 -0
- package/dist/services/assets/write/reconcile.js +30 -0
- package/dist/services/assets/write/social-icons.js +108 -0
- package/dist/services/assets/write/templates.js +345 -0
- package/dist/services/bookmark/ensure/sync.js +255 -0
- package/dist/services/bookmark/index.js +17 -0
- package/dist/services/campaigns/ensure/contact-person.js +40 -0
- package/dist/services/campaigns/ensure/custom-fields.js +84 -0
- package/dist/services/campaigns/ensure/domain-auth.js +92 -0
- package/dist/services/campaigns/ensure/event-webhook.js +89 -0
- package/dist/services/campaigns/ensure/link-branding.js +187 -0
- package/dist/services/campaigns/ensure/list.js +50 -0
- package/dist/services/campaigns/ensure/segments.js +109 -0
- package/dist/services/campaigns/ensure/sender-identity.js +153 -0
- package/dist/services/campaigns/ensure/unsubscribe-groups.js +116 -0
- package/dist/services/campaigns/index.js +79 -0
- package/dist/services/campaigns/lib/dns-sync.js +81 -0
- package/dist/services/campaigns/lib/segment-query.js +138 -0
- package/dist/services/campaigns/lib/sendgrid-api.js +287 -0
- package/dist/services/captcha/ensure/site-key.js +83 -0
- package/dist/services/captcha/index.js +78 -0
- package/dist/services/captcha/lib/console-url.js +45 -0
- package/dist/services/captcha/lib/recaptcha-api.js +36 -0
- package/dist/services/certificates/ensure/api-key.js +22 -0
- package/dist/services/certificates/ensure/bundle-ids.js +115 -0
- package/dist/services/certificates/ensure/certificates.js +187 -0
- package/dist/services/certificates/ensure/profiles.js +143 -0
- package/dist/services/certificates/index.js +225 -0
- package/dist/services/certificates/lib/apple-api.js +183 -0
- package/dist/services/certificates/lib/certificate-manager.js +252 -0
- package/dist/services/certificates/lib/identifier-manager.js +107 -0
- package/dist/services/certificates/lib/keychain.js +135 -0
- package/dist/services/certificates/lib/manual-walkthrough.js +165 -0
- package/dist/services/certificates/lib/profile-manager.js +115 -0
- package/dist/services/chat/data/baseline-knowledge.md +96 -0
- package/dist/services/chat/ensure/chat.js +106 -0
- package/dist/services/chat/ensure/user.js +45 -0
- package/dist/services/chat/index.js +139 -0
- package/dist/services/chat/lib/baseline-knowledge.js +137 -0
- package/dist/services/cloud/ensure/authentication.js +267 -0
- package/dist/services/cloud/ensure/billing.js +120 -0
- package/dist/services/cloud/ensure/cloud-messaging.js +105 -0
- package/dist/services/cloud/ensure/database.js +60 -0
- package/dist/services/cloud/ensure/firestore.js +79 -0
- package/dist/services/cloud/ensure/functions.js +49 -0
- package/dist/services/cloud/ensure/hosting.js +398 -0
- package/dist/services/cloud/ensure/oauth-consent.js +248 -0
- package/dist/services/cloud/ensure/project-settings.js +72 -0
- package/dist/services/cloud/ensure/sdk-config.js +95 -0
- package/dist/services/cloud/ensure/service-account.js +152 -0
- package/dist/services/cloud/ensure/services.js +103 -0
- package/dist/services/cloud/ensure/storage.js +47 -0
- package/dist/services/cloud/index.js +130 -0
- package/dist/services/cloud/lib/access-heal.js +130 -0
- package/dist/services/cloud/lib/firebase-api.js +662 -0
- package/dist/services/cloud/lib/project-flow.js +102 -0
- package/dist/services/directory/ensure/entry.js +48 -0
- package/dist/services/directory/index.js +64 -0
- package/dist/services/directory/lib/blocks.js +104 -0
- package/dist/services/disperse/index.js +45 -0
- package/dist/services/disperse/write/certs.js +117 -0
- package/dist/services/domain/ensure/nameservers.js +179 -0
- package/dist/services/domain/index.js +69 -0
- package/dist/services/domain/lib/namecheap-api.js +167 -0
- package/dist/services/domain/lib/registrars.js +46 -0
- package/dist/services/domain/lib/whitelist-walkthrough.js +76 -0
- package/dist/services/edge/ensure/cache-rules.js +105 -0
- package/dist/services/edge/ensure/dns-records.js +304 -0
- package/dist/services/edge/ensure/email-routing.js +292 -0
- package/dist/services/edge/ensure/rules-configuration.js +98 -0
- package/dist/services/edge/ensure/rules-managed-transforms.js +101 -0
- package/dist/services/edge/ensure/rules-redirect.js +107 -0
- package/dist/services/edge/ensure/rules-response-headers.js +90 -0
- package/dist/services/edge/ensure/rules-security.js +142 -0
- package/dist/services/edge/ensure/speed-scheduled-tests.js +98 -0
- package/dist/services/edge/ensure/workers.js +219 -0
- package/dist/services/edge/ensure/zone-settings.js +108 -0
- package/dist/services/edge/ensure/zone.js +183 -0
- package/dist/services/edge/index.js +73 -0
- package/dist/services/edge/lib/cloudflare-api.js +84 -0
- package/dist/services/edge/lib/dns-records-helpers.js +518 -0
- package/dist/services/edge/lib/read-cache.js +16 -0
- package/dist/services/edge/lib/ruleset-helper.js +108 -0
- package/dist/services/edge/workers/omega-api-proxy.js +43 -0
- package/dist/services/email/data/baseline-filter.md +4 -0
- package/dist/services/email/data/baseline-knowledge.md +86 -0
- package/dist/services/email/ensure/agent.js +107 -0
- package/dist/services/email/ensure/user.js +45 -0
- package/dist/services/email/index.js +138 -0
- package/dist/services/email/lib/baseline.js +82 -0
- package/dist/services/email/lib/knowledge-file.js +53 -0
- package/dist/services/forms/ensure/form.js +46 -0
- package/dist/services/forms/ensure/user.js +45 -0
- package/dist/services/forms/index.js +138 -0
- package/dist/services/migrations/ensure/notifications.js +189 -0
- package/dist/services/migrations/ensure/orders.js +34 -0
- package/dist/services/migrations/ensure/payment-provider.js +132 -0
- package/dist/services/migrations/ensure/payments-intents.js +34 -0
- package/dist/services/migrations/ensure/state-retirement.js +266 -0
- package/dist/services/migrations/ensure/targets-rename.js +124 -0
- package/dist/services/migrations/ensure/users.js +1176 -0
- package/dist/services/migrations/index.js +101 -0
- package/dist/services/migrations/lib/attribution-touch.js +64 -0
- package/dist/services/migrations/lib/ensure-metadata.js +144 -0
- package/dist/services/migrations/lib/migration-runner.js +473 -0
- package/dist/services/migrations/lib/sanitize-strings.js +112 -0
- package/dist/services/migrations/lib/schema-validator.js +154 -0
- package/dist/services/monitoring/ensure/dsn.js +54 -0
- package/dist/services/monitoring/ensure/projects.js +135 -0
- package/dist/services/monitoring/index.js +54 -0
- package/dist/services/monitoring/lib/sentry-api.js +94 -0
- package/dist/services/newsletter/ensure/custom-fields.js +90 -0
- package/dist/services/newsletter/ensure/publication.js +94 -0
- package/dist/services/newsletter/ensure/segments.js +140 -0
- package/dist/services/newsletter/ensure/webhook.js +108 -0
- package/dist/services/newsletter/index.js +64 -0
- package/dist/services/newsletter/lib/beehiiv-api.js +124 -0
- package/dist/services/newsletter/lib/segment-automation.js +577 -0
- package/dist/services/payment/ensure/chargebee-account.js +30 -0
- package/dist/services/payment/ensure/chargebee-products.js +359 -0
- package/dist/services/payment/ensure/chargebee-webhook.js +113 -0
- package/dist/services/payment/ensure/paypal-account.js +36 -0
- package/dist/services/payment/ensure/paypal-products.js +374 -0
- package/dist/services/payment/ensure/paypal-webhook.js +128 -0
- package/dist/services/payment/ensure/stripe-account.js +93 -0
- package/dist/services/payment/ensure/stripe-disputes.js +56 -0
- package/dist/services/payment/ensure/stripe-products.js +245 -0
- package/dist/services/payment/ensure/stripe-radar.js +74 -0
- package/dist/services/payment/ensure/stripe-webhook.js +130 -0
- package/dist/services/payment/index.js +163 -0
- package/dist/services/payment/lib/chargebee-api.js +338 -0
- package/dist/services/payment/lib/payment-utils.js +116 -0
- package/dist/services/payment/lib/paypal-api.js +354 -0
- package/dist/services/payment/lib/provider-setup.js +134 -0
- package/dist/services/payment/lib/stripe-api.js +152 -0
- package/dist/services/repo/ensure/org.js +70 -0
- package/dist/services/repo/ensure/pages.js +72 -0
- package/dist/services/repo/ensure/repo.js +90 -0
- package/dist/services/repo/index.js +52 -0
- package/dist/services/repo/lib/github-api.js +196 -0
- package/dist/services/search/ensure/ga-link.js +57 -0
- package/dist/services/search/ensure/property.js +137 -0
- package/dist/services/search/ensure/sitemaps.js +70 -0
- package/dist/services/search/index.js +61 -0
- package/dist/services/search/lib/search-console-api.js +92 -0
- package/dist/services/seo/ensure/github-repos.js +271 -0
- package/dist/services/seo/index.js +55 -0
- package/dist/services/seo/lib/gh-api.js +161 -0
- package/dist/services/seo/templates/developer-tool/.github/workflows/maintenance.yml +25 -0
- package/dist/services/seo/templates/developer-tool/.nvmrc +1 -0
- package/dist/services/seo/templates/developer-tool/_README.md.js +121 -0
- package/dist/services/seo/templates/developer-tool/_package.json.js +33 -0
- package/dist/services/seo/templates/developer-tool/src/index.js +120 -0
- package/dist/services/seo/templates/index.js +57 -0
- package/dist/services/server/ensure/brands.js +63 -0
- package/dist/services/server/index.js +42 -0
- package/dist/services/testing/ensure/target-checks.js +97 -0
- package/dist/services/testing/index.js +11 -0
- package/dist/services/testing/lib/checks.js +467 -0
- package/dist/services/update/index.js +20 -0
- package/dist/services/update/lib/cache.js +59 -0
- package/dist/services/update/lib/fingerprint.js +157 -0
- package/dist/services/update/write/targets.js +206 -0
- package/dist/services/workspace/ensure/agents.js +42 -0
- package/dist/services/workspace/ensure/claude-settings.js +34 -0
- package/dist/services/workspace/ensure/config.js +54 -0
- package/dist/services/workspace/ensure/defaults.js +60 -0
- package/dist/services/workspace/ensure/env-keys.js +55 -0
- package/dist/services/workspace/ensure/env-order.js +66 -0
- package/dist/services/workspace/ensure/env-rules.js +97 -0
- package/dist/services/workspace/ensure/gitignore.js +18 -0
- package/dist/services/workspace/ensure/scripts.js +126 -0
- package/dist/services/workspace/ensure/structure.js +97 -0
- package/dist/services/workspace/ensure/translation-sdk.js +148 -0
- package/dist/services/workspace/ensure/workflows.js +54 -0
- package/dist/services/workspace/index.js +8 -0
- package/dist/vendor/account/engine.js +182 -0
- package/dist/vendor/account/features.js +220 -0
- package/dist/vendor/account/index.js +53 -0
- package/dist/vendor/account/schema.js +272 -0
- package/dist/vendor/account/subscription.js +38 -0
- package/dist/vendor/config/company.js +31 -0
- package/dist/vendor/config/defaults.js +173 -0
- package/dist/vendor/config/demo.js +18 -0
- package/dist/vendor/config/desktop-artifacts.js +110 -0
- package/dist/vendor/config/edit.js +769 -0
- package/dist/vendor/config/env-delivery.js +145 -0
- package/dist/vendor/config/env-rules.js +93 -0
- package/dist/vendor/config/env-schema.js +1078 -0
- package/dist/vendor/config/env.js +445 -0
- package/dist/vendor/config/hooks.js +97 -0
- package/dist/vendor/config/index.js +237 -0
- package/dist/vendor/config/instances.js +208 -0
- package/dist/vendor/config/load.js +490 -0
- package/dist/vendor/config/merge.js +68 -0
- package/dist/vendor/config/order.js +139 -0
- package/dist/vendor/config/ports.js +374 -0
- package/dist/vendor/config/providers.js +32 -0
- package/dist/vendor/config/repo.js +142 -0
- package/dist/vendor/config/retired-keys.js +430 -0
- package/dist/vendor/config/schema.js +1610 -0
- package/dist/vendor/config/secrets.js +50 -0
- package/dist/vendor/config/seed.js +34 -0
- package/dist/vendor/config/site-global.js +205 -0
- package/dist/vendor/config/validate.js +554 -0
- package/dist/vendor/config/winback.js +61 -0
- package/dist/vendor/devkit/attach-log-file.js +262 -0
- package/dist/vendor/devkit/certs.js +199 -0
- package/dist/vendor/devkit/ci-workflows.js +520 -0
- package/dist/vendor/devkit/cli-router.js +156 -0
- package/dist/vendor/devkit/command-path.js +46 -0
- package/dist/vendor/devkit/deploy-record.js +180 -0
- package/dist/vendor/devkit/flows.js +317 -0
- package/dist/vendor/devkit/local-https.js +360 -0
- package/dist/vendor/devkit/local.js +1905 -0
- package/dist/vendor/devkit/logger.js +128 -0
- package/dist/vendor/devkit/omega-bin.js +345 -0
- package/dist/vendor/devkit/prompt.js +187 -0
- package/dist/vendor/devkit/safe-install.js +18 -0
- package/dist/vendor/devkit/stop-signals.js +28 -0
- package/dist/vendor/devkit/test/scope.js +162 -0
- package/dist/vendor/devkit/translate/cache.js +84 -0
- package/dist/vendor/devkit/translate/engine.js +243 -0
- package/dist/vendor/devkit/translate/index.js +49 -0
- package/dist/vendor/devkit/translate/languages.js +134 -0
- package/dist/vendor/devkit/translate/providers.js +188 -0
- package/dist/vendor/devkit/update.js +569 -0
- package/docs/AGENTS.md +200 -0
- package/docs/account.md +45 -0
- package/docs/advertising.md +46 -0
- package/docs/ai.md +34 -0
- package/docs/analytics.md +69 -0
- package/docs/assets.md +57 -0
- package/docs/bookmark.md +26 -0
- package/docs/brand.md +151 -0
- package/docs/campaigns.md +96 -0
- package/docs/captcha.md +46 -0
- package/docs/certificates.md +68 -0
- package/docs/chat.md +47 -0
- package/docs/cloud.md +110 -0
- package/docs/company.md +64 -0
- package/docs/directory.md +140 -0
- package/docs/disperse.md +46 -0
- package/docs/domain.md +56 -0
- package/docs/edge.md +234 -0
- package/docs/email.md +42 -0
- package/docs/forms.md +48 -0
- package/docs/index.md +109 -0
- package/docs/migration.md +203 -0
- package/docs/migrations.md +56 -0
- package/docs/monitoring.md +41 -0
- package/docs/newsletter.md +48 -0
- package/docs/payment.md +83 -0
- package/docs/repo.md +48 -0
- package/docs/search.md +44 -0
- package/docs/seo.md +34 -0
- package/docs/server.md +37 -0
- package/docs/shared/agent-docs.md +89 -0
- package/docs/shared/analytics.md +612 -0
- package/docs/shared/brands.md +51 -0
- package/docs/shared/breaking-changes.md +497 -0
- package/docs/shared/config.md +1387 -0
- package/docs/shared/deploys.md +215 -0
- package/docs/shared/icons.md +201 -0
- package/docs/shared/local-dev.md +147 -0
- package/docs/shared/logging.md +202 -0
- package/docs/shared/monitoring.md +153 -0
- package/docs/shared/publishing.md +183 -0
- package/docs/shared/rulings.md +34 -0
- package/docs/shared/testing.md +147 -0
- package/docs/shared/theming.md +604 -0
- package/docs/shared/translation.md +291 -0
- package/docs/shared/updates.md +61 -0
- package/docs/testing.md +34 -0
- package/docs/update.md +36 -0
- package/docs/workspace.md +64 -0
- package/package.json +88 -0
|
@@ -0,0 +1,134 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Language SSOT for the OMEGA translation system — the code → English-name
|
|
3
|
+
* map every framework validates against, plus the RTL set. Brand configs pick
|
|
4
|
+
* target codes in `translation.languages`; frameworks never carry their own
|
|
5
|
+
* language lists.
|
|
6
|
+
*/
|
|
7
|
+
|
|
8
|
+
// Supported target languages (ISO 639-1 codes → English names). The names are
|
|
9
|
+
// sent to the AI provider so the model knows exactly which variant is meant.
|
|
10
|
+
const LANGUAGE_NAMES = {
|
|
11
|
+
ar: 'Arabic',
|
|
12
|
+
bn: 'Bengali',
|
|
13
|
+
cs: 'Czech',
|
|
14
|
+
da: 'Danish',
|
|
15
|
+
de: 'German',
|
|
16
|
+
el: 'Greek',
|
|
17
|
+
es: 'Spanish',
|
|
18
|
+
fa: 'Persian (Farsi)',
|
|
19
|
+
fi: 'Finnish',
|
|
20
|
+
fr: 'French',
|
|
21
|
+
he: 'Hebrew',
|
|
22
|
+
hi: 'Hindi',
|
|
23
|
+
hu: 'Hungarian',
|
|
24
|
+
id: 'Indonesian',
|
|
25
|
+
it: 'Italian',
|
|
26
|
+
ja: 'Japanese',
|
|
27
|
+
ko: 'Korean',
|
|
28
|
+
ms: 'Malay',
|
|
29
|
+
nl: 'Dutch',
|
|
30
|
+
no: 'Norwegian',
|
|
31
|
+
pl: 'Polish',
|
|
32
|
+
pt: 'Portuguese',
|
|
33
|
+
ro: 'Romanian',
|
|
34
|
+
ru: 'Russian',
|
|
35
|
+
sv: 'Swedish',
|
|
36
|
+
th: 'Thai',
|
|
37
|
+
tl: 'Tagalog/Filipino',
|
|
38
|
+
tr: 'Turkish',
|
|
39
|
+
uk: 'Ukrainian',
|
|
40
|
+
ur: 'Urdu',
|
|
41
|
+
vi: 'Vietnamese',
|
|
42
|
+
zh: 'Chinese (Simplified)',
|
|
43
|
+
};
|
|
44
|
+
|
|
45
|
+
// Open Graph locales (`language_TERRITORY` — the og:locale convention) for the
|
|
46
|
+
// supported set plus the common source languages. One territory per language:
|
|
47
|
+
// the most widely used one, matching Facebook's locale list (Norwegian is
|
|
48
|
+
// `nb_NO` there, Portuguese `pt_PT`).
|
|
49
|
+
const LANGUAGE_LOCALES = {
|
|
50
|
+
ar: 'ar_AR',
|
|
51
|
+
bn: 'bn_IN',
|
|
52
|
+
cs: 'cs_CZ',
|
|
53
|
+
da: 'da_DK',
|
|
54
|
+
de: 'de_DE',
|
|
55
|
+
el: 'el_GR',
|
|
56
|
+
en: 'en_US',
|
|
57
|
+
es: 'es_ES',
|
|
58
|
+
fa: 'fa_IR',
|
|
59
|
+
fi: 'fi_FI',
|
|
60
|
+
fr: 'fr_FR',
|
|
61
|
+
he: 'he_IL',
|
|
62
|
+
hi: 'hi_IN',
|
|
63
|
+
hu: 'hu_HU',
|
|
64
|
+
id: 'id_ID',
|
|
65
|
+
it: 'it_IT',
|
|
66
|
+
ja: 'ja_JP',
|
|
67
|
+
ko: 'ko_KR',
|
|
68
|
+
ms: 'ms_MY',
|
|
69
|
+
nl: 'nl_NL',
|
|
70
|
+
no: 'nb_NO',
|
|
71
|
+
pl: 'pl_PL',
|
|
72
|
+
pt: 'pt_PT',
|
|
73
|
+
ro: 'ro_RO',
|
|
74
|
+
ru: 'ru_RU',
|
|
75
|
+
sv: 'sv_SE',
|
|
76
|
+
th: 'th_TH',
|
|
77
|
+
tl: 'tl_PH',
|
|
78
|
+
tr: 'tr_TR',
|
|
79
|
+
uk: 'uk_UA',
|
|
80
|
+
ur: 'ur_PK',
|
|
81
|
+
vi: 'vi_VN',
|
|
82
|
+
zh: 'zh_CN',
|
|
83
|
+
};
|
|
84
|
+
|
|
85
|
+
// Right-to-left languages (drives <html dir="rtl"> on translated pages)
|
|
86
|
+
const RTL_LANGUAGES = ['ar', 'he', 'fa', 'ur', 'ps', 'sd', 'ku', 'yi', 'ckb', 'dv'];
|
|
87
|
+
|
|
88
|
+
/**
|
|
89
|
+
* Whether a language renders right-to-left.
|
|
90
|
+
* @param {string} code - language code
|
|
91
|
+
* @returns {boolean}
|
|
92
|
+
*/
|
|
93
|
+
function isRTL(code) {
|
|
94
|
+
return RTL_LANGUAGES.includes(code);
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
/**
|
|
98
|
+
* English name for a language code.
|
|
99
|
+
* @param {string} code - language code
|
|
100
|
+
* @returns {string} the name, or the code itself if unknown
|
|
101
|
+
*/
|
|
102
|
+
function languageName(code) {
|
|
103
|
+
return LANGUAGE_NAMES[code] || code;
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
/**
|
|
107
|
+
* Open Graph locale for a language code — `es` → `es_ES`. Target codes are
|
|
108
|
+
* validated by assertKnownLanguages, but the SOURCE language is free-form
|
|
109
|
+
* config, so an unmapped code falls back to the code itself (a bare code is
|
|
110
|
+
* what og:locale carried before this map existed).
|
|
111
|
+
* @param {string} code - language code
|
|
112
|
+
* @returns {string} the language_TERRITORY locale, or the code if unmapped
|
|
113
|
+
*/
|
|
114
|
+
function ogLocale(code) {
|
|
115
|
+
return LANGUAGE_LOCALES[code] || code;
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
/**
|
|
119
|
+
* Assert every code is a supported target language.
|
|
120
|
+
* @param {string[]} codes - language codes from config
|
|
121
|
+
* @throws {Error} naming the unknown codes and the supported set
|
|
122
|
+
*/
|
|
123
|
+
function assertKnownLanguages(codes) {
|
|
124
|
+
const unknown = (codes || []).filter((code) => !LANGUAGE_NAMES[code]);
|
|
125
|
+
|
|
126
|
+
if (unknown.length) {
|
|
127
|
+
throw new Error(
|
|
128
|
+
`Unknown translation language(s): ${unknown.join(', ')}. `
|
|
129
|
+
+ `Supported codes: ${Object.keys(LANGUAGE_NAMES).join(', ')}`
|
|
130
|
+
);
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
module.exports = { LANGUAGE_NAMES, LANGUAGE_LOCALES, RTL_LANGUAGES, isRTL, languageName, ogLocale, assertKnownLanguages };
|
|
@@ -0,0 +1,188 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* AI providers for the translation engine — `claude` (default; rides the
|
|
3
|
+
* locally-installed Claude Code via @anthropic-ai/claude-agent-sdk, so no API
|
|
4
|
+
* key is needed) and `chatgpt` (OpenAI Responses API via native fetch;
|
|
5
|
+
* requires OPENAI_API_KEY). Both expose the same contract:
|
|
6
|
+
* provider.send({ system, user }) → Promise<{ text, usage }>
|
|
7
|
+
* where usage is { input, output } token counts (zeros when unreported).
|
|
8
|
+
*
|
|
9
|
+
* The Agent SDK is lazy-required, so it is only touched when a claude call
|
|
10
|
+
* actually happens, and devkit itself stays dependency-free here. It resolves
|
|
11
|
+
* from whoever installed it: @omega.js/extension declares it, @omega.js/web
|
|
12
|
+
* does NOT (#37: translation is opt-in and the SDK is heavy, so a web brand
|
|
13
|
+
* that enables translation installs it in the target). When it is absent, the
|
|
14
|
+
* call fails loud with the install command instead of skipping translation.
|
|
15
|
+
*/
|
|
16
|
+
|
|
17
|
+
const PROVIDERS = ['claude', 'chatgpt'];
|
|
18
|
+
|
|
19
|
+
// Default model per provider. 'sonnet' is the Claude Code alias that tracks
|
|
20
|
+
// the current Sonnet — no stale date pins in framework code.
|
|
21
|
+
const DEFAULT_MODELS = {
|
|
22
|
+
claude: 'sonnet',
|
|
23
|
+
chatgpt: 'gpt-5.4-nano',
|
|
24
|
+
};
|
|
25
|
+
|
|
26
|
+
/**
|
|
27
|
+
* Build a provider handle from config values.
|
|
28
|
+
* @param {object} options
|
|
29
|
+
* @param {string} [options.provider] - 'claude' (default) or 'chatgpt'
|
|
30
|
+
* @param {string} [options.model] - model override (default per provider)
|
|
31
|
+
* @param {Function} [options.fetchFn] - fetch override (tests)
|
|
32
|
+
* @returns {{ name: string, model: string, send: Function }}
|
|
33
|
+
*/
|
|
34
|
+
function resolveProvider(options) {
|
|
35
|
+
options = options || {};
|
|
36
|
+
const name = options.provider || 'claude';
|
|
37
|
+
|
|
38
|
+
if (!PROVIDERS.includes(name)) {
|
|
39
|
+
throw new Error(`Unknown translation provider "${name}" — use ${PROVIDERS.map((p) => `'${p}'`).join(' or ')}`);
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
const model = options.model || DEFAULT_MODELS[name];
|
|
43
|
+
const send = name === 'claude'
|
|
44
|
+
? (message) => sendClaude(model, message)
|
|
45
|
+
: (message) => sendChatgpt(model, message, options.fetchFn);
|
|
46
|
+
|
|
47
|
+
return { name, model, send };
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
/**
|
|
51
|
+
* Send one prompt through the local Claude Code install (Agent SDK).
|
|
52
|
+
* @param {string} model - model name/alias
|
|
53
|
+
* @param {{ system: string, user: string }} message
|
|
54
|
+
* @returns {Promise<{ text: string, usage: { input: number, output: number } }>}
|
|
55
|
+
*/
|
|
56
|
+
async function sendClaude(model, message) {
|
|
57
|
+
let query;
|
|
58
|
+
try {
|
|
59
|
+
({ query } = require('@anthropic-ai/claude-agent-sdk'));
|
|
60
|
+
} catch (e) {
|
|
61
|
+
throw new Error('The claude translation provider needs @anthropic-ai/claude-agent-sdk, which is not installed here. Translation is opt-in and the SDK is heavy, so the framework does not bundle it: install it in this target with `npm install @anthropic-ai/claude-agent-sdk` (it also needs a local Claude Code install/auth), or set translation.providers to { chatgpt: {} }.');
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
let text = '';
|
|
65
|
+
const usage = { input: 0, output: 0 };
|
|
66
|
+
|
|
67
|
+
// Hermetic single-shot: settingSources [] keeps the user's CLAUDE.md/hooks
|
|
68
|
+
// out of the session (they pollute mechanical output), the system prompt
|
|
69
|
+
// replaces the CLI persona, and no maxTurns cap — a plain reply already
|
|
70
|
+
// counts as the final turn and a cap of 1 reports error_max_turns.
|
|
71
|
+
//
|
|
72
|
+
// Subscription-only by contract: this provider rides the local Claude
|
|
73
|
+
// Code install's own login. A stray ANTHROPIC_API_KEY anywhere in the
|
|
74
|
+
// env cascade would silently flip the SDK to API-credit billing — the
|
|
75
|
+
// child env hides it so the subscription is the ONLY auth path.
|
|
76
|
+
const env = { ...process.env };
|
|
77
|
+
delete env.ANTHROPIC_API_KEY;
|
|
78
|
+
|
|
79
|
+
const consume = async () => {
|
|
80
|
+
for await (const event of query({
|
|
81
|
+
prompt: message.user,
|
|
82
|
+
options: {
|
|
83
|
+
model,
|
|
84
|
+
allowedTools: [],
|
|
85
|
+
settingSources: [],
|
|
86
|
+
systemPrompt: message.system,
|
|
87
|
+
env,
|
|
88
|
+
},
|
|
89
|
+
})) {
|
|
90
|
+
if (event.type === 'assistant' && event.message?.content) {
|
|
91
|
+
for (const block of event.message.content) {
|
|
92
|
+
if (block.type === 'text') {
|
|
93
|
+
text += block.text;
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
if (event.type === 'result') {
|
|
99
|
+
// A failed call must throw NOW — a session-limited install can
|
|
100
|
+
// otherwise stall the whole build (the 28-minute cp119 hang)
|
|
101
|
+
if (event.subtype && event.subtype !== 'success') {
|
|
102
|
+
throw new Error(`Claude translate call failed (${event.subtype})${event.result ? `: ${String(event.result).slice(0, 200)}` : ''} — if this is the session limit, wait for the 5-hour window to reset or build with --cached-only.`);
|
|
103
|
+
}
|
|
104
|
+
if (event.usage) {
|
|
105
|
+
usage.input += event.usage.input_tokens || 0;
|
|
106
|
+
usage.output += event.usage.output_tokens || 0;
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
};
|
|
111
|
+
|
|
112
|
+
// Hard per-call ceiling — a stalled SDK call fails loud and fast instead
|
|
113
|
+
// of hanging the caller (OMEGA_TRANSLATE_TIMEOUT_MS overrides; tests use it)
|
|
114
|
+
const timeoutMs = Number(process.env.OMEGA_TRANSLATE_TIMEOUT_MS || 240000);
|
|
115
|
+
let timer = null;
|
|
116
|
+
try {
|
|
117
|
+
await Promise.race([
|
|
118
|
+
consume(),
|
|
119
|
+
new Promise((resolve, reject) => {
|
|
120
|
+
// NOT unref'd on purpose: the finally-clearTimeout already stops a
|
|
121
|
+
// settled call from holding the process, and an unref'd watchdog
|
|
122
|
+
// lets a stalled SDK call with no other live handles drain the
|
|
123
|
+
// event loop and exit SILENTLY before the timer can fire — the
|
|
124
|
+
// exact opposite of failing loud (and a test-run flake: the
|
|
125
|
+
// stalled-call test was cancelled whenever nothing else kept the
|
|
126
|
+
// loop alive for the 80ms window).
|
|
127
|
+
timer = setTimeout(() => reject(new Error(`Claude translate call exceeded ${Math.round(timeoutMs / 1000)}s — a stalled SDK call (often the session limit); wait for the window to reset or build with --cached-only.`)), timeoutMs);
|
|
128
|
+
}),
|
|
129
|
+
]);
|
|
130
|
+
} finally {
|
|
131
|
+
clearTimeout(timer);
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
return { text, usage };
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
/**
|
|
138
|
+
* Send one prompt through the OpenAI Responses API.
|
|
139
|
+
* @param {string} model - model name
|
|
140
|
+
* @param {{ system: string, user: string }} message
|
|
141
|
+
* @param {Function} [fetchFn] - fetch override (tests)
|
|
142
|
+
* @returns {Promise<{ text: string, usage: { input: number, output: number } }>}
|
|
143
|
+
*/
|
|
144
|
+
async function sendChatgpt(model, message, fetchFn) {
|
|
145
|
+
const apiKey = process.env.OPENAI_API_KEY;
|
|
146
|
+
if (!apiKey) {
|
|
147
|
+
throw new Error('The chatgpt translation provider requires OPENAI_API_KEY in the environment (.env cascade) — or use the default "claude" provider (local Claude Code, no key).');
|
|
148
|
+
}
|
|
149
|
+
|
|
150
|
+
const doFetch = fetchFn || fetch;
|
|
151
|
+
const response = await doFetch('https://api.openai.com/v1/responses', {
|
|
152
|
+
method: 'POST',
|
|
153
|
+
headers: {
|
|
154
|
+
'Authorization': `Bearer ${apiKey}`,
|
|
155
|
+
'Content-Type': 'application/json',
|
|
156
|
+
},
|
|
157
|
+
signal: AbortSignal.timeout(240000),
|
|
158
|
+
body: JSON.stringify({
|
|
159
|
+
model,
|
|
160
|
+
input: [
|
|
161
|
+
{ role: 'developer', content: message.system },
|
|
162
|
+
{ role: 'user', content: message.user },
|
|
163
|
+
],
|
|
164
|
+
reasoning: { effort: 'low' },
|
|
165
|
+
}),
|
|
166
|
+
});
|
|
167
|
+
|
|
168
|
+
if (!response.ok) {
|
|
169
|
+
const body = await response.text().catch(() => '');
|
|
170
|
+
throw new Error(`OpenAI API error ${response.status}: ${body.slice(0, 300)}`);
|
|
171
|
+
}
|
|
172
|
+
|
|
173
|
+
const data = await response.json();
|
|
174
|
+
|
|
175
|
+
// Reasoning models emit a reasoning item first — find the message item
|
|
176
|
+
const item = (data.output || []).find((o) => o.type === 'message');
|
|
177
|
+
const text = item?.content?.[0]?.text || '';
|
|
178
|
+
|
|
179
|
+
return {
|
|
180
|
+
text,
|
|
181
|
+
usage: {
|
|
182
|
+
input: data.usage?.input_tokens || 0,
|
|
183
|
+
output: data.usage?.output_tokens || 0,
|
|
184
|
+
},
|
|
185
|
+
};
|
|
186
|
+
}
|
|
187
|
+
|
|
188
|
+
module.exports = { PROVIDERS, DEFAULT_MODELS, resolveProvider };
|