Files
grimoire/AGENTS.md
Alejandro Gómez 80f63ad96a chore: modernization pass — dependencies and agentic setup
Dependencies
- 53 minor/patch bumps; low-risk majors (@types/node 26, globals 17,
  jsdom 30, shiki 4, tailwind-merge 3, framer-motion 13, js-yaml 5,
  sharp 0.35, unicode-emoji-json 0.9, eslint-plugin-react-refresh 0.5)
- lucide-react was pinned to "latest"; now a real range (^1.29.0)
- Tooling majors: eslint 10, @eslint/js 10, eslint-plugin-react-hooks 7,
  vite 8, @vitejs/plugin-react 6 (rolldown: build 8.8s -> 0.5s)
- Framework: applesauce 5->6, react-router 7->8, TypeScript 5.6->6.0.3
- Node: .nvmrc 26, engines >=24
- Remove @react-router/dev (unused, blocked resolution)

Breaking changes handled
- js-yaml 5 dropped its default export; nostr-schema.ts now uses a named
  import and @types/js-yaml is gone (types are bundled). Fixed 5 failing
  tests.
- applesauce 6 removed the legacy EventFactory/blueprint()/buildEvent.
  Migrated 12 files to v6 factory classes; post-hoc draft.tags.push()
  became .modifyPublicTags().
- ActionRunner now takes an EventSigner, not a factory. hub.ts passes a
  delegating signer that follows the active account, exposing nip04/nip44
  as getters so capability detection stays accurate.
- Delete src/lib/blueprints.ts: it existed only to add the NIP-30 emoji
  set address, which v6 supports natively (Emoji.address). Added
  toApplesauceEmoji/toApplesauceEmojis to convert Grimoire's address
  string to v6's AddressPointer.

Deferred, with reasons
- blossom-client-sdk 5: pins @cashu/cashu-ts ^2.4.3, irreconcilable with
  applesauce 6's ^4.5.1. npm overrides does not clear it.
- react-mosaic-component 7: the layout tree is a wire format — spellbooks
  publish it inside kind 30777 content. v7's n-ary shape would break every
  published spellbook; needs a versioned content format first.
- TypeScript 7: no typescript-eslint release accepts TS >=6.1, so lint
  would break. Landed 6.0.3 and removed the baseUrl TS 6 deprecates.

Lint rule triage
eslint 10 and react-hooks 7 promoted ~140 violations in pre-existing code
to errors. Eight rules are pinned to "warn" in eslint.config.js with
inline reasoning and a promote-per-rule path.

Agentic setup
- Fix the prettier PostToolUse hook: it used $FILEPATH, which Claude Code
  never sets (hooks receive JSON on stdin), so it silently no-opped. Now
  reads .tool_input.file_path; dropped the non-existent MultiEdit matcher.
- vitest was collecting .claude/worktrees git-worktree copies and running
  them against the root node_modules. Exclude .claude and .agents from
  vitest, eslint and prettier.
- CI: node 20 -> .nvmrc (mandatory: react-router 8 needs node >=22.22.0),
  checkout/setup-node v4 -> v6, add the missing lint job, matrix and
  concurrency cancellation.
- CLAUDE.md 495 -> 194 lines; reference material moved to docs/. Fixes a
  pointer to .claude/skills/tailwind-v4.md that never existed, and
  corrects the v5 factory API it documented. Symlink AGENTS.md.
- Replace the bespoke nostr skill with the official applesauce skill; add
  .mcp.json (applesauce + nostrbook MCP servers).
- Drop 11 stale settings.local.json permissions; gitignore agent scratch.

Verified: npm ci, lint (0 errors), 1475/1475 tests, build.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-07 12:22:51 +02:00

Symbolic link
9 B