@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.
Files changed (66) hide show
  1. package/CHANGELOG.md +12 -0
  2. package/dist/screaming-frog/audit.d.ts +9 -0
  3. package/dist/screaming-frog/audit.d.ts.map +1 -0
  4. package/dist/screaming-frog/audit.js +254 -0
  5. package/dist/screaming-frog/audit.js.map +1 -0
  6. package/dist/screaming-frog/compare-report.d.ts +22 -0
  7. package/dist/screaming-frog/compare-report.d.ts.map +1 -0
  8. package/dist/screaming-frog/compare-report.js +142 -0
  9. package/dist/screaming-frog/compare-report.js.map +1 -0
  10. package/dist/screaming-frog/compare.d.ts +5 -0
  11. package/dist/screaming-frog/compare.d.ts.map +1 -0
  12. package/dist/screaming-frog/compare.js +42 -0
  13. package/dist/screaming-frog/compare.js.map +1 -0
  14. package/dist/screaming-frog/crawl-state.d.ts +19 -0
  15. package/dist/screaming-frog/crawl-state.d.ts.map +1 -0
  16. package/dist/screaming-frog/crawl-state.js +30 -0
  17. package/dist/screaming-frog/crawl-state.js.map +1 -0
  18. package/dist/screaming-frog/crawl.d.ts +6 -0
  19. package/dist/screaming-frog/crawl.d.ts.map +1 -0
  20. package/dist/screaming-frog/crawl.js +76 -0
  21. package/dist/screaming-frog/crawl.js.map +1 -0
  22. package/dist/screaming-frog/csv.d.ts +6 -0
  23. package/dist/screaming-frog/csv.d.ts.map +1 -0
  24. package/dist/screaming-frog/csv.js +71 -0
  25. package/dist/screaming-frog/csv.js.map +1 -0
  26. package/dist/screaming-frog/env.d.ts +4 -0
  27. package/dist/screaming-frog/env.d.ts.map +1 -0
  28. package/dist/screaming-frog/env.js +53 -0
  29. package/dist/screaming-frog/env.js.map +1 -0
  30. package/dist/screaming-frog/index.d.ts +15 -0
  31. package/dist/screaming-frog/index.d.ts.map +1 -0
  32. package/dist/screaming-frog/index.js +15 -0
  33. package/dist/screaming-frog/index.js.map +1 -0
  34. package/dist/screaming-frog/list-crawls.d.ts +22 -0
  35. package/dist/screaming-frog/list-crawls.d.ts.map +1 -0
  36. package/dist/screaming-frog/list-crawls.js +107 -0
  37. package/dist/screaming-frog/list-crawls.js.map +1 -0
  38. package/dist/screaming-frog/load-config.d.ts +9 -0
  39. package/dist/screaming-frog/load-config.d.ts.map +1 -0
  40. package/dist/screaming-frog/load-config.js +86 -0
  41. package/dist/screaming-frog/load-config.js.map +1 -0
  42. package/dist/screaming-frog/load-profile.d.ts +9 -0
  43. package/dist/screaming-frog/load-profile.d.ts.map +1 -0
  44. package/dist/screaming-frog/load-profile.js +32 -0
  45. package/dist/screaming-frog/load-profile.js.map +1 -0
  46. package/dist/screaming-frog/paths.d.ts +5 -0
  47. package/dist/screaming-frog/paths.d.ts.map +1 -0
  48. package/dist/screaming-frog/paths.js +34 -0
  49. package/dist/screaming-frog/paths.js.map +1 -0
  50. package/dist/screaming-frog/rules.d.ts +14 -0
  51. package/dist/screaming-frog/rules.d.ts.map +1 -0
  52. package/dist/screaming-frog/rules.js +211 -0
  53. package/dist/screaming-frog/rules.js.map +1 -0
  54. package/dist/screaming-frog/sf-runner.d.ts +12 -0
  55. package/dist/screaming-frog/sf-runner.d.ts.map +1 -0
  56. package/dist/screaming-frog/sf-runner.js +37 -0
  57. package/dist/screaming-frog/sf-runner.js.map +1 -0
  58. package/dist/screaming-frog/types.d.ts +136 -0
  59. package/dist/screaming-frog/types.d.ts.map +1 -0
  60. package/dist/screaming-frog/types.js +2 -0
  61. package/dist/screaming-frog/types.js.map +1 -0
  62. package/dist/screaming-frog-cli.d.ts +4 -0
  63. package/dist/screaming-frog-cli.d.ts.map +1 -0
  64. package/dist/screaming-frog-cli.js +326 -0
  65. package/dist/screaming-frog-cli.js.map +1 -0
  66. 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.76",
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.12.4",
35
+ "@types/node": "^24.13.1",
36
36
  "typescript": "^6.0.3"
37
37
  },
38
38
  "scripts": {