From c43eae25528e08a19e9bf4af4d5753ab814a1179 Mon Sep 17 00:00:00 2001
From: Patrick Kollitsch <davidsneighbourdev+gh@gmail.com>
Date: Sun, 07 Jun 2026 05:38:51 +0000
Subject: [PATCH] fix: various changes to workspace, testing, linting, etc.

---
 /dev/null                               |   15 -
 tests/catalog.yaml                      |   12 +
 CONTRIBUTING.md                         |   32 +--
 .markdownlint.jsonc                     |  281 ++++++++++++++++------------------
 ananke.code-workspace                   |   47 +++++
 .github/dependabot.yml                  |    6 
 .github/workflows/branch-protection.yml |   52 ------
 7 files changed, 209 insertions(+), 236 deletions(-)

diff --git a/.github/dependabot.yml b/.github/dependabot.yml
index 92e45b2..4cb74d9 100644
--- a/.github/dependabot.yml
+++ b/.github/dependabot.yml
@@ -17,7 +17,7 @@
       semver-patch-days: 4
     assignees:
       - davidsneighbour
-    target-branch: maintenance
+    target-branch: development
     open-pull-requests-limit: 999
     pull-request-branch-name:
       separator: /
@@ -38,7 +38,7 @@
       semver-patch-days: 4
     assignees:
       - davidsneighbour
-    target-branch: maintenance
+    target-branch: development
     open-pull-requests-limit: 999
     pull-request-branch-name:
       separator: /
@@ -56,7 +56,7 @@
       default-days: 7
     assignees:
       - davidsneighbour
-    target-branch: maintenance
+    target-branch: development
     open-pull-requests-limit: 999
     pull-request-branch-name:
       separator: /
diff --git a/.github/workflows/branch-protection.yml b/.github/workflows/branch-protection.yml
index 45499b7..160e327 100644
--- a/.github/workflows/branch-protection.yml
+++ b/.github/workflows/branch-protection.yml
@@ -9,7 +9,7 @@
 
 jobs:
   validate-main-source-branch:
-    name: Require staging or maintenance as source branch for main
+    name: Require development as source branch for main
     runs-on: ubuntu-latest
     if: github.base_ref == 'main'
 
@@ -21,53 +21,7 @@
         run: |
           set -euo pipefail
 
-          if [ "${HEAD_REF}" != "staging" ] && [ "${HEAD_REF}" != "maintenance" ]; then
-            echo "::error::Pull requests into main must come from staging or maintenance. Current source branch: ${HEAD_REF}"
+          if [ "${HEAD_REF}" != "development" ]; then
+            echo "::error::Pull requests into main must come from development. Current source branch: ${HEAD_REF}"
             exit 1
           fi
-
-  validate-staging-source-branch:
-    name: Require development or maintenance as source branch for staging
-    runs-on: ubuntu-latest
-    if: github.base_ref == 'staging'
-
-    steps:
-      - name: Validate source branch
-        shell: bash
-        env:
-          HEAD_REF: ${{ github.head_ref }}
-        run: |
-          set -euo pipefail
-
-          if [ "${HEAD_REF}" != "development" ] && [ "${HEAD_REF}" != "maintenance" ]; then
-            echo "::error::Pull requests into staging must come from development or maintenance. Current source branch: ${HEAD_REF}"
-            exit 1
-          fi
-
-  protect-package-lock:
-    name: Block package-lock.json outside maintenance
-    runs-on: ubuntu-latest
-    if: github.base_ref != 'maintenance'
-
-    steps:
-      - name: Check out repository
-        uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd
-        with:
-          fetch-depth: 0
-          persist-credentials: false
-
-      - name: Fail if package-lock.json changed outside maintenance
-        shell: bash
-        env:
-          BASE_SHA: ${{ github.event.pull_request.base.sha }}
-          HEAD_SHA: ${{ github.event.pull_request.head.sha }}
-          BASE_REF: ${{ github.base_ref }}
-        run: |
-          set -euo pipefail
-
-          changed_files=$(git diff --name-only "${BASE_SHA}...${HEAD_SHA}")
-
-          if echo "${changed_files}" | grep -Fxq "package-lock.json"; then
-            echo "::error file=package-lock.json::package-lock.json may only be changed in PRs targeting maintenance. Current target branch: ${BASE_REF}"
-            exit 1
-          fi
\ No newline at end of file
diff --git a/.markdownlint.jsonc b/.markdownlint.jsonc
index b7212d0..6bb66af 100644
--- a/.markdownlint.jsonc
+++ b/.markdownlint.jsonc
@@ -1,150 +1,133 @@
 {
-  "$schema": "https://github.com/DavidAnson/markdownlint/blob/main/schema/markdownlint-config-schema.json",
-  "$id": "https://raw.githubusercontent.com/davidsneighbour/kollitsch.dev/refs/heads/main/src/config/.markdownlint.jsonc",
-  "default": true,
-  "customRules": [
-    "@github/markdownlint-github",
-    "markdownlint-rule-relative-links",
-    "markdownlint-rule-search-replace",
-    "markdownlint-rule-extended-ascii",
-    "markdownlint-rule-title-case-style",
-    "markdownlint-rule-list-duplicates"
-  ],
-  // Rules
-  // unlisted rules are using default settings (usually "true")
-  // @see https://github.com/DavidAnson/markdownlint/#rules--aliases
-  "MD001": {
-    "severity": "error",
-    "front_matter_title": "^\\s*title\\s*[:=]"
-  },
-  "MD003": {
-    "style": "atx"
-  },
-  "MD004": {
-    "style": "asterisk"
-  },
-  "MD005": true,
-  "MD007": {
-    "indent": 2
-  },
-  // NO limitation on line length
-  "MD013": false,
-  // ignored rule for closed atx headings
-  "MD020": false,
-  // ignored rule for closed atx headings
-  "MD021": false,
-  // disallow multiple headings with the same content within the same level structure
-  "MD024": {
-    "siblings_only": true,
-    "allow_different_nesting": true
-  },
-  // no inline HTML elements, except for the allowed ones. in tables only the explicit allowed ones
-  "MD033": {
-    "allowed_elements": [
-      "lite-youtube",
-      "color-grid",
-      "date-diff",
-      "kbd"
-    ],
-    "table_allowed_elements": [
-      "kbd"
-    ]
-  },
-  // use consistent rule markers (`---`)
-  "MD035": {
-    "style": "---"
-  },
-  // unused header structure rule
-  "MD043": false,
-  // unused spelling enforcement
-  "MD044": false,
-  // fenced code blocks style
-  "MD046": {
-    "style": "fenced"
-  },
-  // code blocks must use backticks instead of tildes
-  "MD048": {
-    "style": "backtick"
-  },
-  // emphasis must use asterisks `*` instead of underscores `_`
-  "MD049": {
-    "style": "asterisk"
-  },
-  // strong style must use double asterisks `**` instead of double underscores `__`
-  "MD050": {
-    "style": "asterisk"
-  },
-  // links must not be auto links, all other link formats are allowed
-  "MD054": {
-    "autolink": false
-  },
-  // table pipes must be used before and after each table row
-  "MD055": {
-    "style": "leading_and_trailing"
-  },
-  // generic linktexts are prohibited
-  "MD059": {
-    "prohibited_texts": [
-      "click here",
-      "here",
-      "link",
-      "more"
-    ]
-  },
-  // table style must be compact (single spaces around cell content)
-  "MD060": {
-    "style": "aligned"
-  },
-  // @see https://www.npmjs.com/package/@github/markdownlint-github
-  // images should not contain default alternate texts
-  "GH001": true,
-  // links should not contain generic text ('click here', 'read more', etc.)
-  "GH002": {
-    "additional_banned_texts": [
-      "Something",
-      "Click here"
-    ]
-  },
-  // no empty alt texts for images
-  "GH003": true,
-  // @see https://www.npmjs.com/package/markdownlint-rule-relative-links
-  "relative-links": {
-    "root_path": "../.."
-  },
-  // @see https://www.npmjs.com/package/markdownlint-rule-search-replace
-  "search-replace": {
-    "rules": [
-      {
-        "name": "ellipsis",
-        "message": "Do not use three dots '...' for ellipsis.",
-        "information": "https://example.com/rules/ellipsis",
-        "search": "...",
-        "replace": "…",
-        "searchScope": "text"
-      },
-      {
-        "name": "curly-double-quotes",
-        "message": "Do not use curly double quotes.",
-        "searchPattern": "/“|”/g",
-        "replace": "\""
-      }
-    ]
-  },
-  // @see https://www.npmjs.com/package/markdownlint-rule-extended-ascii
-  "extended-ascii": {
-    "ascii-only": true
-  },
-  // @see https://www.npmjs.com/package/markdownlint-rule-title-case-style
-  "title-case-style": {
-    // letter case style to apply
-    //
-    // "sentence" or "title" (default: sentence)
-    "case": "sentence",
-    // words to ignore when applying letter case.
-    //
-    // string[] (default: [])
-    "ignore": [
-      "JavaScript"
-    ],
-  },
-}
\ No newline at end of file
+	"$schema": "https://github.com/DavidAnson/markdownlint/blob/main/schema/markdownlint-config-schema.json",
+	"$id": "https://raw.githubusercontent.com/davidsneighbour/kollitsch.dev/refs/heads/main/src/config/.markdownlint.jsonc",
+	"default": true,
+	"customRules": [
+		"@github/markdownlint-github",
+		"markdownlint-rule-relative-links",
+		"markdownlint-rule-search-replace",
+		"markdownlint-rule-extended-ascii",
+		"markdownlint-rule-title-case-style",
+		"markdownlint-rule-list-duplicates"
+	],
+	// Rules
+	// unlisted rules are using default settings (usually "true")
+	// @see https://github.com/DavidAnson/markdownlint/#rules--aliases
+	"MD001": {
+		"severity": "error",
+		"front_matter_title": "^\\s*title\\s*[:=]"
+	},
+	"MD003": {
+		"style": "atx"
+	},
+	"MD004": {
+		"style": "asterisk"
+	},
+	"MD005": true,
+	"MD007": {
+		"indent": 2
+	},
+	// NO limitation on line length
+	"MD013": false,
+	// ignored rule for closed atx headings
+	"MD020": false,
+	// ignored rule for closed atx headings
+	"MD021": false,
+	// disallow multiple headings with the same content within the same level structure
+	"MD024": {
+		"siblings_only": true,
+		"allow_different_nesting": true
+	},
+	// no inline HTML elements, except for the allowed ones. in tables only the explicit allowed ones
+	"MD033": {
+		"allowed_elements": ["lite-youtube", "color-grid", "date-diff", "kbd"],
+		"table_allowed_elements": ["kbd"]
+	},
+	// use consistent rule markers (`---`)
+	"MD035": {
+		"style": "---"
+	},
+	// unused header structure rule
+	"MD043": false,
+	// unused spelling enforcement
+	"MD044": false,
+	// fenced code blocks style
+	"MD046": {
+		"style": "fenced"
+	},
+	// code blocks must use backticks instead of tildes
+	"MD048": {
+		"style": "backtick"
+	},
+	// emphasis must use asterisks `*` instead of underscores `_`
+	"MD049": {
+		"style": "asterisk"
+	},
+	// strong style must use double asterisks `**` instead of double underscores `__`
+	"MD050": {
+		"style": "asterisk"
+	},
+	// links must not be auto links, all other link formats are allowed
+	"MD054": {
+		"autolink": false
+	},
+	// table pipes must be used before and after each table row
+	"MD055": {
+		"style": "leading_and_trailing"
+	},
+	// generic linktexts are prohibited
+	"MD059": {
+		"prohibited_texts": ["click here", "here", "link", "more"]
+	},
+	// table style must be compact (single spaces around cell content)
+	"MD060": {
+		"style": "compact"
+	},
+	// @see https://www.npmjs.com/package/@github/markdownlint-github
+	// images should not contain default alternate texts
+	"GH001": true,
+	// links should not contain generic text ('click here', 'read more', etc.)
+	"GH002": {
+		"additional_banned_texts": ["Something", "Click here"]
+	},
+	// no empty alt texts for images
+	"GH003": true,
+	// @see https://www.npmjs.com/package/markdownlint-rule-relative-links
+	"relative-links": {
+		"root_path": "../.."
+	},
+	// @see https://www.npmjs.com/package/markdownlint-rule-search-replace
+	"search-replace": {
+		"rules": [
+			{
+				"name": "ellipsis",
+				"message": "Do not use three dots '...' for ellipsis.",
+				"information": "https://example.com/rules/ellipsis",
+				"search": "...",
+				"replace": "…",
+				"searchScope": "text"
+			},
+			{
+				"name": "curly-double-quotes",
+				"message": "Do not use curly double quotes.",
+				"searchPattern": "/“|”/g",
+				"replace": "\""
+			}
+		]
+	},
+	// @see https://www.npmjs.com/package/markdownlint-rule-extended-ascii
+	"extended-ascii": {
+		"ascii-only": true
+	},
+	// @see https://www.npmjs.com/package/markdownlint-rule-title-case-style
+	"title-case-style": {
+		// letter case style to apply
+		//
+		// "sentence" or "title" (default: sentence)
+		"case": "sentence",
+		// words to ignore when applying letter case.
+		//
+		// string[] (default: [])
+		"ignore": ["JavaScript"]
+	}
+}
diff --git a/.vscode/extensions.json b/.vscode/extensions.json
deleted file mode 100644
index 8b251b8..0000000
--- a/.vscode/extensions.json
+++ /dev/null
@@ -1,15 +0,0 @@
-{
-	"recommendations": [
-		"pkief.material-icon-theme",
-		"yzhang.markdown-all-in-one",
-		"davidanson.vscode-markdownlint",
-		"zizmor.zizmor-vscode",
-		"redhat.vscode-yaml",
-		"streetsidesoftware.code-spell-checker-cspell-bundled-dictionaries",
-		"budparr.language-hugo-vscode",
-		"jinliming2.vscode-go-template",
-		"gohugoio.gotmplfmt",
-		"dunstontc.vscode-go-syntax",
-		"casualjim.gotemplate"
-	]
-}
diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md
index 9b8eecf..361b32d 100644
--- a/CONTRIBUTING.md
+++ b/CONTRIBUTING.md
@@ -40,15 +40,15 @@
 1. Use a compatible Hugo version (see [`config/_default/module.toml`](https://github.com/gohugo-ananke/ananke/blob/main/config/_default/module.toml) for the current state).
 2. Install dependencies:
 
- ```bash
- npm install
- ```
+```bash
+npm install
+```
 
 1. Run a local preview via `npm run` instead of just calling `hugo server`:
 
- ```bash
- npm run server
- ```
+```bash
+npm run server
+```
 
  This runs the documentation site from `site/` using contents from `docs/` with local configuration.
 
@@ -56,9 +56,9 @@
 
 2. Make sure to install git hooks for linting and testing before you push changes:
 
- ```bash
- npm run prepare
- ```
+```bash
+npm run prepare
+```
 
  This command is run automatically after `npm install` but you can run it manually to set up hooks in an existing clone or update changed hooks. It uses `simple-git-hooks` to install a commit hook that runs `lint-staged` for markdown files, which in turn runs linting tasks on staged files.
 
@@ -74,7 +74,6 @@
 flowchart LR
  feature["feature/*, fix/*, docs/*, refactor/*"] --> development
  development --> main
- maintenance --> main
  main --> development
 ```
 
@@ -82,11 +81,10 @@
 
 ### Long-lived branches
 
-| Branch  | Purpose  | Release role | Write policy | Merge  |
+| Branch | Purpose | Release role | Write policy | Merge |
 | --- | --- | --- | --- | --- |
-| `main`  | Stable source of truth | releases | Protected. Only receives reviewed PRs from `staging` or `maintenance`. | Rebase |
+| `main` | Stable source of truth | releases | Protected. Only receives reviewed PRs from `development`. | Rebase |
 | `development` | Active development | pre-releases | Feature, fix, chore, and documentation PRs target this branch. | Squash |
-| `maintenance` | Dependency maintenance  | none | Maintainer-only branch for dependency version updates. | Rebase |
 
 ### Branch naming
 
@@ -98,8 +96,6 @@
 * `chore/<topic>`
 * `refactor/<topic>`
 
-Dependency update branches MUST target `maintenance` unless the change is part of an intentional feature branch and does not touch lock files.
-
 After a successful rebase between those branches, push with lease:
 
 ```bash
@@ -113,9 +109,9 @@
 3. Update docs for all user-facing changes.
 4. Run quality checks locally:
 
- ```bash
- npm run lint:markdown
- ```
+```bash
+npm run lint:markdown
+```
 
 1. If your change affects behaviour, validate with Hugo locally (for example `hugo` or `hugo server` in the relevant project).
 2. Open a pull request with:
diff --git a/ananke.code-workspace b/ananke.code-workspace
new file mode 100644
index 0000000..d56f59f
--- /dev/null
+++ b/ananke.code-workspace
@@ -0,0 +1,47 @@
+{
+	"folders": [
+		{
+			"path": "."
+		},
+		{
+			"path": "../documentation"
+		},
+		{
+			"path": "../template-git-submod"
+		},
+		{
+			"path": "../template-hugo-mod"
+		}
+	],
+	"settings": {
+		"window.autoDetectColorScheme": false,
+		"markdown.extension.tableFormatter.enabled": false,
+		"chat.tools.terminal.autoApprove": {
+			"git fetch": true,
+			"git worktree": true,
+			"git add": true,
+			"git push": true
+		}
+	},
+	"extensions": {
+		"recommendations": [
+			"ms-vscode.vscode-github-issue-notebooks",
+			"github.vscode-pull-request-github",
+			"pkief.material-icon-theme",
+			"yzhang.markdown-all-in-one",
+			"davidanson.vscode-markdownlint",
+			"zizmor.zizmor-vscode",
+			"redhat.vscode-yaml",
+			"streetsidesoftware.code-spell-checker-cspell-bundled-dictionaries",
+			"budparr.language-hugo-vscode",
+			"jinliming2.vscode-go-template",
+			"gohugoio.gotmplfmt",
+			"dunstontc.vscode-go-syntax",
+			"casualjim.gotemplate",
+			"streetsidesoftware.code-spell-checker",
+			"streetsidesoftware.code-spell-checker-british-english",
+			"gohugoio.gotmplfmt",
+			"anthropic.claude-code"
+		]
+	}
+}
\ No newline at end of file
diff --git a/tests/catalog.yaml b/tests/catalog.yaml
index 4e77890..eaca4bc 100644
--- a/tests/catalog.yaml
+++ b/tests/catalog.yaml
@@ -17,6 +17,14 @@
 
 shortcodes:
   form-contact:
-    tests: ["scripts/test-hugo-quickstart.ts"] # TODO: add a dedicated form-contact test
+    tests: [
+      "scripts/test-hugo-quickstart.ts",
+    ] # TODO: add a dedicated form-contact test
   page-index:
-    tests: ["scripts/test-hugo-quickstart.ts"] # TODO: add a dedicated page-index test
+    tests: [
+      "scripts/test-hugo-quickstart.ts",
+    ] # TODO: add a dedicated page-index test
+  since:
+    tests: [
+      "scripts/test-hugo-quickstart.ts",
+    ] # TODO: add a dedicated since test

--
Gitblit v1.10.0