---
name: cm-terminal
description: Use when running ANY terminal command - enforces clear progress logging, output reading, and error-stop behavior so terminal processes are never left unchecked
---

# Terminal Process Monitoring

## Overview

Running commands without checking output is flying blind. Users MUST see what's happening at every step.

**Core principle:** Every command gets announced, monitored, and verified. No exceptions.

**Violating the letter of this rule is violating the spirit of this rule.**

## The Iron Law

```
NO COMMAND RUNS WITHOUT READING ITS OUTPUT.
NO ERROR GOES UNREPORTED.
NO NEXT STEP WITHOUT PREVIOUS STEP CONFIRMED.
```

## When to Use

**ALWAYS** when running terminal commands via `run_command`. This includes:
- Build commands (`npm run build`, `npm run dev`)
- Test commands (`npx vitest run`)
- Install commands (`npm install`)
- Deploy commands (`npx wrangler pages deploy`)
- Git commands (`git push`, `git commit`)
- Any script or CLI tool

## The Protocol

### Step 1: Announce Before Running

**BEFORE calling `run_command`:**

Update `task_boundary` TaskStatus to describe what you're about to run and why.

```
TaskStatus: "Running npm build to compile production bundle"
TaskStatus: "Installing dependencies with npm install"
TaskStatus: "Deploying to Cloudflare Pages"
```

### Step 2: Set Appropriate Wait Time

Choose `WaitMsBeforeAsync` based on expected command duration:

| Command Type | WaitMsBeforeAsync | Strategy |
|-------------|-------------------|----------|
| Quick (< 3s) — `git status`, `ls`, `cat` | 3000-5000 | Synchronous, read output directly |
| Medium (3-30s) — `npm install`, `build` | 5000-10000 | Wait for initial output, then poll |
| Long (> 30s) — `deploy`, `test suites` | 2000-5000 | Send to background, poll actively |

### Step 3: Read Output Immediately

**After `run_command` returns:**

1. If command completed synchronously → read output in the response
2. If command sent to background → call `command_status` immediately with `WaitDurationSeconds: 10`
3. **NEVER proceed to next step without reading output**

### Step 4: Check for Errors

Scan output for error indicators:

```
ERROR PATTERNS TO DETECT:
- Exit code ≠ 0
- "error", "Error", "ERROR"
- "fail", "FAIL", "failed", "FAILED"
- "ENOENT", "EACCES", "EPERM"
- "not found", "No such file"
- "Cannot find module"
- "SyntaxError", "TypeError", "ReferenceError"
- "Build failed"
- "Command failed"
- "Permission denied"
- "FATAL"
- Stack traces (lines with "at " prefix)
- npm ERR!
- Warning patterns that indicate real problems
```

### Step 5: Stop on Error

**If ANY error is detected:**

```
1. STOP — Do not run any more commands
2. IDENTIFY — Extract the exact error message and context
3. REPORT — Call notify_user with error if critical
4. FIX — Use cm-debugging if proceeding to fix
```

### Step 6: Poll Long-Running Commands

**For background commands (returned a CommandId):**

1. Poll `command_status` every 10-15 seconds
2. After EACH poll, update `task_boundary` TaskStatus with latest output summary
3. Continue until command completes (status: "done")
4. Read final output and check for errors

### Step 7: Confirm Success

**Only after reading output AND confirming no errors:**

Update `task_boundary` TaskSummary with the result:
```
TaskSummary: "Build completed successfully (0 errors, 0 warnings)"
TaskSummary: "All 519 tests passed"
TaskSummary: "Deployed to https://prms-4pv.pages.dev successfully"
```

## Red Flags — STOP and Follow Protocol

If you catch yourself doing ANY of these:

- Running a command without updating TaskStatus first
- Calling `run_command` while previous command is still running
- Skipping `command_status` for a background command
- Proceeding to next step without reading output
- Ignoring warnings or errors in output
- Assuming a command succeeded without checking exit code
- Running 3+ commands in parallel without monitoring each

**ALL of these mean: STOP. Follow the protocol.**

## Anti-Patterns

| DON'T | DO |
|-------|-----|
| Run and forget | Run and read output |
| Assume success | Verify success from output |
| Chain commands blindly | Verify each before next |
| Ignore warnings | Report warnings to user |
| Multiple commands without checking | Sequential with verification |

## Special Cases

### Interactive Commands (dev servers, watch mode)

1. Start with `WaitMsBeforeAsync: 3000-5000`
2. Check initial output for startup success/failure
3. Look for "ready" / "listening on" / "compiled successfully" signals
4. Report the URL/port to user
5. Note the CommandId for future reference

### Parallel Commands

If running multiple commands at once:
1. Track ALL CommandIds
2. Poll each one separately
3. If ANY fails → report which one failed

### Piped/Chained Commands (`&&`, `|`)

1. The exit code reflects the LAST command in the chain
2. Read full output — errors from earlier commands may appear but the chain continues
3. Be extra careful with `cd dir && npm run build` — if `cd` fails, build won't run

## Severity Levels

| Level | Action | Example |
|-------|--------|---------|
| 🟢 **Success** | Update TaskSummary, proceed | "Build succeeded" |
| 🟡 **Warning** | Report to user, ask if proceed | "Deprecated dependency" |
| 🔴 **Error** | STOP immediately, notify_user or fix | "Build failed", "Test failed" |
| ⚫ **Fatal** | STOP immediately, notify_user | "ENOENT", "Permission denied" |

## The Bottom Line

**Every command tells a story through its output. READ the story. SHARE it with the user. STOP if the story is bad.**
