Copilotadvanced

How to Work with Large Monorepos in GitHub Copilot CLI

Configure GitHub Copilot CLI for efficient work in large monorepos. Learn to scope context, manage workspace boundaries, and optimize performance for repositories with millions of lines of code.

8 min readUpdated January 2025

Want us to handle this for you?

Get expert help →

Working with monorepos presents unique challenges for AI coding assistants. When a repository contains millions of lines of code across dozens of packages, effective context management becomes essential. This guide covers strategies for configuring GitHub Copilot CLI to work efficiently in large monorepo environments.

Challenges of AI Tools in Monorepos

Large monorepos create several obstacles for AI assistants:

ChallengeImpactSolution
Context overflowToken limits hit before relevant code is analyzedScope working directory, use .copilotignore
Slow indexingMinutes of delay before first responseExclude build artifacts and node_modules
Irrelevant suggestionsCode from wrong packages pollutes responsesExplicit package scoping
Cross-package confusionSimilar patterns across packages cause mix-upsReference files explicitly
Memory pressureLarge repos exhaust local resourcesWorkspace boundaries

Understanding these challenges helps you apply the right optimizations for your specific monorepo structure.

Creating Effective .copilotignore Files

The .copilotignore file uses gitignore syntax to exclude directories and files from Copilot's analysis. Place it at your repository root or within specific packages.

Basic .copilotignore Structure

# Build outputs and caches
**/dist/
**/build/
**/.next/
**/node_modules/
**/.turbo/
**/.nx/

# Generated files
**/generated/
**/*.generated.ts
**/graphql.ts
**/prisma/client/

# Test fixtures and snapshots
**/__snapshots__/
**/fixtures/large-files/

# Documentation that rarely changes
docs/
**/CHANGELOG.md

# Packages you're not actively working on
packages/legacy-app/
packages/deprecated-*/
apps/internal-tools/

Package-Specific Ignores

For focused work within a specific package, create a local .copilotignore:

# In packages/web-app/.copilotignore
# Exclude sibling packages when working here
../api-server/
../mobile-app/
../shared-legacy/

# Keep shared utilities accessible
!../shared-utils/
!../ui-components/

Dynamic Scoping with Shell Aliases

Create shell aliases for common work patterns:

# Add to ~/.bashrc or ~/.zshrc
alias copilot-frontend='cd packages/web-app && copilot'
alias copilot-backend='cd packages/api-server && copilot'
alias copilot-shared='cd packages/shared && copilot'

Scoping Sessions to Specific Packages

Starting Copilot in Package Context

Always start Copilot from within the package you're actively developing:

# Instead of starting from monorepo root
cd ~/projects/my-monorepo
copilot  # Has access to everything - often too much

# Start from specific package
cd ~/projects/my-monorepo/packages/web-app
copilot  # Focused context, faster responses

Using Directory Commands

Control Copilot's file access during your session:

copilot

# Check current accessible directories
> /list-dirs

# Add a shared package when needed
> /add-dir ../shared-utils

# The Explore agent now searches both locations
> How does the formatCurrency utility work?

Workspace Configuration Files

Create a .copilot/config.yaml in frequently-used packages:

# packages/web-app/.copilot/config.yaml
directories:
  include:
    - .
    - ../shared-utils
    - ../ui-components
  exclude:
    - node_modules
    - .next
    - coverage

context:
  max_files: 50
  prefer_recent: true

Managing Context in Large Codebases

Explicit File References

When discussing cross-package code, be explicit about file locations:

# Vague - may pull wrong file from different package
> Update the auth middleware

# Explicit - unambiguous reference
> Update packages/api-server/src/middleware/auth.ts to add rate limiting

Using the Compact Command

Monitor and manage context during long sessions:

# Check current context usage
> /context

# Output:
# Context: 45,231 / 200,000 tokens (22.6%)
# Files loaded: 23
# Conversation turns: 15

# When context grows large, compact it
> /compact

# Copilot summarizes the conversation, freeing tokens

Strategic Context Clearing

For major task switches within a monorepo:

# Finishing frontend work, switching to backend
> /clear

# Now change directory and restart with fresh context
# In terminal: cd ../api-server

> /add-dir .
> Let's work on the new user endpoints

Using the Explore Agent for Monorepo Navigation

The Explore agent excels at navigating large codebases without consuming your main conversation context.

Finding Code Across Packages

# Find where a shared type is used
> Where is the UserProfile type imported and used across all packages?

# Trace data flow through the monorepo
> How does user authentication flow from the web-app through the api-server?

# Discover package dependencies
> Which packages import from @mycompany/shared-utils?

Architecture Discovery

# Understand monorepo structure
> Give me an overview of how this monorepo is organized

# Find patterns
> What patterns are used for API error handling across packages?

# Identify shared code opportunities
> Are there duplicate implementations of date formatting across packages?

Code Archaeology

# Understand historical decisions
> Why does packages/legacy-app use a different auth pattern than packages/web-app?

# Find migration candidates
> Which packages still use the deprecated @mycompany/old-utils?

Cross-Package Operations

Making Changes Across Multiple Packages

When changes span packages, break them into focused steps:

# Step 1: Update the shared type
> In packages/shared/types/user.ts, add an optional "preferences" field to UserProfile

# Step 2: Update consumers one at a time
> Now update packages/web-app/src/hooks/useUser.ts to handle the new preferences field

# Step 3: Update API
> Update packages/api-server/src/routes/user.ts to return preferences in the response

Coordinating Shared Library Updates

# Understand impact before changing shared code
> If I change the signature of formatCurrency in shared-utils, which files need updates?

# Get a migration plan
> Plan the steps to add a new "locale" parameter to formatCurrency across all consumers

Performance Optimization Tips

1. Exclude Heavy Directories

Build outputs and dependencies are the biggest performance drains:

# Essential excludes for JavaScript/TypeScript monorepos
**/node_modules/
**/.pnpm-store/
**/dist/
**/build/
**/.turbo/
**/.nx/cache/

# Test coverage and reports
**/coverage/
**/.nyc_output/

# IDE and editor files
**/.idea/
**/.vscode/settings.json

2. Use Turborepo/Nx Integration

If your monorepo uses Turborepo or Nx, leverage their package graph:

# Start Copilot in context of a specific package and its dependencies
cd packages/web-app
turbo run build --filter=web-app...  # Build deps first
copilot  # Now context is warmer

3. Warm the Cache

Before intensive Copilot sessions, trigger indexing:

# Ask a broad question to warm up file discovery
> What are the main entry points in this package?

# Then proceed with specific work
> Now let's refactor the authentication flow

4. Session Management

Use session resume for ongoing work:

# End a session
> /exit

# Later, resume with context intact
copilot --resume
# Tab to select previous monorepo session

Workspace and Multi-Root Configurations

VS Code Workspace Files

If you use VS Code workspaces, Copilot CLI respects them:

// my-monorepo.code-workspace
{
  "folders": [
    { "path": "packages/web-app", "name": "Frontend" },
    { "path": "packages/api-server", "name": "Backend" },
    { "path": "packages/shared", "name": "Shared" }
  ],
  "settings": {
    "copilot.ignoredDirectories": [
      "**/node_modules",
      "**/dist"
    ]
  }
}

Team-Wide Configuration

Share monorepo configuration via .github/copilot/:

# .github/copilot/monorepo.yaml
packages:
  web-app:
    include_deps: [shared-utils, ui-components]
    exclude: [e2e-tests, storybook]
  api-server:
    include_deps: [shared-utils, database]
    exclude: [migration-scripts]

Best Practices for Monorepo Workflows

1. Establish Clear Package Boundaries

Document which packages Copilot should consider together:

<!-- packages/web-app/README.md -->
## Copilot Context
When working in this package, include:
- `../shared-utils` - Common utilities
- `../ui-components` - Design system
Do not include:
- `../api-server` - Backend code
- `../mobile-app` - Different platform

2. Use Consistent Naming

Help Copilot disambiguate across packages:

// Good: Package-prefixed exports
export { WebAppAuthProvider } from './auth';
export { ApiServerAuthMiddleware } from './auth';

// Problematic: Generic names across packages
export { AuthProvider } from './auth';  // Which package?

3. Create Package-Specific Agents

Define custom agents for common monorepo patterns:

# .github/agents/monorepo-migrator.agent.md
---
name: monorepo-migrator
description: Helps migrate code between packages in our monorepo
tools: ['read_file', 'write_file', 'run_terminal_cmd']
---

You help migrate code between packages in our Turborepo monorepo.
When moving code:
1. Update imports in the source package
2. Add exports in the destination package
3. Update package.json dependencies
4. Run `turbo build --filter=affected...` to verify

4. Document Cross-Package Dependencies

Maintain a dependency map that Copilot can reference:

// packages/shared/DEPENDENCIES.md
/**
 * Package Dependency Map
 *
 * web-app depends on:
 *   - shared-utils (utilities)
 *   - ui-components (React components)
 *
 * api-server depends on:
 *   - shared-utils (utilities)
 *   - database (Prisma client)
 */

Troubleshooting

Copilot Suggests Code from Wrong Package

Symptoms: Getting React code when working on Node.js backend.

Solution:

  1. Start Copilot from the correct package directory
  2. Add explicit directory restrictions
  3. Reference files with full paths

Extremely Slow Initial Response

Symptoms: 30+ seconds before first response.

Solution:

  1. Check .copilotignore excludes node_modules and build outputs
  2. Start from package directory, not monorepo root
  3. Use /compact if resuming a long session

Context Limit Reached Quickly

Symptoms: Auto-compaction triggers frequently.

Solution:

  1. Work in smaller, focused sessions
  2. Use /clear when switching packages
  3. Expand .copilotignore to exclude more directories

Next Steps

Frequently Asked Questions

Find answers to common questions

Yes, but large monorepos require configuration to work efficiently. Use .copilotignore to exclude irrelevant packages, scope your working directory to specific packages, and leverage the Explore agent for targeted analysis.

Need Professional IT & Security Help?

Our team of experts is ready to help protect and optimize your technology infrastructure.