# Sys Indexing Directories

> Generates index.md files listing .md documentation. Pure navigation — what exists and where. No code files. Triggers on "index", "catalog", "build index".

- Skill: `tools-only/sys-indexing-directories` (Agent Skill, multi-file: 3 files)
- Install (CLI): `npx skillmds add tools-only/sys-indexing-directories`
- Raw SKILL.md: https://api.skillmd.com/api/skills/tools-only/sys-indexing-directories/raw
- Safety review: pending
- Works with: Claude Code, Claude.ai, OpenAI Codex
- Category: Docs & Writing
- License: Complete terms in LICENSE.txt
- Author: tools-only (https://skillmd.com/u/tools-only)
- Updated: 2026-09-09
- Page: https://skillmd.com/skills/tools-only/sys-indexing-directories

---


# 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 type
