Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
18 commits
Select commit Hold shift + click to select a range
fbad947
Migrate docs automation to skills repo
nrichers Feb 5, 2026
c12d695
Update .gitignore to ignore local rules & skills
nrichers Feb 5, 2026
932eb7e
Add GitLab example, edits
nrichers Feb 6, 2026
3e17e12
Merge pull request #1160 from validmind/nrichers/sc-14487/update-gitl…
nrichers Feb 6, 2026
6b34d4a
Merge remote-tracking branch 'origin/main' into staging
github-actions[bot] Feb 6, 2026
1e1de85
Merge pull request #1161 from validmind/update-staging-21763562373
github-actions[bot] Feb 6, 2026
79fe846
notebook / code samples: Auto-updating sidebar script (#1148)
validbeck Feb 6, 2026
2aeb6ca
Merge remote-tracking branch 'origin/main' into staging
github-actions[bot] Feb 6, 2026
540dd02
Merge pull request #1162 from validmind/update-staging-21766000787
github-actions[bot] Feb 6, 2026
58982aa
Apply suggestion from @validbeck
nrichers Feb 7, 2026
a404823
Merge branch 'main' of github.com:validmind/documentation into nriche…
nrichers Feb 7, 2026
5bb6b3e
Delete skill from repo
nrichers Feb 7, 2026
de71de5
Apply suggestion from @validbeck
nrichers Feb 7, 2026
7e86150
Merge branch 'nrichers/sc-14457/migrate-docs-automation-to-skill' of …
nrichers Feb 7, 2026
1d82761
Remove skills installation instructions, add to prerequisites
nrichers Feb 7, 2026
8dd7f98
Merge pull request #1153 from validmind/nrichers/sc-14457/migrate-doc…
nrichers Feb 10, 2026
392e183
Merge remote-tracking branch 'origin/main' into staging
github-actions[bot] Feb 10, 2026
5f3b45f
Merge pull request #1164 from validmind/update-staging-21879932830
github-actions[bot] Feb 10, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
430 changes: 0 additions & 430 deletions .cursor/rules/create-user-documentation.mdc

This file was deleted.

417 changes: 0 additions & 417 deletions .cursor/skills/create-user-documentation/SKILL.md

This file was deleted.

4 changes: 4 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -35,3 +35,7 @@ site/validmind-docs.yaml

# Python API docs are now generated on the fly
site/validmind

# Cursor rules
.cursor/rules/
.cursor/skills/
25 changes: 7 additions & 18 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,7 @@ You need:

- [Quarto CLI](https://quarto.org/docs/get-started/)
- The Quarto extension for your IDE, such as [VS Code](https://marketplace.visualstudio.com/items?itemName=quarto.quarto)
- To use Cursor to author documentation, the [`create-user-documentation`](https://github.com/validmind/skills/tree/main/create-user-documentation) skill
- For Windows operating systems, install the `make` command via [Cygwin](https://cygwin.com/install.html)

### Additional dependencies
Expand All @@ -40,40 +41,28 @@ Some interactive tables, such as our breaking changes and dependency history rel

If you are creating a pull request, test your changes by rendering or previewing the site. Note that if this is your first time contributing, you will be asked to sign a contributor license agreement (CLA).

### Using the Cursor documentation rule
### Using the Cursor documentation skill

If you use [Cursor](https://cursor.sh), we have a rule at `.cursor/rules/create-user-documentation.mdc` that helps generate and update documentation by pulling context from multiple sources.

#### Setup

The rule requires MCP (Model Context Protocol) servers configured in your `~/.cursor/mcp.json`:

- **Shortcut MCP** — For story/epic context and acceptance criteria
- **GitHub MCP** — For PR details and implementation changes
- **Notion MCP** (optional) — For feature specifications

See [Cursor's MCP documentation](https://docs.cursor.com/context/model-context-protocol) for setup instructions.

#### How to use

Start a new Cursor chat and provide your typical inputs:
If you use [Cursor](https://cursor.sh), the [`create-user-documentation`](https://github.com/validmind/skills/tree/main/create-user-documentation) skill helps you author content. Start a new Cursor chat and provide your inputs:

```
Create documentation for the new webhook notifications feature.
The Shortcut story is #1234. I'll attach some screenshots.
```

The rule will guide the AI to:
The skill guides the AI to:
1. Fetch the Shortcut story for requirements and acceptance criteria
2. Look up linked GitHub PRs (Shortcut stories often reference backend/frontend PRs)
3. Use your screenshots to verify UI elements
4. Apply ValidMind style guide conventions
5. Generate documentation using the appropriate template

You can also invoke the skill explicitly by typing `/create-user-documentation` in Agent chat.

#### Tips

- **Provide the epic ID if you have it:** Epics often contain richer context than individual stories — including links to backend/frontend PRs, related stories, and broader feature goals. If you know the epic ID, include it for better results.
- **Finding PRs from Shortcut:** Shortcut stories and epics typically have GitHub PRs linked in descriptions or comments. The AI will automatically look up the parent epic when given a story ID to find these links.
- **Finding PRs from Shortcut:** Shortcut stories and epics typically have GitHub PRs linked in descriptions or comments. The AI automatically looks up the parent epic when given a story ID to find these links.
- **Provide screenshots:** Attach screenshots from demos to help the AI verify UI element names and user flows.
- **Include your notes:** Add bullet points or draft content to guide the output focus.
- **Specify the doc type:** Mention if you need a task (how-to), concept (explanation), or reference doc.
Expand Down
2 changes: 2 additions & 0 deletions site/Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -326,6 +326,8 @@ notebooks:
@rm -rf $(DEST_DIR_NB)/templates
@echo "Copying _metadata.yml into notebooks/ ..."
@cp developer/_metadata.yml $(DEST_DIR_NB)/_metadata.yml
@echo "Updating developer/_sidebar.yaml with code_samples directories ..."
@python scripts/update_code_samples_sidebar.py
@echo "Zip up notebooks.zip ..."
@zip -r notebooks.zip $(DEST_DIR_NB) > /dev/null 2>&1

Expand Down
22 changes: 21 additions & 1 deletion site/developer/_sidebar.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -53,7 +53,27 @@ website:
- text: "Notebooks"
- text: "Code samples"
file: developer/samples-jupyter-notebooks.qmd
contents: "notebooks/code_samples/**"
contents:
- section: "Agents"
contents: "notebooks/code_samples/agents/**"
- section: "Capital markets"
contents: "notebooks/code_samples/capital_markets/**"
- section: "Code explainer"
contents: "notebooks/code_samples/code_explainer/**"
- section: "Credit risk"
contents: "notebooks/code_samples/credit_risk/**"
- section: "Custom tests"
contents: "notebooks/code_samples/custom_tests/**"
- section: "Model validation"
contents: "notebooks/code_samples/model_validation/**"
- section: "NLP and LLM"
contents: "notebooks/code_samples/nlp_and_llm/**"
- section: "Ongoing monitoring"
contents: "notebooks/code_samples/ongoing_monitoring/**"
- section: "Regression"
contents: "notebooks/code_samples/regression/**"
- section: "Time series"
contents: "notebooks/code_samples/time_series/**"
- text: "---"
- text: "Reference"
- text: "{{< var validmind.api >}}"
Expand Down
9 changes: 4 additions & 5 deletions site/guide/integrations/configure-connections.qmd
Original file line number Diff line number Diff line change
Expand Up @@ -108,19 +108,18 @@ Required configuration details:

### GitLab


A DevOps platform that hosts code, runs pipelines, and manages team collaboration.
Synchronize GitLab model registry with ValidMind model inventory for comprehensive model tracking.

Required configuration details:

**[project id]{.smallcaps}**
: The GitLab project or group path that contains the ML repository to sync.
: The GitLab project ID or path containing ML models (required).

**[gitlab instance url]{.smallcaps}** (optional)
: Blank for gitlab.com or the self-hosted URL.
: Leave empty to use GitLab.com, or enter your self-hosted GitLab URL.

**[personal access token]{.smallcaps}**
: A PAT secret that includes the `api` or `read_api` scope.
: Select a secret containing your GitLab Personal Access Token with `api` or `read_api` scope.

### Custom

Expand Down
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
61 changes: 60 additions & 1 deletion site/guide/integrations/integrations-examples.qmd
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@ Adapt these usage examples for your own workflows or connections to interact wit
- [Add webhook step triggers](#add-webhook-step-triggers)
- [Synchronize models with AWS SageMaker](#synchronize-models-with-aws-sagemaker)
- [Synchronize models with AWS Bedrock](#synchronize-models-with-aws-bedrock)
- [Synchronize models with GitLab](#synchronize-models-with-gitlab)

::: {.attn}

Expand Down Expand Up @@ -357,6 +358,62 @@ This builds a complete dependency graph showing how your AI applications relate

9. Click **Link Model**.

### Synchronize models with GitLab

Synchronize GitLab model registry with ValidMind model inventory for comprehensive model tracking.

#### Configure the connection

::: {.column-margin}
![Configure GitLab connection](integrations-examples-gitlab.png){width=80% fig-alt="Screenshot of the Configure GitLab dialog showing fields for integration name, description, project ID, GitLab instance URL, personal access token, and initial status." .screenshot}
:::

1. In the left sidebar, click **{{< fa gear >}} Settings**.

2. Under Integrations, select **Connections**.

3. Click **{{< fa plus >}} Add Connection**.

4. In the modal that opens, select **GitLab**.

5. Complete:

- **[integration name]{.smallcaps}** — How other admins can identify the connection.
- **[description]{.smallcaps}** (optional) — The intended usage or additional details.
- **[project id]{.smallcaps}** — The GitLab project ID or path containing ML models (required).
- **[gitlab instance url]{.smallcaps}** (optional) — Leave empty to use GitLab.com, or enter your self-hosted GitLab URL.
- **[personal access token]{.smallcaps}** — Select a secret containing your GitLab Personal Access Token with `api` or `read_api` scope.
- **[initial status]{.smallcaps}** — Set to `Operational` to enable immediately or `Disabled` if you plan to finish setup later.

6. Click **Save Integration**.

7. Test the connection:

a. Hover over the GitLab connection you just created.
b. When the **{{< fa ellipsis-vertical >}}** menu appears, click on it and select **{{< fa circle-check >}} Test Connection**.

If the test is successful, the message **{{< fa check-circle >}} Connection successful** displays.

#### Link the models

1. In the left sidebar, click **{{< fa cubes >}} Inventory**.

2. Select a model by clicking on it or find your model by applying a filter or searching for it.[^15]

3. Scroll down until you locate the **GitLab** connection box in the right sidebar.

4. Hover over the GitLab box.

5. When the **{{< fa ellipsis-vertical >}}** menu appears, click on it and select **{{< fa link >}} Link Model**.

6. In the modal that opens, click the [select model]{.smallcaps} dropdown to pick the GitLab model to link.

7. Optional: Click **Test Connection** to ensure the connection is working as expected.

If the test is successful, the message **{{< fa check-circle >}} Connection Test Successful** displays.

8. Click **Link Model**.

<!-- FOOTNOTES -->

[^1]: [Manage permissions](/guide/configuration/manage-permissions.qmd)
Expand Down Expand Up @@ -385,4 +442,6 @@ This builds a complete dependency graph showing how your AI applications relate

[^13]: [Working with the model inventory](/guide/model-inventory/working-with-model-inventory.qmd#search-filter-and-sort-models)

[^14]: [Working with the model inventory](/guide/model-inventory/working-with-model-inventory.qmd#search-filter-and-sort-models)
[^14]: [Working with the model inventory](/guide/model-inventory/working-with-model-inventory.qmd#search-filter-and-sort-models)

[^15]: [Working with the model inventory](/guide/model-inventory/working-with-model-inventory.qmd#search-filter-and-sort-models)
94 changes: 94 additions & 0 deletions site/scripts/update_code_samples_sidebar.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,94 @@
# Copyright © 2023-2026 ValidMind Inc. All rights reserved.
# Refer to the LICENSE file in the root of this repository for details.
# SPDX-License-Identifier: AGPL-3.0 AND ValidMind Commercial
"""
Update developer/_sidebar.yaml so the Code samples entry lists each
subdirectory of notebooks/code_samples/ explicitly (with wildcards),
in alphabetical order, with fixed capitalization for NLP and LLM.

Run from the site/ directory, e.g.:
cd site && python scripts/update_code_samples_sidebar.py
"""

import os
from pathlib import Path


# Display title for directories that need fixed capitalization (e.g. acronyms)
SPECIAL_TITLES = {
"nlp_and_llm": "NLP and LLM",
}


def dir_to_title(dirname: str) -> str:
"""Convert directory name to sidebar display title (sentence-style capitalization)."""
if dirname in SPECIAL_TITLES:
return SPECIAL_TITLES[dirname]
return dirname.replace("_", " ").capitalize()


def main() -> None:
# Run from site/ or repo root
cwd = Path.cwd()
if (cwd / "notebooks" / "code_samples").is_dir():
base = cwd
elif (cwd / "site" / "notebooks" / "code_samples").is_dir():
base = cwd / "site"
else:
raise SystemExit("Run from site/ or repo root (e.g. cd site && python scripts/update_code_samples_sidebar.py)")
code_samples = base / "notebooks" / "code_samples"
sidebar_path = base / "developer" / "_sidebar.yaml"

if not code_samples.is_dir():
raise SystemExit(f"Directory not found: {code_samples}")
if not sidebar_path.is_file():
raise SystemExit(f"Sidebar file not found: {sidebar_path}")

subdirs = sorted(
d for d in os.listdir(code_samples)
if (code_samples / d).is_dir()
)

# Build the new contents block (YAML). Use "section" so Quarto renders
# expandable accordion items; "text" alone does not expand.
lines = [
' contents:',
]
for d in subdirs:
title = dir_to_title(d)
lines.append(f' - section: "{title}"')
lines.append(f' contents: "notebooks/code_samples/{d}/**"')

new_block = "\n".join(lines)

text = sidebar_path.read_text()
# Replace either the single wildcard or an existing expanded block
old_single = ' contents: "notebooks/code_samples/**"'
if old_single in text:
text = text.replace(old_single, new_block, 1)
else:
# Find the code_samples contents block and replace it (multi-line)
import re
# Match from " contents:" through all following lines that are
# " - ..." or " contents: ..." for code_samples
pattern = re.compile(
r'( - text: "Code samples"\n'
r' file: developer/samples-jupyter-notebooks\.qmd\n)'
r' contents:\n'
r'( - (?:text|section): "[^"]+"\n'
r' contents: "notebooks/code_samples/[^"]+\*\*"\n)*',
re.MULTILINE,
)
match = pattern.search(text)
if not match:
raise SystemExit(
"Could not find Code samples contents block in sidebar. "
"Has the sidebar format changed?"
)
text = text[: match.start()] + match.group(1) + new_block + "\n" + text[match.end() :]
sidebar_path.write_text(text)
print(f"Updated {sidebar_path} with {len(subdirs)} code sample directories.")


if __name__ == "__main__":
main()
Loading