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,172 @@
1
+ import { existsSync, writeFileSync } from 'fs';
2
+ import { join } from 'path';
3
+ import { getProvider } from '../ai/provider.js';
4
+ import { projectSummaryPrompt, architectureDocPrompt } from '../ai/prompts.js';
5
+ import { spinner } from '../utils/logger.js';
6
+ export async function generateDocs(rootDir, analysis, scan, useAI, regenerate = false) {
7
+ const docs = [];
8
+ // PROJECT_SUMMARY.md
9
+ const summaryPath = join(rootDir, 'PROJECT_SUMMARY.md');
10
+ if (!existsSync(summaryPath) || regenerate) {
11
+ const content = useAI
12
+ ? await generateWithAI('project summary', projectSummaryPrompt(analysis))
13
+ : generateTemplateSummary(analysis);
14
+ if (content) {
15
+ docs.push({ name: 'PROJECT_SUMMARY.md', path: summaryPath, content, exists: existsSync(summaryPath) });
16
+ }
17
+ }
18
+ // ARCHITECTURE.md
19
+ const archPath = join(rootDir, 'ARCHITECTURE.md');
20
+ if (!existsSync(archPath) || regenerate) {
21
+ const folderStructure = buildFolderStructure(scan);
22
+ const content = useAI
23
+ ? await generateWithAI('architecture doc', architectureDocPrompt(analysis, folderStructure))
24
+ : generateTemplateArchitecture(analysis, folderStructure);
25
+ if (content) {
26
+ docs.push({ name: 'ARCHITECTURE.md', path: archPath, content, exists: existsSync(archPath) });
27
+ }
28
+ }
29
+ // CONTRIBUTING.md
30
+ const contribPath = join(rootDir, 'CONTRIBUTING.md');
31
+ if (!existsSync(contribPath) || regenerate) {
32
+ const content = generateContributing(analysis);
33
+ docs.push({ name: 'CONTRIBUTING.md', path: contribPath, content, exists: existsSync(contribPath) });
34
+ }
35
+ return docs;
36
+ }
37
+ export function writeDocs(docs) {
38
+ for (const doc of docs) {
39
+ writeFileSync(doc.path, doc.content, 'utf-8');
40
+ }
41
+ }
42
+ async function generateWithAI(docType, prompt) {
43
+ const spin = spinner(`Generating ${docType} with AI...`).start();
44
+ try {
45
+ const provider = getProvider();
46
+ const messages = [
47
+ { role: 'system', content: 'You are a technical documentation expert. Generate clean, professional Markdown documentation.' },
48
+ { role: 'user', content: prompt },
49
+ ];
50
+ const response = await provider.generate(messages, { temperature: 0.5 });
51
+ let content = response.content.trim();
52
+ // Strip markdown fencing
53
+ if (content.startsWith('```markdown') || content.startsWith('```md')) {
54
+ content = content.replace(/^```(?:markdown|md)\n?/, '').replace(/\n?```$/, '');
55
+ }
56
+ else if (content.startsWith('```')) {
57
+ content = content.slice(3).replace(/\n?```$/, '');
58
+ }
59
+ spin.succeed(`${docType} generated`);
60
+ return content.trim();
61
+ }
62
+ catch (error) {
63
+ spin.fail(`Failed to generate ${docType}: ${error.message}`);
64
+ return null;
65
+ }
66
+ }
67
+ function buildFolderStructure(scan, maxDepth = 3) {
68
+ const lines = [];
69
+ const topDirs = scan.directories.filter(d => !d.includes('/') || d.split('/').length <= maxDepth);
70
+ for (const dir of topDirs.slice(0, 30)) {
71
+ const depth = dir.split('/').length - 1;
72
+ const indent = ' '.repeat(depth);
73
+ const name = dir.split('/').pop() || dir;
74
+ lines.push(`${indent}├── ${name}/`);
75
+ }
76
+ return lines.join('\n') || 'No directories detected';
77
+ }
78
+ function generateTemplateSummary(analysis) {
79
+ return `# Project Summary
80
+
81
+ ## Overview
82
+
83
+ ${analysis.name} is a ${analysis.languages[0] || 'software'} project${analysis.frameworks.length ? ` built with ${analysis.frameworks.join(', ')}` : ''}.
84
+
85
+ ${analysis.description || ''}
86
+
87
+ ## Key Technologies
88
+
89
+ ${[...analysis.languages, ...analysis.frameworks, ...analysis.libraries].map(t => `- ${t}`).join('\n')}
90
+
91
+ ## Architecture
92
+
93
+ ${analysis.architecture}
94
+
95
+ ## Build & Development
96
+
97
+ - **Package Manager:** ${analysis.packageManager || 'N/A'}
98
+ - **Build System:** ${analysis.buildSystem || 'N/A'}
99
+ - **Test Framework:** ${analysis.testFramework || 'N/A'}
100
+
101
+ ${analysis.deployment.length ? `## Deployment\n\n${analysis.deployment.map(d => `- ${d}`).join('\n')}` : ''}
102
+ `;
103
+ }
104
+ function generateTemplateArchitecture(analysis, folderStructure) {
105
+ return `# Architecture
106
+
107
+ ## Overview
108
+
109
+ This document describes the high-level architecture of ${analysis.name}.
110
+
111
+ ## Project Structure
112
+
113
+ \`\`\`
114
+ ${folderStructure}
115
+ \`\`\`
116
+
117
+ ## Technology Stack
118
+
119
+ | Layer | Technology |
120
+ |-------|-----------|
121
+ ${analysis.languages.length ? `| Language | ${analysis.languages.join(', ')} |` : ''}
122
+ ${analysis.frameworks.length ? `| Framework | ${analysis.frameworks.join(', ')} |` : ''}
123
+ ${analysis.database.length ? `| Database | ${analysis.database.join(', ')} |` : ''}
124
+ ${analysis.deployment.length ? `| Deployment | ${analysis.deployment.join(', ')} |` : ''}
125
+
126
+ ## Architecture Pattern
127
+
128
+ ${analysis.architecture}
129
+
130
+ ## Data Flow
131
+
132
+ *Document your application's data flow here.*
133
+ `;
134
+ }
135
+ function generateContributing(analysis) {
136
+ const pm = analysis.packageManager || 'npm';
137
+ const installCmd = pm === 'yarn' ? 'yarn' : pm === 'pnpm' ? 'pnpm install' : `${pm} install`;
138
+ return `# Contributing
139
+
140
+ Thank you for your interest in contributing to ${analysis.name}!
141
+
142
+ ## Getting Started
143
+
144
+ 1. Fork the repository
145
+ 2. Clone your fork: \`git clone https://github.com/YOUR_USERNAME/${analysis.name}.git\`
146
+ 3. Create a branch: \`git checkout -b feature/your-feature\`
147
+ 4. Install dependencies: \`${installCmd}\`
148
+ 5. Make your changes
149
+ 6. Run tests${analysis.testFramework ? ` (\`${pm === 'yarn' ? 'yarn test' : `${pm} test`}\`)` : ''}
150
+ 7. Commit your changes following [Conventional Commits](https://www.conventionalcommits.org/)
151
+ 8. Push to your fork: \`git push origin feature/your-feature\`
152
+ 9. Open a Pull Request
153
+
154
+ ## Code Style
155
+
156
+ - Follow the existing code style and conventions
157
+ - Write meaningful commit messages
158
+ - Add tests for new features
159
+ - Update documentation when needed
160
+
161
+ ## Reporting Issues
162
+
163
+ - Use GitHub Issues to report bugs
164
+ - Include reproduction steps
165
+ - Provide environment details
166
+
167
+ ## License
168
+
169
+ By contributing, you agree that your contributions will be licensed under the project's ${analysis.license || 'existing'} license.
170
+ `;
171
+ }
172
+ //# sourceMappingURL=docs-generator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"docs-generator.js","sourceRoot":"","sources":["../../src/services/docs-generator.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,22 @@
1
+ import type { ProjectAnalysis } from '../scanner/project-analyzer.js';
2
+ export interface GitStatus {
3
+ isRepo: boolean;
4
+ branch: string;
5
+ hasRemote: boolean;
6
+ remoteUrl: string | null;
7
+ isDirty: boolean;
8
+ staged: string[];
9
+ unstaged: string[];
10
+ untracked: string[];
11
+ }
12
+ export declare function getGitStatus(rootDir: string): Promise<GitStatus>;
13
+ export declare function initGit(rootDir: string): Promise<void>;
14
+ export declare function generateGitignore(rootDir: string, analysis: ProjectAnalysis): Promise<void>;
15
+ export declare function stageAll(rootDir: string): Promise<void>;
16
+ export declare function stageFiles(rootDir: string, files: string[]): Promise<void>;
17
+ export declare function generateCommitMessage(rootDir: string, useAI: boolean): Promise<string>;
18
+ export declare function commit(rootDir: string, message: string): Promise<void>;
19
+ export declare function push(rootDir: string, branch?: string): Promise<void>;
20
+ export declare function addRemote(rootDir: string, url: string): Promise<void>;
21
+ export declare function getCurrentBranch(rootDir: string): Promise<string>;
22
+ //# sourceMappingURL=git-service.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"git-service.d.ts","sourceRoot":"","sources":["../../src/services/git-service.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,gCAAgC,CAAC;AAKtE,MAAM,WAAW,SAAS;IACxB,MAAM,EAAE,OAAO,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,OAAO,CAAC;IACnB,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,OAAO,EAAE,OAAO,CAAC;IACjB,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,SAAS,EAAE,MAAM,EAAE,CAAC;CACrB;AAED,wBAAsB,YAAY,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,CAAC,CA4CtE;AAED,wBAAsB,OAAO,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAI5D;AAED,wBAAsB,iBAAiB,CAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,eAAe,GAAG,OAAO,CAAC,IAAI,CAAC,CAyDjG;AAED,wBAAsB,QAAQ,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAG7D;AAED,wBAAsB,UAAU,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAGhF;AAED,wBAAsB,qBAAqB,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,GAAG,OAAO,CAAC,MAAM,CAAC,CAsC5F;AAED,wBAAsB,MAAM,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAG5E;AAED,wBAAsB,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAe1E;AAED,wBAAsB,SAAS,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAS3E;AAED,wBAAsB,gBAAgB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAIvE"}
@@ -0,0 +1,162 @@
1
+ import simpleGit from 'simple-git';
2
+ import { existsSync, writeFileSync } from 'fs';
3
+ import { join } from 'path';
4
+ import { getProvider } from '../ai/provider.js';
5
+ import { commitMessagePrompt } from '../ai/prompts.js';
6
+ import { logger } from '../utils/logger.js';
7
+ export async function getGitStatus(rootDir) {
8
+ const git = simpleGit(rootDir);
9
+ try {
10
+ const isRepo = await git.checkIsRepo();
11
+ if (!isRepo) {
12
+ return {
13
+ isRepo: false,
14
+ branch: '',
15
+ hasRemote: false,
16
+ remoteUrl: null,
17
+ isDirty: false,
18
+ staged: [],
19
+ unstaged: [],
20
+ untracked: [],
21
+ };
22
+ }
23
+ const status = await git.status();
24
+ const remotes = await git.getRemotes(true);
25
+ const origin = remotes.find(r => r.name === 'origin');
26
+ return {
27
+ isRepo: true,
28
+ branch: status.current || 'main',
29
+ hasRemote: !!origin,
30
+ remoteUrl: origin?.refs?.push || null,
31
+ isDirty: !status.isClean(),
32
+ staged: status.staged,
33
+ unstaged: status.modified,
34
+ untracked: status.not_added,
35
+ };
36
+ }
37
+ catch {
38
+ return {
39
+ isRepo: false,
40
+ branch: '',
41
+ hasRemote: false,
42
+ remoteUrl: null,
43
+ isDirty: false,
44
+ staged: [],
45
+ unstaged: [],
46
+ untracked: [],
47
+ };
48
+ }
49
+ }
50
+ export async function initGit(rootDir) {
51
+ const git = simpleGit(rootDir);
52
+ await git.init();
53
+ logger.success('Initialized Git repository');
54
+ }
55
+ export async function generateGitignore(rootDir, analysis) {
56
+ const gitignorePath = join(rootDir, '.gitignore');
57
+ if (existsSync(gitignorePath))
58
+ return;
59
+ const entries = [
60
+ '# Dependencies',
61
+ ];
62
+ if (analysis.packageManager === 'npm' || analysis.packageManager === 'yarn' || analysis.packageManager === 'pnpm' || analysis.packageManager === 'bun') {
63
+ entries.push('node_modules/');
64
+ }
65
+ if (analysis.languages.includes('Python')) {
66
+ entries.push('__pycache__/', '*.pyc', '.venv/', 'venv/');
67
+ }
68
+ if (analysis.languages.includes('Rust')) {
69
+ entries.push('target/');
70
+ }
71
+ if (analysis.languages.includes('Go')) {
72
+ entries.push('vendor/');
73
+ }
74
+ if (analysis.languages.includes('Java') || analysis.languages.includes('Kotlin')) {
75
+ entries.push('build/', '.gradle/', '*.class');
76
+ }
77
+ if (analysis.languages.includes('C#')) {
78
+ entries.push('bin/', 'obj/', '*.user', '*.suo');
79
+ }
80
+ entries.push('', '# Build output', 'dist/', 'build/', 'out/', '', '# Environment', '.env', '.env.local', '.env.*.local', '', '# IDE', '.idea/', '.vscode/', '*.swp', '*.swo', '.DS_Store', 'Thumbs.db', '', '# Testing', 'coverage/', '', '# Logs', '*.log', 'npm-debug.log*');
81
+ writeFileSync(gitignorePath, entries.join('\n') + '\n', 'utf-8');
82
+ logger.success('Generated .gitignore');
83
+ }
84
+ export async function stageAll(rootDir) {
85
+ const git = simpleGit(rootDir);
86
+ await git.add('.');
87
+ }
88
+ export async function stageFiles(rootDir, files) {
89
+ const git = simpleGit(rootDir);
90
+ await git.add(files);
91
+ }
92
+ export async function generateCommitMessage(rootDir, useAI) {
93
+ const git = simpleGit(rootDir);
94
+ // Get diff summary for commit message
95
+ const diff = await git.diff(['--cached', '--stat']);
96
+ if (!diff) {
97
+ return 'docs: update project documentation';
98
+ }
99
+ if (!useAI) {
100
+ // Generate a simple conventional commit
101
+ if (diff.includes('README'))
102
+ return 'docs: update README';
103
+ if (diff.includes('package.json'))
104
+ return 'chore: update dependencies';
105
+ return 'docs: update project documentation';
106
+ }
107
+ try {
108
+ const provider = getProvider();
109
+ const prompt = commitMessagePrompt(diff);
110
+ const messages = [
111
+ { role: 'system', content: 'You generate concise, conventional git commit messages.' },
112
+ { role: 'user', content: prompt },
113
+ ];
114
+ const response = await provider.generate(messages, { temperature: 0.3, maxTokens: 100 });
115
+ let msg = response.content.trim();
116
+ // Clean up any quotes or backticks
117
+ msg = msg.replace(/^["'`]+|["'`]+$/g, '');
118
+ // Take only first line
119
+ msg = msg.split('\n')[0].trim();
120
+ return msg || 'docs: update project documentation';
121
+ }
122
+ catch {
123
+ return 'docs: update project documentation';
124
+ }
125
+ }
126
+ export async function commit(rootDir, message) {
127
+ const git = simpleGit(rootDir);
128
+ await git.commit(message);
129
+ }
130
+ export async function push(rootDir, branch) {
131
+ const git = simpleGit(rootDir);
132
+ const status = await git.status();
133
+ const currentBranch = branch || status.current || 'main';
134
+ try {
135
+ await git.push('origin', currentBranch, ['--set-upstream']);
136
+ }
137
+ catch (error) {
138
+ // If push fails, it might be because branch doesn't exist on remote
139
+ if (error.message?.includes('has no upstream')) {
140
+ await git.push(['--set-upstream', 'origin', currentBranch]);
141
+ }
142
+ else {
143
+ throw error;
144
+ }
145
+ }
146
+ }
147
+ export async function addRemote(rootDir, url) {
148
+ const git = simpleGit(rootDir);
149
+ const remotes = await git.getRemotes();
150
+ if (remotes.some(r => r.name === 'origin')) {
151
+ await git.remote(['set-url', 'origin', url]);
152
+ }
153
+ else {
154
+ await git.addRemote('origin', url);
155
+ }
156
+ }
157
+ export async function getCurrentBranch(rootDir) {
158
+ const git = simpleGit(rootDir);
159
+ const status = await git.status();
160
+ return status.current || 'main';
161
+ }
162
+ //# sourceMappingURL=git-service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"git-service.js","sourceRoot":"","sources":["../../src/services/git-service.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,44 @@
1
+ export interface RepoInfo {
2
+ name: string;
3
+ fullName: string;
4
+ description: string;
5
+ url: string;
6
+ htmlUrl: string;
7
+ cloneUrl: string;
8
+ sshUrl: string;
9
+ private: boolean;
10
+ defaultBranch: string;
11
+ }
12
+ export interface CreateRepoOptions {
13
+ name: string;
14
+ description?: string;
15
+ isPrivate?: boolean;
16
+ topics?: string[];
17
+ homepage?: string;
18
+ }
19
+ /** Call this after saving a new token so the cached instance is replaced. */
20
+ export declare function resetOctokitCache(): void;
21
+ export declare function getAuthenticatedUser(): Promise<{
22
+ login: string;
23
+ name: string | null;
24
+ }>;
25
+ export declare function repoExists(owner: string, repo: string): Promise<boolean>;
26
+ export declare function createRepo(options: CreateRepoOptions): Promise<RepoInfo>;
27
+ export declare function getRepo(owner: string, repo: string): Promise<RepoInfo>;
28
+ export declare function updateRepo(owner: string, repo: string, updates: {
29
+ description?: string;
30
+ homepage?: string;
31
+ topics?: string[];
32
+ }): Promise<void>;
33
+ export declare function createRelease(owner: string, repo: string, options: {
34
+ tag: string;
35
+ name: string;
36
+ body: string;
37
+ draft?: boolean;
38
+ prerelease?: boolean;
39
+ }): Promise<{
40
+ htmlUrl: string;
41
+ }>;
42
+ export declare function generateTopics(analysis: any): string[];
43
+ export declare function isGitHubConfigured(): boolean;
44
+ //# sourceMappingURL=github-service.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"github-service.d.ts","sourceRoot":"","sources":["../../src/services/github-service.ts"],"names":[],"mappings":"AAIA,MAAM,WAAW,QAAQ;IACvB,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;IACjB,WAAW,EAAE,MAAM,CAAC;IACpB,GAAG,EAAE,MAAM,CAAC;IACZ,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,OAAO,CAAC;IACjB,aAAa,EAAE,MAAM,CAAC;CACvB;AAED,MAAM,WAAW,iBAAiB;IAChC,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAID,6EAA6E;AAC7E,wBAAgB,iBAAiB,IAAI,IAAI,CAExC;AAmBD,wBAAsB,oBAAoB,IAAI,OAAO,CAAC;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAAA;CAAE,CAAC,CAI5F;AAED,wBAAsB,UAAU,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAS9E;AAED,wBAAsB,UAAU,CAAC,OAAO,EAAE,iBAAiB,GAAG,OAAO,CAAC,QAAQ,CAAC,CA+B9E;AAED,wBAAsB,OAAO,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,QAAQ,CAAC,CAe5E;AAED,wBAAsB,UAAU,CAC9B,KAAK,EAAE,MAAM,EACb,IAAI,EAAE,MAAM,EACZ,OAAO,EAAE;IAAE,WAAW,CAAC,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,EAAE,CAAA;CAAE,GACtE,OAAO,CAAC,IAAI,CAAC,CAmBf;AAED,wBAAsB,aAAa,CACjC,KAAK,EAAE,MAAM,EACb,IAAI,EAAE,MAAM,EACZ,OAAO,EAAE;IACP,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,UAAU,CAAC,EAAE,OAAO,CAAC;CACtB,GACA,OAAO,CAAC;IAAE,OAAO,EAAE,MAAM,CAAA;CAAE,CAAC,CAc9B;AAED,wBAAgB,cAAc,CAAC,QAAQ,EAAE,GAAG,GAAG,MAAM,EAAE,CAgBtD;AAED,wBAAgB,kBAAkB,IAAI,OAAO,CAE5C"}
@@ -0,0 +1,131 @@
1
+ import { Octokit } from 'octokit';
2
+ import { getGitHubToken } from '../config/manager.js';
3
+ let octokitInstance = null;
4
+ /** Call this after saving a new token so the cached instance is replaced. */
5
+ export function resetOctokitCache() {
6
+ octokitInstance = null;
7
+ }
8
+ function getOctokit() {
9
+ if (octokitInstance)
10
+ return octokitInstance;
11
+ const token = getGitHubToken();
12
+ if (!token) {
13
+ throw new Error('No GitHub token found.\n' +
14
+ ' → Run: autogit login\n' +
15
+ ' → Or set: GITHUB_TOKEN environment variable\n' +
16
+ ' → Create token at: https://github.com/settings/tokens (scopes: repo, read:user)');
17
+ }
18
+ octokitInstance = new Octokit({ auth: token });
19
+ return octokitInstance;
20
+ }
21
+ export async function getAuthenticatedUser() {
22
+ const octokit = getOctokit();
23
+ const { data } = await octokit.rest.users.getAuthenticated();
24
+ return { login: data.login, name: data.name };
25
+ }
26
+ export async function repoExists(owner, repo) {
27
+ const octokit = getOctokit();
28
+ try {
29
+ await octokit.rest.repos.get({ owner, repo });
30
+ return true;
31
+ }
32
+ catch (error) {
33
+ if (error.status === 404)
34
+ return false;
35
+ throw error;
36
+ }
37
+ }
38
+ export async function createRepo(options) {
39
+ const octokit = getOctokit();
40
+ const { data } = await octokit.rest.repos.createForAuthenticatedUser({
41
+ name: options.name,
42
+ description: options.description || '',
43
+ private: options.isPrivate ?? false,
44
+ auto_init: false,
45
+ });
46
+ // Set topics if provided
47
+ if (options.topics && options.topics.length > 0) {
48
+ const user = await getAuthenticatedUser();
49
+ await octokit.rest.repos.replaceAllTopics({
50
+ owner: user.login,
51
+ repo: options.name,
52
+ names: options.topics.slice(0, 20), // GitHub limit
53
+ });
54
+ }
55
+ return {
56
+ name: data.name,
57
+ fullName: data.full_name,
58
+ description: data.description || '',
59
+ url: data.url,
60
+ htmlUrl: data.html_url,
61
+ cloneUrl: data.clone_url,
62
+ sshUrl: data.ssh_url,
63
+ private: data.private,
64
+ defaultBranch: data.default_branch,
65
+ };
66
+ }
67
+ export async function getRepo(owner, repo) {
68
+ const octokit = getOctokit();
69
+ const { data } = await octokit.rest.repos.get({ owner, repo });
70
+ return {
71
+ name: data.name,
72
+ fullName: data.full_name,
73
+ description: data.description || '',
74
+ url: data.url,
75
+ htmlUrl: data.html_url,
76
+ cloneUrl: data.clone_url,
77
+ sshUrl: data.ssh_url,
78
+ private: data.private,
79
+ defaultBranch: data.default_branch,
80
+ };
81
+ }
82
+ export async function updateRepo(owner, repo, updates) {
83
+ const octokit = getOctokit();
84
+ if (updates.description || updates.homepage) {
85
+ await octokit.rest.repos.update({
86
+ owner,
87
+ repo,
88
+ description: updates.description,
89
+ homepage: updates.homepage,
90
+ });
91
+ }
92
+ if (updates.topics) {
93
+ await octokit.rest.repos.replaceAllTopics({
94
+ owner,
95
+ repo,
96
+ names: updates.topics.slice(0, 20),
97
+ });
98
+ }
99
+ }
100
+ export async function createRelease(owner, repo, options) {
101
+ const octokit = getOctokit();
102
+ const { data } = await octokit.rest.repos.createRelease({
103
+ owner,
104
+ repo,
105
+ tag_name: options.tag,
106
+ name: options.name,
107
+ body: options.body,
108
+ draft: options.draft ?? false,
109
+ prerelease: options.prerelease ?? false,
110
+ });
111
+ return { htmlUrl: data.html_url };
112
+ }
113
+ export function generateTopics(analysis) {
114
+ const topics = [];
115
+ // Add languages (lowercase)
116
+ for (const lang of analysis.languages.slice(0, 5)) {
117
+ topics.push(lang.toLowerCase().replace(/[^a-z0-9-]/g, ''));
118
+ }
119
+ // Add frameworks
120
+ for (const fw of analysis.frameworks.slice(0, 5)) {
121
+ const normalized = fw.toLowerCase().replace(/[^a-z0-9-]/g, '-').replace(/-+/g, '-');
122
+ if (normalized.length <= 35)
123
+ topics.push(normalized);
124
+ }
125
+ // Deduplicate and limit
126
+ return [...new Set(topics)].slice(0, 15);
127
+ }
128
+ export function isGitHubConfigured() {
129
+ return !!getGitHubToken();
130
+ }
131
+ //# sourceMappingURL=github-service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"github-service.js","sourceRoot":"","sources":["../../src/services/github-service.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,24 @@
1
+ import type { ProjectAnalysis } from '../scanner/project-analyzer.js';
2
+ import type { ScanResult } from '../scanner/file-scanner.js';
3
+ export interface ProjectInsights {
4
+ documentationScore: {
5
+ score: number;
6
+ reason: string;
7
+ };
8
+ codeQualityScore: {
9
+ score: number;
10
+ reason: string;
11
+ };
12
+ maintainabilityScore: {
13
+ score: number;
14
+ reason: string;
15
+ };
16
+ suggestions: string[];
17
+ performanceRecommendations: string[];
18
+ securityObservations: string[];
19
+ missingTests: string[];
20
+ missingDocumentation: string[];
21
+ todoSummary: string[];
22
+ }
23
+ export declare function generateInsights(analysis: ProjectAnalysis, scan: ScanResult, useAI: boolean): Promise<ProjectInsights>;
24
+ //# sourceMappingURL=insights.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"insights.d.ts","sourceRoot":"","sources":["../../src/services/insights.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,gCAAgC,CAAC;AACtE,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,4BAA4B,CAAC;AAK7D,MAAM,WAAW,eAAe;IAC9B,kBAAkB,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC;IACtD,gBAAgB,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC;IACpD,oBAAoB,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC;IACxD,WAAW,EAAE,MAAM,EAAE,CAAC;IACtB,0BAA0B,EAAE,MAAM,EAAE,CAAC;IACrC,oBAAoB,EAAE,MAAM,EAAE,CAAC;IAC/B,YAAY,EAAE,MAAM,EAAE,CAAC;IACvB,oBAAoB,EAAE,MAAM,EAAE,CAAC;IAC/B,WAAW,EAAE,MAAM,EAAE,CAAC;CACvB;AAED,wBAAsB,gBAAgB,CACpC,QAAQ,EAAE,eAAe,EACzB,IAAI,EAAE,UAAU,EAChB,KAAK,EAAE,OAAO,GACb,OAAO,CAAC,eAAe,CAAC,CA+C1B"}