From fbad9471b3e10ae3b08b26c74de1f9c45170b34c Mon Sep 17 00:00:00 2001 From: Nik Richers Date: Thu, 5 Feb 2026 11:29:58 -0800 Subject: [PATCH 1/8] Migrate docs automation to skills repo - Update README to point to validmind/skills for the documentation skill - Add installation instructions for Cursor Settings import - Remove local .mdc rule file (now lives in validmind/skills) [sc-14457] Co-authored-by: Cursor --- .cursor/rules/create-user-documentation.mdc | 430 -------------------- README.md | 22 +- 2 files changed, 16 insertions(+), 436 deletions(-) delete mode 100644 .cursor/rules/create-user-documentation.mdc diff --git a/.cursor/rules/create-user-documentation.mdc b/.cursor/rules/create-user-documentation.mdc deleted file mode 100644 index bffdc64b83..0000000000 --- a/.cursor/rules/create-user-documentation.mdc +++ /dev/null @@ -1,430 +0,0 @@ ---- -description: Generate or update user documentation for ValidMind software features -globs: - - "site/**/*.qmd" - - "site/**/*.yaml" - - "site/**/*.yml" -alwaysApply: false ---- - -# Create User Documentation - -Use this rule when creating new or updating existing user documentation for ValidMind software features. - -## Rules vs Skills - -This is a **Cursor Rule** (`.mdc` file), not a "skill": - -- **Rules** are file-based instructions that activate automatically based on glob patterns or can be invoked by the agent. They live in `.cursor/rules/` and provide context-aware guidance. -- **Skills** is a term sometimes used for prompt templates or reusable instructions, but Cursor's native mechanism is rules. - -This rule activates when you're working on `.qmd`, `.yaml`, or `.yml` files under `site/` and provides documentation standards and workflow guidance. - ---- - -## Workflow - -### 1. Gather Context from Typical Inputs - -Documentation updates typically start with these inputs from the writer: - -#### Shortcut Context (Primary Source) -The writer provides Shortcut story/epic IDs or links. Use these to gather: -- `stories-get-by-id` — Full story details, acceptance criteria, description -- `epics-get-by-id` — Epic overview for larger features -- `stories-search` — Find related stories in the same epic or with similar labels - -**Always check for parent epic:** When given a story ID, check if it belongs to an epic (`epic_id` field in the story). If so, fetch the epic with `epics-get-by-id` — epics often contain: -- Broader feature context and goals -- Links to backend/frontend GitHub PRs -- Related stories that may affect documentation -- Overall acceptance criteria beyond the individual story - -**Extract from Shortcut:** -- Feature requirements and acceptance criteria -- User-facing behavior descriptions -- Edge cases and limitations -- Related stories for cross-references -- GitHub PR links (often found in epic or story descriptions/comments) - -#### Backend/Frontend PRs (Implementation Details) -The writer provides PR numbers or links. Use these to understand what changed: -- `get_pull_request` — PR description, context, reviewer comments -- `get_pull_request_files` — List of changed files -- `get_file_contents` — Read specific implementation files if needed - -**Extract from PRs:** -- Actual UI changes and new fields/buttons -- API changes or new endpoints -- Configuration options -- Implementation notes from PR description - -#### Screenshots from Demos -The writer attaches screenshots showing the feature in action. Use these to: -- Verify UI element names and locations -- Understand the user flow -- Identify what needs visual documentation -- Confirm the feature matches Shortcut acceptance criteria - -#### Writer's Notes -The writer provides human context such as: -- Draft content or bullet points -- Specific sections to focus on -- Questions to address -- Audience considerations -- Links to existing docs that need updating - -#### Notion (Optional — Feature Specs) -If available, the writer may provide Notion links to feature specs: -- `notion-fetch` — Retrieve full page content -- Look for: detailed requirements, UI mockups, stakeholder context - -### 2. Choose the Appropriate Template - -Templates are available in `internal/templates/`. Choose based on content type: - -#### Task Template (`internal/templates/task.qmd`) -Step-by-step instructions for completing a specific action. -- Use for: "How to configure X", "Setting up Y", "Managing Z" -- Structure: Prerequisites → Steps → Troubleshooting → What's next -- **Title convention:** Start with a verb, nouns in plural (e.g., "Register models in the inventory") - -#### Concept Template (`internal/templates/concept.qmd`) -Understanding a feature or system. -- Use for: "What is X?", "How X works", "Understanding Y" -- Structure: Introduction → Key concepts → Examples → What's next -- **Title convention:** Nouns only, end with `-overview` if introducing a product area - -#### Reference Template (`internal/templates/reference.qmd`) -Technical specifications or API details. -- Use for: Field descriptions, configuration options, API endpoints -- Structure: Sections → Subsections → Additional Resources -- **Note:** Only use if content cannot be generated programmatically - -#### Other Templates -- `mermaid-diagrams.qmd` — For process flows and diagrams -- `tachyons-flexbox.qmd` — For responsive column layouts -- `single-source/` — For content shared between guides and training - ---- - -## Style Guide Reference - -Follow the ValidMind style guide at `site/about/contributing/style-guide/`. Key principles: - -### Voice and Tone (`voice-and-tone.qmd`) - -**Human-first approach:** -- Use **active voice** — "You'll need to review" not "The content will be reviewed by you" -- Use **common language** — Define acronyms on first use -- **Break it down** — Bulleted lists, visual aids, digestible parts - -**Inclusive and welcoming:** -- Show empathy, acknowledge user frustrations -- Focus on solutions, not problems -- Use bias-free communication -- Provide alt text for images - -**Conversational but professional:** -- Address reader directly (second person: "you") -- Use contractions where appropriate -- Avoid stiff formality - -### Conventions (`conventions.qmd`) - -**American English** spelling and grammar. - -**Titles:** -- Task titles: Start with verb, nouns in plural ("Register models in the inventory") -- Parent tasks: Use gerund ("Working with the model inventory") -- Reference titles: Name only, or end with "reference" - -**Formatting:** - -| Element | Format | Example | -|---------|--------|---------| -| UI elements (interactive) | Bold | **{{< fa cubes >}} Inventory** | -| Statuses/roles | Bubble class | `[Status Name]{.bubble}` | -| First use of terms | Italics | *Uncertainty* is defined as... | -| Code/params/files | Backticks | `.env` file, `classifier_full_suite` | -| Smallcaps UI | Smallcaps class | `[model status]{.smallcaps}` | - -**UI element bolding:** -- Bold UI elements only when the user must interact with them directly in a numbered step (e.g., "Click **Settings**"). -- Do not bold UI elements when mentioned descriptively (e.g., "tasks appear under the Tasks tab"). - -**List punctuation:** -- End list items with a period if the item contains a verb. -- List items that are noun phrases only (no verb) do not need a period. - -**Callouts:** -```markdown -::: {.callout title="Note or tip"} -Supplemental information. -::: - -::: {.callout-important title="Warning"} -Critical information or caveats. -::: -``` - -**Links:** -- Always use `.qmd` extension, not `.html` -- Use absolute paths from site root: `/guide/feature/page.qmd` -- Use margin footnotes instead of inline links in instructional text -- Use variables for product names: `{{< var validmind.platform >}}` - -**Footnotes (at end of file):** -```markdown - - -[^1]: [Register models in the inventory](/guide/model-inventory/register-models-in-inventory.qmd) - -[^2]: [Manage permissions](/guide/configuration/manage-permissions.qmd) -``` - -**Screenshots:** -```markdown -![Description](image.png){fig-alt="Detailed alt text" .screenshot} -``` - -**Responsive columns (use Tachyons, NOT CSS Grid):** -```markdown -:::: {.flex .flex-wrap .justify-around} - -::: {.w-50-ns} -Column 1 -::: - -::: {.w-50-ns} -Column 2 -::: - -:::: -``` - ---- - -## Required File Structure - -### YAML Header (Required) -```yaml ---- -# 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 -title: "Title in Sentence Case" -date: last-modified ---- -``` - -### Opening Paragraph -- One sentence describing what the page covers and why it matters -- No heading before this paragraph - -### Prerequisites Block (for tasks) -```markdown -::: {.attn} - -## Prerequisites - -- [x] {{< var link.login >}} -- [x] Additional prerequisite -- [x] Required role or permission[^1] - -::: -``` - ---- - -## Navigation Updates - -When creating new pages, update the appropriate navigation file: - -- **Sidebar navigation:** `site/guide/_sidebar.yaml`, `site/get-started/_sidebar.yaml`, etc. -- **Main config:** `site/_quarto.yml` for top-level pages -- **Listing pages:** Parent `.qmd` files with `listing:` YAML for grid layouts - -**Always add aliases when moving/renaming files:** -```yaml -aliases: - - /old/path/to/page.html -``` - ---- - -## Review Checklist - -Before finalizing: -- [ ] Copyright header present -- [ ] Title follows sentence case and naming conventions -- [ ] Prerequisites listed (for tasks) -- [ ] Steps are numbered and actionable -- [ ] UI elements are bolded with Font Awesome icons -- [ ] Links use `.qmd` extension and absolute paths -- [ ] Images have descriptive alt text and `.screenshot` class -- [ ] Footnotes for cross-references (not inline links) -- [ ] American English spelling -- [ ] Active voice throughout -- [ ] Page added to navigation (`_sidebar.yaml` or `_quarto.yml`) - ---- - -## Example Prompts - -**Creating new documentation:** -> "Create documentation for the new attestation feature. Here's the Notion spec: [URL]. The Shortcut epic is #1234." - -**Updating existing documentation:** -> "Update the model registration docs to include the new bulk import feature from PR #567." - -**From scratch with context:** -> "I need to document how users configure webhook notifications. I'll provide screenshots and the Shortcut story has acceptance criteria." - ---- - -## Training Materials (Revealjs) - -Training courses use a different format and style. Templates are in `site/training/training-templates/`. - -### Course Structure - -Each course lives in its own subdirectory: `/training/course-name/` - -A course consists of: -1. **Course registration page** (`course-registration.qmd`) — Overview and sign-up -2. **Course slides** (`course-slides.qmd`) — Revealjs presentation - -### Course Registration Template (`training-templates/course-registration.qmd`) - -```yaml ---- -title: "Course Title" -subtitle: For {{< var vm.product >}} -listing: - - id: modules - type: grid - contents: - # IMPORTANT: Use .html path for revealjs output - - path: course-slides.html - title: "Module Title" - subtitle: "Module 1" - description: "{{< fa check >}} Learning point 1
{{< fa check >}} Learning point 2" - reading-time: "30" ---- -``` - -### Course Slides Template (`training-templates/course-slides.qmd`) - -**YAML Header:** -```yaml ---- -title: "Module Title" -subtitle: "Course Name — Module # of #" -lightbox: true -format: - revealjs: - include-in-header: - - text: | - - theme: [default, ../assets/slides.scss] - slide-number: true - footer: "{{< var validmind.training >}} | [Home {{< fa person-walking-dashed-line-arrow-right >}}](/training/training.qmd)" - revealjs-plugins: - - slideover - html: - output-file: _course-slides.html - search: false -title-slide-attributes: - data-background-color: "#083E44" - data-background-image: "../assets/home-hero.svg" ---- -``` - -### Training-Specific Conventions - -**Links:** Use inline links (not footnotes) — footnotes don't display in presentation mode. - -**Section Headers:** Use background colors/images for major sections: -```markdown -# Section Title {background-color="#083E44" background-image="/assets/img/about-us-esphere.svg"} -``` - -**Interactive iFrame Embeds:** -```markdown -## {background-iframe="https://app.prod.validmind.ai/" data-preload="yes"} - -:::: {.slideover--r} -Right-aligned modal content over the live platform. -:::: -``` - -**Slideover Positions:** -- `.slideover--r` — Right-aligned -- `.slideover--l` — Left-aligned -- `.slideover--t` — Top-aligned -- `.slideover--b` — Bottom-aligned - -**Slideover Options:** -- `.auto-collapse` — Auto-collapse after 5 seconds -- `.auto-collapse-10` — Auto-collapse after 10 seconds -- `.three-quarters`, `.half`, `.third` — Width options - -**Scrollable Content:** -```markdown -## {.scrollable} - -:::: {.columns} -::: {.column width="30%"} -Summary content -::: - -::: {.column width="70%" .bl .pl4} -Detailed instructions (scrollable) -::: -:::: -``` - -**Embed Callout (within slideovers):** -```markdown -::: {.embed} -Important information styled as a nested callout. -::: -``` - -**Learning Objectives Format:** -```markdown -# Learning objectives {.center} - -_"As a {{ role }} who ... {{< var vm.product >}}, I want to learn how to {{ task A }}, {{ task B }}, and {{ task C }}."_ -``` - -**Summary Slide Format:** -```markdown -In this module, you learned how to: - -- [x] Task 1 -- [x] Task 2 -- [x] Task 3 -``` - ---- - -## MCP Tool Reference - -### Notion -- `notion-search` — Find pages/databases by keyword -- `notion-fetch` — Get full page content by URL or ID - -### Shortcut -- `stories-search` — Find stories by various filters -- `stories-get-by-id` — Get full story details -- `epics-get-by-id` — Get epic details -- `iterations-get-active` — Current sprint context - -### GitHub -- `list_pull_requests` — Find PRs by state/branch -- `get_pull_request` — Full PR details -- `get_pull_request_files` — Changed files in PR -- `list_commits` — Recent commits -- `get_file_contents` — Read specific files diff --git a/README.md b/README.md index cacece26aa..8af3da0e65 100644 --- a/README.md +++ b/README.md @@ -40,16 +40,24 @@ 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. +If you use [Cursor](https://cursor.sh), we have a skill at [validmind/skills](https://github.com/validmind/skills) that helps generate and update documentation by pulling context from multiple sources. + +#### Installation + +1. Open **Cursor Settings** (Cmd+Shift+J on Mac, Ctrl+Shift+J on Windows/Linux) +2. Navigate to **Rules** +3. Click **Add Rule** in the Project Rules section +4. Select **Remote Rule (Github)** +5. Enter the repository URL: `https://github.com/validmind/skills` #### Setup -The rule requires MCP (Model Context Protocol) servers configured in your `~/.cursor/mcp.json`: +The skill 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 +- **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. @@ -63,17 +71,19 @@ 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. From c12d6950a2c2d621db0d6ec49404e121524218d1 Mon Sep 17 00:00:00 2001 From: Nik Richers Date: Thu, 5 Feb 2026 11:51:18 -0800 Subject: [PATCH 2/8] Update .gitignore to ignore local rules & skills --- .gitignore | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/.gitignore b/.gitignore index 7bd12fef76..de8667d222 100644 --- a/.gitignore +++ b/.gitignore @@ -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/ \ No newline at end of file From 932eb7e47dffe83d893aa7c05d09e81a10caf45c Mon Sep 17 00:00:00 2001 From: Nik Richers Date: Fri, 6 Feb 2026 11:11:57 -0800 Subject: [PATCH 3/8] Add GitLab example, edits --- .../integrations/configure-connections.qmd | 9 ++- .../integrations-examples-gitlab.png | Bin 0 -> 92252 bytes .../integrations/integrations-examples.qmd | 61 +++++++++++++++++- 3 files changed, 64 insertions(+), 6 deletions(-) create mode 100644 site/guide/integrations/integrations-examples-gitlab.png diff --git a/site/guide/integrations/configure-connections.qmd b/site/guide/integrations/configure-connections.qmd index 587b3b88b1..230216cf1f 100644 --- a/site/guide/integrations/configure-connections.qmd +++ b/site/guide/integrations/configure-connections.qmd @@ -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 diff --git a/site/guide/integrations/integrations-examples-gitlab.png b/site/guide/integrations/integrations-examples-gitlab.png new file mode 100644 index 0000000000000000000000000000000000000000..ccc332dab62a17d0ee89640b6b73ac60cba7c188 GIT binary patch literal 92252 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

fd5$M73m3k2ssnlZXfj2Tj>m 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 literal 0 HcmV?d00001 diff --git a/site/guide/integrations/integrations-examples.qmd b/site/guide/integrations/integrations-examples.qmd index 3bec221b61..1bc9ebd66f 100644 --- a/site/guide/integrations/integrations-examples.qmd +++ b/site/guide/integrations/integrations-examples.qmd @@ -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} @@ -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**. + [^1]: [Manage permissions](/guide/configuration/manage-permissions.qmd) @@ -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) \ No newline at end of file +[^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) \ No newline at end of file From 79fe84630cf8ce282bad7301381e082513de34e3 Mon Sep 17 00:00:00 2001 From: Beck <164545837+validbeck@users.noreply.github.com> Date: Fri, 6 Feb 2026 13:09:42 -0800 Subject: [PATCH 4/8] notebook / code samples: Auto-updating sidebar script (#1148) * Auto-updating sidebar script * Updating developer/_sidebar.yaml with updated script --- site/Makefile | 2 + site/developer/_sidebar.yaml | 22 ++++- site/scripts/update_code_samples_sidebar.py | 94 +++++++++++++++++++++ 3 files changed, 117 insertions(+), 1 deletion(-) create mode 100644 site/scripts/update_code_samples_sidebar.py diff --git a/site/Makefile b/site/Makefile index d46f551947..d944db545f 100644 --- a/site/Makefile +++ b/site/Makefile @@ -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 diff --git a/site/developer/_sidebar.yaml b/site/developer/_sidebar.yaml index 3cbeea5b45..3b1680ea69 100644 --- a/site/developer/_sidebar.yaml +++ b/site/developer/_sidebar.yaml @@ -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 >}}" diff --git a/site/scripts/update_code_samples_sidebar.py b/site/scripts/update_code_samples_sidebar.py new file mode 100644 index 0000000000..c9d31fa5d3 --- /dev/null +++ b/site/scripts/update_code_samples_sidebar.py @@ -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() From 58982aa7b344010e17c31bf448af21a2e01df623 Mon Sep 17 00:00:00 2001 From: Nik Richers Date: Fri, 6 Feb 2026 16:17:25 -0800 Subject: [PATCH 5/8] Apply suggestion from @validbeck Co-authored-by: Beck <164545837+validbeck@users.noreply.github.com> --- README.md | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 8af3da0e65..e1e547949c 100644 --- a/README.md +++ b/README.md @@ -42,7 +42,9 @@ If you are creating a pull request, test your changes by rendering or previewing ### Using the Cursor documentation skill -If you use [Cursor](https://cursor.sh), we have a skill at [validmind/skills](https://github.com/validmind/skills) that helps generate and update documentation by pulling context from multiple sources. +If you use [Cursor](https://cursor.sh), [validmind/skills](https://github.com/validmind/skills) will help you author content. + +The [`create-user-documentation`](https://github.com/validmind/skills/tree/main/create-user-documentation) skill assists with generating and updating documentation by pulling context from multiple sources. #### Installation From 5bb6b3ec4a04516da70cbb8dcb99766d2f390b09 Mon Sep 17 00:00:00 2001 From: Nik Richers Date: Fri, 6 Feb 2026 16:22:04 -0800 Subject: [PATCH 6/8] Delete skill from repo --- .../skills/create-user-documentation/SKILL.md | 417 ------------------ 1 file changed, 417 deletions(-) delete mode 100644 .cursor/skills/create-user-documentation/SKILL.md diff --git a/.cursor/skills/create-user-documentation/SKILL.md b/.cursor/skills/create-user-documentation/SKILL.md deleted file mode 100644 index 249cf53102..0000000000 --- a/.cursor/skills/create-user-documentation/SKILL.md +++ /dev/null @@ -1,417 +0,0 @@ ---- -name: create-user-documentation -description: Generate or update user documentation for ValidMind software features. Use when creating .qmd files, updating docs based on Shortcut stories/epics, or following ValidMind style conventions. ---- - -# Create User Documentation - -Use this skill when creating new or updating existing user documentation for ValidMind software features. - ---- - -## Workflow - -### 1. Gather Context from Typical Inputs - -Documentation updates typically start with these inputs from the writer: - -#### Shortcut Context (Primary Source) -The writer provides Shortcut story/epic IDs or links. Use these to gather: -- `stories-get-by-id` — Full story details, acceptance criteria, description -- `epics-get-by-id` — Epic overview for larger features -- `stories-search` — Find related stories in the same epic or with similar labels - -**Always check for parent epic:** When given a story ID, check if it belongs to an epic (`epic_id` field in the story). If so, fetch the epic with `epics-get-by-id` — epics often contain: -- Broader feature context and goals -- Links to backend/frontend GitHub PRs -- Related stories that may affect documentation -- Overall acceptance criteria beyond the individual story - -**Extract from Shortcut:** -- Feature requirements and acceptance criteria -- User-facing behavior descriptions -- Edge cases and limitations -- Related stories for cross-references -- GitHub PR links (often found in epic or story descriptions/comments) - -#### Backend/Frontend PRs (Implementation Details) -The writer provides PR numbers or links. Use these to understand what changed: -- `get_pull_request` — PR description, context, reviewer comments -- `get_pull_request_files` — List of changed files -- `get_file_contents` — Read specific implementation files if needed - -**Extract from PRs:** -- Actual UI changes and new fields/buttons -- API changes or new endpoints -- Configuration options -- Implementation notes from PR description - -#### Screenshots from Demos -The writer attaches screenshots showing the feature in action. Use these to: -- Verify UI element names and locations -- Understand the user flow -- Identify what needs visual documentation -- Confirm the feature matches Shortcut acceptance criteria - -#### Writer's Notes -The writer provides human context such as: -- Draft content or bullet points -- Specific sections to focus on -- Questions to address -- Audience considerations -- Links to existing docs that need updating - -#### Notion (Optional — Feature Specs) -If available, the writer may provide Notion links to feature specs: -- `notion-fetch` — Retrieve full page content -- Look for: detailed requirements, UI mockups, stakeholder context - -### 2. Choose the Appropriate Template - -Templates are available in `internal/templates/`. Choose based on content type: - -#### Task Template (`internal/templates/task.qmd`) -Step-by-step instructions for completing a specific action. -- Use for: "How to configure X", "Setting up Y", "Managing Z" -- Structure: Prerequisites → Steps → Troubleshooting → What's next -- **Title convention:** Start with a verb, nouns in plural (e.g., "Register models in the inventory") - -#### Concept Template (`internal/templates/concept.qmd`) -Understanding a feature or system. -- Use for: "What is X?", "How X works", "Understanding Y" -- Structure: Introduction → Key concepts → Examples → What's next -- **Title convention:** Nouns only, end with `-overview` if introducing a product area - -#### Reference Template (`internal/templates/reference.qmd`) -Technical specifications or API details. -- Use for: Field descriptions, configuration options, API endpoints -- Structure: Sections → Subsections → Additional Resources -- **Note:** Only use if content cannot be generated programmatically - -#### Other Templates -- `mermaid-diagrams.qmd` — For process flows and diagrams -- `tachyons-flexbox.qmd` — For responsive column layouts -- `single-source/` — For content shared between guides and training - ---- - -## Style Guide Reference - -Follow the ValidMind style guide at `site/about/contributing/style-guide/` in the documentation repo. Key principles summarized below — refer to the full guide for details. - -### Voice and Tone - -**Human-first approach:** -- Use **active voice** — "You'll need to review" not "The content will be reviewed by you" -- Use **common language** — Define acronyms on first use -- **Break it down** — Bulleted lists, visual aids, digestible parts - -**Inclusive and welcoming:** -- Show empathy, acknowledge user frustrations -- Focus on solutions, not problems -- Use bias-free communication -- Provide alt text for images - -**Conversational but professional:** -- Address reader directly (second person: "you") -- Use contractions where appropriate -- Avoid stiff formality - -### Conventions - -**American English** spelling and grammar. - -**Titles:** -- Task titles: Start with verb, nouns in plural ("Register models in the inventory") -- Parent tasks: Use gerund ("Working with the model inventory") -- Reference titles: Name only, or end with "reference" - -**Formatting:** - -| Element | Format | Example | -|---------|--------|---------| -| UI elements (interactive) | Bold | **{{< fa cubes >}} Inventory** | -| Statuses/roles | Bubble class | `[Status Name]{.bubble}` | -| First use of terms | Italics | *Uncertainty* is defined as... | -| Code/params/files | Backticks | `.env` file, `classifier_full_suite` | -| Smallcaps UI | Smallcaps class | `[model status]{.smallcaps}` | - -**UI element bolding:** -- Bold UI elements only when the user must interact with them directly in a numbered step (e.g., "Click **Settings**"). -- Do not bold UI elements when mentioned descriptively (e.g., "tasks appear under the Tasks tab"). - -**List punctuation:** -- End list items with a period if the item contains a verb. -- List items that are noun phrases only (no verb) do not need a period. - -**Callouts:** -```markdown -::: {.callout title="Note or tip"} -Supplemental information. -::: - -::: {.callout-important title="Warning"} -Critical information or caveats. -::: -``` - -**Links:** -- Always use `.qmd` extension, not `.html` -- Use absolute paths from site root: `/guide/feature/page.qmd` -- Use margin footnotes instead of inline links in instructional text -- Use variables for product names: `{{< var validmind.platform >}}` - -**Footnotes (at end of file):** -```markdown - - -[^1]: [Register models in the inventory](/guide/model-inventory/register-models-in-inventory.qmd) - -[^2]: [Manage permissions](/guide/configuration/manage-permissions.qmd) -``` - -**Screenshots:** -```markdown -![Description](image.png){fig-alt="Detailed alt text" .screenshot} -``` - -**Responsive columns (use Tachyons, NOT CSS Grid):** -```markdown -:::: {.flex .flex-wrap .justify-around} - -::: {.w-50-ns} -Column 1 -::: - -::: {.w-50-ns} -Column 2 -::: - -:::: -``` - ---- - -## Required File Structure - -### YAML Header (Required) -```yaml ---- -# 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 -title: "Title in Sentence Case" -date: last-modified ---- -``` - -### Opening Paragraph -- One sentence describing what the page covers and why it matters -- No heading before this paragraph - -### Prerequisites Block (for tasks) -```markdown -::: {.attn} - -## Prerequisites - -- [x] {{< var link.login >}} -- [x] Additional prerequisite -- [x] Required role or permission[^1] - -::: -``` - ---- - -## Navigation Updates - -When creating new pages, update the appropriate navigation file: - -- **Sidebar navigation:** `site/guide/_sidebar.yaml`, `site/get-started/_sidebar.yaml`, etc. -- **Main config:** `site/_quarto.yml` for top-level pages -- **Listing pages:** Parent `.qmd` files with `listing:` YAML for grid layouts - -**Always add aliases when moving/renaming files:** -```yaml -aliases: - - /old/path/to/page.html -``` - ---- - -## Review Checklist - -Before finalizing: -- [ ] Copyright header present -- [ ] Title follows sentence case and naming conventions -- [ ] Prerequisites listed (for tasks) -- [ ] Steps are numbered and actionable -- [ ] UI elements are bolded with Font Awesome icons -- [ ] Links use `.qmd` extension and absolute paths -- [ ] Images have descriptive alt text and `.screenshot` class -- [ ] Footnotes for cross-references (not inline links) -- [ ] American English spelling -- [ ] Active voice throughout -- [ ] Page added to navigation (`_sidebar.yaml` or `_quarto.yml`) - ---- - -## Example Prompts - -**Creating new documentation:** -> "Create documentation for the new attestation feature. Here's the Notion spec: [URL]. The Shortcut epic is #1234." - -**Updating existing documentation:** -> "Update the model registration docs to include the new bulk import feature from PR #567." - -**From scratch with context:** -> "I need to document how users configure webhook notifications. I'll provide screenshots and the Shortcut story has acceptance criteria." - ---- - -## Training Materials (Revealjs) - -Training courses use a different format and style. Templates are in `site/training/training-templates/`. - -### Course Structure - -Each course lives in its own subdirectory: `/training/course-name/` - -A course consists of: -1. **Course registration page** (`course-registration.qmd`) — Overview and sign-up -2. **Course slides** (`course-slides.qmd`) — Revealjs presentation - -### Course Registration Template (`training-templates/course-registration.qmd`) - -```yaml ---- -title: "Course Title" -subtitle: For {{< var vm.product >}} -listing: - - id: modules - type: grid - contents: - # IMPORTANT: Use .html path for revealjs output - - path: course-slides.html - title: "Module Title" - subtitle: "Module 1" - description: "{{< fa check >}} Learning point 1
{{< fa check >}} Learning point 2" - reading-time: "30" ---- -``` - -### Course Slides Template (`training-templates/course-slides.qmd`) - -**YAML Header:** -```yaml ---- -title: "Module Title" -subtitle: "Course Name — Module # of #" -lightbox: true -format: - revealjs: - include-in-header: - - text: | - - theme: [default, ../assets/slides.scss] - slide-number: true - footer: "{{< var validmind.training >}} | [Home {{< fa person-walking-dashed-line-arrow-right >}}](/training/training.qmd)" - revealjs-plugins: - - slideover - html: - output-file: _course-slides.html - search: false -title-slide-attributes: - data-background-color: "#083E44" - data-background-image: "../assets/home-hero.svg" ---- -``` - -### Training-Specific Conventions - -**Links:** Use inline links (not footnotes) — footnotes don't display in presentation mode. - -**Section Headers:** Use background colors/images for major sections: -```markdown -# Section Title {background-color="#083E44" background-image="/assets/img/about-us-esphere.svg"} -``` - -**Interactive iFrame Embeds:** -```markdown -## {background-iframe="https://app.prod.validmind.ai/" data-preload="yes"} - -:::: {.slideover--r} -Right-aligned modal content over the live platform. -:::: -``` - -**Slideover Positions:** -- `.slideover--r` — Right-aligned -- `.slideover--l` — Left-aligned -- `.slideover--t` — Top-aligned -- `.slideover--b` — Bottom-aligned - -**Slideover Options:** -- `.auto-collapse` — Auto-collapse after 5 seconds -- `.auto-collapse-10` — Auto-collapse after 10 seconds -- `.three-quarters`, `.half`, `.third` — Width options - -**Scrollable Content:** -```markdown -## {.scrollable} - -:::: {.columns} -::: {.column width="30%"} -Summary content -::: - -::: {.column width="70%" .bl .pl4} -Detailed instructions (scrollable) -::: -:::: -``` - -**Embed Callout (within slideovers):** -```markdown -::: {.embed} -Important information styled as a nested callout. -::: -``` - -**Learning Objectives Format:** -```markdown -# Learning objectives {.center} - -_"As a {{ role }} who ... {{< var vm.product >}}, I want to learn how to {{ task A }}, {{ task B }}, and {{ task C }}."_ -``` - -**Summary Slide Format:** -```markdown -In this module, you learned how to: - -- [x] Task 1 -- [x] Task 2 -- [x] Task 3 -``` - ---- - -## MCP Tool Reference - -### Notion -- `notion-search` — Find pages/databases by keyword -- `notion-fetch` — Get full page content by URL or ID - -### Shortcut -- `stories-search` — Find stories by various filters -- `stories-get-by-id` — Get full story details -- `epics-get-by-id` — Get epic details -- `iterations-get-active` — Current sprint context - -### GitHub -- `list_pull_requests` — Find PRs by state/branch -- `get_pull_request` — Full PR details -- `get_pull_request_files` — Changed files in PR -- `list_commits` — Recent commits -- `get_file_contents` — Read specific files From de71de5c4fe686305e83485d0ddbba535418d47d Mon Sep 17 00:00:00 2001 From: Nik Richers Date: Fri, 6 Feb 2026 16:22:32 -0800 Subject: [PATCH 7/8] Apply suggestion from @validbeck Co-authored-by: Beck <164545837+validbeck@users.noreply.github.com> --- README.md | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/README.md b/README.md index e1e547949c..448b19b3fe 100644 --- a/README.md +++ b/README.md @@ -45,7 +45,13 @@ If you are creating a pull request, test your changes by rendering or previewing If you use [Cursor](https://cursor.sh), [validmind/skills](https://github.com/validmind/skills) will help you author content. The [`create-user-documentation`](https://github.com/validmind/skills/tree/main/create-user-documentation) skill assists with generating and updating documentation by pulling context from multiple sources. +#### Prerequisties +Make sure you have the Skills repo cloned locally under your ValidMind directory: + +```bash +gh repo clone validmind/skills +``` #### Installation 1. Open **Cursor Settings** (Cmd+Shift+J on Mac, Ctrl+Shift+J on Windows/Linux) From 1d8276188cee88848d9b1b43945d1de4b4700309 Mon Sep 17 00:00:00 2001 From: Nik Richers Date: Fri, 6 Feb 2026 16:28:33 -0800 Subject: [PATCH 8/8] Remove skills installation instructions, add to prerequisites --- README.md | 33 ++------------------------------- 1 file changed, 2 insertions(+), 31 deletions(-) diff --git a/README.md b/README.md index 448b19b3fe..f87db708af 100644 --- a/README.md +++ b/README.md @@ -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 @@ -42,37 +43,7 @@ If you are creating a pull request, test your changes by rendering or previewing ### Using the Cursor documentation skill -If you use [Cursor](https://cursor.sh), [validmind/skills](https://github.com/validmind/skills) will help you author content. - -The [`create-user-documentation`](https://github.com/validmind/skills/tree/main/create-user-documentation) skill assists with generating and updating documentation by pulling context from multiple sources. -#### Prerequisties - -Make sure you have the Skills repo cloned locally under your ValidMind directory: - -```bash -gh repo clone validmind/skills -``` -#### Installation - -1. Open **Cursor Settings** (Cmd+Shift+J on Mac, Ctrl+Shift+J on Windows/Linux) -2. Navigate to **Rules** -3. Click **Add Rule** in the Project Rules section -4. Select **Remote Rule (Github)** -5. Enter the repository URL: `https://github.com/validmind/skills` - -#### Setup - -The skill 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.