---
name: eck:feature-status
version: "0.7.4"
description: "Dashboard showing all features with lifecycle status, progress, and last-updated dates."
disable-model-invocation: false
---

# Feature Status Dashboard

Display a formatted table of all features from `.claude/lifecycle.json` showing lifecycle status, step progress, and last-updated dates.

> Read-only — this skill never modifies any files.

---

## Visual Framework

Follow these conventions for all terminal output displayed to the user via the Bash tool.

### Output Mode Awareness

Before producing output, read the user's preferred output mode:

```bash
cat $ECK_HOME/user-preferences.json 2>/dev/null
```

Extract the `outputMode` field and adapt verbosity:

- **guided** — Add explanatory prose after key steps. Describe what is happening and why.
- **standard** (default) — Balanced. Show steps with brief context for non-obvious decisions.
- **concise** — Steps and summary box only. No prose, no explanations.

If the file is missing or `outputMode` is absent, use **standard**.

### ANSI Colors

Declare these variables at the top of **every** Bash tool call (shell state does not persist between calls):

```bash
source $ECK_HOME/colors.sh
```

Every color sequence **must** end with `${RESET}`. No exceptions.

### Stage Banners

Mark major stage transitions with a bold banner. One blank line before and after.

```bash
echo ""
printf '%b\n' "${ORANGE}${BOLD}STAGE NAME${RESET}"
echo ""
```

### Status Symbols

| Symbol | Meaning          | Color       |
| ------ | ---------------- | ----------- |
| `[*]`  | Active / running | `${CYAN}`   |
| `[x]`  | Completed        | `${GREEN}`  |
| `[!]`  | Error            | `${RED}`    |
| `[-]`  | Skipped          | `${DIM}`    |
| `[>]`  | In progress      | `${YELLOW}` |
| `[ ]`  | Pending          | `${DIM}`    |

No emoji in output. Use only these bracket symbols for status.

### Summary Boxes

Display at checkpoints and at the end of the skill. One blank line before and after.

### Error Format

```bash
printf '%b\n' "${RED}[!]${RESET} Error message here"
printf '%b\n' "    ${DIM}Recovery guidance here.${RESET}"
```

### Spacing Rules

- One blank line before and after stage banners and summary boxes.
- No blank lines within step lists.
- Maximum output line width: 70 characters.

---

## Task Registration

| Stage | Subject          | Active Form       | Statusline     |
| ----- | ---------------- | ----------------- | -------------- |
| 1     | Stage 1: Read    | Reading lifecycle | FeatStat (1/2) |
| 2     | Stage 2: Display | Rendering display | FeatStat (2/2) |

### Statusline Stage Updates

At the **start** of each stage, update the statusline:

```bash
bash $ECK_HOME/update-stage.sh "{Statusline text from table}"
```

At **skill completion** (success or error), reset:

```bash
bash $ECK_HOME/update-stage.sh
```

---

## Usage

```
/eck:feature-status
```

No arguments needed — displays all features from the current project's lifecycle.

---

## Stage 1: Read

### Inputs

- `$ECK_HOME/manage-features.js list` — feature metadata (id, archived_at)
- `$CLAUDE_PROJECT_DIR/.claude/features.json` — `display_name` per feature (looked up by feature ID)
- `.claude/lifecycle.json` via `update-lifecycle.js list` — lifecycle status and step progress

### Activities

1. Read feature list from manage-features.js:
   ```bash
   node $ECK_HOME/manage-features.js list
   ```
2. Read lifecycle data for step statuses and active feature:
   ```bash
   node $ECK_HOME/update-lifecycle.js list
   ```
3. If both sources return empty, stop with guidance:
   ```
   [-] No features registered
       Create a feature with /eck:create-feature to begin tracking.
   ```
   -> STOP (reset statusline first)
4. Merge the two sources: match records by <KEY>-XXX id. Each merged entry contains:
   - `id` — <KEY>-XXX identifier (primary key)
   - `display_name` — human-readable name (from `features.json` by feature ID; use `<unknown>` if missing)
   - `status` — `active`, `backlog`, `parked`, `done`, or `archived`
   - `next_step` — next incomplete step (null if done)
   - `progress` — object with `spec`, `design`, `develop`, `validate`, `deploy` statuses (from lifecycle)
   - `updated_at` — ISO date string

### Outputs

- Merged feature list ready for rendering

### Exit Criteria

- Feature list retrieved and validated as non-empty

---

## Stage 2: Display

### Inputs

- Merged feature list from Stage 1
- Active <KEY>-XXX from lifecycle `active_feature` field

### Activities

1. Sort features by `updated_at` descending (most recently updated first).

2. Build the feature table. For each feature, render one row:

   **<KEY>-XXX column** — the `id` field (e.g., `WA-042`)

   **Name column** — truncated `display_name` (max 20 chars), looked up from `features.json`:

   ```bash
   FEATURES_JSON="$CLAUDE_PROJECT_DIR/.claude/features.json"
   NAME=$(jq -r --arg id "$ID" '.features[$id].display_name // "<unknown>"' "$FEATURES_JSON")
   if [ "$NAME" = "<unknown>" ]; then
     printf 'Warning: orphan registry entry: %s has no features.json entry\n' "$ID" >&2
   fi
   ```

   **Status column** — based on the `status` field:
   - `active` → `${CYAN}[*]${RESET}`
   - `backlog` → `${DIM}[ ]${RESET}`
   - `parked` → `${YELLOW}[>]${RESET}`
   - `done` → `${GREEN}[x]${RESET}`
   - `archived` → `${DIM}[-]${RESET}`

   **Progress column** — for each of the 5 steps, show:
   - `done`/`skipped` → `[x]`
   - `active` → `[*]`
   - `pending`/`failed`/`gated` → `[ ]`
   - Step labels: `S` (spec), `D` (design), `D` (develop), `V` (validate), `D` (deploy)

   **Updated column** — date portion of `updated_at` (YYYY-MM-DD)

3. Display the table:

   ```bash
   source $ECK_HOME/colors.sh

   echo ""
   printf '%b\n' "${ORANGE}${BOLD}Features${RESET}"
   echo ""
   printf '%-10s %-22s %-5s %-33s %s\n' "{KEY}-XXX" "Name" "Status" "Progress" "Updated"
   # For each feature row:
   printf '%-10s %-22s %b %-33s %s\n' "{id}" "$NAME" "{status_symbol}" "{progress_breadcrumb}" "{date}"
   ```

   Group features by status in this order: **Active -> Backlog -> Parked -> Done -> Archived**.
   Display a section header for each non-empty group.

   Example output:

   ```
   Features

   Active
   {KEY}-XXX  Name                   Status  Progress                          Updated
   WA-042     User Auth              [*]     [x] S [*] D [ ] D [ ] V [ ] D    2026-03-12

   Backlog
   {KEY}-XXX  Name                   Status  Progress                          Updated
   WA-055     Email Templates        [ ]     [ ] S [ ] D [ ] D [ ] V [ ] D    2026-03-12
   WA-061     Billing API            [ ]     [ ] S [ ] D [ ] D [ ] V [ ] D    2026-03-11

   Parked
   {KEY}-XXX  Name                   Status  Progress                          Updated
   WA-038     Color Demo             [>]     [x] S [ ] D [ ] D [ ] V [ ] D    2026-03-11

   Done
   {KEY}-XXX  Name                   Status  Progress                          Updated
   WA-031     User Onboarding        [x]     [x] S [x] D [x] D [x] V [x] D   2026-03-10

   Archived
   {KEY}-XXX  Name                   Status  Progress                          Updated
   WA-018     Old Feature            [-]     [x] S [ ] D [ ] D [ ] V [ ] D    2026-03-09
   ```

4. Display summary counts:

   ```bash
   echo ""
   printf '%b\n' "Active: {N}  Backlog: {N}  Parked: {N}  Done: {N}  Archived: {N}  Total: {N}"
   ```

5. Show context-appropriate hints:

   ```bash
   echo ""
   # If there are backlog features:
   printf '%b\n' "${DIM}Select a backlog feature with /eck:select-feature${RESET}"
   # If there are parked features:
   printf '%b\n' "${DIM}Resume a parked feature with /eck:resume-feature${RESET}"
   # If neither backlog nor parked:
   printf '%b\n' "${DIM}Create a feature with /eck:create-feature${RESET}"
   ```

6. Reset statusline:
   ```bash
   bash $ECK_HOME/update-stage.sh
   ```

### Outputs

- Feature table displayed to terminal
- Summary counts displayed

### Exit Criteria

- All features rendered in table format
- Summary line shows correct counts

---

## Error Handling

- If `manage-features.js list` fails, show the error output and stop
- If `update-lifecycle.js list` fails, fall back to manage-features.js data only (no step progress)
- If no features.json or lifecycle.json exists, treat as "no features registered"
- At completion (success or error), always reset statusline
