# @common-stack/common-tools

Common CLI tools for monorepo management. All tools read their configuration from `cdecode-config.json` in your repository root.

## Installation

```bash
yarn add -D @common-stack/common-tools
```

## Available Commands

### generate-resolutions

Generate yarn resolutions for servers to prevent version conflicts in monorepo setups.

```bash
# Process backend servers (default)
npx generate-resolutions

# Process all server categories
npx generate-resolutions --category all

# Preview without writing
npx generate-resolutions --dry-run

# Add additional packages to track
npx generate-resolutions --packages "@aws-sdk/client-dynamodb,lodash"
```

**Configuration in `cdecode-config.json`:**

```json
{
    "updateDependencies": {
        "packagePaths": {
            "backend": ["servers/backend-server/package.json"],
            "frontend": ["servers/frontend-server/package.json"],
            "mobile": ["portable-devices/mobile/package.json"]
        }
    }
}
```

### update-dependencies

Update dependencies from @common-stack packages across your servers.

```bash
# Run full update workflow
npx update-dependencies

# Skip ncu step
npx update-dependencies --skip-ncu

# Custom packages to check
npx update-dependencies --packages "@common-stack/server-stack"
```

**Configuration in `cdecode-config.json`:**

```json
{
    "updateDependencies": {
        "packagesToCheck": ["@common-stack/server-stack", "@common-stack/frontend-stack-react"],
        "packagePaths": {
            "backend": ["servers/backend-server/package.json"],
            "frontend": ["servers/frontend-server/package.json"]
        }
    }
}
```

### sort-package-json

Sort all package.json files in the monorepo for consistent formatting.

```bash
# Sort all package.json files
npx sort-package-json

# Preview changes
npx sort-package-json --dry-run

# Custom directories
npx sort-package-json --directories "packages,servers"
```

**Configuration in `cdecode-config.json`:**

```json
{
    "sortPackageJson": {
        "directories": [".", "packages", "packages-modules", "servers"],
        "skipNodeModules": true
    }
}
```

### update-dependency-version

Update internal monorepo package versions and resolve `link:` references.

```bash
# Update all versions
npx update-dependency-version

# Preview changes
npx update-dependency-version --dry-run

# Show commit command after update
npx update-dependency-version --commit
```

**Configuration in `cdecode-config.json`:**

```json
{
    "updateDependencyVersion": {
        "roots": ["servers", "portable-devices", "packages", "packages-modules"],
        "ignorePattern": "**/node_modules/**",
        "jsonSpacing": 4,
        "addEndNewLine": true,
        "commitMessage": "Updated packages to use correct versions"
    }
}
```

## Using the Main CLI

You can also use all commands through the main `common-tools` CLI:

```bash
npx common-tools generate-resolutions --help
npx common-tools update-dependencies --help
npx common-tools sort-package-json --help
npx common-tools update-dependency-version --help
```

## Adding to package.json Scripts

```json
{
    "scripts": {
        "generate-resolutions": "generate-resolutions",
        "generate-resolutions:all": "generate-resolutions --category all",
        "generate-resolutions:dry": "generate-resolutions --dry-run",
        "update-deps": "update-dependencies",
        "sort-packages": "sort-package-json",
        "update-versions": "update-dependency-version"
    }
}
```

## Programmatic Usage

```typescript
import {
    generateResolutionsFromCDecodeConfig,
    loadConfigWithDefaults,
    updateDependencyVersions,
    sortPackageJsonFile,
} from '@common-stack/common-tools';

// Load config from cdecode-config.json
const { config, repoRoot } = loadConfigWithDefaults();

// Generate resolutions
const results = generateResolutionsFromCDecodeConfig(repoRoot, {
    category: 'backend',
    dryRun: false,
});

// Update versions
const modifiedFiles = await updateDependencyVersions(repoRoot, {
    dryRun: false,
    config: config.updateDependencyVersion,
});

// Sort a single package.json
await sortPackageJsonFile('/path/to/package.json');
```

## License

UNLICENSED - CDMBase LLC
