@hxccoder/context-packer 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.
package/dist/cli.js ADDED
@@ -0,0 +1,80 @@
1
+ #!/usr/bin/env node
2
+ "use strict";
3
+ var __importDefault = (this && this.__importDefault) || function (mod) {
4
+ return (mod && mod.__esModule) ? mod : { "default": mod };
5
+ };
6
+ Object.defineProperty(exports, "__esModule", { value: true });
7
+ const node_process_1 = __importDefault(require("node:process"));
8
+ const prompts_1 = require("@inquirer/prompts");
9
+ const theme_1 = require("./ui/theme");
10
+ const cancelToken_1 = require("./utils/cancelToken");
11
+ const ignoreFactory_1 = require("./core/ignoreFactory");
12
+ const scanner_1 = require("./core/scanner");
13
+ const atomicFileManager_1 = require("./core/atomicFileManager");
14
+ const compiler_1 = require("./core/compiler");
15
+ const GeminiTokenizerStrategy_1 = require("./strategies/GeminiTokenizerStrategy");
16
+ const HeuristicTokenizerStrategy_1 = require("./strategies/HeuristicTokenizerStrategy");
17
+ const GptTokenizerStrategy_1 = require("./strategies/GptTokenizerStrategy");
18
+ const XmlWriter_1 = require("./strategies/XmlWriter");
19
+ async function main() {
20
+ theme_1.theme.printBanner();
21
+ const token = new cancelToken_1.ProcessCancellationToken();
22
+ try {
23
+ const modelChoice = await (0, prompts_1.select)({
24
+ message: `${theme_1.theme.icon.arrow} Selecciona el modelo de IA donde pegarás el contexto:`,
25
+ choices: [
26
+ {
27
+ name: 'Gemini 1.5 Pro / Flash (Google AI Studio - Optimización Local)',
28
+ value: 'gemini',
29
+ description: 'Límite: 2M tokens. Heurística de bytes ultra-rápida y precisa.',
30
+ },
31
+ {
32
+ name: 'DeepSeek Coder V2 (Heurística Matemática Conservadora)',
33
+ value: 'deepseek',
34
+ description: 'Límite: 128K tokens. Factor seguro de 3.5 bytes/token.',
35
+ },
36
+ {
37
+ name: 'OpenAI GPT-4o / o1 (Conteo Exacto con Tiktoken WASM)',
38
+ value: 'gpt',
39
+ description: 'Límite: 128K tokens. Carga perezosa del codificador o200k_base.',
40
+ },
41
+ ],
42
+ });
43
+ let tokenizer;
44
+ switch (modelChoice) {
45
+ case 'gemini':
46
+ tokenizer = new GeminiTokenizerStrategy_1.GeminiTokenizerStrategy();
47
+ break;
48
+ case 'deepseek':
49
+ tokenizer = new HeuristicTokenizerStrategy_1.HeuristicTokenizerStrategy('deepseek-coder', 128000, 3.5);
50
+ break;
51
+ case 'gpt':
52
+ tokenizer = new GptTokenizerStrategy_1.GptTokenizerStrategy();
53
+ break;
54
+ default:
55
+ throw new Error('Estrategia de modelo no soportada.');
56
+ }
57
+ const rootDir = node_process_1.default.cwd();
58
+ node_process_1.default.stdout.write(`\n${theme_1.theme.icon.info} Analizando espacio de trabajo y reglas de exclusión...\n`);
59
+ const ignoreFilter = await ignoreFactory_1.IgnoreFactory.create(rootDir);
60
+ const scanner = new scanner_1.RepoScanner(rootDir, ignoreFilter);
61
+ const fileManager = new atomicFileManager_1.AtomicFileManager('contexto-ia.txt', '.contexto-ia.tmp');
62
+ const writer = new XmlWriter_1.XmlWriter();
63
+ const compiler = new compiler_1.ContextCompiler(rootDir, scanner, fileManager, tokenizer, writer);
64
+ node_process_1.default.stdout.write(`${theme_1.theme.icon.info} Procesando archivos en modo reactivo. Compilando...\n`);
65
+ const metrics = await compiler.compile(token);
66
+ node_process_1.default.stdout.write(theme_1.theme.formatMetrics(metrics));
67
+ }
68
+ catch (error) {
69
+ if (error instanceof cancelToken_1.CancellationError) {
70
+ node_process_1.default.stdout.write(`\n${theme_1.theme.icon.warn} ${theme_1.theme.color.warn('Operación abortada de forma segura por el usuario.')}\n`);
71
+ node_process_1.default.stdout.write(` ${theme_1.theme.color.muted('El archivo temporal fue eliminado. Tu espacio de trabajo está limpio.')}\n\n`);
72
+ node_process_1.default.exit(0);
73
+ }
74
+ node_process_1.default.stderr.write(`\n${theme_1.theme.icon.error} ${theme_1.theme.color.error('ERROR CRÍTICO EN EL PIPELINE:')}\n`);
75
+ node_process_1.default.stderr.write(` ${error.message || error}\n\n`);
76
+ node_process_1.default.exit(1);
77
+ }
78
+ }
79
+ main();
80
+ //# sourceMappingURL=cli.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,95 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ Object.defineProperty(exports, "__esModule", { value: true });
36
+ exports.AtomicFileManager = void 0;
37
+ const fs = __importStar(require("node:fs"));
38
+ const fsPromises = __importStar(require("node:fs/promises"));
39
+ class AtomicFileManager {
40
+ targetPath;
41
+ tempPath;
42
+ writeStream = null;
43
+ isCommitted = false;
44
+ constructor(targetPath = 'contexto-ia.txt', tempPath = '.contexto-ia.tmp') {
45
+ this.targetPath = targetPath;
46
+ this.tempPath = tempPath;
47
+ }
48
+ createTempStream(signal) {
49
+ if (this.writeStream) {
50
+ throw new Error('[AtomicFileManager] Ya existe un stream activo de escritura.');
51
+ }
52
+ this.writeStream = fs.createWriteStream(this.tempPath, {
53
+ flags: 'w',
54
+ encoding: 'utf8',
55
+ signal
56
+ });
57
+ return this.writeStream;
58
+ }
59
+ async commit() {
60
+ await this.ensureClosedStream();
61
+ try {
62
+ await fsPromises.rename(this.tempPath, this.targetPath);
63
+ this.isCommitted = true;
64
+ }
65
+ catch (error) {
66
+ throw new Error(`[AtomicFileManager] Error fatal al consolidar el archivo final: ${error.message}`);
67
+ }
68
+ }
69
+ async rollback() {
70
+ await this.ensureClosedStream();
71
+ if (this.isCommitted)
72
+ return;
73
+ try {
74
+ await fsPromises.access(this.tempPath);
75
+ await fsPromises.unlink(this.tempPath);
76
+ }
77
+ catch {
78
+ }
79
+ }
80
+ async ensureClosedStream() {
81
+ if (this.writeStream) {
82
+ await new Promise((resolve) => {
83
+ if (this.writeStream.writableEnded) {
84
+ resolve();
85
+ }
86
+ else {
87
+ this.writeStream.end(resolve);
88
+ }
89
+ });
90
+ this.writeStream = null;
91
+ }
92
+ }
93
+ }
94
+ exports.AtomicFileManager = AtomicFileManager;
95
+ //# sourceMappingURL=atomicFileManager.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"atomicFileManager.js","sourceRoot":"","sources":["../../src/core/atomicFileManager.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,4CAA8B;AAC9B,6DAA+C;AAG/C,MAAa,iBAAiB;IACT,UAAU,CAAS;IACnB,QAAQ,CAAS;IAC1B,WAAW,GAAoB,IAAI,CAAC;IACpC,WAAW,GAAY,KAAK,CAAC;IAEzC,YAAY,aAAqB,iBAAiB,EAAE,WAAmB,kBAAkB;QACrF,IAAI,CAAC,UAAU,GAAG,UAAU,CAAC;QAC7B,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAC;IAC7B,CAAC;IAKM,gBAAgB,CAAC,MAAoB;QACxC,IAAI,IAAI,CAAC,WAAW,EAAE,CAAC;YACnB,MAAM,IAAI,KAAK,CAAC,8DAA8D,CAAC,CAAC;QACpF,CAAC;QAGD,IAAI,CAAC,WAAW,GAAG,EAAE,CAAC,iBAAiB,CAAC,IAAI,CAAC,QAAQ,EAAE;YACvD,KAAK,EAAE,GAAG;YACV,QAAQ,EAAE,MAAM;YAChB,MAAM;SACL,CAAC,CAAC;QAEH,OAAO,IAAI,CAAC,WAAW,CAAC;IAC5B,CAAC;IAKM,KAAK,CAAC,MAAM;QACf,MAAM,IAAI,CAAC,kBAAkB,EAAE,CAAC;QAEhC,IAAI,CAAC;YAED,MAAM,UAAU,CAAC,MAAM,CAAC,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,UAAU,CAAC,CAAC;YACxD,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC;QAC5B,CAAC;QAAC,OAAO,KAAU,EAAE,CAAC;YAClB,MAAM,IAAI,KAAK,CAAC,mEAAmE,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC;QACxG,CAAC;IACL,CAAC;IAKM,KAAK,CAAC,QAAQ;QACjB,MAAM,IAAI,CAAC,kBAAkB,EAAE,CAAC;QAEhC,IAAI,IAAI,CAAC,WAAW;YAAE,OAAO;QAE7B,IAAI,CAAC;YAED,MAAM,UAAU,CAAC,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;YACvC,MAAM,UAAU,CAAC,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QAC3C,CAAC;QAAC,MAAM,CAAC;QAET,CAAC;IACL,CAAC;IAMO,KAAK,CAAC,kBAAkB;QAC5B,IAAI,IAAI,CAAC,WAAW,EAAE,CAAC;YACnB,MAAM,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,EAAE;gBAEpC,IAAI,IAAI,CAAC,WAAY,CAAC,aAAa,EAAE,CAAC;oBAClC,OAAO,EAAE,CAAC;gBACd,CAAC;qBAAM,CAAC;oBAEJ,IAAI,CAAC,WAAY,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;gBACnC,CAAC;YACT,CAAC,CAAC,CAAC;YACH,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC;QACpB,CAAC;IACD,CAAC;CACJ;AA/ED,8CA+EC"}
@@ -0,0 +1,81 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.ContextCompiler = void 0;
4
+ const node_fs_1 = require("node:fs");
5
+ const promises_1 = require("node:fs/promises");
6
+ const node_path_1 = require("node:path");
7
+ const node_stream_1 = require("node:stream");
8
+ class ContextCompiler {
9
+ scanner;
10
+ fileManager;
11
+ tokenizer;
12
+ writer;
13
+ rootDir;
14
+ constructor(rootDir, scanner, fileManager, tokenizer, writer) {
15
+ this.rootDir = rootDir;
16
+ this.scanner = scanner;
17
+ this.fileManager = fileManager;
18
+ this.tokenizer = tokenizer;
19
+ this.writer = writer;
20
+ }
21
+ async compile(token) {
22
+ const startTime = Date.now();
23
+ let totalFilesProcessed = 0;
24
+ let totalBytesProcessed = 0;
25
+ let totalTokensCounted = 0;
26
+ await this.tokenizer.initialize();
27
+ const outputStream = this.fileManager.createTempStream(token.getSignal());
28
+ this.writer.initialize(outputStream);
29
+ try {
30
+ await this.writer.writeHeader('/* Estructura del repositorio mapeada secuencialmente */\n');
31
+ for await (const absolutePath of this.scanner.scan(token)) {
32
+ token.throwIfCancelled();
33
+ const relativePath = (0, node_path_1.relative)(this.rootDir, absolutePath);
34
+ const fileStats = await (0, promises_1.stat)(absolutePath);
35
+ totalFilesProcessed++;
36
+ totalBytesProcessed += fileStats.size;
37
+ const fileReadStream = (0, node_fs_1.createReadStream)(absolutePath, {
38
+ encoding: 'utf8',
39
+ highWaterMark: 64 * 1024,
40
+ signal: token.getSignal()
41
+ });
42
+ const currentTokenizer = this.tokenizer;
43
+ const transformer = new node_stream_1.Transform({
44
+ decodeStrings: false,
45
+ transform(chunk, encoding, callback) {
46
+ try {
47
+ totalTokensCounted += currentTokenizer.countTokensExact(chunk);
48
+ const sanitizedChunk = chunk
49
+ .replace(/&/g, '&amp;')
50
+ .replace(/</g, '&lt;')
51
+ .replace(/>/g, '&gt;');
52
+ callback(null, sanitizedChunk);
53
+ }
54
+ catch (err) {
55
+ callback(err);
56
+ }
57
+ }
58
+ });
59
+ const transformedStream = fileReadStream.pipe(transformer);
60
+ await this.writer.writeFileBlock(relativePath, transformedStream);
61
+ }
62
+ await this.writer.finalize();
63
+ await this.fileManager.commit();
64
+ }
65
+ catch (error) {
66
+ await this.fileManager.rollback();
67
+ throw error;
68
+ }
69
+ finally {
70
+ this.tokenizer.destroy();
71
+ }
72
+ return {
73
+ totalFilesProcessed,
74
+ totalBytesProcessed,
75
+ totalTokensCounted,
76
+ executionTimeMs: Date.now() - startTime
77
+ };
78
+ }
79
+ }
80
+ exports.ContextCompiler = ContextCompiler;
81
+ //# sourceMappingURL=compiler.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"compiler.js","sourceRoot":"","sources":["../../src/core/compiler.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,63 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.IgnoreFactory = void 0;
7
+ const promises_1 = require("node:fs/promises");
8
+ const node_path_1 = require("node:path");
9
+ const node_process_1 = __importDefault(require("node:process"));
10
+ const ignore_1 = __importDefault(require("ignore"));
11
+ class IgnoreFactory {
12
+ static MANDATORY_IGNORES = [
13
+ '.git',
14
+ '.git/',
15
+ 'node_modules',
16
+ 'node_modules/',
17
+ '.contexto-ia.tmp',
18
+ 'contexto-ia.txt',
19
+ 'dist/',
20
+ 'build/',
21
+ 'coverage/',
22
+ '.env*',
23
+ '*.log',
24
+ '*.lock',
25
+ '*.jpg',
26
+ '*.jpeg',
27
+ '*.png',
28
+ '*.gif',
29
+ '*.webp',
30
+ '*.ico',
31
+ '*.svg',
32
+ '*.mp4',
33
+ '*.mp3',
34
+ '*.pdf',
35
+ '*.zip',
36
+ '*.tar.gz',
37
+ '*.rar',
38
+ '*.7z',
39
+ '*.woff',
40
+ '*.woff2',
41
+ '*.ttf',
42
+ '*.eot',
43
+ 'Thumbs.db',
44
+ '.DS_Store',
45
+ ];
46
+ static async create(rootDir) {
47
+ const ig = (0, ignore_1.default)();
48
+ ig.add(this.MANDATORY_IGNORES);
49
+ const gitignorePath = (0, node_path_1.join)(rootDir, '.gitignore');
50
+ try {
51
+ const gitignoreContent = await (0, promises_1.readFile)(gitignorePath, 'utf8');
52
+ ig.add(gitignoreContent);
53
+ }
54
+ catch (error) {
55
+ if (error.code !== 'ENOENT') {
56
+ node_process_1.default.stderr.write(`\n[!] Advertencia: No se pudo procesar el .gitignore (${error.message})\n`);
57
+ }
58
+ }
59
+ return ig;
60
+ }
61
+ }
62
+ exports.IgnoreFactory = IgnoreFactory;
63
+ //# sourceMappingURL=ignoreFactory.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ignoreFactory.js","sourceRoot":"","sources":["../../src/core/ignoreFactory.ts"],"names":[],"mappings":";;;;;;AAAA,+CAA4C;AAC5C,yCAAiC;AACjC,gEAAmC;AACnC,oDAA4B;AAG5B,MAAa,aAAa;IAKlB,MAAM,CAAU,iBAAiB,GAAG;QACxC,MAAM;QACN,OAAO;QACP,cAAc;QACd,eAAe;QACf,kBAAkB;QAClB,iBAAiB;QACjB,OAAO;QACP,QAAQ;QACR,WAAW;QACX,OAAO;QACP,OAAO;QACP,QAAQ;QAMR,OAAO;QACP,QAAQ;QACR,OAAO;QACP,OAAO;QACP,QAAQ;QACR,OAAO;QACP,OAAO;QACP,OAAO;QACP,OAAO;QAGP,OAAO;QACP,OAAO;QACP,UAAU;QACV,OAAO;QACP,MAAM;QAGN,QAAQ;QACR,SAAS;QACT,OAAO;QACP,OAAO;QACP,WAAW;QACX,WAAW;KACd,CAAC;IAMK,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,OAAe;QACtC,MAAM,EAAE,GAAG,IAAA,gBAAM,GAAE,CAAC;QAGpB,EAAE,CAAC,GAAG,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC;QAG/B,MAAM,aAAa,GAAG,IAAA,gBAAI,EAAC,OAAO,EAAE,YAAY,CAAC,CAAC;QAElD,IAAI,CAAC;YACD,MAAM,gBAAgB,GAAG,MAAM,IAAA,mBAAQ,EAAC,aAAa,EAAE,MAAM,CAAC,CAAC;YAC/D,EAAE,CAAC,GAAG,CAAC,gBAAgB,CAAC,CAAC;QAC7B,CAAC;QAAC,OAAO,KAAU,EAAE,CAAC;YAItB,IAAI,KAAK,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;gBAC1B,sBAAO,CAAC,MAAM,CAAC,KAAK,CAAC,yDAAyD,KAAK,CAAC,OAAO,KAAK,CAAC,CAAC;YACtG,CAAC;QACD,CAAC;QAED,OAAO,EAAE,CAAC;IACd,CAAC;;AA3ED,sCA4EC"}
@@ -0,0 +1,36 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.RepoScanner = void 0;
4
+ const promises_1 = require("node:fs/promises");
5
+ const node_path_1 = require("node:path");
6
+ class RepoScanner {
7
+ rootDir;
8
+ ignoreFilter;
9
+ constructor(rootDir, ignoreFilter) {
10
+ this.rootDir = rootDir;
11
+ this.ignoreFilter = ignoreFilter;
12
+ }
13
+ async *scan(token) {
14
+ yield* this.traverse(this.rootDir, token);
15
+ }
16
+ async *traverse(currentDir, token) {
17
+ token.throwIfCancelled();
18
+ const dir = await (0, promises_1.opendir)(currentDir);
19
+ for await (const entry of dir) {
20
+ token.throwIfCancelled();
21
+ const fullPath = (0, node_path_1.join)(currentDir, entry.name);
22
+ const relativePath = (0, node_path_1.relative)(this.rootDir, fullPath);
23
+ if (this.ignoreFilter.ignores(relativePath)) {
24
+ continue;
25
+ }
26
+ if (entry.isDirectory()) {
27
+ yield* this.traverse(fullPath, token);
28
+ }
29
+ else if (entry.isFile()) {
30
+ yield fullPath;
31
+ }
32
+ }
33
+ }
34
+ }
35
+ exports.RepoScanner = RepoScanner;
36
+ //# sourceMappingURL=scanner.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scanner.js","sourceRoot":"","sources":["../../src/core/scanner.ts"],"names":[],"mappings":";;;AAAA,+CAA2C;AAC3C,yCAA2C;AAI3C,MAAa,WAAW;IACH,OAAO,CAAS;IAChB,YAAY,CAAS;IAE1C,YAAY,OAAe,EAAE,YAAoB;QAC7C,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;QACvB,IAAI,CAAC,YAAY,GAAG,YAAY,CAAC;IACrC,CAAC;IAMQ,KAAK,CAAC,CAAC,IAAI,CAAC,KAAwB;QACzC,KAAK,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;IAC9C,CAAC;IAKS,KAAK,CAAC,CAAC,QAAQ,CAAC,UAAkB,EAAE,KAAwB;QAElE,KAAK,CAAC,gBAAgB,EAAE,CAAC;QAGzB,MAAM,GAAG,GAAG,MAAM,IAAA,kBAAO,EAAC,UAAU,CAAC,CAAC;QAItC,IAAI,KAAK,EAAE,MAAM,KAAK,IAAI,GAAG,EAAE,CAAC;YAE5B,KAAK,CAAC,gBAAgB,EAAE,CAAC;YAEzB,MAAM,QAAQ,GAAG,IAAA,gBAAI,EAAC,UAAU,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC;YAG9C,MAAM,YAAY,GAAG,IAAA,oBAAQ,EAAC,IAAI,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC;YAGtD,IAAI,IAAI,CAAC,YAAY,CAAC,OAAO,CAAC,YAAY,CAAC,EAAE,CAAC;gBAC9C,SAAS;YACjB,CAAC;YAEO,IAAI,KAAK,CAAC,WAAW,EAAE,EAAE,CAAC;gBAE9B,KAAK,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC;YAClC,CAAC;iBAAM,IAAI,KAAK,CAAC,MAAM,EAAE,EAAE,CAAC;gBAC5B,MAAM,QAAQ,CAAC;YACnB,CAAC;QACD,CAAC;IACL,CAAC;CACA;AAnDD,kCAmDC"}
@@ -0,0 +1,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=ContextWriter.interface.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ContextWriter.interface.js","sourceRoot":"","sources":["../../src/strategies/ContextWriter.interface.ts"],"names":[],"mappings":""}
@@ -0,0 +1,34 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.GeminiTokenizerStrategy = void 0;
4
+ const node_buffer_1 = require("node:buffer");
5
+ class GeminiTokenizerStrategy {
6
+ modelName;
7
+ contextLimit;
8
+ bytesPerToken;
9
+ constructor(modelName = 'gemini-1.5-pro', contextLimit = 2_097_152, bytesPerToken = 4) {
10
+ this.modelName = modelName;
11
+ this.contextLimit = contextLimit;
12
+ this.bytesPerToken = bytesPerToken;
13
+ }
14
+ getModelName() {
15
+ return this.modelName;
16
+ }
17
+ getContextLimit() {
18
+ return this.contextLimit;
19
+ }
20
+ async initialize() {
21
+ return Promise.resolve();
22
+ }
23
+ estimateTokensFromBytes(bytes) {
24
+ return Math.ceil(bytes / this.bytesPerToken);
25
+ }
26
+ countTokensExact(text) {
27
+ const actualBytes = node_buffer_1.Buffer.byteLength(text, 'utf8');
28
+ return Math.ceil(actualBytes / this.bytesPerToken);
29
+ }
30
+ destroy() {
31
+ }
32
+ }
33
+ exports.GeminiTokenizerStrategy = GeminiTokenizerStrategy;
34
+ //# sourceMappingURL=GeminiTokenizerStrategy.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"GeminiTokenizerStrategy.js","sourceRoot":"","sources":["../../src/strategies/GeminiTokenizerStrategy.ts"],"names":[],"mappings":";;;AAAA,6CAAqC;AAGrC,MAAa,uBAAuB;IAEf,SAAS,CAAS;IAClB,YAAY,CAAS;IACrB,aAAa,CAAS;IAM3C,YACI,YAAoB,gBAAgB,EACpC,eAAuB,SAAS,EAChC,gBAAwB,CAAC;QAEzB,IAAI,CAAC,SAAS,GAAG,SAAS,CAAC;QAC3B,IAAI,CAAC,YAAY,GAAG,YAAY,CAAC;QACjC,IAAI,CAAC,aAAa,GAAG,aAAa,CAAC;IACvC,CAAC;IAED,YAAY;QACR,OAAO,IAAI,CAAC,SAAS,CAAC;IAC1B,CAAC;IAED,eAAe;QACX,OAAO,IAAI,CAAC,YAAY,CAAC;IAC7B,CAAC;IAED,KAAK,CAAC,UAAU;QAEZ,OAAO,OAAO,CAAC,OAAO,EAAE,CAAC;IAC7B,CAAC;IAED,uBAAuB,CAAC,KAAa;QACjC,OAAO,IAAI,CAAC,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,aAAa,CAAC,CAAC;IACjD,CAAC;IAED,gBAAgB,CAAC,IAAY;QAIzB,MAAM,WAAW,GAAG,oBAAM,CAAC,UAAU,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;QACpD,OAAO,IAAI,CAAC,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC,aAAa,CAAC,CAAC;IACvD,CAAC;IAED,OAAO;IAEP,CAAC;CACA;AAhDD,0DAgDC"}
@@ -0,0 +1,49 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.GptTokenizerStrategy = void 0;
4
+ class GptTokenizerStrategy {
5
+ encoder = null;
6
+ modelName;
7
+ contextLimit;
8
+ encodingName;
9
+ constructor(modelName = 'gpt-4o', contextLimit = 128000, encodingName = 'o200k_base') {
10
+ this.modelName = modelName;
11
+ this.contextLimit = contextLimit;
12
+ this.encodingName = encodingName;
13
+ }
14
+ getModelName() {
15
+ return this.modelName;
16
+ }
17
+ getContextLimit() {
18
+ return this.contextLimit;
19
+ }
20
+ async initialize() {
21
+ if (!this.encoder) {
22
+ const { get_encoding } = await import('tiktoken');
23
+ this.encoder = get_encoding(this.encodingName);
24
+ }
25
+ }
26
+ estimateTokensFromBytes(bytes) {
27
+ return Math.ceil(bytes / 4);
28
+ }
29
+ countTokensExact(text) {
30
+ if (!this.encoder) {
31
+ throw new Error(`[${this.modelName}] La estrategia no ha sido inicializada. Llama a initialize() primero.`);
32
+ }
33
+ return this.encoder.encode(text).length;
34
+ }
35
+ destroy() {
36
+ if (this.encoder) {
37
+ try {
38
+ this.encoder.free();
39
+ }
40
+ catch (error) {
41
+ }
42
+ finally {
43
+ this.encoder = null;
44
+ }
45
+ }
46
+ }
47
+ }
48
+ exports.GptTokenizerStrategy = GptTokenizerStrategy;
49
+ //# sourceMappingURL=GptTokenizerStrategy.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"GptTokenizerStrategy.js","sourceRoot":"","sources":["../../src/strategies/GptTokenizerStrategy.ts"],"names":[],"mappings":";;;AAGA,MAAa,oBAAoB;IACzB,OAAO,GAAoB,IAAI,CAAC;IACvB,SAAS,CAAS;IAClB,YAAY,CAAS;IACrB,YAAY,CAAmB;IAKhD,YACI,YAAoB,QAAQ,EAC5B,eAAuB,MAAM,EAC7B,eAAiC,YAAY;QAE7C,IAAI,CAAC,SAAS,GAAG,SAAS,CAAC;QAC3B,IAAI,CAAC,YAAY,GAAG,YAAY,CAAC;QACjC,IAAI,CAAC,YAAY,GAAG,YAAY,CAAC;IACrC,CAAC;IAED,YAAY;QACR,OAAO,IAAI,CAAC,SAAS,CAAC;IAC1B,CAAC;IAED,eAAe;QACX,OAAO,IAAI,CAAC,YAAY,CAAC;IAC7B,CAAC;IAED,KAAK,CAAC,UAAU;QAEZ,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC;YAChB,MAAM,EAAE,YAAY,EAAE,GAAG,MAAM,MAAM,CAAC,UAAU,CAAC,CAAC;YAClD,IAAI,CAAC,OAAO,GAAG,YAAY,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;QACnD,CAAC;IACL,CAAC;IAED,uBAAuB,CAAC,KAAa;QAEjC,OAAO,IAAI,CAAC,IAAI,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC;IAChC,CAAC;IAED,gBAAgB,CAAC,IAAY;QACzB,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC;YAChB,MAAM,IAAI,KAAK,CAAC,IAAI,IAAI,CAAC,SAAS,wEAAwE,CAAC,CAAC;QAChH,CAAC;QACD,OAAO,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC;IAC5C,CAAC;IAED,OAAO;QACH,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;YACf,IAAI,CAAC;gBACL,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC;YACxB,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;YAEjB,CAAC;oBAAS,CAAC;gBACP,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC;YACxB,CAAC;QACD,CAAC;IACL,CAAC;CACA;AA1DD,oDA0DC"}
@@ -0,0 +1,32 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.HeuristicTokenizerStrategy = void 0;
4
+ class HeuristicTokenizerStrategy {
5
+ modelName;
6
+ contextLimit;
7
+ bytesPerToken;
8
+ constructor(modelName = 'deepseek-coder', contextLimit = 128000, bytesPerToken = 3.5) {
9
+ this.modelName = modelName;
10
+ this.contextLimit = contextLimit;
11
+ this.bytesPerToken = bytesPerToken;
12
+ }
13
+ getModelName() {
14
+ return this.modelName;
15
+ }
16
+ getContextLimit() {
17
+ return this.contextLimit;
18
+ }
19
+ async initialize() {
20
+ return Promise.resolve();
21
+ }
22
+ estimateTokensFromBytes(bytes) {
23
+ return Math.ceil(bytes / this.bytesPerToken);
24
+ }
25
+ countTokensExact(text) {
26
+ return Math.ceil(text.length / this.bytesPerToken);
27
+ }
28
+ destroy() {
29
+ }
30
+ }
31
+ exports.HeuristicTokenizerStrategy = HeuristicTokenizerStrategy;
32
+ //# sourceMappingURL=HeuristicTokenizerStrategy.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"HeuristicTokenizerStrategy.js","sourceRoot":"","sources":["../../src/strategies/HeuristicTokenizerStrategy.ts"],"names":[],"mappings":";;;AAEA,MAAa,0BAA0B;IAClB,SAAS,CAAS;IAClB,YAAY,CAAS;IACrB,aAAa,CAAS;IAK3C,YACI,YAAoB,gBAAgB,EACpC,eAAuB,MAAM,EAC7B,gBAAwB,GAAG;QAE3B,IAAI,CAAC,SAAS,GAAG,SAAS,CAAC;QAC3B,IAAI,CAAC,YAAY,GAAG,YAAY,CAAC;QACjC,IAAI,CAAC,aAAa,GAAG,aAAa,CAAC;IACvC,CAAC;IAED,YAAY;QACR,OAAO,IAAI,CAAC,SAAS,CAAC;IAC1B,CAAC;IAED,eAAe;QACX,OAAO,IAAI,CAAC,YAAY,CAAC;IAC7B,CAAC;IAED,KAAK,CAAC,UAAU;QAEZ,OAAO,OAAO,CAAC,OAAO,EAAE,CAAC;IAC7B,CAAC;IAED,uBAAuB,CAAC,KAAa;QACjC,OAAO,IAAI,CAAC,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,aAAa,CAAC,CAAC;IACjD,CAAC;IAED,gBAAgB,CAAC,IAAY;QAGzB,OAAO,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,aAAa,CAAC,CAAC;IACvD,CAAC;IAED,OAAO;IAEH,CAAC;CACJ;AA5CD,gEA4CC"}
@@ -0,0 +1,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=Tokenizer.interface.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Tokenizer.interface.js","sourceRoot":"","sources":["../../src/strategies/Tokenizer.interface.ts"],"names":[],"mappings":""}
@@ -0,0 +1,34 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.XmlWriter = void 0;
4
+ const promises_1 = require("node:stream/promises");
5
+ class XmlWriter {
6
+ outputStream;
7
+ initialize(outputStream) {
8
+ this.outputStream = outputStream;
9
+ }
10
+ async writeHeader(treeMap) {
11
+ this.ensureInitialized();
12
+ this.outputStream.write('<repository>\n\n');
13
+ this.outputStream.write('<directory_tree>\n');
14
+ this.outputStream.write(treeMap);
15
+ this.outputStream.write('\n</directory_tree>\n\n');
16
+ }
17
+ async writeFileBlock(filePath, transformedStream) {
18
+ this.ensureInitialized();
19
+ this.outputStream.write(`<file path="${filePath}">\n`);
20
+ await (0, promises_1.pipeline)(transformedStream, this.outputStream, { end: false });
21
+ this.outputStream.write('\n</file>\n\n');
22
+ }
23
+ async finalize() {
24
+ this.ensureInitialized();
25
+ this.outputStream.write('</repository>\n');
26
+ }
27
+ ensureInitialized() {
28
+ if (!this.outputStream) {
29
+ throw new Error("[XmlWriter] No ha sido inicializado. Llama a initialize() con un Writable Stream válido.");
30
+ }
31
+ }
32
+ }
33
+ exports.XmlWriter = XmlWriter;
34
+ //# sourceMappingURL=XmlWriter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"XmlWriter.js","sourceRoot":"","sources":["../../src/strategies/XmlWriter.ts"],"names":[],"mappings":";;;AACA,mDAAgD;AAGhD,MAAa,SAAS;IACd,YAAY,CAAY;IAEhC,UAAU,CAAC,YAAsB;QAC7B,IAAI,CAAC,YAAY,GAAG,YAAY,CAAC;IACrC,CAAC;IAED,KAAK,CAAC,WAAW,CAAC,OAAe;QAC7B,IAAI,CAAC,iBAAiB,EAAE,CAAC;QAGzB,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC,kBAAkB,CAAC,CAAC;QAG5C,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC,oBAAoB,CAAC,CAAC;QAC9C,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;QACjC,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC,yBAAyB,CAAC,CAAC;IACvD,CAAC;IAED,KAAK,CAAC,cAAc,CAAC,QAAgB,EAAE,iBAA2B;QAC9D,IAAI,CAAC,iBAAiB,EAAE,CAAC;QAGzB,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC,eAAe,QAAQ,MAAM,CAAC,CAAC;QAQvD,MAAM,IAAA,mBAAQ,EAAC,iBAAiB,EAAE,IAAI,CAAC,YAAY,EAAE,EAAE,GAAG,EAAE,KAAK,EAAE,CAAC,CAAC;QAGrE,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC,eAAe,CAAC,CAAC;IAC7C,CAAC;IAED,KAAK,CAAC,QAAQ;QACV,IAAI,CAAC,iBAAiB,EAAE,CAAC;QAGzB,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC,iBAAiB,CAAC,CAAC;IAC/C,CAAC;IAKO,iBAAiB;QACrB,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE,CAAC;YACrB,MAAM,IAAI,KAAK,CAAC,0FAA0F,CAAC,CAAC;QAChH,CAAC;IACL,CAAC;CACA;AApDD,8BAoDC"}
@@ -0,0 +1,53 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.theme = void 0;
7
+ const node_process_1 = __importDefault(require("node:process"));
8
+ const picocolors_1 = __importDefault(require("picocolors"));
9
+ exports.theme = {
10
+ color: {
11
+ primary: (text) => picocolors_1.default.cyan(text),
12
+ success: (text) => picocolors_1.default.green(text),
13
+ error: (text) => picocolors_1.default.red(text),
14
+ warn: (text) => picocolors_1.default.yellow(text),
15
+ info: (text) => picocolors_1.default.blue(text),
16
+ muted: (text) => picocolors_1.default.dim(text),
17
+ highlight: (text) => picocolors_1.default.bold(picocolors_1.default.magenta(text)),
18
+ bold: (text) => picocolors_1.default.bold(text),
19
+ },
20
+ icon: {
21
+ info: picocolors_1.default.blue('ℹ'),
22
+ success: picocolors_1.default.green('✔'),
23
+ warn: picocolors_1.default.yellow('⚠'),
24
+ error: picocolors_1.default.red('✖'),
25
+ arrow: picocolors_1.default.cyan('❯'),
26
+ bullet: picocolors_1.default.dim('•'),
27
+ },
28
+ printBanner() {
29
+ node_process_1.default.stdout.write('\n');
30
+ node_process_1.default.stdout.write(picocolors_1.default.cyan(picocolors_1.default.bold(' ╔══════════════════════════════════════════════════╗\n')));
31
+ node_process_1.default.stdout.write(picocolors_1.default.cyan(picocolors_1.default.bold(' ║ CONTEXT PACKER IA ║\n')));
32
+ node_process_1.default.stdout.write(picocolors_1.default.cyan(picocolors_1.default.bold(' ║ - Grado de Ingeniería Enterprise - ║\n')));
33
+ node_process_1.default.stdout.write(picocolors_1.default.cyan(picocolors_1.default.bold(' ╚══════════════════════════════════════════════════╝\n')));
34
+ node_process_1.default.stdout.write(` ${picocolors_1.default.dim('Preparando el entorno local con huella de memoria O(1)...')}\n\n`);
35
+ },
36
+ formatMetrics(metrics) {
37
+ const sizeInMb = (metrics.totalBytesProcessed / (1024 * 1024)).toFixed(2);
38
+ const timeInSec = (metrics.executionTimeMs / 1000).toFixed(2);
39
+ const formattedTokens = metrics.totalTokensCounted.toLocaleString('es-CL');
40
+ return `
41
+ ${picocolors_1.default.bold(picocolors_1.default.green('╔══════════════════════════════════════════════════════════╗'))}
42
+ ${picocolors_1.default.bold(picocolors_1.default.green('║ PROCESO COMPLETADO CON ÉXITO ║'))}
43
+ ${picocolors_1.default.bold(picocolors_1.default.green('╚══════════════════════════════════════════════════════════╝'))}
44
+ ${picocolors_1.default.cyan('❯')} ${picocolors_1.default.bold('Archivos empaquetados :')} ${picocolors_1.default.white(metrics.totalFilesProcessed.toString())}
45
+ ${picocolors_1.default.cyan('❯')} ${picocolors_1.default.bold('Tamaño total del lote :')} ${picocolors_1.default.white(sizeInMb)} MB
46
+ ${picocolors_1.default.cyan('❯')} ${picocolors_1.default.bold('Consumo de Tokens IA :')} ${picocolors_1.default.bold(picocolors_1.default.magenta(formattedTokens))}
47
+ ${picocolors_1.default.cyan('❯')} ${picocolors_1.default.bold('Tiempo de compilación :')} ${picocolors_1.default.yellow(timeInSec)} segundos
48
+ ${picocolors_1.default.dim('──────────────────────────────────────────────────────────')}
49
+ ${picocolors_1.default.green('✔')} Archivo de salida consolidado en: ${picocolors_1.default.bold(picocolors_1.default.underline('contexto-ia.txt'))}
50
+ `;
51
+ }
52
+ };
53
+ //# sourceMappingURL=theme.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"theme.js","sourceRoot":"","sources":["../../src/ui/theme.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,58 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.ProcessCancellationToken = exports.CancellationError = void 0;
7
+ const node_process_1 = __importDefault(require("node:process"));
8
+ class CancellationError extends Error {
9
+ constructor(message = "Proceso cancelado por el usuario.") {
10
+ super(message);
11
+ this.name = "CancellationError";
12
+ if (Error.captureStackTrace) {
13
+ Error.captureStackTrace(this, CancellationError);
14
+ }
15
+ }
16
+ }
17
+ exports.CancellationError = CancellationError;
18
+ class ProcessCancellationToken {
19
+ cancelled = false;
20
+ cancelCount = 0;
21
+ abortController;
22
+ constructor() {
23
+ this.abortController = new AbortController();
24
+ this.registerSignalHandlers();
25
+ }
26
+ registerSignalHandlers() {
27
+ const handleSignal = () => {
28
+ this.cancelCount++;
29
+ if (this.cancelCount >= 2) {
30
+ node_process_1.default.stderr.write('\n[!] Salida forzada por el usuario. Abortando de inmediato.\n');
31
+ node_process_1.default.exit(1);
32
+ }
33
+ node_process_1.default.stdout.write('\n[!] Cancelando de forma segura... (Presiona CTRL+C otra vez para forzar salida)\n');
34
+ this.cancel();
35
+ };
36
+ node_process_1.default.on('SIGINT', handleSignal);
37
+ node_process_1.default.on('SIGTERM', handleSignal);
38
+ }
39
+ cancel() {
40
+ if (this.cancelled)
41
+ return;
42
+ this.cancelled = true;
43
+ this.abortController.abort(new CancellationError());
44
+ }
45
+ isCancelled() {
46
+ return this.cancelled;
47
+ }
48
+ throwIfCancelled() {
49
+ if (this.cancelled) {
50
+ throw new CancellationError();
51
+ }
52
+ }
53
+ getSignal() {
54
+ return this.abortController.signal;
55
+ }
56
+ }
57
+ exports.ProcessCancellationToken = ProcessCancellationToken;
58
+ //# sourceMappingURL=cancelToken.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cancelToken.js","sourceRoot":"","sources":["../../src/utils/cancelToken.ts"],"names":[],"mappings":";;;;;;AAAA,gEAAmC;AAInC,MAAa,iBAAkB,SAAQ,KAAK;IACxC,YAAY,OAAO,GAAG,mCAAmC;QACzD,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,mBAAmB,CAAC;QAChC,IAAI,KAAK,CAAC,iBAAiB,EAAE,CAAC;YAC1B,KAAK,CAAC,iBAAiB,CAAC,IAAI,EAAE,iBAAiB,CAAC,CAAC;QACrD,CAAC;IACL,CAAC;CACA;AARD,8CAQC;AAcD,MAAa,wBAAwB;IACzB,SAAS,GAAY,KAAK,CAAC;IAC3B,WAAW,GAAW,CAAC,CAAC;IACf,eAAe,CAAkB;IAEtD;QACI,IAAI,CAAC,eAAe,GAAG,IAAI,eAAe,EAAE,CAAC;QAC7C,IAAI,CAAC,sBAAsB,EAAE,CAAC;IAClC,CAAC;IAEO,sBAAsB;QAC1B,MAAM,YAAY,GAAG,GAAS,EAAE;YAC5B,IAAI,CAAC,WAAW,EAAE,CAAC;YAGvB,IAAI,IAAI,CAAC,WAAW,IAAI,CAAC,EAAE,CAAC;gBACxB,sBAAO,CAAC,MAAM,CAAC,KAAK,CAAC,gEAAgE,CAAC,CAAC;gBACvF,sBAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YACpB,CAAC;YAEG,sBAAO,CAAC,MAAM,CAAC,KAAK,CAAC,qFAAqF,CAAC,CAAC;YAC5G,IAAI,CAAC,MAAM,EAAE,CAAC;QAClB,CAAC,CAAC;QAGF,sBAAO,CAAC,EAAE,CAAC,QAAQ,EAAE,YAAY,CAAC,CAAC;QACnC,sBAAO,CAAC,EAAE,CAAC,SAAS,EAAE,YAAY,CAAC,CAAC;IACxC,CAAC;IAEO,MAAM;QACV,IAAI,IAAI,CAAC,SAAS;YAAE,OAAO;QAE3B,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC;QAEtB,IAAI,CAAC,eAAe,CAAC,KAAK,CAAC,IAAI,iBAAiB,EAAE,CAAC,CAAC;IACxD,CAAC;IAEM,WAAW;QACd,OAAO,IAAI,CAAC,SAAS,CAAC;IAC1B,CAAC;IAEM,gBAAgB;QACnB,IAAI,IAAI,CAAC,SAAS,EAAE,CAAC;YACjB,MAAM,IAAI,iBAAiB,EAAE,CAAC;QAClC,CAAC;IACL,CAAC;IAKM,SAAS;QACZ,OAAO,IAAI,CAAC,eAAe,CAAC,MAAM,CAAC;IACvC,CAAC;CACA;AArDD,4DAqDC"}
package/package.json ADDED
@@ -0,0 +1,43 @@
1
+ {
2
+ "name": "@hxccoder/context-packer",
3
+ "version": "1.0.0",
4
+ "description": "CLI avanzado para empaquetar repositorios de código para LLMs",
5
+ "main": "dist/core/compiler.js",
6
+ "bin": {
7
+ "context-packer": "./dist/cli.js"
8
+ },
9
+ "engines": {
10
+ "node": ">=18.0.0"
11
+ },
12
+ "scripts": {
13
+ "build": "tsc",
14
+ "dev": "tsc --watch",
15
+ "start": "npm run build && node ./dist/cli.js",
16
+ "clean": "rm -rf dist"
17
+ },
18
+ "files": [
19
+ "dist"
20
+ ],
21
+ "keywords": [
22
+ "cli",
23
+ "llm",
24
+ "context",
25
+ "ai",
26
+ "gemini",
27
+ "gpt",
28
+ "claude"
29
+ ],
30
+ "author": "Benjamin Millalonco",
31
+ "license": "MIT",
32
+ "dependencies": {
33
+ "@inquirer/prompts": "^8.5.2",
34
+ "commander": "^12.0.0",
35
+ "ignore": "^5.3.1",
36
+ "picocolors": "^1.0.0",
37
+ "tiktoken": "^1.0.14"
38
+ },
39
+ "devDependencies": {
40
+ "@types/node": "^20.19.43",
41
+ "typescript": "^5.4.0"
42
+ }
43
+ }