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 @@

- CI + Validate + CI + CodeQL + Pages + Links + Release License - Version +

+

npm npm downloads npm size Stars + Issues Last Commit Cursor Plugin Docker 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 Logo + Docker Developer Tools Logo

Docker Developer Tools

- Expert Docker workflows, directly inside Cursor. + Expert Docker workflows, directly inside Cursor.

- Validate - CI - CodeQL - Pages - Links - Release - License + Release + npm + License + Docs

+

- npm - npm downloads - npm size - Stars - Issues - Last Commit - Cursor Plugin - Docker + CI + Validate + CodeQL +

+ +

+ Stars + Issues + Downloads

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 +
+ Get Started + View on GitHub +
+
+
-
+
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 -
-
+
container-debugging -
-
+
@@ -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 -
-
+
docker-swarm -
-
+
+
+ -
+

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*.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.

@@ -567,9 +584,7 @@

150 MCP Tools

- - - + @@ -685,173 +700,35 @@

150 MCP Tools

ToolDescription
ToolDescription
docker_listContainersList running or all containers with status, ports, and names
docker_inspectContainerDetailed container info - config, state, mounts, networking
-
-

Swarm Cluster 8 tools

- - - - - - - - - -
ToolDescription
docker_swarmInitInitialize a new Swarm cluster
docker_swarmJoinJoin a Swarm as worker or manager
docker_swarmLeaveLeave the Swarm
docker_swarmJoinTokenDisplay or rotate join tokens
docker_swarmUpdateUpdate Swarm configuration
docker_swarmUnlockUnlock a locked Swarm manager
docker_swarmUnlockKeyDisplay or rotate the unlock key
docker_swarmCaDisplay and rotate root CA certificate
-
-
-

Swarm Services 9 tools

- - - - - - - - - - -
ToolDescription
docker_serviceCreateCreate a replicated or global service
docker_serviceUpdateUpdate a service
docker_serviceRmRemove services
docker_serviceLsList services
docker_serviceInspectInspect a service
docker_serviceLogsFetch service logs
docker_servicePsList tasks of a service
docker_serviceScaleScale services
docker_serviceRollbackRollback a service
-
-
-

Swarm Nodes 7 tools

- - - - - - - - -
ToolDescription
docker_nodeLsList nodes in the Swarm
docker_nodeInspectInspect a node
docker_nodePsList tasks on a node
docker_nodeRmRemove nodes
docker_nodeUpdateUpdate node metadata
docker_nodePromotePromote workers to managers
docker_nodeDemoteDemote managers to workers
-
-
-

Swarm Stacks 6 tools

- - - - - - - -
ToolDescription
docker_stackDeployDeploy or update a stack
docker_stackRmRemove stacks
docker_stackLsList stacks
docker_stackPsList tasks in a stack
docker_stackServicesList services in a stack
docker_stackConfigOutput merged stack config
-
-
-

Swarm Configs 4 tools

- - - - - -
ToolDescription
docker_configCreateCreate a Swarm config
docker_configInspectInspect a config
docker_configLsList configs
docker_configRmRemove configs
-
-
-

Swarm Secrets 4 tools

- - - - - -
ToolDescription
docker_secretCreateCreate a Swarm secret
docker_secretInspectInspect a secret (metadata only)
docker_secretLsList secrets
docker_secretRmRemove secrets
-
-
-

Docker Content Trust 4 tools

- - - - - -
ToolDescription
docker_trustInspectInspect trust data for an image
docker_trustSignSign an image
docker_trustRevokeRevoke trust for an image
docker_trustKeyManage signing keys
-
-
-

Utility 2 tools

- - - -
ToolDescription
docker_versionShow Docker client and server version info
docker_composeVersionShow Docker Compose version info
-
-
-

Compose Extras 1 tool

- - -
ToolDescription
docker_composeWatchWatch build context and auto-rebuild on file changes
-
-
-

Docker Scout 3 tools

- - - - -
ToolDescription
docker_scoutQuickviewQuick overview of image vulnerabilities
docker_scoutCvesList CVEs found in an image
docker_scoutRecommendationsGet base image update recommendations
-
-
-

Plugin Management 4 tools

- - - - - -
ToolDescription
docker_pluginLsList installed Docker plugins
docker_pluginInstallInstall a Docker plugin from a registry
docker_pluginRmRemove one or more Docker plugins
docker_pluginEnableEnable a disabled Docker plugin
-
+ +
+ +

Swarm Cluster 8 tools

ToolDescription
docker_swarmInitInitialize a new Swarm cluster
docker_swarmJoinJoin a Swarm as worker or manager
docker_swarmLeaveLeave the Swarm
docker_swarmJoinTokenDisplay or rotate join tokens
docker_swarmUpdateUpdate Swarm configuration
docker_swarmUnlockUnlock a locked Swarm manager
docker_swarmUnlockKeyDisplay or rotate the unlock key
docker_swarmCaDisplay and rotate root CA certificate
+

Swarm Services 9 tools

ToolDescription
docker_serviceCreateCreate a replicated or global service
docker_serviceUpdateUpdate a service
docker_serviceRmRemove services
docker_serviceLsList services
docker_serviceInspectInspect a service
docker_serviceLogsFetch service logs
docker_servicePsList tasks of a service
docker_serviceScaleScale services
docker_serviceRollbackRollback a service
+

Swarm Nodes 7 tools

ToolDescription
docker_nodeLsList nodes in the Swarm
docker_nodeInspectInspect a node
docker_nodePsList tasks on a node
docker_nodeRmRemove nodes
docker_nodeUpdateUpdate node metadata
docker_nodePromotePromote workers to managers
docker_nodeDemoteDemote managers to workers
+

Swarm Stacks 6 tools

ToolDescription
docker_stackDeployDeploy or update a stack
docker_stackRmRemove stacks
docker_stackLsList stacks
docker_stackPsList tasks in a stack
docker_stackServicesList services in a stack
docker_stackConfigOutput merged stack config
+

Swarm Configs 4 tools

ToolDescription
docker_configCreateCreate a Swarm config
docker_configInspectInspect a config
docker_configLsList configs
docker_configRmRemove configs
+

Swarm Secrets 4 tools

ToolDescription
docker_secretCreateCreate a Swarm secret
docker_secretInspectInspect a secret (metadata only)
docker_secretLsList secrets
docker_secretRmRemove secrets
+

Docker Content Trust 4 tools

ToolDescription
docker_trustInspectInspect trust data for an image
docker_trustSignSign an image
docker_trustRevokeRevoke trust for an image
docker_trustKeyManage signing keys
+

Utility 2 tools

ToolDescription
docker_versionShow Docker client and server version info
docker_composeVersionShow Docker Compose version info
+

Compose Extras 1 tool

ToolDescription
docker_composeWatchWatch build context and auto-rebuild on file changes
+

Docker Scout 3 tools

ToolDescription
docker_scoutQuickviewQuick overview of image vulnerabilities
docker_scoutCvesList CVEs found in an image
docker_scoutRecommendationsGet base image update recommendations
+

Plugin Management 4 tools

ToolDescription
docker_pluginLsList installed Docker plugins
docker_pluginInstallInstall a Docker plugin from a registry
docker_pluginRmRemove one or more Docker plugins
docker_pluginEnableEnable a disabled Docker plugin
+
+ -
+

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(); + })(); + + diff --git a/mcp-tools.json b/mcp-tools.json new file mode 100644 index 0000000..cb17359 --- /dev/null +++ b/mcp-tools.json @@ -0,0 +1,152 @@ +[ + {"name": "docker_commit", "description": "Create a new image from a container's changes", "category": "Image Management"}, + {"name": "docker_containerLogs", "description": "Fetch recent logs from a container", "category": "Container Management"}, + {"name": "docker_containerPrune", "description": "Remove all stopped containers", "category": "Container Management"}, + {"name": "docker_cp", "description": "Copy files between a container and the local filesystem", "category": "Container Management"}, + {"name": "docker_create", "description": "Create a new container without starting it", "category": "Container Management"}, + {"name": "docker_diff", "description": "Inspect filesystem changes in a container", "category": "Container Management"}, + {"name": "docker_events", "description": "Stream real-time events from the Docker daemon", "category": "Container Management"}, + {"name": "docker_exec", "description": "Execute a command in a running container", "category": "Container Management"}, + {"name": "docker_export", "description": "Export a container's filesystem as a tar archive", "category": "Container Management"}, + {"name": "docker_inspectContainer", "description": "Get detailed information about a container", "category": "Container Management"}, + {"name": "docker_kill", "description": "Send a signal to a running container", "category": "Container Management"}, + {"name": "docker_listContainers", "description": "List Docker containers with status, ports, and resource info", "category": "Container Management"}, + {"name": "docker_pause", "description": "Pause all processes in a running container", "category": "Container Management"}, + {"name": "docker_port", "description": "List port mappings for a container", "category": "Container Management"}, + {"name": "docker_rename", "description": "Rename a Docker container", "category": "Container Management"}, + {"name": "docker_restart", "description": "Restart a container with an optional grace period", "category": "Container Management"}, + {"name": "docker_rm", "description": "Remove a container", "category": "Container Management"}, + {"name": "docker_run", "description": "Create and start a container from an image", "category": "Container Management"}, + {"name": "docker_start", "description": "Start a stopped container", "category": "Container Management"}, + {"name": "docker_stats", "description": "Show live resource usage statistics for containers", "category": "Container Management"}, + {"name": "docker_stop", "description": "Stop a running container", "category": "Container Management"}, + {"name": "docker_top", "description": "Show running processes in a container", "category": "Container Management"}, + {"name": "docker_unpause", "description": "Unpause a paused container", "category": "Container Management"}, + {"name": "docker_update", "description": "Update resource configuration of a running container", "category": "Container Management"}, + {"name": "docker_wait", "description": "Block until a container stops and return its exit code", "category": "Container Management"}, + {"name": "docker_build", "description": "Build a Docker image from a Dockerfile", "category": "Image Management"}, + {"name": "docker_imageHistory", "description": "Show the layer history of a Docker image", "category": "Image Management"}, + {"name": "docker_imagePrune", "description": "Remove unused Docker images", "category": "Image Management"}, + {"name": "docker_import", "description": "Import a tarball to create a Docker filesystem image", "category": "Image Management"}, + {"name": "docker_inspectImage", "description": "Get detailed image metadata including layers and labels", "category": "Image Management"}, + {"name": "docker_listImages", "description": "List local Docker images with tags and sizes", "category": "Image Management"}, + {"name": "docker_load", "description": "Load images from a tar archive", "category": "Image Management"}, + {"name": "docker_pull", "description": "Pull an image from a registry", "category": "Image Management"}, + {"name": "docker_push", "description": "Push an image to a registry", "category": "Image Management"}, + {"name": "docker_rmi", "description": "Remove one or more images", "category": "Image Management"}, + {"name": "docker_save", "description": "Save images to a tar archive", "category": "Image Management"}, + {"name": "docker_tag", "description": "Create a tag for a source image", "category": "Image Management"}, + {"name": "docker_login", "description": "Authenticate to a container registry", "category": "Registry"}, + {"name": "docker_logout", "description": "Log out from a container registry", "category": "Registry"}, + {"name": "docker_searchHub", "description": "Search Docker Hub for images", "category": "Registry"}, + {"name": "docker_composeBuild", "description": "Build or rebuild Compose service images", "category": "Docker Compose"}, + {"name": "docker_composeConfig", "description": "Validate and render a Compose file", "category": "Docker Compose"}, + {"name": "docker_composeCp", "description": "Copy files between a Compose service and the local filesystem", "category": "Docker Compose"}, + {"name": "docker_composeCreate", "description": "Create Compose service containers without starting them", "category": "Docker Compose"}, + {"name": "docker_composeDown", "description": "Stop and remove Compose containers and networks", "category": "Docker Compose"}, + {"name": "docker_composeEvents", "description": "Receive real-time events from Compose containers", "category": "Docker Compose"}, + {"name": "docker_composeExec", "description": "Execute a command in a running Compose service container", "category": "Docker Compose"}, + {"name": "docker_composeImages", "description": "List images used by Compose services", "category": "Docker Compose"}, + {"name": "docker_composeKill", "description": "Force stop Compose service containers", "category": "Docker Compose"}, + {"name": "docker_composeLogs", "description": "View logs for Compose services", "category": "Docker Compose"}, + {"name": "docker_composeLs", "description": "List running Compose projects", "category": "Docker Compose"}, + {"name": "docker_composePause", "description": "Pause Compose services", "category": "Docker Compose"}, + {"name": "docker_composePort", "description": "Print the public port for a Compose service", "category": "Docker Compose"}, + {"name": "docker_composePs", "description": "List containers for a Compose project", "category": "Docker Compose"}, + {"name": "docker_composePull", "description": "Pull images for Compose services", "category": "Docker Compose"}, + {"name": "docker_composeRestart", "description": "Restart Compose services", "category": "Docker Compose"}, + {"name": "docker_composeRm", "description": "Remove stopped Compose service containers", "category": "Docker Compose"}, + {"name": "docker_composeRun", "description": "Run a one-off command on a Compose service", "category": "Docker Compose"}, + {"name": "docker_composeScale", "description": "Scale Compose services to a specified replica count", "category": "Docker Compose"}, + {"name": "docker_composeStart", "description": "Start existing Compose service containers", "category": "Docker Compose"}, + {"name": "docker_composeStop", "description": "Stop Compose services without removing containers", "category": "Docker Compose"}, + {"name": "docker_composeTop", "description": "Display running processes in Compose containers", "category": "Docker Compose"}, + {"name": "docker_composeUnpause", "description": "Unpause Compose services", "category": "Docker Compose"}, + {"name": "docker_composeUp", "description": "Create and start Compose services", "category": "Docker Compose"}, + {"name": "docker_composeVersion", "description": "Show Docker Compose version information", "category": "Docker Compose"}, + {"name": "docker_composeWatch", "description": "Watch build context and auto-rebuild on file changes", "category": "Docker Compose"}, + {"name": "docker_listVolumes", "description": "List Docker volumes with driver info", "category": "Volume"}, + {"name": "docker_volumeCreate", "description": "Create a named Docker volume", "category": "Volume"}, + {"name": "docker_volumeInspect", "description": "Display detailed information about a volume", "category": "Volume"}, + {"name": "docker_volumePrune", "description": "Remove all unused Docker volumes", "category": "Volume"}, + {"name": "docker_volumeRm", "description": "Remove one or more Docker volumes", "category": "Volume"}, + {"name": "docker_listNetworks", "description": "List Docker networks", "category": "Network"}, + {"name": "docker_networkConnect", "description": "Connect a container to a network", "category": "Network"}, + {"name": "docker_networkCreate", "description": "Create a Docker network", "category": "Network"}, + {"name": "docker_networkDisconnect", "description": "Disconnect a container from a network", "category": "Network"}, + {"name": "docker_networkInspect", "description": "Display detailed information about a network", "category": "Network"}, + {"name": "docker_networkPrune", "description": "Remove all unused Docker networks", "category": "Network"}, + {"name": "docker_networkRm", "description": "Remove one or more Docker networks", "category": "Network"}, + {"name": "docker_diskUsage", "description": "Get Docker disk usage breakdown", "category": "System"}, + {"name": "docker_systemInfo", "description": "Get Docker system information", "category": "System"}, + {"name": "docker_systemPrune", "description": "Remove unused containers, networks, and images", "category": "System"}, + {"name": "docker_version", "description": "Show Docker version information", "category": "System"}, + {"name": "docker_builderPrune", "description": "Remove Docker buildx build cache", "category": "Buildx"}, + {"name": "docker_buildxBuild", "description": "Build images with buildx for multi-platform support", "category": "Buildx"}, + {"name": "docker_buildxCreate", "description": "Create a new buildx builder instance", "category": "Buildx"}, + {"name": "docker_buildxImagetools", "description": "Inspect or create multi-platform manifest lists", "category": "Buildx"}, + {"name": "docker_buildxInspect", "description": "Inspect a buildx builder instance", "category": "Buildx"}, + {"name": "docker_buildxLs", "description": "List buildx builder instances", "category": "Buildx"}, + {"name": "docker_buildxRm", "description": "Remove a buildx builder instance", "category": "Buildx"}, + {"name": "docker_buildxUse", "description": "Set the default buildx builder", "category": "Buildx"}, + {"name": "docker_manifestAnnotate", "description": "Add platform info to a manifest list entry", "category": "Manifest"}, + {"name": "docker_manifestCreate", "description": "Create a local manifest list for multi-arch images", "category": "Manifest"}, + {"name": "docker_manifestInspect", "description": "Display an image manifest or manifest list", "category": "Manifest"}, + {"name": "docker_manifestPush", "description": "Push a manifest list to a registry", "category": "Manifest"}, + {"name": "docker_manifestRm", "description": "Remove local manifest lists", "category": "Manifest"}, + {"name": "docker_contextCreate", "description": "Create a Docker context for remote hosts", "category": "Context"}, + {"name": "docker_contextInspect", "description": "Display detailed info on a Docker context", "category": "Context"}, + {"name": "docker_contextLs", "description": "List available Docker contexts", "category": "Context"}, + {"name": "docker_contextRm", "description": "Remove Docker contexts", "category": "Context"}, + {"name": "docker_contextShow", "description": "Print the current Docker context name", "category": "Context"}, + {"name": "docker_contextUse", "description": "Set the active Docker context", "category": "Context"}, + {"name": "docker_swarmCa", "description": "Display and rotate the Swarm root CA certificate", "category": "Swarm Cluster"}, + {"name": "docker_swarmInit", "description": "Initialize a new Swarm cluster", "category": "Swarm Cluster"}, + {"name": "docker_swarmJoin", "description": "Join an existing Swarm", "category": "Swarm Cluster"}, + {"name": "docker_swarmJoinToken", "description": "Display or rotate join tokens", "category": "Swarm Cluster"}, + {"name": "docker_swarmLeave", "description": "Leave the Swarm", "category": "Swarm Cluster"}, + {"name": "docker_swarmUnlock", "description": "Unlock a locked Swarm manager", "category": "Swarm Cluster"}, + {"name": "docker_swarmUnlockKey", "description": "Display or rotate the Swarm unlock key", "category": "Swarm Cluster"}, + {"name": "docker_swarmUpdate", "description": "Update Swarm configuration", "category": "Swarm Cluster"}, + {"name": "docker_serviceCreate", "description": "Create a new Swarm service", "category": "Swarm Services"}, + {"name": "docker_serviceInspect", "description": "Display detailed info on a Swarm service", "category": "Swarm Services"}, + {"name": "docker_serviceLogs", "description": "Fetch logs from a Swarm service", "category": "Swarm Services"}, + {"name": "docker_serviceLs", "description": "List Swarm services", "category": "Swarm Services"}, + {"name": "docker_servicePs", "description": "List tasks of a Swarm service", "category": "Swarm Services"}, + {"name": "docker_serviceRm", "description": "Remove Swarm services", "category": "Swarm Services"}, + {"name": "docker_serviceRollback", "description": "Revert a Swarm service to previous config", "category": "Swarm Services"}, + {"name": "docker_serviceScale", "description": "Scale Swarm services", "category": "Swarm Services"}, + {"name": "docker_serviceUpdate", "description": "Update a Swarm service", "category": "Swarm Services"}, + {"name": "docker_nodeDemote", "description": "Demote Swarm manager nodes to worker", "category": "Swarm Nodes"}, + {"name": "docker_nodeInspect", "description": "Display detailed info on a Swarm node", "category": "Swarm Nodes"}, + {"name": "docker_nodeLs", "description": "List nodes in the Swarm", "category": "Swarm Nodes"}, + {"name": "docker_nodePromote", "description": "Promote Swarm workers to manager", "category": "Swarm Nodes"}, + {"name": "docker_nodePs", "description": "List tasks running on a Swarm node", "category": "Swarm Nodes"}, + {"name": "docker_nodeRm", "description": "Remove nodes from the Swarm", "category": "Swarm Nodes"}, + {"name": "docker_nodeUpdate", "description": "Update metadata on a Swarm node", "category": "Swarm Nodes"}, + {"name": "docker_stackConfig", "description": "Output merged config for a Swarm stack", "category": "Swarm Stacks"}, + {"name": "docker_stackDeploy", "description": "Deploy or update a stack from a compose file", "category": "Swarm Stacks"}, + {"name": "docker_stackLs", "description": "List Swarm stacks", "category": "Swarm Stacks"}, + {"name": "docker_stackPs", "description": "List tasks in a Swarm stack", "category": "Swarm Stacks"}, + {"name": "docker_stackRm", "description": "Remove Swarm stacks", "category": "Swarm Stacks"}, + {"name": "docker_stackServices", "description": "List services in a Swarm stack", "category": "Swarm Stacks"}, + {"name": "docker_configCreate", "description": "Create a Swarm config", "category": "Swarm Config & Secrets"}, + {"name": "docker_configInspect", "description": "Display detailed info on a Swarm config", "category": "Swarm Config & Secrets"}, + {"name": "docker_configLs", "description": "List Swarm configs", "category": "Swarm Config & Secrets"}, + {"name": "docker_configRm", "description": "Remove Swarm configs", "category": "Swarm Config & Secrets"}, + {"name": "docker_secretCreate", "description": "Create a Swarm secret", "category": "Swarm Config & Secrets"}, + {"name": "docker_secretInspect", "description": "Display info on a Swarm secret (metadata only)", "category": "Swarm Config & Secrets"}, + {"name": "docker_secretLs", "description": "List Swarm secrets", "category": "Swarm Config & Secrets"}, + {"name": "docker_secretRm", "description": "Remove Swarm secrets", "category": "Swarm Config & Secrets"}, + {"name": "docker_trustInspect", "description": "Inspect Docker Content Trust data for an image", "category": "Content Trust"}, + {"name": "docker_trustKey", "description": "Manage Content Trust signing keys", "category": "Content Trust"}, + {"name": "docker_trustRevoke", "description": "Revoke Content Trust for an image", "category": "Content Trust"}, + {"name": "docker_trustSign", "description": "Sign an image for Content Trust", "category": "Content Trust"}, + {"name": "docker_scoutCves", "description": "List CVEs found in an image using Docker Scout", "category": "Docker Scout"}, + {"name": "docker_scoutQuickview", "description": "Quick overview of image vulnerabilities", "category": "Docker Scout"}, + {"name": "docker_scoutRecommendations", "description": "Get base image update recommendations", "category": "Docker Scout"}, + {"name": "docker_pluginEnable", "description": "Enable a disabled Docker plugin", "category": "Plugins"}, + {"name": "docker_pluginInstall", "description": "Install a Docker plugin from a registry", "category": "Plugins"}, + {"name": "docker_pluginLs", "description": "List installed Docker plugins", "category": "Plugins"}, + {"name": "docker_pluginRm", "description": "Remove Docker plugins", "category": "Plugins"} +] diff --git a/site.json b/site.json new file mode 100644 index 0000000..e95110b --- /dev/null +++ b/site.json @@ -0,0 +1,19 @@ +{ + "accent": "#0db7ed", + "accentLight": "#4fc3f7", + "heroGradientFrom": "#0a1117", + "heroGradientTo": "#0d2137", + "favicon": "assets/logo.png", + "ogImage": "assets/logo.png", + "installSteps": [ + "Clone the repository", + "Open the folder in Cursor IDE", + "Install MCP server: cd mcp-server && npm install", + "Configure MCP in your editor settings", + "Start using the AI skills and rules" + ], + "links": { + "npm": "https://www.npmjs.com/package/@tmhs/docker-mcp", + "github": "https://github.com/TMHSDigital/Docker-Developer-Tools" + } +} From ed9e5b32bdf847ef63f8115f961978f4c832df7f Mon Sep 17 00:00:00 2001 From: fOuttaMyPaint Date: Wed, 8 Apr 2026 18:25:28 -0400 Subject: [PATCH 20/27] feat: add AGENTS.md, rebuild GitHub Pages with fixed template Add AGENTS.md with repo structure, skills, rules, MCP tools, and CI docs. Rebuild docs site with fixed skill parser and QoL features (collapsible categories, search/filter, back-to-top, toast, mobile nav). Made-with: Cursor --- AGENTS.md | 91 ++ docs/index.html | 2504 +++++++++++++++++++++++------------------------ 2 files changed, 1326 insertions(+), 1269 deletions(-) create mode 100644 AGENTS.md diff --git a/AGENTS.md b/AGENTS.md new file mode 100644 index 0000000..9818fe9 --- /dev/null +++ b/AGENTS.md @@ -0,0 +1,91 @@ +# AGENTS.md + +Guidance for AI coding agents working on the Docker Developer Tools repository. + +## Repository overview + +A Cursor IDE plugin providing Docker and container workflows. 17 skills, 10 rules, and 150 MCP tools for building, debugging, optimizing, and managing Docker containers, images, networks, and volumes. Includes a companion MCP server (`@tmhs/docker-mcp`) for live Docker CLI integration. + +**Docs site:** https://tmhsdigital.github.io/Docker-Developer-Tools/ + +## Repository structure + +``` +Docker-Developer-Tools/ + .cursor-plugin/plugin.json # Plugin manifest (name, version, description) + skills/ # 17 skill directories, each with SKILL.md + rules/ # 10 rule files (.mdc) + mcp-server/ # Companion MCP server (Node.js/TypeScript) + src/ # Server source code + dist/ # Compiled output + mcp-tools.json # MCP tool catalog (150 tools, manually maintained) + site.json # GitHub Pages branding/config + docs/ # Generated GitHub Pages site (do not edit manually) + assets/ # Logo and images + tests/ # Test suite + .github/workflows/ # CI/CD (ci, codeql, dep-review, links, pages, publish, release-drafter, stale, validate) +``` + +## Branching and commit model + +- **Single branch:** `main` only +- **Conventional commits:** `feat:`, `fix:`, `chore:`, `docs:` + +## Skills + +Each skill lives in `skills//SKILL.md`. Every SKILL.md starts with YAML frontmatter: + +```yaml +--- +name: skill-name +description: One-line description of what the skill does +--- +``` + +The `name` and `description` fields are parsed by the site template build system to generate the GitHub Pages site. The body below the frontmatter contains the full skill content. + +When adding a new skill: +1. Create `skills//SKILL.md` with frontmatter +2. Update the `skills` count in `.cursor-plugin/plugin.json` +3. Use `feat:` commit prefix + +## Rules + +Rules are `.mdc` files in `rules/`. Each starts with YAML frontmatter containing `description` and `globs` fields. When adding a new rule, update the `rules` count in context references. + +## MCP Tools + +`mcp-tools.json` is a manually maintained JSON array of all MCP tools. Each entry has `name`, `description`, and `category` fields. This file is used by the GitHub Pages build system to render the tools catalog. When adding or removing tools from `mcp-server/`, update this file accordingly. + +## GitHub Pages + +The docs site is auto-generated. Do not edit `docs/index.html` directly. It is built by the shared template system from the Developer-Tools-Directory repo. + +Data sources: +- `.cursor-plugin/plugin.json` -- metadata (name, version, description) +- `site.json` -- branding (accent color, install steps, links) +- `skills/*/SKILL.md` -- parsed for name/description via frontmatter +- `rules/*.mdc` -- parsed for name/scope/description +- `mcp-tools.json` -- tool catalog + +The `pages.yml` workflow clones Developer-Tools-Directory, runs `build_site.py`, and deploys the output. Changes to skills, rules, mcp-tools.json, site.json, plugin.json, or assets trigger a rebuild. + +## CI/CD workflows + +- `ci.yml` -- runs tests on push/PR +- `validate.yml` -- validates plugin.json schema, checks docs +- `pages.yml` -- builds and deploys GitHub Pages via shared template +- `publish.yml` -- publishes MCP server to npm +- `codeql.yml` -- security scanning +- `dependency-review.yml` -- audits PR dependencies +- `release-drafter.yml` -- auto-drafts release notes +- `stale.yml` -- marks/closes inactive issues and PRs +- `links.yml` -- checks for broken links + +## Key conventions + +- No em dashes or en dashes -- use hyphens or rewrite +- No hardcoded credentials, tokens, or API keys +- Conventional commits required +- CC-BY-NC-ND-4.0 license +- All content written for public readership diff --git a/docs/index.html b/docs/index.html index c66e80c..c5d7ac0 100644 --- a/docs/index.html +++ b/docs/index.html @@ -11,34 +11,10 @@ @@ -336,6 +155,9 @@
@@ -1363,20 +1382,30 @@

MCP Tools

-

Installation

-
    - -
  1. Clone the repository
  2. - -
  3. Open the folder in Cursor IDE
  4. - -
  5. Install MCP server: cd mcp-server && npm install
  6. - -
  7. Configure MCP in your editor settings
  8. - -
  9. Start using the AI skills and rules
  10. - -
+
+

Installation

+
+ +
+
+
+ Installation steps +
+
    + +
  1. Clone the repository
  2. + +
  3. Open the folder in Cursor IDE
  4. + +
  5. Install MCP server: cd mcp-server && npm install
  6. + +
  7. Configure MCP in your editor settings
  8. + +
  9. Start using the AI skills and rules
  10. + +
+
+
@@ -1499,6 +1528,18 @@

MCP Tools

}); })(); + /* Section collapse/expand toggles (Skills, Rules) */ + (function () { + document.querySelectorAll('.toggle-section').forEach(function (btn) { + var targetId = btn.getAttribute('data-target'); + var details = document.getElementById(targetId); + if (!details) return; + function updateLabel() { btn.textContent = details.open ? 'Collapse' : 'Expand'; } + btn.addEventListener('click', function () { details.open = !details.open; updateLabel(); }); + details.addEventListener('toggle', updateLabel); + }); + })(); + /* Scroll spy */ (function () { var links = document.querySelectorAll('.nav-links a[href^="#"]'); From 6f29d7284974c4e06494096147dad664de9f5939 Mon Sep 17 00:00:00 2001 From: fOuttaMyPaint Date: Wed, 8 Apr 2026 18:41:10 -0400 Subject: [PATCH 22/27] fix: start all sections collapsed by default Made-with: Cursor --- docs/index.html | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/docs/index.html b/docs/index.html index 36128e9..1b85eb6 100644 --- a/docs/index.html +++ b/docs/index.html @@ -203,10 +203,10 @@

Docker Developer Tools

Skills

17
- +
-
+
Skills list
@@ -312,10 +312,10 @@

Skills

Rules

10
- +
-
+
Rules list
@@ -409,7 +409,7 @@

MCP Tools

-
+
Buildx 8
@@ -1385,10 +1385,10 @@

MCP Tools

Installation

- +
-
+
Installation steps
    From e309382317dceeca0505ad473a9fa7f0f5319558 Mon Sep 17 00:00:00 2001 From: fOuttaMyPaint Date: Wed, 8 Apr 2026 18:44:52 -0400 Subject: [PATCH 23/27] fix: polish section layout with cards, smooth hero fade, tighter spacing Made-with: Cursor --- docs/index.html | 26 ++++++++++++++++++-------- 1 file changed, 18 insertions(+), 8 deletions(-) diff --git a/docs/index.html b/docs/index.html index 1b85eb6..71befc4 100644 --- a/docs/index.html +++ b/docs/index.html @@ -49,7 +49,7 @@ .nav-toggle svg { width: 24px; height: 24px; } /* HERO */ - .hero { text-align: center; padding: 5rem 1.5rem 3.5rem; background: linear-gradient(180deg, var(--hero-from), var(--hero-to)); } + .hero { text-align: center; padding: 5rem 1.5rem 4.5rem; background: linear-gradient(180deg, var(--hero-from) 0%, var(--hero-to) 70%, var(--bg) 100%); position: relative; } .hero-inner { max-width: 720px; margin: 0 auto; } .hero h1 { font-size: 2.75rem; font-weight: 700; margin-bottom: 1rem; background: linear-gradient(135deg, var(--text), var(--accent-light)); -webkit-background-clip: text; -webkit-text-fill-color: transparent; background-clip: text; } .hero p { font-size: 1.125rem; color: var(--text-dim); margin-bottom: 2rem; max-width: 600px; margin-left: auto; margin-right: auto; } @@ -62,13 +62,16 @@ .badge:hover { border-color: var(--accent); background: var(--bg3); color: var(--text); } .badge svg { width: 18px; height: 18px; flex-shrink: 0; } + /* CONTENT AREA */ + .content-area { max-width: 1040px; margin: 0 auto; padding: 2rem 1.5rem 0; } + /* SECTIONS */ - .section { max-width: 1000px; margin: 0 auto; padding: 3rem 1.5rem; } - .section-header { display: flex; align-items: center; gap: 0.5rem; margin-bottom: 1.5rem; padding-bottom: 0.75rem; border-bottom: 2px solid var(--border); flex-wrap: wrap; } - .section-header h2 { font-size: 1.5rem; font-weight: 700; margin: 0; } - .count { font-size: 0.875rem; font-weight: 500; color: var(--text-dim); background: var(--bg2); padding: 0.15rem 0.6rem; border-radius: 12px; } + .section { background: var(--bg2); border: 1px solid var(--border); border-radius: 12px; padding: 1.75rem 2rem; margin-bottom: 1.25rem; } + .section-header { display: flex; align-items: center; gap: 0.5rem; margin-bottom: 1rem; padding-bottom: 0.625rem; border-bottom: 1px solid var(--border); flex-wrap: wrap; } + .section-header h2 { font-size: 1.25rem; font-weight: 700; margin: 0; } + .count { font-size: 0.8125rem; font-weight: 500; color: var(--text-dim); background: var(--bg3); padding: 0.15rem 0.6rem; border-radius: 12px; } .section-actions { margin-left: auto; display: flex; gap: 0.5rem; align-items: center; } - .btn-sm { padding: 0.3rem 0.75rem; background: var(--bg2); border: 1px solid var(--border); border-radius: 6px; color: var(--text-dim); font-size: 0.75rem; font-weight: 500; cursor: pointer; transition: color 0.2s, border-color 0.2s; font-family: var(--font-sans); } + .btn-sm { padding: 0.3rem 0.75rem; background: var(--bg3); border: 1px solid var(--border); border-radius: 6px; color: var(--text-dim); font-size: 0.75rem; font-weight: 500; cursor: pointer; transition: color 0.2s, border-color 0.2s; font-family: var(--font-sans); } .btn-sm:hover { color: var(--accent-light); border-color: var(--accent); } /* SEARCH */ @@ -119,7 +122,7 @@ .back-to-top svg { width: 20px; height: 20px; } /* FOOTER */ - footer { border-top: 1px solid var(--border); text-align: center; padding: 2.5rem 1.5rem; color: var(--text-dim); font-size: 0.8125rem; } + footer { text-align: center; padding: 2.5rem 1.5rem; color: var(--text-dim); font-size: 0.8125rem; margin-top: 1rem; } footer a { color: var(--accent-light); } /* RESPONSIVE */ @@ -135,9 +138,11 @@ .nav-toggle { display: block; } .nav-links { display: none; position: absolute; top: 56px; left: 0; right: 0; flex-direction: column; background: rgba(13,17,23,0.97); border-bottom: 1px solid var(--border); padding: 1rem 1.5rem; gap: 0.75rem; } .nav-links.open { display: flex; } - .hero { padding: 3rem 1rem 2rem; } + .hero { padding: 3rem 1rem 2.5rem; } .hero h1 { font-size: 1.5rem; } .hero-badges { flex-direction: column; align-items: center; } + .content-area { padding: 0 0.75rem; } + .section { padding: 1.25rem 1rem; border-radius: 8px; } .section-header { flex-direction: column; align-items: flex-start; gap: 0.75rem; } .section-actions { margin-left: 0; } } @@ -196,6 +201,9 @@

    Docker Developer Tools

+ +
+
@@ -1409,6 +1417,8 @@

Installation

+
+

From 29339d0dcac727561be00c7b88388f1912307db7 Mon Sep 17 00:00:00 2001 From: fOuttaMyPaint Date: Wed, 8 Apr 2026 18:55:45 -0400 Subject: [PATCH 24/27] feat: visual polish - logo, accent glow, light/dark mode, animations, rich footer Made-with: Cursor --- docs/index.html | 158 ++++++++++++++++++++++++++++++++++++++++++++---- 1 file changed, 145 insertions(+), 13 deletions(-) diff --git a/docs/index.html b/docs/index.html index 71befc4..458653f 100644 --- a/docs/index.html +++ b/docs/index.html @@ -10,6 +10,9 @@ +