Skip to content

Commit 27eed50

Browse files
feat(docs): polish pass 1 — nav order, robust release macro, internal helpers
- docs/.pages: explicit nav order (Home -> Getting started -> Guides -> Reference -> Architecture -> Contributing -> Release notes), with ... fallback - docs/architecture/.pages: order handwritten pages first, internal-helpers last - homepage.py: latest_release() reads release notes from disk (docs-build/generated/release-notes/) instead of calling gh api at build time. Removes runtime dependency on gh CLI + GH_TOKEN - workflow: generate Internal scope reference into docs/architecture/internal-helpers/, drop GH_TOKEN from Build site step - gitignore: docs/architecture/internal-helpers/
1 parent 12efc9b commit 27eed50

5 files changed

Lines changed: 87 additions & 16 deletions

File tree

.github/workflows/docs.yml

Lines changed: 11 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -62,6 +62,14 @@ jobs:
6262
-OutputPath ./docs-build/generated/reference `
6363
-Scope Public
6464
65+
- name: Build reference (internal helpers)
66+
shell: pwsh
67+
run: |
68+
./scripts/Build-PlatyPSReference.ps1 `
69+
-ModulePath ./PowerNetbox.psd1 `
70+
-OutputPath ./docs-build/generated/architecture/internal-helpers `
71+
-Scope Internal
72+
6573
- name: Build release notes
6674
shell: pwsh
6775
env:
@@ -76,14 +84,13 @@ jobs:
7684
# reference/common-parameters.md (Task 17). Same selective pattern used
7785
# in local dev verification.
7886
for d in docs/reference/*/; do rm -rf "$d"; done
79-
rm -rf docs/release-notes
80-
mkdir -p docs/reference docs/release-notes
87+
rm -rf docs/release-notes docs/architecture/internal-helpers
88+
mkdir -p docs/reference docs/release-notes docs/architecture/internal-helpers
8189
cp -r docs-build/generated/reference/. docs/reference/
8290
cp -r docs-build/generated/release-notes/. docs/release-notes/
91+
cp -r docs-build/generated/architecture/internal-helpers/. docs/architecture/internal-helpers/
8392
8493
- name: Build site
85-
env:
86-
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
8794
run: |
8895
cd docs-build
8996
mkdocs build --strict

.gitignore

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -80,3 +80,4 @@ docs/reference/Plugins/
8080
docs/superpowers/plans/
8181
docs/superpowers/specs/
8282
docs/release-notes/
83+
docs/architecture/internal-helpers/

docs-build/macros/homepage.py

Lines changed: 57 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,22 @@
11
"""Homepage macros: cmdlet count, latest release, compat table."""
22

3-
import json
43
import re
5-
import subprocess
64
from pathlib import Path
75

86

97
# Resolve PowerNetbox.psd1 relative to this file's location, not CWD.
108
# docs-build/macros/homepage.py -> docs-build/macros -> docs-build -> worktree root
119
PSD1_PATH = Path(__file__).parent.parent.parent / "PowerNetbox.psd1"
1210

11+
# Release notes live in docs-build/generated/release-notes/ (CI-generated) or
12+
# fall back to docs/release-notes/ (already-merged copy).
13+
_WORKTREE_ROOT = Path(__file__).parent.parent.parent
14+
_GENERATED_RELEASE_DIR = _WORKTREE_ROOT / "docs-build" / "generated" / "release-notes"
15+
_DOCS_RELEASE_DIR = _WORKTREE_ROOT / "docs" / "release-notes"
16+
17+
_VERSION_RE = re.compile(r"^\d+\.\d+\.\d+(\.\d+)?\.md$")
18+
_RELEASED_RE = re.compile(r"^Released (\d{4}-\d{2}-\d{2})\b")
19+
1320

1421
def _count_public_cmdlets() -> int:
1522
"""Count Verb-NB* entries in the FunctionsToExport block of the psd1."""
@@ -19,19 +26,57 @@ def _count_public_cmdlets() -> int:
1926
return len(entries)
2027

2128

29+
def _parse_version(filename: str) -> tuple:
30+
"""Return a tuple of ints for semver sorting from a filename like '4.5.8.1.md'."""
31+
stem = filename[:-3] # strip .md
32+
return tuple(int(x) for x in stem.split("."))
33+
34+
2235
def _fetch_latest_release() -> dict | None:
23-
"""Call `gh api ...releases/latest` and return parsed JSON, or None on failure."""
24-
try:
25-
out = subprocess.check_output(
26-
["gh", "api", "repos/ctrl-alt-automate/PowerNetbox/releases/latest"],
27-
text=True,
28-
stderr=subprocess.DEVNULL,
29-
timeout=30,
30-
)
31-
return json.loads(out)
32-
except Exception:
36+
"""Read the newest release note from disk and return a dict matching the old
37+
GitHub API shape: {tag_name, published_at, body}. Returns None on failure."""
38+
# Prefer the CI-generated directory; fall back to docs/release-notes/
39+
release_dir = None
40+
for candidate in (_GENERATED_RELEASE_DIR, _DOCS_RELEASE_DIR):
41+
if candidate.is_dir():
42+
release_dir = candidate
43+
break
44+
45+
if release_dir is None:
3346
return None
3447

48+
version_files = [f.name for f in release_dir.iterdir() if _VERSION_RE.match(f.name)]
49+
if not version_files:
50+
return None
51+
52+
# Sort descending by semver and pick the newest
53+
latest_filename = sorted(version_files, key=_parse_version, reverse=True)[0]
54+
version = latest_filename[:-3] # strip .md
55+
56+
text = (release_dir / latest_filename).read_text(encoding="utf-8")
57+
lines = text.splitlines()
58+
59+
# Find the "Released YYYY-MM-DD" line
60+
date = "unknown"
61+
body_start = 0
62+
for i, line in enumerate(lines):
63+
m = _RELEASED_RE.match(line)
64+
if m:
65+
date = m.group(1)
66+
body_start = i + 1
67+
break
68+
69+
# Everything after the Released line is the body (skip leading blank lines)
70+
body_lines = lines[body_start:]
71+
while body_lines and not body_lines[0].strip():
72+
body_lines = body_lines[1:]
73+
74+
return {
75+
"tag_name": f"v{version}",
76+
"published_at": f"{date}T00:00:00Z",
77+
"body": "\n".join(body_lines),
78+
}
79+
3580

3681
def register_homepage(env):
3782
"""Register homepage macros with the mkdocs-macros env."""

docs/.pages

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
nav:
2+
- index.md
3+
- getting-started
4+
- guides
5+
- reference
6+
- architecture
7+
- contributing
8+
- release-notes
9+
- ...

docs/architecture/.pages

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
nav:
2+
- overview.md
3+
- function-naming.md
4+
- error-handling.md
5+
- parameter-conventions.md
6+
- functions-map.md
7+
- helpers-map.md
8+
- graphql-internals.md
9+
- internal-helpers

0 commit comments

Comments
 (0)