beadboard/package.json
zenchantlive a2b0909724 fix: recover from mass file corruption incident (2026-02-15)
INCIDENT SUMMARY:
A catastrophic corruption event affected the working directory, with null
bytes (0x00) overwriting content in dozens of files including:
- package.json (corrupted)
- tailwind.config.ts (corrupted)
- All modified tracked files
- Untracked directories (components/ui/, node_modules/, .next/)

ROOT CAUSE:
Unknown - files were filled with null bytes, destroying their content.

RECOVERY PROCESS:
1. Discovered corruption when npm run dev failed with EJSONPARSE
2. Checked git diff --stat - showed many files as "binary"
3. Found dangling stash commits (0d80ad9, a1a33cf) containing our work
4. Restored tracked files from stash: git checkout a1a33cf -- .
5. Removed corrupted untracked directories (node_modules, .next, components/ui)
6. Reinstalled dependencies: npm install
7. Reinitialized shadcn/ui: npx shadcn@latest init
8. Reinstalled shadcn components: npx shadcn@latest add button card ...
9. Recreated earthy-dark tokens (bb-ui2.1) - lost in shadcn init overwrite
10. Verified all closed bb-ui2 beads still had their deliverables

DATA PRESERVED:
- All tracked source code (recovered from git stash)
- .beads/issues.jsonl (recovered from stash)
- All bead history and metadata

DATA LOST:
- Uncommitted changes to untracked files
- Earthy-dark tokens (recreated from bead spec)
- components/ui/ (regenerated from shadcn)

LESSONS LEARNED:
1. Commit work frequently - untracked changes are not protected
2. Git stash captures tracked files only
3. shadcn init overwrites globals.css - preserve tokens separately
4. Dangling commits can save the day

VERIFICATION POST-RECOVERY:
- npm run typecheck: PASS
- npm run lint: PASS
- npm run test: PASS
- All bb-ui2 closed bead deliverables present

CLOSES: bb-silver-castle (triage bead for this incident)
2026-02-15 21:19:58 -08:00

49 lines
1.6 KiB
JSON

{
"name": "beadboard",
"version": "0.1.0",
"private": true,
"license": "MIT",
"scripts": {
"dev": "next dev",
"build": "next build",
"start": "next start",
"lint": "eslint .",
"typecheck": "tsc --noEmit",
"test": "node --test tests/bootstrap.test.mjs && node --import tsx --test tests/components/sessions/sessions-header.test.ts && node --import tsx --test tests/components/sessions/agent-station-logic.test.ts && node --import tsx --test tests/lib/parser.test.ts && node --import tsx --test tests/lib/pathing.test.ts"
},
"dependencies": {
"@radix-ui/react-avatar": "^1.1.11",
"@radix-ui/react-dropdown-menu": "^2.1.16",
"@radix-ui/react-scroll-area": "^1.2.10",
"@radix-ui/react-separator": "^1.1.8",
"@radix-ui/react-slot": "^1.2.4",
"@radix-ui/react-tooltip": "^1.2.8",
"@xyflow/react": "^12.10.0",
"chokidar": "^5.0.0",
"class-variance-authority": "^0.7.1",
"clsx": "^2.1.1",
"dagre": "^0.8.5",
"framer-motion": "^11.18.2",
"lucide-react": "^0.564.0",
"next": "15.5.7",
"react": "19.2.1",
"react-dom": "19.2.1",
"tailwind-merge": "^3.4.1",
"tailwindcss-animate": "^1.0.7"
},
"devDependencies": {
"@playwright/test": "^1.58.2",
"@types/dagre": "^0.7.53",
"@types/node": "^22.10.0",
"@types/react": "^19.0.0",
"@types/react-dom": "^19.0.0",
"autoprefixer": "^10.4.24",
"eslint": "9.39.2",
"eslint-config-next": "16.1.6",
"playwright": "^1.58.2",
"postcss": "^8.5.6",
"tailwindcss": "^3.4.17",
"tsx": "^4.21.0",
"typescript": "^5.7.2"
}
}