Generates index.md files listing .md documentation. Pure navigation — what exists and where. No code files. Triggers on "index", "catalog", "build index".
Scanned 2/12/2026
Install via CLI
openskills install BellaBe/lean-os---
name: sys-indexing-directories
description: Generates index.md files listing .md documentation. Pure navigation — what exists and where. No code files. Triggers on "index", "catalog", "build index".
license: Complete terms in LICENSE.txt
allowed-tools: Read Grep Glob
---
# Directory Indexer
Generate or update index.md files — yellow pages for directories.
## Principles
1. **List what exists** — Names and links only
2. **No judgment** — No status, flags, or inference
3. **Hierarchical nav** — ↑ parent · → related
4. **Docs only** — No code files (separate code-mapper skill)
5. **Skip terminal directories** — No index.md in directories with no subdirectories
## Excludes
Directories: `node_modules`, `.git`, `.venv`, `__pycache__`, `src`, `lib`, `dist`, `build`, `vendor`
Files: `*.py`, `*.js`, `*.ts`, `*.jsx`, `*.tsx`, `*.go`, `*.rs`, `*.java`, `*.rb`, `*.php`, `*.c`, `*.cpp`, `*.h`, `*.css`, `*.scss`, `*.json`, `*.yaml`, `*.yml`, `*.toml`, `*.lock`, `*.sum`
## Directory Types
| Pattern | Subdirs |
|---------|---------|
| `artifacts/` | sales, marketing, engineering, operations, etc |
| `docs/` | references, workflows, etc |
| `meeting-notes/` | as found |
| `research/` | customer, market, etc |
| `strategy/` | canvas, goals, financial, etc |
| `threads/` | {domain}/{type}/{thread}/ — see Threads Structure |
| any other | as found |
## Threads Structure
```
threads/
├── index.md
├── marketing/
│ ├── index.md
│ └── {thread_name}/
│ ├── 1-input.md ← source for index entry (frontmatter)
│ ├── 2-hypothesis.md
│ ├── 3-implication.md
│ ├── 4-decision.md
│ ├── 5-actions.md
│ └── 6-learning.md ← NO index.md here
├── sales/
├── engineering/
└── operations/
```
**Rules:**
1. **Stop at 1-input.md** — If directory contains `1-input.md`, it's a thread leaf. Do NOT create index inside.
2. **Read 1-input.md** — Extract `thread_id` from frontmatter and first heading for parent index entry.
3. **Index at domain level** — `marketing/index.md` lists all threads under it.
**1-input.md frontmatter (source for index):**
```yaml
---
thread_id: marketing_content-authority_2026q1
goal_id: distribution-q1/1.content-authority
created: 2026-02-01
owner: mkt-content-manager
status: active
---
# Content Authority Execution
```
**Generated index (e.g., `marketing/index.md`):**
```markdown
# Marketing
- [content-authority_2026q1](./content-authority_2026q1/) — Content Authority Execution
↑ [Threads](../)
```
## Process
### 1. Scan
```bash
find {root} -type f -name "*.md" \
! -path "*/node_modules/*" \
! -path "*/.git/*" \
! -path "*/src/*" \
! -path "*/lib/*" \
! -path "*/dist/*" \
! -path "*/build/*" \
! -path "*/vendor/*"
```
### 2. Check for Terminal Directory
```
# Terminal = has NO subdirectories (only files)
# Do NOT create index.md in terminal directories
# Instead, parent index lists their contents under ## heading
if directory has subdirectories:
→ CREATE index.md (lists files + subdirs)
else:
→ SKIP index.md — parent will bubble up contents
```
### 3. Check for Thread Leaf
```bash
# If 1-input.md exists, this is a thread — do NOT index inside
if [ -f "{dir}/1-input.md" ]; then
# Skip — parent will index this via 1-input.md frontmatter
exit
fi
```
### 4. List
For .md files: `- [{name}](./{name}.md) — {snapshot}`
For non-terminal dirs: `- [{name}](./{name}/) — {snapshot}`
For terminal dirs: bubble up contents under `## {dir_name}` heading:
```markdown
## {dir_name}
- [{file}](./{dir_name}/{file}.md) — {snapshot}
```
For threads (has 1-input.md): read `thread_id` and first heading from 1-input.md
Description: first heading or first line — max 40 chars, truncate with `…`
### 5. Link Navigation
- `↑ [Parent](../)`
- `→ [Related](../related/)`
### 6. Recurse
For subdirs with content → generate index → link ↑↓
**Skip when:**
- Directory contains `1-input.md` (thread leaf)
- Directory has no subdirectories (terminal — contents bubbled up to parent)
## Output Format
```markdown
# {Directory Name}
- [{item}](./{item}/) — {snapshot}
- [{item}](./{item}.md) — {snapshot}
↑ [Parent](../)
```
## Examples
**Artifacts:**
```markdown
# Artifacts
## sales
- [q4-deck](./sales/q4-deck/) — Q4 investor pitch materials
- [prospects](./sales/prospects/) — Enterprise lead tracking
## engineering
- [auth-service](./engineering/auth-service/) — OAuth2 implementation
→ [Strategy](../strategy/) · [Threads](../threads/)
```
**Threads (domain level):**
```markdown
# Marketing
- [campaigns](./campaigns/) — Product launch campaigns
- [content](./content/) — Blog and social content
↑ [Threads](../)
```
**Threads (domain level — reads from 1-input.md):**
```markdown
# Marketing
- [content-authority_2026q1](./content-authority_2026q1/) — Content Authority Execution
- [github-organic_2026q1](./github-organic_2026q1/) — GitHub Organic Growth Execution
↑ [Threads](../)
```
**Strategy (canvas is terminal — files bubble up):**
```markdown
# Strategy
- [Goals](./goals/) — OKRs and milestones
## Canvas
- [00.mode](./canvas/00.mode.md) — Business Model Mode
- [01.context](./canvas/01.context.md) — Strategic Context (KBOS)
→ [Artifacts](../artifacts/)
```
## Boundaries
**Does:** List .md files, read 1-input.md for threads, generate links, build navigation
**Does NOT:**
- Index code files
- Create index inside thread dirs (with 1-input.md)
- Create index in terminal directories (no subdirs)
- Infer status or add judgment
## Error Handling
| Situation | Action |
|-----------|--------|
| Directory empty | Skip, no index needed |
| No .md files found | Create index listing subdirs only |
| 1-input.md malformed | Use directory name as fallback, warn |
| Circular symlinks | Skip symlinked directories |
| Permission denied | Skip directory, log warning |
| Existing index.md | Overwrite with fresh generation |
## References
- `references/patterns.md` — Detection patterns for directory types and navigation
- `references/templates.md` — Index.md templates per directory typeNo comments yet. Be the first to comment!