{"_id":"@captain_z/lyra","_rev":"7-709a2965cf4b931083cefa71b217170d","name":"@captain_z/lyra","dist-tags":{"latest":"1.0.6"},"versions":{"1.0.0":{"name":"@captain_z/lyra","version":"1.0.0","keywords":["lyra","template","obsidian","weekly","newsletter","cli"],"author":"","license":"MIT","_id":"@captain_z/lyra@1.0.0","maintainers":[{"name":"captain_z","email":"305168898@qq.com"}],"bin":{"lyra":"dist/cli.js"},"dist":{"shasum":"1b0016145839b2174d050dbda00987475a86bc5a","tarball":"https://registry.npmjs.org/@captain_z/lyra/-/lyra-1.0.0.tgz","fileCount":159,"integrity":"sha512-NGEyE+QOrQyjqR8mIWp3rVbB0aHi/w8A61i/xqQ4A0fbC/Ec3HWCyN7IJYsHJVjMa9cWV2GZ5FkY0OTNL7qooA==","signatures":[{"sig":"MEUCIQDx3Jzz+M8Dioo3akHub0Ix0LRKoqTno2hEHTuSHpQZIQIgRHObh7JKFjE4NDXEA3XOPOcPcUdcVVX1lVDJznDd3PQ=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1015175},"main":"dist/index.js","types":"dist/index.d.ts","gitHead":"009c8e6d26b4b408224801f04fe1cd793475d08c","scripts":{"test":"jest","build":"tsc","start":"node dist/cli.js","test:unit":"jest --testPathPattern=\\.test\\.ts$","test:coverage":"jest --coverage","test:property":"jest --testPathPattern=\\.property\\.ts$","prepublishOnly":"npm run build","check:image-hosts":"node scripts/check-image-hosts.js"},"_npmUser":{"name":"captain_z","email":"305168898@qq.com"},"_npmVersion":"11.11.0","description":"Universal content generation framework with plugin-based architecture","directories":{},"_nodeVersion":"24.4.1","dependencies":{"glob":"^10.3.10","date-fns":"^3.0.6","commander":"^11.1.0","minimatch":"^9.0.3","node-cron":"^3.0.3","handlebars":"^4.7.8","cosmiconfig":"^9.0.0","cron-parser":"^4.9.0","gray-matter":"^4.0.3","@clack/prompts":"^0.7.0"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^29.7.0","js-yaml":"^4.1.1","ts-jest":"^29.1.1","fast-check":"^3.15.0","typescript":"^5.3.3","@types/jest":"^29.5.11","@types/node":"^20.19.37","@types/js-yaml":"^4.0.9","@types/node-cron":"^3.0.11","@types/handlebars":"^4.1.0"},"_npmOperationalInternal":{"tmp":"tmp/lyra_1.0.0_1772965327763_0.26561717382849137","host":"s3://npm-registry-packages-npm-production"}},"1.0.1":{"name":"@captain_z/lyra","version":"1.0.1","keywords":["lyra","template","obsidian","weekly","newsletter","cli"],"author":"","license":"MIT","_id":"@captain_z/lyra@1.0.1","maintainers":[{"name":"captain_z","email":"305168898@qq.com"}],"homepage":"https://github.com/codeshareman/ZNorth/tree/main/lyra#readme","bugs":{"url":"https://github.com/codeshareman/ZNorth/issues"},"bin":{"lyra":"dist/cli.js"},"dist":{"shasum":"d83d3d65c8b95a6e6fa6420beb32440a1bc0b4e8","tarball":"https://registry.npmjs.org/@captain_z/lyra/-/lyra-1.0.1.tgz","fileCount":165,"integrity":"sha512-cMgz8z98OmZgsaEVIb9WeeMYNV+/Ypi/lj+JVWElLrR2d7yyC91zD754vHuIocPwLDP+VelpyFEpLXmYV8j3rg==","signatures":[{"sig":"MEYCIQD2TBV6m0SIGPqYsybqmB1c0kgdQKCwu0qN/Mc+F6MeuAIhAIuY4zdyJOm5RKRstlSmogQNI6V3Ya5BG//CTOHUa2Tw","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1047039},"main":"dist/index.js","types":"dist/index.d.ts","gitHead":"d8b64522cb3c9f1e6996f9d735cf5f99d550f538","scripts":{"test":"jest","build":"tsc","start":"node dist/cli.js","test:unit":"jest --testPathPattern=\\.test\\.ts$","test:coverage":"jest --coverage","test:property":"jest --testPathPattern=\\.property\\.ts$","prepublishOnly":"npm run build","check:image-hosts":"node scripts/check-image-hosts.js"},"_npmUser":{"name":"captain_z","email":"305168898@qq.com"},"repository":{"url":"git+https://github.com/codeshareman/ZNorth.git","type":"git","directory":"lyra"},"_npmVersion":"11.11.0","description":"Universal content generation framework with plugin-based architecture","directories":{},"_nodeVersion":"24.4.1","dependencies":{"glob":"^10.3.10","date-fns":"^3.0.6","commander":"^11.1.0","minimatch":"^9.0.3","node-cron":"^3.0.3","handlebars":"^4.7.8","cosmiconfig":"^9.0.0","cron-parser":"^4.9.0","gray-matter":"^4.0.3","@clack/prompts":"^0.7.0"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^29.7.0","js-yaml":"^4.1.1","ts-jest":"^29.1.1","fast-check":"^3.15.0","typescript":"^5.3.3","@types/jest":"^29.5.11","@types/node":"^20.19.37","@types/js-yaml":"^4.0.9","@types/node-cron":"^3.0.11","@types/handlebars":"^4.1.0"},"_npmOperationalInternal":{"tmp":"tmp/lyra_1.0.1_1772966201696_0.7599014443338288","host":"s3://npm-registry-packages-npm-production"}},"1.0.2":{"name":"@captain_z/lyra","version":"1.0.2","keywords":["lyra","template","obsidian","weekly","newsletter","cli"],"author":"","license":"MIT","_id":"@captain_z/lyra@1.0.2","maintainers":[{"name":"captain_z","email":"305168898@qq.com"}],"homepage":"https://github.com/codeshareman/Lyra#readme","bugs":{"url":"https://github.com/codeshareman/Lyra/issues"},"bin":{"lyra":"dist/cli.js"},"dist":{"shasum":"98e6299c0bc34159dfcea5764ca50bd2e5ab290a","tarball":"https://registry.npmjs.org/@captain_z/lyra/-/lyra-1.0.2.tgz","fileCount":166,"integrity":"sha512-Z+nxXz1WER7GIavL69gVc+bdKPGQhyNPScmtT4LpGqpj4eIM7fHzvziL2zCtaocGBJmWzvGNrevswc6La+XoCg==","signatures":[{"sig":"MEUCIQDE6i+hU4UyGyYbXu7MXuCgSzpStlKFGe1IbHvlv6XGdwIgUX8eFMBzOdtFAsAQ+yrQeLMgRPPq7Ycw8RbTcQZmsQo=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1073249},"main":"dist/index.js","types":"dist/index.d.ts","gitHead":"b83169d9b64f911e5d490378ff4baa2d7267175e","scripts":{"test":"jest","build":"tsc","start":"node dist/cli.js","test:unit":"jest --testPathPattern=\\.test\\.ts$","test:coverage":"jest --coverage","test:property":"jest --testPathPattern=\\.property\\.ts$","prepublishOnly":"npm run build","check:image-hosts":"node scripts/check-image-hosts.js"},"_npmUser":{"name":"captain_z","email":"305168898@qq.com"},"repository":{"url":"git+https://github.com/codeshareman/Lyra.git","type":"git"},"_npmVersion":"11.11.0","description":"Universal content generation framework with plugin-based architecture","directories":{},"_nodeVersion":"24.4.1","dependencies":{"glob":"^10.3.10","date-fns":"^3.0.6","commander":"^11.1.0","minimatch":"^9.0.3","node-cron":"^3.0.3","handlebars":"^4.7.8","cosmiconfig":"^9.0.0","cron-parser":"^4.9.0","gray-matter":"^4.0.3","@clack/prompts":"^0.7.0"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^29.7.0","js-yaml":"^4.1.1","ts-jest":"^29.1.1","fast-check":"^3.15.0","typescript":"^5.3.3","@types/jest":"^29.5.11","@types/node":"^20.19.37","@types/js-yaml":"^4.0.9","@types/node-cron":"^3.0.11","@types/handlebars":"^4.1.0"},"_npmOperationalInternal":{"tmp":"tmp/lyra_1.0.2_1772972721577_0.35607570592689197","host":"s3://npm-registry-packages-npm-production"}},"1.0.3":{"name":"@captain_z/lyra","version":"1.0.3","keywords":["lyra","template","obsidian","weekly","newsletter","cli"],"author":"","license":"MIT","_id":"@captain_z/lyra@1.0.3","maintainers":[{"name":"captain_z","email":"305168898@qq.com"}],"homepage":"https://github.com/codeshareman/Lyra#readme","bugs":{"url":"https://github.com/codeshareman/Lyra/issues"},"bin":{"lyra":"dist/cli.js"},"dist":{"shasum":"5e45eacece2e11c3901208c9a5a19b7160e22afb","tarball":"https://registry.npmjs.org/@captain_z/lyra/-/lyra-1.0.3.tgz","fileCount":176,"integrity":"sha512-YzXPpbU9nxdRTCIuBDPd6nkZc1iQ893L8mwdlKXClJt/ViSbxGE2i8034bICs6E7QMUahi0GTrj3q3iO0MFLlg==","signatures":[{"sig":"MEUCIFwkTrtl4PA0vIJev8qLZgbWoYdGSAQCZ8JGN6c+SwN+AiEAxfjvHK+jiU8ULuvvHzYebjR49NmmeAv1ZoLj3h6OVwg=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1303062},"main":"dist/index.js","types":"dist/index.d.ts","gitHead":"7bdbf7fd56ee7ac835a52c36279ec231fbeeeb9a","scripts":{"test":"jest","build":"tsc","start":"node dist/cli.js","test:unit":"jest --testPathPattern=\\.test\\.ts$","test:coverage":"jest --coverage","test:property":"jest --testPathPattern=\\.property\\.ts$","prepublishOnly":"npm run build","check:image-hosts":"node scripts/check-image-hosts.js"},"_npmUser":{"name":"captain_z","email":"305168898@qq.com"},"repository":{"url":"git+https://github.com/codeshareman/Lyra.git","type":"git"},"_npmVersion":"11.11.0","description":"Universal content generation framework with plugin-based architecture","directories":{},"_nodeVersion":"24.4.1","dependencies":{"glob":"^10.3.10","sharp":"^0.34.5","date-fns":"^3.0.6","commander":"^11.1.0","minimatch":"^9.0.3","node-cron":"^3.0.3","handlebars":"^4.7.8","cosmiconfig":"^9.0.0","cron-parser":"^4.9.0","gray-matter":"^4.0.3","@clack/prompts":"^0.7.0"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^29.7.0","js-yaml":"^4.1.1","ts-jest":"^29.1.1","fast-check":"^3.15.0","typescript":"^5.3.3","@types/jest":"^29.5.11","@types/node":"^20.19.37","@types/js-yaml":"^4.0.9","@types/node-cron":"^3.0.11","@types/handlebars":"^4.1.0"},"_npmOperationalInternal":{"tmp":"tmp/lyra_1.0.3_1774149809270_0.4643577785205464","host":"s3://npm-registry-packages-npm-production"}},"1.0.4":{"name":"@captain_z/lyra","version":"1.0.4","keywords":["lyra","template","obsidian","weekly","newsletter","cli"],"author":"","license":"MIT","_id":"@captain_z/lyra@1.0.4","maintainers":[{"name":"captain_z","email":"305168898@qq.com"}],"homepage":"https://github.com/codeshareman/Lyra#readme","bugs":{"url":"https://github.com/codeshareman/Lyra/issues"},"bin":{"lyra":"dist/cli.js"},"dist":{"shasum":"6f670bafacc15afea4ebf4a246a6938e68aba99a","tarball":"https://registry.npmjs.org/@captain_z/lyra/-/lyra-1.0.4.tgz","fileCount":176,"integrity":"sha512-pvWG1CYnhwMjgbDSmwj7LhW7bAOZuMxuBpf86prUyQnRZtdiQolczmxrYB2Mh7YXbK6dJxVtmWnquURYHER8Mg==","signatures":[{"sig":"MEUCIQCxDvannuGTcmkuCrCZNFU2Lzh6i5g+eoQ2kw+sdf1J6gIgGpiSj+EagXjzuKhtKmaUx5yN2j97b0SiY6ulmCMYX84=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1309706},"main":"dist/index.js","types":"dist/index.d.ts","gitHead":"5a5ddd60da7641ff19b743e8b4fa85104c7c6979","scripts":{"test":"jest","build":"tsc","start":"node dist/cli.js","test:unit":"jest --testPathPattern=\\.test\\.ts$","test:coverage":"jest --coverage","test:property":"jest --testPathPattern=\\.property\\.ts$","prepublishOnly":"npm run build","check:image-hosts":"node scripts/check-image-hosts.js"},"_npmUser":{"name":"captain_z","email":"305168898@qq.com"},"repository":{"url":"git+https://github.com/codeshareman/Lyra.git","type":"git"},"_npmVersion":"11.11.0","description":"Universal content generation framework with plugin-based architecture","directories":{},"_nodeVersion":"24.4.1","dependencies":{"glob":"^10.3.10","sharp":"^0.34.5","dotenv":"^16.5.1","date-fns":"^3.0.6","commander":"^11.1.0","minimatch":"^9.0.3","node-cron":"^3.0.3","handlebars":"^4.7.8","cosmiconfig":"^9.0.0","cron-parser":"^4.9.0","gray-matter":"^4.0.3","@clack/prompts":"^0.7.0"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^29.7.0","js-yaml":"^4.1.1","ts-jest":"^29.1.1","fast-check":"^3.15.0","typescript":"^5.3.3","@types/jest":"^29.5.11","@types/node":"^20.19.37","@types/js-yaml":"^4.0.9","@types/node-cron":"^3.0.11","@types/handlebars":"^4.1.0"},"_npmOperationalInternal":{"tmp":"tmp/lyra_1.0.4_1774156398993_0.6451534104725951","host":"s3://npm-registry-packages-npm-production"}},"1.0.5":{"name":"@captain_z/lyra","version":"1.0.5","keywords":["lyra","template","obsidian","weekly","newsletter","cli"],"author":"","license":"MIT","_id":"@captain_z/lyra@1.0.5","maintainers":[{"name":"captain_z","email":"305168898@qq.com"}],"homepage":"https://github.com/codeshareman/Lyra#readme","bugs":{"url":"https://github.com/codeshareman/Lyra/issues"},"bin":{"lyra":"dist/cli.js"},"dist":{"shasum":"9b9822428975c039990cc7ecd2c959062ea8b46b","tarball":"https://registry.npmjs.org/@captain_z/lyra/-/lyra-1.0.5.tgz","fileCount":176,"integrity":"sha512-9GL+1BBxa66BonC1T4H5kx8HfVdC3inhK1dGc1WwevOSf1P+hiQbwPUyjltaF0Gt2ydxpmoEQ6Ez32V3oXJeag==","signatures":[{"sig":"MEYCIQDykoEFK06ww3/agfprMNy519otrr5evVN3nm78nbOZJQIhAPPHRqCb5scYMuF7BSor8VE12DytJ2V+RhqEdWlXk5Ev","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1310333},"main":"dist/index.js","types":"dist/index.d.ts","gitHead":"3f2c315309f370db04e10de7de62e1a20b24482e","scripts":{"test":"jest","build":"tsc","start":"node dist/cli.js","test:unit":"jest --testPathPattern=\\.test\\.ts$","test:coverage":"jest --coverage","test:property":"jest --testPathPattern=\\.property\\.ts$","prepublishOnly":"npm run build","check:image-hosts":"node scripts/check-image-hosts.js"},"_npmUser":{"name":"captain_z","email":"305168898@qq.com"},"repository":{"url":"git+https://github.com/codeshareman/Lyra.git","type":"git"},"_npmVersion":"11.11.0","description":"Universal content generation framework with plugin-based architecture","directories":{},"_nodeVersion":"24.4.1","dependencies":{"glob":"^10.3.10","sharp":"^0.34.5","dotenv":"^16.5.1","date-fns":"^3.0.6","commander":"^11.1.0","minimatch":"^9.0.3","node-cron":"^3.0.3","handlebars":"^4.7.8","cosmiconfig":"^9.0.0","cron-parser":"^4.9.0","gray-matter":"^4.0.3","@clack/prompts":"^0.7.0"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^29.7.0","js-yaml":"^4.1.1","ts-jest":"^29.1.1","fast-check":"^3.15.0","typescript":"^5.3.3","@types/jest":"^29.5.11","@types/node":"^20.19.37","@types/js-yaml":"^4.0.9","@types/node-cron":"^3.0.11","@types/handlebars":"^4.1.0"},"_npmOperationalInternal":{"tmp":"tmp/lyra_1.0.5_1774159042341_0.23706803000661392","host":"s3://npm-registry-packages-npm-production"}},"1.0.6":{"name":"@captain_z/lyra","version":"1.0.6","description":"Universal content generation framework with plugin-based architecture","main":"dist/index.js","types":"dist/index.d.ts","bin":{"lyra":"dist/cli.js"},"scripts":{"build":"tsc","test":"jest","test:unit":"jest --testPathPattern=\\.test\\.ts$","test:property":"jest --testPathPattern=\\.property\\.ts$","test:coverage":"jest --coverage","check:image-hosts":"node scripts/check-image-hosts.js","start":"node dist/cli.js","prepublishOnly":"npm run build"},"keywords":["lyra","template","obsidian","weekly","newsletter","cli"],"author":"","license":"MIT","dependencies":{"@clack/prompts":"^0.7.0","commander":"^11.1.0","cosmiconfig":"^9.0.0","cron-parser":"^4.9.0","date-fns":"^3.0.6","dotenv":"^16.5.1","glob":"^10.3.10","gray-matter":"^4.0.3","handlebars":"^4.7.8","minimatch":"^9.0.3","node-cron":"^3.0.3","sharp":"^0.34.5"},"devDependencies":{"@types/handlebars":"^4.1.0","@types/jest":"^29.5.11","@types/js-yaml":"^4.0.9","@types/node":"^20.19.37","@types/node-cron":"^3.0.11","fast-check":"^3.15.0","jest":"^29.7.0","js-yaml":"^4.1.1","ts-jest":"^29.1.1","typescript":"^5.3.3"},"repository":{"type":"git","url":"git+https://github.com/codeshareman/Lyra.git"},"homepage":"https://github.com/codeshareman/Lyra#readme","bugs":{"url":"https://github.com/codeshareman/Lyra/issues"},"gitHead":"b501926cbf98e3b8822efc03e88495dbd80fe2b1","_id":"@captain_z/lyra@1.0.6","_nodeVersion":"24.4.1","_npmVersion":"11.11.0","dist":{"integrity":"sha512-7sNGfn7OUo3zb4ftQZS5Qqc29Nn4+x6JVRTU41juC7LxLpdq/85+UIY7v4UuVZUSBeImeTuh45iweQiZk2Ihlg==","shasum":"129d7284204b7ef78fa3b09290aef04ea0fe3c73","tarball":"https://registry.npmjs.org/@captain_z/lyra/-/lyra-1.0.6.tgz","fileCount":176,"unpackedSize":1400951,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEUCIF8i1lCugkEFastcrx0O2CGAh7hehHBJe7kII/pwjhCeAiEAvxmG+6PrjI3lC2WXJMGOEELBoy+YgJ7nxXfLNDiKTMQ="}]},"_npmUser":{"name":"captain_z","email":"305168898@qq.com"},"directories":{},"maintainers":[{"name":"captain_z","email":"305168898@qq.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/lyra_1.0.6_1775450985131_0.9767874641775838"},"_hasShrinkwrap":false}},"time":{"created":"2026-03-08T10:22:07.634Z","modified":"2026-04-06T04:49:45.437Z","1.0.0":"2026-03-08T10:22:07.927Z","1.0.1":"2026-03-08T10:36:41.936Z","1.0.2":"2026-03-08T12:25:21.782Z","1.0.3":"2026-03-22T03:23:29.497Z","1.0.4":"2026-03-22T05:13:19.149Z","1.0.5":"2026-03-22T05:57:22.503Z","1.0.6":"2026-04-06T04:49:45.334Z"},"bugs":{"url":"https://github.com/codeshareman/Lyra/issues"},"license":"MIT","homepage":"https://github.com/codeshareman/Lyra#readme","keywords":["lyra","template","obsidian","weekly","newsletter","cli"],"repository":{"type":"git","url":"git+https://github.com/codeshareman/Lyra.git"},"description":"Universal content generation framework with plugin-based architecture","maintainers":[{"name":"captain_z","email":"305168898@qq.com"}],"readme":"# Lyra\n\n[English README (Default)](https://github.com/codeshareman/Lyra/blob/main/README.md)\n\nLyra 是一个面向 Markdown 内容生产的 CLI 工具，用于生成周报内容、组装文章 Prompt，并治理 frontmatter 元数据（尤其是 tags）。\n\n包名：`@captain_z/lyra`  \n命令：`lyra`\n\n## 目录\n\n- [功能](#功能)\n- [安装](#安装)\n- [快速开始](#快速开始)\n- [命令参考](#命令参考)\n- [元数据与标签治理](#元数据与标签治理)\n- [配置发现规则](#配置发现规则)\n- [最小配置示例](#最小配置示例)\n- [版本策略](#版本策略)\n- [故障排查](#故障排查)\n- [文档](#文档)\n- [许可证](#许可证)\n\n## 功能\n\n- 模板化内容生成（`weekly` 等）\n- 通过 `lyra article` / `lyra prompt` 组装 Prompt\n- 使用 `lyra schedule` 执行调度\n- 使用 `lyra check-images` 检查图片域名\n- 使用 `lyra check-metadata` 检查并整理元数据与 tags\n\n## 安装\n\n```bash\n# 全局安装\nnpm install -g @captain_z/lyra\n\n# 本地安装\nnpm install @captain_z/lyra\n```\n\n## 快速开始\n\n```bash\n# 1) 初始化配置\nlyra init\n\n# 2) 查看模板\nlyra list\n\n# 3) 预览生成（不写文件）\nlyra weekly --dry-run\n\n# 4) 真实生成\nlyra weekly\n```\n\n## 命令参考\n\n| 命令 | 别名 | 说明 |\n|---|---|---|\n| `lyra` | - | 启动交互模式 |\n| `lyra <template>` | - | 按模板快速生成 |\n| `lyra create [template]` | `lyra c` | 显式生成命令 |\n| `lyra list` | `lyra ls` | 列出模板 |\n| `lyra init` | - | 初始化配置 |\n| `lyra config` | - | 查看/验证配置 |\n| `lyra schedule` | `lyra sched` | 启动调度器 |\n| `lyra check-images` | `lyra check-img` | 图片域名白名单检查 |\n| `lyra check-metadata` | `lyra check-meta` | 元数据与 tags 整理 |\n| `lyra article` | `lyra a` | 文章 Prompt 组装 |\n| `lyra prompt` | `lyra p` | `article` 的兼容别名 |\n| `lyra publish` | - | 发布到平台草稿（WeChat API/Playwright） |\n\n### 发布配置（多内容 + 模块关联）\n\n- 建议使用独立的 `wechat.publish.json` / `zhihu.publish.json` 配置文件\n- 发布配置仅包含平台发布字段（AI 配置跟随 `.lyrarc.json`）\n- 密钥类配置（如 `WECHAT_ACCESS_TOKEN`、`AI_API_KEY`）请放在 `.env`（会自动加载），需要时可用 `--env` 指定自定义文件，参考 `.env.example`\n\n```json\n{\n  \"lyraConfig\": \"./.lyrarc.json\",\n  \"title\": \"默认标题\",\n  \"author\": \"Lyra\",\n  \"digest\": \"默认摘要\",\n  \"thumb_image_path\": \"./Output/Z° North/Publish/default-cover.png\",\n  \"cover_source_order\": [\"ai\", \"unsplash\", \"placeholder\"],\n  \"articles\": [\n    {\n      \"title\": \"Weekly #12\",\n      \"module\": \"weekly\",\n      \"contentFile\": \"./Output/Z° North/Z°N Weekly/drafts/2026-03-16-weekly.html\"\n    },\n    {\n      \"title\": \"生活志 · 通勤观察\",\n      \"contentFile\": \"./Output/Z° North/Z°N 生活志/drafts/2026-03-16-life.html\"\n    }\n  ]\n}\n```\n\n发布命令：\n```bash\nlyra publish --config ./wechat.publish.json\n```\n\n## 元数据与标签治理\n\n`lyra check-metadata` 同时支持目录与单文件，并支持自动去重和 AI 补全标签。\n\n```bash\n# 目录检查（不改文件）\nlyra check-metadata --path ../your-notes-repo\n\n# 自动整理 tags\nlyra check-metadata --path ../your-notes-repo --fix-tags\n\n# 单文件整理\nlyra check-metadata --path ./Input/Notes/today.md --fix-tags\n\n# 本地清洗后，再用 AI 补全 tags\nlyra check-metadata --path ../your-notes-repo --fix-tags --ai-tags --provider openai\n```\n\n常用参数：\n\n- `--path <path>`：目录或单个 Markdown 文件\n- `--fix-tags`：去重、trim、分隔符清洗\n- `--ai-tags`：按标题和正文补全更合适 tags\n- `--max-tags <n>`：每篇最大 tags 数（默认 `8`）\n- `--min-tags <n>`：每篇最小 tags 数（默认 `1`）\n- `--dry-run`：只预览不落盘\n\nProvider 说明：\n\n- 统一使用 `.env` 中的 `AI_API_KEY`\n- 用 `AI_BASE_URL` 切换不同提供商（OpenAI 兼容，如 OpenRouter/LiteLLM）\n- `AI_MODEL` 控制模型名\n\n示例 `.env`：\n```text\nAI_API_KEY=your_key\nAI_BASE_URL=https://openrouter.ai/api/v1\nAI_MODEL=openai/gpt-4o-mini\n```\n\nLiteLLM 示例：\n```text\nAI_API_KEY=your_key\nAI_BASE_URL=http://localhost:4000/v1\nAI_MODEL=gpt-4o-mini\n```\n\nUnsplash（封面兜底）：\n```text\nUNSPLASH_ACCESS_KEY=your_unsplash_key\n```\n\n引用链接：\n```json\n{\n  \"templates\": {\n    \"weekly\": {\n      \"export\": {\n        \"referenceLinks\": { \"enabled\": true }\n      }\n    }\n  }\n}\n```\n\n## 配置发现规则\n\nCLI 会从当前目录向上查找：\n\n- `.lyrarc`\n- `.lyrarc.json`\n- `.lyrarc.yaml`\n- `.lyrarc.yml`\n- `.lyrarc.js`\n- `.lyrarc.cjs`\n- `.lyrarc.mjs`\n- `lyra.config.json`\n- `lyra.config.js`\n- `lyra.config.cjs`\n- `lyra.config.mjs`\n\n## 最小配置示例\n\n```json\n{\n  \"global\": {\n    \"logLevel\": \"info\",\n    \"defaultTemplate\": \"weekly\"\n  },\n  \"templates\": {\n    \"weekly\": {\n      \"enabled\": true,\n      \"template\": {\n        \"path\": \"./templates/weekly.hbs\"\n      },\n      \"sources\": {\n        \"articles\": \"./articles\",\n        \"tools\": \"./tools\",\n        \"notes\": \"./notes\"\n      },\n      \"output\": {\n        \"path\": \"./output\",\n        \"filename\": \"Weekly-{{issueNumber}}.md\"\n      },\n      \"content\": {\n        \"articles\": { \"topN\": 10, \"minRating\": 0 },\n        \"tools\": { \"perCategory\": 3 },\n        \"notes\": { \"groupBy\": \"none\" }\n      }\n    }\n  }\n}\n```\n\n## 版本策略\n\n使用语义化版本（`MAJOR.MINOR.PATCH`）：\n\n- `MAJOR`：不兼容变更\n- `MINOR`：向后兼容功能\n- `PATCH`：向后兼容修复\n\n建议每次发布至少递增 `PATCH`。\n\n## 故障排查\n\n### `npm publish` 在 `prepublishOnly` 失败\n\n若在 `npm run build` 阶段出现 `EPERM`（`dist` 不可写），先清理并重建：\n\n```bash\nrm -rf dist\nnpm run build\n```\n\n### 找不到配置文件\n\n```bash\nlyra init\n```\n\n### 输出内容不符合预期\n\n```bash\nlyra weekly --dry-run --verbose\n```\n\n## 文档\n\n- [CLI 使用指南](https://github.com/codeshareman/Lyra/blob/main/CLI_GUIDE.md)\n- [快速入门](https://github.com/codeshareman/Lyra/blob/main/QUICK_START.md)\n- [增强模板指南](https://github.com/codeshareman/Lyra/blob/main/docs/enhanced-template-guide.md)\n- [迁移指南（Legacy -> Enhanced）](https://github.com/codeshareman/Lyra/blob/main/docs/migration-guide.md)\n- [增强配置 Schema](https://github.com/codeshareman/Lyra/blob/main/schemas/enhanced-config.schema.json)\n\n## 许可证\n\nMIT\n","readmeFilename":"README.zh-CN.md"}