{"_id":"@alive-game/alive-tagger","_rev":"7-f6f1f973459c9729e3bf24922d52f9c1","name":"@alive-game/alive-tagger","dist-tags":{"latest":"0.2.1"},"versions":{"0.1.0":{"name":"@alive-game/alive-tagger","version":"0.1.0","keywords":["vite","plugin","react","element-selection","source-tagging","claude-bridge"],"author":{"name":"WebAlive"},"license":"MIT","_id":"@alive-game/alive-tagger@0.1.0","maintainers":[{"name":"alive-comp","email":"team@goalive.nl"}],"dist":{"shasum":"f91bf98d31af90d055624ceeedd1de61172b4e0a","tarball":"https://registry.npmjs.org/@alive-game/alive-tagger/-/alive-tagger-0.1.0.tgz","fileCount":10,"integrity":"sha512-kK/4vOFoYTTPeMWXiXabB+536LMWY1M3FQ9QR+0zXZmq9dnhunnxF4BBuTNK0CKm2Mtrcp47hfmFIpDAyemPlQ==","signatures":[{"sig":"MEUCIQDG/q+EnMvkfAGrmcUAInXGMqu3KP27f5BntvBEERrWbgIgWns2ImScMmZ8ODmj3lGz/uK84zKErmHgl0tlpvlGNag=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":83742},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"},"./client":{"types":"./dist/client.d.ts","import":"./dist/client.js"}},"gitHead":"7a711d3a19b1006956b1e5ebaff4911f8bd840ea","scripts":{"dev":"tsup --watch","lint":"biome lint ./src ./test","test":"vitest run","build":"tsup","clean":"rm -rf dist","format":"biome format --write ./src ./test","test:watch":"vitest","type-check":"tsc --noEmit"},"_npmUser":{"name":"alive-comp","email":"team@goalive.nl"},"_npmVersion":"10.8.2","description":"Element selection and source tagging for Claude Bridge sandbox","directories":{},"_nodeVersion":"20.19.5","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.0.0","vite":"^5.4.0","vitest":"^2.0.0","typescript":"^5.5.0","@types/node":"^22.0.0"},"peerDependencies":{"vite":">=5.0.0"},"_npmOperationalInternal":{"tmp":"tmp/alive-tagger_0.1.0_1765309562493_0.42366533811906826","host":"s3://npm-registry-packages-npm-production"}},"0.1.1":{"name":"@alive-game/alive-tagger","version":"0.1.1","keywords":["vite","plugin","react","element-selection","source-tagging","claude-bridge"],"author":{"name":"WebAlive"},"license":"MIT","_id":"@alive-game/alive-tagger@0.1.1","maintainers":[{"name":"alive-comp","email":"team@goalive.nl"}],"dist":{"shasum":"625c7f3dcc59a69c6949ce34ab5630b7f36e4c78","tarball":"https://registry.npmjs.org/@alive-game/alive-tagger/-/alive-tagger-0.1.1.tgz","fileCount":10,"integrity":"sha512-ozWCODSgfe+Xy1p2ppUVyRodxDYsKhsxR0KPli/ythaeRALqTQXnaDYmwuynctD05a7LqOnPlRAX/2NSkGwc2g==","signatures":[{"sig":"MEQCIHsxe6yQOejwpsTLNChrvla/BFoVgrYrzy6tvgHJ522+AiB3srwbzs/VCZS24Msi/97jIF5BDpuxbCF5TRiyKeMXcA==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":83727},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"},"./client":{"types":"./dist/client.d.ts","import":"./dist/client.js"}},"gitHead":"eb569a538d8cd655e7d9ebf65a4fb7b6e60769a0","scripts":{"dev":"tsup --watch","lint":"biome lint ./src ./test","test":"vitest run","build":"tsup","clean":"rm -rf dist","format":"biome format --write ./src ./test","test:watch":"vitest","type-check":"tsc --noEmit"},"_npmUser":{"name":"alive-comp","email":"team@goalive.nl"},"_npmVersion":"10.8.2","description":"Element selection and source tagging for Claude Bridge sandbox","directories":{},"_nodeVersion":"20.19.5","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.0.0","vite":"^5.4.0","vitest":"^2.0.0","typescript":"^5.5.0","@types/node":"^22.0.0"},"peerDependencies":{"vite":">=5.0.0"},"_npmOperationalInternal":{"tmp":"tmp/alive-tagger_0.1.1_1765335042041_0.78835776465407","host":"s3://npm-registry-packages-npm-production"}},"0.1.3":{"name":"@alive-game/alive-tagger","version":"0.1.3","keywords":["vite","plugin","react","element-selection","source-tagging","claude-bridge"],"author":{"name":"WebAlive"},"license":"MIT","_id":"@alive-game/alive-tagger@0.1.3","maintainers":[{"name":"alive-comp","email":"team@goalive.nl"}],"dist":{"shasum":"1059b7fb1d1995d2f824602a31d61d15d914fdda","tarball":"https://registry.npmjs.org/@alive-game/alive-tagger/-/alive-tagger-0.1.3.tgz","fileCount":10,"integrity":"sha512-NpERzr2IAJa4epbxkCBqPJaqg108+MCmTLShaRivd4f6yhzXolO2bdcY4X64gMtQTmNxQOwcTH5F3f1ZKGkXjQ==","signatures":[{"sig":"MEYCIQC7Q30/qbCu0Gw5zDMreqwIXYn2ctcM9/chpUKdsLQMMgIhAJjPFUNELuM92dW0TLEWL3MI5c6NhTMRkpvK8IttBI0J","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":86129},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"},"./client":{"types":"./dist/client.d.ts","import":"./dist/client.js"}},"gitHead":"944a89f184a9c885d7e2ef7074bf02dd5b8e5fe4","scripts":{"dev":"tsup --watch","lint":"biome lint ./src ./test","test":"vitest run","build":"tsup","clean":"rm -rf dist","format":"biome format --write ./src ./test","test:watch":"vitest","type-check":"tsc --noEmit"},"_npmUser":{"name":"alive-comp","email":"team@goalive.nl"},"_npmVersion":"10.8.2","description":"Element selection and source tagging for Claude Bridge sandbox","directories":{},"_nodeVersion":"20.19.5","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.0.0","vite":"^5.4.0","vitest":"^2.0.0","typescript":"^5.5.0","@types/node":"^22.0.0"},"peerDependencies":{"vite":">=5.0.0"},"_npmOperationalInternal":{"tmp":"tmp/alive-tagger_0.1.3_1766581978997_0.46298524844117095","host":"s3://npm-registry-packages-npm-production"}},"0.1.4":{"name":"@alive-game/alive-tagger","version":"0.1.4","keywords":["vite","plugin","react","element-selection","source-tagging","claude-bridge"],"author":{"name":"WebAlive"},"license":"MIT","_id":"@alive-game/alive-tagger@0.1.4","maintainers":[{"name":"alive-comp","email":"team@goalive.nl"}],"dist":{"shasum":"d799b7d2f495409a9c170e9d0081a8004f452cab","tarball":"https://registry.npmjs.org/@alive-game/alive-tagger/-/alive-tagger-0.1.4.tgz","fileCount":10,"integrity":"sha512-+rcbrlUFG8SAKoQSvvp+Bi/9gOCEI+KYUFUol8fV8UnrZ9laxFAAbHLd+DgKF7l1Wtv0HXPHrEz/Se9ENyB4cA==","signatures":[{"sig":"MEUCIBqZIQElAQ2/ThVmJvqwF0H2RRGxUdWWnptM8Nt224X7AiEAtw2cwq7UaM3qBv7ireXwtc4D4lJIJDo2SF6JSzNhI4A=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":88558},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"},"./client":{"types":"./dist/client.d.ts","import":"./dist/client.js"}},"gitHead":"5c2ef2176d7ed29786f77780f04b2b424f59589c","scripts":{"dev":"tsup --watch","lint":"biome lint ./src ./test","test":"vitest run","build":"tsup","clean":"rm -rf dist","format":"biome format --write ./src ./test","test:watch":"vitest","type-check":"tsc --noEmit"},"_npmUser":{"name":"alive-comp","email":"team@goalive.nl"},"_npmVersion":"10.9.4","description":"Element selection and source tagging for Claude Bridge sandbox","directories":{},"_nodeVersion":"22.22.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.0.0","vite":"^5.4.0","vitest":"^2.0.0","typescript":"^5.5.0","@types/node":"^22.0.0"},"peerDependencies":{"vite":">=5.0.0"},"_npmOperationalInternal":{"tmp":"tmp/alive-tagger_0.1.4_1769721147780_0.43724950856818956","host":"s3://npm-registry-packages-npm-production"}},"0.2.0":{"name":"@alive-game/alive-tagger","version":"0.2.0","keywords":["vite","plugin","react","element-selection","source-tagging","alive"],"author":{"name":"WebAlive"},"license":"MIT","_id":"@alive-game/alive-tagger@0.2.0","maintainers":[{"name":"eenlars","email":"eedenlars@gmail.com"},{"name":"alive-comp","email":"team@goalive.nl"}],"dist":{"shasum":"103c35d82fc30029e185ce5a604e74fb10d149c8","tarball":"https://registry.npmjs.org/@alive-game/alive-tagger/-/alive-tagger-0.2.0.tgz","fileCount":26,"integrity":"sha512-bKklOp2JGSxksBLIwccS6PkMufHLLgDR+6z1roVBI5AANe2ScIZj+X+EfABnubC9qNLv2EdxktQG/1m2iJNoMw==","signatures":[{"sig":"MEUCIDGcURlPZo7uTd/9MwF1hm3C/IVjU28AM+dChmphKagCAiEAuHcl057dazzJcU298AbBzdaB4tjkFNXoYznyOoXbIVE=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":91956},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"},"./client":{"types":"./dist/client.d.ts","import":"./dist/client.js"}},"scripts":{"dev":"tsc --watch","test":"vitest run","build":"bun scripts/generate-client-inline.ts && rm -rf dist && tsc","clean":"rm -rf dist","test:watch":"vitest","type-check":"tsgo --noEmit && tsgo --noEmit --project tsconfig.test.json"},"_npmUser":{"name":"eenlars","email":"eedenlars@gmail.com"},"_npmVersion":"11.12.1","description":"Element selection and source tagging for Alive workbench","directories":{},"_nodeVersion":"26.0.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"vite":"^8.0.1","vitest":"^4.1.9","esbuild":"^0.28.0","typescript":"^5.9.3","@types/node":"^25.5.0","@webalive/tsconfig":"workspace:*"},"peerDependencies":{"vite":">=5.0.0","react":">=18.0.0"},"_npmOperationalInternal":{"tmp":"tmp/alive-tagger_0.2.0_1781650673242_0.0815907901073274","host":"s3://npm-registry-packages-npm-production"}},"0.2.1":{"name":"@alive-game/alive-tagger","version":"0.2.1","description":"Element selection and source tagging for Alive workbench","type":"module","main":"./dist/index.js","types":"./dist/index.d.ts","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"},"./client":{"types":"./dist/client.d.ts","import":"./dist/client.js"}},"publishConfig":{"access":"public"},"scripts":{"build":"bun scripts/generate-client-inline.ts && rm -rf dist && tsc","dev":"tsc --watch","type-check":"tsgo --noEmit && tsgo --noEmit --project tsconfig.test.json","clean":"rm -rf dist","test":"vitest run","test:watch":"vitest"},"keywords":["vite","plugin","react","element-selection","source-tagging","alive"],"author":{"name":"WebAlive"},"license":"MIT","peerDependencies":{"react":">=18.0.0","vite":">=5.0.0"},"devDependencies":{"@types/node":"^25.5.0","@webalive/tsconfig":"workspace:*","esbuild":"^0.28.0","typescript":"^5.9.3","vite":"^8.0.1","vitest":"^4.1.9"},"_id":"@alive-game/alive-tagger@0.2.1","_nodeVersion":"26.0.0","_npmVersion":"11.12.1","dist":{"integrity":"sha512-GChgHWPqU/B2ckHDuqcrWEMoe1UTBhnASSNL7a0shKiTRol63QEtF4IGj2BUWxb/RguO5nW5UDnIMZMDuN62Xg==","shasum":"0c66d6977733b9a687013a21d0e8649e2fc26662","tarball":"https://registry.npmjs.org/@alive-game/alive-tagger/-/alive-tagger-0.2.1.tgz","fileCount":26,"unpackedSize":91991,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEQCID2LEFvJsZddoowvB4PPiFGauWx5+oZFYYsAbmEPaWFUAiAYp4gRjRd/MUuuWBc5UoIURLOwbBpQyVhDaivclj2qfw=="}]},"_npmUser":{"name":"eenlars","email":"eedenlars@gmail.com"},"directories":{},"maintainers":[{"name":"eenlars","email":"eedenlars@gmail.com"},{"name":"alive-comp","email":"team@goalive.nl"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/alive-tagger_0.2.1_1781650915624_0.34487242539097385"},"_hasShrinkwrap":false}},"time":{"created":"2025-12-09T19:46:02.358Z","modified":"2026-06-16T23:01:55.939Z","0.1.0":"2025-12-09T19:46:02.632Z","0.1.1":"2025-12-10T02:50:42.191Z","0.1.3":"2025-12-24T13:12:59.170Z","0.1.4":"2026-01-29T21:12:27.926Z","0.2.0":"2026-06-16T22:57:53.386Z","0.2.1":"2026-06-16T23:01:55.775Z"},"author":{"name":"WebAlive"},"license":"MIT","keywords":["vite","plugin","react","element-selection","source-tagging","alive"],"description":"Element selection and source tagging for Alive workbench","maintainers":[{"name":"eenlars","email":"eedenlars@gmail.com"},{"name":"alive-comp","email":"team@goalive.nl"}],"readme":"# @alive-game/alive-tagger\n\nElement selection and source tagging for Alive workbench. Enables click-to-select UI elements with source file information, allowing Claude to know exactly which component and file the user is referring to.\n\n## Features\n\n- **JSX Source Tagging**: Attaches source file info (fileName, lineNumber, columnNumber) to every DOM element at build time\n- **Element Selection**: Client script for click-to-select element selection with visual feedback (activated by the workbench select button)\n- **PostMessage Bridge**: Sends selected element context to parent frame for Claude integration\n\n## Installation\n\n```bash\n# In your Vite React project\nbun add @alive-game/alive-tagger\n```\n\n## Usage\n\n### Vite Plugin (Required)\n\nAdd the plugin to your `vite.config.ts`:\n\n```typescript\nimport { aliveTagger } from \"@alive-game/alive-tagger\"\n\nexport default defineConfig(({ mode }) => ({\n  plugins: [\n    react(),\n    mode === \"development\" && aliveTagger()\n  ].filter(Boolean),\n}))\n```\n\n### Client Script (Optional - for iframe selection UI)\n\nThe client script provides click-to-select with visual feedback. It's automatically initialized when imported:\n\n```typescript\n// In your app entry point (only needed if in iframe)\nimport \"@alive-game/alive-tagger/client\"\n```\n\nOr inject via HTML:\n\n```html\n<script type=\"module\">\n  import { initAliveTagger } from \"@alive-game/alive-tagger/client\"\n  initAliveTagger()\n</script>\n```\n\n## How It Works\n\n### 1. JSX Source Tagging (Vite Plugin)\n\nThe plugin intercepts React's `jsx-dev-runtime` and wraps the `jsxDEV` function to inject refs that store source information on DOM nodes:\n\n```javascript\n// Every DOM element gets this attached via Symbol:\nelement[Symbol.for(\"__aliveSource__\")] = {\n  fileName: \"client/pages/Index.tsx\",\n  lineNumber: 42,\n  columnNumber: 8,\n  displayName: \"Button\"\n}\n\n// Global map for reverse lookups:\nwindow.aliveSourceMap = Map<string, Set<WeakRef<Element>>>\n```\n\n### 2. Element Selection (Client Script)\n\nWhen running in an iframe:\n\n1. **Activate**: The parent frame posts `TAGGER_ACTIVATE` (the workbench select button); cursor becomes crosshair\n2. **Hover**: Elements with source info get highlighted with green border and label showing `ComponentName · path/to/file.tsx:line`\n3. **Click**: Captures element context and sends to parent frame via postMessage\n\n### 3. PostMessage Communication\n\nSelected element context is sent to the parent frame:\n\n```typescript\nwindow.parent.postMessage({\n  type: \"alive-element-selected\",\n  context: {\n    fileName: \"client/pages/Index.tsx\",\n    lineNumber: 42,\n    columnNumber: 8,\n    displayName: \"Button\",\n    html: \"<button class='...'>Click me</button>\",\n    tagName: \"button\",\n    className: \"btn-primary\",\n    id: \"submit-btn\",\n    parentComponents: [\"Form\", \"Page\"]\n  }\n}, \"*\")\n```\n\n## API Reference\n\n### Plugin Options\n\n```typescript\ninterface AliveTaggerOptions {\n  /** Enable source tagging (default: true in dev mode) */\n  enabled?: boolean\n  /** Enable debug logging */\n  debug?: boolean\n}\n\naliveTagger({ enabled: true, debug: false })\n```\n\n### Types\n\n```typescript\nimport {\n  SOURCE_KEY,                    // Symbol.for(\"__aliveSource__\")\n  ELEMENT_SELECTED_MESSAGE_TYPE, // \"alive-element-selected\"\n  type SourceInfo,\n  type ElementSelectedContext,\n  type ElementSelectedMessage,\n  type AliveTaggerOptions,\n} from \"@alive-game/alive-tagger\"\n```\n\n### Utility Functions\n\n```typescript\nimport {\n  getElementSource,      // Get source info from element\n  hasSourceInfo,         // Check if element has source info\n  formatSourceLocation,  // Format as \"file.tsx:42:8\"\n  isElementSelectedMessage, // Type guard for messages\n} from \"@alive-game/alive-tagger\"\n\n// Example usage\nconst source = getElementSource(document.querySelector(\"button\"))\nif (source) {\n  console.log(formatSourceLocation(source)) // \"client/pages/Index.tsx:42:8\"\n}\n```\n\n### Client Functions\n\n```typescript\nimport { initAliveTagger } from \"@alive-game/alive-tagger/client\"\n\n// Initialize selector (auto-called on import, but can be manual)\nconst cleanup = initAliveTagger()\n\n// Later: cleanup()\n```\n\n## Architecture\n\n```\n┌─────────────────────────────────────────────────────────────────────────┐\n│  Alive (terminal.alive.best)                                    │\n│  ┌──────────────────────┐  ┌──────────────────────────────────────────┐ │\n│  │  Chat Interface      │  │  Workbench Component                       │ │\n│  │                      │  │  - Listens for 'alive-element-selected'  │ │\n│  │  Shows selected      │◀─┤  - Displays source info to user          │ │\n│  │  element context     │  │  - Injects into next Claude message      │ │\n│  └──────────────────────┘  └──────────────────────────────────────────┘ │\n└─────────────────────────────────────────────────────────────────────────┘\n                                        ▲\n                                        │ postMessage\n┌─────────────────────────────────────────────────────────────────────────┐\n│  User Site (in preview iframe)                                          │\n│  ┌───────────────────────────────────────────────────────────────────┐  │\n│  │  alive-tagger plugin (Vite)                                       │  │\n│  │  - Intercepts jsx-dev-runtime                                     │  │\n│  │  - Attaches Symbol.for('__aliveSource__') to every DOM element    │  │\n│  │  - Maintains window.aliveSourceMap for lookups                    │  │\n│  └───────────────────────────────────────────────────────────────────┘  │\n│  ┌───────────────────────────────────────────────────────────────────┐  │\n│  │  alive-tagger/client (optional)                                   │  │\n│  │  - Handles click-to-select (button-activated)                     │  │\n│  │  - Visual highlight on hover                                      │  │\n│  │  - Posts context to parent frame                                  │  │\n│  └───────────────────────────────────────────────────────────────────┘  │\n└─────────────────────────────────────────────────────────────────────────┘\n```\n\n## Comparison: alive-tagger vs React Grab\n\n| Feature | alive-tagger | React Grab |\n|---------|-------------|------------|\n| **Approach** | Vite plugin + client | Runtime fiber traversal |\n| **Data attachment** | Build-time via refs | Runtime fiber inspection |\n| **Symbol key** | `__aliveSource__` | `__jsxSource__` |\n| **Selection UI** | Built-in (button-activated click) | Built-in |\n| **Communication** | postMessage | HTTP localhost:4567 |\n| **Env requirement** | None (dev mode auto) | None |\n| **Designed for** | Alive iframe | Claude Agent SDK CLI |\n\n## Integration with Alive\n\nThe alive-tagger is integrated with Alive's workbench preview. When a user activates the select button and clicks an element:\n\n1. **Workbench receives postMessage**: `Workbench.tsx` and `WorkbenchMobile.tsx` listen for `alive-element-selected` messages\n2. **Context propagates via WorkbenchContext**: The selection is passed through `useWorkbenchContext()`\n3. **Chat input auto-fills**: The selected element is formatted as `@ComponentName in src/path/file.tsx:lineNumber` and inserted into the chat input\n4. **User can send to Claude**: The reference helps Claude understand exactly which element/component to modify\n\n### Key files:\n- `apps/web/features/chat/lib/workbench-context.tsx` - Context with `setSelectedElement` and `registerElementSelectHandler`\n- `apps/web/features/chat/components/workbench/Workbench.tsx` - Listens for postMessage, calls `setSelectedElement`\n- `apps/web/app/chat/page.tsx` - Registers handler to insert selection into chat input\n\n### Caddy Configuration\n\nFor HMR to work properly in the workbench iframe, the preview domain **must NOT** use `forward_auth`. The auth check interferes with WebSocket connections and causes the iframe to flash/reload every few seconds.\n\nPreview domain Caddy configs must be generated WITHOUT `forward_auth` to avoid this issue.\n\n## Development\n\n```bash\n# Build\nbun run build\n\n# Watch mode\nbun run dev\n\n# Type check\nbun run type-check\n\n# Run tests\nbun run test\n```\n\n## Files\n\n```\npackages/alive-tagger/\n├── src/\n│   ├── index.ts      # Main exports (plugin + utilities)\n│   ├── plugin.ts     # Vite plugin\n│   ├── client.ts     # Client selection script\n│   └── types.ts      # TypeScript types\n├── dist/             # Built output\n├── package.json\n├── tsconfig.json\n└── tsup.config.ts\n```\n\n## Security Considerations\n\n1. **Development only**: Source tagging only active in dev mode\n2. **No production impact**: Plugin does nothing in production builds\n3. **File paths**: Relative paths exposed (not full system paths)\n4. **node_modules filtered**: Library internals not tagged\n\n## License\n\nMIT\n","readmeFilename":"README.md"}