Tags Cleanup Skill
Analyze and normalize all tags in the Forest knowledge base to the canonical namespace:value format.
Tag Schema
Canonical format: namespace:value — lowercase, hyphens for multi-word, colon separator, no # prefix.
| Namespace | Purpose | Examples |
|---|---|---|
project | Which project | project:kingdom, project:forest |
domain | Top-level domain | domain:projects, domain:ideas |
tech | Technology | tech:rust, tech:python, tech:bevy |
status | Lifecycle | status:active, status:dormant |
category | Project category | category:roguelike, category:knowledge |
area | Feature area | area:cli, area:tags |
bug | Bug reports | bug:tags-normalization |
feature | Feature requests | feature:templates |
topic | Content topic | topic:worldbuilding, topic:ai |
pattern | Patterns | pattern:tooling, pattern:planning |
Workflow
Step 1: Audit current tags
Run forest tags list --json and analyze the output. Classify every tag into one of:
- •Clean: already matches
namespace:valuewith a valid namespace - •Rename: wrong format but has a clear canonical mapping (e.g.,
#project/foo→project:foo,rust→tech:rust) - •Delete: adds no value and should be removed from all nodes (e.g.,
source:Developer,tech:unknown,category:misc) - •Ambiguous: needs human decision
Report a summary table:
Tags Audit ────────── Total tags: N Clean: N (N%) Need rename: N Need delete: N Ambiguous: N
Step 2: Build normalization map
For each non-clean tag, determine the action:
Rename rules (in priority order):
- •
#namespace/value→namespace:value(strip#, replace/with:) - •
namespace/value→namespace:value(replace/with:) - •Bare language names →
tech:namespace (rust→tech:rust,python→tech:python) - •Bare topic words →
topic:namespace (writing→topic:writing) - •Merge duplicates to canonical form (e.g.,
#project/kingdom-rpg+#project/kingdom→project:kingdom) - •Multi-word values get hyphens (
layer builder→topic:layer-builder) - •Singular/plural merge to the more common form
Delete rules:
- •Tags that carry no information (
source:Developer,tech:unknown) - •Junk-drawer tags (
category:misc) - •Garbage values (malformed status strings, empty
bug/, emptyfeature/)
Present the full map to the user for confirmation before executing.
Step 3: Execute changes
If $ARGUMENTS contains --dry-run, stop after Step 2.
Otherwise, after user confirmation:
Renames — use forest tags rename:
forest tags rename "old-tag" "new-tag"
This is a bulk operation — it renames the tag across all nodes that have it. If the target tag already exists on a node, Forest merges them.
Deletions — Forest has no bulk tag delete. For each tag to delete:
- •Search for nodes with that tag:
forest search "<tag>" --limit 5 --json - •For each found node, remove the tag:
forest tags remove <node-id> "<tag>" - •Repeat until no more nodes are found
Run renames first, then deletions.
Step 4: Verify
Run forest tags list --json again and confirm:
- •Zero tags with
#prefix - •Zero tags with
/separator (should all use:) - •Zero bare tags (no namespace)
- •All namespaces are from the valid set
Report final counts.
Important Notes
- •Always confirm before executing. Show the full rename/delete plan and wait for approval.
- •
forest tags renameis the primary tool — it's bulk and handles merge conflicts. - •
forest tags remove <ref> <tag>removes a single tag from a single node. There is no bulk delete. - •Semantic search may not find all nodes for a given tag. If a tag persists after deletion attempts, report it and move on rather than looping.
- •Tags are case-sensitive in Forest.
Source:Developerandsource:Developerare different. - •Do not touch the SQLite database directly. All changes go through the Forest CLI.