From ushabti
Mark a card as done by updating its status field to `done` and setting the updated timestamp. This replaces the old ticket archival system where tickets were moved to an `.archived/` directory.
How this skill is triggered — by the user, by Claude, or both
Slash command
/ushabti:complete-cardThe summary Claude sees in its skill listing — used to decide when to auto-load this skill
Mark a card as done by updating its status field to `done` and setting the updated timestamp. This replaces the old ticket archival system where tickets were moved to an `.archived/` directory.
Mark a card as done by updating its status field to done and setting the updated timestamp. This replaces the old ticket archival system where tickets were moved to an .archived/ directory.
Mark a card complete when:
Cards track their lifecycle state in the status frontmatter field:
todo: Not yet started (default for new cards)backlog: Deprioritized or deferredin-progress: Currently being worked ondone: Completed and closedCompleting a card means setting status: done.
When marking a card complete, also update the updated field to the current UTC time in ISO 8601 format: YYYY-MM-DDTHH:MM:SSZ
Example: 2026-02-08T14:30:00Z
Generate timestamp:
date -u +"%Y-%m-%dT%H:%M:%SZ"
CRITICAL: When updating a card, you MUST preserve all existing frontmatter fields, including fields you don't recognize. Hieroglyphs may add additional fields that agents don't know about. Dropping unknown fields will corrupt the card.
Strategy:
status and updated fields.ushabti/cards/{slug}/card.md exists--- delimiters)status field to doneupdated field to current UTC timeslug="improve-error-handling"
card_path=".ushabti/cards/${slug}/card.md"
# Verify card exists
if [ ! -f "$card_path" ]; then
echo "Error: Card not found: $card_path"
exit 1
fi
# Generate new timestamp
timestamp=$(date -u +"%Y-%m-%dT%H:%M:%SZ")
# Read current card
current_content=$(cat "$card_path")
# Update status and timestamp using sed
# This example assumes frontmatter is well-formed
updated_content=$(echo "$current_content" | sed "s/^status: .*/status: done/" | sed "s/^updated: .*/updated: ${timestamp}/")
# Write back
echo "$updated_content" > "$card_path"
echo "Card ${slug} marked as done"
For more robust parsing that preserves unknown fields:
slug="example-card"
card_path=".ushabti/cards/${slug}/card.md"
timestamp=$(date -u +"%Y-%m-%dT%H:%M:%SZ")
# Create temporary file
temp_file=$(mktemp)
# Update frontmatter while preserving structure
awk -v ts="$timestamp" '
BEGIN { in_frontmatter=0; first_delimiter=0 }
/^---$/ {
if (!first_delimiter) { first_delimiter=1; in_frontmatter=1 }
else if (in_frontmatter) { in_frontmatter=0 }
print; next
}
in_frontmatter && /^status:/ { print "status: done"; next }
in_frontmatter && /^updated:/ { print "updated: " ts; next }
{ print }
' "$card_path" > "$temp_file"
# Replace original
mv "$temp_file" "$card_path"
After updating, verify the changes:
# Check status field
grep '^status:' "$card_path"
# Expected: status: done
# Check updated timestamp
grep '^updated:' "$card_path"
# Expected: updated: <current timestamp>
# Verify frontmatter is still valid YAML
sed -n '/^---$/,/^---$/p' "$card_path" | sed '1d;$d'
Issue: Frontmatter order changes during update Solution: Manually restore alphabetical order or use YAML-aware tools
Issue: Unknown fields dropped during update Solution: Parse more carefully, preserving all fields not explicitly updated
Issue: Markdown body corrupted
Solution: Only modify the frontmatter section; everything after the closing --- should remain unchanged
.ushabti/cards/ (they are NOT moved to a separate directory)status: done should be excluded from "open work" listingsupdated timestamp tracks the last modification time (creation, status change, or any other update)npx claudepluginhub adamrdrew/marketplace --plugin ushabtiManage a Markdown-based Kanban board using card files in a kanban/ directory (including kanban/archived/ for completed cards). Use when the user asks to create, move, view, list, or manage tasks or cards on a kanban board, or when tracking work items across statuses like backlog, todo, doing, done, or archive.
Updates fields like status, priority, title, tags, dependencies in existing task Markdown files using Glob, Read, and Edit tools. Use for modifying task properties via natural language input.
Updates frontmatter fields (status, priority, tags, parent, title) on existing work items. Resolves work items by ID or path, reads current frontmatter, and applies arbitrary field changes without transition enforcement.