bigpowers 2.88.7 → 2.88.8

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,6 +1,6 @@
1
1
  {
2
2
  "name": "bigpowers",
3
- "version": "2.88.7",
3
+ "version": "2.88.8",
4
4
  "description": "81 skills — 73 agent skills synthesizing 17 years of software engineering discipline into a prescriptive methodology for solo developers",
5
5
  "keywords": [
6
6
  "gemini-extension"
package/.pi/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "bigpowers",
3
- "version": "2.88.7",
3
+ "version": "2.88.8",
4
4
  "description": "81 skills — 73 agent skills synthesizing 17 years of software engineering discipline into a prescriptive methodology for solo developers",
5
5
  "keywords": [
6
6
  "pi-package"
package/CHANGELOG.md CHANGED
@@ -1,3 +1,10 @@
1
+ ## [2.88.8](https://github.com/danielvm-git/bigpowers/compare/v2.88.7...v2.88.8) (2026-09-21)
2
+
3
+
4
+ ### Bug Fixes
5
+
6
+ * **mcp:** switch stdio transport to newline-delimited JSON per MCP spec ([#132](https://github.com/danielvm-git/bigpowers/issues/132)) ([2e07b81](https://github.com/danielvm-git/bigpowers/commit/2e07b81e6a19ee8cad12001114193e22cf224511)), closes [#131](https://github.com/danielvm-git/bigpowers/issues/131)
7
+
1
8
  ## [2.88.7](https://github.com/danielvm-git/bigpowers/compare/v2.88.6...v2.88.7) (2026-09-17)
2
9
 
3
10
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "bigpowers",
3
- "version": "2.88.7",
3
+ "version": "2.88.8",
4
4
  "description": "73 agent skills synthesizing 17 years of software engineering discipline into a prescriptive methodology for solo developers",
5
5
  "main": "index.js",
6
6
  "scripts": {
@@ -1,6 +1,6 @@
1
1
  #!/usr/bin/env node
2
2
  // bigpowers MCP server — exposes 68 skills as MCP tools via stdio transport
3
- // Zero dependencies — raw JSON-RPC over stdio with Content-Length framing
3
+ // Zero dependencies — raw JSON-RPC over stdio (newline-delimited, per MCP spec)
4
4
 
5
5
  'use strict';
6
6
 
@@ -154,6 +154,7 @@ const TOOLS = {
154
154
  // ─── MCP stdio transport ──────────────────────────────────────────────────────
155
155
 
156
156
  let inputBuffer = Buffer.alloc(0);
157
+ let useLspFraming = false;
157
158
 
158
159
  process.stdin.on('data', chunk => {
159
160
  inputBuffer = Buffer.concat([inputBuffer, chunk]);
@@ -163,28 +164,47 @@ process.stdin.on('data', chunk => {
163
164
  process.stdin.on('end', () => process.exit(0));
164
165
 
165
166
  function processBuffer() {
166
- while (true) {
167
- const headerEnd = inputBuffer.indexOf('\r\n\r\n');
168
- if (headerEnd === -1) break;
167
+ while (inputBuffer.length) {
168
+ // Legacy: LSP-style Content-Length framing (kept for backwards compatibility)
169
+ if (/^\s*Content-Length:/i.test(inputBuffer.toString('utf8', 0, Math.min(inputBuffer.length, 20)))) {
170
+ const headerEnd = inputBuffer.indexOf('\r\n\r\n');
171
+ if (headerEnd === -1) break;
169
172
 
170
- const header = inputBuffer.slice(0, headerEnd).toString();
171
- const match = header.match(/Content-Length:\s*(\d+)/i);
172
- if (!match) { inputBuffer = inputBuffer.slice(headerEnd + 4); continue; }
173
+ const header = inputBuffer.slice(0, headerEnd).toString();
174
+ const match = header.match(/Content-Length:\s*(\d+)/i);
175
+ if (!match) { inputBuffer = inputBuffer.slice(headerEnd + 4); continue; }
173
176
 
174
- const contentLength = parseInt(match[1], 10);
175
- const bodyStart = headerEnd + 4;
176
- if (inputBuffer.length < bodyStart + contentLength) break;
177
+ const contentLength = parseInt(match[1], 10);
178
+ const bodyStart = headerEnd + 4;
179
+ if (inputBuffer.length < bodyStart + contentLength) break;
177
180
 
178
- const body = inputBuffer.slice(bodyStart, bodyStart + contentLength).toString();
179
- inputBuffer = inputBuffer.slice(bodyStart + contentLength);
181
+ const body = inputBuffer.slice(bodyStart, bodyStart + contentLength).toString();
182
+ inputBuffer = inputBuffer.slice(bodyStart + contentLength);
180
183
 
181
- try { handleMessage(JSON.parse(body)); } catch (_) {}
184
+ useLspFraming = true;
185
+ try { handleMessage(JSON.parse(body)); } catch (_) {}
186
+ continue;
187
+ }
188
+
189
+ // MCP stdio standard: newline-delimited JSON
190
+ const nl = inputBuffer.indexOf('\n');
191
+ if (nl === -1) break;
192
+
193
+ const line = inputBuffer.slice(0, nl).toString().trim();
194
+ inputBuffer = inputBuffer.slice(nl + 1);
195
+
196
+ useLspFraming = false;
197
+ if (line) try { handleMessage(JSON.parse(line)); } catch (_) {}
182
198
  }
183
199
  }
184
200
 
185
201
  function send(msg) {
186
202
  const body = JSON.stringify(msg);
187
- process.stdout.write(`Content-Length: ${Buffer.byteLength(body, 'utf8')}\r\n\r\n${body}`);
203
+ if (useLspFraming) {
204
+ process.stdout.write(`Content-Length: ${Buffer.byteLength(body, 'utf8')}\r\n\r\n${body}`);
205
+ } else {
206
+ process.stdout.write(body + '\n');
207
+ }
188
208
  }
189
209
 
190
210
  function handleInitialize(id) {