Commit b1a65ae
audit: BreadcrumbList, robots policy, og:title, sitemap priorities (#832)
* fix(robots): nuanced AI bot policy — allow search, block training
Adopt the Speedscale / Katalon / Testsigma split:
- Allow AI SEARCH bots (drive answer visibility): OAI-SearchBot,
ChatGPT-User, Claude-SearchBot, Claude-User, PerplexityBot,
Perplexity-User, Gemini-Deep-Research, GoogleOther, Applebot,
DuckAssistBot, Amazonbot.
- Block TRAINING-ONLY bots: GPTBot, ClaudeBot, anthropic-ai, CCBot,
Google-Extended, Applebot-Extended, Meta-ExternalAgent, FacebookBot,
cohere-ai, Diffbot, Omgilibot, ImagesiftBot.
- Keep Bytespider blocked.
Also add belt-and-braces Disallow for unmaintained legacy doc versions
(/docs/1.0.0/, /docs/2.0.0/, /docs/3.0.0/) to reinforce existing
noindex+canonical signals for crawlers that ignore them.
Reopens Task 52 per user direction 2026-04-14. Mirrors the corresponding
policy change on landing and blog-website robots.txt.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Signed-off-by: Neha Gupta <gneha21@yahoo.in>
* fix(docs): emit BreadcrumbList schema even when sidebar trail is null
LIVE-20. Live audit of /docs/concepts/reference/glossary/idempotency/
on 2026-04-14 showed @type schema blocks Article, ImageObject,
Organization, WebPage — and no BreadcrumbList. The /docs/ root,
by contrast, has BreadcrumbList. This is the specific glossary-page
regression that Task 13 was meant to catch but didn't.
Root cause: the DocBreadcrumbs component had an early `return null`
when useSidebarBreadcrumbs() returned null/undefined, which suppresses
both the visual breadcrumb UI AND the JSON-LD schema emission. For
deep glossary pages whose sidebar context resolves to null, this
meant zero BreadcrumbList — the regression.
Changes:
- Replace `if (!breadcrumbs) return null` with a safe fallback to
an empty sidebarTrail array. Schema emission + Home/Docs items
run unconditionally.
- Only render the visual <nav> when sidebarTrail has entries
(avoids showing an empty breadcrumb UI on schema-only pages).
- Propagate the sidebarTrail rename through the visual render path.
Verify after deploy:
curl -s https://keploy.io/docs/concepts/reference/glossary/idempotency/ | \
grep -c '"@type":"BreadcrumbList"'
# expected: 1 (was 0)
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Signed-off-by: Neha Gupta <gneha21@yahoo.in>
* fix(robots): apply legacy-version disallows inside AI-search allow group
Per the robots.txt spec, a bot that matches a named User-agent group reads
rules only from that group — it does not fall through to User-agent: *.
So the Disallow: /docs/{1,2,3}.0.0/ lines under User-agent: * were silently
inapplicable to PerplexityBot/Applebot/OAI-SearchBot/etc., meaning those
bots were still crawling the unmaintained legacy versions despite the
noindex/canonical/global block combo.
Consolidate the 11 AI search bot allow groups into a single block using
multiple User-agent headers, and add the three legacy-version Disallow
lines inside it so the intent — "allow AI search bots everywhere except
legacy versions" — is actually enforced. No semantic change to training
bots, Bytespider, or the * fallback group.
Signed-off-by: nehagup <15074229+nehagup@users.noreply.github.com>
* fix(docs): LIVE-12 per-page og:title, LIVE-13 hub Article suppression, Task 35 sitemap priorities
Three docs-side fixes bundled.
LIVE-12 — per-page og:title / twitter:title
Previously every docs page rendered with og:title "Keploy Documentation"
because the title inherited from docusaurus.config.js's site-level
`title` field. Social share cards on LinkedIn / Slack / X therefore
all showed the same generic headline regardless of which glossary /
concept / quickstart page was shared.
Fix: emit <meta property="og:title" content={title}> and
<meta name="twitter:title" content={title}> in the swizzled DocItem
Head component, pulling from the per-page metadata.title that the
<title> tag already uses. Also adds og:description / twitter:description
so preview cards carry the page-specific description. No site-level
config change required.
LIVE-13 — suppress Article schema on /docs/ landing and category indexes
The /docs/ root was shipping Article JSON-LD even though it is a hub
page with no single author, no single publication date, and no single
headline — a type mismatch that AI models may flag as noise.
Fix: compute `suppressArticleSchema` from permalink / frontmatter and
short-circuit the articleSchema construction when the page is the /docs/
root or a category index. The DocBreadcrumbs JSON-LD continues to emit
normally so hub pages still have navigation signal.
Task 35 — differentiate docs sitemap priorities
Original priority buckets only covered quickstart (0.8), concepts /
keploy-explained (0.7), and keploy-cloud (0.6). Default was 0.5 for
everything else including the high-value /docs/ root and running-keploy
sections.
New bucket structure in createSitemapItems:
1.0 /docs/ root (primary entry point)
0.9 /docs/quickstart/* (highest-intent user flow)
0.8 /docs/running-keploy/* (primary product docs)
0.7 /docs/concepts/*, /docs/keploy-explained/*
0.6 /docs/keploy-cloud/*, /docs/ci-cd/*, /docs/faq, /docs/troubleshooting
0.5 /docs/concepts/reference/glossary/* (long-tail, many pages)
Added an explanatory comment inline so the next editor understands
the bucket rationale.
Verify after deploy:
curl -s https://keploy.io/docs/concepts/reference/glossary/idempotency/ | \
grep -oE 'og:title"[^>]*content="[^"]+"'
# expected: "What is Idempotency in REST APIs? Complete Guide"
curl -s https://keploy.io/docs/ | grep -c '"@type":"Article"'
# expected: 0
curl -s https://keploy.io/docs/sitemap.xml | \
python3 -c "import sys,re; \
priorities = re.findall(r'<priority>([0-9.]+)</priority>', sys.stdin.read()); \
print('unique priorities:', sorted(set(priorities)))"
# expected: ['0.5', '0.6', '0.7', '0.8', '0.9', '1.0']
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Signed-off-by: Neha Gupta <gneha21@yahoo.in>
* fix(robots): mirror Crawl-delay + /cgi-bin disallow into AI search group
Copilot review caught that named User-agent groups in robots.txt do
not inherit rules from User-agent: *. The AI-search allow group
(OAI-SearchBot, ChatGPT-User, Claude-SearchBot, Claude-User,
PerplexityBot, Perplexity-User, Gemini-Deep-Research, GoogleOther,
Applebot, DuckAssistBot, Amazonbot) was therefore ignoring both the
global Crawl-delay: 5 limit AND the Disallow: /cgi-bin/ in the
fallback User-agent: * block.
Duplicated both lines into the named group so the same policy
applies: search bots are rate-limited to 5s per request, and they
cannot crawl /cgi-bin/. The legacy-version disallows
(/docs/1.0.0/, /docs/2.0.0/, /docs/3.0.0/) were already duplicated
in this block for the same inheritance reason.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Signed-off-by: Neha Gupta <gneha21@yahoo.in>
* feat(docs): Task 33 — Keploy vs Alternatives comparison page
Live audit + competitor analysis (llms-full.txt for competitors already
has comparison tables, but docs had none). Adds a dedicated comparison
page under /docs/keploy-explained/keploy-vs-alternatives with:
- Feature comparison matrix: Keploy vs Postman, Katalon, WireMock,
Testcontainers across 9 capabilities (test generation model, SDK
requirement, mock generation, non-determinism, secret masking,
CI/CD, license, kernel version).
- Approach differences: plain-language description of each tool's
core abstraction so readers can self-sort.
- When to pick each: decision tree by team profile / API shape.
- Migration paths: concrete steps for moving from Postman or Katalon
to Keploy without throwing away existing work.
- Related reading cross-links to how-keploy-works, integration-testing-faq,
api-testing-faq.
Added to version-4.0.0 sidebar in the Integration Testing → keploy-vs-
alternatives slot, placed between Troubleshooting Guide and FAQs so it
appears in the decision phase of the reader journey.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Signed-off-by: Neha Gupta <gneha21@yahoo.in>
* fix(copilot-review): FAQ + troubleshooting sitemap priority must match actual v4 routes
Addresses Copilot review comment 3080865321 on docs PR #832.
The previous sitemap createSitemapItems callback checked
`url.includes("/faq")` and `url.includes("/troubleshooting")` — neither
of those substrings appears in the actual v4 docs URLs. The FAQ pages
live at:
/docs/keploy-explained/integration-testing-faq/
/docs/keploy-explained/api-testing-faq/
/docs/keploy-explained/unit-testing-faq/
and the troubleshooting guide lives at:
/docs/keploy-explained/common-errors/
(sidebar label: "Troubleshooting Guide"). Because `/faq` never
matched, all three FAQ pages and the troubleshooting guide fell
through to the `/keploy-explained/` rule immediately below and got
priority 0.7, not the intended 0.6.
Fix:
1. Changed the match patterns to `-faq/`, `-faq`, and `/common-errors`
so they match the real URL fragments.
2. Moved the FAQ/troubleshooting check ABOVE the `/keploy-explained/`
check so it takes precedence when a page satisfies both.
3. Updated the header comment block to name the actual pages covered
by the 0.6 bucket.
Signed-off-by: Neha Gupta <gneha21@yahoo.in>
* style: prettier format on audit-touched files
Signed-off-by: nehagup <15074229+nehagup@users.noreply.github.com>
* fix(review): drop keploy-vs-alternatives page + scrub internal ticket refs
Addresses 3 review comments from @nehagup on PR #832.
1. Delete versioned_docs/version-4.0.0/keploy-explained/keploy-vs-alternatives.md
and remove its sidebar entry in version-4.0.0-sidebars.json. The page
was added by the audit batch but the team decided not to ship a public
alternatives comparison inside the docs; keeping it here would publish
product-marketing framing under the docs subtree, which belongs on the
landing site instead if anywhere.
2. Strip internal ticket identifiers from comments across
docusaurus.config.js, src/theme/DocBreadcrumbs/index.js, and
src/theme/DocItem/index.js. Internal audit references like "Task 35",
"LIVE-12", "LIVE-13", "LIVE-20" rot as the task tracker evolves and
leak private process detail into public source. Kept the explanatory
comments that describe *why* each piece of logic exists, just without
the ticket numbers.
DocItem/index.js suppressArticleSchema logic and DocBreadcrumbs
sidebarTrail fallback are left as-is — they are functional fixes that
prevent invalid Article schema on hub pages and missing BreadcrumbList
schema on glossary pages. Reply to @nehagup's "why are we suppressing"
question posted separately on the comment thread.
Signed-off-by: Neha Gupta <gneha21@yahoo.in>
* fix(copilot-review): suppress Article schema on versioned docs roots too
Addresses Copilot comment 3081151415 on PR #832.
The previous suppressArticleSchema check only matched /docs/ as the
docs root, but this site serves versioned hub pages too — /docs/4.0.0/,
/docs/3.0.0/, /docs/2.0.0/, /docs/1.0.0/ — via onlyIncludeVersions and
includeCurrentVersion in docusaurus.config.js. Each versioned root is
also an index of content with no single author/date/headline, so
emitting Article/BlogPosting/APIReference schema on those pages had
the same type-mismatch problem the base case fix was addressing.
Added a regex check for /docs/<digit-starting-version>/ so any current
or archived versioned root is caught by the same suppression path.
Current content pages inside versioned trees (e.g.
/docs/4.0.0/keploy-explained/how-keploy-works/) still emit Article
schema as normal since they have real authors, dates, and headlines —
only the bare versioned roots are suppressed.
Signed-off-by: Neha Gupta <gneha21@yahoo.in>
---------
Signed-off-by: Neha Gupta <gneha21@yahoo.in>
Signed-off-by: nehagup <15074229+nehagup@users.noreply.github.com>
Co-authored-by: Neha Gupta <gneha21@yahoo.in>
Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Co-authored-by: nehagup <15074229+nehagup@users.noreply.github.com>1 parent 12aa3c3 commit b1a65ae
4 files changed
Lines changed: 220 additions & 43 deletions
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
449 | 449 | | |
450 | 450 | | |
451 | 451 | | |
| 452 | + | |
| 453 | + | |
| 454 | + | |
| 455 | + | |
| 456 | + | |
| 457 | + | |
| 458 | + | |
| 459 | + | |
| 460 | + | |
| 461 | + | |
| 462 | + | |
| 463 | + | |
| 464 | + | |
| 465 | + | |
452 | 466 | | |
453 | 467 | | |
454 | 468 | | |
455 | 469 | | |
456 | | - | |
| 470 | + | |
| 471 | + | |
| 472 | + | |
| 473 | + | |
| 474 | + | |
| 475 | + | |
| 476 | + | |
| 477 | + | |
| 478 | + | |
| 479 | + | |
457 | 480 | | |
458 | 481 | | |
| 482 | + | |
| 483 | + | |
| 484 | + | |
| 485 | + | |
| 486 | + | |
| 487 | + | |
| 488 | + | |
| 489 | + | |
| 490 | + | |
| 491 | + | |
| 492 | + | |
| 493 | + | |
| 494 | + | |
| 495 | + | |
| 496 | + | |
| 497 | + | |
| 498 | + | |
| 499 | + | |
| 500 | + | |
| 501 | + | |
| 502 | + | |
| 503 | + | |
| 504 | + | |
459 | 505 | | |
460 | | - | |
461 | | - | |
| 506 | + | |
| 507 | + | |
462 | 508 | | |
463 | 509 | | |
464 | 510 | | |
465 | | - | |
| 511 | + | |
466 | 512 | | |
467 | 513 | | |
468 | 514 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
51 | 51 | | |
52 | 52 | | |
53 | 53 | | |
54 | | - | |
55 | | - | |
56 | | - | |
| 54 | + | |
| 55 | + | |
| 56 | + | |
| 57 | + | |
| 58 | + | |
| 59 | + | |
57 | 60 | | |
58 | 61 | | |
59 | 62 | | |
| |||
89 | 92 | | |
90 | 93 | | |
91 | 94 | | |
92 | | - | |
93 | | - | |
94 | | - | |
| 95 | + | |
| 96 | + | |
| 97 | + | |
95 | 98 | | |
96 | 99 | | |
97 | 100 | | |
| |||
130 | 133 | | |
131 | 134 | | |
132 | 135 | | |
133 | | - | |
134 | | - | |
135 | | - | |
136 | | - | |
137 | | - | |
138 | | - | |
139 | | - | |
140 | | - | |
141 | | - | |
142 | | - | |
143 | | - | |
144 | | - | |
145 | | - | |
146 | | - | |
147 | | - | |
148 | | - | |
149 | | - | |
150 | | - | |
151 | | - | |
152 | | - | |
153 | | - | |
154 | | - | |
155 | | - | |
156 | | - | |
157 | | - | |
158 | | - | |
| 136 | + | |
| 137 | + | |
| 138 | + | |
| 139 | + | |
| 140 | + | |
| 141 | + | |
| 142 | + | |
| 143 | + | |
| 144 | + | |
| 145 | + | |
159 | 146 | | |
160 | | - | |
161 | | - | |
| 147 | + | |
| 148 | + | |
| 149 | + | |
| 150 | + | |
| 151 | + | |
| 152 | + | |
| 153 | + | |
| 154 | + | |
| 155 | + | |
| 156 | + | |
| 157 | + | |
| 158 | + | |
| 159 | + | |
| 160 | + | |
| 161 | + | |
| 162 | + | |
| 163 | + | |
| 164 | + | |
| 165 | + | |
| 166 | + | |
162 | 167 | | |
163 | 168 | | |
164 | 169 | | |
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
143 | 143 | | |
144 | 144 | | |
145 | 145 | | |
146 | | - | |
| 146 | + | |
| 147 | + | |
| 148 | + | |
147 | 149 | | |
148 | 150 | | |
149 | 151 | | |
| 152 | + | |
| 153 | + | |
| 154 | + | |
| 155 | + | |
| 156 | + | |
| 157 | + | |
| 158 | + | |
| 159 | + | |
| 160 | + | |
| 161 | + | |
| 162 | + | |
| 163 | + | |
| 164 | + | |
| 165 | + | |
| 166 | + | |
| 167 | + | |
| 168 | + | |
| 169 | + | |
| 170 | + | |
| 171 | + | |
| 172 | + | |
| 173 | + | |
150 | 174 | | |
151 | | - | |
| 175 | + | |
152 | 176 | | |
153 | 177 | | |
154 | 178 | | |
| |||
187 | 211 | | |
188 | 212 | | |
189 | 213 | | |
| 214 | + | |
| 215 | + | |
| 216 | + | |
| 217 | + | |
| 218 | + | |
| 219 | + | |
| 220 | + | |
| 221 | + | |
| 222 | + | |
| 223 | + | |
| 224 | + | |
| 225 | + | |
| 226 | + | |
190 | 227 | | |
191 | 228 | | |
192 | 229 | | |
| |||
288 | 325 | | |
289 | 326 | | |
290 | 327 | | |
291 | | - | |
| 328 | + | |
| 329 | + | |
| 330 | + | |
| 331 | + | |
292 | 332 | | |
293 | 333 | | |
294 | 334 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
1 | | - | |
| 1 | + | |
| 2 | + | |
| 3 | + | |
| 4 | + | |
| 5 | + | |
| 6 | + | |
| 7 | + | |
| 8 | + | |
| 9 | + | |
| 10 | + | |
| 11 | + | |
| 12 | + | |
| 13 | + | |
| 14 | + | |
| 15 | + | |
| 16 | + | |
| 17 | + | |
| 18 | + | |
| 19 | + | |
| 20 | + | |
| 21 | + | |
| 22 | + | |
| 23 | + | |
| 24 | + | |
| 25 | + | |
| 26 | + | |
| 27 | + | |
| 28 | + | |
| 29 | + | |
| 30 | + | |
| 31 | + | |
| 32 | + | |
| 33 | + | |
| 34 | + | |
| 35 | + | |
| 36 | + | |
| 37 | + | |
| 38 | + | |
| 39 | + | |
| 40 | + | |
| 41 | + | |
| 42 | + | |
| 43 | + | |
| 44 | + | |
| 45 | + | |
| 46 | + | |
| 47 | + | |
| 48 | + | |
| 49 | + | |
| 50 | + | |
| 51 | + | |
| 52 | + | |
| 53 | + | |
| 54 | + | |
| 55 | + | |
| 56 | + | |
| 57 | + | |
| 58 | + | |
| 59 | + | |
| 60 | + | |
| 61 | + | |
| 62 | + | |
| 63 | + | |
| 64 | + | |
| 65 | + | |
| 66 | + | |
| 67 | + | |
| 68 | + | |
| 69 | + | |
| 70 | + | |
| 71 | + | |
| 72 | + | |
| 73 | + | |
| 74 | + | |
| 75 | + | |
2 | 76 | | |
3 | 77 | | |
4 | 78 | | |
5 | | - | |
| 79 | + | |
| 80 | + | |
| 81 | + | |
| 82 | + | |
6 | 83 | | |
7 | 84 | | |
8 | 85 | | |
9 | 86 | | |
10 | 87 | | |
| 88 | + | |
| 89 | + | |
| 90 | + | |
| 91 | + | |
| 92 | + | |
| 93 | + | |
| 94 | + | |
11 | 95 | | |
| 96 | + | |
| 97 | + | |
12 | 98 | | |
0 commit comments