npm package: @project88/standup
Description: A CLI that reads your git history, branches, and integrations to generate a ready-to-paste standup summary.
Latest version: 0.1.1

# standup

A CLI that reads your git history, branches, and integrations to generate a ready-to-paste standup summary — instantly, from the terminal.

## Install

```bash
npm install -g @project88/standup
```

Or run directly with npx:

```bash
npx @project88/standup
```

### Development

```bash
git clone https://github.com/bloo-flip/standup.git
cd standup
npm install
npm run dev        # runs the CLI via tsx
npm test           # runs vitest
npm run build      # compiles to dist/
```

## Quick Start

```
$ standup

  ┌ standup ─────────────────────────────────────────┐

  Yesterday
    • Refactored auth middleware to use JWT validation
    • Fixed race condition in WebSocket reconnect logic
    • Reviewed PR #142 — add rate limiting to /api/upload

  Today
    On branch: fix/ws-heartbeat-timeout
    3 files modified · 1 file staged

  Blockers
    ⚠ PR #138 open 4 days with no review
    ✓ No other blockers

  └───────────────────────────────────────────────────┘
```

## Flags

| Flag | Description |
|------|-------------|
| `--since <timeframe>` | Time window for commits (default: "24 hours ago") |
| `--author <name>` | Override the git author name |
| `--verbose` | Show commit hashes and timestamps |
| `--quiet` | Suppress box chrome, print only summary text |
| `--json` | Output as JSON (shorthand for `--format json`) |
| `--format <type>` | Output format: `text`, `json`, or `markdown` |
| `--no-color` | Disable colored output (for piping) |
| `--no-github` | Skip GitHub integration |
| `--no-linear` | Skip Linear integration |
| `--no-jira` | Skip Jira integration |
| `--repos <paths>` | Comma-separated repo paths for multi-repo mode |
| `--ai` | Enable AI summarization (requires `OPENAI_API_KEY`) |
| `--ai-prompt <prompt>` | Custom prompt for AI summarization |
| `--exec <command>` | Pipe output to a shell command |
| `--webhook <url>` | POST output as JSON to a URL |
| `--dry-run` | Show what hooks would do without executing |
| `-v, --version` | Display the current version |
| `-h, --help` | Display help with examples |

## GitHub Setup

The CLI automatically detects GitHub credentials via:

1. `GITHUB_TOKEN` environment variable
2. `gh` CLI authentication (`gh auth token`)

If no token is found, GitHub data is silently skipped. Use `--no-github` to explicitly disable.

## Linear Setup

Set the `LINEAR_API_KEY` environment variable. The CLI fetches issues assigned to you (closed, moved, in-progress, blocked) within the time window. Use `--no-linear` to disable.

## Jira Setup

Set these environment variables:

| Variable | Description |
|----------|-------------|
| `JIRA_URL` | Your Jira instance URL (e.g. `https://yourteam.atlassian.net`) |
| `JIRA_TOKEN` | API token from [id.atlassian.com](https://id.atlassian.com/manage-profile/security/api-tokens) |
| `JIRA_EMAIL` | Your Atlassian account email |

Use `--no-jira` to disable.

## Configuration

Generate a config file:

```bash
standup init    # creates .standuprc in the current directory
```

Supported config options (`.standuprc`, `.standuprc.json`, `.standuprc.yaml`):

| Option | Type | Description |
|--------|------|-------------|
| `since` | `string` | `"24h"`, `"last-working-day"`, or any git timeframe |
| `format` | `string` | `text`, `json`, or `markdown` |
| `author` | `string` | Override git author name |
| `verbose` | `boolean` | Show hashes/timestamps by default |
| `quiet` | `boolean` | Suppress box chrome by default |
| `exclude_branches` | `string[]` | Branches to exclude |
| `repos` | `string[]` | Paths to aggregate across multiple repos |
| `ai.provider` | `string` | AI provider (`openai`) |
| `ai.model` | `string` | Model name (default: `gpt-4o-mini`) |
| `ai.api_key_env` | `string` | Env var for API key (default: `OPENAI_API_KEY`) |
| `hooks.exec` | `string` | Shell command to pipe output to |
| `hooks.webhook` | `string` | URL to POST output to |

CLI flags always override config file values.

## Tech Stack

- **Language:** TypeScript (Node.js)
- **CLI Framework:** Commander
- **Config:** Cosmiconfig
- **Integrations:** Octokit (GitHub), @linear/sdk (Linear), Jira REST API
- **AI:** OpenAI SDK
- **Output:** Chalk, Ora
- **Testing:** Vitest
- **Distribution:** npm (`@project88/standup`)

## Environment Variables

| Variable | Required By | Description |
|----------|-------------|-------------|
| `GITHUB_TOKEN` | GitHub | Personal access token (or use `gh auth`) |
| `LINEAR_API_KEY` | Linear | Linear API key |
| `JIRA_URL` | Jira | Jira instance URL |
| `JIRA_TOKEN` | Jira | Jira API token |
| `JIRA_EMAIL` | Jira | Atlassian account email |
| `OPENAI_API_KEY` | AI | OpenAI API key for `--ai` flag |

All integrations are optional — missing credentials are silently skipped.

## Docs

- [CHANGELOG.md](./CHANGELOG.md) — Release history
- [CONTRIBUTING.md](./CONTRIBUTING.md) — Development guide
- [IMPLEMENTATION.md](./IMPLEMENTATION.md) — Sprint roadmap
- [STANDUP.md](./STANDUP.md) — Original idea document

## License

MIT