Enterprise Submodule Setup

Use this skill when making changes to the enterprise submodule (`.source/`) or enterprise packages (`enterprise/packages/*`), or when the enterprise submodule needs to be initialized/updated.

38,786 stars

Best use case

Enterprise Submodule Setup is best used when you need a repeatable AI agent workflow instead of a one-off prompt.

Use this skill when making changes to the enterprise submodule (`.source/`) or enterprise packages (`enterprise/packages/*`), or when the enterprise submodule needs to be initialized/updated.

Teams using Enterprise Submodule Setup should expect a more consistent output, faster repeated execution, less prompt rewriting.

When to use this skill

  • You want a reusable workflow that can be run more than once with consistent structure.

When not to use this skill

  • You only need a quick one-off answer and do not need a reusable workflow.
  • You cannot install or maintain the underlying files, dependencies, or repository context.

Installation

Claude Code / Cursor / Codex

$curl -o ~/.claude/skills/enterprise-submodule/SKILL.md --create-dirs "https://raw.githubusercontent.com/novuhq/novu/main/.cursor/skills/enterprise-submodule/SKILL.md"

Manual Installation

  1. Download SKILL.md from GitHub
  2. Place it in .claude/skills/enterprise-submodule/SKILL.md inside your project
  3. Restart your AI agent — it will auto-discover the skill

How Enterprise Submodule Setup Compares

Feature / AgentEnterprise Submodule SetupStandard Approach
Platform SupportNot specifiedLimited / Varies
Context Awareness High Baseline
Installation ComplexityUnknownN/A

Frequently Asked Questions

What does this skill do?

Use this skill when making changes to the enterprise submodule (`.source/`) or enterprise packages (`enterprise/packages/*`), or when the enterprise submodule needs to be initialized/updated.

Where can I find the source code?

You can find the source code on GitHub using the link provided at the top of the page.

Related Guides

SKILL.md Source

# Enterprise Submodule Setup

Use this skill when making changes to the enterprise submodule (`.source/`) or enterprise packages (`enterprise/packages/*`), or when the enterprise submodule needs to be initialized/updated.

## Overview

Novu uses a git submodule at `.source` pointing to `git@github.com:novuhq/packages-enterprise.git`. The enterprise packages in `enterprise/packages/` have their `src` directories symlinked to `.source/<package>/src`.

## Initial Setup

1. **Configure git for submodule recursion:**
   ```bash
   git config --global submodule.recurse true
   ```

2. **Initialize the submodule:**
   ```bash
   git submodule update --init --recursive
   ```
   If SSH is unavailable (e.g., in cloud environments), configure HTTPS fallback:
   ```bash
   git config --global url."https://github.com/".insteadOf "git@github.com:"
   gh auth setup-git
   ```

3. **Add enterprise env vars** to `apps/api/src/.env` and `apps/worker/src/.env`:
   ```
   NOVU_ENTERPRISE=true
   ```

4. **Install and build with enterprise:**
   ```bash
   pnpm install:with-ee
   pnpm build
   ```
   `install:with-ee` runs `pnpm install` then `pnpm symlink:submodules` which symlinks `src` dirs from `.source/` into `enterprise/packages/`.

## Pulling Changes

1. `git pull` in the main repository (with `submodule.recurse=true`, submodule changes are fetched but NOT merged).
2. For development in the submodule: `cd .source && git checkout <branch> && git pull`

## Making Changes in the Submodule

1. Pull latest from both repos.
2. Create branches in both the main repo and submodule using the same Conventional Commits name (e.g., `feat/scope-description-fixes-NOV-123`). **Start from a branch in the submodule, not a detached HEAD.**
3. Implement changes.
4. Commit in the **submodule first**, then the main repo.
5. Push the submodule branch from inside `.source/`: `git push`
6. Create the enterprise PR from the workspace root (do NOT `cd` into the submodule):
   ```bash
   gh pr create --repo novuhq/packages-enterprise --head <branch-name> --base next --title "..." --body "..."
   ```
   If this fails due to permissions, give the user this link instead:
   ```
   https://github.com/novuhq/packages-enterprise/compare/next...<branch-name>
   ```
7. Push the main repo branch and create its PR with `gh pr create`. Mention the enterprise PR link in the body.
8. **Merge the submodule PR first**, then the main repo PR (to avoid broken builds for teammates).

## Troubleshooting

- `fatal: could not get a repository handle for submodule '.source'`:
  - Delete `.git/modules/` contents
  - Run `git submodule update --init --recursive`

- Untracked working tree files error on checkout:
  - `git submodule deinit -f enterprise`
  - Checkout to branch and pull
  - `git submodule update --init --recursive`

- Nuclear option:
  ```bash
  pnpm run clean
  rm -rf node_modules
  pnpm i
  pnpm run symlink:submodules
  pnpm nx run-many --target=build --all --skip-nx-cache
  ```

## Key Points

- The `.source` directory contains the actual enterprise source code (private repo).
- `enterprise/packages/*/src` are symlinks to `.source/*/src`.
- Enterprise packages: `@novu/ee-auth`, `@novu/ee-api`, `@novu/ee-dal`, `@novu/ee-billing`, `@novu/ee-translation`, `@novu/ee-shared-services`.
- The `check-ee.mjs` script in each enterprise package only builds if the `src` folder exists (graceful degradation for OSS contributors).

Related Skills

run-api-e2e-tests

38786
from novuhq/novu

Run e2e tests for the API service. Use when the user wants to run API E2E tests.

better-auth-best-practices

38786
from novuhq/novu

Skill for integrating Better Auth - the comprehensive TypeScript authentication framework.

react-email

38786
from novuhq/novu

Use when creating HTML email templates with React components - welcome emails, password resets, notifications, order confirmations, newsletters, or transactional emails.

email-best-practices

38786
from novuhq/novu

Use when building email features, emails going to spam, high bounce rates, setting up SPF/DKIM/DMARC authentication, implementing email capture, ensuring compliance (CAN-SPAM, GDPR, CASL), handling webhooks, retry logic, or deciding transactional vs marketing.

odoo-hr-payroll-setup

31392
from sickn33/antigravity-awesome-skills

Expert guide for Odoo HR and Payroll: salary structures, payslip rules, leave policies, employee contracts, and payroll journal entries.

odoo-accounting-setup

31392
from sickn33/antigravity-awesome-skills

Expert guide for configuring Odoo Accounting: chart of accounts, journals, fiscal positions, taxes, payment terms, and bank reconciliation.

observability-monitoring-monitor-setup

31392
from sickn33/antigravity-awesome-skills

You are a monitoring and observability expert specializing in implementing comprehensive monitoring solutions. Set up metrics collection, distributed tracing, log aggregation, and create insightful da

ab-test-setup

31392
from sickn33/antigravity-awesome-skills

Structured guide for setting up A/B tests with mandatory gates for hypothesis, metrics, and execution readiness.

gtm-enterprise-onboarding

28865
from github/awesome-copilot

Four-phase framework for onboarding enterprise customers from contract to value realization. Use when implementing new enterprise customers, preventing churn during onboarding, or solving the adoption cliff that kills deals post-go-live. Includes the Week 4 ghosting pattern.

gtm-enterprise-account-planning

28865
from github/awesome-copilot

Strategic account planning and execution for enterprise deals. Use when planning complex sales cycles, managing multiple stakeholders, applying MEDDICC qualification, tracking deal health, or building mutual action plans. Includes the "stale MAP equals dead deal" pattern.

aws-cdk-python-setup

28865
from github/awesome-copilot

Setup and initialization guide for developing AWS CDK (Cloud Development Kit) applications in Python. This skill enables users to configure environment prerequisites, create new CDK projects, manage dependencies, and deploy to AWS.

roundup-setup

28865
from github/awesome-copilot

Interactive onboarding that learns your communication style, audiences, and data sources to configure personalized status briefings. Paste in examples of updates you already write, answer a few questions, and roundup calibrates itself to your workflow.