Claude-code-plugins-plus mindtickle-local-dev-loop
install
source · Clone the upstream repo
git clone https://github.com/jeremylongshore/claude-code-plugins-plus-skills
Claude Code · Install into ~/.claude/skills/
T=$(mktemp -d) && git clone --depth=1 https://github.com/jeremylongshore/claude-code-plugins-plus-skills "$T" && mkdir -p ~/.claude/skills && cp -r "$T/plugins/saas-packs/mindtickle-pack/skills/mindtickle-local-dev-loop" ~/.claude/skills/jeremylongshore-claude-code-plugins-plus-mindtickle-local-dev-loop && rm -rf "$T"
manifest:
plugins/saas-packs/mindtickle-pack/skills/mindtickle-local-dev-loop/SKILL.mdsource content
MindTickle Local Dev Loop
Overview
Local development workflow for MindTickle sales enablement and readiness API integration. Provides a fast feedback loop with mock training modules, user progress, and coaching data so you can build sales readiness dashboards without needing a live MindTickle instance. Toggle between mock mode for rapid iteration and sandbox mode for validating against the real MindTickle platform.
Environment Setup
cp .env.example .env # Set your credentials: # MINDTICKLE_API_KEY=mt_xxxxxxxxxxxx # MINDTICKLE_BASE_URL=https://api.mindtickle.com/v2 # MOCK_MODE=true npm install express axios dotenv tsx typescript @types/node npm install -D vitest supertest @types/express
Dev Server
// src/dev/server.ts import express from "express"; import { createProxyMiddleware } from "http-proxy-middleware"; const app = express(); app.use(express.json()); const MOCK = process.env.MOCK_MODE === "true"; if (!MOCK) { app.use("/v2", createProxyMiddleware({ target: process.env.MINDTICKLE_BASE_URL, changeOrigin: true, headers: { Authorization: `Bearer ${process.env.MINDTICKLE_API_KEY}` }, })); } else { const { mountMockRoutes } = require("./mocks"); mountMockRoutes(app); } app.listen(3007, () => console.log(`MindTickle dev server on :3007 [mock=${MOCK}]`));
Mock Mode
// src/dev/mocks.ts — realistic sales enablement training data export function mountMockRoutes(app: any) { app.get("/v2/modules", (_req: any, res: any) => res.json([ { id: "mod_1", title: "Q4 Product Launch", type: "course", status: "published", enrolledCount: 85, completionRate: 0.72 }, { id: "mod_2", title: "Objection Handling", type: "coaching", status: "published", enrolledCount: 120, completionRate: 0.58 }, ])); app.get("/v2/users/:id/progress", (req: any, res: any) => res.json({ userId: req.params.id, completedModules: 8, totalModules: 12, averageScore: 82, recentActivity: [{ moduleId: "mod_1", score: 91, completedAt: "2025-09-10T15:30:00Z" }], })); app.get("/v2/leaderboard", (_req: any, res: any) => res.json({ topPerformers: [ { userId: "usr_1", name: "Sarah Kim", score: 95, modulesCompleted: 12 }, { userId: "usr_2", name: "James Park", score: 88, modulesCompleted: 10 }, ], })); app.post("/v2/coaching/sessions", (req: any, res: any) => res.status(201).json({ id: "cs_1", ...req.body, status: "scheduled" })); }
Testing Workflow
npm run dev:mock & # Start mock server in background npm run test # Unit tests with vitest npm run test -- --watch # Watch mode for rapid iteration MOCK_MODE=false npm run test:integration # Integration test against real API
Debug Tips
- MindTickle user IDs are org-scoped — IDs from one org will 404 on another
- Progress endpoints return
for users who have not started any modulesnull - Coaching session creation requires both
andcoachId
fieldslearnerId - Use
to test against unpublished content without affecting live users/v2/modules?status=draft - Check
is a decimal (0.72) not a percentage (72) when building dashboardscompletionRate
Error Handling
| Issue | Cause | Fix |
|---|---|---|
| Invalid API key | Regenerate at MindTickle admin console |
| Key lacks admin scope | Request API access from MindTickle CSM |
| User or module ID invalid | Fetch list endpoints to verify IDs |
| Too many requests | Add exponential backoff, use mock mode |
| Dev server not running | Run first |
Resources
Next Steps
See
mindtickle-debug-bundle.