@longzai-intelligence-kol-markdown/cli 0.0.1
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/dist/index.d.ts +2 -0
- package/dist/index.js +5 -0
- package/package.json +38 -0
package/dist/index.d.ts
ADDED
package/dist/index.js
ADDED
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
#!/usr/bin/env bun
|
|
2
|
+
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,captureAdd as s,resolveRuntimeEnv as c,runConvert as l,runScaffoldDataRepo as u,runVerify as d,scaffoldConfigText as f}from"@longzai-intelligence-kol-markdown/core";import{createConfigController as p,createConvertController as m,createVerifyController as h,success as g}from"@longzai-intelligence-markdown/data-engine";i.enum([`text`,`json`]).default(`text`);function _(e){process.stdout.write(`${JSON.stringify(e,null,2)}\n`)}const v=m({resolveRuntimeEnv:c,runConvert:l}),y=h({resolveRuntimeEnv:c,runVerify:async e=>g(await d(e))});async function b(e,t){let n=await c(t);if(!n.ok)return{ok:!1,error:{code:n.error.code,message:n.error.message}};let r=new o({dataRoot:n.value.env.dataRoot});return e===`list`?{ok:!0,value:await r.scan()}:e===`check`?{ok:!0,value:await r.check()}:{ok:!0,value:await r.refresh({commit:!0})}}async function x(e,t,n){let r=await c(n);return r.ok?s(r.value.env,e,t):{ok:!1,error:{code:r.error.code,message:r.error.message}}}function S(e){return u(e)}const C=p({configFilename:a,scaffold:e=>f({dataRoot:e.dataRoot}),resolveRuntimeEnv:c});function w(e,t={}){return C.configInit(e,t)}async function T(e){let t=await C.configShow(e);return t.ok?{ok:!0,resolution:t.value}:{ok:!1,error:t.error}}function E(e){return C.configPath(e)}const D={flags:`--format <kind>`,description:`输出格式 text|json`,defaultValue:`text`},O={flags:`--config <path>`,description:`配置文件路径(缺省自 cwd 向上查找 lzi-kol-markdown.config.ts;配置文件必备,缺失即报错)`},k=i.record(i.string(),i.unknown());function A(e){t(e,{name:`capture add`,description:`人工登记单条内容(zod 守卫直写数据仓 kols/<slug>/<platform>/<type>/<id>.md;bilibili 等无工具平台一等公民通道)`,options:[{flags:`--kol <slug>`,description:`所属 KOL slug(数据仓分区第一轴)`},{flags:`--platform <name>`,description:`平台(bilibili/weixin/weibo/x/zhihu 等)`},{flags:`--id <id>`,description:`平台内内容唯一标识(bvid/文章 id 等)`},{flags:`--title <title>`,description:`标题(可选)`},{flags:`--content-type <type>`,description:`内容类型 video|article|post|answer|note|tweet(缺省 video)`},{flags:`--author-id <id>`,description:`作者平台账号标识(可选)`},{flags:`--author-name <name>`,description:`作者显示名(可选)`},{flags:`--published-at <iso>`,description:`发布时刻(ISO 或 YYYY-MM-DD;可选)`},{flags:`--captured-at <iso>`,description:`登记时刻(ISO;缺省当前时刻;历史回填显式传入)`},{flags:`--source-url <url>`,description:`内容页 URL(可选)`},{flags:`--description <text>`,description:`简介/描述(可选)`},{flags:`--payload-json <json>`,description:`平台特有载荷 JSON(如 '{"view_count":100}';可选)`},{flags:`--dry-run`,description:`干跑:零落盘零提交`},{flags:`--commit`,description:`执行 git 托管提交(缺省关)`},O,D],schema:i.object({kol:i.string(),platform:i.string(),id:i.string(),title:i.string().optional(),contentType:i.string().optional(),authorId:i.string().optional(),authorName:i.string().optional(),publishedAt:i.string().optional(),capturedAt:i.string().optional(),sourceUrl:i.string().optional(),description:i.string().optional(),payloadJson:i.string().optional(),dryRun:i.boolean().default(!1),commit:i.boolean().default(!1),config:i.string().optional(),format:i.enum([`text`,`json`]).default(`text`)}),action:async e=>{let t;if(e.payloadJson!==void 0)try{let n=k.safeParse(JSON.parse(e.payloadJson));if(!n.success)throw Error(`载荷不是 JSON 对象`);t=n.data}catch(e){process.stderr.write(`--payload-json 不是合法 JSON:${e instanceof Error?e.message:String(e)}\n`),process.exitCode=1;return}let n=await x({kolSlug:e.kol,platform:e.platform,platformContentId:e.id,title:e.title,contentType:e.contentType,authorAccountId:e.authorId,authorName:e.authorName,publishedAt:e.publishedAt,capturedAt:e.capturedAt,sourceUrl:e.sourceUrl,description:e.description,payload:t},{dryRun:e.dryRun,commit:e.commit},e.config);if(e.format===`json`){_(n),n.ok||(process.exitCode=1);return}if(!n.ok){process.stderr.write(`${n.error.message}\n`),process.exitCode=1;return}process.stdout.write(`已登记内容:${e.platform} ${e.id} → ${n.value.partition}${n.value.entryWritten?`(已写入)`:`(同字节跳过)`}${e.dryRun?`(dry-run)`:``}\n${n.value.entryPath}\n`)}})}const j=i.object({entries:i.array(i.unknown()),catalogWritten:i.boolean(),committed:i.boolean()}),M=i.object({partition:i.string(),count:i.number()}),N={flags:`--format <kind>`,description:`输出格式 text|json`,defaultValue:`text`},P={flags:`--config <path>`,description:`配置文件路径(缺省自 cwd 向上查找 lzi-kol-markdown.config.ts;配置文件必备,缺失即报错)`};function F(e){t(e,{name:`catalog build`,description:`扫描磁盘重建/更新总目录册`,options:[P,N],schema:i.object({config:i.string().optional(),format:i.enum([`text`,`json`]).default(`text`)}),action:async e=>{let t=await b(`build`,e.config);if(e.format===`json`){_(t),t.ok||(process.exitCode=1);return}if(!t.ok){process.stderr.write(`${t.error.message}\n`),process.exitCode=1;return}let n=j.safeParse(t.value);if(!n.success){process.stderr.write(`catalog build 载荷结构异常
|
|
3
|
+
`),process.exitCode=1;return}let r=n.data;process.stdout.write(`目录册:${r.entries.length} 分区${r.catalogWritten?`(已更新`:`(无变化`}${r.committed?`,已提交)`:`)`}\n`)}}),t(e,{name:`catalog list`,description:`列出全部分区条目`,options:[P,N],schema:i.object({config:i.string().optional(),format:i.enum([`text`,`json`]).default(`text`)}),action:async e=>{let t=await b(`list`,e.config);if(e.format===`json`){_(t),t.ok||(process.exitCode=1);return}if(!t.ok){process.stderr.write(`${t.error.message}\n`),process.exitCode=1;return}for(let e of M.array().parse(t.value))process.stdout.write(`${e.partition}:${e.count} 条\n`)}}),t(e,{name:`catalog check`,description:`目录册与磁盘对账(只报告不修复)`,options:[P,N],schema:i.object({config:i.string().optional(),format:i.enum([`text`,`json`]).default(`text`)}),action:async e=>{let t=await b(`check`,e.config);if(e.format===`json`){_(t),t.ok||(process.exitCode=1);return}if(!t.ok){process.stderr.write(`${t.error.message}\n`),process.exitCode=1;return}let n=i.array(i.string()).safeParse(t.value);if(n.success&&n.data.length===0){process.stdout.write(`对账通过
|
|
4
|
+
`);return}for(let e of n.success?n.data:[`对账结果结构异常`])process.stdout.write(`${e}\n`);process.exitCode=1}}),t(e,{name:`config init`,description:`生成 lzi-kol-markdown.config.ts(数据根就地配置入口;已存在则提示,不覆盖)`,options:[{flags:`--data-root <path>`,description:`数据根(缺省 '.',即就地配置:在数据根目录执行时自指)`}],schema:i.object({dataRoot:i.string().optional()}),action:async e=>{let t=w(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_KOL_MARKDOWN_CONTENTS_EXPORT_DIR 后执行 convert)\n`)}}),t(e,{name:`config show`,description:`展示生效配置(配置文件优先,回落 .env;zod 校验 + 绝对路径)`,options:[P,N],schema:i.object({config:i.string().optional(),format:i.enum([`text`,`json`]).default(`text`)}),action:async e=>{let t=await T(e.config);if(e.format===`json`){_(t),t.ok||(process.exitCode=1);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}\ncontentsExportDir=${t.resolution.env.contentsExportDir}\n`)}}),t(e,{name:`config path`,description:`打印配置文件与 .env 双通道位置`,schema:i.object({}),action:async()=>{let e=E(process.cwd());process.stdout.write(`${e.configPath}${e.configExists?``:`(不存在,可先 config init)`}\n${e.envPath}${e.envExists?``:`(不存在)`}\n`)}})}const I={flags:`--format <kind>`,description:`输出格式 text|json`,defaultValue:`text`},L={flags:`--config <path>`,description:`配置文件路径(缺省自 cwd 向上查找 lzi-kol-markdown.config.ts;配置文件必备,缺失即报错)`};function R(e){t(e,{name:`convert`,description:`读取台账导出流并落数据仓(--day / --from+--to / --all 三选一;--kol 限定单 KOL;幂等重跑零变更;git 缺省托管提交)`,options:[{flags:`--kol <slug>`,description:`限定 KOL slug(缺省 = 导出根下全部 KOL)`},{flags:`--day <day>`,description:`单日(YYYY-MM-DD)`},{flags:`--from <day>`,description:`起始日(含,YYYY-MM-DD;与 --to 搭配)`},{flags:`--to <day>`,description:`截止日(含,YYYY-MM-DD;与 --from 搭配)`},{flags:`--all`,description:`导出目录内全部日`},{flags:`--dry-run`,description:`干跑:零落盘零提交`},{flags:`--no-commit`,description:`关闭 git 托管提交(缺省开)`},L,I],schema:i.object({kol:i.string().optional(),day:i.string().optional(),from:i.string().optional(),to:i.string().optional(),all:i.boolean().default(!1),dryRun:i.boolean().default(!1),commit:i.boolean().default(!0),config:i.string().optional(),format:i.enum([`text`,`json`]).default(`text`)}),action:async e=>{let t=await v({kolSlug:e.kol,day:e.day,from:e.from,to:e.to,all:e.all,dryRun:e.dryRun,commit:e.commit},e.config);if(e.format===`json`){_(t),t.ok||(process.exitCode=1);return}if(!t.ok){process.stderr.write(`${t.error.message}\n`),process.exitCode=1;return}for(let n of t.report.partitions)process.stdout.write(`${n.partition}:写入 ${n.written} / 跳过 ${n.skipped}${e.dryRun?`(dry-run)`:``}\n`);for(let e of t.report.profiles)process.stdout.write(`档案:${e.path}${e.written?`已更新`:`跳过`}(${e.skippedReason??`written`})\n`);process.stdout.write(`目录册:${t.report.catalog.entries.length} 分区${t.report.catalog.catalogWritten?`(已更新`:`(无变化`}${t.report.catalog.committed?`,已提交)`:`)`}\n`)}}),t(e,{name:`verify`,description:`一致性体检:content_hash 复算漂移 + 目录册↔磁盘对账(只报告不阻断)`,options:[L,I],schema:i.object({config:i.string().optional(),format:i.enum([`text`,`json`]).default(`text`)}),action:async e=>{let t=await y(e.config);if(e.format===`json`){_(t),t.ok||(process.exitCode=1);return}if(!t.ok){process.stderr.write(`${t.error.message}\n`),process.exitCode=1;return}let{hashDrifts:n,issues:r}=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(n.length===0&&r.length===0){process.stdout.write(`体检通过:无哈希漂移、无对账问题
|
|
5
|
+
`);return}process.exitCode=1}})}function z(e){t(e,{name:`init`,description:`脚手架 kol-data 数据仓(单仓承载全部 KOL:README/kols/docs/.lzi skills/就地配置/package.json/git init;已存在文件不覆盖)`,options:[{flags:`--target <dir>`,description:`目标目录(缺省 cwd)`},{flags:`--no-git`,description:`跳过 git init(缺省执行)`}],schema:i.object({target:i.string().optional(),git:i.boolean().default(!0)}),action:async e=>{let t=await S({targetDir:e.target??process.cwd(),gitInit:e.git?void 0:!1});process.stdout.write(`数据仓就绪:${t.targetDir}(新建 ${t.createdFiles.length} 文件${t.gitInitialized?`,已 git init`:``})\n下一步:在 .env 配置 LZI_KOL_MARKDOWN_CONTENTS_EXPORT_DIR(台账导出根)后执行 convert --all\n`)}})}const B=e({name:`lzi-kol-markdown`,description:`KOL 统一导出流转 markdown 数据仓工具(convert → 平台分区归档 → catalog;数据面 = 属主 NDJSON 只读消费,永不 fetch)`,interaction:n,color:r});z(B),A(B),R(B),F(B),await B.parseAsync(process.argv);
|
package/package.json
ADDED
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@longzai-intelligence-kol-markdown/cli",
|
|
3
|
+
"version": "0.0.1",
|
|
4
|
+
"description": "Longzai Intelligence KOL Markdown CLI - init/convert/verify/catalog/config 六面",
|
|
5
|
+
"license": "UNLICENSED",
|
|
6
|
+
"bin": {
|
|
7
|
+
"lzi-kol-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-kol-markdown/core": "0.0.1",
|
|
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
|
+
}
|