AGENT SKILL

mastermind-workspace-detail

Mastermind workspace-detail — inspect and control one execution workspace: services, provision/teardown commands, linked issues and routines, logs, config.

License 许可
Apache-2.0
所属仓库
monoes/monomind
最近更新
2026-11-10
Stars
★ 23
Forks
2

01 前言 Front Matter

name
mastermind-workspace-detail
pick
low
type
domain-skill
description
Mastermind workspace-detail — inspect and control one execution workspace: services, provision/teardown commands, linked issues and routines, logs, config.
default_mode
confirm

03 SKILL.md 正文

Mastermind Workspace Detail

This skill is invoked directly via /mastermind-workspace-detail.


Inputs

  • brain_context: BRAIN CONTEXT block (injected by command, or loaded below if standalone)
  • org_name: org the workspace belongs to (required)
  • workspace_id: execution workspace id (required)
  • action: show | services | provision | teardown | cleanup | runtime-logs | issues | routines | config
  • provision_command: shell command to provision the workspace (for config action)
  • teardown_command: shell command to tear down the workspace (for config action)
  • cleanup_command: shell command for workspace cleanup (for config action)
  • cwd: working directory override (for config action)
  • repo_url: repository URL (for config action)
  • base_ref: git base ref/branch (for config action)
  • branch_name: branch name for the workspace (for config action)
  • log_lines: number of runtime log lines to show (default 50)
  • caller: command | master

Workspace Tabs (mirrors ExecutionWorkspaceDetail.tsx)

Tab Description
services Running service processes in this workspace
configuration Provision/teardown/cleanup commands, repo, branch, cwd
runtime_logs Live or recent runtime logs from workspace processes
issues Issues currently assigned to or running in this workspace
routines Routines with workspace-specific variable bindings

Step 0 — Brain Load (standalone only)

If caller is not "command", load brain context following mastermind-protocol/SKILL.md Brain Load Procedure with namespace: ops.


Step 1 — Load Workspace Data

orgFile=".monomind/orgs/${org_name}.json"
[ ! -f "$orgFile" ] && { echo "ERROR: Org '${org_name}' not found."; exit 1; }

wsFile=".monomind/orgs/${org_name}-workspaces.json"
[ ! -f "$wsFile" ] && { echo "ERROR: No workspaces file for org '$org_name'. Create workspaces via /mastermind-workspaces."; exit 1; }

wsDef=$(jq -r --arg id "$workspace_id" '(.workspaces // [])[] | select(.id == $id)' "$wsFile")
[ -z "$wsDef" ] && { echo "ERROR: Workspace '$workspace_id' not found in org '$org_name'."; exit 1; }

issuesFile=".monomind/orgs/${org_name}-issues.json"
routinesFile=".monomind/orgs/${org_name}-routines.json"
logFile=".monomind/orgs/${org_name}-workspace-logs/${workspace_id}.log"

Step 2 — Execute Action

show (default)

echo "EXECUTION WORKSPACE — $workspace_id @ $org_name"
echo "────────────────────────────────────────────────────────"

echo "$wsDef" | jq -r '
  "  ID:              \(.id)",
  "  Project:         \(.project_id // "(none)")",
  "  Agent:           \(.agent_id // "(unassigned)")",
  "  Status:          \(.status // "unknown")",
  "  Branch:          \(.branch // "?")",
  "  Base ref:        \(.base_ref // "?")",
  "  Repo URL:        \(.repo_url // "(local)")",
  "  CWD:             \(.cwd // .worktree_path // "(none)")",
  "  Created:         \(.createdAt // "-")",
  "  Last active:     \(.lastActiveAt // "-")"
'

# Services
svcCount=$(echo "$wsDef" | jq -r '(.services // []) | length')
echo ""
echo "  Services running:  $svcCount"
echo "$wsDef" | jq -r '(.services // [])[] | "    · \(.)"'

# Config summary
hasProvision=$(echo "$wsDef" | jq -r 'if .config.provisionCommand then "yes" else "no" end')
hasTeardown=$(echo "$wsDef" | jq -r 'if .config.teardownCommand then "yes" else "no" end')
echo ""
echo "  Provision cmd:     $hasProvision"
echo "  Teardown cmd:      $hasTeardown"

services

echo "SERVICES — $workspace_id"
echo "────────────────────────────────────────────────────────"

services=$(echo "$wsDef" | jq -r '(.services // [])[]')
if [ -z "$services" ]; then
  echo "  No services running."
else
  echo "$wsDef" | jq -r '.services // [] | to_entries[] |
    "  [\(.key)] \(.value)"' 2>/dev/null || \
  echo "$wsDef" | jq -r '(.services // [])[] | "  · \(.)"'
fi

echo ""
echo "  Workspace path: $(echo "$wsDef" | jq -r '.worktree_path // "(none)"')"
echo "  Status:         $(echo "$wsDef" | jq -r '.status // "unknown"')"

provision

echo "PROVISION — $workspace_id"
echo "────────────────────────────────────────────────────────"

provCmd=$(echo "$wsDef" | jq -r '.config.provisionCommand // ""')
wsPath=$(echo "$wsDef" | jq -r '.worktree_path // .cwd // ""')

if [ -z "$provCmd" ]; then
  echo "  No provision command configured."
  echo "  Set one: --action config --provision-command 'npm install && npm run build'"
else
  echo "  Command: $provCmd"
  echo "  CWD:     $wsPath"
  echo ""
  echo "  To run: cd '$wsPath' && $provCmd"
  echo ""
  if [ -d "$wsPath" ] && [ -n "$provCmd" ]; then
    echo "  Executing provision command…"
    (cd "$wsPath" && eval "$provCmd") && {
      ts=$(date -u +%Y-%m-%dT%H:%M:%SZ)
      tmp="${wsFile}.tmp"
      jq --arg id "$workspace_id" --arg ts "$ts" \
        '.workspaces = [(.workspaces // [])[] | if .id == $id then .last_provisioned = $ts else . end]' \
        "$wsFile" > "$tmp" && mv "$tmp" "$wsFile"
      echo "  Provision complete."
    } || echo "  Provision command exited with error."
  else
    [ -z "$wsPath" ] && echo "  ERROR: No worktree_path set — cannot execute provision command automatically."
  fi
fi

teardown

echo "TEARDOWN — $workspace_id"
echo "────────────────────────────────────────────────────────"

tdCmd=$(echo "$wsDef" | jq -r '.config.teardownCommand // ""')
wsPath=$(echo "$wsDef" | jq -r '.worktree_path // .cwd // ""')

if [ -z "$tdCmd" ]; then
  echo "  No teardown command configured."
else
  echo "  Command: $tdCmd"
  echo "  CWD:     $wsPath"
  if [ -d "$wsPath" ]; then
    echo "  Executing teardown command…"
    (cd "$wsPath" && eval "$tdCmd") && echo "  Teardown complete." || echo "  Teardown command exited with error."
  fi
fi

cleanup

echo "CLEANUP — $workspace_id"
echo "────────────────────────────────────────────────────────"

cleanCmd=$(echo "$wsDef" | jq -r '.config.cleanupCommand // ""')
wsPath=$(echo "$wsDef" | jq -r '.worktree_path // .cwd // ""')

if [ -z "$cleanCmd" ]; then
  echo "  No cleanup command configured."
else
  echo "  Command: $cleanCmd"
  if [ -d "$wsPath" ]; then
    (cd "$wsPath" && eval "$cleanCmd") && echo "  Cleanup complete." || echo "  Cleanup exited with error."
  fi
fi

runtime-logs

lines=${log_lines:-50}
echo "RUNTIME LOGS — $workspace_id (last $lines lines)"
echo "────────────────────────────────────────────────────────"

if [ -f "$logFile" ]; then
  tail -${lines} "$logFile"
else
  # Try workspace path stderr/stdout logs
  wsPath=$(echo "$wsDef" | jq -r '.worktree_path // ""')
  found=false
  for logPath in "${wsPath}/.monomind/runtime.log" "${wsPath}/logs/runtime.log" "${wsPath}/output.log"; do
    if [ -f "$logPath" ]; then
      tail -${lines} "$logPath"
      found=true
      break
    fi
  done
  "$found" || echo "  No runtime logs found. Logs are written to .monomind/workspace-logs/$workspace_id.log during runs."
fi

issues

echo "ISSUES — workspace: $workspace_id"
echo "────────────────────────────────────────────────────────"
printf "%-24s %-12s %-10s %s\n" "ID" "STATUS" "PRIORITY" "TITLE"
echo "────────────────────────────────────────────────────────"

if [ ! -f "$issuesFile" ]; then
  echo "  No issues file found."
else
  jq -r --arg wid "$workspace_id" '(.issues // [])[] |
    select(.workspace_id == $wid or (.assigned_workspace == $wid)) |
    [.id, (.status // "open"), (.priority // "medium"), (.title // "(no title)")] | @tsv' \
    "$issuesFile" | while IFS=$'\t' read -r id st pri title; do
    printf "%-24s %-12s %-10s %s\n" "$id" "$st" "$pri" "$title"
  done || echo "  No issues assigned to this workspace."
fi

routines

echo "ROUTINES — workspace: $workspace_id"
echo "────────────────────────────────────────────────────────"

if [ ! -f "$routinesFile" ]; then
  echo "  No routines file found."
else
  # Show routines that have workspace-specific variable bindings
  jq -r --arg wid "$workspace_id" \
    '(.routines // [])[] | select((.variables // {}) | to_entries[] | .key | startswith("WS_") or contains("workspace")) |
    "\(.id)  \(.name // "(no name)")  vars: \((.variables // {}) | keys | join(", "))"' \
    "$routinesFile" 2>/dev/null || echo "  No routines with workspace-specific variables."
fi

echo ""
echo "To run a routine with workspace vars: /mastermind-routine-detail --org $org_name --routine-id <id> --action variables"

config

echo "WORKSPACE CONFIG — $workspace_id"
echo "────────────────────────────────────────────────────────"

if [ -n "$provision_command" ] || [ -n "$teardown_command" ] || [ -n "$cleanup_command" ] || \
   [ -n "$cwd" ] || [ -n "$repo_url" ] || [ -n "$base_ref" ] || [ -n "$branch_name" ]; then

  ts=$(date -u +%Y-%m-%dT%H:%M:%SZ)
  tmp="${wsFile}.tmp"
  jq --arg id "$workspace_id" \
     --arg prov "${provision_command:-}" \
     --arg td "${teardown_command:-}" \
     --arg clean "${cleanup_command:-}" \
     --arg cwd_ "${cwd:-}" \
     --arg repo "${repo_url:-}" \
     --arg base "${base_ref:-}" \
     --arg branch "${branch_name:-}" \
     --arg ts "$ts" \
    '.workspaces = [(.workspaces // [])[] | if .id == $id then
       if .config == null then .config = {} else . end |
       (if $prov != "" then .config.provisionCommand = $prov else . end) |
       (if $td != "" then .config.teardownCommand = $td else . end) |
       (if $clean != "" then .config.cleanupCommand = $clean else . end) |
       (if $cwd_ != "" then .cwd = $cwd_ else . end) |
       (if $repo != "" then .repo_url = $repo else . end) |
       (if $base != "" then .base_ref = $base else . end) |
       (if $branch != "" then .branch = $branch else . end) |
       .lastActiveAt = $ts
     else . end]' \
    "$wsFile" > "$tmp" && mv "$tmp" "$wsFile"
  echo "Config updated for workspace '$workspace_id'."
else
  echo "$wsDef" | jq '{id, project_id, agent_id, status, branch, base_ref, repo_url, cwd, config}'
fi

Step 3 — Return Output

domain: ops
status: complete
action: <action>
org: <org_name>
workspace_id: <workspace_id>
workspace_status: <status>

Step 4 — Brain Write (standalone only)

If caller is not "command", follow mastermind-protocol/SKILL.md Brain Write Procedure for domain ops.

04 同仓库更多 Skills

monoes
monoes/monomind

zk-steward

Org role guidance for a ZK steward: engineer zero-knowledge proof systems with circuit design, SNARK vs STARK choice and security review. This is zero-knowledge cryptography, not Zettelkasten note-taking.

★ 23
monoes
monoes/monomind

writing-plans

Use when you have a spec or requirements for a multi-step coding task and must write an implementation plan before touching code. Produces bite-sized TDD tasks with exact file paths, code and commands for an engineer with zero context.

内容创作者写作与文案
★ 23
monoes
monoes/monomind

write-spec

Write a feature spec or PRD from a problem statement or feature idea. Use when turning a vague idea or user request into a structured document, scoping a feature with goals and non-goals, defining success metrics and acceptance criteria, or breaking a big ask into a phased spec.

产品经理
★ 23
monoes
monoes/monomind

write-query

Write optimized SQL for your dialect with best practices. Use when translating a natural-language data need into SQL, building a multi-CTE query with joins and aggregations, optimizing a query against a large partitioned table, or getting dialect-specific syntax for Snowflake, BigQuery, Postgres, etc.

数据分析师
★ 23
monoes
monoes/monomind

workflow-automation

Org role guidance for workflow automation: build and maintain CI/CD definitions in GitHub Actions or equivalent: triggers, jobs, matrices, caching. Covers path filters, dependency caching, parallel jobs, timeouts and fail-fast ordering.

运维与部署Skill与智能体开发
★ 23
monoes
monoes/monomind

workflow-architect

Org role guidance for a workflow architect: map full workflow trees for systems, user journeys and agents, covering every branch and failure. Covers discovering workflows from code, handoff contracts, timeouts, recovery paths and observable state.

Skill与智能体开发
★ 23