@mycodemap/mycodemap 0.4.1 → 0.5.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/CHANGELOG.md +100 -0
- package/README.md +307 -243
- package/dist/ai/claude.d.ts +38 -0
- package/dist/ai/claude.d.ts.map +1 -0
- package/dist/ai/claude.js +169 -0
- package/dist/ai/claude.js.map +1 -0
- package/dist/ai/codex.d.ts +38 -0
- package/dist/ai/codex.d.ts.map +1 -0
- package/dist/ai/codex.js +169 -0
- package/dist/ai/codex.js.map +1 -0
- package/dist/ai/factory.d.ts +48 -0
- package/dist/ai/factory.d.ts.map +1 -0
- package/dist/ai/factory.js +95 -0
- package/dist/ai/factory.js.map +1 -0
- package/dist/ai/index.d.ts +12 -0
- package/dist/ai/index.d.ts.map +1 -0
- package/dist/ai/index.js +29 -0
- package/dist/ai/index.js.map +1 -0
- package/dist/ai/provider.d.ts +70 -0
- package/dist/ai/provider.d.ts.map +1 -0
- package/dist/ai/provider.js +31 -0
- package/dist/ai/provider.js.map +1 -0
- package/dist/ai/subagent-caller.d.ts +90 -0
- package/dist/ai/subagent-caller.d.ts.map +1 -0
- package/dist/ai/subagent-caller.js +280 -0
- package/dist/ai/subagent-caller.js.map +1 -0
- package/dist/ai/types.d.ts +70 -0
- package/dist/ai/types.d.ts.map +1 -0
- package/dist/ai/types.js +5 -0
- package/dist/ai/types.js.map +1 -0
- package/dist/cli/commands/analyze-options.d.ts +36 -0
- package/dist/cli/commands/analyze-options.d.ts.map +1 -0
- package/dist/cli/commands/analyze-options.js +147 -0
- package/dist/cli/commands/analyze-options.js.map +1 -0
- package/dist/cli/commands/analyze.d.ts +93 -4
- package/dist/cli/commands/analyze.d.ts.map +1 -1
- package/dist/cli/commands/analyze.js +592 -176
- package/dist/cli/commands/analyze.js.map +1 -1
- package/dist/cli/commands/ci.d.ts +47 -1
- package/dist/cli/commands/ci.d.ts.map +1 -1
- package/dist/cli/commands/ci.js +208 -1
- package/dist/cli/commands/ci.js.map +1 -1
- package/dist/cli/commands/design.d.ts +47 -0
- package/dist/cli/commands/design.d.ts.map +1 -0
- package/dist/cli/commands/design.js +268 -0
- package/dist/cli/commands/design.js.map +1 -0
- package/dist/cli/commands/export.d.ts.map +1 -1
- package/dist/cli/commands/export.js +2 -2
- package/dist/cli/commands/export.js.map +1 -1
- package/dist/cli/commands/generate.d.ts +8 -2
- package/dist/cli/commands/generate.d.ts.map +1 -1
- package/dist/cli/commands/generate.js +151 -22
- package/dist/cli/commands/generate.js.map +1 -1
- package/dist/cli/commands/init.d.ts.map +1 -1
- package/dist/cli/commands/init.js +2 -13
- package/dist/cli/commands/init.js.map +1 -1
- package/dist/cli/commands/server.d.ts.map +1 -1
- package/dist/cli/commands/server.js +2 -5
- package/dist/cli/commands/server.js.map +1 -1
- package/dist/cli/commands/ship/checker.d.ts.map +1 -1
- package/dist/cli/commands/ship/checker.js +0 -3
- package/dist/cli/commands/ship/checker.js.map +1 -1
- package/dist/cli/commands/ship/pipeline.d.ts.map +1 -1
- package/dist/cli/commands/ship/pipeline.js +8 -1
- package/dist/cli/commands/ship/pipeline.js.map +1 -1
- package/dist/cli/commands/ship/publisher.d.ts +9 -1
- package/dist/cli/commands/ship/publisher.d.ts.map +1 -1
- package/dist/cli/commands/ship/publisher.js +149 -6
- package/dist/cli/commands/ship/publisher.js.map +1 -1
- package/dist/cli/commands/ship/rules/quality-rules.d.ts +0 -1
- package/dist/cli/commands/ship/rules/quality-rules.d.ts.map +1 -1
- package/dist/cli/commands/ship/rules/quality-rules.js +4 -76
- package/dist/cli/commands/ship/rules/quality-rules.js.map +1 -1
- package/dist/cli/commands/workflow.js +4 -4
- package/dist/cli/commands/workflow.js.map +1 -1
- package/dist/cli/config-loader.d.ts +31 -0
- package/dist/cli/config-loader.d.ts.map +1 -0
- package/dist/cli/config-loader.js +235 -0
- package/dist/cli/config-loader.js.map +1 -0
- package/dist/cli/design-contract-loader.d.ts +15 -0
- package/dist/cli/design-contract-loader.d.ts.map +1 -0
- package/dist/cli/design-contract-loader.js +175 -0
- package/dist/cli/design-contract-loader.js.map +1 -0
- package/dist/cli/design-contract-schema.d.ts +11 -0
- package/dist/cli/design-contract-schema.d.ts.map +1 -0
- package/dist/cli/design-contract-schema.js +75 -0
- package/dist/cli/design-contract-schema.js.map +1 -0
- package/dist/cli/design-handoff-builder.d.ts +15 -0
- package/dist/cli/design-handoff-builder.d.ts.map +1 -0
- package/dist/cli/design-handoff-builder.js +345 -0
- package/dist/cli/design-handoff-builder.js.map +1 -0
- package/dist/cli/design-scope-resolver.d.ts +8 -0
- package/dist/cli/design-scope-resolver.d.ts.map +1 -0
- package/dist/cli/design-scope-resolver.js +712 -0
- package/dist/cli/design-scope-resolver.js.map +1 -0
- package/dist/cli/design-verification-builder.d.ts +8 -0
- package/dist/cli/design-verification-builder.d.ts.map +1 -0
- package/dist/cli/design-verification-builder.js +369 -0
- package/dist/cli/design-verification-builder.js.map +1 -0
- package/dist/cli/index.js +20 -63
- package/dist/cli/index.js.map +1 -1
- package/dist/cli/removed-commands.d.ts +9 -0
- package/dist/cli/removed-commands.d.ts.map +1 -0
- package/dist/cli/removed-commands.js +48 -0
- package/dist/cli/removed-commands.js.map +1 -0
- package/dist/cli/storage-runtime.d.ts +8 -0
- package/dist/cli/storage-runtime.d.ts.map +1 -0
- package/dist/cli/storage-runtime.js +14 -0
- package/dist/cli/storage-runtime.js.map +1 -0
- package/dist/cli/tree-sitter-check.d.ts.map +1 -1
- package/dist/cli/tree-sitter-check.js +0 -1
- package/dist/cli/tree-sitter-check.js.map +1 -1
- package/dist/cli-new/commands/export.d.ts.map +1 -1
- package/dist/cli-new/commands/export.js +2 -2
- package/dist/cli-new/commands/export.js.map +1 -1
- package/dist/cli-new/commands/query.d.ts.map +1 -1
- package/dist/cli-new/commands/query.js +5 -4
- package/dist/cli-new/commands/query.js.map +1 -1
- package/dist/cli-new/commands/server.d.ts.map +1 -1
- package/dist/cli-new/commands/server.js +2 -6
- package/dist/cli-new/commands/server.js.map +1 -1
- package/dist/cli-new/index.d.ts.map +1 -1
- package/dist/cli-new/index.js +0 -2
- package/dist/cli-new/index.js.map +1 -1
- package/dist/core/analyzer.d.ts.map +1 -1
- package/dist/core/analyzer.js +7 -39
- package/dist/core/analyzer.js.map +1 -1
- package/dist/core/file-discovery.d.ts +17 -0
- package/dist/core/file-discovery.d.ts.map +1 -0
- package/dist/core/file-discovery.js +75 -0
- package/dist/core/file-discovery.js.map +1 -0
- package/dist/core/global-index.d.ts +5 -0
- package/dist/core/global-index.d.ts.map +1 -1
- package/dist/core/global-index.js +71 -21
- package/dist/core/global-index.js.map +1 -1
- package/dist/generator/ai-overview.d.ts +51 -0
- package/dist/generator/ai-overview.d.ts.map +1 -0
- package/dist/generator/ai-overview.js +160 -0
- package/dist/generator/ai-overview.js.map +1 -0
- package/dist/generator/index.d.ts.map +1 -1
- package/dist/generator/index.js +8 -0
- package/dist/generator/index.js.map +1 -1
- package/dist/infrastructure/parser/implementations/GoParser.d.ts +2 -5
- package/dist/infrastructure/parser/implementations/GoParser.d.ts.map +1 -1
- package/dist/infrastructure/parser/implementations/GoParser.js +2 -5
- package/dist/infrastructure/parser/implementations/GoParser.js.map +1 -1
- package/dist/infrastructure/parser/implementations/PythonParser.d.ts +1 -5
- package/dist/infrastructure/parser/implementations/PythonParser.d.ts.map +1 -1
- package/dist/infrastructure/parser/implementations/PythonParser.js +1 -5
- package/dist/infrastructure/parser/implementations/PythonParser.js.map +1 -1
- package/dist/infrastructure/parser/implementations/TypeScriptParser.d.ts +1 -5
- package/dist/infrastructure/parser/implementations/TypeScriptParser.d.ts.map +1 -1
- package/dist/infrastructure/parser/implementations/TypeScriptParser.js +1 -5
- package/dist/infrastructure/parser/implementations/TypeScriptParser.js.map +1 -1
- package/dist/infrastructure/storage/StorageFactory.d.ts +12 -6
- package/dist/infrastructure/storage/StorageFactory.d.ts.map +1 -1
- package/dist/infrastructure/storage/StorageFactory.js +59 -43
- package/dist/infrastructure/storage/StorageFactory.js.map +1 -1
- package/dist/infrastructure/storage/adapters/FileSystemStorage.d.ts.map +1 -1
- package/dist/infrastructure/storage/adapters/FileSystemStorage.js +24 -137
- package/dist/infrastructure/storage/adapters/FileSystemStorage.js.map +1 -1
- package/dist/infrastructure/storage/adapters/KuzuDBStorage.d.ts +10 -18
- package/dist/infrastructure/storage/adapters/KuzuDBStorage.d.ts.map +1 -1
- package/dist/infrastructure/storage/adapters/KuzuDBStorage.js +103 -146
- package/dist/infrastructure/storage/adapters/KuzuDBStorage.js.map +1 -1
- package/dist/infrastructure/storage/adapters/MemoryStorage.d.ts +0 -1
- package/dist/infrastructure/storage/adapters/MemoryStorage.d.ts.map +1 -1
- package/dist/infrastructure/storage/adapters/MemoryStorage.js +16 -136
- package/dist/infrastructure/storage/adapters/MemoryStorage.js.map +1 -1
- package/dist/infrastructure/storage/adapters/Neo4jStorage.d.ts +9 -17
- package/dist/infrastructure/storage/adapters/Neo4jStorage.d.ts.map +1 -1
- package/dist/infrastructure/storage/adapters/Neo4jStorage.js +78 -138
- package/dist/infrastructure/storage/adapters/Neo4jStorage.js.map +1 -1
- package/dist/infrastructure/storage/graph-helpers.d.ts +16 -0
- package/dist/infrastructure/storage/graph-helpers.d.ts.map +1 -0
- package/dist/infrastructure/storage/graph-helpers.js +161 -0
- package/dist/infrastructure/storage/graph-helpers.js.map +1 -0
- package/dist/infrastructure/storage/index.d.ts.map +1 -1
- package/dist/interface/config/index.d.ts +10 -1
- package/dist/interface/config/index.d.ts.map +1 -1
- package/dist/interface/types/design-contract.d.ts +68 -0
- package/dist/interface/types/design-contract.d.ts.map +1 -0
- package/dist/interface/types/design-contract.js +7 -0
- package/dist/interface/types/design-contract.js.map +1 -0
- package/dist/interface/types/design-handoff.d.ts +68 -0
- package/dist/interface/types/design-handoff.d.ts.map +1 -0
- package/dist/interface/types/design-handoff.js +4 -0
- package/dist/interface/types/design-handoff.js.map +1 -0
- package/dist/interface/types/design-mapping.d.ts +51 -0
- package/dist/interface/types/design-mapping.d.ts.map +1 -0
- package/dist/interface/types/design-mapping.js +4 -0
- package/dist/interface/types/design-mapping.js.map +1 -0
- package/dist/interface/types/design-verification.d.ts +49 -0
- package/dist/interface/types/design-verification.d.ts.map +1 -0
- package/dist/interface/types/design-verification.js +4 -0
- package/dist/interface/types/design-verification.js.map +1 -0
- package/dist/interface/types/index.d.ts +17 -0
- package/dist/interface/types/index.d.ts.map +1 -1
- package/dist/interface/types/storage.d.ts +1 -4
- package/dist/interface/types/storage.d.ts.map +1 -1
- package/dist/orchestrator/ai-feed-generator.d.ts +210 -0
- package/dist/orchestrator/ai-feed-generator.d.ts.map +1 -0
- package/dist/orchestrator/ai-feed-generator.js +377 -0
- package/dist/orchestrator/ai-feed-generator.js.map +1 -0
- package/dist/orchestrator/confidence.d.ts +9 -9
- package/dist/orchestrator/confidence.d.ts.map +1 -1
- package/dist/orchestrator/confidence.js +44 -67
- package/dist/orchestrator/confidence.js.map +1 -1
- package/dist/orchestrator/file-header-scanner.d.ts.map +1 -1
- package/dist/orchestrator/file-header-scanner.js +22 -31
- package/dist/orchestrator/file-header-scanner.js.map +1 -1
- package/dist/orchestrator/intent-router.d.ts +2 -11
- package/dist/orchestrator/intent-router.d.ts.map +1 -1
- package/dist/orchestrator/intent-router.js +58 -49
- package/dist/orchestrator/intent-router.js.map +1 -1
- package/dist/orchestrator/tool-orchestrator.d.ts.map +1 -1
- package/dist/orchestrator/tool-orchestrator.js +6 -4
- package/dist/orchestrator/tool-orchestrator.js.map +1 -1
- package/dist/orchestrator/types.d.ts +113 -2
- package/dist/orchestrator/types.d.ts.map +1 -1
- package/dist/orchestrator/types.js +29 -0
- package/dist/orchestrator/types.js.map +1 -1
- package/dist/orchestrator/workflow/config.d.ts +4 -12
- package/dist/orchestrator/workflow/config.d.ts.map +1 -1
- package/dist/orchestrator/workflow/config.js +4 -6
- package/dist/orchestrator/workflow/config.js.map +1 -1
- package/dist/orchestrator/workflow/git-analyzer.d.ts.map +1 -1
- package/dist/orchestrator/workflow/git-analyzer.js +9 -19
- package/dist/orchestrator/workflow/git-analyzer.js.map +1 -1
- package/dist/orchestrator/workflow/phase-inheritance.d.ts.map +1 -1
- package/dist/orchestrator/workflow/phase-inheritance.js +14 -23
- package/dist/orchestrator/workflow/phase-inheritance.js.map +1 -1
- package/dist/orchestrator/workflow/result-fusion.d.ts.map +1 -1
- package/dist/orchestrator/workflow/result-fusion.js +9 -11
- package/dist/orchestrator/workflow/result-fusion.js.map +1 -1
- package/dist/orchestrator/workflow/templates.d.ts +4 -1
- package/dist/orchestrator/workflow/templates.d.ts.map +1 -1
- package/dist/orchestrator/workflow/templates.js +49 -207
- package/dist/orchestrator/workflow/templates.js.map +1 -1
- package/dist/orchestrator/workflow/test-linker.d.ts.map +1 -1
- package/dist/orchestrator/workflow/test-linker.js +12 -24
- package/dist/orchestrator/workflow/test-linker.js.map +1 -1
- package/dist/orchestrator/workflow/types.d.ts +11 -8
- package/dist/orchestrator/workflow/types.d.ts.map +1 -1
- package/dist/orchestrator/workflow/types.js +8 -1
- package/dist/orchestrator/workflow/types.js.map +1 -1
- package/dist/orchestrator/workflow/visualizer.d.ts.map +1 -1
- package/dist/orchestrator/workflow/visualizer.js +7 -9
- package/dist/orchestrator/workflow/visualizer.js.map +1 -1
- package/dist/orchestrator/workflow/workflow-context.d.ts.map +1 -1
- package/dist/orchestrator/workflow/workflow-context.js +3 -5
- package/dist/orchestrator/workflow/workflow-context.js.map +1 -1
- package/dist/orchestrator/workflow/workflow-orchestrator.d.ts +0 -4
- package/dist/orchestrator/workflow/workflow-orchestrator.d.ts.map +1 -1
- package/dist/orchestrator/workflow/workflow-orchestrator.js +7 -99
- package/dist/orchestrator/workflow/workflow-orchestrator.js.map +1 -1
- package/dist/parser/index.d.ts.map +1 -1
- package/dist/parser/index.js +2 -2
- package/dist/parser/index.js.map +1 -1
- package/dist/plugins/index.d.ts +5 -3
- package/dist/plugins/index.d.ts.map +1 -1
- package/dist/plugins/index.js +19 -8
- package/dist/plugins/index.js.map +1 -1
- package/dist/plugins/plugin-loader.d.ts +21 -6
- package/dist/plugins/plugin-loader.d.ts.map +1 -1
- package/dist/plugins/plugin-loader.js +170 -54
- package/dist/plugins/plugin-loader.js.map +1 -1
- package/dist/plugins/plugin-registry.d.ts +7 -4
- package/dist/plugins/plugin-registry.d.ts.map +1 -1
- package/dist/plugins/plugin-registry.js +62 -14
- package/dist/plugins/plugin-registry.js.map +1 -1
- package/dist/plugins/types.d.ts +16 -6
- package/dist/plugins/types.d.ts.map +1 -1
- package/dist/plugins/types.js +2 -0
- package/dist/plugins/types.js.map +1 -1
- package/dist/server/handlers/AnalysisHandler.d.ts +16 -2
- package/dist/server/handlers/AnalysisHandler.d.ts.map +1 -1
- package/dist/server/handlers/AnalysisHandler.js +31 -47
- package/dist/server/handlers/AnalysisHandler.js.map +1 -1
- package/dist/server/routes/api.d.ts.map +1 -1
- package/dist/server/routes/api.js +31 -12
- package/dist/server/routes/api.js.map +1 -1
- package/docs/AI_ASSISTANT_SETUP.md +3 -1
- package/docs/SETUP_GUIDE.md +41 -17
- package/docs/ai-guide/COMMANDS.md +179 -102
- package/docs/ai-guide/INTEGRATION.md +23 -21
- package/docs/ai-guide/OUTPUT.md +621 -10
- package/docs/ai-guide/PATTERNS.md +77 -18
- package/docs/ai-guide/PROMPTS.md +24 -18
- package/docs/ai-guide/QUICKSTART.md +35 -19
- package/docs/ai-guide/README.md +22 -4
- package/docs/archive/test-report-symbol-search.md +384 -0
- package/docs/archive/test-scenario-4-complexity-analysis.md +460 -0
- package/docs/archive/test_report_scenario5.md +615 -0
- package/docs/archive/test_scenario_3_impact_analysis_report.md +520 -0
- package/docs/product-specs/DESIGN_CONTRACT_TEMPLATE.md +79 -0
- package/docs/product-specs/MVP3-ARCHITECTURE-COMPARISON.md +159 -434
- package/docs/product-specs/MVP3-ARCHITECTURE-REDESIGN-PRD.md +169 -261
- package/docs/product-specs/MVP3-ARCHITECTURE-REDESIGN-TECH-PRD.md +201 -1259
- package/docs/product-specs/README.md +9 -1
- package/docs/rules/architecture-guardrails.md +1 -2
- package/docs/rules/engineering-with-codex-openai.md +20 -10
- package/docs/rules/validation.md +29 -4
- package/mycodemap.config.schema.json +76 -5
- package/package.json +1 -1
- package/scripts/experiments/arcadedb-http-smoke.mjs +90 -0
- package/scripts/sync-analyze-docs.js +500 -0
- package/scripts/validate-ai-docs.js +54 -1
- package/scripts/validate-docs.js +992 -25
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import { AIProvider, type AIProviderConfig, type AIResponse } from './provider.js';
|
|
2
|
+
import type { CodeMap } from '../types/index.js';
|
|
3
|
+
/**
|
|
4
|
+
* Claude Provider 配置
|
|
5
|
+
*/
|
|
6
|
+
export interface ClaudeProviderConfig extends AIProviderConfig {
|
|
7
|
+
/** CLI 路径,默认 claude */
|
|
8
|
+
cliPath?: string;
|
|
9
|
+
}
|
|
10
|
+
/**
|
|
11
|
+
* Claude Provider - 通过 CLI 调用 Claude
|
|
12
|
+
*/
|
|
13
|
+
export declare class ClaudeProvider extends AIProvider {
|
|
14
|
+
readonly name: "claude";
|
|
15
|
+
private cliPath;
|
|
16
|
+
constructor(config?: ClaudeProviderConfig);
|
|
17
|
+
/**
|
|
18
|
+
* 执行 AI 推理
|
|
19
|
+
*/
|
|
20
|
+
execute(prompt: string, context?: CodeMap): Promise<AIResponse>;
|
|
21
|
+
/**
|
|
22
|
+
* 检查 Claude CLI 是否可用
|
|
23
|
+
*/
|
|
24
|
+
isAvailable(): Promise<boolean>;
|
|
25
|
+
/**
|
|
26
|
+
* 构建提示词
|
|
27
|
+
*/
|
|
28
|
+
private buildPrompt;
|
|
29
|
+
/**
|
|
30
|
+
* 总结 CodeMap 上下文
|
|
31
|
+
*/
|
|
32
|
+
private summarizeContext;
|
|
33
|
+
/**
|
|
34
|
+
* 解析 Claude CLI JSON 响应
|
|
35
|
+
*/
|
|
36
|
+
private parseResponse;
|
|
37
|
+
}
|
|
38
|
+
//# sourceMappingURL=claude.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"claude.d.ts","sourceRoot":"","sources":["../../src/ai/claude.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,UAAU,EAAE,KAAK,gBAAgB,EAAE,KAAK,UAAU,EAAE,MAAM,eAAe,CAAC;AACnF,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,mBAAmB,CAAC;AAWjD;;GAEG;AACH,MAAM,WAAW,oBAAqB,SAAQ,gBAAgB;IAC5D,uBAAuB;IACvB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED;;GAEG;AACH,qBAAa,cAAe,SAAQ,UAAU;IAC5C,SAAgB,IAAI,EAAG,QAAQ,CAAU;IACzC,OAAO,CAAC,OAAO,CAAS;gBAEZ,MAAM,GAAE,oBAAyB;IAK7C;;OAEG;IACG,OAAO,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,OAAO,GAAG,OAAO,CAAC,UAAU,CAAC;IAoErE;;OAEG;IACG,WAAW,IAAI,OAAO,CAAC,OAAO,CAAC;IAsBrC;;OAEG;IACH,OAAO,CAAC,WAAW;IAWnB;;OAEG;IACH,OAAO,CAAC,gBAAgB;IAsCxB;;OAEG;IACH,OAAO,CAAC,aAAa;CA6BtB"}
|
|
@@ -0,0 +1,169 @@
|
|
|
1
|
+
// ============================================
|
|
2
|
+
// Claude CLI Provider 实现
|
|
3
|
+
// ============================================
|
|
4
|
+
import { spawn } from 'child_process';
|
|
5
|
+
import { AIProvider } from './provider.js';
|
|
6
|
+
/**
|
|
7
|
+
* Claude Provider - 通过 CLI 调用 Claude
|
|
8
|
+
*/
|
|
9
|
+
export class ClaudeProvider extends AIProvider {
|
|
10
|
+
name = 'claude';
|
|
11
|
+
cliPath;
|
|
12
|
+
constructor(config = {}) {
|
|
13
|
+
super(config);
|
|
14
|
+
this.cliPath = config.cliPath || 'claude';
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* 执行 AI 推理
|
|
18
|
+
*/
|
|
19
|
+
async execute(prompt, context) {
|
|
20
|
+
const timeout = this.config.timeout || 60000;
|
|
21
|
+
// 构建包含上下文的完整提示词
|
|
22
|
+
const fullPrompt = this.buildPrompt(prompt, context);
|
|
23
|
+
return new Promise((resolve, reject) => {
|
|
24
|
+
const args = [
|
|
25
|
+
'-p',
|
|
26
|
+
'--output-format', 'json',
|
|
27
|
+
'--dangerously-skip-permissions'
|
|
28
|
+
];
|
|
29
|
+
let stdout = '';
|
|
30
|
+
let stderr = '';
|
|
31
|
+
let killed = false;
|
|
32
|
+
const proc = spawn(this.cliPath, args, {
|
|
33
|
+
stdio: ['pipe', 'pipe', 'pipe'],
|
|
34
|
+
timeout
|
|
35
|
+
});
|
|
36
|
+
// 超时处理
|
|
37
|
+
const timeoutId = setTimeout(() => {
|
|
38
|
+
killed = true;
|
|
39
|
+
proc.kill('SIGTERM');
|
|
40
|
+
reject(new Error(`Claude 执行超时(${timeout / 1000}秒)`));
|
|
41
|
+
}, timeout);
|
|
42
|
+
proc.stdout.on('data', (data) => {
|
|
43
|
+
stdout += data.toString();
|
|
44
|
+
});
|
|
45
|
+
proc.stderr.on('data', (data) => {
|
|
46
|
+
stderr += data.toString();
|
|
47
|
+
});
|
|
48
|
+
proc.on('close', (code) => {
|
|
49
|
+
clearTimeout(timeoutId);
|
|
50
|
+
if (killed)
|
|
51
|
+
return;
|
|
52
|
+
if (code !== 0 && code !== null) {
|
|
53
|
+
reject(new Error(`Claude CLI 错误: ${stderr || `exit code ${code}`}`));
|
|
54
|
+
return;
|
|
55
|
+
}
|
|
56
|
+
try {
|
|
57
|
+
const response = this.parseResponse(stdout);
|
|
58
|
+
resolve(response);
|
|
59
|
+
}
|
|
60
|
+
catch (error) {
|
|
61
|
+
reject(new Error(`解析 Claude 响应失败: ${error instanceof Error ? error.message : String(error)}`));
|
|
62
|
+
}
|
|
63
|
+
});
|
|
64
|
+
proc.on('error', (error) => {
|
|
65
|
+
clearTimeout(timeoutId);
|
|
66
|
+
if (!killed) {
|
|
67
|
+
reject(new Error(`Claude CLI 执行失败: ${error.message}`));
|
|
68
|
+
}
|
|
69
|
+
});
|
|
70
|
+
// 发送提示词
|
|
71
|
+
proc.stdin.write(fullPrompt);
|
|
72
|
+
proc.stdin.end();
|
|
73
|
+
});
|
|
74
|
+
}
|
|
75
|
+
/**
|
|
76
|
+
* 检查 Claude CLI 是否可用
|
|
77
|
+
*/
|
|
78
|
+
async isAvailable() {
|
|
79
|
+
return new Promise((resolve) => {
|
|
80
|
+
const proc = spawn(this.cliPath, ['--version'], {
|
|
81
|
+
stdio: 'ignore'
|
|
82
|
+
});
|
|
83
|
+
proc.on('close', (code) => {
|
|
84
|
+
resolve(code === 0);
|
|
85
|
+
});
|
|
86
|
+
proc.on('error', () => {
|
|
87
|
+
resolve(false);
|
|
88
|
+
});
|
|
89
|
+
// 2 秒超时
|
|
90
|
+
setTimeout(() => {
|
|
91
|
+
proc.kill();
|
|
92
|
+
resolve(false);
|
|
93
|
+
}, 2000);
|
|
94
|
+
});
|
|
95
|
+
}
|
|
96
|
+
/**
|
|
97
|
+
* 构建提示词
|
|
98
|
+
*/
|
|
99
|
+
buildPrompt(prompt, context) {
|
|
100
|
+
let fullPrompt = prompt;
|
|
101
|
+
if (context) {
|
|
102
|
+
const contextInfo = this.summarizeContext(context);
|
|
103
|
+
fullPrompt = `${contextInfo}\n\n---\n\n${prompt}`;
|
|
104
|
+
}
|
|
105
|
+
return fullPrompt;
|
|
106
|
+
}
|
|
107
|
+
/**
|
|
108
|
+
* 总结 CodeMap 上下文
|
|
109
|
+
*/
|
|
110
|
+
summarizeContext(codeMap) {
|
|
111
|
+
const lines = [];
|
|
112
|
+
lines.push('# Project Context');
|
|
113
|
+
lines.push('');
|
|
114
|
+
lines.push(`Project: ${codeMap.project.name}`);
|
|
115
|
+
lines.push(`Total Files: ${codeMap.summary.totalFiles}`);
|
|
116
|
+
lines.push(`Total Modules: ${codeMap.summary.totalModules}`);
|
|
117
|
+
lines.push('');
|
|
118
|
+
// 入口点
|
|
119
|
+
const entryPoints = codeMap.modules.filter(m => {
|
|
120
|
+
const basename = require('path').basename(m.path);
|
|
121
|
+
return basename === 'index.ts' || basename === 'main.ts' || basename === 'app.ts';
|
|
122
|
+
});
|
|
123
|
+
if (entryPoints.length > 0) {
|
|
124
|
+
lines.push('## Entry Points');
|
|
125
|
+
for (const ep of entryPoints.slice(0, 5)) {
|
|
126
|
+
lines.push(`- ${ep.path}`);
|
|
127
|
+
}
|
|
128
|
+
lines.push('');
|
|
129
|
+
}
|
|
130
|
+
// 模块列表
|
|
131
|
+
lines.push('## Modules');
|
|
132
|
+
for (const mod of codeMap.modules.slice(0, 20)) {
|
|
133
|
+
const exports = mod.exports.map(e => e.name).join(', ');
|
|
134
|
+
lines.push(`- ${mod.path}: ${exports || '(no exports)'}`);
|
|
135
|
+
}
|
|
136
|
+
if (codeMap.modules.length > 20) {
|
|
137
|
+
lines.push(`- ... and ${codeMap.modules.length - 20} more`);
|
|
138
|
+
}
|
|
139
|
+
return lines.join('\n');
|
|
140
|
+
}
|
|
141
|
+
/**
|
|
142
|
+
* 解析 Claude CLI JSON 响应
|
|
143
|
+
*/
|
|
144
|
+
parseResponse(stdout) {
|
|
145
|
+
// Claude 可能输出多行 JSON,需要找到有效的 JSON
|
|
146
|
+
const lines = stdout.trim().split('\n');
|
|
147
|
+
let jsonStr = '';
|
|
148
|
+
// 从后往前找有效的 JSON 对象
|
|
149
|
+
for (let i = lines.length - 1; i >= 0; i--) {
|
|
150
|
+
const line = lines[i].trim();
|
|
151
|
+
if (line.startsWith('{') && line.endsWith('}')) {
|
|
152
|
+
jsonStr = line;
|
|
153
|
+
break;
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
if (!jsonStr) {
|
|
157
|
+
// 如果没有 JSON,直接返回原始输出
|
|
158
|
+
return { content: stdout.trim() };
|
|
159
|
+
}
|
|
160
|
+
const parsed = JSON.parse(jsonStr);
|
|
161
|
+
if (parsed.error) {
|
|
162
|
+
throw new Error(parsed.error);
|
|
163
|
+
}
|
|
164
|
+
return {
|
|
165
|
+
content: parsed.result || stdout.trim()
|
|
166
|
+
};
|
|
167
|
+
}
|
|
168
|
+
}
|
|
169
|
+
//# sourceMappingURL=claude.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"claude.js","sourceRoot":"","sources":["../../src/ai/claude.ts"],"names":[],"mappings":"AAAA,+CAA+C;AAC/C,yBAAyB;AACzB,+CAA+C;AAE/C,OAAO,EAAE,KAAK,EAAE,MAAM,eAAe,CAAC;AACtC,OAAO,EAAE,UAAU,EAA0C,MAAM,eAAe,CAAC;AAoBnF;;GAEG;AACH,MAAM,OAAO,cAAe,SAAQ,UAAU;IAC5B,IAAI,GAAG,QAAiB,CAAC;IACjC,OAAO,CAAS;IAExB,YAAY,SAA+B,EAAE;QAC3C,KAAK,CAAC,MAAM,CAAC,CAAC;QACd,IAAI,CAAC,OAAO,GAAG,MAAM,CAAC,OAAO,IAAI,QAAQ,CAAC;IAC5C,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,OAAO,CAAC,MAAc,EAAE,OAAiB;QAC7C,MAAM,OAAO,GAAG,IAAI,CAAC,MAAM,CAAC,OAAO,IAAI,KAAK,CAAC;QAE7C,gBAAgB;QAChB,MAAM,UAAU,GAAG,IAAI,CAAC,WAAW,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;QAErD,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;YACrC,MAAM,IAAI,GAAG;gBACX,IAAI;gBACJ,iBAAiB,EAAE,MAAM;gBACzB,gCAAgC;aACjC,CAAC;YAEF,IAAI,MAAM,GAAG,EAAE,CAAC;YAChB,IAAI,MAAM,GAAG,EAAE,CAAC;YAChB,IAAI,MAAM,GAAG,KAAK,CAAC;YAEnB,MAAM,IAAI,GAAG,KAAK,CAAC,IAAI,CAAC,OAAO,EAAE,IAAI,EAAE;gBACrC,KAAK,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC;gBAC/B,OAAO;aACR,CAAC,CAAC;YAEH,OAAO;YACP,MAAM,SAAS,GAAG,UAAU,CAAC,GAAG,EAAE;gBAChC,MAAM,GAAG,IAAI,CAAC;gBACd,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;gBACrB,MAAM,CAAC,IAAI,KAAK,CAAC,eAAe,OAAO,GAAG,IAAI,IAAI,CAAC,CAAC,CAAC;YACvD,CAAC,EAAE,OAAO,CAAC,CAAC;YAEZ,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,EAAE;gBAC9B,MAAM,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;YAC5B,CAAC,CAAC,CAAC;YAEH,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,EAAE;gBAC9B,MAAM,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;YAC5B,CAAC,CAAC,CAAC;YAEH,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,IAAI,EAAE,EAAE;gBACxB,YAAY,CAAC,SAAS,CAAC,CAAC;gBAExB,IAAI,MAAM;oBAAE,OAAO;gBAEnB,IAAI,IAAI,KAAK,CAAC,IAAI,IAAI,KAAK,IAAI,EAAE,CAAC;oBAChC,MAAM,CAAC,IAAI,KAAK,CAAC,kBAAkB,MAAM,IAAI,aAAa,IAAI,EAAE,EAAE,CAAC,CAAC,CAAC;oBACrE,OAAO;gBACT,CAAC;gBAED,IAAI,CAAC;oBACH,MAAM,QAAQ,GAAG,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC;oBAC5C,OAAO,CAAC,QAAQ,CAAC,CAAC;gBACpB,CAAC;gBAAC,OAAO,KAAK,EAAE,CAAC;oBACf,MAAM,CAAC,IAAI,KAAK,CAAC,mBAAmB,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC;gBACjG,CAAC;YACH,CAAC,CAAC,CAAC;YAEH,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,KAAK,EAAE,EAAE;gBACzB,YAAY,CAAC,SAAS,CAAC,CAAC;gBACxB,IAAI,CAAC,MAAM,EAAE,CAAC;oBACZ,MAAM,CAAC,IAAI,KAAK,CAAC,oBAAoB,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;gBACzD,CAAC;YACH,CAAC,CAAC,CAAC;YAEH,QAAQ;YACR,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC;YAC7B,IAAI,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC;QACnB,CAAC,CAAC,CAAC;IACL,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,WAAW;QACf,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE;YAC7B,MAAM,IAAI,GAAG,KAAK,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC,WAAW,CAAC,EAAE;gBAC9C,KAAK,EAAE,QAAQ;aAChB,CAAC,CAAC;YAEH,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,IAAI,EAAE,EAAE;gBACxB,OAAO,CAAC,IAAI,KAAK,CAAC,CAAC,CAAC;YACtB,CAAC,CAAC,CAAC;YAEH,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,GAAG,EAAE;gBACpB,OAAO,CAAC,KAAK,CAAC,CAAC;YACjB,CAAC,CAAC,CAAC;YAEH,QAAQ;YACR,UAAU,CAAC,GAAG,EAAE;gBACd,IAAI,CAAC,IAAI,EAAE,CAAC;gBACZ,OAAO,CAAC,KAAK,CAAC,CAAC;YACjB,CAAC,EAAE,IAAI,CAAC,CAAC;QACX,CAAC,CAAC,CAAC;IACL,CAAC;IAED;;OAEG;IACK,WAAW,CAAC,MAAc,EAAE,OAAiB;QACnD,IAAI,UAAU,GAAG,MAAM,CAAC;QAExB,IAAI,OAAO,EAAE,CAAC;YACZ,MAAM,WAAW,GAAG,IAAI,CAAC,gBAAgB,CAAC,OAAO,CAAC,CAAC;YACnD,UAAU,GAAG,GAAG,WAAW,cAAc,MAAM,EAAE,CAAC;QACpD,CAAC;QAED,OAAO,UAAU,CAAC;IACpB,CAAC;IAED;;OAEG;IACK,gBAAgB,CAAC,OAAgB;QACvC,MAAM,KAAK,GAAa,EAAE,CAAC;QAE3B,KAAK,CAAC,IAAI,CAAC,mBAAmB,CAAC,CAAC;QAChC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACf,KAAK,CAAC,IAAI,CAAC,YAAY,OAAO,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC;QAC/C,KAAK,CAAC,IAAI,CAAC,gBAAgB,OAAO,CAAC,OAAO,CAAC,UAAU,EAAE,CAAC,CAAC;QACzD,KAAK,CAAC,IAAI,CAAC,kBAAkB,OAAO,CAAC,OAAO,CAAC,YAAY,EAAE,CAAC,CAAC;QAC7D,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QAEf,MAAM;QACN,MAAM,WAAW,GAAG,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE;YAC7C,MAAM,QAAQ,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;YAClD,OAAO,QAAQ,KAAK,UAAU,IAAI,QAAQ,KAAK,SAAS,IAAI,QAAQ,KAAK,QAAQ,CAAC;QACpF,CAAC,CAAC,CAAC;QAEH,IAAI,WAAW,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC3B,KAAK,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC;YAC9B,KAAK,MAAM,EAAE,IAAI,WAAW,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC;gBACzC,KAAK,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC,IAAI,EAAE,CAAC,CAAC;YAC7B,CAAC;YACD,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACjB,CAAC;QAED,OAAO;QACP,KAAK,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;QACzB,KAAK,MAAM,GAAG,IAAI,OAAO,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC;YAC/C,MAAM,OAAO,GAAG,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACxD,KAAK,CAAC,IAAI,CAAC,KAAK,GAAG,CAAC,IAAI,KAAK,OAAO,IAAI,cAAc,EAAE,CAAC,CAAC;QAC5D,CAAC;QAED,IAAI,OAAO,CAAC,OAAO,CAAC,MAAM,GAAG,EAAE,EAAE,CAAC;YAChC,KAAK,CAAC,IAAI,CAAC,aAAa,OAAO,CAAC,OAAO,CAAC,MAAM,GAAG,EAAE,OAAO,CAAC,CAAC;QAC9D,CAAC;QAED,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC1B,CAAC;IAED;;OAEG;IACK,aAAa,CAAC,MAAc;QAClC,kCAAkC;QAClC,MAAM,KAAK,GAAG,MAAM,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QACxC,IAAI,OAAO,GAAG,EAAE,CAAC;QAEjB,mBAAmB;QACnB,KAAK,IAAI,CAAC,GAAG,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;YAC3C,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;YAC7B,IAAI,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;gBAC/C,OAAO,GAAG,IAAI,CAAC;gBACf,MAAM;YACR,CAAC;QACH,CAAC;QAED,IAAI,CAAC,OAAO,EAAE,CAAC;YACb,qBAAqB;YACrB,OAAO,EAAE,OAAO,EAAE,MAAM,CAAC,IAAI,EAAE,EAAE,CAAC;QACpC,CAAC;QAED,MAAM,MAAM,GAAsB,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;QAEtD,IAAI,MAAM,CAAC,KAAK,EAAE,CAAC;YACjB,MAAM,IAAI,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QAChC,CAAC;QAED,OAAO;YACL,OAAO,EAAE,MAAM,CAAC,MAAM,IAAI,MAAM,CAAC,IAAI,EAAE;SACxC,CAAC;IACJ,CAAC;CACF"}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import { AIProvider, type AIProviderConfig, type AIResponse } from './provider.js';
|
|
2
|
+
import type { CodeMap } from '../types/index.js';
|
|
3
|
+
/**
|
|
4
|
+
* Codex Provider 配置
|
|
5
|
+
*/
|
|
6
|
+
export interface CodexProviderConfig extends AIProviderConfig {
|
|
7
|
+
/** CLI 路径,默认 codex */
|
|
8
|
+
cliPath?: string;
|
|
9
|
+
}
|
|
10
|
+
/**
|
|
11
|
+
* Codex Provider - 通过 CLI 调用 Codex
|
|
12
|
+
*/
|
|
13
|
+
export declare class CodexProvider extends AIProvider {
|
|
14
|
+
readonly name: "codex";
|
|
15
|
+
private cliPath;
|
|
16
|
+
constructor(config?: CodexProviderConfig);
|
|
17
|
+
/**
|
|
18
|
+
* 执行 AI 推理
|
|
19
|
+
*/
|
|
20
|
+
execute(prompt: string, context?: CodeMap): Promise<AIResponse>;
|
|
21
|
+
/**
|
|
22
|
+
* 检查 Codex CLI 是否可用
|
|
23
|
+
*/
|
|
24
|
+
isAvailable(): Promise<boolean>;
|
|
25
|
+
/**
|
|
26
|
+
* 构建提示词
|
|
27
|
+
*/
|
|
28
|
+
private buildPrompt;
|
|
29
|
+
/**
|
|
30
|
+
* 总结 CodeMap 上下文
|
|
31
|
+
*/
|
|
32
|
+
private summarizeContext;
|
|
33
|
+
/**
|
|
34
|
+
* 解析 Codex CLI JSON 响应
|
|
35
|
+
*/
|
|
36
|
+
private parseResponse;
|
|
37
|
+
}
|
|
38
|
+
//# sourceMappingURL=codex.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"codex.d.ts","sourceRoot":"","sources":["../../src/ai/codex.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,UAAU,EAAE,KAAK,gBAAgB,EAAE,KAAK,UAAU,EAAE,MAAM,eAAe,CAAC;AACnF,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,mBAAmB,CAAC;AAEjD;;GAEG;AACH,MAAM,WAAW,mBAAoB,SAAQ,gBAAgB;IAC3D,sBAAsB;IACtB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED;;GAEG;AACH,qBAAa,aAAc,SAAQ,UAAU;IAC3C,SAAgB,IAAI,EAAG,OAAO,CAAU;IACxC,OAAO,CAAC,OAAO,CAAS;gBAEZ,MAAM,GAAE,mBAAwB;IAK5C;;OAEG;IACG,OAAO,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,OAAO,GAAG,OAAO,CAAC,UAAU,CAAC;IAiErE;;OAEG;IACG,WAAW,IAAI,OAAO,CAAC,OAAO,CAAC;IAsBrC;;OAEG;IACH,OAAO,CAAC,WAAW;IAWnB;;OAEG;IACH,OAAO,CAAC,gBAAgB;IAsCxB;;OAEG;IACH,OAAO,CAAC,aAAa;CA4BtB"}
|
package/dist/ai/codex.js
ADDED
|
@@ -0,0 +1,169 @@
|
|
|
1
|
+
// ============================================
|
|
2
|
+
// Codex CLI Provider 实现
|
|
3
|
+
// ============================================
|
|
4
|
+
import { spawn } from 'child_process';
|
|
5
|
+
import { AIProvider } from './provider.js';
|
|
6
|
+
/**
|
|
7
|
+
* Codex Provider - 通过 CLI 调用 Codex
|
|
8
|
+
*/
|
|
9
|
+
export class CodexProvider extends AIProvider {
|
|
10
|
+
name = 'codex';
|
|
11
|
+
cliPath;
|
|
12
|
+
constructor(config = {}) {
|
|
13
|
+
super(config);
|
|
14
|
+
this.cliPath = config.cliPath || 'codex';
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* 执行 AI 推理
|
|
18
|
+
*/
|
|
19
|
+
async execute(prompt, context) {
|
|
20
|
+
const timeout = this.config.timeout || 60000;
|
|
21
|
+
// 构建包含上下文的完整提示词
|
|
22
|
+
const fullPrompt = this.buildPrompt(prompt, context);
|
|
23
|
+
return new Promise((resolve, reject) => {
|
|
24
|
+
// Codex exec 使用位置参数传递 prompt
|
|
25
|
+
const args = [
|
|
26
|
+
'exec',
|
|
27
|
+
'--dangerously-bypass-approvals-and-sandbox',
|
|
28
|
+
fullPrompt
|
|
29
|
+
];
|
|
30
|
+
let stdout = '';
|
|
31
|
+
let stderr = '';
|
|
32
|
+
let killed = false;
|
|
33
|
+
const proc = spawn(this.cliPath, args, {
|
|
34
|
+
stdio: ['ignore', 'pipe', 'pipe'],
|
|
35
|
+
timeout
|
|
36
|
+
});
|
|
37
|
+
// 超时处理
|
|
38
|
+
const timeoutId = setTimeout(() => {
|
|
39
|
+
killed = true;
|
|
40
|
+
proc.kill('SIGTERM');
|
|
41
|
+
reject(new Error(`Codex 执行超时(${timeout / 1000}秒)`));
|
|
42
|
+
}, timeout);
|
|
43
|
+
proc.stdout.on('data', (data) => {
|
|
44
|
+
stdout += data.toString();
|
|
45
|
+
});
|
|
46
|
+
proc.stderr.on('data', (data) => {
|
|
47
|
+
stderr += data.toString();
|
|
48
|
+
});
|
|
49
|
+
proc.on('close', (code) => {
|
|
50
|
+
clearTimeout(timeoutId);
|
|
51
|
+
if (killed)
|
|
52
|
+
return;
|
|
53
|
+
if (code !== 0 && code !== null) {
|
|
54
|
+
reject(new Error(`Codex CLI 错误: ${stderr || `exit code ${code}`}`));
|
|
55
|
+
return;
|
|
56
|
+
}
|
|
57
|
+
try {
|
|
58
|
+
const response = this.parseResponse(stdout);
|
|
59
|
+
resolve(response);
|
|
60
|
+
}
|
|
61
|
+
catch (error) {
|
|
62
|
+
reject(new Error(`解析 Codex 响应失败: ${error instanceof Error ? error.message : String(error)}`));
|
|
63
|
+
}
|
|
64
|
+
});
|
|
65
|
+
proc.on('error', (error) => {
|
|
66
|
+
clearTimeout(timeoutId);
|
|
67
|
+
if (!killed) {
|
|
68
|
+
reject(new Error(`Codex CLI 执行失败: ${error.message}`));
|
|
69
|
+
}
|
|
70
|
+
});
|
|
71
|
+
});
|
|
72
|
+
}
|
|
73
|
+
/**
|
|
74
|
+
* 检查 Codex CLI 是否可用
|
|
75
|
+
*/
|
|
76
|
+
async isAvailable() {
|
|
77
|
+
return new Promise((resolve) => {
|
|
78
|
+
const proc = spawn(this.cliPath, ['--version'], {
|
|
79
|
+
stdio: 'ignore'
|
|
80
|
+
});
|
|
81
|
+
proc.on('close', (code) => {
|
|
82
|
+
resolve(code === 0);
|
|
83
|
+
});
|
|
84
|
+
proc.on('error', () => {
|
|
85
|
+
resolve(false);
|
|
86
|
+
});
|
|
87
|
+
// 2 秒超时
|
|
88
|
+
setTimeout(() => {
|
|
89
|
+
proc.kill();
|
|
90
|
+
resolve(false);
|
|
91
|
+
}, 2000);
|
|
92
|
+
});
|
|
93
|
+
}
|
|
94
|
+
/**
|
|
95
|
+
* 构建提示词
|
|
96
|
+
*/
|
|
97
|
+
buildPrompt(prompt, context) {
|
|
98
|
+
let fullPrompt = prompt;
|
|
99
|
+
if (context) {
|
|
100
|
+
const contextInfo = this.summarizeContext(context);
|
|
101
|
+
fullPrompt = `${contextInfo}\n\n---\n\n${prompt}`;
|
|
102
|
+
}
|
|
103
|
+
return fullPrompt;
|
|
104
|
+
}
|
|
105
|
+
/**
|
|
106
|
+
* 总结 CodeMap 上下文
|
|
107
|
+
*/
|
|
108
|
+
summarizeContext(codeMap) {
|
|
109
|
+
const lines = [];
|
|
110
|
+
lines.push('# Project Context');
|
|
111
|
+
lines.push('');
|
|
112
|
+
lines.push(`Project: ${codeMap.project.name}`);
|
|
113
|
+
lines.push(`Total Files: ${codeMap.summary.totalFiles}`);
|
|
114
|
+
lines.push(`Total Modules: ${codeMap.summary.totalModules}`);
|
|
115
|
+
lines.push('');
|
|
116
|
+
// 入口点
|
|
117
|
+
const entryPoints = codeMap.modules.filter(m => {
|
|
118
|
+
const basename = require('path').basename(m.path);
|
|
119
|
+
return basename === 'index.ts' || basename === 'main.ts' || basename === 'app.ts';
|
|
120
|
+
});
|
|
121
|
+
if (entryPoints.length > 0) {
|
|
122
|
+
lines.push('## Entry Points');
|
|
123
|
+
for (const ep of entryPoints.slice(0, 5)) {
|
|
124
|
+
lines.push(`- ${ep.path}`);
|
|
125
|
+
}
|
|
126
|
+
lines.push('');
|
|
127
|
+
}
|
|
128
|
+
// 模块列表
|
|
129
|
+
lines.push('## Modules');
|
|
130
|
+
for (const mod of codeMap.modules.slice(0, 20)) {
|
|
131
|
+
const exports = mod.exports.map(e => e.name).join(', ');
|
|
132
|
+
lines.push(`- ${mod.path}: ${exports || '(no exports)'}`);
|
|
133
|
+
}
|
|
134
|
+
if (codeMap.modules.length > 20) {
|
|
135
|
+
lines.push(`- ... and ${codeMap.modules.length - 20} more`);
|
|
136
|
+
}
|
|
137
|
+
return lines.join('\n');
|
|
138
|
+
}
|
|
139
|
+
/**
|
|
140
|
+
* 解析 Codex CLI JSON 响应
|
|
141
|
+
*/
|
|
142
|
+
parseResponse(stdout) {
|
|
143
|
+
// 尝试解析 JSON
|
|
144
|
+
const trimmed = stdout.trim();
|
|
145
|
+
try {
|
|
146
|
+
const parsed = JSON.parse(trimmed);
|
|
147
|
+
// 处理不同的响应格式
|
|
148
|
+
if (parsed.result) {
|
|
149
|
+
return { content: parsed.result };
|
|
150
|
+
}
|
|
151
|
+
if (parsed.output) {
|
|
152
|
+
return { content: parsed.output };
|
|
153
|
+
}
|
|
154
|
+
if (parsed.response) {
|
|
155
|
+
return { content: parsed.response };
|
|
156
|
+
}
|
|
157
|
+
if (parsed.message) {
|
|
158
|
+
return { content: parsed.message };
|
|
159
|
+
}
|
|
160
|
+
// 如果解析成功但没有已知字段,返回 stringify 后的内容
|
|
161
|
+
return { content: JSON.stringify(parsed, null, 2) };
|
|
162
|
+
}
|
|
163
|
+
catch {
|
|
164
|
+
// 如果不是 JSON,直接返回原始内容
|
|
165
|
+
return { content: trimmed };
|
|
166
|
+
}
|
|
167
|
+
}
|
|
168
|
+
}
|
|
169
|
+
//# sourceMappingURL=codex.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"codex.js","sourceRoot":"","sources":["../../src/ai/codex.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
import { AIProvider, type ProviderType, type AIProviderConfig } from './provider.js';
|
|
2
|
+
/**
|
|
3
|
+
* Provider 工厂
|
|
4
|
+
* 用于创建和管理 AI Provider 实例
|
|
5
|
+
*/
|
|
6
|
+
export declare class ProviderFactory {
|
|
7
|
+
/** 默认 Provider 优先级 */
|
|
8
|
+
private static readonly DEFAULT_PRIORITY;
|
|
9
|
+
/** 已创建的 Provider 实例缓存 */
|
|
10
|
+
private static providers;
|
|
11
|
+
/**
|
|
12
|
+
* 根据名称创建 Provider
|
|
13
|
+
*/
|
|
14
|
+
static create(type: ProviderType, config?: AIProviderConfig): AIProvider;
|
|
15
|
+
/**
|
|
16
|
+
* 自动检测可用的 Provider
|
|
17
|
+
* 按优先级顺序返回第一个可用的 Provider
|
|
18
|
+
*/
|
|
19
|
+
static detectAvailable(priority?: ProviderType[], config?: AIProviderConfig): Promise<{
|
|
20
|
+
provider: AIProvider;
|
|
21
|
+
type: ProviderType;
|
|
22
|
+
} | null>;
|
|
23
|
+
/**
|
|
24
|
+
* 获取所有可用的 Provider
|
|
25
|
+
*/
|
|
26
|
+
static getAllAvailable(config?: AIProviderConfig): Promise<Array<{
|
|
27
|
+
type: ProviderType;
|
|
28
|
+
provider: AIProvider;
|
|
29
|
+
}>>;
|
|
30
|
+
/**
|
|
31
|
+
* 检查特定 Provider 是否可用
|
|
32
|
+
*/
|
|
33
|
+
static checkAvailability(type: ProviderType): Promise<boolean>;
|
|
34
|
+
/**
|
|
35
|
+
* 清除 Provider 缓存
|
|
36
|
+
*/
|
|
37
|
+
static clearCache(): void;
|
|
38
|
+
/**
|
|
39
|
+
* 获取默认 Provider
|
|
40
|
+
* 优先使用 Claude,其次 Codex
|
|
41
|
+
*/
|
|
42
|
+
static getDefault(config?: AIProviderConfig): AIProvider;
|
|
43
|
+
}
|
|
44
|
+
/**
|
|
45
|
+
* 创建 AI Provider 实例的简便函数
|
|
46
|
+
*/
|
|
47
|
+
export declare function createAIProvider(type: ProviderType, config?: AIProviderConfig): AIProvider;
|
|
48
|
+
//# sourceMappingURL=factory.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"factory.d.ts","sourceRoot":"","sources":["../../src/ai/factory.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,UAAU,EAAE,KAAK,YAAY,EAAE,KAAK,gBAAgB,EAAE,MAAM,eAAe,CAAC;AAIrF;;;GAGG;AACH,qBAAa,eAAe;IAC1B,sBAAsB;IACtB,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,gBAAgB,CAAuC;IAE/E,yBAAyB;IACzB,OAAO,CAAC,MAAM,CAAC,SAAS,CAA4C;IAEpE;;OAEG;IACH,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,YAAY,EAAE,MAAM,CAAC,EAAE,gBAAgB,GAAG,UAAU;IA0BxE;;;OAGG;WACU,eAAe,CAC1B,QAAQ,GAAE,YAAY,EAA0B,EAChD,MAAM,CAAC,EAAE,gBAAgB,GACxB,OAAO,CAAC;QAAE,QAAQ,EAAE,UAAU,CAAC;QAAC,IAAI,EAAE,YAAY,CAAA;KAAE,GAAG,IAAI,CAAC;IAU/D;;OAEG;WACU,eAAe,CAC1B,MAAM,CAAC,EAAE,gBAAgB,GACxB,OAAO,CAAC,KAAK,CAAC;QAAE,IAAI,EAAE,YAAY,CAAC;QAAC,QAAQ,EAAE,UAAU,CAAA;KAAE,CAAC,CAAC;IAa/D;;OAEG;WACU,iBAAiB,CAAC,IAAI,EAAE,YAAY,GAAG,OAAO,CAAC,OAAO,CAAC;IAKpE;;OAEG;IACH,MAAM,CAAC,UAAU,IAAI,IAAI;IAOzB;;;OAGG;IACH,MAAM,CAAC,UAAU,CAAC,MAAM,CAAC,EAAE,gBAAgB,GAAG,UAAU;CAGzD;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,YAAY,EAAE,MAAM,CAAC,EAAE,gBAAgB,GAAG,UAAU,CAE1F"}
|
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
// ============================================
|
|
2
|
+
// Provider 工厂类
|
|
3
|
+
// ============================================
|
|
4
|
+
import { ClaudeProvider } from './claude.js';
|
|
5
|
+
import { CodexProvider } from './codex.js';
|
|
6
|
+
/**
|
|
7
|
+
* Provider 工厂
|
|
8
|
+
* 用于创建和管理 AI Provider 实例
|
|
9
|
+
*/
|
|
10
|
+
export class ProviderFactory {
|
|
11
|
+
/** 默认 Provider 优先级 */
|
|
12
|
+
static DEFAULT_PRIORITY = ['claude', 'codex'];
|
|
13
|
+
/** 已创建的 Provider 实例缓存 */
|
|
14
|
+
static providers = new Map();
|
|
15
|
+
/**
|
|
16
|
+
* 根据名称创建 Provider
|
|
17
|
+
*/
|
|
18
|
+
static create(type, config) {
|
|
19
|
+
// 如果已有缓存,直接返回
|
|
20
|
+
const cached = this.providers.get(type);
|
|
21
|
+
if (cached) {
|
|
22
|
+
return cached;
|
|
23
|
+
}
|
|
24
|
+
let provider;
|
|
25
|
+
switch (type) {
|
|
26
|
+
case 'claude':
|
|
27
|
+
provider = new ClaudeProvider(config);
|
|
28
|
+
break;
|
|
29
|
+
case 'codex':
|
|
30
|
+
provider = new CodexProvider(config);
|
|
31
|
+
break;
|
|
32
|
+
default:
|
|
33
|
+
throw new Error(`Unknown provider type: ${type}`);
|
|
34
|
+
}
|
|
35
|
+
// 缓存实例
|
|
36
|
+
this.providers.set(type, provider);
|
|
37
|
+
return provider;
|
|
38
|
+
}
|
|
39
|
+
/**
|
|
40
|
+
* 自动检测可用的 Provider
|
|
41
|
+
* 按优先级顺序返回第一个可用的 Provider
|
|
42
|
+
*/
|
|
43
|
+
static async detectAvailable(priority = this.DEFAULT_PRIORITY, config) {
|
|
44
|
+
for (const type of priority) {
|
|
45
|
+
const provider = this.create(type, config);
|
|
46
|
+
if (await provider.isAvailable()) {
|
|
47
|
+
return { provider, type };
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
return null;
|
|
51
|
+
}
|
|
52
|
+
/**
|
|
53
|
+
* 获取所有可用的 Provider
|
|
54
|
+
*/
|
|
55
|
+
static async getAllAvailable(config) {
|
|
56
|
+
const results = [];
|
|
57
|
+
for (const type of this.DEFAULT_PRIORITY) {
|
|
58
|
+
const provider = this.create(type, config);
|
|
59
|
+
if (await provider.isAvailable()) {
|
|
60
|
+
results.push({ type, provider });
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
return results;
|
|
64
|
+
}
|
|
65
|
+
/**
|
|
66
|
+
* 检查特定 Provider 是否可用
|
|
67
|
+
*/
|
|
68
|
+
static async checkAvailability(type) {
|
|
69
|
+
const provider = this.create(type);
|
|
70
|
+
return provider.isAvailable();
|
|
71
|
+
}
|
|
72
|
+
/**
|
|
73
|
+
* 清除 Provider 缓存
|
|
74
|
+
*/
|
|
75
|
+
static clearCache() {
|
|
76
|
+
this.providers.forEach((provider) => {
|
|
77
|
+
provider.destroy();
|
|
78
|
+
});
|
|
79
|
+
this.providers.clear();
|
|
80
|
+
}
|
|
81
|
+
/**
|
|
82
|
+
* 获取默认 Provider
|
|
83
|
+
* 优先使用 Claude,其次 Codex
|
|
84
|
+
*/
|
|
85
|
+
static getDefault(config) {
|
|
86
|
+
return this.create('claude', config);
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
/**
|
|
90
|
+
* 创建 AI Provider 实例的简便函数
|
|
91
|
+
*/
|
|
92
|
+
export function createAIProvider(type, config) {
|
|
93
|
+
return ProviderFactory.create(type, config);
|
|
94
|
+
}
|
|
95
|
+
//# sourceMappingURL=factory.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"factory.js","sourceRoot":"","sources":["../../src/ai/factory.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
export type { AIProviderConfig, AIResponse, ProviderType, ProviderFactoryConfig } from './provider.js';
|
|
2
|
+
export type { AIProviderOptions, ChatRequest, ChatResponse, ProviderStatus, ProviderInfo, CLIResult } from './types.js';
|
|
3
|
+
export { AIProvider } from './provider.js';
|
|
4
|
+
export { ClaudeProvider, type ClaudeProviderConfig } from './claude.js';
|
|
5
|
+
export { CodexProvider, type CodexProviderConfig } from './codex.js';
|
|
6
|
+
export { ProviderFactory, createAIProvider } from './factory.js';
|
|
7
|
+
import type { ProviderType } from './provider.js';
|
|
8
|
+
export declare const PROVIDER_INFO: Record<ProviderType, {
|
|
9
|
+
displayName: string;
|
|
10
|
+
description: string;
|
|
11
|
+
}>;
|
|
12
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/ai/index.ts"],"names":[],"mappings":"AAKA,YAAY,EACV,gBAAgB,EAChB,UAAU,EACV,YAAY,EACZ,qBAAqB,EACtB,MAAM,eAAe,CAAC;AAEvB,YAAY,EACV,iBAAiB,EACjB,WAAW,EACX,YAAY,EACZ,cAAc,EACd,YAAY,EACZ,SAAS,EACV,MAAM,YAAY,CAAC;AAGpB,OAAO,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAG3C,OAAO,EAAE,cAAc,EAAE,KAAK,oBAAoB,EAAE,MAAM,aAAa,CAAC;AACxE,OAAO,EAAE,aAAa,EAAE,KAAK,mBAAmB,EAAE,MAAM,YAAY,CAAC;AAGrE,OAAO,EAAE,eAAe,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;AAGjE,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAElD,eAAO,MAAM,aAAa,EAAE,MAAM,CAAC,YAAY,EAAE;IAAE,WAAW,EAAE,MAAM,CAAC;IAAC,WAAW,EAAE,MAAM,CAAA;CAAE,CAiB5F,CAAC"}
|
package/dist/ai/index.js
ADDED
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
// ============================================
|
|
2
|
+
// AI Provider 模块导出
|
|
3
|
+
// ============================================
|
|
4
|
+
// 抽象基类
|
|
5
|
+
export { AIProvider } from './provider.js';
|
|
6
|
+
// Provider 实现
|
|
7
|
+
export { ClaudeProvider } from './claude.js';
|
|
8
|
+
export { CodexProvider } from './codex.js';
|
|
9
|
+
// 工厂类
|
|
10
|
+
export { ProviderFactory, createAIProvider } from './factory.js';
|
|
11
|
+
export const PROVIDER_INFO = {
|
|
12
|
+
claude: {
|
|
13
|
+
displayName: 'Claude CLI',
|
|
14
|
+
description: 'Anthropic Claude via CLI'
|
|
15
|
+
},
|
|
16
|
+
codex: {
|
|
17
|
+
displayName: 'Codex CLI',
|
|
18
|
+
description: 'OpenAI Codex via CLI'
|
|
19
|
+
},
|
|
20
|
+
openai: {
|
|
21
|
+
displayName: 'OpenAI',
|
|
22
|
+
description: 'OpenAI API'
|
|
23
|
+
},
|
|
24
|
+
gemini: {
|
|
25
|
+
displayName: 'Google Gemini',
|
|
26
|
+
description: 'Google Gemini API'
|
|
27
|
+
}
|
|
28
|
+
};
|
|
29
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/ai/index.ts"],"names":[],"mappings":"AAAA,+CAA+C;AAC/C,mBAAmB;AACnB,+CAA+C;AAmB/C,OAAO;AACP,OAAO,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAE3C,cAAc;AACd,OAAO,EAAE,cAAc,EAA6B,MAAM,aAAa,CAAC;AACxE,OAAO,EAAE,aAAa,EAA4B,MAAM,YAAY,CAAC;AAErE,MAAM;AACN,OAAO,EAAE,eAAe,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;AAKjE,MAAM,CAAC,MAAM,aAAa,GAAuE;IAC/F,MAAM,EAAE;QACN,WAAW,EAAE,YAAY;QACzB,WAAW,EAAE,0BAA0B;KACxC;IACD,KAAK,EAAE;QACL,WAAW,EAAE,WAAW;QACxB,WAAW,EAAE,sBAAsB;KACpC;IACD,MAAM,EAAE;QACN,WAAW,EAAE,QAAQ;QACrB,WAAW,EAAE,YAAY;KAC1B;IACD,MAAM,EAAE;QACN,WAAW,EAAE,eAAe;QAC5B,WAAW,EAAE,mBAAmB;KACjC;CACF,CAAC"}
|