refactor: rename Ephemeral → Wisp (Steam Engine metaphor)

Wisp = ephemeral vapor produced by the Steam Engine (Gas Town).
This aligns with the metaphor:
- Claude = Fire
- Claude Code = Steam
- Gas Town = Steam Engine
- Wisps = ephemeral vapor it produces

Changes:
- types.Issue.Ephemeral → types.Issue.Wisp
- types.IssueFilter.Ephemeral → types.IssueFilter.Wisp
- JSON field: "ephemeral" → "wisp"
- CLI flag: --ephemeral → --wisp (bd cleanup)
- All tests updated

Note: SQLite column remains "ephemeral" (no migration needed).
This is a breaking change for JSON consumers using 0.33.0.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
This commit is contained in:
Steve Yegge
2025-12-21 15:22:45 -08:00
parent 61361995cb
commit 358d076fde
23 changed files with 214 additions and 209 deletions

View File

@@ -704,20 +704,20 @@ func flushToJSONLWithState(state flushState) {
}
// Convert map to slice (will be sorted by writeJSONLAtomic)
// Filter out ephemeral issues - they should never be exported to JSONL (bd-687g)
// Ephemeral issues exist only in SQLite and are shared via .beads/redirect, not JSONL.
// Filter out wisps - they should never be exported to JSONL (bd-687g)
// Wisps exist only in SQLite and are shared via .beads/redirect, not JSONL.
// This prevents "zombie" issues that resurrect after mol squash deletes them.
issues := make([]*types.Issue, 0, len(issueMap))
ephemeralSkipped := 0
wispsSkipped := 0
for _, issue := range issueMap {
if issue.Ephemeral {
ephemeralSkipped++
if issue.Wisp {
wispsSkipped++
continue
}
issues = append(issues, issue)
}
if ephemeralSkipped > 0 {
debug.Logf("auto-flush: filtered %d ephemeral issues from export", ephemeralSkipped)
if wispsSkipped > 0 {
debug.Logf("auto-flush: filtered %d wisps from export", wispsSkipped)
}
// Filter issues by prefix in multi-repo mode for non-primary repos (fixes GH #437)