gencode-ai 0.1.1 → 0.1.3
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/CLAUDE.md +86 -0
- package/README.md +13 -16
- package/dist/agent/agent.d.ts +50 -1
- package/dist/agent/agent.d.ts.map +1 -1
- package/dist/agent/agent.js +96 -16
- package/dist/agent/agent.js.map +1 -1
- package/dist/agent/index.d.ts +1 -0
- package/dist/agent/index.d.ts.map +1 -1
- package/dist/agent/types.d.ts +14 -1
- package/dist/agent/types.d.ts.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 +266 -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 +66 -23
- 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/QuestionPrompt.d.ts +23 -0
- package/dist/cli/components/QuestionPrompt.d.ts.map +1 -0
- package/dist/cli/components/QuestionPrompt.js +231 -0
- package/dist/cli/components/QuestionPrompt.js.map +1 -0
- 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 +2 -0
- package/dist/cli/components/index.d.ts.map +1 -1
- package/dist/cli/components/index.js +2 -0
- package/dist/cli/components/index.js.map +1 -1
- package/dist/cli/components/theme.d.ts +7 -0
- package/dist/cli/components/theme.d.ts.map +1 -1
- package/dist/cli/components/theme.js +11 -1
- package/dist/cli/components/theme.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 +45 -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/ask-user.d.ts +64 -0
- package/dist/tools/builtin/ask-user.d.ts.map +1 -0
- package/dist/tools/builtin/ask-user.js +148 -0
- package/dist/tools/builtin/ask-user.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 +19 -0
- package/dist/tools/index.d.ts.map +1 -1
- package/dist/tools/index.js +8 -0
- package/dist/tools/index.js.map +1 -1
- package/dist/tools/types.d.ts +39 -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 +1007 -207
- 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 +7 -6
- package/examples/test-ask-user.ts +167 -0
- package/jest.config.js +26 -0
- package/package.json +8 -2
- package/src/agent/agent.ts +130 -16
- package/src/agent/index.ts +1 -0
- package/src/agent/types.ts +13 -1
- package/src/cli/components/App.tsx +362 -37
- 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 +104 -41
- package/src/cli/components/PermissionPrompt.tsx +388 -0
- package/src/cli/components/ProviderManager.tsx +5 -5
- package/src/cli/components/QuestionPrompt.tsx +462 -0
- package/src/cli/components/Spinner.tsx +138 -25
- package/src/cli/components/TodoList.tsx +54 -0
- package/src/cli/components/index.ts +7 -0
- package/src/cli/components/theme.ts +11 -1
- 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 +238 -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 +166 -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/ask-user.txt +110 -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/ask-user.ts +185 -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 +19 -0
- package/src/tools/types.ts +30 -0
- package/tsconfig.json +1 -1
|
@@ -0,0 +1,153 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Configuration Loader - Load settings from various sources
|
|
3
|
+
*
|
|
4
|
+
* Loads configuration files from all levels and namespaces.
|
|
5
|
+
* Each level loads both .gencode and .claude directories.
|
|
6
|
+
*/
|
|
7
|
+
import * as fs from 'fs/promises';
|
|
8
|
+
import { getConfigLevels } from './levels.js';
|
|
9
|
+
/**
|
|
10
|
+
* Load a single JSON settings file
|
|
11
|
+
*/
|
|
12
|
+
async function loadJsonFile(filePath) {
|
|
13
|
+
try {
|
|
14
|
+
const content = await fs.readFile(filePath, 'utf-8');
|
|
15
|
+
return JSON.parse(content);
|
|
16
|
+
}
|
|
17
|
+
catch {
|
|
18
|
+
return null;
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* Load settings from a specific path info
|
|
23
|
+
*/
|
|
24
|
+
async function loadFromPathInfo(pathInfo, levelType) {
|
|
25
|
+
const settings = await loadJsonFile(pathInfo.settingsPath);
|
|
26
|
+
if (!settings)
|
|
27
|
+
return null;
|
|
28
|
+
return {
|
|
29
|
+
level: levelType,
|
|
30
|
+
path: pathInfo.settingsPath,
|
|
31
|
+
namespace: pathInfo.namespace,
|
|
32
|
+
settings,
|
|
33
|
+
};
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* Load all configuration sources in order
|
|
37
|
+
*
|
|
38
|
+
* Returns an array of ConfigSource in priority order (lowest first).
|
|
39
|
+
* Within each level:
|
|
40
|
+
* - .claude is loaded first (lower priority)
|
|
41
|
+
* - .gencode is loaded second (higher priority)
|
|
42
|
+
*
|
|
43
|
+
* This allows proper merging where:
|
|
44
|
+
* - Later sources override earlier ones
|
|
45
|
+
* - GenCode settings override Claude settings at the same level
|
|
46
|
+
*/
|
|
47
|
+
export async function loadAllSources(cwd) {
|
|
48
|
+
const levels = await getConfigLevels(cwd);
|
|
49
|
+
const sources = [];
|
|
50
|
+
for (const level of levels) {
|
|
51
|
+
// Load from each path in the level (claude first, then gencode)
|
|
52
|
+
for (const pathInfo of level.paths) {
|
|
53
|
+
const source = await loadFromPathInfo(pathInfo, level.type);
|
|
54
|
+
if (source) {
|
|
55
|
+
sources.push(source);
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
return sources;
|
|
60
|
+
}
|
|
61
|
+
/**
|
|
62
|
+
* Load configuration sources grouped by level
|
|
63
|
+
*/
|
|
64
|
+
export async function loadSourcesByLevel(cwd) {
|
|
65
|
+
const levels = await getConfigLevels(cwd);
|
|
66
|
+
const sourcesByLevel = new Map();
|
|
67
|
+
for (const level of levels) {
|
|
68
|
+
const levelSources = [];
|
|
69
|
+
for (const pathInfo of level.paths) {
|
|
70
|
+
const source = await loadFromPathInfo(pathInfo, level.type);
|
|
71
|
+
if (source) {
|
|
72
|
+
levelSources.push(source);
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
if (levelSources.length > 0) {
|
|
76
|
+
sourcesByLevel.set(level.type, levelSources);
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
return sourcesByLevel;
|
|
80
|
+
}
|
|
81
|
+
/**
|
|
82
|
+
* Load only user-level settings
|
|
83
|
+
*/
|
|
84
|
+
export async function loadUserSettings(cwd) {
|
|
85
|
+
const levels = await getConfigLevels(cwd);
|
|
86
|
+
const userLevel = levels.find((l) => l.type === 'user');
|
|
87
|
+
if (!userLevel)
|
|
88
|
+
return [];
|
|
89
|
+
const sources = [];
|
|
90
|
+
for (const pathInfo of userLevel.paths) {
|
|
91
|
+
const source = await loadFromPathInfo(pathInfo, 'user');
|
|
92
|
+
if (source) {
|
|
93
|
+
sources.push(source);
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
return sources;
|
|
97
|
+
}
|
|
98
|
+
/**
|
|
99
|
+
* Load only project-level settings
|
|
100
|
+
*/
|
|
101
|
+
export async function loadProjectSettings(cwd) {
|
|
102
|
+
const levels = await getConfigLevels(cwd);
|
|
103
|
+
const projectLevel = levels.find((l) => l.type === 'project');
|
|
104
|
+
if (!projectLevel)
|
|
105
|
+
return [];
|
|
106
|
+
const sources = [];
|
|
107
|
+
for (const pathInfo of projectLevel.paths) {
|
|
108
|
+
const source = await loadFromPathInfo(pathInfo, 'project');
|
|
109
|
+
if (source) {
|
|
110
|
+
sources.push(source);
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
return sources;
|
|
114
|
+
}
|
|
115
|
+
/**
|
|
116
|
+
* Load only managed settings
|
|
117
|
+
*/
|
|
118
|
+
export async function loadManagedSettings(cwd) {
|
|
119
|
+
const levels = await getConfigLevels(cwd);
|
|
120
|
+
const managedLevel = levels.find((l) => l.type === 'managed');
|
|
121
|
+
if (!managedLevel)
|
|
122
|
+
return [];
|
|
123
|
+
const sources = [];
|
|
124
|
+
for (const pathInfo of managedLevel.paths) {
|
|
125
|
+
const source = await loadFromPathInfo(pathInfo, 'managed');
|
|
126
|
+
if (source) {
|
|
127
|
+
sources.push(source);
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
return sources;
|
|
131
|
+
}
|
|
132
|
+
/**
|
|
133
|
+
* Get information about all configuration levels
|
|
134
|
+
*/
|
|
135
|
+
export async function getConfigInfo(cwd) {
|
|
136
|
+
return getConfigLevels(cwd);
|
|
137
|
+
}
|
|
138
|
+
/**
|
|
139
|
+
* Check which config files exist
|
|
140
|
+
*/
|
|
141
|
+
export async function getExistingConfigFiles(cwd) {
|
|
142
|
+
const levels = await getConfigLevels(cwd);
|
|
143
|
+
const existingFiles = [];
|
|
144
|
+
for (const level of levels) {
|
|
145
|
+
for (const pathInfo of level.paths) {
|
|
146
|
+
if (pathInfo.exists) {
|
|
147
|
+
existingFiles.push(pathInfo.settingsPath);
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
return existingFiles;
|
|
152
|
+
}
|
|
153
|
+
//# sourceMappingURL=loader.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"loader.js","sourceRoot":"","sources":["../../src/config/loader.ts"],"names":[],"mappings":"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"}
|
package/dist/config/manager.d.ts
CHANGED
|
@@ -1,31 +1,131 @@
|
|
|
1
1
|
/**
|
|
2
|
-
*
|
|
2
|
+
* Configuration Manager - Unified multi-level configuration (Claude Code compatible)
|
|
3
|
+
*
|
|
4
|
+
* Configuration hierarchy (merged in order, later overrides earlier):
|
|
5
|
+
* 1. User: ~/.claude/ + ~/.gencode/ (gencode wins within level)
|
|
6
|
+
* 2. Extra: GENCODE_CONFIG_DIRS directories
|
|
7
|
+
* 3. Project: .claude/ + .gencode/ (gencode wins within level)
|
|
8
|
+
* 4. Local: *.local.* files (gencode wins within level)
|
|
9
|
+
* 5. CLI: Command line arguments
|
|
10
|
+
* 6. Managed: System-wide enforced settings (cannot be overridden)
|
|
11
|
+
*
|
|
12
|
+
* Within each level, both .claude and .gencode directories are loaded and merged,
|
|
13
|
+
* with .gencode taking higher priority.
|
|
3
14
|
*/
|
|
4
|
-
import type { Settings, SettingsManagerOptions } from './types.js';
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
15
|
+
import type { Settings, MergedConfig, ConfigSource, SettingsManagerOptions } from './types.js';
|
|
16
|
+
/**
|
|
17
|
+
* Configuration Manager
|
|
18
|
+
*
|
|
19
|
+
* Manages multi-level configuration loading, merging, and persistence.
|
|
20
|
+
* Compatible with both GenCode (.gencode/) and Claude Code (.claude/) directories.
|
|
21
|
+
*/
|
|
22
|
+
export declare class ConfigManager {
|
|
23
|
+
private cwd;
|
|
24
|
+
private projectRoot;
|
|
25
|
+
private mergedConfig;
|
|
26
|
+
private cliArgs;
|
|
27
|
+
constructor(options?: {
|
|
28
|
+
cwd?: string;
|
|
29
|
+
});
|
|
10
30
|
/**
|
|
11
|
-
*
|
|
31
|
+
* Load and merge all configuration sources
|
|
12
32
|
*/
|
|
13
|
-
|
|
33
|
+
load(): Promise<MergedConfig>;
|
|
14
34
|
/**
|
|
15
|
-
*
|
|
35
|
+
* Set CLI argument overrides
|
|
16
36
|
*/
|
|
17
|
-
|
|
37
|
+
setCliArgs(args: Partial<Settings>): void;
|
|
38
|
+
/**
|
|
39
|
+
* Get the current merged settings
|
|
40
|
+
*/
|
|
41
|
+
get(): Settings;
|
|
42
|
+
/**
|
|
43
|
+
* Get the full merged config with sources info
|
|
44
|
+
*/
|
|
45
|
+
getMergedConfig(): MergedConfig | null;
|
|
46
|
+
/**
|
|
47
|
+
* Get all loaded sources
|
|
48
|
+
*/
|
|
49
|
+
getSources(): ConfigSource[];
|
|
50
|
+
/**
|
|
51
|
+
* Get managed deny rules
|
|
52
|
+
*/
|
|
53
|
+
getManagedDeny(): string[];
|
|
54
|
+
/**
|
|
55
|
+
* Save settings to a specific level
|
|
56
|
+
*/
|
|
57
|
+
saveToLevel(updates: Partial<Settings>, level: 'user' | 'project' | 'local'): Promise<void>;
|
|
18
58
|
/**
|
|
19
|
-
* Save
|
|
59
|
+
* Save to global user settings (default)
|
|
20
60
|
*/
|
|
21
61
|
save(updates: Partial<Settings>): Promise<void>;
|
|
22
62
|
/**
|
|
23
|
-
*
|
|
63
|
+
* Add a permission rule
|
|
24
64
|
*/
|
|
25
|
-
|
|
65
|
+
addPermissionRule(pattern: string, type: 'allow' | 'deny' | 'ask', level?: 'user' | 'project' | 'local'): Promise<void>;
|
|
66
|
+
/**
|
|
67
|
+
* Get existing config files
|
|
68
|
+
*/
|
|
69
|
+
getExistingFiles(): Promise<string[]>;
|
|
70
|
+
/**
|
|
71
|
+
* Get debug summary of configuration
|
|
72
|
+
*/
|
|
73
|
+
getDebugSummary(): string;
|
|
26
74
|
/**
|
|
27
|
-
* Get
|
|
75
|
+
* Get the project root directory
|
|
28
76
|
*/
|
|
77
|
+
getProjectRoot(): string;
|
|
78
|
+
/**
|
|
79
|
+
* Get the current working directory
|
|
80
|
+
*/
|
|
81
|
+
getCwd(): string;
|
|
82
|
+
/**
|
|
83
|
+
* Get the primary settings file path for a level
|
|
84
|
+
*/
|
|
85
|
+
getSettingsPath(level?: 'user' | 'project' | 'local'): string;
|
|
86
|
+
/**
|
|
87
|
+
* Get effective permissions (merged from all sources)
|
|
88
|
+
*/
|
|
89
|
+
getEffectivePermissions(): {
|
|
90
|
+
allow: string[];
|
|
91
|
+
ask: string[];
|
|
92
|
+
deny: string[];
|
|
93
|
+
managedDeny: string[];
|
|
94
|
+
};
|
|
95
|
+
/**
|
|
96
|
+
* Check if a permission pattern is allowed
|
|
97
|
+
*/
|
|
98
|
+
isAllowed(pattern: string): boolean;
|
|
99
|
+
/**
|
|
100
|
+
* Check if a permission pattern requires asking
|
|
101
|
+
*/
|
|
102
|
+
shouldAsk(pattern: string): boolean;
|
|
103
|
+
/**
|
|
104
|
+
* Simple pattern matching (supports * and :* wildcards)
|
|
105
|
+
*/
|
|
106
|
+
private matchPattern;
|
|
107
|
+
}
|
|
108
|
+
/**
|
|
109
|
+
* Legacy SettingsManager for backward compatibility
|
|
110
|
+
*
|
|
111
|
+
* @deprecated Use ConfigManager instead
|
|
112
|
+
*/
|
|
113
|
+
export declare class SettingsManager {
|
|
114
|
+
private configManager;
|
|
115
|
+
private globalDir;
|
|
116
|
+
private projectDir;
|
|
117
|
+
constructor(options?: SettingsManagerOptions & {
|
|
118
|
+
cwd?: string;
|
|
119
|
+
});
|
|
120
|
+
load(): Promise<Settings>;
|
|
121
|
+
save(updates: Partial<Settings>): Promise<void>;
|
|
122
|
+
saveToLevel(updates: Partial<Settings>, level: 'global' | 'project' | 'local'): Promise<void>;
|
|
123
|
+
addPermissionRule(pattern: string, type: 'allow' | 'deny', level?: 'global' | 'project' | 'local'): Promise<void>;
|
|
124
|
+
get(): Settings;
|
|
29
125
|
getPath(): string;
|
|
126
|
+
getProjectPath(): string;
|
|
127
|
+
getLocalPath(): string;
|
|
128
|
+
getCwd(): string;
|
|
129
|
+
getProjectDir(): string;
|
|
30
130
|
}
|
|
31
131
|
//# sourceMappingURL=manager.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"manager.d.ts","sourceRoot":"","sources":["../../src/config/manager.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"manager.d.ts","sourceRoot":"","sources":["../../src/config/manager.ts"],"names":[],"mappings":"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"}
|
package/dist/config/manager.js
CHANGED
|
@@ -1,65 +1,291 @@
|
|
|
1
1
|
/**
|
|
2
|
-
*
|
|
2
|
+
* Configuration Manager - Unified multi-level configuration (Claude Code compatible)
|
|
3
|
+
*
|
|
4
|
+
* Configuration hierarchy (merged in order, later overrides earlier):
|
|
5
|
+
* 1. User: ~/.claude/ + ~/.gencode/ (gencode wins within level)
|
|
6
|
+
* 2. Extra: GENCODE_CONFIG_DIRS directories
|
|
7
|
+
* 3. Project: .claude/ + .gencode/ (gencode wins within level)
|
|
8
|
+
* 4. Local: *.local.* files (gencode wins within level)
|
|
9
|
+
* 5. CLI: Command line arguments
|
|
10
|
+
* 6. Managed: System-wide enforced settings (cannot be overridden)
|
|
11
|
+
*
|
|
12
|
+
* Within each level, both .claude and .gencode directories are loaded and merged,
|
|
13
|
+
* with .gencode taking higher priority.
|
|
3
14
|
*/
|
|
4
15
|
import * as fs from 'fs/promises';
|
|
5
16
|
import * as path from 'path';
|
|
6
|
-
import
|
|
7
|
-
import {
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
17
|
+
import { SETTINGS_FILE_NAME, SETTINGS_LOCAL_FILE_NAME } from './types.js';
|
|
18
|
+
import { loadAllSources, getExistingConfigFiles } from './loader.js';
|
|
19
|
+
import { mergeAllSources, mergeWithCliArgs, deepMerge, createMergeSummary } from './merger.js';
|
|
20
|
+
import { findProjectRoot, getPrimarySettingsDir, getSettingsFilePath } from './levels.js';
|
|
21
|
+
/**
|
|
22
|
+
* Configuration Manager
|
|
23
|
+
*
|
|
24
|
+
* Manages multi-level configuration loading, merging, and persistence.
|
|
25
|
+
* Compatible with both GenCode (.gencode/) and Claude Code (.claude/) directories.
|
|
26
|
+
*/
|
|
27
|
+
export class ConfigManager {
|
|
28
|
+
cwd;
|
|
29
|
+
projectRoot = null;
|
|
30
|
+
mergedConfig = null;
|
|
31
|
+
cliArgs = {};
|
|
12
32
|
constructor(options = {}) {
|
|
13
|
-
|
|
14
|
-
this.settingsDir = dir.replace('~', os.homedir());
|
|
15
|
-
this.settingsPath = path.join(this.settingsDir, SETTINGS_FILE_NAME);
|
|
33
|
+
this.cwd = options.cwd ?? process.cwd();
|
|
16
34
|
}
|
|
17
35
|
/**
|
|
18
|
-
*
|
|
36
|
+
* Load and merge all configuration sources
|
|
19
37
|
*/
|
|
20
|
-
async
|
|
21
|
-
|
|
22
|
-
|
|
38
|
+
async load() {
|
|
39
|
+
// Find project root
|
|
40
|
+
this.projectRoot = await findProjectRoot(this.cwd);
|
|
41
|
+
// Load all sources
|
|
42
|
+
const sources = await loadAllSources(this.cwd);
|
|
43
|
+
// Merge all sources
|
|
44
|
+
let merged = mergeAllSources(sources);
|
|
45
|
+
// Apply CLI arguments if any
|
|
46
|
+
if (Object.keys(this.cliArgs).length > 0) {
|
|
47
|
+
merged = mergeWithCliArgs(merged, this.cliArgs);
|
|
23
48
|
}
|
|
24
|
-
|
|
25
|
-
|
|
49
|
+
this.mergedConfig = merged;
|
|
50
|
+
return merged;
|
|
51
|
+
}
|
|
52
|
+
/**
|
|
53
|
+
* Set CLI argument overrides
|
|
54
|
+
*/
|
|
55
|
+
setCliArgs(args) {
|
|
56
|
+
this.cliArgs = args;
|
|
57
|
+
}
|
|
58
|
+
/**
|
|
59
|
+
* Get the current merged settings
|
|
60
|
+
*/
|
|
61
|
+
get() {
|
|
62
|
+
if (!this.mergedConfig) {
|
|
63
|
+
return {};
|
|
26
64
|
}
|
|
65
|
+
return { ...this.mergedConfig.settings };
|
|
27
66
|
}
|
|
28
67
|
/**
|
|
29
|
-
*
|
|
68
|
+
* Get the full merged config with sources info
|
|
30
69
|
*/
|
|
31
|
-
|
|
70
|
+
getMergedConfig() {
|
|
71
|
+
return this.mergedConfig;
|
|
72
|
+
}
|
|
73
|
+
/**
|
|
74
|
+
* Get all loaded sources
|
|
75
|
+
*/
|
|
76
|
+
getSources() {
|
|
77
|
+
return this.mergedConfig?.sources ?? [];
|
|
78
|
+
}
|
|
79
|
+
/**
|
|
80
|
+
* Get managed deny rules
|
|
81
|
+
*/
|
|
82
|
+
getManagedDeny() {
|
|
83
|
+
return this.mergedConfig?.managedDeny ?? [];
|
|
84
|
+
}
|
|
85
|
+
/**
|
|
86
|
+
* Save settings to a specific level
|
|
87
|
+
*/
|
|
88
|
+
async saveToLevel(updates, level) {
|
|
89
|
+
if (!this.projectRoot) {
|
|
90
|
+
this.projectRoot = await findProjectRoot(this.cwd);
|
|
91
|
+
}
|
|
92
|
+
const dir = getPrimarySettingsDir(level, this.projectRoot);
|
|
93
|
+
const fileName = level === 'local' ? SETTINGS_LOCAL_FILE_NAME : SETTINGS_FILE_NAME;
|
|
94
|
+
const filePath = path.join(dir, fileName);
|
|
95
|
+
// Ensure directory exists
|
|
96
|
+
await fs.mkdir(dir, { recursive: true });
|
|
97
|
+
// Load existing settings for this level
|
|
98
|
+
let existing = {};
|
|
32
99
|
try {
|
|
33
|
-
const content = await fs.readFile(
|
|
34
|
-
|
|
35
|
-
return this.settings;
|
|
100
|
+
const content = await fs.readFile(filePath, 'utf-8');
|
|
101
|
+
existing = JSON.parse(content);
|
|
36
102
|
}
|
|
37
103
|
catch {
|
|
38
|
-
// File doesn't exist
|
|
39
|
-
this.settings = {};
|
|
40
|
-
return this.settings;
|
|
104
|
+
// File doesn't exist, start fresh
|
|
41
105
|
}
|
|
106
|
+
// Merge updates into existing
|
|
107
|
+
const merged = deepMerge(existing, updates);
|
|
108
|
+
// Write back
|
|
109
|
+
await fs.writeFile(filePath, JSON.stringify(merged, null, 2), 'utf-8');
|
|
110
|
+
// Reload configuration
|
|
111
|
+
await this.load();
|
|
42
112
|
}
|
|
43
113
|
/**
|
|
44
|
-
* Save
|
|
114
|
+
* Save to global user settings (default)
|
|
45
115
|
*/
|
|
46
116
|
async save(updates) {
|
|
47
|
-
await this.
|
|
48
|
-
// Merge updates with existing settings
|
|
49
|
-
this.settings = { ...this.settings, ...updates };
|
|
50
|
-
await fs.writeFile(this.settingsPath, JSON.stringify(this.settings, null, 2), 'utf-8');
|
|
117
|
+
await this.saveToLevel(updates, 'user');
|
|
51
118
|
}
|
|
52
119
|
/**
|
|
53
|
-
*
|
|
120
|
+
* Add a permission rule
|
|
54
121
|
*/
|
|
55
|
-
|
|
56
|
-
|
|
122
|
+
async addPermissionRule(pattern, type, level = 'project') {
|
|
123
|
+
const updates = {
|
|
124
|
+
permissions: {
|
|
125
|
+
[type]: [pattern],
|
|
126
|
+
},
|
|
127
|
+
};
|
|
128
|
+
await this.saveToLevel(updates, level);
|
|
57
129
|
}
|
|
58
130
|
/**
|
|
59
|
-
* Get
|
|
131
|
+
* Get existing config files
|
|
60
132
|
*/
|
|
133
|
+
async getExistingFiles() {
|
|
134
|
+
return getExistingConfigFiles(this.cwd);
|
|
135
|
+
}
|
|
136
|
+
/**
|
|
137
|
+
* Get debug summary of configuration
|
|
138
|
+
*/
|
|
139
|
+
getDebugSummary() {
|
|
140
|
+
if (!this.mergedConfig) {
|
|
141
|
+
return 'Configuration not loaded';
|
|
142
|
+
}
|
|
143
|
+
return createMergeSummary(this.mergedConfig);
|
|
144
|
+
}
|
|
145
|
+
/**
|
|
146
|
+
* Get the project root directory
|
|
147
|
+
*/
|
|
148
|
+
getProjectRoot() {
|
|
149
|
+
return this.projectRoot ?? this.cwd;
|
|
150
|
+
}
|
|
151
|
+
/**
|
|
152
|
+
* Get the current working directory
|
|
153
|
+
*/
|
|
154
|
+
getCwd() {
|
|
155
|
+
return this.cwd;
|
|
156
|
+
}
|
|
157
|
+
/**
|
|
158
|
+
* Get the primary settings file path for a level
|
|
159
|
+
*/
|
|
160
|
+
getSettingsPath(level = 'user') {
|
|
161
|
+
const projectRoot = this.projectRoot ?? this.cwd;
|
|
162
|
+
return getSettingsFilePath(level, projectRoot);
|
|
163
|
+
}
|
|
164
|
+
/**
|
|
165
|
+
* Get effective permissions (merged from all sources)
|
|
166
|
+
*/
|
|
167
|
+
getEffectivePermissions() {
|
|
168
|
+
const settings = this.get();
|
|
169
|
+
const permissions = settings.permissions ?? {};
|
|
170
|
+
return {
|
|
171
|
+
allow: permissions.allow ?? [],
|
|
172
|
+
ask: permissions.ask ?? [],
|
|
173
|
+
deny: permissions.deny ?? [],
|
|
174
|
+
managedDeny: this.getManagedDeny(),
|
|
175
|
+
};
|
|
176
|
+
}
|
|
177
|
+
/**
|
|
178
|
+
* Check if a permission pattern is allowed
|
|
179
|
+
*/
|
|
180
|
+
isAllowed(pattern) {
|
|
181
|
+
const { allow, deny, managedDeny } = this.getEffectivePermissions();
|
|
182
|
+
// Managed deny always wins
|
|
183
|
+
if (managedDeny.some((p) => this.matchPattern(pattern, p))) {
|
|
184
|
+
return false;
|
|
185
|
+
}
|
|
186
|
+
// Check deny list
|
|
187
|
+
if (deny.some((p) => this.matchPattern(pattern, p))) {
|
|
188
|
+
return false;
|
|
189
|
+
}
|
|
190
|
+
// Check allow list
|
|
191
|
+
return allow.some((p) => this.matchPattern(pattern, p));
|
|
192
|
+
}
|
|
193
|
+
/**
|
|
194
|
+
* Check if a permission pattern requires asking
|
|
195
|
+
*/
|
|
196
|
+
shouldAsk(pattern) {
|
|
197
|
+
const { ask, allow, deny, managedDeny } = this.getEffectivePermissions();
|
|
198
|
+
// Managed deny always wins
|
|
199
|
+
if (managedDeny.some((p) => this.matchPattern(pattern, p))) {
|
|
200
|
+
return false; // Don't ask, just deny
|
|
201
|
+
}
|
|
202
|
+
// If explicitly allowed, don't ask
|
|
203
|
+
if (allow.some((p) => this.matchPattern(pattern, p))) {
|
|
204
|
+
return false;
|
|
205
|
+
}
|
|
206
|
+
// If explicitly denied, don't ask
|
|
207
|
+
if (deny.some((p) => this.matchPattern(pattern, p))) {
|
|
208
|
+
return false;
|
|
209
|
+
}
|
|
210
|
+
// Check ask list
|
|
211
|
+
if (ask.some((p) => this.matchPattern(pattern, p))) {
|
|
212
|
+
return true;
|
|
213
|
+
}
|
|
214
|
+
// Default: ask for unknown patterns
|
|
215
|
+
return true;
|
|
216
|
+
}
|
|
217
|
+
/**
|
|
218
|
+
* Simple pattern matching (supports * and :* wildcards)
|
|
219
|
+
*/
|
|
220
|
+
matchPattern(value, pattern) {
|
|
221
|
+
// Exact match
|
|
222
|
+
if (value === pattern)
|
|
223
|
+
return true;
|
|
224
|
+
// Handle :* suffix (e.g., "Bash(git:*)" matches "Bash(git:status)")
|
|
225
|
+
if (pattern.endsWith(':*)')) {
|
|
226
|
+
const prefix = pattern.slice(0, -3); // Remove ":*)"
|
|
227
|
+
const valuePrefix = value.slice(0, value.lastIndexOf(':'));
|
|
228
|
+
return valuePrefix.startsWith(prefix);
|
|
229
|
+
}
|
|
230
|
+
// Handle * wildcards
|
|
231
|
+
if (pattern.includes('*')) {
|
|
232
|
+
const regex = new RegExp('^' + pattern.replace(/\*/g, '.*') + '$');
|
|
233
|
+
return regex.test(value);
|
|
234
|
+
}
|
|
235
|
+
return false;
|
|
236
|
+
}
|
|
237
|
+
}
|
|
238
|
+
// =============================================================================
|
|
239
|
+
// Legacy SettingsManager (backward compatibility)
|
|
240
|
+
// =============================================================================
|
|
241
|
+
/**
|
|
242
|
+
* Legacy SettingsManager for backward compatibility
|
|
243
|
+
*
|
|
244
|
+
* @deprecated Use ConfigManager instead
|
|
245
|
+
*/
|
|
246
|
+
export class SettingsManager {
|
|
247
|
+
configManager;
|
|
248
|
+
globalDir;
|
|
249
|
+
projectDir;
|
|
250
|
+
constructor(options = {}) {
|
|
251
|
+
this.configManager = new ConfigManager({ cwd: options.cwd });
|
|
252
|
+
// For legacy compatibility
|
|
253
|
+
const cwd = options.cwd ?? process.cwd();
|
|
254
|
+
this.globalDir = options.settingsDir ?? getPrimarySettingsDir('user', cwd);
|
|
255
|
+
this.projectDir = getPrimarySettingsDir('project', cwd);
|
|
256
|
+
}
|
|
257
|
+
async load() {
|
|
258
|
+
const merged = await this.configManager.load();
|
|
259
|
+
return merged.settings;
|
|
260
|
+
}
|
|
261
|
+
async save(updates) {
|
|
262
|
+
await this.configManager.save(updates);
|
|
263
|
+
}
|
|
264
|
+
async saveToLevel(updates, level) {
|
|
265
|
+
const mappedLevel = level === 'global' ? 'user' : level;
|
|
266
|
+
await this.configManager.saveToLevel(updates, mappedLevel);
|
|
267
|
+
}
|
|
268
|
+
async addPermissionRule(pattern, type, level = 'project') {
|
|
269
|
+
const mappedLevel = level === 'global' ? 'user' : level;
|
|
270
|
+
await this.configManager.addPermissionRule(pattern, type, mappedLevel);
|
|
271
|
+
}
|
|
272
|
+
get() {
|
|
273
|
+
return this.configManager.get();
|
|
274
|
+
}
|
|
61
275
|
getPath() {
|
|
62
|
-
return this.
|
|
276
|
+
return this.configManager.getSettingsPath('user');
|
|
277
|
+
}
|
|
278
|
+
getProjectPath() {
|
|
279
|
+
return this.configManager.getSettingsPath('project');
|
|
280
|
+
}
|
|
281
|
+
getLocalPath() {
|
|
282
|
+
return this.configManager.getSettingsPath('local');
|
|
283
|
+
}
|
|
284
|
+
getCwd() {
|
|
285
|
+
return this.configManager.getCwd();
|
|
286
|
+
}
|
|
287
|
+
getProjectDir() {
|
|
288
|
+
return this.projectDir;
|
|
63
289
|
}
|
|
64
290
|
}
|
|
65
291
|
//# sourceMappingURL=manager.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"manager.js","sourceRoot":"","sources":["../../src/config/manager.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"manager.js","sourceRoot":"","sources":["../../src/config/manager.ts"],"names":[],"mappings":"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"}
|