@se-studio/site-check 1.0.76 → 1.1.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/CHANGELOG.md +12 -0
- package/dist/screaming-frog/audit.d.ts +9 -0
- package/dist/screaming-frog/audit.d.ts.map +1 -0
- package/dist/screaming-frog/audit.js +254 -0
- package/dist/screaming-frog/audit.js.map +1 -0
- package/dist/screaming-frog/compare-report.d.ts +22 -0
- package/dist/screaming-frog/compare-report.d.ts.map +1 -0
- package/dist/screaming-frog/compare-report.js +142 -0
- package/dist/screaming-frog/compare-report.js.map +1 -0
- package/dist/screaming-frog/compare.d.ts +5 -0
- package/dist/screaming-frog/compare.d.ts.map +1 -0
- package/dist/screaming-frog/compare.js +42 -0
- package/dist/screaming-frog/compare.js.map +1 -0
- package/dist/screaming-frog/crawl-state.d.ts +19 -0
- package/dist/screaming-frog/crawl-state.d.ts.map +1 -0
- package/dist/screaming-frog/crawl-state.js +30 -0
- package/dist/screaming-frog/crawl-state.js.map +1 -0
- package/dist/screaming-frog/crawl.d.ts +6 -0
- package/dist/screaming-frog/crawl.d.ts.map +1 -0
- package/dist/screaming-frog/crawl.js +76 -0
- package/dist/screaming-frog/crawl.js.map +1 -0
- package/dist/screaming-frog/csv.d.ts +6 -0
- package/dist/screaming-frog/csv.d.ts.map +1 -0
- package/dist/screaming-frog/csv.js +71 -0
- package/dist/screaming-frog/csv.js.map +1 -0
- package/dist/screaming-frog/env.d.ts +4 -0
- package/dist/screaming-frog/env.d.ts.map +1 -0
- package/dist/screaming-frog/env.js +53 -0
- package/dist/screaming-frog/env.js.map +1 -0
- package/dist/screaming-frog/index.d.ts +15 -0
- package/dist/screaming-frog/index.d.ts.map +1 -0
- package/dist/screaming-frog/index.js +15 -0
- package/dist/screaming-frog/index.js.map +1 -0
- package/dist/screaming-frog/list-crawls.d.ts +22 -0
- package/dist/screaming-frog/list-crawls.d.ts.map +1 -0
- package/dist/screaming-frog/list-crawls.js +107 -0
- package/dist/screaming-frog/list-crawls.js.map +1 -0
- package/dist/screaming-frog/load-config.d.ts +9 -0
- package/dist/screaming-frog/load-config.d.ts.map +1 -0
- package/dist/screaming-frog/load-config.js +86 -0
- package/dist/screaming-frog/load-config.js.map +1 -0
- package/dist/screaming-frog/load-profile.d.ts +9 -0
- package/dist/screaming-frog/load-profile.d.ts.map +1 -0
- package/dist/screaming-frog/load-profile.js +32 -0
- package/dist/screaming-frog/load-profile.js.map +1 -0
- package/dist/screaming-frog/paths.d.ts +5 -0
- package/dist/screaming-frog/paths.d.ts.map +1 -0
- package/dist/screaming-frog/paths.js +34 -0
- package/dist/screaming-frog/paths.js.map +1 -0
- package/dist/screaming-frog/rules.d.ts +14 -0
- package/dist/screaming-frog/rules.d.ts.map +1 -0
- package/dist/screaming-frog/rules.js +211 -0
- package/dist/screaming-frog/rules.js.map +1 -0
- package/dist/screaming-frog/sf-runner.d.ts +12 -0
- package/dist/screaming-frog/sf-runner.d.ts.map +1 -0
- package/dist/screaming-frog/sf-runner.js +37 -0
- package/dist/screaming-frog/sf-runner.js.map +1 -0
- package/dist/screaming-frog/types.d.ts +136 -0
- package/dist/screaming-frog/types.d.ts.map +1 -0
- package/dist/screaming-frog/types.js +2 -0
- package/dist/screaming-frog/types.js.map +1 -0
- package/dist/screaming-frog-cli.d.ts +4 -0
- package/dist/screaming-frog-cli.d.ts.map +1 -0
- package/dist/screaming-frog-cli.js +326 -0
- package/dist/screaming-frog-cli.js.map +1 -0
- package/package.json +2 -2
|
@@ -0,0 +1,326 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
/** biome-ignore-all lint/suspicious/noConsole: CLI output is intentional */
|
|
3
|
+
import path from 'node:path';
|
|
4
|
+
import { getScreamingFrogAuditExitCode, parseScreamingFrogAuditArgv, runScreamingFrogAudit, writeScreamingFrogAuditOutputs, } from './screaming-frog/audit.js';
|
|
5
|
+
import { runScreamingFrogCompare } from './screaming-frog/compare.js';
|
|
6
|
+
import { analyzeScreamingFrogCompare, getScreamingFrogCompareExitCode, writeScreamingFrogCompareOutputs, } from './screaming-frog/compare-report.js';
|
|
7
|
+
import { runScreamingFrogCrawl } from './screaming-frog/crawl.js';
|
|
8
|
+
import { loadCrawlState, recordCrawlSnapshot } from './screaming-frog/crawl-state.js';
|
|
9
|
+
import { filterCrawlsForSite, listStoredCrawls, pickLatestPair, } from './screaming-frog/list-crawls.js';
|
|
10
|
+
import { loadSiteConfig } from './screaming-frog/load-config.js';
|
|
11
|
+
import { defaultProfileName, getProfilesForSite } from './screaming-frog/load-profile.js';
|
|
12
|
+
function compareMdName(site, configured) {
|
|
13
|
+
return configured ?? `${site}-screaming-frog-compare.md`;
|
|
14
|
+
}
|
|
15
|
+
function printUsage() {
|
|
16
|
+
console.error('Usage:');
|
|
17
|
+
console.error(' site-check-screaming-frog crawl [--profile <name>] [--tag <baseline>] [--config <path>]');
|
|
18
|
+
console.error(' site-check-screaming-frog audit <exportDir> [--config <path>] [--out-dir <dir>]');
|
|
19
|
+
console.error(' site-check-screaming-frog compare [<current-id> <previous-id>] [--baseline <tag>] [--latest]');
|
|
20
|
+
console.error(' site-check-screaming-frog list-crawls [--config <path>]');
|
|
21
|
+
console.error(' site-check-screaming-frog profiles [--config <path>]');
|
|
22
|
+
console.error('');
|
|
23
|
+
console.error('Requires seo/screaming-frog.json in the project (or pass --config).');
|
|
24
|
+
console.error('Compare uses Screaming Frog native --crawl-comparison (database storage mode).');
|
|
25
|
+
}
|
|
26
|
+
function requireFlagValue(args, index, flag) {
|
|
27
|
+
const value = args[index + 1];
|
|
28
|
+
if (!value || value.startsWith('-')) {
|
|
29
|
+
throw new Error(`${flag} requires a value`);
|
|
30
|
+
}
|
|
31
|
+
return value;
|
|
32
|
+
}
|
|
33
|
+
function parseCommand(argv) {
|
|
34
|
+
const args = argv.slice(2);
|
|
35
|
+
let command = null;
|
|
36
|
+
let configPath;
|
|
37
|
+
let profile = '';
|
|
38
|
+
let tag = '';
|
|
39
|
+
let baselineTag = 'content';
|
|
40
|
+
let exportDir = '';
|
|
41
|
+
let outDir;
|
|
42
|
+
let siteUrl;
|
|
43
|
+
let sampleLimit;
|
|
44
|
+
let skipCrawl = false;
|
|
45
|
+
let useLatest = false;
|
|
46
|
+
let currentId = '';
|
|
47
|
+
let previousId = '';
|
|
48
|
+
for (let i = 0; i < args.length; i++) {
|
|
49
|
+
const arg = args[i];
|
|
50
|
+
if (!arg)
|
|
51
|
+
continue;
|
|
52
|
+
if (!command &&
|
|
53
|
+
(arg === 'audit' ||
|
|
54
|
+
arg === 'crawl' ||
|
|
55
|
+
arg === 'profiles' ||
|
|
56
|
+
arg === 'compare' ||
|
|
57
|
+
arg === 'list-crawls')) {
|
|
58
|
+
command = arg;
|
|
59
|
+
continue;
|
|
60
|
+
}
|
|
61
|
+
if (arg === '--config') {
|
|
62
|
+
configPath = requireFlagValue(args, i, arg);
|
|
63
|
+
i += 1;
|
|
64
|
+
continue;
|
|
65
|
+
}
|
|
66
|
+
if (arg === '--profile') {
|
|
67
|
+
profile = requireFlagValue(args, i, arg);
|
|
68
|
+
i += 1;
|
|
69
|
+
continue;
|
|
70
|
+
}
|
|
71
|
+
if (arg === '--tag') {
|
|
72
|
+
tag = requireFlagValue(args, i, arg);
|
|
73
|
+
i += 1;
|
|
74
|
+
continue;
|
|
75
|
+
}
|
|
76
|
+
if (arg === '--baseline') {
|
|
77
|
+
baselineTag = requireFlagValue(args, i, arg);
|
|
78
|
+
i += 1;
|
|
79
|
+
continue;
|
|
80
|
+
}
|
|
81
|
+
if (arg === '--latest') {
|
|
82
|
+
useLatest = true;
|
|
83
|
+
continue;
|
|
84
|
+
}
|
|
85
|
+
if (arg === '--export-dir') {
|
|
86
|
+
exportDir = requireFlagValue(args, i, arg);
|
|
87
|
+
i += 1;
|
|
88
|
+
continue;
|
|
89
|
+
}
|
|
90
|
+
if (arg === '--out-dir') {
|
|
91
|
+
outDir = requireFlagValue(args, i, arg);
|
|
92
|
+
i += 1;
|
|
93
|
+
continue;
|
|
94
|
+
}
|
|
95
|
+
if (arg === '--site-url') {
|
|
96
|
+
siteUrl = requireFlagValue(args, i, arg);
|
|
97
|
+
i += 1;
|
|
98
|
+
continue;
|
|
99
|
+
}
|
|
100
|
+
if (arg === '--sample-limit') {
|
|
101
|
+
const value = requireFlagValue(args, i, arg);
|
|
102
|
+
sampleLimit = Number.parseInt(value, 10);
|
|
103
|
+
i += 1;
|
|
104
|
+
continue;
|
|
105
|
+
}
|
|
106
|
+
if (arg === '--skip-crawl') {
|
|
107
|
+
skipCrawl = true;
|
|
108
|
+
continue;
|
|
109
|
+
}
|
|
110
|
+
if (arg.startsWith('-')) {
|
|
111
|
+
throw new Error(`Unknown option: ${arg}`);
|
|
112
|
+
}
|
|
113
|
+
if (command === 'audit' && !exportDir) {
|
|
114
|
+
exportDir = arg;
|
|
115
|
+
continue;
|
|
116
|
+
}
|
|
117
|
+
if (command === 'compare') {
|
|
118
|
+
if (!currentId)
|
|
119
|
+
currentId = arg;
|
|
120
|
+
else if (!previousId)
|
|
121
|
+
previousId = arg;
|
|
122
|
+
else
|
|
123
|
+
throw new Error('compare accepts at most two database IDs');
|
|
124
|
+
continue;
|
|
125
|
+
}
|
|
126
|
+
throw new Error(`Unexpected argument: ${arg}`);
|
|
127
|
+
}
|
|
128
|
+
return {
|
|
129
|
+
command,
|
|
130
|
+
configPath,
|
|
131
|
+
profile,
|
|
132
|
+
tag,
|
|
133
|
+
baselineTag,
|
|
134
|
+
exportDir,
|
|
135
|
+
outDir,
|
|
136
|
+
siteUrl,
|
|
137
|
+
sampleLimit,
|
|
138
|
+
skipCrawl,
|
|
139
|
+
useLatest,
|
|
140
|
+
currentId,
|
|
141
|
+
previousId,
|
|
142
|
+
};
|
|
143
|
+
}
|
|
144
|
+
async function runAuditCommand(options) {
|
|
145
|
+
const resolved = await loadSiteConfig({ configPath: options.configPath });
|
|
146
|
+
const auditArgs = parseScreamingFrogAuditArgv([
|
|
147
|
+
'node',
|
|
148
|
+
'cli',
|
|
149
|
+
...(options.outDir ? ['--out-dir', options.outDir] : []),
|
|
150
|
+
...(options.siteUrl ? ['--site-url', options.siteUrl] : []),
|
|
151
|
+
...(options.sampleLimit ? ['--sample-limit', String(options.sampleLimit)] : []),
|
|
152
|
+
options.exportDir,
|
|
153
|
+
]);
|
|
154
|
+
const outDir = auditArgs.outDir ?? path.join(resolved.workspaceRoot, 'docs/seo');
|
|
155
|
+
const result = await runScreamingFrogAudit({
|
|
156
|
+
exportDir: auditArgs.exportDir,
|
|
157
|
+
site: resolved.config,
|
|
158
|
+
siteUrl: auditArgs.siteUrl,
|
|
159
|
+
sampleLimit: auditArgs.sampleLimit,
|
|
160
|
+
});
|
|
161
|
+
const { mdPath } = await writeScreamingFrogAuditOutputs(result, outDir, resolved.config.outputMdName);
|
|
162
|
+
console.log(`Wrote ${mdPath}`);
|
|
163
|
+
return getScreamingFrogAuditExitCode(result);
|
|
164
|
+
}
|
|
165
|
+
async function runCrawlCommand(options) {
|
|
166
|
+
const resolved = await loadSiteConfig({ configPath: options.configPath });
|
|
167
|
+
const profile = options.profile || defaultProfileName(resolved.config);
|
|
168
|
+
const crawlResult = await runScreamingFrogCrawl({
|
|
169
|
+
site: resolved.config,
|
|
170
|
+
profile,
|
|
171
|
+
workspaceRoot: resolved.workspaceRoot,
|
|
172
|
+
exportDir: options.exportDir || undefined,
|
|
173
|
+
skipCrawl: options.skipCrawl,
|
|
174
|
+
});
|
|
175
|
+
console.log(`Crawl complete: ${crawlResult.crawlUrl}`);
|
|
176
|
+
console.log(`Config: ${crawlResult.configFile}`);
|
|
177
|
+
console.log(`Export: ${crawlResult.exportDir}`);
|
|
178
|
+
if (crawlResult.databaseId) {
|
|
179
|
+
console.log(`Database ID: ${crawlResult.databaseId}`);
|
|
180
|
+
const statePath = await recordCrawlSnapshot(resolved.workspaceRoot, {
|
|
181
|
+
databaseId: crawlResult.databaseId,
|
|
182
|
+
exportDir: crawlResult.exportDir,
|
|
183
|
+
profile,
|
|
184
|
+
crawlUrl: crawlResult.crawlUrl,
|
|
185
|
+
savedAt: new Date().toISOString(),
|
|
186
|
+
label: options.tag || undefined,
|
|
187
|
+
}, { tag: options.tag || undefined });
|
|
188
|
+
console.log(`Saved crawl state: ${statePath}`);
|
|
189
|
+
if (options.tag) {
|
|
190
|
+
console.log(`Baseline tag "${options.tag}" updated. Compare after code release with:`);
|
|
191
|
+
console.log(` site-check-screaming-frog compare --baseline ${options.tag}`);
|
|
192
|
+
}
|
|
193
|
+
}
|
|
194
|
+
else {
|
|
195
|
+
console.warn('Could not resolve database ID from --list-crawls. Compare may need explicit IDs.');
|
|
196
|
+
}
|
|
197
|
+
console.log('');
|
|
198
|
+
console.log('Run audit:');
|
|
199
|
+
console.log(` site-check-screaming-frog audit "${crawlResult.exportDir}"`);
|
|
200
|
+
return 0;
|
|
201
|
+
}
|
|
202
|
+
async function resolveCompareIds(options, siteHost, workspaceRoot) {
|
|
203
|
+
if (options.currentId && options.previousId) {
|
|
204
|
+
return { currentId: options.currentId, previousId: options.previousId };
|
|
205
|
+
}
|
|
206
|
+
if (options.currentId && !options.previousId) {
|
|
207
|
+
if (options.useLatest) {
|
|
208
|
+
throw new Error('Pass two database IDs with compare, or pass one current ID with --baseline <tag>.');
|
|
209
|
+
}
|
|
210
|
+
const state = await loadCrawlState(workspaceRoot);
|
|
211
|
+
const baseline = state.baselines[options.baselineTag];
|
|
212
|
+
if (!baseline?.databaseId) {
|
|
213
|
+
throw new Error(`No baseline "${options.baselineTag}" in docs/seo/sf-crawl-state.json. Run: site-check-screaming-frog crawl --tag ${options.baselineTag}`);
|
|
214
|
+
}
|
|
215
|
+
return { currentId: options.currentId, previousId: baseline.databaseId };
|
|
216
|
+
}
|
|
217
|
+
if (!options.currentId && options.previousId) {
|
|
218
|
+
throw new Error('Pass both database IDs, or pass one current ID with --baseline <tag>.');
|
|
219
|
+
}
|
|
220
|
+
const crawls = filterCrawlsForSite(await listStoredCrawls(), siteHost);
|
|
221
|
+
if (options.useLatest) {
|
|
222
|
+
const pair = pickLatestPair(crawls);
|
|
223
|
+
if (!pair) {
|
|
224
|
+
throw new Error(`Need at least two stored crawls for ${siteHost}. Run crawl twice or pass explicit database IDs.`);
|
|
225
|
+
}
|
|
226
|
+
return { currentId: pair.current.databaseId, previousId: pair.previous.databaseId };
|
|
227
|
+
}
|
|
228
|
+
const state = await loadCrawlState(workspaceRoot);
|
|
229
|
+
const baseline = state.baselines[options.baselineTag];
|
|
230
|
+
const last = state.lastCrawl;
|
|
231
|
+
if (!baseline?.databaseId) {
|
|
232
|
+
throw new Error(`No baseline "${options.baselineTag}" in docs/seo/sf-crawl-state.json. Run: site-check-screaming-frog crawl --tag ${options.baselineTag}`);
|
|
233
|
+
}
|
|
234
|
+
if (!last?.databaseId) {
|
|
235
|
+
throw new Error('No last crawl recorded. Run site-check-screaming-frog crawl after your code release.');
|
|
236
|
+
}
|
|
237
|
+
return { currentId: last.databaseId, previousId: baseline.databaseId };
|
|
238
|
+
}
|
|
239
|
+
async function runCompareCommand(options) {
|
|
240
|
+
const resolved = await loadSiteConfig({ configPath: options.configPath });
|
|
241
|
+
const { currentId, previousId } = await resolveCompareIds(options, resolved.config.siteHost, resolved.workspaceRoot);
|
|
242
|
+
const crawls = filterCrawlsForSite(await listStoredCrawls(), resolved.config.siteHost);
|
|
243
|
+
const currentCrawl = crawls.find((crawl) => crawl.databaseId === currentId);
|
|
244
|
+
const previousCrawl = crawls.find((crawl) => crawl.databaseId === previousId);
|
|
245
|
+
console.log(`Comparing current ${currentId} vs previous ${previousId}`);
|
|
246
|
+
const compareResult = await runScreamingFrogCompare({
|
|
247
|
+
currentDatabaseId: currentId,
|
|
248
|
+
previousDatabaseId: previousId,
|
|
249
|
+
siteLabel: resolved.config.siteLabel,
|
|
250
|
+
exportDir: options.exportDir || undefined,
|
|
251
|
+
currentCrawl,
|
|
252
|
+
previousCrawl,
|
|
253
|
+
});
|
|
254
|
+
const analysis = await analyzeScreamingFrogCompare(compareResult.exportDir);
|
|
255
|
+
const outDir = options.outDir ?? path.join(resolved.workspaceRoot, 'docs/seo');
|
|
256
|
+
const { mdPath } = await writeScreamingFrogCompareOutputs(compareResult, analysis, outDir, compareMdName(resolved.config.site, resolved.config.compareMdName));
|
|
257
|
+
console.log(`Compare export: ${compareResult.exportDir}`);
|
|
258
|
+
console.log(`Wrote ${mdPath}`);
|
|
259
|
+
console.log(`Matched URLs: ${analysis.matchedUrls}`);
|
|
260
|
+
for (const metric of analysis.metrics) {
|
|
261
|
+
console.log(` ${metric.label}: ${metric.changed}`);
|
|
262
|
+
}
|
|
263
|
+
return getScreamingFrogCompareExitCode(analysis);
|
|
264
|
+
}
|
|
265
|
+
async function runListCrawlsCommand(options) {
|
|
266
|
+
const resolved = await loadSiteConfig({ configPath: options.configPath });
|
|
267
|
+
const crawls = filterCrawlsForSite(await listStoredCrawls(), resolved.config.siteHost);
|
|
268
|
+
console.log(`Stored crawls for ${resolved.config.siteHost} (${crawls.length}):`);
|
|
269
|
+
for (const crawl of crawls) {
|
|
270
|
+
console.log(` ${crawl.databaseId}`);
|
|
271
|
+
console.log(` url: ${crawl.url}`);
|
|
272
|
+
console.log(` urls: ${crawl.urlCount} | modified: ${crawl.modified}`);
|
|
273
|
+
}
|
|
274
|
+
const state = await loadCrawlState(resolved.workspaceRoot);
|
|
275
|
+
if (state.lastCrawl) {
|
|
276
|
+
console.log('');
|
|
277
|
+
console.log(`Last recorded crawl: ${state.lastCrawl.databaseId} (${state.lastCrawl.savedAt})`);
|
|
278
|
+
}
|
|
279
|
+
for (const [tag, snapshot] of Object.entries(state.baselines)) {
|
|
280
|
+
console.log(`Baseline "${tag}": ${snapshot.databaseId} (${snapshot.savedAt})`);
|
|
281
|
+
}
|
|
282
|
+
return 0;
|
|
283
|
+
}
|
|
284
|
+
async function runProfilesCommand(options) {
|
|
285
|
+
const resolved = await loadSiteConfig({ configPath: options.configPath });
|
|
286
|
+
const profiles = getProfilesForSite(resolved.config);
|
|
287
|
+
console.log(`${resolved.config.siteLabel} (${resolved.config.site}) profiles:`);
|
|
288
|
+
console.log(`Config: ${resolved.manifestPath}`);
|
|
289
|
+
for (const [key, profile] of Object.entries(profiles)) {
|
|
290
|
+
console.log(` ${key}: ${profile.label}`);
|
|
291
|
+
console.log(` url: ${profile.startUrl}${profile.urlEnv ? ` (or $${profile.urlEnv})` : ''}`);
|
|
292
|
+
console.log(` config: ${profile.configFile}`);
|
|
293
|
+
}
|
|
294
|
+
return 0;
|
|
295
|
+
}
|
|
296
|
+
function validateSampleLimit(sampleLimit) {
|
|
297
|
+
if (sampleLimit === undefined)
|
|
298
|
+
return;
|
|
299
|
+
if (!Number.isFinite(sampleLimit) || sampleLimit <= 0) {
|
|
300
|
+
throw new Error('--sample-limit must be a positive integer');
|
|
301
|
+
}
|
|
302
|
+
}
|
|
303
|
+
async function main() {
|
|
304
|
+
const options = parseCommand(process.argv);
|
|
305
|
+
if (!options.command) {
|
|
306
|
+
printUsage();
|
|
307
|
+
return 1;
|
|
308
|
+
}
|
|
309
|
+
validateSampleLimit(options.sampleLimit);
|
|
310
|
+
if (options.command === 'audit')
|
|
311
|
+
return runAuditCommand(options);
|
|
312
|
+
if (options.command === 'crawl')
|
|
313
|
+
return runCrawlCommand(options);
|
|
314
|
+
if (options.command === 'compare')
|
|
315
|
+
return runCompareCommand(options);
|
|
316
|
+
if (options.command === 'list-crawls')
|
|
317
|
+
return runListCrawlsCommand(options);
|
|
318
|
+
return runProfilesCommand(options);
|
|
319
|
+
}
|
|
320
|
+
main()
|
|
321
|
+
.then((code) => process.exit(code))
|
|
322
|
+
.catch((err) => {
|
|
323
|
+
console.error(err instanceof Error ? err.message : err);
|
|
324
|
+
process.exit(1);
|
|
325
|
+
});
|
|
326
|
+
//# sourceMappingURL=screaming-frog-cli.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"screaming-frog-cli.js","sourceRoot":"","sources":["../src/screaming-frog-cli.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@se-studio/site-check",
|
|
3
|
-
"version": "1.0
|
|
3
|
+
"version": "1.1.0",
|
|
4
4
|
"description": "Validate SE marketing sites (sitemap, llms.txt) and download markdown files preserving structure",
|
|
5
5
|
"repository": {
|
|
6
6
|
"type": "git",
|
|
@@ -32,7 +32,7 @@
|
|
|
32
32
|
},
|
|
33
33
|
"devDependencies": {
|
|
34
34
|
"@biomejs/biome": "^2.4.16",
|
|
35
|
-
"@types/node": "^24.
|
|
35
|
+
"@types/node": "^24.13.1",
|
|
36
36
|
"typescript": "^6.0.3"
|
|
37
37
|
},
|
|
38
38
|
"scripts": {
|