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 +27 -17
- package/README.md +20 -10
- package/index.js +69 -28
- package/package.json +8 -4
- package/test/test.js +90 -0
- package/config/ignore.json +0 -53
package/CHANGELOG.md
CHANGED
|
@@ -1,35 +1,45 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
-
## [1.
|
|
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
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
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
|
-
|
|
17
|
-
|
|
18
|
-
|
|
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
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
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
|
-
|
|
34
|
-
|
|
35
|
-
|
|
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
|
|
86
|
-
| ---------------- | ----- |
|
|
87
|
-
| `--output` | `-o` | The name of the output file.
|
|
88
|
-
| `--dry-run` | `-d` | Preview files without creating the output file.
|
|
89
|
-
| `--include-ext` | `-i` | Comma-separated list of extensions to exclusively include.
|
|
90
|
-
| `--exclude` | `-e` | Comma-separated list of additional glob patterns to exclude.
|
|
91
|
-
| `--
|
|
92
|
-
| `--no-
|
|
93
|
-
| `--
|
|
94
|
-
| `--
|
|
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
|
|
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
|
|
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
|
|
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
|
-
|
|
54
|
-
|
|
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
|
-
|
|
58
|
-
|
|
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
|
-
|
|
69
|
-
|
|
70
|
-
|
|
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:
|
|
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((
|
|
166
|
-
const
|
|
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
|
-
.
|
|
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(
|
|
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
|
-
|
|
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(
|
|
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
|
|
205
|
-
const relativePath =
|
|
206
|
-
outputStream.write(
|
|
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(
|
|
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
|
+
"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
|
-
"
|
|
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.
|
|
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();
|
package/config/ignore.json
DELETED
|
@@ -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
|
-
]
|