commandby alinaqi

/sync-contracts

> Lightweight incremental update of workspace contracts without full re-analysis.

Installs: 0
Used in: 1 repos
Updated: 0mo ago
$npx ai-builder add command alinaqi/sync-contracts

Installs to .claude/commands/sync-contracts.md

# /sync-contracts

> Lightweight incremental update of workspace contracts without full re-analysis.

## Purpose

Fast contract synchronization that:
- Checks only contract source files (not full workspace)
- Updates CONTRACTS.md with changes
- Validates consistency
- Takes ~15 seconds instead of ~2 minutes

## When to Use

| Scenario | Command |
|----------|---------|
| After modifying API endpoints | `/sync-contracts` |
| After changing shared types | `/sync-contracts` |
| Session start shows stale contracts | `/sync-contracts` |
| Post-commit hook (automatic) | `/sync-contracts --lightweight` |
| Before pushing changes | `/sync-contracts --validate` |
| See what changed without updating | `/sync-contracts --diff` |

## Behavior

### Step 1: Load Existing Topology

```
šŸ”„ Loading workspace context...

Workspace: myapp (Monorepo)
Last full analysis: 2026-01-18T10:00:00Z
Last sync: 2026-01-20T14:32:00Z
```

Does NOT re-discover workspace structure - uses existing TOPOLOGY.md.

### Step 2: Check Contract Sources

```
šŸ“‹ Checking contract sources...

Monitored files (from .contract-sources):
  āœ“ apps/api/openapi.json (modified 2h ago)
  āœ“ packages/shared-types/src/index.ts (modified 2h ago)
  ā—‹ packages/db/schema/campaigns.ts (unchanged)
  ā—‹ packages/db/schema/users.ts (unchanged)
  ā—‹ apps/api/app/schemas/campaign.py (unchanged)

Changes detected: 2 files
```

### Step 3: Extract Changes

```
šŸ“ Extracting contract changes...

apps/api/openapi.json:
  + POST /api/campaigns/bulk (new endpoint)
  ~ GET /api/campaigns (added 'status' query param)

packages/shared-types/src/index.ts:
  ~ Campaign interface (added 'tags: string[]' field)
  + CampaignBulkCreate interface (new)
```

### Step 4: Update Artifacts

```
āœļø  Updating workspace artifacts...

Updated: _project_specs/workspace/CONTRACTS.md
  - Added POST /api/campaigns/bulk to endpoints
  - Updated Campaign type definition
  - Added CampaignBulkCreate type

Updated: _project_specs/workspace/CROSS_REPO_INDEX.md
  - Added bulk create capability

Timestamps updated:
  Last sync: 2026-01-20T16:45:00Z
```

### Step 5: Validate Consistency

```
āœ… Validating contract consistency...

Checks:
  āœ“ OpenAPI endpoint count matches routes (48/48)
  āœ“ All Pydantic models have TypeScript equivalents
  āœ“ No orphaned types in shared-types
  āš ļø  Frontend types may need regeneration

Validation: PASSED (1 warning)
```

## Final Output

```
════════════════════════════════════════════════════════════════
  CONTRACT SYNC COMPLETE
════════════════════════════════════════════════════════════════

Sources checked: 5
Changes detected: 2
Files updated: 2

Changes Summary:
  + POST /api/campaigns/bulk (new endpoint)
  ~ Campaign interface (added 'tags' field)
  + CampaignBulkCreate interface (new)

Freshness: 🟢 Fresh
Last sync: 2026-01-20T16:45:00Z

āš ļø  Note: Frontend types may need regeneration
   Run: cd apps/web && npm run generate:types

════════════════════════════════════════════════════════════════
```

## Flags

| Flag | Description |
|------|-------------|
| `--lightweight` | Skip validation, minimal output (for hooks) |
| `--diff` | Show changes without updating files |
| `--validate` | Only validate, don't update |
| `--force` | Update even if no changes detected |
| `--verbose` | Show detailed extraction output |

## Diff Mode

Preview changes without applying:

```bash
/sync-contracts --diff
```

Output:

```
šŸ“‹ Contract Changes (not applied)

apps/api/openapi.json:
  + POST /api/campaigns/bulk
    Request: CampaignBulkCreate[]
    Response: Campaign[]

  ~ GET /api/campaigns
    + query param: status (string, optional)

packages/shared-types/src/index.ts:
  ~ interface Campaign {
      id: string;
      name: string;
  +   tags: string[];        // NEW
      status: CampaignStatus;
    }

  + interface CampaignBulkCreate {
      campaigns: CampaignCreate[];
    }

To apply these changes: /sync-contracts
```

## Validate Mode

Check consistency without updating:

```bash
/sync-contracts --validate
```

Output:

```
šŸ” Contract Validation

Endpoint Consistency:
  āœ“ OpenAPI spec: 48 endpoints
  āœ“ Route files: 48 handlers
  āœ“ Match: YES

Type Consistency:
  āœ“ Pydantic models: 23
  āœ“ TypeScript types: 34
  āœ“ Shared types exported: 34
  āš ļø  2 types only in backend (internal)

Cross-Module References:
  āœ“ Frontend imports valid types: YES
  āœ“ Backend codegen up to date: YES

Overall: āœ… VALID (2 warnings)
```

## Lightweight Mode

For hooks - minimal output, fast execution:

```bash
/sync-contracts --lightweight
```

Output:

```
āœ“ Contracts synced (2 changes)
```

Or if no changes:

```
āœ“ Contracts up to date
```

## Contract Sources File

The sync uses `.contract-sources` to know what to check:

```bash
# _project_specs/workspace/.contract-sources
# Auto-generated by /analyze-workspace
# Edit to add/remove monitored files

# OpenAPI specs
apps/api/openapi.json

# Type definitions
packages/shared-types/src/index.ts
packages/shared-types/src/api.ts
packages/shared-types/src/campaign.ts

# Pydantic schemas (Python)
apps/api/app/schemas/campaign.py
apps/api/app/schemas/user.py
apps/api/app/schemas/auth.py

# Database schema
packages/db/schema/campaigns.ts
packages/db/schema/users.ts
```

To add a new source:

```bash
echo "apps/api/app/schemas/new_model.py" >> _project_specs/workspace/.contract-sources
```

## Error Handling

### No Contract Sources

```
āš ļø  No contract sources configured

Run /analyze-workspace first to set up contract monitoring.
```

### Source File Missing

```
āš ļø  Contract source not found: apps/api/openapi.json

Options:
  1. Generate it: cd apps/api && python -m app.generate_openapi
  2. Remove from monitoring: Edit .contract-sources
  3. Skip this file: /sync-contracts --skip apps/api/openapi.json
```

### Validation Failed

```
āŒ Contract validation failed

Issues found:
  1. OpenAPI has 48 endpoints, routes have 47
     Missing: DELETE /api/campaigns/:id (in spec, not in routes)

  2. Type mismatch: Campaign.status
     OpenAPI: "draft" | "active" | "paused"
     TypeScript: "draft" | "active" | "paused" | "archived"

Fix these issues, then run /sync-contracts again.
Or force update: /sync-contracts --force
```

## Integration with Hooks

### Post-Commit Hook

Automatically runs after commits that touch contract sources:

```bash
# hooks/post-commit
CONTRACT_SOURCES=$(cat _project_specs/workspace/.contract-sources 2>/dev/null)
COMMITTED=$(git diff-tree --no-commit-id --name-only -r HEAD)

for source in $CONTRACT_SOURCES; do
  if echo "$COMMITTED" | grep -q "$source"; then
    echo "šŸ“ Contract source changed, syncing..."
    claude --silent "/sync-contracts --lightweight"
    break
  fi
done
```

### Pre-Push Hook

Validates before push:

```bash
# hooks/pre-push
echo "šŸ” Validating contracts..."
claude --silent "/sync-contracts --validate"

if [ $? -ne 0 ]; then
  echo "āŒ Contract validation failed"
  echo "Run /sync-contracts to fix"
  exit 1
fi
```

## Comparison: sync-contracts vs analyze-workspace

| Aspect | /sync-contracts | /analyze-workspace |
|--------|-----------------|-------------------|
| Time | ~15 seconds | ~2 minutes |
| Scope | Contract files only | Full workspace |
| Discovers new modules | No | Yes |
| Updates TOPOLOGY.md | No | Yes |
| Updates CONTRACTS.md | Yes | Yes |
| Rebuilds dependency graph | No | Yes |
| When to use | Frequent (daily) | Occasional (weekly) |

Quick Install

$npx ai-builder add command alinaqi/sync-contracts

Details

Type
command
Author
alinaqi
Slug
alinaqi/sync-contracts
Created
0mo ago