From fde568bdfbbbe97754c7f6674865e6f11cdac55a Mon Sep 17 00:00:00 2001
From: Carlos Brandt <carloshenriquebrandt@gmail.com>
Date: Wed, 24 Jan 2024 16:07:09 +0100
Subject: [PATCH 1/2] Implement GH workflow to compile list of projects docs
 issues

---
 .github/workflows/documentation_issues.yml    |  40 ++++
 README.md                                     |   7 +
 workflows/documentation_issues.md             | 108 +++++++++
 .../documentation_issues/fetch_issues.py      | 219 ++++++++++++++++++
 workflows/documentation_issues/issues.csv     | 107 +++++++++
 workflows/documentation_issues/repos.txt      |  10 +
 6 files changed, 491 insertions(+)
 create mode 100644 .github/workflows/documentation_issues.yml
 create mode 100644 workflows/documentation_issues.md
 create mode 100644 workflows/documentation_issues/fetch_issues.py
 create mode 100644 workflows/documentation_issues/issues.csv
 create mode 100644 workflows/documentation_issues/repos.txt

diff --git a/.github/workflows/documentation_issues.yml b/.github/workflows/documentation_issues.yml
new file mode 100644
index 0000000..83657de
--- /dev/null
+++ b/.github/workflows/documentation_issues.yml
@@ -0,0 +1,40 @@
+name: Query subprojects documentation issues
+
+on:
+  schedule:
+    - cron: '5 5 * * *'  # Runs daily at 5:05am UTC
+
+  workflow_dispatch:
+
+
+jobs:
+  query-issues:
+    runs-on: ubuntu-latest
+    permissions:
+      contents: write
+
+    steps:
+    - name: Checkout Repository
+      uses: actions/checkout@v4
+
+    - name: Set up Python
+      uses: actions/setup-python@v5
+      with:
+        python-version: '3.x'
+
+    - name: Install Dependencies
+      run: |
+        pip install requests
+
+    - name: Fetch Documentation Issues
+      run: |
+        cd workflows/documentation_issues
+        python fetch_issues.py --write-md ../documentation_issues.md
+
+    - name: Commit and Push if Changes Exist
+      run: |
+        git config --global user.name 'GitHub Action'
+        git config --global user.email 'action@github.com'
+        git add .
+        git diff --staged --quiet || git commit -m "Update documentation issues"
+        git push
diff --git a/README.md b/README.md
index a3eadc0..a152aef 100644
--- a/README.md
+++ b/README.md
@@ -38,3 +38,10 @@ Read more about the Docs Working Group's founding (and related discussions) at t
 - Discussion in Jupyter/Governance where to place the workgroup: https://github.com/jupyter/governance/issues/184
 - Ping JupyterHub community: https://github.com/jupyterhub/mybinder.org-deploy/issues/2732 & https://github.com/jupyterhub/team-compass/issues/681
 - Ping Jupyter/Jupyter community: https://github.com/jupyter/jupyter/issues/699
+
+## Sub-projects `documentation` issues
+
+Currently open 'documentation' issues in Jupyter subprojects repositories:
+
+- [Documentation issues](workflows/documentation_issues.md)
+
diff --git a/workflows/documentation_issues.md b/workflows/documentation_issues.md
new file mode 100644
index 0000000..4e18427
--- /dev/null
+++ b/workflows/documentation_issues.md
@@ -0,0 +1,108 @@
+|repo|number|title|url|
+|---|---|---|---|
+|jupyter/jupyter|683|Add persona centric docs|https://github.com/jupyter/jupyter/issues/683|
+|jupyter/jupyter|667|Use excalidraw for our manually-created diagrams|https://github.com/jupyter/jupyter/issues/667|
+|jupyter/jupyter|657|Refactor the documentation to use the main branch|https://github.com/jupyter/jupyter/issues/657|
+|jupyter/jupyter|620|A11y - Jupyter logo does not have enough contrast in dark mode|https://github.com/jupyter/jupyter/issues/620|
+|jupyter/jupyter|581|Why have an Advanced Topics section when there is only one "topic?"|https://github.com/jupyter/jupyter/issues/581|
+|jupyter/jupyter|511|Anyone want to help with a round of documentation improvements?|https://github.com/jupyter/jupyter/issues/511|
+|jupyter/jupyter|430|Translating Official Documentation to Spanish|https://github.com/jupyter/jupyter/issues/430|
+|jupyter/jupyter|424|Notebook server API documentation lacks information about trust|https://github.com/jupyter/jupyter/issues/424|
+|jupyter/jupyter|412|Some things we can improve in the documentation|https://github.com/jupyter/jupyter/issues/412|
+|jupyter/jupyter|306|Create a man page|https://github.com/jupyter/jupyter/issues/306|
+|jupyter/jupyter|242|Document JSON config format|https://github.com/jupyter/jupyter/issues/242|
+|jupyter/jupyter|220|Glossary in docs|https://github.com/jupyter/jupyter/issues/220|
+|jupyter/jupyter|216|Review top-level docs for prospective kernel authors|https://github.com/jupyter/jupyter/issues/216|
+|jupyter/jupyter|190|Citing Jupyter|https://github.com/jupyter/jupyter/issues/190|
+|jupyter/jupyter|159|[docs/theme] Pay attention to the "width" of screenshot.|https://github.com/jupyter/jupyter/issues/159|
+|jupyter/jupyter|137|Too many documentation kill the documentation ?|https://github.com/jupyter/jupyter/issues/137|
+|jupyter/jupyter|128|Create a developer guide - action item from dev mtg|https://github.com/jupyter/jupyter/issues/128|
+|jupyter/jupyter|109|Link to dev-install from Install section.|https://github.com/jupyter/jupyter/issues/109|
+|jupyter/jupyter|66|[Docs] list supported mimetype |https://github.com/jupyter/jupyter/issues/66|
+|jupyter/jupyter|51|Create a better way to manage subproject docs|https://github.com/jupyter/jupyter/issues/51|
+|jupyter/notebook|7149|Provide access to the documentation for older version|https://github.com/jupyter/notebook/issues/7149|
+|jupyter/notebook|7148|Installation guide (android, termux)|https://github.com/jupyter/notebook/issues/7148|
+|jupyter/notebook|7029|Add guidelines for setting up development environment using yarn and npm in CONTRIBUTING.md|https://github.com/jupyter/notebook/issues/7029|
+|jupyter/notebook|7015|Missing notebook.auth submodule?|https://github.com/jupyter/notebook/issues/7015|
+|jupyter/notebook|6987|JN 7 → Code Folding starts at the first line regardless the type|https://github.com/jupyter/notebook/issues/6987|
+|jupyter/notebook|6981|Rework Notebook 7 docs accessibility section|https://github.com/jupyter/notebook/issues/6981|
+|jupyter/notebook|6891|`@web.authenticated` decorator with IPythonHandler is not working on nbclassic|https://github.com/jupyter/notebook/issues/6891|
+|jupyter/notebook|6875|Get versioned Notebook framework trove classifiers on PyPI|https://github.com/jupyter/notebook/issues/6875|
+|jupyter/notebook|6849|Revise `pyzmq` requirements in documentation|https://github.com/jupyter/notebook/issues/6849|
+|jupyter/notebook|6848|Very poor navigation in new readthedocs builds|https://github.com/jupyter/notebook/issues/6848|
+|jupyter/notebook|6680|Add a large deprecation notice to the front-end extensions documentation|https://github.com/jupyter/notebook/issues/6680|
+|jupyter/notebook|6659|Document .ipynb_checkpoints directory|https://github.com/jupyter/notebook/issues/6659|
+|jupyter/notebook|6644|Updates to the contributor.rst file and addition of CONFIGURATION.md file|https://github.com/jupyter/notebook/pull/6644|
+|jupyter/notebook|6486|feature request: add run buttons like ipynb extension for vscode|https://github.com/jupyter/notebook/issues/6486|
+|jupyter/notebook|4304|Running `jupyter notebook` opens visual studio code, not a browser|https://github.com/jupyter/notebook/issues/4304|
+|jupyter/notebook|4178|Buttons don't show up properly in Sphinx docs|https://github.com/jupyter/notebook/issues/4178|
+|jupyter/notebook|3550|Add faq entry about installing on python without sqlite extensions|https://github.com/jupyter/notebook/issues/3550|
+|jupyter/notebook|1744|Safari can't connect to kernel|https://github.com/jupyter/notebook/issues/1744|
+|jupyter/notebook|1643|Run cells from script or the command line?|https://github.com/jupyter/notebook/issues/1643|
+|jupyter/notebook|1473|Translating notebook contents|https://github.com/jupyter/notebook/issues/1473|
+|jupyter/notebook|916|File save hooks—docs & question|https://github.com/jupyter/notebook/issues/916|
+|jupyter/notebook|811|Internal links / references to outputs|https://github.com/jupyter/notebook/issues/811|
+|jupyter/notebook|788|Add a doc page for tips on using Spark|https://github.com/jupyter/notebook/issues/788|
+|jupyter/notebook|660|Update public server document with troubleshooting and additional resources|https://github.com/jupyter/notebook/issues/660|
+|jupyterhub/jupyterhub|4682|Note that you can throw a 403 from check_allowed|https://github.com/jupyterhub/jupyterhub/pull/4682|
+|jupyterhub/jupyterhub|4673|Document / better support for separating user domains from the Hub domain|https://github.com/jupyterhub/jupyterhub/issues/4673|
+|jupyterhub/jupyterhub|4669|try redocly for REST API|https://github.com/jupyterhub/jupyterhub/issues/4669|
+|jupyterhub/jupyterhub|4656|FastAPI service example - Authorization header not sent in subsequent requests|https://github.com/jupyterhub/jupyterhub/issues/4656|
+|jupyterhub/jupyterhub|4653|Minor broken docs: reference to wiki|https://github.com/jupyterhub/jupyterhub/issues/4653|
+|jupyterhub/jupyterhub|4610|Better documentation on how to customize the home page|https://github.com/jupyterhub/jupyterhub/issues/4610|
+|jupyterhub/jupyterhub|4253|docs: simplify api docs generation for comparison|https://github.com/jupyterhub/jupyterhub/pull/4253|
+|jupyterhub/jupyterhub|4252|docs: classes generated docs sometimes include non-traits members, and sometimes do|https://github.com/jupyterhub/jupyterhub/issues/4252|
+|jupyterhub/jupyterhub|4241|More documentation on the implications of `server.name`|https://github.com/jupyterhub/jupyterhub/issues/4241|
+|jupyterhub/jupyterhub|4213|`post_auth_hook` documentation update|https://github.com/jupyterhub/jupyterhub/issues/4213|
+|jupyterhub/jupyterhub|4203|PAM Authentication failed|https://github.com/jupyterhub/jupyterhub/issues/4203|
+|jupyterhub/jupyterhub|4200|Doc fix|https://github.com/jupyterhub/jupyterhub/pull/4200|
+|jupyterhub/jupyterhub|4197|Unaligned Text Blocks on JupyterHub REST API Page (Mobile View)|https://github.com/jupyterhub/jupyterhub/issues/4197|
+|jupyterhub/jupyterhub|4138|404 Error when try to "edit this page" on JupyterHub home page|https://github.com/jupyterhub/jupyterhub/issues/4138|
+|jupyterhub/jupyterhub|4108|I corrected errors and made an update to api-only.md|https://github.com/jupyterhub/jupyterhub/pull/4108|
+|jupyterhub/jupyterhub|3814|Update JupyterHub REST API permission examples with jupyterhub-idle-culler|https://github.com/jupyterhub/jupyterhub/issues/3814|
+|jupyterhub/jupyterhub|3801|Illustrate create() classmethod idea|https://github.com/jupyterhub/jupyterhub/pull/3801|
+|jupyterhub/jupyterhub|3710|Unify the documentation for idle-culler|https://github.com/jupyterhub/jupyterhub/issues/3710|
+|jupyterhub/jupyterhub|3684|More detailed docs on direct network interactions|https://github.com/jupyterhub/jupyterhub/issues/3684|
+|jupyterhub/jupyterhub|3313|Documentation of jupyterhub.dbutil and alembic revisions|https://github.com/jupyterhub/jupyterhub/issues/3313|
+|jupyterhub/jupyterhub|3113|Missing HTTP security headers|https://github.com/jupyterhub/jupyterhub/issues/3113|
+|jupyterhub/jupyterhub|3080|Add a documentation section describing the structure of this repository|https://github.com/jupyterhub/jupyterhub/issues/3080|
+|jupyterhub/jupyterhub|2855|Auto-generate docs for telemetry events|https://github.com/jupyterhub/jupyterhub/issues/2855|
+|jupyterhub/jupyterhub|2726|Jupyter(Hub) conceptual intro|https://github.com/jupyterhub/jupyterhub/pull/2726|
+|jupyterhub/jupyterhub|2593|Include the instruction `WorkingDirectory=/etc/jupyterhub` in system service Wiki|https://github.com/jupyterhub/jupyterhub/issues/2593|
+|jupyterhub/jupyterhub|2481|Include Debian package in documentation ? |https://github.com/jupyterhub/jupyterhub/issues/2481|
+|jupyterhub/jupyterhub|2134|Docs: Unclear / confusing DB upgrade instructions|https://github.com/jupyterhub/jupyterhub/issues/2134|
+|jupyterhub/jupyterhub|2049|Docs: Missing a chapter on monitoring / observability|https://github.com/jupyterhub/jupyterhub/issues/2049|
+|jupyterhub/jupyterhub|1310|Customize DockerHub documentation for JupyterHub|https://github.com/jupyterhub/jupyterhub/issues/1310|
+|jupyterlab/jupyterlab|15749|Improve documentation for `jupyter.lab.transform`|https://github.com/jupyterlab/jupyterlab/issues/15749|
+|jupyterlab/jupyterlab|15743|Add a link to postmortem for 3.6.7 release|https://github.com/jupyterlab/jupyterlab/pull/15743|
+|jupyterlab/jupyterlab|15724|Update maintainers affiliation|https://github.com/jupyterlab/jupyterlab/pull/15724|
+|jupyterlab/jupyterlab|15626|Update lifecycle info for JupyterLab major versions|https://github.com/jupyterlab/jupyterlab/pull/15626|
+|jupyterlab/jupyterlab|15623|Dark High Contrast Theme for JupyterLab with Improved Sidebar Focus Indication|https://github.com/jupyterlab/jupyterlab/pull/15623|
+|jupyterlab/jupyterlab|15483|Reopen recently opened/closed files and modal navigation|https://github.com/jupyterlab/jupyterlab/pull/15483|
+|jupyterlab/jupyterlab|15425|Should proxy environment variables be documented?|https://github.com/jupyterlab/jupyterlab/issues/15425|
+|jupyterlab/jupyterlab|15417|Add dedicated plugin system document|https://github.com/jupyterlab/jupyterlab/pull/15417|
+|jupyterlab/jupyterlab|15375|Some galata improvements|https://github.com/jupyterlab/jupyterlab/pull/15375|
+|jupyterlab/jupyterlab|15139|Mermaid Usage Instructions Missing|https://github.com/jupyterlab/jupyterlab/issues/15139|
+|jupyterlab/jupyterlab|15099|JupyterLab documentation wishlist|https://github.com/jupyterlab/jupyterlab/issues/15099|
+|jupyterlab/jupyterlab|14964|Add a screenshot with shell areas overview|https://github.com/jupyterlab/jupyterlab/pull/14964|
+|jupyterlab/jupyterlab|14934|Links are broken in Notebooks documentation |https://github.com/jupyterlab/jupyterlab/issues/14934|
+|jupyterlab/jupyterlab|14838|Lab/NB7 extension compatibility docs|https://github.com/jupyterlab/jupyterlab/pull/14838|
+|jupyterlab/jupyterlab|14826|Document process of adding new commands to the command palette |https://github.com/jupyterlab/jupyterlab/issues/14826|
+|jupyterlab/jupyterlab|14775|3.6.5: documentation build fails|https://github.com/jupyterlab/jupyterlab/issues/14775|
+|jupyterlab/jupyterlab|14730|How to add/insert a new cell with pre defined content to cellList in 4.0.2|https://github.com/jupyterlab/jupyterlab/issues/14730|
+|jupyterlab/jupyterlab|14679|Default "open" application when opening files inside Jupyterlab|https://github.com/jupyterlab/jupyterlab/issues/14679|
+|jupyterlab/jupyterlab|14675|Automatic download links per OS|https://github.com/jupyterlab/jupyterlab/pull/14675|
+|jupyterlab/jupyterlab|14669|Extension tutorial enhancement|https://github.com/jupyterlab/jupyterlab/pull/14669|
+|jupyterlab/jupyterlab|14594|Failed validating settings|https://github.com/jupyterlab/jupyterlab/issues/14594|
+|jupyterlab/jupyterlab|14445|better document the metadata-related changes in jlab4 extension API|https://github.com/jupyterlab/jupyterlab/issues/14445|
+|jupyterlab/jupyterlab|14428|Updating extension status in migration guide|https://github.com/jupyterlab/jupyterlab/pull/14428|
+|jupyterlab/jupyterlab|14396|Create an accessibility section in the user JupyterLab documentation|https://github.com/jupyterlab/jupyterlab/issues/14396|
+|jupyterlab/jupyterlab|14386|Support interactivity for python source files (ipython's cell magics and live execution)|https://github.com/jupyterlab/jupyterlab/issues/14386|
+|jupyterlab/jupyterlab|14351|Documenting the requirements of `OK` extension status|https://github.com/jupyterlab/jupyterlab/issues/14351|
+|jupyterlab/jupyterlab|14294|Better messaging around conflicts with sharedPackages|https://github.com/jupyterlab/jupyterlab/issues/14294|
+|jupyterlab/jupyterlab|14283|Trying to disable build check, current instructions not working as expected|https://github.com/jupyterlab/jupyterlab/issues/14283|
+|jupyterlab/jupyterlab|14258|Lumino Widgets >= 2.0.0 is incompatible with JupyterLab Extension Tutorial example code|https://github.com/jupyterlab/jupyterlab/issues/14258|
+|jupyterlab/jupyterlab|14046|Clean up license|https://github.com/jupyterlab/jupyterlab/pull/14046|
+|jupyterlab/jupyterlab-desktop|666|Support Windows Subsystem for Linux (WSL)|https://github.com/jupyterlab/jupyterlab-desktop/issues/666|
+|jupyterlab/jupyterlab-desktop|654|conversation starter for introductory docs|https://github.com/jupyterlab/jupyterlab-desktop/pull/654|
+|jupyterlab/jupyterlab-desktop|577|After upgrading JupyterLab using pip, I started jupyter-lab from the windows command and got an error.|https://github.com/jupyterlab/jupyterlab-desktop/issues/577|
diff --git a/workflows/documentation_issues/fetch_issues.py b/workflows/documentation_issues/fetch_issues.py
new file mode 100644
index 0000000..ab21963
--- /dev/null
+++ b/workflows/documentation_issues/fetch_issues.py
@@ -0,0 +1,219 @@
+"""
+Write CSV table with Subproject's issues labeled as 'documentation'
+
+The list of subprojects to query is provided in `DEFAULT_REPOS_FILE` variable,
+entries in this file are repository names in GitHub -- *fullnames --,
+specified as "{org}/{repository}" (eg, `jupyterlab/jupyterlab`).
+
+The repositories are queried for all their issues with 'documetation' label.
+For each issue returned, we take note of its `number` (ID), title, and URL.
+
+The answer is written as a CSV table with fields defined in FIELDNAMES_CSV.
+"""
+
+# Repositories to query
+DEFAULT_REPOS_FILE='repos.txt'
+
+# Output table filename
+DEFAULT_ISSUES_FILE='issues.csv'
+
+# Table columns
+FIELDNAMES = ['repo', 'number', 'title', 'url']
+
+
+import csv
+import requests
+
+
+def read_repos(filename):
+    """
+    Return list of repositories in 'filename'.
+
+    Example 'filename':
+    $ cat > filename.txt << EOF
+    jupyterlab/jupyterlab
+    jupyterlab/jupyterlab-desktop
+    jupyter/notebook
+    jupyterhub/jupyterhub
+    EOF
+    """
+    with open(filename) as file:
+        lines = file.readlines()
+    lines = [ line.strip() for line in lines ]
+    lines = [ line for line in lines if line and line[0] != '#' ]
+    return lines
+
+
+def fetch_issues(repo, label='documentation'):
+    """
+    Query Github repos for issues with 'label'
+    """
+    url = f"https://api.github.com/repos/{repo}/issues?labels={label}"
+    response = requests.get(url)
+    issues = {}
+    if response.status_code == 200:
+        for issue in response.json():
+            key = f"{repo}:{issue['number']}"
+            issues[key] = {
+                'title': issue['title'],
+                'url': issue['html_url']
+            }
+    return issues
+
+
+# CSV reader/writer arguments for our 'issues' file
+_CSV_ARGS = dict(
+    fieldnames = FIELDNAMES,
+    quoting = csv.QUOTE_NONNUMERIC,
+)
+
+
+def write_issues(issues, filename, write_md=None, write_html=None):
+    """
+    Write 'issues' to CSV 'filename'.
+
+    Write a Markdown version if 'write_md'.
+    Write an HTML version if 'write_html'.
+
+    Return list of filename(s) created.
+    """
+    def _unpack(key, issue):
+        repo, number = key.split(':')
+        issue.update({'repo':repo, 'number':number})
+        return issue
+
+    def _write_csv(issues, filename):
+        """Write CSV file"""
+        with open(filename, 'w') as file:
+            writer = csv.DictWriter(file, **_CSV_ARGS)
+            # Write header line (ie, fieldnames)
+            writer.writeheader()
+            for key,issue in issues.items():
+                issue = _unpack(key, issue)
+                writer.writerow(issue)
+        return filename
+
+    def _write_md(issues, filename):
+        """Write Markdown table file"""
+        with open(filename, 'w') as file:
+            file.write(f"|{'|'.join(FIELDNAMES)}|\n")
+            file.write(f"|{'|'.join(['---']*len(FIELDNAMES))}|\n")
+            for key,issue in issues.items():
+                issue = _unpack(key, issue)
+                file.write(f"|{'|'.join(issue[key] for key in FIELDNAMES)}|\n")
+        return filename
+
+    def _write_html(issues, filename):
+        """Write HTML (table) file"""
+        html = "<!doctype html><html><body><table>"
+        html += ("<tr>"
+                 f"{''.join( f'<th>{field}</th>' for field in FIELDNAMES )}"
+                 "</tr>")
+        for key,issue in issues.items():
+            issue = _unpack(key, issue)
+            _html = "<tr>"
+            for field in FIELDNAMES:
+                _html += "<td>"
+                val = issue[field]
+                if 'url' in field.lower():
+                    _html += f'<a href="{val}" target="_blank">{val}</a>'
+                else:
+                    _html += val
+                _html += "</td>"
+            _html += "</tr>"
+            html += _html
+        html += "</table></body></html>"
+        with open(filename, 'w') as fp:
+            fp.write(html)
+        return filename
+
+    files_out = []
+    files_out.append(_write_csv(issues, filename))
+    if write_md:
+        files_out.append(_write_md(issues, write_md))
+    if write_html:
+        files_out.append(_write_html(issues, write_html))
+    return files_out
+
+
+def read_issues(filename):
+    """
+    Read issues from CSV 'filename'
+    """
+    issues = {}
+    with open(filename) as file:
+        reader = csv.DictReader(file, **_CSV_ARGS)
+        # Escape the first/header line
+        next(reader)
+        for issue in reader:
+            repo = issue.pop('repo')
+            number = issue.pop('number')
+            key = f"{repo}:{number}"
+            issues[key] = issue
+    return issues
+
+
+def main(repos_file, issues_file, write_md, write_html):
+    """
+    Write CSV file from 'documentation' issues from 'repos_source.txt' file
+
+    Github repositories listed in 'repos.list' file are queried for issues
+    with label 'documentation' associated. Title, URL, and issue's number
+    are collected and written in 'issues.csv'.
+    """
+    ## Issues' label (applied to all repos)
+    label = 'documentation'
+
+    ## Read list of repositories
+    repos = read_repos(repos_file)
+
+    # ## Read "old-current" list of issues
+    # try:
+    #     current_issues = read_issues(issues_file)
+    # except FileNotFoundError as err:
+    #     current_issues = None
+
+    ## Ignore previous issues, we're not keeping track, we just want today's
+    current_issues = None
+
+    ## Query repos for issues with 'label'
+    issues = {}
+    for repo in repos:
+        print(f"Querying repo: '{repo}'")
+        issues.update(
+            fetch_issues(repo, label=label)
+            )
+
+    print(f"{len(issues)} issues found.")
+
+    # if current_issues:
+    #     print("Diff:", set(issues).symmetric_difference(current_issues))
+
+    ## Merge old/new list of issues
+    all_issues = current_issues.copy() if current_issues else {}
+    all_issues.update(issues)
+
+    ## Write "new-current" list of issues
+    files_out = write_issues(all_issues, issues_file, write_md, write_html)
+    print(f"Files created: {(', ').join(files_out)}.")
+
+
+if __name__ == "__main__":
+    import argparse
+    parser = argparse.ArgumentParser()
+    parser.add_argument("--repos-file", default=DEFAULT_REPOS_FILE,
+                        help="Filename with list of Jupyter repos")
+    parser.add_argument("--issues-file", default=DEFAULT_ISSUES_FILE,
+                        help="Filename for issues table (CSV)")
+    parser.add_argument("--write-md", default=None,
+                        help="Write Markdown (table) version if given")
+    parser.add_argument("--write-html", default=None,
+                        help="Write HTML (table) version if given")
+    args = parser.parse_args()
+
+    main(
+        repos_file=args.repos_file,
+        issues_file=args.issues_file,
+        write_md=args.write_md,
+        write_html=args.write_html
+        )
diff --git a/workflows/documentation_issues/issues.csv b/workflows/documentation_issues/issues.csv
new file mode 100644
index 0000000..3dd8ef6
--- /dev/null
+++ b/workflows/documentation_issues/issues.csv
@@ -0,0 +1,107 @@
+"repo","number","title","url"
+"jupyter/jupyter","683","Add persona centric docs","https://github.com/jupyter/jupyter/issues/683"
+"jupyter/jupyter","667","Use excalidraw for our manually-created diagrams","https://github.com/jupyter/jupyter/issues/667"
+"jupyter/jupyter","657","Refactor the documentation to use the main branch","https://github.com/jupyter/jupyter/issues/657"
+"jupyter/jupyter","620","A11y - Jupyter logo does not have enough contrast in dark mode","https://github.com/jupyter/jupyter/issues/620"
+"jupyter/jupyter","581","Why have an Advanced Topics section when there is only one ""topic?""","https://github.com/jupyter/jupyter/issues/581"
+"jupyter/jupyter","511","Anyone want to help with a round of documentation improvements?","https://github.com/jupyter/jupyter/issues/511"
+"jupyter/jupyter","430","Translating Official Documentation to Spanish","https://github.com/jupyter/jupyter/issues/430"
+"jupyter/jupyter","424","Notebook server API documentation lacks information about trust","https://github.com/jupyter/jupyter/issues/424"
+"jupyter/jupyter","412","Some things we can improve in the documentation","https://github.com/jupyter/jupyter/issues/412"
+"jupyter/jupyter","306","Create a man page","https://github.com/jupyter/jupyter/issues/306"
+"jupyter/jupyter","242","Document JSON config format","https://github.com/jupyter/jupyter/issues/242"
+"jupyter/jupyter","220","Glossary in docs","https://github.com/jupyter/jupyter/issues/220"
+"jupyter/jupyter","216","Review top-level docs for prospective kernel authors","https://github.com/jupyter/jupyter/issues/216"
+"jupyter/jupyter","190","Citing Jupyter","https://github.com/jupyter/jupyter/issues/190"
+"jupyter/jupyter","159","[docs/theme] Pay attention to the ""width"" of screenshot.","https://github.com/jupyter/jupyter/issues/159"
+"jupyter/jupyter","137","Too many documentation kill the documentation ?","https://github.com/jupyter/jupyter/issues/137"
+"jupyter/jupyter","128","Create a developer guide - action item from dev mtg","https://github.com/jupyter/jupyter/issues/128"
+"jupyter/jupyter","109","Link to dev-install from Install section.","https://github.com/jupyter/jupyter/issues/109"
+"jupyter/jupyter","66","[Docs] list supported mimetype ","https://github.com/jupyter/jupyter/issues/66"
+"jupyter/jupyter","51","Create a better way to manage subproject docs","https://github.com/jupyter/jupyter/issues/51"
+"jupyter/notebook","7149","Provide access to the documentation for older version","https://github.com/jupyter/notebook/issues/7149"
+"jupyter/notebook","7148","Installation guide (android, termux)","https://github.com/jupyter/notebook/issues/7148"
+"jupyter/notebook","7029","Add guidelines for setting up development environment using yarn and npm in CONTRIBUTING.md","https://github.com/jupyter/notebook/issues/7029"
+"jupyter/notebook","7015","Missing notebook.auth submodule?","https://github.com/jupyter/notebook/issues/7015"
+"jupyter/notebook","6987","JN 7 → Code Folding starts at the first line regardless the type","https://github.com/jupyter/notebook/issues/6987"
+"jupyter/notebook","6981","Rework Notebook 7 docs accessibility section","https://github.com/jupyter/notebook/issues/6981"
+"jupyter/notebook","6891","`@web.authenticated` decorator with IPythonHandler is not working on nbclassic","https://github.com/jupyter/notebook/issues/6891"
+"jupyter/notebook","6875","Get versioned Notebook framework trove classifiers on PyPI","https://github.com/jupyter/notebook/issues/6875"
+"jupyter/notebook","6849","Revise `pyzmq` requirements in documentation","https://github.com/jupyter/notebook/issues/6849"
+"jupyter/notebook","6848","Very poor navigation in new readthedocs builds","https://github.com/jupyter/notebook/issues/6848"
+"jupyter/notebook","6680","Add a large deprecation notice to the front-end extensions documentation","https://github.com/jupyter/notebook/issues/6680"
+"jupyter/notebook","6659","Document .ipynb_checkpoints directory","https://github.com/jupyter/notebook/issues/6659"
+"jupyter/notebook","6644","Updates to the contributor.rst file and addition of CONFIGURATION.md file","https://github.com/jupyter/notebook/pull/6644"
+"jupyter/notebook","6486","feature request: add run buttons like ipynb extension for vscode","https://github.com/jupyter/notebook/issues/6486"
+"jupyter/notebook","4304","Running `jupyter notebook` opens visual studio code, not a browser","https://github.com/jupyter/notebook/issues/4304"
+"jupyter/notebook","4178","Buttons don't show up properly in Sphinx docs","https://github.com/jupyter/notebook/issues/4178"
+"jupyter/notebook","3550","Add faq entry about installing on python without sqlite extensions","https://github.com/jupyter/notebook/issues/3550"
+"jupyter/notebook","1744","Safari can't connect to kernel","https://github.com/jupyter/notebook/issues/1744"
+"jupyter/notebook","1643","Run cells from script or the command line?","https://github.com/jupyter/notebook/issues/1643"
+"jupyter/notebook","1473","Translating notebook contents","https://github.com/jupyter/notebook/issues/1473"
+"jupyter/notebook","916","File save hooks—docs & question","https://github.com/jupyter/notebook/issues/916"
+"jupyter/notebook","811","Internal links / references to outputs","https://github.com/jupyter/notebook/issues/811"
+"jupyter/notebook","788","Add a doc page for tips on using Spark","https://github.com/jupyter/notebook/issues/788"
+"jupyter/notebook","660","Update public server document with troubleshooting and additional resources","https://github.com/jupyter/notebook/issues/660"
+"jupyterhub/jupyterhub","4682","Note that you can throw a 403 from check_allowed","https://github.com/jupyterhub/jupyterhub/pull/4682"
+"jupyterhub/jupyterhub","4673","Document / better support for separating user domains from the Hub domain","https://github.com/jupyterhub/jupyterhub/issues/4673"
+"jupyterhub/jupyterhub","4669","try redocly for REST API","https://github.com/jupyterhub/jupyterhub/issues/4669"
+"jupyterhub/jupyterhub","4656","FastAPI service example - Authorization header not sent in subsequent requests","https://github.com/jupyterhub/jupyterhub/issues/4656"
+"jupyterhub/jupyterhub","4653","Minor broken docs: reference to wiki","https://github.com/jupyterhub/jupyterhub/issues/4653"
+"jupyterhub/jupyterhub","4610","Better documentation on how to customize the home page","https://github.com/jupyterhub/jupyterhub/issues/4610"
+"jupyterhub/jupyterhub","4253","docs: simplify api docs generation for comparison","https://github.com/jupyterhub/jupyterhub/pull/4253"
+"jupyterhub/jupyterhub","4252","docs: classes generated docs sometimes include non-traits members, and sometimes do","https://github.com/jupyterhub/jupyterhub/issues/4252"
+"jupyterhub/jupyterhub","4241","More documentation on the implications of `server.name`","https://github.com/jupyterhub/jupyterhub/issues/4241"
+"jupyterhub/jupyterhub","4213","`post_auth_hook` documentation update","https://github.com/jupyterhub/jupyterhub/issues/4213"
+"jupyterhub/jupyterhub","4203","PAM Authentication failed","https://github.com/jupyterhub/jupyterhub/issues/4203"
+"jupyterhub/jupyterhub","4200","Doc fix","https://github.com/jupyterhub/jupyterhub/pull/4200"
+"jupyterhub/jupyterhub","4197","Unaligned Text Blocks on JupyterHub REST API Page (Mobile View)","https://github.com/jupyterhub/jupyterhub/issues/4197"
+"jupyterhub/jupyterhub","4138","404 Error when try to ""edit this page"" on JupyterHub home page","https://github.com/jupyterhub/jupyterhub/issues/4138"
+"jupyterhub/jupyterhub","4108","I corrected errors and made an update to api-only.md","https://github.com/jupyterhub/jupyterhub/pull/4108"
+"jupyterhub/jupyterhub","3814","Update JupyterHub REST API permission examples with jupyterhub-idle-culler","https://github.com/jupyterhub/jupyterhub/issues/3814"
+"jupyterhub/jupyterhub","3801","Illustrate create() classmethod idea","https://github.com/jupyterhub/jupyterhub/pull/3801"
+"jupyterhub/jupyterhub","3710","Unify the documentation for idle-culler","https://github.com/jupyterhub/jupyterhub/issues/3710"
+"jupyterhub/jupyterhub","3684","More detailed docs on direct network interactions","https://github.com/jupyterhub/jupyterhub/issues/3684"
+"jupyterhub/jupyterhub","3313","Documentation of jupyterhub.dbutil and alembic revisions","https://github.com/jupyterhub/jupyterhub/issues/3313"
+"jupyterhub/jupyterhub","3113","Missing HTTP security headers","https://github.com/jupyterhub/jupyterhub/issues/3113"
+"jupyterhub/jupyterhub","3080","Add a documentation section describing the structure of this repository","https://github.com/jupyterhub/jupyterhub/issues/3080"
+"jupyterhub/jupyterhub","2855","Auto-generate docs for telemetry events","https://github.com/jupyterhub/jupyterhub/issues/2855"
+"jupyterhub/jupyterhub","2726","Jupyter(Hub) conceptual intro","https://github.com/jupyterhub/jupyterhub/pull/2726"
+"jupyterhub/jupyterhub","2593","Include the instruction `WorkingDirectory=/etc/jupyterhub` in system service Wiki","https://github.com/jupyterhub/jupyterhub/issues/2593"
+"jupyterhub/jupyterhub","2481","Include Debian package in documentation ? ","https://github.com/jupyterhub/jupyterhub/issues/2481"
+"jupyterhub/jupyterhub","2134","Docs: Unclear / confusing DB upgrade instructions","https://github.com/jupyterhub/jupyterhub/issues/2134"
+"jupyterhub/jupyterhub","2049","Docs: Missing a chapter on monitoring / observability","https://github.com/jupyterhub/jupyterhub/issues/2049"
+"jupyterhub/jupyterhub","1310","Customize DockerHub documentation for JupyterHub","https://github.com/jupyterhub/jupyterhub/issues/1310"
+"jupyterlab/jupyterlab","15749","Improve documentation for `jupyter.lab.transform`","https://github.com/jupyterlab/jupyterlab/issues/15749"
+"jupyterlab/jupyterlab","15743","Add a link to postmortem for 3.6.7 release","https://github.com/jupyterlab/jupyterlab/pull/15743"
+"jupyterlab/jupyterlab","15724","Update maintainers affiliation","https://github.com/jupyterlab/jupyterlab/pull/15724"
+"jupyterlab/jupyterlab","15626","Update lifecycle info for JupyterLab major versions","https://github.com/jupyterlab/jupyterlab/pull/15626"
+"jupyterlab/jupyterlab","15623","Dark High Contrast Theme for JupyterLab with Improved Sidebar Focus Indication","https://github.com/jupyterlab/jupyterlab/pull/15623"
+"jupyterlab/jupyterlab","15483","Reopen recently opened/closed files and modal navigation","https://github.com/jupyterlab/jupyterlab/pull/15483"
+"jupyterlab/jupyterlab","15425","Should proxy environment variables be documented?","https://github.com/jupyterlab/jupyterlab/issues/15425"
+"jupyterlab/jupyterlab","15417","Add dedicated plugin system document","https://github.com/jupyterlab/jupyterlab/pull/15417"
+"jupyterlab/jupyterlab","15375","Some galata improvements","https://github.com/jupyterlab/jupyterlab/pull/15375"
+"jupyterlab/jupyterlab","15139","Mermaid Usage Instructions Missing","https://github.com/jupyterlab/jupyterlab/issues/15139"
+"jupyterlab/jupyterlab","15099","JupyterLab documentation wishlist","https://github.com/jupyterlab/jupyterlab/issues/15099"
+"jupyterlab/jupyterlab","14964","Add a screenshot with shell areas overview","https://github.com/jupyterlab/jupyterlab/pull/14964"
+"jupyterlab/jupyterlab","14934","Links are broken in Notebooks documentation ","https://github.com/jupyterlab/jupyterlab/issues/14934"
+"jupyterlab/jupyterlab","14838","Lab/NB7 extension compatibility docs","https://github.com/jupyterlab/jupyterlab/pull/14838"
+"jupyterlab/jupyterlab","14826","Document process of adding new commands to the command palette ","https://github.com/jupyterlab/jupyterlab/issues/14826"
+"jupyterlab/jupyterlab","14775","3.6.5: documentation build fails","https://github.com/jupyterlab/jupyterlab/issues/14775"
+"jupyterlab/jupyterlab","14730","How to add/insert a new cell with pre defined content to cellList in 4.0.2","https://github.com/jupyterlab/jupyterlab/issues/14730"
+"jupyterlab/jupyterlab","14679","Default ""open"" application when opening files inside Jupyterlab","https://github.com/jupyterlab/jupyterlab/issues/14679"
+"jupyterlab/jupyterlab","14675","Automatic download links per OS","https://github.com/jupyterlab/jupyterlab/pull/14675"
+"jupyterlab/jupyterlab","14669","Extension tutorial enhancement","https://github.com/jupyterlab/jupyterlab/pull/14669"
+"jupyterlab/jupyterlab","14594","Failed validating settings","https://github.com/jupyterlab/jupyterlab/issues/14594"
+"jupyterlab/jupyterlab","14445","better document the metadata-related changes in jlab4 extension API","https://github.com/jupyterlab/jupyterlab/issues/14445"
+"jupyterlab/jupyterlab","14428","Updating extension status in migration guide","https://github.com/jupyterlab/jupyterlab/pull/14428"
+"jupyterlab/jupyterlab","14396","Create an accessibility section in the user JupyterLab documentation","https://github.com/jupyterlab/jupyterlab/issues/14396"
+"jupyterlab/jupyterlab","14386","Support interactivity for python source files (ipython's cell magics and live execution)","https://github.com/jupyterlab/jupyterlab/issues/14386"
+"jupyterlab/jupyterlab","14351","Documenting the requirements of `OK` extension status","https://github.com/jupyterlab/jupyterlab/issues/14351"
+"jupyterlab/jupyterlab","14294","Better messaging around conflicts with sharedPackages","https://github.com/jupyterlab/jupyterlab/issues/14294"
+"jupyterlab/jupyterlab","14283","Trying to disable build check, current instructions not working as expected","https://github.com/jupyterlab/jupyterlab/issues/14283"
+"jupyterlab/jupyterlab","14258","Lumino Widgets >= 2.0.0 is incompatible with JupyterLab Extension Tutorial example code","https://github.com/jupyterlab/jupyterlab/issues/14258"
+"jupyterlab/jupyterlab","14046","Clean up license","https://github.com/jupyterlab/jupyterlab/pull/14046"
+"jupyterlab/jupyterlab-desktop","666","Support Windows Subsystem for Linux (WSL)","https://github.com/jupyterlab/jupyterlab-desktop/issues/666"
+"jupyterlab/jupyterlab-desktop","654","conversation starter for introductory docs","https://github.com/jupyterlab/jupyterlab-desktop/pull/654"
+"jupyterlab/jupyterlab-desktop","577","After upgrading JupyterLab using pip, I started jupyter-lab from the windows command and got an error.","https://github.com/jupyterlab/jupyterlab-desktop/issues/577"
diff --git a/workflows/documentation_issues/repos.txt b/workflows/documentation_issues/repos.txt
new file mode 100644
index 0000000..8db5b26
--- /dev/null
+++ b/workflows/documentation_issues/repos.txt
@@ -0,0 +1,10 @@
+# List of repositories to query/source.
+# Those repositories will be queried for "documentation" issues.
+#
+# Commented (#) and blank lines in this file are ignored.
+
+jupyter/jupyter
+jupyter/notebook
+jupyterhub/jupyterhub
+jupyterlab/jupyterlab
+jupyterlab/jupyterlab-desktop

From 6a29784a66983c0dd61b3d9fc979e674bf197fbb Mon Sep 17 00:00:00 2001
From: GitHub Action <action@github.com>
Date: Wed, 7 Feb 2024 05:10:22 +0000
Subject: [PATCH 2/2] Update documentation issues

---
 workflows/documentation_issues.md         | 3 ++-
 workflows/documentation_issues/issues.csv | 3 ++-
 2 files changed, 4 insertions(+), 2 deletions(-)

diff --git a/workflows/documentation_issues.md b/workflows/documentation_issues.md
index 4e18427..5ef201a 100644
--- a/workflows/documentation_issues.md
+++ b/workflows/documentation_issues.md
@@ -44,6 +44,7 @@
 |jupyter/notebook|811|Internal links / references to outputs|https://github.com/jupyter/notebook/issues/811|
 |jupyter/notebook|788|Add a doc page for tips on using Spark|https://github.com/jupyter/notebook/issues/788|
 |jupyter/notebook|660|Update public server document with troubleshooting and additional resources|https://github.com/jupyter/notebook/issues/660|
+|jupyterhub/jupyterhub|4699|clarify some points where users can disable security for their own servers|https://github.com/jupyterhub/jupyterhub/pull/4699|
 |jupyterhub/jupyterhub|4682|Note that you can throw a 403 from check_allowed|https://github.com/jupyterhub/jupyterhub/pull/4682|
 |jupyterhub/jupyterhub|4673|Document / better support for separating user domains from the Hub domain|https://github.com/jupyterhub/jupyterhub/issues/4673|
 |jupyterhub/jupyterhub|4669|try redocly for REST API|https://github.com/jupyterhub/jupyterhub/issues/4669|
@@ -75,6 +76,7 @@
 |jupyterhub/jupyterhub|1310|Customize DockerHub documentation for JupyterHub|https://github.com/jupyterhub/jupyterhub/issues/1310|
 |jupyterlab/jupyterlab|15749|Improve documentation for `jupyter.lab.transform`|https://github.com/jupyterlab/jupyterlab/issues/15749|
 |jupyterlab/jupyterlab|15743|Add a link to postmortem for 3.6.7 release|https://github.com/jupyterlab/jupyterlab/pull/15743|
+|jupyterlab/jupyterlab|15729|Should we use the council members doc page in lieu of the maintainers list in lab readme|https://github.com/jupyterlab/jupyterlab/issues/15729|
 |jupyterlab/jupyterlab|15724|Update maintainers affiliation|https://github.com/jupyterlab/jupyterlab/pull/15724|
 |jupyterlab/jupyterlab|15626|Update lifecycle info for JupyterLab major versions|https://github.com/jupyterlab/jupyterlab/pull/15626|
 |jupyterlab/jupyterlab|15623|Dark High Contrast Theme for JupyterLab with Improved Sidebar Focus Indication|https://github.com/jupyterlab/jupyterlab/pull/15623|
@@ -102,7 +104,6 @@
 |jupyterlab/jupyterlab|14294|Better messaging around conflicts with sharedPackages|https://github.com/jupyterlab/jupyterlab/issues/14294|
 |jupyterlab/jupyterlab|14283|Trying to disable build check, current instructions not working as expected|https://github.com/jupyterlab/jupyterlab/issues/14283|
 |jupyterlab/jupyterlab|14258|Lumino Widgets >= 2.0.0 is incompatible with JupyterLab Extension Tutorial example code|https://github.com/jupyterlab/jupyterlab/issues/14258|
-|jupyterlab/jupyterlab|14046|Clean up license|https://github.com/jupyterlab/jupyterlab/pull/14046|
 |jupyterlab/jupyterlab-desktop|666|Support Windows Subsystem for Linux (WSL)|https://github.com/jupyterlab/jupyterlab-desktop/issues/666|
 |jupyterlab/jupyterlab-desktop|654|conversation starter for introductory docs|https://github.com/jupyterlab/jupyterlab-desktop/pull/654|
 |jupyterlab/jupyterlab-desktop|577|After upgrading JupyterLab using pip, I started jupyter-lab from the windows command and got an error.|https://github.com/jupyterlab/jupyterlab-desktop/issues/577|
diff --git a/workflows/documentation_issues/issues.csv b/workflows/documentation_issues/issues.csv
index 3dd8ef6..11590e5 100644
--- a/workflows/documentation_issues/issues.csv
+++ b/workflows/documentation_issues/issues.csv
@@ -43,6 +43,7 @@
 "jupyter/notebook","811","Internal links / references to outputs","https://github.com/jupyter/notebook/issues/811"
 "jupyter/notebook","788","Add a doc page for tips on using Spark","https://github.com/jupyter/notebook/issues/788"
 "jupyter/notebook","660","Update public server document with troubleshooting and additional resources","https://github.com/jupyter/notebook/issues/660"
+"jupyterhub/jupyterhub","4699","clarify some points where users can disable security for their own servers","https://github.com/jupyterhub/jupyterhub/pull/4699"
 "jupyterhub/jupyterhub","4682","Note that you can throw a 403 from check_allowed","https://github.com/jupyterhub/jupyterhub/pull/4682"
 "jupyterhub/jupyterhub","4673","Document / better support for separating user domains from the Hub domain","https://github.com/jupyterhub/jupyterhub/issues/4673"
 "jupyterhub/jupyterhub","4669","try redocly for REST API","https://github.com/jupyterhub/jupyterhub/issues/4669"
@@ -74,6 +75,7 @@
 "jupyterhub/jupyterhub","1310","Customize DockerHub documentation for JupyterHub","https://github.com/jupyterhub/jupyterhub/issues/1310"
 "jupyterlab/jupyterlab","15749","Improve documentation for `jupyter.lab.transform`","https://github.com/jupyterlab/jupyterlab/issues/15749"
 "jupyterlab/jupyterlab","15743","Add a link to postmortem for 3.6.7 release","https://github.com/jupyterlab/jupyterlab/pull/15743"
+"jupyterlab/jupyterlab","15729","Should we use the council members doc page in lieu of the maintainers list in lab readme","https://github.com/jupyterlab/jupyterlab/issues/15729"
 "jupyterlab/jupyterlab","15724","Update maintainers affiliation","https://github.com/jupyterlab/jupyterlab/pull/15724"
 "jupyterlab/jupyterlab","15626","Update lifecycle info for JupyterLab major versions","https://github.com/jupyterlab/jupyterlab/pull/15626"
 "jupyterlab/jupyterlab","15623","Dark High Contrast Theme for JupyterLab with Improved Sidebar Focus Indication","https://github.com/jupyterlab/jupyterlab/pull/15623"
@@ -101,7 +103,6 @@
 "jupyterlab/jupyterlab","14294","Better messaging around conflicts with sharedPackages","https://github.com/jupyterlab/jupyterlab/issues/14294"
 "jupyterlab/jupyterlab","14283","Trying to disable build check, current instructions not working as expected","https://github.com/jupyterlab/jupyterlab/issues/14283"
 "jupyterlab/jupyterlab","14258","Lumino Widgets >= 2.0.0 is incompatible with JupyterLab Extension Tutorial example code","https://github.com/jupyterlab/jupyterlab/issues/14258"
-"jupyterlab/jupyterlab","14046","Clean up license","https://github.com/jupyterlab/jupyterlab/pull/14046"
 "jupyterlab/jupyterlab-desktop","666","Support Windows Subsystem for Linux (WSL)","https://github.com/jupyterlab/jupyterlab-desktop/issues/666"
 "jupyterlab/jupyterlab-desktop","654","conversation starter for introductory docs","https://github.com/jupyterlab/jupyterlab-desktop/pull/654"
 "jupyterlab/jupyterlab-desktop","577","After upgrading JupyterLab using pip, I started jupyter-lab from the windows command and got an error.","https://github.com/jupyterlab/jupyterlab-desktop/issues/577"