diff --git a/config.toml b/config.toml index ed57437b..5b40f217 100644 --- a/config.toml +++ b/config.toml @@ -17,7 +17,7 @@ description = "Foundational tools for omics data in the life sciences" [taxonomies] [outputs] -home = ["html", "rss", "entities"] +home = ["html", "rss", "entities", "llms"] [outputFormats.entities] mediaType = "application/json" @@ -28,6 +28,11 @@ notAlternative = true [markup.goldmark.renderer] unsafe= true +[outputFormats.llms] +mediaType = "text/plain" +baseName = "llms" +isPlainText = true + # The ecosystem registry rebuilds this site when packages.json changes, so a cached copy defeats the trigger. # Hugo caches remote resources forever by default, and on Netlify that cache survives between builds. [caches.getresource] diff --git a/layouts/index.llms.txt b/layouts/index.llms.txt new file mode 100644 index 00000000..768864c0 --- /dev/null +++ b/layouts/index.llms.txt @@ -0,0 +1,82 @@ +# scverse + +> scverse is a consortium of foundational, interoperable open-source tools for single-cell and spatial omics data analysis in the life sciences. + +scverse packages share common data structures (AnnData, MuData, SpatialData) to guarantee interoperability across the ecosystem. +Most package documentation lives on dedicated external sites, linked below. +This site (scverse.org) hosts the package index, tutorials, project governance, events, and the blog. +Every core and community package in the scverse ecosystem registry is listed below, with what it does, how to install it and where its docs live. + +## Core packages + +Foundational packages maintained by the scverse core team. +{{- $registry := partialCached "registry.html" "registry" }} +{{ range $registry.core }} +{{ partial "inline/llms-entry.txt" . }} +{{- end }} + +{{- /* Ecosystem packages get one section per category, biggest first, so an agent can scan straight to its field. */}} +{{- $eco := where $registry.pkgs "category" "ecosystem" }} +{{- $categories := slice }} +{{- range $eco }} + {{- if not (in $categories .primary_category) }} + {{- $categories = $categories | append .primary_category }} + {{- end }} +{{- end }} +{{- $counts := slice }} +{{- range $categories }} + {{- $counts = $counts | append (dict "name" . "count" (len (where $eco "primary_category" .))) }} +{{- end }} +{{- range sort $counts "count" "desc" }} +{{- $category := .name }} + +## Ecosystem packages: {{ $category }} +{{ range sort (where $eco "primary_category" $category) "name" }} +{{ partial "inline/llms-entry.txt" . }} +{{- end }} +{{- end }} + +## Learn +- [Tutorials]({{ absURL "learn/" }}): Getting-started tutorials for the core packages. +- [Package index]({{ absURL "packages/" }}): All core and ecosystem packages with links to docs, source, and distribution. +- [Package registry (JSON)]({{ $registry.base }}packages.json): Machine-readable list of every core and ecosystem package, with docs, install names, tags and implementations in other languages. +- [Single-cell best practices](https://www.sc-best-practices.org/): Community book on best practices for single-cell analysis. + +## About +- [Mission]({{ absURL "about/mission/" }}): What scverse is and why it exists. +- [Roles and governance]({{ absURL "about/roles/" }}): Core team, steering council, and how the project is run. +- [Code of conduct]({{ absURL "about/code_of_conduct/" }}): Community standards for participation. +- [AI policy]({{ absURL "about/ai_policy/" }}): Expectations for contributing AI-assisted code to scverse projects. + +## Community +- [GitHub](https://github.com/scverse): Source code for all scverse packages. +- [Discourse](https://discourse.scverse.org/): User forum for questions and discussion. +- [Zulip](https://scverse.zulipchat.com/): Developer chat. +- [Ecosystem packages](https://github.com/scverse/ecosystem-packages): Community packages built on scverse standards, and inclusion criteria. +- [cookiecutter-scverse](https://cookiecutter-scverse-instance.readthedocs.io/en/latest/): Project template for creating new scverse-compatible packages. + +## Optional +- [Blog]({{ absURL "blog/" }}): Announcements and release notes. +- [Events]({{ absURL "events/" }}): Conferences and hackathons. +- [People]({{ absURL "people/" }}): Contributors and core team. +- [YouTube](https://www.youtube.com/channel/UCpsvsIAW3R5OdftJKKuLNMA): Recorded talks and workshops. + +{{- define "_partials/inline/llms-entry.txt" }} +{{- /* Registry descriptions carry markdown and hard line breaks; llms.txt wants one line each. */}} +{{- $desc := trim (.description | markdownify | plainify | htmlUnescape | replaceRE `\s+` " ") " ." }} +{{- $install := "" }} +{{- with .install }} + {{- if .pypi }}{{ $install = printf "pip install %s" .pypi }} + {{- else if .conda }}{{ $channel := split .conda "::" }}{{ $install = printf "conda install -c %s %s" (index $channel 0) (index $channel 1) }} + {{- else if .bioconductor }}{{ $install = printf `BiocManager::install("%s")` .bioconductor }} + {{- else if .cran }}{{ $install = printf `install.packages("%s")` .cran }} + {{- end }} +{{- end -}} +- [{{ .name }}]({{ .documentation_home | default .project_home }}){{ if ne .language "Python" }} ({{ .language }}){{ end }}: {{ with .blurb }}{{ . }}. {{ end }}{{ $desc }}. +{{- with $install }} Install: `{{ . }}`.{{ end }} +{{- with .tutorials_home }}{{ if ne (strings.TrimSuffix "/" .) (strings.TrimSuffix "/" ($.documentation_home | default "")) }} Tutorials: {{ . }}.{{ end }}{{ end }} +{{- with .bindings }} Other languages: + {{- range $i, $b := . }}{{ if $i }},{{ end }} [{{ $b.name }}]({{ $b.url }}) ({{ $b.language }}){{ end }}. +{{- end }} +{{- with .tags }} Tags: {{ delimit . ", " }}.{{ end }} +{{- end }}