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.
- package/.gencode/settings.local.json +7 -0
- package/README.md +11 -11
- package/dist/agent/agent.d.ts +42 -1
- package/dist/agent/agent.d.ts.map +1 -1
- package/dist/agent/agent.js +82 -15
- package/dist/agent/agent.js.map +1 -1
- package/dist/cli/components/App.d.ts +8 -1
- package/dist/cli/components/App.d.ts.map +1 -1
- package/dist/cli/components/App.js +231 -29
- package/dist/cli/components/App.js.map +1 -1
- package/dist/cli/components/CommandSuggestions.d.ts.map +1 -1
- package/dist/cli/components/CommandSuggestions.js +2 -0
- package/dist/cli/components/CommandSuggestions.js.map +1 -1
- package/dist/cli/components/Header.d.ts +1 -1
- package/dist/cli/components/Header.d.ts.map +1 -1
- package/dist/cli/components/Header.js +4 -6
- package/dist/cli/components/Header.js.map +1 -1
- package/dist/cli/components/Logo.d.ts +1 -0
- package/dist/cli/components/Logo.d.ts.map +1 -1
- package/dist/cli/components/Logo.js +16 -3
- package/dist/cli/components/Logo.js.map +1 -1
- package/dist/cli/components/Messages.d.ts +4 -4
- package/dist/cli/components/Messages.d.ts.map +1 -1
- package/dist/cli/components/Messages.js +51 -25
- package/dist/cli/components/Messages.js.map +1 -1
- package/dist/cli/components/PermissionPrompt.d.ts +60 -0
- package/dist/cli/components/PermissionPrompt.d.ts.map +1 -0
- package/dist/cli/components/PermissionPrompt.js +192 -0
- package/dist/cli/components/PermissionPrompt.js.map +1 -0
- package/dist/cli/components/ProviderManager.js +3 -3
- package/dist/cli/components/ProviderManager.js.map +1 -1
- package/dist/cli/components/Spinner.d.ts +7 -2
- package/dist/cli/components/Spinner.d.ts.map +1 -1
- package/dist/cli/components/Spinner.js +116 -25
- package/dist/cli/components/Spinner.js.map +1 -1
- package/dist/cli/components/TodoList.d.ts +7 -0
- package/dist/cli/components/TodoList.d.ts.map +1 -0
- package/dist/cli/components/TodoList.js +34 -0
- package/dist/cli/components/TodoList.js.map +1 -0
- package/dist/cli/components/index.d.ts +1 -0
- package/dist/cli/components/index.d.ts.map +1 -1
- package/dist/cli/components/index.js +1 -0
- package/dist/cli/components/index.js.map +1 -1
- package/dist/cli/index.js +47 -7
- package/dist/cli/index.js.map +1 -1
- package/dist/config/index.d.ts +13 -4
- package/dist/config/index.d.ts.map +1 -1
- package/dist/config/index.js +18 -3
- package/dist/config/index.js.map +1 -1
- package/dist/config/levels.d.ts +49 -0
- package/dist/config/levels.d.ts.map +1 -0
- package/dist/config/levels.js +222 -0
- package/dist/config/levels.js.map +1 -0
- package/dist/config/loader.d.ts +46 -0
- package/dist/config/loader.d.ts.map +1 -0
- package/dist/config/loader.js +153 -0
- package/dist/config/loader.js.map +1 -0
- package/dist/config/manager.d.ts +115 -15
- package/dist/config/manager.d.ts.map +1 -1
- package/dist/config/manager.js +260 -34
- package/dist/config/manager.js.map +1 -1
- package/dist/config/manager.test.d.ts +5 -0
- package/dist/config/manager.test.d.ts.map +1 -0
- package/dist/config/manager.test.js +192 -0
- package/dist/config/manager.test.js.map +1 -0
- package/dist/config/merger.d.ts +56 -0
- package/dist/config/merger.d.ts.map +1 -0
- package/dist/config/merger.js +177 -0
- package/dist/config/merger.js.map +1 -0
- package/dist/config/test-utils.d.ts +24 -0
- package/dist/config/test-utils.d.ts.map +1 -0
- package/dist/config/test-utils.js +55 -0
- package/dist/config/test-utils.js.map +1 -0
- package/dist/config/types.d.ts +78 -9
- package/dist/config/types.d.ts.map +1 -1
- package/dist/config/types.js +52 -2
- package/dist/config/types.js.map +1 -1
- package/dist/memory/import-resolver.d.ts +46 -0
- package/dist/memory/import-resolver.d.ts.map +1 -0
- package/dist/memory/import-resolver.js +117 -0
- package/dist/memory/import-resolver.js.map +1 -0
- package/dist/memory/index.d.ts +7 -6
- package/dist/memory/index.d.ts.map +1 -1
- package/dist/memory/index.js +7 -5
- package/dist/memory/index.js.map +1 -1
- package/dist/memory/init-prompt.d.ts +22 -0
- package/dist/memory/init-prompt.d.ts.map +1 -0
- package/dist/memory/init-prompt.js +103 -0
- package/dist/memory/init-prompt.js.map +1 -0
- package/dist/memory/memory-manager.d.ts +119 -0
- package/dist/memory/memory-manager.d.ts.map +1 -0
- package/dist/memory/memory-manager.js +587 -0
- package/dist/memory/memory-manager.js.map +1 -0
- package/dist/memory/rules-parser.d.ts +38 -0
- package/dist/memory/rules-parser.d.ts.map +1 -0
- package/dist/memory/rules-parser.js +69 -0
- package/dist/memory/rules-parser.js.map +1 -0
- package/dist/memory/test-utils.d.ts +20 -0
- package/dist/memory/test-utils.d.ts.map +1 -0
- package/dist/memory/test-utils.js +44 -0
- package/dist/memory/test-utils.js.map +1 -0
- package/dist/memory/types.d.ts +70 -63
- package/dist/memory/types.d.ts.map +1 -1
- package/dist/memory/types.js +42 -2
- package/dist/memory/types.js.map +1 -1
- package/dist/permissions/audit.d.ts +82 -0
- package/dist/permissions/audit.d.ts.map +1 -0
- package/dist/permissions/audit.js +229 -0
- package/dist/permissions/audit.js.map +1 -0
- package/dist/permissions/index.d.ts +11 -1
- package/dist/permissions/index.d.ts.map +1 -1
- package/dist/permissions/index.js +15 -0
- package/dist/permissions/index.js.map +1 -1
- package/dist/permissions/manager.d.ts +149 -13
- package/dist/permissions/manager.d.ts.map +1 -1
- package/dist/permissions/manager.js +480 -35
- package/dist/permissions/manager.js.map +1 -1
- package/dist/permissions/manager.test.d.ts +5 -0
- package/dist/permissions/manager.test.d.ts.map +1 -0
- package/dist/permissions/manager.test.js +213 -0
- package/dist/permissions/manager.test.js.map +1 -0
- package/dist/permissions/persistence.d.ts +74 -0
- package/dist/permissions/persistence.d.ts.map +1 -0
- package/dist/permissions/persistence.js +248 -0
- package/dist/permissions/persistence.js.map +1 -0
- package/dist/permissions/persistence.test.d.ts +5 -0
- package/dist/permissions/persistence.test.d.ts.map +1 -0
- package/dist/permissions/persistence.test.js +171 -0
- package/dist/permissions/persistence.test.js.map +1 -0
- package/dist/permissions/prompt-matcher.d.ts +64 -0
- package/dist/permissions/prompt-matcher.d.ts.map +1 -0
- package/dist/permissions/prompt-matcher.js +415 -0
- package/dist/permissions/prompt-matcher.js.map +1 -0
- package/dist/permissions/prompt-matcher.test.d.ts +5 -0
- package/dist/permissions/prompt-matcher.test.d.ts.map +1 -0
- package/dist/permissions/prompt-matcher.test.js +107 -0
- package/dist/permissions/prompt-matcher.test.js.map +1 -0
- package/dist/permissions/types.d.ts +157 -0
- package/dist/permissions/types.d.ts.map +1 -1
- package/dist/permissions/types.js +43 -8
- package/dist/permissions/types.js.map +1 -1
- package/dist/prompts/index.d.ts +92 -0
- package/dist/prompts/index.d.ts.map +1 -0
- package/dist/prompts/index.js +241 -0
- package/dist/prompts/index.js.map +1 -0
- package/dist/tools/builtin/bash.d.ts.map +1 -1
- package/dist/tools/builtin/bash.js +2 -1
- package/dist/tools/builtin/bash.js.map +1 -1
- package/dist/tools/builtin/edit.d.ts.map +1 -1
- package/dist/tools/builtin/edit.js +2 -1
- package/dist/tools/builtin/edit.js.map +1 -1
- package/dist/tools/builtin/glob.d.ts.map +1 -1
- package/dist/tools/builtin/glob.js +2 -1
- package/dist/tools/builtin/glob.js.map +1 -1
- package/dist/tools/builtin/grep.d.ts.map +1 -1
- package/dist/tools/builtin/grep.js +2 -1
- package/dist/tools/builtin/grep.js.map +1 -1
- package/dist/tools/builtin/read.d.ts.map +1 -1
- package/dist/tools/builtin/read.js +2 -1
- package/dist/tools/builtin/read.js.map +1 -1
- package/dist/tools/builtin/todowrite.d.ts +15 -0
- package/dist/tools/builtin/todowrite.d.ts.map +1 -0
- package/dist/tools/builtin/todowrite.js +88 -0
- package/dist/tools/builtin/todowrite.js.map +1 -0
- package/dist/tools/builtin/webfetch.d.ts.map +1 -1
- package/dist/tools/builtin/webfetch.js +2 -5
- package/dist/tools/builtin/webfetch.js.map +1 -1
- package/dist/tools/builtin/websearch.d.ts.map +1 -1
- package/dist/tools/builtin/websearch.js +2 -16
- package/dist/tools/builtin/websearch.js.map +1 -1
- package/dist/tools/builtin/write.d.ts.map +1 -1
- package/dist/tools/builtin/write.js +2 -1
- package/dist/tools/builtin/write.js.map +1 -1
- package/dist/tools/index.d.ts +7 -0
- package/dist/tools/index.d.ts.map +1 -1
- package/dist/tools/index.js +4 -0
- package/dist/tools/index.js.map +1 -1
- package/dist/tools/types.d.ts +22 -0
- package/dist/tools/types.d.ts.map +1 -1
- package/dist/tools/types.js +8 -0
- package/dist/tools/types.js.map +1 -1
- package/docs/config-system-comparison.md +707 -0
- package/docs/memory-system.md +238 -0
- package/docs/permissions.md +368 -0
- package/docs/proposals/0005-todo-system.md +350 -85
- package/docs/proposals/0006-memory-system.md +11 -10
- package/docs/proposals/0012-ask-user-question.md +941 -206
- package/docs/proposals/0023-permission-enhancements.md +61 -2
- package/docs/proposals/0041-configuration-system.md +33 -2
- package/docs/proposals/0042-prompt-optimization.md +866 -0
- package/docs/proposals/README.md +6 -5
- package/jest.config.js +26 -0
- package/package.json +8 -2
- package/src/agent/agent.ts +111 -16
- package/src/cli/components/App.tsx +309 -36
- package/src/cli/components/CommandSuggestions.tsx +2 -0
- package/src/cli/components/Header.tsx +11 -17
- package/src/cli/components/Logo.tsx +76 -9
- package/src/cli/components/Messages.tsx +73 -53
- package/src/cli/components/PermissionPrompt.tsx +388 -0
- package/src/cli/components/ProviderManager.tsx +5 -5
- package/src/cli/components/Spinner.tsx +138 -25
- package/src/cli/components/TodoList.tsx +54 -0
- package/src/cli/components/index.ts +6 -0
- package/src/cli/index.tsx +54 -6
- package/src/config/index.ts +78 -4
- package/src/config/levels.test.ts +163 -0
- package/src/config/levels.ts +285 -0
- package/src/config/loader.test.ts +120 -0
- package/src/config/loader.ts +178 -0
- package/src/config/manager.test.ts +215 -0
- package/src/config/manager.ts +328 -40
- package/src/config/merger.test.ts +360 -0
- package/src/config/merger.ts +221 -0
- package/src/config/test-utils.ts +79 -0
- package/src/config/types.ts +152 -9
- package/src/memory/import-resolver.test.ts +117 -0
- package/src/memory/import-resolver.ts +149 -0
- package/src/memory/index.ts +11 -0
- package/src/memory/init-prompt.ts +113 -0
- package/src/memory/memory-manager.test.ts +198 -0
- package/src/memory/memory-manager.ts +716 -0
- package/src/memory/rules-parser.test.ts +182 -0
- package/src/memory/rules-parser.ts +82 -0
- package/src/memory/test-utils.ts +60 -0
- package/src/memory/types.ts +119 -0
- package/src/permissions/audit.ts +284 -0
- package/src/permissions/index.ts +20 -1
- package/src/permissions/manager.test.ts +260 -0
- package/src/permissions/manager.ts +592 -40
- package/src/permissions/persistence.test.ts +220 -0
- package/src/permissions/persistence.ts +301 -0
- package/src/permissions/prompt-matcher.test.ts +213 -0
- package/src/permissions/prompt-matcher.ts +472 -0
- package/src/permissions/types.ts +236 -8
- package/src/prompts/index.test.ts +279 -0
- package/src/prompts/index.ts +306 -0
- package/src/prompts/system/anthropic.txt +29 -0
- package/src/prompts/system/base.txt +124 -0
- package/src/prompts/system/gemini.txt +35 -0
- package/src/prompts/system/generic.txt +128 -0
- package/src/prompts/system/openai.txt +29 -0
- package/src/prompts/tools/bash.txt +60 -0
- package/src/prompts/tools/edit.txt +29 -0
- package/src/prompts/tools/glob.txt +35 -0
- package/src/prompts/tools/grep.txt +43 -0
- package/src/prompts/tools/read.txt +22 -0
- package/src/prompts/tools/todowrite.txt +71 -0
- package/src/prompts/tools/webfetch.txt +34 -0
- package/src/prompts/tools/websearch.txt +41 -0
- package/src/prompts/tools/write.txt +23 -0
- package/src/tools/builtin/bash.ts +2 -1
- package/src/tools/builtin/edit.ts +2 -1
- package/src/tools/builtin/glob.ts +2 -1
- package/src/tools/builtin/grep.ts +2 -1
- package/src/tools/builtin/read.ts +2 -1
- package/src/tools/builtin/todowrite.ts +102 -0
- package/src/tools/builtin/webfetch.ts +2 -5
- package/src/tools/builtin/websearch.ts +2 -16
- package/src/tools/builtin/write.ts +2 -1
- package/src/tools/index.ts +4 -0
- package/src/tools/types.ts +12 -0
- 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
|
+
```
|