Our review
Displays the status of EARS specifications for a project from the local specs directory.
Strengths
- Quick visualization of specifications by status (pending, doing, done)
- Works for a specific project or all projects
- Automatically parses .ears.md files to extract title, priority, and creation date
Limitations
- Only works with .ears.md files in a specific directory structure
- Does not update files, only displays status
- May be slow with a very large number of specifications
When you need a quick overview of the specification status for a project or all projects.
If you need to modify specifications or manage complex dependencies between them.
Security analysis
SafeThe script only reads and parses metadata from spec files in a fixed directory structure. No destructive commands, network calls, or execution of file content. Path traversal via argument is not a practical risk given user-invocation context.
No concerns found
Examples
/specs-status/specs-status all/specs-status my-project-namename: specs-status description: 현재 프로젝트의 EARS 스펙 상태 현황 표시 user-invocable: true
/specs-status [project|all]
현재 프로젝트 또는 지정된 프로젝트의 스펙 상태를 표시합니다.
Arguments
- 无参数 - 현재 디렉토리명을 프로젝트명으로 사용
- project-name - 지정된 프로젝트의 스펙만 표시
- all - 모든 프로젝트의 스펙을 표시
Implementation
specs-status() {
local SPECS_DIR="$HOME/.claude/specs"
local target_project="$1"
local projects=()
# Determine which projects to show
if [[ -z "$target_project" ]]; then
# No argument: use current directory basename
target_project="$(basename "$PWD")"
projects=("$target_project")
elif [[ "$target_project" == "all" ]]; then
# Show all projects
if [[ ! -d "$SPECS_DIR" ]]; then
echo "No specs directory found"
return 0
fi
# Get all subdirectories in specs directory
while IFS= read -r -d '' dir; do
projects+=("$(basename "$dir")")
done < <(find "$SPECS_DIR" -mindepth 1 -maxdepth 1 -type d -print0 | sort -z)
else
# Specific project
projects=("$target_project")
fi
# Exit if no projects found
if [[ ${#projects[@]} -eq 0 ]]; then
echo "No projects found"
return 0
fi
# Process each project
for project in "${projects[@]}"; do
local project_dir="$SPECS_DIR/$project"
echo ""
echo "## Specs Status: $project"
echo ""
# Check if project directory exists
if [[ ! -d "$project_dir" ]]; then
echo "No specs found for project $project"
continue
fi
# Track counts
local pending_count=0 doing_count=0 done_count=0
local pending_specs=() doing_specs=() done_specs=()
# Process each status directory
for status in pending doing done; do
local status_dir="$project_dir/$status"
if [[ ! -d "$status_dir" ]]; then
continue
fi
# Find all .ears.md files in status directory
while IFS= read -r -d '' spec_file; do
local spec_id
spec_id="$(basename "$spec_file" .ears.md)"
local title="" priority="" created=""
# Parse metadata from file using grep for safety
# Extract title (first line with # SPEC-ID: format, e.g., "# 001: Title")
title="$(grep -m1 "^# *[0-9]*: " "$spec_file" 2>/dev/null | sed 's/^# *[0-9]*: //')"
# Extract created date
created="$(grep '^-' "$spec_file" 2>/dev/null | grep 'created:' | sed 's/.*created: *//' | head -1)"
# Extract priority
priority="$(grep '^-' "$spec_file" 2>/dev/null | grep 'priority:' | sed 's/.*priority: *//' | head -1)"
# Default values if not found
[[ -z "$title" ]] && title="(no title)"
[[ -z "$priority" ]] && priority="medium"
[[ -z "$created" ]] && created="(unknown)"
case "$status" in
pending)
((pending_count++))
pending_specs+=("$spec_id|$title|$priority|$created")
;;
doing)
((doing_count++))
doing_specs+=("$spec_id|$title|$priority|$created")
;;
done)
((done_count++))
done_specs+=("$spec_id|$title|$priority|$created")
;;
esac
done < <(find "$status_dir" -maxdepth 1 -type f -name "*.ears.md" -print0 | sort -z)
done
# Display summary table
echo "| Status | Count |"
echo "|---------|-------|"
echo "| Pending | $pending_count |"
echo "| Doing | $doing_count |"
echo "| Done | $done_count |"
echo ""
# Check if any specs found
if [[ $pending_count -eq 0 && $doing_count -eq 0 && $done_count -eq 0 ]]; then
echo "No specs found for project $project"
continue
fi
# Display pending specs
if [[ $pending_count -gt 0 ]]; then
echo "### Pending"
for spec in "${pending_specs[@]}"; do
IFS='|' read -r spec_id spec_title spec_priority spec_created <<< "$spec"
echo "- **$spec_id**: $spec_title ($spec_priority) - created: $spec_created"
done
echo ""
fi
# Display doing specs
if [[ $doing_count -gt 0 ]]; then
echo "### Doing"
for spec in "${doing_specs[@]}"; do
IFS='|' read -r spec_id spec_title spec_priority spec_created <<< "$spec"
echo "- **$spec_id**: $spec_title ($spec_priority) - created: $spec_created"
done
echo ""
fi
# Display done specs
if [[ $done_count -gt 0 ]]; then
echo "### Done"
for spec in "${done_specs[@]}"; do
IFS='|' read -r spec_id spec_title spec_priority spec_created <<< "$spec"
echo "- **$spec_id**: $spec_title ($spec_priority) - created: $spec_created"
done
echo ""
fi
done
}
specs-status "$@"
API Documentation Generator
Documentation
Automatically generates OpenAPI/Swagger API documentation.
Technical Writer
Documentation
Writes clear technical documentation following top style guides.
Typed Documentation Forms System
Documentation
Add typed comments, documentation, todos, and metadata to Scheme code using `(doc ...)` forms. Doc annotations are authoritative for type inference, extracted by search commands (lf-todo, lf-types), and integrated with the type checker and LSP. Useful for annotating functions, marking deprecations, or tracking localized improvements alongside the code.