with one click
content-editing
// Complete workflow for creating, editing, and validating InfluxData documentation content
// Complete workflow for creating, editing, and validating InfluxData documentation content
[HINT] Download the complete skill directory including SKILL.md and all related files
| name | content-editing |
| description | Complete workflow for creating, editing, and validating InfluxData documentation content |
| author | InfluxData |
| version | 1.0 |
This skill guides the complete workflow for creating and editing InfluxData documentation, from initial content creation through testing and validation. It integrates docs CLI tools, MCP server fact-checking, shared content management, and comprehensive testing.
Use this skill when:
Need to decide when to use CLI vs direct editing?
โโ See docs-cli-workflow skill for decision guidance
Made content changes?
โโ To shared content? Touch sourcing files! (See Part 1: Shared Content)
โโ Run Vale linting (See Part 3: Vale Style Linting)
โโ Run code-block lint (See Part 2: Testing, section 3)
โโ Run full code block tests (See Part 2: Testing)
Need to verify technical accuracy?
โโ Use documentation MCP server (See Part 4: Fact-Checking)
Need to write/debug Vale rules?
โโ See vale-rule-config skill (for CI/Quality Engineers)
docs create and docs editFor detailed guidance on when and how to use the docs CLI tools, see the docs-cli-workflow skill, which covers:
docs create vs direct file creationdocs edit vs direct file editingQuick reference for this workflow:
# Create new documentation from draft
docs create <draft-path> --products <product-key>
# Edit existing documentation by URL or path
docs edit <url-or-path>
# List files without opening editor (agent-friendly)
docs edit <url-or-path> --list
# Add placeholder syntax to code blocks
docs placeholders <file.md>
# Important: Both commands are non-blocking by default
# - Launch editor in background
# - Return immediately (agent-friendly)
# - Use --wait flag for blocking behavior
Content that appears in multiple products uses Hugo's content adapter pattern:
content/
โโโ shared/
โ โโโ influxdb3/
โ โโโ admin/
โ โโโ databases.md # Actual content here
โโโ influxdb3/
โ โโโ core/
โ โ โโโ admin/
โ โ โโโ databases.md # Frontmatter only, has source:
โ โโโ enterprise/
โ โโโ admin/
โ โโโ databases.md # Frontmatter only, has source:
Frontmatter file example:
---
title: Database Management
source: /shared/influxdb3/admin/databases.md
---
When you edit a shared content file, Hugo does NOT automatically rebuild pages that reference it.
You MUST touch the frontmatter files to trigger a rebuild:
# Manual approach
touch content/influxdb3/core/admin/databases.md
touch content/influxdb3/enterprise/admin/databases.md
Use docs edit - it handles this automatically:
# This command will:
# 1. Find the shared source file
# 2. Find ALL frontmatter files that reference it
# 3. Open all files for editing
# 4. You edit the shared file
# 5. Hugo sees changes to frontmatter files and rebuilds
docs edit /influxdb3/core/admin/databases/
If you need to handle this in code:
// Check if a file is a sourcing file (frontmatter only)
import { readFileSync } from 'fs';
import matter from 'gray-matter';
function isSharedContent(filePath) {
const content = readFileSync(filePath, 'utf8');
const { data, content: body } = matter(content);
// If has source: frontmatter and minimal/no body content
return data.source && body.trim().length < 50;
}
function getSharedSource(filePath) {
const content = readFileSync(filePath, 'utf8');
const { data } = matter(content);
return data.source; // e.g., "/shared/influxdb3/admin/databases.md"
}
Failure to touch sourcing files means:
alt_linksWhen creating or editing shared content, check if the URL paths differ between products. If they do, add alt_links frontmatter to each product file to cross-reference the equivalent pages.
See DOCS-FRONTMATTER.md for syntax and examples.
Product resource terms often appear inside code-placeholder-key shortcode text and bullet item text.
Example product resource terms:
After making content changes, run tests to validate:
# Verify Hugo can build the site
yarn hugo --quiet
# Look for errors like:
# - Template errors
# - Missing partials
# - Invalid frontmatter
# - Broken shortcodes
# Test all links in the documentation
yarn test:links
# This checks:
# - Internal links (relative paths)
# - Cross-references
# - Anchor links
Parse/compile-only check for fenced code blocks. No credentials, no network, no Docker needed.
# Lint changed content files (exits 1 if any JSON/YAML/TOML block fails)
yarn lint-codeblocks content/influxdb3/core/admin/tokens/*.md
# Run the linter's own test suite
yarn test:lint-codeblocks
Blocking policy (mirrors CI):
| Language | On failure |
|---|---|
| JSON, YAML, TOML | ::error:: โ fails the PR check |
| bash, python, javascript | ::warning:: โ informational only |
Normalization: declared placeholders="TOKEN|DURATION" fence attributes and Hugo shortcodes ({{< >}}, {{% %}}) are substituted before parsing. See DOCS-TESTING.md ยง "Parse/compile code-block lint" for details.
# Test all code examples in documentation
yarn test:codeblocks:all
# Tests code blocks marked with:
# - testable: true
# - Validates syntax
# - Can execute examples (for supported languages)
Use the cypress-e2e-testing skill for comprehensive page testing:
# Test specific content file
node cypress/support/run-e2e-specs.js content/influxdb3/core/admin/databases/_index.md
# Test API reference pages (requires yarn build:api-docs first)
node cypress/support/run-e2e-specs.js \
--spec "cypress/e2e/content/api-reference.cy.js" \
content/influxdb3/core/api/_index.md
Important prerequisites:
yarn build:api-docs firstyarn hugo --quiet && yarn build:md firstSee cypress-e2e-testing skill for detailed test workflow.
Vale style linting runs automatically via pre-commit hooks, but you can run it manually:
# Lint specific files
.ci/vale/vale.sh --config=.vale.ini content/influxdb3/core/path/to/file.md
# Lint with minimum alert level
.ci/vale/vale.sh --config=.vale.ini --minAlertLevel=warning content/path/
# Sync Vale packages (after .vale.ini changes)
.ci/vale/vale.sh sync
Common issues:
admin flagged โ Use "administrator" in prose, or it's in a code context30d) โ These are valid InfluxDB syntax.ci/vale/styles/InfluxDataDocs/Terms/ignore.txtSee vale-linting skill for comprehensive Vale workflow.
# Start Hugo development server
yarn hugo server
# Visit http://localhost:1313
# Preview your changes in browser
Vale checks documentation for style guide violations, spelling errors, and branding consistency.
For writing Vale rules and understanding regex patterns, see the vale-rule-config skill.
# Basic linting (all markdown files)
.ci/vale/vale.sh content/**/*.md
# Lint specific product
.ci/vale/vale.sh content/influxdb3/core/**/*.md
# With specific config and alert level
.ci/vale/vale.sh \
--config=content/influxdb/cloud-dedicated/.vale.ini \
--minAlertLevel=error \
content/influxdb/cloud-dedicated/write-data/**/*.md
Vale reports three alert levels:
Spelling/vocabulary errors:
# If Vale flags a legitimate term, add it to vocabulary
echo "YourTerm" >> .ci/vale/styles/config/vocabularies/InfluxDataDocs/accept.txt
Style violations: Vale will suggest the correct form. For example:
content/file.md:25:1: Use 'InfluxDB 3' instead of 'InfluxDB v3'
Simply make the suggested change.
False positives: If Vale incorrectly flags something:
<!-- vale InfluxDataDocs.TechnicalTerms = NO -->
This paragraph contains technical terms that Vale might flag.
<!-- vale InfluxDataDocs.TechnicalTerms = YES -->
The InfluxDB documentation MCP server lets you search InfluxDB documentation (the rendered content managed in this repository) and related InfluxData references (source code READMEs, community forums, and some third-party tool documentation) directly from your AI assistant.
The primary source of content in the Documentation MCP Server is the fully rendered public HTML from this repository.
Use the Documentation MCP Server when the information here is inconclusive, when you need to deepen your understanding of InfluxData products and integrations, or when identifying content gaps in the documentation.
Use for:
Don't use for:
yarn test:links)yarn test:codeblocks)The documentation MCP server is hosted at https://influxdb-docs.mcp.kapa.aiโno local installation required.
Already configured in .mcp.json. Two server entries are available:
influxdb-docs (API key) โ Set INFLUXDATA_DOCS_KAPA_API_KEY env var. 60 req/min.influxdb-docs-oauth (OAuth) โ No setup. Authenticates via Google or GitHub on first use. 40 req/hr, 200 req/day.The MCP server exposes a semantic search tool:
search_influxdb_knowledge_sources
What it does:
source_url and Markdown contentExample queries:
## Scenario: Editing database management documentation
1. Draft claims: "InfluxDB 3 supports up to 10,000 databases per instance"
2. Ask your AI assistant to verify using the MCP server:
"What are the database limits in InfluxDB 3 Core and Enterprise?"
3. MCP response returns documentation chunks with actual limits
4. Update draft with accurate information
5. Cite the source_url in documentation if needed
DO:
DON'T:
# Step 1: Create content from draft
docs create database-tutorial.md --products influxdb3-core,influxdb3-enterprise
# CLI scaffolds files:
# - content/shared/influxdb3/guides/database-tutorial.md
# - content/influxdb3/core/guides/database-tutorial.md (frontmatter)
# - content/influxdb3/enterprise/guides/database-tutorial.md (frontmatter)
# Step 2: Verify technical accuracy
# Ask your AI assistant (with MCP configured) to verify claims:
# "Verify database creation syntax for InfluxDB 3"
# Step 3: Test Hugo build
yarn hugo --quiet
# Step 4: Run E2E tests
node cypress/support/run-e2e-specs.js \
content/influxdb3/core/guides/database-tutorial.md
# Step 5: Validate links
yarn test:links
# Step 6: Test code examples (if tutorial has code blocks)
yarn test:codeblocks:all
# Step 1: Find and edit the content
docs edit https://docs.influxdata.com/influxdb3/core/reference/sql/
# CLI automatically:
# - Finds content/shared/influxdb3/reference/sql/_index.md
# - Finds ALL frontmatter files referencing it:
# * content/influxdb3/core/reference/sql/_index.md
# * content/influxdb3/enterprise/reference/sql/_index.md
# * content/influxdb3/cloud-dedicated/reference/sql/_index.md
# - Opens all files (sourcing files will be touched when saved)
# Step 2: Make edits to the shared source file
# Step 3: Fact-check changes with MCP
# Ask your AI assistant: "Verify SQL WHERE clause syntax in InfluxDB 3"
# Step 4: Test the build
yarn hugo --quiet
# Step 5: Test affected pages
node cypress/support/run-e2e-specs.js \
content/influxdb3/core/reference/sql/_index.md \
content/influxdb3/enterprise/reference/sql/_index.md
# Step 6: Validate links in SQL reference
yarn test:links
# Step 1: Fix typo directly (you know the file)
# Edit content/influxdb3/core/get-started/_index.md
# Step 2: Test Hugo build
yarn hugo --quiet
# Step 3: Quick visual check
yarn hugo server
# Visit http://localhost:1313/influxdb3/core/get-started/
# Done! (No need for comprehensive testing on typo fixes)
# Check for detailed errors
yarn hugo
# Common issues:
# - Invalid frontmatter YAML
# - Missing closing shortcode tags
# - Broken partial references
# - Invalid template syntax
Problem: Edited shared file, but test shows old content
Solution: Touch the sourcing files manually
# Find pages that reference the shared file
grep -r "source: /shared/path/to/file.md" content/
# Touch each one
touch content/influxdb3/core/path/to/file.md
touch content/influxdb3/enterprise/path/to/file.md
# Or use docs edit (it does this automatically)
Troubleshooting steps:
influxdb-docs): Verify INFLUXDATA_DOCS_KAPA_API_KEY is set. Rate limit: 60 req/min.influxdb-docs-oauth): Sign in with Google or GitHub on first use. Rate limits: 40 req/hr, 200 req/day.*.kapa.aiSee cypress-e2e-testing skill for comprehensive debugging:
# Check Hugo server logs
cat /tmp/hugo_server.log | tail -50
# Run tests interactively
yarn cypress open
# Check if API content was generated (for API tests)
ls content/influxdb3/core/api/
# If empty: yarn build:api-docs
| Task | Command |
|---|---|
| Create new content | docs create draft.md --products <key-or-path> |
| Edit by URL | docs edit https://docs.influxdata.com/... |
| List files without editing | docs edit <url> --list |
| Add placeholders to code | docs placeholders file.md or docs placeholders file.md --dry |
| Audit documentation | docs audit --products influxdb3_core or docs audit --products /influxdb3/core |
| Generate release notes | docs release-notes v3.1.0 v3.2.0 --products influxdb3_core |
| Build Hugo site | yarn hugo --quiet |
| Run Vale linting | .ci/vale/vale.sh --config=.vale.ini content/path/ |
| Test links | yarn test:links |
| Lint code block syntax | yarn lint-codeblocks content/path/*.md |
| Test code blocks | yarn test:codeblocks:all |
| Test specific page | yarn test:e2e content/path/file.md |
| Fact-check with MCP | Ask AI assistant with search_influxdb_knowledge_sources tool configured |
| Preview locally | yarn hugo server (visit localhost:1313) |
| Generate API docs | yarn build:api-docs (before API reference tests) |
Note: --products accepts both product keys (influxdb3_core) and content paths (/influxdb3/core).
docs edit)alt_links if paths varyyarn hugo --quiet).ci/vale/vale.sh --config=.vale.ini content/path/)yarn test:links)