nx-sk 0.9.2 → 0.11.0
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/CHANGELOG.md +137 -0
- package/README.md +53 -4
- package/assets/nx-sk/SKILL.md +16 -2
- package/assets/nx-sk/references/10-sections-entries.md +12 -2
- package/assets/nx-sk/references/50-deploy.md +129 -0
- package/assets/nx-sk/references/60-transfer.md +75 -0
- package/package.json +1 -1
- package/src/core/fields.js +117 -3
- package/src/core/mdimages.js +65 -0
- package/src/core/zip.js +198 -0
- package/src/modules/entries/service.js +45 -22
- package/src/modules/entries/view.jsx +220 -7
- package/src/modules/export/view.jsx +4 -1
- package/src/modules/files/index.js +2 -0
- package/src/modules/files/service.js +10 -3
- package/src/modules/files/view.jsx +27 -1
- package/src/modules/sections/index.js +3 -3
- package/src/modules/sections/service.js +34 -7
- package/src/modules/sections/view.jsx +129 -11
- package/src/modules/settings/navManager.jsx +178 -0
- package/src/modules/settings/service.js +105 -10
- package/src/modules/settings/view.jsx +117 -158
- package/src/modules/system/service.js +7 -1
- package/src/modules/transfer/index.js +106 -0
- package/src/modules/transfer/service.js +778 -0
- package/src/runtime/api.js +30 -0
- package/src/runtime/registry.js +2 -1
- package/src/web/frontend/App.jsx +31 -23
- package/src/web/frontend/activeView.js +42 -0
- package/src/web/frontend/api/files.js +22 -1
- package/src/web/frontend/api/zip.js +22 -0
- package/src/web/frontend/components/fieldEditor.jsx +338 -11
- package/src/web/frontend/components/lightbox.jsx +96 -0
- package/src/web/frontend/components/navModel.js +226 -0
- package/src/web/frontend/components/transferPanel.jsx +294 -0
- package/src/web/frontend/mdInline.js +114 -0
- package/src/web/frontend/store.jsx +17 -3
- package/src/web/frontend/styles.css +232 -0
- package/src/web/public/assets/files-DuwKZ5bu.js +1 -0
- package/src/web/public/assets/{index-lmztA3cP.css → index-C8-8IXxK.css} +1 -1
- package/src/web/public/assets/index-CyHzNRPd.js +41 -0
- package/src/web/public/assets/view-B2C1AKyl.js +7 -0
- package/src/web/public/assets/view-B3dDfoL5.js +1 -0
- package/src/web/public/assets/view-BDMftvuZ.js +7 -0
- package/src/web/public/assets/view-B_XDtZn-.js +1 -0
- package/src/web/public/assets/view-CC3A5XfV.js +1 -0
- package/src/web/public/assets/{view-DAeNDUhQ.js → view-MdIYFfFy.js} +1 -1
- package/src/web/public/assets/zip-CS8JXp8H.js +1 -0
- package/src/web/public/index.html +2 -2
- package/src/web/public/assets/files-CJbQeKB4.js +0 -1
- package/src/web/public/assets/index-VCOWbzUk.js +0 -41
- package/src/web/public/assets/view-BaPkKHfW.js +0 -7
- package/src/web/public/assets/view-C3O-ELnK.js +0 -1
- package/src/web/public/assets/view-CEbJvK5c.js +0 -1
- package/src/web/public/assets/view-CyM1i0hc.js +0 -7
- package/src/web/public/assets/view-e9FlSTod.js +0 -1
package/CHANGELOG.md
CHANGED
|
@@ -2,6 +2,143 @@
|
|
|
2
2
|
|
|
3
3
|
本文件格式参考 [Keep a Changelog](https://keepachangelog.com/),中文正文。
|
|
4
4
|
|
|
5
|
+
## [0.11.0] - 2026-10-18
|
|
6
|
+
|
|
7
|
+
### Added
|
|
8
|
+
|
|
9
|
+
- **栏目导出 / 导入 ZIP(局部迁移)**:栏目页右上角「更多」里有四项 ——
|
|
10
|
+
导出 ZIP(含凭据)、导出 ZIP(打码)、导入 ZIP…、导出 JSON/Markdown。
|
|
11
|
+
导入支持**整页拖入**,先出预览(来源/目标栏目、条目新增与冲突、将补字段、附件新增/复用、
|
|
12
|
+
凭据是否打码),再选冲突策略(跳过 / 另存 / 覆盖)确认后才写盘。
|
|
13
|
+
- 包结构:`manifest.json`(栏目定义 + 条目 + 附件清单 sha256)+ `attachments/<id><ext>` + `README.txt`;
|
|
14
|
+
纯 Node 实现 ZIP 读写(store/deflate),零依赖,拒绝绝对路径与 `..`。
|
|
15
|
+
- 附件按 sha256 **去重复用**;正文 / 附件字段里的旧 file id 自动重映射到新 id。
|
|
16
|
+
- 导出的凭据默认明文(与 export 模块一致);`--no-secrets` 打码,导入侧识别 `******` 并跳过该字段,
|
|
17
|
+
不会把打码串当新密码存进去。
|
|
18
|
+
- CLI:`nx-sk transfer export <栏目> --out x.zip [--no-secrets]`、
|
|
19
|
+
`nx-sk transfer import <栏目> --file x.zip [--dry-run] [--on-conflict skip|copy|overwrite]`。
|
|
20
|
+
- HTTP:`GET /api/sections/:ref/export.zip`、`POST /api/sections/:ref/import.zip`(原始二进制 body,
|
|
21
|
+
不走 base64/JSON,避免大包膨胀 1/3 与 32MB 上限)。
|
|
22
|
+
- **精确导出**:条目列表可勾选(表头全选 / 清空),选中后只打包这些条目与**它们引用到的附件**;
|
|
23
|
+
`--entries` 接受 id 或标题(逗号分隔)。
|
|
24
|
+
- **零配置导入**:`POST /api/import.zip`(栏目页「导入 ZIP」/ 拖入)按包内结构**新建栏目** ——
|
|
25
|
+
字段字典、分组、KV 标记、附件一起建好;id 冲突自动加序号、标题加「(导入)」,
|
|
26
|
+
同一份包可反复导入成多份,不会静默并进现有栏目。
|
|
27
|
+
|
|
28
|
+
- **统一的全局导出 / 导入面板**:「导出与备份」页顶部是栏目树(栏目/条目多选、全选/清空),
|
|
29
|
+
导出为一个多栏目 bundle(`bundle.json` + 每栏目同构 `sections/<id>.zip`);
|
|
30
|
+
下方拖入/点击选择 ZIP,先预览将产生的变更(栏目、条目新增/冲突、补字段、附件新增/复用、凭据),
|
|
31
|
+
再选冲突策略应用。全局导入逐栏目复用单栏目逻辑,行为与栏目页一致。
|
|
32
|
+
CLI:`transfer bundle-export --sections ...`、`transfer bundle-import --file ...`。
|
|
33
|
+
- **附件中心分页**:`GET /api/files` 支持 `limit` / `offset` 并返回 `page` 信息;面板每页 24 个,
|
|
34
|
+
避免一次性把整库图片加载进浏览器导致 OOM;CLI 不传 limit 时仍是全量(行为不变)。
|
|
35
|
+
|
|
36
|
+
- **新字段类型 `md`(图文)**:值是一段 markdown 正文,可用 `` 引用附件库里的图片 ——
|
|
37
|
+
为「说明 + 截屏」混排的内容(部署 SOP、报错复现步骤)准备的。
|
|
38
|
+
- 编辑器(`fieldEditor.jsx`):**Ctrl+V 直接粘截图** / 拖图片进来 / 选文件 / 从附件库插入,
|
|
39
|
+
都会先上传到附件库,再把 `` 插到**光标处**;批量先收齐再一次性插入,
|
|
40
|
+
避免连续插入跟光标位置打架。纯文字粘贴不拦截,仍走浏览器默认行为。
|
|
41
|
+
- **图片统一下方成组**:正文里引用到的图片去重列成缩略图,点击开大图 —— 滚轮缩放、
|
|
42
|
+
拖动平移、双击或「适应」复位、Esc 关闭(新增 `components/lightbox.jsx`)。
|
|
43
|
+
截屏里的一行小字因此看得清,又不必跳到新标签页丢掉上下文。
|
|
44
|
+
- 正文下方就地预览(图片内联渲染),贴完立刻能确认是不是要的那张。
|
|
45
|
+
- **正文里的 http(s) 链接在预览里可直接点开**(新标签页):裸网址与 `[文字](https://…)` 都识别。
|
|
46
|
+
网址尾巴上的中文标点(`。`、`)`)会留在正文里不被吞进 href,括号按成对判断 ——
|
|
47
|
+
维基式 `…/Foo_(bar)` 不会被截断。只认 http/https:`www.`、`ftp://`、文件路径一律按原文,
|
|
48
|
+
否则文件名和包名会满屏变成可点链接。解析抽到 `web/frontend/mdInline.js`(纯函数,有单测),
|
|
49
|
+
图片与链接共用一次扫描,`` 不会再被拆成「图片缺失 + 一条网址」。
|
|
50
|
+
- **外链图片 `` 直接显示**(不进附件库、需要联网),CLI 侧输出
|
|
51
|
+
「[外链图片: 说明] 地址」而不是误报「图片缺失」——误报会让人以为附件被删了又重传一遍。
|
|
52
|
+
- 图片走附件库(`~/nx-sk/files/`),同内容去重;正文里只留 id,所以这段文字导出成 md、
|
|
53
|
+
贴进仓库 README 都能直接渲染(标准 markdown,不是自家方言)。
|
|
54
|
+
- 读侧:`entry get` 把 `` 还原成「[图片: 说明] 本地路径」,并把内嵌图片一并放进
|
|
55
|
+
返回的 `files` 表 —— 否则 CLI / agent 只能拿到一串 `f_xxx`。为此 `getEntry` 多回一个
|
|
56
|
+
`fieldTypes`(键 → 类型),渲染据此决定要不要做这层还原。
|
|
57
|
+
- 面板的类型下拉框改为「中文名(id)」,如「图文(可贴图)(md)」——此前只显示内部 id。
|
|
58
|
+
- **`deploy` 模板同时新增 `sop` 字段**(`md` 类型,`fill: optional`):部署资源的「操作步骤(图文)」。
|
|
59
|
+
已建的 `deploy` 栏目不会自动回溯,用 `nx-sk section sync deploy` 补上(只增不改);
|
|
60
|
+
`references/50-deploy.md` 同步补了「写操作步骤」一节(含「截屏里有 token 先打码」)。
|
|
61
|
+
|
|
62
|
+
- **新栏目模板 `deploy`(部署配置)**:把 Dockerfile / docker-compose / k8s 清单存成**可复用资源**。
|
|
63
|
+
一份文件一个条目 —— `content`(文件原文)+ `path`(建议落盘路径)+ `vars`(复用前要替换的变量)
|
|
64
|
+
+ `usage`(何时用、坑在哪)+ `kind` / `stack` / `tags` / `files`。
|
|
65
|
+
只有正文、没有后三项的配置是「没有上下文的 YAML」,下次没法照着用,所以它们不是可选装饰。
|
|
66
|
+
首次运行随其余 5 个模板一起播种(内置模板共 6 个);**已有 store 不会自动回溯**,用
|
|
67
|
+
`nx-sk section add deploy --template deploy` 补上。
|
|
68
|
+
- 约定:`content` 里**只写 `${VAR}` 占位**,真值放「密钥」栏目(密文落盘)。
|
|
69
|
+
配置文件是最容易被整份复制粘贴分享的东西(发同事 / 贴 issue / 进聊天记录),
|
|
70
|
+
两者混在一起等于给凭据开了一条最宽的出口。这条写进字段 hint 和 `references/50-deploy.md`。
|
|
71
|
+
- 新增 ref 文档 `50-deploy`:为什么单开一个栏目(vs 附件库 / git)、`kind` 取值约定、
|
|
72
|
+
复用四步(找 → 取正文 → 替换变量 → 落盘)、什么时候不该放这里。SKILL.md 的 ref 路由表已登记。
|
|
73
|
+
|
|
74
|
+
### Fixed
|
|
75
|
+
|
|
76
|
+
- **正文预览整篇「图片缺失」,下方图库却正常**:图片 token 只带 `src`,而渲染层按 `id`
|
|
77
|
+
去附件表里查记录 —— 查表键成了 `undefined`,于是每张图都判定为「不存在」。
|
|
78
|
+
图库走的是 `imageRefs`(输出 `id`),所以缩略图反而全都正常,形成「下面 18 张都在、
|
|
79
|
+
正文说一张都没有」的怪象。现在 token 同时带 `id` / `src`,`recordOf` 两个都认,
|
|
80
|
+
并用真实浏览器验证:`imgs=18 / missing=0 / thumbs=18`,另加 token 形状的回归测试。
|
|
81
|
+
- **CLI / 另一个标签页导入的附件,面板里整篇显示「图片缺失」**:附件列表缓存没有失效时机,
|
|
82
|
+
页面一直按进入时那份渲染。整份 SOP 的 18 张图是 CLI 导入的,因此正文全部报缺失
|
|
83
|
+
(附件中心却能看到)。现在缓存加了 1.5s TTL,且图文字段 / 附件字段在挂载时**强制刷新一次**;
|
|
84
|
+
图片还没拉回来时显示「正在加载图片…」,不再把「未加载」误报成「不存在」。
|
|
85
|
+
- **「不填」提示把已填值的可选字段也算进去**:`excluded` 是**策略标记**(`fill: optional/avoid`),
|
|
86
|
+
不代表字段空着。于是「容器平台」这种把可选字段也填满的条目,会被报成「另有 7 项已标不填」,
|
|
87
|
+
与事实相反。现在 CLI(`entry list` / `entry get`)与面板都只列**真的空着**的可选字段。
|
|
88
|
+
- **图文字段刚粘贴的图不显示预览,一直显示「图片缺失」**:附件列表带缓存,上传成功后
|
|
89
|
+
`listAttachments()` 返回的仍是进入页面时那份,新 id 不在表里;而预览是按 id 查表渲染的,
|
|
90
|
+
于是图明明已经进了附件中心,字段里却查不到。现在上传后先把返回的记录**就地并进列表**
|
|
91
|
+
(`mergeFiles`,按 id 去重)再强制刷新服务端台账 —— 预览不再依赖列表是否刷新过。
|
|
92
|
+
另外「图片缺失」的悬停提示写清了原因:指向的附件可能已在附件中心被删除,重新粘贴会得到新 id。
|
|
93
|
+
|
|
94
|
+
- **`entry get` 按行渲染多行正文**:此前 `[String(v)]` 把整段塞进第一行,只有首行带键名列宽,
|
|
95
|
+
后面每一行都从第 0 列开始 —— 一段 40 行的清单打印出来像「掉出了表格」,人眼没法对。
|
|
96
|
+
现在续行统一缩进到内容列(对长 YAML / Dockerfile 尤其明显)。
|
|
97
|
+
- **`settings.defaultSection` 不再是死配置**。此前它只是被落盘,**没有任何读取方**:
|
|
98
|
+
面板初始 tab 来自 `DEFAULT_UI.view = 'job'`(写死),CLI 也不读它 ——
|
|
99
|
+
于是「默认栏目」改完毫无反应,删掉 `job` 栏目还会让首屏停在一个不存在的 id 上。
|
|
100
|
+
- 面板当前 tab 的解析规则抽成纯函数 `src/web/frontend/activeView.js`:
|
|
101
|
+
**地址栏深链 → 本次选择 → `settings.defaultSection` → 第一个 tab**,
|
|
102
|
+
并由 `tests/unit/active-view.test.mjs` 覆盖两条最容易回归的分支
|
|
103
|
+
(boot 之前不许兜底,否则深链被第一个工具页顶掉;默认栏目指向已删栏目要优雅降级)。
|
|
104
|
+
- 当前 tab 不再写 localStorage:它归地址栏管。两个记忆源并存时,
|
|
105
|
+
落盘的那个会永远压住默认栏目,这正是「改了设置看不到效果」的来源。
|
|
106
|
+
- 写入 `defaultSection` 时校验栏目真实存在(写标题也认,归一成 id),
|
|
107
|
+
失败会列出可选项而不是静默存一个永远不生效的值;设置页改成下拉选择,不再手打 id。
|
|
108
|
+
`setting get` 仍然列出这一项(带校验器的标量项,不是「结构化项」)。
|
|
109
|
+
- **`section sync` 会报告「模板漂移」**:同名字段在「栏目 vs 模板」之间哪些属性不同
|
|
110
|
+
(label / type / group / hint / options / maxItems / sensitive / fill),`--dry-run` 也报。
|
|
111
|
+
仍然**只增不改** —— 定义归栏目,你可能就是刻意改过的;提示里给出真正能跟进的命令
|
|
112
|
+
(`--fields` 整份替换,或先 `--remove-field` 再 `--add-field`)。
|
|
113
|
+
`upToDate` 仍只看「有没有可补的」,否则改过一个标签就会永远报「不是最新」。
|
|
114
|
+
|
|
115
|
+
### Changed
|
|
116
|
+
|
|
117
|
+
- **字段类型清单单一来源**:`bootstrap` 下发 `fieldTypes`,面板「新增字段」的类型下拉框据此渲染。
|
|
118
|
+
此前 `modules/sections/view.jsx` 自己抄了一份 10 项清单 —— 后端加一种类型时下拉框永远看不到它。
|
|
119
|
+
- **文案修正**:内置模板是 **6 个**(`job` / `secret` / `projects` / `internships` / `campus` / `deploy`),
|
|
120
|
+
而 `section templates` / `section add` 的摘要与 `--template` 的提示一直只写「求职 / 密钥」,
|
|
121
|
+
会把人引向「只有两个模板」的误解。README 与 `assets/nx-sk/SKILL.md` 的栏目表同步补齐,
|
|
122
|
+
并说明「这 6 个是首次运行播种的默认值,不是固定清单」。
|
|
123
|
+
|
|
124
|
+
## [0.10.0] - 2026-10-15
|
|
125
|
+
|
|
126
|
+
### Added
|
|
127
|
+
|
|
128
|
+
- **「栏目管理」重做成容器 + 拖拽**(设置页)。整页只有一个心智模型:一个栏目要么在「平铺」里、要么在某个分组里、要么在「隐藏」里;拖,就是把它从一个容器挪到另一个。
|
|
129
|
+
- **「隐藏」不再是一个开关,就是一个容器**:与分组同构,拖进去即不进头部(`#/栏目` 直达仍可用)——「显隐」与「归组」因此是同一套操作,不用记两种交互。
|
|
130
|
+
- **拖拽实时预览**:拖动过程中列表就按落点重排(被拖的行半透明停在新位置),松手直接提交这个顺序——所见即所得,不再「先松手再猜落在哪」。
|
|
131
|
+
- **平铺区也能拖排序**:新增 `settings.navOrder`(栏目 id 数组)——显式排过的按它排,没排过的新栏目按栏目自身 `order` 跟在后面,所以「从没拖过」= 老行为不变。
|
|
132
|
+
- 行内只留一个「移出」逃逸按钮(上一版的 上移/下移/显示中/隐藏中 全部去掉);分组把手可拖,换分组之间顺序。
|
|
133
|
+
- 设置页改为**一次保存**:标量设置与导航配置一起存,顶部只出现一次「有未保存的改动 / 保存 / 放弃改动」。
|
|
134
|
+
|
|
135
|
+
- **`settings.navHidden` / `settings.navOrder` 的后端校验**:与分组同构的「栏目 id 清单」校验(栏目必须真实存在、去重保序);CLI 三种写法都认:`--set navOrder=["a","b"]` / `navOrder=a,b` / `navHidden=a`。`setting get` 人类模式现在能一次看全「栏目 + 隐藏状态 + 平铺顺序 + 分组」。
|
|
136
|
+
|
|
137
|
+
### Fixed
|
|
138
|
+
|
|
139
|
+
- **拖拽预览抖动**:两个自己推自己造成的——① 行内 `dragover` 冒泡到容器后会被当成「拖到空白处」翻成「追加到末尾」,指针压在被拖的行上时两种判断来回切;② 落点取自「预览后」的行号,预览一重排索引就变。现在行内就地拦下(`preventDefault` + `stopPropagation`,悬停在自己身上时保持落点不重算)、插入位取自原始配置(+ 指针在上半/下半决定前后)、值没变就不 setState。实测:停在落点边界采样 8 次顺序不变,慢速扫过整列只单调变化 4 次。
|
|
140
|
+
- **分组下拉鼠标下滑就消失**:pill 与菜单之间那 4px 空隙被判成「离开」——补透明桥 + 离开延迟 140ms。
|
|
141
|
+
|
|
5
142
|
## [0.9.2] - 2026-10-15
|
|
6
143
|
|
|
7
144
|
### Added
|
package/README.md
CHANGED
|
@@ -82,9 +82,17 @@ CLI 与 API 同源,skill 驱动 agent**。落到具体功能上:
|
|
|
82
82
|
| 栏目 | id | 内容 |
|
|
83
83
|
| --- | --- | --- |
|
|
84
84
|
| 求职 | `job` | 求职用的个人信息档案:9 个分组 / 75 个字段(姓名、学历、联系方式、求职意向、紧急联系人…)。模板只是**建议清单**,`--set 任意键=值` 直接写 |
|
|
85
|
+
| 项目经历 | `projects` | 一个项目一个条目:名称 / 角色 / 时间 / 技术栈 / 职责与亮点 |
|
|
86
|
+
| 实习/工作经历 | `internships` | 一段经历一个条目:公司 / 岗位 / 时间 / 职责 |
|
|
87
|
+
| 校内职务/实践 | `campus` | 一条职务或实践一个条目:职务 / 组织 / 时间 / 职责 |
|
|
85
88
|
| 密钥 | `secret` | **一张 KV 表**(`kv: true`):面板上就是两列表格(名称 / 值),一行一个键。落盘是 **AES-256-GCM** 密文,读出来默认是原文(`--mask` 才打码) |
|
|
89
|
+
| 部署配置 | `deploy` | **一份配置文件一个条目**(Dockerfile / docker-compose / k8s 清单):正文即文件原文,外加「放哪 / 哪些值要替换 / 何时用」,好让它在别的项目里照着用 |
|
|
86
90
|
|
|
87
|
-
|
|
91
|
+
上表是**首次运行从 6 个内置模板播种出来的默认值,不是固定清单**:栏目不是写死的——
|
|
92
|
+
字段字典是**数据**,加字段(`section update --add-field`,或 `entry update --set 任意键=值` 自动登记)、
|
|
93
|
+
加栏目(`section add`,不给模板就是空栏目全自定义)、删栏目都不用改代码。
|
|
94
|
+
模板在实例化时被**深拷贝**,此后各栏目独立演化;模板后来的新增用 `section sync` 补(只增不改不删,
|
|
95
|
+
有差异时会把「模板已改、栏目保留原值」的字段列出来提示)。
|
|
88
96
|
|
|
89
97
|
## 三条核心不变量
|
|
90
98
|
|
|
@@ -112,7 +120,7 @@ CLI 与 API 同源,skill 驱动 agent**。落到具体功能上:
|
|
|
112
120
|
| `nx-sk routes [--module M] [--http "POST /api/entries"]` | 命令 ↔ 路由双向对照 |
|
|
113
121
|
| `nx-sk section list \| get \| add \| update \| remove` | 栏目 CRUD |
|
|
114
122
|
| `nx-sk section dump <id> [--mask]` | **一个栏目的全部信息**:字段台账 + 全部条目 + 每个条目的未填清单 |
|
|
115
|
-
| `nx-sk section templates` | 内置模板(job / secret) |
|
|
123
|
+
| `nx-sk section templates` | 内置模板(job / secret / projects / internships / campus / deploy) |
|
|
116
124
|
| `nx-sk section sync <id> [--dry-run]` | 按模板**补齐**本栏目缺的分组与字段(只增不改不删)——模板演进后让老栏目追上 |
|
|
117
125
|
| `nx-sk entry list \| get \| add \| update \| remove` | 条目 CRUD(PATCH 语义) |
|
|
118
126
|
| `nx-sk entry fields [--section job]` | 字段字典 —— 填之前先看这个,别猜字段名 |
|
|
@@ -124,6 +132,9 @@ CLI 与 API 同源,skill 驱动 agent**。落到具体功能上:
|
|
|
124
132
|
| `nx-sk file open <id>` | 用系统默认程序打开原件 |
|
|
125
133
|
| `nx-sk export run [--format json\|md\|both] [--section id] [--with-secrets] [--out DIR] [--dry-run]` | 整体导出 |
|
|
126
134
|
| `nx-sk export list` | 历次导出与目录内文件 |
|
|
135
|
+
| `nx-sk transfer export <栏目> [--entries 条目,条目] [--out 文件] [--no-secrets]` | 栏目/选中条目 + 引用附件打成 ZIP(栏目页「更多」里同源下载) |
|
|
136
|
+
| `nx-sk transfer import <栏目> [--file ZIP] [--on-conflict skip\|copy\|overwrite] [--dry-run]` | 预览/导入到指定栏目;附件按 sha256 复用 |
|
|
137
|
+
| `nx-sk transfer import-new [--file ZIP] [--dry-run]` | **零配置**:按包内结构新建栏目(id 冲突加序号) |
|
|
127
138
|
| `nx-sk backup export [--password 口令] [--out DIR] [--with-files] [--dry-run]` | 口令对称加密整库,导出单个 `.nxskbak`(口令不落盘;`--with-files` 连附件原件) |
|
|
128
139
|
| `nx-sk backup import --file <备份> [--password 口令] [--replace] [--dry-run]` | 解密导入:缺省「合并」(只增补、不覆盖已有值,冲突列清单),`--replace` 整份替换;动手前自动留安全快照 |
|
|
129
140
|
| `nx-sk setting get \| set` | 全局设置 |
|
|
@@ -198,8 +209,10 @@ nx-sk file get $FID # 反查「被引用:求职 /
|
|
|
198
209
|
> 若你的求职栏目是很早建的,跑一次 `nx-sk section sync job`(或面板「栏目 → 编辑 → 同步模板字段」)
|
|
199
210
|
> 就能把模板新增的「附件资料」组与 4 个 `file` 字段补进来,且不改动你已有的字段与数据。
|
|
200
211
|
|
|
201
|
-
|
|
202
|
-
|
|
212
|
+
**栏目管理**(设置页):栏目多了以后收拢头部,一眼分得出主次——把同域栏目**拖**成一个分组,
|
|
213
|
+
头部只显示组名、**悬浮展开上下列表**选具体栏目;不常用的栏目拖进「隐藏」容器即不进头部
|
|
214
|
+
(`#/栏目id` 直达仍可用)。整个管理页只有「容器 + 拖拽」一套操作:平铺 / 各分组 / 隐藏,
|
|
215
|
+
拖进拖出就是归组、换位、显隐;改完统一「保存」(一次存全部设置)。
|
|
203
216
|
|
|
204
217
|
```bash
|
|
205
218
|
# 面板:设置 → 头部导航分组(勾选栏目 / 组内排序 / 改名 / 增删组),保存后头部立即生效
|
|
@@ -235,6 +248,42 @@ nx-sk backup import --file ~/nx-sk/backup/xxx.nxskbak --password '你的备份
|
|
|
235
248
|
Web 面板的「导出与备份」页同样支持:导出在浏览器下载 `.nxskbak`(可勾选连附件一起打包),
|
|
236
249
|
导入选择文件并输入口令、报告以弹窗呈现;口令错误或文件损坏会明确报错、不改动当前数据。
|
|
237
250
|
|
|
251
|
+
### 全局导出 / 导入(多栏目)
|
|
252
|
+
|
|
253
|
+
「导出与备份」页顶部:栏目树可勾选栏目,展开后能只选部分条目;点「导出选中的 ZIP」下载。
|
|
254
|
+
把 ZIP 拖进下方框即预览(栏目、条目新增/冲突、附件新增/复用、凭据),选冲突策略后确认。
|
|
255
|
+
全局包 `bundle.json + sections/<id>.zip`,与单栏目包同构;导入时逐栏目复用同一套逻辑。
|
|
256
|
+
|
|
257
|
+
```bash
|
|
258
|
+
nx-sk transfer bundle-export --sections job,projects --out all.zip
|
|
259
|
+
nx-sk transfer bundle-import --file all.zip --dry-run
|
|
260
|
+
nx-sk transfer bundle-import --file all.zip --on-conflict copy
|
|
261
|
+
```
|
|
262
|
+
|
|
263
|
+
|
|
264
|
+
### 只搬一个栏目:ZIP 导出 / 导入
|
|
265
|
+
|
|
266
|
+
整库备份之外,栏目可以单独打包(含条目、栏目定义、实际引用到的附件):
|
|
267
|
+
|
|
268
|
+
```bash
|
|
269
|
+
nx-sk transfer export deploy --out D:/tmp/deploy.zip # 含凭据明文
|
|
270
|
+
nx-sk transfer export deploy --out D:/tmp/share.zip --no-secrets # 打码,给别人
|
|
271
|
+
nx-sk transfer export deploy --entries "k8s-deployment,compose" --out D:/tmp/part.zip # 只导选中条目
|
|
272
|
+
nx-sk transfer import deploy2 --file D:/tmp/deploy.zip --dry-run # 先预览:新增/冲突/补字段/附件
|
|
273
|
+
nx-sk transfer import deploy2 --file D:/tmp/deploy.zip # 栏目不存在就新建
|
|
274
|
+
nx-sk transfer import deploy2 --file D:/tmp/deploy.zip --on-conflict copy # 另存
|
|
275
|
+
nx-sk transfer import deploy2 --file D:/tmp/deploy.zip --on-conflict overwrite # 覆盖字段
|
|
276
|
+
nx-sk transfer import-new --file D:/tmp/deploy.zip # 零配置:按包内结构新建
|
|
277
|
+
```
|
|
278
|
+
|
|
279
|
+
面板里是栏目页右上角「更多」:导出 ZIP(含凭据 / 打码)、导入 ZIP…;
|
|
280
|
+
条目列表可勾选(表头全选/清空),选中后导出**只带这些条目及其附件**。
|
|
281
|
+
把 zip **拖到栏目页任意位置**会导入当前栏目;拖到「栏目」tab 则**零配置新建一个栏目**。
|
|
282
|
+
预览会显示来源栏目、目标栏目、条目冲突、将补的字段、附件新增/复用与凭据是否打码,
|
|
283
|
+
选好冲突策略再确认。
|
|
284
|
+
|
|
285
|
+
附件按 sha256 去重(本机已有就复用);`file` 字段与 `md` 图文里的旧 id 会自动重映射。
|
|
286
|
+
|
|
238
287
|
## 数据与安全
|
|
239
288
|
|
|
240
289
|
| 项 | 位置 / 做法 |
|
package/assets/nx-sk/SKILL.md
CHANGED
|
@@ -1,18 +1,28 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: nx-sk
|
|
3
|
-
description:
|
|
3
|
+
description: 本机个人资源管理器——栏目化存储个人信息(求职档案等)、大模型 API Key、以及可复用的 Dockerfile / docker-compose / k8s 清单,CLI 与 Web 面板同源,敏感字段密文落盘。当用户要"记录/更新我的个人信息"、"填一份求职档案"、"存一个大模型 key"、"管理我的密钥"、"存一份 Dockerfile / compose / k8s 配置"、"找一份可复用的部署配置"、"导出我的资料"、"起一个个人资料面板",或需要在填表单/网申时批量取用个人字段、用 CLI 快速设置某个栏目内容时使用。触发词:nx-sk、个人资源管理器、个人信息、求职档案、栏目、条目、密钥、API key、密文、导出、面板、serve、部署配置、Dockerfile、docker-compose、k8s 清单。不适用:纯问答、不需要落盘的临时讨论;也不适用于把密钥同步/上传到远程服务的场景——nx-sk 只在本机落盘,不做任何上传。
|
|
4
4
|
---
|
|
5
5
|
|
|
6
6
|
# nx-sk · 本机个人资源管理器
|
|
7
7
|
|
|
8
8
|
一句话:**把「你的信息」按栏目存起来,CLI 与 Web 面板是同一套业务,敏感字段密文落盘。**
|
|
9
9
|
|
|
10
|
-
数据落在 `~/nx-sk/`(可用环境变量 `NX_SK_HOME` / `NX_SK_STORE`
|
|
10
|
+
数据落在 `~/nx-sk/`(可用环境变量 `NX_SK_HOME` / `NX_SK_STORE` 覆盖)。首次运行按内置模板播种 6 个栏目:
|
|
11
11
|
|
|
12
12
|
| 栏目 | id | 内容 |
|
|
13
13
|
| --- | --- | --- |
|
|
14
14
|
| 求职 | `job` | 求职用的个人信息档案(姓名/学历/求职意向/简历头像成绩单附件…约 80 个字段) |
|
|
15
|
+
| 项目经历 | `projects` | 一个项目一个条目:名称 / 角色 / 时间 / 技术栈 / 职责与亮点 |
|
|
16
|
+
| 实习/工作经历 | `internships` | 一段经历一个条目:公司 / 岗位 / 时间 / 职责 |
|
|
17
|
+
| 校内职务/实践 | `campus` | 一条职务或实践一个条目 |
|
|
15
18
|
| 密钥 | `secret` | **一张 KV 表**(`kv: true`):一行一个键值对。面板渲染成表格,值以 AES-256-GCM 密文落盘 |
|
|
19
|
+
| 部署配置 | `deploy` | **一份配置文件一个条目**(Dockerfile / compose / k8s 清单):正文即文件原文 + 放哪 + 哪些值要替换 + 何时用。详见 [[50-deploy]] |
|
|
20
|
+
|
|
21
|
+
**这 6 个只是起点,不是固定清单**:栏目可以新建(`section add`,不给模板就是空栏目全自定义)、
|
|
22
|
+
可以加/删字段(`section update --add-field`,或直接 `entry update --set 任意键=值` 自动登记)、
|
|
23
|
+
也可以删掉整个栏目。内置模板共 6 个(`job` / `secret` / `projects` / `internships` / `campus` / `deploy`),
|
|
24
|
+
`section templates` 列出它们;模板在栏目实例化时被**深拷贝**,此后各自独立演化,
|
|
25
|
+
模板后来的新增用 `section sync` 补(只增不改不删)。
|
|
16
26
|
|
|
17
27
|
## 核心不变量
|
|
18
28
|
|
|
@@ -116,6 +126,8 @@ nx-sk setting set --set 'navGroups=[]' # 清空 = 全部栏目恢复平铺
|
|
|
116
126
|
| `20-secrets` | 存/读大模型 key、密文机制、密钥来源(环境变量 vs 本机密钥文件)、什么时候会解不开 |
|
|
117
127
|
| `30-export-backup` | 整体导出、只导出某个栏目、快照与回滚、明文密钥的取舍 |
|
|
118
128
|
| `40-files` | **传/换简历头像成绩单等二进制原件时读**——附件库台账、导入(默认移动)与还原、`file` 字段怎么和条目建立链接、附件中心为什么由栏目驱动、看不到上传字段怎么办 |
|
|
129
|
+
| `50-deploy` | **存/取 Dockerfile、docker-compose、k8s 清单时读**——一份配置一个条目的字段约定、`kind` 取值、复用流程(找 → 取正文 → 替换变量 → 落盘)、为什么明文密钥不写在这里 |
|
|
130
|
+
| `60-transfer` | **搬栏目 / 分享栏目 / 局部迁移时读**——单栏目与全局 bundle 的 ZIP 结构、`transfer export/import/bundle-*` 怎么用、三种冲突策略、附件按 sha256 复用与引用重映射、凭据打码的边界 |
|
|
119
131
|
|
|
120
132
|
取 ref 全文(外部 agent 用这条,不必进终端翻文件):
|
|
121
133
|
|
|
@@ -123,6 +135,8 @@ nx-sk setting set --set 'navGroups=[]' # 清空 = 全部栏目恢复平铺
|
|
|
123
135
|
nx-sk skill get nx-sk # SKILL.md 全文
|
|
124
136
|
nx-sk skill get nx-sk 10-sections-entries # 裸名 → references/10-sections-entries.md
|
|
125
137
|
nx-sk skill get nx-sk 40-files # 附件库:导入 / 链接 / 还原
|
|
138
|
+
nx-sk skill get nx-sk 50-deploy # 部署配置:存 / 找 / 复用
|
|
139
|
+
nx-sk skill get nx-sk 60-transfer # 栏目 ZIP:导出 / 预览 / 导入
|
|
126
140
|
nx-sk skill get nx-sk references/20-secrets.md # 也可写完整路径
|
|
127
141
|
nx-sk skill get nx-sk --json # 四元 JSON:{skillName, ref, content, contentBytes, install}
|
|
128
142
|
```
|
|
@@ -41,8 +41,11 @@ store.json(~/nx-sk/store.json 或 $NX_SK_STORE)
|
|
|
41
41
|
所以模板**后来**新增的分组与字段不会自动出现在老栏目里(典型症状:求职没显示附件上传框)。
|
|
42
42
|
`section sync <id>` 把模板有、本栏目还缺的分组与字段补进来(**只增不改不删**,保持模板顺序;
|
|
43
43
|
已有字段含改过的 label / hint / fill 原样保留),带快照与 `--dry-run`;面板侧是「栏目 → 编辑 → 同步模板字段」。
|
|
44
|
+
- **它还会报告「漂移」**:同名字段在「栏目 vs 模板」之间哪些属性不同(`changedFields`,含 diff 属性名)。
|
|
45
|
+
这是**只提示、不动手**——因为定义归栏目,你可能就是刻意改过。要换成模板的新定义得手动来:
|
|
46
|
+
`section update <id> --fields '<整份字段数组>'`,或先 `--remove-field` 再 `--add-field`(`--add-field` 遇到同名会报冲突)。
|
|
44
47
|
|
|
45
|
-
内置模板
|
|
48
|
+
内置模板 6 个:`job`(求职 / 个人信息,79 字段 / 10 分组——含「附件资料」组:简历附件 / 头像图片 / 成绩单 / 证书扫描件)、`projects`(项目经历)、`internships`(实习/工作经历)、`campus`(校内职务/实践)、`secret`(密钥,**单字段 KV**——细节见 `20-secrets`)、`deploy`(部署配置:Dockerfile / compose / k8s 清单,**一份文件一个条目**——细节见 `50-deploy`)。三类经历栏目(projects / internships / campus)**一个项目 / 一段经历 = 一个条目**,角色、时间、技术栈都是独立字段——不要往 job 栏目里塞经历。
|
|
46
49
|
|
|
47
50
|
## 三、条目命令
|
|
48
51
|
|
|
@@ -121,12 +124,19 @@ nx-sk section update job --remove-field blog
|
|
|
121
124
|
nx-sk section update job --fields @fields.json
|
|
122
125
|
```
|
|
123
126
|
|
|
124
|
-
字段定义支持:`key`(字母开头)、`label`、`type`(`text|textarea|number|date|month|bool|select|tags|secret|file`)、
|
|
127
|
+
字段定义支持:`key`(字母开头)、`label`、`type`(`text|textarea|number|date|month|bool|select|tags|secret|file|md`)、
|
|
125
128
|
`group`、`hint`、`options`(候选项)、`sensitive`(true 则密文落盘)、`maxItems`(tags / file 上限)、
|
|
126
129
|
`fill`(填写策略,见下)。
|
|
127
130
|
|
|
128
131
|
> `type: 'file'` 是**附件字段**:值 = 附件 id 的**列表**(一个字段可挂多个;不是路径),
|
|
129
132
|
> 导入原件、附件库台账、以及「文件统一放 `~/nx-sk/files/`」的完整口径见 `40-files`。
|
|
133
|
+
>
|
|
134
|
+
> `type: 'md'` 是**图文字段**:值是一段 markdown 正文,里面用 `` 引用附件库里的图片。
|
|
135
|
+
> 面板里可以直接 Ctrl+V 粘截图 / 拖入 / 从库里选,图片统一列在正文下方、点开可缩放拖动看细节;
|
|
136
|
+
> 正文里的 `http(s)` 网址(裸网址或 `[文字](https://…)`)在预览里会变成**可直接点开的链接**
|
|
137
|
+
> (新标签页打开),便于把控制台、文档地址嵌进 SOP;`` 这样的外链图片也会直接显示
|
|
138
|
+
> (不进附件库,需要联网)。`entry get` 会把本地图片引用还原成「[图片: 说明] 本地路径」,
|
|
139
|
+
> 外链图片则给「[外链图片: 说明] 地址」。写部署 SOP 这类「说明 + 截屏」的内容用它,口径见 `50-deploy`。
|
|
130
140
|
|
|
131
141
|
> `select` 的 `options` 是**候选项不是白名单**:真实值(如某个少数民族)不在候选里也允许写入。
|
|
132
142
|
|
|
@@ -0,0 +1,129 @@
|
|
|
1
|
+
# 50 · 部署配置(Docker / K8s 规范资源)
|
|
2
|
+
|
|
3
|
+
> 归属 `nx-sk` skill 主文档。要把 Dockerfile / docker-compose / k8s 清单**存成可复用资源**,
|
|
4
|
+
> 或从库里取一份去用,读这篇。字段与命令的通用部分见 `10-sections-entries`。
|
|
5
|
+
|
|
6
|
+
## 一、为什么单开一个栏目
|
|
7
|
+
|
|
8
|
+
配置文件有两种去处,别混:
|
|
9
|
+
|
|
10
|
+
| 去处 | 适合 | 不适合 |
|
|
11
|
+
| --- | --- | --- |
|
|
12
|
+
| 代码仓库(git) | 某个项目**正在用**的配置,要跟着代码一起演进、review、回滚 | 跨项目复用的"模板"——每个仓库存一份,很快就各改各的,没人知道哪份是对的 |
|
|
13
|
+
| 「附件」库 | 二进制原件、别人给的 zip、要原样留档的文件 | 需要**检索 / 改一个变量 / 对比两版**的东西 |
|
|
14
|
+
| **「部署配置」栏目** | **可复用的规范资源**:一份文件一个条目,正文可检索、可替换、可复制 | 需要 git 历史的项目内配置 |
|
|
15
|
+
|
|
16
|
+
一句话:这个栏目是**规范的"发行版"**,项目里的那份是"部署实例"。
|
|
17
|
+
|
|
18
|
+
## 二、一个条目 = 一份文件
|
|
19
|
+
|
|
20
|
+
| 字段 | 作用 |
|
|
21
|
+
| --- | --- |
|
|
22
|
+
| `name` | 条目名(资源名)。一眼看出是什么,如「node-web 多阶段 Dockerfile」 |
|
|
23
|
+
| `kind` | `Dockerfile` / `docker-compose` / `dockerignore` / `k8s-deployment` / `k8s-service` / `k8s-ingress` / `k8s-configmap` / `k8s-secret` / `k8s-kustomization` / `helm` / `其他` |
|
|
24
|
+
| `stack` | 适用技术栈:`node` / `go` / `python` / `任意` |
|
|
25
|
+
| `path` | 建议落盘路径,如 `deploy/k8s/base/deployment.yaml` |
|
|
26
|
+
| `tags` | 自由标签,如 `prod`、`多阶段`、`健康检查`、`SSE` |
|
|
27
|
+
| `content` | **文件正文**(整份原文) |
|
|
28
|
+
| `vars` | 复用前要替换的变量,每行一个 `变量 = 说明` |
|
|
29
|
+
| `usage` | 何时用、为什么这么写、坑在哪 |
|
|
30
|
+
| `sop` | 「说明 + 截屏」的操作步骤(`md` 类型):直接 Ctrl+V 粘图,图片统一列在下方可放大看细节 |
|
|
31
|
+
| `files` | 要连真实文件一起留档时挂附件(可选) |
|
|
32
|
+
|
|
33
|
+
**一份文件一个条目**,不要把一个项目的 Dockerfile + compose + 三个 k8s 清单塞进同一个条目:
|
|
34
|
+
那样既没法按 `kind` 筛,改其中一份也会牵动其它。要表达"同属一个项目",用 `tags`(如 `proj:nx-kv`)。
|
|
35
|
+
|
|
36
|
+
## 三、存一份
|
|
37
|
+
|
|
38
|
+
多行正文走 `--data @file.json` 最稳(`--set` 也吃多行,但要小心 shell 引号):
|
|
39
|
+
|
|
40
|
+
```bash
|
|
41
|
+
# 1) 用一个 JSON 把字段一次给全(正文里就是文件原文)
|
|
42
|
+
cat > /tmp/entry.json <<'JSON'
|
|
43
|
+
{
|
|
44
|
+
"kind": "Dockerfile",
|
|
45
|
+
"stack": "node",
|
|
46
|
+
"path": "Dockerfile",
|
|
47
|
+
"tags": ["多阶段", "健康检查"],
|
|
48
|
+
"vars": "NODE_VERSION = 基础镜像版本\nEXPOSE_PORT = 监听端口",
|
|
49
|
+
"usage": "runtime 阶段不装 node_modules:服务端零 npm 依赖,镜像能压到 ~60MB。",
|
|
50
|
+
"content": "FROM node:22-alpine AS build\n...\n"
|
|
51
|
+
}
|
|
52
|
+
JSON
|
|
53
|
+
nx-sk entry add --section deploy --title "node-web 多阶段 Dockerfile" --data @/tmp/entry.json
|
|
54
|
+
|
|
55
|
+
# 2) 嫌麻烦就直接把文件读进 --set(单行命令,注意整体加引号)
|
|
56
|
+
nx-sk entry add --section deploy --title "标准 k8s Deployment" \
|
|
57
|
+
--set kind=k8s-deployment --set "content=$(cat deploy.yaml)"
|
|
58
|
+
```
|
|
59
|
+
|
|
60
|
+
## 四、取一份来用(复用流程)
|
|
61
|
+
|
|
62
|
+
```bash
|
|
63
|
+
# 1) 找:按类型 / 标签 / 关键词筛(q 会搜正文)
|
|
64
|
+
nx-sk entry list --section deploy --q Dockerfile --json
|
|
65
|
+
|
|
66
|
+
# 2) 取:拿到完整字段(正文在 .values.content)
|
|
67
|
+
nx-sk entry get "node-web 多阶段 Dockerfile" --json
|
|
68
|
+
|
|
69
|
+
# 3) 替换:.values.vars 里列的那些变量,逐个换成本项目的值
|
|
70
|
+
# 4) 落盘:写到 .values.path 指向的位置
|
|
71
|
+
```
|
|
72
|
+
|
|
73
|
+
**别跳过第 3 步**:正文里的值(端口、镜像名、副本数)是上一份场景的取值,直接抄走就会带着别人的假设。
|
|
74
|
+
|
|
75
|
+
整栏导出成一份可读文档(分享/归档用):
|
|
76
|
+
|
|
77
|
+
```bash
|
|
78
|
+
nx-sk export run --section deploy --format md
|
|
79
|
+
```
|
|
80
|
+
|
|
81
|
+
## 五、写操作步骤(`sop` 字段:图文 + 截屏)
|
|
82
|
+
|
|
83
|
+
部署这种东西,**文字说不清的地方基本都在截图里**:哪个按钮、哪一行日志、报错长什么样。
|
|
84
|
+
所以本栏目有一个 `md` 类型的 `sop` 字段:
|
|
85
|
+
|
|
86
|
+
```
|
|
87
|
+
1. 打开控制台,进入「工作负载」
|
|
88
|
+

|
|
89
|
+
2. 点「伸缩」,副本数改成 1 —— 注意 RWO 卷不能多副本
|
|
90
|
+

|
|
91
|
+
```
|
|
92
|
+
|
|
93
|
+
- 面板里**直接 Ctrl+V 粘截图**(也可以把图拖进字段框,或从附件库选),图会先上传到附件库,
|
|
94
|
+
正文里只留 ``;图片统一列在正文下方,点开能放大、滚轮缩放、拖动看细节。
|
|
95
|
+
- 正文是**标准 markdown**:导出成 md、贴进仓库 README 都能直接渲染。
|
|
96
|
+
- 控制台、官方文档这类地址直接写进去就行:`https://…` 裸网址或 `[控制台](https://…)` 都认,
|
|
97
|
+
预览里点一下就在新标签页打开 —— 不必先把链接抄到别处。外链图片 `` 也会显示
|
|
98
|
+
(不进附件库,需要联网;内网图床换机器可能打不开,长期留档的图还是粘进来存本地)。
|
|
99
|
+
- 图片本身走附件库(`~/nx-sk/files/`),同内容去重,不会因为贴两次就存两份。
|
|
100
|
+
- CLI 侧 `nx-sk entry get <资源名>` 会把 `` 还原成「[图片: 名字] 本地路径」,
|
|
101
|
+
agent 因此能直接读到那张图(路径可交给自己或别的工具看)。
|
|
102
|
+
|
|
103
|
+
> 截屏里如果出现 token / 密码 / 内网地址,**先打码再贴**:正文与图片都回不到密文形态。
|
|
104
|
+
|
|
105
|
+
## 六、明文密钥不写在这里
|
|
106
|
+
|
|
107
|
+
`content` 里**只写占位符**,真值放「密钥」栏目(那里是密文落盘):
|
|
108
|
+
|
|
109
|
+
```yaml
|
|
110
|
+
# 对:占位
|
|
111
|
+
stringData:
|
|
112
|
+
token: ${REGISTRY_TOKEN}
|
|
113
|
+
```
|
|
114
|
+
|
|
115
|
+
```bash
|
|
116
|
+
nx-sk key set REGISTRY_TOKEN <真值> # 密文落盘,读出来是原文
|
|
117
|
+
```
|
|
118
|
+
|
|
119
|
+
理由:配置文件是最容易被**整份复制粘贴分享**的东西(发同事、贴 issue、进聊天记录),
|
|
120
|
+
而密钥栏目的落盘是 AES-256-GCM 密文。把两者混在一起,等于给凭据开了一条最宽的出口。
|
|
121
|
+
|
|
122
|
+
> 例外:`k8s-secret` 作为**资源模板**可以有条目,但里面的值同样要写成占位符 ——
|
|
123
|
+
> 它描述的是"Secret 该怎么组织",不是"密钥是多少"。
|
|
124
|
+
|
|
125
|
+
## 七、什么时候不放这里
|
|
126
|
+
|
|
127
|
+
- 项目**正在用**的那份配置 → 进 git(要跟着代码走)。
|
|
128
|
+
- 别人给的二进制 / 压缩包 / 带签名的文件 → 放「附件」库(`file add`)。
|
|
129
|
+
- 需要多版本并存、要 diff 的两版配置 → 正文里加 `版本` 标签或直接放仓库;本栏目只留**当前认可的规范版**。
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
# 栏目导出 / 导入(ZIP)
|
|
2
|
+
|
|
3
|
+
**什么时候读**:要把一个栏目连同附件搬到另一台机器、发给同事、或做局部备份/迁移时。
|
|
4
|
+
它只处理**一个栏目**(不碰其它栏目与整库),和 `30-export-backup` 的整库导出/加密备份是两条路。
|
|
5
|
+
|
|
6
|
+
## 面板操作
|
|
7
|
+
|
|
8
|
+
栏目页右上角「更多」:
|
|
9
|
+
|
|
10
|
+
- **导出 ZIP(含凭据)**:浏览器直接下载,文件里有明文密码(本机单人默认)。
|
|
11
|
+
- **导出 ZIP(打码)**:凭据换成 `******`,适合发给别人。
|
|
12
|
+
- **导入 ZIP…**:选文件;或者把 zip **拖到栏目页任意位置**。
|
|
13
|
+
- **导出 JSON / Markdown**:老的整体导出(写到 `~/nx-sk/export`,不是浏览器下载)。
|
|
14
|
+
|
|
15
|
+
**精确导出**:条目列表左侧有复选框,表头可全选/清空。选中若干条后,菜单文案变成
|
|
16
|
+
「导出选中 N 条(含凭据)」,包里只带这些条目**和它们引用的附件**(不会带无关文件)。
|
|
17
|
+
不选 = 导出整个栏目。
|
|
18
|
+
|
|
19
|
+
导入会先弹**预览**:来源/目标栏目、条目新增与冲突、将补哪些字段、附件新增/复用、凭据是否打码。
|
|
20
|
+
选冲突策略后才写盘:
|
|
21
|
+
|
|
22
|
+
| 策略 | 行为 |
|
|
23
|
+
| --- | --- |
|
|
24
|
+
| `skip`(默认) | 同 id 或同名的条目**保留现有**,不导入 |
|
|
25
|
+
| `copy` | 另存为新条目,标题加「(导入)」;标题是 CLI 定位键,所以必须唯一 |
|
|
26
|
+
| `overwrite` | 用包里的值覆盖现有条目的字段(没带的字段保持本地值) |
|
|
27
|
+
|
|
28
|
+
## CLI
|
|
29
|
+
|
|
30
|
+
```bash
|
|
31
|
+
# 导出(默认含凭据明文)
|
|
32
|
+
nx-sk transfer export deploy --out ~/deploy.zip
|
|
33
|
+
nx-sk transfer export deploy --out ~/deploy-share.zip --no-secrets
|
|
34
|
+
# 只导出选中的条目(id 或标题,逗号分隔)
|
|
35
|
+
nx-sk transfer export deploy --entries "k8s-deployment,docker-compose" --out ~/part.zip
|
|
36
|
+
|
|
37
|
+
# 先预览(不写盘)
|
|
38
|
+
nx-sk transfer import deploy2 --file ~/deploy.zip --dry-run
|
|
39
|
+
|
|
40
|
+
# 真导入:栏目不存在就新建;存在就合并/补字段
|
|
41
|
+
nx-sk transfer import deploy2 --file ~/deploy.zip --on-conflict skip
|
|
42
|
+
|
|
43
|
+
# 零配置:不指定栏目,按包内结构新建(id 冲突自动加序号)
|
|
44
|
+
nx-sk transfer import-new --file ~/deploy.zip
|
|
45
|
+
```
|
|
46
|
+
|
|
47
|
+
`--json` 可用于预览结果(`section.fieldsToAdd`、`entries.conflicts`、`files.new/reused`)。
|
|
48
|
+
|
|
49
|
+
## 包里有什么
|
|
50
|
+
|
|
51
|
+
```
|
|
52
|
+
manifest.json 栏目定义(groups/fields/kv/titleField)+ 条目 + 附件清单(sha256)
|
|
53
|
+
README.txt 给人看的说明
|
|
54
|
+
attachments/<id><ext> 附件原件
|
|
55
|
+
```
|
|
56
|
+
|
|
57
|
+
- 只打包**这个栏目条目实际引用**的附件:`file` 字段的 id + `md` 正文里的 ``。
|
|
58
|
+
- 导入时附件按 **sha256 去重**:本机已有同一份文件就复用,不会存两份。
|
|
59
|
+
- 条目里的旧 file id 会**自动重映射**到新 id(`file` 字段数组与 md 图片引用都改)。
|
|
60
|
+
|
|
61
|
+
## 凭据怎么处理
|
|
62
|
+
|
|
63
|
+
- 导出默认**明文**(跨机器导入才能用;包落盘请自己保管)。
|
|
64
|
+
- `--no-secrets` 时打成 `******`;导入侧识别这个标记并**跳过该字段**,不会把打码串当新密码。
|
|
65
|
+
预览会提示「N 个凭据字段需重填」。
|
|
66
|
+
- 导入后敏感字段用**本机 vaultKey** 重新加密落盘,与手填的字段没有区别。
|
|
67
|
+
|
|
68
|
+
## 限制与坑
|
|
69
|
+
|
|
70
|
+
- 上限:2000 个 zip 条目、单文件 100MB、上传 body 64MB;超过会明确报错。
|
|
71
|
+
大包请用 CLI(本地直接读文件,不走 HTTP)。
|
|
72
|
+
- 导入到**同一个栏目**一定会命中冲突(同 id),需要显式选 `copy` 或 `overwrite`;
|
|
73
|
+
默认 `skip` 时预览会显示「冲突 N」而不是静默成功。
|
|
74
|
+
- 栏目不存在时用包里的定义新建(字段/分组一起建);存在时只**补缺失字段**,不覆盖已有字段定义。
|
|
75
|
+
- zip 内路径做了安全校验(拒绝绝对路径与 `..`),不要手改包里路径后指望能导入。
|