autogit-tool 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.
Files changed (119) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +42 -0
  3. package/dist/ai/prompts.d.ts +10 -0
  4. package/dist/ai/prompts.d.ts.map +1 -0
  5. package/dist/ai/prompts.js +169 -0
  6. package/dist/ai/prompts.js.map +1 -0
  7. package/dist/ai/provider.d.ts +24 -0
  8. package/dist/ai/provider.d.ts.map +1 -0
  9. package/dist/ai/provider.js +305 -0
  10. package/dist/ai/provider.js.map +1 -0
  11. package/dist/cli.d.ts +3 -0
  12. package/dist/cli.d.ts.map +1 -0
  13. package/dist/cli.js +228 -0
  14. package/dist/cli.js.map +1 -0
  15. package/dist/commands/analyze.d.ts +4 -0
  16. package/dist/commands/analyze.d.ts.map +1 -0
  17. package/dist/commands/analyze.js +63 -0
  18. package/dist/commands/analyze.js.map +1 -0
  19. package/dist/commands/config.d.ts +8 -0
  20. package/dist/commands/config.d.ts.map +1 -0
  21. package/dist/commands/config.js +457 -0
  22. package/dist/commands/config.js.map +1 -0
  23. package/dist/commands/docs.d.ts +5 -0
  24. package/dist/commands/docs.d.ts.map +1 -0
  25. package/dist/commands/docs.js +22 -0
  26. package/dist/commands/docs.js.map +1 -0
  27. package/dist/commands/doctor.d.ts +2 -0
  28. package/dist/commands/doctor.d.ts.map +1 -0
  29. package/dist/commands/doctor.js +69 -0
  30. package/dist/commands/doctor.js.map +1 -0
  31. package/dist/commands/github.d.ts +5 -0
  32. package/dist/commands/github.d.ts.map +1 -0
  33. package/dist/commands/github.js +46 -0
  34. package/dist/commands/github.js.map +1 -0
  35. package/dist/commands/init.d.ts +2 -0
  36. package/dist/commands/init.d.ts.map +1 -0
  37. package/dist/commands/init.js +38 -0
  38. package/dist/commands/init.js.map +1 -0
  39. package/dist/commands/linkedin.d.ts +4 -0
  40. package/dist/commands/linkedin.d.ts.map +1 -0
  41. package/dist/commands/linkedin.js +42 -0
  42. package/dist/commands/linkedin.js.map +1 -0
  43. package/dist/commands/login.d.ts +2 -0
  44. package/dist/commands/login.d.ts.map +1 -0
  45. package/dist/commands/login.js +301 -0
  46. package/dist/commands/login.js.map +1 -0
  47. package/dist/commands/publish.d.ts +5 -0
  48. package/dist/commands/publish.d.ts.map +1 -0
  49. package/dist/commands/publish.js +58 -0
  50. package/dist/commands/publish.js.map +1 -0
  51. package/dist/commands/readme.d.ts +5 -0
  52. package/dist/commands/readme.d.ts.map +1 -0
  53. package/dist/commands/readme.js +32 -0
  54. package/dist/commands/readme.js.map +1 -0
  55. package/dist/commands/release.d.ts +5 -0
  56. package/dist/commands/release.d.ts.map +1 -0
  57. package/dist/commands/release.js +56 -0
  58. package/dist/commands/release.js.map +1 -0
  59. package/dist/commands/resume.d.ts +8 -0
  60. package/dist/commands/resume.d.ts.map +1 -0
  61. package/dist/commands/resume.js +228 -0
  62. package/dist/commands/resume.js.map +1 -0
  63. package/dist/config/manager.d.ts +67 -0
  64. package/dist/config/manager.d.ts.map +1 -0
  65. package/dist/config/manager.js +78 -0
  66. package/dist/config/manager.js.map +1 -0
  67. package/dist/index.d.ts +6 -0
  68. package/dist/index.d.ts.map +1 -0
  69. package/dist/index.js +6 -0
  70. package/dist/index.js.map +1 -0
  71. package/dist/pipeline/main-pipeline.d.ts +15 -0
  72. package/dist/pipeline/main-pipeline.d.ts.map +1 -0
  73. package/dist/pipeline/main-pipeline.js +279 -0
  74. package/dist/pipeline/main-pipeline.js.map +1 -0
  75. package/dist/scanner/file-scanner.d.ts +21 -0
  76. package/dist/scanner/file-scanner.d.ts.map +1 -0
  77. package/dist/scanner/file-scanner.js +90 -0
  78. package/dist/scanner/file-scanner.js.map +1 -0
  79. package/dist/scanner/project-analyzer.d.ts +26 -0
  80. package/dist/scanner/project-analyzer.d.ts.map +1 -0
  81. package/dist/scanner/project-analyzer.js +454 -0
  82. package/dist/scanner/project-analyzer.js.map +1 -0
  83. package/dist/services/docs-generator.d.ts +11 -0
  84. package/dist/services/docs-generator.d.ts.map +1 -0
  85. package/dist/services/docs-generator.js +172 -0
  86. package/dist/services/docs-generator.js.map +1 -0
  87. package/dist/services/git-service.d.ts +22 -0
  88. package/dist/services/git-service.d.ts.map +1 -0
  89. package/dist/services/git-service.js +162 -0
  90. package/dist/services/git-service.js.map +1 -0
  91. package/dist/services/github-service.d.ts +44 -0
  92. package/dist/services/github-service.d.ts.map +1 -0
  93. package/dist/services/github-service.js +131 -0
  94. package/dist/services/github-service.js.map +1 -0
  95. package/dist/services/insights.d.ts +24 -0
  96. package/dist/services/insights.d.ts.map +1 -0
  97. package/dist/services/insights.js +140 -0
  98. package/dist/services/insights.js.map +1 -0
  99. package/dist/services/readme-manager.d.ts +11 -0
  100. package/dist/services/readme-manager.d.ts.map +1 -0
  101. package/dist/services/readme-manager.js +180 -0
  102. package/dist/services/readme-manager.js.map +1 -0
  103. package/dist/services/resume-manager.d.ts +29 -0
  104. package/dist/services/resume-manager.d.ts.map +1 -0
  105. package/dist/services/resume-manager.js +186 -0
  106. package/dist/services/resume-manager.js.map +1 -0
  107. package/dist/services/social-generator.d.ts +14 -0
  108. package/dist/services/social-generator.d.ts.map +1 -0
  109. package/dist/services/social-generator.js +93 -0
  110. package/dist/services/social-generator.js.map +1 -0
  111. package/dist/utils/logger.d.ts +19 -0
  112. package/dist/utils/logger.d.ts.map +1 -0
  113. package/dist/utils/logger.js +81 -0
  114. package/dist/utils/logger.js.map +1 -0
  115. package/dist/utils/platform.d.ts +8 -0
  116. package/dist/utils/platform.d.ts.map +1 -0
  117. package/dist/utils/platform.js +27 -0
  118. package/dist/utils/platform.js.map +1 -0
  119. package/package.json +74 -0
@@ -0,0 +1,457 @@
1
+ import chalk from 'chalk';
2
+ import inquirer from 'inquirer';
3
+ import { loadConfig, saveConfig } from '../config/manager.js';
4
+ import { getConfigPath } from '../utils/platform.js';
5
+ import { listProviders, getProvider } from '../ai/provider.js';
6
+ import { logger, spinner } from '../utils/logger.js';
7
+ // Keys that hold API secrets — masked in display
8
+ const SECRET_PATHS = [
9
+ 'github.token',
10
+ 'ai.openaiKey',
11
+ 'ai.anthropicKey',
12
+ 'ai.geminiKey',
13
+ 'ai.openrouterKey',
14
+ 'ai.mistralKey',
15
+ 'ai.groqKey',
16
+ 'ai.deepseekKey',
17
+ 'ai.perplexityKey',
18
+ 'ai.togetherKey',
19
+ 'ai.cohereKey',
20
+ 'ai.xaiKey',
21
+ 'ai.azureOpenAIKey',
22
+ ];
23
+ // Non-secret fields (shown as plain text, never masked)
24
+ const NON_SECRET_KEYS = new Set([
25
+ 'ollamaEndpoint',
26
+ 'azureOpenAIEndpoint',
27
+ 'azureOpenAIDeployment',
28
+ 'azureOpenAIApiVersion',
29
+ 'provider',
30
+ 'model',
31
+ ]);
32
+ const PROVIDER_FIELDS = {
33
+ openai: [{ label: 'OpenAI API Key', key: 'openaiKey', hint: 'OPENAI_API_KEY' }],
34
+ anthropic: [{ label: 'Anthropic API Key', key: 'anthropicKey', hint: 'ANTHROPIC_API_KEY' }],
35
+ gemini: [{ label: 'Google Gemini API Key', key: 'geminiKey', hint: 'GEMINI_API_KEY' }],
36
+ ollama: [{ label: 'Ollama endpoint', key: 'ollamaEndpoint', hint: 'OLLAMA_ENDPOINT' }],
37
+ openrouter: [{ label: 'OpenRouter API Key', key: 'openrouterKey', hint: 'OPENROUTER_API_KEY' }],
38
+ mistral: [{ label: 'Mistral API Key', key: 'mistralKey', hint: 'MISTRAL_API_KEY' }],
39
+ groq: [{ label: 'Groq API Key', key: 'groqKey', hint: 'GROQ_API_KEY' }],
40
+ deepseek: [{ label: 'DeepSeek API Key', key: 'deepseekKey', hint: 'DEEPSEEK_API_KEY' }],
41
+ perplexity: [{ label: 'Perplexity API Key', key: 'perplexityKey', hint: 'PERPLEXITY_API_KEY' }],
42
+ together: [{ label: 'Together AI API Key', key: 'togetherKey', hint: 'TOGETHER_API_KEY' }],
43
+ cohere: [{ label: 'Cohere API Key', key: 'cohereKey', hint: 'COHERE_API_KEY' }],
44
+ xai: [{ label: 'xAI API Key', key: 'xaiKey', hint: 'XAI_API_KEY' }],
45
+ 'azure-openai': [
46
+ { label: 'Azure OpenAI API Key', key: 'azureOpenAIKey', hint: 'AZURE_OPENAI_KEY' },
47
+ { label: 'Azure endpoint (https://RESOURCE.openai.azure.com)', key: 'azureOpenAIEndpoint', hint: 'AZURE_OPENAI_ENDPOINT' },
48
+ { label: 'Deployment name', key: 'azureOpenAIDeployment', hint: 'AZURE_OPENAI_DEPLOYMENT' },
49
+ { label: 'API version', key: 'azureOpenAIApiVersion', hint: 'AZURE_OPENAI_API_VERSION' },
50
+ ],
51
+ };
52
+ // ─── Entry point ──────────────────────────────────────────────────────────────
53
+ export async function cmdConfig(opts) {
54
+ logger.header('AutoGit Configuration');
55
+ logger.dimmed(`Config file: ${getConfigPath()}`);
56
+ logger.blank();
57
+ if (opts.debug) {
58
+ debugConfig();
59
+ return;
60
+ }
61
+ if (opts.list) {
62
+ displayConfig();
63
+ return;
64
+ }
65
+ if (opts.test) {
66
+ await testCurrentProvider();
67
+ return;
68
+ }
69
+ if (opts.get) {
70
+ const value = getNestedValue(loadConfig(), opts.get);
71
+ value !== undefined
72
+ ? console.log(`${opts.get} = ${JSON.stringify(value)}`)
73
+ : logger.dimmed(`${opts.get} is not set`);
74
+ return;
75
+ }
76
+ if (opts.set) {
77
+ const eqIdx = opts.set.indexOf('=');
78
+ if (eqIdx === -1) {
79
+ logger.error('Use format: --set key=value (e.g. --set defaults.visibility=public)');
80
+ return;
81
+ }
82
+ const key = opts.set.slice(0, eqIdx).trim();
83
+ const value = opts.set.slice(eqIdx + 1).trim();
84
+ const config = loadConfig();
85
+ setNestedValue(config, key, value);
86
+ saveConfig(config);
87
+ logger.success(`Set ${key} = ${value}`);
88
+ return;
89
+ }
90
+ await interactiveConfig();
91
+ }
92
+ // ─── Interactive wizard ───────────────────────────────────────────────────────
93
+ async function interactiveConfig() {
94
+ const { section } = await inquirer.prompt([{
95
+ type: 'list',
96
+ name: 'section',
97
+ message: 'What would you like to configure?',
98
+ choices: [
99
+ { name: 'AI Provider & Keys', value: 'ai' },
100
+ { name: 'GitHub Token', value: 'github' },
101
+ { name: 'Defaults', value: 'defaults' },
102
+ { name: 'View current config', value: 'view' },
103
+ ],
104
+ }]);
105
+ if (section === 'view') {
106
+ displayConfig();
107
+ return;
108
+ }
109
+ if (section === 'ai') {
110
+ await configureAI();
111
+ return;
112
+ }
113
+ if (section === 'github') {
114
+ await configureGitHub();
115
+ return;
116
+ }
117
+ if (section === 'defaults') {
118
+ await configureDefaults();
119
+ return;
120
+ }
121
+ }
122
+ async function configureAI() {
123
+ const config = loadConfig();
124
+ config.ai = config.ai ?? {};
125
+ const providers = listProviders();
126
+ const choices = providers.map(p => {
127
+ const badge = p.configured ? chalk.green('● configured') : chalk.gray('○ not set');
128
+ return {
129
+ name: `${p.name.padEnd(14)} ${badge} ${chalk.dim('default: ' + p.defaultModel)}`,
130
+ value: p.name,
131
+ };
132
+ });
133
+ const { provider } = await inquirer.prompt([{
134
+ type: 'list',
135
+ name: 'provider',
136
+ message: 'Select AI provider:',
137
+ choices,
138
+ default: config.ai.provider,
139
+ }]);
140
+ config.ai.provider = provider;
141
+ logger.blank();
142
+ logger.dimmed('Paste your key and press Enter. The value is stored in ~/.autogit/config.json');
143
+ logger.blank();
144
+ // ── Collect + sanitise credentials ──────────────────────────────────────
145
+ const fields = PROVIDER_FIELDS[provider];
146
+ for (const field of fields) {
147
+ const isSecret = !NON_SECRET_KEYS.has(field.key);
148
+ const currentRaw = config.ai[field.key];
149
+ // Build a hint line showing the last 4 chars of an existing secret
150
+ if (currentRaw && isSecret) {
151
+ logger.dimmed(` current: ***${currentRaw.slice(-4)} (press Enter to keep)`);
152
+ }
153
+ const defaultDisplay = isSecret
154
+ ? undefined
155
+ : (currentRaw ?? (field.key === 'ollamaEndpoint' ? 'http://localhost:11434' : ''));
156
+ const { raw } = await inquirer.prompt([{
157
+ type: 'input',
158
+ name: 'raw',
159
+ message: `${field.label}${field.hint ? chalk.dim(` [env: ${field.hint}]`) : ''}:`,
160
+ default: defaultDisplay,
161
+ }]);
162
+ // ❶ Sanitize: trim + remove ALL invisible/non-printable characters
163
+ const value = sanitizeKey(raw);
164
+ // ❷ Empty + existing = keep existing
165
+ if (!value && currentRaw)
166
+ continue;
167
+ // ❸ Save only if non-empty
168
+ if (value) {
169
+ config.ai[field.key] = value;
170
+ if (isSecret) {
171
+ logger.dimmed(` saved: ***${value.slice(-4)}`);
172
+ }
173
+ }
174
+ }
175
+ // Optional model override
176
+ logger.blank();
177
+ const { customModel } = await inquirer.prompt([{
178
+ type: 'input',
179
+ name: 'customModel',
180
+ message: `Override model ${chalk.dim('(leave blank to use provider default)')}:`,
181
+ default: config.ai.model ?? '',
182
+ }]);
183
+ const trimmedModel = customModel.trim();
184
+ if (trimmedModel) {
185
+ config.ai.model = trimmedModel;
186
+ }
187
+ else {
188
+ delete config.ai.model;
189
+ }
190
+ saveConfig(config);
191
+ logger.success(`Provider set to "${provider}" — config saved`);
192
+ logger.blank();
193
+ // ── Verify the key immediately ───────────────────────────────────────────
194
+ await testCurrentProvider();
195
+ }
196
+ async function configureGitHub() {
197
+ const config = loadConfig();
198
+ logger.blank();
199
+ logger.dimmed('Create a token at: https://github.com/settings/tokens');
200
+ logger.dimmed('Required scopes: repo, read:user');
201
+ logger.blank();
202
+ const { raw } = await inquirer.prompt([{
203
+ type: 'input',
204
+ name: 'raw',
205
+ message: 'GitHub Personal Access Token:',
206
+ }]);
207
+ // Always sanitize
208
+ const token = sanitizeKey(raw);
209
+ if (!token) {
210
+ logger.dimmed('No changes made.');
211
+ return;
212
+ }
213
+ config.github = config.github ?? {};
214
+ config.github.token = token;
215
+ saveConfig(config);
216
+ logger.dimmed(` saved: ***${token.slice(-4)}`);
217
+ logger.blank();
218
+ // Verify immediately
219
+ const spin = spinner('Verifying with GitHub...').start();
220
+ try {
221
+ const res = await fetch('https://api.github.com/user', {
222
+ headers: { Authorization: `Bearer ${token}` },
223
+ });
224
+ if (res.ok) {
225
+ const user = (await res.json());
226
+ spin.succeed(`Authenticated as ${chalk.bold(user.login)}`);
227
+ }
228
+ else {
229
+ const body = (await res.json());
230
+ spin.fail(`GitHub rejected the token: ${body.message ?? res.status}`);
231
+ logger.dimmed('Double-check the token has the correct scopes (repo, read:user).');
232
+ }
233
+ }
234
+ catch (e) {
235
+ spin.fail(`Network error: ${e.message}`);
236
+ }
237
+ }
238
+ async function configureDefaults() {
239
+ const config = loadConfig();
240
+ config.defaults = config.defaults ?? {};
241
+ const answers = await inquirer.prompt([
242
+ {
243
+ type: 'list', name: 'visibility',
244
+ message: 'Default repository visibility:',
245
+ choices: ['public', 'private'],
246
+ default: config.defaults.visibility ?? 'public',
247
+ },
248
+ {
249
+ type: 'input', name: 'branch',
250
+ message: 'Default branch name:',
251
+ default: config.defaults.branch ?? 'main',
252
+ },
253
+ {
254
+ type: 'list', name: 'commitStyle',
255
+ message: 'Commit message style:',
256
+ choices: [
257
+ { name: 'Conventional Commits (feat: / fix: / docs: …)', value: 'conventional' },
258
+ { name: 'Simple one-liner', value: 'simple' },
259
+ ],
260
+ default: config.defaults.commitStyle ?? 'conventional',
261
+ },
262
+ {
263
+ type: 'list', name: 'linkedinStyle',
264
+ message: 'LinkedIn post tone:',
265
+ choices: ['professional', 'casual', 'technical'],
266
+ default: config.defaults.linkedinStyle ?? 'professional',
267
+ },
268
+ {
269
+ type: 'list', name: 'license',
270
+ message: 'Default license:',
271
+ choices: ['MIT', 'Apache-2.0', 'GPL-3.0', 'BSD-3-Clause', 'ISC', 'None'],
272
+ default: config.defaults.license ?? 'MIT',
273
+ },
274
+ {
275
+ type: 'confirm', name: 'autoConfirm',
276
+ message: 'Auto-confirm all prompts (same as --yes flag)?',
277
+ default: config.defaults.autoConfirm ?? false,
278
+ },
279
+ ]);
280
+ config.defaults = { ...config.defaults, ...answers };
281
+ saveConfig(config);
282
+ logger.success('Defaults saved');
283
+ }
284
+ // ─── Key verification ─────────────────────────────────────────────────────────
285
+ async function testCurrentProvider() {
286
+ const config = loadConfig();
287
+ const ai = config.ai ?? {};
288
+ const providerName = ai.provider || 'openai';
289
+ logger.info(`Testing provider: ${chalk.bold(providerName)}, model: ${chalk.bold(ai.model || '(default)')}`);
290
+ logger.blank();
291
+ const spin = spinner('Sending test request...').start();
292
+ try {
293
+ const provider = getProvider();
294
+ await provider.generate([{ role: 'user', content: 'Reply with the single word: ok' }], { maxTokens: 10, temperature: 0 });
295
+ spin.succeed(`Key is valid — ${chalk.bold(providerName)} is working ✔`);
296
+ }
297
+ catch (e) {
298
+ spin.fail(`Failed: ${e.message}`);
299
+ logger.blank();
300
+ logger.warn('Diagnostic steps:');
301
+ logger.dimmed(` 1. Run "autogit config --debug" to inspect the stored key`);
302
+ logger.dimmed(` 2. Confirm the active provider matches your key`);
303
+ logger.dimmed(` e.g. a Groq key won't work if provider is set to "openai"`);
304
+ logger.dimmed(` 3. Re-enter the key: autogit config → AI Provider & Keys`);
305
+ logger.dimmed(` 4. Or set via env var to bypass the config file:`);
306
+ logger.blank();
307
+ logger.dimmed(` Windows CMD:`);
308
+ logger.dimmed(` set AUTOGIT_AI_PROVIDER=${providerName}`);
309
+ logger.dimmed(` set <YOUR_PROVIDER_KEY>=sk-...`);
310
+ logger.blank();
311
+ logger.dimmed(` PowerShell:`);
312
+ logger.dimmed(` $env:AUTOGIT_AI_PROVIDER="${providerName}"`);
313
+ logger.dimmed(` $env:GROQ_API_KEY="gsk_..."`);
314
+ }
315
+ }
316
+ // ─── Display ──────────────────────────────────────────────────────────────────
317
+ function displayConfig() {
318
+ const config = loadConfig();
319
+ const masked = JSON.parse(JSON.stringify(config));
320
+ for (const path of SECRET_PATHS) {
321
+ const keys = path.split('.');
322
+ const parent = keys.slice(0, -1).reduce((o, k) => o?.[k], masked);
323
+ const last = keys.at(-1);
324
+ if (parent && typeof parent[last] === 'string' && parent[last].length > 4) {
325
+ parent[last] = '***' + parent[last].slice(-4);
326
+ }
327
+ }
328
+ logger.blank();
329
+ logger.header('Current configuration');
330
+ console.log(JSON.stringify(masked, null, 2));
331
+ logger.blank();
332
+ const providers = listProviders();
333
+ logger.header('AI Provider status');
334
+ for (const p of providers) {
335
+ const active = (masked.ai?.provider === p.name) ? chalk.cyan(' ← active') : '';
336
+ const icon = p.configured ? chalk.green('✔') : chalk.gray('○');
337
+ console.log(` ${icon} ${p.name.padEnd(14)} ${chalk.dim(p.defaultModel)}${active}`);
338
+ }
339
+ logger.blank();
340
+ }
341
+ function debugConfig() {
342
+ const config = loadConfig();
343
+ const ai = config.ai ?? {};
344
+ logger.header('Debug info');
345
+ logger.blank();
346
+ logger.info(`Active provider: ${chalk.bold(ai.provider || '(not set, defaults to openai)')}`);
347
+ logger.info(`Model override: ${ai.model || '(using provider default)'}`);
348
+ logger.blank();
349
+ // Show ENV VARS that are set — these override the config file
350
+ const envVars = [
351
+ ['AUTOGIT_AI_PROVIDER', process.env['AUTOGIT_AI_PROVIDER']],
352
+ ['AUTOGIT_AI_MODEL', process.env['AUTOGIT_AI_MODEL']],
353
+ ['OPENAI_API_KEY', process.env['OPENAI_API_KEY']],
354
+ ['ANTHROPIC_API_KEY', process.env['ANTHROPIC_API_KEY']],
355
+ ['GEMINI_API_KEY', process.env['GEMINI_API_KEY']],
356
+ ['OPENROUTER_API_KEY', process.env['OPENROUTER_API_KEY']],
357
+ ['MISTRAL_API_KEY', process.env['MISTRAL_API_KEY']],
358
+ ['GROQ_API_KEY', process.env['GROQ_API_KEY']],
359
+ ['DEEPSEEK_API_KEY', process.env['DEEPSEEK_API_KEY']],
360
+ ['PERPLEXITY_API_KEY', process.env['PERPLEXITY_API_KEY']],
361
+ ['TOGETHER_API_KEY', process.env['TOGETHER_API_KEY']],
362
+ ['COHERE_API_KEY', process.env['COHERE_API_KEY']],
363
+ ['XAI_API_KEY', process.env['XAI_API_KEY']],
364
+ ['AZURE_OPENAI_KEY', process.env['AZURE_OPENAI_KEY']],
365
+ ];
366
+ const setEnvVars = envVars.filter(([, v]) => v);
367
+ if (setEnvVars.length > 0) {
368
+ logger.header('Environment variables (these OVERRIDE the config file)');
369
+ for (const [name, val] of setEnvVars) {
370
+ const preview = val.length > 8 ? `${val.slice(0, 4)}***${val.slice(-4)}` : '***';
371
+ const hasInvisible = /[\u0000-\u001F\u007F-\u009F\u200B-\u200D\uFEFF]/.test(val);
372
+ const warn = hasInvisible ? chalk.red(' ⚠ invisible chars!') : '';
373
+ console.log(` ${chalk.yellow('!')} ${name.padEnd(22)} ${chalk.cyan(`[${val.length} chars]`)} ${chalk.dim(preview)}${warn}`);
374
+ }
375
+ logger.blank();
376
+ logger.warn('Env vars take priority over ~/.autogit/config.json');
377
+ logger.dimmed('To use the config file value instead, unset the env var:');
378
+ logger.dimmed(' PowerShell: Remove-Item Env:GROQ_API_KEY');
379
+ logger.dimmed(' CMD: set GROQ_API_KEY=');
380
+ }
381
+ else {
382
+ logger.dimmed('No AI-related environment variables are set — config file is used.');
383
+ }
384
+ logger.blank();
385
+ // Config file keys
386
+ const keyMap = [
387
+ ['openaiKey', ai.openaiKey],
388
+ ['anthropicKey', ai.anthropicKey],
389
+ ['geminiKey', ai.geminiKey],
390
+ ['openrouterKey', ai.openrouterKey],
391
+ ['mistralKey', ai.mistralKey],
392
+ ['groqKey', ai.groqKey],
393
+ ['deepseekKey', ai.deepseekKey],
394
+ ['perplexityKey', ai.perplexityKey],
395
+ ['togetherKey', ai.togetherKey],
396
+ ['cohereKey', ai.cohereKey],
397
+ ['xaiKey', ai.xaiKey],
398
+ ['azureOpenAIKey', ai.azureOpenAIKey],
399
+ ];
400
+ logger.header('Config file keys (~/.autogit/config.json)');
401
+ for (const [name, key] of keyMap) {
402
+ if (!key) {
403
+ console.log(chalk.gray(` ${name.padEnd(18)} (not set)`));
404
+ continue;
405
+ }
406
+ const len = key.length;
407
+ const preview = len > 8 ? `${key.slice(0, 4)}***${key.slice(-4)}` : `${key.slice(0, 2)}***`;
408
+ const hasInvisible = /[\u0000-\u001F\u007F-\u009F\u200B-\u200D\uFEFF]/.test(key);
409
+ const warning = hasInvisible ? chalk.red(' ⚠ contains invisible chars!') : '';
410
+ console.log(` ${chalk.green('✔')} ${name.padEnd(18)} ${chalk.cyan(`[${len} chars]`)} ${chalk.dim(preview)}${warning}`);
411
+ }
412
+ logger.blank();
413
+ // Show what value will ACTUALLY be used at runtime
414
+ logger.header('Effective values (what AutoGit actually uses)');
415
+ const groqEnv = process.env.GROQ_API_KEY;
416
+ const activeProvider = process.env.AUTOGIT_AI_PROVIDER || ai.provider || 'openai';
417
+ const activeKey = {
418
+ groq: groqEnv || ai.groqKey,
419
+ openai: process.env.OPENAI_API_KEY || ai.openaiKey,
420
+ anthropic: process.env.ANTHROPIC_API_KEY || ai.anthropicKey,
421
+ gemini: process.env.GEMINI_API_KEY || ai.geminiKey,
422
+ openrouter: process.env.OPENROUTER_API_KEY || ai.openrouterKey,
423
+ mistral: process.env.MISTRAL_API_KEY || ai.mistralKey,
424
+ deepseek: process.env.DEEPSEEK_API_KEY || ai.deepseekKey,
425
+ perplexity: process.env.PERPLEXITY_API_KEY || ai.perplexityKey,
426
+ together: process.env.TOGETHER_API_KEY || ai.togetherKey,
427
+ cohere: process.env.COHERE_API_KEY || ai.cohereKey,
428
+ xai: process.env.XAI_API_KEY || ai.xaiKey,
429
+ };
430
+ const usedKey = activeKey[activeProvider];
431
+ const usedPreview = usedKey
432
+ ? (usedKey.length > 8 ? `${usedKey.slice(0, 4)}***${usedKey.slice(-4)}` : '***')
433
+ : '(none)';
434
+ console.log(` Provider: ${chalk.bold(activeProvider)}`);
435
+ console.log(` Key: ${chalk.cyan(`[${usedKey?.length ?? 0} chars]`)} ${chalk.dim(usedPreview)}`);
436
+ logger.blank();
437
+ logger.dimmed('Run "autogit config --test" to verify this key with a live API call.');
438
+ }
439
+ // ─── Helpers ──────────────────────────────────────────────────────────────────
440
+ /** Remove ALL non-printable and zero-width characters, then trim.
441
+ * Catches: tabs, newlines, carriage returns, zero-width spaces, BOM, etc. */
442
+ function sanitizeKey(raw) {
443
+ return raw
444
+ .replace(/[\u0000-\u001F\u007F-\u009F\u200B-\u200D\uFEFF]/g, '') // strip invisible
445
+ .trim(); // strip whitespace edges
446
+ }
447
+ function getNestedValue(obj, path) {
448
+ return path.split('.').reduce((o, k) => o?.[k], obj);
449
+ }
450
+ function setNestedValue(obj, path, value) {
451
+ const keys = path.split('.');
452
+ const last = keys.pop();
453
+ const target = keys.reduce((o, k) => { if (!o[k])
454
+ o[k] = {}; return o[k]; }, obj);
455
+ target[last] = value;
456
+ }
457
+ //# sourceMappingURL=config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/commands/config.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ export declare function cmdDocs(opts: {
2
+ ai?: boolean;
3
+ regenerate?: boolean;
4
+ }): Promise<void>;
5
+ //# sourceMappingURL=docs.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"docs.d.ts","sourceRoot":"","sources":["../../src/commands/docs.ts"],"names":[],"mappings":"AAMA,wBAAsB,OAAO,CAAC,IAAI,EAAE;IAAE,EAAE,CAAC,EAAE,OAAO,CAAC;IAAC,UAAU,CAAC,EAAE,OAAO,CAAA;CAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAqBzF"}
@@ -0,0 +1,22 @@
1
+ import { resolve } from 'path';
2
+ import { scanProject } from '../scanner/file-scanner.js';
3
+ import { analyzeProject } from '../scanner/project-analyzer.js';
4
+ import { generateDocs, writeDocs } from '../services/docs-generator.js';
5
+ import { logger } from '../utils/logger.js';
6
+ export async function cmdDocs(opts) {
7
+ const rootDir = resolve(process.cwd());
8
+ logger.header('Generate Documentation');
9
+ const scan = scanProject(rootDir);
10
+ const analysis = analyzeProject(rootDir, scan);
11
+ const useAI = opts.ai !== false;
12
+ const docs = await generateDocs(rootDir, analysis, scan, useAI, opts.regenerate);
13
+ if (docs.length === 0) {
14
+ logger.info('All documentation files already exist. Use --regenerate to update.');
15
+ return;
16
+ }
17
+ writeDocs(docs);
18
+ for (const doc of docs) {
19
+ logger.success(`${doc.exists ? 'Updated' : 'Created'}: ${doc.name}`);
20
+ }
21
+ }
22
+ //# sourceMappingURL=docs.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"docs.js","sourceRoot":"","sources":["../../src/commands/docs.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,MAAM,CAAC;AAC/B,OAAO,EAAE,WAAW,EAAE,MAAM,4BAA4B,CAAC;AACzD,OAAO,EAAE,cAAc,EAAE,MAAM,gCAAgC,CAAC;AAChE,OAAO,EAAE,YAAY,EAAE,SAAS,EAAE,MAAM,+BAA+B,CAAC;AACxE,OAAO,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AAE5C,MAAM,CAAC,KAAK,UAAU,OAAO,CAAC,IAA4C;IACxE,MAAM,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC;IAEvC,MAAM,CAAC,MAAM,CAAC,wBAAwB,CAAC,CAAC;IAExC,MAAM,IAAI,GAAG,WAAW,CAAC,OAAO,CAAC,CAAC;IAClC,MAAM,QAAQ,GAAG,cAAc,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;IAC/C,MAAM,KAAK,GAAG,IAAI,CAAC,EAAE,KAAK,KAAK,CAAC;IAEhC,MAAM,IAAI,GAAG,MAAM,YAAY,CAAC,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,CAAC,UAAU,CAAC,CAAC;IAEjF,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACtB,MAAM,CAAC,IAAI,CAAC,oEAAoE,CAAC,CAAC;QAClF,OAAO;IACT,CAAC;IAED,SAAS,CAAC,IAAI,CAAC,CAAC;IAEhB,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;QACvB,MAAM,CAAC,OAAO,CAAC,GAAG,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,SAAS,KAAK,GAAG,CAAC,IAAI,EAAE,CAAC,CAAC;IACvE,CAAC;AACH,CAAC"}
@@ -0,0 +1,2 @@
1
+ export declare function cmdDoctor(): Promise<void>;
2
+ //# sourceMappingURL=doctor.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"doctor.d.ts","sourceRoot":"","sources":["../../src/commands/doctor.ts"],"names":[],"mappings":"AAaA,wBAAsB,SAAS,IAAI,OAAO,CAAC,IAAI,CAAC,CA4D/C"}
@@ -0,0 +1,69 @@
1
+ import chalk from 'chalk';
2
+ import { existsSync } from 'fs';
3
+ import { execSync } from 'child_process';
4
+ import { getConfigPath } from '../utils/platform.js';
5
+ import { getGitHubToken, getAIConfig } from '../config/manager.js';
6
+ import { logger } from '../utils/logger.js';
7
+ export async function cmdDoctor() {
8
+ logger.header('AutoGit Doctor');
9
+ logger.dimmed('Checking setup and dependencies...');
10
+ logger.blank();
11
+ const checks = [];
12
+ // Check Git
13
+ checks.push(checkCommand('git', 'Git'));
14
+ // Check Node.js
15
+ checks.push(checkCommand('node', 'Node.js'));
16
+ // Check GitHub CLI
17
+ checks.push(checkCommand('gh', 'GitHub CLI (optional)'));
18
+ // Check config file
19
+ checks.push({
20
+ name: 'Config file',
21
+ status: existsSync(getConfigPath()) ? 'pass' : 'warn',
22
+ message: existsSync(getConfigPath()) ? 'Found at ~/.autogit/config.json' : 'Not created yet (run "autogit config")',
23
+ });
24
+ // Check GitHub token
25
+ const ghToken = getGitHubToken();
26
+ checks.push({
27
+ name: 'GitHub token',
28
+ status: ghToken ? 'pass' : 'warn',
29
+ message: ghToken ? 'Configured' : 'Not set (run "autogit login" or set GITHUB_TOKEN)',
30
+ });
31
+ // Check AI provider
32
+ const aiConfig = getAIConfig();
33
+ const hasAnyAI = !!(aiConfig.openaiKey || aiConfig.anthropicKey || aiConfig.geminiKey || aiConfig.openrouterKey);
34
+ checks.push({
35
+ name: 'AI provider',
36
+ status: hasAnyAI ? 'pass' : 'warn',
37
+ message: hasAnyAI ? `Configured: ${aiConfig.provider}` : 'Not configured (set API key for AI features)',
38
+ });
39
+ // Display results
40
+ for (const check of checks) {
41
+ const icon = check.status === 'pass' ? chalk.green('✔') :
42
+ check.status === 'warn' ? chalk.yellow('⚠') :
43
+ chalk.red('✖');
44
+ console.log(`${icon} ${chalk.bold(check.name)}: ${check.message}`);
45
+ }
46
+ const failures = checks.filter(c => c.status === 'fail');
47
+ const warnings = checks.filter(c => c.status === 'warn');
48
+ logger.blank();
49
+ if (failures.length === 0) {
50
+ logger.success('All required checks passed!');
51
+ }
52
+ else {
53
+ logger.error(`${failures.length} check(s) failed. Fix these before using AutoGit.`);
54
+ }
55
+ if (warnings.length > 0) {
56
+ logger.dimmed(`${warnings.length} optional check(s) need attention for full functionality.`);
57
+ }
58
+ }
59
+ function checkCommand(cmd, name) {
60
+ try {
61
+ const version = execSync(`${cmd} --version`, { encoding: 'utf-8', stdio: ['pipe', 'pipe', 'pipe'] }).trim();
62
+ const shortVersion = version.split('\n')[0].slice(0, 50);
63
+ return { name, status: 'pass', message: shortVersion };
64
+ }
65
+ catch {
66
+ return { name, status: cmd === 'gh' ? 'warn' : 'fail', message: 'Not found' };
67
+ }
68
+ }
69
+ //# sourceMappingURL=doctor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"doctor.js","sourceRoot":"","sources":["../../src/commands/doctor.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ export declare function cmdGithub(opts: {
2
+ create?: boolean;
3
+ private?: boolean;
4
+ }): Promise<void>;
5
+ //# sourceMappingURL=github.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"github.d.ts","sourceRoot":"","sources":["../../src/commands/github.ts"],"names":[],"mappings":"AASA,wBAAsB,SAAS,CAAC,IAAI,EAAE;IAAE,MAAM,CAAC,EAAE,OAAO,CAAC;IAAC,OAAO,CAAC,EAAE,OAAO,CAAA;CAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CA4C5F"}