Configures qmd collections for semantic search on project markdown directories. Checks qmd install and MCP, derives project name, scans/selects dirs like docs/, sets collection details and names.
From qmdnpx claudepluginhub aviflombaum/claude-code-in-avinyc --plugin qmdThis skill is limited to using the following tools:
Fetches up-to-date documentation from Context7 for libraries and frameworks like React, Next.js, Prisma. Use for setup questions, API references, and code examples.
Retrieves current documentation, API references, and code examples for libraries, frameworks, SDKs, CLIs, and services via Context7 CLI. Ideal for API syntax, configs, migrations, and setup queries.
Uses ctx7 CLI to fetch current library docs, manage AI coding skills (install/search/generate), and configure Context7 MCP for AI editors.
Interactive interview to set up or reconfigure qmd collections for a project. Idempotent: works for both first-time setup and reconfiguration.
Run this flow step by step. Do NOT skip steps or assume answers.
command -v qmd
If missing, tell the user:
qmd is not installed. Install it with:
npm install -g @tobilu/qmd
Then STOP.
The search skill uses qmd's MCP tools for best performance (models stay warm between queries). Check if the MCP server is configured:
cat .mcp.json 2>/dev/null | grep -q '"qmd"' && echo "found in project" || echo "not in project"
If not configured, tell the user:
qmd MCP server is not configured. Add it for the best search experience.
Option 1 — CLI (recommended):
claude mcp add qmd -- qmd mcpOption 2 — Manual: Add to
.mcp.jsonin the project root:{ "mcpServers": { "qmd": { "command": "qmd", "args": ["mcp"] } } }The search skill will fall back to CLI if MCP isn't available, but MCP is significantly faster for repeated queries.
Continue with setup regardless — MCP is recommended but not required.
Get the git repo folder name and normalize it:
basename "$(git rev-parse --show-toplevel)" | tr '[:upper:]' '[:lower:]' | sed 's/[^a-z0-9]/_/g; s/__*/_/g; s/^_//; s/_$//'
Show the derived name to the user via AskUserQuestion. Let them confirm or type a custom name. Once confirmed, this is the canonical project name used for all collection prefixes.
Find directories containing markdown files:
find . -maxdepth 2 -type f -name "*.md" -exec dirname {} \; | sort -u
From the output, select only directories useful for a searchable document collection (docs/, plans/, tasks/, etc.). Ignore tmp/, vendor/, node_modules/, and other project cruft.
Use AskUserQuestion with multiSelect: true. List indexable directories as options. Explain that each directory becomes a qmd collection for fast semantic search.
If no candidate directories were found, ask the user to type custom directory paths.
For each selected directory, use AskUserQuestion to:
**/*.md, offer alternatives like **/*.{md,txt})For each selected directory, derive the collection name: {project}_{dirname} where dirname has / and . replaced with _ and leading dots stripped. Example: .cursor/rules → cursor_rules, so collection is myproject_cursor_rules.
Get the absolute path to the directory:
echo "$(git rev-parse --show-toplevel)/<dirname>"
Then add the collection:
qmd collection add "<absolute_path>" --name "<collection_name>" --mask "<pattern>"
qmd context add "qmd://<collection_name>/" "<description>"
If qmd collection add fails (collection already exists), ask the user whether to overwrite. If yes:
qmd collection remove "<collection_name>"
qmd collection add "<absolute_path>" --name "<collection_name>" --mask "<pattern>"
qmd context add "qmd://<collection_name>/" "<description>"
Use the Write tool to create .claude/qmd.json:
{
"project": "<project_name>",
"collections": {
"<project>_<dirname>": {
"path": "<relative-dir-path>",
"pattern": "**/*.md",
"description": "<user-provided description>"
}
},
"gitHook": false
}
qmd update && qmd embed
Tell the user it's generating embeddings. This may take a moment for large collections.
Use AskUserQuestion: "Install a git post-commit hook? When enabled, committing changes to .md files will automatically re-index in the background so search results stay fresh."
Options: "Yes, install hook" / "No, skip"
If yes, install the hook by appending to .git/hooks/post-commit (create the file if needed, ensure it's executable):
# qmd-auto-index:<project_name>
# Auto-update qmd index when markdown files change
export PATH="$HOME/.bun/bin:$HOME/.local/bin:$PATH"
if command -v qmd &>/dev/null; then
if git diff-tree --no-commit-id --name-only -r HEAD | grep -q '\.md$'; then
(qmd update && qmd embed) &>/dev/null &
fi
fi
Check for the marker comment # qmd-auto-index:<project_name> first to avoid duplicates. Update .claude/qmd.json to set "gitHook": true.
Show the user:
/avinyc:qmd-search <query>/avinyc:qmd-configure/avinyc:qmd-status/avinyc:qmd-doctor