Conversation
☁️ Cloudflare Worker Preview Deployed!🔗 https://ks-fix-301-orchestration-plugin-l-docs.kestra-io.workers.dev 🔦 Lighthouse Benchmark
Scores (0–100, higher is better)
Core Web Vitals (lower is better)
Legend🟢 improved · 🔻 regressed · (blank) no significant change Median of repeated runs: Home x5, About Us x3, Docs Landing x5, Flow (full featured docs) x3, Plugins Landing x3, Blueprints Landing x3. A single run of these swings 20+ points between runners. View full Lighthouse HTML report for a pageFull per-page Lighthouse Results (LHR) are attached as the |
iitzIrFan
left a comment
There was a problem hiding this comment.
Verified locally against the branch on a dev server: all 38 /orchestration/<slug> pages now render a docs-card link that returns 200 with no redirect. The five formerly broken ones (duckdb, postgres, snowflake, sql-server, microsoft-fabric) resolve to plugin-jdbc-duckdb, plugin-jdbc-postgres, plugin-jdbc-snowflake, plugin-jdbc-sqlserver and plugin-microsoft-fabric. Terraform, gemini and netbox are unchanged, and the old guesses /plugins/plugin-jdbc and /plugins/plugin-microsoft still 301, so the premise holds.
This is "PR 2" of #5611. Could you add Part of #5611 to the description? Parts 1 and 3 are still open, so it should not close the issue.
Two nits and one suggestion inline. None blocking.
FYI, unrelated to this change: docker.yaml declares io.kestra.plugin.docker.Build, which the catalog no longer has (it is io.kestra.plugin.docker.cli.Build now). Docker is the one page that hits the fallback branch. The link still works, so I will file it separately.
| // Resolve the plugin group page from the catalog: guessing `plugin-<segment>` | ||
| // from the class name yields `/plugins/plugin-jdbc` for `io.kestra.plugin.jdbc.duckdb.Query`, | ||
| // a page that only 301s to the /plugins index (the artifact is `plugin-jdbc-duckdb`). | ||
| const canonicalTaskUrl = (await buildTaskUrls([tool.pluginClass]))[tool.pluginClass] |
There was a problem hiding this comment.
nit: this line is not formatted per the repo's prettier config. main is clean, so this PR introduces the drift. CI only runs oxlint and astro check, which is why it passed. npm run format wraps it.
| : pluginParts.length > 3 | ||
| ? `/plugins/plugin-${pluginParts[3]}` | ||
| : null | ||
| const pluginDocsUrl = canonicalTaskUrl?.startsWith("/plugins/") |
There was a problem hiding this comment.
nit: canonicalPluginUrl only ever yields /plugins/... paths, so this guard is redundant. A plain canonicalTaskUrl ? ... : fallback reads the same.
More broadly, the repo keeps plugin URL logic in src/utils/plugins/ with unit tests, and canonicalUrl.ts already has canonicalPluginPath computing exactly the plugin page path. A small buildPluginPageUrls(classes) next to buildTaskUrls would keep this split/slice/join out of the page and give it a test. Happy to leave as is for a one-line fix.
| ? `/plugins/plugin-${pluginParts[3]}` | ||
| : null | ||
| const pluginDocsUrl = canonicalTaskUrl?.startsWith("/plugins/") | ||
| ? canonicalTaskUrl.split("/").slice(0, 3).join("/") |
There was a problem hiding this comment.
suggestion: slice(0, 3) drops the subgroup segment. 22 of the 38 tools live in multi-subgroup plugins, so BigQuery, Pub/Sub, GCS, Dataproc and Vertex AI all land on the generic /plugins/plugin-gcp root, while the catalog gives /plugins/plugin-gcp/google-cloud-bigquery, which resolves 200. Dropping only the last segment instead would link each tool to its most specific page for free:
canonicalTaskUrl.split("/").slice(0, -1).join("/")Not a regression versus main, so your call on whether the plugin root is the intended landing page.
/orchestration/<slug>guessed the plugin docs link as/plugins/plugin-<4th class segment>, which gives/plugins/plugin-jdbcforio.kestra.plugin.jdbc.duckdb.Queryand/plugins/plugin-microsoftfor the Fabric class. Neither is a page: both 301 to the/pluginsindex (5 links in the 16 Sept crawl: duckdb, postgres, snowflake, sql-server, microsoft-fabric).The link is now derived from the catalog through
buildTaskUrls(group segment of the element's canonical URL), with the previous guess kept as fallback when the class is unknown.