From fa97d8d17ead97cc6bef0ebfbb1eb400ed9a7abc Mon Sep 17 00:00:00 2001 From: "google-labs-jules[bot]" <161369871+google-labs-jules[bot]@users.noreply.github.com> Date: Sat, 6 Sep 2025 11:16:09 +0000 Subject: [PATCH 1/4] docs: remove render deployment files and docs The render deployment is not ready for primetime. - Removes the deploy render from docs/readme - Marks docs/render.md on top as IN DEVELOPMENT - Moves the top level render yaml file to in-dev file as a codeblock, for future work - Removes the top level render yaml file. --- docs/README.md | 4 ---- docs/deployment.render.md | 14 ++++++++++++++ render.yaml | 6 ------ 3 files changed, 14 insertions(+), 10 deletions(-) delete mode 100644 render.yaml diff --git a/docs/README.md b/docs/README.md index 0c9e5f2..efb4696 100644 --- a/docs/README.md +++ b/docs/README.md @@ -22,10 +22,6 @@ This directory contains the documentation for the `base` project. - [Using GitHub Discussions](./community.discussions.md) - Leveraging Discussions for community conversations. - [Issue Management Guide](./community.issue-management.md) - Best practices for triaging issues. -## Deployment - -- [Deploying to Render.com](./deployment.render.md) - Instructions for deploying to Render.com. - ## Development - [GitHub Codespaces](./development.codespaces.md) - Using Codespaces for cloud-based development. diff --git a/docs/deployment.render.md b/docs/deployment.render.md index 6779979..21b39f6 100644 --- a/docs/deployment.render.md +++ b/docs/deployment.render.md @@ -1,5 +1,8 @@ # Deploying to Render.com +> [!WARNING] +> This feature is in development and is not yet ready for use. + This repository is configured for continuous deployment to [Render.com](https://render.com/) on their free tier. @@ -27,3 +30,14 @@ To deploy this repository to your own Render account: Any subsequent pushes to your `main` branch will automatically trigger a new deployment on Render. + +## `render.yaml` + +```yaml +services: + - type: web + name: base-template-app + env: docker + plan: free + healthCheckPath: / +``` diff --git a/render.yaml b/render.yaml deleted file mode 100644 index 4dc466e..0000000 --- a/render.yaml +++ /dev/null @@ -1,6 +0,0 @@ -services: - - type: web - name: base-template-app - env: docker - plan: free - healthCheckPath: / From d2fccb55a700e59b4afde7a5a20810941640a1a4 Mon Sep 17 00:00:00 2001 From: "google-labs-jules[bot]" <161369871+google-labs-jules[bot]@users.noreply.github.com> Date: Sat, 6 Sep 2025 11:21:56 +0000 Subject: [PATCH 2/4] docs: remove render deployment files and docs The render deployment is not ready for primetime. - Removes the deploy render from docs/readme - Marks docs/render.md on top as IN DEVELOPMENT - Moves the top level render yaml file to in-dev file as a codeblock, for future work - Removes the top level render yaml file. From 85a279f44b1052d55178571626b73631783db9cc Mon Sep 17 00:00:00 2001 From: "google-labs-jules[bot]" <161369871+google-labs-jules[bot]@users.noreply.github.com> Date: Sat, 6 Sep 2025 11:30:07 +0000 Subject: [PATCH 3/4] feat: expand workflow and simplify prettier docs - Expands the CI/CD workflow documentation by creating separate files for each workflow and updating the main workflow document. - Simplifies the Prettier documentation by merging two files into one and clarifying the content. --- docs/cicd.workflow-ci.md | 23 ++++++ docs/cicd.workflow-pages.md | 39 ++++++++++ docs/cicd.workflow-prettier.md | 24 +++++++ docs/cicd.workflow-release-on-tag.md | 27 +++++++ docs/cicd.workflows.md | 38 ++++------ docs/development.prettier-workflow.md | 34 --------- docs/development.prettier.md | 100 +++++++------------------- 7 files changed, 150 insertions(+), 135 deletions(-) create mode 100644 docs/cicd.workflow-ci.md create mode 100644 docs/cicd.workflow-pages.md create mode 100644 docs/cicd.workflow-prettier.md create mode 100644 docs/cicd.workflow-release-on-tag.md delete mode 100644 docs/development.prettier-workflow.md diff --git a/docs/cicd.workflow-ci.md b/docs/cicd.workflow-ci.md new file mode 100644 index 0000000..da01955 --- /dev/null +++ b/docs/cicd.workflow-ci.md @@ -0,0 +1,23 @@ +# CI Workflow + +The CI (Continuous Integration) workflow is defined in `.github/workflows/ci.yml`. + +## Triggers + +This workflow is triggered by the following events: + +- `push` to the `main` branch +- `pull_request` to the `main` branch + +## Jobs + +### `lint` + +This job, named "Lint Code Base", runs on the latest version of Ubuntu. It performs the following steps: + +1. **Checkout Code**: Checks out the repository's code. +2. **Setup Node.js**: Sets up Node.js version 20. +3. **Install Prettier**: Installs the Prettier code formatter globally. +4. **Run Prettier**: Runs `prettier --check .` to verify that all files in the repository are formatted correctly according to the Prettier configuration. + +The purpose of this workflow is to ensure that all code pushed to the `main` branch or included in a pull request to `main` adheres to the project's coding style, as defined by Prettier. This helps maintain code consistency and quality. diff --git a/docs/cicd.workflow-pages.md b/docs/cicd.workflow-pages.md new file mode 100644 index 0000000..edb58bc --- /dev/null +++ b/docs/cicd.workflow-pages.md @@ -0,0 +1,39 @@ +# GitHub Pages Deployment Workflow + +The GitHub Pages deployment workflow is defined in `.github/workflows/pages.yml`. Its purpose is to build and deploy the repository's content as a GitHub Pages website. + +## Triggers + +This workflow is triggered by: + +- A `push` to the `main` branch. +- A manual `workflow_dispatch` event, allowing it to be run from the Actions tab in GitHub. + +## Permissions + +The workflow is granted the following permissions: + +- `contents: read` to read the repository's content. +- `pages: write` to deploy to GitHub Pages. +- `id-token: write` to authenticate with GitHub Pages. + +## Concurrency + +The workflow uses a concurrency group named `"pages"` to ensure that only one deployment runs at a time. If a new workflow run is triggered while another is in progress, the new run will be queued. However, in-progress runs are not cancelled. + +## Jobs + +### `build` + +This job runs on `ubuntu-latest` and performs the following steps to build the site: + +1. **Checkout**: Checks out the repository's code. +2. **Setup Pages**: Configures the GitHub Pages environment. +3. **Build with Jekyll**: Uses the `actions/jekyll-build-pages` action to build the site with Jekyll. The source is the root of the repository (`./`), and the destination for the built site is `./_site`. +4. **Upload artifact**: Uploads the built site as a GitHub Pages artifact. + +### `deploy` + +This job also runs on `ubuntu-latest` and depends on the successful completion of the `build` job. It performs the following steps to deploy the site: + +1. **Deploy to GitHub Pages**: Uses the `actions/deploy-pages` action to deploy the artifact from the `build` job to GitHub Pages. The environment is configured for `github-pages`, and the URL of the deployed site is made available as an output. diff --git a/docs/cicd.workflow-prettier.md b/docs/cicd.workflow-prettier.md new file mode 100644 index 0000000..2d92715 --- /dev/null +++ b/docs/cicd.workflow-prettier.md @@ -0,0 +1,24 @@ +# Prettier Workflow + +The Prettier workflow, defined in `.github/workflows/prettier.yml`, automates code formatting for the entire repository. + +## Triggers + +This workflow is triggered on: + +- `push` to the `main` branch +- Any `pull_request` + +## Jobs + +### `format` + +This job runs on `ubuntu-latest` and performs the following steps: + +1. **Checkout Code**: Checks out the repository's code. It uses the `GITHUB_TOKEN` to allow the workflow to push changes back to the repository. +2. **Setup Node.js**: Sets up Node.js version 20 and configures caching for `npm` to speed up dependency installation. +3. **Install Dependencies**: Installs the project's dependencies, including Prettier, by running `npm install`. +4. **Run Prettier**: Executes `npx prettier --write .` to format all files in the repository in-place. +5. **Commit Changes**: Uses the `stefanzweifel/git-auto-commit-action` to check if Prettier made any changes. If there are changes, it commits them back to the current branch with the commit message "style: Format code with Prettier". This action is configured to check all files. + +The purpose of this workflow is to ensure that all code in the repository is consistently formatted according to the Prettier rules, without requiring developers to run Prettier manually before committing. diff --git a/docs/cicd.workflow-release-on-tag.md b/docs/cicd.workflow-release-on-tag.md new file mode 100644 index 0000000..127c1e0 --- /dev/null +++ b/docs/cicd.workflow-release-on-tag.md @@ -0,0 +1,27 @@ +# Release on Tag Workflow + +The "Create Release" workflow, defined in `.github/workflows/release-on-tag.yml`, automates the process of creating a new GitHub release whenever a new tag is pushed to the repository. + +## Triggers + +This workflow is triggered when a `push` event occurs with a tag that matches the pattern `v*.*.*` (e.g., `v1.0.0`, `v2.3.4`). + +## Jobs + +### `build` + +This job runs on `ubuntu-latest` and has `contents: write` permissions to allow it to create a release. It performs the following steps: + +1. **Checkout code**: Checks out the repository's code. `fetch-depth: 0` is used to fetch all history for all branches and tags, which is necessary for generating the changelog. + +2. **Generate release notes**: This step generates the body of the release notes. It does this by: + - Identifying the previous tag to determine the range of commits to include in the changelog. + - Generating a changelog from the Git history between the previous tag and the current `HEAD`. The changelog format is a list of commit messages, each with a link to the corresponding commit. + - Reading the release body template from `.github/RELEASE_BODY.md` and substituting the `${TAG}` placeholder with the current tag name. + - Combining the user-provided body, the generated changelog, and a link to the full diff on GitHub into a single `FINAL_BODY` output. + +3. **Get Release Title**: This step reads the release title template from `.github/RELEASE_TITLE.txt`, replaces the `${TAG}` placeholder with the current tag name, and sets the result as an output named `title`. + +4. **Create Release**: This final step uses the `softprops/action-gh-release` action to create the GitHub release. It uses the title and body generated in the previous steps, and sets the `tag_name` to the tag that triggered the workflow. The release is created as a full release (not a draft or pre-release). + +This workflow streamlines the release process by automating the creation of well-formatted, consistent GitHub releases based on Git tags. diff --git a/docs/cicd.workflows.md b/docs/cicd.workflows.md index ce11fa1..d727fa3 100644 --- a/docs/cicd.workflows.md +++ b/docs/cicd.workflows.md @@ -1,33 +1,19 @@ -# GitHub Workflows Documentation +# CI/CD Workflows -This document explains the purpose and usage of the GitHub Actions workflows -included in this repository. +This repository includes several GitHub Actions workflows to automate various tasks. Each workflow is defined in a `.yml` file in the `.github/workflows` directory. -## [`ci.yml`](../.github/workflows/ci.yml) +Below is an overview of the available workflows. For more detailed information about a specific workflow, please refer to its dedicated documentation page. -- **Purpose:** This workflow runs on every push and pull request to the `main` - branch. - It uses [Prettier](https://prettier.io/) to check for consistent formatting - in Markdown and YAML files, ensuring code quality and readability. -- **Triggers:** `push`, `pull_request` to `main`. +## Workflow Index -## [`pages.yml`](../.github/workflows/pages.yml) +- [**CI Workflow**](./cicd.workflow-ci.md) (`ci.yml`) + - Ensures code quality by running linting checks on every push and pull request to the `main` branch. -- **Purpose:** This workflow builds and deploys the project's documentation as - a GitHub Pages website. - It uses the root [`README.md`](../README.md) as the homepage. -- **Triggers:** `push` to `main`, `workflow_dispatch`. +- [**GitHub Pages Deployment**](./cicd.workflow-pages.md) (`pages.yml`) + - Builds and deploys the repository's content as a GitHub Pages website. -## [`release-on-tag.yml`](../.github/workflows/release-on-tag.yml) +- [**Prettier Workflow**](./cicd.workflow-prettier.md) (`prettier.yml`) + - Automatically formats the code in the repository using Prettier and commits the changes. -- **Purpose:** This workflow automates the creation of GitHub Releases. -- **Triggers:** `push` of a new tag matching the pattern `v*.*.*`. -- **Usage:** - 1. Edit the [`.github/RELEASE_TITLE.txt`](../.github/RELEASE_TITLE.txt) - and [`.github/RELEASE_BODY.md`](../.github/RELEASE_BODY.md) files to - describe the release. - You can use the `${TAG}` variable. - 2. Commit these changes. - 3. Push a new tag (e.g., `git tag v1.0.0 && git push origin v1.0.0`). - 4. The workflow will automatically create a new release with your notes, a - full changelog, and a link to the diff. +- [**Release on Tag**](./cicd.workflow-release-on-tag.md) (`release-on-tag.yml`) + - Automates the creation of GitHub Releases when a new version tag is pushed. diff --git a/docs/development.prettier-workflow.md b/docs/development.prettier-workflow.md deleted file mode 100644 index b0954d6..0000000 --- a/docs/development.prettier-workflow.md +++ /dev/null @@ -1,34 +0,0 @@ -# Prettier Workflow - -This repository includes a GitHub Actions workflow that automatically formats -all files in the repository using [Prettier](https://prettier.io/), a -widely-used code formatter. -This ensures a consistent and readable code style across the entire project. - -## Workflow Details - -- **Workflow File:** [`.github/workflows/prettier.yml`](../.github/workflows/prettier.yml) -- **Trigger:** This workflow is triggered automatically on: - - Pushes to the `main` branch. - - Any pull request. -- **Action:** When triggered, the workflow will: - 1. Check out the code from the relevant branch or pull request. - 2. Install the necessary dependencies (`npm install`). - 3. Run `npx prettier --write .` to format all files. - 4. If any files were changed by Prettier, the workflow will automatically - commit the changes back to the same branch (for pushes) or the pull - request's head branch with the commit message - `style: Format code with Prettier`. - -## How it Works - -The workflow runs automatically, so there are no manual steps required. - -- **On the `main` branch:** When code is pushed to `main`, the workflow will - run and commit any formatting changes directly to `main`. -- **On Pull Requests:** When you open a pull request, the workflow will run on - the code in your branch. - If it finds any formatting issues, it will push a new commit to your branch - with the fixes. - This helps ensure that all code is properly formatted before it gets merged - into `main`. diff --git a/docs/development.prettier.md b/docs/development.prettier.md index 4a21608..dcff3eb 100644 --- a/docs/development.prettier.md +++ b/docs/development.prettier.md @@ -1,92 +1,42 @@ -# Prettier +# Prettier for Code Formatting -Prettier is an opinionated code formatter. -It enforces a consistent style by parsing your code and re-printing it with -its own rules that take the maximum line length into account, wrapping code -when necessary. +[Prettier](https://prettier.io/) is an opinionated code formatter that enforces a consistent code style across the entire project. This repository is configured to use Prettier in two ways: automatically via a GitHub workflow and manually for local development. -This document provides instructions on how to install and run Prettier in your -project. +## Automated Formatting with GitHub Actions -## Installation +This repository includes a [GitHub Actions workflow](./cicd.workflow-prettier.md) that automatically formats all code. -The recommended approach is to install Prettier locally as a development -dependency. +- **How it works**: The workflow runs on every push to the `main` branch and on every pull request. It runs `prettier --write .` to format all files and commits any changes with the message "style: Format code with Prettier". +- **What you need to do**: Nothing! The workflow handles everything automatically. If you push code that isn't formatted, the workflow will create a new commit with the required formatting changes. -### npm +This ensures that all code merged into the `main` branch is consistently formatted. -```bash -npm install --save-dev --save-exact prettier -``` - -### yarn - -```bash -yarn add --dev --exact prettier -``` - -### pnpm - -```bash -pnpm add --save-dev --save-exact prettier -``` - -### bun - -```bash -bun add --dev --exact prettier -``` +## Manual Formatting -This repository includes a default configuration file, -[`.prettierrc`](../.prettierrc), so you don't need to create one from -scratch. -It lets editors and other tools know that you are using Prettier. +While the automated workflow handles formatting on the server, it's a good practice to run Prettier locally as you work. -It is also useful to create a `.prettierignore` file to specify which files -should not be formatted by Prettier. +### Installation -```bash -echo "# Ignore artifacts:\nbuild\ncoverage" > .prettierignore -``` - -## Usage - -Once Prettier is installed, you can run it from the command line to format -your files. - -### Format all files - -To format all files in your project, run the following command: +This repository includes Prettier as a development dependency in `package.json`. To install it, run: ```bash -npx prettier . --write +npm install ``` -### Format specific files or directories - -You can also format specific files or directories: +The repository also includes a [`.prettierrc`](../.prettierrc) configuration file, so you don't need to create one. -```bash -# Format all files in the 'app' directory -npx prettier app --write - -# Format a single file -npx prettier app/components/Button.js --write - -# Format all test files in a directory using a glob pattern -npx prettier "app/**/*.test.js" --write -``` +### Usage -### Check for formatting issues +You can run Prettier from the command line to format your files. -In a Continuous Integration (CI) environment, you can use the `--check` flag -to verify that all files are formatted correctly without actually modifying -them. -This is useful for enforcing a consistent code style. - -```bash -npx prettier . --check -``` +- **Format all files**: + ```bash + npx prettier . --write + ``` +- **Check for formatting issues without changing files**: + ```bash + npx prettier . --check + ``` + The [CI workflow](./cicd.workflow-ci.md) uses this command to validate formatting on pull requests. -For more information, please refer to the official -[Prettier documentation](https://prettier.io/docs/en/install.html). +For more detailed information on using Prettier, refer to the [official Prettier documentation](https://prettier.io/docs/en/). From 8856b742bafa27d792e06c7cfc05125f6e1be46b Mon Sep 17 00:00:00 2001 From: "google-labs-jules[bot]" <161369871+google-labs-jules[bot]@users.noreply.github.com> Date: Sat, 6 Sep 2025 11:37:37 +0000 Subject: [PATCH 4/4] refactor: rename cicd namespace to workflows - Renames all documentation files with the 'cicd.' prefix to use the more user-friendly 'workflows.' prefix. - Updates all internal links to reflect the new file names. --- docs/README.md | 6 +++--- docs/cicd.workflows.md | 19 ------------------- docs/development.prettier.md | 4 ++-- docs/{cicd.workflow-ci.md => workflows.ci.md} | 0 docs/workflows.md | 19 +++++++++++++++++++ ...d.workflow-pages.md => workflows.pages.md} | 0 ...flow-prettier.md => workflows.prettier.md} | 0 ...-on-tag.md => workflows.release-on-tag.md} | 0 ...-scheduling.md => workflows.scheduling.md} | 0 ...ent.md => workflows.secrets-management.md} | 0 10 files changed, 24 insertions(+), 24 deletions(-) delete mode 100644 docs/cicd.workflows.md rename docs/{cicd.workflow-ci.md => workflows.ci.md} (100%) create mode 100644 docs/workflows.md rename docs/{cicd.workflow-pages.md => workflows.pages.md} (100%) rename docs/{cicd.workflow-prettier.md => workflows.prettier.md} (100%) rename docs/{cicd.workflow-release-on-tag.md => workflows.release-on-tag.md} (100%) rename docs/{cicd.workflow-scheduling.md => workflows.scheduling.md} (100%) rename docs/{cicd.secrets-management.md => workflows.secrets-management.md} (100%) diff --git a/docs/README.md b/docs/README.md index efb4696..c99295a 100644 --- a/docs/README.md +++ b/docs/README.md @@ -12,9 +12,9 @@ This directory contains the documentation for the `base` project. ## CI/CD -- [Secrets Management](./cicd.secrets-management.md) - Best practices for managing secrets in GitHub Actions. -- [Workflow Scheduling](./cicd.workflow-scheduling.md) - Automating recurring tasks with cron. -- [GitHub Workflows](./cicd.workflows.md) - Explanation of the CI/CD workflows. +- [Secrets Management](./workflows.secrets-management.md) - Best practices for managing secrets in GitHub Actions. +- [Workflow Scheduling](./workflows.scheduling.md) - Automating recurring tasks with cron. +- [GitHub Workflows](./workflows.md) - Explanation of the CI/CD workflows. ## Community diff --git a/docs/cicd.workflows.md b/docs/cicd.workflows.md deleted file mode 100644 index d727fa3..0000000 --- a/docs/cicd.workflows.md +++ /dev/null @@ -1,19 +0,0 @@ -# CI/CD Workflows - -This repository includes several GitHub Actions workflows to automate various tasks. Each workflow is defined in a `.yml` file in the `.github/workflows` directory. - -Below is an overview of the available workflows. For more detailed information about a specific workflow, please refer to its dedicated documentation page. - -## Workflow Index - -- [**CI Workflow**](./cicd.workflow-ci.md) (`ci.yml`) - - Ensures code quality by running linting checks on every push and pull request to the `main` branch. - -- [**GitHub Pages Deployment**](./cicd.workflow-pages.md) (`pages.yml`) - - Builds and deploys the repository's content as a GitHub Pages website. - -- [**Prettier Workflow**](./cicd.workflow-prettier.md) (`prettier.yml`) - - Automatically formats the code in the repository using Prettier and commits the changes. - -- [**Release on Tag**](./cicd.workflow-release-on-tag.md) (`release-on-tag.yml`) - - Automates the creation of GitHub Releases when a new version tag is pushed. diff --git a/docs/development.prettier.md b/docs/development.prettier.md index dcff3eb..4c668e6 100644 --- a/docs/development.prettier.md +++ b/docs/development.prettier.md @@ -4,7 +4,7 @@ ## Automated Formatting with GitHub Actions -This repository includes a [GitHub Actions workflow](./cicd.workflow-prettier.md) that automatically formats all code. +This repository includes a [GitHub Actions workflow](./workflows.prettier.md) that automatically formats all code. - **How it works**: The workflow runs on every push to the `main` branch and on every pull request. It runs `prettier --write .` to format all files and commits any changes with the message "style: Format code with Prettier". - **What you need to do**: Nothing! The workflow handles everything automatically. If you push code that isn't formatted, the workflow will create a new commit with the required formatting changes. @@ -37,6 +37,6 @@ You can run Prettier from the command line to format your files. ```bash npx prettier . --check ``` - The [CI workflow](./cicd.workflow-ci.md) uses this command to validate formatting on pull requests. + The [CI workflow](./workflows.ci.md) uses this command to validate formatting on pull requests. For more detailed information on using Prettier, refer to the [official Prettier documentation](https://prettier.io/docs/en/). diff --git a/docs/cicd.workflow-ci.md b/docs/workflows.ci.md similarity index 100% rename from docs/cicd.workflow-ci.md rename to docs/workflows.ci.md diff --git a/docs/workflows.md b/docs/workflows.md new file mode 100644 index 0000000..8d5d451 --- /dev/null +++ b/docs/workflows.md @@ -0,0 +1,19 @@ +# CI/CD Workflows + +This repository includes several GitHub Actions workflows to automate various tasks. Each workflow is defined in a `.yml` file in the `.github/workflows` directory. + +Below is an overview of the available workflows. For more detailed information about a specific workflow, please refer to its dedicated documentation page. + +## Workflow Index + +- [**CI Workflow**](./workflows.ci.md) (`ci.yml`) +- Ensures code quality by running linting checks on every push and pull request to the `main` branch. + +- [**GitHub Pages Deployment**](./workflows.pages.md) (`pages.yml`) +- Builds and deploys the repository's content as a GitHub Pages website. + +- [**Prettier Workflow**](./workflows.prettier.md) (`prettier.yml`) +- Automatically formats the code in the repository using Prettier and commits the changes. + +- [**Release on Tag**](./workflows.release-on-tag.md) (`release-on-tag.yml`) +- Automates the creation of GitHub Releases when a new version tag is pushed. diff --git a/docs/cicd.workflow-pages.md b/docs/workflows.pages.md similarity index 100% rename from docs/cicd.workflow-pages.md rename to docs/workflows.pages.md diff --git a/docs/cicd.workflow-prettier.md b/docs/workflows.prettier.md similarity index 100% rename from docs/cicd.workflow-prettier.md rename to docs/workflows.prettier.md diff --git a/docs/cicd.workflow-release-on-tag.md b/docs/workflows.release-on-tag.md similarity index 100% rename from docs/cicd.workflow-release-on-tag.md rename to docs/workflows.release-on-tag.md diff --git a/docs/cicd.workflow-scheduling.md b/docs/workflows.scheduling.md similarity index 100% rename from docs/cicd.workflow-scheduling.md rename to docs/workflows.scheduling.md diff --git a/docs/cicd.secrets-management.md b/docs/workflows.secrets-management.md similarity index 100% rename from docs/cicd.secrets-management.md rename to docs/workflows.secrets-management.md