@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,213 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Company-workspace scaffolding — the file plan `omega company init` writes.
|
|
3
|
+
*
|
|
4
|
+
* The COMPANY rung's counterpart to lib/scaffold.js (brands): a company
|
|
5
|
+
* workspace is a REPO, not a machine cache — the config layer every brand
|
|
6
|
+
* inherits, the `.env` that sits UNDER every brand's own, and the shared
|
|
7
|
+
* Apple signing tree — so init is one plan of files in one directory, written
|
|
8
|
+
* with the same fill-missing semantics (existing files are never touched).
|
|
9
|
+
*
|
|
10
|
+
* What the repo TRACKS is the config skeleton, the README, and the
|
|
11
|
+
* .gitignore. Everything the workspace holds that is unshareable stays out of
|
|
12
|
+
* git: `.env` (secrets), `.omega/` (the signing tree's `.p8`/`.p12`/CSR
|
|
13
|
+
* private keys, run output, logs), and `brands/` (each managed brand is its
|
|
14
|
+
* OWN repo — never an embedded one).
|
|
15
|
+
*/
|
|
16
|
+
|
|
17
|
+
const path = require('node:path');
|
|
18
|
+
|
|
19
|
+
// The .env template is a canonical render with NO values — one SSOT
|
|
20
|
+
// (lib/env-order.js) shared with the brand scaffold stub and every
|
|
21
|
+
// writeEnvValue writeback, so a company .env and a brand .env look alike.
|
|
22
|
+
const { renderCanonicalEnv } = require('./env-order.js');
|
|
23
|
+
|
|
24
|
+
// The ONE environment vocabulary — the same three overlays the brand scaffold
|
|
25
|
+
// plans beside its own .env (#586)
|
|
26
|
+
const { ENV_ENVIRONMENTS } = require('../vendor/config/index.js');
|
|
27
|
+
|
|
28
|
+
// Directories init guarantees. The signing tree is the certificates service's
|
|
29
|
+
// layout under {signingRoot}/.omega/certificates/apple/ — created empty so
|
|
30
|
+
// the operator has an obvious home for the App Store Connect `AuthKey_*.p8`
|
|
31
|
+
// before any run; `brands/` is the default `brands.roots` entry (a missing
|
|
32
|
+
// one is a company-config error on the next manage).
|
|
33
|
+
const COMPANY_DIRS = [
|
|
34
|
+
'brands',
|
|
35
|
+
'.omega/certificates/apple/certificates',
|
|
36
|
+
'.omega/certificates/apple/csr',
|
|
37
|
+
'.omega/certificates/apple/profiles',
|
|
38
|
+
];
|
|
39
|
+
|
|
40
|
+
/**
|
|
41
|
+
* The company-level config/omega.json5: the `brands` key (which is what MAKES
|
|
42
|
+
* a directory a company root) plus commented, brand-agnostic placeholders for
|
|
43
|
+
* the layers a company usually owns. Every key here is a DEFAULT its brands
|
|
44
|
+
* inherit and can override.
|
|
45
|
+
*/
|
|
46
|
+
function renderCompanyConfig(name) {
|
|
47
|
+
return [
|
|
48
|
+
`// ${name} — company-level omega.json5: the config layer EVERY managed brand`,
|
|
49
|
+
'// inherits (manager DEFAULTS ← this file ← the brand ← the brand\'s targets), so a key',
|
|
50
|
+
'// set here is a default any brand can override in its own config/omega.json5.',
|
|
51
|
+
'// Secrets NEVER live here — they go in the gitignored .env beside this file.',
|
|
52
|
+
'{',
|
|
53
|
+
' // Where the brands are, RELATIVE to this root (absolute paths are an error).',
|
|
54
|
+
' // Keep them inside the workspace with \'./brands\', or point at the org folder',
|
|
55
|
+
' // with [\'..\'] to treat this workspace\'s SIBLING directories as the brands.',
|
|
56
|
+
' brands: {',
|
|
57
|
+
' roots: ["./brands"],',
|
|
58
|
+
' },',
|
|
59
|
+
'',
|
|
60
|
+
' // Company identity — a brand without its own value inherits these.',
|
|
61
|
+
' // brand: {',
|
|
62
|
+
' // name: "My Company",',
|
|
63
|
+
' // url: "https://mycompany.com",',
|
|
64
|
+
' // contact: { email: "support@mycompany.com" },',
|
|
65
|
+
' // },',
|
|
66
|
+
'',
|
|
67
|
+
' // Managed Firebase Auth accounts every brand should carry (account service).',
|
|
68
|
+
' // Passwords never live here — see the brand scaffold\'s notes on the seed.',
|
|
69
|
+
' // account: {',
|
|
70
|
+
' // admins: [',
|
|
71
|
+
' // { email: "you@mycompany.com", account: true, marketing: false },',
|
|
72
|
+
' // ],',
|
|
73
|
+
' // },',
|
|
74
|
+
'',
|
|
75
|
+
' // The company GA account: a brand\'s analytics setup defaults to it instead',
|
|
76
|
+
' // of prompting for one (a brand-level accountId always wins).',
|
|
77
|
+
' // analytics: {',
|
|
78
|
+
' // providers: { google: { accountId: "123456789" } },',
|
|
79
|
+
' // },',
|
|
80
|
+
'',
|
|
81
|
+
' // Error monitoring: the Sentry org every brand\'s projects live under.',
|
|
82
|
+
' // monitoring: {',
|
|
83
|
+
' // providers: { sentry: { org: "my-company" } },',
|
|
84
|
+
' // },',
|
|
85
|
+
'',
|
|
86
|
+
' // Apple signing: ONE Apple account signs everything the company ships, so',
|
|
87
|
+
' // the reverse-DNS prefix (and the signing tree below) belongs here.',
|
|
88
|
+
' // certificates: {',
|
|
89
|
+
' // providers: { apple: { bundleIdPrefix: "com.mycompany" } },',
|
|
90
|
+
' // },',
|
|
91
|
+
'}',
|
|
92
|
+
'',
|
|
93
|
+
].join('\n');
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
/**
|
|
97
|
+
* The company `.env` template — every canonical group, every key commented
|
|
98
|
+
* out. Nothing is generated: the company file holds only what EVERY brand
|
|
99
|
+
* shares (the Apple signing account, a company-wide token), and a brand's own
|
|
100
|
+
* `.env` wins over it.
|
|
101
|
+
*/
|
|
102
|
+
function renderCompanyEnvStub(name) {
|
|
103
|
+
return renderCanonicalEnv({
|
|
104
|
+
header: [
|
|
105
|
+
`# ${name} — COMPANY secrets (gitignored; loaded UNDER every managed brand's own .env).`,
|
|
106
|
+
'# Precedence: shell env > brand .env > this file. Put here only what every brand',
|
|
107
|
+
'# shares — anything brand-specific belongs in that brand\'s .env, never here.',
|
|
108
|
+
],
|
|
109
|
+
});
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
/**
|
|
113
|
+
* A company environment-overlay stub — a header comment and NOTHING else, the
|
|
114
|
+
* same shape the BRAND scaffold plans
|
|
115
|
+
* ([#586](https://github.com/Omega-JS-Stack/omega/issues/586)). The company
|
|
116
|
+
* layer is a layer like any other: its `.env` is the one file that documents
|
|
117
|
+
* the keys, and an overlay holds only the handful that differ for one
|
|
118
|
+
* environment (a sandbox Apple account, a staging token).
|
|
119
|
+
*
|
|
120
|
+
* @param {string} environment - `development` | `testing` | `production`.
|
|
121
|
+
* @returns {string} The file contents.
|
|
122
|
+
*/
|
|
123
|
+
function renderCompanyEnvOverlayStub(environment) {
|
|
124
|
+
return [
|
|
125
|
+
`# .env.${environment} — overlays .env when a managed brand runs in ${environment} (gitignored).`,
|
|
126
|
+
'# Only the keys that differ — anything not set here falls through to .env.',
|
|
127
|
+
'',
|
|
128
|
+
].join('\n');
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
/**
|
|
132
|
+
* The company repo's .gitignore. The `.omega/` and `logs/` entries match the
|
|
133
|
+
* shared healer's (lib/gitignore.js) exactly, so a company root scaffolded
|
|
134
|
+
* here is already 'present' when a company run checks.
|
|
135
|
+
*/
|
|
136
|
+
function renderCompanyGitignore() {
|
|
137
|
+
return [
|
|
138
|
+
'# Dependencies',
|
|
139
|
+
'node_modules/',
|
|
140
|
+
'',
|
|
141
|
+
'# Omega manager state (durable IDs + per-run output) — and the SHARED SIGNING',
|
|
142
|
+
'# TREE: .omega/certificates/apple/ holds Apple private key material (.p8, .p12,',
|
|
143
|
+
'# CSR keys). It never goes in git — move it between machines out of band.',
|
|
144
|
+
'.omega/',
|
|
145
|
+
'',
|
|
146
|
+
'# Run logs (truncated on every launch — never committed)',
|
|
147
|
+
'logs/',
|
|
148
|
+
'',
|
|
149
|
+
'# Secrets — the shared .env and its per-environment overlays',
|
|
150
|
+
'.env',
|
|
151
|
+
'.env.*',
|
|
152
|
+
'',
|
|
153
|
+
'# Managed brands — each one is its OWN git repo, never embedded in this one',
|
|
154
|
+
'brands/',
|
|
155
|
+
'',
|
|
156
|
+
'# OS',
|
|
157
|
+
'.DS_Store',
|
|
158
|
+
'',
|
|
159
|
+
].join('\n');
|
|
160
|
+
}
|
|
161
|
+
|
|
162
|
+
function renderCompanyReadme(name) {
|
|
163
|
+
return `# ${name}
|
|
164
|
+
|
|
165
|
+
The OMEGA **company workspace** — the layer every brand this company ships
|
|
166
|
+
inherits. It is a repo, not a machine cache: config, shared secrets, and the
|
|
167
|
+
shared Apple signing tree live here, and each brand stays its own repo.
|
|
168
|
+
|
|
169
|
+
## What's here
|
|
170
|
+
|
|
171
|
+
- \`config/omega.json5\` — the company config layer (\`brands.roots\` says where the
|
|
172
|
+
brands are; every other key is a default a brand can override).
|
|
173
|
+
- \`.env\` — company secrets, loaded UNDER each brand's own \`.env\`
|
|
174
|
+
(shell > brand \`.env\` > this file). Gitignored.
|
|
175
|
+
- \`.env.<environment>\` — the per-environment overlay (\`development\`, \`testing\`,
|
|
176
|
+
\`production\`): only the keys that differ there.
|
|
177
|
+
- \`.omega/certificates/apple/\` — the shared Apple signing tree: one Apple
|
|
178
|
+
account signs everything the company ships. Gitignored; drop the App Store
|
|
179
|
+
Connect \`AuthKey_*.p8\` here.
|
|
180
|
+
- \`brands/\` — the managed brands (each its own git repo; gitignored here).
|
|
181
|
+
|
|
182
|
+
## Verbs
|
|
183
|
+
|
|
184
|
+
\`\`\`bash
|
|
185
|
+
npx omega company adopt <brand-path> # stamp an existing brand: it inherits this company
|
|
186
|
+
npx omega onboard # create a NEW brand under brands/ (stamped for you)
|
|
187
|
+
npx omega manage # the full manage walk, once per managed brand
|
|
188
|
+
npx omega manage --brand=<id> # ... just one brand
|
|
189
|
+
npx omega manage --parallel # ... every brand concurrently
|
|
190
|
+
\`\`\`
|
|
191
|
+
`;
|
|
192
|
+
}
|
|
193
|
+
|
|
194
|
+
/**
|
|
195
|
+
* Build the scaffold plan for a company workspace.
|
|
196
|
+
*
|
|
197
|
+
* @param {string} name - Display name for the generated headers (the dir name)
|
|
198
|
+
* @returns {Array<{ path: string, contents: string }>} - Company-root-relative file plan
|
|
199
|
+
*/
|
|
200
|
+
function buildCompanyScaffoldPlan(name) {
|
|
201
|
+
return [
|
|
202
|
+
{ path: path.join('config', 'omega.json5'), contents: renderCompanyConfig(name) },
|
|
203
|
+
{ path: '.gitignore', contents: renderCompanyGitignore() },
|
|
204
|
+
{ path: '.env', contents: renderCompanyEnvStub(name) },
|
|
205
|
+
...ENV_ENVIRONMENTS.map((environment) => ({ path: `.env.${environment}`, contents: renderCompanyEnvOverlayStub(environment) })),
|
|
206
|
+
{ path: 'README.md', contents: renderCompanyReadme(name) },
|
|
207
|
+
// Self-protecting: signing material can never be committed even if the
|
|
208
|
+
// root .gitignore is edited or the tree is copied into another repo.
|
|
209
|
+
{ path: path.join('.omega', 'certificates', 'apple', '.gitignore'), contents: '*\n!.gitignore\n' },
|
|
210
|
+
];
|
|
211
|
+
}
|
|
212
|
+
|
|
213
|
+
module.exports = { COMPANY_DIRS, buildCompanyScaffoldPlan };
|
|
@@ -0,0 +1,227 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Company-workspace helpers — the COMPANY → BRAND rung of the hierarchy
|
|
3
|
+
* (Task M3 design, settled 2026-07-07).
|
|
4
|
+
*
|
|
5
|
+
* A company root is a directory whose config/omega.json5 has a `brands` key:
|
|
6
|
+
*
|
|
7
|
+
* brands: { roots: ['./brands'] } // dirs to scan, RELATIVE to the
|
|
8
|
+
* // company root (never absolute)
|
|
9
|
+
*
|
|
10
|
+
* Anything under a root with its own config/omega.json5 is a brand. A brand
|
|
11
|
+
* behaves IDENTICALLY everywhere (standalone / nested / loose sibling) — the
|
|
12
|
+
* company layer only changes what defaults it inherits:
|
|
13
|
+
*
|
|
14
|
+
* manager DEFAULTS ← company omega.json5 ← brand ← local … (config)
|
|
15
|
+
* company .env ← brand .env ← shell env (secrets)
|
|
16
|
+
*
|
|
17
|
+
* The reverse link without nesting: company runs idempotently stamp
|
|
18
|
+
* `.omega/company.json` ({ root }) into each managed brand; brand-local runs
|
|
19
|
+
* read the stamp and layer the company config + .env, warn when it's stale,
|
|
20
|
+
* and run standalone when it's absent.
|
|
21
|
+
*/
|
|
22
|
+
|
|
23
|
+
const fs = require('node:fs');
|
|
24
|
+
const path = require('node:path');
|
|
25
|
+
const JSON5 = require('json5');
|
|
26
|
+
const jetpack = require('fs-jetpack');
|
|
27
|
+
|
|
28
|
+
const { resolveConfigPath, hasOmegaConfig, findSecretKeys, readCompanyRoot, COMPANY_MARKER } = require('../vendor/config/index.js');
|
|
29
|
+
const { resolveBrandRoot } = require('./brand.js');
|
|
30
|
+
const { stripLeadingVerb } = require('./argv.js');
|
|
31
|
+
|
|
32
|
+
const DEFAULT_BRAND_ROOTS = ['./brands'];
|
|
33
|
+
|
|
34
|
+
/**
|
|
35
|
+
* Raw config/omega.json5 read — no merge, no validation, null when the file
|
|
36
|
+
* is missing or unparseable (discovery must never throw on a broken brand;
|
|
37
|
+
* the brand's own workspace service reports it).
|
|
38
|
+
*/
|
|
39
|
+
function readRawConfig(dir) {
|
|
40
|
+
const configPath = resolveConfigPath(dir);
|
|
41
|
+
if (!configPath) return null;
|
|
42
|
+
|
|
43
|
+
try {
|
|
44
|
+
return JSON5.parse(fs.readFileSync(configPath, 'utf8'));
|
|
45
|
+
} catch {
|
|
46
|
+
return null;
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
/**
|
|
51
|
+
* Is this directory a company root (config with a `brands` key)?
|
|
52
|
+
*/
|
|
53
|
+
function isCompanyRoot(dir) {
|
|
54
|
+
return !!readRawConfig(dir)?.brands;
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
/**
|
|
58
|
+
* Resolve what kind of root contains startDir: the nearest omega.json5 root
|
|
59
|
+
* (brand walk-up rules), classified as company or brand.
|
|
60
|
+
*
|
|
61
|
+
* @returns {{ root: string, isCompany: boolean }|null}
|
|
62
|
+
*/
|
|
63
|
+
function resolveManageRoot(startDir) {
|
|
64
|
+
const root = resolveBrandRoot(startDir);
|
|
65
|
+
if (!root) return null;
|
|
66
|
+
|
|
67
|
+
return { root, isCompany: isCompanyRoot(root) };
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
/**
|
|
71
|
+
* Discover the brands a company manages: for each entry in brands.roots
|
|
72
|
+
* (relative to the company root), every immediate child directory with a
|
|
73
|
+
* config/omega.json5 is a brand. The company root itself and nested company
|
|
74
|
+
* configs are skipped (one rung: company → brands).
|
|
75
|
+
*
|
|
76
|
+
* Throws on config mistakes (absolute or missing roots); broken brand
|
|
77
|
+
* configs do NOT throw — the brand is listed and its own run reports them.
|
|
78
|
+
*
|
|
79
|
+
* @param {string} companyRoot - Absolute company root
|
|
80
|
+
* @returns {{ brands: Array<{ id, name, dirName, root, enabled }>, skipped: Array<{ dir, reason }> }}
|
|
81
|
+
*/
|
|
82
|
+
function discoverBrands(companyRoot) {
|
|
83
|
+
const raw = readRawConfig(companyRoot) || {};
|
|
84
|
+
const roots = raw.brands?.roots || DEFAULT_BRAND_ROOTS;
|
|
85
|
+
|
|
86
|
+
if (!Array.isArray(roots) || roots.length === 0) {
|
|
87
|
+
throw new Error('brands.roots must be a non-empty array of directories relative to the company root');
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
const companyReal = fs.realpathSync(companyRoot);
|
|
91
|
+
const seen = new Set();
|
|
92
|
+
const brands = [];
|
|
93
|
+
const skipped = [];
|
|
94
|
+
|
|
95
|
+
for (const rootSpec of roots) {
|
|
96
|
+
if (path.isAbsolute(rootSpec)) {
|
|
97
|
+
throw new Error(`brands.roots entries must be RELATIVE to the company root — got absolute path: ${rootSpec}`);
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
const scanDir = path.resolve(companyRoot, rootSpec);
|
|
101
|
+
if (!fs.existsSync(scanDir)) {
|
|
102
|
+
throw new Error(`brands root not found: ${rootSpec} (${scanDir})`);
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
for (const entry of fs.readdirSync(scanDir, { withFileTypes: true })) {
|
|
106
|
+
if (!entry.isDirectory() || entry.name.startsWith('.') || entry.name === 'node_modules') continue;
|
|
107
|
+
|
|
108
|
+
const brandDir = path.join(scanDir, entry.name);
|
|
109
|
+
const real = fs.realpathSync(brandDir);
|
|
110
|
+
if (real === companyReal || seen.has(real)) continue;
|
|
111
|
+
|
|
112
|
+
if (!hasOmegaConfig(brandDir)) continue;
|
|
113
|
+
seen.add(real);
|
|
114
|
+
|
|
115
|
+
const brandRaw = readRawConfig(brandDir);
|
|
116
|
+
if (brandRaw?.brands) {
|
|
117
|
+
skipped.push({ dir: brandDir, reason: 'nested company workspace (one rung: company → brands)' });
|
|
118
|
+
continue;
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
brands.push({
|
|
122
|
+
id: brandRaw?.brand?.id || entry.name,
|
|
123
|
+
name: brandRaw?.brand?.name || brandRaw?.brand?.id || entry.name,
|
|
124
|
+
dirName: entry.name,
|
|
125
|
+
root: brandDir,
|
|
126
|
+
enabled: brandRaw?.enabled !== false,
|
|
127
|
+
});
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
brands.sort((a, b) => a.id.localeCompare(b.id));
|
|
132
|
+
return { brands, skipped };
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
/**
|
|
136
|
+
* The company config layer a brand inherits: the raw company omega.json5
|
|
137
|
+
* minus the `brands` key (company plumbing, meaningless inside a brand).
|
|
138
|
+
* Hard-fails on secret-shaped keys — same rule as every omega.json5.
|
|
139
|
+
*/
|
|
140
|
+
function loadCompanyConfig(companyRoot) {
|
|
141
|
+
const raw = readRawConfig(companyRoot);
|
|
142
|
+
if (!raw) return {};
|
|
143
|
+
|
|
144
|
+
const secretKeys = findSecretKeys(raw);
|
|
145
|
+
if (secretKeys.length > 0) {
|
|
146
|
+
throw new Error(
|
|
147
|
+
`Secret-shaped keys in company config ${companyRoot}: ${secretKeys.join(', ')} — `
|
|
148
|
+
+ `secrets live in the company .env, never in omega.json5`,
|
|
149
|
+
);
|
|
150
|
+
}
|
|
151
|
+
|
|
152
|
+
const { brands, ...inheritable } = raw;
|
|
153
|
+
return inheritable;
|
|
154
|
+
}
|
|
155
|
+
|
|
156
|
+
/**
|
|
157
|
+
* Idempotently stamp `.omega/company.json` into a brand so its local runs
|
|
158
|
+
* layer this company's defaults.
|
|
159
|
+
*
|
|
160
|
+
* @returns {boolean} - true when the marker was (re)written
|
|
161
|
+
*/
|
|
162
|
+
function stampCompanyMarker(brandRoot, companyRoot) {
|
|
163
|
+
const markerPath = path.join(brandRoot, COMPANY_MARKER);
|
|
164
|
+
const existing = jetpack.read(markerPath, 'json');
|
|
165
|
+
|
|
166
|
+
if (existing?.root === companyRoot) {
|
|
167
|
+
return false;
|
|
168
|
+
}
|
|
169
|
+
|
|
170
|
+
jetpack.write(markerPath, { root: companyRoot }, { jsonIndent: 2 });
|
|
171
|
+
return true;
|
|
172
|
+
}
|
|
173
|
+
|
|
174
|
+
/**
|
|
175
|
+
* Read a brand's company marker. null when absent (standalone brand);
|
|
176
|
+
* `stale: true` when the marker points at something that is no longer a
|
|
177
|
+
* company workspace.
|
|
178
|
+
*
|
|
179
|
+
* @returns {{ companyRoot: string, stale: boolean }|null}
|
|
180
|
+
*/
|
|
181
|
+
function readCompanyMarker(brandRoot) {
|
|
182
|
+
const root = readCompanyRoot(brandRoot);
|
|
183
|
+
if (!root) return null;
|
|
184
|
+
|
|
185
|
+
return { companyRoot: root, stale: !isCompanyRoot(root) };
|
|
186
|
+
}
|
|
187
|
+
|
|
188
|
+
/**
|
|
189
|
+
* Strip the leading verb (#229 — each child spawn names `manage` itself) and
|
|
190
|
+
* the company-only flags from a raw argv, so the remainder forwards to
|
|
191
|
+
* per-brand child processes verbatim (--brand/--concurrency take values in
|
|
192
|
+
* both --flag=x and --flag x forms; --parallel is boolean).
|
|
193
|
+
*/
|
|
194
|
+
function filterChildArgs(rawArgv) {
|
|
195
|
+
const argv = stripLeadingVerb(rawArgv);
|
|
196
|
+
const VALUE_FLAGS = new Set(['--brand', '--concurrency']);
|
|
197
|
+
const BOOLEAN_FLAGS = new Set(['--parallel']);
|
|
198
|
+
const out = [];
|
|
199
|
+
|
|
200
|
+
for (let i = 0; i < argv.length; i++) {
|
|
201
|
+
const name = argv[i].split('=')[0];
|
|
202
|
+
|
|
203
|
+
if (BOOLEAN_FLAGS.has(name)) continue;
|
|
204
|
+
if (VALUE_FLAGS.has(name)) {
|
|
205
|
+
if (!argv[i].includes('=') && argv[i + 1] !== undefined && !argv[i + 1].startsWith('-')) {
|
|
206
|
+
i++;
|
|
207
|
+
}
|
|
208
|
+
continue;
|
|
209
|
+
}
|
|
210
|
+
|
|
211
|
+
out.push(argv[i]);
|
|
212
|
+
}
|
|
213
|
+
|
|
214
|
+
return out;
|
|
215
|
+
}
|
|
216
|
+
|
|
217
|
+
module.exports = {
|
|
218
|
+
DEFAULT_BRAND_ROOTS,
|
|
219
|
+
readRawConfig,
|
|
220
|
+
isCompanyRoot,
|
|
221
|
+
resolveManageRoot,
|
|
222
|
+
discoverBrands,
|
|
223
|
+
loadCompanyConfig,
|
|
224
|
+
stampCompanyMarker,
|
|
225
|
+
readCompanyMarker,
|
|
226
|
+
filterChildArgs,
|
|
227
|
+
};
|