{"_id":"@agent-ils/quality-gate","_rev":"4-903d3bf1def8b849e06b1b9788c15dfb","name":"@agent-ils/quality-gate","dist-tags":{"latest":"0.0.3"},"versions":{"0.0.1":{"name":"@agent-ils/quality-gate","version":"0.0.1","_id":"@agent-ils/quality-gate@0.0.1","maintainers":[{"name":"bugfix2019","email":"670882978@qq.com"}],"bin":{"agentils-quality-gate":"dist/index.js"},"dist":{"shasum":"898f29f3e5ac0b860b46b2457a44a318cf3da195","tarball":"https://registry.npmjs.org/@agent-ils/quality-gate/-/quality-gate-0.0.1.tgz","fileCount":17,"integrity":"sha512-pVUH6WCt3ZX9pnxvroki+o5Znn/4vSa8MaeXswtWrj/7cg2hk5W53tI5mGAYOCZCfKcsG0N2xZbe1mTDjjgWuA==","signatures":[{"sig":"MEUCIQCeU8IOWIv8KngM2EP6of2I2NkBeqfY0+lS/6WKHLTA1QIgGMy7pThw/L0++oDs/gaXd4DDkaYImxzfwIc9OjQz5OE=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":71331},"main":"./dist/index.js","type":"module","_from":"file:agent-ils-quality-gate-0.0.1.tgz","engines":{"node":">=20.0.0"},"scripts":{"dev":"tsup --watch","build":"tsup && node scripts/copy-templates.mjs","typecheck":"tsc --noEmit"},"_npmUser":{"name":"bugfix2019","email":"670882978@qq.com"},"_resolved":"/private/var/folders/98/cp8wqx4923q60vxl6l719lnh0000gn/T/4755b3db492a5636cc6af0a14ac18ffe/agent-ils-quality-gate-0.0.1.tgz","_integrity":"sha512-pVUH6WCt3ZX9pnxvroki+o5Znn/4vSa8MaeXswtWrj/7cg2hk5W53tI5mGAYOCZCfKcsG0N2xZbe1mTDjjgWuA==","_npmVersion":"10.9.3","description":"Initialize Husky, lint-staged, Prettier, commitlint, and Conventional Commits defaults for a project.","directories":{},"_nodeVersion":"22.18.0","dependencies":{"@clack/prompts":"^0.11.0"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.5.1","typescript":"^5.8.3","@types/node":"^22.15.3"},"_npmOperationalInternal":{"tmp":"tmp/quality-gate_0.0.1_1777518665552_0.17518998126360774","host":"s3://npm-registry-packages-npm-production"}},"0.0.2":{"name":"@agent-ils/quality-gate","version":"0.0.2","keywords":["agentils","quality-gate","precommit","husky","lint-staged","prettier","commitlint","conventional-commits","ecam","tui"],"author":{"name":"liuyuxuan","email":"ts02315607@gmail.com"},"license":"MIT","_id":"@agent-ils/quality-gate@0.0.2","maintainers":[{"name":"bugfix2018","email":"923401025@qq.com"},{"name":"bugfix2019","email":"670882978@qq.com"}],"homepage":"https://github.com/bugfix2020/AgentILS/tree/main/packages/quality-gate#readme","bugs":{"url":"https://github.com/bugfix2020/AgentILS/issues"},"bin":{"agentils-quality-gate":"dist/cli.js","agentils-precommit-gate":"dist/precommit.js"},"dist":{"shasum":"f5bde0d0bda1af9693c6ba6032a9b3fabf29967c","tarball":"https://registry.npmjs.org/@agent-ils/quality-gate/-/quality-gate-0.0.2.tgz","fileCount":21,"integrity":"sha512-PIaxCvEr5+8DOspvK16Pq1JuHFQ5U4vNp0in6u6A0Az8jFbPEbakXlWodx9DYhnkSj1n2HSJe8hZwWtNfBY3CQ==","signatures":[{"sig":"MEUCIAGYSFgq/1oASuQg6pViMu7LULr4LiFBQUTeexa8MPj6AiEAjukMELmzasZiFU6G8WfduRm3JftePz6JPeTsgyiL+aM=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":208954},"main":"./dist/index.js","type":"module","engines":{"node":">=20.0.0"},"gitHead":"b34885fd481be5da90d5c6bbdefcacc72d34c537","scripts":{"dev":"tsup --watch","build":"tsup && node scripts/copy-templates.mjs","typecheck":"tsc --noEmit"},"_npmUser":{"name":"bugfix2019","email":"670882978@qq.com"},"repository":{"url":"git+https://github.com/bugfix2020/AgentILS.git","type":"git","directory":"packages/quality-gate"},"_npmVersion":"10.9.2","description":"Initialize Husky, lint-staged, Prettier, commitlint, and Conventional Commits defaults for a project.","directories":{},"_nodeVersion":"22.14.0","dependencies":{"cac":"^6.7.14","ink":"^5.2.1","react":"^18.3.1","@clack/prompts":"^0.11.0"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.5.1","typescript":"^5.8.3","@types/node":"^22.15.3","@types/react":"^18.3.12"},"_npmOperationalInternal":{"tmp":"tmp/quality-gate_0.0.2_1778005669205_0.17068836366135964","host":"s3://npm-registry-packages-npm-production"}},"0.0.3":{"name":"@agent-ils/quality-gate","version":"0.0.3","description":"Initialize Husky, lint-staged, Prettier, commitlint, and Conventional Commits defaults for a project.","keywords":["agentils","quality-gate","precommit","husky","lint-staged","prettier","commitlint","conventional-commits","ecam","tui"],"homepage":"https://github.com/bugfix2020/AgentILS/tree/main/packages/quality-gate#readme","bugs":{"url":"https://github.com/bugfix2020/AgentILS/issues"},"repository":{"type":"git","url":"git+https://github.com/bugfix2020/AgentILS.git","directory":"packages/quality-gate"},"license":"MIT","author":{"name":"liuyuxuan","email":"ts02315607@gmail.com"},"type":"module","main":"./dist/index.js","bin":{"agentils-quality-gate":"dist/cli.js","agentils-precommit-gate":"dist/precommit.js"},"engines":{"node":">=20.0.0"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"dependencies":{"@clack/prompts":"^0.11.0","cac":"^6.7.14","ink":"^5.2.1","react":"^18.3.1"},"devDependencies":{"@types/node":"^22.15.3","@types/react":"^18.3.12","tsup":"^8.5.1","typescript":"^5.8.3"},"scripts":{"build":"tsup && node scripts/copy-templates.mjs","dev":"tsup --watch","typecheck":"tsc --noEmit"},"_id":"@agent-ils/quality-gate@0.0.3","_integrity":"sha512-OR/oXBtqJx/q9Fw6tlcehcAx/nMGN0cWQOa8GEUAu27rKkvKGs0cARzKpGNdf9t/h5ehqzkPx+kOBAUQf9uq+w==","_resolved":"/tmp/f2461a4e3104df81cf448989350fb485/agent-ils-quality-gate-0.0.3.tgz","_from":"file:agent-ils-quality-gate-0.0.3.tgz","_nodeVersion":"24.16.0","_npmVersion":"11.13.0","dist":{"integrity":"sha512-OR/oXBtqJx/q9Fw6tlcehcAx/nMGN0cWQOa8GEUAu27rKkvKGs0cARzKpGNdf9t/h5ehqzkPx+kOBAUQf9uq+w==","shasum":"43f81f476c6b189dd91f5dc110c50743141ef56d","tarball":"https://registry.npmjs.org/@agent-ils/quality-gate/-/quality-gate-0.0.3.tgz","fileCount":21,"unpackedSize":212164,"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@agent-ils%2fquality-gate@0.0.3","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEYCIQD8bt5IXKApDx97MRDUOZciCblyawF0qDlnnFdppSe3ZwIhAKNQck2reWTC6Iq1dPKqzRo3vW/F5FBUQ3D3dWkE5jJH"}]},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:5db9f9fa-24e3-4674-b05a-1664bca3da72"}},"directories":{},"maintainers":[{"name":"bugfix2018","email":"923401025@qq.com"},{"name":"bugfix2019","email":"670882978@qq.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/quality-gate_0.0.3_1780311325658_0.8165968722927257"},"_hasShrinkwrap":false}},"time":{"created":"2026-04-30T03:11:05.442Z","modified":"2026-06-01T10:55:26.141Z","0.0.1":"2026-04-30T03:11:05.697Z","0.0.2":"2026-05-05T18:27:49.513Z","0.0.3":"2026-06-01T10:55:25.805Z"},"bugs":{"url":"https://github.com/bugfix2020/AgentILS/issues"},"author":{"name":"liuyuxuan","email":"ts02315607@gmail.com"},"license":"MIT","homepage":"https://github.com/bugfix2020/AgentILS/tree/main/packages/quality-gate#readme","keywords":["agentils","quality-gate","precommit","husky","lint-staged","prettier","commitlint","conventional-commits","ecam","tui"],"repository":{"type":"git","url":"git+https://github.com/bugfix2020/AgentILS.git","directory":"packages/quality-gate"},"description":"Initialize Husky, lint-staged, Prettier, commitlint, and Conventional Commits defaults for a project.","maintainers":[{"name":"bugfix2018","email":"923401025@qq.com"},{"name":"bugfix2019","email":"670882978@qq.com"}],"readme":"# AgentILS Quality Gate\n\n<p align=\"center\">\n  <a href=\"https://www.npmjs.com/package/@agent-ils/quality-gate\"><img alt=\"npm\" src=\"https://img.shields.io/npm/v/@agent-ils/quality-gate?label=npm&color=CB3837\"></a>\n  <img alt=\"TypeScript\" src=\"https://img.shields.io/badge/TypeScript-5.8-3178C6?logo=typescript&logoColor=white\">\n  <img alt=\"Node.js\" src=\"https://img.shields.io/badge/Node.js-20%2B-339933?logo=node.js&logoColor=white\">\n  <img alt=\"tsup\" src=\"https://img.shields.io/badge/tsup-minified-7C3AED\">\n  <img alt=\"Prettier\" src=\"https://img.shields.io/badge/Prettier-3.5-F7B93E?logo=prettier&logoColor=black\">\n  <img alt=\"Husky\" src=\"https://img.shields.io/badge/Husky-9.1-111827\">\n</p>\n\n<p align=\"center\">\n  <a href=\"https://github.com/bugfix2020/AgentILS/blob/main/packages/quality-gate/README.md\">English</a> | 简体中文\n</p>\n\n`@agent-ils/quality-gate` 是一个面向 JavaScript / TypeScript 项目的质量门禁初始化 CLI，用于把 Husky、lint-staged、Prettier、commitlint、Commitizen 和 Conventional Commits / changelog 默认配置一键写入目标项目。\n\n它同时面向普通用户和 LLM Agent：用户只需要运行一条命令，Agent 也可以把它识别为 AgentILS 标准质量门禁初始化方式，而不是手写各类 hook 和配置文件。\n\n## 使用方式\n\n请通过包管理器运行初始化器。不要直接在 shell 中执行 `@agent-ils/quality-gate init`；`@agent-ils/quality-gate` 是包名，不是可执行文件路径。\n\npnpm：\n\n```sh\npnpm dlx @agent-ils/quality-gate init\n```\n\nnpm：\n\n```sh\nnpx @agent-ils/quality-gate init\n```\n\nyarn：\n\n```sh\nyarn dlx @agent-ils/quality-gate init\n```\n\nbun：\n\n```sh\nbunx @agent-ils/quality-gate init\n```\n\n如果目标项目不在当前目录，可以传入 `--cwd`：\n\n```sh\npnpm dlx @agent-ils/quality-gate init --cwd packages/my-app\n```\n\n包发布前，可以在本仓库中用构建产物测试：\n\n```sh\npnpm --filter @agent-ils/quality-gate build\nnode packages/quality-gate/dist/index.js init --cwd apps/t\n```\n\n如果目标目录没有 `package.json`，初始化器会创建一个最小 `package.json`，再追加质量门禁所需的 scripts 和 devDependencies。\n\n## 常用命令\n\n预览将要写入哪些文件：\n\n```sh\npnpm dlx @agent-ils/quality-gate init --dry-run\n```\n\n覆盖已有配置和 hook 文件：\n\n```sh\npnpm dlx @agent-ils/quality-gate init --force\n```\n\n跳过已存在的文件：\n\n```sh\npnpm dlx @agent-ils/quality-gate init --skip-existing\n```\n\n使用 AgentILS 自定义 Husky hook 模板，而不是默认的 lint-staged / commitlint hooks：\n\n```sh\npnpm dlx @agent-ils/quality-gate init --agentils-hooks\n```\n\n写入文件后立即安装依赖：\n\n```sh\npnpm dlx @agent-ils/quality-gate init --install\n```\n\n## Agent / LLM 用法\n\n当用户要求 LLM Agent 安装 AgentILS quality gate、Husky、lint-staged、Prettier、commitlint、Commitizen、Conventional Commits 或 conventional changelog 默认配置时，Agent 应优先使用这个包，而不是手动创建这些文件。\n\n用户可以这样说：\n\n```text\n帮我安装 AgentILS quality gate\n```\n\n推荐 Agent 行为：\n\n- 工作区使用 pnpm 或存在 `pnpm-lock.yaml` 时，执行 `pnpm dlx @agent-ils/quality-gate init`。\n- 工作区使用 npm 或存在 `package-lock.json` 时，执行 `npx @agent-ils/quality-gate init`。\n- 工作区使用 yarn 时，执行 `yarn dlx @agent-ils/quality-gate init`。\n- 目标项目不在当前目录时，追加 `--cwd <dir>`。\n- 用户要求预览时，先追加 `--dry-run`。\n- 只有用户明确确认覆盖已有文件时，才追加 `--force`。\n- 只有用户希望立即安装依赖时，才追加 `--install`。\n- 只有用户明确需要 AgentILS 自定义 hook profile 时，才追加 `--agentils-hooks`；否则使用默认 hooks。\n\n例如：\n\n```sh\npnpm dlx @agent-ils/quality-gate init\n```\n\n构建后，包内提供了可复制到 LLM skill 系统的说明模板：`dist/templates/llm/agentils-quality-gate.skill.md`。\n\n支持导入 skill / instruction 的 Agent 可以把该模板复制到自己的 skill 系统中，后续相关需求就能自动路由到这个初始化器。\n\n## CLI 参数\n\n```text\nUsage:\n  agentils-quality-gate init [options]\n\nOptions:\n  -C, --cwd <dir>                    目标项目目录，默认当前目录\n  --package-manager <pm>             pnpm、npm、yarn 或 bun；默认自动识别\n  --prettier-config <path>           默认 prettier.config.mjs\n  --prettier-ignore <path>           默认 .prettierignore\n  --czrc <path>                      默认 .czrc\n  --commitlint-config <path>         默认 commitlint.config.mjs\n  --lint-staged-config <path>        默认 lint-staged.config.mjs\n  --husky-dir <path>                 默认 .husky\n  --pre-commit-command <command>     默认 \"{pm} exec lint-staged\"\n  --commit-msg-command <command>     默认 \"{pm} exec commitlint --edit \\\"$1\\\"\"\n  --with-eslint                      对暂存的 JS/TS 文件先执行 eslint --fix，再执行 prettier\n  --install                          写入配置后执行包管理器 install\n  --dry-run                          只打印计划变更，不写入文件，也不安装依赖\n  --agentils-hooks                   使用 AgentILS 自定义 Husky hook 模板\n  --force                            覆盖已存在的配置文件和 hook 文件\n  --conflict <strategy>              检测到已有配置文件时使用 overwrite、merge、skip 或 cancel\n  --merge                            合并支持合并的文件，其余已有文件跳过\n  --skip-existing                    跳过已存在的配置文件和 hook 文件\n  --interactive / --no-interactive   强制开启或关闭交互式冲突处理\n  --no-package-json                  不更新 package.json scripts/devDependencies/config\n  --no-husky                         不写入 Husky hooks\n  --no-prettier                      不写入 Prettier 配置\n  --no-commitlint                    不写入 commitlint 配置和 commit-msg hook\n  --no-lint-staged                   不写入 lint-staged 配置和 pre-commit hook\n```\n\n`{pm}` 会被替换为自动识别或显式传入的包管理器。\n\n`--dry-run` 会打印和真实初始化一致的文件统计，但不会写入文件、修改 hook 权限或安装依赖。\n\n默认会写入普通 Husky hooks，执行 `lint-staged` 和 `commitlint`。使用 `--agentils-hooks` 时，会改为写入 AgentILS 自定义 hook 模板。\n\n初始化结果会使用类似 `git --stat` 的文件统计输出。覆盖写入的文件会按 rewrite 统计展示新增和删除，即使最终内容一致，用户也能看出命令确实执行了重写。\n\n## 冲突处理\n\n命令行参数优先。如果传入 `--conflict`、`--force`、`--merge` 或 `--skip-existing`，初始化器会直接按参数执行。\n\n如果没有传冲突策略，并且当前运行环境是交互式 TTY，初始化器会先检测已有配置文件和 hook 文件，再通过上下箭头让用户选择下一步：\n\n- `overwrite`：覆盖已有配置文件和 hook 文件\n- `merge`：合并支持安全合并的文件，其余无法安全合并的文件跳过\n- `skip`：保留已有配置文件和 hook 文件\n- `cancel`：在写入任何内容前取消操作\n\n目前 `.prettierignore` 支持按行合并。JavaScript 配置文件和 Husky hooks 在选择 `merge` 时会跳过，因为它们的安全结构化合并依赖具体项目代码。\n\n选择 `skip` 时，已有文件会显示为 skipped。选择 `merge` 且某个文件无法安全合并时，才会显示 cannot be merged safely。\n\n## 写入内容\n\n默认会写入或合并：\n\n- `package.json` 中的 `scripts` 和 `devDependencies`\n- `.czrc`\n- `prettier.config.mjs`\n- `.prettierignore`\n- `commitlint.config.mjs`\n- `lint-staged.config.mjs`\n- `.husky/pre-commit`\n- `.husky/commit-msg`\n\n生成或更新的 `package.json` scripts 包括：\n\n- `prepare`：`husky`\n- `commit`：`git-cz`\n- `format`：`prettier --write .`\n- `format:check`：`prettier --check .`\n- `changelog`：`conventional-changelog -p conventionalcommits -i CHANGELOG.md -s`\n- `changelog:all`：`conventional-changelog -p conventionalcommits -i CHANGELOG.md -s -r 0`\n- `generate:changelog`：同 `changelog`\n- `generate:changelog:first`：同 `changelog:all`\n\n默认加入的目标项目 `devDependencies`：\n\n- `husky`\n- `lint-staged`\n- `prettier`\n- `@commitlint/cli`\n- `@commitlint/config-conventional`\n- `commitizen`\n- `cz-conventional-changelog`\n- `conventional-changelog-cli`\n- `eslint`，仅在使用 `--with-eslint` 时加入\n\n## 模板目录\n\n配置模板和 help 文本位于源码 `templates/`，不会和 CLI 主逻辑混在一起。构建时会复制到 `dist/templates/`，因此压缩后的 CLI 只依赖构建产物也能运行。\n\n## Precommit 流水线（`agentils-precommit-gate`）\n\n本包同时安装第二个 bin —— `agentils-precommit-gate`，它会在 Husky `pre-commit` 阶段渲染一块 A320 ECAM 风格的 TUI 面板：每一步都有实时旋转指示、可选的 `[i/N]` 进度数字、以及最终的颜色块，把 commit 时的反馈从一坨灰色子进程日志变成可视化的检查清单。\n\n<p align=\"center\">\n  <img alt=\"dry-run 流水线（全部通过）\" src=\"https://raw.githubusercontent.com/bugfix2020/AgentILS/main/packages/quality-gate/preview/dry-run.gif\" width=\"640\">\n  <br>\n  <em>Dry-run：所有步骤通过，面板收敛为绿色 ECAM 概要。</em>\n</p>\n\n<p align=\"center\">\n  <img alt=\"error 流水线（某步失败）\" src=\"https://raw.githubusercontent.com/bugfix2020/AgentILS/main/packages/quality-gate/preview/error.gif\" width=\"640\">\n  <br>\n  <em>失败路径：失败步骤变红，整体以非零状态退出。</em>\n</p>\n\n接到 Husky：\n\n```sh\n# .husky/pre-commit\n#!/bin/sh\nnpx agentils-precommit-gate\n```\n\n或直接从 `node_modules` 调用：\n\n```sh\nnode node_modules/@agent-ils/quality-gate/dist/precommit.js\n```\n\n### 配置文件发现（ESLint flat-config 风格）\n\n`agentils-precommit-gate` 会从当前目录逐层向上查找，每个目录内按以下顺序，命中第一个就停：\n\n```\nagentils-gate.config.js\nagentils-gate.config.mjs\nagentils-gate.config.cjs\nagentils-gate.config.ts\nagentils-gate.config.mts\nagentils-gate.config.cts\n```\n\n- 最近的目录优先（项目根的 config 覆盖 home 目录的）。\n- `--config <path>` 显式覆盖查找，直接加载该路径。\n- `--print-config` 打印命中的源路径和步骤列表后退出 0，CI debug 利器。\n- `.ts*` 配置要求项目里装了 [`jiti` ≥ 2.2](https://www.npmjs.com/package/jiti)，或 Node ≥ 22.13 加上 `--experimental-strip-types`。否则会报清晰错误指向缺失的加载器。\n- 找不到任何 config 时，落到内建 fallback：仅一步 `pnpm exec lint-staged`。这个 fallback 故意做得最小，让 npm 全新安装的用户开箱即用。\n\n### Schema\n\n```js\n// agentils-gate.config.mjs\nexport default {\n    steps: [\n        {\n            label: 'LINT-STAGED',\n            cmd: 'pnpm exec lint-staged', // shell 命令，或者…\n        },\n        {\n            label: 'GENERATE FLOWCHARTS',\n            argv: { command: 'node', args: ['scripts/render.mjs'] }, // …直接 argv 形式\n        },\n    ],\n}\n```\n\n每个 step 接受：\n\n- `label`（必填，非空字符串）— 面板上显示的名字。\n- `cmd` 与 `argv` 二选一（互斥，必须有一个）— `cmd` 走用户 shell；`argv` 不经 shell。\n- `render(state) => string`（可选）— 自定义行内容渲染（两个 `║` 之间的部分）。设置后面板原样使用你返回的字符串，不再走默认的 `[indicator] LABEL ... N/M` 布局。`render` 抛错也安全：面板会改显示红色的 `[render error] <label>: <message>`，不会让整面板崩。\n\n### `[i/N]` 进度协议\n\n任何子进程在 STDERR 输出形如 `^\\[(\\d+)/(\\d+)\\] .*$` 的行，runner 都会解析最新一行并把 `i/N` 显示在面板右边。AgentILS 自己的 `sync-agent-instructions.mjs`、`generate-all.mjs`、`run-lint-staged-with-progress.mjs` 都是这个格式，所以零适配。\n\n### 自定义渲染示例\n\n```js\nexport default {\n    steps: [\n        {\n            label: 'TYPE CHECK',\n            cmd: 'pnpm typecheck',\n            render(state) {\n                const dot =\n                    state.status === 'pending'\n                        ? '.'\n                        : state.status === 'running'\n                          ? '*'\n                          : state.status === 'passed'\n                            ? '#'\n                            : 'X'\n                return `  <${dot}> ${state.label} :: ${state.status}`\n            },\n        },\n    ],\n}\n```\n\n`state` 包含 `{ label, status, indicator, progressCurrent, progressTotal, lastLine }`。完整 `StepState` 形状见 `packages/quality-gate/src/precommit/steps.ts`。\n","readmeFilename":"README.zh-CN.md"}