{"_id":"@0x1461a0/0xmd-cli","_rev":"2-ffa473dae06b2bdd9e0431aa5750c33b","name":"@0x1461a0/0xmd-cli","dist-tags":{"latest":"0.2.0"},"versions":{"0.1.0":{"name":"@0x1461a0/0xmd-cli","version":"0.1.0","_id":"@0x1461a0/0xmd-cli@0.1.0","maintainers":[{"name":"0x1461a0","email":"x1294699027@gmail.com"}],"bin":{"0xmd":"dist/index.js"},"dist":{"shasum":"262aa59293cc3f69677ef324466815e9f0f1bb04","tarball":"https://registry.npmjs.org/@0x1461a0/0xmd-cli/-/0xmd-cli-0.1.0.tgz","fileCount":3,"integrity":"sha512-n6M61dywEAtZLFIPpb1BGYTsfRhN6PNJDbmFTH4N45CpmA5i52dCaSCTt8iZVZ+xMmvDZhQXpCDU92WsMtJYDA==","signatures":[{"sig":"MEYCIQCdsn7KnXMAaUdeR2FUoCqoDE7Jv/UQXbKcMh47JScEWQIhAJxrhUgAmYdvoZC7sUPIC4aK/2px2N9OiuDGqUyaEA8/","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":11023},"type":"module","_from":"file:0x1461a0-0xmd-cli-0.1.0.tgz","scripts":{"dev":"tsup --watch","build":"tsup"},"_npmUser":{"name":"0x1461a0","email":"x1294699027@gmail.com"},"_resolved":"/private/var/folders/mh/0mdz9q8s29lg05p3g_my20pr0000gn/T/88e51e5cad93e4d91861e3a9e2c813f7/0x1461a0-0xmd-cli-0.1.0.tgz","_integrity":"sha512-n6M61dywEAtZLFIPpb1BGYTsfRhN6PNJDbmFTH4N45CpmA5i52dCaSCTt8iZVZ+xMmvDZhQXpCDU92WsMtJYDA==","_npmVersion":"10.7.0","description":"Local-first Markdown 内容管理 CLI 工具。","directories":{},"_nodeVersion":"20.15.0","dependencies":{"citty":"^0.1.6","consola":"^3.4.2","@0x1461a0/0xmd-core":"0.1.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.5.0","typescript":"^5.9.3","@types/node":"^24.0.10"},"_npmOperationalInternal":{"tmp":"tmp/0xmd-cli_0.1.0_1771249385665_0.2619238136582338","host":"s3://npm-registry-packages-npm-production"}},"0.2.0":{"name":"@0x1461a0/0xmd-cli","version":"0.2.0","type":"module","publishConfig":{"access":"public"},"bin":{"0xmd":"dist/index.js"},"dependencies":{"citty":"^0.1.6","consola":"^3.4.2","yaml":"^2.8.2","@0x1461a0/0xmd-core":"0.2.0"},"devDependencies":{"@types/node":"^24.0.10","tsup":"^8.5.0","typescript":"^5.9.3"},"scripts":{"build":"tsup","dev":"tsup --watch"},"_id":"@0x1461a0/0xmd-cli@0.2.0","description":"Local-first Markdown 内容管理 CLI 工具。","_integrity":"sha512-6iIgsD7H/IlJ/RyrSnlHvYexKxGCoIl88i6Pnb0fZJdiqJhjd5ayhdA3329aaI5SrH9Plssp/LGj+JqSAv6HNQ==","_resolved":"/private/var/folders/mh/0mdz9q8s29lg05p3g_my20pr0000gn/T/ef2e5bdcc24ec0256d02bcc31f423498/0x1461a0-0xmd-cli-0.2.0.tgz","_from":"file:0x1461a0-0xmd-cli-0.2.0.tgz","_nodeVersion":"24.13.1","_npmVersion":"11.8.0","dist":{"integrity":"sha512-6iIgsD7H/IlJ/RyrSnlHvYexKxGCoIl88i6Pnb0fZJdiqJhjd5ayhdA3329aaI5SrH9Plssp/LGj+JqSAv6HNQ==","shasum":"bf486eaadf57b3224df4dbdbeb4a9c2881bd81d8","tarball":"https://registry.npmjs.org/@0x1461a0/0xmd-cli/-/0xmd-cli-0.2.0.tgz","fileCount":3,"unpackedSize":17144,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEUCIG4Xb48OhFdi2M+lz/i6J1yj8nN5eoAg7vvlyTY38YLWAiEAvzAnndlJsSCimltpPPUVkCGAWNxordTRFTNcwYHas6k="}]},"_npmUser":{"name":"0x1461a0","email":"x1294699027@gmail.com"},"directories":{},"maintainers":[{"name":"0x1461a0","email":"x1294699027@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/0xmd-cli_0.2.0_1771348863698_0.16418929422449513"},"_hasShrinkwrap":false}},"time":{"created":"2026-02-16T13:43:05.558Z","modified":"2026-02-17T17:21:03.949Z","0.1.0":"2026-02-16T13:43:05.801Z","0.2.0":"2026-02-17T17:21:03.843Z"},"description":"Local-first Markdown 内容管理 CLI 工具。","maintainers":[{"name":"0x1461a0","email":"x1294699027@gmail.com"}],"readme":"# @0x1461a0/0xmd-cli\n\nLocal-first Markdown 内容管理 CLI 工具。\n\n在本地编辑器（Typora、VS Code 等）中编写纯 Markdown，通过 `0xmd` 扫描、校验、检测变更并发布到远程 Git 仓库。发布时自动注入 frontmatter，本地源文件保持纯净。\n\n## 安装\n\n项目已集成在 monorepo 中，根目录执行：\n\n```bash\npnpm install\npnpm build\n```\n\n构建后可通过以下方式运行：\n\n```bash\n# 直接执行\nnode apps/cms-cli/dist/index.js <command>\n\n# 或通过 pnpm\npnpm --filter @0x1461a0/0xmd-cli exec 0xmd <command>\n```\n\n## 配置\n\n在 `~/.0xmd/0xmd.config.yml` 创建配置文件：\n\n```yaml\n# 本地 Markdown 内容目录（必填）\ncontentDir: ~/my-blog-content\n\n# Git 远程仓库配置（必填）\ngit:\n  remote: git@github.com:username/blog-content.git\n  branch: main          # 可选，默认 main\n  cloneDir: ~/.0xmd/repo # 可选，本地 clone 路径\n\n# 文件匹配模式，可选，默认 [\"**/*.md\"]\npatterns:\n  - \"**/*.md\"\n  - \"**/*.mdx\"\n```\n\n`contentDir` 和 `cloneDir` 支持 `~` 路径。\n\n## 命令\n\n### `0xmd scan`\n\n扫描内容目录，发现 Markdown 文件并同步元数据。\n\n```bash\n0xmd scan\n# ✔ Found 12 content file(s):\n#   hello-world — posts/hello-world.md\n#   my-second-post — posts/my-second-post.md\n#   ...\n```\n\n首次扫描会在 `contentDir/.0xmd/metadata.json` 中为每个文件自动生成初始元数据（title 从文件名推导，created/updated 取文件修改时间）。后续可手动编辑该文件来设置 slug、tags、description 等。\n\n### `0xmd diff`\n\n对比当前内容与上次发布的 manifest，显示变更。\n\n```bash\n0xmd diff\n# ✔ Added (2):\n#   + new-post — posts/new-post.md\n#   + another — drafts/another.md\n# ⚠ Updated (1):\n#   ~ hello-world — posts/hello-world.md\n# ✖ Removed (1):\n#   - old-post — posts/old-post.md\n```\n\n### `0xmd validate`\n\n校验所有内容的元数据：检查必填字段、重复 id/slug、日期格式、slug 格式等。\n\n```bash\n0xmd validate\n# ✔ All content is valid.\n```\n\n校验失败时列出所有错误并以非零退出码退出。\n\n### `0xmd build-index`\n\n重建内容索引文件（`contentDir/.0xmd/index.json`），包含按 id、slug、tag 分组及按日期排序的视图。\n\n```bash\n0xmd build-index\n# ✔ Index rebuilt with 12 entries.\n```\n\n### `0xmd reset-manifest`\n\n清空 manifest，下次 `diff` 或 `publish` 时所有内容将被视为新增。\n\n```bash\n0xmd reset-manifest\n# ✔ Manifest has been reset.\n```\n\n### `0xmd publish`\n\n完整发布流程：校验 → 计算变更 → 确认 → 写入 Git 仓库（注入 frontmatter）→ commit & push → 更新 manifest 和索引。\n\n```bash\n0xmd publish\n# ℹ Changes to publish:\n#   + 2 added\n#   ~ 1 updated\n# ? Proceed with publish? (Y/n)\n# ✔ Published: 3 written, 0 removed.\n#   Commit: a1b2c3d\n# ✔ Manifest and index updated.\n```\n\n## 典型工作流\n\n```bash\n# 1. 在编辑器中写好 Markdown 文件，放入 contentDir\n\n# 2. 扫描，自动生成元数据\n0xmd scan\n\n# 3. 编辑 contentDir/.0xmd/metadata.json，补充 tags、description 等\n\n# 4. 查看变更\n0xmd diff\n\n# 5. 校验\n0xmd validate\n\n# 6. 发布到远程仓库\n0xmd publish\n```\n\n## 数据文件\n\n所有数据文件存放在 `contentDir/.0xmd/` 目录下（已加入 `.gitignore`）：\n\n| 文件 | 说明 |\n|------|------|\n| `metadata.json` | 各文件的元数据（title, slug, tags, description, created, updated） |\n| `manifest.json` | 上次发布时的 id → hash 快照，用于变更检测 |\n| `index.json` | 内容索引（byId, bySlug, byTag, sortedByDate） |\n| `path-map.json` | id → 文件路径映射，用于跟踪删除 |\n","readmeFilename":"README.md"}