Novu Design Workflow
novuhq/novu
Design notification workflows the Novu way — choose channels, set severity, decide when a workflow is critical, configure digests, and route based on subscriber state.
Migrate Infrahub docs feature pages from the legacy topic+guide pair into a cleaner structure (single merged page, hub+spokes, or tutorial extraction).
$ npx skills add opsmill/infrahub --skill migrate-feature-page -a claude-codeProject install by default; add -g for ~/.claude/skills/.
$ gh skill install opsmill/infrahub migrate-feature-page --agent claude-codeProject scope by default; add --scope user for a personal install. Needs GitHub CLI 2.90.0 or later (public preview).
$ git clone --depth 1 https://github.com/opsmill/infrahub.git skills-src && mkdir -p .claude/skills && cp -r skills-src/.agents/skills/migrate-feature-page .claude/skills/migrate-feature-page && rm -rf skills-srcUse ~/.claude/skills/ instead of .claude/skills for a personal install. The folder must contain SKILL.md.
Claude Code skills documentation · loads skills from .claude/skills/
Install the "migrate-feature-page" agent skill from https://github.com/opsmill/infrahub/tree/stable/.agents/skills/migrate-feature-page into .claude/skills/migrate-feature-page/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "migrate-feature-page", then confirm the skill loads.Claude Code copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$skill-installer install https://github.com/opsmill/infrahub/tree/stable/.agents/skills/migrate-feature-pageType this inside Codex. $skill-installer <name> installs a curated skill from openai/skills. The installer writes to $CODEX_HOME/skills (default ~/.codex/skills). Restart Codex if the skill does not show up.
$ npx skills add opsmill/infrahub --skill migrate-feature-page -a codexProject install goes to .agents/skills/; add -g for ~/.codex/skills/.
$ gh skill install opsmill/infrahub migrate-feature-page --agent codexProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/opsmill/infrahub.git skills-src && mkdir -p .agents/skills && cp -r skills-src/.agents/skills/migrate-feature-page .agents/skills/migrate-feature-page && rm -rf skills-srcUse ~/.agents/skills/ instead of .agents/skills for a personal install.
Codex skills documentation · loads skills from .agents/skills/
Install the "migrate-feature-page" agent skill from https://github.com/opsmill/infrahub/tree/stable/.agents/skills/migrate-feature-page into .agents/skills/migrate-feature-page/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "migrate-feature-page", then confirm the skill loads.Codex copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ npx skills add opsmill/infrahub --skill migrate-feature-page -a cursorProject install goes to .agents/skills/; add -g for ~/.cursor/skills/.
$ gh skill install opsmill/infrahub migrate-feature-page --agent cursorProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/opsmill/infrahub.git skills-src && mkdir -p .cursor/skills && cp -r skills-src/.agents/skills/migrate-feature-page .cursor/skills/migrate-feature-page && rm -rf skills-srcUse ~/.cursor/skills/ instead of .cursor/skills for a personal install.
Cursor skills documentation · loads skills from .cursor/skills/, .agents/skills/, .claude/skills/, .codex/skills/
Install the "migrate-feature-page" agent skill from https://github.com/opsmill/infrahub/tree/stable/.agents/skills/migrate-feature-page into .cursor/skills/migrate-feature-page/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "migrate-feature-page", then confirm the skill loads.Cursor copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ gemini skills install https://github.com/opsmill/infrahub.git --path .agents/skills/migrate-feature-page--scope user (default) or --scope workspace; --path is the subfolder of the repo that holds the skill; --consent skips the security confirmation prompt.
$ npx skills add opsmill/infrahub --skill migrate-feature-page -a gemini-cliProject install goes to .agents/skills/; add -g for ~/.gemini/skills/.
$ gh skill install opsmill/infrahub migrate-feature-page --agent gemini-cliProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/opsmill/infrahub.git skills-src && mkdir -p .gemini/skills && cp -r skills-src/.agents/skills/migrate-feature-page .gemini/skills/migrate-feature-page && rm -rf skills-srcUse ~/.gemini/skills/ instead of .gemini/skills for a personal install, then run /skills reload.
Gemini CLI skills documentation · loads skills from .gemini/skills/, .agents/skills/
Install the "migrate-feature-page" agent skill from https://github.com/opsmill/infrahub/tree/stable/.agents/skills/migrate-feature-page into .gemini/skills/migrate-feature-page/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "migrate-feature-page", then confirm the skill loads.Gemini CLI copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ gh skill install opsmill/infrahub migrate-feature-pageInstalls for Copilot at project scope by default; add --scope user for a personal install. Preview a skill first with gh skill preview. Needs GitHub CLI 2.90.0 or later (public preview).
$ npx skills add opsmill/infrahub --skill migrate-feature-page -a github-copilotProject install goes to .agents/skills/; add -g for ~/.copilot/skills/.
$ git clone --depth 1 https://github.com/opsmill/infrahub.git skills-src && mkdir -p .github/skills && cp -r skills-src/.agents/skills/migrate-feature-page .github/skills/migrate-feature-page && rm -rf skills-srcUse ~/.copilot/skills/ instead of .github/skills for a personal install. Commit .github/skills so cloud agent and code review can use it.
GitHub Copilot skills documentation · loads skills from .github/skills/, .claude/skills/, .agents/skills/
Install the "migrate-feature-page" agent skill from https://github.com/opsmill/infrahub/tree/stable/.agents/skills/migrate-feature-page into .github/skills/migrate-feature-page/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "migrate-feature-page", then confirm the skill loads.GitHub Copilot copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ npx skills add opsmill/infrahub --skill migrate-feature-page -a opencodeOpenCode documents no install command of its own. Project install goes to .agents/skills/; add -g for ~/.config/opencode/skills/.
$ gh skill install opsmill/infrahub migrate-feature-page --agent opencodeProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/opsmill/infrahub.git skills-src && mkdir -p .opencode/skills && cp -r skills-src/.agents/skills/migrate-feature-page .opencode/skills/migrate-feature-page && rm -rf skills-srcUse ~/.config/opencode/skills/ instead of .opencode/skills for a personal install.
OpenCode skills documentation · loads skills from .opencode/skills/, .claude/skills/, .agents/skills/
Install the "migrate-feature-page" agent skill from https://github.com/opsmill/infrahub/tree/stable/.agents/skills/migrate-feature-page into .opencode/skills/migrate-feature-page/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "migrate-feature-page", then confirm the skill loads.OpenCode copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
migrate-feature-pageMigrate Infrahub docs feature pages from the legacy topic+guide pair into a cleaner structure (single merged page, hub+spokes, or tutorial extraction).
Migrate Feature Page is an agent skill from opsmill/infrahub. Migrate Infrahub docs feature pages from the legacy topic+guide pair into a cleaner structure (single merged page, hub+spokes, or tutorial extraction). Supports both single-feature migrations (one feature like Profiles or Webhooks) and section-wide migrations (a whole section like Branches & Change Control with multiple features migrated together) when the team has agreed on a section-wide restructure plan. Trigger when the user names a specific feature or section to migrate (e.g. "let's migrate profiles", "start…
Its SKILL.md is about 8.5k tokens, which your agent loads only when the skill is triggered. It is a single SKILL.md file with no bundled scripts.
It sits in Backend & APIs, covering Webhooks. It works with Confluence. The repository describes itself as: Infrahub is a graph-based data management platform with built-in version control, CI workflows, peer review, and API access. It’s purpose-built to power reliable infrastructure… The licence is Apache-2.0.
12 steps, taken from the step headings in SKILL.md.
Read from SKILL.md and the folder at commit af1c6c8. It shows what the files ask for, not the result of running them.
Pre-approves nothing: there is no allowed-tools line, so your agent's usual permission prompts apply.
From allowed-tools in the SKILL.md frontmatter.
Shell commands in SKILL.md call:
gitnpmuvghbrewFrom the folder's file list and the shell code blocks in SKILL.md.
Hosts in commands or code, which the agent is likely to contact:
claude.comAlso links to:
opsmill.atlassian.netgithub.comFrom URLs in SKILL.md, links to its own repository left out.
Names no API keys, tokens, secrets or passwords.
From names ending in _API_KEY, _TOKEN, _SECRET, _KEY or _PASSWORD in SKILL.md.
Migrate Feature Page loads about 8.5k tokens when it runs. Until then it costs about 181 tokens; SKILL.md has 4,184 words of instructions outside code blocks.
Estimates: characters ÷ 4, the usual rule of thumb; real counts depend on the model's tokenizer. Scripts and assets cost tokens only if the agent reads them.
The automated check found no risky patterns in SKILL.md.
Automated static check — not a guarantee. Review scripts before installing. It scans the text of SKILL.md for risky patterns (piping downloads into a shell, reading credential files, hidden Unicode, destructive commands); files beside SKILL.md are not scanned.
The full file from opsmill/infrahub at commit af1c6c8, republished under its Apache-2.0 licence (© opsmill). 4,184 words, ~8,541 tokens.
.claude/skills/migrate-feature-page/SKILL.md (or your agent's skills folder).Used during the Infrahub docs revamp to migrate one feature page (Layer 2 content under a Features sub-category) — or an entire docs section — from a topic + guide pair to a cleaner structure. Each migration gets its own branch and PR for scoped review.
The Groups feature was the first single-feature migration. Files to reference when in doubt:
docs/docs/groups/index.mdx — hubdocs/docs/groups/*.mdx — spokesdocs/docs/academy/tutorials/groups.mdx — preserved tutorialFor section-wide restructures, look for a per-section recommendation page on Confluence (e.g. Branches & Change Control Recommendations) — these capture the team-approved structure before migration starts.
docs/docs/topics/<slug>.mdxdocs/docs/guides/<slug>.mdxFeatures > <Section> in docs/sidebars.tsUse TodoWrite to track. Stop and confirm with the user at every ★ gate. For section-wide migrations, also see Recommendations for large or section-wide migrations at the bottom — apply those on top of the standard workflow.
Meta-rule: never recommend silently. When the spec-review (Step 2.5) or implementation surfaces additional changes beyond what the recommendations doc already states — like merging two pages into one, adding a missing spoke, renaming a label, restructuring a sub-category — present the recommendation to the user with rationale and wait for a decision before implementing. The recommendations doc is the canonical spec; deviations get explicit approval, not silent application.
demo/groups-diataxis-example (the consolidated parent branch). If not, switch.git status -s. Any uncommitted changes? Stop and ask user how to handle them before creating a new branch.docs/migrate-<feature-slug> (e.g. docs/migrate-profiles)docs/migrate-<section-slug> (e.g. docs/migrate-branches-and-change-control)Read the source files completely:
docs/docs/topics/<slug>.mdxdocs/docs/guides/<slug>.mdxProduce a compact summary covering:
grep -rln 'topics/<slug>\|guides/<slug>' docs/docs/ (excluding the files themselves and other obvious matches). List which other docs reference them.★ Gate: present the audit to the user. Wait for confirmation before proceeding.
When the user provides a Confluence recommendations doc (typical for section-wide migrations), the doc replaces Steps 2 and 3 as the planning artifact. But the doc may have gaps — review it critically against the skill's decision rules before implementing.
Read the doc end-to-end. Then run this checklist against the proposed structure:
branch-synchronization + selective-branch-sync) AND describe related procedural work, they're merge candidates. Treat them as one feature unless there's a specific reason to keep them separate.sidebars.ts must have link: { type: 'doc', id: '<feature>/index' }. Without that, the category caret expands but the label is dead. Confirm the doc specifies an explicit hub for each new category.create, update, delete, query, etc.) typically each get a spoke. If the doc lists 3 spokes but obvious operations are missing, flag it.(Topic) / (Guide) sidebar labels. If the new sidebar still has these suffixes, that means the migration is half-done — those labels should disappear when files convert to hub+spokes or single-page merge. Check.Per the meta-rule: every finding gets presented to the user with rationale, not silently applied. The user updates the doc, then you implement against the updated spec.
★ Gate: present spec-review findings. User decides which to add to the spec, which to leave as-is. Once decisions land, the user (or you, on their behalf) updates the recommendations doc to reflect the final spec. Then proceed to Step 4.
When no doc exists (typical for single-feature migrations), recommend a pattern based on the Step 2 audit. Get user approval before creating files.
Decision rules:
| Condition | Pattern |
|---|---|
| Single concept + one workflow, content fits under ~300 lines | Single-page merge — both files combined into docs/docs/<feature>/index.mdx |
| Multiple distinct tasks (3+ separable workflows) | Hub + spokes — short hub explaining the concept; one spoke page per task (Groups precedent) |
| Guide is genuinely tutorial-shaped | Tutorial extraction — guide content moves to academy/tutorials/<slug>.mdx (preserve original title); topic content becomes the canonical feature page |
| Mix of tutorial + recipes | Split — tutorial portion → Academy; recipe portion → feature page (Groups precedent) |
| Multiple files sharing a name root + related procedural scope | Likely single-page merge even if file count > 2 — they're describing one feature |
Default: single-page merge unless the feature genuinely warrants more complexity.
Tutorial scenario-shape test. If the chosen pattern preserves an Academy tutorial (Tutorial extraction or Split), apply this check before keeping it: read the source guide and ask "does this teach a coherent end-to-end scenario someone would actually want to learn — routers/switches at scale, modeling a service, onboarding a new team — or is it the same content as the existing guide with sequence numbers stuck on it?" If the latter, the tutorial is feature-oriented, not scenario-oriented; flag it to the user and recommend dropping the tutorial from this PR with a follow-up entry on the Open Questions Confluence page describing the scenario rewrite. Do not ship feature-oriented tutorials — they don't earn their sidebar slot. (Precedent: the Profiles tutorial was dropped on PR #9114 review for exactly this reason.)
★ Gate: present the recommended pattern with rationale, including the tutorial scenario-shape verdict if applicable. User approves or chooses different.
Follow the chosen pattern. For section-wide migrations, do this one feature at a time with a build verification between each — see the section-wide recommendations below.
Match the interfaces shown in the existing guide / tutorial. Before writing any how-to or spoke content, look at the existing guide and tutorial for that feature. They use Tabs to show the same task across the UI, Python SDK, and GraphQL — that ordering reflects how users actually interact with the feature (UI primary, SDK via generators, GraphQL last). When you create the new how-to spokes, preserve that same set of interface tabs and reuse the same running example. Do not reduce a multi-interface task to GraphQL-only because it's faster to write — the existing guide content is the source of truth for which interfaces matter and what the canonical UI navigation steps look like. If a new task isn't covered in the existing guide, mirror the interface set used elsewhere in the same feature's docs.
Match the voice of the canonical Infrahub docs and the conventions of well-regarded open-source documentation (Stripe, Tailwind, FastAPI, Docusaurus). The reader knows they are reading a docs page — do not narrate that fact at them.
Do not refer to "this page", "this section", or "this document". Those describe the layout/medium, not the content — the reader knows they are reading a page, and headers and the URL already do that wayfinding work. Banned phrases:
Instead, just state what is true. If you genuinely need to direct the reader to nearby content, use "below" or "here":
"This guide" and "this tutorial" are fine — those refer to the functional kind of document (a guide guides you, a tutorial teaches you). They are genre markers, not layout descriptors. Use them when the genre framing actually helps the reader:
BuiltinTag objects so you can follow along without any special schema."When the legacy source content uses the banned "this page / this section / this document" phrases (it often does), rewrite them on extraction — don't carry them forward. The new file is shipping under the new structure; legacy slop doesn't get a free pass just because it was already there. Legacy "this guide" / "this tutorial" usage on a guide or tutorial page is fine to keep.
Tutorial opener convention. Academy tutorials use ONE consolidated opener — see academy/tutorials/groups.mdx and academy/tutorials/build-a-check.mdx for the precedent:
Do not use both a "This tutorial walks you through …" intro AND a separate "By the end of this tutorial you will:" bullet list — that's redundant. Pick one paragraph that does both jobs.
Other voice rules (carryover from project house style — apply to any new prose you author):
Banned jargon — words that don't earn their place:
When in doubt, ask: would this sentence read better with the qualifier removed? If yes, remove it.
Single-page merge (Computed Attributes precedent — PR #9120):
docs/docs/<feature>/index.mdx — combine topic content (top) and guide content (rewritten below as how-to sections)<group-name>, <object-id>docs/docs/topics/<slug>.mdx and docs/docs/guides/<slug>.mdx: leave on disk during iteration (legacy URLs work); deleted in cleanup PR{ type: 'doc', id: '<feature>/index', label: '<Feature>' } — the merged page IS the canonical sidebar entry; no folder/category neededWhy folder + index.mdx for single-page merges too? Even when there's only one page, using
<feature>/index.mdxkeeps URLs stable (/<feature>/) regardless of future restructures. If the page later grows into hub+spokes, no file move is needed — only adding sibling spokes. Computed Attributes shipped this way; it's the established pattern.
Hub + spokes (Groups / Profiles precedent):
docs/docs/<feature>/index.mdx — topic content only. Do NOT add a "Common tasks" or "Deeper concepts" link list — the spokes already appear in the sidebar when the user is on the hub, so a body link list is redundant clutter. A "Learn by doing" body link to an Academy tutorial is OK because the tutorial lives in a different sidebar section.docs/docs/<feature>/<task>.mdx — one per task. Each spoke ends with a brief ## Next section pointing to adjacent spokes (always Next, not Related — mixed heading names across a spoke set is a recurring review comment).docs/docs/<feature>/<concept>.mdx for substantial deep-dive content (e.g. priority and inheritance) when it's a frequently-referenced topic and would otherwise bloat the hub.docs/docs/academy/tutorials/<feature>.mdxCritical: hub categories must have a clickable link. In
sidebars.ts, every category that becomes a hub must includelink: { type: 'doc', id: '<feature>/index' }. Without this, the category caret expands but the label itself is dead — clicking "Profiles" or "Branches" does nothing. The Groups, Profiles, and Branches categories all have this; it's a recurring bug to forget. Verify after writing the sidebar entry.
Tutorial extraction:
docs/docs/academy/tutorials/<slug>.mdxModify docs/sidebars.ts. Replace the old topic+guide pair entries with the new structure. Use the small color-matched caret (already styled in custom.css) for nested categories where used.
cd docs && npm run buildFix any broken doc IDs or links. Run npm run serve to visually check.
Each migration drops a YAML file in docs/redirects-pending/ recording the URL changes the migration introduces. The file has three sections — redirects (legacy → new), new pages introduced (canonical URLs for cross-reference), and cross-links in other files that need updating at cleanup. At end-of-Phase-2 (cleanup PR), all files are aggregated. See docs/redirects-pending/README.md for the schema.
Create docs/redirects-pending/<feature-or-section-slug>.yml:
---
feature: <Feature Name or Section Name>
pr: TBD
description: |
Brief explanation of what changed and why these redirects exist.
# Legacy URLs that will redirect to new locations
redirects:
- from: /docs/<old-path>
to: /docs/<new-path>
# Net-new pages introduced by this migration (canonical URLs for cross-reference)
new_pages:
- path: /docs/<feature>/
title: <Feature> (hub)
- path: /docs/<feature>/<task>
title: <Task title>
# Internal cross-link references in OTHER files that point at legacy paths
# (will resolve via redirect at runtime but should be updated to new paths at cleanup)
cross_links_to_update:
- file: docs/docs/topics/some-other-page.mdx
line: 42
current: ../topics/<slug>
should_be: ../<feature>/Common patterns for the redirects section:
/docs/topics/<feature> → /docs/<feature>//docs/guides/<feature> → /docs/<feature>//docs/guides/<feature> → /docs/topics/<feature>/docs/guides/<feature> → /docs/topics/<feature>Update docs/redirects-pending/README.md "Files in this folder" table to add the new entry.
grep -rln '<feature-slug>' docs/docs/ to find inbound references to the legacy paths.cross_links_to_update section with file, line, current link target, and should_be link target. This gives the cleanup PR a complete inventory.Before opening the PR, do a thorough audit pass. (This used to be the end-of-migration audit; moved earlier so issues land in the PR clean rather than as fix-up commits afterward.)
The audit is a real read-through, not a tool run. Build + markdownlint + Vale + word-check are necessary but not sufficient. They catch syntax problems and policy violations, not factual drift or content gaps. The audit means reading every new/modified file end-to-end with the source content open alongside, looking for: extraction faithfulness (did the new spoke preserve every claim from the source?), hub coherence (does the hub still read as a complete concept page after the spokes were extracted?), invented content (did you write anything that has no analog in the source?), cross-link target accuracy (does each link land on the right page and section?). If the audit feels short, you're not doing it.
For section-wide migrations with 10+ pages, delegate to an Explore agent with a focused brief. That's what scales — the agent reads everything in parallel and produces a structured findings report. Do not skip this with "I built clean and lint passed" — those caught zero of the real issues last time.
Specific things to verify:
docs/docs/reference/schema/<feature>.mdx if presentdocs/docs/topics/schema-attr-kind-*.mdx for attribute kindsgroups/use-in-automation.mdx:54 — claim about "Generator owns a CoreGeneratorGroup" is incorrect; per topics/generator.mdx, the SDK manages the CoreGeneratorGroup automatically.★ Gate: present audit findings to the user. User decides which to fix in this PR vs defer. Fix the in-PR ones before continuing.
Draft a slimmed-down summary as the PR body. Template below.
★ Gate: present the draft PR description to the user. They approve or edit. Do not commit until approved.
## Summary
Migrate the **<Feature or Section>** per the Infrahub docs revamp.
Pattern: <single-page merge / hub + spokes / tutorial extraction / split / section-wide restructure>.
## Content changes
[Section-by-section list — keep brief.]
- **<Section name>**: <preserved as-is / rewritten as how-to / moved to Academy tutorial / etc.>
## What needs reviewer attention
[List the actual NEW prose the reviewer should read carefully. Skip anything that's verbatim extraction with only cross-link updates — the reviewer can trust those.]
Most of this PR is preserved content with cross-link updates. The actual NEW prose to review is small:
- **`<file>:<lines>` — <one-line description of new section/prose>.** <Brief rationale or where it came from — e.g. "Sourced from the Confluence net-new content draft" or "Standard spoke `## Next` closer matching Generators/Transformations precedent.">
Everything else (~XX% of the lines changed) is verbatim from the source legacy files with only cross-link path updates — safe to skim.
## What didn't change
- All factual content preserved; no new claims invented
- Original URLs continue to resolve (legacy `topics/<slug>.mdx` and `guides/<slug>.mdx` remain on disk during iteration; cleanup happens in a separate PR before production merge)
## Out of scope (tracked in Open Questions)
- [Cross-section content references to add elsewhere — links to Confluence Open Questions item]
- [Any structural gaps deferred]
## Verification
- `cd docs && npm run build` succeeds
- Local preview: `npm run serve` → http://localhost:3000
- Pre-PR audit completed (Step 9 of migrate-feature-page skill)
🤖 Generated with [Claude Code](https://claude.com/claude-code)Always lint before committing — it is required for every docs change:
uv run invoke docs.lintThis runs both markdownlint and Vale. Both must pass — Vale (documentation style) failures block CI in the validate-documentation-style check. Fix every error reported before committing. Warnings are not blocking but should be triaged: if a warning is in NEW content, fix it; if it's in pre-existing content unrelated to this PR, leave it.
Verify each lint tool actually ran — don't infer from a clean wrapper exit. Some tools silently skip if not installed —
uv run invoke docs.lintexits 0 even when Vale didn't run because the binary is missing. Runwhich valefirst, or look for Vale's per-file output. Markdownlint passing ≠ Vale ran.
If Vale isn't installed locally, install it first — brew install vale on macOS, or download from https://github.com/errata-ai/vale/releases. Don't skip Vale checks; CI will catch what you missed and you'll have to push fix-up commits.
Common Vale rules to watch for:
Infrahub.spelling — flags non-dictionary words. Either rephrase, or if it's a real word that should be in the vocabulary, add it to .vale/styles/spelling-exceptions.txt.Infrahub.swap — substitutes specific terms (e.g. "repo" → "repository"). Use the preferred term.Infrahub.branded-terms-case-swap — Infrahub product names should be capitalized (Transformations, Generators, Profiles, etc.) when used as branded references.Infrahub.eg-ie (warning) — replace e.g. and i.e. with for example, or that is,.Infrahub.sentence-case (warning) — headings should use sentence case, not title case.For dev-internal docs that shouldn't be subject to Vale style rules (team workflow READMEs, planning artifacts), add a BasedOnStyles = exclusion in .vale.ini rather than fighting individual rules. Examples already excluded: docs/docs/reference/**, docs/redirects-pending/**, **/AGENTS.md.
Also check for AGENTS.md "Never Do" words that linters miss (simple, easy, just). Run this against every file changed in the PR — not just the docs pages, but also any skill, agent guide, or dev doc you touched. The forbidden-words rule is global; in-house dev docs aren't exempt.
git diff --name-only origin/demo/groups-diataxis-example...HEAD \
| xargs grep -niE '\bsimple\b|\beasy\b|\bjust\b' 2>/dev/nullIf any matches are in NEW content (whether docs or skill/dev files), fix in place. If matches are in PRESERVED content, propose fixing as part of the migration since the file is shipping under the new structure (the Profiles migration set this precedent).
Then commit, push, and open the PR:
git add <files>
git commit -m "docs: migrate <Feature or Section> per docs revamp"
git push -u origin docs/migrate-<slug>
gh pr create --base demo/groups-diataxis-example --title "docs: migrate <Feature or Section> per docs revamp" --body "<approved description>"| Issue type | Action |
|---|---|
| Clear factual error | Fix in this PR |
| Structural gap (missing prereqs, troubleshooting) | Flag to user; ask whether to fix or defer to post-launch |
| Stylistic improvement | Flag to user; default is defer |
| Outdated example | Flag to user; ask |
| Stale terminology / voice inconsistency | Defer (out of scope for this revamp) |
When migrating multiple features in a single PR (a whole docs section like Branches & Change Control), apply these patterns on top of the standard workflow above:
[link](../topics/foo) references in OTHER files become broken at the URL level even though redirects will catch them. Run grep -rn 'topics/<slug>\|guides/<slug>' docs/docs/ after each file move. For each match: fix immediately if it's within the feature being migrated, or log to the cross_links_to_update section of the redirects-pending file if it's in another feature/section.<X> spoke from <hub>.mdx → docs/<feature>/<x>.mdx + verify build."Do NOT update the Navigation Map for individual feature migrations during iteration. The Map gets a single end-of-revamp update once Phase 2 is complete.
When implementation surfaces a gap in the recommendations doc (a missing spoke, a topic+guide that should merge, a hub click-target, a mistaken page move), update the doc first, then implement against the updated spec. The doc stays canonical; deviations are explicit. A few cycles of doc edits during a section-wide migration is expected — that's the planning-vs-implementation separation working as designed. The skill's meta-rule (above) catches the moment-of-decision; this section is the broader workflow note.
What this looks like in practice:
Don't quietly diverge from the doc — that breaks the "one canonical spec" property and makes future review harder.
topics/<slug>.mdx / guides/<slug>.mdx files (left in place so old URLs keep working)Distinction: cross-section content changes are out of scope, but moving an entire sub-category's sidebar position is in scope when the recommendations doc specifies it. Example: in PR #9125, the Git Integration sub-category moved into Branches & Change Control as a nested sub-category. The pages inside Git Integration weren't rewritten — only their sidebar position changed (and their containing folder, since hub+spokes uses
docs/<feature>/). That's allowed when the doc says so.
demo/groups-diataxis-exampleThe feature PR merges into the consolidated parent branch (demo/groups-diataxis-example). Subsequent feature migrations branch off the updated parent so they pick up cumulative changes.
When all feature migrations land in demo/groups-diataxis-example and the team is ready to ship to production:
topics/<slug>.mdx and guides/<slug>.mdx filesredirects-pending/*.yml file's cross_links_to_update section for the inventory)@docusaurus/plugin-client-redirects and add redirect entries (aggregate from each redirects-pending/*.yml's redirects section)© opsmill, Apache-2.0. Rendered from Markdown: HTML in the file is shown as text, images as links, and headings moved down two levels. Raw file
Just SKILL.md in .agents/skills/migrate-feature-page of opsmill/infrahub.
Open the folder on GitHubat commit af1c6c8
Migrate Feature Page next to the 5 skills that share the most tags, products or categories with it. Stars are the repository's; “used in” counts other GitHub owners with a copy.
| Skill | Stars | Used in | Tokens | Auto-check | Licence | Repo updated |
|---|---|---|---|---|---|---|
| Migrate Feature Page this skillopsmill/infrahub | 529 | — | ~8.5k | Automated safety check: Pass | Apache-2.0 | |
| Novu Design Workflownovuhq/novu | 40k | — | ~2.6k | Automated safety check: Pass | Custom licence | |
| Golivemikehasa/golive-skill | 1.2k | — | ~13k | Automated safety check: Notes | MIT | |
| Stripe Appsfossasia/eventyay | 1.7k | 1 repos | ~3.6k | Automated safety check: Pass | Apache-2.0 | |
| Dingtalk Messageagentscope-ai/ReMe | 3.6k | — | ~1.6k | Automated safety check: Pass | Apache-2.0 | |
| PR Review Provideryansongda/pay | 5.4k | — | ~2.4k | Automated safety check: Pass | MIT |
novuhq/novu
Design notification workflows the Novu way — choose channels, set severity, decide when a workflow is critical, configure digests, and route based on subscriber state.
mikehasa/golive-skill
Take an agent-written app from repo to live production on the user's OWN accounts, with providers they choose (hosting, database, auth, payments, email, domain/DNS).
fossasia/eventyay
A skill your agent uses when building, modifying, or reviewing a Stripe App — or when the user describes something that implies one (e.g.
agentscope-ai/ReMe
钉钉消息发送技能。支持企业内部机器人(批量单聊/群聊)和 Webhook 自定义机器人两种接入方式,支持多机器人管理,支持文本、Markdown、链接、ActionCard、FeedCard等多种消息类型。
yansongda/pay
A skill your agent uses when reviewing PRs that add or modify a payment Provider in yansongda/pay - covers plugin pipeline, multi-tenant safety, signature verification, docs, and naming conventions.
kanchengw/cnllm
Guides Stripe integration decisions — API selection (Checkout Sessions vs PaymentIntents), Connect platform setup (Accounts v2, controller properties), billing/subscriptions, Treasury financial…
opsmill/infrahub
Analyzes recent CI failures on pull requests to identify flaky tests, using retry outcomes (failed attempt → green re-run) and cross-PR recurrence as evidence, and maintains a local longitudinal…
opsmill/infrahub
Audits internal (dev/) and external (docs/) documentation completeness for a feature, subject, or set of existing docs, maps changes indicated by the user, across Infrahub's documentation layers…
opsmill/infrahub
Stages and commits the current changes onto a safe working branch, enforcing branch discipline and optionally pushing upstream.
opsmill/infrahub
A skill your agent uses when you've fixed a bug, added a feature, or made any user-facing change in a project that uses Towncrier and need to record it for the changelog — before committing or…
opsmill/infrahub
Turns a single feature idea, improvement, or bug into ONE well-structured GitHub issue.
opsmill/infrahub
Synthesises the current conversation context into a Product Requirements Document and publishes it to GitHub (as a comment on a referenced issue, or a new issue).
Works with
Categories
Migrate Infrahub docs feature pages from the legacy topic+guide pair into a cleaner structure (single merged page, hub+spokes, or tutorial extraction). Migrate Feature Page is an agent skill from opsmill/infrahub. Migrate Infrahub docs feature pages from the legacy topic+guide pair into a cleaner structure (single merged page, hub+spokes, or tutorial extraction).
Migrate Feature Page fits situations like: the user names a specific feature; section to migrate (e.g.
Run `npx skills add opsmill/infrahub --skill migrate-feature-page -a claude-code`. Or copy the skill folder (.agents/skills/migrate-feature-page in opsmill/infrahub) into .claude/skills/migrate-feature-page in your project. Claude Code loads it when a task matches its description.
Run `npx skills add opsmill/infrahub --skill migrate-feature-page -a codex`. Or copy the skill folder (.agents/skills/migrate-feature-page in opsmill/infrahub) into .agents/skills/migrate-feature-page in your project. Codex loads it when a task matches its description.
Cursor, Gemini CLI, GitHub Copilot and OpenCode also load SKILL.md folders. With the skills CLI, run `npx skills add opsmill/infrahub --skill migrate-feature-page -a cursor` (or -a gemini-cli, github-copilot or opencode for the others). To copy it by hand, put the folder in .cursor/skills/migrate-feature-page, .gemini/skills/migrate-feature-page, .github/skills/migrate-feature-page and .opencode/skills/migrate-feature-page in your project.
Going by SKILL.md and its folder, Migrate Feature Page needs the command-line tools its instructions call (git, npm, uv, gh and brew). Our summary lists: Python 3.
SKILL.md names 3 domains. In commands or code: claude.com; the agent is likely to contact it when it follows the instructions. As links in the text: opsmill.atlassian.net and github.com. This is read from the text; nothing was executed.
Our automated static check of SKILL.md found no risky patterns, such as piping downloads into a shell, reading credential files or hidden Unicode. It is not a guarantee. Review the folder before installing.
Migrate Feature Page is published under the Apache-2.0 licence (the repository's licence). It allows redistribution, so the full SKILL.md is shown on this page.
About 8.5k tokens (SKILL.md is roughly 34k characters). Agents keep only the skill's name and description in context until a task matches; then they load SKILL.md in full.
Skills that share tags, products or a category with Migrate Feature Page: Novu Design Workflow (novuhq/novu, 40k stars), Golive (mikehasa/golive-skill, 1.2k stars), Stripe Apps (fossasia/eventyay, 1.7k stars) and Dingtalk Message (agentscope-ai/ReMe, 3.6k stars). The comparison table on this page puts their stars, adoption, token cost, safety result and licence side by side.
opsmill (a GitHub organization) maintains it in opsmill/infrahub, which has 529 GitHub stars. The repository holds 32 skills in this directory. The repository was last updated on October 7, 2026.
Source: opsmill/infrahub on GitHub. Facts on this page come from the repository at the commit we read; the author's words are quoted as theirs.