framework/devtools/skills/flowai-skill-engineer-skill/SKILL.md
Guide for creating effective Agent Skills (SKILL.md packages). Use when users want to create a new skill, write a skill, author a SKILL.md, or ask about skill structure, best practices, or skill file format. Works across IDEs (Cursor, Claude Code, OpenCode).
npx skillsauth add korchasa/flow flowai-skill-engineer-skillInstall 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 guides through creating effective Agent Skills — markdown-based packages that teach AI agents specialized workflows, domain knowledge, and procedural capabilities.
When asking the user a choice (IDE, scope, behavior decisions):
1., 2., …) — not a heading, bold-only line, or paragraph.agent's choice (or equivalent), pick the subset yourself, emit a one-line justification of the pick, and proceed without re-asking for confirmation.Skills are self-contained packages (directory with SKILL.md) that extend agent capabilities with:
Skills work across multiple IDEs. Before creating a skill, determine the current environment and ask the user where to place it.
| Primitive | Scope | Claude Code | Cursor | OpenCode |
| :--- | :--- | :--- | :--- | :--- |
| Persistent Instructions | User | ~/.claude/CLAUDE.md | - | ~/.config/opencode/AGENTS.md<br>~/.claude/CLAUDE.md (fallback) |
| | Project | CLAUDE.md<br>.claude/rules/*.md | AGENTS.md<br>.cursor/rules/*/RULE.md<br>~~.cursor/rules/*.mdc~~ | AGENTS.md<br>CLAUDE.md (fallback)<br>opencode.json instructions |
| | Folder | subdir/CLAUDE.md<br>CLAUDE.local.md | subdir/AGENTS.md | - |
| Conditional Instructions | Project | .claude/rules/*.md | .cursor/rules/*/RULE.md<br>~~.cursor/rules/*.mdc~~ | opencode.json instructions (globs) |
| Custom Commands | User | ~/.claude/commands/*.md | ~/.cursor/commands/*.md | ~/.config/opencode/commands/*.md |
| | Project | .claude/commands/*.md<br>.claude/commands/<namespace>/*.md | .cursor/commands/*.md | .opencode/commands/*.md |
| Skills | User | ~/.claude/skills/<name>/ | ~/.cursor/skills/<name>/ | ~/.config/opencode/skills/<name>/<br>~/.claude/skills/<name>/ (fallback) |
| | Project | .claude/skills/<name>/ | .cursor/skills/<name>/ | .opencode/skills/<name>/<br>.claude/skills/<name>/ (fallback) |
| Event Hooks | User | ~/.claude/settings.json | ~/.cursor/hooks.json | ~/.config/opencode/plugins/*.{js,ts} |
| | Project | .claude/settings.json<br>.claude/settings.local.json | .cursor/hooks.json | .opencode/plugins/*.{js,ts} |
| MCP Integration | User | settings.json<br>managed-mcp.json | ~/.cursor/mcp.json | opencode.json mcp |
| | Project | .mcp.json | .cursor/mcp.json | opencode.json mcp |
| Context Ignoring | User | .claude/settings.json | - | - |
| | Project | - | .cursorignore | .gitignore<br>.ignore<br>opencode.json watcher.ignore |
| IDE | Personal Skills | Project Skills |
|-----|----------------|----------------|
| Cursor | ~/.cursor/skills/<name>/ | .cursor/skills/<name>/ |
| Claude Code | ~/.claude/skills/<name>/ | .claude/skills/<name>/ |
| OpenCode | ~/.config/opencode/skills/<name>/ | .opencode/skills/<name>/ |
OpenCode also reads skills from fallback locations: .claude/skills/, .agents/skills/, ~/.claude/skills/, ~/.agents/skills/.
.cursor/ directory → Cursor.claude/ directory → Claude Code.opencode/ directory or opencode.json → OpenCodeIMPORTANT: Never create skills in ~/.cursor/skills-cursor/ — reserved for Cursor internals.
Context window is shared with conversation, other skills, and user request. Every token competes for space.
Default assumption: the agent is already very smart. Only add context it doesn't already have.
Challenge each piece:
Prefer concise examples over verbose explanations.
| Freedom Level | When to Use | Example | |---------------|-------------|---------| | High (text instructions) | Multiple valid approaches, context-dependent | Code review guidelines | | Medium (pseudocode/templates) | Preferred pattern with acceptable variation | Report generation | | Low (specific scripts) | Fragile operations, consistency critical | Database migrations |
Every skill: required SKILL.md + optional bundled resources in a directory:
skill-name/
├── SKILL.md # Required - main instructions
├── references/ # Optional - detailed documentation
│ ├── api_reference.md
│ └── patterns.md
├── scripts/ # Optional - executable code
│ └── validate.py
└── assets/ # Optional - output resources
└── template.md
name and description fields. These determine when the skill triggers.| Type | Path | Purpose | When to Include |
|------|------|---------|-----------------|
| Scripts | scripts/ | Executable code (Python/Bash) | Same code rewritten repeatedly; deterministic reliability needed |
| References | references/ | Documentation loaded into context as needed | Detailed info too lengthy for SKILL.md |
| Assets | assets/ | Files used in output (templates, images, fonts) | Templates, boilerplate, images for final output |
No README.md, CHANGELOG.md, INSTALLATION_GUIDE.md, or other auxiliary docs. The skill contains only what the agent needs to do the job.
Three-level loading to manage context:
Keep SKILL.md under 500 lines. Split content into separate files when approaching this limit. Reference them clearly from SKILL.md with guidance on when to read them.
Important: Keep references one level deep from SKILL.md. Avoid deeply nested chains.
Description is critical for skill discovery. The agent uses it to decide when to apply the skill.
Third person (injected into system prompt):
Specific with trigger terms:
Include WHAT and WHEN:
| Field | Limit |
|-------|-------|
| name | Max 64 chars, [a-z0-9-] only, no leading/trailing/consecutive hyphens |
| description | Max 1024 chars, no angle brackets <> |
| name + description combined | <100 tokens (~400 chars; chars/4 approx) — the flowai validator check-skills.ts rejects over-budget catalog metadata. Agents load this tuple at session start for skill discovery; over-budget means the skill won't be visible. Aim for ~75 tokens to leave headroom. |
| SKILL.md body | <5000 tokens (~20000 chars; chars/4 approx) — also enforced by check-skills.ts. Plan the budget BEFORE editing: run wc -c <SKILL.md>; if (current + planned-additions) / 4 > 4000 tokens, put the bulk in references/<topic>.md from the start instead of inlining. The cap rejects late, so retry-and-compress cycles waste tool calls. Multiple skills in this repo (flowai-skill-maintenance, flowai-skill-engineer-skill, flowai-skill-engineer-command, flowai-skill-write-agent-benchmarks, etc.) already follow this pattern — check their references/ for prior art. |
Provide output format templates when consistent structure matters:
## Report structure
ALWAYS use this template:
# [Title]
## Executive summary
[One-paragraph overview]
## Key findings
- Finding 1 with data
## Recommendations
1. Specific action
For output quality dependent on seeing examples:
## Commit message format
**Example 1:**
Input: Added user authentication with JWT tokens
Output: feat(auth): implement JWT-based authentication
Break complex operations into steps with checklists:
## Workflow
- [ ] Step 1: Analyze input
- [ ] Step 2: Create mapping
- [ ] Step 3: Validate
- [ ] Step 4: Execute
- [ ] Step 5: Verify
Guide through decision points:
1. Determine type:
**Creating new?** -> "Creation workflow" below
**Editing existing?** -> "Editing workflow" below
For quality-critical tasks:
1. Make edits
2. Validate: `deno run scripts/validate_skill.ts output/`
3. If fails -> fix -> validate again
4. Only proceed when validation passes
scripts/helper.py, not scripts\helper.pycode-review not helper or utilsTwo lessons for authors changing a skill's output contract (what the final response should look like). Derived from debugging a skill whose output kept leaking into a file even after the write to file directive was removed.
When SKILL.md contains an example output block, the agent treats the shape of that example as the imitation target. A directive like "deliver findings inline in the response" competes with an example that starts with # Report Title (YYYY-MM-DD) + ## 1. Section + - [ ] item — and usually loses. That shape reads as "markdown file to save", and the agent saves it, regardless of the surrounding prose.
Rule: when changing an output contract, audit the example block, not just the directives. Drop file-shaped scaffolding:
# / ## headings → plain-text category labels (1. Section Name).# Report (YYYY-MM-DD)) → remove; chat responses don't need titles.- [ ] checkbox syntax → plain - bullets; checkboxes imply "tracked task file".The shape must match the target delivery medium. For inline chat output, the example should read like a chat message.
When unwanted behavior is primed by a rule, example shape, or system-level context (e.g., project AGENTS.md rules imported by a benchmark runner), the instinct is to add a negative constraint like Do NOT create files or Rule X does NOT apply to this skill. These rarely beat a shape-level or system-level prior — the agent has to pick a winner, often inconsistently.
Better approach: find the priming source inside the skill and remove it.
Output Target: write to <path>) → delete the rule entirely.Reporting, Save report, Persist) → rename (Deliver findings).Add explicit prohibitions only as a last resort, after reframing fails.
Gather from user:
If context from prior conversation exists, infer the skill from discussed workflows/patterns.
deno run -A scripts/init_skill.ts for scaffolding if starting from scratchRun validation:
deno run -A scripts/validate_skill.ts <path/to/skill-directory>
Checklist:
deno run -A scripts/package_skill.ts <path/to/skill-directory> [output-directory]
Creates a .skill zip file for distribution.
development
Use when the user asks to add TypeScript strict-mode code-style rules to AGENTS.md for a TypeScript project using strict mode. Do NOT trigger for Deno projects (use setup-agent-code-style-deno) or non-strict TS configurations.
development
Use when the user asks to add Deno/TypeScript code-style rules to AGENTS.md, or during initial Deno project setup when code-style guidelines need to be established. Do NOT trigger for non-Deno TypeScript projects (use setup-agent-code-style-strict), or for runtime-agnostic style advice.
testing
Use when the user provides a source (URL, file path, or free text) to save into the project's memex — a long-term knowledge bank for AI agents. Stores the raw source, extracts entities into cross-linked pages, runs a backlink audit, and updates the index and activity log. Do NOT trigger on casual reads; only when the intent is to persist a source into the memex.
development
Use when the user asks to audit a memex (long-term knowledge bank for AI agents) for orphans, dead SALP REFs, missing sections, contradictions, or index drift. Runs a deterministic structural check, layers LLM-judgement findings, optionally auto-fixes trivial issues with `--fix`. Do NOT trigger on general code linting.