/pm2
Analyze a project and generate PM2 service commands for detected frontend, backend, or database services.
> /plugin marketplace add affaan-m/ECC > /plugin install ecc@ecc
How it fires
How this command gets triggered: by you, by Claude, or both.
- Fires itselfClaude auto-loads it when your prompt matches the work.
- You can call itInvoke it directly when you want it.
- Slash command
/pm2
Context preview
What this command does when you run it.
Analyze a project and generate PM2 service commands for detected frontend, backend, or database services.
Command definition
pm2.mddescription: Analyze a project and generate PM2 service commands for detected frontend, backend, or database services.
PM2 Init
Auto-analyze project and generate PM2 service commands.
**Command**: `$ARGUMENTS`
---
Workflow
1. Check PM2 (install via `npm install -g pm2` if missing) 2. Scan project to identify services (frontend/backend/database) 3. Generate config files and individual command files
---
Service Detection
| Type | Detection | Default Port | |------|-----------|--------------| | Vite | vite.config.* | 5173 | | Next.js | next.config.* | 3000 | | Nuxt | nuxt.config.* | 3000 | | CRA | react-scripts in package.json | 3000 | | Express/Node | server/backend/api directory + package.json | 3000 | | FastAPI/Flask | requirements.txt / pyproject.toml | 8000 | | Go | go.mod / main.go | 8080 |
**Port Detection Priority**: User specified > .env > config file > scripts args > default port
---
Generated Files
project/
├── ecosystem.config.cjs # PM2 config
├── {backend}/start.cjs # Python wrapper (if applicable)
└── .claude/
├── commands/
│ ├── pm2-all.md # Start all + monit
│ ├── pm2-all-stop.md # Stop all
│ ├── pm2-all-restart.md # Restart all
│ ├── pm2-{port}.md # Start single + logs
│ ├── pm2-{port}-stop.md # Stop single
│ ├── pm2-{port}-restart.md # Restart single
│ ├── pm2-logs.md # View all logs
│ └── pm2-status.md # View status
└── scripts/
├── pm2-logs-{port}.ps1 # Single service logs
└── pm2-monit.ps1 # PM2 monitor---
Windows Configuration (IMPORTANT)
ecosystem.config.cjs
**Must use `.cjs` extension**
module.exports = {
apps: [
// Node.js (Vite/Next/Nuxt)
{
name: 'project-3000',
cwd: './packages/web',
script: 'node_modules/vite/bin/vite.js',
args: '--port 3000',
interpreter: 'C:/Program Files/nodejs/node.exe',
env: { NODE_ENV: 'development' }
},
// Python
{
name: 'project-8000',
cwd: './backend',
script: 'start.cjs',
interpreter: 'C:/Program Files/nodejs/node.exe',
env: { PYTHONUNBUFFERED: '1' }
}
]
}**Framework script paths:**
| Framework | script | args | |-----------|--------|------| | Vite | `node_modules/vite/bin/vite.js` | `--port {port}` | | Next.js | `node_modules/next/dist/bin/next` | `dev -p {port}` | | Nuxt | `node_modules/nuxt/bin/nuxt.mjs` | `dev --port {port}` | | Express | `src/index.js` or `server.js` | - |
Python Wrapper Script (start.cjs)
const { spawn } = require('child_process');
const proc = spawn('python', ['-m', 'uvicorn', 'app.main:app', '--host', '0.0.0.0', '--port', '8000', '--reload'], {
cwd: __dirname, stdio: 'inherit', windowsHide: true
});
proc.on('close', (code) => process.exit(code));---
Command File Templates (Minimal Content)
pm2-all.md (Start all + monit)
Start all services and open PM2 monitor.
```bash
cd "{PROJECT_ROOT}" && pm2 start ecosystem.config.cjs && start wt.exe -d "{PROJECT_ROOT}" pwsh -NoExit -c "pm2 monit"
### pm2-all-stop.md
````markdown
Stop all services.
```bash
cd "{PROJECT_ROOT}" && pm2 stop all
### pm2-all-restart.md
````markdown
Restart all services.
```bash
cd "{PROJECT_ROOT}" && pm2 restart all
### pm2-{port}.md (Start single + logs)
````markdown
Start {name} ({port}) and open logs.
```bash
cd "{PROJECT_ROOT}" && pm2 start ecosystem.config.cjs --only {name} && start wt.exe -d "{PROJECT_ROOT}" pwsh -NoExit -c "pm2 logs {name}"
### pm2-{port}-stop.md
````markdown
Stop {name} ({port}).
```bash
cd "{PROJECT_ROOT}" && pm2 stop {name}
### pm2-{port}-restart.md
````markdown
Restart {name} ({port}).
```bash
cd "{PROJECT_ROOT}" && pm2 restart {name}
### pm2-logs.md
````markdown
View all PM2 logs.
```bash
cd "{PROJECT_ROOT}" && pm2 logs
### pm2-status.md
````markdown
View PM2 status.
```bash
cd "{PROJECT_ROOT}" && pm2 status
### PowerShell Scripts (pm2-logs-{port}.ps1)
```powershell
Set-Location "{PROJECT_ROOT}"
pm2 logs {name}PowerShell Scripts (pm2-monit.ps1)
Set-Location "{PROJECT_ROOT}"
pm2 monit---
Key Rules
1. **Config file**: `ecosystem.config.cjs` (not .js) 2. **Node.js**: Specify bin path directly + interpreter 3. **Python**: Node.js wrapper script + `windowsHide: true` 4. **Open new window**: `start wt.exe -d "{path}" pwsh -NoExit -c "command"` 5. **Minimal content**: Each command file has only 1-2 lines description + bash block 6. **Direct execution**: No AI parsing needed, just run the bash command
---
Execute
Based on `$ARGUMENTS`, execute init:
1. Scan project for services 2. Generate `ecosystem.config.cjs` 3. Generate `{backend}/start.cjs` for Python services (if applicable) 4. Generate command files in `.claude/commands/` 5. Generate script files in `.claude/scripts/` 6. **Update project CLAUDE.md** with PM2 info (see below) 7. **Display completion summary** with terminal commands
---
Post-Init: Update CLAUDE.md
After generating files, append PM2 section to project's `CLAUDE.md` (create if not exists):
## PM2 Services
| Port | Name | Type |
|------|------|------|
| {port} | {name} | {type} |
**Terminal Commands:**
```bash
pm2 start ecosystem.config.cjs # First time
pm2 start all # After first time
pm2 stop all / pm2 restart all
pm2 start {name} / pm2 stop {name}
pm2 logs / pm2 status / pm2 monit
pm2 save # Save process list
pm2 resurrect # Restore saved list
**Rules for CLAUDE.md update:**
- If PM2 section exists, replace it
- If not exists, append to end
- Keep content minimal and essential
---
## Post-Init: Display Summary
After all files generated, output:
PM2 Init Complete
**Service
Read more
description: Analyze a project and generate PM2 service commands for detected frontend, backend, or database services.
PM2 Init
Auto-analyze project and generate PM2 service commands.
**Command**: `$ARGUMENTS`
---
Workflow
1. Check PM2 (install via `npm install -g pm2` if missing) 2. Scan project to identify services (frontend/backend/database) 3. Generate config files and individual command files
---
Service Detection
| Type | Detection | Default Port | |------|-----------|--------------| | Vite | vite.config.* | 5173 | | Next.js | next.config.* | 3000 | | Nuxt | nuxt.config.* | 3000 | | CRA | react-scripts in package.json | 3000 | | Express/Node | server/backend/api directory + package.json | 3000 | | FastAPI/Flask | requirements.txt / pyproject.toml | 8000 | | Go | go.mod / main.go | 8080 |
**Port Detection Priority**: User specified > .env > config file > scripts args > default port
---
Generated Files
project/
├── ecosystem.config.cjs # PM2 config
├── {backend}/start.cjs # Python wrapper (if applicable)
└── .claude/
├── commands/
│ ├── pm2-all.md # Start all + monit
│ ├── pm2-all-stop.md # Stop all
│ ├── pm2-all-restart.md # Restart all
│ ├── pm2-{port}.md # Start single + logs
│ ├── pm2-{port}-stop.md # Stop single
│ ├── pm2-{port}-restart.md # Restart single
│ ├── pm2-logs.md # View all logs
│ └── pm2-status.md # View status
└── scripts/
├── pm2-logs-{port}.ps1 # Single service logs
└── pm2-monit.ps1 # PM2 monitor---
Windows Configuration (IMPORTANT)
ecosystem.config.cjs
**Must use `.cjs` extension**
module.exports = {
apps: [
// Node.js (Vite/Next/Nuxt)
{
name: 'project-3000',
cwd: './packages/web',
script: 'node_modules/vite/bin/vite.js',
args: '--port 3000',
interpreter: 'C:/Program Files/nodejs/node.exe',
env: { NODE_ENV: 'development' }
},
// Python
{
name: 'project-8000',
cwd: './backend',
script: 'start.cjs',
interpreter: 'C:/Program Files/nodejs/node.exe',
env: { PYTHONUNBUFFERED: '1' }
}
]
}**Framework script paths:**
| Framework | script | args | |-----------|--------|------| | Vite | `node_modules/vite/bin/vite.js` | `--port {port}` | | Next.js | `node_modules/next/dist/bin/next` | `dev -p {port}` | | Nuxt | `node_modules/nuxt/bin/nuxt.mjs` | `dev --port {port}` | | Express | `src/index.js` or `server.js` | - |
Python Wrapper Script (start.cjs)
const { spawn } = require('child_process');
const proc = spawn('python', ['-m', 'uvicorn', 'app.main:app', '--host', '0.0.0.0', '--port', '8000', '--reload'], {
cwd: __dirname, stdio: 'inherit', windowsHide: true
});
proc.on('close', (code) => process.exit(code));---
Command File Templates (Minimal Content)
pm2-all.md (Start all + monit)
Start all services and open PM2 monitor.
```bash
cd "{PROJECT_ROOT}" && pm2 start ecosystem.config.cjs && start wt.exe -d "{PROJECT_ROOT}" pwsh -NoExit -c "pm2 monit"
### pm2-all-stop.md
````markdown
Stop all services.
```bash
cd "{PROJECT_ROOT}" && pm2 stop all
### pm2-all-restart.md
````markdown
Restart all services.
```bash
cd "{PROJECT_ROOT}" && pm2 restart all
### pm2-{port}.md (Start single + logs)
````markdown
Start {name} ({port}) and open logs.
```bash
cd "{PROJECT_ROOT}" && pm2 start ecosystem.config.cjs --only {name} && start wt.exe -d "{PROJECT_ROOT}" pwsh -NoExit -c "pm2 logs {name}"
### pm2-{port}-stop.md
````markdown
Stop {name} ({port}).
```bash
cd "{PROJECT_ROOT}" && pm2 stop {name}
### pm2-{port}-restart.md
````markdown
Restart {name} ({port}).
```bash
cd "{PROJECT_ROOT}" && pm2 restart {name}
### pm2-logs.md
````markdown
View all PM2 logs.
```bash
cd "{PROJECT_ROOT}" && pm2 logs
### pm2-status.md
````markdown
View PM2 status.
```bash
cd "{PROJECT_ROOT}" && pm2 status
### PowerShell Scripts (pm2-logs-{port}.ps1)
```powershell
Set-Location "{PROJECT_ROOT}"
pm2 logs {name}PowerShell Scripts (pm2-monit.ps1)
Set-Location "{PROJECT_ROOT}"
pm2 monit---
Key Rules
1. **Config file**: `ecosystem.config.cjs` (not .js) 2. **Node.js**: Specify bin path directly + interpreter 3. **Python**: Node.js wrapper script + `windowsHide: true` 4. **Open new window**: `start wt.exe -d "{path}" pwsh -NoExit -c "command"` 5. **Minimal content**: Each command file has only 1-2 lines description + bash block 6. **Direct execution**: No AI parsing needed, just run the bash command
---
Execute
Based on `$ARGUMENTS`, execute init:
1. Scan project for services 2. Generate `ecosystem.config.cjs` 3. Generate `{backend}/start.cjs` for Python services (if applicable) 4. Generate command files in `.claude/commands/` 5. Generate script files in `.claude/scripts/` 6. **Update project CLAUDE.md** with PM2 info (see below) 7. **Display completion summary** with terminal commands
---
Post-Init: Update CLAUDE.md
After generating files, append PM2 section to project's `CLAUDE.md` (create if not exists):
## PM2 Services
| Port | Name | Type |
|------|------|------|
| {port} | {name} | {type} |
**Terminal Commands:**
```bash
pm2 start ecosystem.config.cjs # First time
pm2 start all # After first time
pm2 stop all / pm2 restart all
pm2 start {name} / pm2 stop {name}
pm2 logs / pm2 status / pm2 monit
pm2 save # Save process list
pm2 resurrect # Restore saved list**Rules for CLAUDE.md update:** - If PM2 section exists, replace it - If not exists, append to end - Keep content minimal and essential --- ## Post-Init: Display Summary After all files generated, output:
PM2 Init Complete
**Service
Your agent can write code, but ECC gives it a coordinated engineering system and toolbox: it plans before it builds, verifies changes with tests, reviews its own work from a fresh context, remembers what matters, and turns repeated wins into reusable skills
Repo: affaan-m/ECC
Other commands on ecc.
- /add-language-rules
Workflow command scaffold for add-language-rules in everything-claude-code.
Open command - /database-migration
Workflow command scaffold for database-migration in everything-claude-code.
Open command - /feature-development
Workflow command scaffold for feature-development in everything-claude-code.
Open command - /aside
Answer a quick side question without interrupting or losing context from the current task. Resume work automatically after answering.
Open command - /auto-update
Pull the latest ECC repo changes and reinstall the current managed targets.
Open command - /build-fix
Detect the project build system and incrementally fix build/type errors with minimal safe changes.
Open command

