scripts/michel/michel-create-packmind-dataset/SKILL.md
--- name: michel-create-packmind-dataset description: Seed a local Packmind instance with a realistic dataset — one organization populated with standards, commands, and skills — so an autonomous agent can exercise its own changes against lifelike data instead of an empty app. Use this whenever you need populated Packmind data to verify a change end-to-end: reproducing a bug that only shows with existing artifacts, recording a UI/CLI demo that needs content on screen, smoke-testing a new endpoint
npx skillsauth add PackmindHub/packmind scripts/michel/michel-create-packmind-datasetInstall this skill globally with one command. Works with Claude Code, Cursor, and Windsurf.
3 of 9 scanners reported clean
Some scanners were skipped, did not run, or reported a non-clean status. Review each row below.
Build a working dataset inside a local Packmind instance — an organization with standards, commands, and skills — so a change can be tested against realistic data. Written for an autonomous agent verifying its own work on the Packmind app.
Let the task pick the artifacts. This skill is not a fixed recipe that always creates the same three standards. A "dataset" is whatever the thing you are testing needs to be exercised. Before seeding anything, ask: what must exist for my change to be observable?
playbook add/submit → seed at least one skill via the CLI (the only path that creates skills)./slug invocation, or the Commands page → author one or two commands.Seed the minimum that makes the change observable. Over-seeding slows the run and muddies what you are actually testing. When unsure what an artifact is or how a flow behaves, look it up in the product docs over MCP (see below) rather than guessing.
The packmind-user-docs MCP server (configured in .mcp.json, served from https://docs.packmind.com/mcp) exposes Packmind's end-user documentation. Query it whenever you are unsure how a feature works from the user's side — what a standard/command/skill is, what the creation flows offer, what a setting does, how packages/distribution work. This is the authoritative source for product behavior; prefer it to assumptions. The docs describe the UI and concepts; the CLI mechanics below are the seeding path.
michel-run-local-dev-stackThat skill is the single source of truth for the lifecycle. The essentials:
export PACKMIND_EDITION=oss
docker compose --profile dev up -d
until curl -sf localhost:4200 >/dev/null; do sleep 2; done # frontend ready
curl -s -o /dev/null -w "%{http_code}\n" localhost:4200/api/v0 # API via Vite proxy -> 200
Host-port trap: the NestJS API is on container port 3000, which is not published to the host. Never poll localhost:3000. Reach the API through the frontend's Vite proxy at http://localhost:4200/api/v0 — and that same base URL (http://localhost:4200) is what the CLI must point at.
If the frontend exits on its own or sticks on "Loading Packmind…", that is a known cosmetic flake — restart just frontend or reload the page. See michel-run-local-dev-stack ("Frontend troubleshooting"); don't debug the app.
Clean slate: the Postgres volume persists across down, so a prior run leaves its org and artifacts behind. If the test needs a guaranteed-empty start:
docker compose --profile dev down -v
PACKMIND_EDITION=oss docker compose --profile dev up -d
A fresh instance has no account; the first org is created through sign-up. Drive the browser with the Playwright MCP:
http://localhost:4200 → lands on /sign-in./sign-up/create-account.[email protected]) → Continue with email.Packmind!Demo#2026) — confirm → Create Account.Packmind Demo) → Continue. Slug is derived (packmind-demo).You land at /org/<org-slug>/space/global. The default space is Global.
Playbook → Standards. Fastest path for realistic data is Browse samples: tick the languages/frameworks the task needs (e.g. TypeScript, React, Nest.js — click the sample card, the checkbox is overlaid by its label) → Create. Each becomes a versioned standard (typescript-best-practices, etc.), listed immediately.
Other paths when you need specific rules: Create manually (/standards/create) for authored content, Browse use cases to populate from GitHub/Slack/Jira, Generate from your code to infer from a codebase. Pick by what you are testing.
Playbook → Commands → Create manually (/commands/create).
Create React Component) → slug auto-derived (create-react-component), invoked as /slug.The page also offers Browse use cases, Create from your code, and example buttons (Conventional commit, Generate Playwright test).
Skills are not created with a UI form (the Skills page's Import action just documents the CLI flow). A skill is a directory containing a SKILL.md with name/description frontmatter, uploaded via the CLI. Connect the CLI first (§6), then:
# Stage one skill folder (must contain SKILL.md), targeting a space
node ./dist/apps/cli/main.cjs playbook add <skill-directory> --space global
# Publish. -m skips the interactive editor; --no-review applies it directly
node ./dist/apps/cli/main.cjs playbook submit -m "Add skill (test dataset)" --no-review
Output: 1 skill created. Refresh Playbook → Skills to see it, versioned and attributed.
playbook add scans .claude/skills/** for SKILL.md; point it at a single folder to stage just that one. playbook status shows what is tracked.--no-review to create a proposal instead — use this when the task is to test the review workflow.Build from source and run as node ./dist/apps/cli/main.cjs — do not use a global packmind-cli, which may target production.
npm run packmind-cli:build # -> dist/apps/cli/main.cjs
node ./dist/apps/cli/main.cjs login --host http://localhost:4200 # MUST pass --host; defaults to prod
Login starts a callback server (http://127.0.0.1:19284) and prints a /cli-login?... URL. Open it in a browser session already logged in to the local org (the §2 account); it hands the code back and the CLI stores an API key at ~/.packmind/credentials.json.
/cli-login page also shows a one-time code and a login --host … --code <uuid> command. Pass --code to skip the browser round-trip.Verify, then the CLI reads/writes the local dataset:
node ./dist/apps/cli/main.cjs whoami # Host/Organization/User
node ./dist/apps/cli/main.cjs standards list # the standards you created
node ./dist/apps/cli/main.cjs spaces list # -> @global
If you are an autonomous agent that started the stack, you must take it down before finishing so no container blocks later runs (per michel-run-local-dev-stack):
docker compose --profile dev down # keeps the dataset
docker compose --profile dev down -v # also wipes it
# Stack
export PACKMIND_EDITION=oss
docker compose --profile dev up -d
until curl -sf localhost:4200 >/dev/null; do sleep 2; done
curl -s -o /dev/null -w "%{http_code}\n" localhost:4200/api/v0 # -> 200
# CLI: build + connect to local
npm run packmind-cli:build
node ./dist/apps/cli/main.cjs login --host http://localhost:4200
node ./dist/apps/cli/main.cjs whoami
# Seed a skill (org + standards + commands done in the UI per §2–4)
node ./dist/apps/cli/main.cjs playbook add <skill-dir> --space global
node ./dist/apps/cli/main.cjs playbook submit -m "seed" --no-review
# Teardown (mandatory for autonomous runs)
docker compose --profile dev down
tools
Record polished UI demo videos and screenshots of a running web app using Playwright MCP — for client deliverables, release notes, feature walkthroughs, or bug repros. Produces an HD WebM video with chapter markers, a mandatory animated cursor overlay, and a mandatory subtitle bar that narrates each step (positioned deliberately so it never masks the UI being demonstrated), plus full-page screenshots at each step. Use this whenever the user asks to "record a demo", "create a screencast", "make a UI walkthrough video", "document this feature with video", "show the client how X works", "capture screenshots of the app", or anything similar — even when the user only says "make a video" or "take screenshots" in the context of a running frontend. Also use it when the user wants to demonstrate a workflow, generate marketing-quality footage of an app, or produce repeatable visual documentation.
tools
The canonical recipe for starting, checking, and stopping the Packmind local dev stack with Docker Compose — the single source of truth other skills and the Michel agent defer to. Covers bringing the full stack (PostgreSQL, Redis, NestJS API, React/Vite frontend on :4200, MCP server, nginx) up in the background, the init services (dependency install + TypeORM migrations) you must wait on, the critical host-port trap that the API on container port 3000 is NOT exposed to the host and must be reached via the frontend Vite proxy at localhost:4200/api/v0, confirming the API and frontend are actually serving before you depend on them, the persistent-volume gotcha that leaves stale Postgres schema and node_modules behind between runs, building the CLI, and tearing everything down so no container is left blocking the run. Use this whenever you need Packmind running locally — to verify a change, record a UI or CLI demo, hit the API, seed data, or reproduce a bug — and whenever you are about to start or stop `docker compose`. If you are an autonomous agent (e.g. Michel) that started the stack, you MUST use the teardown half before finishing. Prefer this over running `nx serve` on the host for anything that needs the real, containerized stack.
tools
Best practices for creating GitHub pull requests that include inline images — CLI terminal screenshots (from cli-demo-recorder), UI screenshots/videos (from ui-demo-recorder), or any other visual artifact. Use this skill whenever opening or updating a PR that has visual artifacts to embed, or when images aren't rendering in a PR description. Also use it when asked "how do I add screenshots to a PR", "why isn't my image showing", or "embed a demo in the PR".
tools
--- name: michel-cli-demo-recorder description: Produce proof-of-execution demos of the Packmind CLI (`packmind-cli`) as static terminal-styled SVG images (colors and formatting preserved exactly), for embedding in a GitHub PR. Use this whenever a dev task touches the CLI — new command, changed output, new flag, bug fix in terminal rendering — and the PR would benefit from showing the tool actually running. Trigger it when the user says "record a CLI demo", "show the command output", "add a term