@aigne/doc-smith 0.9.8-alpha.3 → 0.9.8-alpha.5

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.
Files changed (257) hide show
  1. package/CLAUDE.md +43 -0
  2. package/README.md +94 -250
  3. package/aigne.yaml +5 -146
  4. package/doc-smith/SKILL.md +117 -0
  5. package/doc-smith/references/changeset_schema.md +118 -0
  6. package/doc-smith/references/document_structure_schema.md +139 -0
  7. package/doc-smith/references/document_update_guide.md +193 -0
  8. package/doc-smith/references/structure_confirmation_guide.md +133 -0
  9. package/doc-smith/references/structure_planning_guide.md +146 -0
  10. package/doc-smith/references/user_intent_guide.md +172 -0
  11. package/doc-smith.yaml +114 -0
  12. package/main-system-prompt.md +56 -0
  13. package/package.json +3 -69
  14. package/scripts/README.md +90 -0
  15. package/scripts/install.sh +86 -0
  16. package/scripts/uninstall.sh +52 -0
  17. package/CHANGELOG.md +0 -994
  18. package/LICENSE +0 -93
  19. package/agentic-agents/common/base-info.md +0 -53
  20. package/agentic-agents/common/completer.md +0 -54
  21. package/agentic-agents/common/planner.md +0 -168
  22. package/agentic-agents/common/worker.md +0 -93
  23. package/agentic-agents/create/index.yaml +0 -129
  24. package/agentic-agents/create/objective.md +0 -44
  25. package/agentic-agents/create/set-custom-prompt.mjs +0 -27
  26. package/agentic-agents/detail/index.yaml +0 -95
  27. package/agentic-agents/detail/objective.md +0 -9
  28. package/agentic-agents/detail/set-custom-prompt.mjs +0 -88
  29. package/agentic-agents/predict-resources/index.yaml +0 -44
  30. package/agentic-agents/predict-resources/instructions.md +0 -61
  31. package/agentic-agents/structure/design-rules.md +0 -39
  32. package/agentic-agents/structure/index.yaml +0 -86
  33. package/agentic-agents/structure/objective.md +0 -14
  34. package/agentic-agents/structure/review-criteria.md +0 -55
  35. package/agentic-agents/structure/set-custom-prompt.mjs +0 -78
  36. package/agentic-agents/utils/init-workspace-cache.mjs +0 -171
  37. package/agentic-agents/utils/load-base-sources.mjs +0 -20
  38. package/agentic-agents/workspace-cache-sharing-design.md +0 -671
  39. package/agents/chat/chat-system.md +0 -38
  40. package/agents/chat/index.mjs +0 -59
  41. package/agents/chat/skills/generate-document.yaml +0 -15
  42. package/agents/chat/skills/list-documents.mjs +0 -15
  43. package/agents/chat/skills/update-document.yaml +0 -24
  44. package/agents/clear/choose-contents.mjs +0 -192
  45. package/agents/clear/clear-auth-tokens.mjs +0 -88
  46. package/agents/clear/clear-deployment-config.mjs +0 -49
  47. package/agents/clear/clear-document-config.mjs +0 -36
  48. package/agents/clear/clear-document-structure.mjs +0 -102
  49. package/agents/clear/clear-generated-docs.mjs +0 -142
  50. package/agents/clear/clear-media-description.mjs +0 -129
  51. package/agents/clear/index.yaml +0 -26
  52. package/agents/create/analyze-diagram-type-llm.yaml +0 -160
  53. package/agents/create/analyze-diagram-type.mjs +0 -297
  54. package/agents/create/check-document-structure.yaml +0 -30
  55. package/agents/create/check-need-generate-structure.mjs +0 -105
  56. package/agents/create/document-structure-tools/add-document.mjs +0 -85
  57. package/agents/create/document-structure-tools/delete-document.mjs +0 -116
  58. package/agents/create/document-structure-tools/move-document.mjs +0 -109
  59. package/agents/create/document-structure-tools/update-document.mjs +0 -84
  60. package/agents/create/generate-diagram-image.yaml +0 -60
  61. package/agents/create/generate-structure.yaml +0 -117
  62. package/agents/create/index.yaml +0 -49
  63. package/agents/create/refine-document-structure.yaml +0 -12
  64. package/agents/create/replace-d2-with-image.mjs +0 -625
  65. package/agents/create/update-document-structure.yaml +0 -54
  66. package/agents/create/user-add-document/add-documents-to-structure.mjs +0 -90
  67. package/agents/create/user-add-document/find-documents-to-add-links.yaml +0 -47
  68. package/agents/create/user-add-document/index.yaml +0 -46
  69. package/agents/create/user-add-document/prepare-documents-to-translate.mjs +0 -22
  70. package/agents/create/user-add-document/print-add-document-summary.mjs +0 -63
  71. package/agents/create/user-add-document/review-documents-with-new-links.mjs +0 -110
  72. package/agents/create/user-remove-document/find-documents-with-invalid-links.mjs +0 -78
  73. package/agents/create/user-remove-document/index.yaml +0 -40
  74. package/agents/create/user-remove-document/prepare-documents-to-translate.mjs +0 -22
  75. package/agents/create/user-remove-document/print-remove-document-summary.mjs +0 -53
  76. package/agents/create/user-remove-document/remove-documents-from-structure.mjs +0 -99
  77. package/agents/create/user-remove-document/review-documents-with-invalid-links.mjs +0 -115
  78. package/agents/create/user-review-document-structure.mjs +0 -140
  79. package/agents/create/utils/init-current-content.mjs +0 -34
  80. package/agents/create/utils/merge-document-structures.mjs +0 -30
  81. package/agents/evaluate/code-snippet.mjs +0 -97
  82. package/agents/evaluate/document-structure.yaml +0 -67
  83. package/agents/evaluate/document.yaml +0 -82
  84. package/agents/evaluate/generate-report.mjs +0 -85
  85. package/agents/evaluate/index.yaml +0 -46
  86. package/agents/history/index.yaml +0 -6
  87. package/agents/history/view.mjs +0 -78
  88. package/agents/init/check.mjs +0 -16
  89. package/agents/init/index.mjs +0 -275
  90. package/agents/init/validate.mjs +0 -16
  91. package/agents/localize/choose-language.mjs +0 -107
  92. package/agents/localize/index.yaml +0 -58
  93. package/agents/localize/record-translation-history.mjs +0 -23
  94. package/agents/localize/translate-document.yaml +0 -24
  95. package/agents/localize/translate-multilingual.yaml +0 -51
  96. package/agents/media/batch-generate-media-description.yaml +0 -46
  97. package/agents/media/generate-media-description.yaml +0 -50
  98. package/agents/media/load-media-description.mjs +0 -256
  99. package/agents/prefs/index.mjs +0 -203
  100. package/agents/publish/index.yaml +0 -26
  101. package/agents/publish/publish-docs.mjs +0 -356
  102. package/agents/publish/translate-meta.mjs +0 -103
  103. package/agents/schema/document-structure-item.yaml +0 -26
  104. package/agents/schema/document-structure-refine-item.yaml +0 -23
  105. package/agents/schema/document-structure.yaml +0 -29
  106. package/agents/update/batch-generate-document.yaml +0 -27
  107. package/agents/update/batch-update-document.yaml +0 -7
  108. package/agents/update/check-diagram-flag.mjs +0 -116
  109. package/agents/update/check-document.mjs +0 -162
  110. package/agents/update/check-generate-diagram.mjs +0 -106
  111. package/agents/update/check-sync-image-flag.mjs +0 -55
  112. package/agents/update/check-update-is-single.mjs +0 -53
  113. package/agents/update/document-tools/update-document-content.mjs +0 -303
  114. package/agents/update/generate-diagram.yaml +0 -63
  115. package/agents/update/generate-document.yaml +0 -70
  116. package/agents/update/handle-document-update.yaml +0 -103
  117. package/agents/update/index.yaml +0 -79
  118. package/agents/update/pre-check-generate-diagram.yaml +0 -44
  119. package/agents/update/save-and-translate-document.mjs +0 -76
  120. package/agents/update/sync-images-and-exit.mjs +0 -148
  121. package/agents/update/update-document-detail.yaml +0 -71
  122. package/agents/update/update-single/update-single-document-detail.mjs +0 -280
  123. package/agents/update/update-single-document.yaml +0 -7
  124. package/agents/update/user-review-document.mjs +0 -272
  125. package/agents/utils/action-success.mjs +0 -16
  126. package/agents/utils/analyze-document-feedback-intent.yaml +0 -32
  127. package/agents/utils/analyze-feedback-intent.mjs +0 -136
  128. package/agents/utils/analyze-structure-feedback-intent.yaml +0 -29
  129. package/agents/utils/check-detail-result.mjs +0 -38
  130. package/agents/utils/check-feedback-refiner.mjs +0 -81
  131. package/agents/utils/choose-docs.mjs +0 -293
  132. package/agents/utils/document-icon-generate.yaml +0 -52
  133. package/agents/utils/document-title-streamline.yaml +0 -48
  134. package/agents/utils/ensure-document-icons.mjs +0 -129
  135. package/agents/utils/exit.mjs +0 -6
  136. package/agents/utils/feedback-refiner.yaml +0 -50
  137. package/agents/utils/find-item-by-path.mjs +0 -114
  138. package/agents/utils/find-user-preferences-by-path.mjs +0 -37
  139. package/agents/utils/format-document-structure.mjs +0 -35
  140. package/agents/utils/generate-document-or-skip.mjs +0 -41
  141. package/agents/utils/handle-diagram-operations.mjs +0 -263
  142. package/agents/utils/load-all-document-content.mjs +0 -30
  143. package/agents/utils/load-document-all-content.mjs +0 -84
  144. package/agents/utils/load-sources.mjs +0 -405
  145. package/agents/utils/map-reasoning-effort-level.mjs +0 -15
  146. package/agents/utils/post-generate.mjs +0 -144
  147. package/agents/utils/read-current-document-content.mjs +0 -46
  148. package/agents/utils/save-doc-translation.mjs +0 -61
  149. package/agents/utils/save-doc.mjs +0 -88
  150. package/agents/utils/save-output.mjs +0 -26
  151. package/agents/utils/save-sidebar.mjs +0 -51
  152. package/agents/utils/skip-if-content-exists.mjs +0 -27
  153. package/agents/utils/streamline-document-titles-if-needed.mjs +0 -88
  154. package/agents/utils/transform-detail-data-sources.mjs +0 -45
  155. package/agents/utils/update-branding.mjs +0 -84
  156. package/assets/report-template/report.html +0 -198
  157. package/docs-mcp/analyze-content-relevance.yaml +0 -50
  158. package/docs-mcp/analyze-docs-relevance.yaml +0 -59
  159. package/docs-mcp/docs-search.yaml +0 -42
  160. package/docs-mcp/get-docs-detail.mjs +0 -41
  161. package/docs-mcp/get-docs-structure.mjs +0 -16
  162. package/docs-mcp/read-doc-content.mjs +0 -119
  163. package/prompts/common/document/content-rules-core.md +0 -20
  164. package/prompts/common/document/markdown-syntax-rules.md +0 -65
  165. package/prompts/common/document/media-file-list-usage-rules.md +0 -18
  166. package/prompts/common/document/openapi-usage-rules.md +0 -189
  167. package/prompts/common/document/role-and-personality.md +0 -16
  168. package/prompts/common/document/user-preferences.md +0 -9
  169. package/prompts/common/document-structure/conflict-resolution-guidance.md +0 -16
  170. package/prompts/common/document-structure/document-icon-generate.md +0 -116
  171. package/prompts/common/document-structure/document-structure-rules.md +0 -43
  172. package/prompts/common/document-structure/document-title-streamline.md +0 -86
  173. package/prompts/common/document-structure/glossary.md +0 -7
  174. package/prompts/common/document-structure/intj-traits.md +0 -5
  175. package/prompts/common/document-structure/openapi-usage-rules.md +0 -28
  176. package/prompts/common/document-structure/output-constraints.md +0 -18
  177. package/prompts/common/document-structure/user-locale-rules.md +0 -10
  178. package/prompts/common/document-structure/user-preferences.md +0 -9
  179. package/prompts/detail/custom/admonition-usage-rules.md +0 -94
  180. package/prompts/detail/custom/code-block-usage-rules.md +0 -163
  181. package/prompts/detail/custom/custom-components/x-card-usage-rules.md +0 -63
  182. package/prompts/detail/custom/custom-components/x-cards-usage-rules.md +0 -83
  183. package/prompts/detail/custom/custom-components/x-field-desc-usage-rules.md +0 -120
  184. package/prompts/detail/custom/custom-components/x-field-group-usage-rules.md +0 -80
  185. package/prompts/detail/custom/custom-components/x-field-usage-rules.md +0 -189
  186. package/prompts/detail/custom/custom-components-usage-rules.md +0 -18
  187. package/prompts/detail/diagram/generate-image-system.md +0 -135
  188. package/prompts/detail/diagram/generate-image-user.md +0 -32
  189. package/prompts/detail/diagram/guide.md +0 -29
  190. package/prompts/detail/diagram/official-examples.md +0 -712
  191. package/prompts/detail/diagram/pre-check.md +0 -23
  192. package/prompts/detail/diagram/role-and-personality.md +0 -2
  193. package/prompts/detail/diagram/rules.md +0 -46
  194. package/prompts/detail/diagram/system-prompt.md +0 -1139
  195. package/prompts/detail/diagram/user-prompt.md +0 -43
  196. package/prompts/detail/generate/detail-example.md +0 -457
  197. package/prompts/detail/generate/document-rules.md +0 -45
  198. package/prompts/detail/generate/system-prompt.md +0 -61
  199. package/prompts/detail/generate/user-prompt.md +0 -99
  200. package/prompts/detail/jsx/rules.md +0 -6
  201. package/prompts/detail/update/system-prompt.md +0 -121
  202. package/prompts/detail/update/user-prompt.md +0 -41
  203. package/prompts/evaluate/document-structure.md +0 -93
  204. package/prompts/evaluate/document.md +0 -149
  205. package/prompts/media/media-description/system-prompt.md +0 -43
  206. package/prompts/media/media-description/user-prompt.md +0 -17
  207. package/prompts/structure/check-document-structure.md +0 -93
  208. package/prompts/structure/document-rules.md +0 -21
  209. package/prompts/structure/find-documents-to-add-links.md +0 -52
  210. package/prompts/structure/generate/system-prompt.md +0 -13
  211. package/prompts/structure/generate/user-prompt.md +0 -137
  212. package/prompts/structure/review/structure-review-system.md +0 -81
  213. package/prompts/structure/structure-example.md +0 -89
  214. package/prompts/structure/structure-getting-started.md +0 -10
  215. package/prompts/structure/update/system-prompt.md +0 -93
  216. package/prompts/structure/update/user-prompt.md +0 -43
  217. package/prompts/translate/admonition.md +0 -20
  218. package/prompts/translate/code-block.md +0 -33
  219. package/prompts/translate/glossary.md +0 -6
  220. package/prompts/translate/translate-document.md +0 -305
  221. package/prompts/utils/analyze-document-feedback-intent.md +0 -54
  222. package/prompts/utils/analyze-structure-feedback-intent.md +0 -43
  223. package/prompts/utils/feedback-refiner.md +0 -105
  224. package/types/document-schema.mjs +0 -55
  225. package/types/document-structure-schema.mjs +0 -261
  226. package/utils/auth-utils.mjs +0 -275
  227. package/utils/blocklet.mjs +0 -104
  228. package/utils/check-document-has-diagram.mjs +0 -95
  229. package/utils/conflict-detector.mjs +0 -149
  230. package/utils/constants/index.mjs +0 -620
  231. package/utils/constants/linter.mjs +0 -102
  232. package/utils/d2-utils.mjs +0 -198
  233. package/utils/debug.mjs +0 -3
  234. package/utils/delete-diagram-images.mjs +0 -99
  235. package/utils/deploy.mjs +0 -86
  236. package/utils/docs-finder-utils.mjs +0 -623
  237. package/utils/evaluate/report-utils.mjs +0 -132
  238. package/utils/extract-api.mjs +0 -32
  239. package/utils/file-utils.mjs +0 -960
  240. package/utils/history-utils.mjs +0 -203
  241. package/utils/icon-map.mjs +0 -26
  242. package/utils/image-compress.mjs +0 -75
  243. package/utils/kroki-utils.mjs +0 -173
  244. package/utils/linter/index.mjs +0 -50
  245. package/utils/load-config.mjs +0 -107
  246. package/utils/markdown/index.mjs +0 -26
  247. package/utils/markdown-checker.mjs +0 -694
  248. package/utils/mermaid-validator.mjs +0 -140
  249. package/utils/mermaid-worker-pool.mjs +0 -250
  250. package/utils/mermaid-worker.mjs +0 -233
  251. package/utils/openapi/index.mjs +0 -28
  252. package/utils/preferences-utils.mjs +0 -175
  253. package/utils/request.mjs +0 -10
  254. package/utils/store/index.mjs +0 -45
  255. package/utils/sync-diagram-to-translations.mjs +0 -262
  256. package/utils/upload-files.mjs +0 -231
  257. package/utils/utils.mjs +0 -1354
@@ -1,671 +0,0 @@
1
- # Workspace 信息共享缓存设计
2
-
3
- ## 问题背景
4
-
5
- 在 aigentic-agents 目录下的三个 agent(create、structure、detail)执行过程中,都需要通过 AFS 访问 workspace 目录:
6
-
7
- - 使用 `afs_list` 分析目录结构
8
- - 使用 `afs_read` 读取文件内容(如 README.md、package.json 等核心文件)
9
-
10
- 这导致存在重复读取问题:
11
- 1. **Token 浪费**:相同的文件内容被多次读取并注入到不同的 LLM 调用上下文中
12
- 2. **时间浪费**:重复的工具调用增加了执行时间
13
- 3. **LLM 调用次数增加**:每次工具调用都需要 LLM 决策
14
-
15
- 在一次完整执行中(从 create agent 启动到结束),workspace 内容不会变化,因此这些信息完全可以共享。
16
-
17
- ## 设计目标
18
-
19
- 1. **减少工具调用次数**:避免重复的 `afs_list` 和 `afs_read` 调用
20
- 2. **减少 LLM 调用**:通过共享数据,让 LLM 直接使用缓存信息而无需触发工具
21
- 3. **控制上下文大小**:不能将所有 workspace 信息都放入 prompt,需要智能选择
22
- 4. **保持灵活性**:允许 agent 在需要时仍然可以读取未缓存的文件
23
-
24
- ## 技术方案
25
-
26
- ### 1. 利用 userContext 机制
27
-
28
- AIGNE Framework 提供 `options.context.userContext` 机制,可以在运行期间共享数据:
29
-
30
- ```javascript
31
- // 设置共享数据
32
- options.context.userContext.workspaceCache = {
33
- directoryTree: '...',
34
- coreFiles: { ... }
35
- };
36
- ```
37
-
38
- 在 prompt 模板中可以引用:
39
-
40
- ```yaml
41
- {{ $context.userContext.workspaceCache | yaml.stringify }}
42
- ```
43
-
44
- ### 2. 缓存策略(混合方案)
45
-
46
- #### 静态预缓存(Static Pre-cache)
47
-
48
- **时机**:在 create agent 初始化时收集
49
- **内容**:workspace 根目录的浅层结构(3 层)
50
- **用途**:提供项目整体结构概览,覆盖 80% 的常见场景
51
-
52
- **限制机制**:
53
- - **最大深度**:3 层(避免深层嵌套导致内容过大)
54
- - **最大字符数**:10,000 字符(约 10KB)
55
- - **过滤规则**:
56
- - 排除常见的大目录:`node_modules/`, `.git/`, `dist/`, `build/`, `coverage/`
57
- - 排除隐藏目录(以 `.` 开头)除了 `.github/`, `.aigne/`
58
-
59
- **示例输出**:
60
- ```javascript
61
- workspaceCache.static = {
62
- tree: `
63
- ├── README.md
64
- ├── package.json
65
- ├── src/
66
- │ ├── index.js
67
- │ └── utils/
68
- │ ├── helper.js
69
- │ └── config.js
70
- └── docs/
71
- ├── README.md
72
- └── guide.md
73
- `,
74
- metadata: { depth: 3, size: 850 }
75
- }
76
- ```
77
-
78
- #### 动态缓存(Dynamic Cache)
79
-
80
- **时机**:运行时 agent 调用 `afs_list` 后
81
- **内容**:按需缓存已访问的目录结构
82
- **用途**:补充静态缓存,支持深层目录访问
83
-
84
- **实现方式**:
85
-
86
- **选项 1:通过工具约束(推荐)**
87
- ```markdown
88
- 在 planner.md 和 worker.md 中添加工具使用规则:
89
-
90
- ## 工具使用规则
91
-
92
- ### afs_list 使用规范
93
- 当你需要调用 `afs_list` 工具时:
94
- 1. **优先检查缓存**:先查看 `{{ workspaceCache }}` 中是否已有该目录信息
95
- 2. **调用后更新缓存**:调用 `afs_list` 后,必须立即调用 `cache_directory` 工具缓存结果
96
- 3. **示例**:
97
- - ✅ 正确:先查缓存 → 未命中 → afs_list → cache_directory
98
- - ❌ 错误:直接 afs_list,不更新缓存
99
-
100
- 可用工具:
101
- - `afs_list`: 列出目录内容
102
- - `cache_directory`: 将目录结构缓存到 userContext(调用 afs_list 后必须调用)
103
- ```
104
-
105
- 提供 `cache_directory` 工具:
106
- ```javascript
107
- // agentic-agents/utils/cache-directory.mjs
108
- export default async function cacheDirectory(input, options) {
109
- const { path, items } = input;
110
-
111
- if (!options.context.userContext.workspaceCache) {
112
- options.context.userContext.workspaceCache = { static: {}, dynamic: {} };
113
- }
114
-
115
- // 缓存到 dynamic 部分
116
- options.context.userContext.workspaceCache.dynamic[path] = {
117
- items,
118
- cachedAt: new Date().toISOString(),
119
- };
120
-
121
- return {
122
- message: `Cached directory: ${path} (${items.length} items)`,
123
- cached: true
124
- };
125
- }
126
-
127
- cacheDirectory.inputSchema = {
128
- type: 'object',
129
- properties: {
130
- path: { type: 'string', description: 'Directory path that was listed' },
131
- items: {
132
- type: 'array',
133
- description: 'Items returned by afs_list',
134
- items: { type: 'object' }
135
- }
136
- },
137
- required: ['path', 'items']
138
- };
139
- ```
140
-
141
- **选项 2:拦截器方式(更可靠但需要框架支持)**
142
- ```javascript
143
- // 如果 AIGNE Framework 支持工具拦截器
144
- options.context.afs.list = wrapWithCache(originalList, (path, result) => {
145
- // 自动缓存
146
- options.context.userContext.workspaceCache.dynamic[path] = result;
147
- });
148
- ```
149
-
150
- **选项 3:仅静态缓存(最简单,推荐 MVP)**
151
- - 只使用静态预缓存
152
- - 深度限制设为 3-4 层,覆盖大部分场景
153
- - 如果不够用,AI 自然会调用 afs_list
154
- - 第一版先实现这个,观察效果后再决定是否需要动态缓存
155
-
156
- #### 缓存结构
157
-
158
- ```javascript
159
- userContext.workspaceCache = {
160
- static: {
161
- tree: '...', // 树形视图字符串
162
- metadata: { ... }
163
- },
164
- dynamic: { // 可选,支持动态缓存时使用
165
- '/src/deep/nested': {
166
- items: [...],
167
- cachedAt: '...'
168
- }
169
- }
170
- }
171
- ```
172
-
173
- ### 3. 实现架构
174
-
175
- ```
176
- create agent (index.yaml)
177
-
178
- ├─> init-workspace-cache.mjs (新增)
179
- │ ├─ 扫描 workspace 目录结构(带限制)
180
- │ └─ 设置 userContext.workspaceCache
181
-
182
- └─> orchestrator
183
- ├─> planner.md (修改)
184
- │ └─ 通过 {{ $context.userContext.workspaceCache }} 引用缓存
185
- ├─> worker.md (修改)
186
- │ └─ 通过 {{ $context.userContext.workspaceCache }} 引用缓存
187
- └─> worker skills
188
- ├─> structure agent (通过 userContext 访问缓存)
189
- └─> detail agent (通过 userContext 访问缓存)
190
- ```
191
-
192
- ### 4. 具体实现步骤
193
-
194
- #### Step 1: 创建缓存初始化模块
195
-
196
- **文件**: `agentic-agents/utils/init-workspace-cache.mjs`
197
-
198
- ```javascript
199
- const MAX_DEPTH = 3;
200
- const MAX_CHARS = 10000;
201
- const EXCLUDE_DIRS = new Set([
202
- 'node_modules',
203
- '.git',
204
- 'dist',
205
- 'build',
206
- 'coverage',
207
- '.next',
208
- '.nuxt',
209
- 'out',
210
- '__pycache__',
211
- 'venv',
212
- '.venv',
213
- ]);
214
- const INCLUDE_HIDDEN = new Set(['.github', '.aigne']);
215
-
216
- export default async function initWorkspaceCache(input, options) {
217
- try {
218
- const directoryTree = await buildDirectoryTree(options);
219
-
220
- // 存储到 userContext
221
- options.context.userContext.workspaceCache = {
222
- directoryTree,
223
- metadata: {
224
- cachedAt: new Date().toISOString(),
225
- size: directoryTree.length,
226
- maxDepth: MAX_DEPTH,
227
- }
228
- };
229
-
230
- console.log(`Workspace directory tree cached: ${directoryTree.length} chars, max depth ${MAX_DEPTH}`);
231
-
232
- return { message: 'Workspace cache initialized' };
233
- } catch (error) {
234
- console.warn('Failed to initialize workspace cache:', error);
235
- // 失败时设置空缓存,不阻塞执行
236
- options.context.userContext.workspaceCache = {
237
- directoryTree: '',
238
- metadata: { error: error.message }
239
- };
240
- return { message: 'Workspace cache initialization failed, will use on-demand loading' };
241
- }
242
- }
243
-
244
- async function buildDirectoryTree(options) {
245
- const entries = [];
246
-
247
- // 递归扫描目录
248
- async function scanDir(path, depth) {
249
- if (depth > MAX_DEPTH) return;
250
-
251
- try {
252
- const items = await options.context.afs.list({
253
- name: 'workspace',
254
- path: path || '/',
255
- });
256
-
257
- for (const item of items) {
258
- const itemPath = path ? `${path}/${item.name}` : `/${item.name}`;
259
-
260
- // 过滤规则
261
- if (item.isDirectory) {
262
- // 排除大目录和隐藏目录(除了白名单)
263
- if (EXCLUDE_DIRS.has(item.name)) continue;
264
- if (item.name.startsWith('.') && !INCLUDE_HIDDEN.has(item.name)) continue;
265
- }
266
-
267
- entries.push({
268
- path: itemPath,
269
- isDirectory: item.isDirectory,
270
- depth,
271
- });
272
-
273
- // 递归扫描子目录
274
- if (item.isDirectory) {
275
- await scanDir(itemPath, depth + 1);
276
- }
277
- }
278
- } catch (error) {
279
- // 忽略无法访问的目录
280
- }
281
- }
282
-
283
- await scanDir('/', 0);
284
-
285
- // 构建树形视图
286
- let treeView = buildTreeView(entries);
287
-
288
- // 如果超过最大字符数,截断并添加说明
289
- if (treeView.length > MAX_CHARS) {
290
- treeView = treeView.substring(0, MAX_CHARS) + `\n... (截断,总共约 ${entries.length} 项)`;
291
- }
292
-
293
- return treeView;
294
- }
295
-
296
- function buildTreeView(entries) {
297
- // 使用类似 load-base-sources.mjs 中的 buildTreeView 逻辑
298
- // 构建树形结构的字符串表示
299
- const tree = {};
300
-
301
- for (const entry of entries) {
302
- const parts = entry.path.split('/').filter(Boolean);
303
- let current = tree;
304
-
305
- for (let i = 0; i < parts.length; i++) {
306
- const part = parts[i];
307
- if (!current[part]) {
308
- current[part] = {};
309
- }
310
- current = current[part];
311
- }
312
- }
313
-
314
- function renderTree(node, prefix = '', isLast = true) {
315
- let result = '';
316
- const keys = Object.keys(node);
317
-
318
- keys.forEach((key, index) => {
319
- const isLastItem = index === keys.length - 1;
320
- const entry = entries.find(e => e.path.endsWith(`/${key}`) || e.path === `/${key}`);
321
- const suffix = entry?.isDirectory ? '/' : '';
322
-
323
- result += `${prefix}${isLastItem ? '└── ' : '├── '}${key}${suffix}\n`;
324
-
325
- if (Object.keys(node[key]).length > 0) {
326
- result += renderTree(
327
- node[key],
328
- `${prefix}${isLastItem ? ' ' : '│ '}`,
329
- isLastItem
330
- );
331
- }
332
- });
333
-
334
- return result;
335
- }
336
-
337
- return renderTree(tree);
338
- }
339
- ```
340
-
341
- #### Step 2: 修改 planner.md 和 worker.md
342
-
343
- **文件**: `agentic-agents/common/planner.md`
344
-
345
- 在适当位置添加缓存信息引用(建议在 "Environment" 部分之后):
346
-
347
- ```markdown
348
- ## Workspace 目录结构缓存
349
-
350
- 为减少重复的 `afs_list` 调用,以下是 workspace 的目录结构概览(最多 3 层深度):
351
-
352
- {{ #if workspaceCache.static.tree }}
353
- ```
354
- {{ workspaceCache.static.tree }}
355
- ```
356
-
357
- **注意**:
358
- - 优先参考以上目录结构,避免重复调用 `afs_list`
359
- - 如需更深层次或被过滤的目录信息,仍可使用 `afs_list` 工具
360
- - 缓存时间:{{ workspaceCache.static.metadata.cachedAt }}
361
-
362
- {{ #if workspaceCache.dynamic }}
363
- ## 动态缓存的目录(已通过 afs_list 访问)
364
-
365
- 以下目录已被访问并缓存,可直接查看:
366
-
367
- ```yaml
368
- {{ workspaceCache.dynamic | yaml.stringify }}
369
- ```
370
- {{ /if }}
371
-
372
- {{ else }}
373
- 目录结构缓存不可用,请使用 `afs_list` 工具按需查询。
374
- {{ /if }}
375
- ```
376
-
377
- **文件**: `agentic-agents/common/worker.md`
378
-
379
- 同样在 "Environment" 部分之后添加相同的缓存信息引用。
380
-
381
- **注意**:根据你的说明,提示词中可直接使用 `workspaceCache` 变量,不需要 `$context.userContext.` 前缀。
382
-
383
- #### Step 3: 更新 agent 配置
384
-
385
- **文件**: `agentic-agents/create/index.yaml`
386
-
387
- 在 skills 中添加缓存初始化(在 load-base-sources 之前):
388
-
389
- ```yaml
390
- skills:
391
- - url: ../../agents/init/index.mjs
392
- default_input:
393
- skipIfExists: true
394
- - ../utils/init-workspace-cache.mjs # 新增:初始化目录树缓存
395
- - ../utils/load-base-sources.mjs
396
- - ./set-custom-prompt.mjs
397
- - type: "@aigne/agent-library/orchestrator"
398
- # ... 其余配置
399
- ```
400
-
401
- **文件**: `agentic-agents/structure/index.yaml` 和 `agentic-agents/detail/index.yaml`
402
-
403
- 同样添加:
404
-
405
- ```yaml
406
- skills:
407
- - ../utils/init-workspace-cache.mjs # 新增
408
- - ../utils/load-base-sources.mjs
409
- - ./set-custom-prompt.mjs
410
- - type: "@aigne/agent-library/orchestrator"
411
- # ... 其余配置
412
- ```
413
-
414
- ### 5. 预期效果
415
-
416
- #### 执行前(无缓存)
417
- ```
418
- create agent 启动
419
- ├─ planner: afs_list / [LLM Call]
420
- ├─ planner: afs_list /src [LLM Call]
421
- ├─ worker: afs_list /docs [LLM Call]
422
- ├─ 调用 structure agent
423
- │ ├─ planner: afs_list / [LLM Call] 重复!
424
- │ ├─ planner: afs_list /src [LLM Call] 重复!
425
- │ └─ worker: afs_list /docs [LLM Call] 重复!
426
- └─ 调用 detail agent (x5 并发)
427
- ├─ instance 1: afs_list /src [LLM Call] 重复!
428
- ├─ instance 2: afs_list /src [LLM Call] 重复!
429
- ├─ instance 3: afs_list /docs [LLM Call] 重复!
430
- └─ ...
431
-
432
- 总计:~20+ 重复的目录扫描调用
433
- ```
434
-
435
- #### 执行后(有缓存)
436
- ```
437
- create agent 启动
438
- ├─ init-workspace-cache [一次性扫描]
439
- │ └─ 递归 afs_list(深度 3)
440
- ├─ 缓存存入 userContext
441
- ├─ planner/worker: 直接查看缓存的目录树
442
- ├─ 调用 structure agent
443
- │ └─ planner/worker: 直接查看缓存的目录树
444
- └─ 调用 detail agent (x5 并发)
445
- └─ 所有实例共享同一份缓存的目录树
446
-
447
- 总计:只在初始化时扫描一次
448
- ```
449
-
450
- **收益**:
451
- - **减少 afs_list 调用**:从 20+ 次降低到 1 次(初始化)
452
- - **减少 LLM 调用次数**:每次 afs_list 都需要 LLM 决策,减少调用即减少 token 消耗
453
- - **提升执行速度**:消除重复的文件系统操作
454
- - **降低 token 成本**:虽然缓存会增加上下文大小,但避免了多次重复的工具调用上下文
455
-
456
- **量化估算**(以中型项目为例):
457
- - 目录树缓存大小:~5KB(控制在 10KB 以内)
458
- - 节省的 afs_list 调用:15-20 次
459
- - 每次调用的平均 token 消耗:~1000 tokens(包括工具定义、调用、返回)
460
- - 总节省:15,000-20,000 tokens
461
-
462
- ## 进阶优化(可选)
463
-
464
- ### 1. 动态深度调整
465
-
466
- 根据项目规模自动调整扫描深度:
467
-
468
- ```javascript
469
- // 预扫描根目录
470
- const rootItems = await afs.list({ name: 'workspace', path: '/' });
471
-
472
- // 小项目(< 20 个文件/目录):深度 4
473
- // 中型项目(20-100):深度 3
474
- // 大型项目(> 100):深度 2
475
- const depth = rootItems.length < 20 ? 4 : rootItems.length < 100 ? 3 : 2;
476
- ```
477
-
478
- ### 2. 重要目录优先
479
-
480
- 对某些目录允许更深的扫描:
481
-
482
- ```javascript
483
- const PRIORITY_DIRS = ['src', 'docs', 'examples', 'packages'];
484
-
485
- // 对优先目录允许额外 +1 层深度
486
- if (PRIORITY_DIRS.includes(dirName)) {
487
- await scanDir(itemPath, depth + 1, maxDepth + 1);
488
- }
489
- ```
490
-
491
- ### 3. 缓存文件内容(未来扩展)
492
-
493
- 如果需要缓存文件内容,可以采用按需缓存+记录策略:
494
-
495
- ```javascript
496
- // 在 worker 中拦截 afs_read 调用
497
- const originalRead = options.context.afs.read;
498
- options.context.afs.read = async (params) => {
499
- const { path } = params;
500
-
501
- // 检查缓存
502
- if (cache.files[path]) {
503
- cache.stats.hits++;
504
- return cache.files[path];
505
- }
506
-
507
- // 未缓存,调用原始方法
508
- const content = await originalRead(params);
509
- cache.stats.misses++;
510
-
511
- // 记录访问频率
512
- cache.stats.accessLog[path] = (cache.stats.accessLog[path] || 0) + 1;
513
-
514
- return content;
515
- };
516
-
517
- // 执行结束后分析高频文件,用于优化缓存策略
518
- ```
519
-
520
- ### 4. 缓存统计和监控
521
-
522
- 记录缓存使用情况:
523
-
524
- ```javascript
525
- cache.metadata.stats = {
526
- totalScans: 0, // 总扫描次数
527
- cacheHits: 0, // 缓存命中次数(未来扩展)
528
- savedCalls: 0, // 节省的工具调用次数(估算)
529
- };
530
-
531
- // 在 completer 中输出统计
532
- console.log(`
533
- ✓ Workspace cache stats:
534
- - Directory tree: ${cache.metadata.size} chars
535
- - Max depth: ${cache.metadata.maxDepth}
536
- - Estimated saved calls: ~${cache.metadata.stats.savedCalls}
537
- `);
538
- ```
539
-
540
- ## 实施建议
541
-
542
- ### 阶段 1:基础实现(MVP)
543
- 1. **实现 `init-workspace-cache.mjs`**
544
- - 目录树扫描(最大深度 3,最大 10K 字符)
545
- - 基本的过滤规则(排除 node_modules 等)
546
- - 存储到 userContext
547
-
548
- 2. **修改 prompt 模板**
549
- - 在 `planner.md` 中添加缓存引用
550
- - 在 `worker.md` 中添加缓存引用
551
- - 添加使用说明(优先查看缓存)
552
-
553
- 3. **更新 agent 配置**
554
- - `create/index.yaml` 添加 init-workspace-cache skill
555
- - `structure/index.yaml` 添加 init-workspace-cache skill
556
- - `detail/index.yaml` 添加 init-workspace-cache skill
557
-
558
- 4. **测试验证**
559
- - 小型项目(< 100 文件)
560
- - 中型项目(100-1000 文件)
561
- - 大型项目(> 1000 文件)
562
- - 验证缓存大小控制是否生效
563
-
564
- ### 阶段 2:优化迭代(基于实际使用反馈)
565
- 1. **调整限制参数**
566
- - 根据实际情况调整最大深度(2-4 层)
567
- - 调整最大字符数(5K-20K)
568
- - 优化过滤规则
569
-
570
- 2. **添加统计功能**
571
- - 记录缓存大小和扫描时间
572
- - 估算节省的工具调用次数
573
-
574
- 3. **性能优化**
575
- - 优化树形视图构建算法
576
- - 并行扫描多个目录
577
-
578
- ### 阶段 3:高级特性(可选)
579
- 1. **动态深度调整**
580
- - 根据项目规模自动调整扫描深度
581
- - 重要目录优先策略
582
-
583
- 2. **文件内容缓存**
584
- - 按需缓存机制
585
- - 访问频率统计
586
- - 智能预加载高频文件
587
-
588
- 3. **缓存分析和优化**
589
- - 缓存命中率分析
590
- - 优化建议输出
591
-
592
- ## 注意事项
593
-
594
- ### 1. 大小控制
595
- - **严格限制**:最大深度 3 层,最大字符数 10K
596
- - **超出处理**:超过限制时截断并添加说明
597
- - **目的**:避免上下文过大影响 LLM 性能
598
-
599
- ### 2. 隐私和安全
600
- - **目录树缓存**:只包含文件/目录名称和结构,不包含文件内容
601
- - **敏感目录**:已排除 `.git/`, `.env` 等
602
- - **如果未来缓存文件内容**:需要额外过滤敏感文件(.env, credentials.json 等)
603
-
604
- ### 3. 兼容性和容错
605
- - **失败降级**:如果缓存初始化失败,不阻塞执行,agent 仍可使用原有的 afs_list
606
- - **条件渲染**:使用 `{{ #if }}` 确保缓存不存在时有降级提示
607
- - **向后兼容**:不影响现有 agent 的正常工作
608
-
609
- ### 4. 性能考虑
610
- - **初始化开销**:增加少量初始化时间(一次递归扫描)
611
- - **上下文增加**:每次 LLM 调用增加约 5-10KB 上下文
612
- - **收益权衡**:用较小的上下文增加换取大量工具调用的减少,整体收益为正
613
-
614
- ### 5. 测试覆盖
615
- 针对不同场景测试:
616
- - **项目规模**:小型、中型、大型项目
617
- - **项目类型**:Node.js、Python、Monorepo、多语言混合
618
- - **深层嵌套**:验证深度限制是否生效
619
- - **大量文件**:验证字符数限制是否生效
620
- - **缓存失败**:验证降级机制是否正常
621
-
622
- ## 参考实现
623
-
624
- 可参考现有代码:
625
- - [user-review-document-structure.mjs:43](agents/create/user-review-document-structure.mjs#L43) - userContext 使用示例
626
- - [planner.md:14-23](agentic-agents/common/planner.md#L14-L23) - AFS 环境信息渲染
627
- - [load-base-sources.mjs](agentic-agents/utils/load-base-sources.mjs) - 目录扫描和树形视图构建参考
628
-
629
- ## 常见问题
630
-
631
- ### Q1: 为什么不在初始化时缓存文件内容?
632
- **A**: 因为很难预判哪些文件是"核心文件",如果用 AI 判断会增加额外开销。目录树缓存已经能解决大部分重复 `afs_list` 的问题。文件内容缓存可以作为未来扩展,采用按需缓存+访问统计的方式。
633
-
634
- ### Q2: 缓存会增加多少上下文?
635
- **A**: 控制在 10KB 以内(约 2500 tokens)。相比节省的 15-20 次工具调用(约 15000-20000 tokens),收益明显。
636
-
637
- ### Q3: 如果项目特别大,缓存会不会失效?
638
- **A**: 通过深度限制(3 层)和字符数限制(10K)确保缓存大小可控。即使是大型项目,3 层深度的结构信息也足以让 agent 了解项目布局,避免盲目探索。
639
-
640
- ### Q4: userContext 是否在所有子 agent 中共享?
641
- **A**: 是的。create agent 中设置的 userContext 会被 structure 和 detail agents 继承,实现跨 agent 共享。
642
-
643
- ### Q5: 如何验证缓存是否生效?
644
- **A**:
645
- 1. 查看日志输出中的 "Workspace directory tree cached" 消息
646
- 2. 观察 agent 执行过程中 `afs_list` 调用次数是否减少
647
- 3. 在 planner/worker 的上下文中检查是否包含缓存的目录树
648
-
649
- ### Q6: 动态缓存的 AI 约束可靠吗?
650
- **A**:
651
- - **不太可靠**:AI 可能忘记或忽略"调用 afs_list 后必须调用 cache_directory"的约束
652
- - **建议**:
653
- - MVP 先用静态缓存(选项 3),验证效果
654
- - 如果效果好但深度不够,可以尝试选项 1(工具约束)
655
- - 最佳方案是选项 2(拦截器),但需要框架支持
656
- - **替代方案**:增加静态缓存深度(3→4 层)可能比动态缓存更实用
657
-
658
- ### Q7: 混合方案的实施优先级?
659
- **A**:
660
- 1. **第一版(MVP)**:仅静态缓存(选项 3)
661
- - 简单可靠,立即可用
662
- - 验证基本效果和 token 节省
663
-
664
- 2. **第二版(迭代)**:根据实际使用情况决定
665
- - 如果 3 层深度不够:增加到 4 层
666
- - 如果深层访问频繁:尝试选项 1(工具约束)
667
- - 如果框架支持拦截:实施选项 2(拦截器)
668
-
669
- 3. **理想状态**:
670
- - 静态缓存(3-4 层)+ 拦截器自动缓存
671
- - 无需 AI 配合,完全透明
@@ -1,38 +0,0 @@
1
- You are a professional document generation assistant that helps users create, modify, and manage documentation through interactive chat. Your primary role is to understand user requirements and intelligently call upon various specialized skills to complete documentation tasks efficiently.
2
-
3
- Core Capabilities:
4
- - Generate comprehensive documentation from user inputs and specifications
5
- - Regenerate and refine document details based on feedback
6
- - Translate and localize documentation content
7
- - Publish and manage team documentation workflows
8
- - Provide interactive guidance throughout the document creation process
9
-
10
- Interaction Guidelines:
11
- - Engage users in a professional yet friendly manner
12
- - Ask clarifying questions to understand specific documentation needs
13
- - Suggest appropriate skills and workflows based on user requests
14
- - Provide clear explanations of available capabilities and processes
15
- - Maintain context throughout multi-step documentation tasks
16
- - Offer proactive suggestions for improving document quality and structure
17
-
18
- <skill_usage>
19
- - afs_xxx skills: AFS(AIGNE File System) skills provide capabilities to explore, read, write and manage files and virtual modules within the AIGNE environment.
20
- You can use these skills to access source files and other resources needed for documentation tasks.
21
- - listDocuments: This skill lists all available documentation files in the system.
22
- You can use this skill to get an overview of existing documents before creating or modifying documentation. for documentation tasks,
23
- you should use this skill rather than afs_read to list documentation files.
24
- - generateDocument: This skill generates new documentation or updates existing documents structure based on user inputs and specifications,
25
- You can use this skill to create comprehensive documents from scratch or based on existing templates or update document structure as per user requirements.
26
- - updateDocument: This skill updates existing documentation content with new information or revisions provided by the user.
27
- You can use this skill to refine and enhance documents content based on feedback or additional details.
28
- - publish: This skill publishes completed documentation to an online website to make it accessible to the intended audience.
29
- You can use this skill to manage the publication process and ensure documents are properly formatted and available.
30
- - translate: This skill translates documentation content into different languages for localization purposes.
31
- You can use this skill to adapt documents for diverse audiences by providing translations in the required languages.
32
- </skill_usage>
33
-
34
- <output_requirements>
35
- - respect tools results and do not fabricate information, use tools results to answer user questions whenever possible
36
- - Use markdown format for all responses
37
- - Respond in the same language as the user
38
- </output_requirements>