diff --git a/gitnexus/src/cli/index.ts b/gitnexus/src/cli/index.ts index 4b009e4aa..0243a3d63 100644 --- a/gitnexus/src/cli/index.ts +++ b/gitnexus/src/cli/index.ts @@ -166,6 +166,7 @@ program .option('--gist', 'Publish wiki as a public GitHub Gist after generation') .option('-v, --verbose', 'Enable verbose output (show LLM commands and responses)') .option('--review', 'Stop after grouping to review module structure before generating pages') + .option('--lang ', 'Output language for generated documentation (e.g. english, chinese, spanish, japanese)') .action(createLazyAction(() => import('./wiki.js'), 'wikiCommand')); program diff --git a/gitnexus/src/cli/wiki.ts b/gitnexus/src/cli/wiki.ts index 8d9da9572..fbba987ec 100644 --- a/gitnexus/src/cli/wiki.ts +++ b/gitnexus/src/cli/wiki.ts @@ -35,6 +35,7 @@ export interface WikiCommandOptions { review?: boolean; timeout?: string; retries?: string; + lang?: string; } /** @@ -395,6 +396,7 @@ export const wikiCommand = async (inputPath?: string, options?: WikiCommandOptio force: options?.force, concurrency: options?.concurrency ? parseInt(options.concurrency, 10) : undefined, reviewOnly: options?.review, + lang: options?.lang, }; const generator = new WikiGenerator( diff --git a/gitnexus/src/core/wiki/generator.ts b/gitnexus/src/core/wiki/generator.ts index dc9c2e74e..4d4b30572 100644 --- a/gitnexus/src/core/wiki/generator.ts +++ b/gitnexus/src/core/wiki/generator.ts @@ -66,6 +66,8 @@ export interface WikiOptions { concurrency?: number; /** If true, stop after building module tree for user review */ reviewOnly?: boolean; + /** Output language for generated documentation (e.g. 'english', 'chinese', 'spanish') */ + lang?: string; } export interface WikiMeta { @@ -177,6 +179,15 @@ export class WikiGenerator { }; } + /** + * Append an output-language instruction to a system prompt when --lang is set. + */ + private buildSystemPrompt(base: string): string { + if (!this.options.lang) return base; + const lang = this.options.lang.trim(); + return `${base}\n\nIMPORTANT: Write ALL documentation content in ${lang}. This includes headings, prose, code comments in examples, and diagram labels.`; + } + /** * Route LLM call to the appropriate provider (OpenAI-compatible or Cursor CLI). */ @@ -417,7 +428,7 @@ export class WikiGenerator { const response = await this.invokeLLM( prompt, - GROUPING_SYSTEM_PROMPT, + this.buildSystemPrompt(GROUPING_SYSTEM_PROMPT), this.streamOpts('Grouping files', 15, 13), ); const grouping = this.parseGroupingResponse(response.content, files); @@ -589,7 +600,7 @@ export class WikiGenerator { PROCESSES: formatProcesses(processes), }); - const response = await this.invokeLLM(prompt, MODULE_SYSTEM_PROMPT, this.streamOpts(node.name)); + const response = await this.invokeLLM(prompt, this.buildSystemPrompt(MODULE_SYSTEM_PROMPT), this.streamOpts(node.name)); // Write page with front matter const pageContent = sanitizeMermaidMarkdown(`# ${node.name}\n\n${response.content}`); @@ -630,7 +641,7 @@ export class WikiGenerator { CROSS_PROCESSES: formatProcesses(processes), }); - const response = await this.invokeLLM(prompt, PARENT_SYSTEM_PROMPT, this.streamOpts(node.name)); + const response = await this.invokeLLM(prompt, this.buildSystemPrompt(PARENT_SYSTEM_PROMPT), this.streamOpts(node.name)); const pageContent = sanitizeMermaidMarkdown(`# ${node.name}\n\n${response.content}`); await fs.writeFile(path.join(this.wikiDir, `${node.slug}.md`), pageContent, 'utf-8'); @@ -678,7 +689,7 @@ export class WikiGenerator { const response = await this.invokeLLM( prompt, - OVERVIEW_SYSTEM_PROMPT, + this.buildSystemPrompt(OVERVIEW_SYSTEM_PROMPT), this.streamOpts('Generating overview', 88), );