get-llms 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/LICENSE +21 -0
- package/README.md +265 -0
- package/dist/bin/defaults.d.ts +3 -0
- package/dist/bin/defaults.d.ts.map +1 -0
- package/dist/bin/defaults.js +17 -0
- package/dist/bin/defaults.js.map +1 -0
- package/dist/bin/index.d.ts +2 -0
- package/dist/bin/index.d.ts.map +1 -0
- package/dist/bin/index.js +169 -0
- package/dist/bin/index.js.map +1 -0
- package/dist/bin/llmsFetcher.d.ts +18 -0
- package/dist/bin/llmsFetcher.d.ts.map +1 -0
- package/dist/bin/llmsFetcher.js +259 -0
- package/dist/bin/llmsFetcher.js.map +1 -0
- package/dist/bin/types/npmRegistryType.d.ts +103 -0
- package/dist/bin/types/npmRegistryType.d.ts.map +1 -0
- package/dist/bin/types/npmRegistryType.js +2 -0
- package/dist/bin/types/npmRegistryType.js.map +1 -0
- package/dist/bin/types/packageJsonType.d.ts +74 -0
- package/dist/bin/types/packageJsonType.d.ts.map +1 -0
- package/dist/bin/types/packageJsonType.js +2 -0
- package/dist/bin/types/packageJsonType.js.map +1 -0
- package/dist/bin/types/types.d.ts +21 -0
- package/dist/bin/types/types.d.ts.map +1 -0
- package/dist/bin/types/types.js +2 -0
- package/dist/bin/types/types.js.map +1 -0
- package/dist/bin/utils/cliHelpers.d.ts +11 -0
- package/dist/bin/utils/cliHelpers.d.ts.map +1 -0
- package/dist/bin/utils/cliHelpers.js +45 -0
- package/dist/bin/utils/cliHelpers.js.map +1 -0
- package/dist/bin/utils/logger.d.ts +19 -0
- package/dist/bin/utils/logger.d.ts.map +1 -0
- package/dist/bin/utils/logger.js +56 -0
- package/dist/bin/utils/logger.js.map +1 -0
- package/dist/bin/utils/utils.d.ts +13 -0
- package/dist/bin/utils/utils.d.ts.map +1 -0
- package/dist/bin/utils/utils.js +38 -0
- package/dist/bin/utils/utils.js.map +1 -0
- package/package.json +48 -0
- package/tsconfig.json +21 -0
- package/vitest.config.ts +17 -0
package/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 Balazs Hevesi
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
package/README.md
ADDED
|
@@ -0,0 +1,265 @@
|
|
|
1
|
+
# llms-fetcher
|
|
2
|
+
📚 CLI tool to fetch `llms.txt` files for your npm dependencies
|
|
3
|
+
|
|
4
|
+
## Usage
|
|
5
|
+
|
|
6
|
+
### Basic Usage
|
|
7
|
+
|
|
8
|
+
Fetch `llms.txt` files for all dependencies in your `package.json`:
|
|
9
|
+
|
|
10
|
+
```bash
|
|
11
|
+
llms-fetcher
|
|
12
|
+
```
|
|
13
|
+
|
|
14
|
+
### Fetch Specific Packages
|
|
15
|
+
|
|
16
|
+
You can fetch specific packages without needing a `package.json`:
|
|
17
|
+
|
|
18
|
+
```bash
|
|
19
|
+
llms-fetcher zod lodash react
|
|
20
|
+
```
|
|
21
|
+
|
|
22
|
+
## CLI Options
|
|
23
|
+
|
|
24
|
+
### Input Options
|
|
25
|
+
|
|
26
|
+
#### `--package, -p <path>`
|
|
27
|
+
Specify a custom path to `package.json` (default: `./package.json`)
|
|
28
|
+
|
|
29
|
+
```bash
|
|
30
|
+
llms-fetcher --package ./packages/core/package.json
|
|
31
|
+
```
|
|
32
|
+
|
|
33
|
+
#### `--deps <types>`
|
|
34
|
+
Filter which dependency types to include. Comma-separated list of:
|
|
35
|
+
- `prod` - dependencies
|
|
36
|
+
- `dev` - devDependencies
|
|
37
|
+
- `peer` - peerDependencies
|
|
38
|
+
- `optional` - optionalDependencies
|
|
39
|
+
- `all` - all dependencies (default)
|
|
40
|
+
|
|
41
|
+
```bash
|
|
42
|
+
llms-fetcher --deps prod,dev # Only production and dev dependencies
|
|
43
|
+
llms-fetcher --deps prod # Only production dependencies
|
|
44
|
+
```
|
|
45
|
+
|
|
46
|
+
#### Positional Arguments
|
|
47
|
+
Specify packages directly to fetch:
|
|
48
|
+
|
|
49
|
+
```bash
|
|
50
|
+
llms-fetcher react @types/react
|
|
51
|
+
```
|
|
52
|
+
|
|
53
|
+
### Output Options
|
|
54
|
+
|
|
55
|
+
#### `--output, -o <dir>`
|
|
56
|
+
Custom output directory (default: `docs/llms`)
|
|
57
|
+
|
|
58
|
+
```bash
|
|
59
|
+
llms-fetcher --output ./context/dependencies
|
|
60
|
+
```
|
|
61
|
+
|
|
62
|
+
#### `--filename, -f <pattern>`
|
|
63
|
+
Filename pattern for output files. Use `{name}` as a placeholder for the package name (default: `{name}`)
|
|
64
|
+
|
|
65
|
+
```bash
|
|
66
|
+
llms-fetcher --filename "llms-{name}"
|
|
67
|
+
```
|
|
68
|
+
|
|
69
|
+
#### `--extension, -e <ext>`
|
|
70
|
+
File extension for output files (default: `txt`)
|
|
71
|
+
|
|
72
|
+
```bash
|
|
73
|
+
llms-fetcher --extension md
|
|
74
|
+
```
|
|
75
|
+
|
|
76
|
+
### Behavior Options
|
|
77
|
+
|
|
78
|
+
#### `--dry-run`
|
|
79
|
+
Preview what would be done without writing any files
|
|
80
|
+
|
|
81
|
+
```bash
|
|
82
|
+
llms-fetcher --dry-run
|
|
83
|
+
```
|
|
84
|
+
|
|
85
|
+
#### `--fallback <strategy>`
|
|
86
|
+
Strategy when `llms.txt` is not found:
|
|
87
|
+
- `none` (default) - Skip packages without `llms.txt`
|
|
88
|
+
- `readme` - Fall back to README.md from GitHub
|
|
89
|
+
- `empty` - Create an empty file with a placeholder message
|
|
90
|
+
- `skip` - Same as `none`
|
|
91
|
+
|
|
92
|
+
```bash
|
|
93
|
+
llms-fetcher --fallback readme # Use README.md as fallback
|
|
94
|
+
llms-fetcher --fallback empty # Create empty files
|
|
95
|
+
```
|
|
96
|
+
|
|
97
|
+
##### Fallback Examples
|
|
98
|
+
|
|
99
|
+
**With readme fallback:**
|
|
100
|
+
```bash
|
|
101
|
+
llms-fetcher --fallback readme
|
|
102
|
+
```
|
|
103
|
+
|
|
104
|
+
Results in:
|
|
105
|
+
```
|
|
106
|
+
✅ package-name: Using readme fallback -> package-name.txt
|
|
107
|
+
```
|
|
108
|
+
|
|
109
|
+
**With empty fallback:**
|
|
110
|
+
```bash
|
|
111
|
+
llms-fetcher --fallback empty
|
|
112
|
+
```
|
|
113
|
+
|
|
114
|
+
Creates files containing:
|
|
115
|
+
```
|
|
116
|
+
# package-name
|
|
117
|
+
|
|
118
|
+
No llms.txt found for this package.
|
|
119
|
+
```
|
|
120
|
+
|
|
121
|
+
### Verbosity Options
|
|
122
|
+
|
|
123
|
+
#### `--quiet, -q`
|
|
124
|
+
Only show errors (minimal output)
|
|
125
|
+
|
|
126
|
+
```bash
|
|
127
|
+
llms-fetcher --quiet
|
|
128
|
+
```
|
|
129
|
+
|
|
130
|
+
#### `--verbose, -v`
|
|
131
|
+
Show detailed output including:
|
|
132
|
+
- Network requests being made
|
|
133
|
+
- URLs being checked
|
|
134
|
+
- Debug information
|
|
135
|
+
|
|
136
|
+
```bash
|
|
137
|
+
llms-fetcher --verbose
|
|
138
|
+
```
|
|
139
|
+
|
|
140
|
+
**Note:** If both `-q` and `-v` are specified, the last one wins.
|
|
141
|
+
|
|
142
|
+
### Filename Sanitization Options
|
|
143
|
+
|
|
144
|
+
Customize how special characters in package names are sanitized:
|
|
145
|
+
|
|
146
|
+
#### `--space-replace <char>`
|
|
147
|
+
Character to replace spaces in filenames (default: `_`)
|
|
148
|
+
|
|
149
|
+
```bash
|
|
150
|
+
llms-fetcher --space-replace "_"
|
|
151
|
+
```
|
|
152
|
+
|
|
153
|
+
#### `--slash-replace <char>`
|
|
154
|
+
Character to replace slashes in filenames (default: `-`)
|
|
155
|
+
|
|
156
|
+
```bash
|
|
157
|
+
llms-fetcher --slash-replace "-"
|
|
158
|
+
```
|
|
159
|
+
|
|
160
|
+
#### `--at-replace <char>`
|
|
161
|
+
Character to replace `@` in scoped package names (default: empty string)
|
|
162
|
+
|
|
163
|
+
```bash
|
|
164
|
+
llms-fetcher --at-replace ""
|
|
165
|
+
```
|
|
166
|
+
|
|
167
|
+
**Example:** `@types/node` becomes `types-node.txt` with default settings
|
|
168
|
+
|
|
169
|
+
## Complete Examples
|
|
170
|
+
|
|
171
|
+
### Example 1: Fetch with readme fallback and save as markdown
|
|
172
|
+
```bash
|
|
173
|
+
llms-fetcher \
|
|
174
|
+
--fallback readme \
|
|
175
|
+
--extension md \
|
|
176
|
+
--output ./docs/handbook
|
|
177
|
+
```
|
|
178
|
+
|
|
179
|
+
### Example 2: Only production dependencies with custom naming
|
|
180
|
+
```bash
|
|
181
|
+
llms-fetcher \
|
|
182
|
+
--deps prod \
|
|
183
|
+
--filename "{name}-reference" \
|
|
184
|
+
--extension txt \
|
|
185
|
+
--output ./context/prod
|
|
186
|
+
```
|
|
187
|
+
|
|
188
|
+
### Example 3: Fetch specific packages with custom sanitization
|
|
189
|
+
```bash
|
|
190
|
+
llms-fetcher @types/node @types/react \
|
|
191
|
+
--space-replace "_" \
|
|
192
|
+
--slash-replace "_" \
|
|
193
|
+
--at-replace "at_"
|
|
194
|
+
```
|
|
195
|
+
|
|
196
|
+
This might create:
|
|
197
|
+
- `at_types_node.txt`
|
|
198
|
+
- `at_types_react.txt`
|
|
199
|
+
|
|
200
|
+
### Example 4: Verbose dry run with all dependencies
|
|
201
|
+
```bash
|
|
202
|
+
llms-fetcher \
|
|
203
|
+
--deps all \
|
|
204
|
+
--dry-run \
|
|
205
|
+
--verbose
|
|
206
|
+
```
|
|
207
|
+
|
|
208
|
+
### Example 5: Complex workflow - production deps with empty fallback
|
|
209
|
+
```bash
|
|
210
|
+
llms-fetcher \
|
|
211
|
+
--deps prod \
|
|
212
|
+
--fallback empty \
|
|
213
|
+
--output ./docs/llms-production \
|
|
214
|
+
--quiet
|
|
215
|
+
```
|
|
216
|
+
|
|
217
|
+
## Output Structure
|
|
218
|
+
|
|
219
|
+
By default, files are saved to:
|
|
220
|
+
```
|
|
221
|
+
docs/llms/
|
|
222
|
+
├── zod.txt
|
|
223
|
+
├── lodash.txt
|
|
224
|
+
└── [package-name].txt
|
|
225
|
+
```
|
|
226
|
+
|
|
227
|
+
With `--fallback readme`, successful files may include fallback indicators in the summary.
|
|
228
|
+
|
|
229
|
+
## How It Works
|
|
230
|
+
|
|
231
|
+
The tool searches for `llms.txt` files in this order:
|
|
232
|
+
|
|
233
|
+
1. Check the package's `package.json` for an `llms` or `llmsFull` field
|
|
234
|
+
2. Try standard URLs: `{homepage}/llms.txt` and `{homepage}/docs/llms.txt`
|
|
235
|
+
3. If GitHub repository, search README for links containing "docs"
|
|
236
|
+
4. Apply fallback strategy if specified
|
|
237
|
+
|
|
238
|
+
```mermaid
|
|
239
|
+
flowchart TD
|
|
240
|
+
A([package]) --> B{is there an 'llms'<br/>key in the<br/>'package.json'?}
|
|
241
|
+
|
|
242
|
+
B -- yes --> FOUND([we've found it])
|
|
243
|
+
B -- no --> C{is the package<br/>homepage a<br/>github link?}
|
|
244
|
+
|
|
245
|
+
C -- yes --> D{does the github<br/>'readme.txt' mention<br/>the word 'docs' in a<br/>hyperlink?}
|
|
246
|
+
C -- no --> E{does 'link/llms.txt'<br/>return a txt file?}
|
|
247
|
+
|
|
248
|
+
D -- yes --> E
|
|
249
|
+
D -- no --> NOFILE([there likely isn't a<br/>'llms.txt'<br/>for that package<br/><br/>Either use the 'README.txt',<br/>or use an external service<br/>like context7])
|
|
250
|
+
|
|
251
|
+
E -- yes --> FOUND
|
|
252
|
+
E -- no --> F{does 'link/docs/llms.txt'<br/>return a txt file?}
|
|
253
|
+
|
|
254
|
+
F -- yes --> FOUND
|
|
255
|
+
F -- no --> NOFILE
|
|
256
|
+
```
|
|
257
|
+
|
|
258
|
+
## Exit Codes
|
|
259
|
+
|
|
260
|
+
- `0` - Success
|
|
261
|
+
- `1` - Package.json not found or cannot be parsed
|
|
262
|
+
|
|
263
|
+
## Contributing
|
|
264
|
+
|
|
265
|
+
Issues and contributions welcome! Report bugs at: https://github.com/balazshevesi/llms-fetcher/issues
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"defaults.d.ts","sourceRoot":"","sources":["../../bin/defaults.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAE3C,eAAO,MAAM,eAAe,EAAE,UAe7B,CAAC"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
export const DEFAULT_OPTIONS = {
|
|
2
|
+
packagePath: "./package.json",
|
|
3
|
+
packages: [],
|
|
4
|
+
deps: ["all"],
|
|
5
|
+
output: "docs/llms",
|
|
6
|
+
filename: "{name}",
|
|
7
|
+
extension: "txt",
|
|
8
|
+
dryRun: false,
|
|
9
|
+
verbosity: "normal",
|
|
10
|
+
fallback: "none",
|
|
11
|
+
sanitizer: {
|
|
12
|
+
spaceReplacement: "_",
|
|
13
|
+
slashReplacement: "-",
|
|
14
|
+
atReplacement: "",
|
|
15
|
+
},
|
|
16
|
+
};
|
|
17
|
+
//# sourceMappingURL=defaults.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"defaults.js","sourceRoot":"","sources":["../../bin/defaults.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,MAAM,eAAe,GAAe;IACzC,WAAW,EAAE,gBAAgB;IAC7B,QAAQ,EAAE,EAAE;IACZ,IAAI,EAAE,CAAC,KAAK,CAAC;IACb,MAAM,EAAE,WAAW;IACnB,QAAQ,EAAE,QAAQ;IAClB,SAAS,EAAE,KAAK;IAChB,MAAM,EAAE,KAAK;IACb,SAAS,EAAE,QAAQ;IACnB,QAAQ,EAAE,MAAM;IAChB,SAAS,EAAE;QACT,gBAAgB,EAAE,GAAG;QACrB,gBAAgB,EAAE,GAAG;QACrB,aAAa,EAAE,EAAE;KAClB;CACF,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../bin/index.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,169 @@
|
|
|
1
|
+
import fs from "fs";
|
|
2
|
+
import path from "path";
|
|
3
|
+
import { Command } from "commander";
|
|
4
|
+
import { findLLMsTxt } from "./llmsFetcher";
|
|
5
|
+
import { generateFilename } from "./utils/utils";
|
|
6
|
+
import { logger } from "./utils/logger";
|
|
7
|
+
import { parseDeps, getDependencies } from "./utils/cliHelpers";
|
|
8
|
+
import { DEFAULT_OPTIONS } from "./defaults";
|
|
9
|
+
const currentDir = process.cwd();
|
|
10
|
+
const main = async (packages, options) => {
|
|
11
|
+
// Set verbosity first
|
|
12
|
+
logger.setVerbosity(options.verbosity);
|
|
13
|
+
logger.verbose("Running with options:", JSON.stringify(options, null, 2));
|
|
14
|
+
let packageNames = packages;
|
|
15
|
+
// If no direct packages provided, read from package.json
|
|
16
|
+
if (packageNames.length === 0) {
|
|
17
|
+
const packageJsonPath = path.isAbsolute(options.packagePath)
|
|
18
|
+
? options.packagePath
|
|
19
|
+
: path.join(currentDir, options.packagePath);
|
|
20
|
+
logger.verbose(`Looking for package.json at: ${packageJsonPath}`);
|
|
21
|
+
let packageJson;
|
|
22
|
+
try {
|
|
23
|
+
packageJson = JSON.parse(fs.readFileSync(packageJsonPath, "utf8"));
|
|
24
|
+
logger.info(`Found package.json at ${packageJsonPath}`);
|
|
25
|
+
}
|
|
26
|
+
catch (e) {
|
|
27
|
+
logger.error(`Could not find or parse package.json at ${packageJsonPath}`);
|
|
28
|
+
if (logger.isVerbose()) {
|
|
29
|
+
logger.error(e);
|
|
30
|
+
}
|
|
31
|
+
process.exit(1);
|
|
32
|
+
}
|
|
33
|
+
const dependencies = getDependencies(packageJson, options.deps);
|
|
34
|
+
packageNames = Object.keys(dependencies);
|
|
35
|
+
if (packageNames.length === 0) {
|
|
36
|
+
logger.info("No dependencies found matching the specified criteria");
|
|
37
|
+
return;
|
|
38
|
+
}
|
|
39
|
+
logger.verbose(`Found ${packageNames.length} dependencies: ${packageNames.join(", ")}`);
|
|
40
|
+
}
|
|
41
|
+
logger.info(`Processing ${packageNames.length} package(s)...`);
|
|
42
|
+
// Resolve output directory
|
|
43
|
+
const outputDir = path.isAbsolute(options.output)
|
|
44
|
+
? options.output
|
|
45
|
+
: path.join(currentDir, options.output);
|
|
46
|
+
logger.verbose(`Output directory: ${outputDir}`);
|
|
47
|
+
if (!options.dryRun)
|
|
48
|
+
fs.mkdirSync(outputDir, { recursive: true });
|
|
49
|
+
let successCount = 0;
|
|
50
|
+
let failCount = 0;
|
|
51
|
+
let fallbackCount = 0;
|
|
52
|
+
for (const packageName of packageNames) {
|
|
53
|
+
logger.verbose(`\nProcessing: ${packageName}`);
|
|
54
|
+
const llmsFile = await findLLMsTxt(packageName, {
|
|
55
|
+
fallback: options.fallback,
|
|
56
|
+
});
|
|
57
|
+
if (llmsFile) {
|
|
58
|
+
const filename = generateFilename(options.filename, packageName, options.extension, options.sanitizer);
|
|
59
|
+
const outputPath = path.join(outputDir, filename);
|
|
60
|
+
if (options.dryRun) {
|
|
61
|
+
if (llmsFile.isFallback) {
|
|
62
|
+
logger.info(`[DRY RUN] Would write ${packageName} (fallback: ${llmsFile.fallbackType}) to ${outputPath}`);
|
|
63
|
+
fallbackCount++;
|
|
64
|
+
}
|
|
65
|
+
else {
|
|
66
|
+
logger.info(`[DRY RUN] Would write ${packageName} to ${outputPath} (from ${llmsFile.location})`);
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
else {
|
|
70
|
+
fs.writeFileSync(outputPath, llmsFile.content);
|
|
71
|
+
if (llmsFile.isFallback) {
|
|
72
|
+
logger.success(`${packageName}: Using ${llmsFile.fallbackType} fallback -> ${filename}`);
|
|
73
|
+
fallbackCount++;
|
|
74
|
+
}
|
|
75
|
+
else {
|
|
76
|
+
logger.success(`${packageName}: Found llms.txt at ${llmsFile.location}`);
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
successCount++;
|
|
80
|
+
}
|
|
81
|
+
else {
|
|
82
|
+
logger.fail(`${packageName}: No llms.txt found`);
|
|
83
|
+
failCount++;
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
// Summary
|
|
87
|
+
logger.info("");
|
|
88
|
+
logger.info("--- Summary ---");
|
|
89
|
+
logger.info(`Total packages: ${packageNames.length}`);
|
|
90
|
+
logger.info(`Success: ${successCount}`);
|
|
91
|
+
if (fallbackCount > 0) {
|
|
92
|
+
logger.info(` (including ${fallbackCount} fallbacks)`);
|
|
93
|
+
}
|
|
94
|
+
logger.info(`Failed: ${failCount}`);
|
|
95
|
+
if (options.dryRun) {
|
|
96
|
+
logger.info("");
|
|
97
|
+
logger.info("(Dry run - no files were written)");
|
|
98
|
+
}
|
|
99
|
+
};
|
|
100
|
+
// CLI setup
|
|
101
|
+
const program = new Command();
|
|
102
|
+
program
|
|
103
|
+
.name("get-llms")
|
|
104
|
+
.description("Fetch llms.txt files for your npm dependencies")
|
|
105
|
+
.version("0.0.1")
|
|
106
|
+
.argument("[packages...]", "Package names to fetch (optional)")
|
|
107
|
+
.option("-p, --package <path>", "Path to package.json", DEFAULT_OPTIONS.packagePath)
|
|
108
|
+
.option("-o, --output <dir>", "Output directory", DEFAULT_OPTIONS.output)
|
|
109
|
+
.option("-f, --filename <pattern>", "Filename pattern (use {name} for package name)", DEFAULT_OPTIONS.filename)
|
|
110
|
+
.option("-e, --extension <ext>", "File extension", DEFAULT_OPTIONS.extension)
|
|
111
|
+
.option("-d, --deps <types>", "Dependency types to include (prod,dev,peer,optional,all)", "all")
|
|
112
|
+
.option("--dry-run", "Show what would be done without writing files", DEFAULT_OPTIONS.dryRun)
|
|
113
|
+
.option("-q, --quiet", "Only show errors", false)
|
|
114
|
+
.option("-v, --verbose", "Show detailed output", false)
|
|
115
|
+
.option("--fallback <strategy>", "Fallback strategy when llms.txt not found (none, readme, empty, skip)", DEFAULT_OPTIONS.fallback)
|
|
116
|
+
.option("--space-replace <char>", "Character to replace spaces in filenames", DEFAULT_OPTIONS.sanitizer.spaceReplacement)
|
|
117
|
+
.option("--slash-replace <char>", "Character to replace slashes in filenames", DEFAULT_OPTIONS.sanitizer.slashReplacement)
|
|
118
|
+
.option("--at-replace <char>", "Character to replace @ in scoped package names", DEFAULT_OPTIONS.sanitizer.atReplacement)
|
|
119
|
+
.action(async (packages, opts) => {
|
|
120
|
+
// Determine verbosity (last one wins)
|
|
121
|
+
let verbosity = "normal";
|
|
122
|
+
// Check raw argv to see which came last
|
|
123
|
+
const quietIndex = process.argv.findIndex((arg) => arg === "-q" || arg === "--quiet");
|
|
124
|
+
const verboseIndex = process.argv.findIndex((arg) => arg === "-v" || arg === "--verbose");
|
|
125
|
+
// Both specified, last one wins
|
|
126
|
+
if (opts.quiet && opts.verbose) {
|
|
127
|
+
if (quietIndex > verboseIndex)
|
|
128
|
+
verbosity = "quiet";
|
|
129
|
+
else
|
|
130
|
+
verbosity = "verbose";
|
|
131
|
+
}
|
|
132
|
+
else if (opts.quiet)
|
|
133
|
+
verbosity = "quiet";
|
|
134
|
+
else if (opts.verbose)
|
|
135
|
+
verbosity = "verbose";
|
|
136
|
+
// Validate fallback strategy
|
|
137
|
+
const validFallbacks = [
|
|
138
|
+
"none",
|
|
139
|
+
"readme",
|
|
140
|
+
"empty",
|
|
141
|
+
"skip",
|
|
142
|
+
];
|
|
143
|
+
const fallback = validFallbacks.includes(opts.fallback)
|
|
144
|
+
? opts.fallback
|
|
145
|
+
: "none";
|
|
146
|
+
if (opts.fallback &&
|
|
147
|
+
!validFallbacks.includes(opts.fallback)) {
|
|
148
|
+
logger.warn(`Unknown fallback strategy: ${opts.fallback}. Using 'none'.`);
|
|
149
|
+
}
|
|
150
|
+
const cliOptions = {
|
|
151
|
+
packagePath: opts.package,
|
|
152
|
+
packages: packages,
|
|
153
|
+
deps: parseDeps(opts.deps),
|
|
154
|
+
output: opts.output,
|
|
155
|
+
filename: opts.filename,
|
|
156
|
+
extension: opts.extension,
|
|
157
|
+
dryRun: opts.dryRun,
|
|
158
|
+
verbosity,
|
|
159
|
+
fallback,
|
|
160
|
+
sanitizer: {
|
|
161
|
+
spaceReplacement: opts.spaceReplace,
|
|
162
|
+
slashReplacement: opts.slashReplace,
|
|
163
|
+
atReplacement: opts.atReplace,
|
|
164
|
+
},
|
|
165
|
+
};
|
|
166
|
+
await main(packages, cliOptions);
|
|
167
|
+
});
|
|
168
|
+
program.parse();
|
|
169
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../bin/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,IAAI,CAAC;AACpB,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAEpC,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAC5C,OAAO,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAC;AACjD,OAAO,EAAE,MAAM,EAAE,MAAM,gBAAgB,CAAC;AACxC,OAAO,EAAE,SAAS,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AAEhE,OAAO,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAE7C,MAAM,UAAU,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC;AAiBjC,MAAM,IAAI,GAAG,KAAK,EAAE,QAAkB,EAAE,OAAmB,EAAiB,EAAE;IAC5E,sBAAsB;IACtB,MAAM,CAAC,YAAY,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;IACvC,MAAM,CAAC,OAAO,CAAC,uBAAuB,EAAE,IAAI,CAAC,SAAS,CAAC,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;IAE1E,IAAI,YAAY,GAAa,QAAQ,CAAC;IAEtC,yDAAyD;IACzD,IAAI,YAAY,CAAC,MAAM,KAAK,CAAC,EAAE;QAC7B,MAAM,eAAe,GAAG,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,WAAW,CAAC;YAC1D,CAAC,CAAC,OAAO,CAAC,WAAW;YACrB,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,OAAO,CAAC,WAAW,CAAC,CAAC;QAE/C,MAAM,CAAC,OAAO,CAAC,gCAAgC,eAAe,EAAE,CAAC,CAAC;QAElE,IAAI,WAAoC,CAAC;QACzC,IAAI;YACF,WAAW,GAAG,IAAI,CAAC,KAAK,CACtB,EAAE,CAAC,YAAY,CAAC,eAAe,EAAE,MAAM,CAAC,CAC1B,CAAC;YACjB,MAAM,CAAC,IAAI,CAAC,yBAAyB,eAAe,EAAE,CAAC,CAAC;SACzD;QAAC,OAAO,CAAC,EAAE;YACV,MAAM,CAAC,KAAK,CACV,2CAA2C,eAAe,EAAE,CAC7D,CAAC;YACF,IAAI,MAAM,CAAC,SAAS,EAAE,EAAE;gBACtB,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;aACjB;YACD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;SACjB;QAED,MAAM,YAAY,GAAG,eAAe,CAAC,WAAW,EAAE,OAAO,CAAC,IAAI,CAAC,CAAC;QAChE,YAAY,GAAG,MAAM,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;QAEzC,IAAI,YAAY,CAAC,MAAM,KAAK,CAAC,EAAE;YAC7B,MAAM,CAAC,IAAI,CAAC,uDAAuD,CAAC,CAAC;YACrE,OAAO;SACR;QAED,MAAM,CAAC,OAAO,CACZ,SAAS,YAAY,CAAC,MAAM,kBAAkB,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CACxE,CAAC;KACH;IAED,MAAM,CAAC,IAAI,CAAC,cAAc,YAAY,CAAC,MAAM,gBAAgB,CAAC,CAAC;IAE/D,2BAA2B;IAC3B,MAAM,SAAS,GAAG,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,MAAM,CAAC;QAC/C,CAAC,CAAC,OAAO,CAAC,MAAM;QAChB,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,OAAO,CAAC,MAAM,CAAC,CAAC;IAE1C,MAAM,CAAC,OAAO,CAAC,qBAAqB,SAAS,EAAE,CAAC,CAAC;IAEjD,IAAI,CAAC,OAAO,CAAC,MAAM;QAAE,EAAE,CAAC,SAAS,CAAC,SAAS,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAElE,IAAI,YAAY,GAAG,CAAC,CAAC;IACrB,IAAI,SAAS,GAAG,CAAC,CAAC;IAClB,IAAI,aAAa,GAAG,CAAC,CAAC;IAEtB,KAAK,MAAM,WAAW,IAAI,YAAY,EAAE;QACtC,MAAM,CAAC,OAAO,CAAC,iBAAiB,WAAW,EAAE,CAAC,CAAC;QAE/C,MAAM,QAAQ,GAAG,MAAM,WAAW,CAAC,WAAW,EAAE;YAC9C,QAAQ,EAAE,OAAO,CAAC,QAAQ;SAC3B,CAAC,CAAC;QAEH,IAAI,QAAQ,EAAE;YACZ,MAAM,QAAQ,GAAG,gBAAgB,CAC/B,OAAO,CAAC,QAAQ,EAChB,WAAW,EACX,OAAO,CAAC,SAAS,EACjB,OAAO,CAAC,SAAS,CAClB,CAAC;YAEF,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAC;YAElD,IAAI,OAAO,CAAC,MAAM,EAAE;gBAClB,IAAI,QAAQ,CAAC,UAAU,EAAE;oBACvB,MAAM,CAAC,IAAI,CACT,yBAAyB,WAAW,eAAe,QAAQ,CAAC,YAAY,QAAQ,UAAU,EAAE,CAC7F,CAAC;oBACF,aAAa,EAAE,CAAC;iBACjB;qBAAM;oBACL,MAAM,CAAC,IAAI,CACT,yBAAyB,WAAW,OAAO,UAAU,UAAU,QAAQ,CAAC,QAAQ,GAAG,CACpF,CAAC;iBACH;aACF;iBAAM;gBACL,EAAE,CAAC,aAAa,CAAC,UAAU,EAAE,QAAQ,CAAC,OAAO,CAAC,CAAC;gBAC/C,IAAI,QAAQ,CAAC,UAAU,EAAE;oBACvB,MAAM,CAAC,OAAO,CACZ,GAAG,WAAW,WAAW,QAAQ,CAAC,YAAY,gBAAgB,QAAQ,EAAE,CACzE,CAAC;oBACF,aAAa,EAAE,CAAC;iBACjB;qBAAM;oBACL,MAAM,CAAC,OAAO,CACZ,GAAG,WAAW,uBAAuB,QAAQ,CAAC,QAAQ,EAAE,CACzD,CAAC;iBACH;aACF;YACD,YAAY,EAAE,CAAC;SAChB;aAAM;YACL,MAAM,CAAC,IAAI,CAAC,GAAG,WAAW,qBAAqB,CAAC,CAAC;YACjD,SAAS,EAAE,CAAC;SACb;KACF;IAED,UAAU;IACV,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAChB,MAAM,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC;IAC/B,MAAM,CAAC,IAAI,CAAC,mBAAmB,YAAY,CAAC,MAAM,EAAE,CAAC,CAAC;IACtD,MAAM,CAAC,IAAI,CAAC,YAAY,YAAY,EAAE,CAAC,CAAC;IACxC,IAAI,aAAa,GAAG,CAAC,EAAE;QACrB,MAAM,CAAC,IAAI,CAAC,gBAAgB,aAAa,aAAa,CAAC,CAAC;KACzD;IACD,MAAM,CAAC,IAAI,CAAC,WAAW,SAAS,EAAE,CAAC,CAAC;IAEpC,IAAI,OAAO,CAAC,MAAM,EAAE;QAClB,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QAChB,MAAM,CAAC,IAAI,CAAC,mCAAmC,CAAC,CAAC;KAClD;AACH,CAAC,CAAC;AAEF,YAAY;AACZ,MAAM,OAAO,GAAG,IAAI,OAAO,EAAE,CAAC;AAE9B,OAAO;KACJ,IAAI,CAAC,UAAU,CAAC;KAChB,WAAW,CAAC,gDAAgD,CAAC;KAC7D,OAAO,CAAC,OAAO,CAAC;KAChB,QAAQ,CAAC,eAAe,EAAE,mCAAmC,CAAC;KAC9D,MAAM,CACL,sBAAsB,EACtB,sBAAsB,EACtB,eAAe,CAAC,WAAW,CAC5B;KACA,MAAM,CAAC,oBAAoB,EAAE,kBAAkB,EAAE,eAAe,CAAC,MAAM,CAAC;KACxE,MAAM,CACL,0BAA0B,EAC1B,gDAAgD,EAChD,eAAe,CAAC,QAAQ,CACzB;KACA,MAAM,CAAC,uBAAuB,EAAE,gBAAgB,EAAE,eAAe,CAAC,SAAS,CAAC;KAC5E,MAAM,CACL,oBAAoB,EACpB,0DAA0D,EAC1D,KAAK,CACN;KACA,MAAM,CACL,WAAW,EACX,+CAA+C,EAC/C,eAAe,CAAC,MAAM,CACvB;KACA,MAAM,CAAC,aAAa,EAAE,kBAAkB,EAAE,KAAK,CAAC;KAChD,MAAM,CAAC,eAAe,EAAE,sBAAsB,EAAE,KAAK,CAAC;KACtD,MAAM,CACL,uBAAuB,EACvB,uEAAuE,EACvE,eAAe,CAAC,QAAQ,CACzB;KACA,MAAM,CACL,wBAAwB,EACxB,0CAA0C,EAC1C,eAAe,CAAC,SAAS,CAAC,gBAAgB,CAC3C;KACA,MAAM,CACL,wBAAwB,EACxB,2CAA2C,EAC3C,eAAe,CAAC,SAAS,CAAC,gBAAgB,CAC3C;KACA,MAAM,CACL,qBAAqB,EACrB,gDAAgD,EAChD,eAAe,CAAC,SAAS,CAAC,aAAa,CACxC;KACA,MAAM,CAAC,KAAK,EAAE,QAAkB,EAAE,IAAmB,EAAE,EAAE;IACxD,sCAAsC;IACtC,IAAI,SAAS,GAAmB,QAAQ,CAAC;IACzC,wCAAwC;IACxC,MAAM,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC,SAAS,CACvC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,KAAK,IAAI,IAAI,GAAG,KAAK,SAAS,CAC3C,CAAC;IACF,MAAM,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC,SAAS,CACzC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,KAAK,IAAI,IAAI,GAAG,KAAK,WAAW,CAC7C,CAAC;IAEF,gCAAgC;IAChC,IAAI,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,OAAO,EAAE;QAC9B,IAAI,UAAU,GAAG,YAAY;YAAE,SAAS,GAAG,OAAO,CAAC;;YAC9C,SAAS,GAAG,SAAS,CAAC;KAC5B;SAAM,IAAI,IAAI,CAAC,KAAK;QAAE,SAAS,GAAG,OAAO,CAAC;SACtC,IAAI,IAAI,CAAC,OAAO;QAAE,SAAS,GAAG,SAAS,CAAC;IAE7C,6BAA6B;IAC7B,MAAM,cAAc,GAAuB;QACzC,MAAM;QACN,QAAQ;QACR,OAAO;QACP,MAAM;KACP,CAAC;IACF,MAAM,QAAQ,GAAG,cAAc,CAAC,QAAQ,CAAC,IAAI,CAAC,QAA4B,CAAC;QACzE,CAAC,CAAE,IAAI,CAAC,QAA6B;QACrC,CAAC,CAAC,MAAM,CAAC;IAEX,IACE,IAAI,CAAC,QAAQ;QACb,CAAC,cAAc,CAAC,QAAQ,CAAC,IAAI,CAAC,QAA4B,CAAC,EAC3D;QACA,MAAM,CAAC,IAAI,CAAC,8BAA8B,IAAI,CAAC,QAAQ,iBAAiB,CAAC,CAAC;KAC3E;IAED,MAAM,UAAU,GAAe;QAC7B,WAAW,EAAE,IAAI,CAAC,OAAO;QACzB,QAAQ,EAAE,QAAQ;QAClB,IAAI,EAAE,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC;QAC1B,MAAM,EAAE,IAAI,CAAC,MAAM;QACnB,QAAQ,EAAE,IAAI,CAAC,QAAQ;QACvB,SAAS,EAAE,IAAI,CAAC,SAAS;QACzB,MAAM,EAAE,IAAI,CAAC,MAAM;QACnB,SAAS;QACT,QAAQ;QACR,SAAS,EAAE;YACT,gBAAgB,EAAE,IAAI,CAAC,YAAY;YACnC,gBAAgB,EAAE,IAAI,CAAC,YAAY;YACnC,aAAa,EAAE,IAAI,CAAC,SAAS;SAC9B;KACF,CAAC;IAEF,MAAM,IAAI,CAAC,QAAQ,EAAE,UAAU,CAAC,CAAC;AACnC,CAAC,CAAC,CAAC;AAEL,OAAO,CAAC,KAAK,EAAE,CAAC"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import { NpmRegistry } from "./types/npmRegistryType";
|
|
2
|
+
import { FallbackStrategy } from "./types/types";
|
|
3
|
+
export interface FetchResult {
|
|
4
|
+
location: string;
|
|
5
|
+
content: string;
|
|
6
|
+
isFallback?: boolean;
|
|
7
|
+
fallbackType?: "readme" | "empty";
|
|
8
|
+
}
|
|
9
|
+
export declare const checkPackage: (s: NpmRegistry) => Promise<FetchResult | null>;
|
|
10
|
+
export declare const checkStandardUrls: (baseUrl: string) => Promise<FetchResult | null>;
|
|
11
|
+
export declare const fetchReadmeFromGithub: (homepage: string) => Promise<FetchResult | null>;
|
|
12
|
+
export declare const handleGithub: (homepage: string) => Promise<FetchResult | null>;
|
|
13
|
+
export declare const checkHomepage: (homepage: string) => Promise<FetchResult | null>;
|
|
14
|
+
export interface FindLLMsOptions {
|
|
15
|
+
fallback?: FallbackStrategy;
|
|
16
|
+
}
|
|
17
|
+
export declare const findLLMsTxt: (packageName: string, options?: FindLLMsOptions) => Promise<FetchResult | null>;
|
|
18
|
+
//# sourceMappingURL=llmsFetcher.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"llmsFetcher.d.ts","sourceRoot":"","sources":["../../bin/llmsFetcher.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AAEtD,OAAO,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAC;AAGjD,MAAM,WAAW,WAAW;IAC1B,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,YAAY,CAAC,EAAE,QAAQ,GAAG,OAAO,CAAC;CACnC;AA2BD,eAAO,MAAM,YAAY,MACpB,WAAW,KACb,QAAQ,WAAW,GAAG,IAAI,CAuB5B,CAAC;AAEF,eAAO,MAAM,iBAAiB,YACnB,MAAM,KACd,QAAQ,WAAW,GAAG,IAAI,CAkD5B,CAAC;AAEF,eAAO,MAAM,qBAAqB,aACtB,MAAM,KACf,QAAQ,WAAW,GAAG,IAAI,CA6B5B,CAAC;AAEF,eAAO,MAAM,YAAY,aACb,MAAM,KACf,QAAQ,WAAW,GAAG,IAAI,CA4E5B,CAAC;AAEF,eAAO,MAAM,aAAa,aACd,MAAM,KACf,QAAQ,WAAW,GAAG,IAAI,CAyB5B,CAAC;AAEF,MAAM,WAAW,eAAe;IAC9B,QAAQ,CAAC,EAAE,gBAAgB,CAAC;CAC7B;AAED,eAAO,MAAM,WAAW,gBACT,MAAM,YACV,eAAe,KACvB,QAAQ,WAAW,GAAG,IAAI,CAoD5B,CAAC"}
|