From 174c4b85ff810c20ae5e46664a30fae05dab33fb Mon Sep 17 00:00:00 2001
From: fOuttaMyPaint
Date: Sun, 29 Mar 2026 17:18:23 -0400
Subject: [PATCH 01/27] chore: add CodeQL, dependency review, dependabot,
release-drafter config, and README badges
- CodeQL security scanning workflow (weekly + push/PR)
- Dependency review action for PRs (fail on high severity)
- Dependabot for npm, pip, and GitHub Actions updates
- Release-drafter config with changelog categories and autolabeler
- README badges: validate, CI, CodeQL, pages, links, release, issues
Made-with: Cursor
---
.github/dependabot.yml | 33 +++++++++++++
.github/release-drafter.yml | 65 +++++++++++++++++--------
.github/workflows/codeql.yml | 37 ++++++++++++++
.github/workflows/dependency-review.yml | 19 ++++++++
README.md | 11 ++++-
5 files changed, 143 insertions(+), 22 deletions(-)
create mode 100644 .github/dependabot.yml
create mode 100644 .github/workflows/codeql.yml
create mode 100644 .github/workflows/dependency-review.yml
diff --git a/.github/dependabot.yml b/.github/dependabot.yml
new file mode 100644
index 0000000..d193fb5
--- /dev/null
+++ b/.github/dependabot.yml
@@ -0,0 +1,33 @@
+version: 2
+updates:
+ - package-ecosystem: "npm"
+ directory: "/mcp-server"
+ schedule:
+ interval: "weekly"
+ day: "monday"
+ open-pull-requests-limit: 10
+ labels:
+ - "dependencies"
+ commit-message:
+ prefix: "deps"
+
+ - package-ecosystem: "pip"
+ directory: "/"
+ schedule:
+ interval: "monthly"
+ open-pull-requests-limit: 5
+ labels:
+ - "dependencies"
+ commit-message:
+ prefix: "deps"
+
+ - package-ecosystem: "github-actions"
+ directory: "/"
+ schedule:
+ interval: "weekly"
+ day: "monday"
+ open-pull-requests-limit: 10
+ labels:
+ - "ci"
+ commit-message:
+ prefix: "ci"
diff --git a/.github/release-drafter.yml b/.github/release-drafter.yml
index 4e35fc1..0c62359 100644
--- a/.github/release-drafter.yml
+++ b/.github/release-drafter.yml
@@ -1,46 +1,71 @@
name-template: "v$RESOLVED_VERSION"
tag-template: "v$RESOLVED_VERSION"
+template: |
+ ## What's Changed
+
+ $CHANGES
+
+ **Full Changelog**: https://github.com/$OWNER/$REPOSITORY/compare/$PREVIOUS_TAG...v$RESOLVED_VERSION
categories:
- - title: "Skills"
+ - title: "New MCP Tools"
labels:
- - "skill"
- - title: "Rules"
+ - "new-tool"
+ - "mcp"
+ - title: "Skills & Rules"
labels:
+ - "skill"
- "rule"
- - title: "MCP Tools"
- labels:
- - "mcp-tool"
- - title: "Enhancements"
- labels:
- - "enhancement"
- title: "Bug Fixes"
labels:
- "bug"
+ - "fix"
- title: "Documentation"
labels:
- "documentation"
- - title: "Maintenance"
+ - "docs"
+ - title: "CI / Infrastructure"
labels:
- - "maintenance"
+ - "ci"
+ - "infrastructure"
- "dependencies"
-change-template: "- $TITLE @$AUTHOR (#$NUMBER)"
+ - title: "Other Changes"
+ labels:
+ - "*"
+change-template: "- $TITLE (#$NUMBER) @$AUTHOR"
change-title-escapes: '\<*_&'
version-resolver:
major:
labels:
- "major"
+ - "breaking"
minor:
labels:
- "minor"
+ - "feature"
+ - "new-tool"
patch:
labels:
- "patch"
+ - "bug"
+ - "fix"
+ - "docs"
default: patch
-template: |
- ## Changes
-
- $CHANGES
-
- ## Contributors
-
- $CONTRIBUTORS
+exclude-labels:
+ - "skip-changelog"
+autolabeler:
+ - label: "documentation"
+ files:
+ - "*.md"
+ - "docs/**"
+ - label: "ci"
+ files:
+ - ".github/**"
+ - label: "mcp"
+ files:
+ - "mcp-server/**"
+ - label: "skill"
+ files:
+ - "skills/**"
+ - label: "rule"
+ files:
+ - "rules/**"
diff --git a/.github/workflows/codeql.yml b/.github/workflows/codeql.yml
new file mode 100644
index 0000000..fb05c11
--- /dev/null
+++ b/.github/workflows/codeql.yml
@@ -0,0 +1,37 @@
+name: CodeQL
+
+on:
+ push:
+ branches: [main]
+ pull_request:
+ branches: [main]
+ schedule:
+ - cron: "0 6 * * 1"
+
+permissions:
+ actions: read
+ contents: read
+ security-events: write
+
+jobs:
+ analyze:
+ runs-on: ubuntu-latest
+ strategy:
+ fail-fast: false
+ matrix:
+ language: [javascript-typescript]
+ steps:
+ - uses: actions/checkout@v4
+
+ - name: Initialize CodeQL
+ uses: github/codeql-action/init@v3
+ with:
+ languages: ${{ matrix.language }}
+
+ - name: Autobuild
+ uses: github/codeql-action/autobuild@v3
+
+ - name: Perform CodeQL Analysis
+ uses: github/codeql-action/analyze@v3
+ with:
+ category: "/language:${{ matrix.language }}"
diff --git a/.github/workflows/dependency-review.yml b/.github/workflows/dependency-review.yml
new file mode 100644
index 0000000..66949c1
--- /dev/null
+++ b/.github/workflows/dependency-review.yml
@@ -0,0 +1,19 @@
+name: Dependency Review
+
+on:
+ pull_request:
+ branches: [main]
+
+permissions:
+ contents: read
+ pull-requests: write
+
+jobs:
+ dependency-review:
+ runs-on: ubuntu-latest
+ steps:
+ - uses: actions/checkout@v4
+ - uses: actions/dependency-review-action@v4
+ with:
+ fail-on-severity: high
+ comment-summary-in-pr: always
diff --git a/README.md b/README.md
index 7718591..bf325be 100644
--- a/README.md
+++ b/README.md
@@ -9,13 +9,20 @@
-
+
+
+
+
+
+
-
+
+
+
From f51dd91b25fa6fba5364f8ef2ead62686dad8438 Mon Sep 17 00:00:00 2001
From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com>
Date: Sun, 29 Mar 2026 21:19:06 +0000
Subject: [PATCH 02/27] ci: bump actions/deploy-pages from 4 to 5
Bumps [actions/deploy-pages](https://github.com/actions/deploy-pages) from 4 to 5.
- [Release notes](https://github.com/actions/deploy-pages/releases)
- [Commits](https://github.com/actions/deploy-pages/compare/v4...v5)
---
updated-dependencies:
- dependency-name: actions/deploy-pages
dependency-version: '5'
dependency-type: direct:production
update-type: version-update:semver-major
...
Signed-off-by: dependabot[bot]
---
.github/workflows/pages.yml | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/.github/workflows/pages.yml b/.github/workflows/pages.yml
index 35b8227..b33722e 100644
--- a/.github/workflows/pages.yml
+++ b/.github/workflows/pages.yml
@@ -38,4 +38,4 @@ jobs:
- name: Deploy to GitHub Pages
id: deployment
- uses: actions/deploy-pages@v4
+ uses: actions/deploy-pages@v5
From db2540054e31857f7acdaa43b5476a1da7da5407 Mon Sep 17 00:00:00 2001
From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com>
Date: Sun, 29 Mar 2026 21:19:06 +0000
Subject: [PATCH 03/27] ci: bump release-drafter/release-drafter from 6 to 7
Bumps [release-drafter/release-drafter](https://github.com/release-drafter/release-drafter) from 6 to 7.
- [Release notes](https://github.com/release-drafter/release-drafter/releases)
- [Commits](https://github.com/release-drafter/release-drafter/compare/v6...v7)
---
updated-dependencies:
- dependency-name: release-drafter/release-drafter
dependency-version: '7'
dependency-type: direct:production
update-type: version-update:semver-major
...
Signed-off-by: dependabot[bot]
---
.github/workflows/release-drafter.yml | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/.github/workflows/release-drafter.yml b/.github/workflows/release-drafter.yml
index 3cd8a2a..f758003 100644
--- a/.github/workflows/release-drafter.yml
+++ b/.github/workflows/release-drafter.yml
@@ -14,6 +14,6 @@ jobs:
update-release-draft:
runs-on: ubuntu-latest
steps:
- - uses: release-drafter/release-drafter@v6
+ - uses: release-drafter/release-drafter@v7
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
From c8df726669ce237bc83cf5f6293a9aaf799996b5 Mon Sep 17 00:00:00 2001
From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com>
Date: Sun, 29 Mar 2026 21:19:15 +0000
Subject: [PATCH 04/27] ci: bump github/codeql-action from 3 to 4
Bumps [github/codeql-action](https://github.com/github/codeql-action) from 3 to 4.
- [Release notes](https://github.com/github/codeql-action/releases)
- [Changelog](https://github.com/github/codeql-action/blob/main/CHANGELOG.md)
- [Commits](https://github.com/github/codeql-action/compare/v3...v4)
---
updated-dependencies:
- dependency-name: github/codeql-action
dependency-version: '4'
dependency-type: direct:production
update-type: version-update:semver-major
...
Signed-off-by: dependabot[bot]
---
.github/workflows/codeql.yml | 6 +++---
1 file changed, 3 insertions(+), 3 deletions(-)
diff --git a/.github/workflows/codeql.yml b/.github/workflows/codeql.yml
index fb05c11..27afecb 100644
--- a/.github/workflows/codeql.yml
+++ b/.github/workflows/codeql.yml
@@ -24,14 +24,14 @@ jobs:
- uses: actions/checkout@v4
- name: Initialize CodeQL
- uses: github/codeql-action/init@v3
+ uses: github/codeql-action/init@v4
with:
languages: ${{ matrix.language }}
- name: Autobuild
- uses: github/codeql-action/autobuild@v3
+ uses: github/codeql-action/autobuild@v4
- name: Perform CodeQL Analysis
- uses: github/codeql-action/analyze@v3
+ uses: github/codeql-action/analyze@v4
with:
category: "/language:${{ matrix.language }}"
From 1502c9eac0502edac928b9014fe12fdd3a039172 Mon Sep 17 00:00:00 2001
From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com>
Date: Sun, 29 Mar 2026 21:19:17 +0000
Subject: [PATCH 05/27] deps: bump @types/node from 22.19.15 to 25.5.0 in
/mcp-server
Bumps [@types/node](https://github.com/DefinitelyTyped/DefinitelyTyped/tree/HEAD/types/node) from 22.19.15 to 25.5.0.
- [Release notes](https://github.com/DefinitelyTyped/DefinitelyTyped/releases)
- [Commits](https://github.com/DefinitelyTyped/DefinitelyTyped/commits/HEAD/types/node)
---
updated-dependencies:
- dependency-name: "@types/node"
dependency-version: 25.5.0
dependency-type: direct:development
update-type: version-update:semver-major
...
Signed-off-by: dependabot[bot]
---
mcp-server/package-lock.json | 20 ++++++++++----------
mcp-server/package.json | 2 +-
2 files changed, 11 insertions(+), 11 deletions(-)
diff --git a/mcp-server/package-lock.json b/mcp-server/package-lock.json
index bdf987b..4b36d99 100644
--- a/mcp-server/package-lock.json
+++ b/mcp-server/package-lock.json
@@ -1,12 +1,12 @@
{
"name": "@tmhs/docker-mcp",
- "version": "0.1.0",
+ "version": "1.0.0",
"lockfileVersion": 3,
"requires": true,
"packages": {
"": {
"name": "@tmhs/docker-mcp",
- "version": "0.1.0",
+ "version": "1.0.0",
"license": "CC-BY-NC-ND-4.0",
"dependencies": {
"@modelcontextprotocol/sdk": "^1.12.1",
@@ -16,7 +16,7 @@
"docker-mcp": "dist/index.js"
},
"devDependencies": {
- "@types/node": "^22.15.3",
+ "@types/node": "^25.5.0",
"tsx": "^4.19.4",
"typescript": "^5.8.3",
"vitest": "^4.1.2"
@@ -898,13 +898,13 @@
"license": "MIT"
},
"node_modules/@types/node": {
- "version": "22.19.15",
- "resolved": "https://registry.npmjs.org/@types/node/-/node-22.19.15.tgz",
- "integrity": "sha512-F0R/h2+dsy5wJAUe3tAU6oqa2qbWY5TpNfL/RGmo1y38hiyO1w3x2jPtt76wmuaJI4DQnOBu21cNXQ2STIUUWg==",
+ "version": "25.5.0",
+ "resolved": "https://registry.npmjs.org/@types/node/-/node-25.5.0.tgz",
+ "integrity": "sha512-jp2P3tQMSxWugkCUKLRPVUpGaL5MVFwF8RDuSRztfwgN1wmqJeMSbKlnEtQqU8UrhTmzEmZdu2I6v2dpp7XIxw==",
"dev": true,
"license": "MIT",
"dependencies": {
- "undici-types": "~6.21.0"
+ "undici-types": "~7.18.0"
}
},
"node_modules/@vitest/expect": {
@@ -2705,9 +2705,9 @@
}
},
"node_modules/undici-types": {
- "version": "6.21.0",
- "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.21.0.tgz",
- "integrity": "sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==",
+ "version": "7.18.2",
+ "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.18.2.tgz",
+ "integrity": "sha512-AsuCzffGHJybSaRrmr5eHr81mwJU3kjw6M+uprWvCXiNeN9SOGwQ3Jn8jb8m3Z6izVgknn1R0FTCEAP2QrLY/w==",
"dev": true,
"license": "MIT"
},
diff --git a/mcp-server/package.json b/mcp-server/package.json
index 4b006e8..cf35b25 100644
--- a/mcp-server/package.json
+++ b/mcp-server/package.json
@@ -28,7 +28,7 @@
"zod": "^3.24.4"
},
"devDependencies": {
- "@types/node": "^22.15.3",
+ "@types/node": "^25.5.0",
"tsx": "^4.19.4",
"typescript": "^5.8.3",
"vitest": "^4.1.2"
From 3089777e69eec324f6a73d6ca85251820739e61b Mon Sep 17 00:00:00 2001
From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com>
Date: Sun, 29 Mar 2026 21:19:20 +0000
Subject: [PATCH 06/27] ci: bump actions/setup-node from 4 to 6
Bumps [actions/setup-node](https://github.com/actions/setup-node) from 4 to 6.
- [Release notes](https://github.com/actions/setup-node/releases)
- [Commits](https://github.com/actions/setup-node/compare/v4...v6)
---
updated-dependencies:
- dependency-name: actions/setup-node
dependency-version: '6'
dependency-type: direct:production
update-type: version-update:semver-major
...
Signed-off-by: dependabot[bot]
---
.github/workflows/ci.yml | 2 +-
.github/workflows/publish.yml | 2 +-
2 files changed, 2 insertions(+), 2 deletions(-)
diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml
index c4e7f87..830278e 100644
--- a/.github/workflows/ci.yml
+++ b/.github/workflows/ci.yml
@@ -20,7 +20,7 @@ jobs:
- uses: actions/checkout@v4
- name: Set up Node.js ${{ matrix.node-version }}
- uses: actions/setup-node@v4
+ uses: actions/setup-node@v6
with:
node-version: ${{ matrix.node-version }}
cache: npm
diff --git a/.github/workflows/publish.yml b/.github/workflows/publish.yml
index 4b1255d..5e6057d 100644
--- a/.github/workflows/publish.yml
+++ b/.github/workflows/publish.yml
@@ -15,7 +15,7 @@ jobs:
steps:
- uses: actions/checkout@v4
- - uses: actions/setup-node@v4
+ - uses: actions/setup-node@v6
with:
node-version: 22
registry-url: https://registry.npmjs.org
From 6591c35f3f7bb70fe5718734e6d0f1a65e37393d Mon Sep 17 00:00:00 2001
From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com>
Date: Sun, 29 Mar 2026 21:19:24 +0000
Subject: [PATCH 07/27] deps: bump typescript from 5.9.3 to 6.0.2 in
/mcp-server
Bumps [typescript](https://github.com/microsoft/TypeScript) from 5.9.3 to 6.0.2.
- [Release notes](https://github.com/microsoft/TypeScript/releases)
- [Commits](https://github.com/microsoft/TypeScript/compare/v5.9.3...v6.0.2)
---
updated-dependencies:
- dependency-name: typescript
dependency-version: 6.0.2
dependency-type: direct:development
update-type: version-update:semver-major
...
Signed-off-by: dependabot[bot]
---
mcp-server/package-lock.json | 12 ++++++------
mcp-server/package.json | 2 +-
2 files changed, 7 insertions(+), 7 deletions(-)
diff --git a/mcp-server/package-lock.json b/mcp-server/package-lock.json
index bdf987b..538ad5d 100644
--- a/mcp-server/package-lock.json
+++ b/mcp-server/package-lock.json
@@ -1,12 +1,12 @@
{
"name": "@tmhs/docker-mcp",
- "version": "0.1.0",
+ "version": "1.0.0",
"lockfileVersion": 3,
"requires": true,
"packages": {
"": {
"name": "@tmhs/docker-mcp",
- "version": "0.1.0",
+ "version": "1.0.0",
"license": "CC-BY-NC-ND-4.0",
"dependencies": {
"@modelcontextprotocol/sdk": "^1.12.1",
@@ -18,7 +18,7 @@
"devDependencies": {
"@types/node": "^22.15.3",
"tsx": "^4.19.4",
- "typescript": "^5.8.3",
+ "typescript": "^6.0.2",
"vitest": "^4.1.2"
},
"engines": {
@@ -2691,9 +2691,9 @@
}
},
"node_modules/typescript": {
- "version": "5.9.3",
- "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.3.tgz",
- "integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==",
+ "version": "6.0.2",
+ "resolved": "https://registry.npmjs.org/typescript/-/typescript-6.0.2.tgz",
+ "integrity": "sha512-bGdAIrZ0wiGDo5l8c++HWtbaNCWTS4UTv7RaTH/ThVIgjkveJt83m74bBHMJkuCbslY8ixgLBVZJIOiQlQTjfQ==",
"dev": true,
"license": "Apache-2.0",
"bin": {
diff --git a/mcp-server/package.json b/mcp-server/package.json
index 4b006e8..68af5ee 100644
--- a/mcp-server/package.json
+++ b/mcp-server/package.json
@@ -30,7 +30,7 @@
"devDependencies": {
"@types/node": "^22.15.3",
"tsx": "^4.19.4",
- "typescript": "^5.8.3",
+ "typescript": "^6.0.2",
"vitest": "^4.1.2"
},
"license": "CC-BY-NC-ND-4.0",
From 0dcb1a29d8a830490586c0ad98576ef7983099bd Mon Sep 17 00:00:00 2001
From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com>
Date: Sun, 29 Mar 2026 21:19:25 +0000
Subject: [PATCH 08/27] ci: bump actions/setup-python from 5 to 6
Bumps [actions/setup-python](https://github.com/actions/setup-python) from 5 to 6.
- [Release notes](https://github.com/actions/setup-python/releases)
- [Commits](https://github.com/actions/setup-python/compare/v5...v6)
---
updated-dependencies:
- dependency-name: actions/setup-python
dependency-version: '6'
dependency-type: direct:production
update-type: version-update:semver-major
...
Signed-off-by: dependabot[bot]
---
.github/workflows/validate.yml | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/.github/workflows/validate.yml b/.github/workflows/validate.yml
index 717db33..2bca849 100644
--- a/.github/workflows/validate.yml
+++ b/.github/workflows/validate.yml
@@ -48,7 +48,7 @@ jobs:
done
- name: Set up Python
- uses: actions/setup-python@v5
+ uses: actions/setup-python@v6
with:
python-version: "3.12"
From 175184bbcd9c943039bb46396d6b088b23bd0196 Mon Sep 17 00:00:00 2001
From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com>
Date: Sun, 29 Mar 2026 21:19:25 +0000
Subject: [PATCH 09/27] deps: bump zod from 3.25.76 to 4.3.6 in /mcp-server
Bumps [zod](https://github.com/colinhacks/zod) from 3.25.76 to 4.3.6.
- [Release notes](https://github.com/colinhacks/zod/releases)
- [Commits](https://github.com/colinhacks/zod/compare/v3.25.76...v4.3.6)
---
updated-dependencies:
- dependency-name: zod
dependency-version: 4.3.6
dependency-type: direct:production
update-type: version-update:semver-major
...
Signed-off-by: dependabot[bot]
---
mcp-server/package-lock.json | 12 ++++++------
mcp-server/package.json | 2 +-
2 files changed, 7 insertions(+), 7 deletions(-)
diff --git a/mcp-server/package-lock.json b/mcp-server/package-lock.json
index bdf987b..3a1ced4 100644
--- a/mcp-server/package-lock.json
+++ b/mcp-server/package-lock.json
@@ -1,16 +1,16 @@
{
"name": "@tmhs/docker-mcp",
- "version": "0.1.0",
+ "version": "1.0.0",
"lockfileVersion": 3,
"requires": true,
"packages": {
"": {
"name": "@tmhs/docker-mcp",
- "version": "0.1.0",
+ "version": "1.0.0",
"license": "CC-BY-NC-ND-4.0",
"dependencies": {
"@modelcontextprotocol/sdk": "^1.12.1",
- "zod": "^3.24.4"
+ "zod": "^4.3.6"
},
"bin": {
"docker-mcp": "dist/index.js"
@@ -2928,9 +2928,9 @@
"license": "ISC"
},
"node_modules/zod": {
- "version": "3.25.76",
- "resolved": "https://registry.npmjs.org/zod/-/zod-3.25.76.tgz",
- "integrity": "sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ==",
+ "version": "4.3.6",
+ "resolved": "https://registry.npmjs.org/zod/-/zod-4.3.6.tgz",
+ "integrity": "sha512-rftlrkhHZOcjDwkGlnUtZZkvaPHCsDATp4pGpuOOMDaTdDDXF91wuVDJoWoPsKX/3YPQ5fHuF3STjcYyKr+Qhg==",
"license": "MIT",
"funding": {
"url": "https://github.com/sponsors/colinhacks"
diff --git a/mcp-server/package.json b/mcp-server/package.json
index 4b006e8..1ccd2f5 100644
--- a/mcp-server/package.json
+++ b/mcp-server/package.json
@@ -25,7 +25,7 @@
},
"dependencies": {
"@modelcontextprotocol/sdk": "^1.12.1",
- "zod": "^3.24.4"
+ "zod": "^4.3.6"
},
"devDependencies": {
"@types/node": "^22.15.3",
From 6b6f9504152dc05247ba069e5a5a8bdd08497d75 Mon Sep 17 00:00:00 2001
From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com>
Date: Sun, 29 Mar 2026 21:19:27 +0000
Subject: [PATCH 10/27] ci: bump actions/stale from 9 to 10
Bumps [actions/stale](https://github.com/actions/stale) from 9 to 10.
- [Release notes](https://github.com/actions/stale/releases)
- [Changelog](https://github.com/actions/stale/blob/main/CHANGELOG.md)
- [Commits](https://github.com/actions/stale/compare/v9...v10)
---
updated-dependencies:
- dependency-name: actions/stale
dependency-version: '10'
dependency-type: direct:production
update-type: version-update:semver-major
...
Signed-off-by: dependabot[bot]
---
.github/workflows/stale.yml | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/.github/workflows/stale.yml b/.github/workflows/stale.yml
index fd1a86f..007d0ba 100644
--- a/.github/workflows/stale.yml
+++ b/.github/workflows/stale.yml
@@ -13,7 +13,7 @@ jobs:
stale:
runs-on: ubuntu-latest
steps:
- - uses: actions/stale@v9
+ - uses: actions/stale@v10
with:
days-before-stale: 30
days-before-close: 14
From afe80d5ab8cb788cf2914c43af27d87fee6a5584 Mon Sep 17 00:00:00 2001
From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com>
Date: Sun, 29 Mar 2026 21:19:34 +0000
Subject: [PATCH 11/27] ci: bump actions/checkout from 4 to 6
Bumps [actions/checkout](https://github.com/actions/checkout) from 4 to 6.
- [Release notes](https://github.com/actions/checkout/releases)
- [Changelog](https://github.com/actions/checkout/blob/main/CHANGELOG.md)
- [Commits](https://github.com/actions/checkout/compare/v4...v6)
---
updated-dependencies:
- dependency-name: actions/checkout
dependency-version: '6'
dependency-type: direct:production
update-type: version-update:semver-major
...
Signed-off-by: dependabot[bot]
---
.github/workflows/ci.yml | 2 +-
.github/workflows/codeql.yml | 2 +-
.github/workflows/dependency-review.yml | 2 +-
.github/workflows/links.yml | 2 +-
.github/workflows/pages.yml | 2 +-
.github/workflows/publish.yml | 2 +-
.github/workflows/validate.yml | 2 +-
7 files changed, 7 insertions(+), 7 deletions(-)
diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml
index c4e7f87..0004a27 100644
--- a/.github/workflows/ci.yml
+++ b/.github/workflows/ci.yml
@@ -17,7 +17,7 @@ jobs:
matrix:
node-version: [20, 22]
steps:
- - uses: actions/checkout@v4
+ - uses: actions/checkout@v6
- name: Set up Node.js ${{ matrix.node-version }}
uses: actions/setup-node@v4
diff --git a/.github/workflows/codeql.yml b/.github/workflows/codeql.yml
index fb05c11..214d4bb 100644
--- a/.github/workflows/codeql.yml
+++ b/.github/workflows/codeql.yml
@@ -21,7 +21,7 @@ jobs:
matrix:
language: [javascript-typescript]
steps:
- - uses: actions/checkout@v4
+ - uses: actions/checkout@v6
- name: Initialize CodeQL
uses: github/codeql-action/init@v3
diff --git a/.github/workflows/dependency-review.yml b/.github/workflows/dependency-review.yml
index 66949c1..31216ea 100644
--- a/.github/workflows/dependency-review.yml
+++ b/.github/workflows/dependency-review.yml
@@ -12,7 +12,7 @@ jobs:
dependency-review:
runs-on: ubuntu-latest
steps:
- - uses: actions/checkout@v4
+ - uses: actions/checkout@v6
- uses: actions/dependency-review-action@v4
with:
fail-on-severity: high
diff --git a/.github/workflows/links.yml b/.github/workflows/links.yml
index 7a351ed..a455de3 100644
--- a/.github/workflows/links.yml
+++ b/.github/workflows/links.yml
@@ -17,7 +17,7 @@ jobs:
linkcheck:
runs-on: ubuntu-latest
steps:
- - uses: actions/checkout@v4
+ - uses: actions/checkout@v6
- name: Check links
uses: lycheeverse/lychee-action@v2
diff --git a/.github/workflows/pages.yml b/.github/workflows/pages.yml
index 35b8227..ed7ac6f 100644
--- a/.github/workflows/pages.yml
+++ b/.github/workflows/pages.yml
@@ -23,7 +23,7 @@ jobs:
url: ${{ steps.deployment.outputs.page_url }}
runs-on: ubuntu-latest
steps:
- - uses: actions/checkout@v4
+ - uses: actions/checkout@v6
- name: Copy assets into docs
run: cp -r assets docs/assets
diff --git a/.github/workflows/publish.yml b/.github/workflows/publish.yml
index 4b1255d..6690302 100644
--- a/.github/workflows/publish.yml
+++ b/.github/workflows/publish.yml
@@ -13,7 +13,7 @@ jobs:
runs-on: ubuntu-latest
steps:
- - uses: actions/checkout@v4
+ - uses: actions/checkout@v6
- uses: actions/setup-node@v4
with:
diff --git a/.github/workflows/validate.yml b/.github/workflows/validate.yml
index 717db33..0dd5192 100644
--- a/.github/workflows/validate.yml
+++ b/.github/workflows/validate.yml
@@ -10,7 +10,7 @@ jobs:
validate:
runs-on: ubuntu-latest
steps:
- - uses: actions/checkout@v4
+ - uses: actions/checkout@v6
- name: Validate plugin.json
run: python3 -c "import json; json.load(open('.cursor-plugin/plugin.json'))"
From 160d22afce4fcd11855badcd07ad0d43c387ca32 Mon Sep 17 00:00:00 2001
From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com>
Date: Sun, 29 Mar 2026 21:19:37 +0000
Subject: [PATCH 12/27] ci: bump actions/configure-pages from 5 to 6
Bumps [actions/configure-pages](https://github.com/actions/configure-pages) from 5 to 6.
- [Release notes](https://github.com/actions/configure-pages/releases)
- [Commits](https://github.com/actions/configure-pages/compare/v5...v6)
---
updated-dependencies:
- dependency-name: actions/configure-pages
dependency-version: '6'
dependency-type: direct:production
update-type: version-update:semver-major
...
Signed-off-by: dependabot[bot]
---
.github/workflows/pages.yml | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/.github/workflows/pages.yml b/.github/workflows/pages.yml
index 35b8227..3633a72 100644
--- a/.github/workflows/pages.yml
+++ b/.github/workflows/pages.yml
@@ -29,7 +29,7 @@ jobs:
run: cp -r assets docs/assets
- name: Configure Pages
- uses: actions/configure-pages@v5
+ uses: actions/configure-pages@v6
- name: Upload artifact
uses: actions/upload-pages-artifact@v3
From f5520ec9d0bf2815231b7e3515c555570465a8e4 Mon Sep 17 00:00:00 2001
From: fOuttaMyPaint
Date: Sun, 29 Mar 2026 17:20:24 -0400
Subject: [PATCH 13/27] style: clean up README badges with consistent
flat-square style and grouped rows
Made-with: Cursor
---
README.md | 33 ++++++++++++++++-----------------
1 file changed, 16 insertions(+), 17 deletions(-)
diff --git a/README.md b/README.md
index bf325be..0bf87a4 100644
--- a/README.md
+++ b/README.md
@@ -1,31 +1,30 @@
-
+
Docker Developer Tools
- Expert Docker workflows, directly inside Cursor.
+ Expert Docker workflows, directly inside Cursor.
-
-
-
-
-
-
-
+
+
+
+
+
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
From a55781182622c3969a70c1c890508662bb5e9ac5 Mon Sep 17 00:00:00 2001
From: fOuttaMyPaint
Date: Sun, 29 Mar 2026 17:29:09 -0400
Subject: [PATCH 14/27] polish: visual overhaul of GH Pages site
- Hero: animated radial glow, CTA buttons (Get Started + GitHub)
- Stat cards: top-border gradient accent, hover glow shadows
- Nav: active underline bar, mobile menu fade+slide transition
- Section dividers: gradient hr, surface sections with gradient boundaries, body noise texture
- Terminal demo: blinking cursor indicator
- Tool categories: collapsible with chevrons, show/collapse all toggle
- Roadmap: cumulative tool count badges, faded older entries
- Footer: quick nav links row, Cursor IDE tagline
- JS: staggered reveal delays for grid children, category collapse/expand
Made-with: Cursor
---
docs/index.html | 648 +++++++++++++++++-------------------------------
1 file changed, 232 insertions(+), 416 deletions(-)
diff --git a/docs/index.html b/docs/index.html
index c51aa92..0b2acb1 100644
--- a/docs/index.html
+++ b/docs/index.html
@@ -26,62 +26,92 @@
--border:#243442;
--text:#e4edf5;
--text-dim:#8da3b5;
+ --glow:rgba(13,183,237,.12);
--radius:10px;
--radius-lg:16px;
--font-sans:'Inter',system-ui,sans-serif;
--font-mono:'JetBrains Mono',monospace;
}
html{scroll-behavior:smooth;scroll-padding-top:80px}
-body{font-family:var(--font-sans);background:var(--bg);color:var(--text);line-height:1.6;-webkit-font-smoothing:antialiased}
+body{font-family:var(--font-sans);background:var(--bg);color:var(--text);line-height:1.6;-webkit-font-smoothing:antialiased;position:relative}
+body::before{content:'';position:fixed;inset:0;z-index:-1;opacity:.03;background-image:url("data:image/svg+xml,%3Csvg viewBox='0 0 256 256' xmlns='http://www.w3.org/2000/svg'%3E%3Cfilter id='n'%3E%3CfeTurbulence type='fractalNoise' baseFrequency='0.9' numOctaves='4' stitchTiles='stitch'/%3E%3C/filter%3E%3Crect width='100%25' height='100%25' filter='url(%23n)'/%3E%3C/svg%3E");pointer-events:none}
a{color:var(--blue);text-decoration:none;transition:color .2s}
a:hover{color:#4dd4ff}
img{max-width:100%;display:block}
+/* SECTION DIVIDER */
+.section-divider{height:1px;border:none;margin:0;background:linear-gradient(90deg,transparent,var(--blue),var(--accent),transparent)}
+
/* NAV */
.nav{position:sticky;top:0;z-index:100;background:rgba(10,17,23,.85);backdrop-filter:blur(16px);border-bottom:1px solid var(--border);padding:0 24px;height:64px;display:flex;align-items:center;justify-content:space-between}
.nav-logo{font-weight:800;font-size:1.1rem;color:var(--text);display:flex;align-items:center;gap:10px}
.nav-logo img{width:28px;height:28px}
.nav-links{display:flex;gap:28px;list-style:none}
-.nav-links a{color:var(--text-dim);font-size:.875rem;font-weight:500;transition:color .2s}
-.nav-links a:hover,.nav-links a.active{color:var(--blue)}
+.nav-links a{color:var(--text-dim);font-size:.875rem;font-weight:500;transition:color .2s;position:relative;padding-bottom:4px}
+.nav-links a::after{content:'';position:absolute;bottom:-2px;left:0;right:0;height:2px;background:var(--blue);border-radius:1px;transform:scaleX(0);transition:transform .25s ease}
+.nav-links a:hover{color:var(--blue)}
+.nav-links a.active{color:var(--blue)}
+.nav-links a.active::after{transform:scaleX(1)}
.hamburger{display:none;background:none;border:none;color:var(--text);font-size:1.5rem;cursor:pointer}
/* MOBILE NAV */
-.mobile-menu{display:none;position:fixed;inset:0;z-index:99;background:rgba(10,17,23,.97);flex-direction:column;align-items:center;justify-content:center;gap:32px}
-.mobile-menu.open{display:flex}
-.mobile-menu a{color:var(--text);font-size:1.25rem;font-weight:600}
+.mobile-menu{position:fixed;inset:0;z-index:99;background:rgba(10,17,23,.97);flex-direction:column;align-items:center;justify-content:center;gap:32px;opacity:0;visibility:hidden;transition:opacity .3s ease,visibility .3s ease;display:flex}
+.mobile-menu.open{opacity:1;visibility:visible}
+.mobile-menu a{color:var(--text);font-size:1.25rem;font-weight:600;transform:translateY(10px);opacity:0;transition:transform .3s ease,opacity .3s ease}
+.mobile-menu.open a{transform:translateY(0);opacity:1}
+.mobile-menu.open a:nth-child(2){transition-delay:.05s}
+.mobile-menu.open a:nth-child(3){transition-delay:.1s}
+.mobile-menu.open a:nth-child(4){transition-delay:.15s}
+.mobile-menu.open a:nth-child(5){transition-delay:.2s}
+.mobile-menu.open a:nth-child(6){transition-delay:.25s}
+.mobile-menu.open a:nth-child(7){transition-delay:.3s}
.mobile-menu .close-btn{position:absolute;top:20px;right:24px;background:none;border:none;color:var(--text);font-size:1.75rem;cursor:pointer}
/* CONTAINER */
.container{max-width:1120px;margin:0 auto;padding:0 24px}
/* HERO */
-.hero{text-align:center;padding:100px 24px 72px}
-.hero-logo{width:96px;height:96px;margin:0 auto 28px;background:linear-gradient(135deg,var(--blue),var(--accent));border-radius:24px;display:flex;align-items:center;justify-content:center;box-shadow:0 16px 48px rgba(13,183,237,.2);overflow:hidden}
+.hero{text-align:center;padding:100px 24px 72px;position:relative;overflow:hidden}
+.hero::before{content:'';position:absolute;top:20%;left:50%;width:600px;height:600px;transform:translate(-50%,-50%);background:radial-gradient(circle,rgba(13,183,237,.08) 0%,transparent 70%);animation:heroGlow 6s ease-in-out infinite;pointer-events:none}
+@keyframes heroGlow{0%,100%{opacity:.6;transform:translate(-50%,-50%) scale(1)}50%{opacity:1;transform:translate(-50%,-50%) scale(1.15)}}
+.hero-logo{width:96px;height:96px;margin:0 auto 28px;background:linear-gradient(135deg,var(--blue),var(--accent));border-radius:24px;display:flex;align-items:center;justify-content:center;box-shadow:0 16px 48px rgba(13,183,237,.25),0 0 80px rgba(13,183,237,.08);overflow:hidden;position:relative;z-index:1}
.hero-logo img{width:64px;height:64px;object-fit:contain;filter:brightness(0) invert(1)}
-.hero h1{font-size:clamp(2rem,5vw,3.5rem);font-weight:800;letter-spacing:-.02em;margin-bottom:12px}
+.hero h1{font-size:clamp(2rem,5vw,3.5rem);font-weight:800;letter-spacing:-.02em;margin-bottom:12px;position:relative;z-index:1}
.hero h1 span{color:var(--blue)}
-.hero .tagline{color:var(--text-dim);font-size:1.15rem;max-width:540px;margin:0 auto 28px}
-.pills{display:flex;gap:10px;justify-content:center;flex-wrap:wrap}
+.hero .tagline{color:var(--text-dim);font-size:1.15rem;max-width:540px;margin:0 auto 24px;letter-spacing:-.01em;position:relative;z-index:1}
+.pills{display:flex;gap:10px;justify-content:center;flex-wrap:wrap;margin-bottom:28px;position:relative;z-index:1}
.pill{background:var(--surface);border:1px solid var(--border);padding:6px 16px;border-radius:999px;font-size:.8rem;font-weight:600;color:var(--text-dim)}
.pill.blue{border-color:var(--blue);color:var(--blue)}
+.hero-actions{display:flex;gap:12px;justify-content:center;flex-wrap:wrap;position:relative;z-index:1}
+.btn{display:inline-flex;align-items:center;gap:8px;padding:12px 28px;border-radius:var(--radius);font-size:.9rem;font-weight:600;font-family:var(--font-sans);cursor:pointer;transition:all .25s ease;border:none}
+.btn-primary{background:linear-gradient(135deg,var(--blue),var(--accent));color:#fff;box-shadow:0 4px 16px rgba(13,183,237,.3)}
+.btn-primary:hover{color:#fff;transform:translateY(-2px);box-shadow:0 8px 24px rgba(13,183,237,.4)}
+.btn-outline{background:transparent;color:var(--text);border:1px solid var(--border)}
+.btn-outline:hover{border-color:var(--blue);color:var(--blue);transform:translateY(-2px)}
+.btn svg{width:16px;height:16px;stroke:currentColor;fill:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round}
/* STATS */
.stats{display:grid;grid-template-columns:repeat(3,1fr);gap:24px;padding:48px 0 72px}
-.stat-card{background:var(--surface);border:1px solid var(--border);border-radius:var(--radius-lg);padding:32px;text-align:center;transition:transform .25s,border-color .25s}
-.stat-card:hover{transform:translateY(-4px);border-color:var(--blue)}
+.stat-card{background:var(--surface);border:1px solid var(--border);border-radius:var(--radius-lg);padding:32px;text-align:center;transition:transform .25s,border-color .25s,box-shadow .25s;position:relative;overflow:hidden}
+.stat-card::before{content:'';position:absolute;top:0;left:0;right:0;height:3px;background:linear-gradient(90deg,var(--blue),var(--accent))}
+.stat-card:hover{transform:translateY(-4px);border-color:var(--blue);box-shadow:0 8px 32px var(--glow)}
.stat-number{font-size:3rem;font-weight:800;color:var(--blue);font-variant-numeric:tabular-nums}
.stat-label{color:var(--text-dim);font-weight:600;margin-top:4px;font-size:.95rem}
/* SECTIONS */
section{padding:72px 0}
.section-title{font-size:clamp(1.5rem,3vw,2.25rem);font-weight:800;text-align:center;margin-bottom:12px}
-.section-subtitle{text-align:center;color:var(--text-dim);max-width:560px;margin:0 auto 48px}
+.section-subtitle{text-align:center;color:var(--text-dim);max-width:560px;margin:0 auto 48px;letter-spacing:-.01em}
+
+/* SURFACE SECTIONS */
+.surface-section{background:var(--surface);position:relative}
+.surface-section::before{content:'';position:absolute;top:0;left:0;right:0;height:48px;background:linear-gradient(to bottom,var(--bg),var(--surface));pointer-events:none}
+.surface-section::after{content:'';position:absolute;bottom:0;left:0;right:0;height:48px;background:linear-gradient(to top,var(--bg),var(--surface));pointer-events:none}
/* WHO IS THIS FOR */
.audience-grid{display:grid;grid-template-columns:repeat(3,1fr);gap:24px}
-.audience-card{background:var(--surface);border:1px solid var(--border);border-radius:var(--radius-lg);padding:32px;transition:transform .25s,border-color .25s}
-.audience-card:hover{transform:translateY(-4px);border-color:var(--blue)}
+.audience-card{background:var(--surface);border:1px solid var(--border);border-radius:var(--radius-lg);padding:32px;transition:transform .25s,border-color .25s,box-shadow .25s}
+.audience-card:hover{transform:translateY(-4px);border-color:var(--blue);box-shadow:0 8px 32px var(--glow)}
.audience-card .card-icon{width:40px;height:40px;border-radius:10px;display:flex;align-items:center;justify-content:center;margin-bottom:16px;background:rgba(13,183,237,.1);border:1px solid rgba(13,183,237,.2)}
.audience-card .card-icon svg{width:20px;height:20px;stroke:var(--blue);fill:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round}
.audience-card h3{font-size:1.1rem;font-weight:700;margin-bottom:8px}
@@ -90,14 +120,14 @@
/* HOW IT WORKS */
.steps{display:grid;grid-template-columns:repeat(3,1fr);gap:24px;position:relative}
.step{text-align:center;padding:32px 24px;position:relative}
-.step-num{width:48px;height:48px;border-radius:50%;background:linear-gradient(135deg,var(--blue),var(--accent));color:#fff;font-weight:800;font-size:1.1rem;display:flex;align-items:center;justify-content:center;margin:0 auto 20px}
+.step-num{width:48px;height:48px;border-radius:50%;background:linear-gradient(135deg,var(--blue),var(--accent));color:#fff;font-weight:800;font-size:1.1rem;display:flex;align-items:center;justify-content:center;margin:0 auto 20px;box-shadow:0 4px 16px rgba(13,183,237,.25)}
.step h3{font-weight:700;margin-bottom:8px}
.step p{color:var(--text-dim);font-size:.9rem}
.step-arrow{display:none;position:absolute;right:-16px;top:50px;color:var(--blue);font-size:1.5rem}
@media(min-width:768px){.step-arrow{display:block}}
/* TERMINAL DEMO */
-.terminal{background:#0d1117;border:1px solid var(--border);border-radius:var(--radius-lg);overflow:hidden;max-width:760px;margin:0 auto;font-family:var(--font-mono);font-size:.85rem;line-height:1.8}
+.terminal{background:#0d1117;border:1px solid var(--border);border-radius:var(--radius-lg);overflow:hidden;max-width:760px;margin:0 auto;font-family:var(--font-mono);font-size:.85rem;line-height:1.8;box-shadow:0 16px 48px rgba(0,0,0,.3)}
.terminal-header{background:var(--surface);padding:10px 16px;display:flex;align-items:center;gap:8px}
.terminal-dot{width:12px;height:12px;border-radius:50%}
.terminal-dot.red{background:#ff5f57}
@@ -114,6 +144,8 @@
.terminal-body .code-line{color:#7ee787}
.terminal-body .suggestion{margin-top:12px;padding:10px 12px;background:rgba(13,183,237,.06);border-radius:6px;border-left:3px solid var(--blue);color:var(--text-dim)}
.terminal-body .suggestion strong{color:var(--blue)}
+.terminal-cursor{display:inline-block;width:8px;height:16px;background:var(--blue);margin-left:4px;vertical-align:text-bottom;animation:blink 1s step-end infinite}
+@keyframes blink{0%,100%{opacity:1}50%{opacity:0}}
/* ACCORDION */
.accordion{max-width:760px;margin:0 auto}
@@ -131,8 +163,8 @@
/* RULES GRID */
.rules-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(320px,1fr));gap:20px}
-.rule-card{background:var(--surface);border:1px solid var(--border);border-radius:var(--radius);padding:24px;transition:transform .25s,border-color .25s}
-.rule-card:hover{transform:translateY(-3px);border-color:var(--blue)}
+.rule-card{background:var(--surface);border:1px solid var(--border);border-radius:var(--radius);padding:24px;transition:transform .25s,border-color .25s,box-shadow .25s}
+.rule-card:hover{transform:translateY(-3px);border-color:var(--blue);box-shadow:0 8px 24px var(--glow)}
.rule-card h3{font-size:.95rem;font-weight:700;margin-bottom:6px;display:flex;align-items:center;gap:8px}
.rule-dot{width:8px;height:8px;border-radius:50%;flex-shrink:0}
.rule-card .rule-scope{font-family:var(--font-mono);font-size:.75rem;color:var(--accent);background:rgba(6,109,165,.12);padding:3px 8px;border-radius:4px;margin-bottom:8px;display:inline-block}
@@ -141,29 +173,39 @@
/* TABLE */
.tools-table-wrap{overflow-x:auto}
.tools-table{width:100%;border-collapse:collapse;font-size:.9rem}
-.tools-table th{text-align:left;padding:14px 16px;background:var(--surface);color:var(--text-dim);font-weight:600;font-size:.8rem;text-transform:uppercase;letter-spacing:.06em;border-bottom:2px solid var(--border)}
+.tools-table th{text-align:left;padding:14px 16px;background:var(--surface);color:var(--text-dim);font-weight:600;font-size:.8rem;text-transform:uppercase;letter-spacing:.06em;border-bottom:2px solid var(--border);position:sticky;top:64px;z-index:2}
.tools-table td{padding:14px 16px;border-bottom:1px solid var(--border)}
.tools-table tr:hover td{background:var(--surface)}
.tools-table .tool-name{font-family:var(--font-mono);color:var(--blue);font-weight:500;font-size:.85rem}
.tools-table tr.hidden-row{display:none}
+.tools-table td[colspan]{position:sticky;top:104px;z-index:1;background:var(--bg)}
/* TOOL SEARCH */
.tool-search-wrap{max-width:480px;margin:0 auto 32px;position:relative}
-.tool-search{width:100%;padding:12px 16px 12px 44px;background:var(--surface);border:1px solid var(--border);border-radius:var(--radius);color:var(--text);font-size:.9rem;font-family:var(--font-sans);outline:none;transition:border-color .2s}
-.tool-search:focus{border-color:var(--blue)}
+.tool-search{width:100%;padding:12px 16px 12px 44px;background:var(--surface);border:1px solid var(--border);border-radius:var(--radius);color:var(--text);font-size:.9rem;font-family:var(--font-sans);outline:none;transition:border-color .2s,box-shadow .2s}
+.tool-search:focus{border-color:var(--blue);box-shadow:0 0 0 3px rgba(13,183,237,.15)}
.tool-search::placeholder{color:var(--text-dim)}
.tool-search-icon{position:absolute;left:14px;top:50%;transform:translateY(-50%);width:18px;height:18px;stroke:var(--text-dim);fill:none;stroke-width:2}
.tool-search-hint{position:absolute;right:12px;top:50%;transform:translateY(-50%);background:var(--surface2);border:1px solid var(--border);color:var(--text-dim);padding:2px 8px;border-radius:4px;font-size:.7rem;font-family:var(--font-mono);pointer-events:none}
.tool-search-count{text-align:center;color:var(--text-dim);font-size:.82rem;margin-top:8px}
/* TOOL CATEGORY CARDS */
-.tool-category{margin-top:32px}
-.tool-category h3{font-size:1rem;font-weight:700;margin-bottom:12px;display:flex;align-items:center;gap:10px}
+.tool-category{margin-top:24px;border:1px solid var(--border);border-radius:var(--radius);overflow:hidden;background:var(--surface)}
+.tool-cat-header{display:flex;align-items:center;justify-content:space-between;padding:16px 20px;cursor:pointer;transition:background .2s;user-select:none}
+.tool-cat-header:hover{background:var(--surface2)}
+.tool-cat-header h3{font-size:1rem;font-weight:700;margin:0;display:flex;align-items:center;gap:10px}
.tool-count{font-size:.75rem;font-weight:600;color:var(--blue);background:rgba(13,183,237,.1);padding:2px 10px;border-radius:999px}
-.tool-category table{width:100%;border-collapse:collapse;font-size:.9rem;margin-bottom:8px}
-.tool-category th{text-align:left;padding:10px 16px;background:var(--surface);color:var(--text-dim);font-weight:600;font-size:.8rem;text-transform:uppercase;letter-spacing:.06em;border-bottom:2px solid var(--border)}
-.tool-category td{padding:10px 16px;border-bottom:1px solid var(--border)}
-.tool-category tr:hover td{background:var(--surface)}
+.tool-cat-chevron{color:var(--text-dim);transition:transform .3s;font-size:.75rem}
+.tool-category.open .tool-cat-chevron{transform:rotate(180deg)}
+.tool-cat-body{max-height:0;overflow:hidden;transition:max-height .4s ease}
+.tool-category.open .tool-cat-body{max-height:2000px}
+.tool-category table{width:100%;border-collapse:collapse;font-size:.9rem}
+.tool-category th{text-align:left;padding:10px 20px;background:var(--bg);color:var(--text-dim);font-weight:600;font-size:.8rem;text-transform:uppercase;letter-spacing:.06em;border-bottom:2px solid var(--border)}
+.tool-category td{padding:10px 20px;border-bottom:1px solid var(--border)}
+.tool-category tr:hover td{background:rgba(13,183,237,.03)}
+.tool-toggle-wrap{text-align:center;margin-top:20px}
+.tool-toggle-btn{background:none;border:1px solid var(--border);color:var(--text-dim);padding:8px 20px;border-radius:var(--radius);font-size:.82rem;font-family:var(--font-sans);font-weight:600;cursor:pointer;transition:all .2s}
+.tool-toggle-btn:hover{border-color:var(--blue);color:var(--blue)}
/* GET STARTED */
.install-steps{max-width:640px;margin:0 auto;display:flex;flex-direction:column;gap:24px}
@@ -179,23 +221,34 @@
/* PROMPT CARDS */
.prompt-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(300px,1fr));gap:16px}
-.prompt-card{background:var(--surface);border:1px solid var(--border);border-radius:var(--radius);padding:20px 24px;cursor:default;transition:transform .25s,border-color .25s}
-.prompt-card:hover{transform:translateY(-3px);border-color:var(--blue)}
+.prompt-card{background:var(--surface);border:1px solid var(--border);border-radius:var(--radius);padding:20px 24px;cursor:default;transition:transform .25s,border-color .25s,box-shadow .25s}
+.prompt-card:hover{transform:translateY(-3px);border-color:var(--blue);box-shadow:0 8px 24px var(--glow)}
.prompt-card .prompt-q{font-family:var(--font-mono);font-size:.85rem;color:var(--text);line-height:1.6}
-.prompt-card .prompt-q::before{content:'"';color:var(--blue);font-weight:700}
-.prompt-card .prompt-q::after{content:'"';color:var(--blue);font-weight:700}
+.prompt-card .prompt-q::before{content:'\201C';color:var(--blue);font-weight:700}
+.prompt-card .prompt-q::after{content:'\201D';color:var(--blue);font-weight:700}
/* ROADMAP */
.timeline{max-width:640px;margin:0 auto;position:relative;padding-left:32px}
-.timeline::before{content:'';position:absolute;left:11px;top:8px;bottom:8px;width:2px;background:var(--border)}
-.timeline-item{position:relative;margin-bottom:36px}
+.timeline::before{content:'';position:absolute;left:11px;top:8px;bottom:8px;width:2px;background:linear-gradient(to bottom,var(--border),var(--blue))}
+.timeline-item{position:relative;margin-bottom:36px;transition:opacity .3s}
.timeline-dot{position:absolute;left:-32px;top:4px;width:22px;height:22px;border-radius:50%;background:var(--surface);border:3px solid var(--accent);z-index:1}
.timeline-item.current .timeline-dot{border-color:var(--blue);background:var(--blue);box-shadow:0 0 12px rgba(13,183,237,.4)}
-.timeline-item h3{font-size:1rem;font-weight:700;margin-bottom:4px}
-.timeline-item h3 .tag{font-size:.7rem;font-weight:700;padding:2px 8px;border-radius:999px;margin-left:8px;vertical-align:middle}
+.timeline-item h3{font-size:1rem;font-weight:700;margin-bottom:4px;display:flex;align-items:center;flex-wrap:wrap;gap:8px}
+.timeline-item h3 .tag{font-size:.7rem;font-weight:700;padding:2px 8px;border-radius:999px}
.tag.current-tag{background:rgba(13,183,237,.15);color:var(--blue)}
.tag.upcoming-tag{background:rgba(6,109,165,.15);color:var(--accent)}
.timeline-item p{color:var(--text-dim);font-size:.88rem}
+.tool-total{font-size:.7rem;font-weight:600;color:var(--text-dim);background:var(--surface2);border:1px solid var(--border);padding:1px 8px;border-radius:999px;white-space:nowrap}
+.timeline-item:nth-child(-n+4){opacity:.45}
+.timeline-item:nth-child(5){opacity:.55}
+.timeline-item:nth-child(6){opacity:.6}
+.timeline-item:nth-child(7){opacity:.65}
+.timeline-item:nth-child(8){opacity:.7}
+.timeline-item:nth-child(9){opacity:.75}
+.timeline-item:nth-child(10){opacity:.8}
+.timeline-item:nth-child(11){opacity:.85}
+.timeline-item:nth-child(12){opacity:.9}
+.timeline-item:nth-child(13){opacity:1}
/* BACK TO TOP */
.back-to-top{position:fixed;bottom:32px;right:32px;width:44px;height:44px;border-radius:50%;background:var(--accent);border:1px solid var(--border);color:#fff;cursor:pointer;display:flex;align-items:center;justify-content:center;opacity:0;pointer-events:none;transition:opacity .3s,transform .3s;z-index:50;box-shadow:0 4px 16px rgba(0,0,0,.3)}
@@ -205,11 +258,16 @@
/* FOOTER */
.footer{border-top:1px solid var(--border);padding:48px 24px 32px;text-align:center}
+.footer-nav{display:flex;gap:24px;justify-content:center;flex-wrap:wrap;margin-bottom:24px}
+.footer-nav a{color:var(--text-dim);font-size:.85rem;font-weight:500;transition:color .2s}
+.footer-nav a:hover{color:var(--blue)}
.footer-shields{display:flex;gap:8px;justify-content:center;flex-wrap:wrap;margin-bottom:20px}
.footer-shields img{height:22px}
.footer-text{color:var(--text-dim);font-size:.82rem}
.footer-text a{color:var(--text-dim)}
.footer-text a:hover{color:var(--blue)}
+.footer-cursor{margin-top:12px;font-size:.78rem;color:var(--text-dim)}
+.footer-cursor span{color:#a855f7;font-weight:600}
/* SCROLL ANIMATION */
.reveal{opacity:0;transform:translateY(24px);transition:opacity .6s ease,transform .6s ease}
@@ -225,9 +283,12 @@
.rules-grid{grid-template-columns:1fr}
.prompt-grid{grid-template-columns:1fr}
.hero{padding:72px 24px 48px}
+ .hero::before{width:300px;height:300px}
.stat-number{font-size:2.25rem}
section{padding:48px 0}
.back-to-top{bottom:20px;right:20px;width:40px;height:40px}
+ .hero-actions{flex-direction:column;align-items:center}
+ .surface-section::before,.surface-section::after{height:24px}
}
@media(min-width:769px) and (max-width:1024px){
.audience-grid{grid-template-columns:repeat(2,1fr)}
@@ -273,11 +334,17 @@ Docker Developer Tools
CC BY-NC-ND 4.0
Cursor Plugin
+
+
+
-
+
0
Skills
@@ -298,7 +365,7 @@
Docker Developer Tools
Who Is This For
Built for developers who ship with containers every day.
-
+
Backend Developers
@@ -318,12 +385,14 @@
Full-Stack Developers
+
+
-
+
How It Works
Three steps from question to answer.
-
+
1
Ask a Docker Question
@@ -371,13 +440,15 @@
See It In Action
Recommendation: Increase the memory limit or optimize the application's memory usage.
- docker run --memory=512m --memory-swap=512m webapp:latest
+ docker run --memory=512m --memory-swap=512m webapp:latest
+
+
@@ -390,13 +461,11 @@
17 Skills, Organized
Core Fundamentals
▼
-
-
+
dockerfile-best-practices
docker-compose-helper
docker-troubleshooting
-
-
+
@@ -404,12 +473,10 @@
17 Skills, Organized
Optimization Size & Performance
▼
-
-
+
image-optimization
docker-resource-management
-
-
+
@@ -417,12 +484,10 @@
17 Skills, Organized
Net & Storage Networking & Volumes
▼
-
-
+
docker-networking
docker-volumes
-
-
+
@@ -430,12 +495,10 @@
17 Skills, Organized
Security Hardening, Secrets & Signing
▼
-
-
+
docker-security
docker-image-signing
-
-
+
@@ -443,14 +506,12 @@
17 Skills, Organized
DevOps CI/CD, Registry & Environments
▼
-
-
+
docker-ci-cd
docker-registry
docker-development-env
docker-context-management
-
-
+
@@ -458,11 +519,9 @@
17 Skills, Organized
Debugging Live Troubleshooting
▼
-
@@ -470,12 +529,10 @@
17 Skills, Organized
Advanced Multi-Platform & Workflows
▼
-
-
+
docker-advanced-workflows
docker-multi-platform
-
-
+
@@ -483,73 +540,33 @@
17 Skills, Organized
Orchestration Swarm Management
▼
-
+
+
-
+
10 Always-On Rules
Automatic linting and guardrails that catch issues before they ship.
-
-
-
dockerfile-lint
-
**/Dockerfile*
-
Flags Dockerfile antipatterns like running as root, missing health checks, and inefficient layer ordering.
-
-
-
docker-secrets
-
Global (always active)
-
Detects hardcoded passwords, API keys, and tokens. Recommends environment variables or Docker secrets.
-
-
-
compose-validation
-
**/docker-compose*.yml
-
Validates compose file structure, service dependencies, and network configurations.
-
-
-
docker-resource-limits
-
Docker-related files
-
Flags missing CPU and memory limits that could lead to resource exhaustion in production.
-
-
-
docker-image-pinning
-
Dockerfiles, compose files
-
Catches unpinned image tags like :latest that create non-reproducible builds.
-
-
-
docker-port-conflicts
-
Dockerfiles, compose files
-
Detects duplicate port mappings and common port conflicts across services.
-
-
-
docker-logging
-
Dockerfiles, compose files
-
Flags missing logging drivers and log rotation settings that can fill disks.
-
-
-
buildx-best-practices
-
Dockerfiles, compose files
-
Flags multi-platform build issues, missing cache configuration, and architecture-specific hardcoding.
-
-
-
compose-scaling
-
**/docker-compose*.yml
-
Flags scaling blockers: container_name, fixed host ports, missing resource limits, missing restart policy.
-
-
-
swarm-security
-
Docker-related files
-
Flags missing autolock, unrotated certificates, unencrypted overlay networks, and exposed management ports.
-
+
+
dockerfile-lint
**/Dockerfile*Flags Dockerfile antipatterns like running as root, missing health checks, and inefficient layer ordering.
+
docker-secrets
Global (always active)Detects hardcoded passwords, API keys, and tokens. Recommends environment variables or Docker secrets.
+
compose-validation
**/docker-compose*.ymlValidates compose file structure, service dependencies, and network configurations.
+
docker-resource-limits
Docker-related filesFlags missing CPU and memory limits that could lead to resource exhaustion in production.
+
docker-image-pinning
Dockerfiles, compose filesCatches unpinned image tags like :latest that create non-reproducible builds.
+
docker-port-conflicts
Dockerfiles, compose filesDetects duplicate port mappings and common port conflicts across services.
+
docker-logging
Dockerfiles, compose filesFlags missing logging drivers and log rotation settings that can fill disks.
+
buildx-best-practices
Dockerfiles, compose filesFlags multi-platform build issues, missing cache configuration, and architecture-specific hardcoding.
+
compose-scaling
**/docker-compose*.ymlFlags scaling blockers: container_name, fixed host ports, missing resource limits, missing restart policy.
+
swarm-security
Docker-related filesFlags missing autolock, unrotated certificates, unencrypted overlay networks, and exposed management ports.
@@ -567,9 +584,7 @@
150 MCP Tools
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-
+
Get Started
Up and running in under two minutes.
-
-
-
1
-
-
Clone the repository
-
- git clone https://github.com/TMHSDigital/Docker-Developer-Tools.git
-
-
-
-
-
-
-
2
-
-
Symlink into Cursor plugins
-
macOS / Linux:
-
- ln -s "$(pwd)" ~/.cursor/plugins/docker-developer-tools
-
-
-
Windows (PowerShell as Admin):
-
- New-Item -ItemType SymbolicLink -Path "$env:USERPROFILE\.cursor\plugins\docker-developer-tools" -Target (Get-Location)
-
-
-
-
-
-
-
3
-
-
Install and build the MCP server
-
- cd mcp-server && npm install && npm run build
-
-
-
-
-
-
-
4
-
-
Or install globally via npm
-
- npm install -g @tmhs/docker-mcp
-
-
-
-
-
+
1
Clone the repository
git clone https://github.com/TMHSDigital/Docker-Developer-Tools.git
+
2
Symlink into Cursor plugins
macOS / Linux:
ln -s "$(pwd)" ~/.cursor/plugins/docker-developer-tools
Windows (PowerShell as Admin):
New-Item -ItemType SymbolicLink -Path "$env:USERPROFILE\.cursor\plugins\docker-developer-tools" -Target (Get-Location)
+
3
Install and build the MCP server
cd mcp-server && npm install && npm run build
+
4
Or install globally via npm
npm install -g @tmhs/docker-mcp
@@ -861,114 +738,38 @@ Or install globally via npm
Try It
Paste any of these into Cursor's AI chat to see the plugin in action.
-
-
-
Write a multi-stage Dockerfile for my Node.js API with a production build
-
-
-
Why is my docker-compose networking not working between services?
-
-
-
Audit my Dockerfile for security issues
-
-
-
How can I reduce my Docker image from 1.2GB to under 200MB?
-
-
-
List all running containers and show which ones are using the most memory
-
-
-
Set up a development environment with PostgreSQL, Redis, and my app in compose
-
+
+
Write a multi-stage Dockerfile for my Node.js API with a production build
+
Why is my docker-compose networking not working between services?
+
Audit my Dockerfile for security issues
+
How can I reduce my Docker image from 1.2GB to under 200MB?
+
List all running containers and show which ones are using the most memory
+
Set up a development environment with PostgreSQL, Redis, and my app in compose
+
+
-
+
Roadmap
What's shipped and what's coming next.
-
-
-
-
v0.1.0 Released
-
Foundation - 12 skills, 6 rules, 10 read-only MCP tools.
-
-
-
-
-
v0.2.0 Released
-
Container Lifecycle - 10 tools: run, create, start, stop, restart, kill, rm, pause, unpause, exec.
-
-
-
-
-
v0.3.0 Released
-
Image and Build - 8 new tools: pull, push, build, tag, rmi, commit, save, load. Complete image pipeline from registry to archive.
-
-
-
-
-
v0.4.0 Released
-
Compose - 8 tools: up, down, ps, logs, build, restart, pull, exec. Full Docker Compose V2 management. Published to npm.
-
-
-
-
-
v0.5.0 Released
-
Volumes, Networks, Cleanup - 13 tools: volume/network CRUD, system/container/image prune. Infrastructure management.
-
-
-
-
-
v0.6.0 Released
-
Advanced and Observability - 6 tools: cp, stats, top, events, update, wait. Live monitoring and file transfer.
-
-
-
-
-
v0.7.0 Released
-
Buildx, Manifests, and Registry - 13 tools: buildx build/inspect/use, manifest create/inspect/annotate/push, builder prune.
-
-
-
-
-
v0.8.0 Released
-
Compose Completeness - 16 tools: config, cp, create, events, images, kill, ls, pause/unpause, port, rm, run, scale, start, stop, top.
-
-
-
-
-
v0.9.0 Released
-
Container/Image Gaps, Context, Auth - 14 tools: diff, export, port, rename, history, import, context management, registry login/logout.
-
-
-
-
-
v0.10.0 Released
-
Swarm Orchestration - 24 tools: swarm init/join/leave, service CRUD and scaling, node management and promotion.
-
-
-
-
-
v0.11.0 Released
-
Swarm Stacks, Configs, Secrets, Trust - 18 tools: stack deploy, config/secret CRUD, Docker Content Trust.
-
-
-
-
-
v0.12.0 Released
-
Niche, Scout, Extras - 10 tools: version info, Scout CVEs/recommendations, compose watch, plugin management.
-
-
-
-
-
v1.0.0 Current
-
Stable release - finalized APIs, enhanced error messages, comprehensive docs, workflow diagrams, 150 MCP tools.
-
-
+
v0.1.0 Released 10 tools
Foundation - 12 skills, 6 rules, 10 read-only MCP tools.
+
v0.2.0 Released 20 tools
Container Lifecycle - 10 tools: run, create, start, stop, restart, kill, rm, pause, unpause, exec.
+
v0.3.0 Released 28 tools
Image and Build - 8 new tools: pull, push, build, tag, rmi, commit, save, load.
+
v0.4.0 Released 36 tools
Compose - 8 tools: up, down, ps, logs, build, restart, pull, exec. Published to npm.
+
v0.5.0 Released 49 tools
Volumes, Networks, Cleanup - 13 tools: volume/network CRUD, system/container/image prune.
+
v0.6.0 Released 55 tools
Advanced and Observability - 6 tools: cp, stats, top, events, update, wait.
+
v0.7.0 Released 68 tools
Buildx, Manifests, and Registry - 13 tools: buildx build/inspect/use, manifest CRUD, builder prune.
+
v0.8.0 Released 84 tools
Compose Completeness - 16 tools: config, cp, create, events, images, kill, ls, pause/unpause, port, rm, run, scale, start, stop, top.
+
v0.9.0 Released 98 tools
Container/Image Gaps, Context, Auth - 14 tools: diff, export, port, rename, history, import, context management, registry login/logout.
+
v0.10.0 Released 122 tools
Swarm Orchestration - 24 tools: swarm init/join/leave, service CRUD and scaling, node management.
+
v0.11.0 Released 140 tools
Swarm Stacks, Configs, Secrets, Trust - 18 tools: stack deploy, config/secret CRUD, Docker Content Trust.
+
v0.12.0 Released 150 tools
Niche, Scout, Extras - 10 tools: version info, Scout CVEs/recommendations, compose watch, plugin management.
+
v1.0.0 Current 150 tools
Stable release - finalized APIs, enhanced error messages, comprehensive docs, workflow diagrams.
@@ -980,27 +781,23 @@ v1.0.0 Current
+ // Scroll spy
+ (function () {
+ var links = document.querySelectorAll('.nav-links a[href^="#"]');
+ if (!links.length) return;
+ var sections = [];
+ links.forEach(function (link) {
+ var id = link.getAttribute('href').slice(1);
+ var el = document.getElementById(id);
+ if (el) sections.push({ el: el, link: link });
+ });
+ function onScroll() {
+ var scrollY = window.scrollY + 80;
+ var current = null;
+ sections.forEach(function (s) {
+ if (s.el.offsetTop <= scrollY) current = s;
+ });
+ links.forEach(function (l) { l.classList.remove('active'); });
+ if (current) current.link.classList.add('active');
+ }
+ window.addEventListener('scroll', onScroll, { passive: true });
+ onScroll();
+ })();
+
+