diff --git a/internal/templates/yearly-releases.qmd b/internal/templates/yearly-releases.qmd
index 1389be410d..a77c8b2e2a 100644
--- a/internal/templates/yearly-releases.qmd
+++ b/internal/templates/yearly-releases.qmd
@@ -2,6 +2,7 @@
# TITLE-MARKER
title: "0000 Releases"
date: last-modified
+categories: ["releases by year"]
# REMOVE THIS `FALSE` FLAG AFTER YEARLY RELEASES HAVE ALL BEEN GATHERED ONTO THIS LANDING
search: false
listing:
@@ -9,10 +10,10 @@ listing:
- id: 0000-releases
type: grid
max-description-length: 250
- sort: false
- fields: [title, description]
+ sort: "date desc"
+ fields: [title, subtitle, description]
contents:
-# RELEASE-FILES-MARKER
+ - ./**/**.qmd
---
diff --git a/release-scripts/generate-release-notes.ipynb b/release-scripts/generate-release-notes.ipynb
index 1158fb9951..69a2d29009 100644
--- a/release-scripts/generate-release-notes.ipynb
+++ b/release-scripts/generate-release-notes.ipynb
@@ -30,6 +30,7 @@
" - [Create categories from labels](#toc2_3_) \n",
" - [Collect GitHub URLs](#toc2_4_) \n",
" - [Set the release date](#toc2_5_) \n",
+ " - [Define the unified version](#toc2_6_) \n",
"- [Extracting PR information](#toc3_) \n",
" - [Create release folder and file](#toc3_1_) \n",
" - [Add the date to release notes ](#toc3_2_) \n",
@@ -205,6 +206,26 @@
"gro.original_release_date = gro.release_datetime.strftime(\"%B %-d, %Y\")"
]
},
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "\n",
+ "\n",
+ "### Define the unified version\n",
+ "\n",
+ "This cell will prompt you to enter the unified ValidMind version here associated with the release in accordance with our [customer-managed release versioning conventions](https://github.com/validmind/installation/blob/main/site/installation/Customer-managed-releases.qmd), for example `25.03.06`:"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "unified_version = f\"Unified version `{gro.input_version()}`\""
+ ]
+ },
{
"cell_type": "markdown",
"metadata": {},
@@ -243,7 +264,7 @@
"\n",
"\n",
"### Add the date to release notes \n",
- "This block writes the specified date as the title of the new release notes file.\n",
+ "This block writes the specified date as the title (for display) and date (for listing sorting) of the new release notes file.\n",
"\n",
"**It will also open up the newly created `release-notes.qmd` file for you so you don't have to go looking for it.**"
]
@@ -254,7 +275,7 @@
"metadata": {},
"outputs": [],
"source": [
- "gro.create_release_qmd(output_file, gro.original_release_date)"
+ "gro.create_release_qmd(output_file, gro.original_release_date, gro.release_datetime.strftime(\"%Y-%m-%d\"), unified_version)"
]
},
{
@@ -558,7 +579,7 @@
"\n",
"\n",
"### Update sidebar \n",
- "This block will go into our `_quarto.yml` file and add the new release notes so it shows up on the sidebar of the docsite under the \"About\" section. "
+ "This block will go into our releases `_sidebar.yaml` file and add the new release notes so it shows up on the sidenav of the docsite under the \"Releases\" section. "
]
},
{
@@ -567,7 +588,7 @@
"metadata": {},
"outputs": [],
"source": [
- "gro.update_quarto_yaml(gro.release_datetime, year)"
+ "gro.update_release_sidebar(gro.release_datetime, year)"
]
},
{
diff --git a/release-scripts/generate_release_objects.py b/release-scripts/generate_release_objects.py
index b67ade140a..e30deea054 100644
--- a/release-scripts/generate_release_objects.py
+++ b/release-scripts/generate_release_objects.py
@@ -431,6 +431,27 @@ def get_release_date():
print("Invalid date format, please try again using the format Month Day, Year (e.g., January 1, 2020)")
return get_release_date()
+
+unified_version = ""
+
+def input_version():
+ """Prompts the user to enter a version number in one of the formats:
+ 00.00.00, 00.00.0, or 00.00
+
+ Returns:
+ str: The validated version string.
+ """
+ import re
+ version_pattern = re.compile(r"^\d{2}\.\d{2}(\.\d{1,2})?$")
+
+ while True:
+ version_input = input("Enter the version number (format: 00.00.00, 00.00.0, or 00.00): ")
+ if version_pattern.match(version_input):
+ print(f"Unified version: {version_input}\n")
+ return version_input
+ else:
+ print("Invalid version format. Please use one of the following: 00.00.00, 00.00.0, or 00.00")
+
def create_release_folder(formatted_release_date):
"""
Creates a directory for the release notes based on the provided release date
@@ -462,18 +483,26 @@ def create_release_folder(formatted_release_date):
return output_file, year
-def create_release_qmd(output_file, original_release_date):
+def create_release_qmd(output_file, original_release_date, release_date_iso, unified_version):
"""
- Writes metadata to a file with a title set to the original release date.
+ Writes metadata to a file with a title set to the original release date,
+ and includes the release date in ISO format as the date field.
Args:
output_file (str): The path to the file to write.
original_release_date (str): The title to include in the metadata.
+ release_date_iso (str): The date in YYYY-MM-DD format for metadata.
"""
- print(f"{original_release_date} added to {output_file} as title")
+ print(f"- {original_release_date} added to {output_file} as title")
+ print(f" {release_date_iso} added to {output_file} as date")
+ print(f" {unified_version} added to {output_file} as subtitle")
with open(output_file, "w") as file:
- file.write(f"---\ntitle: \"{original_release_date}\"\n---\n\n")
+ file.write(f"---\n")
+ file.write(f"title: \"{original_release_date}\"\n")
+ file.write(f"date: {release_date_iso}\n")
+ file.write(f"subtitle: \"{unified_version}\"\n")
+ file.write(f"---\n\n")
try:
subprocess.run(["code", output_file], check=True)
@@ -733,16 +762,65 @@ def upgrade_info(output_file):
except Exception as e:
print(f"Failed to include _how-to-upgrade.qmd to {output_file}: {e}")
-def update_quarto_yaml(release_date, year):
- """Updates the _quarto.yml file to include the release notes file so it can be accessed on the website.
+# def update_quarto_yaml(release_date, year):
+# """Updates the _quarto.yml file to include the release notes file so it can be accessed on the website.
+
+# Params:
+# release_date - release notes use the release date as the file name.
+
+# Modifies:
+# _quarto.yml file
+# """
+# yaml_filename = "../site/_quarto.yml"
+
+# # Format the release date for insertion into the YAML file
+# formatted_release_date = release_date.strftime("%Y-%b-%d").lower()
+# target_line = f' - releases/{year}/{formatted_release_date}/release-notes.qmd\n'
+
+# # Check if the target line already exists in the YAML file
+# with open(yaml_filename, 'r') as file:
+# if target_line in file.readlines():
+# print(f"Release notes for {formatted_release_date} already exist in {yaml_filename}, skipping update")
+# return
+
+# temp_yaml_filename = "../site/_quarto_temp.yml"
+
+# # Copy the original YAML file to a temporary file
+# shutil.copyfile(yaml_filename, temp_yaml_filename)
+
+# with open(temp_yaml_filename, 'r') as file:
+# lines = file.readlines()
+
+# with open(yaml_filename, 'w') as file:
+# add_release_content = False
+# insert_index = -1
+
+# for i, line in enumerate(lines):
+# file.write(line)
+# if line.strip() == "# MAKE-RELEASE-NOTES-EMBED-MARKER":
+# add_release_content = True
+# insert_index = i
+
+# if add_release_content and i == insert_index:
+# file.write(target_line)
+# add_release_content = False
+
+# # Remove the temporary file
+# os.remove(temp_yaml_filename)
+
+# print(f"Added new release notes to _quarto.yml, line {insert_index + 2}")
+
+def update_release_sidebar(release_date, year):
+ """Updates the releases _sidebar.yaml file to include the new yearly release folder.
Params:
- release_date - release notes use the release date as the file name.
+ year - the year to be used for the folder.
Modifies:
- _quarto.yml file
+ ~/site/releases/_sidebar.yaml file
"""
- yaml_filename = "../site/_quarto.yml"
+ yaml_filename = "../site/releases/_sidebar.yaml"
+ temp_yaml_filename = "../site/releases/_sidebar_temp.yaml"
# Format the release date for insertion into the YAML file
formatted_release_date = release_date.strftime("%Y-%b-%d").lower()
@@ -754,8 +832,6 @@ def update_quarto_yaml(release_date, year):
print(f"Release notes for {formatted_release_date} already exist in {yaml_filename}, skipping update")
return
- temp_yaml_filename = "../site/_quarto_temp.yml"
-
# Copy the original YAML file to a temporary file
shutil.copyfile(yaml_filename, temp_yaml_filename)
@@ -779,7 +855,7 @@ def update_quarto_yaml(release_date, year):
# Remove the temporary file
os.remove(temp_yaml_filename)
- print(f"Added new release notes to _quarto.yml, line {insert_index + 2}")
+ print(f"Added new release notes to releases _sidebar.yaml, line {insert_index + 2}")
def update_index_qmd(release_date, year):
"""Updates the index.qmd file to include the new releases in `Latest Releases` and removes the oldest release from the list.
@@ -897,8 +973,11 @@ def main():
Calls all the same functions as the generate-release-notes.ipynb when you run make release-notes.
"""
try:
+ from dotenv import load_dotenv
+
env_location = get_env_location()
setup_openai_api(env_location)
+ load_dotenv(dotenv_path=env_location)
print()
label_hierarchy = ["highlight", "enhancement", "breaking-change", "deprecation", "bug", "documentation"]
@@ -916,13 +995,17 @@ def main():
original_release_date = release_datetime.strftime("%B %-d, %Y")
print()
+ unified_version = ""
+ # Declare and initialize unified_version so it's available globally
+ unified_version = f"Unified version `{input_version()}`"
+
# Handle potential failure in create_release_folder
output_file, year = create_release_folder(formatted_release_date)
if not output_file: # Ensure the function returns something valid
raise RuntimeError("Failed to create release folder.")
print()
- create_release_qmd(output_file, original_release_date)
+ create_release_qmd(output_file, original_release_date, release_datetime.strftime("%Y-%m-%d"), unified_version)
print()
update_release_components(release_components, categories)
@@ -971,7 +1054,10 @@ def main():
upgrade_info(output_file)
print()
- update_quarto_yaml(release_datetime, year)
+ # update_quarto_yaml(release_datetime, year)
+ # print()
+
+ update_release_sidebar(release_datetime, year)
print()
update_index_qmd(release_datetime, year)
diff --git a/release-scripts/year-end-cleanup.ipynb b/release-scripts/year-end-cleanup.ipynb
index ded1344b87..f48c53b4ec 100644
--- a/release-scripts/year-end-cleanup.ipynb
+++ b/release-scripts/year-end-cleanup.ipynb
@@ -32,8 +32,6 @@
" - [Retrieve the yearly folder](#toc3_1_) \n",
" - [Create yearly listing page](#toc3_2_) \n",
" - [Edit the yearly listing page](#toc3_3_) \n",
- " - [Retrieve yearly release pages](#toc3_4_) \n",
- " - [Add releases to yearly listing page](#toc3_5_) \n",
"- [Updating sidebar and links](#toc4_) \n",
" - [Add yearly release folder to sidebar](#toc4_1_) \n",
" - [Move year end marker](#toc4_2_) \n",
@@ -221,47 +219,6 @@
" yc.update_template(yearly_release, year)"
]
},
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "\n",
- "\n",
- "### Retrieve yearly release pages\n",
- "\n",
- "This cell returns the `release-notes.qmd` filepaths for all the release folders in our matching yearly subdirectory."
- ]
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "metadata": {},
- "outputs": [],
- "source": [
- "release_listings = yc.get_release_listings(yearly_path)"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "\n",
- "\n",
- "### Add releases to yearly listing page \n",
- "\n",
- "Next, we'll insert that year's release pages into the listing for the yearly roundup page sorted by the release dates in descending order (newest first)."
- ]
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "metadata": {},
- "outputs": [],
- "source": [
- "if release_listings:\n",
- " yc.update_listing(yearly_release, release_listings)"
- ]
- },
{
"cell_type": "markdown",
"metadata": {},
@@ -279,7 +236,7 @@
"\n",
"### Add yearly release folder to sidebar \n",
"\n",
- "Now that we've created the yearly listing page, we need to update the sidebar in `_quarto.yml` to accomodate.\n",
+ "Now that we've created the yearly listing page, we need to update the releases `_sidebar.yaml` to accomodate.\n",
"\n",
"**This cell takes all the release filepaths matching our year and shoves them into a `contents:` accordion menu with the new `{year}-.releases.qmd` listing page as the landing page.** \n"
]
@@ -290,7 +247,7 @@
"metadata": {},
"outputs": [],
"source": [
- "yc.update_quarto_yaml(year)"
+ "yc.update_release_sidebar(year)"
]
},
{
diff --git a/release-scripts/yearly_cleanup.py b/release-scripts/yearly_cleanup.py
index 4ba85e5b08..af32e25445 100644
--- a/release-scripts/yearly_cleanup.py
+++ b/release-scripts/yearly_cleanup.py
@@ -227,117 +227,182 @@ def update_template(destination_file, year):
print(f"Failed to update '{destination_file}': {e}")
return False
-release_listings = []
+# release_listings = []
-def get_release_listings(yearly_path):
- """
- Returns moved releases to add to the yearly release listing.
+# def get_release_listings(yearly_path):
+# """
+# Returns moved releases to add to the yearly release listing.
- Args:
- yearly_path (str): The path to the year folder to search within.
+# Args:
+# yearly_path (str): The path to the year folder to search within.
- Returns:
- list: A list of matching subdirectory names, with '/release-notes.qmd' appended to each, sorted by the date in the folder names in descending order.
- """
- global release_listings
- listing_dir = f"{yearly_path}"
+# Returns:
+# list: A list of matching subdirectory names, with '/release-notes.qmd' appended to each, sorted by the date in the folder names in descending order.
+# """
+# global release_listings
+# listing_dir = f"{yearly_path}"
- if not os.path.exists(listing_dir):
- print(f"'{listing_dir}' does not exist")
- release_listings = []
- return release_listings
+# if not os.path.exists(listing_dir):
+# print(f"'{listing_dir}' does not exist")
+# release_listings = []
+# return release_listings
- subdirs = [d for d in os.listdir(listing_dir) if os.path.isdir(os.path.join(listing_dir, d))]
+# subdirs = [d for d in os.listdir(listing_dir) if os.path.isdir(os.path.join(listing_dir, d))]
- if subdirs:
- try:
- # Sort subdirs by parsing the date in the folder names
- subdirs = sorted(
- subdirs,
- key=lambda d: datetime.strptime(d, "%Y-%b-%d"),
- reverse=True
- )
- except ValueError:
- print("Some folder names do not match the expected date format (YYYY-MMM-DD), skipping sorting")
-
- # Append '/release-notes.qmd' to each folder name
- subdirs = [os.path.join(d, 'release-notes.qmd') for d in subdirs]
- print(f"Found {len(subdirs)} release notes in {yearly_path}:\n")
- for note in subdirs:
- print(note)
- else:
- print(f"No folders found in {yearly_path}")
+# if subdirs:
+# try:
+# # Sort subdirs by parsing the date in the folder names
+# subdirs = sorted(
+# subdirs,
+# key=lambda d: datetime.strptime(d, "%Y-%b-%d"),
+# reverse=True
+# )
+# except ValueError:
+# print("Some folder names do not match the expected date format (YYYY-MMM-DD), skipping sorting")
+
+# # Append '/release-notes.qmd' to each folder name
+# subdirs = [os.path.join(d, 'release-notes.qmd') for d in subdirs]
+# print(f"Found {len(subdirs)} release notes in {yearly_path}:\n")
+# for note in subdirs:
+# print(note)
+# else:
+# print(f"No folders found in {yearly_path}")
- release_listings = subdirs
- return release_listings
+# release_listings = subdirs
+# return release_listings
-def update_listing(destination_file, release_listings):
- """
- Updates the destination file by appending the contents of release_listings under the
- '# RELEASE-FILES-MARKER' line if the line directly below it matches '---'.
+# def update_listing(destination_file, release_listings):
+# """
+# Updates the destination file by appending the contents of release_listings under the
+# '# RELEASE-FILES-MARKER' line if the line directly below it matches '---'.
- Args:
- destination_file (str): The path to the file to be updated.
- release_listings (list of str): List of release listing file paths to append.
+# Args:
+# destination_file (str): The path to the file to be updated.
+# release_listings (list of str): List of release listing file paths to append.
- Returns:
- bool: True if the file was updated successfully, False otherwise.
- """
- if not os.path.exists(destination_file):
- print(f"File '{destination_file}' does not exist")
- return False
+# Returns:
+# bool: True if the file was updated successfully, False otherwise.
+# """
+# if not os.path.exists(destination_file):
+# print(f"File '{destination_file}' does not exist")
+# return False
+
+# try:
+# # Read the file content
+# with open(destination_file, 'r') as file:
+# content = file.readlines()
+
+# # Track updated lines
+# edited_lines = []
+
+# # Update the lines
+# updated_content = []
+# release_marker_found = False
+# for i, line in enumerate(content):
+# updated_content.append(line)
+
+# if line.strip() == "# RELEASE-FILES-MARKER":
+# if i + 1 < len(content) and content[i + 1].strip() == "---":
+# release_marker_found = True
+# insertion_index = len(updated_content)
+
+# for listing in release_listings:
+# new_line = f" - {listing}\n"
+# updated_content.append(new_line)
+# edited_lines.append(insertion_index)
+# insertion_index += 1
+
+# if not release_marker_found:
+# print(f"'{destination_file}' already has release listings, please review for accuracy")
+# return False
+
+# # Write the updated content back to the file
+# with open(destination_file, 'w') as file:
+# file.writelines(updated_content)
+
+# print(f"Updated '{destination_file}' with release listings\n\nAdded lines: {edited_lines}")
+# return True
+
+# except Exception as e:
+# print(f"Failed to update '{destination_file}': {e}")
+# return False
+
+# def update_quarto_yaml(year):
+# """Updates the _quarto.yml file to include the new yearly release folder.
- try:
- # Read the file content
- with open(destination_file, 'r') as file:
- content = file.readlines()
+# Params:
+# year - the year to be used for the folder.
+
+# Modifies:
+# _quarto.yml file
+# """
+# yaml_filename = "../site/_quarto.yml"
+# temp_yaml_filename = "../site/_quarto_temp.yml"
- # Track updated lines
- edited_lines = []
+# # Copy the original YAML file to a temporary file
+# shutil.copyfile(yaml_filename, temp_yaml_filename)
- # Update the lines
- updated_content = []
- release_marker_found = False
- for i, line in enumerate(content):
- updated_content.append(line)
+# with open(temp_yaml_filename, 'r') as file:
+# lines = file.readlines()
- if line.strip() == "# RELEASE-FILES-MARKER":
- if i + 1 < len(content) and content[i + 1].strip() == "---":
- release_marker_found = True
- insertion_index = len(updated_content)
+# # Use the year from the parameter
+# release_file = f"releases/{year}/{year}-releases.qmd"
+# year_injected = False
- for listing in release_listings:
- new_line = f" - {listing}\n"
- updated_content.append(new_line)
- edited_lines.append(insertion_index)
- insertion_index += 1
+# with open(yaml_filename, 'w') as file:
+# between_markers = False
+# year_contents = []
- if not release_marker_found:
- print(f"'{destination_file}' already has release listings, please review for accuracy")
- return False
+# for line in lines:
+# if line.strip() == "# MAKE-RELEASE-NOTES-EMBED-MARKER":
+# file.write(line)
+# between_markers = True
+# continue
- # Write the updated content back to the file
- with open(destination_file, 'w') as file:
- file.writelines(updated_content)
+# if line.strip() == "# CURRENT-YEAR-END-MARKER":
+# if year_contents and not year_injected:
+# # Inject the new file entry with correctly indented contents
+# file.write(f" - file: {release_file}\n")
+# file.write(" contents:\n")
+# for content in year_contents:
+# file.write(f" {content.strip()}\n")
+# year_injected = True
+# between_markers = False
+
+# if between_markers:
+# # Collect lines for the specified year
+# if f"releases/{year}/{year}-" in line:
+# year_contents.append(line)
+# else:
+# # Write out lines not belonging to the target year
+# file.write(line)
+# else:
+# file.write(line)
- print(f"Updated '{destination_file}' with release listings\n\nAdded lines: {edited_lines}")
- return True
+# if not year_injected and year_contents:
+# # Ensure the file and contents are added if the section didn't end naturally
+# file.write(f" - file: {release_file}\n")
+# file.write(" contents:\n")
+# for content in year_contents:
+# file.write(f" - {content.strip()}\n")
- except Exception as e:
- print(f"Failed to update '{destination_file}': {e}")
- return False
-
-def update_quarto_yaml(year):
- """Updates the _quarto.yml file to include the new yearly release folder.
+# # Remove the temporary file
+# os.remove(temp_yaml_filename)
+
+# print(f"Added {year} releases folder to the sidebar in _quarto.yml")
+
+
+def update_release_sidebar(year):
+ """Updates the releases _sidebar.yaml file to include the new yearly release folder.
Params:
year - the year to be used for the folder.
Modifies:
- _quarto.yml file
+ ~/site/releases/_sidebar.yaml file
"""
- yaml_filename = "../site/_quarto.yml"
- temp_yaml_filename = "../site/_quarto_temp.yml"
+ yaml_filename = "../site/releases/_sidebar.yaml"
+ temp_yaml_filename = "../site/releases/_sidebar_temp.yaml"
# Copy the original YAML file to a temporary file
shutil.copyfile(yaml_filename, temp_yaml_filename)
@@ -389,22 +454,22 @@ def update_quarto_yaml(year):
# Remove the temporary file
os.remove(temp_yaml_filename)
- print(f"Added {year} releases folder to the sidebar in _quarto.yml")
+ print(f"Added {year} releases folder to the releases _sidebar.yaml")
def move_year_marker(year):
- """Updates the _quarto.yml file to relocate the CURRENT-YEAR-END-MARKER.
+ """Updates the releases _sidebar.yaml file to relocate the CURRENT-YEAR-END-MARKER.
Args:
year (int): The year to search for in the line pattern.
Modifies:
- _quarto.yml file
+ ~/site/releases/_sidebar.yaml
"""
import shutil
import os
- yaml_filename = "../site/_quarto.yml"
- temp_yaml_filename = "../site/_quarto_temp.yml"
+ yaml_filename = "../site/releases/_sidebar.yaml"
+ temp_yaml_filename = "../site/releases/_sidebar_temp.yaml"
# Copy the original YAML file to a temporary file
shutil.copyfile(yaml_filename, temp_yaml_filename)
@@ -446,7 +511,7 @@ def move_year_marker(year):
os.remove(temp_yaml_filename)
if marker_removed and marker_inserted:
- print(f"Relocated # CURRENT-YEAR-END-MARKER in _quarto.yml from line {modified_lines['deleted_line']} to line {modified_lines['inserted_line']}")
+ print(f"Relocated # CURRENT-YEAR-END-MARKER in releases _sidebar.yaml from line {modified_lines['deleted_line']} to line {modified_lines['inserted_line']}")
elif not marker_removed:
return "Marker was not found in the file"
else:
@@ -565,14 +630,17 @@ def main():
update_template(yearly_release, year)
print()
- release_listings = get_release_listings(yearly_path)
- print()
+ # release_listings = get_release_listings(yearly_path)
+ # print()
- if release_listings:
- update_listing(yearly_release, release_listings)
- print()
+ # if release_listings:
+ # update_listing(yearly_release, release_listings)
+ # print()
- update_quarto_yaml(year)
+ # update_quarto_yaml(year)
+ # print()
+
+ update_release_sidebar(year)
print()
move_year_marker(year)
diff --git a/site/Makefile b/site/Makefile
index 0517a4ea67..01d212d294 100644
--- a/site/Makefile
+++ b/site/Makefile
@@ -1,39 +1,42 @@
# Define source and destination directories
-LIBRARY_BRANCH ?= $(or $(BRANCH),main)
-INSTALLATION_BRANCH := main
-SRC_ROOT := _source
-SRC_DIR := $(SRC_ROOT)/validmind-library
DEST_DIR_NB := notebooks
DEST_DIR_PYTHON := validmind
DEST_DIR_TESTS := tests
+FILE_PATH := notebooks/tutorials/intro_for_model_developers_EXECUTED.ipynb
GIT_BRANCH := $(shell git rev-parse --abbrev-ref HEAD)
+INSTALLATION_BRANCH := main
+LIBRARY_BRANCH ?= $(or $(BRANCH),main)
PROFILE := exe-demo
-FILE_PATH := notebooks/tutorials/intro_for_model_developers_EXECUTED.ipynb
+SRC_ROOT := _source
+SRC_DIR := $(SRC_ROOT)/validmind-library
# Define .PHONY target for help section
-.PHONY: help clean clone notebooks python-docs docs-site deploy-demo-branch delete-demo-branch deploy-prod deploy-staging release-notes execute docker-site docker-site-lite docker-build docker-serve
+.PHONY: help clean clone copy-installation delete-demo-branch deploy-demo-branch deploy-prod deploy-staging docker-build docker-serve docker-site docker-site-lite docs-site execute get-source notebooks python-docs release-notes test-descriptions yearly-releases
# Help section
help:
@echo "Available targets:"
+ @echo " help Display this help message (default target)"
@echo " clean Remove the _source/ directory"
@echo " clone Clone the validmind-library repository into _source/"
@echo " Optional, for PR testing: BRANCH="
- @echo " notebooks Copy Jupyter notebooks into notebooks/"
- @echo " python-docs Copy the Python library docs into _site/validmind"
- @echo " get-source Get all source files (clean, clone, notebooks, python-docs)"
- @echo " docs-site Get all source files and render the docs site with Quarto"
- @echo " deploy-demo-branch Deploy docs demo site to s3://docs-ci-cd-demo/site/pr_previews/$(GIT_BRANCH)/"
+ @echo " copy-installation Copy customer-managed installation docs into installation/"
@echo " delete-demo-branch Delete docs demo site in s3://docs-ci-cd-demo/site/pr_previews/$(GIT_BRANCH)/"
+ @echo " deploy-demo-branch Deploy docs demo site to s3://docs-ci-cd-demo/site/pr_previews/$(GIT_BRANCH)/"
@echo " deploy-prod Deploy docs prod site to s3://docs-ci-cd-prod/site/"
@echo " deploy-staging Deploy docs staging site to s3://docs-ci-cd-staging/site/"
- @echo " docker-site Get source, render site with Docker profile, execute notebooks"
- @echo " docker-site-lite Get source and render site with Docker profile (skips notebook execution)"
@echo " docker-build Builds a Docker image of the docs site"
@echo " docker-serve Serves the docs site at http://localhost:4444/"
- @echo " help Display this help message (default target)"
- @echo " release-notes Generate release notes from pull requests since latest tag and update _quarto.yml"
- @echo " yearly-releases Collate and move a specified year of releases into their own subdir and update _quarto.yml"
+ @echo " docker-site Get source, render site with Docker profile, execute notebooks"
+ @echo " docker-site-lite Get source and render site with Docker profile (skips notebook execution)"
+ @echo " docs-site Get all source files and render the production docs site with Quarto"
+ @echo " execute Execute a Jupyter Notebook, optional overrides: PROFILE= FILE_PATH"
+ @echo " get-source Get all source files (clean, clone, copy-installation, notebooks, python-docs, test-descriptions)"
+ @echo " notebooks Copy Jupyter notebooks into notebooks/"
+ @echo " python-docs Copy the Python library docs into validmind/"
+ @echo " release-notes Generate release notes from pull requests since latest tag and update releases sidebar"
+ @echo " test-descriptions Copy the ValidMind tests docs into tests/"
+ @echo " yearly-releases Collate releases by year into a listing landing and update releases sidebar"
# Clean up source directory
clean:
@@ -66,6 +69,66 @@ clone:
copy-installation:
cp -r $(SRC_ROOT)/installation/site/installation installation
+# Delete PR branch on https://docs-demo.vm.validmind.ai/
+delete-demo-branch:
+ @aws s3 rm s3://docs-ci-cd-demo/site/pr_previews/$(GIT_BRANCH)/ --recursive && aws cloudfront create-invalidation --distribution-id E38AINJY5CYN6P --paths "/*" --no-cli-pager > /dev/null;
+ @echo "\nDeleted https://docs-demo.vm.validmind.ai/pr_previews/$(GIT_BRANCH)/"
+
+# Deploy PR branch to https://docs-demo.vm.validmind.ai/
+deploy-demo-branch:
+ @quarto render --profile development && aws s3 sync ./_site s3://docs-ci-cd-demo/site/pr_previews/$(GIT_BRANCH)/ --delete && aws cloudfront create-invalidation --distribution-id E38AINJY5CYN6P --paths "/*" --no-cli-pager > /dev/null;
+ @echo "\nDeployed to https://docs-demo.vm.validmind.ai/pr_previews/$(GIT_BRANCH)/index.html"
+
+# Deployment to https://docs.validmind.ai/
+deploy-prod:
+ @if [ "`git rev-parse --abbrev-ref HEAD`" != "prod" ]; then \
+ echo "You're not on the prod branch, no action taken."; \
+ else \
+ echo "\nDeploying prod site ..."; \
+ cp -r $(SRC_ROOT)/installation/site/installation installation
+ quarto render --profile production && aws s3 sync ./_site s3://docs-ci-cd-prod/site/ --delete && aws cloudfront create-invalidation --distribution-id E2I9R40IH01NW3 --paths "/*" --no-cli-pager > /dev/null; \
+ fi
+
+# Deployment to https://docs-staging.validmind.ai/
+deploy-staging:
+ @if [ "`git rev-parse --abbrev-ref HEAD`" != "staging" ]; then \
+ echo "You're not on the staging branch, no action taken."; \
+ else \
+ echo "\nDeploying staging site ..."; \
+ cp -r $(SRC_ROOT)/installation/site/installation installation
+ quarto render --profile staging && aws s3 sync ./_site s3://docs-ci-cd-staging/site/ --delete && aws cloudfront create-invalidation --distribution-id E2FB73KGY63MV6 --paths "/*" --no-cli-pager > /dev/null; \
+ fi
+
+docker-build: docker-site-lite
+ @echo "\nBuilding the Docker image ..."
+ @docker build -f ../Dockerfile -t validmind-docs ..
+
+docker-serve:
+ @echo "\nStarting the Docker container on http://localhost:4444/ ..."
+ @docker run -p 4444:80 validmind-docs
+
+docker-site: get-source
+ @echo "\nRendering the configurable static HTML site for Docker ..."
+ quarto render --profile docker 2>&1 | grep -v "WARN:" 1>&2
+ @$(MAKE) execute PROFILE=exe-prod
+
+docker-site-lite: get-source
+ @echo "\nRendering the configurable static HTML site for Docker (skip notebook execution) ..."
+ quarto render --profile docker 2>&1 | grep -v "WARN:" 1>&2
+
+# Get all source files
+docs-site: get-source
+ @echo "\nRendering the static HTML site ..."
+ quarto render --profile production
+ @$(MAKE) execute PROFILE=exe-prod
+
+# Will default to `exe-demo` profile & the `notebooks/tutorials/intro_for_model_developers_EXECUTED.ipynb` if no input provided
+execute:
+ quarto render --profile $(PROFILE) $(FILE_PATH)
+
+# Get all source files
+get-source: clean clone copy-installation notebooks python-docs test-descriptions
+
# Copy over Jupyter notebooks and supporting files
notebooks:
@echo "\nUpdating notebook source ..."
@@ -93,55 +156,6 @@ python-docs:
rsync -av --exclude '_build' --exclude 'templates' $(SRC_DIR)/docs/ $(DEST_DIR_PYTHON)/; \
fi
-test-descriptions:
- @echo "\nUpdating test descriptions source ..."
- @cd _source/validmind-library && make install && poetry run python scripts/extract_descriptions.py validmind/tests
- @cd ../../
- @rm -rf $(DEST_DIR_TESTS)
- @mkdir -p $(DEST_DIR_TESTS)
- @cp -r $(SRC_DIR)/build/_test_descriptions/validmind/tests/. $(DEST_DIR_TESTS)
- @echo "Copying _metadata.yml into tests/ ..."
- @cp developer/_metadata.yml $(DEST_DIR_TESTS)/_metadata.yml
-
-# Get all source files
-get-source: clean clone copy-installation notebooks python-docs test-descriptions
-
-# Get all source files
-docs-site: get-source
- @echo "\nRendering the static HTML site ..."
- quarto render --profile production
- @$(MAKE) execute PROFILE=exe-prod
-
-# Deploy PR branch to https://docs-demo.vm.validmind.ai/
-deploy-demo-branch:
- @quarto render --profile development && aws s3 sync ./_site s3://docs-ci-cd-demo/site/pr_previews/$(GIT_BRANCH)/ --delete && aws cloudfront create-invalidation --distribution-id E38AINJY5CYN6P --paths "/*" --no-cli-pager > /dev/null;
- @echo "\nDeployed to https://docs-demo.vm.validmind.ai/pr_previews/$(GIT_BRANCH)/index.html"
-
-# Delete PR branch on https://docs-demo.vm.validmind.ai/
-delete-demo-branch:
- @aws s3 rm s3://docs-ci-cd-demo/site/pr_previews/$(GIT_BRANCH)/ --recursive && aws cloudfront create-invalidation --distribution-id E38AINJY5CYN6P --paths "/*" --no-cli-pager > /dev/null;
- @echo "\nDeleted https://docs-demo.vm.validmind.ai/pr_previews/$(GIT_BRANCH)/"
-
-# Deployment to https://docs.validmind.ai/
-deploy-prod:
- @if [ "`git rev-parse --abbrev-ref HEAD`" != "prod" ]; then \
- echo "You're not on the prod branch, no action taken."; \
- else \
- echo "\nDeploying prod site ..."; \
- cp -r $(SRC_ROOT)/installation/site/installation installation
- quarto render --profile production && aws s3 sync ./_site s3://docs-ci-cd-prod/site/ --delete && aws cloudfront create-invalidation --distribution-id E2I9R40IH01NW3 --paths "/*" --no-cli-pager > /dev/null; \
- fi
-
-# Deployment to https://docs-staging.validmind.ai/
-deploy-staging:
- @if [ "`git rev-parse --abbrev-ref HEAD`" != "staging" ]; then \
- echo "You're not on the staging branch, no action taken."; \
- else \
- echo "\nDeploying staging site ..."; \
- cp -r $(SRC_ROOT)/installation/site/installation installation
- quarto render --profile staging && aws s3 sync ./_site s3://docs-ci-cd-staging/site/ --delete && aws cloudfront create-invalidation --distribution-id E2FB73KGY63MV6 --paths "/*" --no-cli-pager > /dev/null; \
- fi
-
# Generate release notes
release-notes:
@python ../release-scripts/generate_release_objects.py; \
@@ -154,6 +168,16 @@ release-notes:
echo "Release note generation failed, git status and quarto preview"; \
fi
+test-descriptions:
+ @echo "\nUpdating test descriptions source ..."
+ @cd _source/validmind-library && make install && poetry run python scripts/extract_descriptions.py validmind/tests
+ @cd ../../
+ @rm -rf $(DEST_DIR_TESTS)
+ @mkdir -p $(DEST_DIR_TESTS)
+ @cp -r $(SRC_DIR)/build/_test_descriptions/validmind/tests/. $(DEST_DIR_TESTS)
+ @echo "Copying _metadata.yml into tests/ ..."
+ @cp developer/_metadata.yml $(DEST_DIR_TESTS)/_metadata.yml
+
# Collate yearly releases
yearly-releases:
@python ../release-scripts/yearly_cleanup.py
@@ -161,25 +185,10 @@ yearly-releases:
git status | grep -v 'release-scripts/'
quarto preview
-# Execute a Jupyter Notebook
-# Will default to `exe-demo` profile & the `notebooks/tutorials/intro_for_model_developers_EXECUTED.ipynb` if no input provided
-# To override: make execute PROFILE=select-profile FILE_PATH=notebooks/notebook-path-here.ipynb
-execute:
- quarto render --profile $(PROFILE) $(FILE_PATH)
-docker-site: get-source
- @echo "\nRendering the configurable static HTML site for Docker ..."
- quarto render --profile docker 2>&1 | grep -v "WARN:" 1>&2
- @$(MAKE) execute PROFILE=exe-prod
-docker-site-lite: get-source
- @echo "\nRendering the configurable static HTML site for Docker (skip notebook execution) ..."
- quarto render --profile docker 2>&1 | grep -v "WARN:" 1>&2
-docker-build: docker-site-lite
- @echo "\nBuilding the Docker image ..."
- @docker build -f ../Dockerfile -t validmind-docs ..
-docker-serve:
- @echo "\nStarting the Docker container on http://localhost:4444/ ..."
- @docker run -p 4444:80 validmind-docs
+
+
+
diff --git a/site/_quarto.yml b/site/_quarto.yml
index b884dbb182..8acf99de71 100644
--- a/site/_quarto.yml
+++ b/site/_quarto.yml
@@ -5,6 +5,7 @@ metadata-files:
- developer/_sidebar.yaml
- training/_sidebar.yaml
- validmind/_sidebar.yml
+ - releases/_sidebar.yaml
- installation/_sidebar.yaml
website:
@@ -71,6 +72,8 @@ website:
file: support/support.qmd
- text: "Training"
file: training/training.qmd
+ - text: "Releases"
+ file: releases/all-releases.qmd
# - text: "validmind.com {{< fa external-link >}}"
# file: https://validmind.com/
# target: _blank
@@ -168,39 +171,6 @@ website:
- about/contributing/style-guide/voice-and-tone.qmd
- about/contributing/style-guide/conventions.qmd
- text: "---"
- - text: "Releases"
- # MAKE-RELEASE-NOTES-EMBED-MARKER
- - releases/2025/2025-mar-07/release-notes.qmd
- - releases/2025/2025-jan-31/release-notes.qmd
- # CURRENT-YEAR-END-MARKER
- - file: releases/2024/2024-releases.qmd
- contents:
- - releases/2024/2024-dec-24/release-notes.qmd
- - releases/2024/2024-dec-06/release-notes.qmd
- - releases/2024/2024-oct-22/release-notes.qmd
- - releases/2024/2024-sep-25/release-notes.qmd
- - releases/2024/2024-sep-09/release-notes.qmd
- - releases/2024/2024-aug-13/release-notes.qmd
- - releases/2024/2024-jul-22/release-notes.qmd
- - releases/2024/2024-jun-10/release-notes.qmd
- - releases/2024/2024-may-22/release-notes.qmd
- - releases/2024/2024-mar-27/highlights.qmd
- - releases/2024/2024-feb-14/highlights.qmd
- - releases/2024/2024-jan-26/highlights.qmd
- - releases/2024/2024-jan-18/highlights.qmd
- - file: releases/2023/2023-releases.qmd
- contents:
- - releases/2023/2023-dec-13/highlights.qmd
- - releases/2023/2023-nov-09/highlights.qmd
- - releases/2023/2023-oct-25/highlights.qmd
- - releases/2023/2023-sep-27/highlights.qmd
- - releases/2023/2023-aug-15/highlights.qmd
- - releases/2023/release-notes-2023-jul-24.qmd
- - releases/2023/release-notes-2023-jun-22.qmd
- - releases/2023/release-notes-2023-may-30.qmd
- - text: "Breaking changes & deprecations"
- file: releases/breaking-changes/breaking-changes.qmd
- - text: "---"
- text: "Fine Print"
- about/fine-print/data-privacy-policy.qmd
- text: "Software license agreement"
diff --git a/site/developer/samples-jupyter-notebooks.qmd b/site/developer/samples-jupyter-notebooks.qmd
index 0eb3f4bb81..f191027cf7 100644
--- a/site/developer/samples-jupyter-notebooks.qmd
+++ b/site/developer/samples-jupyter-notebooks.qmd
@@ -33,7 +33,7 @@ Our Jupyter Notebook code samples showcase the capabilities and features of the
::: {.w-30-ns .mt2 .pb3}
-[{{< fa brands github >}} Access Notebooks on GitHub](https://github.com/validmind/validmind-library){.button .button-green target="_blank"}
+[{{< fa brands github >}} Access Notebooks on GitHub](https://github.com/validmind/validmind-library/tree/main/notebooks){.button .button-green target="_blank"}
:::
diff --git a/site/faq/faq-collaboration.qmd b/site/faq/faq-collaboration.qmd
index 0474404f0f..696d17b30a 100644
--- a/site/faq/faq-collaboration.qmd
+++ b/site/faq/faq-collaboration.qmd
@@ -14,6 +14,7 @@ listing:
- ../guide/model-inventory/view-model-activity.qmd
- ../guide/model-documentation/collaborate-with-others.qmd
- ../guide/model-workflows/working-with-model-workflows.qmd
+categories: ["real-time collaboration", "model documentation", "model activity", "auditing", "workflows", "model lifecycle", "validmind platform"]
---
{{< include _faq-activity.qmd >}}
diff --git a/site/faq/faq-documentation.qmd b/site/faq/faq-documentation.qmd
index 1467122d54..e4784075f5 100644
--- a/site/faq/faq-documentation.qmd
+++ b/site/faq/faq-documentation.qmd
@@ -14,6 +14,7 @@ listing:
- ../guide/model-documentation/working-with-documentation-templates.qmd
- ../guide/model-documentation/working-with-model-documentation.qmd
- ../guide/model-documentation/export-documentation.qmd
+categories: ["templates", "model documentation", "customization", "images", "validmind platform", "validmind library"]
---
## What kind of templates are available through {{< var vm.product >}}?
diff --git a/site/faq/faq-integrations.qmd b/site/faq/faq-integrations.qmd
index 7eaf95c1e3..2d34ebe516 100644
--- a/site/faq/faq-integrations.qmd
+++ b/site/faq/faq-integrations.qmd
@@ -14,6 +14,7 @@ listing:
- ../developer/supported-models.qmd
- ../about/overview-llm-features.qmd
- ../about/deployment/deployment-options.qmd
+categories: ["supported libraries", "supported languages", "integrations", "images", "large language models", "explainability", "deployment options", "validmind library"]
---
## Which languages, libraries, and environments do you support?
diff --git a/site/faq/faq-inventory.qmd b/site/faq/faq-inventory.qmd
index b233b959ff..8f743719d3 100644
--- a/site/faq/faq-inventory.qmd
+++ b/site/faq/faq-inventory.qmd
@@ -14,6 +14,7 @@ listing:
- ../guide/model-inventory/view-model-activity.qmd
- ../guide/model-inventory/working-with-model-inventory.qmd
- ../guide/model-inventory/managing-model-inventory.qmd
+categories: ["model activity", "model registration", "model inventory", "customization", "model stages", "model interdependencies", "auditing", "exports", "validmind platform"]
---
{{< include _faq-activity.qmd >}}
diff --git a/site/faq/faq-organizations.qmd b/site/faq/faq-organizations.qmd
index 3737e4db7e..1bf80c2da2 100644
--- a/site/faq/faq-organizations.qmd
+++ b/site/faq/faq-organizations.qmd
@@ -11,6 +11,7 @@ listing:
- ../guide/configuration/accessing-validmind.qmd
- ../guide/configuration/managing-your-organization.qmd
- ../guide/configuration/managing-users.qmd
+categories: ["access", "permissions", "organizations", "user registration", "validmind platform"]
---
## How do I get access to {{< var vm.product >}}?
diff --git a/site/faq/faq-privacy.qmd b/site/faq/faq-privacy.qmd
index 1f841dc6ac..32601a80cf 100644
--- a/site/faq/faq-privacy.qmd
+++ b/site/faq/faq-privacy.qmd
@@ -16,6 +16,7 @@ listing:
- ../about/deployment/deployment-options.qmd
- ../about/fine-print/data-privacy-policy.qmd
- ../guide/model-inventory/view-model-activity.qmd
+categories: ["data handling", "privacy", "confidentiality", "model activity", "auditing", "validmind platform", "validmind library"]
---
## How does {{< var vm.product >}} handle the processing of PII?
diff --git a/site/faq/faq-reporting.qmd b/site/faq/faq-reporting.qmd
index 003929f210..0727673fcb 100644
--- a/site/faq/faq-reporting.qmd
+++ b/site/faq/faq-reporting.qmd
@@ -12,6 +12,7 @@ listing:
- ../guide/model-documentation/export-documentation.qmd
- ../guide/reporting/working-with-analytics.qmd
- ../guide/monitoring/ongoing-monitoring.qmd
+categories: ["exports", "analytics", "reports", "ongoing monitoring", "validmind platform"]
---
{{< include _faq-exporting.qmd >}}
diff --git a/site/faq/faq-testing.qmd b/site/faq/faq-testing.qmd
index 985984bc92..8b7e8f0e66 100644
--- a/site/faq/faq-testing.qmd
+++ b/site/faq/faq-testing.qmd
@@ -14,6 +14,7 @@ listing:
- ../developer/model-testing/testing-overview.qmd
- ../developer/model-testing/test-descriptions.qmd
- ../guide/monitoring/ongoing-monitoring.qmd
+categories: ["testing", "model documentation", "customization", "custom data", "explainability", "ongoing monitoring", "validmind library"]
---
## How do the out-of-the-box tests developed by {{< var vm.product >}} work?
diff --git a/site/faq/faq-validation.qmd b/site/faq/faq-validation.qmd
index d43ed50f9d..c4e58d474a 100644
--- a/site/faq/faq-validation.qmd
+++ b/site/faq/faq-validation.qmd
@@ -14,6 +14,7 @@ listing:
- ../guide/model-validation/manage-validation-guidelines.qmd
- ../guide/model-validation/preparing-validation-reports.qmd
- ../guide/model-validation/working-with-model-findings.qmd
+categories: ["model validation", "validation guidelines", "model findings", "model documentation", "templates", "compliance", "validmind platform"]
---
## Can I set up custom validation guidelines for use in templates?
diff --git a/site/faq/faq-workflows.qmd b/site/faq/faq-workflows.qmd
index 4500a534ea..9af7e0319f 100644
--- a/site/faq/faq-workflows.qmd
+++ b/site/faq/faq-workflows.qmd
@@ -14,6 +14,7 @@ listing:
- ../guide/model-workflows/working-with-model-workflows.qmd
- ../guide/model-workflows/customize-model-lifecycle-statuses.qmd
- ../guide/model-inventory/manage-model-inventory-fields.qmd
+categories: ["workflows", "model lifecycle", "lifecycle statuses", "validmind platform", "validmind library"]
---
## Can I customize workflows within {{< var vm.product >}}?
diff --git a/site/faq/faq.qmd b/site/faq/faq.qmd
index 0f1eb553c3..f6facca59d 100644
--- a/site/faq/faq.qmd
+++ b/site/faq/faq.qmd
@@ -12,34 +12,24 @@ listing:
contents:
- path: faq-organizations.qmd
title: "Access and permissions"
- categories: ["access", "permissions", "organizations", "user registration", "validmind platform"]
- path: faq-workflows.qmd
title: "Model workflows"
- categories: ["workflows", "model lifecycle", "lifecycle statuses", "validmind platform", "validmind library"]
- path: faq-inventory.qmd
title: "Model inventory and activity"
- categories: ["model activity", "model registration", "model inventory", "customization", "model stages", "model interdependencies", "auditing", "exports", "validmind platform"]
- path: faq-documentation.qmd
title: "Model documentation and templates"
- categories: ["templates", "model documentation", "customization", "images", "validmind platform", "validmind library"]
- path: faq-validation.qmd
title: "Model validation and findings"
- categories: ["model validation", "validation guidelines", "model findings", "model documentation", "templates", "compliance", "validmind platform"]
- path: faq-collaboration.qmd
title: "Collaboration"
- categories: ["real-time collaboration", "model documentation", "model activity", "auditing", "workflows", "model lifecycle", "validmind platform"]
- path: faq-reporting.qmd
title: "Ongoing monitoring and reporting"
- categories: ["exports", "analytics", "reports", "ongoing monitoring", "validmind platform"]
- path: faq-testing.qmd
title: "Testing"
- categories: ["testing", "model documentation", "customization", "custom data", "explainability", "ongoing monitoring", "validmind library"]
- path: faq-integrations.qmd
title: "Integrations and support"
- categories: ["supported libraries", "supported languages", "integrations", "images", "large language models", "explainability", "deployment options", "validmind library"]
- path: faq-privacy.qmd
title: "Data handling and privacy"
- categories: ["data handling", "privacy", "confidentiality", "model activity", "auditing", "validmind platform", "validmind library"]
---
## Answers by topic
diff --git a/site/guide/configuration/_manage-roles.qmd b/site/guide/configuration/_manage-roles.qmd
index 52c81806be..e9e8ea21fc 100644
--- a/site/guide/configuration/_manage-roles.qmd
+++ b/site/guide/configuration/_manage-roles.qmd
@@ -5,20 +5,20 @@
1. Enter the unique **[name]{.smallcaps}** and **[description]{.smallcaps}** for the role.^[Role names and model stakeholder type names cannot be duplicated to reduce confusion.]
-1. Once you click **{{< fa plus >}} Add Role**, you can proceed with managing the permissions and users associated with that role.
+1. Once you click **{{< fa plus >}} Add Role**, you can proceed with managing the user permissions and users associated with that role.
#### Manage role permissions
-1. Click on the role whose permissions you want to change.
+1. Click on the role whose user permissions you want to change.
1. Select the **Permissions** tab, where you can:
- - View the current permissions assigned to that role.
- - Select permissions to be assigned to that role.
+ - View the current user permissions assigned to that role.
+ - Select user permissions to be assigned to that role.
-1. Select **Edit Permissions** to to add or remove permissions to or from that role.
+1. Select **Edit Permissions** to to add or remove user permissions to or from that role.
-1. Toggle specific permissions for that role by checking or unchecking the boxes next to the permission.
+1. Toggle specific user permissions for that role by checking or unchecking the boxes next to the permission.
1. Click **Save Permissions** to apply your changes.
@@ -54,20 +54,20 @@
1. Enter the unique **[name]{.smallcaps}** and **[description]{.smallcaps}** for the role.
-1. Once you click **{{< fa plus >}} Add Role**, you can proceed with managing the permissions and users associated with that role.
+1. Once you click **{{< fa plus >}} Add Role**, you can proceed with managing the user permissions and users associated with that role.
#### Manage role permissions
-1. Click on the role whose permissions you want to change.
+1. Click on the role whose user permissions you want to change.
1. Select the **Permissions** tab, where you can:
- - View the current permissions assigned to that role.
- - Select permissions to be assigned to that role.
+ - View the current user permissions assigned to that role.
+ - Select user permissions to be assigned to that role.
-1. Select **Edit Permissions** to to add or remove permissions to or from that role.
+1. Select **Edit Permissions** to to add or remove user permissions to or from that role.
-1. Toggle specific permissions for that role by checking or unchecking the boxes next to the permission.
+1. Toggle specific user permissions for that role by checking or unchecking the boxes next to the permission.
1. Click **Save Permissions** to apply your changes.
diff --git a/site/index.qmd b/site/index.qmd
index 8ea6bc28c1..215941fecb 100644
--- a/site/index.qmd
+++ b/site/index.qmd
@@ -43,15 +43,12 @@ listing:
grid-columns: 3
max-description-length: 150
sort: false
- fields: [title, description]
+ fields: [title, subtitle, description]
contents:
# MAKE-RELEASE-NOTES-LATEST-MARKER
+ - /releases/2025/2025-apr-24/release-notes.qmd
- /releases/2025/2025-mar-07/release-notes.qmd
- /releases/2025/2025-jan-31/release-notes.qmd
- - /releases/2024/2024-dec-24/release-notes.qmd
- - /releases/2024/2024-dec-06/release-notes.qmd
- - /releases/2024/2024-oct-22/release-notes.qmd
- - /releases/2024/2024-sep-25/release-notes.qmd
# MAKE-RELEASE-NOTES-OLDEST-MARKER
- id: validmind-academy
type: grid
@@ -375,11 +372,28 @@ Gain insights through our original content on model risk management.
:::
-::: {.w-80-ns .mb4}
+::: {.w-70-ns .mb4}
+
+:::: {.flex .flex-wrap .justify-around}
+
+::: {.w-70-ns}
:::: {.f2}
Latest Releases
-::::
+
+::::
+
+:::
+
+::: {.w-30-ns .tr}
+:::: {.f4}
+[[all releases {{< fa chevron-right >}} ](releases/all-releases.qmd)]{.smallcaps}
+
+:::
+
+:::
+
+::::
:::{#releases}
:::
diff --git a/site/releases/2023/2023-aug-15/highlights.qmd b/site/releases/2023/2023-aug-15/highlights.qmd
index ac72106667..d5c20206cf 100644
--- a/site/releases/2023/2023-aug-15/highlights.qmd
+++ b/site/releases/2023/2023-aug-15/highlights.qmd
@@ -1,5 +1,6 @@
---
title: "August 15, 2023"
+date: 2023-08-15
aliases:
- /releases/2023-aug-15/highlights.html
---
diff --git a/site/releases/2023/2023-dec-13/highlights.qmd b/site/releases/2023/2023-dec-13/highlights.qmd
index cd428ee024..de88e1b93b 100644
--- a/site/releases/2023/2023-dec-13/highlights.qmd
+++ b/site/releases/2023/2023-dec-13/highlights.qmd
@@ -1,5 +1,6 @@
---
title: "December 13, 2023"
+date: 2023-12-13
aliases:
- /releases/2023-dec-13/highlights.html
---
diff --git a/site/releases/2023/2023-nov-09/highlights.qmd b/site/releases/2023/2023-nov-09/highlights.qmd
index db6c53dc19..23857963e1 100644
--- a/site/releases/2023/2023-nov-09/highlights.qmd
+++ b/site/releases/2023/2023-nov-09/highlights.qmd
@@ -1,5 +1,6 @@
---
title: "November 9, 2023"
+date: 2023-11-09
aliases:
- /releases/2023-nov-09/highlights.html
---
diff --git a/site/releases/2023/2023-oct-25/highlights.qmd b/site/releases/2023/2023-oct-25/highlights.qmd
index e7c14f294e..4a7a39bf9d 100644
--- a/site/releases/2023/2023-oct-25/highlights.qmd
+++ b/site/releases/2023/2023-oct-25/highlights.qmd
@@ -1,5 +1,6 @@
---
title: "October 25, 2023"
+date: 2023-10-25
aliases:
- /releases/2023-oct-25/highlights.html
---
diff --git a/site/releases/2023/2023-releases.qmd b/site/releases/2023/2023-releases.qmd
index 53adb84ee4..d1eb8cf2cb 100644
--- a/site/releases/2023/2023-releases.qmd
+++ b/site/releases/2023/2023-releases.qmd
@@ -1,21 +1,15 @@
---
title: "2023 Releases"
date: last-modified
+categories: ["releases by year"]
listing:
- id: 2023-releases
type: grid
max-description-length: 250
- sort: false
- fields: [title, description]
+ sort: "date desc"
+ fields: [title, subtitle, description]
contents:
- - 2023-dec-13/highlights.qmd
- - 2023-nov-09/highlights.qmd
- - 2023-oct-25/highlights.qmd
- - 2023-sep-27/highlights.qmd
- - 2023-aug-15/highlights.qmd
- - release-notes-2023-jul-24.qmd
- - release-notes-2023-jun-22.qmd
- - release-notes-2023-may-30.qmd
+ - ./**/**.qmd
---
:::{#2023-releases}
diff --git a/site/releases/2023/2023-sep-27/highlights.qmd b/site/releases/2023/2023-sep-27/highlights.qmd
index 6fb7e5d76e..0dc0d41631 100644
--- a/site/releases/2023/2023-sep-27/highlights.qmd
+++ b/site/releases/2023/2023-sep-27/highlights.qmd
@@ -1,5 +1,6 @@
---
title: "September 27, 2023"
+date: 2023-09-27
aliases:
- /releases/2023-sep-27/highlights.html
listing:
diff --git a/site/releases/2023/release-notes-2023-jul-24.qmd b/site/releases/2023/release-notes-2023-jul-24.qmd
index 306db567ed..0102670ed4 100644
--- a/site/releases/2023/release-notes-2023-jul-24.qmd
+++ b/site/releases/2023/release-notes-2023-jul-24.qmd
@@ -1,5 +1,6 @@
---
title: "July 24, 2023"
+date: 2023-07-24
aliases:
- /releases/release-notes-2023-jul-24.html
---
diff --git a/site/releases/2023/release-notes-2023-jun-22.qmd b/site/releases/2023/release-notes-2023-jun-22.qmd
index 45fe58a714..5ec153f328 100644
--- a/site/releases/2023/release-notes-2023-jun-22.qmd
+++ b/site/releases/2023/release-notes-2023-jun-22.qmd
@@ -1,5 +1,6 @@
---
title: "June 22, 2023"
+date: 2023-06-22
aliases:
- /releases/release-notes-2023-jun-22.html
---
diff --git a/site/releases/2023/release-notes-2023-may-30.qmd b/site/releases/2023/release-notes-2023-may-30.qmd
index 9185be4bf0..7d36102120 100644
--- a/site/releases/2023/release-notes-2023-may-30.qmd
+++ b/site/releases/2023/release-notes-2023-may-30.qmd
@@ -1,5 +1,6 @@
---
title: "May 30, 2023"
+date: 2023-05-30
aliases:
- /releases/release-notes-2023-may-30.html
---
diff --git a/site/releases/2024/2024-aug-13/release-notes.qmd b/site/releases/2024/2024-aug-13/release-notes.qmd
index a56171468e..9b9b260bfb 100644
--- a/site/releases/2024/2024-aug-13/release-notes.qmd
+++ b/site/releases/2024/2024-aug-13/release-notes.qmd
@@ -1,5 +1,6 @@
---
title: "August 13, 2024"
+date: 2024-08-13
aliases:
- /releases/2024-aug-13/release-notes.html
---
diff --git a/site/releases/2024/2024-dec-06/release-notes.qmd b/site/releases/2024/2024-dec-06/release-notes.qmd
index aeab4fd5a8..96ad702da3 100644
--- a/site/releases/2024/2024-dec-06/release-notes.qmd
+++ b/site/releases/2024/2024-dec-06/release-notes.qmd
@@ -1,5 +1,6 @@
---
title: "December 6, 2024"
+date: 2024-12-06
aliases:
- /releases/2024-dec-06/release-notes.html
filters:
diff --git a/site/releases/2024/2024-dec-24/release-notes.qmd b/site/releases/2024/2024-dec-24/release-notes.qmd
index 2a9e7616e3..3e73b29168 100644
--- a/site/releases/2024/2024-dec-24/release-notes.qmd
+++ b/site/releases/2024/2024-dec-24/release-notes.qmd
@@ -1,5 +1,6 @@
---
title: "December 24, 2024"
+date: 2024-12-24
aliases:
- /releases/2024-dec-24/release-notes.html
listing:
diff --git a/site/releases/2024/2024-feb-14/highlights.qmd b/site/releases/2024/2024-feb-14/highlights.qmd
index a32311bb20..b6c03fb927 100644
--- a/site/releases/2024/2024-feb-14/highlights.qmd
+++ b/site/releases/2024/2024-feb-14/highlights.qmd
@@ -1,5 +1,6 @@
---
title: "February 14, 2024"
+date: 2024-02-14
aliases:
- /releases/2024-feb-14/highlights.html
---
diff --git a/site/releases/2024/2024-jan-18/highlights.qmd b/site/releases/2024/2024-jan-18/highlights.qmd
index 14a7dcedbc..7b1eab360e 100644
--- a/site/releases/2024/2024-jan-18/highlights.qmd
+++ b/site/releases/2024/2024-jan-18/highlights.qmd
@@ -1,5 +1,6 @@
---
title: "January 18, 2024"
+date: 2024-01-18
aliases:
- /releases/2024-jan-18/highlights.html
---
diff --git a/site/releases/2024/2024-jan-26/highlights.qmd b/site/releases/2024/2024-jan-26/highlights.qmd
index 2074fe1148..b2e7d0c0e1 100644
--- a/site/releases/2024/2024-jan-26/highlights.qmd
+++ b/site/releases/2024/2024-jan-26/highlights.qmd
@@ -1,5 +1,6 @@
---
title: "January 26, 2024"
+date: 2024-01-26
aliases:
- /releases/2024-jan-26/highlights.html
---
diff --git a/site/releases/2024/2024-jul-22/release-notes.qmd b/site/releases/2024/2024-jul-22/release-notes.qmd
index 8dbdb6ae22..bc11b4e9c5 100644
--- a/site/releases/2024/2024-jul-22/release-notes.qmd
+++ b/site/releases/2024/2024-jul-22/release-notes.qmd
@@ -1,5 +1,6 @@
---
title: "July 22, 2024"
+date: 2024-07-22
aliases:
- /releases/2024-jul-22/release-notes.html
listing:
diff --git a/site/releases/2024/2024-jun-10/release-notes.qmd b/site/releases/2024/2024-jun-10/release-notes.qmd
index 14d8e4435d..66a189df55 100644
--- a/site/releases/2024/2024-jun-10/release-notes.qmd
+++ b/site/releases/2024/2024-jun-10/release-notes.qmd
@@ -1,5 +1,6 @@
---
title: "June 10, 2024"
+date: 2024-06-10
aliases:
- /releases/2024-jun-10/release-notes.html
---
diff --git a/site/releases/2024/2024-mar-27/highlights.qmd b/site/releases/2024/2024-mar-27/highlights.qmd
index 565941ff86..468fe1401b 100644
--- a/site/releases/2024/2024-mar-27/highlights.qmd
+++ b/site/releases/2024/2024-mar-27/highlights.qmd
@@ -1,5 +1,6 @@
---
title: "March 27, 2024"
+date: 2024-03-27
aliases:
- /releases/2024-mar-27/highlights.html
---
diff --git a/site/releases/2024/2024-may-22/release-notes.qmd b/site/releases/2024/2024-may-22/release-notes.qmd
index 7fd60c20ce..5c35b6b766 100644
--- a/site/releases/2024/2024-may-22/release-notes.qmd
+++ b/site/releases/2024/2024-may-22/release-notes.qmd
@@ -1,5 +1,6 @@
---
title: "May 22, 2024"
+date: 2024-05-22
aliases:
- /releases/2024-may-22/release-notes.html
listing:
diff --git a/site/releases/2024/2024-oct-22/release-notes.qmd b/site/releases/2024/2024-oct-22/release-notes.qmd
index df760f4c26..3130168eed 100644
--- a/site/releases/2024/2024-oct-22/release-notes.qmd
+++ b/site/releases/2024/2024-oct-22/release-notes.qmd
@@ -1,5 +1,6 @@
---
title: "October 22, 2024"
+date: 2024-10-22
aliases:
- /releases/2024-oct-22/release-notes.html
listing:
diff --git a/site/releases/2024/2024-releases.qmd b/site/releases/2024/2024-releases.qmd
index b22a0017da..c450fd2c58 100644
--- a/site/releases/2024/2024-releases.qmd
+++ b/site/releases/2024/2024-releases.qmd
@@ -2,30 +2,16 @@
# TITLE-MARKER
title: "2024 Releases"
date: last-modified
-# REMOVE THIS `FALSE` FLAG AFTER YEARLY RELEASES HAVE ALL BEEN GATHERED ONTO THIS LANDING
-search: false
+categories: ["releases by year"]
listing:
# LISTING-MARKER
- id: 2024-releases
type: grid
max-description-length: 250
- sort: false
- fields: [title, description]
+ sort: "date desc"
+ fields: [title, subtitle, description]
contents:
-# RELEASE-FILES-MARKER
- - 2024-dec-24/release-notes.qmd
- - 2024-dec-06/release-notes.qmd
- - 2024-oct-22/release-notes.qmd
- - 2024-sep-25/release-notes.qmd
- - 2024-sep-09/release-notes.qmd
- - 2024-aug-13/release-notes.qmd
- - 2024-jul-22/release-notes.qmd
- - 2024-jun-10/release-notes.qmd
- - 2024-may-22/release-notes.qmd
- - 2024-mar-27/release-notes.qmd
- - 2024-feb-14/release-notes.qmd
- - 2024-jan-26/release-notes.qmd
- - 2024-jan-18/release-notes.qmd
+ - ./**/**.qmd
---
diff --git a/site/releases/2024/2024-sep-09/release-notes.qmd b/site/releases/2024/2024-sep-09/release-notes.qmd
index 4f9c9835a3..01ebcfb909 100644
--- a/site/releases/2024/2024-sep-09/release-notes.qmd
+++ b/site/releases/2024/2024-sep-09/release-notes.qmd
@@ -1,5 +1,6 @@
---
title: "September 9, 2024"
+date: 2024-09-09
aliases:
- /releases/2024-sep-09/release-notes.html
---
diff --git a/site/releases/2024/2024-sep-25/release-notes.qmd b/site/releases/2024/2024-sep-25/release-notes.qmd
index 9cd533409c..72c816a8a2 100644
--- a/site/releases/2024/2024-sep-25/release-notes.qmd
+++ b/site/releases/2024/2024-sep-25/release-notes.qmd
@@ -1,5 +1,6 @@
---
title: "September 25, 2024"
+date: 2024-09-25
aliases:
- /releases/2024-sep-25/release-notes.html
---
diff --git a/site/releases/2025/2025-apr-24/release-notes.qmd b/site/releases/2025/2025-apr-24/release-notes.qmd
new file mode 100644
index 0000000000..b08720adcc
--- /dev/null
+++ b/site/releases/2025/2025-apr-24/release-notes.qmd
@@ -0,0 +1,286 @@
+---
+title: "April 24, 2025"
+date: 2025-04-24
+subtitle: "Unified version `25.03.05`"
+listing:
+ - id: development-series
+ type: grid
+ grid-columns: 1
+ max-description-length: 250
+ contents:
+ - path: ../../../developer/validmind-library.qmd#for-model-development
+ title: "{{< var vm.product >}} for model development {{< fa chevron-right >}}"
+ description: "Learn how to use {{< var vm.product >}} for your end-to-end model documentation process based on common model development scenarios with our series of four introductory notebooks."
+---
+
+We've released the ability to manage model stakeholder types within the {{< var validmind.platform >}}, support for custom configuration of test-driven blocks via the {{< var validmind.developer >}}, an updated {{< var vm.api >}} reference within our documentation, and more.
+
+::: {.highlights}
+
+## Release highlights — `25.03.05`
+
+::: {.callout}
+Our documentation now follows the new **unified versioning scheme** for our software as of our [`25.01` release on January 31, 2025](/releases/2025/2025-jan-31/release-notes.qmd).
+:::
+
+### {{< var validmind.developer >}} (v2.8.13)
+
+
+#### New introduction for model development notebook series
+
+We've revamped our old *Introduction for model developers* notebook into a series of four introductory notebooks — **ValidMind for model development:**
+
+:::: {.flex .flex-wrap .justify-around}
+
+::: {.w-60-ns}
+1. Set up the ValidMind Library
+2. Start the model development process
+3. Integrate custom tests
+4. Finalize testing and documentation
+
+:::
+
+::: {.w-40-ns .tc}
+[{{< fa brands github >}} Access Notebooks on GitHub](https://github.com/validmind/validmind-library/tree/main/notebooks/tutorials/model_development){.button .button-green target="_blank"}
+
+:::
+
+::::
+
+::: {.column-margin}
+:::{#development-series}
+:::
+
+:::
+
+These new notebooks break down using ValidMind for your end-to-end model documentation process based on common model development scenarios:
+
+- Learn the basics of the ValidMind Library with these interactive notebooks designed to introduce you to basic ValidMind concepts and get you familiar with tasks such as how to work with documentation templates, running and logging tests with ValidMind, and more.
+- After you've completed your learning journey with these notebooks, you'll have a fully documented sample model ready for review.
+
+### {{< var validmind.platform >}} (v1.31.10)
+
+
+#### Ability to manage model stakeholder types
+
+:::: {.flex .flex-wrap .justify-around}
+
+::: {.w-60-ns}
+We've introduced the ability to define custom model stakeholder types, allowing you to control granular permissions on each model in your inventory:
+
+:::
+
+::: {.w-40-ns .tc}
+[Manage model stakeholder types](/guide/configuration/manage-model-stakeholder-types.qmd){.button .button-green target="_blank"}
+
+:::
+
+::::
+
+- Model stakeholders determine specific responsibilities and access levels for model review and approval processes for each model in your model inventory, such as read or edit access to model inventory fields.
+- Each model stakeholder also belongs to user groups[^1] which determine which models they can see, and have user roles[^2] with attached role permissions[^3] which define the level of access they have to overarching {{< var validmind.platform >}} features.
+
+::: {.callout}
+Model stakeholders are now also available as a field defined in conditional arguments within model workflow steps.[^4]
+
+:::
+
+### Documentation
+
+
+#### Improved {{< var vm.api >}} reference
+
+:::: {.flex .flex-wrap .justify-around}
+
+::: {.w-60-ns}
+We've completely redesigned our {{< var validmind.api >}} reference using the same tools we use to produce the rest of our product documentation, allowing us to more easily keep this information up to date and ensure its accuracy.
+
+:::
+
+::: {.w-40-ns .tc}
+[{{< var validmind.api >}} reference](/validmind/validmind.qmd){.button .button-green target="_blank"}
+
+:::
+
+::::
+
+- Now featuring more intuitive navigation wrapped in a familiar sidebar, enhanced code signature styling, and integration with our main docs site search, these improvements aim to empower users to maximize the potential of the {{< var validmind.developer >}}.
+- The updated reference structure mirrors the Python package layout, ensuring backward compatibility with our old Python API reference while providing a more reader-friendly experience.
+
+::: {.column-margin}
+:::{#python-api}
+:::
+
+:::
+
+:::
+
+## Enhancements
+
+### {{< var validmind.developer >}} (v2.8.13)
+
+
+#### Support for display configuration of test-driven blocks[^5]
+
+:::: {.flex .flex-wrap .justify-around}
+
+::: {.w-80-ns}
+You can now customize the display of test results when inserted as test-driven blocks in the {{< var validmind.platform >}} when logging results via the {{< var validmind.developer >}} with `result.log()`.
+
+:::
+
+::: {.w-20-ns .tc}
+[result.log()](/validmind/validmind/vm_models.qmd#log){.button target="_blank"}
+
+:::
+
+::::
+
+:::: {.flex .flex-wrap .justify-around}
+
+::: {.w-30-ns .pr1}
+You can now toggle the display of the following attributes:
+
+- `hideTitle`: Title
+- `hideText`: Description
+- `hideParams`: Parameters
+- `hideTables`: Tables
+- `hideFigures`: Figures
+
+:::
+
+::: {.w-70-ns .pl1}
+For example, to show figures but hide tables:
+
+```python
+test = vm.tests.run_test(
+ "validmind.data_validation.TabularDescriptionTables:raw_dataset",
+ input_grid={
+ "dataset": [vm_raw_dataset],
+ },
+)
+test.log(config={"hideFigures": False, "hideTables": True})
+```
+
+:::
+
+::::
+
+
+
+
+
+
+## Bug fixes
+
+### {{< var validmind.platform >}} (v1.31.10)
+
+
+#### Improved table of contents navigation for model documentation
+
+Previously, users experienced non-optimal behavior with the table of contents sidebar for their model's **{{< fa book-open >}} Documentation** pages,[^6] such as being unable to scroll to reveal additional headings when the sections of the Document Outline exceeded the length of the visible page, and navigation that auto-collapsed counterintuitively.
+
+Now, users can scroll to reveal previously hidden table of contents headings via a fixed navigation sidebar.
+
+
+#### Fixed data table navigation in large test-driven blocks
+
+Previously, when test results logged to the {{< var validmind.platform >}} contained more than 20 pages of data in a table, the previous and next buttons did not render correctly for pagination when added as test-driven blocks[^7] into documentation.
+
+Now, test results logged and inserted as test-driven blocks into the documentation display pagination navigation buttons correctly regardless of the size of the data table.
+
+
+
+
+
+
+
+{{< include /releases/_how-to-upgrade.qmd >}}
+
+
+
+
+[^1]: [Manage groups](/guide/configuration/manage-groups.qmd)
+
+[^2]: [Manage roles](/guide/configuration/manage-roles.qmd)
+
+[^3]: [Manage permissions](/guide/configuration/manage-permissions.qmd)
+
+[^4]: [Set up model workflows](/guide/model-workflows/set-up-model-workflows.qmd)
+
+[^5]: [Work with test results](/guide/model-documentation/work-with-test-results.qmd)
+
+[^6]: [Working with model documentation](/guide/model-documentation/working-with-model-documentation.qmd)
+
+[^7]: [Work with test results](/guide/model-documentation/work-with-test-results.qmd)
diff --git a/site/releases/2025/2025-jan-31/release-notes.qmd b/site/releases/2025/2025-jan-31/release-notes.qmd
index a3b4a5103f..4c9206067f 100644
--- a/site/releases/2025/2025-jan-31/release-notes.qmd
+++ b/site/releases/2025/2025-jan-31/release-notes.qmd
@@ -1,5 +1,7 @@
---
title: "January 31, 2025"
+date: 2025-01-31
+subtitle: "Unified version `25.01`"
listing:
- id: test-desc
type: grid
diff --git a/site/releases/2025/2025-mar-07/release-notes.qmd b/site/releases/2025/2025-mar-07/release-notes.qmd
index 6a4c547b05..8ee563ab77 100644
--- a/site/releases/2025/2025-mar-07/release-notes.qmd
+++ b/site/releases/2025/2025-mar-07/release-notes.qmd
@@ -1,5 +1,7 @@
---
title: "March 7, 2025"
+date: 2025-03-07
+subtitle: "Unified version `25.02`"
listing:
- id: academy
type: grid
diff --git a/site/releases/_sidebar.yaml b/site/releases/_sidebar.yaml
new file mode 100644
index 0000000000..d645974644
--- /dev/null
+++ b/site/releases/_sidebar.yaml
@@ -0,0 +1,40 @@
+website:
+ sidebar:
+ - id: releases
+ title: "Releases"
+ contents:
+ - releases/all-releases.qmd
+ - text: "Breaking changes & deprecations"
+ file: releases/breaking-changes/breaking-changes.qmd
+ - text: "---"
+ - text: "Releases by Date"
+ # MAKE-RELEASE-NOTES-EMBED-MARKER
+ - releases/2025/2025-apr-24/release-notes.qmd
+ - releases/2025/2025-mar-07/release-notes.qmd
+ - releases/2025/2025-jan-31/release-notes.qmd
+ # CURRENT-YEAR-END-MARKER
+ - file: releases/2024/2024-releases.qmd
+ contents:
+ - releases/2024/2024-dec-24/release-notes.qmd
+ - releases/2024/2024-dec-06/release-notes.qmd
+ - releases/2024/2024-oct-22/release-notes.qmd
+ - releases/2024/2024-sep-25/release-notes.qmd
+ - releases/2024/2024-sep-09/release-notes.qmd
+ - releases/2024/2024-aug-13/release-notes.qmd
+ - releases/2024/2024-jul-22/release-notes.qmd
+ - releases/2024/2024-jun-10/release-notes.qmd
+ - releases/2024/2024-may-22/release-notes.qmd
+ - releases/2024/2024-mar-27/highlights.qmd
+ - releases/2024/2024-feb-14/highlights.qmd
+ - releases/2024/2024-jan-26/highlights.qmd
+ - releases/2024/2024-jan-18/highlights.qmd
+ - file: releases/2023/2023-releases.qmd
+ contents:
+ - releases/2023/2023-dec-13/highlights.qmd
+ - releases/2023/2023-nov-09/highlights.qmd
+ - releases/2023/2023-oct-25/highlights.qmd
+ - releases/2023/2023-sep-27/highlights.qmd
+ - releases/2023/2023-aug-15/highlights.qmd
+ - releases/2023/release-notes-2023-jul-24.qmd
+ - releases/2023/release-notes-2023-jun-22.qmd
+ - releases/2023/release-notes-2023-may-30.qmd
\ No newline at end of file
diff --git a/site/releases/all-releases.qmd b/site/releases/all-releases.qmd
new file mode 100644
index 0000000000..b2af776510
--- /dev/null
+++ b/site/releases/all-releases.qmd
@@ -0,0 +1,28 @@
+---
+title: "All releases"
+sidebar: releases
+date: last-modified
+listing:
+ - id: releases
+ type: table
+ page-size: 20
+ table-hover: true
+ max-description-length: 250
+ sort: "date desc"
+ date-format: iso
+ sort-ui: [date, subtitle]
+ filter-ui: false
+ fields: [title, date, subtitle]
+ field-display-names:
+ title: "Release notes"
+ subtitle: "{{< var vm.product >}} version"
+ description: "Summary"
+ exclude:
+ categories: ["breaking changes", "deprecations", "releases by year"]
+ contents:
+ - ../releases/**/**/*.qmd
+ - ../releases/**/*.qmd
+---
+
+:::{#releases}
+:::
diff --git a/site/releases/breaking-changes/breaking-changes.qmd b/site/releases/breaking-changes/breaking-changes.qmd
index 7fb72b7d33..b4774fd9d5 100644
--- a/site/releases/breaking-changes/breaking-changes.qmd
+++ b/site/releases/breaking-changes/breaking-changes.qmd
@@ -4,6 +4,7 @@ date: last-modified
# DON'T DISPLAY THE SOURCE CODE FOR THE TABLES ON THE PAGE
execute:
echo: false
+categories: ["breaking changes", "deprecations"]
---
```{r import-script}
diff --git a/site/validmind/_sidebar.yml b/site/validmind/_sidebar.yml
index 3ff543f9ac..6b919f3f5a 100644
--- a/site/validmind/_sidebar.yml
+++ b/site/validmind/_sidebar.yml
@@ -10,7 +10,7 @@ website:
- text: "---"
- text: "Python API"
# Root level items from validmind.qmd
- - text: "`2.8.18`"
+ - text: "`2.8.13`"
file: validmind/validmind.qmd#version__
- text: "init"
file: validmind/validmind.qmd#init
diff --git a/site/validmind/validmind.qmd b/site/validmind/validmind.qmd
index b392295385..4544fc2ca8 100644
--- a/site/validmind/validmind.qmd
+++ b/site/validmind/validmind.qmd
@@ -44,7 +44,7 @@ After you have pasted the code snippet into your development source code and exe
::: {.signature}
-2.8.18
+2.8.13
:::
diff --git a/site/validmind/validmind/version.qmd b/site/validmind/validmind/version.qmd
index c84426b755..9e3daa82f6 100644
--- a/site/validmind/validmind/version.qmd
+++ b/site/validmind/validmind/version.qmd
@@ -9,6 +9,6 @@ sidebar: validmind-reference
::: {.signature}
-2.8.18
+2.8.13
:::