.cursor/skills/packmind-create-standard/SKILL.md
Guide for creating coding standards via the Packmind CLI. This skill should be used when users want to create a new coding standard (or add rules to an existing standard) that captures team conventions, best practices, or coding guidelines for distribution to Cursor.
npx skillsauth add PackmindHub/packmind packmind-create-standardInstall 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.
This skill provides a complete walkthrough for creating coding standards via the Packmind CLI.
Coding standards are collections of rules that capture team conventions, best practices, and coding guidelines. They help maintain consistency across codebases and enable Cursor to follow your team's specific practices.
Every standard is drafted as a markdown file with this structure:
# Standard Name
## Description
What the standard covers and why.
## Scope
Comma-separated glob patterns for files where the standard applies (e.g., "**/*.ts", "**/*.spec.ts,**/*.test.ts").
## Rules
### Rule description starting with action verb
#### Positive Example
\`\`\`typescript
// Valid code example
\`\`\`
#### Negative Example
\`\`\`typescript
// Invalid code example
\`\`\`
### Another rule without examples
The # Title heading is the display name shown in indexes and dashboards. The slug is auto-generated from it — never write the slug yourself.
Format: Use Title Case with spaces — natural language, not a slug.
Examples:
"TypeScript Testing Conventions", "React Component File Organization", "Backend Error Handling""typescript-testing-conventions" (slug format — use Title Case with spaces)"testing" (too generic)"good-practices" (slug format and too vague)"Standards for Code" (describes meta-concept, not the actual domain)Note: The summary field is used in other workflows (like MCP) but not yet supported by the CLI.
scope vs summaryscope (required by CLI): WHERE the standard applies — comma-separated glob patterns.
"**/*.spec.ts,**/*.test.ts", "**/*.tsx,**/*.jsx", "src/domain/**/*.ts"**/*.ts — all TypeScript files**/*.spec.ts,**/*.test.ts — all test files**/*.tsx,**/*.jsx — all React component filessrc/domain/**/*.ts — domain TypeScript files under srcpackages/**/src/**/*.ts — all package source filessummary (optional, not yet CLI-supported): WHEN/WHY to apply - high-level purpose and trigger condition
"Apply when writing tests to ensure consistency", "Use when handling user data for privacy compliance"Before creating a standard, verify that packmind-cli is available:
Check if packmind-cli is installed:
packmind-cli --version
If not available, install it:
npm install -g @packmind/cli
Then login to Packmind:
packmind-cli login
To create a standard, follow this process in order, skipping steps only if there is a clear reason why they are not applicable.
Gather essential information before drafting the standard.
Study the user's request and identify critical gaps. The number of questions should match the request clarity:
Examples of focused questions:
Introduce questions with a simple phrase about needing clarification, then list as bullet points—no numbering, no category headers.
Do not open or scan repository files unless the user explicitly points to them (provides file paths or requests project-wide review). If source references are needed, ask the user to supply them.
Take brief notes on:
Keep notes concise—just enough to unlock drafting.
Transform the understanding into a complete markdown draft with rules and examples.
.packmind/standards/_drafts/ (create the folder if missing) using filename <slug>.md (lowercase with hyphens)# <Standard Title> (Title Case, 2–5 words)## Description — what the standard covers and why it exists## Scope — comma-separated glob patterns (required)## Rules — each rule as a ### <rule text> subsection following the Rule Writing Guidelines below#### Positive Example with a language-annotated code block showing the compliant approach#### Negative Example with a language-annotated code block showing the anti-patternThis draft file is the only file created during drafting — no separate files are needed.
Each rule should follow these format requirements:
Rules describe WHAT to do, not WHY. Strip justifications and benefits—let examples demonstrate value.
Common fluff patterns to remove:
Bad (includes rationale):
Document props with JSDoc comments to provide IDE intellisense and improve developer experience.
Good (action only):
Document component props with JSDoc comments (
/** ... */) describing purpose, expected values, and defaults.
If a rule addresses 2+ distinct concerns, proactively split it into separate rules:
Bad (too broad):
Create centralized color constants in dedicated files for consistent palettes, using semantic naming based on purpose rather than specific color values.
Good (split into focused rules):
theme/colors.ts using semantic names (e.g., primary, error)Inline examples (code, paths, patterns) within the rule content are optional. Only include them when they clarify something not obvious from the rule text.
Types of useful inline examples:
const, async/await, /** ... */infra/repositories/, domain/entities/.spec.ts, I{Name} prefixGood rules with inline examples:
IUserService)"infra/repositories/"Good rules without inline examples:
Bad rules:
typescript, sql, javascript)Valid language values for code blocks:
After saving the draft file, write a concise summary that captures:
Then proceed directly to Step 3.
Before running the CLI command, you MUST get explicit user approval:
---
Name: <standard name>
Description: <description>
Scope: <scope>
Rules:
1. <rule content>
- ✅ <positive example>
- ❌ <negative example>
2. <rule content>
- ✅ <positive example>
- ❌ <negative example>
...
---
Provide the file path to the markdown file so users can open and edit it directly if needed.
Ask: "Here is the standard that will be created on Packmind. The draft file is at <path> if you want to review or edit it. Do you approve?"
Wait for explicit user confirmation before proceeding to Step 4.
If the user requests changes, go back to earlier steps to make adjustments.
Re-read the markdown file from disk to capture any user edits.
Compare with the original content you created in Step 2.
If changes were detected:
If no changes: Proceed directly to submission.
Convert the markdown to JSON using these conversion rules:
# heading → name## Description content → description## Scope content → scope### ... under ## Rules → rule content#### Positive Example code block → examples.positive#### Negative Example code block → examples.negativeexamples.language (UPPERCASED)Important: examples is a single object (not an array) — one positive/negative pair per rule. It is optional — omit entirely for rules without code examples. When present, all three fields (positive, negative, language) are required.
Expected JSON format:
{
"name": "Standard Name",
"description": "What the standard covers and why.",
"scope": "**/*.spec.ts,**/*.test.ts",
"rules": [
{
"content": "Rule description starting with action verb",
"examples": {
"positive": "// valid code",
"negative": "// invalid code",
"language": "TYPESCRIPT"
}
},
{
"content": "Rule without examples"
}
]
}
Pipe the JSON directly to the CLI via stdin using a heredoc (no intermediate file needed):
packmind-cli standards create --origin-skill packmind-create-standard <<'EOF'
{"name":"...","description":"...","scope":"...","rules":[...]}
EOF
Expected output on success:
packmind-cli Standard "Your Standard Name" created successfully (ID: <uuid>)
"Not logged in" error:
packmind-cli login
"Failed to resolve global space" error:
Validation errors:
## Rules section has at least one ### rule subsection"expected object, received array" error on examples:
examples field must be a single object {positive, negative, language}, not an arrayAfter the standard is successfully created, delete the draft markdown file in .packmind/standards/_drafts/.
Only clean up on success - if the CLI command fails, keep the files so the user can retry.
After successful creation, check if the standard fits an existing package:
packmind-cli install --list to get available packages<package-slug> package."<package-slug>packmind-cli packages add --to <package-slug> --standard <standard-slug>packmind-cli install to sync the changes?"packmind-cli installHere's a complete example creating a TypeScript testing standard:
File: .packmind/standards/_drafts/testing-conventions.md
# TypeScript Testing Conventions
## Description
Enforce consistent testing patterns in TypeScript test files to improve readability, maintainability, and reliability of the test suite.
## Scope
**/*.spec.ts,**/*.test.ts
## Rules
### Use descriptive test names that explain the expected behavior
#### Positive Example
\`\`\`typescript
it('returns empty array when no items match filter')
\`\`\`
#### Negative Example
\`\`\`typescript
it('test filter')
\`\`\`
### Follow Arrange-Act-Assert pattern in test structure
#### Positive Example
\`\`\`typescript
const input = createInput();
const result = processInput(input);
expect(result).toEqual(expected);
\`\`\`
#### Negative Example
\`\`\`typescript
expect(processInput(createInput())).toEqual(expected);
\`\`\`
### Use one assertion per test for better error isolation
#### Positive Example
\`\`\`typescript
it('validates name', () => { expect(result.name).toBe('test'); });
it('validates age', () => { expect(result.age).toBe(25); });
\`\`\`
#### Negative Example
\`\`\`typescript
it('validates user', () => { expect(result.name).toBe('test'); expect(result.age).toBe(25); });
\`\`\`
### Avoid using 'should' at the start of test names - use assertive verb-first naming
Creating the standard (piped via stdin):
packmind-cli standards create --origin-skill packmind-create-standard <<'EOF'
{"name":"TypeScript Testing Conventions","description":"Enforce consistent testing patterns...","scope":"**/*.spec.ts,**/*.test.ts","rules":[...]}
EOF
| Section | Required | Description |
|---|---|---|
| # Title | Yes | Title Case, descriptive, 2–5 words |
| ## Description | Yes | What and why |
| ## Scope | Yes (CLI) | Comma-separated glob patterns |
| ## Rules | Yes | Contains rule subsections |
| ### Rule text | Yes (≥1) | Rule text (verb-first, max ~25 words) |
| #### Positive Example | No | Valid code in fenced block |
| #### Negative Example | No | Invalid code in fenced block |
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-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