agentsclimarketplace

Mindtickle debug bundle

Skill jeremylongshore/claude-code-plugins-plus-skills/plugins/saas-packs/mindtickle-pack/skills/mindtickle-debug-bundle

425 plugins, 2,810 skills, 200 agents for Claude Code. Open-source marketplace at tonsofskills.com with the ccpi CLI package manager.

Install
npx -y skills add jeremylongshore/claude-code-plugins-plus-skills --skill mindtickle-debug-bundle

Assembled from the repository path, not quoted from the project. Check it against their README if it does not work.

What its author says it does

Copied from the file, not written here

'Debug Bundle for MindTickle.

The file declares its own license as MIT. That is the author’s claim about this one file, and it is not the same thing as the license GitHub reports for the repository, which is listed with the other numbers below.

SKILL.md

6.3 KB, as published. Nobody here has run it

MindTickle Debug Bundle

Overview

This debug bundle collects diagnostic evidence from MindTickle sales enablement API integrations for troubleshooting course delivery, quiz scoring, user progress tracking, and CRM sync pipelines. It captures API token validation, course catalog accessibility, user enrollment status, content module health, and Salesforce integration state. The resulting tarball provides the evidence needed to diagnose training completion gaps, broken content assignments, scoring discrepancies, and SSO provisioning failures without requiring MindTickle admin panel access.

Prerequisites

  • curl, jq, tar installed
  • MINDTICKLE_API_KEY set (API token from MindTickle Admin > Integrations > API)
  • MINDTICKLE_INSTANCE set to your instance URL (e.g., yourcompany.mindtickle.com)

Debug Collection Script

#!/bin/bash
set -euo pipefail
BUNDLE="debug-mindtickle-$(date +%Y%m%d-%H%M%S)"
mkdir -p "$BUNDLE"

# Environment check
echo "=== Environment ===" > "$BUNDLE/environment.txt"
echo "API Key: ${MINDTICKLE_API_KEY:+SET (redacted)}" >> "$BUNDLE/environment.txt"
echo "Instance: ${MINDTICKLE_INSTANCE:-NOT SET}" >> "$BUNDLE/environment.txt"
echo "Node: $(node -v 2>/dev/null || echo 'not installed')" >> "$BUNDLE/environment.txt"
echo "Timestamp: $(date -u)" >> "$BUNDLE/environment.txt"

# API connectivity — company info
echo "=== API Health ===" > "$BUNDLE/api-health.txt"
curl -sf -o "$BUNDLE/api-health.txt" -w "HTTP %{http_code} in %{time_total}s\n" \
  -H "Authorization: Bearer ${MINDTICKLE_API_KEY}" \
  "https://${MINDTICKLE_INSTANCE}/api/v2/company" 2>&1 || echo "UNREACHABLE" > "$BUNDLE/api-health.txt"

# Course catalog
echo "=== Courses ===" > "$BUNDLE/courses.json"
curl -sf -H "Authorization: Bearer ${MINDTICKLE_API_KEY}" \
  "https://${MINDTICKLE_INSTANCE}/api/v2/series?limit=10" \
  >> "$BUNDLE/courses.json" 2>&1 || echo '{"error":"FAILED"}' > "$BUNDLE/courses.json"

# User enrollment sample
echo "=== Users ===" > "$BUNDLE/users.json"
curl -sf -H "Authorization: Bearer ${MINDTICKLE_API_KEY}" \
  "https://${MINDTICKLE_INSTANCE}/api/v2/users?limit=5" \
  >> "$BUNDLE/users.json" 2>&1 || echo '{"error":"FAILED"}' > "$BUNDLE/users.json"

# Quiz/assessment results
echo "=== Assessments ===" > "$BUNDLE/assessments.json"
SERIES_ID=$(jq -r '.series[0].id // empty' "$BUNDLE/courses.json" 2>/dev/null)
if [ -n "${SERIES_ID:-}" ]; then
  curl -sf -H "Authorization: Bearer ${MINDTICKLE_API_KEY}" \
    "https://${MINDTICKLE_INSTANCE}/api/v2/series/${SERIES_ID}/progress?limit=5" \
    >> "$BUNDLE/assessments.json" 2>&1 || echo '{"error":"PROGRESS_FAILED"}' > "$BUNDLE/assessments.json"
else
  echo '{"error":"No courses found"}' > "$BUNDLE/assessments.json"
fi

# Recent logs
echo "=== Recent Logs ===" > "$BUNDLE/app-logs.txt"
tail -100 /var/log/mindtickle-sync/*.log >> "$BUNDLE/app-logs.txt" 2>/dev/null || echo "No sync logs found" >> "$BUNDLE/app-logs.txt"

# Rate limit status
echo "=== Rate Limits ===" > "$BUNDLE/rate-limits.txt"
curl -sI -H "Authorization: Bearer ${MINDTICKLE_API_KEY}" \
  "https://${MINDTICKLE_INSTANCE}/api/v2/company" 2>/dev/null | grep -i "x-rate\|retry-after\|x-ratelimit" >> "$BUNDLE/rate-limits.txt" || echo "No rate limit headers" >> "$BUNDLE/rate-limits.txt"

# Package versions
echo "=== Dependencies ===" > "$BUNDLE/deps.txt"
npm ls 2>/dev/null | grep -i mindtickle >> "$BUNDLE/deps.txt" || echo "No MindTickle npm packages found" >> "$BUNDLE/deps.txt"

tar -czf "$BUNDLE.tar.gz" "$BUNDLE" && rm -rf "$BUNDLE"
echo "Bundle: $BUNDLE.tar.gz"

Analyzing the Bundle

tar -xzf debug-mindtickle-*.tar.gz
cat debug-mindtickle-*/environment.txt           # Verify API key and instance
cat debug-mindtickle-*/api-health.txt            # Check HTTP status and latency
jq '.series | length' debug-mindtickle-*/courses.json     # Count courses
jq '.users | length' debug-mindtickle-*/users.json        # Check user provisioning

Common Issues

SymptomCheck in BundleFix
401 on all endpointsenvironment.txt shows key NOT SETGenerate API token in MindTickle Admin > Integrations > API Access
403 on user endpointsusers.json shows permission errorToken missing users.read scope; regenerate with admin role permissions
Course list emptycourses.json returns empty series arrayVerify courses are published (draft courses excluded from API); check team filter
Progress shows 0% for enrolled usersassessments.json shows no completion dataContent modules may not have tracking enabled; check series settings in admin
CRM sync staleApp logs show Salesforce auth errorsRe-authorize Salesforce connection in MindTickle Admin > CRM Integration
SSO users not appearingusers.json missing expected usersCheck SCIM provisioning logs; verify IdP group assignment includes MindTickle app

Automated Health Check

async function checkMindTickleHealth(): Promise<{
  status: string;
  latencyMs: number;
  companyOk: boolean;
  courseCount: number;
  userProvisioningOk: boolean;
}> {
  const apiKey = process.env.MINDTICKLE_API_KEY;
  const instance = process.env.MINDTICKLE_INSTANCE;
  const headers = { Authorization: `Bearer ${apiKey}` };
  const start = Date.now();

  const companyRes = await fetch(`https://${instance}/api/v2/company`, { headers });
  const coursesRes = await fetch(`https://${instance}/api/v2/series?limit=1`, { headers });
  const usersRes = await fetch(`https://${instance}/api/v2/users?limit=1`, { headers });

  let courseCount = 0;
  if (coursesRes.ok) {
    const data = await coursesRes.json();
    courseCount = data.series?.length ?? 0;
  }

  return {
    status: companyRes.ok ? "healthy" : "degraded",
    latencyMs: Date.now() - start,
    companyOk: companyRes.ok,
    courseCount,
    userProvisioningOk: usersRes.ok,
  };
}

Resources

Next Steps

See mindtickle-rate-limits.

Keep looking

Skills are one crate of 328,083. Ordering is by how many stacks a row turns up in, so the top of any crate is what has actually been picked rather than what has the most stars.