@@ -7,6 +7,14 @@ Check merged PRs in a product's source repo(s) for customer-facing changes. For
77directory to assess whether coverage already exists, is stale, or is missing entirely. Produce an actionable report,
88then optionally generate a doc draft.
99
10+ ## Setup
11+
12+ Before using this skill, configure it for your organization:
13+
14+ 1 . ** Update the product registry** below with your products, source repos, auth method, and local doc paths.
15+ 2 . ** Set auth environment variables** as needed (see Auth section below).
16+ 3 . ** Update the style guide reference** in step 7 to point to your own documentation style guide.
17+
1018## Invocation
1119
1220```
@@ -18,22 +26,20 @@ then optionally generate a doc draft.
1826
1927- ` status ` — show a summary table of all products and their last scan results, then exit. Does not fetch any PRs or
2028 update state. Regenerates ` STATUS.md ` from existing output files.
21- - ` <product> ` is one of: ` zrok ` , ` ziti-doc ` , ` zlan ` , ` k8s-on-prem-installations ` , ` platform-doc ` , ` zrok-connector `
29+ - ` <product> ` is a product name defined in your registry below
2230- ` --since ` overrides the last-checked date from state
23- - ` --draft <owner/repo#PR> ` skips the scan and generates a doc draft for a specific PR (e.g., ` --draft openziti/ziti#4821 ` )
31+ - ` --draft <owner/repo#PR> ` skips the scan and generates a doc draft for a specific PR
2432
2533## Product registry
2634
2735Each product has one or more ** source repos** (scanned for PRs) and one ** local doc path** (searched for coverage).
36+ Replace the example rows below with your own products.
2837
29- | Product | Source repos | Auth | Local doc path |
30- | ---------------------------| -------------------------------------------------------| -------------------| ---------------------------------------------------------|
31- | zrok | openziti/zrok | gh CLI (public) | /root/nf-docs/zrok/website/docs |
32- | ziti-doc | openziti/ziti, openziti/ziti-console | gh CLI (public) | /root/nf-docs/ziti-doc/docusaurus/docs |
33- | zlan | netfoundry/zlan | gh CLI (private) | /root/nf-docs/zlan/docusaurus/docs |
34- | k8s-on-prem-installations | netfoundry/k8s-on-prem-installations | BB_EMAIL+BB_TOKEN | /root/nf-docs/k8s-on-prem-installations/docusaurus/docs |
35- | platform-doc | netfoundry/netfoundry-ui, netfoundry/core-management, netfoundry/gateway, netfoundry/customer-connect * (in dev)* , netfoundry/integrations, netfoundry/network-auth | BB_EMAIL+BB_TOKEN | /root/nf-docs/platform-doc/docusaurus/docs |
36- | zrok-connector | netfoundry/zrok-connector | BB_EMAIL+BB_TOKEN | /root/nf-docs/zrok-connector/docusaurus/docs |
38+ | Product | Source repos | Auth | Local doc path |
39+ | ------------| -----------------------| --------------| ---------------------------------------|
40+ | product-a | your-org/repo-a | gh CLI | /path/to/product-a/docs |
41+ | product-b | your-org/repo-b | GH_TOKEN | /path/to/product-b/docs |
42+ | product-c | your-org/repo-c | BB_EMAIL+BB_TOKEN | /path/to/product-c/docs |
3743
3844** Note on source repos vs. doc repos** : The source repos are the * product code* repositories — that's where
3945customer-facing changes originate. The local doc path is a separate, locally cloned * documentation* repository used
@@ -45,16 +51,17 @@ Use with `BB_EMAIL` (the account's email address) as basic auth credentials.
4551
4652** GitHub auth** : Use the ` gh ` CLI. Run ` gh auth status ` to confirm it's authenticated before running a scan.
4753If ` gh ` is not available or the user explicitly requests token-based fallback, use a personal access token via
48- ` -H "Authorization: token $GH_TOKEN" ` in curl — but prefer ` gh ` .
54+ ` GH_TOKEN ` env variable in curl — but prefer ` gh ` . For private repos that require a specific token, set the
55+ token variable name in the Auth column of your registry and use ` GH_TOKEN=<your-token-variable> ` when calling ` gh ` .
4956
5057## State file
5158
5259State is stored at ` ~/.claude/doc-check-state.json ` . One entry per ** product** (not per source repo). Format:
5360
5461``` json
5562{
56- "zrok " : { "last_checked" : " 2026-03-20T15:00:00Z" },
57- "ziti-doc " : { "last_checked" : " 2026-03-25T17:00:00Z" }
63+ "product-a " : { "last_checked" : " 2026-03-20T15:00:00Z" },
64+ "product-b " : { "last_checked" : " 2026-03-25T17:00:00Z" }
5865}
5966```
6067
@@ -103,30 +110,21 @@ Filter results in Python to PRs where `mergedAt` is after the since date (when d
103110``` bash
104111# Date-based:
105112curl -s -u " $BB_EMAIL :$BB_TOKEN " \
106- " https://api.bitbucket.org/2.0/repositories/netfoundry /<slug>/pullrequests?state=MERGED&sort=-updated_on&pagelen=50"
113+ " https://api.bitbucket.org/2.0/repositories/<your-org> /<slug>/pullrequests?state=MERGED&sort=-updated_on&pagelen=50"
107114
108115# First run: fetch last 5 only
109116curl -s -u " $BB_EMAIL :$BB_TOKEN " \
110- " https://api.bitbucket.org/2.0/repositories/netfoundry /<slug>/pullrequests?state=MERGED&sort=-updated_on&pagelen=5"
117+ " https://api.bitbucket.org/2.0/repositories/<your-org> /<slug>/pullrequests?state=MERGED&sort=-updated_on&pagelen=5"
111118```
112119
113120Filter to PRs where ` updated_on ` is after the since date (when date-based).
114121
115122** When a product has multiple source repos** , collect all results into one list, then apply the 10-PR hard cap to the
116123combined total (most recent first across repos). In the report, prefix each PR with its source repo:
117- ` openziti/ziti#4821 ` , ` openziti/ziti-console#512 ` , etc.
118-
119- ** Special case — ` netfoundry/netfoundry-ui ` ** : This is a monorepo hosting both the NF Console UI (V7/V8) and the
120- Frontdoor UI. When scanning it, read the PR title, description, and diff to determine which product it belongs to
121- before assessing doc coverage:
122-
123- - PRs touching Frontdoor UI code → cross-reference against ` zrok-connector/docusaurus/docs `
124- - PRs touching NF Console UI code → cross-reference against ` platform-doc/docusaurus/docs `
125- - PRs touching shared infrastructure (build tooling, design system, auth scaffolding) → mark as ** internal**
124+ ` your-org/repo-a#42 ` , ` your-org/repo-b#17 ` , etc.
126125
127- When running ` /doc-check platform-doc ` , skip any ` netfoundry-ui ` PRs that are clearly Frontdoor-only — note them in
128- the report as "Skipped (Frontdoor — run ` /doc-check zrok-connector ` )". When running ` /doc-check zrok-connector ` ,
129- apply the same logic in reverse.
126+ ** Monorepos** : If a source repo hosts multiple products, read the PR title, description, and diff to determine which
127+ product it belongs to before assessing doc coverage. Mark PRs for other products as skipped with a note.
130128
131129### 3. Assess each PR: customer-facing or internal?
132130
@@ -145,7 +143,7 @@ response (fields `source.commit.hash` and `destination.commit.hash`) and constru
145143
146144``` bash
147145curl -s -u " $BB_EMAIL :$BB_TOKEN " \
148- " https://api.bitbucket.org/2.0/repositories/netfoundry /<slug>/diff/netfoundry /<slug>:<src_hash>%0D<dst_hash>?from_pullrequest_id=<id>&topic=true"
146+ " https://api.bitbucket.org/2.0/repositories/<your-org> /<slug>/diff/<your-org> /<slug>:<src_hash>%0D<dst_hash>?from_pullrequest_id=<id>&topic=true"
149147```
150148
151149Mark as ** customer-facing** (proceed to step 4) if the diff contains:
@@ -190,30 +188,30 @@ Dismiss **covered** PRs from the flagged list entirely (move them to a "no actio
190188### 5. Output the report
191189
192190```
193- ## doc-check: ziti-doc (since 2026-03-18)
191+ ## doc-check: product-a (since 2026-03-18)
194192
195- Sources: openziti/ziti (6 PRs), openziti/ziti-console (4 PRs) — 10 total · 2 need doc work · 1 already covered · 7 skipped (internal)
193+ Sources: your-org/repo-a (6 PRs), your-org/repo-b (4 PRs) — 10 total · 2 need doc work · 1 already covered · 7 skipped (internal)
196194
197195### Needs doc work
198196
199- **openziti/ziti#4821 — Add --output flag to ziti edge list ** (merged 2026-03-20) · MISSING
200- - New `--output json|yaml|table` flag on all `ziti edge list` subcommands
197+ **your-org/repo-a#42 — Add --output flag to CLI ** (merged 2026-03-20) · MISSING
198+ - New `--output json|yaml|table` flag on all list subcommands
201199- No existing doc found for output formatting options
202200- Suggested location: reference/cli section
203- - `/doc-check ziti-doc --draft openziti/ziti#4821 ` to generate a draft
201+ - `/doc-check product-a --draft your-org/repo-a#42 ` to generate a draft
204202
205- **openziti/ziti-console#512 — Dark mode toggle** (merged 2026-03-19) · STALE
206- - New dark/light mode toggle in ZAC settings panel
207- - Existing doc: `reference/zac -overview.md` — covers UI layout but not appearance settings
208- - `/doc-check ziti-doc --draft openziti/ziti-console#512 ` to generate a draft
203+ **your-org/repo-b#17 — Dark mode toggle** (merged 2026-03-19) · STALE
204+ - New dark/light mode toggle in settings panel
205+ - Existing doc: `reference/ui -overview.md` — covers UI layout but not appearance settings
206+ - `/doc-check product-a --draft your-org/repo-b#17 ` to generate a draft
209207
210208### Already covered
211- - openziti/ziti#4815 — TLS cert rotation: `operations/certificates.md` covers this area and appears current
209+ - your-org/repo-a#38 — TLS cert rotation: `operations/certificates.md` covers this area and appears current
212210
213211### Skipped (internal)
214- - openziti/ziti#4818 — Fix race condition in router reconnect (internal bug fix)
215- - openziti/ziti#4816 — Go 1.22 bump (build tooling)
216- - openziti/ziti-console#509 — Cypress test updates (tests only)
212+ - your-org/repo-a#40 — Fix race condition in reconnect logic (internal bug fix)
213+ - your-org/repo-a#39 — Go 1.22 bump (build tooling)
214+ - your-org/repo-b#15 — Cypress test updates (tests only)
217215```
218216
219217### 6. Offer to draft
@@ -230,11 +228,10 @@ When `--draft <owner/repo#PR>` is passed:
2302283 . If the status was ** missing** , write a new file from scratch
2312294 . Identify what changed from a user perspective
2322305 . Determine the appropriate doc type (how-to, reference, concept explanation) using Diátaxis
233- 6 . Write the draft following the NetFoundry style guide:
231+ 6 . Write the draft following your organization's documentation style guide:
234232 - Sentence-style headers; imperative verb phrases for how-to titles
235- - Active voice, "you/your", no "please"
233+ - Active voice, second person ( "you/your")
236234 - Backticks for CLI flags, commands, config keys, code tokens
237- - Short descriptive alt text for images (no underscores, no filenames as alt text)
238235 - 120-character line length limit
2392367 . Present the full draft inline in the terminal, followed by the suggested file path, then prompt the user with these
240237 options:
@@ -249,13 +246,13 @@ When `--draft <owner/repo#PR>` is passed:
249246
250247#### Drafts folder
251248
252- Drafts are saved to ` output/<product>/drafts/ ` under the doc-check output directory :
249+ Drafts are saved to ` output/<product>/drafts/ ` under the doc-check skill folder :
253250
254251```
255- /root/nf-docs/.claude/ skills/doc-check/output/<product>/drafts/<repo>-<PR>-<slug>.md
252+ < skills-dir> /doc-check/output/<product>/drafts/<repo>-<PR>-<slug>.md
256253```
257254
258- Example: ` output/platform-doc /drafts/netfoundry-ui-2479-download-usage-report .md `
255+ Example: ` output/product-a /drafts/repo-a-42-add-output-flag .md `
259256
260257Each draft file includes a frontmatter block for traceability:
261258
@@ -275,7 +272,7 @@ for the product that was checked (one entry per product, shared across all its s
275272### 9. Save output
276273
277274After completing a scan (not ` --draft ` mode), save the full report to a dated file in a per-product subdirectory
278- under ` /root/nf-docs/.claude/ skills/doc-check/output/<product>/` . Create the directory if it doesn't exist.
275+ under ` < skills-dir> /doc-check/output/<product>/` . Create the directory if it doesn't exist.
279276
280277Filename format: ` YYYY-MM-DD.md ` (use today's date). If a file with that name already exists, append a counter:
281278` YYYY-MM-DD-2.md ` , etc.
@@ -288,10 +285,10 @@ Write the report in the same markdown format shown in step 5, with a one-line he
288285
289286### 10. Update STATUS.md
290287
291- After saving the report, regenerate ` STATUS.md ` at the root of the skills/ doc-check folder:
288+ After saving the report, regenerate ` STATUS.md ` at the root of the doc-check skill folder:
292289
293290```
294- /root/nf-docs/.claude/ skills/doc-check/STATUS.md
291+ < skills-dir> /doc-check/STATUS.md
295292```
296293
297294To build it, scan the output directory for all products. For each product subdirectory, find the most recent dated
@@ -303,21 +300,18 @@ report file and parse it for:
303300- ** Skipped** : count of PRs in the "Skipped (internal)" section
304301
305302Produce a table sorted by last-checked date descending (most recently checked first), followed by any products in the
306- registry that have no output yet (listed as "Never run "):
303+ registry that have no output yet (listed as "never "):
307304
308305``` markdown
309306# Doc coverage status
310307
311308Last updated: YYYY-MM-DD
312309
313- | Product | Last checked | Needs work | Covered | Skipped |
314- | :--------------------------| :-------------| :-----------| :--------| :--------|
315- | zrok | 2026-04-06 | 2 | 1 | 5 |
316- | platform-doc | 2026-04-01 | 0 | 3 | 8 |
317- | ziti-doc | 2026-03-25 | 1 | 2 | 6 |
318- | zlan | never | — | — | — |
319- | k8s-on-prem-installations | never | — | — | — |
320- | zrok-connector | never | — | — | — |
310+ | Product | Last checked | Needs work | Covered | Skipped |
311+ | :----------| :-------------| :-----------| :--------| :--------|
312+ | product-a | 2026-04-06 | 2 | 1 | 5 |
313+ | product-b | 2026-04-01 | 0 | 3 | 8 |
314+ | product-c | never | — | — | — |
321315```
322316
323317Overwrite ` STATUS.md ` completely on each run — it is always regenerated from the output files, never manually edited.
0 commit comments