Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
36 changes: 18 additions & 18 deletions .claude-plugin/marketplace.json
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@
"url": "MadAppGang/magus",
"path": "plugins/code-analysis",
"ref": "main",
"sha": "af9911e626dd1406295b20c8e4d80f52ff3d8266"
"sha": "6053b7d375250b0e14fc968f8ef44cccbd614e9a"
},
"description": "Deep code investigation with mnemex MCP server. v5.0.1: Renamed mnemex CLI tool.",
"version": "5.1.0",
Expand Down Expand Up @@ -52,7 +52,7 @@
"url": "MadAppGang/magus",
"path": "plugins/multimodel",
"ref": "main",
"sha": "af9911e626dd1406295b20c8e4d80f52ff3d8266"
"sha": "6053b7d375250b0e14fc968f8ef44cccbd614e9a"
},
"description": "Multi-model collaboration, orchestration, and workflow patterns. v3.1.2: Fix internal model leaked to claudish \u2014 filter sentinel before external dispatch.",
"version": "3.1.2",
Expand Down Expand Up @@ -87,7 +87,7 @@
"url": "MadAppGang/magus",
"path": "plugins/agentdev",
"ref": "main",
"sha": "af9911e626dd1406295b20c8e4d80f52ff3d8266"
"sha": "6053b7d375250b0e14fc968f8ef44cccbd614e9a"
},
"description": "Create, implement, and review Claude Code agents and commands with multi-model validation, LLM performance tracking, and session-based artifact isolation. v1.6.1: Fix manifest schema \u2014 agents paths, hooks format.",
"version": "1.6.1",
Expand Down Expand Up @@ -118,7 +118,7 @@
"url": "MadAppGang/magus",
"path": "plugins/seo",
"ref": "main",
"sha": "af9911e626dd1406295b20c8e4d80f52ff3d8266"
"sha": "6053b7d375250b0e14fc968f8ef44cccbd614e9a"
},
"description": "Highly autonomous SEO toolkit (~80% autonomy) with AUTO GATEs, self-correction loops, and multi-model validation. v1.6.5: Command parameter fixes.",
"version": "1.7.0",
Expand Down Expand Up @@ -148,7 +148,7 @@
"url": "MadAppGang/magus",
"path": "plugins/video-editing",
"ref": "main",
"sha": "af9911e626dd1406295b20c8e4d80f52ff3d8266"
"sha": "6053b7d375250b0e14fc968f8ef44cccbd614e9a"
},
"description": "Professional video editing toolkit with FFmpeg operations, Whisper transcription, and Apple Final Cut Pro project generation. v1.1.1: Marketplace rename to magus. Features intelligent video analysis, automated transcription with timing sync, FCPXML timeline creation.",
"version": "1.1.3",
Expand Down Expand Up @@ -179,7 +179,7 @@
"url": "MadAppGang/magus",
"path": "plugins/nanobanana",
"ref": "main",
"sha": "af9911e626dd1406295b20c8e4d80f52ff3d8266"
"sha": "6053b7d375250b0e14fc968f8ef44cccbd614e9a"
},
"description": "AI image generation and editing using Google Gemini 3 Pro Image API. v2.3.1: Marketplace rename to magus. Simple Node.js CLI with markdown styles and batch generation.",
"version": "2.4.0",
Expand Down Expand Up @@ -208,7 +208,7 @@
"url": "MadAppGang/magus",
"path": "plugins/conductor",
"ref": "main",
"sha": "af9911e626dd1406295b20c8e4d80f52ff3d8266"
"sha": "6053b7d375250b0e14fc968f8ef44cccbd614e9a"
},
"description": "Context-Driven Development workflow inspired by Gemini Conductor. v2.1.3: Fix manifest schema \u2014 commands paths, add skills registration.",
"version": "2.1.3",
Expand Down Expand Up @@ -239,7 +239,7 @@
"url": "MadAppGang/magus",
"path": "plugins/dev",
"ref": "main",
"sha": "af9911e626dd1406295b20c8e4d80f52ff3d8266"
"sha": "6053b7d375250b0e14fc968f8ef44cccbd614e9a"
},
"description": "Universal development assistant. v2.6.0: self-learning Stop hook \u2014 automated session learning with LLM classifier, background daemon, /dev:learn --apply/--prune.",
"version": "2.7.0",
Expand Down Expand Up @@ -288,7 +288,7 @@
"url": "MadAppGang/magus",
"path": "plugins/statusline",
"ref": "main",
"sha": "af9911e626dd1406295b20c8e4d80f52ff3d8266"
"sha": "6053b7d375250b0e14fc968f8ef44cccbd614e9a"
},
"description": "Adaptive statusline \u2014 always-visible bars, background highlights for critical states, provider-aware model display, vim mode, diff stats, compaction count, memory usage. v2.1.0: Prominent reset countdowns when rate-limited, process memory display.",
"version": "2.1.0",
Expand Down Expand Up @@ -316,7 +316,7 @@
"url": "MadAppGang/magus",
"path": "plugins/browser-use",
"ref": "main",
"sha": "af9911e626dd1406295b20c8e4d80f52ff3d8266"
"sha": "6053b7d375250b0e14fc968f8ef44cccbd614e9a"
},
"description": "Full-platform browser automation for Claude Code. v1.1.0: Thin wrapper over built-in BrowserUseServer \u2014 63% less code. Fix TCC downloads_path, per-PID Chrome profiles, graceful shutdown. 19 MCP tools, 5 skills.",
"version": "1.1.1",
Expand Down Expand Up @@ -348,7 +348,7 @@
"url": "MadAppGang/magus",
"path": "plugins/designer",
"ref": "main",
"sha": "af9911e626dd1406295b20c8e4d80f52ff3d8266"
"sha": "6053b7d375250b0e14fc968f8ef44cccbd614e9a"
},
"description": "UI design validation with pixel-diff comparison engine. v0.2.0: Design review agent, visual comparison, style guide creation, browser-use optional integration. 6 skills.",
"version": "0.3.0",
Expand Down Expand Up @@ -380,7 +380,7 @@
"url": "MadAppGang/magus",
"path": "plugins/terminal",
"ref": "main",
"sha": "af9911e626dd1406295b20c8e4d80f52ff3d8266"
"sha": "6053b7d375250b0e14fc968f8ef44cccbd614e9a"
},
"description": "Interactive terminal integration for Claude Code. v4.0.0: agentic-first rewrite \u2014 single Go tmux-mcp binary replaces ht-mcp + npm tmux-mcp. New agentic tools (start-and-watch, watch-pane, run-in-repl, pane-state) eliminate all polling loops. 5 skills, 9 commands, 1 agent.",
"version": "4.0.2",
Expand Down Expand Up @@ -409,7 +409,7 @@
"url": "MadAppGang/magus",
"path": "plugins/gtd",
"ref": "main",
"sha": "af9911e626dd1406295b20c8e4d80f52ff3d8266"
"sha": "6053b7d375250b0e14fc968f8ef44cccbd614e9a"
},
"description": "GTD (Getting Things Done) workflow integration. v2.0.0: Canonical GTD terminology (Clarify, Engage), sequential task IDs (#1, #2), boxed terminal display, reference list, Bun display tool. Real-time sync via hooks, 7 commands, 2 skills.",
"version": "2.0.1",
Expand Down Expand Up @@ -440,10 +440,10 @@
"url": "MadAppGang/magus",
"path": "plugins/kanban",
"ref": "main",
"sha": "af9911e626dd1406295b20c8e4d80f52ff3d8266"
"sha": "6053b7d375250b0e14fc968f8ef44cccbd614e9a"
},
"description": "Kanban board view for task management. v1.2.0: Word-wrapped titles, full-width boards, even column distribution. Visual board with 5 columns, task dependencies (cycle-safe), priority indicators, WIP limits. Shares tasks.json with GTD plugin \u2014 works standalone or alongside GTD.",
"version": "1.2.0",
"description": "Kanban board view for task management. v1.3.0: Auto-open board in tmux split pane with real TTY, smart terminal width detection chain (stdout/COLUMNS/tmux/parent-TTY/120), remove --width hack. Visual board with 5 columns, task dependencies (cycle-safe), priority indicators, WIP limits. Shares tasks.json with GTD plugin \u2014 works standalone or alongside GTD.",
"version": "1.3.0",
"author": {
"name": "Jack Rudenko",
"email": "i@madappgang.com",
Expand All @@ -470,7 +470,7 @@
"url": "MadAppGang/magus",
"path": "plugins/autopilot",
"ref": "main",
"sha": "af9911e626dd1406295b20c8e4d80f52ff3d8266"
"sha": "6053b7d375250b0e14fc968f8ef44cccbd614e9a"
},
"description": "Autonomous task execution with Linear integration. Picks tasks from Linear, routes to agents via tag-to-command mapping, generates proof-of-work artifacts, and handles feedback loops.",
"version": "0.2.4",
Expand Down Expand Up @@ -500,7 +500,7 @@
"url": "MadAppGang/magus",
"path": "plugins/instantly",
"ref": "main",
"sha": "af9911e626dd1406295b20c8e4d80f52ff3d8266"
"sha": "6053b7d375250b0e14fc968f8ef44cccbd614e9a"
},
"description": "Cold email outreach toolkit with Instantly.ai MCP integration. Campaign analytics, sequence building, A/B testing, lead management, and auto-optimization.",
"version": "1.0.6",
Expand Down
63 changes: 59 additions & 4 deletions plugins/gtd/lib/table.ts
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,8 @@
* Output: print
*/

import { execSync } from "child_process";

// ── ANSI helpers ─────────────────────────────────────────────────────────────

export const S = {
Expand Down Expand Up @@ -54,11 +56,64 @@ export function fg(style: string, text: string): string {

// ── Text utilities ────────────────────────────────────────────────────────────

/** Terminal width. Checks stdout, COLUMNS env var, defaults to 80. */
/**
* Terminal width detection chain.
*
* Tries, in order:
* 1. process.stdout.columns (works when stdout is a TTY)
* 2. $COLUMNS env var (set by some shells / wrappers)
* 3. tmux pane_width (most accurate when inside a tmux pane)
* 4. Parent process TTY via stty (works when our own stdout is piped)
* 5. Fallback to 120 (reasonable default for modern terminals)
*
* Every shell-out is wrapped in try/catch so failures fall through silently.
*/
export function termW(): number {
return process.stdout.columns
|| (process.env.COLUMNS ? parseInt(process.env.COLUMNS) : 0)
|| 80;
// 1. Direct stdout columns
if (process.stdout.columns && process.stdout.columns > 0) {
return process.stdout.columns;
}

// 2. $COLUMNS env var
const envCols = process.env.COLUMNS ? parseInt(process.env.COLUMNS, 10) : 0;
if (envCols > 0) return envCols;

// 3. tmux pane width (only when TMUX env is set)
if (process.env.TMUX) {
try {
const w = parseInt(
execSync("tmux display-message -p '#{pane_width}'", { stdio: ["pipe", "pipe", "pipe"] })
.toString()
.trim(),
10,
);
if (w > 0) return w;
} catch { /* not in tmux or tmux unavailable */ }
}

// 4. Parent process TTY via stty
try {
const ppid = process.ppid ?? process.env.PPID;
if (ppid) {
const ttyName = execSync(`ps -o tty= -p ${ppid}`, { stdio: ["pipe", "pipe", "pipe"] })
.toString()
.trim();
if (ttyName && ttyName !== "?" && ttyName !== "??") {
const devPath = ttyName.startsWith("/dev/") ? ttyName : `/dev/${ttyName}`;
const sttyOut = execSync(`stty size < ${devPath}`, {
stdio: ["pipe", "pipe", "pipe"],
shell: "/bin/sh",
})
.toString()
.trim();
const cols = parseInt(sttyOut.split(/\s+/)[1], 10);
if (cols > 0) return cols;
}
}
} catch { /* no parent TTY or stty failed */ }

// 5. Fallback
return 120;
}

/** Remove all ANSI escape codes from text. */
Expand Down
7 changes: 4 additions & 3 deletions plugins/kanban/commands/board.md
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,7 @@ KANBAN_LIB="${CLAUDE_PLUGIN_ROOT}/hooks/kanban-lib.sh"
bash -c "source \"${KANBAN_LIB}\" && CWD=\"${CWD}\" kanban_init"

# Build display args
DISPLAY_ARGS="board"
DISPLAY_ARGS=""
FILTER_CONTEXT="" # e.g. "@code" or ""
FILTER_PROJECT="" # e.g. "5" (numeric ID) or ""
COMPACT=false # true if --compact
Expand All @@ -36,10 +36,11 @@ COMPACT=false # true if --compact
[ -n "$FILTER_PROJECT" ] && DISPLAY_ARGS="$DISPLAY_ARGS --project $FILTER_PROJECT"
[ "$COMPACT" = "true" ] && DISPLAY_ARGS="$DISPLAY_ARGS --compact"

TERM_WIDTH=$(tput cols 2>/dev/null || echo 80)
bun run "${CLAUDE_PLUGIN_ROOT}/tools/kanban-display.ts" $DISPLAY_ARGS --file "$GTD_FILE" --width "$TERM_WIDTH"
bun run "${CLAUDE_PLUGIN_ROOT}/tools/kanban-display.ts" board $DISPLAY_ARGS --file "$GTD_FILE"
```

The display tool automatically opens in a tmux split pane when tmux is available. Any keypress closes the pane.

## After Showing the Board

- Point out any columns that exceed the WIP limit (default 3 tasks in-progress)
Expand Down
63 changes: 59 additions & 4 deletions plugins/kanban/lib/table.ts
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,8 @@
* Output: print
*/

import { execSync } from "child_process";

// ── ANSI helpers ─────────────────────────────────────────────────────────────

export const S = {
Expand Down Expand Up @@ -54,11 +56,64 @@ export function fg(style: string, text: string): string {

// ── Text utilities ────────────────────────────────────────────────────────────

/** Terminal width. Checks stdout, COLUMNS env var, defaults to 80. */
/**
* Terminal width detection chain.
*
* Tries, in order:
* 1. process.stdout.columns (works when stdout is a TTY)
* 2. $COLUMNS env var (set by some shells / wrappers)
* 3. tmux pane_width (most accurate when inside a tmux pane)
* 4. Parent process TTY via stty (works when our own stdout is piped)
* 5. Fallback to 120 (reasonable default for modern terminals)
*
* Every shell-out is wrapped in try/catch so failures fall through silently.
*/
export function termW(): number {
return process.stdout.columns
|| (process.env.COLUMNS ? parseInt(process.env.COLUMNS) : 0)
|| 80;
// 1. Direct stdout columns
if (process.stdout.columns && process.stdout.columns > 0) {
return process.stdout.columns;
}

// 2. $COLUMNS env var
const envCols = process.env.COLUMNS ? parseInt(process.env.COLUMNS, 10) : 0;
if (envCols > 0) return envCols;

// 3. tmux pane width (only when TMUX env is set)
if (process.env.TMUX) {
try {
const w = parseInt(
execSync("tmux display-message -p '#{pane_width}'", { stdio: ["pipe", "pipe", "pipe"] })
.toString()
.trim(),
10,
);
if (w > 0) return w;
} catch { /* not in tmux or tmux unavailable */ }
}

// 4. Parent process TTY via stty
try {
const ppid = process.ppid ?? process.env.PPID;
if (ppid) {
const ttyName = execSync(`ps -o tty= -p ${ppid}`, { stdio: ["pipe", "pipe", "pipe"] })
.toString()
.trim();
if (ttyName && ttyName !== "?" && ttyName !== "??") {
const devPath = ttyName.startsWith("/dev/") ? ttyName : `/dev/${ttyName}`;
const sttyOut = execSync(`stty size < ${devPath}`, {
stdio: ["pipe", "pipe", "pipe"],
shell: "/bin/sh",
})
.toString()
.trim();
const cols = parseInt(sttyOut.split(/\s+/)[1], 10);
if (cols > 0) return cols;
}
}
} catch { /* no parent TTY or stty failed */ }

// 5. Fallback
return 120;
}

/** Remove all ANSI escape codes from text. */
Expand Down
2 changes: 1 addition & 1 deletion plugins/kanban/plugin.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "kanban",
"version": "1.2.0",
"version": "1.3.0",
"description": "Kanban board view for task management. Works with the same tasks.json as the GTD plugin. Provides board visualization, task dependencies, status flow, and optional MCP sync.",
"author": { "name": "Jack Rudenko", "email": "i@madappgang.com", "company": "MadAppGang" },
"license": "MIT",
Expand Down
Loading