{"_id":"@1dot5/zenn-syndicate","_rev":"3-1d47abdae8a76de7dee2de39ebff71dc","name":"@1dot5/zenn-syndicate","dist-tags":{"latest":"0.3.1"},"versions":{"0.2.0":{"name":"@1dot5/zenn-syndicate","version":"0.2.0","license":"MIT","_id":"@1dot5/zenn-syndicate@0.2.0","maintainers":[{"name":"mtyk15","email":"kondo@1dot5.jp"}],"homepage":"https://github.com/1dot5/zenn-syndicate#readme","bugs":{"url":"https://github.com/1dot5/zenn-syndicate/issues"},"bin":{"zenn-syndicate":"dist/cli.js"},"dist":{"shasum":"e83276e02eb3d852f922427dfbaa33ead106ab12","tarball":"https://registry.npmjs.org/@1dot5/zenn-syndicate/-/zenn-syndicate-0.2.0.tgz","fileCount":9,"integrity":"sha512-8gEMzIBC7kjfNy5AeRBlgoGuzQOC71p1QYj1X54KrcZXopmHFAJowTGVU4BT7uqKK00xq/wYSdOiofZHc9NVrw==","signatures":[{"sig":"MEQCID7TYW8qD7RTcE5ENv59U0TnsbGXUJNQndfJd7IxhPMlAiB4mwZNArnZ10dN6Ts3XwnwoPpSlcWe3pGzIVnE8nAIWQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@1dot5%2fzenn-syndicate@0.2.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":51054},"main":"./dist/index.js","type":"module","_from":"file:1dot5-zenn-syndicate-0.2.0.tgz","types":"./dist/index.d.ts","engines":{"node":">=20"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"}},"scripts":{"dev":"tsdown --watch","lint":"oxlint src test","test":"vitest run","build":"tsdown","format":"prettier --write .","typecheck":"tsc --noEmit","test:watch":"vitest","format:check":"prettier --check ."},"_npmUser":{"name":"mtyk15","email":"kondo@1dot5.jp"},"_resolved":"/tmp/d5b5dddb159ae8a1cf79a9348210bf59/1dot5-zenn-syndicate-0.2.0.tgz","_integrity":"sha512-8gEMzIBC7kjfNy5AeRBlgoGuzQOC71p1QYj1X54KrcZXopmHFAJowTGVU4BT7uqKK00xq/wYSdOiofZHc9NVrw==","repository":{"url":"git+https://github.com/1dot5/zenn-syndicate.git","type":"git"},"_npmVersion":"10.8.2","description":"Convert Markdown articles from anywhere into Zenn-ready front matter and assets, and write them into an existing local Zenn repo checkout.","directories":{},"_nodeVersion":"20.20.2","dependencies":{"yaml":"^2.6.1","picocolors":"^1.1.1","tinyglobby":"^0.2.10","gray-matter":"^4.0.3"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"oxlint":"^0.15.7","tsdown":"^0.15.6","vitest":"^2.1.8","prettier":"^3.4.2","typescript":"^5.7.2","@types/node":"^22.10.2"},"optionalDependencies":{"sharp":"^0.34.2"},"_npmOperationalInternal":{"tmp":"tmp/zenn-syndicate_0.2.0_1788058584585_0.8094538878463997","host":"s3://npm-registry-packages-npm-production"}},"0.3.0":{"name":"@1dot5/zenn-syndicate","version":"0.3.0","license":"MIT","_id":"@1dot5/zenn-syndicate@0.3.0","maintainers":[{"name":"mtyk15","email":"kondo@1dot5.jp"}],"homepage":"https://github.com/1dot5/zenn-syndicate#readme","bugs":{"url":"https://github.com/1dot5/zenn-syndicate/issues"},"bin":{"zenn-syndicate":"dist/cli.js"},"dist":{"shasum":"b79431dda531c90bf96b45068348098a5d3bc52e","tarball":"https://registry.npmjs.org/@1dot5/zenn-syndicate/-/zenn-syndicate-0.3.0.tgz","fileCount":9,"integrity":"sha512-tJFqJUvzmmPuAJNTXr0GJXZ5PITUlIyEzuRmEKePXMX7tdyx2lSzeKWWoFVBBBZiX23PJaqc9e+FJHzPrViyng==","signatures":[{"sig":"MEQCIFE96ju0B33OIJF18g0ycAJIaflSW9j6Lm6VTtx0ajDYAiBv4PyRGLqRijPuZ3FB2WBGckXgXRJJJZbRmJ07GkJnAg==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@1dot5%2fzenn-syndicate@0.3.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":48626},"main":"./dist/index.js","type":"module","_from":"file:1dot5-zenn-syndicate-0.3.0.tgz","types":"./dist/index.d.ts","engines":{"node":">=20"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"}},"scripts":{"dev":"tsdown --watch","lint":"oxlint src test","test":"vitest run","build":"tsdown","format":"prettier --write .","typecheck":"tsc --noEmit","test:watch":"vitest","format:check":"prettier --check ."},"_npmUser":{"name":"mtyk15","email":"kondo@1dot5.jp"},"_resolved":"/tmp/22e770c065e19e2e0e89a7e962425ed8/1dot5-zenn-syndicate-0.3.0.tgz","_integrity":"sha512-tJFqJUvzmmPuAJNTXr0GJXZ5PITUlIyEzuRmEKePXMX7tdyx2lSzeKWWoFVBBBZiX23PJaqc9e+FJHzPrViyng==","repository":{"url":"git+https://github.com/1dot5/zenn-syndicate.git","type":"git"},"_npmVersion":"10.8.2","description":"Convert Markdown articles from anywhere into Zenn-ready front matter and assets, and write them into an existing local Zenn repo checkout.","directories":{},"_nodeVersion":"20.20.2","dependencies":{"yaml":"^2.6.1","picocolors":"^1.1.1","tinyglobby":"^0.2.10","gray-matter":"^4.0.3"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"oxlint":"^0.15.7","tsdown":"^0.15.6","vitest":"^2.1.8","prettier":"^3.4.2","typescript":"^5.7.2","@types/node":"^22.10.2"},"_npmOperationalInternal":{"tmp":"tmp/zenn-syndicate_0.3.0_1788059935314_0.6663795291224459","host":"s3://npm-registry-packages-npm-production"}},"0.3.1":{"name":"@1dot5/zenn-syndicate","version":"0.3.1","description":"Convert Markdown articles from anywhere into Zenn-ready front matter and assets, and write them into an existing local Zenn repo checkout.","homepage":"https://github.com/1dot5/zenn-syndicate#readme","bugs":{"url":"https://github.com/1dot5/zenn-syndicate/issues"},"repository":{"type":"git","url":"git+https://github.com/1dot5/zenn-syndicate.git"},"license":"MIT","type":"module","engines":{"node":">=20"},"main":"./dist/index.js","types":"./dist/index.d.ts","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"}},"bin":{"zenn-syndicate":"dist/cli.js"},"dependencies":{"gray-matter":"^4.0.3","picocolors":"^1.1.1","tinyglobby":"^0.2.10","yaml":"^2.6.1"},"devDependencies":{"@types/node":"^22.10.2","oxlint":"^0.15.7","prettier":"^3.4.2","tsdown":"^0.15.6","typescript":"^5.7.2","vitest":"^2.1.8"},"publishConfig":{"access":"public"},"scripts":{"build":"tsdown","dev":"tsdown --watch","test":"vitest run","test:watch":"vitest","lint":"oxlint src test","format":"prettier --write .","format:check":"prettier --check .","typecheck":"tsc --noEmit"},"_id":"@1dot5/zenn-syndicate@0.3.1","_integrity":"sha512-Y/qDxAVitB9qaXP24DptanDKQLuFapIQ5NjgEkKnJ6Rvp47COuAMsRRmaRjq1plZe1GnsC6eUzy3JsOxtUPk9A==","_resolved":"/tmp/439122a606b9d2ec0b52472279be902d/1dot5-zenn-syndicate-0.3.1.tgz","_from":"file:1dot5-zenn-syndicate-0.3.1.tgz","_nodeVersion":"20.20.2","_npmVersion":"10.8.2","dist":{"integrity":"sha512-Y/qDxAVitB9qaXP24DptanDKQLuFapIQ5NjgEkKnJ6Rvp47COuAMsRRmaRjq1plZe1GnsC6eUzy3JsOxtUPk9A==","shasum":"1b73c1a27c8c5bbb66d96b8fc4d18c82a638ddc3","tarball":"https://registry.npmjs.org/@1dot5/zenn-syndicate/-/zenn-syndicate-0.3.1.tgz","fileCount":9,"unpackedSize":48421,"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@1dot5%2fzenn-syndicate@0.3.1","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEUCIADnK+ffIgMhHKC0fag08Fx2JWPej/NKwi7E3cYERyRcAiEAh4PrH/qacwNxt29DfIHRsGv+gXcx+yn2iCYhyy0bJE4="}]},"_npmUser":{"name":"mtyk15","email":"kondo@1dot5.jp"},"directories":{},"maintainers":[{"name":"mtyk15","email":"kondo@1dot5.jp"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/zenn-syndicate_0.3.1_1788060488690_0.5290268277831482"},"_hasShrinkwrap":false}},"time":{"created":"2026-08-30T02:56:24.471Z","modified":"2026-08-30T03:28:09.239Z","0.2.0":"2026-08-30T02:56:24.723Z","0.3.0":"2026-08-30T03:18:55.450Z","0.3.1":"2026-08-30T03:28:08.849Z"},"bugs":{"url":"https://github.com/1dot5/zenn-syndicate/issues"},"license":"MIT","homepage":"https://github.com/1dot5/zenn-syndicate#readme","repository":{"type":"git","url":"git+https://github.com/1dot5/zenn-syndicate.git"},"description":"Convert Markdown articles from anywhere into Zenn-ready front matter and assets, and write them into an existing local Zenn repo checkout.","maintainers":[{"name":"mtyk15","email":"kondo@1dot5.jp"}],"readme":"# @1dot5/zenn-syndicate\n\n好きな場所（ブログ用リポジトリ、Obsidian vaultなど）に書いたMarkdown記事を、\n[Zenn](https://zenn.dev) が読み込める形式（front matter・画像パス）に変換し、\n**既に存在する**ローカルのZenn連携用リポジトリのチェックアウトへ書き出すツールです。\n\nこのパッケージはファイルを書き出すだけです。リポジトリの作成・clone・commit・push は一切行いません\n（それらはあなた自身、または後述のGitHub Actionsサンプルワークフローが行います）。\n\n## インストール\n\n```sh\nnpm install --save-dev @1dot5/zenn-syndicate\n```\n\nNode.js 20以上が必要です。\n\n## クイックスタート\n\n```sh\nnpx zenn-syndicate init\n```\n\n以下が生成されます:\n\n- `zenn-syndicate.config.mjs` — 設定ファイル\n- `.github/workflows/sync-zenn.yml` — サンプルのCIワークフロー（後述）\n\n設定ファイルを編集して、記事の置き場所と、既存のZennリポジトリのローカルチェックアウトパスを指定したら:\n\n```sh\nnpx zenn-syndicate check   # 検証のみ。何も書き出さない\nnpx zenn-syndicate build   # 変換して output.dir に書き出す\n```\n\n## 設定ファイル\n\n```js\n// zenn-syndicate.config.mjs\nimport { defineConfig } from \"@1dot5/zenn-syndicate\";\n\nexport default defineConfig({\n  source: {\n    dir: \"content/articles\", // Markdown記事が置かれているディレクトリ\n    include: [\"**/*.md\"], // source.dir からの相対glob\n  },\n  output: {\n    // 既に存在するZennリポジトリのローカルチェックアウトパス\n    dir: \"../my-zenn-repo\",\n    articlesDir: \"articles\", // output.dir からの相対\n    imagesDir: \"images\", // output.dir からの相対\n  },\n  defaults: {\n    type: \"tech\", // \"tech\" | \"idea\"。記事側で省略された場合に使われる\n    published: false,\n    topics: [],\n  },\n  lockFile: \".zenn-syndicate.lock.json\",\n});\n```\n\n`source.dir` と `output.dir` は必須です。`output.dir` は事前に存在している必要があります\n（存在しない場合はビルドがすぐに失敗し、終了コードは `2` になります）。それ以外はすべてデフォルト値があります。\n\n## 記事の書き方\n\n`source.dir` 配下で `source.include` にマッチするMarkdownファイルはすべてソース記事として扱われます。\nfront matterのフィールドは以下の通りです。\n\n| フィールド  | 必須 | 説明                                                                       |\n| ----------- | ---- | -------------------------------------------------------------------------- |\n| `title`     | 必須 | 空でない文字列                                                             |\n| `emoji`     | 必須 | 絵文字1文字ちょうど                                                        |\n| `type`      | 任意 | `\"tech\"` \\| `\"idea\"`。省略時は `defaults.type`                             |\n| `topics`    | 任意 | 文字列配列、最大5個。省略時は `defaults.topics`                            |\n| `published` | 任意 | 真偽値。省略時は `defaults.published`                                      |\n| `slug`      | 任意 | `/^[0-9a-z-_]{12,50}$/` に一致する必要あり。省略時はファイル名から自動生成 |\n\n```md\n---\ntitle: \"TypeScriptのビルドを速くする\"\nemoji: \"⚡\"\ntype: \"tech\"\ntopics: [\"typescript\", \"tsdown\"]\npublished: true\n---\n\n本文はここから。\n\n![説明](./images/before-after.png)\n```\n\n`![alt](path)` で参照されたローカル画像は、記事ファイル自身のディレクトリからの相対パスとして解決され、\n`output.dir/<imagesDir>/<slug>/<ファイル名>` にコピーされます。本文中の参照は\nZennのルート相対形式（`/images/<slug>/<ファイル名>`）に書き換えられます。\nフェンスドコードブロックやインラインコードスパンの中にある参照は書き換えません。\nまた、リモート画像（`http(s)://`、`data:`）は一切書き換えません。\n\nfront matterはYAMLライブラリのdumpを使わず、文字列を組み立てて出力します。\n一般的なYAMLライブラリは絵文字を `\\uXXXX` / `\\UXXXXXXXX` のようにエスケープすることがあり、\nZenn側で `emoji` フィールドの表示が壊れてしまうためです。\n\n## CLI\n\n```\nzenn-syndicate init\nzenn-syndicate build   [--config <path>] [--json] [--dry-run]\nzenn-syndicate check   [--config <path>] [--json]\n```\n\n- `init` — 設定ファイルとサンプルワークフローを、まだ無ければ生成する（既にあれば上書きせずスキップ）\n- `build` — 変換して `output.dir` に書き出す。`--dry-run` を付けると、同じ検証・レポートを行うが書き込みだけスキップする\n- `check` — `build` と同じ検証を行うが、常に何も書き込まない（`--dry-run` を常に付けた `build` と同等）\n\n`--json` を付けると、色付きテキストの代わりにJSONでレポートを出力します:\n\n```json\n{\n  \"diagnostics\": [{ \"level\": \"error\", \"code\": \"invalid-slug\", \"message\": \"...\", \"file\": \"a.md\" }],\n  \"summary\": {\n    \"errors\": 0,\n    \"warnings\": 0,\n    \"infos\": 0,\n    \"filesProcessed\": 0,\n    \"filesWritten\": 0\n  }\n}\n```\n\n### 終了コード\n\n| コード | 意味                                                                                                            |\n| ------ | --------------------------------------------------------------------------------------------------------------- |\n| `0`    | 成功。エラーなし                                                                                                |\n| `1`    | 1件以上の記事でエラーが発生しスキップされた。それ以外の記事は通常通り処理された                                 |\n| `2`    | 致命的エラー。設定ファイルが読み込めない、または `output.dir`/`source.dir` が存在しない。何も書き出されていない |\n\nビルドは最初のエラーで止まりません。全記事を処理しきってから、すべての結果をまとめて報告します。\n1回の実行で全部の問題を直せるようにするためです。\n\n## 差分検出の仕組み\n\nビルドのたびに、記事ごと（および画像ごと）のコンテンツハッシュがロックファイル\n（設定の `lockFile`、デフォルトは `.zenn-syndicate.lock.json`）に記録されます。\n変更が無い記事は次回ビルドでスキップされます（`unchanged` というinfoレベルの診断が出ます）。\nソース記事が削除された場合、以前生成した出力ファイルは**自動削除されません**。\n代わりに `orphaned-output` という警告が出るので、対応はあなたが判断してください。\n\n`--dry-run` と `check` はロックファイルを更新しません。\n\n## ライブラリとして使う\n\n```ts\nimport { build, check, defineConfig } from \"@1dot5/zenn-syndicate\";\n\nconst { report, exitCode } = await build({ configPath: \"./zenn-syndicate.config.mjs\" });\n```\n\n`build`/`check` はどちらも `{ report, exitCode }` を返します。`report.diagnostics` と\n`report.summary` は上記の `--json` の形式と一致します。\n\n## GitHub Actions\n\n`zenn-syndicate` 自体はgit操作を一切行いません。`npx zenn-syndicate init` は\n`.github/workflows/sync-zenn.yml` も生成します。これは以下を行うサンプルです:\n\n1. ソースリポジトリをチェックアウトする\n2. Zennリポジトリを別途チェックアウトする（push権限のあるトークンをsecretとして必要とする）\n3. そのチェックアウトに対して `npx zenn-syndicate build` を実行する\n4. 変更があった場合のみ、素の `git` コマンドでcommit・pushする\n\n有効化する前に、`ZENN_REPO` 環境変数と、参照しているトークンのsecretを設定してください。\n","readmeFilename":"README.md"}