@longzai-intelligence-github-markdown/cli 0.0.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md ADDED
@@ -0,0 +1,7 @@
1
+ # @longzai-intelligence-github-markdown/cli
2
+
3
+ `lzi-github-markdown` 命令行工具:本地克隆仓转按组织/仓库 markdown 数据仓。
4
+
5
+ 命令面:`convert`(--org / --repo <owner>/<name> / --all;--dry-run / --no-commit)、`verify`(哈希漂移 + 三方对账 + 非标准条目报告)、`catalog build|list|check`、`config init|show|path`。每命令带 `--format text|json`。
6
+
7
+ 使用方式:终端安装 `npm i -g @longzai-intelligence-github-markdown/cli` 后执行 `lzi-github-markdown <command>`;或数据根就地 `config init` 生成 `lzi-github-markdown.config.ts`(仅 `dataRoot` 单字段,仓 ADR 0009)后在数据根直接执行——配置文件必备,本地克隆根走 `.env` 的 `LZI_GITHUB_MARKDOWN_CLONES_ROOT`。
@@ -0,0 +1 @@
1
+ import "./rolldown-runtime-BqT_7tdF.js";
package/dist/index.js ADDED
@@ -0,0 +1,3 @@
1
+ import"./rolldown-runtime-BqT_7tdF.js";import{createCli as e,defineCommand as t}from"@longzai-intelligence-cli/core";import{clackInteraction as n,picocolorsColor as r}from"@longzai-intelligence-cli/standard";import*as i from"zod";import{CONFIG_FILENAME as a,CatalogService as o,resolveRuntimeEnv as s,runConvert as c,runVerify as l,scaffoldConfigText as u}from"@longzai-intelligence-github-markdown/core";import{createCatalogController as d,createConfigController as f,createConvertController as p,createVerifyController as m}from"@longzai-intelligence-markdown/data-engine";function h(e){return typeof e==`object`&&!!e&&`catalogWritten`in e&&`rootFilesCreated`in e&&`committed`in e}function g(e){return Array.isArray(e)&&e.every(e=>typeof e==`object`&&!!e&&`org`in e&&`repoCount`in e)}function _(e){return Array.isArray(e)&&e.every(e=>typeof e==`string`)}const v=d({resolveRuntimeEnv:s,createService:e=>{let t=new o({dataRoot:e});return{dataRoot:t.dataRoot,scan:()=>t.scan(),ensureRoot:e=>t.ensureRoot(e),refresh:e=>t.refresh(e),check:()=>t.check()}}});async function y(e,t){let n=await v(e,t);return n.ok?e===`build`&&h(n.data)||e===`list`&&g(n.data)||e===`check`&&_(n.data)?{ok:!0,operation:e,data:n.data}:{ok:!1,error:{code:`CONFIG_INVALID`,message:`catalog ${e} 返回了非预期的数据形态`}}:n}const b=f({configFilename:a,scaffold:e=>u({dataRoot:e.dataRoot}),resolveRuntimeEnv:s});function x(e,t={}){return b.configInit(e,t)}async function S(e){let t=await b.configShow(e);return t.ok?{ok:!0,resolution:t.value}:{ok:!1,error:t.error}}function C(e){return b.configPath(e)}const w=p({resolveRuntimeEnv:s,runConvert:c}),T=m({resolveRuntimeEnv:s,runVerify:l}),E=e({name:`lzi-github-markdown`,description:`本地克隆仓索引工具(convert → repositories/ 归档索引 → catalog;数据面 = 本地克隆根只读消费,ADR 0003/0005)`,interaction:n,color:r}),D=i.enum([`text`,`json`]).default(`text`);function O(e){process.stdout.write(`${JSON.stringify(e,null,2)}\n`)}const k={TOP_LEVEL_REPO:`顶层直接是仓库(缺 owner 层)`,TOP_LEVEL_FILE:`顶层散落文件`,OWNER_NAME_INVALID:`owner 名不符合 GitHub 用户名字符集`,NO_VALID_REPOS:`目录内无有效仓库`},A={flags:`--format <kind>`,description:`输出格式 text|json`,defaultValue:`text`},j={flags:`--config <path>`,description:`配置文件路径(缺省自 cwd 向上查找 lzi-github-markdown.config.ts;配置文件必备,缺失即报错)`};t(E,{name:`convert`,description:`扫描克隆根并落仓(--org / --repo <owner>/<name> / --all 三选一;幂等重跑零变更零提交)`,options:[{flags:`--org <name>`,description:`单组织(GitHub 用户/组织名)`},{flags:`--repo <selector>`,description:`单仓库(<owner>/<name>)`},{flags:`--all`,description:`克隆根内全部组织`},{flags:`--dry-run`,description:`干跑:零落盘零提交`},{flags:`--commit`,description:`执行 git 提交(缺省零 git;数据根整体单仓 init + 显式路径提交)`},j,A],schema:i.object({org:i.string().optional(),repo:i.string().optional(),all:i.boolean().default(!1),dryRun:i.boolean().default(!1),commit:i.boolean().default(!1),config:i.string().optional(),format:D}),action:async e=>{let t=await w({org:e.org,repo:e.repo,all:e.all,dryRun:e.dryRun,commit:e.commit},e.config);if(e.format===`json`){O(t);return}if(!t.ok){process.stderr.write(`${t.error.message}\n`),process.exitCode=1;return}for(let n of t.report.orgs)process.stdout.write(`${n.org}:${n.repos} 仓(写入 ${n.written} / 跳过 ${n.skipped}${e.dryRun?`(dry-run)`:``})\n`);for(let e of t.report.skippedRepos)process.stdout.write(`[采集失败] ${e.org}/${e.repo}:${e.message}\n`);if(t.report.scanSkipped.length>0){process.stdout.write(`[克隆根非标准条目] ${t.report.scanSkipped.length} 个(已跳过):\n`);for(let e of t.report.scanSkipped)process.stdout.write(` - ${e.entry}:${k[e.reason]??e.reason}\n`)}let n=t.report.catalog;process.stdout.write(`目录册:${n.entries.length} 组织${n.catalogWritten?`(已更新`:`(无变化`}${n.committed?`,已提交)`:`)`}\n`)}}),t(E,{name:`verify`,description:`一致性体检:content_hash 复算漂移 + 组织索引↔目录册↔磁盘三方对账 + 克隆根非标准条目报告`,options:[j,A],schema:i.object({config:i.string().optional(),format:D}),action:async e=>{let t=await T(e.config);if(e.format===`json`){O(t);return}if(!t.ok){process.stderr.write(`${t.error.message}\n`),process.exitCode=1;return}let{hashDrifts:n,issues:r,cloneSkipped:i}=t.report;for(let e of n)process.stdout.write(`[hash 漂移] ${e.file}:登记 ${e.expected} ≠ 复算 ${e.actual}\n`);for(let e of r)process.stdout.write(`[对账] ${e}\n`);if(i.length>0){process.stdout.write(`[克隆根非标准条目] ${i.length} 个(信息性,不阻断):\n`);for(let e of i)process.stdout.write(` - ${e.entry}:${k[e.reason]??e.reason}\n`)}if(n.length===0&&r.length===0){process.stdout.write(`体检通过:无哈希漂移、无对账问题
2
+ `);return}process.exitCode=1}}),t(E,{name:`catalog build`,description:`扫描磁盘重建/更新总目录册并提交`,options:[j,A],schema:i.object({config:i.string().optional(),format:D}),action:async e=>{let t=await y(`build`,e.config);if(e.format===`json`){O(t);return}if(!t.ok){process.stderr.write(`${t.error.message}\n`),process.exitCode=1;return}let n=t.data;process.stdout.write(`目录册:${n.entries.length} 组织${n.catalogWritten?`(已更新`:`(无变化`}${n.committed?`,已提交)`:`)`}\n`)}}),t(E,{name:`catalog list`,description:`列出全部组织条目`,options:[j,A],schema:i.object({config:i.string().optional(),format:D}),action:async e=>{let t=await y(`list`,e.config);if(e.format===`json`){O(t);return}if(!t.ok){process.stderr.write(`${t.error.message}\n`),process.exitCode=1;return}for(let e of t.data)process.stdout.write(`${e.org}:${e.repoCount} 仓\n`)}}),t(E,{name:`catalog check`,description:`目录册与磁盘对账(只报告不修复)`,options:[j,A],schema:i.object({config:i.string().optional(),format:D}),action:async e=>{let t=await y(`check`,e.config);if(e.format===`json`){O(t);return}if(!t.ok){process.stderr.write(`${t.error.message}\n`),process.exitCode=1;return}if(t.data.length===0){process.stdout.write(`对账通过
3
+ `);return}for(let e of t.data)process.stdout.write(`${e}\n`);process.exitCode=1}}),t(E,{name:`config init`,description:`生成 lzi-github-markdown.config.ts(数据根就地配置入口,仅 dataRoot 单字段;已存在则提示,不覆盖)`,options:[{flags:`--data-root <path>`,description:`数据根(缺省 '.',即就地配置:在数据根目录执行时自指)`}],schema:i.object({dataRoot:i.string().optional()}),action:async e=>{let t=x(process.cwd(),{dataRoot:e.dataRoot});if(!t.ok){process.stderr.write(`${t.error.message}\n`),process.exitCode=1;return}process.stdout.write(`已生成:${t.path}(本地克隆根请在 .env 配置 LZI_GITHUB_MARKDOWN_CLONES_ROOT 后执行 convert)\n`)}}),t(E,{name:`config show`,description:`展示生效配置(配置文件必备承载 dataRoot,克隆根自 .env 合并;zod 校验 + 绝对路径)`,options:[j,A],schema:i.object({config:i.string().optional(),format:D}),action:async e=>{let t=await S(e.config);if(e.format===`json`){O(t);return}if(!t.ok){process.stderr.write(`${t.error.message}\n`),process.exitCode=1;return}process.stdout.write(`通道:${t.resolution.channel}${t.resolution.configPath===void 0?``:`(${t.resolution.configPath})`}\ndataRoot=${t.resolution.env.dataRoot}\nclonesRoot=${t.resolution.env.clonesRoot}\n`)}}),t(E,{name:`config path`,description:`打印配置文件与 .env 双通道位置`,schema:i.object({}),action:async()=>{let e=C(process.cwd());process.stdout.write(`${e.configPath}${e.configExists?``:`(不存在,可先 config init)`}\n${e.envPath}${e.envExists?``:`(不存在)`}\n`)}}),await E.parseAsync(process.argv);export{};
@@ -0,0 +1 @@
1
+ import"node:module";export{};
package/package.json ADDED
@@ -0,0 +1,38 @@
1
+ {
2
+ "name": "@longzai-intelligence-github-markdown/cli",
3
+ "version": "0.0.2",
4
+ "description": "Longzai Intelligence Github Markdown CLI - 本地克隆仓转按组织/仓库 markdown 数据仓的命令行工具",
5
+ "license": "UNLICENSED",
6
+ "bin": {
7
+ "lzi-github-markdown": "./dist/index.js"
8
+ },
9
+ "files": [
10
+ "dist"
11
+ ],
12
+ "type": "module",
13
+ "scripts": {
14
+ "dev": "bun run src/index.ts",
15
+ "build": "lzi-builder",
16
+ "build:prod": "NODE_ENV=production bun run build",
17
+ "start": "node dist/index.js",
18
+ "prepublishOnly": "bun run build:prod",
19
+ "typecheck": "lzi-tsgo typecheck tsconfig.json",
20
+ "lint": "oxlint && oxfmt --check",
21
+ "lint:fix": "oxlint --fix && oxfmt",
22
+ "test": "lzi-bun-cli test",
23
+ "test:watch": "lzi-bun-cli test --watch",
24
+ "clean": "lzi-dev-cli clean"
25
+ },
26
+ "dependencies": {
27
+ "@longzai-intelligence-cli/core": "^0.0.10",
28
+ "@longzai-intelligence-cli/standard": "^0.0.10",
29
+ "@longzai-intelligence-github-markdown/core": "0.0.2",
30
+ "@longzai-intelligence-markdown/data-engine": "^0.0.1",
31
+ "zod": "^4.4.3"
32
+ },
33
+ "devDependencies": {
34
+ "@longzai-intelligence-builder/esm": "^0.2.13",
35
+ "@longzai-intelligence-builder/utils": "^0.2.13",
36
+ "@types/bun": "^1.3.14"
37
+ }
38
+ }