@itradingai/aiwiki 0.2.7 → 0.2.9
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/CONTRIBUTING.md +50 -0
- package/README.md +72 -85
- package/SECURITY.md +31 -0
- package/dist/src/app.js +10 -2
- package/dist/src/encoding.js +76 -0
- package/dist/src/payload.js +3 -78
- package/docs/AGENT_HANDOFF.md +13 -1
- package/docs/FAQ.md +47 -0
- package/docs/README.md +4 -1
- package/docs/RELEASE.md +59 -0
- package/docs/ROADMAP.md +38 -0
- package/docs/SHOWCASE.md +78 -0
- package/docs/USAGE.md +3 -3
- package/docs/architecture.svg +4 -4
- package/package.json +22 -4
- package/skill/SKILL.md +6 -0
- package/docs/assets/aiwiki-hero.png +0 -0
- package/docs/assets/join-group.png +0 -0
- package/docs/assets/wechat-official-account.png +0 -0
package/CONTRIBUTING.md
ADDED
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
# Contributing to AIWiki
|
|
2
|
+
|
|
3
|
+
谢谢你愿意帮 AIWiki 变好。
|
|
4
|
+
|
|
5
|
+
这个仓库比较在意三件事:
|
|
6
|
+
|
|
7
|
+
- 文档说人话
|
|
8
|
+
- 命令可复现
|
|
9
|
+
- 不破坏已有 CLI 行为
|
|
10
|
+
|
|
11
|
+
## 先准备什么
|
|
12
|
+
|
|
13
|
+
本地开发前,先确认:
|
|
14
|
+
|
|
15
|
+
- Node.js `>=20`
|
|
16
|
+
- `npm install`
|
|
17
|
+
- `npm run build`
|
|
18
|
+
- `npm test`
|
|
19
|
+
|
|
20
|
+
## 提 issue 前最好给什么
|
|
21
|
+
|
|
22
|
+
如果你来报 bug,最好把这些信息一起带上:
|
|
23
|
+
|
|
24
|
+
- 操作系统
|
|
25
|
+
- Node.js 版本
|
|
26
|
+
- AIWiki 版本
|
|
27
|
+
- 宿主 Agent
|
|
28
|
+
- 复现步骤
|
|
29
|
+
- 实际输出
|
|
30
|
+
- 期望输出
|
|
31
|
+
|
|
32
|
+
如果能贴 `aiwiki doctor` 和 `aiwiki status` 的输出就更好了。
|
|
33
|
+
|
|
34
|
+
## 提 PR 时注意什么
|
|
35
|
+
|
|
36
|
+
- 尽量小步改
|
|
37
|
+
- 不要顺手改一堆无关内容
|
|
38
|
+
- 不要破坏已有 CLI 输出
|
|
39
|
+
- 新功能尽量补最小测试
|
|
40
|
+
|
|
41
|
+
## 本地验证
|
|
42
|
+
|
|
43
|
+
```bash
|
|
44
|
+
npm run build
|
|
45
|
+
npm test
|
|
46
|
+
aiwiki doctor
|
|
47
|
+
aiwiki status
|
|
48
|
+
```
|
|
49
|
+
|
|
50
|
+
如果你改的是文档,就至少确认链接、命令和文件名都还对。
|
package/README.md
CHANGED
|
@@ -1,61 +1,53 @@
|
|
|
1
|
-

|
|
1
|
+

|
|
2
2
|
|
|
3
3
|
# AIWiki
|
|
4
4
|
|
|
5
|
-
AIWiki
|
|
5
|
+
AIWiki 是一个开源的 Agent-first AI 知识库 CLI。你把文章链接、网页正文或本地文本交给宿主 Agent,宿主 Agent 负责读取内容,AIWiki 负责把结果稳定写进本地知识库,并生成适合 Obsidian 审阅的资料卡、主题、大纲和处理记录。
|
|
6
6
|
|
|
7
|
-
AIWiki
|
|
7
|
+
对外只有一个 AIWiki,公开页面不做软件分层。商业服务放在部署、陪跑和团队集成里,不放在软件版本层。
|
|
8
8
|
|
|
9
|
-
##
|
|
10
|
-
|
|
11
|
-
- `2026-05-09`:完成 npm 公开发布准备,补齐发布前的 README 与交付信息,并让 CLI 版本号与 `package.json` / 发布包保持一致,便于安装、排查与版本确认。
|
|
12
|
-
- `2026-05-08`:完成中文化体验收口,包括默认生成中文 prompt、中文状态输出、中文目标描述,以及 README 和使用文档的中文本地化。
|
|
13
|
-
- `2026-05-08`:强化 Obsidian 工作流,把 Review Queue、Claims Review 等审阅队列提升为一等入口,方便在知识库里持续审阅和回看入库内容。
|
|
14
|
-
- `2026-05-07`:新增 Codex skill 安装能力,并补上 Agent 协议安装引导,让宿主 Agent 在正式入库前更容易完成对接。
|
|
15
|
-
- `2026-05-07`:持续打磨初始化体验,修复 setup 提示问题,避免静默套用默认值,并把首次使用流程改成交互式引导。
|
|
9
|
+
## 它解决什么
|
|
16
10
|
|
|
17
|
-
|
|
11
|
+
- 收藏了很多链接,但最后都散在聊天记录里
|
|
12
|
+
- 想用 AI 总结内容,却很难继续写作或复用
|
|
13
|
+
- 想做选题、资料卡和大纲,但每次都得重新整理
|
|
14
|
+
- 想让 Agent 帮忙收资料,但缺一个稳定的本地入库出口
|
|
18
15
|
|
|
19
|
-
|
|
16
|
+
## 它会生成什么
|
|
20
17
|
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
18
|
+
- 原文记录
|
|
19
|
+
- Source Card 资料卡
|
|
20
|
+
- Claim 建议
|
|
21
|
+
- 创意素材
|
|
22
|
+
- 选题候选
|
|
23
|
+
- 草稿大纲
|
|
24
|
+
- 处理摘要
|
|
25
|
+
- Obsidian 审阅入口
|
|
26
26
|
|
|
27
|
-
|
|
27
|
+
## 30 秒上手
|
|
28
28
|
|
|
29
29
|
```bash
|
|
30
|
-
npx @itradingai/aiwiki@latest setup
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
```bash
|
|
36
|
-
npm install -g @itradingai/aiwiki@latest
|
|
37
|
-
aiwiki setup
|
|
38
|
-
```
|
|
39
|
-
|
|
40
|
-
升级到最新版本:
|
|
41
|
-
|
|
42
|
-
```bash
|
|
43
|
-
npm install -g @itradingai/aiwiki@latest
|
|
30
|
+
npx @itradingai/aiwiki@latest setup
|
|
31
|
+
aiwiki agent list
|
|
32
|
+
aiwiki agent install
|
|
33
|
+
aiwiki prompt agent
|
|
44
34
|
```
|
|
45
35
|
|
|
46
|
-
|
|
36
|
+
然后把 `入库 <url>` 发给宿主 Agent。
|
|
47
37
|
|
|
48
38
|
## 直接发给 AI 帮你安装
|
|
49
39
|
|
|
50
|
-
如果你希望让 Codex、Claude Code、QClaw、OpenClaw 等 AI
|
|
40
|
+
如果你希望让 Codex、Claude Code、QClaw、OpenClaw 等 AI 直接帮你完成安装和配置,可以把下面这段话原样发给它,记得改成你自己的知识库路径:
|
|
51
41
|
|
|
52
42
|
```text
|
|
53
43
|
请帮我安装并配置 AIWiki。
|
|
44
|
+
安装命令:npm install -g @itradingai/aiwiki@latest
|
|
45
|
+
我的知识库路径:F:\knowledges
|
|
54
46
|
|
|
55
47
|
要求:
|
|
56
48
|
1. 先检查本机 Node.js 是否满足 >=20。
|
|
57
49
|
2. 如果还没安装 AIWiki,就安装最新版 `@itradingai/aiwiki`。
|
|
58
|
-
3. 执行 `aiwiki setup
|
|
50
|
+
3. 执行 `aiwiki setup --path "我的知识库路径" --yes`,帮我完成知识库初始化。
|
|
59
51
|
4. 执行 `aiwiki agent list` 检查当前环境支持哪些宿主 Agent。
|
|
60
52
|
5. 优先为当前 AI/Agent 安装 AIWiki 对接;如果能自动安装,就执行 `aiwiki agent install` 或对应的 `--agent` 命令。
|
|
61
53
|
6. 如果当前 Agent 不支持自动安装,就执行 `aiwiki prompt agent`,然后把生成的对接协议整理好,告诉我应该粘贴到哪里。
|
|
@@ -67,15 +59,9 @@ npm install -g @itradingai/aiwiki@latest
|
|
|
67
59
|
- 如果还差手动步骤,明确告诉我下一步怎么做
|
|
68
60
|
```
|
|
69
61
|
|
|
70
|
-
如果你已经确定知识库路径,也可以把上面第 3 步改成直接执行:
|
|
71
|
-
|
|
72
|
-
```bash
|
|
73
|
-
aiwiki setup --path "F:\knowledge_data\aiwiki" --yes
|
|
74
|
-
```
|
|
75
|
-
|
|
76
62
|
## 让宿主 Agent 学会 AIWiki
|
|
77
63
|
|
|
78
|
-
|
|
64
|
+
初始化知识库后,先扫一遍本机支持的宿主 Agent:
|
|
79
65
|
|
|
80
66
|
```bash
|
|
81
67
|
aiwiki agent list
|
|
@@ -102,14 +88,14 @@ aiwiki agent install --agent claude --yes
|
|
|
102
88
|
aiwiki prompt agent
|
|
103
89
|
```
|
|
104
90
|
|
|
105
|
-
把输出内容安装成宿主 Agent 的 skill
|
|
91
|
+
把输出内容安装成宿主 Agent 的 skill,或者粘贴到宿主 Agent 的项目说明里。
|
|
106
92
|
|
|
107
|
-
##
|
|
93
|
+
## 日常入库
|
|
108
94
|
|
|
109
95
|
完成 setup 和 Agent 安装后,对宿主 Agent 发送:
|
|
110
96
|
|
|
111
97
|
```text
|
|
112
|
-
入库 https://
|
|
98
|
+
入库 https://mp.weixin.qq.com/s/5i9UJdBOhCB2a1EVp0lVXQ
|
|
113
99
|
```
|
|
114
100
|
|
|
115
101
|
宿主 Agent 读取网页后,通过 `aiwiki ingest-agent --stdin` 把结构化内容交给 AIWiki CLI。用户不需要手动保存 payload,也不需要每次输入 `--path`。
|
|
@@ -120,49 +106,21 @@ aiwiki prompt agent
|
|
|
120
106
|
用户发送链接 -> 宿主 Agent 读取内容 -> Agent 调用 AIWiki -> AIWiki 写入本地知识库 -> Obsidian 审阅和沉淀
|
|
121
107
|
```
|
|
122
108
|
|
|
123
|
-
##
|
|
109
|
+
## 设计边界
|
|
124
110
|
|
|
125
|
-
AIWiki
|
|
111
|
+
AIWiki 不是通用网页抓取器。网页读取主要交给宿主 Agent,AIWiki 专注于把 Agent 已经读到的内容写成稳定、可追踪、可复用的本地知识资产。
|
|
126
112
|
|
|
127
|
-
|
|
128
|
-
- `dashboards/Review Queue.md`
|
|
129
|
-
- `dashboards/Claims Review.md`
|
|
130
|
-
- `_system/schemas/aiwiki-frontmatter.md`
|
|
113
|
+
AIWiki 生成的 Markdown 和 frontmatter 默认面向 Obsidian + Dataview 审阅;如果你不装 Dataview,普通 Markdown、Properties、Backlinks、Search 和 Graph View 也能用。
|
|
131
114
|
|
|
132
|
-
|
|
115
|
+
当前范围:
|
|
133
116
|
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
```bash
|
|
137
|
-
aiwiki setup
|
|
138
|
-
aiwiki setup --path <path> --yes
|
|
139
|
-
aiwiki agent list
|
|
140
|
-
aiwiki agent install
|
|
141
|
-
aiwiki prompt agent
|
|
142
|
-
aiwiki doctor
|
|
143
|
-
aiwiki status
|
|
144
|
-
aiwiki ingest-agent --stdin
|
|
145
|
-
aiwiki ingest-file --file <file>
|
|
146
|
-
```
|
|
147
|
-
|
|
148
|
-
高级/调试命令:
|
|
149
|
-
|
|
150
|
-
```bash
|
|
151
|
-
aiwiki init --path <path> --yes --set-default
|
|
152
|
-
aiwiki config show
|
|
153
|
-
aiwiki ingest-agent --payload <file>
|
|
154
|
-
aiwiki ingest-url <url> --content-file <file>
|
|
155
|
-
```
|
|
156
|
-
|
|
157
|
-
## 当前范围
|
|
158
|
-
|
|
159
|
-
- 单知识库
|
|
117
|
+
- 只写入当前配置的知识库
|
|
160
118
|
- 单次处理一条输入
|
|
161
119
|
- 宿主 Agent 读取网页、附件或正文
|
|
162
120
|
- CLI 写入本地文件和 Obsidian 友好的结构
|
|
163
121
|
- 生成资料卡、素材建议、主题候选、草稿大纲、处理摘要
|
|
164
122
|
|
|
165
|
-
|
|
123
|
+
当前不包含:
|
|
166
124
|
|
|
167
125
|
- CLI 内置通用网页抓取
|
|
168
126
|
- 跨主题自动路由
|
|
@@ -171,12 +129,32 @@ aiwiki ingest-url <url> --content-file <file>
|
|
|
171
129
|
- 长流程状态机
|
|
172
130
|
- 技术支持流程
|
|
173
131
|
|
|
132
|
+
## 示例展示
|
|
133
|
+
|
|
134
|
+
想先看一次完整跑完会生成什么,可以看:
|
|
135
|
+
|
|
136
|
+
- [docs/SHOWCASE.md](docs/SHOWCASE.md)
|
|
137
|
+
|
|
174
138
|
## 文档
|
|
175
139
|
|
|
176
|
-
-
|
|
177
|
-
-
|
|
178
|
-
-
|
|
179
|
-
-
|
|
140
|
+
- [docs/USAGE.md](docs/USAGE.md)
|
|
141
|
+
- [docs/AGENT_HANDOFF.md](docs/AGENT_HANDOFF.md)
|
|
142
|
+
- [docs/OBSIDIAN_DATAVIEW_PLAN.md](docs/OBSIDIAN_DATAVIEW_PLAN.md)
|
|
143
|
+
- [docs/FAQ.md](docs/FAQ.md)
|
|
144
|
+
- [docs/ROADMAP.md](docs/ROADMAP.md)
|
|
145
|
+
- [docs/RELEASE.md](docs/RELEASE.md)
|
|
146
|
+
- [CONTRIBUTING.md](CONTRIBUTING.md)
|
|
147
|
+
- [SECURITY.md](SECURITY.md)
|
|
148
|
+
- [docs/architecture.svg](docs/architecture.svg)
|
|
149
|
+
|
|
150
|
+
## 参与与反馈
|
|
151
|
+
|
|
152
|
+
如果你想提 bug、提需求,或者反馈宿主 Agent 对接问题,直接看:
|
|
153
|
+
|
|
154
|
+
- [CONTRIBUTING.md](CONTRIBUTING.md)
|
|
155
|
+
- [.github/ISSUE_TEMPLATE/bug_report.md](.github/ISSUE_TEMPLATE/bug_report.md)
|
|
156
|
+
- [.github/ISSUE_TEMPLATE/feature_request.md](.github/ISSUE_TEMPLATE/feature_request.md)
|
|
157
|
+
- [.github/ISSUE_TEMPLATE/agent_integration.md](.github/ISSUE_TEMPLATE/agent_integration.md)
|
|
180
158
|
|
|
181
159
|
## 联系与交流
|
|
182
160
|
|
|
@@ -185,12 +163,12 @@ aiwiki ingest-url <url> --content-file <file>
|
|
|
185
163
|
<table>
|
|
186
164
|
<tr>
|
|
187
165
|
<td align="center" width="50%">
|
|
188
|
-
<img src="docs/assets/join-group.png" alt="扫码进群交流" width="360">
|
|
166
|
+
<img src="https://raw.githubusercontent.com/iTradingAI/aiwiki/refs/heads/main/docs/assets/join-group.png" alt="扫码进群交流" width="360">
|
|
189
167
|
<br>
|
|
190
168
|
<strong>扫码进群</strong>
|
|
191
169
|
</td>
|
|
192
170
|
<td align="center" width="50%">
|
|
193
|
-
<img src="docs/assets/wechat-official-account.png" alt="扫码关注公众号" width="360">
|
|
171
|
+
<img src="https://raw.githubusercontent.com/iTradingAI/aiwiki/refs/heads/main/docs/assets/wechat-official-account.png" alt="扫码关注公众号" width="360">
|
|
194
172
|
<br>
|
|
195
173
|
<strong>关注公众号</strong>
|
|
196
174
|
</td>
|
|
@@ -208,6 +186,15 @@ aiwiki prompt agent
|
|
|
208
186
|
aiwiki doctor
|
|
209
187
|
```
|
|
210
188
|
|
|
189
|
+
## 最新动态
|
|
190
|
+
|
|
191
|
+
- `2026-05-12`:公开前口径收口,统一 README、npm 元数据和公开文档入口。
|
|
192
|
+
- `2026-05-09`:完成 npm 公开发布准备,补齐发布前的 README 与交付信息,并让 CLI 版本号与 `package.json` / 发布包保持一致,便于安装、排查与版本确认。
|
|
193
|
+
- `2026-05-08`:完成中文化体验收口,包括默认生成中文 prompt、中文状态输出、中文目标描述,以及 README 和使用文档的中文本地化。
|
|
194
|
+
- `2026-05-08`:强化 Obsidian 工作流,把 Review Queue、Claims Review 等审阅队列提升为一等入口,方便在知识库里持续审阅和回看入库内容。
|
|
195
|
+
- `2026-05-07`:新增 Codex skill 安装能力,并补上 Agent 协议安装引导,让宿主 Agent 在正式入库前更容易完成对接。
|
|
196
|
+
- `2026-05-07`:持续打磨初始化体验,修复 setup 提示问题,避免静默套用默认值,并把首次使用流程改成交互式引导。
|
|
197
|
+
|
|
211
198
|
## License
|
|
212
199
|
|
|
213
200
|
MIT. See [LICENSE](LICENSE).
|
package/SECURITY.md
ADDED
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
# Security Policy
|
|
2
|
+
|
|
3
|
+
AIWiki 是一个本地 CLI 工具。它会按用户指定的路径写入 Markdown、JSON 和配置文件。
|
|
4
|
+
|
|
5
|
+
## 安全边界
|
|
6
|
+
|
|
7
|
+
AIWiki 不会:
|
|
8
|
+
|
|
9
|
+
- 主动上传用户本地知识库内容
|
|
10
|
+
- 绕过登录墙或付费墙
|
|
11
|
+
- 自动修改 `.obsidian` 插件配置
|
|
12
|
+
- 自动安装 Dataview
|
|
13
|
+
- 扫描未指定的个人目录
|
|
14
|
+
|
|
15
|
+
## 建议
|
|
16
|
+
|
|
17
|
+
- 只在你信任的环境里运行 AIWiki
|
|
18
|
+
- 首次使用时最好指定一个新的测试知识库目录
|
|
19
|
+
- 遇到异常写入行为时,先停下来检查 payload 和目标路径
|
|
20
|
+
|
|
21
|
+
## 报告问题
|
|
22
|
+
|
|
23
|
+
如果你发现疑似安全问题,请优先提交 issue,并尽量附上:
|
|
24
|
+
|
|
25
|
+
- 运行命令
|
|
26
|
+
- 目标路径
|
|
27
|
+
- `aiwiki doctor` 输出
|
|
28
|
+
- `aiwiki status` 输出
|
|
29
|
+
- 能稳定复现的最小示例
|
|
30
|
+
|
|
31
|
+
如果问题涉及本地数据泄露、越权写入或路径逃逸,请尽量把细节说清楚,方便快速复核。
|
package/dist/src/app.js
CHANGED
|
@@ -7,13 +7,12 @@ import { flagBool, flagString, parseArgs } from "./args.js";
|
|
|
7
7
|
import { ingestFile, ingestPayload } from "./ingest.js";
|
|
8
8
|
import { CliError, writeLine } from "./output.js";
|
|
9
9
|
import { confirmInit, directorySummary, doctor, exists, initWorkspace, promptForSetup, promptForInitPath, readConfig, resolveWorkspace, setDefaultWorkspace, statusSummary } from "./workspace.js";
|
|
10
|
-
export const VERSION = "0.2.7";
|
|
11
10
|
export async function runCli(argv, streams = { stdout: process.stdout, stderr: process.stderr }) {
|
|
12
11
|
try {
|
|
13
12
|
const args = parseArgs(argv);
|
|
14
13
|
const [command, subcommand] = args.positional;
|
|
15
14
|
if (args.flags.has("version") || command === "version" || command === "-v") {
|
|
16
|
-
writeLine(streams.stdout, `aiwiki ${
|
|
15
|
+
writeLine(streams.stdout, `aiwiki ${await packageVersion()}`);
|
|
17
16
|
return 0;
|
|
18
17
|
}
|
|
19
18
|
if (args.flags.has("help") || !command || command === "help" || command === "-h") {
|
|
@@ -415,3 +414,12 @@ function parseJson(text) {
|
|
|
415
414
|
throw new CliError("payload must be valid JSON");
|
|
416
415
|
}
|
|
417
416
|
}
|
|
417
|
+
async function packageVersion() {
|
|
418
|
+
const packageRoot = path.resolve(path.dirname(fileURLToPath(import.meta.url)), "..", "..");
|
|
419
|
+
const text = await fs.readFile(path.join(packageRoot, "package.json"), "utf8");
|
|
420
|
+
const parsed = JSON.parse(text);
|
|
421
|
+
if (typeof parsed.version !== "string") {
|
|
422
|
+
throw new CliError("package.json is missing version");
|
|
423
|
+
}
|
|
424
|
+
return parsed.version;
|
|
425
|
+
}
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
export function repairMojibake(value) {
|
|
2
|
+
if (!value || !looksLikeUtf8Mojibake(value)) {
|
|
3
|
+
return { value, repaired: false };
|
|
4
|
+
}
|
|
5
|
+
const repaired = decodeUtf8BytesFromLatin1(value) ?? decodeUtf8BytesFromCp1252(value);
|
|
6
|
+
if (!repaired || scoreText(repaired) <= scoreText(value)) {
|
|
7
|
+
return { value, repaired: false };
|
|
8
|
+
}
|
|
9
|
+
return { value: repaired, repaired: true };
|
|
10
|
+
}
|
|
11
|
+
function looksLikeUtf8Mojibake(value) {
|
|
12
|
+
return /(?:Ã|Â|â€|“|â€|’|å|ç|è|é|ä|æ|ï¼|ã€)/.test(value);
|
|
13
|
+
}
|
|
14
|
+
function decodeUtf8BytesFromLatin1(value) {
|
|
15
|
+
try {
|
|
16
|
+
return Buffer.from(value, "latin1").toString("utf8");
|
|
17
|
+
}
|
|
18
|
+
catch {
|
|
19
|
+
return undefined;
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
function decodeUtf8BytesFromCp1252(value) {
|
|
23
|
+
const bytes = [];
|
|
24
|
+
for (const char of value) {
|
|
25
|
+
const code = char.codePointAt(0);
|
|
26
|
+
if (code === undefined) {
|
|
27
|
+
continue;
|
|
28
|
+
}
|
|
29
|
+
const mapped = cp1252ReverseMap.get(code);
|
|
30
|
+
if (mapped !== undefined) {
|
|
31
|
+
bytes.push(mapped);
|
|
32
|
+
}
|
|
33
|
+
else if (code <= 0xff) {
|
|
34
|
+
bytes.push(code);
|
|
35
|
+
}
|
|
36
|
+
else {
|
|
37
|
+
return undefined;
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
return Buffer.from(bytes).toString("utf8");
|
|
41
|
+
}
|
|
42
|
+
function scoreText(value) {
|
|
43
|
+
const cjk = [...value].filter((char) => /[\u4e00-\u9fff]/u.test(char)).length;
|
|
44
|
+
const mojibake = (value.match(/(?:Ã|Â|â€|“|â€|’|å|ç|è|é|ä|æ|ï¼|ã€)/g) ?? []).length;
|
|
45
|
+
const replacement = (value.match(/\uFFFD/g) ?? []).length;
|
|
46
|
+
return cjk * 4 - mojibake * 20 - replacement * 50;
|
|
47
|
+
}
|
|
48
|
+
const cp1252ReverseMap = new Map([
|
|
49
|
+
[0x20ac, 0x80],
|
|
50
|
+
[0x201a, 0x82],
|
|
51
|
+
[0x0192, 0x83],
|
|
52
|
+
[0x201e, 0x84],
|
|
53
|
+
[0x2026, 0x85],
|
|
54
|
+
[0x2020, 0x86],
|
|
55
|
+
[0x2021, 0x87],
|
|
56
|
+
[0x02c6, 0x88],
|
|
57
|
+
[0x2030, 0x89],
|
|
58
|
+
[0x0160, 0x8a],
|
|
59
|
+
[0x2039, 0x8b],
|
|
60
|
+
[0x0152, 0x8c],
|
|
61
|
+
[0x017d, 0x8e],
|
|
62
|
+
[0x2018, 0x91],
|
|
63
|
+
[0x2019, 0x92],
|
|
64
|
+
[0x201c, 0x93],
|
|
65
|
+
[0x201d, 0x94],
|
|
66
|
+
[0x2022, 0x95],
|
|
67
|
+
[0x2013, 0x96],
|
|
68
|
+
[0x2014, 0x97],
|
|
69
|
+
[0x02dc, 0x98],
|
|
70
|
+
[0x2122, 0x99],
|
|
71
|
+
[0x0161, 0x9a],
|
|
72
|
+
[0x203a, 0x9b],
|
|
73
|
+
[0x0153, 0x9c],
|
|
74
|
+
[0x017e, 0x9e],
|
|
75
|
+
[0x0178, 0x9f]
|
|
76
|
+
]);
|
package/dist/src/payload.js
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { repairMojibake } from "./encoding.js";
|
|
1
2
|
export function normalizePayload(raw, runStartedAt) {
|
|
2
3
|
if (!isRecord(raw)) {
|
|
3
4
|
throw new Error("payload must be a JSON object");
|
|
@@ -40,10 +41,10 @@ export function normalizePayload(raw, runStartedAt) {
|
|
|
40
41
|
: ["source_card", "creative_assets", "topics", "draft_outline", "processing_summary"];
|
|
41
42
|
const outputs = ["source_card", "creative_assets", "topics", "draft_outline", "processing_summary"];
|
|
42
43
|
if (fetchStatus !== "failed" && requestedOutputs.length && requestedOutputs.length !== outputs.length) {
|
|
43
|
-
warnings.push("
|
|
44
|
+
warnings.push("AIWiki 会为每条输入生成完整资料产物,request.outputs 已按全量输出处理。");
|
|
44
45
|
}
|
|
45
46
|
if (typeof raw.target_kb === "string" && raw.target_kb.trim()) {
|
|
46
|
-
warnings.push(`target_kb=${raw.target_kb}
|
|
47
|
+
warnings.push(`target_kb=${raw.target_kb} 已被当前知识库流程忽略。`);
|
|
47
48
|
}
|
|
48
49
|
if (contentRepair.repaired) {
|
|
49
50
|
warnings.push("source.content 检测到疑似 UTF-8 mojibake,已自动修复。");
|
|
@@ -105,79 +106,3 @@ function stringValue(value) {
|
|
|
105
106
|
function isRecord(value) {
|
|
106
107
|
return typeof value === "object" && value !== null && !Array.isArray(value);
|
|
107
108
|
}
|
|
108
|
-
function repairMojibake(value) {
|
|
109
|
-
if (!value || !looksLikeUtf8Mojibake(value)) {
|
|
110
|
-
return { value, repaired: false };
|
|
111
|
-
}
|
|
112
|
-
const repaired = decodeUtf8BytesFromLatin1(value) ?? decodeUtf8BytesFromCp1252(value);
|
|
113
|
-
if (!repaired || scoreText(repaired) <= scoreText(value)) {
|
|
114
|
-
return { value, repaired: false };
|
|
115
|
-
}
|
|
116
|
-
return { value: repaired, repaired: true };
|
|
117
|
-
}
|
|
118
|
-
function looksLikeUtf8Mojibake(value) {
|
|
119
|
-
return /(?:Ã|Â|â€|“|â€|’|å|ç|è|é|ä|æ|ï¼|ã€)/.test(value);
|
|
120
|
-
}
|
|
121
|
-
function decodeUtf8BytesFromLatin1(value) {
|
|
122
|
-
try {
|
|
123
|
-
return Buffer.from(value, "latin1").toString("utf8");
|
|
124
|
-
}
|
|
125
|
-
catch {
|
|
126
|
-
return undefined;
|
|
127
|
-
}
|
|
128
|
-
}
|
|
129
|
-
function decodeUtf8BytesFromCp1252(value) {
|
|
130
|
-
const bytes = [];
|
|
131
|
-
for (const char of value) {
|
|
132
|
-
const code = char.codePointAt(0);
|
|
133
|
-
if (code === undefined) {
|
|
134
|
-
continue;
|
|
135
|
-
}
|
|
136
|
-
const mapped = cp1252ReverseMap.get(code);
|
|
137
|
-
if (mapped !== undefined) {
|
|
138
|
-
bytes.push(mapped);
|
|
139
|
-
}
|
|
140
|
-
else if (code <= 0xff) {
|
|
141
|
-
bytes.push(code);
|
|
142
|
-
}
|
|
143
|
-
else {
|
|
144
|
-
return undefined;
|
|
145
|
-
}
|
|
146
|
-
}
|
|
147
|
-
return Buffer.from(bytes).toString("utf8");
|
|
148
|
-
}
|
|
149
|
-
function scoreText(value) {
|
|
150
|
-
const cjk = [...value].filter((char) => /[\u4e00-\u9fff]/u.test(char)).length;
|
|
151
|
-
const mojibake = (value.match(/(?:Ã|Â|â€|“|â€|’|å|ç|è|é|ä|æ|ï¼|ã€)/g) ?? []).length;
|
|
152
|
-
const replacement = (value.match(/\uFFFD/g) ?? []).length;
|
|
153
|
-
return cjk * 4 - mojibake * 20 - replacement * 50;
|
|
154
|
-
}
|
|
155
|
-
const cp1252ReverseMap = new Map([
|
|
156
|
-
[0x20ac, 0x80],
|
|
157
|
-
[0x201a, 0x82],
|
|
158
|
-
[0x0192, 0x83],
|
|
159
|
-
[0x201e, 0x84],
|
|
160
|
-
[0x2026, 0x85],
|
|
161
|
-
[0x2020, 0x86],
|
|
162
|
-
[0x2021, 0x87],
|
|
163
|
-
[0x02c6, 0x88],
|
|
164
|
-
[0x2030, 0x89],
|
|
165
|
-
[0x0160, 0x8a],
|
|
166
|
-
[0x2039, 0x8b],
|
|
167
|
-
[0x0152, 0x8c],
|
|
168
|
-
[0x017d, 0x8e],
|
|
169
|
-
[0x2018, 0x91],
|
|
170
|
-
[0x2019, 0x92],
|
|
171
|
-
[0x201c, 0x93],
|
|
172
|
-
[0x201d, 0x94],
|
|
173
|
-
[0x2022, 0x95],
|
|
174
|
-
[0x2013, 0x96],
|
|
175
|
-
[0x2014, 0x97],
|
|
176
|
-
[0x02dc, 0x98],
|
|
177
|
-
[0x2122, 0x99],
|
|
178
|
-
[0x0161, 0x9a],
|
|
179
|
-
[0x203a, 0x9b],
|
|
180
|
-
[0x0153, 0x9c],
|
|
181
|
-
[0x017e, 0x9e],
|
|
182
|
-
[0x0178, 0x9f]
|
|
183
|
-
]);
|
package/docs/AGENT_HANDOFF.md
CHANGED
|
@@ -35,7 +35,19 @@ AIWiki CLI 不做通用网页抓取。网页读取失败时,Agent 仍然要调
|
|
|
35
35
|
aiwiki ingest-agent --stdin
|
|
36
36
|
```
|
|
37
37
|
|
|
38
|
-
7.
|
|
38
|
+
7. 如果当前 shell、终端或宿主环境无法保证 stdin 是 UTF-8,先把 payload 写成 UTF-8 JSON 文件,再调用:
|
|
39
|
+
|
|
40
|
+
```bash
|
|
41
|
+
aiwiki ingest-agent --payload <utf8-json-file>
|
|
42
|
+
```
|
|
43
|
+
|
|
44
|
+
8. 读取 CLI 输出,向用户回复入库状态、契合度、摘要、资料卡、处理记录和 Obsidian 审阅入口。
|
|
45
|
+
|
|
46
|
+
## 编码要求
|
|
47
|
+
|
|
48
|
+
payload 必须是 UTF-8 JSON。Windows PowerShell、批处理、第三方 Agent shell bridge 可能会把中文 JSON 管道按非 UTF-8 编码传递;遇到中文乱码、`payload must be valid JSON` 或无法确认管道编码时,使用 `--payload <utf8-json-file>`。
|
|
49
|
+
|
|
50
|
+
AIWiki 会修复常见 UTF-8 mojibake,但这只是兜底;宿主 Agent 仍应尽量传入干净 UTF-8。
|
|
39
51
|
|
|
40
52
|
## 成功 payload
|
|
41
53
|
|
package/docs/FAQ.md
ADDED
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
# AIWiki FAQ
|
|
2
|
+
|
|
3
|
+
## AIWiki 是什么?
|
|
4
|
+
|
|
5
|
+
AIWiki 是一个开源的 Agent-first AI 知识库 CLI。它把文章链接、网页正文和本地文本整理成本地知识资产,方便在 Obsidian 里继续审阅和写作。
|
|
6
|
+
|
|
7
|
+
## AIWiki 是网页爬虫吗?
|
|
8
|
+
|
|
9
|
+
不是。网页读取主要交给宿主 Agent,AIWiki 专注于校验结构化输入、写本地文件和生成审阅产物。
|
|
10
|
+
|
|
11
|
+
## 一定要用 Obsidian 吗?
|
|
12
|
+
|
|
13
|
+
不一定。AIWiki 生成的是标准 Markdown 和 frontmatter,Obsidian 只是最适合它的审阅界面之一。
|
|
14
|
+
|
|
15
|
+
## 一定要装 Dataview 吗?
|
|
16
|
+
|
|
17
|
+
不一定。没有 Dataview,也可以用 Obsidian 原生的 Properties、Backlinks、Search 和 Graph View。
|
|
18
|
+
|
|
19
|
+
## 宿主 Agent 和 AIWiki 各负责什么?
|
|
20
|
+
|
|
21
|
+
- 宿主 Agent 负责读取网页、正文或附件,并组装 payload
|
|
22
|
+
- AIWiki 负责校验 payload、写本地知识库、输出处理记录
|
|
23
|
+
- 用户负责提供链接或正文,最后在 Obsidian 里审阅结果
|
|
24
|
+
|
|
25
|
+
## 为什么要先让 Agent 学会 AIWiki?
|
|
26
|
+
|
|
27
|
+
因为大多数用户不想每次手动跑命令。更顺的方式是:把链接发给宿主 Agent,Agent 自动把内容交给 AIWiki,AIWiki 再把结果写进本地知识库。
|
|
28
|
+
|
|
29
|
+
## 我能不能把它当成一个通用爬虫用?
|
|
30
|
+
|
|
31
|
+
不建议。AIWiki 的边界不是“抓全网”,而是“把宿主 Agent 已经读到的内容稳定沉淀下来”。
|
|
32
|
+
|
|
33
|
+
## 我从哪里开始最好?
|
|
34
|
+
|
|
35
|
+
先跑:
|
|
36
|
+
|
|
37
|
+
```bash
|
|
38
|
+
npx @itradingai/aiwiki@latest setup
|
|
39
|
+
aiwiki agent list
|
|
40
|
+
aiwiki agent install
|
|
41
|
+
```
|
|
42
|
+
|
|
43
|
+
然后去看:
|
|
44
|
+
|
|
45
|
+
- [USAGE.md](USAGE.md)
|
|
46
|
+
- [SHOWCASE.md](SHOWCASE.md)
|
|
47
|
+
- [AGENT_HANDOFF.md](AGENT_HANDOFF.md)
|
package/docs/README.md
CHANGED
|
@@ -1,11 +1,14 @@
|
|
|
1
1
|
# AIWiki Docs
|
|
2
2
|
|
|
3
|
-
AIWiki 是一个 Agent-first 的本地知识库工具,用来把宿主 Agent
|
|
3
|
+
AIWiki 是一个 Agent-first 的本地知识库工具,用来把宿主 Agent 已经读取到的文章、网页正文或本地文本写入当前配置的知识库。
|
|
4
4
|
|
|
5
5
|
- 用户使用说明:[USAGE.md](USAGE.md)
|
|
6
6
|
- Agent 对接协议:[AGENT_HANDOFF.md](AGENT_HANDOFF.md)
|
|
7
7
|
- Obsidian + Dataview 方案:[OBSIDIAN_DATAVIEW_PLAN.md](OBSIDIAN_DATAVIEW_PLAN.md)
|
|
8
8
|
- 架构图:[architecture.svg](architecture.svg)
|
|
9
|
+
- 示例展示:[SHOWCASE.md](SHOWCASE.md)
|
|
10
|
+
- 常见问题:[FAQ.md](FAQ.md)
|
|
11
|
+
- 路线图:[ROADMAP.md](ROADMAP.md)
|
|
9
12
|
|
|
10
13
|
## Quick Start
|
|
11
14
|
|
package/docs/RELEASE.md
ADDED
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
# AIWiki 发布检查
|
|
2
|
+
|
|
3
|
+
发布前先确认本地工作区只包含本次发布需要的改动:
|
|
4
|
+
|
|
5
|
+
```bash
|
|
6
|
+
git status --short --branch
|
|
7
|
+
npm run release:check
|
|
8
|
+
```
|
|
9
|
+
|
|
10
|
+
`release:check` 会执行测试、构建、`npm pack --dry-run`、CLI 版本一致性检查,以及一次临时知识库入库检查。
|
|
11
|
+
|
|
12
|
+
## 版本号
|
|
13
|
+
|
|
14
|
+
版本号以 `package.json` 为唯一来源。CLI 的 `aiwiki --version` 会运行时读取 `package.json`,不要在源码里另写一份版本常量。
|
|
15
|
+
|
|
16
|
+
升级版本:
|
|
17
|
+
|
|
18
|
+
```bash
|
|
19
|
+
npm version patch --no-git-tag-version
|
|
20
|
+
```
|
|
21
|
+
|
|
22
|
+
## npm 发布
|
|
23
|
+
|
|
24
|
+
发布前确认 npm 登录账号:
|
|
25
|
+
|
|
26
|
+
```bash
|
|
27
|
+
npm whoami
|
|
28
|
+
```
|
|
29
|
+
|
|
30
|
+
正式发布:
|
|
31
|
+
|
|
32
|
+
```bash
|
|
33
|
+
npm publish --access public
|
|
34
|
+
```
|
|
35
|
+
|
|
36
|
+
如果账号开启了 publish 2FA,普通 token 可能只能 `whoami`,但发布时仍会要求 OTP。此时有两种方式:
|
|
37
|
+
|
|
38
|
+
```bash
|
|
39
|
+
npm publish --access public --otp <OTP>
|
|
40
|
+
```
|
|
41
|
+
|
|
42
|
+
或使用 npm Automation token 写入用户级 `.npmrc`:
|
|
43
|
+
|
|
44
|
+
```bash
|
|
45
|
+
npm config set //registry.npmjs.org/:_authToken "<NPM_AUTOMATION_TOKEN>"
|
|
46
|
+
```
|
|
47
|
+
|
|
48
|
+
发布后验证:
|
|
49
|
+
|
|
50
|
+
```bash
|
|
51
|
+
npm view @itradingai/aiwiki version
|
|
52
|
+
npm view @itradingai/aiwiki versions --json
|
|
53
|
+
```
|
|
54
|
+
|
|
55
|
+
## 包体积
|
|
56
|
+
|
|
57
|
+
npm 包只应包含 CLI 运行和用户文档所需文件。README 中的图片使用 GitHub raw 链接展示,`docs/assets/` 不进入 npm 包。
|
|
58
|
+
|
|
59
|
+
如果 `npm pack --dry-run` 输出里出现 `docs/assets/`,说明包内容配置回退了,需要先修复 `package.json.files`。
|
package/docs/ROADMAP.md
ADDED
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
# AIWiki Roadmap
|
|
2
|
+
|
|
3
|
+
AIWiki 对外只有一个项目,所以这里写的是能力路线,不是版本分层。
|
|
4
|
+
|
|
5
|
+
## 1. 更稳的入库体验
|
|
6
|
+
|
|
7
|
+
- 更顺的 setup 引导
|
|
8
|
+
- 更清晰的 doctor 检查
|
|
9
|
+
- 更稳定的 Agent handoff
|
|
10
|
+
- 更完整的 Obsidian 审阅入口
|
|
11
|
+
- 更容易追查失败原因
|
|
12
|
+
|
|
13
|
+
## 2. 更完整的内容处理能力
|
|
14
|
+
|
|
15
|
+
- 更好用的资料卡
|
|
16
|
+
- 更清楚的 Claim / Evidence 建议
|
|
17
|
+
- 更顺手的选题候选
|
|
18
|
+
- 更稳定的大纲生成
|
|
19
|
+
- 更好复用的模板和输出结构
|
|
20
|
+
|
|
21
|
+
## 3. 更适合团队和自动化部署
|
|
22
|
+
|
|
23
|
+
- 更多宿主 Agent 接入方式
|
|
24
|
+
- 更适合团队协作的知识库目录
|
|
25
|
+
- 更完善的部署说明
|
|
26
|
+
- 更清楚的诊断和支持入口
|
|
27
|
+
- 更好的服务化落地方式
|
|
28
|
+
|
|
29
|
+
## 4. 服务层能力
|
|
30
|
+
|
|
31
|
+
公开软件还是 AIWiki 本身。后续如果要做商业化,重点会放在:
|
|
32
|
+
|
|
33
|
+
- 部署服务
|
|
34
|
+
- 陪跑服务
|
|
35
|
+
- 团队集成服务
|
|
36
|
+
- 技术支持服务
|
|
37
|
+
|
|
38
|
+
这些都属于服务层,不是把 AIWiki 拆成多个软件版本。
|
package/docs/SHOWCASE.md
ADDED
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
# AIWiki 示例展示
|
|
2
|
+
|
|
3
|
+
这页不是讲概念,直接看一次完整跑通会发生什么。
|
|
4
|
+
|
|
5
|
+
## 示例 1:一篇文章进知识库
|
|
6
|
+
|
|
7
|
+
### 用户输入
|
|
8
|
+
|
|
9
|
+
```text
|
|
10
|
+
入库 https://example.com/article
|
|
11
|
+
```
|
|
12
|
+
|
|
13
|
+
### 宿主 Agent 做的事
|
|
14
|
+
|
|
15
|
+
1. 读取网页正文或可访问内容。
|
|
16
|
+
2. 组装 `aiwiki.agent_payload.v1`。
|
|
17
|
+
3. 调用 `aiwiki ingest-agent --stdin`。
|
|
18
|
+
4. 把 AIWiki 的处理结果回复给用户。
|
|
19
|
+
|
|
20
|
+
### AIWiki 会写什么
|
|
21
|
+
|
|
22
|
+
```text
|
|
23
|
+
09-runs/<run-id>/payload.json
|
|
24
|
+
09-runs/<run-id>/raw.md
|
|
25
|
+
09-runs/<run-id>/source-card.md
|
|
26
|
+
09-runs/<run-id>/creative-assets.md
|
|
27
|
+
09-runs/<run-id>/topics.md
|
|
28
|
+
09-runs/<run-id>/draft-outline.md
|
|
29
|
+
09-runs/<run-id>/processing-summary.md
|
|
30
|
+
```
|
|
31
|
+
|
|
32
|
+
### 长期目录会出现什么
|
|
33
|
+
|
|
34
|
+
```text
|
|
35
|
+
02-raw/articles/
|
|
36
|
+
03-sources/article-cards/
|
|
37
|
+
04-claims/_suggestions/
|
|
38
|
+
06-assets/_suggestions/
|
|
39
|
+
07-topics/ready/
|
|
40
|
+
08-outputs/outlines/
|
|
41
|
+
dashboards/
|
|
42
|
+
```
|
|
43
|
+
|
|
44
|
+
### 用户在 Obsidian 里怎么看
|
|
45
|
+
|
|
46
|
+
- 打开 `dashboards/AIWiki Home.md`
|
|
47
|
+
- 查看 `dashboards/Review Queue.md`
|
|
48
|
+
- 从资料卡回到原文、选题、大纲和处理记录
|
|
49
|
+
|
|
50
|
+
## 示例 2:网页没读到正文
|
|
51
|
+
|
|
52
|
+
有些页面需要登录,或者宿主 Agent 暂时拿不到正文。这个时候 AIWiki 也不会装死,它会把失败原因记录下来。
|
|
53
|
+
|
|
54
|
+
### 用户输入
|
|
55
|
+
|
|
56
|
+
```text
|
|
57
|
+
入库 https://example.com/locked-page
|
|
58
|
+
```
|
|
59
|
+
|
|
60
|
+
### 结果
|
|
61
|
+
|
|
62
|
+
```text
|
|
63
|
+
09-runs/<run-id>/payload.json
|
|
64
|
+
09-runs/<run-id>/processing-summary.md
|
|
65
|
+
```
|
|
66
|
+
|
|
67
|
+
### 你会看到什么
|
|
68
|
+
|
|
69
|
+
- 失败原因会写进 `processing-summary.md`
|
|
70
|
+
- 用户仍然能在 Obsidian 里看到这次处理记录
|
|
71
|
+
- 下次只要宿主 Agent 能读到正文,就可以重新入库
|
|
72
|
+
|
|
73
|
+
## 这个示例页想说明什么
|
|
74
|
+
|
|
75
|
+
- AIWiki 不是网页爬虫本体
|
|
76
|
+
- 宿主 Agent 负责读取内容
|
|
77
|
+
- AIWiki 负责稳定写入本地知识库
|
|
78
|
+
- 结果始终可追踪、可复盘、可继续写作
|
package/docs/USAGE.md
CHANGED
|
@@ -6,7 +6,7 @@
|
|
|
6
6
|
用户只做一次 setup -> 之后只把链接发给 Agent -> Agent 自动调用 AIWiki 入库
|
|
7
7
|
```
|
|
8
8
|
|
|
9
|
-
AIWiki CLI 不负责网页抓取。Qclaw、Codex、Claude Code、Cursor、Gemini CLI 等都只是宿主 Agent
|
|
9
|
+
AIWiki CLI 不负责网页抓取。Qclaw、Codex、Claude Code、Cursor、Gemini CLI 等都只是宿主 Agent 的例子;这份文档面向的是通用宿主 Agent 协作。
|
|
10
10
|
|
|
11
11
|
## 1. 一次性设置
|
|
12
12
|
|
|
@@ -78,13 +78,13 @@ aiwiki agent install --agent claude --yes
|
|
|
78
78
|
- `openclaw`:复制到 OpenClaw workspace skills 目录。
|
|
79
79
|
- `claude`:复制为 Claude Code slash-command 提示文件。
|
|
80
80
|
|
|
81
|
-
`opencode` 和 `hermes`
|
|
81
|
+
`opencode` 和 `hermes` 会被扫描出来,但 AIWiki 暂不自动写入它们的配置。确认官方用户提示/skill 目录后再开放自动安装。现在可先输出通用对接协议:
|
|
82
82
|
|
|
83
83
|
```bash
|
|
84
84
|
aiwiki prompt agent
|
|
85
85
|
```
|
|
86
86
|
|
|
87
|
-
把输出内容安装成宿主 Agent 的 skill,或粘贴到宿主 Agent 的项目/会话说明里。不同 Agent
|
|
87
|
+
把输出内容安装成宿主 Agent 的 skill,或粘贴到宿主 Agent 的项目/会话说明里。不同 Agent 的安装入口不同,所以 AIWiki 提供自动安装向导和通用协议两条路径。
|
|
88
88
|
|
|
89
89
|
## 3. 日常使用
|
|
90
90
|
|
package/docs/architecture.svg
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
<svg xmlns="http://www.w3.org/2000/svg" width="1280" height="820" viewBox="0 0 1280 820" role="img" aria-labelledby="title desc">
|
|
2
|
-
<title id="title">AIWiki
|
|
3
|
-
<desc id="desc">AIWiki
|
|
2
|
+
<title id="title">AIWiki Architecture</title>
|
|
3
|
+
<desc id="desc">AIWiki architecture showing setup, host Agent installation, ingestion, CLI processing, and local knowledge base outputs.</desc>
|
|
4
4
|
<defs>
|
|
5
5
|
<style>
|
|
6
6
|
.bg { fill: #fbfaf7; }
|
|
@@ -25,7 +25,7 @@
|
|
|
25
25
|
</defs>
|
|
26
26
|
|
|
27
27
|
<rect class="bg" x="0" y="0" width="1280" height="820"/>
|
|
28
|
-
<text class="title" x="54" y="58">AIWiki
|
|
28
|
+
<text class="title" x="54" y="58">AIWiki 架构图</text>
|
|
29
29
|
<text class="small" x="56" y="86">目标:宿主 Agent 负责读取与理解,AIWiki CLI 负责校验与本地确定性写入。</text>
|
|
30
30
|
|
|
31
31
|
<rect class="band" x="48" y="118" width="1184" height="118" rx="8"/>
|
|
@@ -98,6 +98,6 @@
|
|
|
98
98
|
|
|
99
99
|
<rect class="panel" x="772" y="650" width="460" height="102" rx="8"/>
|
|
100
100
|
<text class="h2" x="798" y="684">边界</text>
|
|
101
|
-
<text class="small" x="798" y="714"
|
|
101
|
+
<text class="small" x="798" y="714">AIWiki 不抓网页、不做多知识库、不做状态机、不做批量队列。</text>
|
|
102
102
|
<text class="small" x="798" y="738">所有写入必须限制在目标知识库根目录内。</text>
|
|
103
103
|
</svg>
|
package/package.json
CHANGED
|
@@ -1,13 +1,26 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@itradingai/aiwiki",
|
|
3
|
-
"version": "0.2.
|
|
3
|
+
"version": "0.2.9",
|
|
4
4
|
"type": "module",
|
|
5
|
-
"description": "Agent-first
|
|
5
|
+
"description": "Agent-first AI knowledge base CLI for turning articles, links and notes into Obsidian-ready source cards, topics, outlines and reusable knowledge assets.",
|
|
6
6
|
"license": "MIT",
|
|
7
7
|
"keywords": [
|
|
8
8
|
"aiwiki",
|
|
9
|
-
"
|
|
9
|
+
"ai-knowledge-base",
|
|
10
10
|
"knowledge-base",
|
|
11
|
+
"knowledge-management",
|
|
12
|
+
"agent",
|
|
13
|
+
"ai-agent",
|
|
14
|
+
"agentic-workflow",
|
|
15
|
+
"llm-wiki",
|
|
16
|
+
"markdown",
|
|
17
|
+
"cli",
|
|
18
|
+
"codex",
|
|
19
|
+
"claude-code",
|
|
20
|
+
"openclaw",
|
|
21
|
+
"qclaw",
|
|
22
|
+
"content-workflow",
|
|
23
|
+
"writing-workflow",
|
|
11
24
|
"obsidian",
|
|
12
25
|
"dataview"
|
|
13
26
|
],
|
|
@@ -22,7 +35,11 @@
|
|
|
22
35
|
"files": [
|
|
23
36
|
"dist/src",
|
|
24
37
|
"README.md",
|
|
25
|
-
"
|
|
38
|
+
"LICENSE",
|
|
39
|
+
"CONTRIBUTING.md",
|
|
40
|
+
"SECURITY.md",
|
|
41
|
+
"docs/*.md",
|
|
42
|
+
"docs/architecture.svg",
|
|
26
43
|
"skill"
|
|
27
44
|
],
|
|
28
45
|
"bin": {
|
|
@@ -32,6 +49,7 @@
|
|
|
32
49
|
"build": "tsc -p tsconfig.json",
|
|
33
50
|
"test": "npm run build && node --test \"dist/tests/*.test.js\"",
|
|
34
51
|
"check": "npm run test",
|
|
52
|
+
"release:check": "npm test && node scripts/release-check.mjs",
|
|
35
53
|
"prepack": "npm run build"
|
|
36
54
|
},
|
|
37
55
|
"devDependencies": {
|
package/skill/SKILL.md
CHANGED
|
@@ -21,6 +21,12 @@ The host Agent reads the webpage or user-provided body, then passes structured c
|
|
|
21
21
|
aiwiki ingest-agent --stdin
|
|
22
22
|
```
|
|
23
23
|
|
|
24
|
+
If the current shell or Agent bridge cannot guarantee UTF-8 stdin, write the payload as a UTF-8 JSON file and call:
|
|
25
|
+
|
|
26
|
+
```bash
|
|
27
|
+
aiwiki ingest-agent --payload <utf8-json-file>
|
|
28
|
+
```
|
|
29
|
+
|
|
24
30
|
For local files, call:
|
|
25
31
|
|
|
26
32
|
```bash
|
|
Binary file
|
|
Binary file
|
|
Binary file
|