diff --git a/plugins/supercrew/skills/kanban/SKILL.md b/plugins/supercrew/skills/kanban/SKILL.md new file mode 100644 index 0000000..9dcbb3c --- /dev/null +++ b/plugins/supercrew/skills/kanban/SKILL.md @@ -0,0 +1,20 @@ +--- +name: kanban +description: "Use when the user wants to see a kanban board, dashboard, or overview of all features and their statuses. Also use when asked about project progress, what's active, what's blocked, or overall feature status." +--- + +# Kanban Board + +Display `.supercrew/features/` as a grouped kanban board in the terminal. + +## Process + +1. Run the kanban script from this skill's directory: + +```bash +bash scripts/kanban.sh +``` + +2. Present the script output directly to the user — it is already formatted. + +3. If the user asks about a specific feature, offer to run `/supercrew:work-on ` to switch to it. diff --git a/plugins/supercrew/skills/kanban/scripts/kanban.sh b/plugins/supercrew/skills/kanban/scripts/kanban.sh new file mode 100755 index 0000000..f136f47 --- /dev/null +++ b/plugins/supercrew/skills/kanban/scripts/kanban.sh @@ -0,0 +1,312 @@ +#!/usr/bin/env bash +# kanban.sh — Display .supercrew/features as a kanban board + +set -euo pipefail + +FEATURES_DIR=".supercrew/features" + +if [ ! -d "$FEATURES_DIR" ]; then + echo "No \`.supercrew/features/\` directory found in this project." + echo "" + echo "Get started with \`/supercrew:new-feature\` to create your first feature." + exit 0 +fi + +# Parse a YAML scalar value (handles quoted and unquoted) +yaml_val() { + local content="$1" key="$2" + local raw + raw=$(echo "$content" | grep "^${key}:" | head -1 | sed "s/^${key}: *//" ) + # Strip surrounding quotes + raw="${raw#\"}" + raw="${raw%\"}" + raw="${raw#\'}" + raw="${raw%\'}" + printf '%s' "$raw" +} + +# Parse a YAML inline list: blocked_by: [item1, item2] +yaml_list() { + local content="$1" key="$2" + local raw + raw=$(echo "$content" | grep "^${key}:" | head -1 | sed "s/^${key}: *//" ) + raw="${raw#\[}" + raw="${raw%\]}" + # Strip quotes and commas, collapse whitespace + raw=$(echo "$raw" | sed 's/,/ /g; s/"//g; s/'"'"'//g' | xargs 2>/dev/null || echo "") + printf '%s' "$raw" +} + +# Field separator (unit separator, non-whitespace so read won't collapse empty fields) +SEP=$'\x1f' + +# Temp file for collecting feature data +TMPFILE=$(mktemp) +trap 'rm -f "$TMPFILE" "${TMPFILE}".feat* "${TMPFILE}".sorted' EXIT + +feature_count=0 + +for feature_dir in "$FEATURES_DIR"/*/; do + [ -d "$feature_dir" ] || continue + + fid=$(basename "$feature_dir") + meta_file="$feature_dir/meta.yaml" + [ -f "$meta_file" ] || continue + + feature_count=$((feature_count + 1)) + + # Read local meta.yaml + meta_content=$(cat "$meta_file") + + # If feature has a branch field, try git show for latest version + branch=$(yaml_val "$meta_content" "branch") + if [ -n "$branch" ]; then + remote_meta=$(git show "${branch}:${FEATURES_DIR}/${fid}/meta.yaml" 2>/dev/null || echo "") + if [ -n "$remote_meta" ]; then + meta_content="$remote_meta" + fi + fi + + title=$(yaml_val "$meta_content" "title") + status=$(yaml_val "$meta_content" "status") + priority=$(yaml_val "$meta_content" "priority") + owner=$(yaml_val "$meta_content" "owner") + blocked_by=$(yaml_list "$meta_content" "blocked_by") + + # Get progress from plan.md (try branch version first) + progress="" + plan_content="" + if [ -n "$branch" ]; then + plan_content=$(git show "${branch}:${FEATURES_DIR}/${fid}/plan.md" 2>/dev/null || echo "") + fi + if [ -z "$plan_content" ] && [ -f "$feature_dir/plan.md" ]; then + plan_content=$(cat "$feature_dir/plan.md") + fi + if [ -n "$plan_content" ]; then + progress=$(echo "$plan_content" | grep '^progress:' | sed 's/^progress: *//' | head -1) + fi + + # Priority sort key (P0=0 .. P3=3, unknown=9) + psort="${priority#P}" + [[ "$psort" =~ ^[0-9]$ ]] || psort=9 + + # Record: status | priority_sort | id | title | priority | progress | owner | blocked_by + printf "%s${SEP}%s${SEP}%s${SEP}%s${SEP}%s${SEP}%s${SEP}%s${SEP}%s\n" \ + "$status" "$psort" "$fid" "$title" "$priority" "$progress" "$owner" "$blocked_by" \ + >> "$TMPFILE" +done + +if [ "$feature_count" -eq 0 ]; then + echo "No features found in \`.supercrew/features/\`." + echo "" + echo "Create your first feature with \`/supercrew:new-feature\`." + exit 0 +fi + +# Sort by priority +sort -t"$SEP" -k2,2n "$TMPFILE" > "${TMPFILE}.sorted" +mv "${TMPFILE}.sorted" "$TMPFILE" + +# ── Rendering ──────────────────────────────────────────────────────────────── + +# Colors on by default; set NO_COLOR=1 to disable +if [ -z "${NO_COLOR:-}" ]; then + C_RESET=$'\e[0m' + C_BOLD=$'\e[1m' + C_DIM=$'\e[2m' + C_RED=$'\e[31m' + C_GREEN=$'\e[32m' + C_YELLOW=$'\e[33m' + C_MAGENTA=$'\e[35m' + C_CYAN=$'\e[36m' +else + C_RESET="" C_BOLD="" C_DIM="" C_RED="" C_GREEN="" C_YELLOW="" C_MAGENTA="" C_CYAN="" +fi + +# Status display order +STATUS_ORDER=("planning" "designing" "ready" "active" "blocked" "done") + +status_label() { printf '%s' "${1^}"; } + +status_color() { + case "$1" in + planning) printf '%s' "$C_DIM" ;; + designing) printf '%s' "$C_MAGENTA" ;; + ready) printf '%s' "$C_CYAN" ;; + active) printf '%s' "$C_YELLOW" ;; + blocked) printf '%s' "$C_RED" ;; + done) printf '%s' "$C_GREEN" ;; + *) printf '' ;; + esac +} + +# Pad string to exact visible width (non-hot paths only; hot paths use inline printf -v) +pad_to() { + local str="$1" width="$2" + local len=${#str} + if (( len >= width )); then + printf '%s' "${str:0:$width}" + else + printf '%s%*s' "$str" $(( width - len )) "" + fi +} + +# ── Collect non-empty columns ─────────────────────────────────────────────── + +num_cols=0 +declare -a col_statuses=() + +for st in "${STATUS_ORDER[@]}"; do + features=$(grep "^${st}${SEP}" "$TMPFILE" 2>/dev/null || true) + [ -z "$features" ] && continue + col_statuses+=("$st") + echo "$features" > "${TMPFILE}.feat${num_cols}" + num_cols=$((num_cols + 1)) +done + +# Warn about features with invalid or empty status +bad_features=$(grep -v -E "^($(IFS='|'; echo "${STATUS_ORDER[*]}"))${SEP}" "$TMPFILE" 2>/dev/null || true) +if [ -n "$bad_features" ]; then + while IFS="$SEP" read -r bad_status _psort fid _rest; do + if [ -z "$bad_status" ]; then + printf '%sWarning:%s feature "%s" has no status\n' "$C_YELLOW" "$C_RESET" "$fid" >&2 + else + printf '%sWarning:%s feature "%s" has unknown status "%s"\n' "$C_YELLOW" "$C_RESET" "$fid" "$bad_status" >&2 + fi + done <<< "$bad_features" +fi + +if [ "$num_cols" -eq 0 ]; then + exit 0 +fi + +# ── Calculate column dimensions ───────────────────────────────────────────── + +term_width=$(tput cols 2>/dev/null || echo 80) +col_total_width=$(( (term_width - num_cols - 1) / num_cols )) +col_width=$(( col_total_width - 2 )) +if (( col_width < 10 )); then + col_width=10 + col_total_width=12 +fi + +# ── Build cell lines per column ───────────────────────────────────────────── + +# Flat array: CELLS[col * MAX_ROWS + row] = "TYPE${SEP}text" +# Types: T=title(bold), M=meta(dim), B=blocker(red), S=separator +MAX_ROWS=500 +declare -a CELLS=() +declare -a COL_LINE_COUNTS=() +max_lines=0 + +for (( c=0; c col_width )); then + trunc="${title:0:$((col_width - 1))}…" + else + trunc="$title" + fi + CELLS[$((c * MAX_ROWS + idx))]="T${SEP}$trunc" + idx=$((idx + 1)) + + # Meta: priority + progress bar, or priority + owner + meta="$priority" + if [ -n "$progress" ] && [ "$progress" != "0" ]; then + # Inline progress bar (avoids subshell) + _filled=$(( progress * 10 / 100 )) + _empty=$(( 10 - _filled )) + printf -v _bar_f '%*s' "$_filled" ""; _bar_f="${_bar_f// /▓}" + printf -v _bar_e '%*s' "$_empty" ""; _bar_e="${_bar_e// /░}" + meta="$meta ${_bar_f}${_bar_e} ${progress}%" + elif [ -n "$owner" ]; then + meta="$meta · $owner" + fi + CELLS[$((c * MAX_ROWS + idx))]="M${SEP}$meta" + idx=$((idx + 1)) + + # Owner on separate line when progress bar was shown + if [ -n "$progress" ] && [ "$progress" != "0" ] && [ -n "$owner" ]; then + CELLS[$((c * MAX_ROWS + idx))]="M${SEP}$owner" + idx=$((idx + 1)) + fi + + # Blocker line + if [ -n "$blocked_by" ]; then + CELLS[$((c * MAX_ROWS + idx))]="B${SEP}blocked: $blocked_by" + idx=$((idx + 1)) + fi + + # Blank separator between features + CELLS[$((c * MAX_ROWS + idx))]="S${SEP}" + idx=$((idx + 1)) + done < "${TMPFILE}.feat${c}" + + COL_LINE_COUNTS[$c]=$idx + (( idx > max_lines )) && max_lines=$idx +done + +# ── Render table ──────────────────────────────────────────────────────────── + +# Horizontal rule segment (printf -v avoids loop and subshell) +printf -v hr '%*s' "$col_total_width" "" +hr="${hr// /─}" + +# Draw a full-width border line: draw_border +draw_border() { + local line="$1${hr}" + for (( c=1; c= col_width )); then + padded="${content:0:$col_width}" + else + printf -v padded '%s%*s' "$content" $(( col_width - len )) "" + fi + case "$ctype" in + T) line+=" ${C_BOLD}${padded}${C_RESET} │" ;; + M) line+=" ${C_DIM}${padded}${C_RESET} │" ;; + B) line+=" ${C_RED}${padded}${C_RESET} │" ;; + *) line+=" ${padded} │" ;; + esac + else + line+=" ${empty_cell} │" + fi + done + printf '%s\n' "$line" +done + +draw_border "└" "┴" "┘" diff --git a/test/fixtures/kanban/.supercrew/features/audit-log/meta.yaml b/test/fixtures/kanban/.supercrew/features/audit-log/meta.yaml new file mode 100644 index 0000000..e8cf052 --- /dev/null +++ b/test/fixtures/kanban/.supercrew/features/audit-log/meta.yaml @@ -0,0 +1,9 @@ +id: audit-log +title: "Audit Trail System" +status: active +owner: "kate" +priority: P0 +teams: [backend, security] +tags: [audit, compliance, logging] +created: "2026-02-10" +updated: "2026-03-03" diff --git a/test/fixtures/kanban/.supercrew/features/audit-log/plan.md b/test/fixtures/kanban/.supercrew/features/audit-log/plan.md new file mode 100644 index 0000000..f010500 --- /dev/null +++ b/test/fixtures/kanban/.supercrew/features/audit-log/plan.md @@ -0,0 +1,17 @@ +--- +total_tasks: 8 +completed_tasks: 1 +progress: 12 +--- + +# Audit Trail System — Implementation Plan + +## Tasks +- [x] Task 1: Define audit event schema +- [ ] Task 2: Event capture middleware +- [ ] Task 3: Storage layer (append-only) +- [ ] Task 4: Query API with filters +- [ ] Task 5: Admin audit viewer UI +- [ ] Task 6: Retention policy engine +- [ ] Task 7: Export to SIEM +- [ ] Task 8: Compliance report generator diff --git a/test/fixtures/kanban/.supercrew/features/auth-v2/meta.yaml b/test/fixtures/kanban/.supercrew/features/auth-v2/meta.yaml new file mode 100644 index 0000000..2dcf88f --- /dev/null +++ b/test/fixtures/kanban/.supercrew/features/auth-v2/meta.yaml @@ -0,0 +1,9 @@ +id: auth-v2 +title: "Auth V2 with SSO" +status: designing +owner: "bob" +priority: P0 +teams: [platform] +tags: [auth, sso, security] +created: "2026-01-30" +updated: "2026-02-28" diff --git a/test/fixtures/kanban/.supercrew/features/dark-mode/meta.yaml b/test/fixtures/kanban/.supercrew/features/dark-mode/meta.yaml new file mode 100644 index 0000000..2501a10 --- /dev/null +++ b/test/fixtures/kanban/.supercrew/features/dark-mode/meta.yaml @@ -0,0 +1,9 @@ +id: dark-mode +title: "Dark Mode Support" +status: ready +owner: "frank" +priority: P1 +teams: [frontend] +tags: [theme, ux] +created: "2026-02-25" +updated: "2026-03-03" diff --git a/test/fixtures/kanban/.supercrew/features/dashboard-v2/meta.yaml b/test/fixtures/kanban/.supercrew/features/dashboard-v2/meta.yaml new file mode 100644 index 0000000..19b4b4e --- /dev/null +++ b/test/fixtures/kanban/.supercrew/features/dashboard-v2/meta.yaml @@ -0,0 +1,9 @@ +id: dashboard-v2 +title: "Analytics Dashboard V2" +status: designing +owner: "iris" +priority: P1 +teams: [frontend, data] +tags: [dashboard, charts, analytics] +created: "2026-02-26" +updated: "2026-03-03" diff --git a/test/fixtures/kanban/.supercrew/features/email-digest/meta.yaml b/test/fixtures/kanban/.supercrew/features/email-digest/meta.yaml new file mode 100644 index 0000000..c680ded --- /dev/null +++ b/test/fixtures/kanban/.supercrew/features/email-digest/meta.yaml @@ -0,0 +1,9 @@ +id: email-digest +title: "Weekly Email Digest" +status: planning +owner: "oscar" +priority: P2 +teams: [backend, growth] +tags: [email, notifications] +created: "2026-03-03" +updated: "2026-03-04" diff --git a/test/fixtures/kanban/.supercrew/features/export-csv/meta.yaml b/test/fixtures/kanban/.supercrew/features/export-csv/meta.yaml new file mode 100644 index 0000000..185cec8 --- /dev/null +++ b/test/fixtures/kanban/.supercrew/features/export-csv/meta.yaml @@ -0,0 +1,9 @@ +id: export-csv +title: "CSV/Excel Export" +status: done +owner: "leo" +priority: P2 +teams: [backend, frontend] +tags: [export, data] +created: "2026-01-20" +updated: "2026-02-20" diff --git a/test/fixtures/kanban/.supercrew/features/export-csv/plan.md b/test/fixtures/kanban/.supercrew/features/export-csv/plan.md new file mode 100644 index 0000000..41bc159 --- /dev/null +++ b/test/fixtures/kanban/.supercrew/features/export-csv/plan.md @@ -0,0 +1,13 @@ +--- +total_tasks: 4 +completed_tasks: 4 +progress: 100 +--- + +# CSV/Excel Export — Implementation Plan + +## Tasks +- [x] Task 1: CSV generation service +- [x] Task 2: Excel (xlsx) support +- [x] Task 3: Export button in UI +- [x] Task 4: Streaming for large datasets diff --git a/test/fixtures/kanban/.supercrew/features/i18n/meta.yaml b/test/fixtures/kanban/.supercrew/features/i18n/meta.yaml new file mode 100644 index 0000000..c720072 --- /dev/null +++ b/test/fixtures/kanban/.supercrew/features/i18n/meta.yaml @@ -0,0 +1,9 @@ +id: i18n +title: "Internationalization" +status: ready +owner: "maya" +priority: P1 +teams: [frontend] +tags: [i18n, l10n, ux] +created: "2026-02-28" +updated: "2026-03-04" diff --git a/test/fixtures/kanban/.supercrew/features/mobile-nav/meta.yaml b/test/fixtures/kanban/.supercrew/features/mobile-nav/meta.yaml new file mode 100644 index 0000000..db4cd8d --- /dev/null +++ b/test/fixtures/kanban/.supercrew/features/mobile-nav/meta.yaml @@ -0,0 +1,9 @@ +id: mobile-nav +title: "Mobile Bottom Navigation" +status: ready +owner: "jack" +priority: P2 +teams: [frontend, mobile] +tags: [mobile, ux, navigation] +created: "2026-03-01" +updated: "2026-03-03" diff --git a/test/fixtures/kanban/.supercrew/features/notifications/meta.yaml b/test/fixtures/kanban/.supercrew/features/notifications/meta.yaml new file mode 100644 index 0000000..3cf0ab5 --- /dev/null +++ b/test/fixtures/kanban/.supercrew/features/notifications/meta.yaml @@ -0,0 +1,9 @@ +id: notifications +title: "Push Notifications" +status: active +owner: "grace" +priority: P1 +teams: [backend, mobile] +tags: [notifications, firebase] +created: "2026-02-18" +updated: "2026-03-02" diff --git a/test/fixtures/kanban/.supercrew/features/notifications/plan.md b/test/fixtures/kanban/.supercrew/features/notifications/plan.md new file mode 100644 index 0000000..de139d4 --- /dev/null +++ b/test/fixtures/kanban/.supercrew/features/notifications/plan.md @@ -0,0 +1,15 @@ +--- +total_tasks: 6 +completed_tasks: 5 +progress: 83 +--- + +# Push Notifications — Implementation Plan + +## Tasks +- [x] Task 1: Firebase SDK integration +- [x] Task 2: Notification permission flow +- [x] Task 3: Token registration API +- [x] Task 4: Topic-based subscriptions +- [x] Task 5: Rich notification templates +- [ ] Task 6: Delivery analytics dashboard diff --git a/test/fixtures/kanban/.supercrew/features/onboarding/meta.yaml b/test/fixtures/kanban/.supercrew/features/onboarding/meta.yaml new file mode 100644 index 0000000..f6e5127 --- /dev/null +++ b/test/fixtures/kanban/.supercrew/features/onboarding/meta.yaml @@ -0,0 +1,9 @@ +id: onboarding +title: "User Onboarding Flow" +status: done +owner: "eve" +priority: P1 +teams: [frontend, growth] +tags: [onboarding, ux] +created: "2026-01-15" +updated: "2026-02-25" diff --git a/test/fixtures/kanban/.supercrew/features/onboarding/plan.md b/test/fixtures/kanban/.supercrew/features/onboarding/plan.md new file mode 100644 index 0000000..47cb891 --- /dev/null +++ b/test/fixtures/kanban/.supercrew/features/onboarding/plan.md @@ -0,0 +1,14 @@ +--- +total_tasks: 5 +completed_tasks: 5 +progress: 100 +--- + +# User Onboarding Flow — Implementation Plan + +## Tasks +- [x] Task 1: Design onboarding wizard +- [x] Task 2: Build step-by-step UI +- [x] Task 3: Add progress tracking +- [x] Task 4: Implement skip/resume logic +- [x] Task 5: A/B test with analytics diff --git a/test/fixtures/kanban/.supercrew/features/payment-flow/meta.yaml b/test/fixtures/kanban/.supercrew/features/payment-flow/meta.yaml new file mode 100644 index 0000000..bf727fc --- /dev/null +++ b/test/fixtures/kanban/.supercrew/features/payment-flow/meta.yaml @@ -0,0 +1,10 @@ +id: payment-flow +title: "Payment Integration" +status: blocked +owner: "dave" +priority: P1 +teams: [backend, billing] +tags: [payments, stripe] +created: "2026-02-10" +updated: "2026-03-01" +blocked_by: [auth-v2] diff --git a/test/fixtures/kanban/.supercrew/features/payment-flow/plan.md b/test/fixtures/kanban/.supercrew/features/payment-flow/plan.md new file mode 100644 index 0000000..cd6fb9e --- /dev/null +++ b/test/fixtures/kanban/.supercrew/features/payment-flow/plan.md @@ -0,0 +1,17 @@ +--- +total_tasks: 8 +completed_tasks: 3 +progress: 40 +--- + +# Payment Integration — Implementation Plan + +## Tasks +- [x] Task 1: Stripe SDK setup +- [x] Task 2: Define payment models +- [x] Task 3: Create checkout API stub +- [ ] Task 4: Implement checkout flow (blocked: needs auth-v2) +- [ ] Task 5: Add webhook handlers +- [ ] Task 6: Implement refund logic +- [ ] Task 7: PCI compliance review +- [ ] Task 8: Load testing diff --git a/test/fixtures/kanban/.supercrew/features/rate-limiter/meta.yaml b/test/fixtures/kanban/.supercrew/features/rate-limiter/meta.yaml new file mode 100644 index 0000000..ef659ea --- /dev/null +++ b/test/fixtures/kanban/.supercrew/features/rate-limiter/meta.yaml @@ -0,0 +1,10 @@ +id: rate-limiter +title: "API Rate Limiting" +status: blocked +owner: "henry" +priority: P0 +teams: [platform] +tags: [api, security, redis] +created: "2026-02-22" +updated: "2026-03-01" +blocked_by: [auth-v2] diff --git a/test/fixtures/kanban/.supercrew/features/rate-limiter/plan.md b/test/fixtures/kanban/.supercrew/features/rate-limiter/plan.md new file mode 100644 index 0000000..8a92e49 --- /dev/null +++ b/test/fixtures/kanban/.supercrew/features/rate-limiter/plan.md @@ -0,0 +1,16 @@ +--- +total_tasks: 7 +completed_tasks: 2 +progress: 28 +--- + +# API Rate Limiting — Implementation Plan + +## Tasks +- [x] Task 1: Redis sliding window prototype +- [x] Task 2: Define rate limit tiers +- [ ] Task 3: Middleware integration (blocked: needs auth-v2 for user identification) +- [ ] Task 4: Per-endpoint configuration +- [ ] Task 5: Rate limit headers (X-RateLimit-*) +- [ ] Task 6: Admin override mechanism +- [ ] Task 7: Load testing diff --git a/test/fixtures/kanban/.supercrew/features/rbac/meta.yaml b/test/fixtures/kanban/.supercrew/features/rbac/meta.yaml new file mode 100644 index 0000000..28cf79b --- /dev/null +++ b/test/fixtures/kanban/.supercrew/features/rbac/meta.yaml @@ -0,0 +1,10 @@ +id: rbac +title: "Role-Based Access Control" +status: blocked +owner: "nina" +priority: P0 +teams: [platform, security] +tags: [rbac, auth, permissions] +created: "2026-02-14" +updated: "2026-03-02" +blocked_by: [auth-v2] diff --git a/test/fixtures/kanban/.supercrew/features/rbac/plan.md b/test/fixtures/kanban/.supercrew/features/rbac/plan.md new file mode 100644 index 0000000..a34b515 --- /dev/null +++ b/test/fixtures/kanban/.supercrew/features/rbac/plan.md @@ -0,0 +1,18 @@ +--- +total_tasks: 9 +completed_tasks: 3 +progress: 33 +--- + +# Role-Based Access Control — Implementation Plan + +## Tasks +- [x] Task 1: Permission model design +- [x] Task 2: Role hierarchy schema +- [x] Task 3: Database migrations +- [ ] Task 4: Permission check middleware (blocked: auth-v2) +- [ ] Task 5: Role assignment API +- [ ] Task 6: Admin role management UI +- [ ] Task 7: Resource-level permissions +- [ ] Task 8: Permission caching layer +- [ ] Task 9: Integration tests diff --git a/test/fixtures/kanban/.supercrew/features/search-api/meta.yaml b/test/fixtures/kanban/.supercrew/features/search-api/meta.yaml new file mode 100644 index 0000000..8f5786c --- /dev/null +++ b/test/fixtures/kanban/.supercrew/features/search-api/meta.yaml @@ -0,0 +1,9 @@ +id: search-api +title: "Full-Text Search API" +status: active +owner: "charlie" +priority: P0 +teams: [backend] +tags: [search, elasticsearch] +created: "2026-02-15" +updated: "2026-03-01" diff --git a/test/fixtures/kanban/.supercrew/features/search-api/plan.md b/test/fixtures/kanban/.supercrew/features/search-api/plan.md new file mode 100644 index 0000000..5d83d4d --- /dev/null +++ b/test/fixtures/kanban/.supercrew/features/search-api/plan.md @@ -0,0 +1,19 @@ +--- +total_tasks: 10 +completed_tasks: 6 +progress: 60 +--- + +# Full-Text Search API — Implementation Plan + +## Tasks +- [x] Task 1: Set up Elasticsearch client +- [x] Task 2: Define search index schema +- [x] Task 3: Implement indexing pipeline +- [x] Task 4: Build search query parser +- [x] Task 5: Add pagination support +- [x] Task 6: Write unit tests for query parser +- [ ] Task 7: Add fuzzy matching +- [ ] Task 8: Implement search suggestions +- [ ] Task 9: Performance benchmarks +- [ ] Task 10: Integration tests diff --git a/test/fixtures/kanban/.supercrew/features/user-prefs/meta.yaml b/test/fixtures/kanban/.supercrew/features/user-prefs/meta.yaml new file mode 100644 index 0000000..3964d1d --- /dev/null +++ b/test/fixtures/kanban/.supercrew/features/user-prefs/meta.yaml @@ -0,0 +1,9 @@ +id: user-prefs +title: "User Preferences Page" +status: active +owner: "alice" +priority: P2 +teams: [frontend] +tags: [settings, ux] +created: "2026-02-20" +updated: "2026-03-02" diff --git a/test/fixtures/kanban/.supercrew/features/user-prefs/plan.md b/test/fixtures/kanban/.supercrew/features/user-prefs/plan.md new file mode 100644 index 0000000..e805d8b --- /dev/null +++ b/test/fixtures/kanban/.supercrew/features/user-prefs/plan.md @@ -0,0 +1,19 @@ +--- +total_tasks: 10 +completed_tasks: 3 +progress: 30 +--- + +# User Preferences Page — Implementation Plan + +## Tasks +- [x] Task 1: Design preferences schema +- [x] Task 2: Create preferences API endpoint +- [x] Task 3: Build settings page layout +- [ ] Task 4: Implement theme selector +- [ ] Task 5: Add notification preferences +- [ ] Task 6: Add language/locale picker +- [ ] Task 7: Persist preferences to backend +- [ ] Task 8: Add import/export settings +- [ ] Task 9: Write E2E tests +- [ ] Task 10: Accessibility audit