PluginBench
Skill
Pass
Audit score 90

indexion-readme

trkbt10/indexion-skills

Initialize, generate, and assemble project READMEs from templates, doc comments, and configuration.

What is indexion-readme?

Scaffolds README structure, generates per-package READMEs from doc comments, and assembles a root README from static prose and package docs via doc.json config. Use this to build and maintain documentation workflows for multi-package projects.

  • Initialize template structure and doc.json config for greenfield projects
  • Generate per-package README skeletons from source code doc comments (non-overwriting)
  • Assemble root README from static markdown files and per-package READMEs via doc.json
  • Plan writing tasks for README sections (optional LLM-assisted authoring)
  • Verify README edits with `plan drift` to detect unintended removals or large rewrites

How to install indexion-readme

npx skills add https://github.com/trkbt10/indexion-skills --skill indexion-readme
Prerequisites
  • Node.js and npx (to install the skill)
  • An existing project directory or willingness to initialize one with `doc init`
  • doc.json config file (at repo root or .indexion/readme/) or .indexion.toml with [doc] config_path
Claude Code
Cursor
Windsurf
Cline

How to use indexion-readme

  1. 1.Run `indexion doc init <project-dir>` to create .indexion/readme/template.md and doc.json (greenfield only)
  2. 2.Edit doc.json to declare package paths, output format, and root README section layout (static files, TOC, packages)
  3. 3.Run `indexion doc readme --per-package <paths>` to generate per-package README skeletons from doc comments
  4. 4.Hand-write prose sections (Overview, Usage, Examples) in each per-package README
  5. 5.Create static markdown files (docs/intro.md, docs/installation.md, etc.) referenced in doc.json
  6. 6.Run `indexion doc readme --config=doc.json` to assemble the root README
  7. 7.Run `indexion plan drift <before> <after>` to verify the change is purely additive (no silent deletions)

Use cases

Good for
  • Set up documentation scaffolding for a new multi-package project
  • Generate API skeleton READMEs for each command/package, then hand-write prose sections
  • Assemble a root README that combines intro, installation, per-package summaries, and license from separate markdown files
  • Detect accidental deletions or large rewrites in README updates via drift analysis
  • Maintain translated README pairs (e.g., README.md and README-ja.md) with cross-lingual drift detection
Who it's for
  • Project maintainers building documentation for multi-package repositories
  • Teams using doc comments as a source of truth for API documentation
  • Documentation authors who want to separate hand-written prose from generated content
  • CI/CD pipelines that need to verify README changes are purely additive

indexion-readme FAQ

Where should doc.json live?

Either at the repo root or under .indexion/readme/. You can also declare the path in .indexion.toml under [doc] config_path to make --config optional.

Will `doc readme --per-package` overwrite my existing per-package READMEs?

No, it is non-overwriting. Existing per-package READMEs are left alone. The skeleton is API-only (from doc comments) and meant as a starting point.

What is `plan drift` and when should I use it?

It detects unintended changes (removals, large rewrites) in README updates by comparing vocabulary and cosine similarity. Run it after regenerating or hand-editing the root README to verify only additive changes were made.

Can I use this for translated READMEs?

Yes. The same `plan drift` workflow applies to translated pairs (e.g., README.md and README-ja.md) with cross-lingual drift detection via natural-language KGFs.

What if the root README has rich per-command sections but `doc readme --config` produces only a table?

This is a known limitation: the current implementation does not expand per-package sections (overview, usage, etc.) inline when using `{ "type": "packages" }` in the root. Those rich sections are hand-maintained; diff the output to see what was generated vs. hand-written.

Full instructions (SKILL.md)

Source of truth, from trkbt10/indexion-skills.


name: indexion-readme description: README construction — initialize template structure, generate per-package READMEs from doc comments, plan writing tasks, assemble root README from docs/ and package READMEs via doc.json config, and verify edits with plan drift.

indexion readme — README Construction

Build project READMEs from templates, doc comments, hand-written prose, and per-package READMEs. This skill covers the construction side: scaffolding, generating, planning, assembling, and verifying. For evaluating existing documentation, see indexion-documentation.

Where things live

The conventions vary by project; check what actually exists before editing:

AssetLocation patterns seen
Configdoc.json (repo root) or .indexion/readme/doc.json
Per-package templatedocs/templates/readme.md (no SoT constant; declared via --template)
Static prosedocs/intro.md, docs/installation.md, docs/license.md, …
Per-package READMEscmd/<name>/README.md, src/<name>/README.md
Assembled root READMEusually README.md. Some projects use a .mbt.md suffix so the file is also a MoonBit doctest module — when so, README.md is a symlink to README.mbt.md.
.indexion.toml[doc] config_path / per_package auto-load doc.json

The first thing to check is git diff / ls -la for: a symlink on README.md, a doc.json (at root or under .indexion/readme/), and .indexion.toml. The presence of these tells you whether the README is hand-maintained, build-assembled, or a hybrid.

Workflow overview

doc init                      → .indexion/readme/template.md + doc.json (greenfield)
edit doc.json + docs/*.md     → declare sources of truth
doc readme --per-package      → cmd/<pkg>/README.md (API skeletons; non-overwriting)
hand-write each per-package README's Overview / Usage / Options / Examples
doc readme --config           → assembled root README
plan drift <prev> <new>       → verify the assembled output (or hand-edit) is purely additive

Step 1: Initialize (greenfield only)

indexion doc init <project-dir>

Creates .indexion/readme/template.md + .indexion/readme/doc.json. Skip this step on a project that already has doc.json or .indexion.toml pointing at one.

Step 2: Configure doc.json

{
  "$schema": "./schemas/doc-config.schema.json",
  "version": "1.0",
  "spec": "moonbit",
  "output": { "format": "markdown", "filename": "README.md" },
  "packages": [
    {
      "path": "cmd/<name>",
      "title": "<command name>",
      "include_in_root": true,
      "sections": ["overview", "usage"]
    }
    // …one entry per package that should appear in the assembled root README
  ],
  "root": {
    "output": "README.md",
    "sections": [
      { "type": "static",   "file": "docs/intro.md" },
      { "type": "toc",      "title": "Commands" },
      { "type": "packages", "filter": "cmd/**" },
      { "type": "static",   "file": "docs/installation.md" },
      { "type": "static",   "file": "docs/license.md" }
    ]
  }
}

Root section types:

  • static — include a markdown file verbatim
  • toc — insert a table-of-contents heading
  • packages — pull in entries from the packages array, filtered by glob

Package fields:

  • include_in_root — whether to include in the assembled root README
  • sections — README headings to extract; honored by per-package extraction flows. Note that { "type": "packages" } in the root currently emits a table of package links, not the rich Overview/Usage expansion implied by per-package sections. See "Known limitation" below.

Step 3: Generate per-package READMEs

indexion doc readme --per-package src/ cmd/

Generates README.md in each package directory that doesn't already have one. Non-overwriting — existing per-package READMEs are left alone.

The skeleton is API-only (extracted from /// doc comments via KGF). Treat it as a starting point and hand-write the prose sections (Overview, Usage, Options, Examples) afterwards.

# Single package to stdout
indexion doc readme src/kgf/lexer/

# Single package to a file
indexion doc readme -o=README.md src/kgf/lexer/

Note on side effects: doc readme --template=<t> <paths...> (the template-based mode below) walks the given paths and auto-creates per-package READMEs for any package that lacks one — even without --per-package. If you run it on a broad path (cmd/, src/), expect new files in unrelated packages. Run with a narrow path or grep git status afterwards to clean up unintended creations.

Step 4: Write static content

Create docs/intro.md, docs/installation.md, etc. — whatever your root.sections references. These are the hand-written prose; the assembler pulls them in verbatim.

Step 5: Generate writing plans (optional)

indexion plan readme --template=docs/templates/readme.md --plans-dir=.indexion/plans src/

Emits per-section writing tasks for manual or LLM-assisted authoring.

Step 6: Assemble the README

# Config-driven (preferred; doc.json controls layout and packages list)
indexion doc readme --config=doc.json

# Template-driven (alternative; {{include:…}} and {{packages}} placeholders)
indexion doc readme --template=docs/templates/readme.md -o=README.md cmd/

The config path can live at repo root or under .indexion/readme/. With .indexion.toml's [doc] config_path = "…", the --config= flag becomes optional.

Step 7: Verify with plan drift

After regeneration or any hand-edit of the root README, verify the change is purely additive (no silent deletions, no reflowing of unrelated sections):

# Snapshot the previous version
git show HEAD:README.md > /tmp/README.before.md

# Compare against the new version
indexion plan drift --top=20 /tmp/README.before.md README.md

What to look for in the output:

  • Drift terms in /tmp/README.before.md (missing on the other side): (none) — nothing was removed
  • Drift terms in README.md (missing on the other side): … — exactly the new vocabulary you intended to add (command names, new flags, new concepts)
  • Cosine similarity near 1.0 for a small additive change; substantially lower if you reshaped a section

For CI integration:

indexion plan drift --vocab-threshold=0.05 /tmp/README.before.md README.md
# exits 1 if cosine_distance > 0.05 — useful as a guard against accidental large rewrites

This same workflow applies to translated README pairs (README.mdREADME-ja.md): cross-lingual drift detection works natively because vocab sub-tokenization delegates to the natural-language KGFs in kgfs/natural/.

Template syntax

The template file supports {{placeholder}} substitution:

PlaceholderExpansion
{{include:path}}Contents of the file (relative to project root)
{{packages}}All discovered packages (filtered by CLI --include / --exclude)
{{module_doc}}Module-level documentation only

.indexion.toml integration

[doc]
config_path = "doc.json"   # auto-loads doc.json without --config
per_package = true         # makes `doc readme <path>` default to --per-package

Explicit --config=… always takes priority.

Known limitation: packages root section produces a table, not rich expansion

The doc-config.schema.json permits sections: ["overview", "usage", …] on each packageEntry, but the current doc readme --config implementation does not expand those sections inline when emitting { "type": "packages" } in the root. The output is a markdown table of package links with empty descriptions.

Two practical consequences:

  1. If the project's checked-in root README has rich per-command Overview / Usage paragraphs, they were not produced by doc readme --config as it stands now. They are hand-maintained. Diff doc readme --config -o=/tmp/regen.md against the checked-in README to see how much of it is hand-curated; very large diffs mean the README is mostly hand-maintained.
  2. For new commands, you currently need to also hand-edit the rich section into the assembled README, in addition to adding the package entry to doc.json and writing the per-package README. Use the plan drift verification above to confirm the hand-edit only adds, never removes.

If you fix this limitation (so { "type": "packages" } honors per-entry sections), update this skill to remove this section.

Common pitfalls

"doc readme --per-package generated nothing"

  • All packages already have READMEs. The command only creates new files, never overwrites. Delete existing READMEs first to regenerate.

"doc readme --template … on cmd/ created READMEs in packages I didn't touch"

  • Template mode auto-generates missing per-package READMEs as a side effect. Either pass a narrow path, or revert unintended creations from git status.

"Auto-generated per-package READMEs are just API listings"

  • By design. Hand-write Overview, Usage, Options, Examples. For CLI commands, the authoritative behavior comes from indexion <command> --help.

"My hand-edit to README.md will be wiped out by doc readme --config"

  • It will if the assembler ever produces the rich shape (see "Known limitation"). Until then, the assembler produces a strict subset (the table) and your hand-edits to the rich sections survive. Always run the plan drift cross-check to be sure.

"README.md edit destroyed unrelated sections"

  • Run plan drift HEAD:README.md README.md and look at the "missing on the other side" output for the previous version. If it lists anything other than (none), you removed content.