@swifty.js/swifty 0.0.1 → 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 +183 -0
- package/dist/agent-MICFDGUF.js +4 -0
- package/dist/anthropic-JDAGNAPR.js +4 -0
- package/dist/checker-PF3FEOF2.js +4 -0
- package/dist/chunk-4KVSJNS6.js +90 -0
- package/dist/chunk-6ARDOHBL.js +4 -0
- package/dist/chunk-7MHXMDYC.js +35 -0
- package/dist/chunk-F6HLYUZ4.js +355 -0
- package/dist/chunk-FZPTNGTU.js +4 -0
- package/dist/chunk-LPLPMGWW.js +336 -0
- package/dist/chunk-MQ5XOYLD.js +4 -0
- package/dist/chunk-RD3MICOU.js +4 -0
- package/dist/{cleanup-4R3534Z3.js → cleanup-BQJDUOKA.js} +1 -1
- package/dist/glob_addon.node +0 -0
- package/dist/main.js +240 -240
- package/dist/openai-I4WTRNNT.js +26 -0
- package/dist/{server-XPKSROM2.js → server-OGPKL2U2.js} +22 -21
- package/package.json +17 -24
- package/dist/anthropic-737END4X.js +0 -4
- package/dist/chunk-NCPOPA4A.js +0 -4
- package/dist/chunk-SC34YHMX.js +0 -521
- package/dist/chunk-Z3E5YV3P.js +0 -121
- package/dist/openai-4KX74QBZ.js +0 -27
- package/docs/ch1.md +0 -25
- package/docs/ch10.md +0 -122
- package/docs/ch11.md +0 -163
- package/docs/ch12.md +0 -289
- package/docs/ch13.md +0 -320
- package/docs/ch14.md +0 -152
- package/docs/ch15.md +0 -547
- package/docs/ch2.md +0 -273
- package/docs/ch3.md +0 -206
- package/docs/ch4.md +0 -125
- package/docs/ch5.md +0 -165
- package/docs/ch6.md +0 -201
- package/docs/ch7.md +0 -448
- package/docs/ch8.md +0 -217
- package/docs/ch9.md +0 -351
- package/docs/index.css +0 -23
- package/docs/index.md +0 -21
- package/docs/swifty.mdx +0 -7
package/docs/ch9.md
DELETED
|
@@ -1,351 +0,0 @@
|
|
|
1
|
-
# 指令文件、会话持久化、跨会话记忆
|
|
2
|
-
|
|
3
|
-
- 工作记忆: 上下文窗口
|
|
4
|
-
- 长期记忆: 持久化到磁盘
|
|
5
|
-
- 指令文件 SWIFTY.md, AGENTS.md
|
|
6
|
-
- 会话持久化
|
|
7
|
-
- 自动记忆: Agent 在对话中自动积累的经验, 例如用户的编码偏好、项目的技术架构
|
|
8
|
-
|
|
9
|
-
## 指令文件
|
|
10
|
-
|
|
11
|
-
<!-- 源码: src/remote/agent-setup.ts, src/conversation/conversation.ts -->
|
|
12
|
-
|
|
13
|
-
Swifty 开启新会话时, 自动读取指令文件, 使用 `<system-reminder />` 标签包裹, 作为上下文注入到发送给 LLM API 的 messages 字段中
|
|
14
|
-
|
|
15
|
-
一个典型的 AGENTS.md
|
|
16
|
-
|
|
17
|
-
```md
|
|
18
|
-
# AGENTS.md
|
|
19
|
-
|
|
20
|
-
## Project
|
|
21
|
-
|
|
22
|
-
Swifty is an AI coding assistant TUI built with React + Ink. It talks to LLM providers (Anthropic, OpenAI, OpenAI-compatible) via tool-calling conversations.
|
|
23
|
-
|
|
24
|
-
## Tech Stack
|
|
25
|
-
|
|
26
|
-
TypeScript, React, Ink, Zod, Vitest, ESLint, oxfmt, pnpm workspace deps: `@swifty.js/glob-addon`, `@swifty.js/glob-wasm`.
|
|
27
|
-
|
|
28
|
-
## Code Conventions
|
|
29
|
-
|
|
30
|
-
Enforced by `eslint.config.js`.
|
|
31
|
-
|
|
32
|
-
### Type safety
|
|
33
|
-
|
|
34
|
-
- No `any`, no `!`, no `@ts-ignore`, no `as` casts.
|
|
35
|
-
- All `no-unsafe-*` rules are errors.
|
|
36
|
-
- Validate runtime data with Zod.
|
|
37
|
-
|
|
38
|
-
### Style
|
|
39
|
-
|
|
40
|
-
- File names: kebab-case.
|
|
41
|
-
- Control flow: always use braces (`curly: "all"`).
|
|
42
|
-
- Promises: must be awaited or voided.
|
|
43
|
-
```
|
|
44
|
-
|
|
45
|
-
### 优先级
|
|
46
|
-
|
|
47
|
-
<!-- 源码: src/memory/instructions.ts, discoverInstructions 函数 -->
|
|
48
|
-
|
|
49
|
-
`discoverInstructions` 按以下顺序发现并加载指令文件, 优先级从低到高
|
|
50
|
-
|
|
51
|
-
1. `~/.swifty/SWIFTY.md` 用户级, 最先加载
|
|
52
|
-
2. `~/.swifty/AGENTS.md` 用户级
|
|
53
|
-
3. projectRoot 仓库根目录到 workDir 工作目录的每一层目录的 `SWIFTY.md` 和 `AGENTS.md`
|
|
54
|
-
4. `${workDir}/.swifty/INSTRUCTIONS.md` legacy 兼容
|
|
55
|
-
5. `${workDir}/SWIFTY.local.md` 本地覆盖, 最后加载, 最高优先级
|
|
56
|
-
|
|
57
|
-
指令文件按顺序加载, 后加载的指令文件不会覆盖先加载的指令文件, 多个指令文件会被拼接, 使用 --- 分隔
|
|
58
|
-
|
|
59
|
-
prompt 中靠后的内容, 得到的 LLM 注意力更多, 冲突时优先级更高
|
|
60
|
-
|
|
61
|
-
## `@` 引用指令
|
|
62
|
-
|
|
63
|
-
可以在指令文件中使用 `@` 引用其他文件 <!-- 源码: src/memory/instructions.ts -->
|
|
64
|
-
|
|
65
|
-
```md
|
|
66
|
-
# SWIFTY.md
|
|
67
|
-
|
|
68
|
-
@./docs/project.md
|
|
69
|
-
@./docs/tech-stack.md
|
|
70
|
-
@./docs/conventions.md
|
|
71
|
-
```
|
|
72
|
-
|
|
73
|
-
支持的路径格式 <!-- 源码: src/memory/instructions.ts -->:
|
|
74
|
-
|
|
75
|
-
- `@./relative/path`, `@../parent/path`
|
|
76
|
-
- `@~/home/path`
|
|
77
|
-
- `@/absolute/path`
|
|
78
|
-
|
|
79
|
-
````js
|
|
80
|
-
const MAX_INCLUDE_DEPTH = 5;
|
|
81
|
-
|
|
82
|
-
function expandIncludes(content, baseDir, seen, depth, projectRoot) {
|
|
83
|
-
if (depth > MAX_INCLUDE_DEPTH) {
|
|
84
|
-
return content;
|
|
85
|
-
}
|
|
86
|
-
const lines = content.split("\n");
|
|
87
|
-
const out = [];
|
|
88
|
-
let inCode = false;
|
|
89
|
-
|
|
90
|
-
for (const line of lines) {
|
|
91
|
-
const trimmed = line.trim();
|
|
92
|
-
|
|
93
|
-
// 检测 markdown 代码块边界
|
|
94
|
-
if (trimmed.startsWith("```")) {
|
|
95
|
-
inCode = !inCode;
|
|
96
|
-
out.push(line);
|
|
97
|
-
continue;
|
|
98
|
-
}
|
|
99
|
-
|
|
100
|
-
if (!inCode) {
|
|
101
|
-
const includePath = parseInclude(trimmed);
|
|
102
|
-
if (includePath) {
|
|
103
|
-
const abs = resolve(includePath, baseDir);
|
|
104
|
-
if (!seen.has(abs)) {
|
|
105
|
-
// 只允许 projectRoot 和 ~/.swifty
|
|
106
|
-
if (!isIncludeAllowed(abs, projectRoot)) {
|
|
107
|
-
out.push("<!-- @include skipped: path outside project -->");
|
|
108
|
-
continue;
|
|
109
|
-
}
|
|
110
|
-
const data = readFileSync(abs, "utf-8");
|
|
111
|
-
seen.add(abs);
|
|
112
|
-
out.push(`<!-- included from ${includePath} -->`);
|
|
113
|
-
out.push(expandIncludes(data, dirname(abs), seen, depth + 1, projectRoot));
|
|
114
|
-
continue;
|
|
115
|
-
}
|
|
116
|
-
}
|
|
117
|
-
}
|
|
118
|
-
out.push(line);
|
|
119
|
-
}
|
|
120
|
-
return out.join("\n");
|
|
121
|
-
}
|
|
122
|
-
````
|
|
123
|
-
|
|
124
|
-
安全风险
|
|
125
|
-
|
|
126
|
-
1. 无限递归: SWIFTY.md 引用 CLAUDE.md, CLAUDE.md 引用 SWIFTY.md, 导致无限递归; 使用 `depth` 参数限制最大递归深度
|
|
127
|
-
2. 重复 inline 同一个文件: 维护 `seen` 集合, 记录已 inline 的绝对路径, 遇到已 inline 的绝对路径直接跳过
|
|
128
|
-
3. 路径越界: `@` 引用的路径必须在项目目录或 `~/.swifty` 内, 越界的路径会被替换为注释 `<!-- @include skipped: path outside project -->`
|
|
129
|
-
|
|
130
|
-
## 会话持久化
|
|
131
|
-
|
|
132
|
-
Swifty 的会话持久化使用 JSONL 格式 (JSON lines), 每行一个 JSON 对象, 代表一条消息
|
|
133
|
-
|
|
134
|
-
为什么不使用 sqlite?
|
|
135
|
-
|
|
136
|
-
- 引入额外的依赖, 提高打包复杂度, 增大打包产物体积
|
|
137
|
-
- 用不上 sqlite 的条件查询能力
|
|
138
|
-
|
|
139
|
-
为什么不使用普通 JSON?
|
|
140
|
-
|
|
141
|
-
- 使用普通 JSON, 新增一条消息需要:
|
|
142
|
-
- 读取文件为 JSON 字符串
|
|
143
|
-
- 反序列化 JSON 字符串为数组
|
|
144
|
-
- 向数组中 push 一个元素
|
|
145
|
-
- 序列化数组为 JSON 字符串
|
|
146
|
-
- 将 JSON 字符串写回文件, 如果写崩溃, 则损坏整个会话数据
|
|
147
|
-
- 使用 JSONL
|
|
148
|
-
- 追加写入: 新增一条消息, 直接追加到文件尾部 <!-- 源码: src/session/session.ts, saveMessage 使用 flag "a" -->
|
|
149
|
-
- 增量加载: 恢复会话时逐行读取, 遇到解析失败的行直接跳过 <!-- 源码: src/session/session.ts, loadSession -->
|
|
150
|
-
- 如果写崩溃, 只损坏最后一行
|
|
151
|
-
|
|
152
|
-
```json
|
|
153
|
-
{
|
|
154
|
-
"role": "user",
|
|
155
|
-
"content": "Write a WeChat",
|
|
156
|
-
"timestamp": 1783277127000
|
|
157
|
-
}
|
|
158
|
-
{
|
|
159
|
-
"role": "assistant",
|
|
160
|
-
"content": [
|
|
161
|
-
{ "type": "text", "text": "OK, let me ..." },
|
|
162
|
-
{
|
|
163
|
-
"type": "tool_use",
|
|
164
|
-
"id": "tool_use_abc123",
|
|
165
|
-
"name": "ReadFile",
|
|
166
|
-
"input": {
|
|
167
|
-
"path": "/path/to/project/main.ts",
|
|
168
|
-
"timestamp": 1783277280000
|
|
169
|
-
}
|
|
170
|
-
}
|
|
171
|
-
]
|
|
172
|
-
}
|
|
173
|
-
// 对于 Claude API, tool_result 放在 role 为 user 的消息中, 使用 tool_result 类型的 content block 传递
|
|
174
|
-
{
|
|
175
|
-
"role": "tool_result",
|
|
176
|
-
"tool_use_id": "tool_use_abc123",
|
|
177
|
-
"content": "import ...",
|
|
178
|
-
"timestamp": 1783277384000
|
|
179
|
-
}
|
|
180
|
-
{
|
|
181
|
-
"role": "assistant",
|
|
182
|
-
"content": "OK, let me ...",
|
|
183
|
-
"timestamp": 1783277510000
|
|
184
|
-
}
|
|
185
|
-
```
|
|
186
|
-
|
|
187
|
-
## 会话日志
|
|
188
|
-
|
|
189
|
-
会话日志放在项目的 .swifty/sessions 目录下
|
|
190
|
-
|
|
191
|
-
追加消息时, 先写 jsonl 文件, 再更新内存 <!-- 源码: src/session/session.ts -->
|
|
192
|
-
|
|
193
|
-
- 如果先写 jsonl 文件再更新内存, 更新内存失败进程崩溃时, 恢复会话可以从 jsonl 文件重建
|
|
194
|
-
- 如果先更新内存再写 jsonl 文件, 写 jsonl 文件失败进程崩溃时, 恢复会话消息丢失
|
|
195
|
-
|
|
196
|
-
```txt
|
|
197
|
-
.swifty/
|
|
198
|
-
sessions/
|
|
199
|
-
YYYY-MM-DD-hh:mm:ss-hash.jsonl
|
|
200
|
-
```
|
|
201
|
-
|
|
202
|
-
## 恢复会话
|
|
203
|
-
|
|
204
|
-
1. 逐行读取, 遇到解析失败的行直接跳过 <!-- 源码: src/session/session.ts, loadSession -->
|
|
205
|
-
2. 校验消息链的完整性: 追踪所有的工具调用, 截断到最后一个「所有的工具调用都有结果」的位置, 避免 LLM 看到有一个工具调用但是没有结果, 感到困惑
|
|
206
|
-
3. 检查 token 用量: 如果恢复的对话历史很长, token 用量可能超过压缩阈值, 直接触发上下文压缩
|
|
207
|
-
4. 插入时间跨度提示词: 如果距离上次会话活跃超过 24h, 在对话历史中插入一条消息提醒 LLM: 距离上次会话活跃 ?h, 可能有代码变更, 建议重新读取相关文件, 避免 LLM 使用过期的文件内容做决策
|
|
208
|
-
|
|
209
|
-
## 过期会话清理
|
|
210
|
-
|
|
211
|
-
Swifty 启动时, 自动清理 .swifty/sessions 目录下超过 30 天没有活跃的会话日志 <!-- 源码: src/session/session.ts SESSION_EXPIRY_DAYS = 30, src/session/session.ts cleanExpiredSessions -->
|
|
212
|
-
|
|
213
|
-
## 自动记忆
|
|
214
|
-
|
|
215
|
-
例如要求 Agent: 缩进用 2 个空格, 不要用 4 个空格
|
|
216
|
-
|
|
217
|
-
<!-- 源码: src/memory/manager.ts -->
|
|
218
|
-
|
|
219
|
-
- 用户偏好, 存储到 `~/.swifty/memory`
|
|
220
|
-
- 项目知识, 存储到 `${workDir}/.swifty/memory`
|
|
221
|
-
|
|
222
|
-
<!-- 源码: src/memory/manager.ts, parseFrontmatter -->
|
|
223
|
-
|
|
224
|
-
每条记忆是一个独立的 .md 文件, 有 yaml frontmatter 描述元信息
|
|
225
|
-
|
|
226
|
-
```txt
|
|
227
|
-
.swifty/memory/
|
|
228
|
-
MEMORY.md # 索引文件, 注入到 messages 字段
|
|
229
|
-
no-type-assertions.md
|
|
230
|
-
validate-runtime-data-with-zod.md
|
|
231
|
-
```
|
|
232
|
-
|
|
233
|
-
<!-- 源码: src/memory/manager.ts, MAX_ENTRYPOINT_LINES = 200, MAX_ENTRYPOINT_BYTES = 25_000 -->
|
|
234
|
-
|
|
235
|
-
MEMORY.md 索引文件注入到 messages 字段时有 token 上限, 最多 200 行或 25KB (2k-3k tokens), 超过会截断并附加警告, 防止记忆太多撑满上下文
|
|
236
|
-
|
|
237
|
-
<!-- 源码: src/memory/manager.ts, rebuildIndex -->
|
|
238
|
-
|
|
239
|
-
```md
|
|
240
|
-
- [No `any`, no `!`, no `@ts-ignore`, no `as` casts](./no-type-assertions.md) — 禁止使用 any、非空断言、@ts-ignore 和 as 类型断言
|
|
241
|
-
- [Validate runtime data with Zod](./validate-runtime-data-with-zod.md) — 使用 Zod 校验运行时数据
|
|
242
|
-
```
|
|
243
|
-
|
|
244
|
-
## 记忆加载
|
|
245
|
-
|
|
246
|
-
<!-- 源码: src/remote/agent-setup.ts, src/conversation/conversation.ts -->
|
|
247
|
-
|
|
248
|
-
Swifty 开启新会话时, 自动读取指令文件和 MEMORY.md, 使用 `<system-reminder>` 标签包裹, 作为上下文注入到发送给 LLM API 的 messages 字段中; 如果某条记忆的 description 和当前任务相关, LLM 可以调用 ReadFile 读取对应的记忆文件
|
|
249
|
-
|
|
250
|
-
## 记忆提取
|
|
251
|
-
|
|
252
|
-
<!-- 源码: src/memory/extractor.ts (TODO) -->
|
|
253
|
-
|
|
254
|
-
每轮 agent loop 结束后, 记忆提取 subagent 后台异步请求 LLM API (不阻塞下一轮对话的用户输入), `MemoryExtractor` 将
|
|
255
|
-
|
|
256
|
-
- 对话历史
|
|
257
|
-
- MEMORY.md 索引文件 (记忆提取 subagent 的 system prompt 中包含 MEMORY.md 索引文件)
|
|
258
|
-
- 记忆文件的描述列表 (记忆提取 subagent 的 prompt 中包含记忆文件的描述列表)
|
|
259
|
-
|
|
260
|
-
发送给 LLM; LLM 分析对话, 决定是否提取新记忆
|
|
261
|
-
|
|
262
|
-
提取的新记忆根据类型路由到不同目录
|
|
263
|
-
|
|
264
|
-
- project 和 reference 类型的新记忆写入到 `${workDir}/.swifty/memory` 工作目录
|
|
265
|
-
- user 和 feedback 类型的新记忆写入到 `~/.swifty/memory` 全局目录
|
|
266
|
-
- 写入后自动调用 rebuildIndex 重建 MEMORY.md 索引文件
|
|
267
|
-
|
|
268
|
-
## 记忆整理 (autoDream, 未实现)
|
|
269
|
-
|
|
270
|
-
Swifty 后台定期执行「记忆整理」, fork 一个 subagent, grep 最近的会话日志
|
|
271
|
-
|
|
272
|
-
- 收集新记忆
|
|
273
|
-
- 删除过时记忆
|
|
274
|
-
- 合并重复记忆
|
|
275
|
-
- 修复冲突记忆
|
|
276
|
-
- 更新索引文件
|
|
277
|
-
|
|
278
|
-
记忆整理的触发条件
|
|
279
|
-
|
|
280
|
-
```js
|
|
281
|
-
function shouldAutoDream() {
|
|
282
|
-
if (记忆目录不存在 ||
|
|
283
|
-
距离上一次成功的记忆整理 < 24h ||
|
|
284
|
-
1h 内执行过记忆整理 ||
|
|
285
|
-
累积会话数量 < 5 ||
|
|
286
|
-
获取锁失败)
|
|
287
|
-
return false;
|
|
288
|
-
}
|
|
289
|
-
return true;
|
|
290
|
-
}
|
|
291
|
-
```
|
|
292
|
-
|
|
293
|
-
## 防止并发冲突: 锁文件 (未实现)
|
|
294
|
-
|
|
295
|
-
如果同时打开两个终端运行 Swifty, 两个进程可能同时触发记忆整理
|
|
296
|
-
|
|
297
|
-
Swifty 使用锁文件 .swifty/memory/.consolidate-lock 防止并发冲突, 锁文件保存占有锁的进程 PID, 锁文件的 mtimeMs (最近修改时间) 代表上一次记忆整理完成的时间
|
|
298
|
-
|
|
299
|
-
获取锁
|
|
300
|
-
|
|
301
|
-
1. 尝试获取锁文件的进程, 读取锁文件的 PID 和 mtimeMs
|
|
302
|
-
|
|
303
|
-
- 如果锁文件的 mtimeMs 距离现在 < 1h, 则放弃
|
|
304
|
-
- 如果锁文件的 mtimeMs 距离现在 >= 1h
|
|
305
|
-
- PID 不存在 ->
|
|
306
|
-
- 锁文件的 mtimeMs 距离现在 < 24h: 24h 内执行过记忆整理, 放弃
|
|
307
|
-
- 锁文件的 mtimeMs 距离现在 >= 24h: 写入 PID, 回读锁文件, 确保没有被其他进程抢占, 执行记忆整理
|
|
308
|
-
- PID 对应的进程存在 -> 上一次记忆整理超时: 杀死该进程, 重写锁文件
|
|
309
|
-
- PID 对应的进程死亡 -> 上一次记忆整理时进程崩溃: 重写锁文件
|
|
310
|
-
|
|
311
|
-
2. 如果记忆整理成功, 则清空锁文件 (记录记忆整理完成时间)
|
|
312
|
-
3. 如果记忆整理失败, 则清空锁文件, 使用 `utimesSync` 锁文件的 mtimeMs 重置为获取锁文件前的值
|
|
313
|
-
4. 如果记忆整理时进程崩溃 (PID 残留), 下一次记忆整理时, 进程读取锁文件后, 如果 PID 对应的进程死亡, 则重写锁文件
|
|
314
|
-
5. 如果记忆整理超时 (1h), 下一次记忆整理时, 进程读取锁文件后, 如果 PID 对应的进程存在, 并且锁文件的 mtimeMs 距离现在 >= 1h, 则杀死该进程, 重写锁文件
|
|
315
|
-
|
|
316
|
-
```js
|
|
317
|
-
import { statSync, writeFileSync, utimesSync } from "node:fs";
|
|
318
|
-
|
|
319
|
-
const { mtimeMs } = statSync("/path/to/.swifty/memory/.consolidate-lock");
|
|
320
|
-
|
|
321
|
-
// 记忆整理失败
|
|
322
|
-
writeFileSync("/path/to/.swifty/memory/.consolidate-lock", "");
|
|
323
|
-
utimesSync(
|
|
324
|
-
"/path/to/.swifty/memory/.consolidate-lock",
|
|
325
|
-
Date.now() /** atimeMs, last access time */,
|
|
326
|
-
mtimeMs /** last modify time */,
|
|
327
|
-
);
|
|
328
|
-
```
|
|
329
|
-
|
|
330
|
-
### 记忆整理过程 (未实现)
|
|
331
|
-
|
|
332
|
-
记忆整理由 fork 的一个 subagent 执行, 不阻塞用户交互
|
|
333
|
-
|
|
334
|
-
对 subagent 工具调用的限制
|
|
335
|
-
|
|
336
|
-
- Bash 工具: 只允许执行只读命令
|
|
337
|
-
- WriteFile 工具: 只允许写入 .swifty/memory 目录
|
|
338
|
-
|
|
339
|
-
记忆整理 prompt
|
|
340
|
-
|
|
341
|
-
- 定位阶段: `ls .swifty/memory`, 读 MEMORY.md 索引文件, 读记忆文件
|
|
342
|
-
- 收集阶段: grep 最近的会话日志, 收集新记忆
|
|
343
|
-
- 整理阶段: 删除过时记忆, 合并重复记忆, 修复冲突记忆
|
|
344
|
-
- 更新索引文件: 更新 MEMORY.md
|
|
345
|
-
|
|
346
|
-
## 记忆提取和记忆整理
|
|
347
|
-
|
|
348
|
-
<!-- 源码: src/memory/extractor.ts -->
|
|
349
|
-
|
|
350
|
-
- 记忆提取每轮 agent loop turn 结束后都可能触发, 频率高、消耗小、影响小
|
|
351
|
-
- 记忆整理每隔 24h 才可能触发, 频率低、消耗大、影响大
|
package/docs/index.css
DELETED
|
@@ -1,23 +0,0 @@
|
|
|
1
|
-
:root {
|
|
2
|
-
--font-sans:
|
|
3
|
-
"Swifty", "Maple Mono", "Menlo", "Cascadia Code", "Sarasa Gothic SC", "PingFang SC",
|
|
4
|
-
"Microsoft YaHei", monospace;
|
|
5
|
-
--font-mono:
|
|
6
|
-
"Swifty", "Maple Mono", "Menlo", "Cascadia Code", "Sarasa Gothic SC", "PingFang SC",
|
|
7
|
-
"Microsoft YaHei", monospace;
|
|
8
|
-
|
|
9
|
-
--rp-c-brand: #f0955a;
|
|
10
|
-
--rp-c-brand-light: #f5a97a;
|
|
11
|
-
--rp-c-brand-lighter: #f9c4a0;
|
|
12
|
-
--rp-c-brand-dark: #d47a3e;
|
|
13
|
-
--rp-c-brand-darker: #b5622e;
|
|
14
|
-
--rp-c-brand-tint: #f0955a14;
|
|
15
|
-
|
|
16
|
-
--rp-font-family-base: var(--font-sans);
|
|
17
|
-
--rp-font-family-code: var(--font-sans);
|
|
18
|
-
font-family: var(--font-sans);
|
|
19
|
-
|
|
20
|
-
code {
|
|
21
|
-
font-family: var(--font-mono);
|
|
22
|
-
}
|
|
23
|
-
}
|
package/docs/index.md
DELETED
|
@@ -1,21 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
pageType: home
|
|
3
|
-
hero:
|
|
4
|
-
name: Swifty
|
|
5
|
-
text: Swifty Coding Agent
|
|
6
|
-
tagline: Swifty Coding Agent
|
|
7
|
-
actions:
|
|
8
|
-
- theme: brand
|
|
9
|
-
text: Explore
|
|
10
|
-
link: /ch1
|
|
11
|
-
- theme: alt
|
|
12
|
-
text: GitHub
|
|
13
|
-
link: https://github.com/hangtiancheng/swifty-cli/tree/main/apps/swifty
|
|
14
|
-
features:
|
|
15
|
-
- title: ch1 - ch5
|
|
16
|
-
details: 什么是 Agent、LLM API、对话管理、工具调用、ReAct 和 Agent Loop、System Prompt
|
|
17
|
-
- title: ch6 - ch10
|
|
18
|
-
details: 权限、MCP、上下文压缩、指令文件、会话持久化、跨会话记忆、Slash Command
|
|
19
|
-
- title: ch10 - ch15
|
|
20
|
-
details: Skill、Hook、Subagent、Worktree、Agent Teams、Swifty Dev
|
|
21
|
-
---
|