{"_id":"@condu-feature/gpt-summarizer","_rev":"16-516dd21e2b5e6748b3fbb494dd0f2742","name":"@condu-feature/gpt-summarizer","dist-tags":{"latest":"1.0.3"},"versions":{"0.0.1":{"name":"@condu-feature/gpt-summarizer","version":"0.0.1","license":"MIT","_id":"@condu-feature/gpt-summarizer@0.0.1","maintainers":[{"name":"niieani","email":"npm@invent.life"}],"dist":{"shasum":"cbe6b3c2456d4f842a513c47437a7c7173525d56","tarball":"https://registry.npmjs.org/@condu-feature/gpt-summarizer/-/gpt-summarizer-0.0.1.tgz","fileCount":13,"integrity":"sha512-UEHnZTVnWeiankmQBZRzUxwvYvgLOvnCgYtdHIHIXfa1yedk+j7F9ls8SGCPPbh4Fz1leRZtToBk0WeK+xOy6A==","signatures":[{"sig":"MEUCIQCZJJJQgOU0K9+SeyAmtdzp3IhGNPcw5Fc1x065REDHegIgEWatJYFUeJhbm3v7zL1l9rDQrOfbAeOTeEfaJDcUFSc=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":35895},"main":"./gptSummarizer.cjs","type":"module","types":"./gptSummarizer.d.ts","module":"./gptSummarizer.js","source":"./gptSummarizer.ts","exports":{".":{"bun":"./gptSummarizer.ts","import":"./gptSummarizer.js","source":"./gptSummarizer.ts","default":"./gptSummarizer.js","require":"./gptSummarizer.cjs"},"./*.js":{"bun":"./*.ts","import":"./*.js","default":"./*.js","require":"./*.cjs"},"./*.json":"./*.json"},"gitHead":"47d81daa6e1eb6111f90290a5d4b2a4c72a3821d","scripts":{},"_npmUser":{"name":"niieani","email":"npm@invent.life"},"_npmVersion":"10.7.0","directories":{},"_nodeVersion":"22.1.0","dependencies":{"@condu/core":"workspace:^"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"peerDependencies":{"condu":"workspace:^"},"_npmOperationalInternal":{"tmp":"tmp/gpt-summarizer_0.0.1_1720337017768_0.00211067007729282","host":"s3://npm-registry-packages"}},"0.1.0":{"name":"@condu-feature/gpt-summarizer","version":"0.1.0","license":"MIT","_id":"@condu-feature/gpt-summarizer@0.1.0","maintainers":[{"name":"niieani","email":"npm@invent.life"}],"dist":{"shasum":"b0411aaf8677cb24f58c13e08cc292d345e51514","tarball":"https://registry.npmjs.org/@condu-feature/gpt-summarizer/-/gpt-summarizer-0.1.0.tgz","fileCount":14,"integrity":"sha512-wkq6M2DesF0t/62jvU79m585L4+hbS7zDrAM7BU0LXFoPj8u1afdhg3C2Zt+lLAFFJNPhMUu1bOrQbWCUOy02A==","signatures":[{"sig":"MEUCIH1jnNOHKhBz2PydLvcRGdtWBxcTPrbUH9kLH0C3aD2FAiEA3gcKRWQ8Dj0Njd1mH0sC5K90JK/m6u87pLOy27v9Va8=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":44695},"main":"./gptSummarizer.cjs","type":"module","types":"./gptSummarizer.d.ts","module":"./gptSummarizer.js","source":"./gptSummarizer.ts","exports":{".":{"bun":"./gptSummarizer.ts","import":"./gptSummarizer.js","source":"./gptSummarizer.ts","default":"./gptSummarizer.js","require":"./gptSummarizer.cjs"},"./*.js":{"bun":"./*.ts","import":"./*.js","default":"./*.js","require":"./*.cjs"},"./*.json":"./*.json"},"gitHead":"cf2a678f903803f151aeb3bf1d078e931e768192","scripts":{},"_npmUser":{"name":"niieani","email":"npm@invent.life"},"_npmVersion":"10.7.0","description":"NOTE: the codename \"condu\" is not final and is likely to change.","directories":{},"_nodeVersion":"22.1.0","dependencies":{"@condu/core":"^0.1.0"},"publishConfig":{"access":"public","directory":"../../../build/packages/features/gpt-summarizer"},"_hasShrinkwrap":false,"peerDependencies":{"condu":"^0.1.0"},"_npmOperationalInternal":{"tmp":"tmp/gpt-summarizer_0.1.0_1720418626566_0.08619185067119162","host":"s3://npm-registry-packages"}},"0.1.1":{"name":"@condu-feature/gpt-summarizer","version":"0.1.1","license":"MIT","_id":"@condu-feature/gpt-summarizer@0.1.1","maintainers":[{"name":"niieani","email":"npm@invent.life"}],"dist":{"shasum":"51793c245fdb7fee20887306cc0aae9413f44b03","tarball":"https://registry.npmjs.org/@condu-feature/gpt-summarizer/-/gpt-summarizer-0.1.1.tgz","fileCount":14,"integrity":"sha512-ehHAWV69idUVjYQ9hOceKtmbyNekobf8tDz7Y7mn4JkQB4RvfyVzLsnUd7+H2trQORuQKiLChAuhMSednYQOmw==","signatures":[{"sig":"MEYCIQDHCllkuwKxKoIhVGg2Gxbdefuj7GIhZdgepFSPoboA1wIhAJvavRfYTRjbRHBJ8ark0WpbYIBIkRxpATHUx3HOr4YC","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":45012},"main":"./gptSummarizer.cjs","type":"module","types":"./gptSummarizer.d.ts","module":"./gptSummarizer.js","source":"./gptSummarizer.ts","exports":{".":{"bun":"./gptSummarizer.ts","import":"./gptSummarizer.js","source":"./gptSummarizer.ts","default":"./gptSummarizer.js","require":"./gptSummarizer.cjs"},"./*.js":{"bun":"./*.ts","import":"./*.js","default":"./*.js","require":"./*.cjs"},"./*.json":"./*.json"},"gitHead":"c4dc5d09b2c1e6f97ac6b1495988ee5591c47474","scripts":{},"_npmUser":{"name":"niieani","email":"npm@invent.life"},"_npmVersion":"10.7.0","description":"NOTE: the codename \"condu\" is not final and is likely to change.","directories":{},"_nodeVersion":"22.1.0","dependencies":{"@condu/core":"^0.1.1"},"publishConfig":{"access":"public","directory":"../../../build/packages/features/gpt-summarizer"},"_hasShrinkwrap":false,"peerDependencies":{"condu":"^0.1.1"},"_npmOperationalInternal":{"tmp":"tmp/gpt-summarizer_0.1.1_1720419302237_0.4856404530070586","host":"s3://npm-registry-packages"}},"0.1.2":{"name":"@condu-feature/gpt-summarizer","version":"0.1.2","license":"MIT","_id":"@condu-feature/gpt-summarizer@0.1.2","maintainers":[{"name":"niieani","email":"npm@invent.life"}],"dist":{"shasum":"b1e5440e24bac39eaa207f87513165c88e1443f7","tarball":"https://registry.npmjs.org/@condu-feature/gpt-summarizer/-/gpt-summarizer-0.1.2.tgz","fileCount":14,"integrity":"sha512-bbUr7ylDmMXLDvgGAH8iAbY0Csdu/jFcVXdX+Fqx8uywHgeVRAY6LD7sjYGKBVoRSDuWnuUZDSbzZHour0Aemg==","signatures":[{"sig":"MEQCIEugP6/fJ+i1nLJdkb0q0OvhdBfv/3HLt+eC8UySjYqnAiBltitc7zNSpf6n79+zuoFzz/Bd//DyTTebDHUYfF+OGQ==","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":45278},"main":"./gptSummarizer.cjs","type":"module","types":"./gptSummarizer.d.ts","module":"./gptSummarizer.js","source":"./gptSummarizer.ts","exports":{".":{"bun":"./gptSummarizer.ts","import":"./gptSummarizer.js","source":"./gptSummarizer.ts","default":"./gptSummarizer.js","require":"./gptSummarizer.cjs"},"./*.js":{"bun":"./*.ts","import":"./*.js","default":"./*.js","require":"./*.cjs"},"./*.json":"./*.json"},"gitHead":"d1c73e1eb74cd19fc412232d287e881db156a47d","scripts":{},"_npmUser":{"name":"niieani","email":"npm@invent.life"},"_npmVersion":"10.7.0","description":"NOTE: the codename \"condu\" is not final and is likely to change.","directories":{},"_nodeVersion":"22.1.0","dependencies":{"@condu/core":"^0.1.1"},"publishConfig":{"access":"public","directory":"../../../build/packages/features/gpt-summarizer"},"_hasShrinkwrap":false,"peerDependencies":{"condu":"^0.1.2"},"_npmOperationalInternal":{"tmp":"tmp/gpt-summarizer_0.1.2_1720592473608_0.7885244066574872","host":"s3://npm-registry-packages"}},"0.1.3":{"name":"@condu-feature/gpt-summarizer","version":"0.1.3","license":"MIT","_id":"@condu-feature/gpt-summarizer@0.1.3","maintainers":[{"name":"niieani","email":"npm@invent.life"}],"dist":{"shasum":"0bb1933428244476524a9f5491c93c8ad625ece8","tarball":"https://registry.npmjs.org/@condu-feature/gpt-summarizer/-/gpt-summarizer-0.1.3.tgz","fileCount":14,"integrity":"sha512-vsOnWDKXHa/dgsdmJKbopzpEaCyE2jc+FevUgC5xc7a60y9kdhD2yGcH4/89K3PrTEdAyBCFyakH3UyDO/h63Q==","signatures":[{"sig":"MEUCIQDo4LfpHjf6rsCfRjx4jM3BgkqtA6pMeQR8DV93lNv2TAIgGqB4XeEKbXZ4kKggmNTZ3UcqiMZPIurwXjevwLGB+Lk=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":45544},"main":"./gptSummarizer.cjs","type":"module","types":"./gptSummarizer.d.ts","module":"./gptSummarizer.js","source":"./gptSummarizer.ts","exports":{".":{"bun":"./gptSummarizer.ts","import":"./gptSummarizer.js","source":"./gptSummarizer.ts","default":"./gptSummarizer.js","require":"./gptSummarizer.cjs"},"./*.js":{"bun":"./*.ts","import":"./*.js","default":"./*.js","require":"./*.cjs"},"./*.json":"./*.json"},"gitHead":"869e54a6aa146a8c31a01767fd6875a7212fb7a9","scripts":{},"_npmUser":{"name":"niieani","email":"npm@invent.life"},"_npmVersion":"10.7.0","description":"NOTE: the codename \"condu\" is not final and is likely to change.","directories":{},"_nodeVersion":"22.1.0","dependencies":{"@condu/core":"^0.1.1"},"publishConfig":{"access":"public","directory":"../../../build/packages/features/gpt-summarizer"},"_hasShrinkwrap":false,"peerDependencies":{"condu":"^0.1.3"},"_npmOperationalInternal":{"tmp":"tmp/gpt-summarizer_0.1.3_1720597607408_0.6278605027515192","host":"s3://npm-registry-packages"}},"0.1.4":{"name":"@condu-feature/gpt-summarizer","version":"0.1.4","license":"MIT","_id":"@condu-feature/gpt-summarizer@0.1.4","maintainers":[{"name":"niieani","email":"npm@invent.life"}],"dist":{"shasum":"701d8c7562e29a8a1bdb1c6e19ae704afdde3152","tarball":"https://registry.npmjs.org/@condu-feature/gpt-summarizer/-/gpt-summarizer-0.1.4.tgz","fileCount":14,"integrity":"sha512-qvYlFwjic4ZkW05fdwpebCTBjD5SxIKxGsCFUERXz6FvYavypiPaeEQPQO2FHQQoTg85KzrT22rhCwgj113pSA==","signatures":[{"sig":"MEYCIQD97oiXlaPd20veI5A/RrruS9x/Cq8uHtZHUf+rDE0UYwIhAKLga4kyCn9BsHdmyVnGxs/JqGReuynV3BgaNuZ+3ron","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":45934},"main":"./gptSummarizer.cjs","type":"module","types":"./gptSummarizer.d.ts","module":"./gptSummarizer.js","source":"./gptSummarizer.ts","exports":{".":{"bun":"./gptSummarizer.ts","import":"./gptSummarizer.js","source":"./gptSummarizer.ts","default":"./gptSummarizer.js","require":"./gptSummarizer.cjs"},"./*.js":{"bun":"./*.ts","import":"./*.js","default":"./*.js","require":"./*.cjs"},"./*.json":"./*.json"},"gitHead":"fd96b16c1d92818d52e8a3b9960389b75f1c7fd7","scripts":{},"_npmUser":{"name":"niieani","email":"npm@invent.life"},"_npmVersion":"10.7.0","description":"NOTE: the codename \"condu\" is not final and is likely to change.","directories":{},"_nodeVersion":"22.1.0","dependencies":{"@condu/core":"^0.1.2"},"publishConfig":{"access":"public","directory":"../../../build/packages/features/gpt-summarizer"},"_hasShrinkwrap":false,"peerDependencies":{"condu":"^0.1.4"},"_npmOperationalInternal":{"tmp":"tmp/gpt-summarizer_0.1.4_1721931659114_0.3599861197572338","host":"s3://npm-registry-packages"}},"0.1.5":{"name":"@condu-feature/gpt-summarizer","version":"0.1.5","license":"MIT","_id":"@condu-feature/gpt-summarizer@0.1.5","maintainers":[{"name":"niieani","email":"npm@invent.life"}],"dist":{"shasum":"5d2bfaef0cdcbca754c492f4938203ca3adaf679","tarball":"https://registry.npmjs.org/@condu-feature/gpt-summarizer/-/gpt-summarizer-0.1.5.tgz","fileCount":14,"integrity":"sha512-XAhN55uXbD0PqIJ4Eye9DMUBDAA3zZxFjiS/+sWWHG/gdZ+WsMaHyrFHk1FmLhNcO+zL5QlL6UGV5+Op81Ne0g==","signatures":[{"sig":"MEUCIQDjLSwcis7lO+PxH7dY179aJJI83mFjc9o7oYnwGDv1NAIgbYO/7ubapfXru/4Ui4kHrazgb2skhwzDg8qMETECp0o=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":40150},"main":"./gptSummarizer.cjs","type":"module","types":"./gptSummarizer.d.ts","module":"./gptSummarizer.js","source":"./gptSummarizer.ts","exports":{".":{"bun":"./gptSummarizer.ts","import":"./gptSummarizer.js","source":"./gptSummarizer.ts","default":"./gptSummarizer.js","require":"./gptSummarizer.cjs"},"./*.js":{"bun":"./*.ts","import":"./*.js","default":"./*.js","require":"./*.cjs"},"./*.json":"./*.json"},"gitHead":"1195778766ddcf727dc34e0cf47885dd35c5761f","scripts":{},"_npmUser":{"name":"niieani","email":"npm@invent.life"},"_npmVersion":"10.8.2","description":"One config to rule them all.","directories":{},"_nodeVersion":"22.8.0","dependencies":{"@condu/core":"^0.1.3"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"peerDependencies":{"condu":"^0.1.5"},"_npmOperationalInternal":{"tmp":"tmp/gpt-summarizer_0.1.5_1728270945291_0.10717536165140862","host":"s3://npm-registry-packages"}},"0.1.6":{"name":"@condu-feature/gpt-summarizer","version":"0.1.6","license":"MIT","_id":"@condu-feature/gpt-summarizer@0.1.6","maintainers":[{"name":"niieani","email":"npm@invent.life"}],"dist":{"shasum":"528a39ce3f6473d26b09b5edadec4c113b8f7941","tarball":"https://registry.npmjs.org/@condu-feature/gpt-summarizer/-/gpt-summarizer-0.1.6.tgz","fileCount":14,"integrity":"sha512-Un3XFObqELyI9iiaIi7smWfJulNQ2D8gdpJ8NXAzlsxObM78OFBlFr7ZBuf2U8dMJIFYGCKmnnMosungHyZYdg==","signatures":[{"sig":"MEUCIGsEOEcAU/QBF2KnUyUi0zfR6c0wlw8Lmz5OzJ/FRvu+AiEAtBFaPuNpYOgYbeIr8Fuhy/6uxTrUJrZWb3sBtEd9Y6o=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":41272},"main":"./gptSummarizer.cjs","type":"module","types":"./gptSummarizer.d.ts","module":"./gptSummarizer.js","source":"./gptSummarizer.ts","exports":{".":{"bun":"./gptSummarizer.ts","import":"./gptSummarizer.js","source":"./gptSummarizer.ts","default":"./gptSummarizer.js","require":"./gptSummarizer.cjs"},"./*.js":{"bun":"./*.ts","import":"./*.js","default":"./*.js","require":"./*.cjs"},"./*.json":"./*.json"},"gitHead":"fa1f9c8402ce82cb7e082e06d84a49c063bfa076","scripts":{},"_npmUser":{"name":"niieani","email":"npm@invent.life"},"_npmVersion":"10.8.2","description":"One config to rule them all.","directories":{},"_nodeVersion":"22.8.0","dependencies":{"@condu/core":"^0.1.4"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"peerDependencies":{"condu":"^0.1.6"},"_npmOperationalInternal":{"tmp":"tmp/gpt-summarizer_0.1.6_1728276824000_0.6274165384120007","host":"s3://npm-registry-packages"}},"0.1.7":{"name":"@condu-feature/gpt-summarizer","version":"0.1.7","license":"MIT","_id":"@condu-feature/gpt-summarizer@0.1.7","maintainers":[{"name":"niieani","email":"npm@invent.life"}],"dist":{"shasum":"3a92fa7209e3ccf66fa609d0e6191858ed60a01b","tarball":"https://registry.npmjs.org/@condu-feature/gpt-summarizer/-/gpt-summarizer-0.1.7.tgz","fileCount":14,"integrity":"sha512-rzV0AlEBXIB+RppWJbA18y7FNw7OVXaoZjw0Ys++nwQ7t+I3dBAVT2HYpxI/A82NZBPyXSvtqcRP1YvepSGtFw==","signatures":[{"sig":"MEQCICJ4uvi/ZVDNf0WBUdokghkxWWJw8r2UnaJ4qBZx+rLeAiBIMYjEhPkS2ONcibB4Idl2cDjIhLgdBMoy1nvrdPrccA==","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":40278},"main":"./gptSummarizer.cjs","type":"module","types":"./gptSummarizer.d.ts","module":"./gptSummarizer.js","source":"./gptSummarizer.ts","exports":{".":{"bun":"./gptSummarizer.ts","import":"./gptSummarizer.js","source":"./gptSummarizer.ts","default":"./gptSummarizer.js","require":"./gptSummarizer.cjs"},"./*.js":{"bun":"./*.ts","import":"./*.js","default":"./*.js","require":"./*.cjs"},"./*.json":"./*.json"},"gitHead":"f20deb3f06f19fd04babf2441f3305c5eb6f05b9","scripts":{},"_npmUser":{"name":"niieani","email":"npm@invent.life"},"_npmVersion":"10.8.3","description":"One config to rule them all.","directories":{},"_nodeVersion":"22.9.0","dependencies":{"@condu/core":"^0.1.5"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"peerDependencies":{"condu":"^0.1.7"},"_npmOperationalInternal":{"tmp":"tmp/gpt-summarizer_0.1.7_1728711503733_0.4608801376185956","host":"s3://npm-registry-packages"}},"0.1.8":{"name":"@condu-feature/gpt-summarizer","version":"0.1.8","license":"MIT","_id":"@condu-feature/gpt-summarizer@0.1.8","maintainers":[{"name":"niieani","email":"npm@invent.life"}],"dist":{"shasum":"2f620571f93175dc07b5fecde5bc3c0eccbef446","tarball":"https://registry.npmjs.org/@condu-feature/gpt-summarizer/-/gpt-summarizer-0.1.8.tgz","fileCount":14,"integrity":"sha512-tiEeJONTmxux0ro+qyYeyW7h8JHXtU18pWqTbVlhV/yvJiuKX+7DA8MVu2mv4VlqsRQRS50sFqCwbEweq0m1eg==","signatures":[{"sig":"MEYCIQDjmK/MYQftc6dZml/QnJuFgZ2WL+BOemzOvh+h6RU5YgIhAOXml85ULzJYe6Ex4wm7UjvPlMKvTtV5C0Gook4u/Ve6","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":40782},"type":"module","gitHead":"ec5b7ef718b12fae2cec0e1f7124e66b3a191821","_npmUser":{"name":"niieani","email":"npm@invent.life"},"_npmVersion":"10.8.3","description":"One config to rule them all.","directories":{},"_nodeVersion":"22.9.0","dependencies":{"@condu/core":"^0.1.5"},"_hasShrinkwrap":false,"peerDependencies":{"condu":"^0.1.8"},"_npmOperationalInternal":{"tmp":"tmp/gpt-summarizer_0.1.8_1734767332642_0.49977768470973527","host":"s3://npm-registry-packages-npm-production"}},"0.1.9":{"name":"@condu-feature/gpt-summarizer","version":"0.1.9","license":"MIT","_id":"@condu-feature/gpt-summarizer@0.1.9","maintainers":[{"name":"niieani","email":"npm@invent.life"}],"dist":{"shasum":"64cd32f89f9b9b5f2c055900a915654a80c5102b","tarball":"https://registry.npmjs.org/@condu-feature/gpt-summarizer/-/gpt-summarizer-0.1.9.tgz","fileCount":14,"integrity":"sha512-pTe2D+UD5Vt8fCOu/4KRkqcXl+TMCFqgGusGrvISJhG+iaIfzQ0AHUix3oJc8gHVLR4+2hStOGyz1lCr5JYJNA==","signatures":[{"sig":"MEUCIEhXbjaO7GmeuAYI6zdkSoFsjy/Ikg6RLwFlCK6Vz9wNAiEAzbaRO9C9gWPMk3/u2wLNJmsoHlI+PQ2u9AZrJm+QRxk=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":41095},"type":"module","gitHead":"1537f8a9a6d52b747bd3267654ad6b281e419643","_npmUser":{"name":"niieani","email":"npm@invent.life"},"_npmVersion":"10.8.3","description":"One config to rule them all.","directories":{},"_nodeVersion":"22.9.0","dependencies":{"@condu/core":"^0.1.6"},"_hasShrinkwrap":false,"peerDependencies":{"condu":"^0.1.9"},"_npmOperationalInternal":{"tmp":"tmp/gpt-summarizer_0.1.9_1734767819458_0.5077048505139841","host":"s3://npm-registry-packages-npm-production"}},"0.1.10":{"name":"@condu-feature/gpt-summarizer","version":"0.1.10","license":"MIT","_id":"@condu-feature/gpt-summarizer@0.1.10","maintainers":[{"name":"niieani","email":"npm@invent.life"}],"dist":{"shasum":"e5d9ebbe97ba4a29c28c1047a98dc12ca8342903","tarball":"https://registry.npmjs.org/@condu-feature/gpt-summarizer/-/gpt-summarizer-0.1.10.tgz","fileCount":14,"integrity":"sha512-3gCEhTGjoVCWlXwDD8mX3hf06sdmSYlKdAqlX+8/ZfS0rcuPyPWSADCtHjfEhB91bKM7mtjOtYqCfJmyXqiyzA==","signatures":[{"sig":"MEUCIAPi7vnhAEqwQvhl9TOj07q1n59LXSvwfeYXsbvQFtVBAiEAud81+g/c0pt3Tn0g4T3dEVInon8ntxZ0NVUQDJVA39c=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":41413},"type":"module","gitHead":"940de8c8443da381eb2472df67e62c1cb4d54c9f","_npmUser":{"name":"niieani","email":"npm@invent.life"},"_npmVersion":"10.8.3","description":"One config to rule them all.","directories":{},"_nodeVersion":"22.9.0","dependencies":{"@condu/core":"^0.1.7"},"_hasShrinkwrap":false,"peerDependencies":{"condu":"^0.1.10"},"_npmOperationalInternal":{"tmp":"tmp/gpt-summarizer_0.1.10_1734771538658_0.526312021904275","host":"s3://npm-registry-packages-npm-production"}},"1.0.0":{"name":"@condu-feature/gpt-summarizer","version":"1.0.0","license":"MIT","_id":"@condu-feature/gpt-summarizer@1.0.0","maintainers":[{"name":"niieani","email":"npm@invent.life"}],"homepage":"https://github.com/niieani/condu#readme","bugs":{"url":"https://github.com/niieani/condu/issues"},"dist":{"shasum":"7535bfabad06eed1142f7783131afb78b8c0f2c2","tarball":"https://registry.npmjs.org/@condu-feature/gpt-summarizer/-/gpt-summarizer-1.0.0.tgz","fileCount":14,"integrity":"sha512-k34gfNIJ7xZ7c88Zfw1WCq+uxc8NF4yt+wNHlv0ACGJXjRy5wpN8dHHreuRu5+A5SmlBvvqK5F4tS/Pt/rMUjw==","signatures":[{"sig":"MEUCIGlsDMPE6gyl3dcyyfF6tDO1Gf5SlbPV6d8bkl8NEKakAiEA9hRtI+2bc3VfO2iyZTVK5Z46kuAfR2Jj/ylFb1oIdkg=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@condu-feature%2fgpt-summarizer@1.0.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":65446},"type":"module","exports":{".":{"bun":"./gptSummarizer.ts","import":"./gptSummarizer.js","source":"./gptSummarizer.ts","default":"./gptSummarizer.js","require":"./gptSummarizer.cjs","@condu-feature":"./gptSummarizer.ts"},"./*.js":{"bun":"./*.ts","import":"./*.js","default":"./*.js","require":"./*.cjs"},"./*.json":"./*.json"},"gitHead":"4cf982c9a335ff483ad14d530551ab648c2286c8","scripts":{},"_npmUser":{"name":"niieani","email":"npm@invent.life"},"repository":{"url":"git+https://github.com/niieani/condu.git","type":"git","directory":"packages/features/gpt-summarizer"},"_npmVersion":"11.3.0","description":"condu is a configuration management tool for JavaScript/TypeScript projects that solves the \"config hell\" problem by providing a unified approach to manage all project configuration in code.","directories":{},"_nodeVersion":"24.1.0","dependencies":{"@condu/core":"^1.0.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"peerDependencies":{"condu":"^1.0.0"},"_npmOperationalInternal":{"tmp":"tmp/gpt-summarizer_1.0.0_1754096727398_0.822669730002195","host":"s3://npm-registry-packages-npm-production"}},"1.0.1":{"name":"@condu-feature/gpt-summarizer","version":"1.0.1","license":"MIT","_id":"@condu-feature/gpt-summarizer@1.0.1","maintainers":[{"name":"niieani","email":"npm@invent.life"}],"homepage":"https://github.com/niieani/condu#readme","bugs":{"url":"https://github.com/niieani/condu/issues"},"dist":{"shasum":"b6cc9e63e2b80345aecf3e2c1193da4835ab699c","tarball":"https://registry.npmjs.org/@condu-feature/gpt-summarizer/-/gpt-summarizer-1.0.1.tgz","fileCount":14,"integrity":"sha512-LLV+shRXr2YvM/F2bevFzC5SP6XVveheBJC8RwIzM/DvOr2NKqtNqL8EVEbjCk9z1zUBqvtF6tI3ZuGK4vRMcg==","signatures":[{"sig":"MEUCIQD718VYWQtvrRUZQ4RuNtSQi5zml5FoOxcr5vT5/hKyigIgIRuZD36PhTX+sv2IhnpfxApL8XhKBFL3DnIKbEKw+c0=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@condu-feature%2fgpt-summarizer@1.0.1","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":65708},"type":"module","exports":{".":{"bun":"./gptSummarizer.ts","import":"./gptSummarizer.js","source":"./gptSummarizer.ts","default":"./gptSummarizer.js","require":"./gptSummarizer.cjs","@condu-feature":"./gptSummarizer.ts"},"./*.js":{"bun":"./*.ts","import":"./*.js","default":"./*.js","require":"./*.cjs"},"./*.json":"./*.json"},"gitHead":"d34101d8c8c57b346a21a0e11a303ba44d00547e","scripts":{},"_npmUser":{"name":"niieani","email":"npm@invent.life"},"repository":{"url":"git+https://github.com/niieani/condu.git","type":"git","directory":"packages/features/gpt-summarizer"},"_npmVersion":"11.3.0","description":"condu is a configuration management tool for JavaScript/TypeScript projects that solves the \"config hell\" problem by providing a unified approach to manage all project configuration in code.","directories":{},"_nodeVersion":"24.1.0","dependencies":{"@condu/core":"^1.0.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"peerDependencies":{"condu":"^1.0.1"},"_npmOperationalInternal":{"tmp":"tmp/gpt-summarizer_1.0.1_1754180802011_0.5866205488128269","host":"s3://npm-registry-packages-npm-production"}},"1.0.2":{"name":"@condu-feature/gpt-summarizer","version":"1.0.2","license":"MIT","_id":"@condu-feature/gpt-summarizer@1.0.2","maintainers":[{"name":"niieani","email":"npm@invent.life"}],"homepage":"https://github.com/niieani/condu#readme","bugs":{"url":"https://github.com/niieani/condu/issues"},"dist":{"shasum":"6a664d7d6bf24db20ee5523fe392dbc9f5e14028","tarball":"https://registry.npmjs.org/@condu-feature/gpt-summarizer/-/gpt-summarizer-1.0.2.tgz","fileCount":14,"integrity":"sha512-Wb8sVuA2H4YIbx4Ai+ihibaZ/r7DYSat9Inx8B+0CYLzclZ/tWNEsbidKTIkivZZzOvm2Y2tE1HWLYXwNkLnug==","signatures":[{"sig":"MEUCIAVfDLb+bf+cJnegmce965J9oNIQvOILqXPolpYA027PAiEAwKfl5sxC+13s5yu+7TCvVATnPuCqfB805UNqs2fP/K4=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@condu-feature%2fgpt-summarizer@1.0.2","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":66021},"type":"module","exports":{".":{"bun":"./gptSummarizer.ts","import":"./gptSummarizer.js","source":"./gptSummarizer.ts","default":"./gptSummarizer.js","require":"./gptSummarizer.cjs","@condu-feature":"./gptSummarizer.ts"},"./*.js":{"bun":"./*.ts","import":"./*.js","default":"./*.js","require":"./*.cjs"},"./*.json":"./*.json"},"gitHead":"46840e3a518063f980f51ee05dd7b8d28c284202","scripts":{},"_npmUser":{"name":"niieani","email":"npm@invent.life"},"repository":{"url":"git+https://github.com/niieani/condu.git","type":"git","directory":"packages/features/gpt-summarizer"},"_npmVersion":"11.3.0","description":"condu is a configuration management tool for JavaScript/TypeScript projects that solves the \"config hell\" problem by providing a unified approach to manage all project configuration in code.","directories":{},"_nodeVersion":"24.1.0","dependencies":{"@condu/core":"^1.0.1"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"peerDependencies":{"condu":"^1.0.2"},"_npmOperationalInternal":{"tmp":"tmp/gpt-summarizer_1.0.2_1754860278061_0.45052090242239373","host":"s3://npm-registry-packages-npm-production"}},"1.0.3":{"name":"@condu-feature/gpt-summarizer","version":"1.0.3","repository":{"type":"git","url":"git+https://github.com/niieani/condu.git","directory":"packages/features/gpt-summarizer"},"license":"MIT","type":"module","exports":{".":{"@condu-feature":"./gptSummarizer.ts","source":"./gptSummarizer.ts","bun":"./gptSummarizer.ts","import":"./gptSummarizer.js","require":"./gptSummarizer.cjs","default":"./gptSummarizer.js"},"./*.json":"./*.json","./*.js":{"bun":"./*.ts","import":"./*.js","require":"./*.cjs","default":"./*.js"}},"scripts":{},"dependencies":{"@condu/core":"^1.0.1"},"peerDependencies":{"condu":"^1.0.3"},"publishConfig":{"access":"public"},"_id":"@condu-feature/gpt-summarizer@1.0.3","gitHead":"65e30cfae948fee3cb4cd73bb32058f727c403a4","description":"condu is a configuration management tool for JavaScript/TypeScript projects that solves the \"config hell\" problem by providing a unified approach to manage all project configuration in code.","bugs":{"url":"https://github.com/niieani/condu/issues"},"homepage":"https://github.com/niieani/condu#readme","_nodeVersion":"24.1.0","_npmVersion":"11.3.0","dist":{"integrity":"sha512-v+sN7u3Vr8y984NUN8QQFztIwK9JJxCGwdE6RM06OM10+hr9YIg0mC3dnk3yvfBzMaJEwZiV7HvcAPvIsUosBQ==","shasum":"f33a09ca2abf1250fc2b9b8a4e4ef79b07e577a1","tarball":"https://registry.npmjs.org/@condu-feature/gpt-summarizer/-/gpt-summarizer-1.0.3.tgz","fileCount":14,"unpackedSize":66283,"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@condu-feature%2fgpt-summarizer@1.0.3","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEQCIF6EaRmzvR/m+15pHEhBGnwGIpSvDqvKhEArZWGN+vIEAiAZ+4nIiCT9XkRV0Eu0dCd2ZJSjW+E7YYmYYiUyUyXnrQ=="}]},"_npmUser":{"name":"niieani","email":"npm@invent.life"},"directories":{},"maintainers":[{"name":"niieani","email":"npm@invent.life"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/gpt-summarizer_1.0.3_1754861256065_0.319221258279355"},"_hasShrinkwrap":false}},"time":{"created":"2024-07-07T07:23:37.653Z","modified":"2025-08-10T21:27:36.720Z","0.0.1":"2024-07-07T07:23:37.933Z","0.1.0":"2024-07-08T06:03:46.791Z","0.1.1":"2024-07-08T06:15:02.397Z","0.1.2":"2024-07-10T06:21:13.829Z","0.1.3":"2024-07-10T07:46:47.596Z","0.1.4":"2024-07-25T18:20:59.250Z","0.1.5":"2024-10-07T03:15:45.449Z","0.1.6":"2024-10-07T04:53:44.187Z","0.1.7":"2024-10-12T05:38:23.919Z","0.1.8":"2024-12-21T07:48:52.784Z","0.1.9":"2024-12-21T07:56:59.630Z","0.1.10":"2024-12-21T08:58:58.821Z","1.0.0":"2025-08-02T01:05:27.588Z","1.0.1":"2025-08-03T00:26:42.222Z","1.0.2":"2025-08-10T21:11:18.237Z","1.0.3":"2025-08-10T21:27:36.248Z"},"bugs":{"url":"https://github.com/niieani/condu/issues"},"license":"MIT","homepage":"https://github.com/niieani/condu#readme","repository":{"type":"git","url":"git+https://github.com/niieani/condu.git","directory":"packages/features/gpt-summarizer"},"description":"condu is a configuration management tool for JavaScript/TypeScript projects that solves the \"config hell\" problem by providing a unified approach to manage all project configuration in code.","maintainers":[{"name":"niieani","email":"npm@invent.life"}],"readme":"# condu - Configuration as Code\n\ncondu is a configuration management tool for JavaScript/TypeScript projects that solves the \"config hell\" problem by providing a unified approach to manage all project configuration in code.\n\n## Why condu?\n\nModern JavaScript/TypeScript projects require numerous configuration files:\n\n- tsconfig.json\n- eslintrc/eslint.config.js\n- .prettierrc\n- .editorconfig\n- package.json\n- .gitignore\n- And many more...\n\nThese configurations:\n\n- Use different formats (JSON, YAML, JS)\n- Are scattered across your project\n- Are hard to keep in sync across multiple projects\n- Often require changes to multiple files when adding a new tool\n\ncondu solves these problems by:\n\n1. Allowing you to define all configuration in TypeScript\n2. Providing a system to share and reuse configurations\n3. Making it easy to override only what you need\n4. Automating updates across your entire codebase\n\n## Getting Started\n\n### Installation\n\n```bash\n# Using npm\nnpm install condu --save-dev\n\n# Using yarn\nyarn add condu --dev\n\n# Using pnpm\npnpm add condu -D\n```\n\n### Basic Usage\n\n1. Create a `.config/condu.ts` file in your project root:\n\n```typescript\nimport { configure } from \"condu\";\nimport { typescript } from \"@condu-feature/typescript\";\nimport { eslint } from \"@condu-feature/eslint\";\nimport { prettier } from \"@condu-feature/prettier\";\n\nexport default configure({\n  features: [typescript(), eslint(), prettier()],\n});\n```\n\n2. Run condu to apply your configuration:\n\n```bash\nnpx condu apply\n```\n\nThis will generate all the necessary configuration files based on your `.config/condu.ts` file.\n\n## Features\n\nFeatures are the building blocks of condu. Each feature manages configuration for a specific tool or aspect of your project.\n\n### Core Features\n\ncondu comes with many built-in features:\n\n- **typescript**: Manages TypeScript configuration\n- **eslint**: Configures ESLint\n- **prettier**: Sets up Prettier formatting\n- **gitignore**: Creates and manages .gitignore files\n- **vscode**: Configures VS Code workspace settings\n- **editorconfig**: Sets up EditorConfig\n- **pnpm/yarn/npm**: Package manager configuration\n- **moon**: Task runner integration\n- **vitest**: Testing framework setup\n- **release-please**: Release management\n- And more...\n\n### Using Features\n\nEach feature can be configured with options:\n\n```typescript\ntypescript({\n  preset: \"esm-first\",\n  tsconfig: {\n    compilerOptions: {\n      strict: true,\n      skipLibCheck: true,\n    },\n  },\n});\n```\n\n## Monorepo Support\n\ncondu excels at managing monorepo configurations. Define your workspace structure:\n\n```typescript\nexport default configure({\n  projects: [\n    {\n      parentPath: \"packages/features\",\n      nameConvention: \"@myorg/feature-*\",\n    },\n    {\n      parentPath: \"packages/core\",\n      nameConvention: \"@myorg/*\",\n    },\n  ],\n  features: [\n    // ...features\n  ],\n});\n```\n\n## Creating Custom Features\n\nYou can create custom features to encapsulate your own configuration logic.\n\nA feature's primary purpose is to define a _recipe_ - a list of changes that should be made whenever `condu apply` is run. Think of the calls to condu recipe APIs similar to React component hooks.\n\n### Inline Features (Simplest Approach)\n\nFor one-off or simple modifications, you can define features inline directly in your config file:\n\n```typescript\nimport { configure } from \"condu\";\nimport { typescript } from \"@condu-feature/typescript\";\n\nexport default configure({\n  features: [\n    typescript(),\n\n    // Anonymous arrow function feature\n    (condu) => {\n      condu.in({ kind: \"package\" }).modifyPublishedPackageJson((pkg) => ({\n        ...pkg,\n        // Add sideEffects: false to all packages for better tree-shaking\n        sideEffects: false,\n      }));\n    },\n\n    // Named functions will use their name as the feature name\n    function addLicense(condu) {\n      condu.root.generateFile(\"LICENSE\", {\n        content: `MIT License\\n\\nCopyright (c) ${new Date().getFullYear()} My Organization\\n\\n...`,\n      });\n    },\n  ],\n});\n```\n\nInline features:\n\n- Are perfect for quick, project-specific configurations\n- Don't participate in the PeerContext system\n- Are applied in the order they appear in the features array\n\n### Reusable Features with `defineFeature`\n\nFor creating proper reusable features, use the `defineFeature` function:\n\n```typescript\nimport { defineFeature } from \"condu\";\n\nexport const myFeature = (options = {}) =>\n  defineFeature(\"myFeature\", {\n    // The main recipe that runs during configuration application\n    defineRecipe(condu) {\n      // Generate a configuration file\n      condu.root.generateFile(\"my-config.json\", {\n        content: {\n          enabled: options.enabled ?? true,\n          settings: options.settings ?? {},\n        },\n        stringify: JSON.stringify,\n      });\n\n      // Add required dependencies\n      condu.root.ensureDependency(\"my-library\");\n\n      // Target specific packages in a monorepo\n      condu.in({ kind: \"package\" }).modifyPackageJson((pkg) => ({\n        ...pkg,\n        scripts: {\n          ...pkg.scripts,\n          \"my-script\": \"my-command\",\n        },\n      }));\n    },\n  });\n```\n\n### Using PeerContext for Feature Coordination\n\nWhen you want features to influence each other, use the PeerContext system.\nFor example, the TypeScript feature could automatically enable TypeScript-specific ESLint rules as in the example below:\n\n```typescript\n// ESLint feature definition\ndeclare module \"condu\" {\n  interface PeerContext {\n    eslint: {\n      rules: Record<string, unknown>;\n      plugins: string[];\n      extends: string[];\n    };\n  }\n}\n\nexport const eslint = (options = {}) =>\n  defineFeature(\"eslint\", {\n    initialPeerContext: {\n      rules: {\n        \"no-unused-vars\": \"error\",\n      },\n      plugins: [],\n      extends: [\"eslint:recommended\"],\n    },\n\n    defineRecipe(condu, peerContext) {\n      // Generate eslint config using the final peer context\n      // which may have been modified by other features\n      condu.root.generateFile(\".eslintrc.js\", {\n        content: `module.exports = {\n          extends: ${JSON.stringify(peerContext.extends)},\n          plugins: ${JSON.stringify(peerContext.plugins)},\n          rules: ${JSON.stringify(peerContext.rules, null, 2)}\n        }`,\n      });\n\n      // Ensure ESLint dependency\n      condu.root.ensureDependency(\"eslint\");\n\n      // Ensure any plugins are installed\n      for (const plugin of peerContext.plugins) {\n        condu.root.ensureDependency(`eslint-plugin-${plugin}`);\n      }\n    },\n  });\n\n// TypeScript feature that influences ESLint\nexport const typescript = (options = {}) =>\n  defineFeature(\"typescript\", {\n    initialPeerContext: {\n      // TypeScript-specific context\n      config: {\n        strict: true,\n        // ...other TypeScript options\n      },\n    },\n\n    // Here TypeScript feature modifies ESLint's context\n    modifyPeerContexts: (project, initialContext) => ({\n      eslint: (current) => ({\n        ...current,\n        // Add TypeScript ESLint plugin\n        plugins: [...current.plugins, \"typescript\"],\n        // Add TypeScript ESLint config\n        extends: [...current.extends, \"plugin:@typescript-eslint/recommended\"],\n        // Add/modify TypeScript-specific rules\n        rules: {\n          ...current.rules,\n          \"@typescript-eslint/no-explicit-any\": \"error\",\n          \"@typescript-eslint/explicit-function-return-type\": \"warn\",\n          // Disable the base ESLint rule in favor of TypeScript-specific one\n          \"no-unused-vars\": \"off\",\n          \"@typescript-eslint/no-unused-vars\": \"error\",\n        },\n      }),\n    }),\n\n    defineRecipe(condu, peerContext) {\n      // Generate tsconfig.json\n      condu.root.generateFile(\"tsconfig.json\", {\n        content: {\n          compilerOptions: peerContext.config,\n        },\n        stringify: (obj) => JSON.stringify(obj, null, 2),\n      });\n\n      // Ensure TypeScript dependencies\n      condu.root.ensureDependency(\"typescript\");\n\n      // Also add TypeScript ESLint dependencies if ESLint is used\n      if (condu.project.hasFeature(\"eslint\")) {\n        condu.root.ensureDependency(\"@typescript-eslint/parser\");\n        condu.root.ensureDependency(\"@typescript-eslint/eslint-plugin\");\n      }\n    },\n  });\n```\n\nWith this setup:\n\n1. The ESLint feature defines its initial rules and plugin configuration\n2. The TypeScript feature enhances ESLint configuration with TypeScript-specific rules\n3. When both features are used together, you automatically get TypeScript-aware linting\n\n### Advanced Usage: `defineGarnish` for Post-Processing\n\nFor final adjustments after all features have run their main recipes, use `defineGarnish`:\n\n```typescript\nimport { defineFeature } from \"condu\";\n\nexport const packageScripts = () =>\n  defineFeature(\"packageScripts\", {\n    // Standard recipe for basic setup\n    defineRecipe(condu) {\n      // Basic script setup\n      condu.root.modifyPackageJson((pkg) => ({\n        ...pkg,\n        scripts: {\n          ...pkg.scripts,\n          start: \"node index.js\",\n        },\n      }));\n    },\n\n    // Garnish runs after all other features have applied their recipes\n    defineGarnish(condu) {\n      // Access the complete state after all features have run\n      const allTasks = condu.globalRegistry.tasks;\n\n      // Generate scripts based on tasks defined by other features\n      condu.root.modifyPackageJson((pkg) => {\n        const scripts = { ...pkg.scripts };\n\n        // Create aggregate scripts based on task types\n        const buildTasks = allTasks.filter(\n          (task) => task.taskDefinition.type === \"build\",\n        );\n\n        if (buildTasks.length > 0) {\n          scripts[\"build:all\"] = buildTasks\n            .map((t) => `npm run build:${t.taskDefinition.name}`)\n            .join(\" && \");\n\n          // Add individual build scripts for each task\n          for (const task of buildTasks) {\n            scripts[`build:${task.taskDefinition.name}`] =\n              task.taskDefinition.command;\n          }\n        }\n\n        // Create test scripts for all test tasks\n        const testTasks = allTasks.filter(\n          (task) => task.taskDefinition.type === \"test\",\n        );\n\n        if (testTasks.length > 0) {\n          scripts[\"test:all\"] = testTasks\n            .map((t) => `npm run test:${t.taskDefinition.name}`)\n            .join(\" && \");\n        }\n\n        return { ...pkg, scripts };\n      });\n    },\n  });\n```\n\nThe `defineGarnish` function:\n\n- Runs after all features have completed their main recipes\n- Has access to `globalRegistry` with information about all tasks, dependencies, and files\n- Is perfect for generating aggregate configurations or scripts that depend on what other features defined\n- Enables post-processing of files or configurations\n\n## API Reference\n\n### `condu` object\n\nThe main `condu` object available in feature recipes contains the following:\n\n- `condu.project`: Information about the project\n- `condu.root`: Recipe API for the root package\n- `condu.in(criteria)`: Recipe API for the packages matching the criteria\n\nAdditionally, when used in `defineGarnish`:\n\n- `condu.globalRegistry`: Contains the summary of all the recipes, including:\n  - which files were modified\n  - what tasks were registered\n\n### Recipe API\n\nMethods for declaring configuration changes:\n\n#### generateFile\n\nCreates files that are fully managed by condu.\n\n```typescript\ngenerateFile<PathT extends string>(path: PathT, options: GenerateFileOptionsForPath<PathT>): ScopedRecipeApi\n```\n\n- **Purpose**: Generate new files that are completely managed by condu\n- **Features**:\n  - Type-safe content generation\n  - Custom serialization support\n  - File attributes for special handling (e.g., gitignore)\n\n**Examples**:\n\n```typescript\n// Generate a standard JSON configuration file\ncondu.root.generateFile(\"tsconfig.json\", {\n  content: {\n    compilerOptions: {\n      strict: true,\n      target: \"ES2020\",\n    },\n    include: [\"**/*.ts\"],\n  },\n  // Automatically stringify JSON with formatting\n  stringify: (obj) => JSON.stringify(obj, null, 2),\n});\n\n// Generate a YAML file\ncondu.root.generateFile(\"pnpm-workspace.yaml\", {\n  content: {\n    packages: [\"packages/*\"],\n  },\n  // Use a custom YAML stringifier\n  stringify: getYamlStringify(),\n  // Set file attributes for special handling\n  attributes: {\n    gitignore: false, // Don't add to .gitignore\n  },\n});\n\n// Generate a text file with raw content\ncondu.root.generateFile(\".gitignore\", {\n  content: [\"node_modules\", \"build\", \".DS_Store\", \"*.log\"].join(\"\\n\"),\n  // No stringification needed for plain text\n});\n```\n\n#### modifyGeneratedFile\n\nModifies a file that was previously generated by condu.\n\n```typescript\nmodifyGeneratedFile<PathT extends string>(path: PathT, options: ModifyGeneratedFileOptions<ResolvedSerializedType<PathT>>): ScopedRecipeApi\n```\n\n- **Purpose**: Update or extend files already managed by condu\n- **Features**:\n  - Access to current content\n  - Preserves format of the file\n  - Can be used to add or modify portions of existing files in a typesafe way\n  - Can be used without providing a parse/stringify, as it uses the one provided by the feature\n\n**Examples**:\n\n```typescript\n// Modify an existing tsconfig.json\ncondu.root.modifyGeneratedFile(\"tsconfig.json\", {\n  content: ({ content = {} }) => ({\n    ...content,\n    compilerOptions: {\n      ...content.compilerOptions,\n      // Add or update specific compiler options\n      declaration: true,\n      sourceMap: true,\n    },\n  }),\n});\n```\n\n#### modifyUserEditableFile\n\nModifies files that should remain editable by users.\n\n```typescript\nmodifyUserEditableFile<PathT extends string, DeserializedT = ...>(path: PathT, options: ModifyUserEditableFileOptions<DeserializedT>): ScopedRecipeApi\n```\n\n- **Purpose**: Update portions of user-editable files while preserving other user changes\n- **Features**:\n  - Custom parsing and stringification for different formats\n  - Can create the file if it doesn't exist with `ifNotExists: \"create\"`\n  - Preserves content not explicitly modified by condu\n\n**Examples**:\n\n```typescript\n// Modify a JSON file with type safety\ncondu.root.modifyUserEditableFile(\".vscode/settings.json\", {\n  // Get default JSON parsers and stringifiers\n  ...getJsonParseAndStringify<MySettingsType>(),\n  // Create the file if it doesn't exist (that's the default)\n  ifNotExists: \"create\", // other options: \"ignore\" | \"error\"\n  // Modify or provide content\n  content: ({ content = {} }) => ({\n    ...content,\n    // Add or update specific settings while preserving others\n    \"typescript.tsdk\": \"node_modules/typescript/lib\",\n    \"editor.formatOnSave\": true,\n  }),\n});\n\n// Modify a custom format file\ncondu.root.modifyUserEditableFile(\".npmrc\", {\n  // Custom parser for the specific file format\n  parse: (rawContent) => customParse(rawContent),\n  // Custom stringifier for the specific file format\n  stringify: (data) => customStringify(data),\n  // Merge content\n  content: ({ content = {} }) => ({\n    ...content,\n    \"my-setting\": \"value\",\n  }),\n  // Set file attributes (e.g., for .gitignore)\n  attributes: { gitignore: false },\n});\n```\n\n#### ensureDependency\n\nEnsures a dependency is installed in the package.\n\n```typescript\nensureDependency(name: string, dependency?: DependencyDefinitionInput): ScopedRecipeApi\n```\n\n- **Purpose**: Manage dependencies in package.json\n- **Features**:\n  - Installation target customization (dev, peer, regular)\n  - Version specification\n  - Support for aliased packages\n  - Ability to mark as \"built\" for pnpm's `onlyBuiltDependencies`\n\n**Examples**:\n\n```typescript\n// Add a simple dev dependency with default settings\ncondu.root.ensureDependency(\"typescript\");\n\n// Add a dependency with specific options\ncondu.root.ensureDependency(\"react\", {\n  // Specify which dependency list to use\n  list: \"dependencies\",\n  // Specify exact version\n  version: \"18.2.0\",\n  // Use a custom name for the dependency\n  installAsAlias: \"react-aliased\",\n  // Specify how versioning is managed\n  managed: \"version\", // or \"presence\" to preserve existing versions\n});\n\n// Add peer dependencies\ncondu.root.ensureDependency(\"react-dom\", {\n  list: \"peerDependencies\",\n  // Use semver range prefix\n  rangePrefix: \">=\",\n  // Mark as built for pnpm\n  built: true,\n});\n```\n\n#### setDependencyResolutions\n\nSets dependency resolutions to override specific package versions.\n\n```typescript\nsetDependencyResolutions(resolutions: Record<string, string>): ScopedRecipeApi\n```\n\n- **Purpose**: Override dependency versions for all packages in the workspace\n- **Features**:\n  - Works with different package managers (npm, yarn, pnpm)\n  - Adapts to the correct syntax for each package manager\n\n**Examples**:\n\n```typescript\n// Force specific versions of packages\ncondu.root.setDependencyResolutions({\n  lodash: \"4.17.21\",\n  \"webpack/tapable\": \"2.2.1\",\n  \"@types/react\": \"18.0.0\",\n});\n```\n\n#### modifyPackageJson\n\nModifies the package.json file with a custom transformer function.\n\n```typescript\nmodifyPackageJson(modifier: PackageJsonModifier): ScopedRecipeApi\n```\n\n- **Purpose**: Make changes to package.json\n- **Features**:\n  - Full access to the package.json content\n  - Type-safe with package.json type definitions\n  - Can access the global registry state\n\n**Examples**:\n\n```typescript\n// Add custom scripts based on project structure\ncondu.root.modifyPackageJson((pkg) => ({\n  ...pkg,\n  scripts: {\n    ...pkg.scripts,\n    build: \"tsc -p tsconfig.json\",\n    test: \"vitest run\",\n    lint: \"eslint .\",\n  },\n  // Add custom metadata\n  keywords: [...(pkg.keywords || []), \"condu-managed\"],\n}));\n\n// Add or modify specific fields\ncondu.in({ kind: \"package\" }).modifyPackageJson((pkg) => ({\n  ...pkg,\n  // Add TypeScript configuration\n  types: \"./build/index.d.ts\",\n  // Ensure sideEffects flag is set for tree-shaking\n  sideEffects: false,\n}));\n```\n\n#### modifyPublishedPackageJson\n\nModifies the package.json that will be used during publishing.\n\n```typescript\nmodifyPublishedPackageJson(modifier: PackageJsonModifier): ScopedRecipeApi\n```\n\n- **Purpose**: Configure how the package.json appears when published to registries like npm\n- **Features**:\n  - Only affects the published version, not the development version\n  - Perfect for export maps, types path adjustments, etc.\n\n**Examples**:\n\n```typescript\n// Configure exports map for published packages\ncondu.in({ kind: \"package\" }).modifyPublishedPackageJson((pkg) => ({\n  ...pkg,\n  // Add standard entry points\n  main: \"./build/index.js\",\n  module: \"./build/index.js\",\n  types: \"./build/index.d.ts\",\n  // Configure exports map\n  exports: {\n    \".\": {\n      import: \"./build/index.js\",\n      require: \"./build/index.cjs\",\n      types: \"./build/index.d.ts\",\n    },\n    \"./package.json\": \"./package.json\",\n  },\n  // Remove development-only fields\n  devDependencies: undefined,\n}));\n```\n\n#### defineTask\n\nDefines a task that can be run using a task runner.\n\n```typescript\ndefineTask(name: string, taskDefinition: Omit<Task, \"name\">): ScopedRecipeApi\n```\n\n- **Purpose**: Define tasks for build, test, etc. that can be run by task runners or package scripts\n- **Features**:\n  - Task type categorization\n  - Dependencies between tasks\n  - Command definition\n\n**Examples**:\n\n```typescript\n// Define a build task\ncondu.root.defineTask(\"build\", {\n  type: \"build\",\n  command: \"tsc -p tsconfig.json\",\n  inputs: [\"**/*.ts\", \"tsconfig.json\"],\n  outputs: [\"build/**\"],\n});\n\n// Define a test task that depends on the build task\ncondu.root.defineTask(\"test\", {\n  type: \"test\",\n  command: \"vitest run\",\n  deps: [\"build\"],\n});\n```\n\n#### ignoreFile\n\nMarks a file to be ignored by certain tools.\n\n```typescript\nignoreFile(path: string, options?: Omit<PartialGlobalFileAttributes, \"inAllPackages\">): ScopedRecipeApi\n```\n\n- **Purpose**: Add files to gitignore or configure other file attributes without generating content\n- **Features**:\n  - Control file visibility in editors and VCS\n\n**Examples**:\n\n```typescript\n// Add a file to .gitignore\ncondu.root.ignoreFile(\"build/\");\n\n// Configure file attributes\ncondu.root.ignoreFile(\"temp/debug.log\", {\n  gitignore: true,\n  vscode: false, // will still be visible in VSCode\n});\n```\n\n### PeerContext System\n\nThe PeerContext system enables features to share information and coordinate with each other:\n\n1. **Declaring Context**: Features declare what data is exposed and modifiable via TypeScript interface augmentation\n\n```typescript\ndeclare module \"condu\" {\n  interface PeerContext {\n    myFeature: {\n      config: MyConfigType;\n    };\n  }\n}\n```\n\n2. **Initializing Context**: Features provide their initial context data\n\n```typescript\ninitialPeerContext: {\n  config: {\n    /* initial data */\n  }\n}\n```\n\n3. **Modifying Other Contexts**: Features can modify other features' contexts\n\n```typescript\nmodifyPeerContexts: (project, initialContext) => ({\n  otherFeature: (current) => ({\n    ...current,\n    someOption: true,\n  }),\n});\n```\n\n4. **Using Context**: Features get the _final_ (merged) context data passed in to their recipes when they are applied\n\n```typescript\ndefineRecipe(condu, peerContext) {\n  // Use peerContext.config\n}\n```\n\nThis system enables powerful coordination between features without tight coupling.\n\nTo resolve any type-system issues when building a feature that might influence others, be sure to include the peer features as an optional peerDependency, with a broad version requirement (such as `*` or `>=1.0.0`).\n\n## CLI Reference\n\nCondu provides a comprehensive CLI for managing your projects.\n\n### Core Commands\n\n#### `condu init [project-name]`\n\nInitializes a new condu project in the current directory or creates a new directory with the specified name.\n\n```bash\n# Initialize in current directory\ncondu init\n\n# Create a new project directory\ncondu init my-new-project\n```\n\nOptions: None\n\nThe init command will:\n\n- Create a `.config` directory with a default `condu.ts` file\n- Set up a package.json with the necessary dependencies\n- Initialize a git repository if one doesn't exist\n- Add a postinstall script that runs `condu apply`\n\n#### `condu apply`\n\nApplies configuration from your `.config/condu.ts` file, generating or updating all configuration files.\n\n```bash\ncondu apply\n```\n\nOptions: None\n\nThis is the primary command you'll use to apply changes after modifying your condu configuration.\n\n#### `condu create <partial-path> [options]`\n\nCreates a new package in a monorepo according to your project conventions.\n\n```bash\n# Create a basic package\ncondu create features/my-feature\n\n# Create a package with a custom name\ncondu create features/my-feature --as @myorg/custom-name\n```\n\nOptions:\n\n- `--as <name>`: Specify a custom package name\n- `--description <text>`: Add a description to the package.json\n- `--private`: Mark the package as private\n\n#### `condu tsc [options]`\n\nBuilds TypeScript code and additionally creates CommonJS (.cjs) or ES Module (.mjs) versions of your code.\n\n```bash\n# Build with CommonJS output\ncondu tsc --preset ts-to-cts\n\n# Build with ES Module output\ncondu tsc --preset ts-to-mts\n```\n\nOptions:\n\n- `--preset ts-to-cts|ts-to-mts`: Generate CommonJS or ES Module versions\n- All standard TypeScript compiler options are supported\n\n#### `condu release [packages...] [options]`\n\nPrepares packages for release by generating distributable files and optionally publishing to npm.\n\n```bash\n# Release all packages\ncondu release\n\n# Release specific packages\ncondu release @myorg/package1 @myorg/package2\n\n# Do a dry run without publishing\ncondu release --dry-run\n```\n\nOptions:\n\n- `--ci`: Mark non-released packages as private (useful in CI environments)\n- `--npm-tag <tag>`: Specify the npm tag to use (default: latest)\n- `--dry-run`: Prepare packages without actually publishing\n\n#### `condu exec <command> [args...]`\n\nExecutes a command in the context of a selected package.\n\n```bash\n# Run in current directory\ncondu exec npm run test\n\n# Run in a specific package\ncondu exec --pkg @myorg/my-package npm run test\n```\n\nOptions:\n\n- `--cwd <path>`: Specify the working directory\n- `--pkg <package>`: Specify the target package\n\n### Helper Commands\n\n- `condu help`: Shows help information\n- `condu version`: Shows the current condu version\n\n## Best Practices\n\n1. **Keep features focused**: Each feature should manage one aspect of configuration\n2. **Use peer contexts** for cross-feature coordination, e.g. if you know that the project is TypeScript-based, you might want to enable TS-specific linters in your linter feature\n3. **Use presets** to combine common feature sets, making common boilerplates like `create-react-app` obsolete\n4. **Create custom features** for organization-specific configuration patterns\n5. **Commit the generated files** to source control for transparency\n\n## Preset Example\n\nPresets combine multiple features with sensible defaults:\n\n```typescript\n// monorepo.ts\nexport const monorepo =\n  (options = {}) =>\n  (pkg) => ({\n    projects: [\n      {\n        parentPath: \"packages\",\n        nameConvention: `@${pkg.name}/*`,\n      },\n    ],\n    features: [\n      typescript(options.typescript),\n      eslint(options.eslint),\n      prettier(options.prettier),\n      pnpm(options.pnpm),\n      // Add more features\n    ],\n  });\n```\n\nUse a preset in your project:\n\n```typescript\nimport { configure } from \"condu\";\nimport { monorepo } from \"@condu-preset/monorepo\";\n\nexport default configure(\n  monorepo({\n    // Override specific feature options\n    typescript: {\n      preset: \"commonjs-first\",\n    },\n  }),\n);\n```\n\n## Conclusion\n\ncondu streamlines configuration management by:\n\n- Centralizing all configuration in code\n- Providing strong typing with TypeScript\n- Enabling reuse across projects\n- Minimizing boilerplate\n- Making updates easier to apply\n\nSay goodbye to config hell and focus on building your application!\n","readmeFilename":"README.md"}