gencode-ai 0.1.1 → 0.1.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.
Files changed (263) hide show
  1. package/.gencode/settings.local.json +7 -0
  2. package/README.md +11 -11
  3. package/dist/agent/agent.d.ts +42 -1
  4. package/dist/agent/agent.d.ts.map +1 -1
  5. package/dist/agent/agent.js +82 -15
  6. package/dist/agent/agent.js.map +1 -1
  7. package/dist/cli/components/App.d.ts +8 -1
  8. package/dist/cli/components/App.d.ts.map +1 -1
  9. package/dist/cli/components/App.js +231 -29
  10. package/dist/cli/components/App.js.map +1 -1
  11. package/dist/cli/components/CommandSuggestions.d.ts.map +1 -1
  12. package/dist/cli/components/CommandSuggestions.js +2 -0
  13. package/dist/cli/components/CommandSuggestions.js.map +1 -1
  14. package/dist/cli/components/Header.d.ts +1 -1
  15. package/dist/cli/components/Header.d.ts.map +1 -1
  16. package/dist/cli/components/Header.js +4 -6
  17. package/dist/cli/components/Header.js.map +1 -1
  18. package/dist/cli/components/Logo.d.ts +1 -0
  19. package/dist/cli/components/Logo.d.ts.map +1 -1
  20. package/dist/cli/components/Logo.js +16 -3
  21. package/dist/cli/components/Logo.js.map +1 -1
  22. package/dist/cli/components/Messages.d.ts +4 -4
  23. package/dist/cli/components/Messages.d.ts.map +1 -1
  24. package/dist/cli/components/Messages.js +51 -25
  25. package/dist/cli/components/Messages.js.map +1 -1
  26. package/dist/cli/components/PermissionPrompt.d.ts +60 -0
  27. package/dist/cli/components/PermissionPrompt.d.ts.map +1 -0
  28. package/dist/cli/components/PermissionPrompt.js +192 -0
  29. package/dist/cli/components/PermissionPrompt.js.map +1 -0
  30. package/dist/cli/components/ProviderManager.js +3 -3
  31. package/dist/cli/components/ProviderManager.js.map +1 -1
  32. package/dist/cli/components/Spinner.d.ts +7 -2
  33. package/dist/cli/components/Spinner.d.ts.map +1 -1
  34. package/dist/cli/components/Spinner.js +116 -25
  35. package/dist/cli/components/Spinner.js.map +1 -1
  36. package/dist/cli/components/TodoList.d.ts +7 -0
  37. package/dist/cli/components/TodoList.d.ts.map +1 -0
  38. package/dist/cli/components/TodoList.js +34 -0
  39. package/dist/cli/components/TodoList.js.map +1 -0
  40. package/dist/cli/components/index.d.ts +1 -0
  41. package/dist/cli/components/index.d.ts.map +1 -1
  42. package/dist/cli/components/index.js +1 -0
  43. package/dist/cli/components/index.js.map +1 -1
  44. package/dist/cli/index.js +47 -7
  45. package/dist/cli/index.js.map +1 -1
  46. package/dist/config/index.d.ts +13 -4
  47. package/dist/config/index.d.ts.map +1 -1
  48. package/dist/config/index.js +18 -3
  49. package/dist/config/index.js.map +1 -1
  50. package/dist/config/levels.d.ts +49 -0
  51. package/dist/config/levels.d.ts.map +1 -0
  52. package/dist/config/levels.js +222 -0
  53. package/dist/config/levels.js.map +1 -0
  54. package/dist/config/loader.d.ts +46 -0
  55. package/dist/config/loader.d.ts.map +1 -0
  56. package/dist/config/loader.js +153 -0
  57. package/dist/config/loader.js.map +1 -0
  58. package/dist/config/manager.d.ts +115 -15
  59. package/dist/config/manager.d.ts.map +1 -1
  60. package/dist/config/manager.js +260 -34
  61. package/dist/config/manager.js.map +1 -1
  62. package/dist/config/manager.test.d.ts +5 -0
  63. package/dist/config/manager.test.d.ts.map +1 -0
  64. package/dist/config/manager.test.js +192 -0
  65. package/dist/config/manager.test.js.map +1 -0
  66. package/dist/config/merger.d.ts +56 -0
  67. package/dist/config/merger.d.ts.map +1 -0
  68. package/dist/config/merger.js +177 -0
  69. package/dist/config/merger.js.map +1 -0
  70. package/dist/config/test-utils.d.ts +24 -0
  71. package/dist/config/test-utils.d.ts.map +1 -0
  72. package/dist/config/test-utils.js +55 -0
  73. package/dist/config/test-utils.js.map +1 -0
  74. package/dist/config/types.d.ts +78 -9
  75. package/dist/config/types.d.ts.map +1 -1
  76. package/dist/config/types.js +52 -2
  77. package/dist/config/types.js.map +1 -1
  78. package/dist/memory/import-resolver.d.ts +46 -0
  79. package/dist/memory/import-resolver.d.ts.map +1 -0
  80. package/dist/memory/import-resolver.js +117 -0
  81. package/dist/memory/import-resolver.js.map +1 -0
  82. package/dist/memory/index.d.ts +7 -6
  83. package/dist/memory/index.d.ts.map +1 -1
  84. package/dist/memory/index.js +7 -5
  85. package/dist/memory/index.js.map +1 -1
  86. package/dist/memory/init-prompt.d.ts +22 -0
  87. package/dist/memory/init-prompt.d.ts.map +1 -0
  88. package/dist/memory/init-prompt.js +103 -0
  89. package/dist/memory/init-prompt.js.map +1 -0
  90. package/dist/memory/memory-manager.d.ts +119 -0
  91. package/dist/memory/memory-manager.d.ts.map +1 -0
  92. package/dist/memory/memory-manager.js +587 -0
  93. package/dist/memory/memory-manager.js.map +1 -0
  94. package/dist/memory/rules-parser.d.ts +38 -0
  95. package/dist/memory/rules-parser.d.ts.map +1 -0
  96. package/dist/memory/rules-parser.js +69 -0
  97. package/dist/memory/rules-parser.js.map +1 -0
  98. package/dist/memory/test-utils.d.ts +20 -0
  99. package/dist/memory/test-utils.d.ts.map +1 -0
  100. package/dist/memory/test-utils.js +44 -0
  101. package/dist/memory/test-utils.js.map +1 -0
  102. package/dist/memory/types.d.ts +70 -63
  103. package/dist/memory/types.d.ts.map +1 -1
  104. package/dist/memory/types.js +42 -2
  105. package/dist/memory/types.js.map +1 -1
  106. package/dist/permissions/audit.d.ts +82 -0
  107. package/dist/permissions/audit.d.ts.map +1 -0
  108. package/dist/permissions/audit.js +229 -0
  109. package/dist/permissions/audit.js.map +1 -0
  110. package/dist/permissions/index.d.ts +11 -1
  111. package/dist/permissions/index.d.ts.map +1 -1
  112. package/dist/permissions/index.js +15 -0
  113. package/dist/permissions/index.js.map +1 -1
  114. package/dist/permissions/manager.d.ts +149 -13
  115. package/dist/permissions/manager.d.ts.map +1 -1
  116. package/dist/permissions/manager.js +480 -35
  117. package/dist/permissions/manager.js.map +1 -1
  118. package/dist/permissions/manager.test.d.ts +5 -0
  119. package/dist/permissions/manager.test.d.ts.map +1 -0
  120. package/dist/permissions/manager.test.js +213 -0
  121. package/dist/permissions/manager.test.js.map +1 -0
  122. package/dist/permissions/persistence.d.ts +74 -0
  123. package/dist/permissions/persistence.d.ts.map +1 -0
  124. package/dist/permissions/persistence.js +248 -0
  125. package/dist/permissions/persistence.js.map +1 -0
  126. package/dist/permissions/persistence.test.d.ts +5 -0
  127. package/dist/permissions/persistence.test.d.ts.map +1 -0
  128. package/dist/permissions/persistence.test.js +171 -0
  129. package/dist/permissions/persistence.test.js.map +1 -0
  130. package/dist/permissions/prompt-matcher.d.ts +64 -0
  131. package/dist/permissions/prompt-matcher.d.ts.map +1 -0
  132. package/dist/permissions/prompt-matcher.js +415 -0
  133. package/dist/permissions/prompt-matcher.js.map +1 -0
  134. package/dist/permissions/prompt-matcher.test.d.ts +5 -0
  135. package/dist/permissions/prompt-matcher.test.d.ts.map +1 -0
  136. package/dist/permissions/prompt-matcher.test.js +107 -0
  137. package/dist/permissions/prompt-matcher.test.js.map +1 -0
  138. package/dist/permissions/types.d.ts +157 -0
  139. package/dist/permissions/types.d.ts.map +1 -1
  140. package/dist/permissions/types.js +43 -8
  141. package/dist/permissions/types.js.map +1 -1
  142. package/dist/prompts/index.d.ts +92 -0
  143. package/dist/prompts/index.d.ts.map +1 -0
  144. package/dist/prompts/index.js +241 -0
  145. package/dist/prompts/index.js.map +1 -0
  146. package/dist/tools/builtin/bash.d.ts.map +1 -1
  147. package/dist/tools/builtin/bash.js +2 -1
  148. package/dist/tools/builtin/bash.js.map +1 -1
  149. package/dist/tools/builtin/edit.d.ts.map +1 -1
  150. package/dist/tools/builtin/edit.js +2 -1
  151. package/dist/tools/builtin/edit.js.map +1 -1
  152. package/dist/tools/builtin/glob.d.ts.map +1 -1
  153. package/dist/tools/builtin/glob.js +2 -1
  154. package/dist/tools/builtin/glob.js.map +1 -1
  155. package/dist/tools/builtin/grep.d.ts.map +1 -1
  156. package/dist/tools/builtin/grep.js +2 -1
  157. package/dist/tools/builtin/grep.js.map +1 -1
  158. package/dist/tools/builtin/read.d.ts.map +1 -1
  159. package/dist/tools/builtin/read.js +2 -1
  160. package/dist/tools/builtin/read.js.map +1 -1
  161. package/dist/tools/builtin/todowrite.d.ts +15 -0
  162. package/dist/tools/builtin/todowrite.d.ts.map +1 -0
  163. package/dist/tools/builtin/todowrite.js +88 -0
  164. package/dist/tools/builtin/todowrite.js.map +1 -0
  165. package/dist/tools/builtin/webfetch.d.ts.map +1 -1
  166. package/dist/tools/builtin/webfetch.js +2 -5
  167. package/dist/tools/builtin/webfetch.js.map +1 -1
  168. package/dist/tools/builtin/websearch.d.ts.map +1 -1
  169. package/dist/tools/builtin/websearch.js +2 -16
  170. package/dist/tools/builtin/websearch.js.map +1 -1
  171. package/dist/tools/builtin/write.d.ts.map +1 -1
  172. package/dist/tools/builtin/write.js +2 -1
  173. package/dist/tools/builtin/write.js.map +1 -1
  174. package/dist/tools/index.d.ts +7 -0
  175. package/dist/tools/index.d.ts.map +1 -1
  176. package/dist/tools/index.js +4 -0
  177. package/dist/tools/index.js.map +1 -1
  178. package/dist/tools/types.d.ts +22 -0
  179. package/dist/tools/types.d.ts.map +1 -1
  180. package/dist/tools/types.js +8 -0
  181. package/dist/tools/types.js.map +1 -1
  182. package/docs/config-system-comparison.md +707 -0
  183. package/docs/memory-system.md +238 -0
  184. package/docs/permissions.md +368 -0
  185. package/docs/proposals/0005-todo-system.md +350 -85
  186. package/docs/proposals/0006-memory-system.md +11 -10
  187. package/docs/proposals/0012-ask-user-question.md +941 -206
  188. package/docs/proposals/0023-permission-enhancements.md +61 -2
  189. package/docs/proposals/0041-configuration-system.md +33 -2
  190. package/docs/proposals/0042-prompt-optimization.md +866 -0
  191. package/docs/proposals/README.md +6 -5
  192. package/jest.config.js +26 -0
  193. package/package.json +8 -2
  194. package/src/agent/agent.ts +111 -16
  195. package/src/cli/components/App.tsx +309 -36
  196. package/src/cli/components/CommandSuggestions.tsx +2 -0
  197. package/src/cli/components/Header.tsx +11 -17
  198. package/src/cli/components/Logo.tsx +76 -9
  199. package/src/cli/components/Messages.tsx +73 -53
  200. package/src/cli/components/PermissionPrompt.tsx +388 -0
  201. package/src/cli/components/ProviderManager.tsx +5 -5
  202. package/src/cli/components/Spinner.tsx +138 -25
  203. package/src/cli/components/TodoList.tsx +54 -0
  204. package/src/cli/components/index.ts +6 -0
  205. package/src/cli/index.tsx +54 -6
  206. package/src/config/index.ts +78 -4
  207. package/src/config/levels.test.ts +163 -0
  208. package/src/config/levels.ts +285 -0
  209. package/src/config/loader.test.ts +120 -0
  210. package/src/config/loader.ts +178 -0
  211. package/src/config/manager.test.ts +215 -0
  212. package/src/config/manager.ts +328 -40
  213. package/src/config/merger.test.ts +360 -0
  214. package/src/config/merger.ts +221 -0
  215. package/src/config/test-utils.ts +79 -0
  216. package/src/config/types.ts +152 -9
  217. package/src/memory/import-resolver.test.ts +117 -0
  218. package/src/memory/import-resolver.ts +149 -0
  219. package/src/memory/index.ts +11 -0
  220. package/src/memory/init-prompt.ts +113 -0
  221. package/src/memory/memory-manager.test.ts +198 -0
  222. package/src/memory/memory-manager.ts +716 -0
  223. package/src/memory/rules-parser.test.ts +182 -0
  224. package/src/memory/rules-parser.ts +82 -0
  225. package/src/memory/test-utils.ts +60 -0
  226. package/src/memory/types.ts +119 -0
  227. package/src/permissions/audit.ts +284 -0
  228. package/src/permissions/index.ts +20 -1
  229. package/src/permissions/manager.test.ts +260 -0
  230. package/src/permissions/manager.ts +592 -40
  231. package/src/permissions/persistence.test.ts +220 -0
  232. package/src/permissions/persistence.ts +301 -0
  233. package/src/permissions/prompt-matcher.test.ts +213 -0
  234. package/src/permissions/prompt-matcher.ts +472 -0
  235. package/src/permissions/types.ts +236 -8
  236. package/src/prompts/index.test.ts +279 -0
  237. package/src/prompts/index.ts +306 -0
  238. package/src/prompts/system/anthropic.txt +29 -0
  239. package/src/prompts/system/base.txt +124 -0
  240. package/src/prompts/system/gemini.txt +35 -0
  241. package/src/prompts/system/generic.txt +128 -0
  242. package/src/prompts/system/openai.txt +29 -0
  243. package/src/prompts/tools/bash.txt +60 -0
  244. package/src/prompts/tools/edit.txt +29 -0
  245. package/src/prompts/tools/glob.txt +35 -0
  246. package/src/prompts/tools/grep.txt +43 -0
  247. package/src/prompts/tools/read.txt +22 -0
  248. package/src/prompts/tools/todowrite.txt +71 -0
  249. package/src/prompts/tools/webfetch.txt +34 -0
  250. package/src/prompts/tools/websearch.txt +41 -0
  251. package/src/prompts/tools/write.txt +23 -0
  252. package/src/tools/builtin/bash.ts +2 -1
  253. package/src/tools/builtin/edit.ts +2 -1
  254. package/src/tools/builtin/glob.ts +2 -1
  255. package/src/tools/builtin/grep.ts +2 -1
  256. package/src/tools/builtin/read.ts +2 -1
  257. package/src/tools/builtin/todowrite.ts +102 -0
  258. package/src/tools/builtin/webfetch.ts +2 -5
  259. package/src/tools/builtin/websearch.ts +2 -16
  260. package/src/tools/builtin/write.ts +2 -1
  261. package/src/tools/index.ts +4 -0
  262. package/src/tools/types.ts +12 -0
  263. package/tsconfig.json +1 -1
@@ -0,0 +1,707 @@
1
+ # GenCode Multi-Level Configuration System
2
+
3
+ ## Overview
4
+
5
+ GenCode implements a multi-level configuration system compatible with Claude Code, while also supporting OpenCode-style flexibility through the `GENCODE_CONFIG_DIRS` environment variable.
6
+
7
+ ## Table of Contents
8
+
9
+ 1. [Configuration Hierarchy](#configuration-hierarchy)
10
+ 2. [Detailed Flow Diagrams](#detailed-flow-diagrams)
11
+ 3. [Merge Strategy](#merge-strategy)
12
+ 4. [GenCode vs OpenCode vs Claude Code](#gencode-vs-opencode-vs-claude-code-comparison)
13
+ 5. [Usage Examples](#usage-examples)
14
+ 6. [API Reference](#api-reference)
15
+
16
+ ---
17
+
18
+ ## Configuration Hierarchy
19
+
20
+ ```
21
+ Priority (High → Low):
22
+ ┌─────────────────────────────────────────────────────────────────────┐
23
+ │ Level 6: Managed (System) - HIGHEST PRIORITY │
24
+ │ Location: /Library/Application Support/GenCode/managed-settings.json
25
+ │ Scope: All users on machine (deployed by IT) │
26
+ │ Cannot be overridden │
27
+ ├─────────────────────────────────────────────────────────────────────┤
28
+ │ Level 5: CLI Arguments │
29
+ │ Scope: Current session only │
30
+ ├─────────────────────────────────────────────────────────────────────┤
31
+ │ Level 4: Local (Personal) │
32
+ │ Location: .gencode/*.local.* + .claude/*.local.* │
33
+ │ Scope: Current user, current project only (gitignored) │
34
+ ├─────────────────────────────────────────────────────────────────────┤
35
+ │ Level 3: Project (Shared) │
36
+ │ Location: .gencode/ + .claude/ (MERGED) │
37
+ │ Scope: All collaborators (committed to git) │
38
+ ├─────────────────────────────────────────────────────────────────────┤
39
+ │ Level 2: Extra Dirs (GENCODE_CONFIG_DIRS) │
40
+ │ Location: Colon-separated paths from environment variable │
41
+ │ Scope: Team/organization shared configs │
42
+ ├─────────────────────────────────────────────────────────────────────┤
43
+ │ Level 1: User (Global) - LOWEST PRIORITY │
44
+ │ Location: ~/.gencode/ + ~/.claude/ (MERGED) │
45
+ │ Scope: Current user, all projects │
46
+ └─────────────────────────────────────────────────────────────────────┘
47
+ ```
48
+
49
+ ---
50
+
51
+ ## Detailed Flow Diagrams
52
+
53
+ ### Settings Loading Pipeline
54
+
55
+ ```
56
+ ┌─────────────────┐
57
+ │ START │
58
+ └────────┬────────┘
59
+
60
+ ┌──────────────────▼──────────────────┐
61
+ │ Initialize Empty Settings │
62
+ │ settings = {} │
63
+ └──────────────────┬──────────────────┘
64
+
65
+ ╔══════════════════════════════════▼══════════════════════════════════════════╗
66
+ ║ STEP 1: Load USER Settings (最低优先级,作为基础) ║
67
+ ╠═════════════════════════════════════════════════════════════════════════════╣
68
+ ║ ║
69
+ ║ 同层级内合并 (claude 先加载,gencode 后加载覆盖): ║
70
+ ║ ┌─────────────────────────────────────────────────────────────────────┐ ║
71
+ ║ │ claude = load("~/.claude/settings.json") // 低优先级 │ ║
72
+ ║ │ gencode = load("~/.gencode/settings.json") // 高优先级 │ ║
73
+ ║ │ user = deepMerge(claude, gencode) // gencode 覆盖 │ ║
74
+ ║ └─────────────────────────────────────────────────────────────────────┘ ║
75
+ ║ ║
76
+ ╚══════════════════════════════════╤══════════════════════════════════════════╝
77
+
78
+ ┌──────────────────▼──────────────────┐
79
+ │ settings = deepMerge({}, user) │
80
+ └──────────────────┬──────────────────┘
81
+
82
+ ╔══════════════════════════════════▼══════════════════════════════════════════╗
83
+ ║ STEP 2: Load EXTRA Config Dirs (可选,GENCODE_CONFIG_DIRS) ║
84
+ ╠═════════════════════════════════════════════════════════════════════════════╣
85
+ ║ ║
86
+ ║ 环境变量: GENCODE_CONFIG_DIRS="/team/config:~/shared-rules" ║
87
+ ║ ║
88
+ ║ For each dir in GENCODE_CONFIG_DIRS.split(':'): ║
89
+ ║ ┌─────────────────────────────────────────────────────────────────────┐ ║
90
+ ║ │ extra = load("{dir}/settings.json") │ ║
91
+ ║ │ settings = deepMerge(settings, extra) │ ║
92
+ ║ └─────────────────────────────────────────────────────────────────────┘ ║
93
+ ║ ║
94
+ ╚══════════════════════════════════╤══════════════════════════════════════════╝
95
+
96
+ ╔══════════════════════════════════▼══════════════════════════════════════════╗
97
+ ║ STEP 3: Load PROJECT Settings (团队共享) ║
98
+ ╠═════════════════════════════════════════════════════════════════════════════╣
99
+ ║ ║
100
+ ║ 同层级内合并: ║
101
+ ║ ┌─────────────────────────────────────────────────────────────────────┐ ║
102
+ ║ │ claude = load(".claude/settings.json") // 低优先级 │ ║
103
+ ║ │ gencode = load(".gencode/settings.json") // 高优先级 │ ║
104
+ ║ │ project = deepMerge(claude, gencode) // gencode 覆盖 │ ║
105
+ ║ └─────────────────────────────────────────────────────────────────────┘ ║
106
+ ║ ║
107
+ ╚══════════════════════════════════╤══════════════════════════════════════════╝
108
+
109
+ ┌──────────────────▼──────────────────┐
110
+ │ settings = deepMerge(settings, │
111
+ │ project) │
112
+ └──────────────────┬──────────────────┘
113
+
114
+ ╔══════════════════════════════════▼══════════════════════════════════════════╗
115
+ ║ STEP 4: Load LOCAL Settings (个人项目级,gitignored) ║
116
+ ╠═════════════════════════════════════════════════════════════════════════════╣
117
+ ║ ║
118
+ ║ 同层级内合并: ║
119
+ ║ ┌─────────────────────────────────────────────────────────────────────┐ ║
120
+ ║ │ claude = load(".claude/settings.local.json") // 低优先级 │ ║
121
+ ║ │ gencode = load(".gencode/settings.local.json") // 高优先级 │ ║
122
+ ║ │ local = deepMerge(claude, gencode) // gencode 覆盖 │ ║
123
+ ║ └─────────────────────────────────────────────────────────────────────┘ ║
124
+ ║ ║
125
+ ╚══════════════════════════════════╤══════════════════════════════════════════╝
126
+
127
+ ╔══════════════════════════════════▼══════════════════════════════════════════╗
128
+ ║ STEP 5: Apply CLI Arguments (会话级临时覆盖) ║
129
+ ╠═════════════════════════════════════════════════════════════════════════════╣
130
+ ║ ║
131
+ ║ 命令行参数覆盖文件配置: ║
132
+ ║ ┌─────────────────────────────────────────────────────────────────────┐ ║
133
+ ║ │ --provider anthropic → settings.provider = "anthropic" │ ║
134
+ ║ │ --model claude-sonnet → settings.model = "claude-sonnet" │ ║
135
+ ║ └─────────────────────────────────────────────────────────────────────┘ ║
136
+ ║ ║
137
+ ╚══════════════════════════════════╤══════════════════════════════════════════╝
138
+
139
+ ╔══════════════════════════════════▼══════════════════════════════════════════╗
140
+ ║ STEP 6: Apply MANAGED Settings (最高优先级,强制执行) ║
141
+ ╠═════════════════════════════════════════════════════════════════════════════╣
142
+ ║ ║
143
+ ║ 系统级位置(按平台): ║
144
+ ║ ┌─────────────────────────────────────────────────────────────────────┐ ║
145
+ ║ │ macOS: /Library/Application Support/GenCode/managed-settings.json│ ║
146
+ ║ │ + /Library/Application Support/ClaudeCode/... │ ║
147
+ ║ │ Linux: /etc/gencode/managed-settings.json │ ║
148
+ ║ │ + /etc/claude-code/managed-settings.json │ ║
149
+ ║ │ Windows: C:\Program Files\GenCode\managed-settings.json │ ║
150
+ ║ └─────────────────────────────────────────────────────────────────────┘ ║
151
+ ║ ║
152
+ ║ 特殊处理: ║
153
+ ║ • managed.permissions.deny → 添加到 deny 列表且不可移除 ║
154
+ ║ • managed.strictKnownMarketplaces → 强制插件白名单 ║
155
+ ║ ║
156
+ ╚══════════════════════════════════╤══════════════════════════════════════════╝
157
+
158
+ ┌────────▼────────┐
159
+ │ Return Final │
160
+ │ Settings │
161
+ └─────────────────┘
162
+ ```
163
+
164
+ ### Memory Loading Pipeline
165
+
166
+ ```
167
+ ┌─────────────────┐
168
+ │ START │
169
+ │ memories = [] │
170
+ └────────┬────────┘
171
+
172
+ ╔══════════════════════════════════▼══════════════════════════════════════════╗
173
+ ║ STEP 1: Load ENTERPRISE Memory (组织级策略,enforced) ║
174
+ ╠═════════════════════════════════════════════════════════════════════════════╣
175
+ ║ ║
176
+ ║ 系统级位置 (都加载,先 claude 后 gencode): ║
177
+ ║ ┌─────────────────────────────────────────────────────────────────────┐ ║
178
+ ║ │ macOS: │ ║
179
+ ║ │ if exists: memories.push({ │ ║
180
+ ║ │ content: load("/Library/.../ClaudeCode/CLAUDE.md"), │ ║
181
+ ║ │ namespace: "claude", enforced: true │ ║
182
+ ║ │ }) │ ║
183
+ ║ │ if exists: memories.push({ │ ║
184
+ ║ │ content: load("/Library/.../GenCode/AGENT.md"), │ ║
185
+ ║ │ namespace: "gencode", enforced: true │ ║
186
+ ║ │ }) │ ║
187
+ ║ └─────────────────────────────────────────────────────────────────────┘ ║
188
+ ║ ║
189
+ ╚══════════════════════════════════╤══════════════════════════════════════════╝
190
+
191
+ ╔══════════════════════════════════▼══════════════════════════════════════════╗
192
+ ║ STEP 2: Load USER Memory (全局个人) ║
193
+ ╠═════════════════════════════════════════════════════════════════════════════╣
194
+ ║ ║
195
+ ║ 都加载 (先 claude 后 gencode): ║
196
+ ║ ┌─────────────────────────────────────────────────────────────────────┐ ║
197
+ ║ │ if exists: memories.push(load("~/.claude/CLAUDE.md")) │ ║
198
+ ║ │ if exists: memories.push(load("~/.gencode/AGENT.md")) │ ║
199
+ ║ └─────────────────────────────────────────────────────────────────────┘ ║
200
+ ║ ║
201
+ ║ 同样加载 rules: ║
202
+ ║ ┌─────────────────────────────────────────────────────────────────────┐ ║
203
+ ║ │ ~/.claude/rules/*.md → memories.push(each) │ ║
204
+ ║ │ ~/.gencode/rules/*.md → memories.push(each) │ ║
205
+ ║ └─────────────────────────────────────────────────────────────────────┘ ║
206
+ ║ ║
207
+ ╚══════════════════════════════════╤══════════════════════════════════════════╝
208
+
209
+ ╔══════════════════════════════════▼══════════════════════════════════════════╗
210
+ ║ STEP 3: Load EXTRA Config Dirs Memory (可选) ║
211
+ ╠═════════════════════════════════════════════════════════════════════════════╣
212
+ ║ ║
213
+ ║ For each dir in GENCODE_CONFIG_DIRS: ║
214
+ ║ ┌─────────────────────────────────────────────────────────────────────┐ ║
215
+ ║ │ if exists: memories.push(load("{dir}/CLAUDE.md")) │ ║
216
+ ║ │ if exists: memories.push(load("{dir}/AGENT.md")) │ ║
217
+ ║ │ for each: memories.push(load("{dir}/rules/*.md")) │ ║
218
+ ║ └─────────────────────────────────────────────────────────────────────┘ ║
219
+ ║ ║
220
+ ╚══════════════════════════════════╤══════════════════════════════════════════╝
221
+
222
+ ╔══════════════════════════════════▼══════════════════════════════════════════╗
223
+ ║ STEP 4: Load PROJECT Memory (都加载) ║
224
+ ╠═════════════════════════════════════════════════════════════════════════════╣
225
+ ║ ║
226
+ ║ 从 project root 加载 (先 claude 后 gencode): ║
227
+ ║ ┌─────────────────────────────────────────────────────────────────────┐ ║
228
+ ║ │ # Claude files (pick first found) │ ║
229
+ ║ │ if exists: memories.push(load("./CLAUDE.md")) │ ║
230
+ ║ │ else if exists: memories.push(load("./.claude/CLAUDE.md")) │ ║
231
+ ║ │ │ ║
232
+ ║ │ # GenCode files (pick first found) │ ║
233
+ ║ │ if exists: memories.push(load("./AGENT.md")) │ ║
234
+ ║ │ else if exists: memories.push(load("./.gencode/AGENT.md")) │ ║
235
+ ║ └─────────────────────────────────────────────────────────────────────┘ ║
236
+ ║ ║
237
+ ╚══════════════════════════════════╤══════════════════════════════════════════╝
238
+
239
+ ╔══════════════════════════════════▼══════════════════════════════════════════╗
240
+ ║ STEP 5: Load PROJECT Rules (模块化规则文件) ║
241
+ ╠═════════════════════════════════════════════════════════════════════════════╣
242
+ ║ ║
243
+ ║ 加载规则目录 (都加载): ║
244
+ ║ ┌─────────────────────────────────────────────────────────────────────┐ ║
245
+ ║ │ .claude/rules/*.md → memories.push(each, namespace: "claude") │ ║
246
+ ║ │ .gencode/rules/*.md → memories.push(each, namespace: "gencode") │ ║
247
+ ║ │ │ ║
248
+ ║ │ 支持 paths frontmatter 条件加载: │ ║
249
+ ║ │ --- │ ║
250
+ ║ │ paths: │ ║
251
+ ║ │ - "src/api/**/*.ts" │ ║
252
+ ║ │ --- │ ║
253
+ ║ └─────────────────────────────────────────────────────────────────────┘ ║
254
+ ║ ║
255
+ ╚══════════════════════════════════╤══════════════════════════════════════════╝
256
+
257
+ ╔══════════════════════════════════▼══════════════════════════════════════════╗
258
+ ║ STEP 6: Load LOCAL Memory (个人项目级,gitignored) ║
259
+ ╠═════════════════════════════════════════════════════════════════════════════╣
260
+ ║ ║
261
+ ║ 都加载 (先 claude 后 gencode): ║
262
+ ║ ┌─────────────────────────────────────────────────────────────────────┐ ║
263
+ ║ │ if exists: memories.push(load("./CLAUDE.local.md")) │ ║
264
+ ║ │ if exists: memories.push(load("./.claude/CLAUDE.local.md")) │ ║
265
+ ║ │ if exists: memories.push(load("./AGENT.local.md")) │ ║
266
+ ║ │ if exists: memories.push(load("./.gencode/AGENT.local.md")) │ ║
267
+ ║ └─────────────────────────────────────────────────────────────────────┘ ║
268
+ ║ ║
269
+ ╚══════════════════════════════════╤══════════════════════════════════════════╝
270
+
271
+ ╔══════════════════════════════════▼══════════════════════════════════════════╗
272
+ ║ STEP 7: Process @imports (递归解析引用) ║
273
+ ╠═════════════════════════════════════════════════════════════════════════════╣
274
+ ║ ║
275
+ ║ 解析 @path/to/file 语法: ║
276
+ ║ ┌─────────────────────────────────────────────────────────────────────┐ ║
277
+ ║ │ See @README for project overview │ ║
278
+ ║ │ Build commands in @package.json │ ║
279
+ ║ │ │ ║
280
+ ║ │ 规则: │ ║
281
+ ║ │ • 支持相对路径和绝对路径 │ ║
282
+ ║ │ • 最大递归深度: 5 层 │ ║
283
+ ║ │ • 代码块内的 @引用 被忽略 │ ║
284
+ ║ └─────────────────────────────────────────────────────────────────────┘ ║
285
+ ║ ║
286
+ ╚══════════════════════════════════╤══════════════════════════════════════════╝
287
+
288
+ ┌────────▼────────┐
289
+ │ Concatenate all │
290
+ │ → LLM context │
291
+ └─────────────────┘
292
+ ```
293
+
294
+ ### Permission Resolution Flow
295
+
296
+ ```
297
+ ┌─────────────────────────────────────────────────────────────────────────────────┐
298
+ │ Permission Check: Bash(npm install) │
299
+ └─────────────────────────────────────────────────────────────────────────────────┘
300
+
301
+ ┌─────────────────┐
302
+ │ Check Managed │
303
+ │ deny list │
304
+ └────────┬────────┘
305
+
306
+ ┌────────▼────────┐ ┌─────────────────┐
307
+ │ In managed.deny?│────▶│ DENY (enforced) │
308
+ └────────┬────────┘ Yes └─────────────────┘
309
+ │ No
310
+ ┌────────▼────────┐
311
+ │ Check merged │
312
+ │ allow list │
313
+ └────────┬────────┘
314
+
315
+ ┌────────▼────────┐ ┌─────────────────┐
316
+ │ Matches allow? │────▶│ ALLOW │
317
+ └────────┬────────┘ Yes └─────────────────┘
318
+ │ No
319
+ ┌────────▼────────┐
320
+ │ Check merged │
321
+ │ deny list │
322
+ └────────┬────────┘
323
+
324
+ ┌────────▼────────┐ ┌─────────────────┐
325
+ │ Matches deny? │────▶│ DENY │
326
+ └────────┬────────┘ Yes └─────────────────┘
327
+ │ No
328
+ ┌────────▼────────┐
329
+ │ Check merged │
330
+ │ ask list │
331
+ └────────┬────────┘
332
+
333
+ ┌────────▼────────┐ ┌─────────────────┐
334
+ │ Matches ask? │────▶│ PROMPT USER │
335
+ └────────┬────────┘ Yes └─────────────────┘
336
+ │ No
337
+ ┌────────▼────────┐
338
+ │ Default: │
339
+ │ PROMPT USER │
340
+ └─────────────────┘
341
+ ```
342
+
343
+ ---
344
+
345
+ ## Merge Strategy
346
+
347
+ ```
348
+ src/config/
349
+ ├── index.ts # Module exports
350
+ ├── types.ts # Types and constants (updated)
351
+ ├── levels.ts # Level detection and path resolution (new)
352
+ ├── loader.ts # Load config from directories (new)
353
+ ├── merger.ts # Merge config from multiple sources (new)
354
+ ├── manager.ts # ConfigManager class (refactored)
355
+ └── providers-config.ts # Provider-specific config (existing)
356
+
357
+ src/memory/
358
+ ├── types.ts # Memory types (updated for merge semantics)
359
+ └── memory-manager.ts # Memory loading (updated for merge semantics)
360
+ ```
361
+
362
+ ## GenCode vs OpenCode vs Claude Code Comparison
363
+
364
+ ### Directory Structure
365
+
366
+ | Aspect | GenCode | OpenCode | Claude Code |
367
+ |--------|---------|----------|-------------|
368
+ | **User Config Dir** | `~/.gencode/` + `~/.claude/` (merge) | `~/.config/opencode/` (XDG) | `~/.claude/` |
369
+ | **Project Config Dir** | `.gencode/` + `.claude/` (merge) | `.opencode/` | `.claude/` |
370
+ | **Config File Format** | JSON | JSON/JSONC/TOML | JSON |
371
+ | **Memory File** | `AGENT.md` / `CLAUDE.md` | N/A (uses instructions) | `CLAUDE.md` |
372
+ | **Rules Dir** | `rules/*.md` | N/A | `rules/*.md` |
373
+
374
+ ### Loading Semantics
375
+
376
+ | Aspect | GenCode | OpenCode | Claude Code |
377
+ |--------|---------|----------|-------------|
378
+ | **Same Level Merge** | Yes (claude + gencode) | No (single namespace) | No (single namespace) |
379
+ | **Cross Level Merge** | Deep merge | Deep merge | Deep merge |
380
+ | **Array Handling** | Concatenate & dedupe | Concatenate & dedupe | Concatenate |
381
+ | **Managed Level** | Yes (enforced deny) | Yes (well-known) | Yes (managed settings) |
382
+
383
+ ### Configuration Hierarchy
384
+
385
+ ```
386
+ ┌─────────────────────────────────────────────────────────────────────────────────┐
387
+ │ Hierarchy Comparison │
388
+ ├─────────────────────────────────────────────────────────────────────────────────┤
389
+ │ │
390
+ │ GenCode (6 levels): OpenCode (6 levels): Claude Code (5): │
391
+ │ ───────────────── ──────────────────── ─────────────── │
392
+ │ 1. User 1. Remote (well-known) 1. User │
393
+ │ ~/.claude/ + ~/.gencode/ 2. Global (~/.config/) 2. Project │
394
+ │ 2. Extra (GENCODE_CONFIG_DIRS) 3. OPENCODE_CONFIG 3. Local │
395
+ │ 3. Project 4. Project 4. CLI │
396
+ │ .claude/ + .gencode/ 5. .opencode/ 5. Managed │
397
+ │ 4. Local 6. OPENCODE_CONFIG_CONTENT │
398
+ │ *.local.json │
399
+ │ 5. CLI │
400
+ │ 6. Managed (enforced) │
401
+ │ │
402
+ └─────────────────────────────────────────────────────────────────────────────────┘
403
+ ```
404
+
405
+ ### Key Differences
406
+
407
+ #### 1. Dual Namespace Merge (GenCode Unique)
408
+
409
+ GenCode loads **both** `.gencode/` and `.claude/` directories at each level and merges them:
410
+
411
+ ```typescript
412
+ // At User level:
413
+ claude = load("~/.claude/settings.json") // lower priority
414
+ gencode = load("~/.gencode/settings.json") // higher priority
415
+ result = deepMerge(claude, gencode) // gencode wins on conflicts
416
+ ```
417
+
418
+ OpenCode and Claude Code only use their own namespace.
419
+
420
+ #### 2. Extra Config Dirs (GenCode Feature)
421
+
422
+ GenCode supports `GENCODE_CONFIG_DIRS` for team/organization config:
423
+
424
+ ```bash
425
+ export GENCODE_CONFIG_DIRS="/team/shared-config:~/my-custom-rules"
426
+ ```
427
+
428
+ OpenCode has `OPENCODE_CONFIG` for single file and `OPENCODE_CONFIG_CONTENT` for inline JSON.
429
+
430
+ #### 3. Memory System (GenCode/Claude Code Feature)
431
+
432
+ GenCode implements a full memory system like Claude Code:
433
+ - `AGENT.md` / `CLAUDE.md` files
434
+ - `rules/*.md` with path-scoped activation
435
+ - `@import` syntax for file references
436
+
437
+ OpenCode uses `instructions` in config files instead of separate memory files.
438
+
439
+ #### 4. Managed Settings Location
440
+
441
+ | Platform | GenCode | OpenCode | Claude Code |
442
+ |----------|---------|----------|-------------|
443
+ | macOS | `/Library/Application Support/GenCode/` | N/A (uses well-known) | `/Library/Application Support/ClaudeCode/` |
444
+ | Linux | `/etc/gencode/` | N/A | `/etc/claude-code/` |
445
+ | Windows | `C:\Program Files\GenCode\` | N/A | `C:\Program Files\ClaudeCode\` |
446
+
447
+ ### Merge Strategy Comparison
448
+
449
+ ```
450
+ ┌─────────────────────────────────────────────────────────────────────────────────┐
451
+ │ Merge Strategy │
452
+ ├─────────────────────────────────────────────────────────────────────────────────┤
453
+ │ │
454
+ │ GenCode (Settings): │
455
+ │ • Scalars: Later replaces earlier │
456
+ │ • Arrays: Concatenate and deduplicate │
457
+ │ • Objects: Deep merge recursively │
458
+ │ • Managed deny: Cannot be removed by any level │
459
+ │ │
460
+ │ GenCode (Memory): │
461
+ │ • All files concatenated in order │
462
+ │ • Later content appears later in context (higher LLM priority) │
463
+ │ • Enterprise files marked as [ENFORCED] │
464
+ │ │
465
+ │ OpenCode: │
466
+ │ • Uses remeda's mergeDeep │
467
+ │ • plugin and instructions arrays: Concatenate and dedupe │
468
+ │ • Other arrays: Replace │
469
+ │ │
470
+ │ Claude Code: │
471
+ │ • Similar to GenCode │
472
+ │ • Managed settings enforced │
473
+ │ │
474
+ └─────────────────────────────────────────────────────────────────────────────────┘
475
+ ```
476
+
477
+ ### Feature Matrix
478
+
479
+ | Feature | GenCode | OpenCode | Claude Code |
480
+ |---------|:-------:|:--------:|:-----------:|
481
+ | Multi-level config | ✅ | ✅ | ✅ |
482
+ | Dual namespace merge | ✅ | ❌ | ❌ |
483
+ | Claude Code compat | ✅ | ❌ | ✅ |
484
+ | Memory files | ✅ | ❌ | ✅ |
485
+ | Rules with paths | ✅ | ❌ | ✅ |
486
+ | @import syntax | ✅ | ✅ (file:) | ✅ |
487
+ | Extra config dirs | ✅ | ✅ | ❌ |
488
+ | Managed settings | ✅ | ✅ (well-known) | ✅ |
489
+ | XDG compliance | ❌ | ✅ | ❌ |
490
+ | JSONC support | ❌ | ✅ | ❌ |
491
+ | TOML support | ❌ | ✅ | ❌ |
492
+ | Agent definitions | ❌ | ✅ | ❌ |
493
+ | Command definitions | ❌ | ✅ | ❌ |
494
+ | Plugin system | ❌ | ✅ | ✅ |
495
+ | LSP integration | ❌ | ✅ | ✅ |
496
+
497
+ ## Usage Examples
498
+
499
+ ### Loading Configuration
500
+
501
+ ```typescript
502
+ import { ConfigManager } from './config';
503
+
504
+ const config = new ConfigManager({ cwd: process.cwd() });
505
+ await config.load();
506
+
507
+ // Get merged settings
508
+ const settings = config.get();
509
+
510
+ // Get debug info
511
+ console.log(config.getDebugSummary());
512
+ // Output:
513
+ // Configuration Sources (in priority order):
514
+ // user:claude - ~/.claude/settings.json
515
+ // user:gencode - ~/.gencode/settings.json
516
+ // project:claude - .claude/settings.json
517
+ // project:gencode - .gencode/settings.json
518
+ ```
519
+
520
+ ### Loading Memory
521
+
522
+ ```typescript
523
+ import { MemoryManager } from './memory';
524
+
525
+ const memory = new MemoryManager();
526
+ await memory.load({ cwd: process.cwd() });
527
+
528
+ // Get combined context for LLM
529
+ const context = memory.getLoaded()?.context;
530
+
531
+ // Get debug info
532
+ console.log(memory.getDebugSummary());
533
+ // Output:
534
+ // Memory Sources (in load order):
535
+ // user:claude - ~/.claude/CLAUDE.md (1024 bytes)
536
+ // user:gencode - ~/.gencode/AGENT.md (512 bytes)
537
+ // project:claude - ./CLAUDE.md (2048 bytes)
538
+ // project:gencode - ./AGENT.md (1024 bytes)
539
+ ```
540
+
541
+ ### Using Extra Config Dirs
542
+
543
+ ```bash
544
+ # Set up team config
545
+ export GENCODE_CONFIG_DIRS="/team/shared-config"
546
+
547
+ # Create team settings
548
+ echo '{"provider": "anthropic"}' > /team/shared-config/settings.json
549
+ echo '# Team Guidelines' > /team/shared-config/AGENT.md
550
+
551
+ # Run GenCode - it will merge team config
552
+ npx gencode
553
+ ```
554
+
555
+ ## Migration from Claude Code
556
+
557
+ GenCode is fully backward compatible with Claude Code:
558
+
559
+ 1. Existing `.claude/` directories work automatically
560
+ 2. `CLAUDE.md` files are loaded alongside `AGENT.md`
561
+ 3. No changes needed for existing Claude Code users
562
+
563
+ To migrate:
564
+ 1. Optionally rename `.claude/` to `.gencode/`
565
+ 2. Optionally rename `CLAUDE.md` to `AGENT.md`
566
+ 3. Or keep both - GenCode will merge them
567
+
568
+ ## API Reference
569
+
570
+ ### ConfigManager
571
+
572
+ ```typescript
573
+ class ConfigManager {
574
+ constructor(options?: { cwd?: string });
575
+
576
+ // Load and merge all config sources
577
+ async load(): Promise<MergedConfig>;
578
+
579
+ // Get merged settings
580
+ get(): Settings;
581
+
582
+ // Save to specific level
583
+ async saveToLevel(updates: Partial<Settings>, level: 'user' | 'project' | 'local'): Promise<void>;
584
+
585
+ // Permission helpers
586
+ isAllowed(pattern: string): boolean;
587
+ shouldAsk(pattern: string): boolean;
588
+ getEffectivePermissions(): PermissionResult;
589
+
590
+ // Debug
591
+ getDebugSummary(): string;
592
+ getSources(): ConfigSource[];
593
+ }
594
+ ```
595
+
596
+ ### MemoryManager
597
+
598
+ ```typescript
599
+ class MemoryManager {
600
+ constructor(config?: Partial<MemoryConfig>);
601
+
602
+ // Load all memory files
603
+ async load(options: MemoryLoadOptions): Promise<LoadedMemory>;
604
+
605
+ // Get loaded memory
606
+ getLoaded(): LoadedMemory | null;
607
+ hasMemory(): boolean;
608
+
609
+ // Debug
610
+ getDebugSummary(): string;
611
+ getLoadedFileList(): MemorySource[];
612
+ }
613
+ ```
614
+
615
+ ## Architecture Diagrams
616
+
617
+ ### Settings Loading Flow
618
+
619
+ ```
620
+ ┌─────────────────┐
621
+ │ Initialize │
622
+ │ settings = {} │
623
+ └────────┬────────┘
624
+
625
+ ╔══════════════════════════════════▼══════════════════════════════════════════╗
626
+ ║ LEVEL 1: USER Settings ║
627
+ ╠═════════════════════════════════════════════════════════════════════════════╣
628
+ ║ claude = load("~/.claude/settings.json") // lower priority ║
629
+ ║ gencode = load("~/.gencode/settings.json") // higher priority ║
630
+ ║ user = deepMerge(claude, gencode) ║
631
+ ╚══════════════════════════════════╤══════════════════════════════════════════╝
632
+
633
+ ╔══════════════════════════════════▼══════════════════════════════════════════╗
634
+ ║ LEVEL 2: EXTRA Config Dirs (GENCODE_CONFIG_DIRS) ║
635
+ ╚══════════════════════════════════╤══════════════════════════════════════════╝
636
+
637
+ ╔══════════════════════════════════▼══════════════════════════════════════════╗
638
+ ║ LEVEL 3: PROJECT Settings ║
639
+ ╠═════════════════════════════════════════════════════════════════════════════╣
640
+ ║ claude = load(".claude/settings.json") // lower priority ║
641
+ ║ gencode = load(".gencode/settings.json") // higher priority ║
642
+ ║ project = deepMerge(claude, gencode) ║
643
+ ╚══════════════════════════════════╤══════════════════════════════════════════╝
644
+
645
+ ╔══════════════════════════════════▼══════════════════════════════════════════╗
646
+ ║ LEVEL 4: LOCAL Settings (*.local.json) ║
647
+ ╚══════════════════════════════════╤══════════════════════════════════════════╝
648
+
649
+ ╔══════════════════════════════════▼══════════════════════════════════════════╗
650
+ ║ LEVEL 5: CLI Arguments ║
651
+ ╚══════════════════════════════════╤══════════════════════════════════════════╝
652
+
653
+ ╔══════════════════════════════════▼══════════════════════════════════════════╗
654
+ ║ LEVEL 6: MANAGED Settings (enforced, cannot be overridden) ║
655
+ ╚══════════════════════════════════╤══════════════════════════════════════════╝
656
+
657
+ ┌────────▼────────┐
658
+ │ Return Final │
659
+ │ Settings │
660
+ └─────────────────┘
661
+ ```
662
+
663
+ ### Memory Loading Flow
664
+
665
+ ```
666
+ ┌─────────────────┐
667
+ │ Initialize │
668
+ │ memories = [] │
669
+ └────────┬────────┘
670
+
671
+ ╔══════════════════════════════════▼══════════════════════════════════════════╗
672
+ ║ 1. ENTERPRISE Memory (enforced) ║
673
+ ║ /Library/.../ClaudeCode/CLAUDE.md → push ║
674
+ ║ /Library/.../GenCode/AGENT.md → push ║
675
+ ╚══════════════════════════════════╤══════════════════════════════════════════╝
676
+
677
+ ╔══════════════════════════════════▼══════════════════════════════════════════╗
678
+ ║ 2. USER Memory ║
679
+ ║ ~/.claude/CLAUDE.md → push ║
680
+ ║ ~/.gencode/AGENT.md → push ║
681
+ ╚══════════════════════════════════╤══════════════════════════════════════════╝
682
+
683
+ ╔══════════════════════════════════▼══════════════════════════════════════════╗
684
+ ║ 3. EXTRA Memory (GENCODE_CONFIG_DIRS) ║
685
+ ╚══════════════════════════════════╤══════════════════════════════════════════╝
686
+
687
+ ╔══════════════════════════════════▼══════════════════════════════════════════╗
688
+ ║ 4. PROJECT Memory ║
689
+ ║ ./CLAUDE.md or .claude/CLAUDE.md → push ║
690
+ ║ ./AGENT.md or .gencode/AGENT.md → push ║
691
+ ╚══════════════════════════════════╤══════════════════════════════════════════╝
692
+
693
+ ╔══════════════════════════════════▼══════════════════════════════════════════╗
694
+ ║ 5. RULES (.claude/rules/ + .gencode/rules/) ║
695
+ ╚══════════════════════════════════╤══════════════════════════════════════════╝
696
+
697
+ ╔══════════════════════════════════▼══════════════════════════════════════════╗
698
+ ║ 6. LOCAL Memory (*.local.md) ║
699
+ ║ ./CLAUDE.local.md → push ║
700
+ ║ ./AGENT.local.md → push ║
701
+ ╚══════════════════════════════════╤══════════════════════════════════════════╝
702
+
703
+ ┌────────▼────────┐
704
+ │ Concatenate all │
705
+ │ memories │
706
+ └─────────────────┘
707
+ ```