tachibot-mcp 2.19.2 → 2.19.3

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.
package/CHANGELOG.md CHANGED
@@ -5,6 +5,13 @@ All notable changes to TachiBot MCP will be documented in this file.
5
5
  The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
6
6
  and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
7
7
 
8
+ ## [2.19.3] - 2026-03-21
9
+
10
+ ### Fixed
11
+ - **Section header regex** — now matches mixed case + optional dashes (works across all providers, not just Gemini)
12
+ - **Planner 5/1 bug** — `parsePlanSteps` now matches `### Task [T-ID]:` format (was only matching `### Step N:`)
13
+ - **Planner mismatch warning** — surfaces parse failures instead of masking with `Math.max`
14
+
8
15
  ## [2.19.2] - 2026-03-21
9
16
 
10
17
  ### Added
@@ -1136,11 +1136,13 @@ function generateProgressBar(current, total) {
1136
1136
  */
1137
1137
  function parsePlanSteps(plan) {
1138
1138
  const steps = [];
1139
- // Try numbered steps first (### Step 1: or 1. or Step 1:)
1139
+ // Try structured step/task headers (### Step 1:, ### Task T1:, 1., Step 1:)
1140
1140
  const stepPatterns = [
1141
1141
  /###\s*Step\s*\d+[:\s]+([^\n]+)([\s\S]*?)(?=###\s*Step|\n##[^#]|$)/gi,
1142
+ /###\s*Task\s*[^\n:]+:\s*([^\n]+)([\s\S]*?)(?=###\s*Task|\n##[^#]|$)/gi,
1142
1143
  /^\s*(\d+)\.\s*([^\n]+)([\s\S]*?)(?=^\s*\d+\.|$)/gm,
1143
1144
  /^Step\s*\d+[:\s]+([^\n]+)([\s\S]*?)(?=^Step\s*\d+|$)/gim,
1145
+ /^Task\s*[^\n:]+:\s*([^\n]+)([\s\S]*?)(?=^Task\s*\S+|$)/gim,
1144
1146
  ];
1145
1147
  for (const pattern of stepPatterns) {
1146
1148
  const matches = [...plan.matchAll(pattern)];
@@ -1253,6 +1255,10 @@ Evidence params (unblind the checkpoints):
1253
1255
  // Parse plan into steps
1254
1256
  const steps = parsePlanSteps(plan);
1255
1257
  const totalSteps = steps.length;
1258
+ if (completed.length > totalSteps) {
1259
+ lines.push(`⚠️ Plan parse mismatch: ${completed.length} steps completed but only ${totalSteps} parsed. Plan format may have degraded.`);
1260
+ lines.push("");
1261
+ }
1256
1262
  if (mode === "start") {
1257
1263
  // ═══════════════════════════════════════════════════════════════
1258
1264
  // START: Show parsed plan and devlog hint
@@ -452,8 +452,8 @@ export function stripMarkdown(md, options) {
452
452
  text = text
453
453
  // Markdown headers — strip # prefix (or bold if boldHeaders)
454
454
  .replace(/^#{1,6}\s+(.+)$/gm, boldHeaders ? '\x1b[1m$1\x1b[0m' : '$1')
455
- // Emoji section headers — e.g. "🧠 TYPE SAFETY ───" → rotating pastel bg, dark bold text
456
- .replace(/^(.{1,2})\s+([A-Z][A-Z\s&]+?)\s*─+$/gm, (_match, emoji, header) => {
455
+ // Emoji section headers — e.g. "🧠 TYPE SAFETY ───" or "🧠 Key Activities" → rotating pastel bg
456
+ .replace(/^(.{1,2})\s+([A-Z][\w\s&,()/-]{2,50}?)\s*─*$/gm, (_match, emoji, header) => {
457
457
  if (!boldHeaders)
458
458
  return `${emoji} ${header}`;
459
459
  const pastels = [146, 182, 152, 187, 116, 180]; // lavender, mauve, powder blue, sand, mint, peach
package/package.json CHANGED
@@ -2,7 +2,7 @@
2
2
  "name": "tachibot-mcp",
3
3
  "mcpName": "io.github.byPawel/tachibot-mcp",
4
4
  "displayName": "TachiBot MCP - Universal AI Orchestrator",
5
- "version": "2.19.2",
5
+ "version": "2.19.3",
6
6
  "type": "module",
7
7
  "main": "dist/src/server.js",
8
8
  "bin": {