autogit-tool 1.0.19 → 1.0.21
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/README.md +61 -7
- package/dist/ai/prompts.d.ts +6 -0
- package/dist/ai/prompts.d.ts.map +1 -1
- package/dist/ai/prompts.js +111 -19
- package/dist/ai/prompts.js.map +1 -1
- package/dist/ai/provider.d.ts.map +1 -1
- package/dist/ai/provider.js +27 -0
- package/dist/ai/provider.js.map +1 -1
- package/dist/ai/readme-agent.d.ts +5 -0
- package/dist/ai/readme-agent.d.ts.map +1 -0
- package/dist/ai/readme-agent.js +126 -0
- package/dist/ai/readme-agent.js.map +1 -0
- package/dist/cli.js +62 -1
- package/dist/cli.js.map +1 -1
- package/dist/commands/brag.d.ts +2 -0
- package/dist/commands/brag.d.ts.map +1 -0
- package/dist/commands/brag.js +10 -0
- package/dist/commands/brag.js.map +1 -0
- package/dist/commands/config.d.ts +2 -0
- package/dist/commands/config.d.ts.map +1 -1
- package/dist/commands/config.js +18 -2
- package/dist/commands/config.js.map +1 -1
- package/dist/commands/github.d.ts +1 -0
- package/dist/commands/github.d.ts.map +1 -1
- package/dist/commands/github.js +11 -2
- package/dist/commands/github.js.map +1 -1
- package/dist/commands/linkedin.d.ts +3 -0
- package/dist/commands/linkedin.d.ts.map +1 -1
- package/dist/commands/linkedin.js +124 -12
- package/dist/commands/linkedin.js.map +1 -1
- package/dist/commands/publish.d.ts.map +1 -1
- package/dist/commands/publish.js +15 -46
- package/dist/commands/publish.js.map +1 -1
- package/dist/commands/readme.d.ts.map +1 -1
- package/dist/commands/readme.js +14 -0
- package/dist/commands/readme.js.map +1 -1
- package/dist/commands/resume.d.ts +2 -0
- package/dist/commands/resume.d.ts.map +1 -1
- package/dist/commands/resume.js +311 -81
- package/dist/commands/resume.js.map +1 -1
- package/dist/commands/setup.d.ts +3 -0
- package/dist/commands/setup.d.ts.map +1 -0
- package/dist/commands/setup.js +58 -0
- package/dist/commands/setup.js.map +1 -0
- package/dist/commands/showcase.d.ts +4 -0
- package/dist/commands/showcase.d.ts.map +1 -0
- package/dist/commands/showcase.js +35 -0
- package/dist/commands/showcase.js.map +1 -0
- package/dist/config/manager.d.ts +16 -1
- package/dist/config/manager.d.ts.map +1 -1
- package/dist/config/manager.js +9 -0
- package/dist/config/manager.js.map +1 -1
- package/dist/pipeline/main-pipeline.d.ts +2 -0
- package/dist/pipeline/main-pipeline.d.ts.map +1 -1
- package/dist/pipeline/main-pipeline.js +135 -119
- package/dist/pipeline/main-pipeline.js.map +1 -1
- package/dist/services/brag-agent.d.ts +19 -0
- package/dist/services/brag-agent.d.ts.map +1 -0
- package/dist/services/brag-agent.js +177 -0
- package/dist/services/brag-agent.js.map +1 -0
- package/dist/services/brag-runtime.d.ts +7 -0
- package/dist/services/brag-runtime.d.ts.map +1 -0
- package/dist/services/brag-runtime.js +68 -0
- package/dist/services/brag-runtime.js.map +1 -0
- package/dist/services/commit-workflow.d.ts +2 -0
- package/dist/services/commit-workflow.d.ts.map +1 -0
- package/dist/services/commit-workflow.js +60 -0
- package/dist/services/commit-workflow.js.map +1 -0
- package/dist/services/git-service.d.ts +12 -1
- package/dist/services/git-service.d.ts.map +1 -1
- package/dist/services/git-service.js +42 -3
- package/dist/services/git-service.js.map +1 -1
- package/dist/services/pdf-to-latex.d.ts +17 -0
- package/dist/services/pdf-to-latex.d.ts.map +1 -0
- package/dist/services/pdf-to-latex.js +108 -0
- package/dist/services/pdf-to-latex.js.map +1 -0
- package/dist/services/publish-workflow.d.ts +14 -0
- package/dist/services/publish-workflow.d.ts.map +1 -0
- package/dist/services/publish-workflow.js +96 -0
- package/dist/services/publish-workflow.js.map +1 -0
- package/dist/services/readme-manager.d.ts +2 -1
- package/dist/services/readme-manager.d.ts.map +1 -1
- package/dist/services/readme-manager.js +35 -24
- package/dist/services/readme-manager.js.map +1 -1
- package/dist/services/share-package.d.ts +10 -0
- package/dist/services/share-package.d.ts.map +1 -0
- package/dist/services/share-package.js +21 -0
- package/dist/services/share-package.js.map +1 -0
- package/dist/services/showcase-cards.d.ts +7 -0
- package/dist/services/showcase-cards.d.ts.map +1 -0
- package/dist/services/showcase-cards.js +47 -0
- package/dist/services/showcase-cards.js.map +1 -0
- package/dist/services/showcase.d.ts +16 -0
- package/dist/services/showcase.d.ts.map +1 -0
- package/dist/services/showcase.js +79 -0
- package/dist/services/showcase.js.map +1 -0
- package/dist/services/social-generator.d.ts +5 -0
- package/dist/services/social-generator.d.ts.map +1 -1
- package/dist/services/social-generator.js +34 -0
- package/dist/services/social-generator.js.map +1 -1
- package/dist/services/social-images.d.ts +5 -0
- package/dist/services/social-images.d.ts.map +1 -0
- package/dist/services/social-images.js +79 -0
- package/dist/services/social-images.js.map +1 -0
- package/package.json +5 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"brag-runtime.d.ts","sourceRoot":"","sources":["../../src/services/brag-runtime.ts"],"names":[],"mappings":"AAiCA,MAAM,WAAW,WAAW;IAAG,UAAU,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAC;IAAC,UAAU,EAAE,MAAM,CAAA;CAAE;AAEzF,wBAAsB,iBAAiB,IAAI,OAAO,CAAC,WAAW,CAAC,CA+B9D"}
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
import { existsSync, mkdirSync } from 'fs';
|
|
2
|
+
import { createRequire } from 'module';
|
|
3
|
+
import { delimiter, dirname, join } from 'path';
|
|
4
|
+
import { execFile } from 'child_process';
|
|
5
|
+
import { promisify } from 'util';
|
|
6
|
+
import { getConfigDir } from '../utils/platform.js';
|
|
7
|
+
const run = promisify(execFile);
|
|
8
|
+
function runtimeDirectory() {
|
|
9
|
+
return join(getConfigDir(), 'brag-runtime');
|
|
10
|
+
}
|
|
11
|
+
function managedNodePath(directory) {
|
|
12
|
+
return join(directory, 'node_modules', 'node', 'bin', process.platform === 'win32' ? 'node.exe' : 'node');
|
|
13
|
+
}
|
|
14
|
+
function managedFfmpegPath(directory) {
|
|
15
|
+
try {
|
|
16
|
+
const requireFromRuntime = createRequire(join(directory, 'package.json'));
|
|
17
|
+
const path = requireFromRuntime('ffmpeg-static');
|
|
18
|
+
return path && existsSync(path) ? path : null;
|
|
19
|
+
}
|
|
20
|
+
catch {
|
|
21
|
+
return null;
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
async function installedPath(command) {
|
|
25
|
+
try {
|
|
26
|
+
const finder = process.platform === 'win32' ? 'where.exe' : 'which';
|
|
27
|
+
const { stdout } = await run(finder, [command], { timeout: 10_000, windowsHide: true });
|
|
28
|
+
return stdout.split(/\r?\n/).map(line => line.trim()).find(Boolean) || null;
|
|
29
|
+
}
|
|
30
|
+
catch {
|
|
31
|
+
return null;
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
export async function ensureBragRuntime() {
|
|
35
|
+
const directory = runtimeDirectory();
|
|
36
|
+
const hasSystemNode = Number(process.versions.node.split('.')[0]) >= 22;
|
|
37
|
+
let nodePath = hasSystemNode ? process.execPath : managedNodePath(directory);
|
|
38
|
+
let ffmpegPath = await installedPath('ffmpeg') || managedFfmpegPath(directory);
|
|
39
|
+
if (!existsSync(nodePath) || !ffmpegPath) {
|
|
40
|
+
mkdirSync(directory, { recursive: true });
|
|
41
|
+
// npm --no-save can prune an earlier package, so always request the full managed set.
|
|
42
|
+
const packages = [
|
|
43
|
+
...(!hasSystemNode ? ['node@22'] : []),
|
|
44
|
+
...(!(await installedPath('ffmpeg')) ? ['ffmpeg-static'] : []),
|
|
45
|
+
];
|
|
46
|
+
const env = {};
|
|
47
|
+
for (const name of ['PATH', 'Path', 'PATHEXT', 'ComSpec', 'SystemRoot', 'WINDIR', 'USERPROFILE', 'HOME', 'APPDATA', 'LOCALAPPDATA', 'TEMP', 'TMP', 'TMPDIR', 'HTTP_PROXY', 'HTTPS_PROXY', 'NO_PROXY', 'NODE_EXTRA_CA_CERTS', 'npm_config_registry']) {
|
|
48
|
+
if (process.env[name] !== undefined)
|
|
49
|
+
env[name] = process.env[name];
|
|
50
|
+
}
|
|
51
|
+
const executable = process.platform === 'win32' ? (process.env.ComSpec || 'cmd.exe') : 'npm';
|
|
52
|
+
const args = process.platform === 'win32'
|
|
53
|
+
? ['/d', '/s', '/c', 'npm.cmd', 'install', '--prefix', directory, '--no-save', '--no-audit', '--no-fund', ...packages]
|
|
54
|
+
: ['install', '--prefix', directory, '--no-save', '--no-audit', '--no-fund', ...packages];
|
|
55
|
+
await run(executable, args, { env, timeout: 300_000, windowsHide: true, maxBuffer: 2 * 1024 * 1024 });
|
|
56
|
+
nodePath = hasSystemNode ? process.execPath : managedNodePath(directory);
|
|
57
|
+
ffmpegPath = await installedPath('ffmpeg') || managedFfmpegPath(directory);
|
|
58
|
+
}
|
|
59
|
+
if (!existsSync(nodePath))
|
|
60
|
+
throw new Error('AutoGit could not install the Node 22 runtime for Brag.');
|
|
61
|
+
if (!ffmpegPath)
|
|
62
|
+
throw new Error('AutoGit could not install FFmpeg for Brag.');
|
|
63
|
+
const { stdout } = await run(nodePath, ['--version'], { timeout: 10_000, windowsHide: true });
|
|
64
|
+
if (Number(stdout.trim().replace(/^v/, '').split('.')[0]) < 22)
|
|
65
|
+
throw new Error('Brag needs Node 22 or newer.');
|
|
66
|
+
return { nodePath, ffmpegPath, pathPrefix: [dirname(nodePath), dirname(ffmpegPath)].join(delimiter) };
|
|
67
|
+
}
|
|
68
|
+
//# sourceMappingURL=brag-runtime.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"brag-runtime.js","sourceRoot":"","sources":["../../src/services/brag-runtime.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"commit-workflow.d.ts","sourceRoot":"","sources":["../../src/services/commit-workflow.ts"],"names":[],"mappings":"AAOA,wBAAsB,iBAAiB,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,CAoDvG"}
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
import chalk from 'chalk';
|
|
2
|
+
import inquirer from 'inquirer';
|
|
3
|
+
import { commit, generateCommitMessage, getCommitPlan, getStagedSummary, stageCommitPlan, } from './git-service.js';
|
|
4
|
+
import { logger } from '../utils/logger.js';
|
|
5
|
+
export async function runCommitWorkflow(rootDir, yes, useAI) {
|
|
6
|
+
const plan = await getCommitPlan(rootDir);
|
|
7
|
+
logger.info(`Branch: ${plan.branch || '(not yet named)'}`);
|
|
8
|
+
logger.info(`Remote: ${plan.remoteUrl || '(none)'}`);
|
|
9
|
+
logger.info(`Already staged: ${plan.staged.length} file(s)`);
|
|
10
|
+
for (const file of plan.staged)
|
|
11
|
+
logger.dimmed(` staged ${file}`);
|
|
12
|
+
logger.info(`To stage: ${plan.toStage.length} file(s)`);
|
|
13
|
+
for (const file of plan.toStage)
|
|
14
|
+
logger.dimmed(` add ${file}`);
|
|
15
|
+
for (const file of plan.preservedUnstaged) {
|
|
16
|
+
logger.dimmed(` left unstaged (partial staging preserved) ${file}`);
|
|
17
|
+
}
|
|
18
|
+
if (plan.sensitive.length > 0) {
|
|
19
|
+
throw new Error(`Likely sensitive file(s) would be committed: ${plan.sensitive.join(', ')}. Remove them from the commit first.`);
|
|
20
|
+
}
|
|
21
|
+
if (plan.staged.length === 0 && plan.toStage.length === 0) {
|
|
22
|
+
logger.dimmed('Nothing to commit');
|
|
23
|
+
return true;
|
|
24
|
+
}
|
|
25
|
+
if (!yes) {
|
|
26
|
+
const { confirm } = await inquirer.prompt([{
|
|
27
|
+
type: 'confirm', name: 'confirm', message: 'Stage the listed files for this commit?', default: true,
|
|
28
|
+
}]);
|
|
29
|
+
if (!confirm)
|
|
30
|
+
return false;
|
|
31
|
+
}
|
|
32
|
+
await stageCommitPlan(rootDir, plan);
|
|
33
|
+
const summary = await getStagedSummary(rootDir);
|
|
34
|
+
if (summary)
|
|
35
|
+
logger.info(`Commit contents:\n${summary}`);
|
|
36
|
+
let message = await generateCommitMessage(rootDir, useAI);
|
|
37
|
+
if (!yes) {
|
|
38
|
+
const { confirm } = await inquirer.prompt([{
|
|
39
|
+
type: 'confirm', name: 'confirm', message: `Commit with message "${message}"?`, default: true,
|
|
40
|
+
}]);
|
|
41
|
+
if (!confirm) {
|
|
42
|
+
logger.dimmed('Commit cancelled. Newly staged files remain staged for your review.');
|
|
43
|
+
return false;
|
|
44
|
+
}
|
|
45
|
+
const { edit } = await inquirer.prompt([{
|
|
46
|
+
type: 'confirm', name: 'edit', message: 'Edit commit message?', default: false,
|
|
47
|
+
}]);
|
|
48
|
+
if (edit) {
|
|
49
|
+
const answer = await inquirer.prompt([{
|
|
50
|
+
type: 'input', name: 'message', message: 'Commit message:', default: message,
|
|
51
|
+
}]);
|
|
52
|
+
message = answer.message;
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
const committed = await commit(rootDir, message);
|
|
56
|
+
if (committed)
|
|
57
|
+
logger.success(`Committed: ${chalk.cyan(message)}`);
|
|
58
|
+
return committed;
|
|
59
|
+
}
|
|
60
|
+
//# sourceMappingURL=commit-workflow.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"commit-workflow.js","sourceRoot":"","sources":["../../src/services/commit-workflow.ts"],"names":[],"mappings":"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"}
|
|
@@ -9,13 +9,24 @@ export interface GitStatus {
|
|
|
9
9
|
unstaged: string[];
|
|
10
10
|
untracked: string[];
|
|
11
11
|
}
|
|
12
|
+
export interface CommitPlan {
|
|
13
|
+
branch: string | null;
|
|
14
|
+
remoteUrl: string | null;
|
|
15
|
+
staged: string[];
|
|
16
|
+
toStage: string[];
|
|
17
|
+
preservedUnstaged: string[];
|
|
18
|
+
sensitive: string[];
|
|
19
|
+
}
|
|
20
|
+
export declare function getCommitPlan(rootDir: string): Promise<CommitPlan>;
|
|
21
|
+
export declare function stageCommitPlan(rootDir: string, plan: CommitPlan): Promise<void>;
|
|
22
|
+
export declare function getStagedSummary(rootDir: string): Promise<string>;
|
|
12
23
|
export declare function getGitStatus(rootDir: string): Promise<GitStatus>;
|
|
13
24
|
export declare function initGit(rootDir: string): Promise<void>;
|
|
14
25
|
export declare function generateGitignore(rootDir: string, analysis: ProjectAnalysis): Promise<void>;
|
|
15
26
|
export declare function stageAll(rootDir: string): Promise<void>;
|
|
16
27
|
export declare function stageFiles(rootDir: string, files: string[]): Promise<void>;
|
|
17
28
|
export declare function generateCommitMessage(rootDir: string, useAI: boolean): Promise<string>;
|
|
18
|
-
export declare function commit(rootDir: string, message: string): Promise<
|
|
29
|
+
export declare function commit(rootDir: string, message: string): Promise<boolean>;
|
|
19
30
|
export declare function push(rootDir: string, branch?: string): Promise<void>;
|
|
20
31
|
export declare function addRemote(rootDir: string, url: string): Promise<void>;
|
|
21
32
|
export declare function getCurrentBranch(rootDir: string): Promise<string>;
|
|
@@ -1 +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,
|
|
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,MAAM,WAAW,UAAU;IACzB,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,iBAAiB,EAAE,MAAM,EAAE,CAAC;IAC5B,SAAS,EAAE,MAAM,EAAE,CAAC;CACrB;AAUD,wBAAsB,aAAa,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,CAAC,CAqBxE;AAED,wBAAsB,eAAe,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC,CAGtF;AAED,wBAAsB,gBAAgB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAEvE;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,OAAO,CAAC,CAY/E;AAED,wBAAsB,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAgB1E;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"}
|
|
@@ -4,6 +4,42 @@ import { join } from 'path';
|
|
|
4
4
|
import { getProvider } from '../ai/provider.js';
|
|
5
5
|
import { commitMessagePrompt } from '../ai/prompts.js';
|
|
6
6
|
import { logger } from '../utils/logger.js';
|
|
7
|
+
function looksSensitive(path) {
|
|
8
|
+
const normalized = path.replace(/\\/g, '/').toLowerCase();
|
|
9
|
+
const name = normalized.split('/').pop() || '';
|
|
10
|
+
if (/^\.env(?:\.|$)/.test(name) && !/\.(example|sample|template)$/.test(name))
|
|
11
|
+
return true;
|
|
12
|
+
return /(^|\/)(\.npmrc|\.pypirc|credentials(?:\.json)?|secrets?(?:\.json)?|id_rsa|id_ed25519)$/.test(normalized) ||
|
|
13
|
+
/\.(pem|p12|pfx|key)$/.test(name);
|
|
14
|
+
}
|
|
15
|
+
export async function getCommitPlan(rootDir) {
|
|
16
|
+
const git = simpleGit(rootDir);
|
|
17
|
+
const status = await git.status();
|
|
18
|
+
const remotes = await git.getRemotes(true);
|
|
19
|
+
const origin = remotes.find(remote => remote.name === 'origin');
|
|
20
|
+
const staged = status.files.filter(file => file.index !== ' ' && file.index !== '?')
|
|
21
|
+
.map(file => file.path);
|
|
22
|
+
const toStage = status.files.filter(file => file.index === '?' ||
|
|
23
|
+
(file.index === ' ' && file.working_dir !== ' '))
|
|
24
|
+
.map(file => file.path);
|
|
25
|
+
const preservedUnstaged = status.files.filter(file => file.index !== ' ' && file.index !== '?' && file.working_dir !== ' ').map(file => file.path);
|
|
26
|
+
return {
|
|
27
|
+
branch: status.current,
|
|
28
|
+
remoteUrl: origin?.refs.push || null,
|
|
29
|
+
staged,
|
|
30
|
+
toStage,
|
|
31
|
+
preservedUnstaged,
|
|
32
|
+
sensitive: [...new Set([...staged, ...toStage].filter(looksSensitive))],
|
|
33
|
+
};
|
|
34
|
+
}
|
|
35
|
+
export async function stageCommitPlan(rootDir, plan) {
|
|
36
|
+
if (plan.toStage.length === 0)
|
|
37
|
+
return;
|
|
38
|
+
await simpleGit(rootDir).raw(['add', '-A', '--', ...plan.toStage]);
|
|
39
|
+
}
|
|
40
|
+
export async function getStagedSummary(rootDir) {
|
|
41
|
+
return simpleGit(rootDir).diff(['--cached', '--stat']);
|
|
42
|
+
}
|
|
7
43
|
export async function getGitStatus(rootDir) {
|
|
8
44
|
const git = simpleGit(rootDir);
|
|
9
45
|
try {
|
|
@@ -129,14 +165,17 @@ export async function commit(rootDir, message) {
|
|
|
129
165
|
// Nothing staged — skip commit silently instead of throwing
|
|
130
166
|
if (status.staged.length === 0) {
|
|
131
167
|
logger.dimmed('Nothing to commit — working tree clean');
|
|
132
|
-
return;
|
|
168
|
+
return false;
|
|
133
169
|
}
|
|
134
170
|
await git.commit(message);
|
|
171
|
+
return true;
|
|
135
172
|
}
|
|
136
173
|
export async function push(rootDir, branch) {
|
|
137
174
|
const git = simpleGit(rootDir);
|
|
138
175
|
const status = await git.status();
|
|
139
|
-
const currentBranch = branch || status.current
|
|
176
|
+
const currentBranch = branch || status.current;
|
|
177
|
+
if (!currentBranch)
|
|
178
|
+
throw new Error('Cannot push from a detached HEAD or unnamed branch');
|
|
140
179
|
try {
|
|
141
180
|
await git.push('origin', currentBranch, ['--set-upstream']);
|
|
142
181
|
}
|
|
@@ -154,7 +193,7 @@ export async function addRemote(rootDir, url) {
|
|
|
154
193
|
const git = simpleGit(rootDir);
|
|
155
194
|
const remotes = await git.getRemotes();
|
|
156
195
|
if (remotes.some(r => r.name === 'origin')) {
|
|
157
|
-
|
|
196
|
+
throw new Error('Origin remote already exists; refusing to replace it');
|
|
158
197
|
}
|
|
159
198
|
else {
|
|
160
199
|
await git.addRemote('origin', url);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"git-service.js","sourceRoot":"","sources":["../../src/services/git-service.ts"],"names":[],"mappings":"AAAA,OAAO,
|
|
1
|
+
{"version":3,"file":"git-service.js","sourceRoot":"","sources":["../../src/services/git-service.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
export interface ConversionResult {
|
|
2
|
+
latex: string;
|
|
3
|
+
outputPath: string;
|
|
4
|
+
}
|
|
5
|
+
/**
|
|
6
|
+
* Extract text from a PDF file using pdf-parse
|
|
7
|
+
*/
|
|
8
|
+
export declare function extractPDFText(pdfPath: string): Promise<string>;
|
|
9
|
+
/**
|
|
10
|
+
* Convert extracted PDF text into a LaTeX resume using AI
|
|
11
|
+
*/
|
|
12
|
+
export declare function convertPDFToLatex(pdfPath: string, ownerInfo: {
|
|
13
|
+
name?: string;
|
|
14
|
+
email?: string;
|
|
15
|
+
website?: string;
|
|
16
|
+
}): Promise<ConversionResult>;
|
|
17
|
+
//# sourceMappingURL=pdf-to-latex.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pdf-to-latex.d.ts","sourceRoot":"","sources":["../../src/services/pdf-to-latex.ts"],"names":[],"mappings":"AAUA,MAAM,WAAW,gBAAgB;IAC/B,KAAK,EAAE,MAAM,CAAC;IACd,UAAU,EAAE,MAAM,CAAC;CACpB;AAED;;GAEG;AACH,wBAAsB,cAAc,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CA4BrE;AAED;;GAEG;AACH,wBAAsB,iBAAiB,CACrC,OAAO,EAAE,MAAM,EACf,SAAS,EAAE;IAAE,IAAI,CAAC,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IAAC,OAAO,CAAC,EAAE,MAAM,CAAA;CAAE,GAC7D,OAAO,CAAC,gBAAgB,CAAC,CA4D3B"}
|
|
@@ -0,0 +1,108 @@
|
|
|
1
|
+
import { existsSync, writeFileSync } from 'fs';
|
|
2
|
+
import { join } from 'path';
|
|
3
|
+
import { homedir } from 'os';
|
|
4
|
+
import { createRequire } from 'module';
|
|
5
|
+
import { getProvider } from '../ai/provider.js';
|
|
6
|
+
import { pdfToLatexPrompt } from '../ai/prompts.js';
|
|
7
|
+
import { logger, spinner } from '../utils/logger.js';
|
|
8
|
+
const _require = createRequire(import.meta.url);
|
|
9
|
+
/**
|
|
10
|
+
* Extract text from a PDF file using pdf-parse
|
|
11
|
+
*/
|
|
12
|
+
export async function extractPDFText(pdfPath) {
|
|
13
|
+
if (!existsSync(pdfPath)) {
|
|
14
|
+
throw new Error(`PDF not found: ${pdfPath}`);
|
|
15
|
+
}
|
|
16
|
+
const { readFileSync } = await import('fs');
|
|
17
|
+
try {
|
|
18
|
+
const { PDFParse } = await import('pdf-parse');
|
|
19
|
+
const buffer = readFileSync(pdfPath);
|
|
20
|
+
const parser = new PDFParse({ data: buffer });
|
|
21
|
+
let text;
|
|
22
|
+
try {
|
|
23
|
+
const data = await parser.getText();
|
|
24
|
+
text = data.text.trim();
|
|
25
|
+
}
|
|
26
|
+
finally {
|
|
27
|
+
await parser.destroy();
|
|
28
|
+
}
|
|
29
|
+
if (!text || text.length < 50) {
|
|
30
|
+
throw new Error('PDF appears to be empty or image-only (scanned PDF). Text extraction requires a text-based PDF.');
|
|
31
|
+
}
|
|
32
|
+
return text;
|
|
33
|
+
}
|
|
34
|
+
catch (e) {
|
|
35
|
+
if (e.message.includes('empty') || e.message.includes('image-only'))
|
|
36
|
+
throw e;
|
|
37
|
+
throw new Error(`Failed to read PDF: ${e.message}`);
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* Convert extracted PDF text into a LaTeX resume using AI
|
|
42
|
+
*/
|
|
43
|
+
export async function convertPDFToLatex(pdfPath, ownerInfo) {
|
|
44
|
+
// Step 1: Extract text
|
|
45
|
+
const extractSpin = spinner('Extracting text from PDF...').start();
|
|
46
|
+
let resumeText;
|
|
47
|
+
try {
|
|
48
|
+
resumeText = await extractPDFText(pdfPath);
|
|
49
|
+
extractSpin.succeed(`Extracted ${resumeText.length.toLocaleString()} characters from PDF`);
|
|
50
|
+
}
|
|
51
|
+
catch (e) {
|
|
52
|
+
extractSpin.fail(`PDF extraction failed: ${e.message}`);
|
|
53
|
+
throw e;
|
|
54
|
+
}
|
|
55
|
+
logger.verbose('--- Extracted text preview ---');
|
|
56
|
+
logger.verbose(resumeText.slice(0, 500));
|
|
57
|
+
logger.verbose('---');
|
|
58
|
+
// Step 2: Send to AI
|
|
59
|
+
const aiSpin = spinner('Converting to LaTeX with AI...').start();
|
|
60
|
+
try {
|
|
61
|
+
const provider = getProvider();
|
|
62
|
+
const prompt = pdfToLatexPrompt(resumeText, ownerInfo);
|
|
63
|
+
const messages = [
|
|
64
|
+
{
|
|
65
|
+
role: 'system',
|
|
66
|
+
content: 'You are a LaTeX expert. You convert resume content into clean, compilable LaTeX using the exact template structure provided. You never add markdown fences or explanations — only LaTeX source code.',
|
|
67
|
+
},
|
|
68
|
+
{ role: 'user', content: prompt },
|
|
69
|
+
];
|
|
70
|
+
const response = await provider.generate(messages, {
|
|
71
|
+
temperature: 0.2, // Low temperature for accurate conversion
|
|
72
|
+
maxTokens: 8192,
|
|
73
|
+
});
|
|
74
|
+
let latex = response.content.trim();
|
|
75
|
+
// Strip any accidental markdown fences
|
|
76
|
+
latex = latex
|
|
77
|
+
.replace(/^```(?:latex|tex)?\n?/i, '')
|
|
78
|
+
.replace(/\n?```$/i, '')
|
|
79
|
+
.trim();
|
|
80
|
+
// Validate it looks like LaTeX
|
|
81
|
+
if (!latex.includes('\\documentclass') || !latex.includes('\\end{document}')) {
|
|
82
|
+
throw new Error('AI returned invalid LaTeX — missing \\documentclass or \\end{document}');
|
|
83
|
+
}
|
|
84
|
+
aiSpin.succeed('LaTeX conversion complete');
|
|
85
|
+
// Step 3: Save output
|
|
86
|
+
const outputPath = determineOutputPath(pdfPath);
|
|
87
|
+
writeFileSync(outputPath, latex, 'utf-8');
|
|
88
|
+
return { latex, outputPath };
|
|
89
|
+
}
|
|
90
|
+
catch (e) {
|
|
91
|
+
aiSpin.fail(`AI conversion failed: ${e.message}`);
|
|
92
|
+
throw e;
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
function determineOutputPath(pdfPath) {
|
|
96
|
+
const dir = pdfPath.replace(/[/\\][^/\\]+$/, '');
|
|
97
|
+
const baseName = pdfPath.split(/[/\\]/).pop().replace(/\.pdf$/i, '');
|
|
98
|
+
const candidate = join(dir, `${baseName}.tex`);
|
|
99
|
+
try {
|
|
100
|
+
const { accessSync, constants } = _require('fs');
|
|
101
|
+
accessSync(dir, constants.W_OK);
|
|
102
|
+
return candidate;
|
|
103
|
+
}
|
|
104
|
+
catch {
|
|
105
|
+
return join(homedir(), '.autogit', `${baseName}.tex`);
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
//# sourceMappingURL=pdf-to-latex.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pdf-to-latex.js","sourceRoot":"","sources":["../../src/services/pdf-to-latex.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import type { ProjectAnalysis } from '../scanner/project-analyzer.js';
|
|
2
|
+
export interface PublishOptions {
|
|
3
|
+
yes?: boolean;
|
|
4
|
+
dryRun?: boolean;
|
|
5
|
+
private?: boolean;
|
|
6
|
+
public?: boolean;
|
|
7
|
+
}
|
|
8
|
+
export interface PublishResult {
|
|
9
|
+
published: boolean;
|
|
10
|
+
url?: string;
|
|
11
|
+
}
|
|
12
|
+
export declare function remoteWebUrl(remoteUrl: string): string | undefined;
|
|
13
|
+
export declare function runPublishWorkflow(rootDir: string, analysis: ProjectAnalysis, options: PublishOptions): Promise<PublishResult>;
|
|
14
|
+
//# sourceMappingURL=publish-workflow.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"publish-workflow.d.ts","sourceRoot":"","sources":["../../src/services/publish-workflow.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,gCAAgC,CAAC;AAMtE,MAAM,WAAW,cAAc;IAC7B,GAAG,CAAC,EAAE,OAAO,CAAC;IACd,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,MAAM,CAAC,EAAE,OAAO,CAAC;CAClB;AAED,MAAM,WAAW,aAAa;IAC5B,SAAS,EAAE,OAAO,CAAC;IACnB,GAAG,CAAC,EAAE,MAAM,CAAC;CACd;AAED,wBAAgB,YAAY,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAalE;AAED,wBAAsB,kBAAkB,CACtC,OAAO,EAAE,MAAM,EACf,QAAQ,EAAE,eAAe,EACzB,OAAO,EAAE,cAAc,GACtB,OAAO,CAAC,aAAa,CAAC,CAsExB"}
|
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
import chalk from 'chalk';
|
|
2
|
+
import inquirer from 'inquirer';
|
|
3
|
+
import { addRemote, getGitStatus, push } from './git-service.js';
|
|
4
|
+
import { createRepo, getAuthenticatedUser, repoExists, generateTopics, isGitHubConfigured } from './github-service.js';
|
|
5
|
+
import { logger, spinner } from '../utils/logger.js';
|
|
6
|
+
import { loadConfig } from '../config/manager.js';
|
|
7
|
+
export function remoteWebUrl(remoteUrl) {
|
|
8
|
+
const ssh = remoteUrl.match(/^git@([^:]+):(.+?)(?:\.git)?$/i);
|
|
9
|
+
if (ssh)
|
|
10
|
+
return `https://${ssh[1]}/${ssh[2].replace(/\.git$/, '')}`;
|
|
11
|
+
try {
|
|
12
|
+
const url = new URL(remoteUrl);
|
|
13
|
+
if (!['http:', 'https:'].includes(url.protocol))
|
|
14
|
+
return undefined;
|
|
15
|
+
url.username = '';
|
|
16
|
+
url.password = '';
|
|
17
|
+
url.pathname = url.pathname.replace(/\.git$/, '');
|
|
18
|
+
return url.toString().replace(/\/$/, '');
|
|
19
|
+
}
|
|
20
|
+
catch {
|
|
21
|
+
return undefined;
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
export async function runPublishWorkflow(rootDir, analysis, options) {
|
|
25
|
+
const status = await getGitStatus(rootDir);
|
|
26
|
+
if (!status.isRepo && options.dryRun) {
|
|
27
|
+
logger.dimmed('[dry-run] Would initialize Git, then create or use origin and push the new commit');
|
|
28
|
+
return { published: false };
|
|
29
|
+
}
|
|
30
|
+
if (!status.isRepo)
|
|
31
|
+
throw new Error('Not a Git repository');
|
|
32
|
+
let url = status.remoteUrl ? remoteWebUrl(status.remoteUrl) : undefined;
|
|
33
|
+
if (options.dryRun) {
|
|
34
|
+
logger.dimmed(status.hasRemote
|
|
35
|
+
? `[dry-run] Would push ${status.branch} to existing origin: ${status.remoteUrl}`
|
|
36
|
+
: '[dry-run] No origin remote; repository creation would require confirmation');
|
|
37
|
+
return { published: false, url };
|
|
38
|
+
}
|
|
39
|
+
if (status.hasRemote) {
|
|
40
|
+
logger.info(`Using existing origin: ${status.remoteUrl}`);
|
|
41
|
+
}
|
|
42
|
+
else {
|
|
43
|
+
if (!isGitHubConfigured()) {
|
|
44
|
+
logger.warn('No origin remote or GitHub token. Commit saved locally; run "autogit login" to publish.');
|
|
45
|
+
return { published: false };
|
|
46
|
+
}
|
|
47
|
+
const user = await getAuthenticatedUser();
|
|
48
|
+
const repoName = analysis.name;
|
|
49
|
+
if (await repoExists(user.login, repoName)) {
|
|
50
|
+
logger.warn(`Repository ${user.login}/${repoName} already exists. Set origin yourself to choose the correct destination; no remote was changed.`);
|
|
51
|
+
return { published: false };
|
|
52
|
+
}
|
|
53
|
+
const configuredVisibility = loadConfig().defaults?.visibility;
|
|
54
|
+
let isPrivate = options.private === true || (options.public !== true && configuredVisibility !== 'public');
|
|
55
|
+
if (!options.yes && options.private === undefined && options.public === undefined) {
|
|
56
|
+
const answer = await inquirer.prompt([{
|
|
57
|
+
type: 'list', name: 'visibility', message: `Visibility for ${user.login}/${repoName}:`,
|
|
58
|
+
choices: [
|
|
59
|
+
{ name: 'Private', value: 'private' },
|
|
60
|
+
{ name: 'Public', value: 'public' },
|
|
61
|
+
],
|
|
62
|
+
default: isPrivate ? 'private' : 'public',
|
|
63
|
+
}]);
|
|
64
|
+
isPrivate = answer.visibility === 'private';
|
|
65
|
+
}
|
|
66
|
+
if (!options.yes) {
|
|
67
|
+
const answer = await inquirer.prompt([{
|
|
68
|
+
type: 'confirm', name: 'confirm',
|
|
69
|
+
message: `Create ${isPrivate ? 'private' : 'public'} repository ${user.login}/${repoName}?`,
|
|
70
|
+
default: false,
|
|
71
|
+
}]);
|
|
72
|
+
if (!answer.confirm)
|
|
73
|
+
return { published: false };
|
|
74
|
+
}
|
|
75
|
+
const repo = await createRepo({
|
|
76
|
+
name: repoName,
|
|
77
|
+
description: analysis.description || '',
|
|
78
|
+
isPrivate,
|
|
79
|
+
topics: generateTopics(analysis),
|
|
80
|
+
});
|
|
81
|
+
await addRemote(rootDir, repo.cloneUrl);
|
|
82
|
+
url = repo.htmlUrl;
|
|
83
|
+
logger.success(`Created repository: ${chalk.underline(url)}`);
|
|
84
|
+
}
|
|
85
|
+
const pushSpin = spinner('Pushing to origin...').start();
|
|
86
|
+
try {
|
|
87
|
+
await push(rootDir);
|
|
88
|
+
pushSpin.succeed('Pushed to origin');
|
|
89
|
+
return { published: true, url };
|
|
90
|
+
}
|
|
91
|
+
catch (error) {
|
|
92
|
+
pushSpin.fail(`Push failed: ${error.message}`);
|
|
93
|
+
throw error;
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
//# sourceMappingURL=publish-workflow.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"publish-workflow.js","sourceRoot":"","sources":["../../src/services/publish-workflow.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import type { ProjectAnalysis } from '../scanner/project-analyzer.js';
|
|
2
|
+
import { type AIProvider } from '../ai/provider.js';
|
|
2
3
|
import type { ScanResult } from '../scanner/file-scanner.js';
|
|
3
4
|
export interface ReadmeResult {
|
|
4
5
|
content: string;
|
|
@@ -6,7 +7,7 @@ export interface ReadmeResult {
|
|
|
6
7
|
diff: string | null;
|
|
7
8
|
path: string;
|
|
8
9
|
}
|
|
9
|
-
export declare function generateReadme(rootDir: string, analysis: ProjectAnalysis, useAI: boolean, scan?: ScanResult): Promise<ReadmeResult>;
|
|
10
|
+
export declare function generateReadme(rootDir: string, analysis: ProjectAnalysis, useAI: boolean, scan?: ScanResult, providerOverride?: AIProvider): Promise<ReadmeResult>;
|
|
10
11
|
export declare function writeReadme(result: ReadmeResult): Promise<void>;
|
|
11
12
|
export declare function displayDiff(diff: string): void;
|
|
12
13
|
//# sourceMappingURL=readme-manager.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"readme-manager.d.ts","sourceRoot":"","sources":["../../src/services/readme-manager.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,gCAAgC,CAAC;
|
|
1
|
+
{"version":3,"file":"readme-manager.d.ts","sourceRoot":"","sources":["../../src/services/readme-manager.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,gCAAgC,CAAC;AACtE,OAAO,EAA+B,KAAK,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAIjF,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,4BAA4B,CAAC;AAE7D,MAAM,WAAW,YAAY;IAC3B,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,OAAO,CAAC;IACf,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IACpB,IAAI,EAAE,MAAM,CAAC;CACd;AAED,wBAAsB,cAAc,CAClC,OAAO,EAAE,MAAM,EACf,QAAQ,EAAE,eAAe,EACzB,KAAK,EAAE,OAAO,EACd,IAAI,CAAC,EAAE,UAAU,EACjB,gBAAgB,CAAC,EAAE,UAAU,GAC5B,OAAO,CAAC,YAAY,CAAC,CA4DvB;AAED,wBAAsB,WAAW,CAAC,MAAM,EAAE,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC,CAGrE;AAED,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAa9C"}
|