popeye-cli 1.0.0
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/.env.example +25 -0
- package/.prettierrc +8 -0
- package/README.md +320 -0
- package/dist/adapters/claude.d.ts +82 -0
- package/dist/adapters/claude.d.ts.map +1 -0
- package/dist/adapters/claude.js +230 -0
- package/dist/adapters/claude.js.map +1 -0
- package/dist/adapters/openai.d.ts +48 -0
- package/dist/adapters/openai.d.ts.map +1 -0
- package/dist/adapters/openai.js +257 -0
- package/dist/adapters/openai.js.map +1 -0
- package/dist/auth/claude.d.ts +44 -0
- package/dist/auth/claude.d.ts.map +1 -0
- package/dist/auth/claude.js +139 -0
- package/dist/auth/claude.js.map +1 -0
- package/dist/auth/index.d.ts +61 -0
- package/dist/auth/index.d.ts.map +1 -0
- package/dist/auth/index.js +141 -0
- package/dist/auth/index.js.map +1 -0
- package/dist/auth/keychain.d.ts +66 -0
- package/dist/auth/keychain.d.ts.map +1 -0
- package/dist/auth/keychain.js +125 -0
- package/dist/auth/keychain.js.map +1 -0
- package/dist/auth/openai-entry.d.ts +9 -0
- package/dist/auth/openai-entry.d.ts.map +1 -0
- package/dist/auth/openai-entry.js +410 -0
- package/dist/auth/openai-entry.js.map +1 -0
- package/dist/auth/openai.d.ts +71 -0
- package/dist/auth/openai.d.ts.map +1 -0
- package/dist/auth/openai.js +212 -0
- package/dist/auth/openai.js.map +1 -0
- package/dist/auth/server.d.ts +32 -0
- package/dist/auth/server.d.ts.map +1 -0
- package/dist/auth/server.js +213 -0
- package/dist/auth/server.js.map +1 -0
- package/dist/cli/commands/auth.d.ts +10 -0
- package/dist/cli/commands/auth.d.ts.map +1 -0
- package/dist/cli/commands/auth.js +162 -0
- package/dist/cli/commands/auth.js.map +1 -0
- package/dist/cli/commands/config.d.ts +10 -0
- package/dist/cli/commands/config.d.ts.map +1 -0
- package/dist/cli/commands/config.js +215 -0
- package/dist/cli/commands/config.js.map +1 -0
- package/dist/cli/commands/create.d.ts +10 -0
- package/dist/cli/commands/create.d.ts.map +1 -0
- package/dist/cli/commands/create.js +240 -0
- package/dist/cli/commands/create.js.map +1 -0
- package/dist/cli/commands/index.d.ts +10 -0
- package/dist/cli/commands/index.d.ts.map +1 -0
- package/dist/cli/commands/index.js +10 -0
- package/dist/cli/commands/index.js.map +1 -0
- package/dist/cli/commands/resume.d.ts +18 -0
- package/dist/cli/commands/resume.d.ts.map +1 -0
- package/dist/cli/commands/resume.js +241 -0
- package/dist/cli/commands/resume.js.map +1 -0
- package/dist/cli/commands/status.d.ts +18 -0
- package/dist/cli/commands/status.d.ts.map +1 -0
- package/dist/cli/commands/status.js +154 -0
- package/dist/cli/commands/status.js.map +1 -0
- package/dist/cli/index.d.ts +17 -0
- package/dist/cli/index.d.ts.map +1 -0
- package/dist/cli/index.js +71 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/cli/interactive.d.ts +9 -0
- package/dist/cli/interactive.d.ts.map +1 -0
- package/dist/cli/interactive.js +330 -0
- package/dist/cli/interactive.js.map +1 -0
- package/dist/cli/output.d.ts +182 -0
- package/dist/cli/output.d.ts.map +1 -0
- package/dist/cli/output.js +355 -0
- package/dist/cli/output.js.map +1 -0
- package/dist/config/defaults.d.ts +57 -0
- package/dist/config/defaults.d.ts.map +1 -0
- package/dist/config/defaults.js +103 -0
- package/dist/config/defaults.js.map +1 -0
- package/dist/config/index.d.ts +138 -0
- package/dist/config/index.d.ts.map +1 -0
- package/dist/config/index.js +244 -0
- package/dist/config/index.js.map +1 -0
- package/dist/config/schema.d.ts +220 -0
- package/dist/config/schema.d.ts.map +1 -0
- package/dist/config/schema.js +141 -0
- package/dist/config/schema.js.map +1 -0
- package/dist/generators/index.d.ts +101 -0
- package/dist/generators/index.d.ts.map +1 -0
- package/dist/generators/index.js +200 -0
- package/dist/generators/index.js.map +1 -0
- package/dist/generators/python.d.ts +48 -0
- package/dist/generators/python.d.ts.map +1 -0
- package/dist/generators/python.js +262 -0
- package/dist/generators/python.js.map +1 -0
- package/dist/generators/templates/index.d.ts +6 -0
- package/dist/generators/templates/index.d.ts.map +1 -0
- package/dist/generators/templates/index.js +6 -0
- package/dist/generators/templates/index.js.map +1 -0
- package/dist/generators/templates/python.d.ts +53 -0
- package/dist/generators/templates/python.d.ts.map +1 -0
- package/dist/generators/templates/python.js +454 -0
- package/dist/generators/templates/python.js.map +1 -0
- package/dist/generators/templates/typescript.d.ts +53 -0
- package/dist/generators/templates/typescript.d.ts.map +1 -0
- package/dist/generators/templates/typescript.js +394 -0
- package/dist/generators/templates/typescript.js.map +1 -0
- package/dist/generators/typescript.d.ts +64 -0
- package/dist/generators/typescript.d.ts.map +1 -0
- package/dist/generators/typescript.js +271 -0
- package/dist/generators/typescript.js.map +1 -0
- package/dist/index.d.ts +7 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +12 -0
- package/dist/index.js.map +1 -0
- package/dist/state/index.d.ts +168 -0
- package/dist/state/index.d.ts.map +1 -0
- package/dist/state/index.js +338 -0
- package/dist/state/index.js.map +1 -0
- package/dist/state/persistence.d.ts +91 -0
- package/dist/state/persistence.d.ts.map +1 -0
- package/dist/state/persistence.js +201 -0
- package/dist/state/persistence.js.map +1 -0
- package/dist/types/cli.d.ts +132 -0
- package/dist/types/cli.d.ts.map +1 -0
- package/dist/types/cli.js +17 -0
- package/dist/types/cli.js.map +1 -0
- package/dist/types/consensus.d.ts +111 -0
- package/dist/types/consensus.d.ts.map +1 -0
- package/dist/types/consensus.js +29 -0
- package/dist/types/consensus.js.map +1 -0
- package/dist/types/index.d.ts +9 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +13 -0
- package/dist/types/index.js.map +1 -0
- package/dist/types/project.d.ts +73 -0
- package/dist/types/project.d.ts.map +1 -0
- package/dist/types/project.js +55 -0
- package/dist/types/project.js.map +1 -0
- package/dist/types/workflow.d.ts +236 -0
- package/dist/types/workflow.d.ts.map +1 -0
- package/dist/types/workflow.js +74 -0
- package/dist/types/workflow.js.map +1 -0
- package/dist/workflow/consensus.d.ts +89 -0
- package/dist/workflow/consensus.d.ts.map +1 -0
- package/dist/workflow/consensus.js +220 -0
- package/dist/workflow/consensus.js.map +1 -0
- package/dist/workflow/execution-mode.d.ts +82 -0
- package/dist/workflow/execution-mode.d.ts.map +1 -0
- package/dist/workflow/execution-mode.js +346 -0
- package/dist/workflow/execution-mode.js.map +1 -0
- package/dist/workflow/index.d.ts +110 -0
- package/dist/workflow/index.d.ts.map +1 -0
- package/dist/workflow/index.js +283 -0
- package/dist/workflow/index.js.map +1 -0
- package/dist/workflow/plan-mode.d.ts +83 -0
- package/dist/workflow/plan-mode.d.ts.map +1 -0
- package/dist/workflow/plan-mode.js +241 -0
- package/dist/workflow/plan-mode.js.map +1 -0
- package/dist/workflow/test-runner.d.ts +87 -0
- package/dist/workflow/test-runner.d.ts.map +1 -0
- package/dist/workflow/test-runner.js +273 -0
- package/dist/workflow/test-runner.js.map +1 -0
- package/eslint.config.js +25 -0
- package/package.json +66 -0
- package/src/adapters/claude.ts +298 -0
- package/src/adapters/openai.ts +300 -0
- package/src/auth/claude.ts +166 -0
- package/src/auth/index.ts +171 -0
- package/src/auth/keychain.ts +138 -0
- package/src/auth/openai-entry.ts +410 -0
- package/src/auth/openai.ts +260 -0
- package/src/auth/server.ts +252 -0
- package/src/cli/commands/auth.ts +194 -0
- package/src/cli/commands/config.ts +241 -0
- package/src/cli/commands/create.ts +308 -0
- package/src/cli/commands/index.ts +10 -0
- package/src/cli/commands/resume.ts +304 -0
- package/src/cli/commands/status.ts +189 -0
- package/src/cli/index.ts +90 -0
- package/src/cli/interactive.ts +418 -0
- package/src/cli/output.ts +410 -0
- package/src/config/defaults.ts +114 -0
- package/src/config/index.ts +315 -0
- package/src/config/schema.ts +164 -0
- package/src/generators/index.ts +251 -0
- package/src/generators/python.ts +318 -0
- package/src/generators/templates/index.ts +6 -0
- package/src/generators/templates/python.ts +465 -0
- package/src/generators/templates/typescript.ts +417 -0
- package/src/generators/typescript.ts +340 -0
- package/src/index.ts +13 -0
- package/src/state/index.ts +454 -0
- package/src/state/persistence.ts +230 -0
- package/src/types/cli.ts +146 -0
- package/src/types/consensus.ts +116 -0
- package/src/types/index.ts +64 -0
- package/src/types/project.ts +85 -0
- package/src/types/workflow.ts +149 -0
- package/src/workflow/consensus.ts +299 -0
- package/src/workflow/execution-mode.ts +517 -0
- package/src/workflow/index.ts +396 -0
- package/src/workflow/plan-mode.ts +356 -0
- package/src/workflow/test-runner.ts +345 -0
- package/tests/adapters/openai.test.ts +145 -0
- package/tests/config/config.test.ts +208 -0
- package/tests/generators/generators.test.ts +185 -0
- package/tests/types/consensus.test.ts +152 -0
- package/tests/types/project.test.ts +134 -0
- package/tests/workflow/consensus.test.ts +221 -0
- package/tests/workflow/test-runner.test.ts +214 -0
- package/tsconfig.json +25 -0
- package/vitest.config.ts +22 -0
|
@@ -0,0 +1,103 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Default configuration values
|
|
3
|
+
* Matches popeye-cli-spec.md section 9.1 exactly
|
|
4
|
+
*/
|
|
5
|
+
/**
|
|
6
|
+
* Default configuration object
|
|
7
|
+
*/
|
|
8
|
+
export const DEFAULT_CONFIG = {
|
|
9
|
+
consensus: {
|
|
10
|
+
threshold: 95,
|
|
11
|
+
max_disagreements: 5,
|
|
12
|
+
escalation_action: 'pause',
|
|
13
|
+
},
|
|
14
|
+
apis: {
|
|
15
|
+
openai: {
|
|
16
|
+
model: 'gpt-4o',
|
|
17
|
+
temperature: 0.3,
|
|
18
|
+
max_tokens: 4096,
|
|
19
|
+
available_models: ['gpt-4o', 'gpt-4o-mini', 'gpt-4-turbo', 'o1-preview', 'o1-mini'],
|
|
20
|
+
},
|
|
21
|
+
claude: {
|
|
22
|
+
model: 'claude-sonnet-4-20250514',
|
|
23
|
+
},
|
|
24
|
+
},
|
|
25
|
+
project: {
|
|
26
|
+
default_language: 'python',
|
|
27
|
+
python: {
|
|
28
|
+
package_manager: 'pip',
|
|
29
|
+
test_framework: 'pytest',
|
|
30
|
+
min_version: '3.10',
|
|
31
|
+
},
|
|
32
|
+
typescript: {
|
|
33
|
+
package_manager: 'npm',
|
|
34
|
+
test_framework: 'jest',
|
|
35
|
+
min_version: '18',
|
|
36
|
+
},
|
|
37
|
+
},
|
|
38
|
+
directories: {
|
|
39
|
+
docs: 'docs',
|
|
40
|
+
tests: 'docs/tests',
|
|
41
|
+
plans: 'docs/plans',
|
|
42
|
+
},
|
|
43
|
+
output: {
|
|
44
|
+
format: 'markdown',
|
|
45
|
+
verbose: false,
|
|
46
|
+
timestamps: true,
|
|
47
|
+
show_consensus_dialog: true,
|
|
48
|
+
},
|
|
49
|
+
};
|
|
50
|
+
/**
|
|
51
|
+
* Configuration file names to search for
|
|
52
|
+
*/
|
|
53
|
+
export const CONFIG_FILE_NAMES = [
|
|
54
|
+
'popeye.config.yaml',
|
|
55
|
+
'popeye.config.yml',
|
|
56
|
+
'.popeyerc.yaml',
|
|
57
|
+
'.popeyerc.yml',
|
|
58
|
+
'.popeyerc',
|
|
59
|
+
];
|
|
60
|
+
/**
|
|
61
|
+
* Global config directory path
|
|
62
|
+
*/
|
|
63
|
+
export const GLOBAL_CONFIG_DIR = '.popeye';
|
|
64
|
+
/**
|
|
65
|
+
* State file name
|
|
66
|
+
*/
|
|
67
|
+
export const STATE_FILE_NAME = 'state.json';
|
|
68
|
+
/**
|
|
69
|
+
* Config file name in .popeye directory
|
|
70
|
+
*/
|
|
71
|
+
export const CONFIG_FILE_NAME = 'config.yaml';
|
|
72
|
+
/**
|
|
73
|
+
* Service name for keychain
|
|
74
|
+
*/
|
|
75
|
+
export const SERVICE_NAME = 'popeye-cli';
|
|
76
|
+
/**
|
|
77
|
+
* Keychain account names
|
|
78
|
+
*/
|
|
79
|
+
export const KEYCHAIN_ACCOUNTS = {
|
|
80
|
+
CLAUDE: 'claude-cli',
|
|
81
|
+
OPENAI: 'openai-api',
|
|
82
|
+
};
|
|
83
|
+
/**
|
|
84
|
+
* Environment variable names
|
|
85
|
+
*/
|
|
86
|
+
export const ENV_VARS = {
|
|
87
|
+
OPENAI_KEY: 'POPEYE_OPENAI_KEY',
|
|
88
|
+
ANTHROPIC_KEY: 'POPEYE_ANTHROPIC_KEY',
|
|
89
|
+
DEFAULT_LANGUAGE: 'POPEYE_DEFAULT_LANGUAGE',
|
|
90
|
+
OPENAI_MODEL: 'POPEYE_OPENAI_MODEL',
|
|
91
|
+
CONSENSUS_THRESHOLD: 'POPEYE_CONSENSUS_THRESHOLD',
|
|
92
|
+
MAX_DISAGREEMENTS: 'POPEYE_MAX_DISAGREEMENTS',
|
|
93
|
+
LOG_LEVEL: 'POPEYE_LOG_LEVEL',
|
|
94
|
+
};
|
|
95
|
+
/**
|
|
96
|
+
* CLI version
|
|
97
|
+
*/
|
|
98
|
+
export const CLI_VERSION = '1.0.0';
|
|
99
|
+
/**
|
|
100
|
+
* State file version
|
|
101
|
+
*/
|
|
102
|
+
export const STATE_VERSION = '1.0.0';
|
|
103
|
+
//# sourceMappingURL=defaults.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"defaults.js","sourceRoot":"","sources":["../../src/config/defaults.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAIH;;GAEG;AACH,MAAM,CAAC,MAAM,cAAc,GAAW;IACpC,SAAS,EAAE;QACT,SAAS,EAAE,EAAE;QACb,iBAAiB,EAAE,CAAC;QACpB,iBAAiB,EAAE,OAAO;KAC3B;IACD,IAAI,EAAE;QACJ,MAAM,EAAE;YACN,KAAK,EAAE,QAAQ;YACf,WAAW,EAAE,GAAG;YAChB,UAAU,EAAE,IAAI;YAChB,gBAAgB,EAAE,CAAC,QAAQ,EAAE,aAAa,EAAE,aAAa,EAAE,YAAY,EAAE,SAAS,CAAC;SACpF;QACD,MAAM,EAAE;YACN,KAAK,EAAE,0BAA0B;SAClC;KACF;IACD,OAAO,EAAE;QACP,gBAAgB,EAAE,QAAQ;QAC1B,MAAM,EAAE;YACN,eAAe,EAAE,KAAK;YACtB,cAAc,EAAE,QAAQ;YACxB,WAAW,EAAE,MAAM;SACpB;QACD,UAAU,EAAE;YACV,eAAe,EAAE,KAAK;YACtB,cAAc,EAAE,MAAM;YACtB,WAAW,EAAE,IAAI;SAClB;KACF;IACD,WAAW,EAAE;QACX,IAAI,EAAE,MAAM;QACZ,KAAK,EAAE,YAAY;QACnB,KAAK,EAAE,YAAY;KACpB;IACD,MAAM,EAAE;QACN,MAAM,EAAE,UAAU;QAClB,OAAO,EAAE,KAAK;QACd,UAAU,EAAE,IAAI;QAChB,qBAAqB,EAAE,IAAI;KAC5B;CACF,CAAC;AAEF;;GAEG;AACH,MAAM,CAAC,MAAM,iBAAiB,GAAG;IAC/B,oBAAoB;IACpB,mBAAmB;IACnB,gBAAgB;IAChB,eAAe;IACf,WAAW;CACZ,CAAC;AAEF;;GAEG;AACH,MAAM,CAAC,MAAM,iBAAiB,GAAG,SAAS,CAAC;AAE3C;;GAEG;AACH,MAAM,CAAC,MAAM,eAAe,GAAG,YAAY,CAAC;AAE5C;;GAEG;AACH,MAAM,CAAC,MAAM,gBAAgB,GAAG,aAAa,CAAC;AAE9C;;GAEG;AACH,MAAM,CAAC,MAAM,YAAY,GAAG,YAAY,CAAC;AAEzC;;GAEG;AACH,MAAM,CAAC,MAAM,iBAAiB,GAAG;IAC/B,MAAM,EAAE,YAAY;IACpB,MAAM,EAAE,YAAY;CACZ,CAAC;AAEX;;GAEG;AACH,MAAM,CAAC,MAAM,QAAQ,GAAG;IACtB,UAAU,EAAE,mBAAmB;IAC/B,aAAa,EAAE,sBAAsB;IACrC,gBAAgB,EAAE,yBAAyB;IAC3C,YAAY,EAAE,qBAAqB;IACnC,mBAAmB,EAAE,4BAA4B;IACjD,iBAAiB,EAAE,0BAA0B;IAC7C,SAAS,EAAE,kBAAkB;CACrB,CAAC;AAEX;;GAEG;AACH,MAAM,CAAC,MAAM,WAAW,GAAG,OAAO,CAAC;AAEnC;;GAEG;AACH,MAAM,CAAC,MAAM,aAAa,GAAG,OAAO,CAAC"}
|
|
@@ -0,0 +1,138 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Configuration management module
|
|
3
|
+
* Handles loading, merging, and validating configuration from multiple sources
|
|
4
|
+
*/
|
|
5
|
+
import { type Config } from './schema.js';
|
|
6
|
+
export * from './schema.js';
|
|
7
|
+
export * from './defaults.js';
|
|
8
|
+
/**
|
|
9
|
+
* Deep merge configuration objects
|
|
10
|
+
*/
|
|
11
|
+
export declare function deepMerge<T extends Record<string, unknown>>(target: T, source: Partial<T>): T;
|
|
12
|
+
/**
|
|
13
|
+
* Load and merge configuration from all sources
|
|
14
|
+
* Priority: env vars > project config > global config > defaults
|
|
15
|
+
*/
|
|
16
|
+
export declare function loadConfig(cwd?: string): Promise<Config>;
|
|
17
|
+
/**
|
|
18
|
+
* Save configuration to file
|
|
19
|
+
*/
|
|
20
|
+
export declare function saveConfig(config: Partial<Config>, global?: boolean): Promise<void>;
|
|
21
|
+
/**
|
|
22
|
+
* Get a specific config value by path
|
|
23
|
+
*/
|
|
24
|
+
export declare function getConfigValue<T>(config: Config, keyPath: string): T | undefined;
|
|
25
|
+
/**
|
|
26
|
+
* Set a config value by path
|
|
27
|
+
*/
|
|
28
|
+
export declare function setConfigValue(config: Config, keyPath: string, value: unknown): Config;
|
|
29
|
+
/**
|
|
30
|
+
* Get the path to the currently loaded config file (or null if using defaults)
|
|
31
|
+
*/
|
|
32
|
+
export declare function getConfigPath(): string | null;
|
|
33
|
+
/**
|
|
34
|
+
* Search for and cache the config path
|
|
35
|
+
*/
|
|
36
|
+
export declare function findConfigPath(cwd?: string): Promise<string | null>;
|
|
37
|
+
/**
|
|
38
|
+
* Popeye config type alias for CLI compatibility
|
|
39
|
+
*/
|
|
40
|
+
export interface PopeyeConfig extends Config {
|
|
41
|
+
consensus: Config['consensus'] & {
|
|
42
|
+
threshold: number;
|
|
43
|
+
maxIterations: number;
|
|
44
|
+
temperature: number;
|
|
45
|
+
maxTokens: number;
|
|
46
|
+
};
|
|
47
|
+
apis: Config['apis'] & {
|
|
48
|
+
openai: Config['apis']['openai'] & {
|
|
49
|
+
model: string;
|
|
50
|
+
timeout: number;
|
|
51
|
+
};
|
|
52
|
+
};
|
|
53
|
+
project: Config['project'] & {
|
|
54
|
+
defaultLanguage: 'python' | 'typescript';
|
|
55
|
+
defaultName: string;
|
|
56
|
+
};
|
|
57
|
+
directories: Config['directories'] & {
|
|
58
|
+
output: string;
|
|
59
|
+
state: string;
|
|
60
|
+
};
|
|
61
|
+
output: Config['output'] & {
|
|
62
|
+
colors: boolean;
|
|
63
|
+
progress: boolean;
|
|
64
|
+
};
|
|
65
|
+
}
|
|
66
|
+
/**
|
|
67
|
+
* Schema for the Popeye config type used by CLI
|
|
68
|
+
*/
|
|
69
|
+
export declare const PopeyeConfigSchema: import("zod").ZodObject<{
|
|
70
|
+
consensus: import("zod").ZodDefault<import("zod").ZodObject<{
|
|
71
|
+
threshold: import("zod").ZodDefault<import("zod").ZodNumber>;
|
|
72
|
+
max_disagreements: import("zod").ZodDefault<import("zod").ZodNumber>;
|
|
73
|
+
escalation_action: import("zod").ZodDefault<import("zod").ZodEnum<{
|
|
74
|
+
abort: "abort";
|
|
75
|
+
pause: "pause";
|
|
76
|
+
continue: "continue";
|
|
77
|
+
}>>;
|
|
78
|
+
}, import("zod/v4/core").$strip>>;
|
|
79
|
+
apis: import("zod").ZodDefault<import("zod").ZodObject<{
|
|
80
|
+
openai: import("zod").ZodDefault<import("zod").ZodObject<{
|
|
81
|
+
model: import("zod").ZodDefault<import("zod").ZodEnum<{
|
|
82
|
+
"gpt-4o": "gpt-4o";
|
|
83
|
+
"gpt-4o-mini": "gpt-4o-mini";
|
|
84
|
+
"gpt-4-turbo": "gpt-4-turbo";
|
|
85
|
+
"o1-preview": "o1-preview";
|
|
86
|
+
"o1-mini": "o1-mini";
|
|
87
|
+
}>>;
|
|
88
|
+
temperature: import("zod").ZodDefault<import("zod").ZodNumber>;
|
|
89
|
+
max_tokens: import("zod").ZodDefault<import("zod").ZodNumber>;
|
|
90
|
+
available_models: import("zod").ZodDefault<import("zod").ZodArray<import("zod").ZodString>>;
|
|
91
|
+
}, import("zod/v4/core").$strip>>;
|
|
92
|
+
claude: import("zod").ZodDefault<import("zod").ZodObject<{
|
|
93
|
+
model: import("zod").ZodDefault<import("zod").ZodString>;
|
|
94
|
+
}, import("zod/v4/core").$strip>>;
|
|
95
|
+
}, import("zod/v4/core").$strip>>;
|
|
96
|
+
project: import("zod").ZodDefault<import("zod").ZodObject<{
|
|
97
|
+
default_language: import("zod").ZodDefault<import("zod").ZodEnum<{
|
|
98
|
+
python: "python";
|
|
99
|
+
typescript: "typescript";
|
|
100
|
+
}>>;
|
|
101
|
+
python: import("zod").ZodDefault<import("zod").ZodObject<{
|
|
102
|
+
package_manager: import("zod").ZodDefault<import("zod").ZodEnum<{
|
|
103
|
+
pip: "pip";
|
|
104
|
+
poetry: "poetry";
|
|
105
|
+
pipenv: "pipenv";
|
|
106
|
+
}>>;
|
|
107
|
+
test_framework: import("zod").ZodDefault<import("zod").ZodString>;
|
|
108
|
+
min_version: import("zod").ZodDefault<import("zod").ZodString>;
|
|
109
|
+
}, import("zod/v4/core").$strip>>;
|
|
110
|
+
typescript: import("zod").ZodDefault<import("zod").ZodObject<{
|
|
111
|
+
package_manager: import("zod").ZodDefault<import("zod").ZodEnum<{
|
|
112
|
+
npm: "npm";
|
|
113
|
+
pnpm: "pnpm";
|
|
114
|
+
yarn: "yarn";
|
|
115
|
+
}>>;
|
|
116
|
+
test_framework: import("zod").ZodDefault<import("zod").ZodEnum<{
|
|
117
|
+
jest: "jest";
|
|
118
|
+
vitest: "vitest";
|
|
119
|
+
}>>;
|
|
120
|
+
min_version: import("zod").ZodDefault<import("zod").ZodString>;
|
|
121
|
+
}, import("zod/v4/core").$strip>>;
|
|
122
|
+
}, import("zod/v4/core").$strip>>;
|
|
123
|
+
directories: import("zod").ZodDefault<import("zod").ZodObject<{
|
|
124
|
+
docs: import("zod").ZodDefault<import("zod").ZodString>;
|
|
125
|
+
tests: import("zod").ZodDefault<import("zod").ZodString>;
|
|
126
|
+
plans: import("zod").ZodDefault<import("zod").ZodString>;
|
|
127
|
+
}, import("zod/v4/core").$strip>>;
|
|
128
|
+
output: import("zod").ZodDefault<import("zod").ZodObject<{
|
|
129
|
+
format: import("zod").ZodDefault<import("zod").ZodEnum<{
|
|
130
|
+
markdown: "markdown";
|
|
131
|
+
json: "json";
|
|
132
|
+
}>>;
|
|
133
|
+
verbose: import("zod").ZodDefault<import("zod").ZodBoolean>;
|
|
134
|
+
timestamps: import("zod").ZodDefault<import("zod").ZodBoolean>;
|
|
135
|
+
show_consensus_dialog: import("zod").ZodDefault<import("zod").ZodBoolean>;
|
|
136
|
+
}, import("zod/v4/core").$strip>>;
|
|
137
|
+
}, import("zod/v4/core").$strip>;
|
|
138
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/config/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAOH,OAAO,EAAgB,KAAK,MAAM,EAAE,MAAM,aAAa,CAAC;AASxD,cAAc,aAAa,CAAC;AAC5B,cAAc,eAAe,CAAC;AAsH9B;;GAEG;AACH,wBAAgB,SAAS,CAAC,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,CAyB7F;AAED;;;GAGG;AACH,wBAAsB,UAAU,CAAC,GAAG,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAoB9D;AAED;;GAEG;AACH,wBAAsB,UAAU,CAAC,MAAM,EAAE,OAAO,CAAC,MAAM,CAAC,EAAE,MAAM,UAAQ,GAAG,OAAO,CAAC,IAAI,CAAC,CAcvF;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,CAAC,GAAG,SAAS,CAYhF;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,GAAG,MAAM,CAiBtF;AAOD;;GAEG;AACH,wBAAgB,aAAa,IAAI,MAAM,GAAG,IAAI,CAE7C;AAED;;GAEG;AACH,wBAAsB,cAAc,CAAC,GAAG,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAYzE;AAED;;GAEG;AACH,MAAM,WAAW,YAAa,SAAQ,MAAM;IAC1C,SAAS,EAAE,MAAM,CAAC,WAAW,CAAC,GAAG;QAC/B,SAAS,EAAE,MAAM,CAAC;QAClB,aAAa,EAAE,MAAM,CAAC;QACtB,WAAW,EAAE,MAAM,CAAC;QACpB,SAAS,EAAE,MAAM,CAAC;KACnB,CAAC;IACF,IAAI,EAAE,MAAM,CAAC,MAAM,CAAC,GAAG;QACrB,MAAM,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC,QAAQ,CAAC,GAAG;YACjC,KAAK,EAAE,MAAM,CAAC;YACd,OAAO,EAAE,MAAM,CAAC;SACjB,CAAC;KACH,CAAC;IACF,OAAO,EAAE,MAAM,CAAC,SAAS,CAAC,GAAG;QAC3B,eAAe,EAAE,QAAQ,GAAG,YAAY,CAAC;QACzC,WAAW,EAAE,MAAM,CAAC;KACrB,CAAC;IACF,WAAW,EAAE,MAAM,CAAC,aAAa,CAAC,GAAG;QACnC,MAAM,EAAE,MAAM,CAAC;QACf,KAAK,EAAE,MAAM,CAAC;KACf,CAAC;IACF,MAAM,EAAE,MAAM,CAAC,QAAQ,CAAC,GAAG;QACzB,MAAM,EAAE,OAAO,CAAC;QAChB,QAAQ,EAAE,OAAO,CAAC;KACnB,CAAC;CACH;AAED;;GAEG;AACH,eAAO,MAAM,kBAAkB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;gCAAe,CAAC"}
|
|
@@ -0,0 +1,244 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Configuration management module
|
|
3
|
+
* Handles loading, merging, and validating configuration from multiple sources
|
|
4
|
+
*/
|
|
5
|
+
import { cosmiconfig } from 'cosmiconfig';
|
|
6
|
+
import { parse as parseYaml } from 'yaml';
|
|
7
|
+
import * as fs from 'fs/promises';
|
|
8
|
+
import * as path from 'path';
|
|
9
|
+
import { homedir } from 'os';
|
|
10
|
+
import { ConfigSchema } from './schema.js';
|
|
11
|
+
import { DEFAULT_CONFIG, GLOBAL_CONFIG_DIR, CONFIG_FILE_NAME, ENV_VARS, } from './defaults.js';
|
|
12
|
+
// Re-export schema types
|
|
13
|
+
export * from './schema.js';
|
|
14
|
+
export * from './defaults.js';
|
|
15
|
+
/**
|
|
16
|
+
* Configuration loader using cosmiconfig
|
|
17
|
+
*/
|
|
18
|
+
const explorer = cosmiconfig('popeye', {
|
|
19
|
+
searchPlaces: [
|
|
20
|
+
'popeye.config.yaml',
|
|
21
|
+
'popeye.config.yml',
|
|
22
|
+
'.popeyerc.yaml',
|
|
23
|
+
'.popeyerc.yml',
|
|
24
|
+
'.popeyerc',
|
|
25
|
+
'.popeye/config.yaml',
|
|
26
|
+
'.popeye/config.yml',
|
|
27
|
+
],
|
|
28
|
+
loaders: {
|
|
29
|
+
'.yaml': (_filepath, content) => parseYaml(content),
|
|
30
|
+
'.yml': (_filepath, content) => parseYaml(content),
|
|
31
|
+
noExt: (_filepath, content) => parseYaml(content),
|
|
32
|
+
},
|
|
33
|
+
});
|
|
34
|
+
/**
|
|
35
|
+
* Load global configuration from ~/.popeye/config.yaml
|
|
36
|
+
*/
|
|
37
|
+
async function loadGlobalConfig() {
|
|
38
|
+
const globalConfigPath = path.join(homedir(), GLOBAL_CONFIG_DIR, CONFIG_FILE_NAME);
|
|
39
|
+
try {
|
|
40
|
+
const content = await fs.readFile(globalConfigPath, 'utf-8');
|
|
41
|
+
const parsed = parseYaml(content);
|
|
42
|
+
return parsed || {};
|
|
43
|
+
}
|
|
44
|
+
catch {
|
|
45
|
+
// Global config doesn't exist, return empty
|
|
46
|
+
return {};
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
/**
|
|
50
|
+
* Load project-specific configuration
|
|
51
|
+
*/
|
|
52
|
+
async function loadProjectConfig(cwd) {
|
|
53
|
+
try {
|
|
54
|
+
const result = await explorer.search(cwd);
|
|
55
|
+
if (result && !result.isEmpty) {
|
|
56
|
+
return result.config;
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
catch {
|
|
60
|
+
// Project config doesn't exist or is invalid
|
|
61
|
+
}
|
|
62
|
+
return {};
|
|
63
|
+
}
|
|
64
|
+
/**
|
|
65
|
+
* Load configuration from environment variables
|
|
66
|
+
*/
|
|
67
|
+
function loadEnvConfig() {
|
|
68
|
+
const config = {};
|
|
69
|
+
// OpenAI model
|
|
70
|
+
const openaiModel = process.env[ENV_VARS.OPENAI_MODEL];
|
|
71
|
+
if (openaiModel) {
|
|
72
|
+
config.apis = {
|
|
73
|
+
openai: {
|
|
74
|
+
...DEFAULT_CONFIG.apis.openai,
|
|
75
|
+
model: openaiModel,
|
|
76
|
+
},
|
|
77
|
+
claude: DEFAULT_CONFIG.apis.claude,
|
|
78
|
+
};
|
|
79
|
+
}
|
|
80
|
+
// Default language
|
|
81
|
+
const defaultLanguage = process.env[ENV_VARS.DEFAULT_LANGUAGE];
|
|
82
|
+
if (defaultLanguage && (defaultLanguage === 'python' || defaultLanguage === 'typescript')) {
|
|
83
|
+
config.project = {
|
|
84
|
+
...DEFAULT_CONFIG.project,
|
|
85
|
+
default_language: defaultLanguage,
|
|
86
|
+
};
|
|
87
|
+
}
|
|
88
|
+
// Consensus threshold
|
|
89
|
+
const threshold = process.env[ENV_VARS.CONSENSUS_THRESHOLD];
|
|
90
|
+
if (threshold) {
|
|
91
|
+
const parsed = parseInt(threshold, 10);
|
|
92
|
+
if (!isNaN(parsed) && parsed >= 0 && parsed <= 100) {
|
|
93
|
+
config.consensus = {
|
|
94
|
+
...DEFAULT_CONFIG.consensus,
|
|
95
|
+
...(config.consensus || {}),
|
|
96
|
+
threshold: parsed,
|
|
97
|
+
};
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
// Max disagreements
|
|
101
|
+
const maxDisagreements = process.env[ENV_VARS.MAX_DISAGREEMENTS];
|
|
102
|
+
if (maxDisagreements) {
|
|
103
|
+
const parsed = parseInt(maxDisagreements, 10);
|
|
104
|
+
if (!isNaN(parsed) && parsed >= 1 && parsed <= 10) {
|
|
105
|
+
config.consensus = {
|
|
106
|
+
...DEFAULT_CONFIG.consensus,
|
|
107
|
+
...(config.consensus || {}),
|
|
108
|
+
max_disagreements: parsed,
|
|
109
|
+
};
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
// Verbose/log level
|
|
113
|
+
const logLevel = process.env[ENV_VARS.LOG_LEVEL];
|
|
114
|
+
if (logLevel === 'debug') {
|
|
115
|
+
config.output = {
|
|
116
|
+
...DEFAULT_CONFIG.output,
|
|
117
|
+
verbose: true,
|
|
118
|
+
};
|
|
119
|
+
}
|
|
120
|
+
return config;
|
|
121
|
+
}
|
|
122
|
+
/**
|
|
123
|
+
* Deep merge configuration objects
|
|
124
|
+
*/
|
|
125
|
+
export function deepMerge(target, source) {
|
|
126
|
+
const result = { ...target };
|
|
127
|
+
for (const key in source) {
|
|
128
|
+
const sourceValue = source[key];
|
|
129
|
+
const targetValue = result[key];
|
|
130
|
+
if (sourceValue !== undefined &&
|
|
131
|
+
sourceValue !== null &&
|
|
132
|
+
typeof sourceValue === 'object' &&
|
|
133
|
+
!Array.isArray(sourceValue) &&
|
|
134
|
+
typeof targetValue === 'object' &&
|
|
135
|
+
!Array.isArray(targetValue)) {
|
|
136
|
+
result[key] = deepMerge(targetValue, sourceValue);
|
|
137
|
+
}
|
|
138
|
+
else if (sourceValue !== undefined) {
|
|
139
|
+
result[key] = sourceValue;
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
return result;
|
|
143
|
+
}
|
|
144
|
+
/**
|
|
145
|
+
* Load and merge configuration from all sources
|
|
146
|
+
* Priority: env vars > project config > global config > defaults
|
|
147
|
+
*/
|
|
148
|
+
export async function loadConfig(cwd) {
|
|
149
|
+
// Load from all sources
|
|
150
|
+
const globalConfig = await loadGlobalConfig();
|
|
151
|
+
const projectConfig = await loadProjectConfig(cwd);
|
|
152
|
+
const envConfig = loadEnvConfig();
|
|
153
|
+
// Merge in priority order
|
|
154
|
+
let merged = deepMerge(DEFAULT_CONFIG, globalConfig);
|
|
155
|
+
merged = deepMerge(merged, projectConfig);
|
|
156
|
+
merged = deepMerge(merged, envConfig);
|
|
157
|
+
// Validate final config
|
|
158
|
+
const result = ConfigSchema.safeParse(merged);
|
|
159
|
+
if (!result.success) {
|
|
160
|
+
console.warn('Configuration validation warnings:', result.error.format());
|
|
161
|
+
// Return defaults if validation fails
|
|
162
|
+
return DEFAULT_CONFIG;
|
|
163
|
+
}
|
|
164
|
+
return result.data;
|
|
165
|
+
}
|
|
166
|
+
/**
|
|
167
|
+
* Save configuration to file
|
|
168
|
+
*/
|
|
169
|
+
export async function saveConfig(config, global = false) {
|
|
170
|
+
const { stringify: stringifyYaml } = await import('yaml');
|
|
171
|
+
const configPath = global
|
|
172
|
+
? path.join(homedir(), GLOBAL_CONFIG_DIR, CONFIG_FILE_NAME)
|
|
173
|
+
: path.join(process.cwd(), '.popeye', CONFIG_FILE_NAME);
|
|
174
|
+
// Ensure directory exists
|
|
175
|
+
const dir = path.dirname(configPath);
|
|
176
|
+
await fs.mkdir(dir, { recursive: true });
|
|
177
|
+
// Write config
|
|
178
|
+
const content = stringifyYaml(config);
|
|
179
|
+
await fs.writeFile(configPath, content, 'utf-8');
|
|
180
|
+
}
|
|
181
|
+
/**
|
|
182
|
+
* Get a specific config value by path
|
|
183
|
+
*/
|
|
184
|
+
export function getConfigValue(config, keyPath) {
|
|
185
|
+
const keys = keyPath.split('.');
|
|
186
|
+
let current = config;
|
|
187
|
+
for (const key of keys) {
|
|
188
|
+
if (current === null || current === undefined || typeof current !== 'object') {
|
|
189
|
+
return undefined;
|
|
190
|
+
}
|
|
191
|
+
current = current[key];
|
|
192
|
+
}
|
|
193
|
+
return current;
|
|
194
|
+
}
|
|
195
|
+
/**
|
|
196
|
+
* Set a config value by path
|
|
197
|
+
*/
|
|
198
|
+
export function setConfigValue(config, keyPath, value) {
|
|
199
|
+
const keys = keyPath.split('.');
|
|
200
|
+
const result = JSON.parse(JSON.stringify(config));
|
|
201
|
+
let current = result;
|
|
202
|
+
for (let i = 0; i < keys.length - 1; i++) {
|
|
203
|
+
const key = keys[i];
|
|
204
|
+
if (!(key in current) || typeof current[key] !== 'object') {
|
|
205
|
+
current[key] = {};
|
|
206
|
+
}
|
|
207
|
+
current = current[key];
|
|
208
|
+
}
|
|
209
|
+
const lastKey = keys[keys.length - 1];
|
|
210
|
+
current[lastKey] = value;
|
|
211
|
+
return result;
|
|
212
|
+
}
|
|
213
|
+
/**
|
|
214
|
+
* Cached config path from last search
|
|
215
|
+
*/
|
|
216
|
+
let cachedConfigPath = null;
|
|
217
|
+
/**
|
|
218
|
+
* Get the path to the currently loaded config file (or null if using defaults)
|
|
219
|
+
*/
|
|
220
|
+
export function getConfigPath() {
|
|
221
|
+
return cachedConfigPath;
|
|
222
|
+
}
|
|
223
|
+
/**
|
|
224
|
+
* Search for and cache the config path
|
|
225
|
+
*/
|
|
226
|
+
export async function findConfigPath(cwd) {
|
|
227
|
+
try {
|
|
228
|
+
const result = await explorer.search(cwd);
|
|
229
|
+
if (result && result.filepath) {
|
|
230
|
+
cachedConfigPath = result.filepath;
|
|
231
|
+
return result.filepath;
|
|
232
|
+
}
|
|
233
|
+
}
|
|
234
|
+
catch {
|
|
235
|
+
// Ignore errors
|
|
236
|
+
}
|
|
237
|
+
cachedConfigPath = null;
|
|
238
|
+
return null;
|
|
239
|
+
}
|
|
240
|
+
/**
|
|
241
|
+
* Schema for the Popeye config type used by CLI
|
|
242
|
+
*/
|
|
243
|
+
export const PopeyeConfigSchema = ConfigSchema;
|
|
244
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/config/index.ts"],"names":[],"mappings":"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"}
|