seo-gravity-mcp 1.0.2 → 1.2.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 (67) hide show
  1. package/README.md +118 -105
  2. package/dist/adapters/adapterRegistry.d.ts +7 -0
  3. package/dist/adapters/adapterRegistry.js +30 -0
  4. package/dist/adapters/astroAdapter.d.ts +17 -0
  5. package/dist/adapters/astroAdapter.js +191 -0
  6. package/dist/adapters/nextAppAdapter.d.ts +17 -0
  7. package/dist/adapters/nextAppAdapter.js +265 -0
  8. package/dist/adapters/nextPagesAdapter.d.ts +17 -0
  9. package/dist/adapters/nextPagesAdapter.js +209 -0
  10. package/dist/adapters/remixAdapter.d.ts +16 -0
  11. package/dist/adapters/remixAdapter.js +118 -0
  12. package/dist/adapters/staticAdapter.d.ts +16 -0
  13. package/dist/adapters/staticAdapter.js +117 -0
  14. package/dist/adapters/svelteKitAdapter.d.ts +16 -0
  15. package/dist/adapters/svelteKitAdapter.js +122 -0
  16. package/dist/adapters/types.d.ts +39 -0
  17. package/dist/adapters/types.js +1 -0
  18. package/dist/adapters/viteReactAdapter.d.ts +16 -0
  19. package/dist/adapters/viteReactAdapter.js +189 -0
  20. package/dist/benchmark/correlationBenchmark.d.ts +1 -0
  21. package/dist/benchmark/correlationBenchmark.js +96 -0
  22. package/dist/benchmark/invariantBenchmark.d.ts +1 -0
  23. package/dist/benchmark/invariantBenchmark.js +47 -0
  24. package/dist/cli.d.ts +8 -0
  25. package/dist/cli.js +162 -0
  26. package/dist/index.d.ts +3 -1
  27. package/dist/index.js +8 -646
  28. package/dist/invariants/registry.d.ts +12 -0
  29. package/dist/invariants/registry.js +178 -0
  30. package/dist/invariants/types.d.ts +38 -0
  31. package/dist/invariants/types.js +1 -0
  32. package/dist/providers/providerRegistry.d.ts +65 -0
  33. package/dist/providers/providerRegistry.js +64 -0
  34. package/dist/providers/types.d.ts +22 -0
  35. package/dist/providers/types.js +1 -0
  36. package/dist/server/registry.d.ts +3 -0
  37. package/dist/server/registry.js +559 -0
  38. package/dist/server/server.d.ts +70 -0
  39. package/dist/server/server.js +53 -0
  40. package/dist/server/types.d.ts +7 -0
  41. package/dist/server/types.js +1 -0
  42. package/dist/test.js +108 -138
  43. package/dist/tools/orchestration.js +23 -21
  44. package/dist/types/canonical.d.ts +64 -0
  45. package/dist/types/canonical.js +1 -0
  46. package/dist/types/findings.d.ts +22 -0
  47. package/dist/types/findings.js +1 -1
  48. package/dist/types/seo.d.ts +24 -0
  49. package/dist/utils/astLocator.d.ts +14 -0
  50. package/dist/utils/astLocator.js +137 -0
  51. package/dist/utils/cacheManager.d.ts +29 -0
  52. package/dist/utils/cacheManager.js +60 -0
  53. package/dist/utils/experimentEngine.d.ts +26 -0
  54. package/dist/utils/experimentEngine.js +41 -0
  55. package/dist/utils/findingEngine.d.ts +2 -1
  56. package/dist/utils/findingEngine.js +1 -0
  57. package/dist/utils/gitDiffEngine.d.ts +28 -0
  58. package/dist/utils/gitDiffEngine.js +109 -0
  59. package/dist/utils/opportunityEngine.d.ts +19 -0
  60. package/dist/utils/opportunityEngine.js +61 -0
  61. package/dist/utils/projectScanner.d.ts +4 -2
  62. package/dist/utils/projectScanner.js +14 -346
  63. package/dist/utils/sarifExporter.d.ts +64 -0
  64. package/dist/utils/sarifExporter.js +81 -0
  65. package/dist/utils/snapshotEngine.d.ts +3 -1
  66. package/dist/utils/snapshotEngine.js +232 -94
  67. package/package.json +8 -5
package/dist/cli.js ADDED
@@ -0,0 +1,162 @@
1
+ #!/usr/bin/env node
2
+ import * as path from 'path';
3
+ import * as fs from 'fs';
4
+ import { auditProject, checkRegression, createSnapshotTool } from './tools/orchestration.js';
5
+ import { runDifferentialAudit } from './utils/gitDiffEngine.js';
6
+ import { exportFindingsToSarif } from './utils/sarifExporter.js';
7
+ export const EXIT_CODES = {
8
+ PASS: 0,
9
+ REGRESSION: 1,
10
+ CONFIG_ERROR: 2,
11
+ ANALYZER_FAILURE: 3,
12
+ PARTIAL_UNKNOWN: 4
13
+ };
14
+ async function runCli() {
15
+ const args = process.argv.slice(2);
16
+ const command = args[0] || 'audit';
17
+ const getArg = (flag, alias) => {
18
+ let idx = args.indexOf(flag);
19
+ if (idx === -1 && alias)
20
+ idx = args.indexOf(alias);
21
+ return idx !== -1 && args[idx + 1] ? args[idx + 1] : undefined;
22
+ };
23
+ const projectDir = getArg('--project', '-p') || '.';
24
+ const baseUrl = getArg('--base-url', '-u');
25
+ const baselinePath = getArg('--baseline', '-b');
26
+ const outPath = getArg('--output', '-o');
27
+ const baseRef = getArg('--base-ref') || 'HEAD~1';
28
+ const format = (getArg('--format', '-f') || 'pretty').toLowerCase();
29
+ try {
30
+ switch (command) {
31
+ case 'audit': {
32
+ const result = await auditProject(projectDir, baseUrl);
33
+ if (format === 'sarif') {
34
+ const sarif = exportFindingsToSarif(result.topPriorityFindings, projectDir);
35
+ const serialized = JSON.stringify(sarif, null, 2);
36
+ if (outPath) {
37
+ fs.writeFileSync(path.resolve(outPath), serialized, 'utf-8');
38
+ console.error(`SARIF report written to ${outPath}`);
39
+ }
40
+ else {
41
+ console.log(serialized);
42
+ }
43
+ }
44
+ else if (format === 'json') {
45
+ const serialized = JSON.stringify(result, null, 2);
46
+ if (outPath) {
47
+ fs.writeFileSync(path.resolve(outPath), serialized, 'utf-8');
48
+ console.error(`JSON audit written to ${outPath}`);
49
+ }
50
+ else {
51
+ console.log(serialized);
52
+ }
53
+ }
54
+ else {
55
+ // Pretty format
56
+ console.log(`\nšŸš€ SEO Gravity CLI (v1.2.0) — SEO Infrastructure Layer\n`);
57
+ console.log(`Auditing project at: ${path.resolve(projectDir)}...`);
58
+ console.log(`\n========================================`);
59
+ console.log(`Framework: ${result.framework.name} (${result.framework.framework})`);
60
+ console.log(`Overall Health Score: ${result.scores.overallHealth}/100 (Confidence: ${result.scores.overallConfidence})`);
61
+ console.log(`Discovered Routes: ${result.routesSummary.totalDiscovered} (${result.routesSummary.dynamicRoutesCount} dynamic)`);
62
+ console.log(`Total Findings: ${result.totalFindingsCount}`);
63
+ console.log(`========================================\n`);
64
+ console.log(`Scores Breakdown:`);
65
+ console.log(`- Technical: ${result.scores.technical.score}/100 (${result.scores.technical.state})`);
66
+ console.log(`- Content: ${result.scores.content.score}/100 (${result.scores.content.state})`);
67
+ console.log(`- Discoverability: ${result.scores.discoverability.score}/100 (${result.scores.discoverability.state})`);
68
+ console.log(`- AI Readiness: ${result.scores.aiReadiness.score}/100 (${result.scores.aiReadiness.state})`);
69
+ console.log(`- Entity: ${result.scores.entity.score}/100 (${result.scores.entity.state})\n`);
70
+ if (result.topPriorityFindings.length > 0) {
71
+ console.log(`Top Priority Findings:`);
72
+ for (const f of result.topPriorityFindings.slice(0, 5)) {
73
+ console.log(` [${f.severity.toUpperCase()}] ${f.title} (Priority: ${f.priorityScore}) -> ${f.affectedUrl}`);
74
+ }
75
+ }
76
+ console.log(`\nAction: ${result.recommendedImmediateAction}\n`);
77
+ if (outPath) {
78
+ fs.writeFileSync(path.resolve(outPath), JSON.stringify(result, null, 2), 'utf-8');
79
+ console.log(`Audit saved to ${outPath}`);
80
+ }
81
+ }
82
+ process.exit(EXIT_CODES.PASS);
83
+ break;
84
+ }
85
+ case 'snapshot': {
86
+ const snap = await createSnapshotTool(projectDir, baseUrl, outPath || 'seo-snapshot.json');
87
+ if (format === 'json') {
88
+ console.log(JSON.stringify(snap.snapshot, null, 2));
89
+ }
90
+ else {
91
+ console.log(`\nšŸš€ SEO Gravity CLI (v1.2.0)\n`);
92
+ console.log(`āœ… Snapshot created and saved to: ${snap.savedToPath}`);
93
+ console.log(`Score: ${snap.snapshot.scores.overallHealth}/100 | Invariants: ${snap.snapshot.invariants?.length || 0}`);
94
+ }
95
+ process.exit(EXIT_CODES.PASS);
96
+ break;
97
+ }
98
+ case 'check': {
99
+ if (!baselinePath) {
100
+ console.error('āŒ Configuration Error: --baseline <path_to_snapshot.json> is required for check command.');
101
+ process.exit(EXIT_CODES.CONFIG_ERROR);
102
+ }
103
+ const checkRes = await checkRegression(projectDir, baselinePath, baseUrl);
104
+ if (format === 'sarif') {
105
+ const sarif = exportFindingsToSarif(checkRes.regressionReport.newRegressions, projectDir);
106
+ const serialized = JSON.stringify(sarif, null, 2);
107
+ if (outPath)
108
+ fs.writeFileSync(path.resolve(outPath), serialized, 'utf-8');
109
+ else
110
+ console.log(serialized);
111
+ }
112
+ else if (format === 'json') {
113
+ const serialized = JSON.stringify(checkRes, null, 2);
114
+ if (outPath)
115
+ fs.writeFileSync(path.resolve(outPath), serialized, 'utf-8');
116
+ else
117
+ console.log(serialized);
118
+ }
119
+ else {
120
+ console.log(`\nšŸš€ SEO Gravity CI Regression Check\n`);
121
+ console.log(checkRes.verdict);
122
+ console.log(`Resolved: ${checkRes.regressionReport.totalResolvedCount} | Regressions: ${checkRes.regressionReport.totalNewRegressionsCount}\n`);
123
+ if (checkRes.regressionReport.alerts.length > 0) {
124
+ console.log(`Alerts:`);
125
+ for (const a of checkRes.regressionReport.alerts) {
126
+ console.log(` ${a}`);
127
+ }
128
+ }
129
+ }
130
+ process.exit(checkRes.pass ? EXIT_CODES.PASS : EXIT_CODES.REGRESSION);
131
+ break;
132
+ }
133
+ case 'diff': {
134
+ const diffRes = await runDifferentialAudit(projectDir, baseRef, baseUrl);
135
+ if (format === 'json') {
136
+ console.log(JSON.stringify(diffRes, null, 2));
137
+ }
138
+ else {
139
+ console.log(`\nšŸš€ SEO Gravity Git Differential Audit\n`);
140
+ console.log(diffRes.summary);
141
+ if (diffRes.targetedFindings.length > 0) {
142
+ console.log(`\nTargeted Findings on Changed Routes:`);
143
+ for (const f of diffRes.targetedFindings) {
144
+ console.log(` [${f.severity.toUpperCase()}] ${f.title} -> ${f.affectedUrl}`);
145
+ }
146
+ }
147
+ }
148
+ process.exit(diffRes.regressionDetected ? EXIT_CODES.REGRESSION : EXIT_CODES.PASS);
149
+ break;
150
+ }
151
+ default:
152
+ console.error(`Unknown command: ${command}`);
153
+ console.error(`Available commands: audit, snapshot, check, diff`);
154
+ process.exit(EXIT_CODES.CONFIG_ERROR);
155
+ }
156
+ }
157
+ catch (err) {
158
+ console.error('Fatal CLI Analyzer Error:', err.message);
159
+ process.exit(EXIT_CODES.ANALYZER_FAILURE);
160
+ }
161
+ }
162
+ runCli();
package/dist/index.d.ts CHANGED
@@ -1,2 +1,4 @@
1
1
  #!/usr/bin/env node
2
- export {};
2
+ export * from './server/types.js';
3
+ export * from './server/registry.js';
4
+ export * from './server/server.js';