mcp-rubber-duck 1.2.0 โ†’ 1.2.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,8 +1,6 @@
1
1
  name: ๐Ÿ”’ Security & Quality
2
2
 
3
3
  on:
4
- push:
5
- branches: [ master, main ]
6
4
  pull_request:
7
5
  branches: [ master, main ]
8
6
  schedule:
@@ -7,6 +7,18 @@ on:
7
7
  - main
8
8
  workflow_dispatch:
9
9
 
10
+ env:
11
+ REGISTRY: ghcr.io
12
+ IMAGE_NAME: ${{ github.repository }}
13
+
14
+ permissions:
15
+ contents: write
16
+ issues: write
17
+ pull-requests: write
18
+ packages: write
19
+ security-events: write
20
+ actions: read
21
+
10
22
  jobs:
11
23
  test:
12
24
  name: ๐Ÿงช Test Before Release
@@ -37,15 +49,103 @@ jobs:
37
49
  # - name: ๐Ÿงช Test
38
50
  # run: npm test
39
51
 
52
+ security-scan:
53
+ name: ๐Ÿ” Security Scan
54
+ runs-on: ubuntu-latest
55
+
56
+ steps:
57
+ - name: ๐Ÿ“ฅ Checkout
58
+ uses: actions/checkout@v4
59
+
60
+ - name: ๐Ÿ”’ Run Trivy vulnerability scanner
61
+ uses: aquasecurity/trivy-action@master
62
+ with:
63
+ scan-type: 'fs'
64
+ scan-ref: '.'
65
+ format: 'sarif'
66
+ output: 'trivy-results.sarif'
67
+
68
+ - name: ๐Ÿ“ค Upload Trivy scan results to GitHub Security
69
+ uses: github/codeql-action/upload-sarif@v3
70
+ if: always()
71
+ with:
72
+ sarif_file: 'trivy-results.sarif'
73
+ category: 'trivy-filesystem'
74
+
75
+ - name: ๐Ÿณ Build Docker image for security scan
76
+ run: |
77
+ docker build -t security-scan-image .
78
+
79
+ - name: ๐Ÿ”’ Run Trivy on Docker image
80
+ uses: aquasecurity/trivy-action@master
81
+ with:
82
+ image-ref: 'security-scan-image'
83
+ format: 'sarif'
84
+ output: 'trivy-docker-results.sarif'
85
+
86
+ - name: ๐Ÿ“ค Upload Docker scan results
87
+ uses: github/codeql-action/upload-sarif@v3
88
+ if: always()
89
+ with:
90
+ sarif_file: 'trivy-docker-results.sarif'
91
+ category: 'trivy-docker'
92
+
93
+ dependency-check:
94
+ name: ๐Ÿ“ฆ Dependency Check
95
+ runs-on: ubuntu-latest
96
+
97
+ steps:
98
+ - name: ๐Ÿ“ฅ Checkout
99
+ uses: actions/checkout@v4
100
+
101
+ - name: ๐Ÿ“ฆ Setup Node.js
102
+ uses: actions/setup-node@v4
103
+ with:
104
+ node-version: '20'
105
+ cache: 'npm'
106
+
107
+ - name: ๐Ÿ“ฅ Install dependencies
108
+ run: npm ci
109
+
110
+ - name: ๐Ÿ” Audit dependencies
111
+ run: npm audit --audit-level=moderate
112
+
113
+ - name: ๐Ÿ“Š Check for outdated packages
114
+ run: npm outdated || true
115
+
116
+ - name: ๐Ÿ”’ Check for known vulnerabilities
117
+ run: npx audit-ci --config audit-ci.json || true
118
+
119
+ dockerfile-lint:
120
+ name: ๐Ÿณ Dockerfile Lint
121
+ runs-on: ubuntu-latest
122
+
123
+ steps:
124
+ - name: ๐Ÿ“ฅ Checkout
125
+ uses: actions/checkout@v4
126
+
127
+ - name: ๐Ÿ” Lint Dockerfile
128
+ uses: hadolint/hadolint-action@v3.1.0
129
+ with:
130
+ dockerfile: Dockerfile
131
+ format: sarif
132
+ output-file: hadolint-results.sarif
133
+ no-fail: true
134
+
135
+ - name: ๐Ÿ“ค Upload Dockerfile lint results
136
+ uses: github/codeql-action/upload-sarif@v3
137
+ if: always()
138
+ with:
139
+ sarif_file: hadolint-results.sarif
140
+ category: 'hadolint'
141
+
40
142
  release:
41
143
  name: ๐Ÿ“ฆ Release
42
- needs: test
144
+ needs: [test, security-scan, dependency-check, dockerfile-lint]
43
145
  runs-on: ubuntu-latest
44
- permissions:
45
- contents: write
46
- issues: write
47
- pull-requests: write
48
- packages: write
146
+ outputs:
147
+ release-version: ${{ steps.get-version.outputs.version }}
148
+ new-release-published: ${{ steps.check-release.outputs.released }}
49
149
 
50
150
  steps:
51
151
  - name: ๐Ÿ“ฅ Checkout
@@ -66,12 +166,49 @@ jobs:
66
166
  - name: ๐Ÿ—๏ธ Build
67
167
  run: npm run build
68
168
 
169
+ - name: ๐Ÿท๏ธ Get latest tag before release
170
+ id: tag-before
171
+ run: |
172
+ latest_tag=$(git describe --tags --abbrev=0 2>/dev/null || echo "none")
173
+ echo "tag=$latest_tag" >> $GITHUB_OUTPUT
174
+ echo "Latest tag before release: $latest_tag"
175
+
69
176
  - name: ๐Ÿ“ฆ Run semantic-release
70
177
  env:
71
178
  GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
72
179
  NPM_TOKEN: ${{ secrets.NPM_TOKEN }}
73
180
  run: npx semantic-release
74
181
 
182
+ - name: ๐Ÿท๏ธ Get latest tag after release
183
+ id: tag-after
184
+ run: |
185
+ git fetch --tags
186
+ latest_tag=$(git describe --tags --abbrev=0 2>/dev/null || echo "none")
187
+ echo "tag=$latest_tag" >> $GITHUB_OUTPUT
188
+ echo "Latest tag after release: $latest_tag"
189
+
190
+ - name: ๐Ÿ“ฆ Extract version from new tag
191
+ id: get-version
192
+ run: |
193
+ if [ "${{ steps.tag-after.outputs.tag }}" != "none" ]; then
194
+ version=$(echo "${{ steps.tag-after.outputs.tag }}" | sed 's/^v//')
195
+ echo "version=$version" >> $GITHUB_OUTPUT
196
+ echo "Extracted version: $version"
197
+ else
198
+ echo "version=" >> $GITHUB_OUTPUT
199
+ fi
200
+
201
+ - name: ๐Ÿ” Check if new release was published
202
+ id: check-release
203
+ run: |
204
+ if [ "${{ steps.tag-before.outputs.tag }}" != "${{ steps.tag-after.outputs.tag }}" ] && [ "${{ steps.tag-after.outputs.tag }}" != "none" ]; then
205
+ echo "released=true" >> $GITHUB_OUTPUT
206
+ echo "New release detected: ${{ steps.tag-after.outputs.tag }}"
207
+ else
208
+ echo "released=false" >> $GITHUB_OUTPUT
209
+ echo "No new release"
210
+ fi
211
+
75
212
  - name: ๐Ÿ“Š Release Summary
76
213
  if: success()
77
214
  run: |
@@ -82,8 +219,100 @@ jobs:
82
219
  echo "- ๐Ÿ“ Generated changelog entries" >> $GITHUB_STEP_SUMMARY
83
220
  echo "- ๐Ÿท๏ธ Created git tag (if new version)" >> $GITHUB_STEP_SUMMARY
84
221
  echo "- ๐Ÿ“ฆ Updated package.json version" >> $GITHUB_STEP_SUMMARY
85
- echo "- ๐Ÿณ Tagged version will trigger Docker build via release.yml" >> $GITHUB_STEP_SUMMARY
222
+ if [ "${{ steps.check-release.outputs.released }}" == "true" ]; then
223
+ echo "- โœ… **New version released:** ${{ steps.get-version.outputs.version }}" >> $GITHUB_STEP_SUMMARY
224
+ echo "- ๐Ÿณ Docker images will be built next" >> $GITHUB_STEP_SUMMARY
225
+ else
226
+ echo "- โ„น๏ธ **No new version:** No changes warranted a release" >> $GITHUB_STEP_SUMMARY
227
+ fi
228
+
229
+ docker:
230
+ name: ๐Ÿณ Build & Push Docker Images
231
+ needs: release
232
+ runs-on: ubuntu-latest
233
+ if: needs.release.outputs.new-release-published == 'true'
234
+
235
+ steps:
236
+ - name: ๐Ÿ“ฅ Checkout release tag
237
+ uses: actions/checkout@v4
238
+ with:
239
+ ref: v${{ needs.release.outputs.release-version }}
240
+ fetch-depth: 0
241
+
242
+ - name: ๐Ÿ› ๏ธ Set up QEMU
243
+ uses: docker/setup-qemu-action@v3
244
+
245
+ - name: ๐Ÿ› ๏ธ Set up Docker Buildx
246
+ uses: docker/setup-buildx-action@v3
247
+
248
+ - name: ๐Ÿ”‘ Login to Container Registry
249
+ uses: docker/login-action@v3
250
+ with:
251
+ registry: ${{ env.REGISTRY }}
252
+ username: ${{ github.actor }}
253
+ password: ${{ secrets.GITHUB_TOKEN }}
254
+
255
+ - name: ๐Ÿท๏ธ Extract metadata
256
+ id: meta
257
+ uses: docker/metadata-action@v5
258
+ with:
259
+ images: ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}
260
+ tags: |
261
+ type=semver,pattern={{version}},value=${{ needs.release.outputs.release-version }}
262
+ type=semver,pattern={{major}}.{{minor}},value=${{ needs.release.outputs.release-version }}
263
+ type=semver,pattern={{major}},value=${{ needs.release.outputs.release-version }}
264
+ type=raw,value=latest
265
+ labels: |
266
+ org.opencontainers.image.title=MCP Rubber Duck
267
+ org.opencontainers.image.description=Multi-platform MCP server for multiple OpenAI-compatible LLMs
268
+ org.opencontainers.image.version=${{ needs.release.outputs.release-version }}
269
+
270
+ - name: ๐Ÿณ Build and push Docker image
271
+ id: build
272
+ uses: docker/build-push-action@v5
273
+ with:
274
+ context: .
275
+ platforms: linux/amd64,linux/arm64
276
+ push: true
277
+ tags: ${{ steps.meta.outputs.tags }}
278
+ labels: ${{ steps.meta.outputs.labels }}
279
+ cache-from: type=gha
280
+ cache-to: type=gha,mode=max
281
+ build-args: |
282
+ BUILDKIT_INLINE_CACHE=1
283
+
284
+ - name: ๐Ÿ”ง Make package public
285
+ if: success()
286
+ run: |
287
+ # Wait a moment for package to appear
288
+ sleep 10
289
+
290
+ # Try to make package public (may fail if already public)
291
+ gh api --method PATCH \
292
+ "user/packages/container/${{ github.event.repository.name }}" \
293
+ --field visibility=public \
294
+ --silent || echo "Package may already be public or visibility change failed"
295
+ env:
296
+ GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
297
+
298
+ - name: ๐Ÿ“Š Docker Success Summary
299
+ if: success()
300
+ run: |
301
+ echo "๐ŸŽ‰ **Docker Images Built Successfully!**" >> $GITHUB_STEP_SUMMARY
302
+ echo "" >> $GITHUB_STEP_SUMMARY
303
+ echo "๐Ÿ“ฆ **Built for version:** ${{ needs.release.outputs.release-version }}" >> $GITHUB_STEP_SUMMARY
304
+ echo "" >> $GITHUB_STEP_SUMMARY
305
+ echo "๐Ÿณ **Docker Images Published:**" >> $GITHUB_STEP_SUMMARY
306
+ for tag in $(echo '${{ steps.meta.outputs.tags }}' | tr ',' '\n'); do
307
+ echo "- \`$tag\`" >> $GITHUB_STEP_SUMMARY
308
+ done
309
+ echo "" >> $GITHUB_STEP_SUMMARY
310
+ echo "๐Ÿ—๏ธ **Platforms:** AMD64, ARM64" >> $GITHUB_STEP_SUMMARY
311
+ echo "๐Ÿ“ **Registry:** ${{ env.REGISTRY }}" >> $GITHUB_STEP_SUMMARY
312
+ echo "๐Ÿ”— **Package URL:** https://github.com/${{ github.repository }}/pkgs/container/${{ github.event.repository.name }}" >> $GITHUB_STEP_SUMMARY
86
313
  echo "" >> $GITHUB_STEP_SUMMARY
87
- echo "๐Ÿ”„ **Next Steps:**" >> $GITHUB_STEP_SUMMARY
88
- echo "- If a new version was released, the release.yml workflow will build Docker images" >> $GITHUB_STEP_SUMMARY
89
- echo "- Check the releases page for the new version" >> $GITHUB_STEP_SUMMARY
314
+ echo "๐Ÿš€ **Quick Test:**" >> $GITHUB_STEP_SUMMARY
315
+ echo "\`\`\`bash" >> $GITHUB_STEP_SUMMARY
316
+ echo "docker pull ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}:${{ needs.release.outputs.release-version }}" >> $GITHUB_STEP_SUMMARY
317
+ echo "docker run --rm -e OPENAI_API_KEY=your-key ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}:${{ needs.release.outputs.release-version }}" >> $GITHUB_STEP_SUMMARY
318
+ echo "\`\`\`" >> $GITHUB_STEP_SUMMARY
package/CHANGELOG.md CHANGED
@@ -1,3 +1,7 @@
1
+ ## [1.2.2](https://github.com/nesquikm/mcp-rubber-duck/compare/v1.2.1...v1.2.2) (2025-09-17)
2
+
3
+ ## [1.2.1](https://github.com/nesquikm/mcp-rubber-duck/compare/v1.2.0...v1.2.1) (2025-09-17)
4
+
1
5
  # [1.2.0](https://github.com/nesquikm/mcp-rubber-duck/compare/v1.1.1...v1.2.0) (2025-09-17)
2
6
 
3
7
 
package/README.md CHANGED
@@ -2,6 +2,10 @@
2
2
 
3
3
  An MCP (Model Context Protocol) server that acts as a bridge to query multiple OpenAI-compatible LLMs. Just like rubber duck debugging, explain your problems to various AI "ducks" and get different perspectives!
4
4
 
5
+ [![npm version](https://badge.fury.io/js/mcp-rubber-duck.svg)](https://www.npmjs.com/package/mcp-rubber-duck)
6
+ [![Docker Image](https://img.shields.io/badge/docker-ghcr.io-blue)](https://github.com/nesquikm/mcp-rubber-duck/pkgs/container/mcp-rubber-duck)
7
+ [![MCP Registry](https://img.shields.io/badge/MCP-Registry-green)](https://modelcontextprotocol.io/registry)
8
+
5
9
  ```
6
10
  __
7
11
  <(o )___
@@ -51,7 +55,15 @@ Any provider with an OpenAI-compatible API endpoint, including:
51
55
  - npm or yarn
52
56
  - At least one API key for a supported provider
53
57
 
54
- ### Install from Source
58
+ ### Installation Methods
59
+
60
+ #### Option 1: Install from NPM
61
+
62
+ ```bash
63
+ npm install -g mcp-rubber-duck
64
+ ```
65
+
66
+ #### Option 2: Install from Source
55
67
 
56
68
  ```bash
57
69
  # Clone the repository
@@ -792,6 +804,16 @@ MIT License - see LICENSE file for details
792
804
 
793
805
  See [CHANGELOG.md](./CHANGELOG.md) for a detailed history of changes and releases.
794
806
 
807
+ ## ๐Ÿ“ฆ Registry & Directory
808
+
809
+ MCP Rubber Duck is available through multiple channels:
810
+
811
+ - **NPM Package**: [npmjs.com/package/mcp-rubber-duck](https://www.npmjs.com/package/mcp-rubber-duck)
812
+ - **Docker Images**: [ghcr.io/nesquikm/mcp-rubber-duck](https://github.com/nesquikm/mcp-rubber-duck/pkgs/container/mcp-rubber-duck)
813
+ - **MCP Registry**: Official MCP server `io.github.nesquikm/rubber-duck`
814
+ - **Glama Directory**: [glama.ai/mcp/servers/@nesquikm/mcp-rubber-duck](https://glama.ai/mcp/servers/@nesquikm/mcp-rubber-duck)
815
+ - **Awesome MCP Servers**: Listed in the [community directory](https://github.com/punkpeye/awesome-mcp-servers)
816
+
795
817
  ## Support
796
818
 
797
819
  - Report issues: https://github.com/nesquikm/mcp-rubber-duck/issues
@@ -1 +1 @@
1
- {"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"AAmCA,qBAAa,gBAAgB;IAC3B,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,aAAa,CAAgB;IACrC,OAAO,CAAC,eAAe,CAAkB;IACzC,OAAO,CAAC,uBAAuB,CAAC,CAA0B;IAC1D,OAAO,CAAC,mBAAmB,CAAsB;IACjD,OAAO,CAAC,KAAK,CAAgB;IAC7B,OAAO,CAAC,aAAa,CAAgB;IAGrC,OAAO,CAAC,gBAAgB,CAAC,CAAmB;IAC5C,OAAO,CAAC,eAAe,CAAC,CAAkB;IAC1C,OAAO,CAAC,cAAc,CAAC,CAAiB;IACxC,OAAO,CAAC,UAAU,CAAkB;;IA4BpC,OAAO,CAAC,mBAAmB;IA2C3B,OAAO,CAAC,aAAa;YA8FP,oBAAoB;YAwCpB,yBAAyB;YA6BzB,wBAAwB;IAwBtC,OAAO,CAAC,0BAA0B;IAyClC,OAAO,CAAC,QAAQ;IAqMV,KAAK;IAwCL,IAAI;CAkBX"}
1
+ {"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"AAmCA,qBAAa,gBAAgB;IAC3B,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,aAAa,CAAgB;IACrC,OAAO,CAAC,eAAe,CAAkB;IACzC,OAAO,CAAC,uBAAuB,CAAC,CAA0B;IAC1D,OAAO,CAAC,mBAAmB,CAAsB;IACjD,OAAO,CAAC,KAAK,CAAgB;IAC7B,OAAO,CAAC,aAAa,CAAgB;IAGrC,OAAO,CAAC,gBAAgB,CAAC,CAAmB;IAC5C,OAAO,CAAC,eAAe,CAAC,CAAkB;IAC1C,OAAO,CAAC,cAAc,CAAC,CAAiB;IACxC,OAAO,CAAC,UAAU,CAAkB;;IA4BpC,OAAO,CAAC,mBAAmB;IA2C3B,OAAO,CAAC,aAAa;YA8FP,oBAAoB;YAwCpB,yBAAyB;YA6BzB,wBAAwB;IAwBtC,OAAO,CAAC,0BAA0B;IAyClC,OAAO,CAAC,QAAQ;IAqMV,KAAK;IAmCL,IAAI;CAeX"}
package/dist/server.js CHANGED
@@ -469,10 +469,6 @@ export class RubberDuckServer {
469
469
  logger.warn('Some MCP functionality may not be available');
470
470
  }
471
471
  }
472
- // Start health monitoring
473
- this.healthMonitor.startMonitoring(60000);
474
- // Initial health check
475
- await this.healthMonitor.performHealthChecks();
476
472
  // Start the server
477
473
  const transport = new StdioServerTransport();
478
474
  await this.server.connect(transport);
@@ -484,8 +480,6 @@ export class RubberDuckServer {
484
480
  }
485
481
  }
486
482
  async stop() {
487
- // Stop health monitoring
488
- this.healthMonitor.stopMonitoring();
489
483
  // Cleanup MCP resources
490
484
  if (this.approvalService) {
491
485
  this.approvalService.shutdown();
@@ -1 +1 @@
1
- {"version":3,"file":"server.js","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"server.js","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"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"}
@@ -2,16 +2,7 @@ import { ProviderManager } from '../providers/manager.js';
2
2
  import { ProviderHealth } from '../config/types.js';
3
3
  export declare class HealthMonitor {
4
4
  private providerManager;
5
- private healthCheckInterval;
6
- private healthCache;
7
5
  constructor(providerManager: ProviderManager);
8
- performHealthChecks(): Promise<Map<string, ProviderHealth>>;
9
- startMonitoring(intervalMs?: number): void;
10
- stopMonitoring(): void;
11
- getHealthStatus(): Map<string, ProviderHealth>;
12
- getHealthyProviders(): string[];
13
- isProviderHealthy(providerName: string): boolean;
14
- getProviderLatency(providerName: string): number | undefined;
15
- waitForHealthyProvider(maxWaitMs?: number, checkIntervalMs?: number): Promise<string | null>;
6
+ performHealthChecks(): Promise<ProviderHealth[]>;
16
7
  }
17
8
  //# sourceMappingURL=health.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"health.d.ts","sourceRoot":"","sources":["../../src/services/health.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAC;AAC1D,OAAO,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AAGpD,qBAAa,aAAa;IACxB,OAAO,CAAC,eAAe,CAAkB;IACzC,OAAO,CAAC,mBAAmB,CAA+B;IAC1D,OAAO,CAAC,WAAW,CAA0C;gBAEjD,eAAe,EAAE,eAAe;IAItC,mBAAmB,IAAI,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,cAAc,CAAC,CAAC;IAuBjE,eAAe,CAAC,UAAU,GAAE,MAAc,GAAG,IAAI;IAoBjD,cAAc,IAAI,IAAI;IAQtB,eAAe,IAAI,GAAG,CAAC,MAAM,EAAE,cAAc,CAAC;IAI9C,mBAAmB,IAAI,MAAM,EAAE;IAM/B,iBAAiB,CAAC,YAAY,EAAE,MAAM,GAAG,OAAO;IAKhD,kBAAkB,CAAC,YAAY,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS;IAKtD,sBAAsB,CAC1B,SAAS,GAAE,MAAc,EACzB,eAAe,GAAE,MAAa,GAC7B,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;CAmB1B"}
1
+ {"version":3,"file":"health.d.ts","sourceRoot":"","sources":["../../src/services/health.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAC;AAC1D,OAAO,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AAGpD,qBAAa,aAAa;IACxB,OAAO,CAAC,eAAe,CAAkB;gBAE7B,eAAe,EAAE,eAAe;IAItC,mBAAmB,IAAI,OAAO,CAAC,cAAc,EAAE,CAAC;CAoBvD"}
@@ -1,8 +1,6 @@
1
1
  import { logger } from '../utils/logger.js';
2
2
  export class HealthMonitor {
3
3
  providerManager;
4
- healthCheckInterval = null;
5
- healthCache = new Map();
6
4
  constructor(providerManager) {
7
5
  this.providerManager = providerManager;
8
6
  }
@@ -10,7 +8,6 @@ export class HealthMonitor {
10
8
  logger.info('๐Ÿฆ† Performing health checks on all ducks...');
11
9
  const results = await this.providerManager.checkHealth();
12
10
  for (const result of results) {
13
- this.healthCache.set(result.provider, result);
14
11
  const statusEmoji = result.healthy ? 'โœ…' : 'โŒ';
15
12
  const latencyInfo = result.latency ? ` (${result.latency}ms)` : '';
16
13
  logger.info(`${statusEmoji} ${result.provider}: ${result.healthy ? 'Healthy' : 'Unhealthy'}${latencyInfo}`);
@@ -18,60 +15,7 @@ export class HealthMonitor {
18
15
  logger.warn(` Error: ${result.error}`);
19
16
  }
20
17
  }
21
- return this.healthCache;
22
- }
23
- startMonitoring(intervalMs = 60000) {
24
- if (this.healthCheckInterval) {
25
- this.stopMonitoring();
26
- }
27
- // Initial check
28
- this.performHealthChecks().catch(error => {
29
- logger.error('Initial health check failed:', error);
30
- });
31
- // Set up periodic checks
32
- this.healthCheckInterval = setInterval(() => {
33
- this.performHealthChecks().catch(error => {
34
- logger.error('Periodic health check failed:', error);
35
- });
36
- }, intervalMs);
37
- logger.info(`Started health monitoring with ${intervalMs}ms interval`);
38
- }
39
- stopMonitoring() {
40
- if (this.healthCheckInterval) {
41
- clearInterval(this.healthCheckInterval);
42
- this.healthCheckInterval = null;
43
- logger.info('Stopped health monitoring');
44
- }
45
- }
46
- getHealthStatus() {
47
- return new Map(this.healthCache);
48
- }
49
- getHealthyProviders() {
50
- return Array.from(this.healthCache.entries())
51
- .filter(([_, health]) => health.healthy)
52
- .map(([provider, _]) => provider);
53
- }
54
- isProviderHealthy(providerName) {
55
- const health = this.healthCache.get(providerName);
56
- return health?.healthy || false;
57
- }
58
- getProviderLatency(providerName) {
59
- const health = this.healthCache.get(providerName);
60
- return health?.latency;
61
- }
62
- async waitForHealthyProvider(maxWaitMs = 30000, checkIntervalMs = 1000) {
63
- const startTime = Date.now();
64
- while (Date.now() - startTime < maxWaitMs) {
65
- const healthyProviders = this.getHealthyProviders();
66
- if (healthyProviders.length > 0) {
67
- return healthyProviders[0];
68
- }
69
- // Perform a fresh health check
70
- await this.performHealthChecks();
71
- // Wait before next check
72
- await new Promise(resolve => setTimeout(resolve, checkIntervalMs));
73
- }
74
- return null;
18
+ return results;
75
19
  }
76
20
  }
77
21
  //# sourceMappingURL=health.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"health.js","sourceRoot":"","sources":["../../src/services/health.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"health.js","sourceRoot":"","sources":["../../src/services/health.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AAE5C,MAAM,OAAO,aAAa;IAChB,eAAe,CAAkB;IAEzC,YAAY,eAAgC;QAC1C,IAAI,CAAC,eAAe,GAAG,eAAe,CAAC;IACzC,CAAC;IAED,KAAK,CAAC,mBAAmB;QACvB,MAAM,CAAC,IAAI,CAAC,6CAA6C,CAAC,CAAC;QAE3D,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,eAAe,CAAC,WAAW,EAAE,CAAC;QAEzD,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;YAC7B,MAAM,WAAW,GAAG,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC;YAC/C,MAAM,WAAW,GAAG,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,MAAM,CAAC,OAAO,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC;YAEnE,MAAM,CAAC,IAAI,CACT,GAAG,WAAW,IAAI,MAAM,CAAC,QAAQ,KAAK,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,WAAW,GAAG,WAAW,EAAE,CAC/F,CAAC;YAEF,IAAI,MAAM,CAAC,KAAK,EAAE,CAAC;gBACjB,MAAM,CAAC,IAAI,CAAC,YAAY,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC;YAC1C,CAAC;QACH,CAAC;QAED,OAAO,OAAO,CAAC;IACjB,CAAC;CACF"}
@@ -1 +1 @@
1
- {"version":3,"file":"list-ducks.d.ts","sourceRoot":"","sources":["../../src/tools/list-ducks.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAC;AAC1D,OAAO,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AAItD,wBAAsB,aAAa,CACjC,eAAe,EAAE,eAAe,EAChC,aAAa,EAAE,aAAa,EAC5B,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;;;;;GAwD9B"}
1
+ {"version":3,"file":"list-ducks.d.ts","sourceRoot":"","sources":["../../src/tools/list-ducks.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAC;AAC1D,OAAO,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AAKtD,wBAAsB,aAAa,CACjC,eAAe,EAAE,eAAe,EAChC,aAAa,EAAE,aAAa,EAC5B,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;;;;;GAyD9B"}
@@ -2,13 +2,14 @@ import { duckArt } from '../utils/ascii-art.js';
2
2
  import { logger } from '../utils/logger.js';
3
3
  export async function listDucksTool(providerManager, healthMonitor, args) {
4
4
  const { check_health = false } = args;
5
+ // Get all providers with their info
6
+ const providers = providerManager.getAllProviders();
5
7
  // Perform health check if requested
8
+ let healthStatus = new Map();
6
9
  if (check_health) {
7
- await healthMonitor.performHealthChecks();
10
+ const healthResults = await healthMonitor.performHealthChecks();
11
+ healthStatus = new Map(healthResults.map(result => [result.provider, result]));
8
12
  }
9
- // Get all providers with their info
10
- const providers = providerManager.getAllProviders();
11
- const healthStatus = healthMonitor.getHealthStatus();
12
13
  // Build response
13
14
  let response = `${duckArt.panel}\n\n`;
14
15
  response += `Found ${providers.length} duck(s) in the pond:\n\n`;
@@ -1 +1 @@
1
- {"version":3,"file":"list-ducks.js","sourceRoot":"","sources":["../../src/tools/list-ducks.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,OAAO,EAAE,MAAM,uBAAuB,CAAC;AAChD,OAAO,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AAE5C,MAAM,CAAC,KAAK,UAAU,aAAa,CACjC,eAAgC,EAChC,aAA4B,EAC5B,IAA6B;IAE7B,MAAM,EAAE,YAAY,GAAG,KAAK,EAAE,GAAG,IAEhC,CAAC;IAEF,oCAAoC;IACpC,IAAI,YAAY,EAAE,CAAC;QACjB,MAAM,aAAa,CAAC,mBAAmB,EAAE,CAAC;IAC5C,CAAC;IAED,oCAAoC;IACpC,MAAM,SAAS,GAAG,eAAe,CAAC,eAAe,EAAE,CAAC;IACpD,MAAM,YAAY,GAAG,aAAa,CAAC,eAAe,EAAE,CAAC;IAErD,iBAAiB;IACjB,IAAI,QAAQ,GAAG,GAAG,OAAO,CAAC,KAAK,MAAM,CAAC;IACtC,QAAQ,IAAI,SAAS,SAAS,CAAC,MAAM,2BAA2B,CAAC;IAEjE,KAAK,MAAM,QAAQ,IAAI,SAAS,EAAE,CAAC;QACjC,MAAM,MAAM,GAAG,YAAY,CAAC,GAAG,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;QAC/C,MAAM,WAAW,GAAG,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC;QAE7E,QAAQ,IAAI,GAAG,WAAW,MAAM,QAAQ,CAAC,IAAI,CAAC,QAAQ,OAAO,QAAQ,CAAC,IAAI,KAAK,CAAC;QAChF,QAAQ,IAAI,gBAAgB,QAAQ,CAAC,IAAI,CAAC,KAAK,IAAI,CAAC;QACpD,QAAQ,IAAI,mBAAmB,QAAQ,CAAC,IAAI,CAAC,OAAO,IAAI,CAAC;QACzD,QAAQ,IAAI,kBAAkB,QAAQ,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,cAAc,IAAI,CAAC;QAE1F,IAAI,MAAM,EAAE,CAAC;YACX,QAAQ,IAAI,iBAAiB,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC;YACxE,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC;gBACnB,QAAQ,IAAI,KAAK,MAAM,CAAC,OAAO,KAAK,CAAC;YACvC,CAAC;YACD,IAAI,MAAM,CAAC,KAAK,EAAE,CAAC;gBACjB,QAAQ,IAAI,kBAAkB,MAAM,CAAC,KAAK,EAAE,CAAC;YAC/C,CAAC;YACD,QAAQ,IAAI,uBAAuB,MAAM,CAAC,SAAS,CAAC,kBAAkB,EAAE,IAAI,CAAC;QAC/E,CAAC;QAED,QAAQ,IAAI,IAAI,CAAC;IACnB,CAAC;IAED,cAAc;IACd,MAAM,YAAY,GAAG,KAAK,CAAC,IAAI,CAAC,YAAY,CAAC,MAAM,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,MAAM,CAAC;IACrF,QAAQ,IAAI,iBAAiB,YAAY,IAAI,SAAS,CAAC,MAAM,+BAA+B,CAAC;IAE7F,MAAM,CAAC,IAAI,CAAC,UAAU,SAAS,CAAC,MAAM,WAAW,YAAY,UAAU,CAAC,CAAC;IAEzE,OAAO;QACL,OAAO,EAAE;YACP;gBACE,IAAI,EAAE,MAAM;gBACZ,IAAI,EAAE,QAAQ;aACf;SACF;KACF,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"list-ducks.js","sourceRoot":"","sources":["../../src/tools/list-ducks.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,OAAO,EAAE,MAAM,uBAAuB,CAAC;AAChD,OAAO,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AAE5C,MAAM,CAAC,KAAK,UAAU,aAAa,CACjC,eAAgC,EAChC,aAA4B,EAC5B,IAA6B;IAE7B,MAAM,EAAE,YAAY,GAAG,KAAK,EAAE,GAAG,IAEhC,CAAC;IAEF,oCAAoC;IACpC,MAAM,SAAS,GAAG,eAAe,CAAC,eAAe,EAAE,CAAC;IAEpD,oCAAoC;IACpC,IAAI,YAAY,GAAG,IAAI,GAAG,EAA0B,CAAC;IACrD,IAAI,YAAY,EAAE,CAAC;QACjB,MAAM,aAAa,GAAG,MAAM,aAAa,CAAC,mBAAmB,EAAE,CAAC;QAChE,YAAY,GAAG,IAAI,GAAG,CAAC,aAAa,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,MAAM,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC;IACjF,CAAC;IAED,iBAAiB;IACjB,IAAI,QAAQ,GAAG,GAAG,OAAO,CAAC,KAAK,MAAM,CAAC;IACtC,QAAQ,IAAI,SAAS,SAAS,CAAC,MAAM,2BAA2B,CAAC;IAEjE,KAAK,MAAM,QAAQ,IAAI,SAAS,EAAE,CAAC;QACjC,MAAM,MAAM,GAAG,YAAY,CAAC,GAAG,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;QAC/C,MAAM,WAAW,GAAG,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC;QAE7E,QAAQ,IAAI,GAAG,WAAW,MAAM,QAAQ,CAAC,IAAI,CAAC,QAAQ,OAAO,QAAQ,CAAC,IAAI,KAAK,CAAC;QAChF,QAAQ,IAAI,gBAAgB,QAAQ,CAAC,IAAI,CAAC,KAAK,IAAI,CAAC;QACpD,QAAQ,IAAI,mBAAmB,QAAQ,CAAC,IAAI,CAAC,OAAO,IAAI,CAAC;QACzD,QAAQ,IAAI,kBAAkB,QAAQ,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,cAAc,IAAI,CAAC;QAE1F,IAAI,MAAM,EAAE,CAAC;YACX,QAAQ,IAAI,iBAAiB,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC;YACxE,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC;gBACnB,QAAQ,IAAI,KAAK,MAAM,CAAC,OAAO,KAAK,CAAC;YACvC,CAAC;YACD,IAAI,MAAM,CAAC,KAAK,EAAE,CAAC;gBACjB,QAAQ,IAAI,kBAAkB,MAAM,CAAC,KAAK,EAAE,CAAC;YAC/C,CAAC;YACD,QAAQ,IAAI,uBAAuB,MAAM,CAAC,SAAS,CAAC,kBAAkB,EAAE,IAAI,CAAC;QAC/E,CAAC;QAED,QAAQ,IAAI,IAAI,CAAC;IACnB,CAAC;IAED,cAAc;IACd,MAAM,YAAY,GAAG,KAAK,CAAC,IAAI,CAAC,YAAY,CAAC,MAAM,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,MAAM,CAAC;IACrF,QAAQ,IAAI,iBAAiB,YAAY,IAAI,SAAS,CAAC,MAAM,+BAA+B,CAAC;IAE7F,MAAM,CAAC,IAAI,CAAC,UAAU,SAAS,CAAC,MAAM,WAAW,YAAY,UAAU,CAAC,CAAC;IAEzE,OAAO;QACL,OAAO,EAAE;YACP;gBACE,IAAI,EAAE,MAAM;gBACZ,IAAI,EAAE,QAAQ;aACf;SACF;KACF,CAAC;AACJ,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "mcp-rubber-duck",
3
- "version": "1.2.0",
3
+ "version": "1.2.2",
4
4
  "description": "An MCP server that bridges to multiple OpenAI-compatible LLMs - your AI rubber duck debugging panel",
5
5
  "main": "dist/index.js",
6
6
  "type": "module",
package/src/server.ts CHANGED
@@ -565,11 +565,6 @@ export class RubberDuckServer {
565
565
  }
566
566
  }
567
567
 
568
- // Start health monitoring
569
- this.healthMonitor.startMonitoring(60000);
570
-
571
- // Initial health check
572
- await this.healthMonitor.performHealthChecks();
573
568
 
574
569
  // Start the server
575
570
  const transport = new StdioServerTransport();
@@ -583,9 +578,6 @@ export class RubberDuckServer {
583
578
  }
584
579
 
585
580
  async stop() {
586
- // Stop health monitoring
587
- this.healthMonitor.stopMonitoring();
588
-
589
581
  // Cleanup MCP resources
590
582
  if (this.approvalService) {
591
583
  this.approvalService.shutdown();
@@ -4,104 +4,29 @@ import { logger } from '../utils/logger.js';
4
4
 
5
5
  export class HealthMonitor {
6
6
  private providerManager: ProviderManager;
7
- private healthCheckInterval: NodeJS.Timeout | null = null;
8
- private healthCache: Map<string, ProviderHealth> = new Map();
9
7
 
10
8
  constructor(providerManager: ProviderManager) {
11
9
  this.providerManager = providerManager;
12
10
  }
13
11
 
14
- async performHealthChecks(): Promise<Map<string, ProviderHealth>> {
12
+ async performHealthChecks(): Promise<ProviderHealth[]> {
15
13
  logger.info('๐Ÿฆ† Performing health checks on all ducks...');
16
-
14
+
17
15
  const results = await this.providerManager.checkHealth();
18
-
16
+
19
17
  for (const result of results) {
20
- this.healthCache.set(result.provider, result);
21
-
22
18
  const statusEmoji = result.healthy ? 'โœ…' : 'โŒ';
23
19
  const latencyInfo = result.latency ? ` (${result.latency}ms)` : '';
24
-
20
+
25
21
  logger.info(
26
22
  `${statusEmoji} ${result.provider}: ${result.healthy ? 'Healthy' : 'Unhealthy'}${latencyInfo}`
27
23
  );
28
-
24
+
29
25
  if (result.error) {
30
26
  logger.warn(` Error: ${result.error}`);
31
27
  }
32
28
  }
33
29
 
34
- return this.healthCache;
35
- }
36
-
37
- startMonitoring(intervalMs: number = 60000): void {
38
- if (this.healthCheckInterval) {
39
- this.stopMonitoring();
40
- }
41
-
42
- // Initial check
43
- this.performHealthChecks().catch(error => {
44
- logger.error('Initial health check failed:', error);
45
- });
46
-
47
- // Set up periodic checks
48
- this.healthCheckInterval = setInterval(() => {
49
- this.performHealthChecks().catch(error => {
50
- logger.error('Periodic health check failed:', error);
51
- });
52
- }, intervalMs);
53
-
54
- logger.info(`Started health monitoring with ${intervalMs}ms interval`);
55
- }
56
-
57
- stopMonitoring(): void {
58
- if (this.healthCheckInterval) {
59
- clearInterval(this.healthCheckInterval);
60
- this.healthCheckInterval = null;
61
- logger.info('Stopped health monitoring');
62
- }
63
- }
64
-
65
- getHealthStatus(): Map<string, ProviderHealth> {
66
- return new Map(this.healthCache);
67
- }
68
-
69
- getHealthyProviders(): string[] {
70
- return Array.from(this.healthCache.entries())
71
- .filter(([_, health]) => health.healthy)
72
- .map(([provider, _]) => provider);
73
- }
74
-
75
- isProviderHealthy(providerName: string): boolean {
76
- const health = this.healthCache.get(providerName);
77
- return health?.healthy || false;
78
- }
79
-
80
- getProviderLatency(providerName: string): number | undefined {
81
- const health = this.healthCache.get(providerName);
82
- return health?.latency;
83
- }
84
-
85
- async waitForHealthyProvider(
86
- maxWaitMs: number = 30000,
87
- checkIntervalMs: number = 1000
88
- ): Promise<string | null> {
89
- const startTime = Date.now();
90
-
91
- while (Date.now() - startTime < maxWaitMs) {
92
- const healthyProviders = this.getHealthyProviders();
93
-
94
- if (healthyProviders.length > 0) {
95
- return healthyProviders[0];
96
- }
97
-
98
- // Perform a fresh health check
99
- await this.performHealthChecks();
100
-
101
- // Wait before next check
102
- await new Promise(resolve => setTimeout(resolve, checkIntervalMs));
103
- }
104
-
105
- return null;
30
+ return results;
106
31
  }
107
32
  }
@@ -1,5 +1,6 @@
1
1
  import { ProviderManager } from '../providers/manager.js';
2
2
  import { HealthMonitor } from '../services/health.js';
3
+ import { ProviderHealth } from '../config/types.js';
3
4
  import { duckArt } from '../utils/ascii-art.js';
4
5
  import { logger } from '../utils/logger.js';
5
6
 
@@ -12,15 +13,16 @@ export async function listDucksTool(
12
13
  check_health?: boolean;
13
14
  };
14
15
 
16
+ // Get all providers with their info
17
+ const providers = providerManager.getAllProviders();
18
+
15
19
  // Perform health check if requested
20
+ let healthStatus = new Map<string, ProviderHealth>();
16
21
  if (check_health) {
17
- await healthMonitor.performHealthChecks();
22
+ const healthResults = await healthMonitor.performHealthChecks();
23
+ healthStatus = new Map(healthResults.map(result => [result.provider, result]));
18
24
  }
19
25
 
20
- // Get all providers with their info
21
- const providers = providerManager.getAllProviders();
22
- const healthStatus = healthMonitor.getHealthStatus();
23
-
24
26
  // Build response
25
27
  let response = `${duckArt.panel}\n\n`;
26
28
  response += `Found ${providers.length} duck(s) in the pond:\n\n`;
@@ -1,182 +0,0 @@
1
- name: ๐Ÿš€ Release & Deploy
2
-
3
- on:
4
- push:
5
- tags:
6
- - 'v*'
7
-
8
- env:
9
- REGISTRY: ghcr.io
10
- IMAGE_NAME: ${{ github.repository }}
11
-
12
- jobs:
13
- test:
14
- name: ๐Ÿงช Test
15
- runs-on: ubuntu-latest
16
- steps:
17
- - name: ๐Ÿ“ฅ Checkout
18
- uses: actions/checkout@v4
19
-
20
- - name: ๐Ÿ“ฆ Setup Node.js
21
- uses: actions/setup-node@v4
22
- with:
23
- node-version: '20'
24
- cache: 'npm'
25
-
26
- - name: ๐Ÿ“ฅ Install dependencies
27
- run: npm ci
28
-
29
- - name: ๐Ÿ” Lint
30
- run: npm run lint
31
-
32
- - name: ๐Ÿ—๏ธ Build
33
- run: npm run build
34
-
35
- - name: ๐Ÿ”ฌ Type check
36
- run: npm run typecheck
37
-
38
- # Temporarily disabled tests to fix deployment
39
- # - name: ๐Ÿงช Test
40
- # run: npm test
41
-
42
- build-and-push:
43
- name: ๐Ÿณ Build & Push Release
44
- needs: test
45
- runs-on: ubuntu-latest
46
- permissions:
47
- contents: write
48
- packages: write
49
-
50
- steps:
51
- - name: ๐Ÿ“ฅ Checkout
52
- uses: actions/checkout@v4
53
-
54
- - name: ๐Ÿ› ๏ธ Set up QEMU
55
- uses: docker/setup-qemu-action@v3
56
-
57
- - name: ๐Ÿ› ๏ธ Set up Docker Buildx
58
- uses: docker/setup-buildx-action@v3
59
-
60
- - name: ๐Ÿ”‘ Login to Container Registry
61
- uses: docker/login-action@v3
62
- with:
63
- registry: ${{ env.REGISTRY }}
64
- username: ${{ github.actor }}
65
- password: ${{ secrets.GITHUB_TOKEN }}
66
-
67
- - name: ๐Ÿท๏ธ Extract metadata
68
- id: meta
69
- uses: docker/metadata-action@v5
70
- with:
71
- images: ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}
72
- tags: |
73
- type=ref,event=tag
74
- type=semver,pattern={{version}}
75
- type=semver,pattern={{major}}.{{minor}}
76
- type=semver,pattern={{major}}
77
- type=raw,value=latest
78
- labels: |
79
- org.opencontainers.image.title=MCP Rubber Duck
80
- org.opencontainers.image.description=Multi-platform MCP server for multiple OpenAI-compatible LLMs
81
- org.opencontainers.image.version=${{ github.ref_name }}
82
-
83
- - name: ๐Ÿณ Build and push Docker image
84
- id: build
85
- uses: docker/build-push-action@v5
86
- with:
87
- context: .
88
- platforms: linux/amd64,linux/arm64
89
- push: true
90
- tags: ${{ steps.meta.outputs.tags }}
91
- labels: ${{ steps.meta.outputs.labels }}
92
- cache-from: type=gha
93
- cache-to: type=gha,mode=max
94
- build-args: |
95
- BUILDKIT_INLINE_CACHE=1
96
-
97
- - name: ๐Ÿ”ง Make package public
98
- if: success()
99
- run: |
100
- # Wait a moment for package to appear
101
- sleep 10
102
-
103
- # Try to make package public (may fail if already public)
104
- gh api --method PATCH \
105
- "user/packages/container/${{ github.event.repository.name }}" \
106
- --field visibility=public \
107
- --silent || echo "Package may already be public or visibility change failed"
108
- env:
109
- GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
110
-
111
- - name: ๐Ÿ“‹ Generate Release Notes
112
- id: release_notes
113
- run: |
114
- echo "## ๐Ÿฆ† MCP Rubber Duck ${{ github.ref_name }}" > release_notes.md
115
- echo "" >> release_notes.md
116
- echo "### ๐Ÿณ Docker Images" >> release_notes.md
117
- echo "" >> release_notes.md
118
- echo "**Multi-platform support:** AMD64, ARM64 (works on Mac, Linux, Windows, Raspberry Pi 3+)" >> release_notes.md
119
- echo "" >> release_notes.md
120
- echo "\`\`\`bash" >> release_notes.md
121
- echo "# Pull the latest release" >> release_notes.md
122
- echo "docker pull ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}:${{ github.ref_name }}" >> release_notes.md
123
- echo "" >> release_notes.md
124
- echo "# Or use latest tag" >> release_notes.md
125
- echo "docker pull ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}:latest" >> release_notes.md
126
- echo "" >> release_notes.md
127
- echo "# Quick start" >> release_notes.md
128
- echo "cp .env.template .env" >> release_notes.md
129
- echo "# Edit .env with your API keys" >> release_notes.md
130
- echo "docker compose up -d" >> release_notes.md
131
- echo "\`\`\`" >> release_notes.md
132
- echo "" >> release_notes.md
133
- echo "### ๐Ÿ“ฆ Available Tags" >> release_notes.md
134
- echo "" >> release_notes.md
135
- for tag in $(echo '${{ steps.meta.outputs.tags }}' | tr ',' '\n'); do
136
- echo "- \`$tag\`" >> release_notes.md
137
- done
138
- echo "" >> release_notes.md
139
- echo "### ๐Ÿš€ Deployment Options" >> release_notes.md
140
- echo "" >> release_notes.md
141
- echo "- **๐Ÿ–ฅ๏ธ Desktop/Server:** Use \`.env.desktop.example\` for optimal performance" >> release_notes.md
142
- echo "- **๐Ÿฅง Raspberry Pi:** Use \`.env.pi.example\` for memory-optimized settings" >> release_notes.md
143
- echo "- **โ˜๏ธ Remote:** Deploy via SSH with \`./scripts/deploy.sh --mode ssh\`" >> release_notes.md
144
- echo "" >> release_notes.md
145
- echo "### โœจ Features" >> release_notes.md
146
- echo "" >> release_notes.md
147
- echo "- ๐Ÿฆ† **Multiple AI Ducks:** Query OpenAI, Gemini, Groq, Ollama, and more" >> release_notes.md
148
- echo "- ๐Ÿ’ฌ **Conversation Management:** Maintain context across messages" >> release_notes.md
149
- echo "- ๐Ÿ›๏ธ **Duck Council:** Get responses from all configured LLMs" >> release_notes.md
150
- echo "- ๐Ÿ”— **MCP Bridge:** Connect to external MCP servers" >> release_notes.md
151
- echo "- ๐Ÿš€ **Universal Deployment:** Same image works on all platforms" >> release_notes.md
152
-
153
- - name: ๐ŸŽ‰ Create GitHub Release
154
- uses: actions/create-release@v1
155
- env:
156
- GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
157
- with:
158
- tag_name: ${{ github.ref_name }}
159
- release_name: MCP Rubber Duck ${{ github.ref_name }}
160
- body_path: release_notes.md
161
- draft: false
162
- prerelease: false
163
-
164
- - name: ๐Ÿ“Š Success Summary
165
- if: success()
166
- run: |
167
- echo "๐ŸŽ‰ **Release ${{ github.ref_name }} Published Successfully!**" >> $GITHUB_STEP_SUMMARY
168
- echo "" >> $GITHUB_STEP_SUMMARY
169
- echo "๐Ÿ“ฆ **Docker Images Built:**" >> $GITHUB_STEP_SUMMARY
170
- for tag in $(echo '${{ steps.meta.outputs.tags }}' | tr ',' '\n'); do
171
- echo "- \`$tag\`" >> $GITHUB_STEP_SUMMARY
172
- done
173
- echo "" >> $GITHUB_STEP_SUMMARY
174
- echo "๐Ÿ—๏ธ **Platforms:** AMD64, ARM64" >> $GITHUB_STEP_SUMMARY
175
- echo "๐Ÿ“ **Registry:** ${{ env.REGISTRY }}" >> $GITHUB_STEP_SUMMARY
176
- echo "๐Ÿ”— **Package URL:** https://github.com/${{ github.repository }}/pkgs/container/${{ github.event.repository.name }}" >> $GITHUB_STEP_SUMMARY
177
- echo "" >> $GITHUB_STEP_SUMMARY
178
- echo "๐Ÿš€ **Quick Test:**" >> $GITHUB_STEP_SUMMARY
179
- echo "\`\`\`bash" >> $GITHUB_STEP_SUMMARY
180
- echo "docker pull ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}:${{ github.ref_name }}" >> $GITHUB_STEP_SUMMARY
181
- echo "docker run --rm -e OPENAI_API_KEY=your-key ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}:${{ github.ref_name }}" >> $GITHUB_STEP_SUMMARY
182
- echo "\`\`\`" >> $GITHUB_STEP_SUMMARY