# Pack List

> Lists every pack discoverable in ~/.lintel/packs/ and repo packs/ — shows name, extends, voice tier, compliance mode, active flag.

- Skill: `jokerman89/pack-list` (Agent Skill)
- Install (CLI): `npx skillmds@latest add jokerman89/pack-list`
- Raw SKILL.md: https://api.skillmd.com/api/skills/jokerman89/pack-list/raw
- Safety review: pending
- Works with: Claude Code, Claude.ai, OpenAI Codex
- Category: Coding & Dev Tools
- Author: jokerman89 (https://skillmd.com/u/jokerman89)
- Updated: 2026-09-17
- Page: https://skillmd.com/skills/jokerman89/pack-list

---


You are the PACK-LIST skill — surfaces every pack available on this machine.

## What this skill does

Walks `~/.lintel/packs/` + `<repo>/packs/`, parses each pack.yaml, prints a table:

```
PACK              ACTIVE  EXTENDS       VOICE       COMPLIANCE  REQUIRES
_default          *                     internal    advisory    >=4.0.0
acme-internal             (none)        mixed       hard        >=4.0.0
acme-customer             acme-internal customer    hard        >=4.0.0
```

`*` marks the active pack. Only `_default` ships with Lintel; other packs are installed by the operator — a company pack contributes its own voice, compliance, and roles on top of `_default`.

## When to use

- Operator forgot which packs exist
- Before `/li:pack-switch` to confirm target
- Before `/li:pack-create` to avoid name collision
- After `/li:v4-migrate` to confirm the recommended pack is present

## When NOT to use

- Mid-cycle (no need; the cached pack is what matters)
- For pack-content introspection — read the pack.yaml directly

## Workflow

### Step 1 — Discover pack directories

```bash
LINTEL_HOME="${LINTEL_HOME:-$HOME/.lintel}"
REPO_PACKS="$(git rev-parse --show-toplevel 2>/dev/null)/packs"
HOME_PACKS="$LINTEL_HOME/packs"

packs=()
for base in "$HOME_PACKS" "$REPO_PACKS"; do
  [ -d "$base" ] || continue
  while IFS= read -r d; do
    [ -f "$d/pack.yaml" ] && packs+=("$(basename "$d"):$base")
  done < <(find "$base" -mindepth 1 -maxdepth 1 -type d 2>/dev/null | sort)
done
```

### Step 2 — Read active pack

```bash
ACTIVE_FILE="$LINTEL_HOME/packs/active-pack"
active="_default"
[ -f "$ACTIVE_FILE" ] && active=$(head -1 "$ACTIVE_FILE" | tr -d '[:space:]')
```

### Step 3 — Parse each pack + emit table

For each pack, extract:
- `name`
- `extends` (or `(none)`)
- `voice.default_tier`
- `compliance.mode`
- `requires_lintel`

Emit aligned table to stdout. Mark active pack with `*`.

### Step 4 — Validation indicator (optional, --validate)

If `--validate` flag: invoke `validate_pack` per row, print `OK` or `FAIL` in extra column.

```bash
if [ "$VALIDATE" = "1" ]; then
  source "$REPO_ROOT/lib/pack-resolver.sh"
  for row in "${packs[@]}"; do
    name="${row%%:*}"
    if validate_pack "$name" 2>/dev/null; then
      echo "  $name: VALID"
    else
      echo "  $name: INVALID — run /li:pack-validate $name for details"
    fi
  done
fi
```

### Step 5 — Surface counts + footer

```
Total: 3 packs (1 active)
Sources: ~/.lintel/packs (2), <repo>/packs (1)
```

Footer:
- "Switch active: `/li:pack-switch <name>`"
- "Create new: `/li:pack-create <name>`"
- "Validate all: `/li:pack-list --validate`"

## Integration

**Reads:**
- `~/.lintel/packs/<name>/pack.yaml` for every pack
- `<repo>/packs/<name>/pack.yaml` for every pack
- `~/.lintel/packs/active-pack`
- Optionally `lib/pack-resolver.sh` (--validate mode)

**Writes:**
- stdout only — no state mutation

## Anti-patterns

- **Hardcoding pack list** — always re-discover (operators add packs frequently)
- **Hiding home-packs** — both scopes count; surface both
- **Suppressing pack collisions** — if `~/.lintel/packs/foo` AND `<repo>/packs/foo` both exist, flag it (home wins per resolver order)

