summaryrefslogtreecommitdiff
path: root/.github/copilot-instructions.md
blob: 30fa5800bbbe4ba092d84c59a9f46c5b1abd78fc (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
## VyOS Documentation Project

This is VyOS user documentation written in reStructuredText (RST) and built with Sphinx.

### Review Scope

When reviewing pull requests, only flag issues **introduced by the PR's changes**. Do not flag pre-existing issues in unchanged lines. Compare against the base branch to determine what was actually changed.

### RST Heading Hierarchy

All files must use this heading order:

```
##### (Title — one per file, with overline)
***** (Chapters)
===== (Sections)
----- (Subsections)
^^^^^ (Subsubsections)
""""" (Paragraphs)
```

### Line Length

Maximum 80 characters per line. Exception: content inside `.. code-block::` directives is **exempt** — they render with `<pre>` tags and preserve source formatting. Do not flag long lines inside code blocks.

### Linter Suppression Markers

`.. stop_vyoslinter` and `.. start_vyoslinter` are RST comments used to suppress CI linter checks. Key conventions:

- When used **inside an indented directive** (`.. cfgcmd::`, `.. opcmd::`, list items), markers should match the surrounding indentation to stay within the block.
- When used **at top level** (outside any directive), markers are placed at column 0.
- Both patterns exist in this repo. Do not flag either placement as incorrect.
- They must always appear in pairs (stop then start). A missing `start_vyoslinter` is a real issue.
- A `stop_vyoslinter` that covers a large section is acceptable when the content requires it (e.g., files full of real debug output with production IPs).

### IP Address Rules

The CI linter checks IP addresses. These are **allowed without suppression** — do not flag them:

- RFC 5737 documentation addresses: `192.0.2.0/24`, `198.51.100.0/24`, `203.0.113.0/24`
- RFC 3849 documentation IPv6: `2001:db8::/32`
- RFC 1918 private ranges: `10.0.0.0/8`, `172.16.0.0/12`, `192.168.0.0/16`
- Loopback (`127.0.0.0/8`), link-local (`169.254.0.0/16`), `0.0.0.0/0`

Real public IPs (e.g., `8.8.8.8`) require `stop/start_vyoslinter` suppression. Do not suggest replacing them with documentation addresses if the example intentionally uses real IPs.

### TODO Markers

`.. TODO::` directives serve two purposes in this repo:

1. **Tracking markers** on pages that need `cfgcmd`/`opcmd` conversion (these are intentionally added).
2. **Stale markers** on pages that already have full content (these should be removed).

A PR that removes some TODOs and adds others is not contradictory — the intent matters.

### VyOS Directives

- `.. cfgcmd::` for configuration mode commands
- `.. opcmd::` for operational mode commands
- Do not convert these to plain `.. code-block::` — they are tracked for command coverage.

### YAML in Code Blocks

Ansible playbook examples in `.. code-block::` use RST indentation (typically 4 spaces from the directive). The YAML indentation within the block may differ from standalone YAML files. Verify carefully before flagging YAML as invalid — count spaces from the code-block's own indentation base, not from column 0.

### Page Structure

Configuration pages follow this order: Theory, Configuration (cfgcmd), Examples, Known Issues, Debugging.

### Known False Positives

Do **not** flag the following — they have been verified as correct or intentional:

- **Markdown tables rendering with `||`**: Diff views may show table pipes as double-pipes. Check the raw source file before flagging.
- **`stop/start_vyoslinter` at column 0 inside directives**: This is one of two accepted patterns. The other is indented markers matching the directive. Both are valid.
- **RFC 1918 addresses without linter suppression**: Private IPs (`10.x`, `172.16.x`, `192.168.x`) are allowed. Do not suggest adding `stop/start_vyoslinter` around them.
- **Long lines inside `.. code-block::`**: Code blocks are exempt from the 80-character line limit.
- **Pre-existing typos or grammar issues in unchanged lines**: Only flag issues introduced by the current PR's diff. If a typo exists on an unchanged line, it is out of scope.
- **Ansible YAML indentation in RST code blocks**: YAML inside `.. code-block::` is indented relative to the directive, not column 0. Verify from the code-block's indentation base before flagging as invalid.
- **Adding `.. TODO::` while removing others**: Tracking TODOs on pages needing `cfgcmd` conversion is intentional. Removing stale TODOs on completed pages is also intentional. Both can happen in the same PR.