{"_id":"420kit-shared","_rev":"4-de5437825d8917c58b5a4473b87228da","name":"420kit-shared","dist-tags":{"latest":"1.0.3"},"versions":{"1.0.0":{"name":"420kit-shared","version":"1.0.0","keywords":["phrase-system","media-generator","build-tools","static-site","content-management","247420","schwepe","shared-library"],"author":{"name":"420Kit Collective"},"license":"MIT","_id":"420kit-shared@1.0.0","maintainers":[{"name":"lanmower","email":"almagestfraternite@gmail.com"}],"homepage":"https://github.com/420kit/shared#readme","bugs":{"url":"https://github.com/420kit/shared/issues"},"dist":{"shasum":"f09a887e856a11b793ff8c867542d7aff347aecf","tarball":"https://registry.npmjs.org/420kit-shared/-/420kit-shared-1.0.0.tgz","fileCount":2,"integrity":"sha512-9CtwZraBh0cwslQXoPaDlL03MoqC7BXnXatBQo3ck2hyhPO2r+rrxqPjpjwJbKskS1e5lMhsWmoGTyAWPrIkIw==","signatures":[{"sig":"MEUCIQD03Mg1aBYQecSX7cTIz5xGfd6qMOvsNXea40xAwqQsnAIgCiDZ7HmXo4iud2yGJ66xbyylyUP7g5Dn6lxqfRGxqtk=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":14462},"jest":{"testMatch":["**/tests/**/*.test.js"],"transform":{},"collectCoverage":false,"testEnvironment":"node","coverageThreshold":{"global":{"lines":90,"branches":90,"functions":90,"statements":90}},"collectCoverageFrom":["src/**/*.js","!src/**/*.test.js"]},"main":"./index.js","type":"module","types":"./index.d.ts","engines":{"node":">=18.0.0"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"},"./build-tools":{"types":"./dist/build-tools.d.ts","import":"./dist/build-tools.js"},"./phrase-system":{"types":"./dist/phrase-system.d.ts","import":"./dist/phrase-system.js"},"./media-generator":{"types":"./dist/media-generator.d.ts","import":"./dist/media-generator.js"},"./config-templates":{"types":"./dist/config-templates.d.ts","import":"./dist/config-templates.js"}},"gitHead":"04f024ea1482691ae84bde71d8da2e827f02cd42","scripts":{},"_npmUser":{"name":"lanmower","email":"almagestfraternite@gmail.com"},"repository":{"url":"git+https://github.com/420kit/shared.git","type":"git"},"_npmVersion":"10.8.2","description":"Shared library for 247420 and Schwepe projects - eliminating code duplication with common utilities","directories":{},"_nodeVersion":"20.19.4","dependencies":{},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"peerDependencies":{"chokidar":"^3.5.0"},"peerDependenciesMeta":{"chokidar":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/420kit-shared_1.0.0_1759755699601_0.04037752929994065","host":"s3://npm-registry-packages-npm-production"}},"1.0.1":{"name":"420kit-shared","version":"1.0.1","keywords":["phrase-system","media-generator","build-tools","static-site","content-management","247420","schwepe","shared-library"],"author":{"name":"420Kit Collective"},"license":"MIT","_id":"420kit-shared@1.0.1","maintainers":[{"name":"lanmower","email":"almagestfraternite@gmail.com"}],"homepage":"https://github.com/420kit/shared#readme","bugs":{"url":"https://github.com/420kit/shared/issues"},"dist":{"shasum":"a1fd8b4e27f2ed8296b903e408d8ae143d4a7432","tarball":"https://registry.npmjs.org/420kit-shared/-/420kit-shared-1.0.1.tgz","fileCount":13,"integrity":"sha512-39zoJZ4PvBQoXjvjP/uRlZmyh1Nc8ULeCk5aWTCkpy95gZQaxmvFXd4KUb6AFL7Dga4p8h9cuBC7az6Dm4pw4w==","signatures":[{"sig":"MEUCIQD0vps2NBCZL8e/RMluzOganY9znLCcASyjwSpdy8zY8QIgG7TkcBWJyzyqbRkrQNkCONDI/Ozop+krv6+N0Sm7bos=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":162576},"main":"dist/index.js","type":"module","types":"dist/index.d.ts","engines":{"node":">=18.0.0"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"},"./build-tools":{"types":"./dist/build-tools.d.ts","import":"./dist/build-tools.js"},"./phrase-system":{"types":"./dist/phrase-system.d.ts","import":"./dist/phrase-system.js"},"./media-generator":{"types":"./dist/media-generator.d.ts","import":"./dist/media-generator.js"},"./config-templates":{"types":"./dist/config-templates.d.ts","import":"./dist/config-templates.js"}},"gitHead":"2f018c0139b851d369b5687442e7947fb2e0c677","scripts":{"dev":"npm run build && npm run watch","lint":"eslint src/**/*.js tests/**/*.js","test":"node --experimental-vm-modules node_modules/.bin/jest","build":"npm run clean && npm run build:modules","clean":"rimraf dist","watch":"concurrently \"npm run build:modules -- --watch\" \"npm run build:types -- --watch\"","prepare":"npm run build","version":"npm run build","preversion":"npm run test","test:watch":"node --experimental-vm-modules node_modules/.bin/jest --watch","build:types":"tsc --declaration --emitDeclarationOnly --outDir dist","postversion":"git push && git push --tags","build:modules":"node build.js build","test:coverage":"node --experimental-vm-modules node_modules/.bin/jest --coverage","prepublishOnly":"echo 'Skipping tests for publishing'"},"_npmUser":{"name":"lanmower","email":"almagestfraternite@gmail.com"},"repository":{"url":"git+https://github.com/420kit/shared.git","type":"git"},"_npmVersion":"10.8.2","description":"Shared library for 247420 and Schwepe projects - eliminating code duplication with common utilities","directories":{},"_nodeVersion":"20.19.4","dependencies":{"fast-video-metadata":"^1.0.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^29.5.0","eslint":"^9.0.0","rimraf":"^6.0.0","typescript":"^5.0.0","@types/jest":"^29.5.0","@types/node":"^24.5.2","concurrently":"^9.1.0"},"peerDependencies":{"chokidar":"^3.5.0"},"peerDependenciesMeta":{"chokidar":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/420kit-shared_1.0.1_1759832825869_0.9825374414660695","host":"s3://npm-registry-packages-npm-production"}},"1.0.2":{"name":"420kit-shared","version":"1.0.2","keywords":["phrase-system","media-generator","build-tools","static-site","content-management","247420","schwepe","shared-library","tv-guide","crt-effects","retro-interface"],"author":{"name":"420Kit Collective"},"license":"MIT","_id":"420kit-shared@1.0.2","maintainers":[{"name":"lanmower","email":"almagestfraternite@gmail.com"}],"homepage":"https://github.com/420kit/shared#readme","bugs":{"url":"https://github.com/420kit/shared/issues"},"dist":{"shasum":"6cbeb7dcfbf92399a6ad92ef5974a7256c198227","tarball":"https://registry.npmjs.org/420kit-shared/-/420kit-shared-1.0.2.tgz","fileCount":18,"integrity":"sha512-FruURAwd4zZKy1IsOa4dlM6soZ4E80jxBHECJIpyZNePnz62t8EmDS5LskSNS2VNqMPFXlKJsFWmGVlkF1eOXA==","signatures":[{"sig":"MEUCIQDXCDi7Ck3bZjuyi1bFZNxhOlgXj1vzPdeBelgTyGbzmAIgcBj8HypChTGbYoDVCLNqClgAfUhn/4a9GNu043f9tVA=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":179214},"main":"dist/index.js","type":"module","types":"dist/index.d.ts","engines":{"node":">=18.0.0"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"},"./tv-guide":{"types":"./dist/tv-guide.d.ts","import":"./dist/tv-guide.js"},"./build-tools":{"types":"./dist/build-tools.d.ts","import":"./dist/build-tools.js"},"./phrase-system":{"types":"./dist/phrase-system.d.ts","import":"./dist/phrase-system.js"},"./media-generator":{"types":"./dist/media-generator.d.ts","import":"./dist/media-generator.js"},"./config-templates":{"types":"./dist/config-templates.d.ts","import":"./dist/config-templates.js"}},"gitHead":"e5499e7caf57f6fca3fe35aac43490aef7328f6a","scripts":{"dev":"npm run build && npm run watch","lint":"eslint src/**/*.js tests/**/*.js","test":"node --experimental-vm-modules node_modules/.bin/jest","build":"npm run clean && npm run build:modules","clean":"rimraf dist","watch":"concurrently \"npm run build:modules -- --watch\" \"npm run build:types -- --watch\"","prepare":"npm run build","version":"npm run build","preversion":"echo 'Skipping tests for versioning'","test:watch":"node --experimental-vm-modules node_modules/.bin/jest --watch","build:types":"tsc --declaration --emitDeclarationOnly --outDir dist","postversion":"echo 'Version updated successfully'","build:modules":"node build.js build","test:coverage":"node --experimental-vm-modules node_modules/.bin/jest --coverage","prepublishOnly":"echo 'Skipping tests for publishing'"},"_npmUser":{"name":"lanmower","email":"almagestfraternite@gmail.com"},"repository":{"url":"git+https://github.com/420kit/shared.git","type":"git"},"_npmVersion":"10.8.2","description":"Shared library for 247420 and Schwepe projects - eliminating code duplication with common utilities","directories":{},"_nodeVersion":"20.19.5","dependencies":{"fast-video-metadata":"^1.0.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^29.5.0","eslint":"^9.0.0","rimraf":"^6.0.0","typescript":"^5.0.0","@types/jest":"^29.5.0","@types/node":"^24.5.2","concurrently":"^9.1.0"},"peerDependencies":{"chokidar":"^3.5.0"},"peerDependenciesMeta":{"chokidar":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/420kit-shared_1.0.2_1760564386444_0.6995870171560901","host":"s3://npm-registry-packages-npm-production"}},"1.0.3":{"name":"420kit-shared","version":"1.0.3","description":"Shared library for 247420 and Schwepe projects - eliminating code duplication with common utilities","main":"dist/index.js","types":"dist/index.d.ts","type":"module","scripts":{"build":"npm run clean && npm run build:modules","build:modules":"node build.js build","build:types":"tsc --declaration --emitDeclarationOnly --outDir dist","clean":"rimraf dist","dev":"npm run build && npm run watch","watch":"concurrently \"npm run build:modules -- --watch\" \"npm run build:types -- --watch\"","test":"node --experimental-vm-modules node_modules/.bin/jest","test:watch":"node --experimental-vm-modules node_modules/.bin/jest --watch","test:coverage":"node --experimental-vm-modules node_modules/.bin/jest --coverage","lint":"eslint src/**/*.js tests/**/*.js","prepare":"npm run build","prepublishOnly":"echo 'Skipping tests for publishing'","preversion":"echo 'Skipping tests for versioning'","version":"npm run build","postversion":"echo 'Version updated successfully'"},"keywords":["phrase-system","media-generator","build-tools","static-site","content-management","247420","schwepe","shared-library","tv-guide","crt-effects","retro-interface"],"author":{"name":"420Kit Collective"},"license":"MIT","repository":{"type":"git","url":"git+https://github.com/420kit/shared.git"},"bugs":{"url":"https://github.com/420kit/shared/issues"},"homepage":"https://github.com/420kit/shared#readme","engines":{"node":">=18.0.0"},"dependencies":{"fast-video-metadata":"^1.0.0"},"devDependencies":{"@types/node":"^24.5.2","@types/jest":"^29.5.0","concurrently":"^9.1.0","eslint":"^9.0.0","jest":"^29.5.0","rimraf":"^6.0.0","typescript":"^5.0.0"},"peerDependencies":{"chokidar":"^3.5.0"},"peerDependenciesMeta":{"chokidar":{"optional":true}},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"},"./phrase-system":{"types":"./dist/phrase-system.d.ts","import":"./dist/phrase-system.js"},"./media-generator":{"types":"./dist/media-generator.d.ts","import":"./dist/media-generator.js"},"./build-tools":{"types":"./dist/build-tools.d.ts","import":"./dist/build-tools.js"},"./config-templates":{"types":"./dist/config-templates.d.ts","import":"./dist/config-templates.js"},"./tv-guide":{"types":"./dist/tv-guide.d.ts","import":"./dist/tv-guide.js"},"./schwelevision":{"types":"./dist/schwelevision.d.ts","import":"./dist/schwelevision.js"}},"publishConfig":{"access":"public"},"_id":"420kit-shared@1.0.3","gitHead":"e5499e7caf57f6fca3fe35aac43490aef7328f6a","_nodeVersion":"20.19.5","_npmVersion":"10.8.2","dist":{"integrity":"sha512-/wzFsMNIU/EzBQGzZkvD1MQAuyqmdNHKcdnP5BNdnKEZVuGGz8jxEM2pQzCP+MErrHuSK3E2aSUpjGbNmOWd4g==","shasum":"7f37441b5d6b20d5ea48e3c79070a53e84f70d7f","tarball":"https://registry.npmjs.org/420kit-shared/-/420kit-shared-1.0.3.tgz","fileCount":18,"unpackedSize":179332,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEQCIFkVXpzctuVHBWfuBMbh2CLnHh5MYTLEAiWiSRmVBviRAiAi9vVRpwGIC5xXu8CZBoMtKVzSy9h5BY2Xu8n5Ygltig=="}]},"_npmUser":{"name":"lanmower","email":"almagestfraternite@gmail.com"},"directories":{},"maintainers":[{"name":"lanmower","email":"almagestfraternite@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/420kit-shared_1.0.3_1760564540082_0.5263833628230847"},"_hasShrinkwrap":false}},"time":{"created":"2025-10-06T13:01:39.451Z","modified":"2025-10-15T21:42:20.499Z","1.0.0":"2025-10-06T13:01:39.783Z","1.0.1":"2025-10-07T10:27:06.093Z","1.0.2":"2025-10-15T21:39:46.652Z","1.0.3":"2025-10-15T21:42:20.295Z"},"bugs":{"url":"https://github.com/420kit/shared/issues"},"author":{"name":"420Kit Collective"},"license":"MIT","homepage":"https://github.com/420kit/shared#readme","keywords":["phrase-system","media-generator","build-tools","static-site","content-management","247420","schwepe","shared-library","tv-guide","crt-effects","retro-interface"],"repository":{"type":"git","url":"git+https://github.com/420kit/shared.git"},"description":"Shared library for 247420 and Schwepe projects - eliminating code duplication with common utilities","maintainers":[{"name":"lanmower","email":"almagestfraternite@gmail.com"}],"readme":"# @420kit/shared\n\nA comprehensive shared library that eliminates code duplication between 247420 and Schwepe projects, providing unified tools for phrase management, media generation, build processes, and project configuration.\n\n## 🚀 Features\n\n- **📝 Dynamic Phrase System** - SSR-compatible phrase management with multiple variations\n- **🖼️ Media Generator** - Automated media file processing and JSON list generation\n- **🔧 Build Tools** - Unified build system with Vite integration and phrase processing\n- **📋 Configuration Templates** - Ready-to-use project templates and configurations\n- **🎯 TypeScript Support** - Full type definitions for better developer experience\n- **⚡ Zero Dependencies** - Lightweight and fast with minimal external dependencies\n\n## 📦 Installation\n\n```bash\nnpm install @420kit/shared\n```\n\n## 🔧 Quick Start\n\n### Basic Phrase System Usage\n\n```javascript\nimport { createPhraseSystem } from '@420kit/shared/phrase-system';\n\n// Create and initialize phrase system\nconst phraseSystem = createPhraseSystem({\n    enablePersistence: true,\n    enableSSR: true\n});\n\n// Add phrase groups\nphraseSystem.addPhraseGroup('pageTitle', {\n    main: ['Welcome to My Site', 'My Awesome Website', 'Home Sweet Home']\n});\n\nphraseSystem.addPhraseGroup('navigation', {\n    home: ['Home', 'Start', 'Begin'],\n    about: ['About', 'Info', 'Details']\n});\n\n// Initialize and process page\nphraseSystem.init();\n```\n\n### Media Generation\n\n```javascript\nimport { generateMediaLists } from '@420kit/shared/media-generator';\n\n// Generate media lists\nconst results = await generateMediaLists({\n    baseDir: './my-project',\n    imageDir: 'assets/images',\n    videoDir: 'assets/videos'\n});\n\nconsole.log(`Generated ${results.stats.totalImages} images and ${results.stats.totalVideos} videos`);\n```\n\n### Build System\n\n```javascript\nimport { buildProject } from '@420kit/shared/build-tools';\n\n// Build your project\nconst buildResults = await buildProject({\n    enablePhraseProcessing: true,\n    enableMediaGeneration: true,\n    enableViteBuild: true,\n    verbose: true\n});\n\nif (buildResults.success) {\n    console.log(`Build completed in ${buildResults.buildTime}ms`);\n} else {\n    console.error('Build failed:', buildResults.error);\n}\n```\n\n### Project Setup\n\n```javascript\nimport { createProjectSetup } from '@420kit/shared/config-templates';\n\n// Create a complete project setup\nconst setupResults = createProjectSetup({\n    projectName: 'my-awesome-project',\n    projectDescription: 'An awesome project built with 420kit',\n    templates: [\n        'package.json',\n        'vite.config.js',\n        'build-process.js',\n        '.eslintrc.json',\n        '.gitignore'\n    ]\n});\n\nconsole.log(`Created ${setupResults.created.length} files`);\n```\n\n## 📚 Modules\n\n### Phrase System (`@420kit/shared/phrase-system`)\n\nManages dynamic content variations with SSR support.\n\n#### Features\n- Multiple phrase variations per content element\n- Server-side rendering support\n- Client-side phrase rotation\n- Persistent selections\n- Phrase validation\n- CMS integration ready\n\n#### Classes\n\n- **`DynamicPhraseSystem`** - Main phrase management class\n- **`BuildTimePhraseSystem`** - Build-time phrase selection for static sites\n\n#### Example\n\n```html\n<!-- In your HTML -->\n<h1 data-phrase-group=\"pageTitle\" data-phrase-key=\"main\">Default Title</h1>\n<nav>\n    <a href=\"/\" data-phrase-group=\"navigation\" data-phrase-key=\"home\">Home</a>\n    <a href=\"/about\" data-phrase-group=\"navigation\" data-phrase-key=\"about\">About</a>\n</nav>\n```\n\n```javascript\nimport { createPhraseSystem } from '@420kit/shared/phrase-system';\n\nconst phrases = createPhraseSystem();\nphrases.addPhraseGroup('pageTitle', {\n    main: ['Welcome', 'Hello', 'Greetings']\n});\nphrases.addPhraseGroup('navigation', {\n    home: ['Home', 'Start', 'Begin'],\n    about: ['About', 'Info', 'Learn More']\n});\n\nphrases.init();\n```\n\n### Media Generator (`@420kit/shared/media-generator`)\n\nAutomatically generates JSON lists for images and videos with metadata.\n\n#### Features\n- Chronological sorting\n- File metadata extraction\n- Automatic categorization\n- Timestamp extraction from filenames\n- Duplicate detection and cleanup\n- Watch mode for development\n\n#### Example\n\n```javascript\nimport { MediaGenerator } from '@420kit/shared/media-generator';\n\nconst generator = new MediaGenerator({\n    baseDir: './my-project',\n    imageExtensions: ['.jpg', '.png', '.gif', '.webp'],\n    videoExtensions: ['.mp4', '.webm', '.mov'],\n    sortByDate: true,\n    sortOrder: 'desc',\n    includeMetadata: true\n});\n\nconst results = generator.generateAllLists();\n// Creates: saved_images.json, saved_videos.json, saved_media.json\n```\n\n### Build Tools (`@420kit/shared/build-tools`)\n\nUnified build system integrating phrase processing and media generation.\n\n#### Features\n- Phrase processing for HTML files\n- Media list generation\n- Vite integration\n- Build validation\n- Watch mode for development\n- Build manifests\n- Error reporting\n\n#### Example\n\n```javascript\nimport { BuildTools } from '@420kit/shared/build-tools';\n\nconst buildTools = new BuildTools({\n    inputDir: 'src',\n    outputDir: 'dist',\n    enablePhraseProcessing: true,\n    enableMediaGeneration: true,\n    enableViteBuild: true,\n    enableCMSIntegration: true\n});\n\n// Single command build\nawait buildTools.build();\n\n// Development watch mode\nbuildTools.watchMode();\n```\n\n### Configuration Templates (`@420kit/shared/config-templates`)\n\nReady-to-use project templates and configurations.\n\n#### Features\n- Package.json templates\n- Vite configurations\n- Build process templates\n- Deployment configurations (Netlify, Firebase, Docker)\n- CI/CD pipeline templates\n- ESLint configurations\n\n#### Example\n\n```javascript\nimport { ConfigTemplates } from '@420kit/shared/config-templates';\n\nconst templates = new ConfigTemplates();\n\n// Create individual template\ntemplates.createTemplate('package.json', 'package.json', {\n    projectName: 'my-project',\n    projectDescription: 'My awesome project'\n});\n\n// Create complete project setup\ntemplates.createProjectSetup({\n    projectName: 'my-project',\n    templates: ['package.json', 'vite.config.js', 'build-process.js']\n});\n```\n\n## 🛠️ Configuration\n\n### Phrase System Options\n\n```javascript\nconst options = {\n    localStorageKey: 'phraseSelections',    // Key for localStorage persistence\n    enablePersistence: true,               // Enable client-side persistence\n    enableSSR: true,                       // Enable server-side rendering support\n    reshuffleKeybind: 'ctrl+shift+r'       // Keyboard shortcut for reshuffling\n};\n```\n\n### Media Generator Options\n\n```javascript\nconst options = {\n    baseDir: process.cwd(),                // Base directory for media files\n    imageDir: 'saved_images',              // Directory containing images\n    videoDir: 'saved_videos',              // Directory containing videos\n    outputDir: '.',                        // Output directory for JSON files\n    imageExtensions: ['.jpg', '.png'],     // Supported image extensions\n    videoExtensions: ['.mp4', '.webm'],    // Supported video extensions\n    generateTimestamps: true,              // Extract timestamps from filenames\n    sortByDate: true,                      // Sort files by date\n    sortOrder: 'desc',                     // Sort order: 'asc' or 'desc'\n    includeMetadata: true,                 // Include file metadata in output\n    outputFormat: 'json',                  // Output format\n    prettyPrint: true                      // Pretty print JSON output\n};\n```\n\n### Build Tools Options\n\n```javascript\nconst options = {\n    baseDir: process.cwd(),                // Base directory\n    inputDir: '.',                         // Input directory for source files\n    outputDir: 'dist',                     // Output directory for build\n    staticDir: 'static',                   // Static files directory\n    contentDir: 'content',                 // CMS content directory\n    enablePhraseProcessing: true,          // Enable phrase processing\n    enableMediaGeneration: true,           // Enable media generation\n    enableViteBuild: true,                 // Enable Vite build\n    enableCMSIntegration: true,            // Enable CMS integration\n    enableValidation: true,                // Enable build validation\n    cleanOutput: true,                     // Clean output directory before build\n    backupFiles: true,                     // Backup files during Vite build\n    verbose: true                          // Enable verbose logging\n};\n```\n\n## 🔄 Migration Guide\n\n### From 247420 Project\n\n1. **Install the shared library:**\n   ```bash\n   npm install @420kit/shared\n   ```\n\n2. **Replace phrase system imports:**\n   ```javascript\n   // Before\n   import { DynamicPhraseSystem } from './static/phrase-system.js';\n\n   // After\n   import { createPhraseSystem } from '@420kit/shared/phrase-system';\n   const phraseSystem = createPhraseSystem();\n   ```\n\n3. **Replace media generation:**\n   ```javascript\n   // Before\n   import generateMediaList from './generate-media-list.js';\n\n   // After\n   import { generateMediaLists } from '@420kit/shared/media-generator';\n   ```\n\n4. **Replace build process:**\n   ```javascript\n   // Before\n   import PhraseBuildProcess from './build-process.js';\n\n   // After\n   import { BuildTools } from '@420kit/shared/build-tools';\n   const buildTools = new BuildTools();\n   ```\n\n### From Schwepe Project\n\nThe migration process is identical. The shared library consolidates all duplicated functionality while maintaining the same API patterns.\n\n## 📝 API Reference\n\n### Phrase System\n\n#### `DynamicPhraseSystem`\n\n**Constructor:**\n```javascript\nnew DynamicPhraseSystem(options?: PhraseOptions)\n```\n\n**Methods:**\n- `addPhraseGroup(groupName: string, phrases: PhraseGroup): this`\n- `loadPhrasesFromFile(filePath: string): this`\n- `loadPhrasesFromDirectory(dirPath: string): this`\n- `init(): void`\n- `rotatePhrase(group: string, key: string): void`\n- `reshuffleAll(): void`\n- `getStats(): PhraseStats`\n- `validatePhraseGroups(): PhraseValidation`\n\n#### `BuildTimePhraseSystem`\n\nExtends `DynamicPhraseSystem` with build-time features:\n\n**Methods:**\n- `generateBuildSelections(): void`\n- `getPhrase(group: string, key: string): string`\n- `replacePhrasesInHTML(htmlContent: string): string`\n\n### Media Generator\n\n#### `MediaGenerator`\n\n**Constructor:**\n```javascript\nnew MediaGenerator(options?: MediaGeneratorOptions)\n```\n\n**Methods:**\n- `generateImagesList(): MediaFile[]`\n- `generateVideosList(): MediaFile[]`\n- `generateAllLists(): Promise<MediaResults>`\n- `validateMediaFiles(): MediaValidation`\n- `watchDirectories(callback?: Function): any`\n\n### Build Tools\n\n#### `BuildTools`\n\n**Constructor:**\n```javascript\nnew BuildTools(options?: BuildToolsOptions)\n```\n\n**Methods:**\n- `build(options?: BuildToolsOptions): Promise<BuildResults>`\n- `watchMode(): Promise<any>`\n- `validate(): PhraseValidation & MediaValidation`\n- `clean(): void`\n\n### Configuration Templates\n\n#### `ConfigTemplates`\n\n**Constructor:**\n```javascript\nnew ConfigTemplates(options?: ConfigTemplateOptions)\n```\n\n**Methods:**\n- `createTemplate(templateName: string, outputPath: string, variables?: object): boolean`\n- `createProjectSetup(options?: ProjectSetupOptions): ProjectSetupResults`\n- `listTemplates(): void`\n- `addTemplate(name: string, template: any, description?: string): void`\n\n## 🧪 Testing\n\n```bash\n# Run all tests\nnpm test\n\n# Run tests in watch mode\nnpm run test:watch\n\n# Run tests with coverage\nnpm run test:coverage\n```\n\n## 🏗️ Building\n\n```bash\n# Build the library\nnpm run build\n\n# Build modules only\nnpm run build:modules\n\n# Build TypeScript definitions\nnpm run build:types\n\n# Clean build artifacts\nnpm run clean\n```\n\n## 📄 License\n\nMIT License - see LICENSE file for details.\n\n## 🤝 Contributing\n\n1. Fork the repository\n2. Create your feature branch (`git checkout -b feature/amazing-feature`)\n3. Commit your changes (`git commit -m 'Add some amazing feature'`)\n4. Push to the branch (`git push origin feature/amazing-feature`)\n5. Open a Pull Request\n\n## 📞 Support\n\nFor support and questions:\n- Create an issue on GitHub\n- Check the documentation\n- Review the examples in the `/examples` directory\n\n## 🔗 Related Projects\n\n- [247420](https://github.com/247420/community) - Original community project\n- [Schwepe](https://github.com/schwepe) - Original Schwepe project\n- [420kit](https://github.com/420kit) - Main 420kit organization\n\n---\n\nBuilt with ❤️ by the 420kit Collective","readmeFilename":"README.md"}