feat/002_init-remote
Raw Download raw file

tissue list / tissue ls

List and filter issues in the repository.

Tissue Commands

# List all issues
tissue list
tissue ls

# Filter by status
tissue list --status open
tissue list --status closed

# Filter by multiple criteria
tissue list --priority high --tags bug

# Sort issues
tissue list --sort priority
tissue list --sort updated --reverse

Manual Workflow (bash + git)

List all issues

# Simple listing
cd ../issues
ls -la *.md

# Or from main branch
git ls-tree issues: --name-only | grep '\.md$'

List with details using yq

# Display all issues with metadata
list_issues() {
    cd ../issues

    # Header
    printf "%-4s %-10s %-8s %-40s %-15s\n" "NUM" "STATUS" "PRIORITY" "TITLE" "TAGS"
    echo "--------------------------------------------------------------------------------"

    # Process each issue file
    for file in *.md; do
        [ "$file" = "README.md" ] && continue
        [ -f "$file" ] || continue

        # Extract issue number from filename
        NUM=$(echo "$file" | cut -d'_' -f1)

        # Extract fields using yq
        TITLE=$(yq --front-matter '.title // ""' "$file" | head -c 40)
        STATUS=$(yq --front-matter '.status // "unknown"' "$file")
        PRIORITY=$(yq --front-matter '.priority // ""' "$file")
        TAGS=$(yq --front-matter '.tags | join(", ") // ""' "$file" | head -c 15)

        # Print row
        printf "%-4s %-10s %-8s %-40s %-15s\n" \
            "$NUM" "$STATUS" "$PRIORITY" "$TITLE" "$TAGS"
    done
}

list_issues

Filter by status

# List issues with specific status
filter_by_status() {
    STATUS_FILTER="$1"
    cd ../issues

    for file in *.md; do
        [ "$file" = "README.md" ] && continue
        [ -f "$file" ] || continue

        # Check status using yq
        STATUS=$(yq --front-matter '.status' "$file" 2>/dev/null)
        if [ "$STATUS" = "$STATUS_FILTER" ]; then
            TITLE=$(yq --front-matter '.title' "$file")
            echo "${file}: ${TITLE}"
        fi
    done
}

filter_by_status "open"

Advanced filtering with yq

# Filter by multiple criteria using yq expressions
filter_issues() {
    cd ../issues

    local status_filter="${1:-.*}"
    local priority_filter="${2:-.*}"
    local tag_filter="${3:-}"

    for file in *.md; do
        [ "$file" = "README.md" ] && continue
        [ -f "$file" ] || continue

        # Build and evaluate filter expression
        if [ -n "$tag_filter" ]; then
            MATCHES=$(yq --front-matter "
                .status == \"$status_filter\" and
                .priority == \"$priority_filter\" and
                (.tags // [] | contains([\"$tag_filter\"]))
            " "$file" 2>/dev/null)
        else
            MATCHES=$(yq --front-matter "
                .status == \"$status_filter\" and
                .priority == \"$priority_filter\"
            " "$file" 2>/dev/null)
        fi

        if [ "$MATCHES" = "true" ]; then
            TITLE=$(yq --front-matter '.title' "$file")
            echo "${file}: ${TITLE}"
        fi
    done
}

# Usage examples
filter_issues "open" "high"
filter_issues "open" "high" "bug"

Sort issues by field

# Sort by priority using yq
sort_by_priority() {
    cd ../issues

    # Create temp file with sortable data
    TMPFILE=$(mktemp)

    for file in *.md; do
        [ "$file" = "README.md" ] && continue
        [ -f "$file" ] || continue

        PRIORITY=$(yq --front-matter '.priority // "low"' "$file")
        TITLE=$(yq --front-matter '.title // ""' "$file")

        # Assign numeric values for sorting
        case "$PRIORITY" in
            critical) PNUM=4 ;;
            high)     PNUM=3 ;;
            medium)   PNUM=2 ;;
            low)      PNUM=1 ;;
            *)        PNUM=0 ;;
        esac

        echo "${PNUM}|${file}|${PRIORITY}|${TITLE}" >> "$TMPFILE"
    done

    # Sort and display
    sort -t'|' -k1 -rn "$TMPFILE" | while IFS='|' read -r num file priority title; do
        printf "%-20s %-8s %s\n" "$file" "$priority" "$title"
    done

    rm "$TMPFILE"
}

sort_by_priority

Sort by date modified

# Sort by last updated using yq
sort_by_updated() {
    cd ../issues

    # Create sortable list with timestamps
    for file in *.md; do
        [ "$file" = "README.md" ] && continue
        [ -f "$file" ] || continue

        UPDATED=$(yq --front-matter '.updated // .created // ""' "$file")
        TITLE=$(yq --front-matter '.title' "$file")
        STATUS=$(yq --front-matter '.status' "$file")

        echo "${UPDATED}|${file}|${STATUS}|${TITLE}"
    done | sort -r | while IFS='|' read -r updated file status title; do
        printf "%-20s %-10s %-10s %s\n" "$file" "$updated" "$status" "$title"
    done
}

sort_by_updated

What tissue does for you:

  1. Provides consistent formatted output
  2. Fast filtering without parsing every file
  3. Configurable display formats (table, compact, detailed)
  4. Efficient sorting algorithms
  5. Caching for repeated queries
  6. Color-coded output for terminals
  7. Pagination for long lists
  8. Export to various formats
  9. Integration with shell completion
  10. Performance optimization for large issue sets