combicode 1.3.0 โ†’ 1.5.1

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/CHANGELOG.md CHANGED
@@ -1,35 +1,45 @@
1
1
  # Changelog
2
2
 
3
- ## [1.3.0](https://github.com/aaurelions/combicode/compare/combicode-js-v1.2.1...combicode-js-v1.3.0) (2025-06-25)
3
+ ## [1.5.0](https://github.com/aaurelions/combicode/compare/combicode-js-v1.4.0...combicode-js-v1.5.0) (2025-11-30)
4
+
5
+ ### Features
4
6
 
7
+ - **tree:** display file sizes in the generated file tree (e.g., `[1.2KB]`)
8
+ - **output:** improve file header format (`### **FILE:**`) for better LLM parsing
9
+ - **tests:** add integration test suite using native Node.js modules
10
+
11
+ ## [1.4.0](https://github.com/aaurelions/combicode/compare/combicode-js-v1.3.0...combicode-js-v1.4.0) (2025-08-13)
5
12
 
6
13
  ### Features
7
14
 
8
- * Add package-lock.json for reproducible builds ([06a417a](https://github.com/aaurelions/combicode/commit/06a417a155e9b72e26d0e091d181cfb8c53f0d28))
9
- * **ci:** implement independent package versioning for monorepo ([d02cf23](https://github.com/aaurelions/combicode/commit/d02cf233239c7af8db19061f34b769178334b388))
10
- * improve CLI output and version reporting ([7963a10](https://github.com/aaurelions/combicode/commit/7963a10782c2626608750de53023d37d327d51b2))
11
- * improve CLI output and version reporting ([e74f6d8](https://github.com/aaurelions/combicode/commit/e74f6d8fbed4f9cdf8ad82f3dae87069f66f7bb6))
15
+ - Add --llms-txt flag for llms.txt documentation context ([0817554](https://github.com/aaurelions/combicode/commit/081755435594b0ca5208609b2724eb47bd73c2dc))
16
+
17
+ ## [1.3.0](https://github.com/aaurelions/combicode/compare/combicode-js-v1.2.1...combicode-js-v1.3.0) (2025-06-25)
18
+
19
+ ### Features
12
20
 
21
+ - Add package-lock.json for reproducible builds ([06a417a](https://github.com/aaurelions/combicode/commit/06a417a155e9b72e26d0e091d181cfb8c53f0d28))
22
+ - **ci:** implement independent package versioning for monorepo ([d02cf23](https://github.com/aaurelions/combicode/commit/d02cf233239c7af8db19061f34b769178334b388))
23
+ - improve CLI output and version reporting ([7963a10](https://github.com/aaurelions/combicode/commit/7963a10782c2626608750de53023d37d327d51b2))
24
+ - improve CLI output and version reporting ([e74f6d8](https://github.com/aaurelions/combicode/commit/e74f6d8fbed4f9cdf8ad82f3dae87069f66f7bb6))
13
25
 
14
26
  ### Bug Fixes
15
27
 
16
- * **ci:** permission error ([156b76d](https://github.com/aaurelions/combicode/commit/156b76d3ab1550123df2ded6b1da5d6e2e2cc008))
17
- * **npm:** Set public access for publishing and bump version to 1.0.1 ([6c91eb7](https://github.com/aaurelions/combicode/commit/6c91eb714c81ec0201bb0fcfad8ad9fb4124cd7e))
18
- * Use scoped npm package name and bump python version ([8a1b347](https://github.com/aaurelions/combicode/commit/8a1b347f6c54c9762acf354ef289c293d3ef21a3))
28
+ - **ci:** permission error ([156b76d](https://github.com/aaurelions/combicode/commit/156b76d3ab1550123df2ded6b1da5d6e2e2cc008))
29
+ - **npm:** Set public access for publishing and bump version to 1.0.1 ([6c91eb7](https://github.com/aaurelions/combicode/commit/6c91eb714c81ec0201bb0fcfad8ad9fb4124cd7e))
30
+ - Use scoped npm package name and bump python version ([8a1b347](https://github.com/aaurelions/combicode/commit/8a1b347f6c54c9762acf354ef289c293d3ef21a3))
19
31
 
20
32
  ## [1.2.0](https://github.com/aaurelions/combicode/compare/combicode-js-v1.1.0...combicode-js-v1.2.0) (2025-06-25)
21
33
 
22
-
23
34
  ### Features
24
35
 
25
- * Add package-lock.json for reproducible builds ([06a417a](https://github.com/aaurelions/combicode/commit/06a417a155e9b72e26d0e091d181cfb8c53f0d28))
26
- * **ci:** implement independent package versioning for monorepo ([d02cf23](https://github.com/aaurelions/combicode/commit/d02cf233239c7af8db19061f34b769178334b388))
27
- * improve CLI output and version reporting ([7963a10](https://github.com/aaurelions/combicode/commit/7963a10782c2626608750de53023d37d327d51b2))
28
- * improve CLI output and version reporting ([e74f6d8](https://github.com/aaurelions/combicode/commit/e74f6d8fbed4f9cdf8ad82f3dae87069f66f7bb6))
29
-
36
+ - Add package-lock.json for reproducible builds ([06a417a](https://github.com/aaurelions/combicode/commit/06a417a155e9b72e26d0e091d181cfb8c53f0d28))
37
+ - **ci:** implement independent package versioning for monorepo ([d02cf23](https://github.com/aaurelions/combicode/commit/d02cf233239c7af8db19061f34b769178334b388))
38
+ - improve CLI output and version reporting ([7963a10](https://github.com/aaurelions/combicode/commit/7963a10782c2626608750de53023d37d327d51b2))
39
+ - improve CLI output and version reporting ([e74f6d8](https://github.com/aaurelions/combicode/commit/e74f6d8fbed4f9cdf8ad82f3dae87069f66f7bb6))
30
40
 
31
41
  ### Bug Fixes
32
42
 
33
- * **ci:** permission error ([156b76d](https://github.com/aaurelions/combicode/commit/156b76d3ab1550123df2ded6b1da5d6e2e2cc008))
34
- * **npm:** Set public access for publishing and bump version to 1.0.1 ([6c91eb7](https://github.com/aaurelions/combicode/commit/6c91eb714c81ec0201bb0fcfad8ad9fb4124cd7e))
35
- * Use scoped npm package name and bump python version ([8a1b347](https://github.com/aaurelions/combicode/commit/8a1b347f6c54c9762acf354ef289c293d3ef21a3))
43
+ - **ci:** permission error ([156b76d](https://github.com/aaurelions/combicode/commit/156b76d3ab1550123df2ded6b1da5d6e2e2cc008))
44
+ - **npm:** Set public access for publishing and bump version to 1.0.1 ([6c91eb7](https://github.com/aaurelions/combicode/commit/6c91eb714c81ec0201bb0fcfad8ad9fb4124cd7e))
45
+ - Use scoped npm package name and bump python version ([8a1b347](https://github.com/aaurelions/combicode/commit/8a1b347f6c54c9762acf354ef289c293d3ef21a3))
package/README.md CHANGED
@@ -80,18 +80,28 @@ Use the `--exclude` or `-e` flag with comma-separated glob patterns.
80
80
  npx combicode -e "**/*_test.py,docs/**"
81
81
  ```
82
82
 
83
+ ### Generating Context for `llms.txt`
84
+
85
+ The `--llms.txt` or `-l` flag is designed for projects that use an [`llms.txt`](https://llmstxt.org/) file to specify important documentation. When this flag is used, Combicode inserts a specialized system prompt telling the LLM that the provided context is the project's definitive documentation for a specific version. This helps the LLM provide more accurate answers and avoid using deprecated functions.
86
+
87
+ ```bash
88
+ # Combine all markdown files for an llms.txt context
89
+ npx combicode -l -i .md -o llms.txt
90
+ ```
91
+
83
92
  ## All CLI Options
84
93
 
85
- | Option | Alias | Description | Default |
86
- | ---------------- | ----- | ------------------------------------------------------------ | --------------- |
87
- | `--output` | `-o` | The name of the output file. | `combicode.txt` |
88
- | `--dry-run` | `-d` | Preview files without creating the output file. | `false` |
89
- | `--include-ext` | `-i` | Comma-separated list of extensions to exclusively include. | (include all) |
90
- | `--exclude` | `-e` | Comma-separated list of additional glob patterns to exclude. | (none) |
91
- | `--no-gitignore` | | Do not use patterns from the project's `.gitignore` file. | `false` |
92
- | `--no-header` | | Omit the introductory prompt and file tree from the output. | `false` |
93
- | `--version` | `-v` | Show the version number. | |
94
- | `--help` | `-h` | Show the help message. | |
94
+ | Option | Alias | Description | Default |
95
+ | ---------------- | ----- | ------------------------------------------------------------------------------ | --------------- |
96
+ | `--output` | `-o` | The name of the output file. | `combicode.txt` |
97
+ | `--dry-run` | `-d` | Preview files without creating the output file. | `false` |
98
+ | `--include-ext` | `-i` | Comma-separated list of extensions to exclusively include. | (include all) |
99
+ | `--exclude` | `-e` | Comma-separated list of additional glob patterns to exclude. | (none) |
100
+ | `--llms-txt` | `-l` | Use a specialized system prompt for context generated from an `llms.txt` file. | `false` |
101
+ | `--no-gitignore` | | Do not use patterns from the project's `.gitignore` file. | `false` |
102
+ | `--no-header` | | Omit the introductory prompt and file tree from the output. | `false` |
103
+ | `--version` | `-v` | Show the version number. | |
104
+ | `--help` | `-h` | Show the help message. | |
95
105
 
96
106
  ## License
97
107
 
package/index.js CHANGED
@@ -8,15 +8,22 @@ const glob = require("fast-glob");
8
8
 
9
9
  const { version } = require("./package.json");
10
10
 
11
- const SYSTEM_PROMPT = `You are an expert software architect. The user is providing you with the complete source code for a project, contained in a single file. Your task is to meticulously analyze the provided codebase to gain a comprehensive understanding of its structure, functionality, dependencies, and overall architecture.
11
+ const DEFAULT_SYSTEM_PROMPT = `You are an expert software architect. The user is providing you with the complete source code for a project, contained in a single file. Your task is to meticulously analyze the provided codebase to gain a comprehensive understanding of its structure, functionality, dependencies, and overall architecture.
12
12
 
13
- A file tree is provided below to give you a high-level overview. The subsequent sections contain the full content of each file, clearly marked with "// FILE: <path>".
13
+ A file tree is provided below to give you a high-level overview. The subsequent sections contain the full content of each file, clearly marked with a file header.
14
14
 
15
15
  Your instructions are:
16
16
  1. **Analyze Thoroughly:** Read through every file to understand its purpose and how it interacts with other files.
17
17
  2. **Identify Key Components:** Pay close attention to configuration files (like package.json, pyproject.toml), entry points (like index.js, main.py), and core logic.
18
18
  `;
19
19
 
20
+ const LLMS_TXT_SYSTEM_PROMPT = `You are an expert software architect. The user is providing you with the full documentation for a project, sourced from the project's 'llms.txt' file. This file contains the complete context needed to understand the project's features, APIs, and usage for a specific version. Your task is to act as a definitive source of truth based *only* on this provided documentation.
21
+
22
+ When answering questions or writing code, adhere strictly to the functions, variables, and methods described in this context. Do not use or suggest any deprecated or older functionalities that are not present here.
23
+
24
+ A file tree of the documentation source is provided below for a high-level overview. The subsequent sections contain the full content of each file, clearly marked with a file header.
25
+ `;
26
+
20
27
  function loadDefaultIgnorePatterns() {
21
28
  const configPath = path.resolve(__dirname, "config", "ignore.json");
22
29
  try {
@@ -46,18 +53,33 @@ function isLikelyBinary(file) {
46
53
  }
47
54
  }
48
55
 
49
- function generateFileTree(files, root) {
56
+ function formatBytes(bytes, decimals = 1) {
57
+ if (bytes === 0) return "0 B";
58
+ const k = 1024;
59
+ const dm = decimals < 0 ? 0 : decimals;
60
+ const sizes = ["B", "KB", "MB", "GB", "TB"];
61
+ const i = Math.floor(Math.log(bytes) / Math.log(k));
62
+ return parseFloat((bytes / Math.pow(k, i)).toFixed(dm)) + "" + sizes[i];
63
+ }
64
+
65
+ function generateFileTree(filesWithSize, root) {
50
66
  let tree = `${path.basename(root)}/\n`;
51
67
  const structure = {};
52
68
 
53
- files.forEach((file) => {
54
- const parts = file.split(path.sep);
69
+ // Build the structure
70
+ filesWithSize.forEach(({ relativePath, formattedSize }) => {
71
+ const parts = relativePath.split(path.sep);
55
72
  let currentLevel = structure;
56
- parts.forEach((part) => {
57
- if (!currentLevel[part]) {
58
- currentLevel[part] = {};
73
+ parts.forEach((part, index) => {
74
+ const isFile = index === parts.length - 1;
75
+ if (isFile) {
76
+ currentLevel[part] = formattedSize;
77
+ } else {
78
+ if (!currentLevel[part]) {
79
+ currentLevel[part] = {};
80
+ }
81
+ currentLevel = currentLevel[part];
59
82
  }
60
- currentLevel = currentLevel[part];
61
83
  });
62
84
  });
63
85
 
@@ -65,9 +87,16 @@ function generateFileTree(files, root) {
65
87
  const entries = Object.keys(level);
66
88
  entries.forEach((entry, index) => {
67
89
  const isLast = index === entries.length - 1;
68
- tree += `${prefix}${isLast ? "โ””โ”€โ”€ " : "โ”œโ”€โ”€ "}${entry}\n`;
69
- if (Object.keys(level[entry]).length > 0) {
70
- buildTree(level[entry], `${prefix}${isLast ? " " : "โ”‚ "}`);
90
+ const value = level[entry];
91
+ const isFile = typeof value === "string";
92
+
93
+ const connector = isLast ? "โ””โ”€โ”€ " : "โ”œโ”€โ”€ ";
94
+
95
+ if (isFile) {
96
+ tree += `${prefix}${connector}[${value}] ${entry}\n`;
97
+ } else {
98
+ tree += `${prefix}${connector}${entry}\n`;
99
+ buildTree(value, `${prefix}${isLast ? " " : "โ”‚ "}`);
71
100
  }
72
101
  });
73
102
  };
@@ -83,6 +112,7 @@ async function main() {
83
112
  process.exit(0);
84
113
  }
85
114
 
115
+ // Yargs singleton usage works correctly with arguments passed here
86
116
  const argv = yargs(rawArgv)
87
117
  .scriptName("combicode")
88
118
  .usage("$0 [options]")
@@ -108,6 +138,12 @@ async function main() {
108
138
  describe: "Comma-separated glob patterns to exclude",
109
139
  type: "string",
110
140
  })
141
+ .option("l", {
142
+ alias: "llms-txt",
143
+ describe: "Use the system prompt for llms.txt context",
144
+ type: "boolean",
145
+ default: false,
146
+ })
111
147
  .option("no-gitignore", {
112
148
  describe: "Ignore the project's .gitignore file",
113
149
  type: "boolean",
@@ -150,7 +186,7 @@ async function main() {
150
186
  dot: true,
151
187
  ignore: ignorePatterns,
152
188
  absolute: true,
153
- stats: false,
189
+ stats: true,
154
190
  });
155
191
 
156
192
  const allowedExtensions = argv.includeExt
@@ -162,28 +198,30 @@ async function main() {
162
198
  : null;
163
199
 
164
200
  const includedFiles = allFiles
165
- .filter((file) => {
166
- const stats = fs.statSync(file, { throwIfNoEntry: false });
167
- if (!stats || stats.isDirectory()) return false;
201
+ .filter((fileObj) => {
202
+ const file = fileObj.path;
203
+ if (!fileObj.stats || fileObj.stats.isDirectory()) return false;
168
204
  if (isLikelyBinary(file)) return false;
169
205
  if (allowedExtensions && !allowedExtensions.has(path.extname(file)))
170
206
  return false;
171
207
  return true;
172
208
  })
173
- .sort();
209
+ .map((fileObj) => ({
210
+ path: fileObj.path,
211
+ relativePath: path.relative(projectRoot, fileObj.path),
212
+ size: fileObj.stats.size,
213
+ formattedSize: formatBytes(fileObj.stats.size),
214
+ }))
215
+ .sort((a, b) => a.path.localeCompare(b.path));
174
216
 
175
217
  if (includedFiles.length === 0) {
176
218
  console.error("โŒ No files to include. Check your path or filters.");
177
219
  process.exit(1);
178
220
  }
179
221
 
180
- const relativeFiles = includedFiles.map((file) =>
181
- path.relative(projectRoot, file)
182
- );
183
-
184
222
  if (argv.dryRun) {
185
223
  console.log("\n๐Ÿ“‹ Files to be included (Dry Run):\n");
186
- const tree = generateFileTree(relativeFiles, projectRoot);
224
+ const tree = generateFileTree(includedFiles, projectRoot);
187
225
  console.log(tree);
188
226
  console.log(`\nTotal: ${includedFiles.length} files.`);
189
227
  return;
@@ -192,21 +230,24 @@ async function main() {
192
230
  const outputStream = fs.createWriteStream(argv.output);
193
231
 
194
232
  if (!argv.noHeader) {
195
- outputStream.write(SYSTEM_PROMPT + "\n");
233
+ const systemPrompt = argv.llmsTxt
234
+ ? LLMS_TXT_SYSTEM_PROMPT
235
+ : DEFAULT_SYSTEM_PROMPT;
236
+ outputStream.write(systemPrompt + "\n");
196
237
  outputStream.write("## Project File Tree\n\n");
197
238
  outputStream.write("```\n");
198
- const tree = generateFileTree(relativeFiles, projectRoot);
239
+ const tree = generateFileTree(includedFiles, projectRoot);
199
240
  outputStream.write(tree);
200
241
  outputStream.write("```\n\n");
201
242
  outputStream.write("---\n\n");
202
243
  }
203
244
 
204
- for (const file of includedFiles) {
205
- const relativePath = path.relative(projectRoot, file).replace(/\\/g, "/");
206
- outputStream.write(`// FILE: ${relativePath}` + "\n");
245
+ for (const fileObj of includedFiles) {
246
+ const relativePath = fileObj.relativePath.replace(/\\/g, "/");
247
+ outputStream.write(`### **FILE:** \`${relativePath}\`\n`);
207
248
  outputStream.write("```\n");
208
249
  try {
209
- const content = fs.readFileSync(file, "utf8");
250
+ const content = fs.readFileSync(fileObj.path, "utf8");
210
251
  outputStream.write(content);
211
252
  } catch (e) {
212
253
  outputStream.write(`... (error reading file: ${e.message}) ...`);
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "combicode",
3
- "version": "1.3.0",
3
+ "version": "1.5.1",
4
4
  "description": "A CLI tool to combine a project's codebase into a single file for LLM context.",
5
5
  "main": "index.js",
6
6
  "bin": {
@@ -10,7 +10,8 @@
10
10
  "access": "public"
11
11
  },
12
12
  "scripts": {
13
- "test": "echo \"Error: no test specified\" && exit 1"
13
+ "pretest": "mkdir -p config && cp ../configs/ignore.json config/ignore.json",
14
+ "test": "node test/test.js"
14
15
  },
15
16
  "repository": {
16
17
  "type": "git",
@@ -24,12 +25,15 @@
24
25
  "prompt",
25
26
  "developer-tool",
26
27
  "codegen",
27
- "chatgpt"
28
+ "chatgpt",
29
+ "llms.txt",
30
+ "llms",
31
+ "llms-full.txt"
28
32
  ],
29
33
  "author": "A. Aurelions",
30
34
  "license": "MIT",
31
35
  "dependencies": {
32
- "fast-glob": "^3.3.1",
36
+ "fast-glob": "^3.3.3",
33
37
  "yargs": "^17.7.2"
34
38
  }
35
39
  }
package/test/test.js ADDED
@@ -0,0 +1,90 @@
1
+ const fs = require("fs");
2
+ const path = require("path");
3
+ const { execSync } = require("child_process");
4
+ const assert = require("assert");
5
+
6
+ const CLI_PATH = path.resolve(__dirname, "../index.js");
7
+ const TEST_DIR = path.resolve(__dirname, "temp_env");
8
+ const OUTPUT_FILE = path.join(TEST_DIR, "combicode.txt");
9
+
10
+ // Setup: Create a temp directory with dummy files
11
+ function setup() {
12
+ if (fs.existsSync(TEST_DIR)) {
13
+ fs.rmSync(TEST_DIR, { recursive: true, force: true });
14
+ }
15
+ fs.mkdirSync(TEST_DIR);
16
+
17
+ // Create a dummy JS file
18
+ fs.writeFileSync(path.join(TEST_DIR, "alpha.js"), "console.log('alpha');");
19
+
20
+ // Create a dummy text file in a subdir
21
+ const subDir = path.join(TEST_DIR, "subdir");
22
+ fs.mkdirSync(subDir);
23
+ fs.writeFileSync(path.join(subDir, "beta.txt"), "Hello World");
24
+ }
25
+
26
+ // Teardown: Cleanup temp directory
27
+ function teardown() {
28
+ if (fs.existsSync(TEST_DIR)) {
29
+ fs.rmSync(TEST_DIR, { recursive: true, force: true });
30
+ }
31
+ }
32
+
33
+ function runTest() {
34
+ console.log("๐Ÿงช Starting Node.js Integration Tests...");
35
+
36
+ try {
37
+ setup();
38
+
39
+ // 1. Test Version Flag
40
+ console.log(" Checking --version...");
41
+ const versionOutput = execSync(`node ${CLI_PATH} --version`).toString();
42
+ assert.match(versionOutput, /Combicode \(JavaScript\), version/);
43
+
44
+ // 2. Test Dry Run
45
+ console.log(" Checking --dry-run...");
46
+ const dryRunOutput = execSync(`node ${CLI_PATH} --dry-run`, {
47
+ cwd: TEST_DIR,
48
+ }).toString();
49
+ assert.match(dryRunOutput, /Files to be included \(Dry Run\)/);
50
+ // Check for file size format in tree (e.g., [21B])
51
+ assert.match(dryRunOutput, /\[\d+(\.\d+)?[KM]?B\]/);
52
+
53
+ // 3. Test Actual Generation
54
+ console.log(" Checking file generation...");
55
+ execSync(`node ${CLI_PATH} --output combicode.txt`, { cwd: TEST_DIR });
56
+
57
+ assert.ok(fs.existsSync(OUTPUT_FILE), "Output file should exist");
58
+
59
+ const content = fs.readFileSync(OUTPUT_FILE, "utf8");
60
+
61
+ // Check for System Prompt
62
+ assert.ok(
63
+ content.includes("You are an expert software architect"),
64
+ "System prompt missing"
65
+ );
66
+
67
+ // Check for Tree structure
68
+ assert.ok(content.includes("subdir"), "Tree should show subdirectory");
69
+
70
+ // Check for new Header format
71
+ assert.ok(
72
+ content.includes("### **FILE:** `alpha.js`"),
73
+ "New header format missing for alpha.js"
74
+ );
75
+ assert.ok(
76
+ content.includes("### **FILE:** `subdir/beta.txt`"),
77
+ "New header format missing for beta.txt"
78
+ );
79
+
80
+ console.log("โœ… All Node.js tests passed!");
81
+ } catch (error) {
82
+ console.error("โŒ Test Failed:", error.message);
83
+ if (error.stdout) console.log(error.stdout.toString());
84
+ process.exit(1);
85
+ } finally {
86
+ teardown();
87
+ }
88
+ }
89
+
90
+ runTest();
@@ -1,53 +0,0 @@
1
- [
2
- "**/node_modules/**",
3
- "**/.git/**",
4
- "**/.vscode/**",
5
- "**/.idea/**",
6
- "**/*.log",
7
- "**/.env",
8
- "**/*.lock",
9
- "**/.venv/**",
10
- "**/venv/**",
11
- "**/env/**",
12
- "**/__pycache__/**",
13
- "**/*.pyc",
14
- "**/*.egg-info/**",
15
- "**/build/**",
16
- "**/dist/**",
17
- "**/.pytest_cache/**",
18
- "**/.npm/**",
19
- "**/pnpm-lock.yaml",
20
- "**/package-lock.json",
21
- "**/.next/**",
22
- "**/.DS_Store",
23
- "**/Thumbs.db",
24
- "**/*.png",
25
- "**/*.jpg",
26
- "**/*.jpeg",
27
- "**/*.gif",
28
- "**/*.ico",
29
- "**/*.svg",
30
- "**/*.webp",
31
- "**/*.mp3",
32
- "**/*.wav",
33
- "**/*.flac",
34
- "**/*.mp4",
35
- "**/*.mov",
36
- "**/*.avi",
37
- "**/*.zip",
38
- "**/*.tar.gz",
39
- "**/*.rar",
40
- "**/*.pdf",
41
- "**/*.doc",
42
- "**/*.docx",
43
- "**/*.xls",
44
- "**/*.xlsx",
45
- "**/*.dll",
46
- "**/*.exe",
47
- "**/*.so",
48
- "**/*.a",
49
- "**/*.lib",
50
- "**/*.o",
51
- "**/*.bin",
52
- "**/*.iso"
53
- ]