From 7aa499c3d865c36b5b7fba6ca9f441b9af5d52e8 Mon Sep 17 00:00:00 2001 From: Laert Llaveshi Date: Mon, 27 Apr 2026 09:48:36 +0200 Subject: [PATCH 01/11] #1723 Add Copilot commandlet --- .../ide/commandlet/CommandletManagerImpl.java | 2 ++ .../tools/ide/tool/copilot/Copilot.java | 30 +++++++++++++++++++ 2 files changed, 32 insertions(+) create mode 100644 cli/src/main/java/com/devonfw/tools/ide/tool/copilot/Copilot.java diff --git a/cli/src/main/java/com/devonfw/tools/ide/commandlet/CommandletManagerImpl.java b/cli/src/main/java/com/devonfw/tools/ide/commandlet/CommandletManagerImpl.java index 096b6e999b..58e49310e6 100644 --- a/cli/src/main/java/com/devonfw/tools/ide/commandlet/CommandletManagerImpl.java +++ b/cli/src/main/java/com/devonfw/tools/ide/commandlet/CommandletManagerImpl.java @@ -21,6 +21,7 @@ import com.devonfw.tools.ide.tool.androidstudio.AndroidStudio; import com.devonfw.tools.ide.tool.aws.Aws; import com.devonfw.tools.ide.tool.az.Azure; +import com.devonfw.tools.ide.tool.copilot.Copilot; import com.devonfw.tools.ide.tool.corepack.Corepack; import com.devonfw.tools.ide.tool.docker.Docker; import com.devonfw.tools.ide.tool.dotnet.DotNet; @@ -147,6 +148,7 @@ public CommandletManagerImpl(IdeContext context) { add(new Spring(context)); add(new Uv(context)); add(new Yarn(context)); + add(new Copilot(context)); add(new Corepack(context)); add(new Pip(context)); add(new Go(context)); diff --git a/cli/src/main/java/com/devonfw/tools/ide/tool/copilot/Copilot.java b/cli/src/main/java/com/devonfw/tools/ide/tool/copilot/Copilot.java new file mode 100644 index 0000000000..e0bc7ba6dc --- /dev/null +++ b/cli/src/main/java/com/devonfw/tools/ide/tool/copilot/Copilot.java @@ -0,0 +1,30 @@ +package com.devonfw.tools.ide.tool.copilot; + +import java.util.Set; + +import com.devonfw.tools.ide.common.Tag; +import com.devonfw.tools.ide.context.IdeContext; +import com.devonfw.tools.ide.tool.LocalToolCommandlet; +import com.devonfw.tools.ide.tool.ToolCommandlet; + +/** + * {@link ToolCommandlet} for GitHub Copilot CLI. + */ +public class Copilot extends LocalToolCommandlet { + + /** + * The constructor. + * + * @param context the {@link IdeContext}. + */ + public Copilot(IdeContext context) { + + super(context, "copilot", Set.of(Tag.ARTIFICIAL_INTELLIGENCE)); + } + + @Override + public String getToolHelpArguments() { + + return "--help"; + } +} From 20a0255bca13935e0cff7439511f177a2c0952ab Mon Sep 17 00:00:00 2001 From: Laert Llaveshi Date: Mon, 27 Apr 2026 10:16:32 +0200 Subject: [PATCH 02/11] #1723: Add tests, help texts, and license for Copilot commandlet --- CHANGELOG.adoc | 1 + cli/src/main/resources/nls/Help.properties | 2 + cli/src/main/resources/nls/Help_de.properties | 2 + .../tools/ide/tool/copilot/CopilotTest.java | 56 +++++++++++++++++++ .../_ide/urls/copilot/copilot/1.0.36/urls | 1 + .../copilot/project/settings/ide.properties | 0 .../copilot/project/workspaces/main/.gitkeep | 0 .../copilot/copilot/default/copilot | 2 + documentation/LICENSE.adoc | 27 +++++++++ 9 files changed, 91 insertions(+) create mode 100644 cli/src/test/java/com/devonfw/tools/ide/tool/copilot/CopilotTest.java create mode 100644 cli/src/test/resources/ide-projects/copilot/_ide/urls/copilot/copilot/1.0.36/urls create mode 100644 cli/src/test/resources/ide-projects/copilot/project/settings/ide.properties create mode 100644 cli/src/test/resources/ide-projects/copilot/project/workspaces/main/.gitkeep create mode 100755 cli/src/test/resources/ide-projects/copilot/repository/copilot/copilot/default/copilot diff --git a/CHANGELOG.adoc b/CHANGELOG.adoc index 88e91065bb..8094e25c47 100644 --- a/CHANGELOG.adoc +++ b/CHANGELOG.adoc @@ -15,6 +15,7 @@ Release with new features and bugfixes: * https://github.com/devonfw/IDEasy/issues/1823[#1823]: Fix IDEasy creates duplicate entries in .gitconfig * https://github.com/devonfw/IDEasy/issues/1724[#1724]: Add gui commandlet * https://github.com/devonfw/IDEasy/issues/1853[#1853]: Add ARM releases for VSCode on Mac +* https://github.com/devonfw/IDEasy/issues/1723[#1723]: Add commandlet for GitHub Copilot CLI The full list of changes for this release can be found in https://github.com/devonfw/IDEasy/milestone/44?closed=1[milestone 2026.05.001]. diff --git a/cli/src/main/resources/nls/Help.properties b/cli/src/main/resources/nls/Help.properties index df9d5b8a8f..1b8505d864 100644 --- a/cli/src/main/resources/nls/Help.properties +++ b/cli/src/main/resources/nls/Help.properties @@ -9,6 +9,8 @@ cmd.build.detail=The `build` commandlet is an abstraction of build systems like cmd.build.val.args=Build arguments to be used when running a build job. cmd.complete=Internal commandlet for bash auto-completion. cmd.complete.detail=Run 'ide complete ' to activate the non-interactive autocompletion, replace with the arguments you want to autocomplete.\nE.g. type: 'ide complete in' to get 'install' and 'intellij' suggestions. +cmd.copilot=Tool commandlet for GitHub Copilot CLI. +cmd.copilot.detail=GitHub Copilot CLI is an AI-powered coding assistant that runs from the command line. Detailed documentation can be found at https://docs.github.com/copilot/how-tos/copilot-cli cmd.corepack=Corepack for nodejs. cmd.corepack.detail=Corepack will let you use Yarn and npm without having to install them. cmd.create=Create a new IDEasy project. diff --git a/cli/src/main/resources/nls/Help_de.properties b/cli/src/main/resources/nls/Help_de.properties index 3452be0a54..dfcc22c285 100644 --- a/cli/src/main/resources/nls/Help_de.properties +++ b/cli/src/main/resources/nls/Help_de.properties @@ -9,6 +9,8 @@ cmd.build.detail=Der `build`-Befehl ist eine Abstraktion von Build-Systemen wie cmd.build.val.args=Argumente die bei dem build Prozess genutzt werden sollen. cmd.complete=Internes Werkzeug für bash Autovervollständigung. cmd.complete.detail=Geben Sie 'ide complete ' in die Konsole ein um die einfache Autovervollständigung zu aktivieren, ersetzen Sie mit dem Ausdruck, der automatisch vervollständigt werden soll.\nZ.B. geben Sie einfach 'ide complete in' in die Konsole ein um 'install' und 'intellij' als Vorschläge zu erhalten. +cmd.copilot=Werkzeug Kommando für GitHub Copilot CLI. +cmd.copilot.detail=GitHub Copilot CLI ist ein KI-gestützter Programmierassistent, der über die Befehlszeile ausgeführt wird. Detaillierte Dokumentation ist zu finden unter https://docs.github.com/copilot/how-tos/copilot-cli cmd.corepack=Corepack für nodejs. cmd.corepack.detail=Corepack ermöglicht die Verwendung von Yarn und npm ohne beide installieren zu müssen. cmd.create=Erstellt ein neues IDEasy Projekt. diff --git a/cli/src/test/java/com/devonfw/tools/ide/tool/copilot/CopilotTest.java b/cli/src/test/java/com/devonfw/tools/ide/tool/copilot/CopilotTest.java new file mode 100644 index 0000000000..0adbba3e7f --- /dev/null +++ b/cli/src/test/java/com/devonfw/tools/ide/tool/copilot/CopilotTest.java @@ -0,0 +1,56 @@ +package com.devonfw.tools.ide.tool.copilot; + +import org.junit.jupiter.api.Test; + +import com.devonfw.tools.ide.context.AbstractIdeContextTest; +import com.devonfw.tools.ide.context.IdeTestContext; +import com.github.tomakehurst.wiremock.junit5.WireMockRuntimeInfo; +import com.github.tomakehurst.wiremock.junit5.WireMockTest; + +/** + * Test of {@link Copilot}. + */ +@WireMockTest +class CopilotTest extends AbstractIdeContextTest { + + private static final String PROJECT_COPILOT = "copilot"; + + private static final String COPILOT_VERSION = "1.0.36"; + + @Test + void testCopilotInstallSucceedsOnAllPlatformsViaHttpDownload(WireMockRuntimeInfo wireMockRuntimeInfo) { + + // arrange + IdeTestContext context = newContext(PROJECT_COPILOT, wireMockRuntimeInfo); + Copilot copilot = new Copilot(context); + + // act + copilot.install(); + + // assert + assertInstalled(context); + } + + @Test + void testCopilotRunInstallsAndPassesArguments(WireMockRuntimeInfo wireMockRuntimeInfo) { + + // arrange + IdeTestContext context = newContext(PROJECT_COPILOT, wireMockRuntimeInfo); + Copilot copilot = new Copilot(context); + copilot.arguments.addValue("hello"); + copilot.arguments.addValue("world"); + + // act + copilot.run(); + + // assert + assertInstalled(context); + assertThat(context).logAtInfo().hasMessage("copilot hello world"); + } + + private void assertInstalled(IdeTestContext context) { + + assertThat(context.getSoftwarePath().resolve("copilot/.ide.software.version")).exists().hasContent(COPILOT_VERSION); + assertThat(context).logAtSuccess().hasMessageContaining("Successfully installed copilot in version " + COPILOT_VERSION); + } +} diff --git a/cli/src/test/resources/ide-projects/copilot/_ide/urls/copilot/copilot/1.0.36/urls b/cli/src/test/resources/ide-projects/copilot/_ide/urls/copilot/copilot/1.0.36/urls new file mode 100644 index 0000000000..d96de075e7 --- /dev/null +++ b/cli/src/test/resources/ide-projects/copilot/_ide/urls/copilot/copilot/1.0.36/urls @@ -0,0 +1 @@ +${testbaseurl}/download/copilot/copilot/1.0.36/copilot-1.0.36.tar.gz diff --git a/cli/src/test/resources/ide-projects/copilot/project/settings/ide.properties b/cli/src/test/resources/ide-projects/copilot/project/settings/ide.properties new file mode 100644 index 0000000000..e69de29bb2 diff --git a/cli/src/test/resources/ide-projects/copilot/project/workspaces/main/.gitkeep b/cli/src/test/resources/ide-projects/copilot/project/workspaces/main/.gitkeep new file mode 100644 index 0000000000..e69de29bb2 diff --git a/cli/src/test/resources/ide-projects/copilot/repository/copilot/copilot/default/copilot b/cli/src/test/resources/ide-projects/copilot/repository/copilot/copilot/default/copilot new file mode 100755 index 0000000000..b44cab064a --- /dev/null +++ b/cli/src/test/resources/ide-projects/copilot/repository/copilot/copilot/default/copilot @@ -0,0 +1,2 @@ +#!/usr/bin/env bash +echo "copilot $*" diff --git a/documentation/LICENSE.adoc b/documentation/LICENSE.adoc index 5b2c8ae175..28356df80e 100644 --- a/documentation/LICENSE.adoc +++ b/documentation/LICENSE.adoc @@ -48,6 +48,7 @@ The column `inclusion` indicates the way the component is included: |https://logback.qos.ch/[logback-classic]|Directly included|https://logback.qos.ch/license.html[LGPL 2.1] |https://openjdk.java.net/[OpenJDK] / https://adoptopenjdk.net/[AdoptOpenJDK] (Java)|Default Setup|https://openjdk.java.net/legal/gplv2+ce.html[GPLv2] |https://go.dev[GO]|Optional|https://go.dev/LICENSE[BSD 3-Clause] +|https://github.com/github/copilot-cli[GitHub Copilot CLI]|Optional|https://github.com/github/copilot-cli/blob/main/LICENSE[MIT] |https://maven.apache.org/[Maven]|Default Setup|https://www.apache.org/licenses/LICENSE-2.0[Apache 2.0] |https://code.visualstudio.com/[VS Code]|Optional|https://github.com/Microsoft/vscode/blob/master/LICENSE.txt[MIT] (https://code.visualstudio.com/License/[Terms]) |https://github.com/devonfw/extension-pack-vscode[extension-pack-vscode] |Optional|https://github.com/devonfw/extension-pack-vscode/blob/master/LICENSE[Apache 2.0] @@ -3475,3 +3476,29 @@ THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ``` + +== GitHub Copilot CLI License (MIT License) + +``` +MIT License + +Copyright (c) GitHub, Inc. + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. +``` From 688d54feda01f8ab406a6ec72c1c48f00831bfbb Mon Sep 17 00:00:00 2001 From: Laert Llaveshi Date: Mon, 27 Apr 2026 10:29:35 +0200 Subject: [PATCH 03/11] #1723: License fix --- documentation/LICENSE.adoc | 29 ++++------------------------- 1 file changed, 4 insertions(+), 25 deletions(-) diff --git a/documentation/LICENSE.adoc b/documentation/LICENSE.adoc index 28356df80e..a84f3c7ccc 100644 --- a/documentation/LICENSE.adoc +++ b/documentation/LICENSE.adoc @@ -48,7 +48,7 @@ The column `inclusion` indicates the way the component is included: |https://logback.qos.ch/[logback-classic]|Directly included|https://logback.qos.ch/license.html[LGPL 2.1] |https://openjdk.java.net/[OpenJDK] / https://adoptopenjdk.net/[AdoptOpenJDK] (Java)|Default Setup|https://openjdk.java.net/legal/gplv2+ce.html[GPLv2] |https://go.dev[GO]|Optional|https://go.dev/LICENSE[BSD 3-Clause] -|https://github.com/github/copilot-cli[GitHub Copilot CLI]|Optional|https://github.com/github/copilot-cli/blob/main/LICENSE[MIT] +|https://github.com/github/copilot-cli[GitHub Copilot CLI]|Optional|https://github.com/github/copilot-cli/blob/main/LICENSE.md[Proprietary] |https://maven.apache.org/[Maven]|Default Setup|https://www.apache.org/licenses/LICENSE-2.0[Apache 2.0] |https://code.visualstudio.com/[VS Code]|Optional|https://github.com/Microsoft/vscode/blob/master/LICENSE.txt[MIT] (https://code.visualstudio.com/License/[Terms]) |https://github.com/devonfw/extension-pack-vscode[extension-pack-vscode] |Optional|https://github.com/devonfw/extension-pack-vscode/blob/master/LICENSE[Apache 2.0] @@ -3477,28 +3477,7 @@ THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ``` -== GitHub Copilot CLI License (MIT License) +== GitHub Copilot CLI License (Proprietary) -``` -MIT License - -Copyright (c) GitHub, Inc. - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. -``` +GitHub Copilot CLI is distributed under a proprietary license by GitHub, Inc. +The full license terms can be found at https://github.com/github/copilot-cli/blob/main/LICENSE.md From 96ebd930f8d85669a59d9b7422b61f9a041262d3 Mon Sep 17 00:00:00 2001 From: MarvMa Date: Wed, 6 May 2026 10:16:17 +0200 Subject: [PATCH 04/11] #1748: added python script to generate a status documentation --- documentation/generate_quality_status.py | 458 ++++++++++++++++ documentation/quality-status.adoc | 655 +++++++++++++++++++++++ 2 files changed, 1113 insertions(+) create mode 100644 documentation/generate_quality_status.py create mode 100644 documentation/quality-status.adoc diff --git a/documentation/generate_quality_status.py b/documentation/generate_quality_status.py new file mode 100644 index 0000000000..9fb7392210 --- /dev/null +++ b/documentation/generate_quality_status.py @@ -0,0 +1,458 @@ +#!/usr/bin/env python3 +""" +generate_quality_status.py + +Generates quality-status.adoc for devonfw/IDEasy by: + 1. Fetching tool names dynamically from the url-updater source tree + (url-updater/src/main/java/com/devonfw/tools/ide/url/tool/) + so the list stays accurate as new tools are added to the codebase. + 2. Fetching all open GitHub issues and mapping them to tools/commandlets + by matching issue labels against the discovered tool names and the + hard-coded commandlet/core label sets. + 3. Writing a quality-status.adoc with one section per OS containing + a Tools table. + +Usage: + python generate_quality_status.py [--token TOKEN] [--output PATH] + +Recommended: set GITHUB_TOKEN to avoid the 60 req/hour rate limit. + export GITHUB_TOKEN=ghp_yourtoken + python generate_quality_status.py + +─── LABEL / TYPE STRUCTURE (as used in devonfw/IDEasy) ────────────────────── + + GitHub Issue TYPES (modern feature, checked via issue["type"]["name"]): + Bug → something is broken + Feature → enhancement / new capability + Task → maintenance / internal work + + OS labels (exact case): + windows "specific for Microsoft Windows OS" + linux "specific for linux OS (debian, ubuntu, suse, etc.)" + macOS "specific for Apple MacOS" ← capital OS, NOT 'mac' + + Severity label: + blocker "severe bug that blocks users in their daily work" + + Tool labels: + One label per tool, name == the folder name under url/tool/ in the repo. + Fetched dynamically via the GitHub Contents API. +""" + +import argparse +import json +import os +import sys +import urllib.error +import urllib.parse +import urllib.request +from collections import defaultdict +from datetime import datetime, timezone + +# ─── Configuration ──────────────────────────────────────────────────────────── + +REPO = "devonfw/IDEasy" +API_BASE = "https://api.github.com" + +# Path inside the repo where one sub-folder == one tool label +# Must be relative to the repo root (no leading ../) +TOOL_FOLDER_PATH = "url-updater/src/main/java/com/devonfw/tools/ide/url/tool" + +# ── OS labels (exact case as used in the repo) ──────────────────────────────── +OS_LABELS = {"windows": "windows", "linux": "linux", "mac": "macOS"} +OS_ORDER = ["windows", "linux", "mac"] +OS_DISPLAY = {"windows": "Windows", "linux": "Linux", "mac": "macOS"} + +# ── Bug detection ───────────────────────────────────────────────────────────── +BUG_TYPE_NAMES = {"Bug", "bug"} # GitHub Types name OR legacy label +BLOCKER_LABEL = "blocker" + +# ── Tool registry ───────────────────────────────────────────────────────────── +# Single source of truth for every tool. +# +# Key → canonical folder name under url/tool/ (also the default label) +# "display" → human-readable name shown in the generated document +# "labels" → (optional) additional GitHub label names that map to this tool, +# for cases where the label differs from the folder name +# +# TOOL_DISPLAY_OVERRIDES and LABEL_ALIASES are derived from this dict +# automatically — do not edit them directly. +TOOLS: dict[str, dict] = { + "android-studio": {"display": "Android Studio"}, + "aws": {"display": "AWS CLI"}, + "az": {"display": "Azure CLI", "labels": ["azure-cli"]}, + "copilot": {"display": "GitHub Copilot", "labels": ["github-copilot"]}, + "corepack": {"display": "Corepack"}, + "docker": {"display": "Docker"}, + "dotnet": {"display": "dotnet"}, + "eclipse": {"display": "Eclipse"}, + "gcloud": {"display": "gcloud CLI"}, + "gcviewer": {"display": "GCViewer"}, + "gh": {"display": "GitHub CLI"}, + "git": {"display": "git"}, + "gradle": {"display": "Gradle"}, + "helm": {"display": "Helm"}, + "intellij": {"display": "IntelliJ IDEA", "labels": ["intellij-idea"]}, + "jackson": {"display": "Jackson"}, + "java": {"display": "Java (JDK)", "labels": ["jdk"]}, + "jasypt": {"display": "Jasypt"}, + "jmc": {"display": "JDK Mission Control"}, + "kubectl": {"display": "kubectl"}, + "mvn": {"display": "Maven", "labels": ["maven"]}, + "node": {"display": "Node.js / npm", "labels": ["nodejs", "npm"]}, + "oc": {"display": "OpenShift CLI"}, + "pip": {"display": "pip"}, + "python": {"display": "Python"}, + "quarkus": {"display": "Quarkus CLI"}, + "sonar": {"display": "SonarQube", "labels": ["sonarqube"]}, + "terraform": {"display": "Terraform"}, + "vscode": {"display": "VS Code", "labels": ["vsc"]}, +} + +# Derived lookups — single source is TOOLS above, do not edit manually. +TOOL_DISPLAY_OVERRIDES: dict[str, str] = { + name: cfg["display"] for name, cfg in TOOLS.items() +} +LABEL_ALIASES: dict[str, str] = { + alias: name + for name, cfg in TOOLS.items() + for alias in cfg.get("labels", []) +} + + +# ─── GitHub API helpers ─────────────────────────────────────────────────────── + +def _get(path: str, token: str | None, params: dict | None = None): + url = f"{API_BASE}{path}" + if params: + url += "?" + urllib.parse.urlencode(params) + req = urllib.request.Request(url) + req.add_header("Accept", "application/vnd.github+json") + req.add_header("X-GitHub-Api-Version", "2022-11-28") + if token: + req.add_header("Authorization", f"Bearer {token}") + with urllib.request.urlopen(req) as resp: + return json.loads(resp.read().decode()) + + +def fetch_tool_names(token: str | None) -> list[str]: + """ + Fetch the sub-folder names under TOOL_FOLDER_PATH via the GitHub Contents + API. Each folder == one tool, and its name == the issue label used for that + tool. Returns a sorted list of names. + Falls back to an empty list if the API call fails (e.g. rate-limited without + a token), in which case only commandlet/core sections will appear. + """ + try: + entries = _get(f"/repos/{REPO}/contents/{TOOL_FOLDER_PATH}", token) + return sorted( + e["name"] for e in entries + if isinstance(e, dict) and e.get("type") == "dir" + ) + except urllib.error.HTTPError as exc: + hint = "" if token else " Set GITHUB_TOKEN to avoid rate limiting." + print(f"WARNING: Could not fetch tool list ({exc.code} {exc.reason}). " + f"Only commandlet/core sections will be generated.{hint}", + file=sys.stderr) + return [] + except Exception as exc: + print(f"WARNING: Could not fetch tool list ({exc}). " + "Only commandlet/core sections will be generated.", file=sys.stderr) + return [] + + +def fetch_all_issues(token: str | None, state: str = "open") -> list[dict]: + """Fetch all issues (not PRs) with pagination.""" + issues: list[dict] = [] + page = 1 + while True: + batch = _get( + f"/repos/{REPO}/issues", token, + {"state": state, "per_page": 100, "page": page}, + ) + if not isinstance(batch, list) or not batch: + break + for item in batch: + if "pull_request" not in item: + issues.append(item) + if len(batch) < 100: + break + page += 1 + return issues + + +# ─── Issue classification ───────────────────────────────────────────────────── + +def label_names(issue: dict) -> set[str]: + return {lbl["name"] for lbl in issue.get("labels", [])} + + +def is_bug(issue: dict, labels: set[str]) -> bool: + """ + Detect bugs via (in priority order): + 1. GitHub issue type name — modern issues use issue["type"]["name"] + 2. Legacy lowercase 'bug' label — older issues before GitHub Types existed + 3. 'blocker' label — implies a severe bug regardless of type field + """ + issue_type = issue.get("type") + if isinstance(issue_type, dict) and issue_type.get("name") in BUG_TYPE_NAMES: + return True + if "bug" in labels: + return True + if BLOCKER_LABEL in labels: + return True + return False + + +def is_blocker(labels: set[str]) -> bool: + return BLOCKER_LABEL in labels + + +def os_keys_for_issue(labels: set[str]) -> list[str]: + """Issues without any OS label affect all platforms.""" + found = [k for k, lbl in OS_LABELS.items() if lbl in labels] + return found if found else list(OS_ORDER) + + +def topic_labels_for_issue(labels: set[str], known_topics: set[str]) -> list[str]: + """ + Return canonical topic names (tool folder names) matched from the issue's + labels. Checks both exact matches and entries in LABEL_ALIASES so that + labels whose names differ from the folder name are still mapped correctly. + """ + matched: set[str] = set() + for lbl in labels: + if lbl in known_topics: + matched.add(lbl) # exact match + elif lbl in LABEL_ALIASES: + canonical = LABEL_ALIASES[lbl] + if canonical in known_topics: + matched.add(canonical) # alias → canonical tool name + return sorted(matched) + + +# ─── Data aggregation ───────────────────────────────────────────────────────── + +# IssueRef: (number, title, url, is_bug, is_blocker) +IssueRef = tuple[int, str, str, bool, bool] + + +def build_table( + issues: list[dict], + known_topics: set[str], +) -> dict[str, dict[str, list[IssueRef]]]: + """Return data[os_key][topic_label] = list[IssueRef].""" + data: dict[str, dict[str, list[IssueRef]]] = defaultdict(lambda: defaultdict(list)) + for issue in issues: + labels = label_names(issue) + topics = topic_labels_for_issue(labels, known_topics) + if not topics: + continue + bug = is_bug(issue, labels) + blocker = is_blocker(labels) + os_keys = os_keys_for_issue(labels) + ref: IssueRef = (issue["number"], issue["title"], issue["html_url"], bug, blocker) + for os_key in os_keys: + for topic in topics: + data[os_key][topic].append(ref) + return data + + +# ─── Status symbol ──────────────────────────────────────────────────────────── + +def status_symbol(refs: list[IssueRef]) -> str: + if not refs: + return "🟢" + if any(blk for *_, blk in refs): + return "🚨" + if any(bug for _, _, _, bug, _ in refs): + return "🔴" + return "🟡" + + +# ─── AsciiDoc cell helpers ──────────────────────────────────────────────────── + +def _safe(text: str, max_len: int = 75) -> str: + """Strip characters that break AsciiDoc table cells.""" + return text.replace("|", "-").replace("\n", " ")[:max_len] + ( + "..." if len(text) > max_len else "" + ) + + +def fmt_links(refs: list[IssueRef]) -> str: + if not refs: + return "-" + return " ".join(f"link:{url}[#{num}]" for num, _, url, _, _ in sorted(refs)) + + +def fmt_notes(refs: list[IssueRef]) -> str: + if not refs: + return "No open issues" + parts = [ + f"{'🚨 ' if blk else ''}#{num}: {_safe(title)}" + for num, title, _, _, blk in sorted(refs) + ] + return "; ".join(parts) + + +# ─── AsciiDoc generation ────────────────────────────────────────────────────── + +_HEADER = """\ += Quality Status +:toc: left +:toclevels: 2 +:icons: font +:source-highlighter: rouge + +== Overview + +This document gives an overview of the quality and support status of IDEasy tools across +operating systems. +It is *automatically generated* from open GitHub issues in the +https://github.com/{repo}[{repo}] repository. +The tool list is discovered dynamically from the source tree, so it stays +accurate as new tools are added. + +Legend: + +[cols="1,4"] +|=== +| Symbol | Meaning + +| 🟢 | No known open issues +| 🟡 | Open feature requests / enhancements only (no bugs) +| 🔴 | At least one open bug +| 🚨 | At least one *blocker* (fully prevents users from working) +|=== + +_Last generated: {date}_ + +""" + + +def _table_section( + section_title: str, + col_header: str, + rows: list[tuple[str, str]], # (label, display_name) + os_data: dict[str, list[IssueRef]], +) -> list[str]: + """Render one [cols=...] AsciiDoc table for a category.""" + lines = [ + f"=== {section_title}\n", + '[cols="2,1,4,5", options="header"]', + "|===", + f"| {col_header} | Status | Issues | Notes", + ] + for lbl, disp in rows: + refs = os_data.get(lbl, []) + lines += [ + f"| {disp}", + f"| {status_symbol(refs)}", + f"| {fmt_links(refs)}", + f"| {fmt_notes(refs)}", + "", # blank line = row separator in AsciiDoc tables + ] + lines.append("|===\n") + return lines + + +def _os_section( + os_key: str, + os_data: dict[str, list[IssueRef]], + tool_rows: list[tuple[str, str]], +) -> str: + os_name = OS_DISPLAY[os_key] + os_lbl = OS_LABELS[os_key] + + lines = [ + f"== {os_name}\n", + f"Open issues labelled `{os_lbl}` " + f"(or without any OS label — those affect all platforms).\n", + ] + lines += _table_section("Tools", "Tool", tool_rows, os_data) + return "\n".join(lines) + + +def generate_adoc( + issues: list[dict], + tool_names: list[str], +) -> str: + tool_rows: list[tuple[str, str]] = [ + (name, TOOL_DISPLAY_OVERRIDES.get(name, name.replace("-", " ").title())) + for name in tool_names + ] + + known_topics: set[str] = {t[0] for t in tool_rows} + + table = build_table(issues, known_topics) + date = datetime.now(timezone.utc).strftime("%Y-%m-%d %H:%M UTC") + header = _HEADER.format(repo=REPO, date=date) + + parts = [header] + for os_key in OS_ORDER: + parts.append(_os_section(os_key, table.get(os_key, {}), tool_rows)) + + parts.append("""\ +== How to contribute + +*Adding a new tool* is automatic: as soon as a new folder is added under +`url-updater/src/main/java/com/devonfw/tools/ide/url/tool/` and issues are +labelled with that folder name, the tool appears in the next generated document. +To add a nicer display name, add an entry to `TOOL_DISPLAY_OVERRIDES` in this script. +To map a non-standard label name to a tool, add an entry to `LABEL_ALIASES`. +""") + + return "\n".join(parts) + + +def main() -> None: + parser = argparse.ArgumentParser(description=f"Generate quality-status.adoc for {REPO}") + parser.add_argument("--token", default=os.environ.get("GITHUB_TOKEN"), + help="GitHub personal access token (or set GITHUB_TOKEN env var)") + parser.add_argument("--output", default="quality-status.adoc", + help="Output file path (default: quality-status.adoc)") + parser.add_argument("--state", default="open", choices=["open", "all"], + help="Issue state to include (default: open)") + args = parser.parse_args() + + if not args.token: + print("WARNING: No GITHUB_TOKEN set — unauthenticated requests are limited " + "to 60/hour and the tool list fetch also counts against that quota.", + file=sys.stderr) + + print("Fetching tool list from source tree ...", file=sys.stderr) + tool_names = fetch_tool_names(args.token) + if tool_names: + print(f" {len(tool_names)} tools found: {', '.join(tool_names)}", file=sys.stderr) + else: + print(" No tools found — check GITHUB_TOKEN and network access.", file=sys.stderr) + + print(f"Fetching {args.state} issues from {REPO} ...", file=sys.stderr) + try: + issues = fetch_all_issues(args.token, state=args.state) + except urllib.error.HTTPError as exc: + print(f"GitHub API error: HTTP {exc.code} {exc.reason}", file=sys.stderr) + sys.exit(1) + print(f" {len(issues)} issues loaded.", file=sys.stderr) + + # Debug: report any issue labels that matched neither a tool nor an alias. + # Useful for discovering new LABEL_ALIASES entries to add. + known_topics: set[str] = set(tool_names) + os_label_values = set(OS_LABELS.values()) + skip_labels = os_label_values | {BLOCKER_LABEL, "bug", "enhancement", "question", + "duplicate", "wontfix", "invalid", "help wanted", + "good first issue", "documentation"} + all_issue_labels = {lbl["name"] for issue in issues for lbl in issue.get("labels", [])} + unmatched = all_issue_labels - known_topics - set(LABEL_ALIASES) - skip_labels + if unmatched: + print(f" Unmatched labels (consider adding to LABEL_ALIASES): " + f"{', '.join(sorted(unmatched))}", file=sys.stderr) + + adoc = generate_adoc(issues, tool_names) + with open(args.output, "w", encoding="utf-8") as fh: + fh.write(adoc) + print(f"Written to {args.output}", file=sys.stderr) + + +if __name__ == "__main__": + main() diff --git a/documentation/quality-status.adoc b/documentation/quality-status.adoc new file mode 100644 index 0000000000..504a2dacf8 --- /dev/null +++ b/documentation/quality-status.adoc @@ -0,0 +1,655 @@ += Quality Status +:toc: left +:toclevels: 2 +:icons: font +:source-highlighter: rouge + +== Overview + +This document gives an overview of the quality and support status of IDEasy tools across +operating systems. +It is *automatically generated* from open GitHub issues in the +https://github.com/devonfw/IDEasy[devonfw/IDEasy] repository. +The tool list is discovered dynamically from the source tree, so it stays +accurate as new tools are added. + +Legend: + +[cols="1,4"] +|=== +| Symbol | Meaning + +| 🟢 | No known open issues +| 🟡 | Open feature requests / enhancements only (no bugs) +| 🔴 | At least one open bug +| 🚨 | At least one *blocker* (fully prevents users from working) +|=== + +_Last generated: 2026-05-06 08:11 UTC_ + + +== Windows + +Open issues labelled `windows` (or without any OS label — those affect all platforms). + +=== Tools + +[cols="2,1,4,5", options="header"] +|=== +| Tool | Status | Issues | Notes +| Androidstudio +| 🟢 +| - +| No open issues + +| AWS CLI +| 🟡 +| link:https://github.com/devonfw/IDEasy/issues/703[#703] +| #703: Support AWS CDK + +| Azure CLI +| 🔴 +| link:https://github.com/devonfw/IDEasy/issues/855[#855] +| #855: ide az config not working + +| GitHub Copilot +| 🟡 +| link:https://github.com/devonfw/IDEasy/issues/1717[#1717] +| #1717: Add github-copliot-cli as software package + +| Corepack +| 🟢 +| - +| No open issues + +| Docker +| 🔴 +| link:https://github.com/devonfw/IDEasy/issues/44[#44] link:https://github.com/devonfw/IDEasy/issues/1181[#1181] link:https://github.com/devonfw/IDEasy/issues/1659[#1659] link:https://github.com/devonfw/IDEasy/issues/1868[#1868] +| #44: DockerUrlUpdater not finding/adding specific versions; #1181: Improve url updater for docker desktop to pull all necessary versions; #1659: Global tools run tool while installation is running in background; #1868: Revision of the functionality of global tool commandlets + +| dotnet +| 🟢 +| - +| No open issues + +| Eclipse +| 🟡 +| link:https://github.com/devonfw/IDEasy/issues/1165[#1165] link:https://github.com/devonfw/IDEasy/issues/1525[#1525] +| #1165: Automatic project import for Eclipse; #1525: lombok not correctly installed in eclipse + +| gcloud CLI +| 🟡 +| link:https://github.com/devonfw/IDEasy/issues/19[#19] +| #19: Implement ToolCommandlet for Google Cloud CLI + +| GCViewer +| 🟡 +| link:https://github.com/devonfw/IDEasy/issues/825[#825] +| #825: Consider adding GC Log Analyzer + +| GitHub CLI +| 🟢 +| - +| No open issues + +| Go +| 🟢 +| - +| No open issues + +| Graalvm +| 🟢 +| - +| No open issues + +| Gradle +| 🟢 +| - +| No open issues + +| Helm +| 🟢 +| - +| No open issues + +| IntelliJ IDEA +| 🔴 +| link:https://github.com/devonfw/IDEasy/issues/120[#120] link:https://github.com/devonfw/IDEasy/issues/717[#717] link:https://github.com/devonfw/IDEasy/issues/992[#992] link:https://github.com/devonfw/IDEasy/issues/1501[#1501] +| #120: intellij does not use our settings when we create a new project within inte...; #717: IDEasy does not start Intellij if license was not accepted; #992: Support multiple attributes for merge:id; #1501: Starting intellij leads to error popup + +| Jasypt +| 🟢 +| - +| No open issues + +| Java (JDK) +| 🟢 +| - +| No open issues + +| Jenkins +| 🟢 +| - +| No open issues + +| JDK Mission Control +| 🟢 +| - +| No open issues + +| Kotlinc +| 🔴 +| link:https://github.com/devonfw/IDEasy/issues/857[#857] +| #857: kotlinc bash does not get keyboard inputs + +| Lazydocker +| 🟢 +| - +| No open issues + +| Maven +| 🔴 +| link:https://github.com/devonfw/IDEasy/issues/594[#594] +| #594: Still windows file locking problems + +| Ng +| 🟢 +| - +| No open issues + +| Node.js / npm +| 🔴 +| link:https://github.com/devonfw/IDEasy/issues/859[#859] +| #859: node shell not starting + +| Npm +| 🔴 +| link:https://github.com/devonfw/IDEasy/issues/1886[#1886] +| #1886: NpmBasedCommandlet shows wrong tool version after install + +| OpenShift CLI +| 🟢 +| - +| No open issues + +| Pgadmin +| 🔴 +| link:https://github.com/devonfw/IDEasy/issues/861[#861] link:https://github.com/devonfw/IDEasy/issues/1868[#1868] +| #861: install of pgadmin throws an IllegalStateException when the install wizzard...; #1868: Revision of the functionality of global tool commandlets + +| pip +| 🟢 +| - +| No open issues + +| Pycharm +| 🟢 +| - +| No open issues + +| Python +| 🔴 +| link:https://github.com/devonfw/IDEasy/issues/1124[#1124] +| #1124: Ensure latest version of Python is installed + +| Quarkus CLI +| 🟢 +| - +| No open issues + +| Rust +| 🟡 +| link:https://github.com/devonfw/IDEasy/issues/1719[#1719] +| #1719: Integrate rust + +| SonarQube +| 🟢 +| - +| No open issues + +| Squirrelsql +| 🟢 +| - +| No open issues + +| Terraform +| 🔴 +| link:https://github.com/devonfw/IDEasy/issues/1391[#1391] +| #1391: bashrc messed with terraform completions + +| Tomcat +| 🟢 +| - +| No open issues + +| Uv +| 🔴 +| link:https://github.com/devonfw/IDEasy/issues/1518[#1518] +| #1518: uv tools are installed globally + +| VS Code +| 🟡 +| link:https://github.com/devonfw/IDEasy/issues/787[#787] link:https://github.com/devonfw/IDEasy/issues/1167[#1167] link:https://github.com/devonfw/IDEasy/issues/1715[#1715] link:https://github.com/devonfw/IDEasy/issues/1754[#1754] link:https://github.com/devonfw/IDEasy/issues/1849[#1849] +| #787: Provide variable to disable open new workspace; #1167: Automatic project import for VSCode; #1715: Adapt settings to inject java runtime future proove into vscode; #1754: Add version support to vscode settings .plugin files; #1849: Support VSCodium + +|=== + +== Linux + +Open issues labelled `linux` (or without any OS label — those affect all platforms). + +=== Tools + +[cols="2,1,4,5", options="header"] +|=== +| Tool | Status | Issues | Notes +| Androidstudio +| 🟢 +| - +| No open issues + +| AWS CLI +| 🟡 +| link:https://github.com/devonfw/IDEasy/issues/703[#703] +| #703: Support AWS CDK + +| Azure CLI +| 🔴 +| link:https://github.com/devonfw/IDEasy/issues/802[#802] link:https://github.com/devonfw/IDEasy/issues/855[#855] +| #802: az not working on Mac; #855: ide az config not working + +| GitHub Copilot +| 🟡 +| link:https://github.com/devonfw/IDEasy/issues/1717[#1717] +| #1717: Add github-copliot-cli as software package + +| Corepack +| 🟢 +| - +| No open issues + +| Docker +| 🔴 +| link:https://github.com/devonfw/IDEasy/issues/44[#44] link:https://github.com/devonfw/IDEasy/issues/950[#950] link:https://github.com/devonfw/IDEasy/issues/1181[#1181] link:https://github.com/devonfw/IDEasy/issues/1659[#1659] link:https://github.com/devonfw/IDEasy/issues/1868[#1868] +| #44: DockerUrlUpdater not finding/adding specific versions; #950: avoid --no-gpg-checks for docker installation on SUSE Linux; #1181: Improve url updater for docker desktop to pull all necessary versions; #1659: Global tools run tool while installation is running in background; #1868: Revision of the functionality of global tool commandlets + +| dotnet +| 🟢 +| - +| No open issues + +| Eclipse +| 🟡 +| link:https://github.com/devonfw/IDEasy/issues/1165[#1165] link:https://github.com/devonfw/IDEasy/issues/1525[#1525] +| #1165: Automatic project import for Eclipse; #1525: lombok not correctly installed in eclipse + +| gcloud CLI +| 🟡 +| link:https://github.com/devonfw/IDEasy/issues/19[#19] +| #19: Implement ToolCommandlet for Google Cloud CLI + +| GCViewer +| 🟡 +| link:https://github.com/devonfw/IDEasy/issues/825[#825] +| #825: Consider adding GC Log Analyzer + +| GitHub CLI +| 🟢 +| - +| No open issues + +| Go +| 🟢 +| - +| No open issues + +| Graalvm +| 🟢 +| - +| No open issues + +| Gradle +| 🟢 +| - +| No open issues + +| Helm +| 🟢 +| - +| No open issues + +| IntelliJ IDEA +| 🔴 +| link:https://github.com/devonfw/IDEasy/issues/120[#120] link:https://github.com/devonfw/IDEasy/issues/717[#717] link:https://github.com/devonfw/IDEasy/issues/992[#992] link:https://github.com/devonfw/IDEasy/issues/1501[#1501] +| #120: intellij does not use our settings when we create a new project within inte...; #717: IDEasy does not start Intellij if license was not accepted; #992: Support multiple attributes for merge:id; #1501: Starting intellij leads to error popup + +| Jasypt +| 🟢 +| - +| No open issues + +| Java (JDK) +| 🟢 +| - +| No open issues + +| Jenkins +| 🟢 +| - +| No open issues + +| JDK Mission Control +| 🟢 +| - +| No open issues + +| Kotlinc +| 🔴 +| link:https://github.com/devonfw/IDEasy/issues/857[#857] +| #857: kotlinc bash does not get keyboard inputs + +| Lazydocker +| 🟢 +| - +| No open issues + +| Maven +| 🟢 +| - +| No open issues + +| Ng +| 🟢 +| - +| No open issues + +| Node.js / npm +| 🔴 +| link:https://github.com/devonfw/IDEasy/issues/859[#859] +| #859: node shell not starting + +| Npm +| 🔴 +| link:https://github.com/devonfw/IDEasy/issues/1886[#1886] +| #1886: NpmBasedCommandlet shows wrong tool version after install + +| OpenShift CLI +| 🟢 +| - +| No open issues + +| Pgadmin +| 🔴 +| link:https://github.com/devonfw/IDEasy/issues/861[#861] link:https://github.com/devonfw/IDEasy/issues/1868[#1868] +| #861: install of pgadmin throws an IllegalStateException when the install wizzard...; #1868: Revision of the functionality of global tool commandlets + +| pip +| 🟢 +| - +| No open issues + +| Pycharm +| 🟢 +| - +| No open issues + +| Python +| 🔴 +| link:https://github.com/devonfw/IDEasy/issues/1046[#1046] link:https://github.com/devonfw/IDEasy/issues/1124[#1124] +| #1046: Add Support for Python on Linux; #1124: Ensure latest version of Python is installed + +| Quarkus CLI +| 🟢 +| - +| No open issues + +| Rust +| 🟡 +| link:https://github.com/devonfw/IDEasy/issues/1719[#1719] +| #1719: Integrate rust + +| SonarQube +| 🟢 +| - +| No open issues + +| Squirrelsql +| 🟢 +| - +| No open issues + +| Terraform +| 🔴 +| link:https://github.com/devonfw/IDEasy/issues/1391[#1391] +| #1391: bashrc messed with terraform completions + +| Tomcat +| 🟢 +| - +| No open issues + +| Uv +| 🔴 +| link:https://github.com/devonfw/IDEasy/issues/1518[#1518] +| #1518: uv tools are installed globally + +| VS Code +| 🔴 +| link:https://github.com/devonfw/IDEasy/issues/787[#787] link:https://github.com/devonfw/IDEasy/issues/1167[#1167] link:https://github.com/devonfw/IDEasy/issues/1352[#1352] link:https://github.com/devonfw/IDEasy/issues/1715[#1715] link:https://github.com/devonfw/IDEasy/issues/1754[#1754] link:https://github.com/devonfw/IDEasy/issues/1844[#1844] link:https://github.com/devonfw/IDEasy/issues/1849[#1849] +| #787: Provide variable to disable open new workspace; #1167: Automatic project import for VSCode; #1352: VSCode WSL warning prompt blocking VSCode plugin installation; #1715: Adapt settings to inject java runtime future proove into vscode; #1754: Add version support to vscode settings .plugin files; #1844: `ide install vscode` or `ide vscode` freezes at "installing plugins" step o...; #1849: Support VSCodium + +|=== + +== macOS + +Open issues labelled `macOS` (or without any OS label — those affect all platforms). + +=== Tools + +[cols="2,1,4,5", options="header"] +|=== +| Tool | Status | Issues | Notes +| Androidstudio +| 🟢 +| - +| No open issues + +| AWS CLI +| 🔴 +| link:https://github.com/devonfw/IDEasy/issues/703[#703] link:https://github.com/devonfw/IDEasy/issues/796[#796] +| #703: Support AWS CDK; #796: cannot install aws on Mac + +| Azure CLI +| 🔴 +| link:https://github.com/devonfw/IDEasy/issues/802[#802] link:https://github.com/devonfw/IDEasy/issues/855[#855] +| #802: az not working on Mac; #855: ide az config not working + +| GitHub Copilot +| 🟡 +| link:https://github.com/devonfw/IDEasy/issues/1717[#1717] +| #1717: Add github-copliot-cli as software package + +| Corepack +| 🟢 +| - +| No open issues + +| Docker +| 🔴 +| link:https://github.com/devonfw/IDEasy/issues/44[#44] link:https://github.com/devonfw/IDEasy/issues/1181[#1181] link:https://github.com/devonfw/IDEasy/issues/1659[#1659] link:https://github.com/devonfw/IDEasy/issues/1868[#1868] +| #44: DockerUrlUpdater not finding/adding specific versions; #1181: Improve url updater for docker desktop to pull all necessary versions; #1659: Global tools run tool while installation is running in background; #1868: Revision of the functionality of global tool commandlets + +| dotnet +| 🟢 +| - +| No open issues + +| Eclipse +| 🔴 +| link:https://github.com/devonfw/IDEasy/issues/1165[#1165] link:https://github.com/devonfw/IDEasy/issues/1187[#1187] link:https://github.com/devonfw/IDEasy/issues/1525[#1525] +| #1165: Automatic project import for Eclipse; #1187: Eclipse plugin installation on mac is not working; #1525: lombok not correctly installed in eclipse + +| gcloud CLI +| 🟡 +| link:https://github.com/devonfw/IDEasy/issues/19[#19] +| #19: Implement ToolCommandlet for Google Cloud CLI + +| GCViewer +| 🟡 +| link:https://github.com/devonfw/IDEasy/issues/825[#825] +| #825: Consider adding GC Log Analyzer + +| GitHub CLI +| 🟢 +| - +| No open issues + +| Go +| 🟢 +| - +| No open issues + +| Graalvm +| 🟢 +| - +| No open issues + +| Gradle +| 🟢 +| - +| No open issues + +| Helm +| 🟢 +| - +| No open issues + +| IntelliJ IDEA +| 🔴 +| link:https://github.com/devonfw/IDEasy/issues/120[#120] link:https://github.com/devonfw/IDEasy/issues/717[#717] link:https://github.com/devonfw/IDEasy/issues/992[#992] link:https://github.com/devonfw/IDEasy/issues/1501[#1501] link:https://github.com/devonfw/IDEasy/issues/1512[#1512] +| #120: intellij does not use our settings when we create a new project within inte...; #717: IDEasy does not start Intellij if license was not accepted; #992: Support multiple attributes for merge:id; #1501: Starting intellij leads to error popup; #1512: Cannot run Intellij on Mac due to file permission error + +| Jasypt +| 🟢 +| - +| No open issues + +| Java (JDK) +| 🟢 +| - +| No open issues + +| Jenkins +| 🟢 +| - +| No open issues + +| JDK Mission Control +| 🟢 +| - +| No open issues + +| Kotlinc +| 🔴 +| link:https://github.com/devonfw/IDEasy/issues/857[#857] +| #857: kotlinc bash does not get keyboard inputs + +| Lazydocker +| 🟢 +| - +| No open issues + +| Maven +| 🟢 +| - +| No open issues + +| Ng +| 🟢 +| - +| No open issues + +| Node.js / npm +| 🔴 +| link:https://github.com/devonfw/IDEasy/issues/859[#859] +| #859: node shell not starting + +| Npm +| 🔴 +| link:https://github.com/devonfw/IDEasy/issues/801[#801] link:https://github.com/devonfw/IDEasy/issues/1886[#1886] +| #801: npm not working on Mac; #1886: NpmBasedCommandlet shows wrong tool version after install + +| OpenShift CLI +| 🟢 +| - +| No open issues + +| Pgadmin +| 🔴 +| link:https://github.com/devonfw/IDEasy/issues/798[#798] link:https://github.com/devonfw/IDEasy/issues/861[#861] link:https://github.com/devonfw/IDEasy/issues/1868[#1868] +| #798: pgadmin not working on Mac; #861: install of pgadmin throws an IllegalStateException when the install wizzard...; #1868: Revision of the functionality of global tool commandlets + +| pip +| 🟢 +| - +| No open issues + +| Pycharm +| 🟢 +| - +| No open issues + +| Python +| 🔴 +| link:https://github.com/devonfw/IDEasy/issues/1124[#1124] +| #1124: Ensure latest version of Python is installed + +| Quarkus CLI +| 🟢 +| - +| No open issues + +| Rust +| 🟡 +| link:https://github.com/devonfw/IDEasy/issues/1719[#1719] +| #1719: Integrate rust + +| SonarQube +| 🔴 +| link:https://github.com/devonfw/IDEasy/issues/800[#800] +| #800: sonar not working on Mac + +| Squirrelsql +| 🟢 +| - +| No open issues + +| Terraform +| 🔴 +| link:https://github.com/devonfw/IDEasy/issues/1391[#1391] +| #1391: bashrc messed with terraform completions + +| Tomcat +| 🟢 +| - +| No open issues + +| Uv +| 🔴 +| link:https://github.com/devonfw/IDEasy/issues/1518[#1518] +| #1518: uv tools are installed globally + +| VS Code +| 🟡 +| link:https://github.com/devonfw/IDEasy/issues/787[#787] link:https://github.com/devonfw/IDEasy/issues/1167[#1167] link:https://github.com/devonfw/IDEasy/issues/1715[#1715] link:https://github.com/devonfw/IDEasy/issues/1754[#1754] link:https://github.com/devonfw/IDEasy/issues/1849[#1849] +| #787: Provide variable to disable open new workspace; #1167: Automatic project import for VSCode; #1715: Adapt settings to inject java runtime future proove into vscode; #1754: Add version support to vscode settings .plugin files; #1849: Support VSCodium + +|=== + +== How to contribute + +*Adding a new tool* is automatic: as soon as a new folder is added under +`url-updater/src/main/java/com/devonfw/tools/ide/url/tool/` and issues are +labelled with that folder name, the tool appears in the next generated document. +To add a nicer display name, add an entry to `TOOL_DISPLAY_OVERRIDES` in this script. +To map a non-standard label name to a tool, add an entry to `LABEL_ALIASES`. From 580121ac1478e060d41820799162d35ccf80b82e Mon Sep 17 00:00:00 2001 From: MarvMa Date: Wed, 6 May 2026 11:30:58 +0200 Subject: [PATCH 05/11] #1748: updated status documentation and changed structure of visualization --- documentation/generate_quality_status.py | 454 +++++++++--- documentation/quality-status.adoc | 894 ++++++++++++++++++++++- 2 files changed, 1229 insertions(+), 119 deletions(-) diff --git a/documentation/generate_quality_status.py b/documentation/generate_quality_status.py index 9fb7392210..31e49d71b9 100644 --- a/documentation/generate_quality_status.py +++ b/documentation/generate_quality_status.py @@ -6,11 +6,19 @@ 1. Fetching tool names dynamically from the url-updater source tree (url-updater/src/main/java/com/devonfw/tools/ide/url/tool/) so the list stays accurate as new tools are added to the codebase. - 2. Fetching all open GitHub issues and mapping them to tools/commandlets + 2. Fetching all open GitHub issues and mapping them to tools or commandlets by matching issue labels against the discovered tool names and the - hard-coded commandlet/core label sets. - 3. Writing a quality-status.adoc with one section per OS containing - a Tools table. + COMMANDLETS registry defined in this script. + 3. Writing a quality-status.adoc with: + - A summary section listing all active blockers and a status-at-a-glance matrix + - One section per OS, each with a Tools table and a Commandlets table + - A section for issues that could not be assigned to any known topic + +OS LABEL BEHAVIOUR +────────────────── +Issues labelled with a specific OS (windows / linux / macOS) appear *only* in +that OS section. Issues with *no* OS label are treated as cross-platform and +appear in *every* OS section (Windows, Linux, macOS). Usage: python generate_quality_status.py [--token TOKEN] [--output PATH] @@ -68,15 +76,14 @@ BLOCKER_LABEL = "blocker" # ── Tool registry ───────────────────────────────────────────────────────────── -# Single source of truth for every tool. +# Single source of truth for every managed tool. # # Key → canonical folder name under url/tool/ (also the default label) # "display" → human-readable name shown in the generated document # "labels" → (optional) additional GitHub label names that map to this tool, # for cases where the label differs from the folder name # -# TOOL_DISPLAY_OVERRIDES and LABEL_ALIASES are derived from this dict -# automatically — do not edit them directly. +# TOOL_DISPLAY_OVERRIDES and LABEL_ALIASES are derived automatically below. TOOLS: dict[str, dict] = { "android-studio": {"display": "Android Studio"}, "aws": {"display": "AWS CLI"}, @@ -109,16 +116,55 @@ "vscode": {"display": "VS Code", "labels": ["vsc"]}, } -# Derived lookups — single source is TOOLS above, do not edit manually. +# ── Commandlet / core-feature registry ─────────────────────────────────────── +# Same structure as TOOLS but for IDEasy commandlets and cross-cutting features. +# The key is the GitHub label name used for that area. +# Add or rename entries here as the project evolves. +COMMANDLETS: dict[str, dict] = { + "ide": {"display": "IDEasy (general)"}, + "install": {"display": "ide install"}, + "uninstall": {"display": "ide uninstall"}, + "update": {"display": "ide update"}, + "create-project": {"display": "ide create-project", "labels": ["create"]}, + "build": {"display": "ide build"}, + "shell": {"display": "Shell integration"}, + "completion": {"display": "Shell completion"}, + "settings": {"display": "Settings / Properties", "labels": ["configuration", "properties"]}, + "security": {"display": "Security / Credentials"}, + "repository": {"display": "Repository management", "labels": ["repo"]}, + "env": {"display": "Environment variables"}, + "plugin": {"display": "Plugin management"}, + "migration": {"display": "Migration (devonfw-ide → IDEasy)"}, + "status": {"display": "ide status"}, + "version": {"display": "Version management"}, +} + +# ── Derived lookups ──────────────────────────────────────────────────────────── +# Do not edit these directly — maintain TOOLS and COMMANDLETS above instead. + TOOL_DISPLAY_OVERRIDES: dict[str, str] = { name: cfg["display"] for name, cfg in TOOLS.items() } +COMMANDLET_DISPLAY_OVERRIDES: dict[str, str] = { + name: cfg["display"] for name, cfg in COMMANDLETS.items() +} + +# Combined alias map: non-canonical label → canonical key (tool or commandlet) LABEL_ALIASES: dict[str, str] = { alias: name - for name, cfg in TOOLS.items() + for registry in (TOOLS, COMMANDLETS) + for name, cfg in registry.items() for alias in cfg.get("labels", []) } +# Labels that are meta/infrastructure — skipped in unmatched-label reporting +_SKIP_LABELS: frozenset[str] = frozenset({ + BLOCKER_LABEL, "bug", "enhancement", "feature", "task", "question", + "duplicate", "wontfix", "invalid", "help wanted", "good first issue", + "documentation", "dependencies", "refactoring", "testing", + *OS_LABELS.values(), +}) + # ─── GitHub API helpers ─────────────────────────────────────────────────────── @@ -209,25 +255,27 @@ def is_blocker(labels: set[str]) -> bool: def os_keys_for_issue(labels: set[str]) -> list[str]: - """Issues without any OS label affect all platforms.""" + """ + Issues with a specific OS label appear only in that OS section. + Issues with NO OS label are treated as cross-platform and appear in every + OS section (Windows, Linux, macOS). + """ found = [k for k, lbl in OS_LABELS.items() if lbl in labels] return found if found else list(OS_ORDER) def topic_labels_for_issue(labels: set[str], known_topics: set[str]) -> list[str]: """ - Return canonical topic names (tool folder names) matched from the issue's - labels. Checks both exact matches and entries in LABEL_ALIASES so that - labels whose names differ from the folder name are still mapped correctly. + Return canonical topic names matched from the issue's labels. + Checks both exact matches and LABEL_ALIASES so that labels whose names + differ from the canonical key are still mapped correctly. """ matched: set[str] = set() for lbl in labels: if lbl in known_topics: - matched.add(lbl) # exact match - elif lbl in LABEL_ALIASES: - canonical = LABEL_ALIASES[lbl] - if canonical in known_topics: - matched.add(canonical) # alias → canonical tool name + matched.add(lbl) + elif lbl in LABEL_ALIASES and LABEL_ALIASES[lbl] in known_topics: + matched.add(LABEL_ALIASES[lbl]) return sorted(matched) @@ -237,25 +285,45 @@ def topic_labels_for_issue(labels: set[str], known_topics: set[str]) -> list[str IssueRef = tuple[int, str, str, bool, bool] -def build_table( +def classify_issues( issues: list[dict], - known_topics: set[str], -) -> dict[str, dict[str, list[IssueRef]]]: - """Return data[os_key][topic_label] = list[IssueRef].""" - data: dict[str, dict[str, list[IssueRef]]] = defaultdict(lambda: defaultdict(list)) + tool_keys: set[str], + commandlet_keys: set[str], +) -> tuple[ + dict[str, dict[str, list[IssueRef]]], # tool_data[os_key][tool] + dict[str, dict[str, list[IssueRef]]], # cmd_data[os_key][commandlet] + list[dict], # unassigned issues +]: + """ + Classify every issue into tools, commandlets, or unassigned. + An issue can match multiple tools/commandlets and multiple OS sections. + Issues without an OS label appear in every OS section. + """ + tool_data: dict[str, dict[str, list[IssueRef]]] = defaultdict(lambda: defaultdict(list)) + cmd_data: dict[str, dict[str, list[IssueRef]]] = defaultdict(lambda: defaultdict(list)) + unassigned: list[dict] = [] + for issue in issues: labels = label_names(issue) - topics = topic_labels_for_issue(labels, known_topics) - if not topics: - continue bug = is_bug(issue, labels) blocker = is_blocker(labels) os_keys = os_keys_for_issue(labels) ref: IssueRef = (issue["number"], issue["title"], issue["html_url"], bug, blocker) + + tool_matches = topic_labels_for_issue(labels, tool_keys) + cmd_matches = topic_labels_for_issue(labels, commandlet_keys) + + if not tool_matches and not cmd_matches: + unassigned.append(issue) + continue + for os_key in os_keys: - for topic in topics: - data[os_key][topic].append(ref) - return data + for t in tool_matches: + tool_data[os_key][t].append(ref) + for c in cmd_matches: + cmd_data[os_key][c].append(ref) + + return dict(tool_data), dict(cmd_data), unassigned # ─── Status symbol ──────────────────────────────────────────────────────────── @@ -274,9 +342,8 @@ def status_symbol(refs: list[IssueRef]) -> str: def _safe(text: str, max_len: int = 75) -> str: """Strip characters that break AsciiDoc table cells.""" - return text.replace("|", "-").replace("\n", " ")[:max_len] + ( - "..." if len(text) > max_len else "" - ) + cleaned = text.replace("|", "-").replace("\n", " ") + return cleaned[:max_len] + ("..." if len(cleaned) > max_len else "") def fmt_links(refs: list[IssueRef]) -> str: @@ -295,50 +362,19 @@ def fmt_notes(refs: list[IssueRef]) -> str: return "; ".join(parts) -# ─── AsciiDoc generation ────────────────────────────────────────────────────── - -_HEADER = """\ -= Quality Status -:toc: left -:toclevels: 2 -:icons: font -:source-highlighter: rouge - -== Overview - -This document gives an overview of the quality and support status of IDEasy tools across -operating systems. -It is *automatically generated* from open GitHub issues in the -https://github.com/{repo}[{repo}] repository. -The tool list is discovered dynamically from the source tree, so it stays -accurate as new tools are added. - -Legend: - -[cols="1,4"] -|=== -| Symbol | Meaning +# ─── AsciiDoc section builders ──────────────────────────────────────────────── -| 🟢 | No known open issues -| 🟡 | Open feature requests / enhancements only (no bugs) -| 🔴 | At least one open bug -| 🚨 | At least one *blocker* (fully prevents users from working) -|=== - -_Last generated: {date}_ - -""" - - -def _table_section( +def _render_table( section_title: str, col_header: str, - rows: list[tuple[str, str]], # (label, display_name) + rows: list[tuple[str, str]], os_data: dict[str, list[IssueRef]], + level: int = 3, ) -> list[str]: - """Render one [cols=...] AsciiDoc table for a category.""" + """Render one AsciiDoc table. `level` controls the heading depth (= signs).""" + heading = "=" * level lines = [ - f"=== {section_title}\n", + f"{heading} {section_title}\n", '[cols="2,1,4,5", options="header"]', "|===", f"| {col_header} | Status | Issues | Notes", @@ -350,61 +386,266 @@ def _table_section( f"| {status_symbol(refs)}", f"| {fmt_links(refs)}", f"| {fmt_notes(refs)}", - "", # blank line = row separator in AsciiDoc tables + "", ] lines.append("|===\n") return lines +def _summary_section( + tool_data: dict[str, dict[str, list[IssueRef]]], + cmd_data: dict[str, dict[str, list[IssueRef]]], + tool_rows: list[tuple[str, str]], + cmd_rows: list[tuple[str, str]], +) -> str: + """ + Render the top-level Summary section: + 1. Active Blockers table (🚨 only, deduplicated across OS) + 2. Status-at-a-glance matrix for Tools (non-green rows only) + 3. Status-at-a-glance matrix for Commandlets (non-green rows only) + """ + lines: list[str] = [ + "== Summary\n", + "Quick overview of the most critical open issues across all platforms.\n", + ] + + # ── 1. Active Blockers ──────────────────────────────────────────────────── + lines += [ + "=== 🚨 Active Blockers\n", + "Issues labelled `blocker` that currently prevent users from working.\n", + ] + + # Collect all blocker refs, deduplicated by issue number + seen_blocker_ids: set[int] = set() + unique_blockers: list[tuple[str, str, IssueRef]] = [] # (category, display, ref) + + for os_key in OS_ORDER: + for lbl, disp in tool_rows: + for ref in tool_data.get(os_key, {}).get(lbl, []): + if ref[4] and ref[0] not in seen_blocker_ids: + seen_blocker_ids.add(ref[0]) + unique_blockers.append(("Tool", disp, ref)) + for lbl, disp in cmd_rows: + for ref in cmd_data.get(os_key, {}).get(lbl, []): + if ref[4] and ref[0] not in seen_blocker_ids: + seen_blocker_ids.add(ref[0]) + unique_blockers.append(("Commandlet", disp, ref)) + + if unique_blockers: + lines += [ + '[cols="1,2,2,5", options="header"]', + "|===", + "| Type | Tool / Commandlet | Issue | Title", + ] + for cat, disp, (num, title, url, _, _) in sorted( + unique_blockers, key=lambda r: r[2][0] + ): + lines += [ + f"| {cat}", + f"| {disp}", + f"| link:{url}[#{num}]", + f"| {_safe(title)}", + "", + ] + lines.append("|===\n") + else: + lines.append("_No active blockers_ 🎉\n") + + # ── 2. Status matrix — Tools ────────────────────────────────────────────── + lines += [ + "=== Status Matrix — Tools\n", + "Only tools with at least one open issue are shown.\n", + '[cols="3,1,1,1", options="header"]', + "|===", + "| Tool | Windows | Linux | macOS", + ] + for lbl, disp in tool_rows: + cells = [ + status_symbol(tool_data.get(os_key, {}).get(lbl, [])) + for os_key in OS_ORDER + ] + if any(c != "🟢" for c in cells): + lines += [f"| {disp}", *[f"| {c}" for c in cells], ""] + lines.append("|===\n") + + # ── 3. Status matrix — Commandlets ─────────────────────────────────────── + lines += [ + "=== Status Matrix — Commandlets & Core Features\n", + "Only commandlets with at least one open issue are shown.\n", + '[cols="3,1,1,1", options="header"]', + "|===", + "| Commandlet / Feature | Windows | Linux | macOS", + ] + for lbl, disp in cmd_rows: + cells = [ + status_symbol(cmd_data.get(os_key, {}).get(lbl, [])) + for os_key in OS_ORDER + ] + if any(c != "🟢" for c in cells): + lines += [f"| {disp}", *[f"| {c}" for c in cells], ""] + lines.append("|===\n") + + return "\n".join(lines) + + def _os_section( os_key: str, - os_data: dict[str, list[IssueRef]], + tool_data_for_os: dict[str, list[IssueRef]], + cmd_data_for_os: dict[str, list[IssueRef]], tool_rows: list[tuple[str, str]], + cmd_rows: list[tuple[str, str]], ) -> str: os_name = OS_DISPLAY[os_key] os_lbl = OS_LABELS[os_key] - lines = [ + lines: list[str] = [ f"== {os_name}\n", - f"Open issues labelled `{os_lbl}` " - f"(or without any OS label — those affect all platforms).\n", + f"Open issues labelled `{os_lbl}` *or without any OS label*.\n", + "NOTE: Issues without an OS label are cross-platform and therefore " + "appear in every OS section.\n", ] - lines += _table_section("Tools", "Tool", tool_rows, os_data) + lines += _render_table("Tools", "Tool", tool_rows, tool_data_for_os, level=3) + lines += _render_table( + "Commandlets & Core Features", "Commandlet / Feature", + cmd_rows, cmd_data_for_os, level=3, + ) return "\n".join(lines) -def generate_adoc( - issues: list[dict], - tool_names: list[str], -) -> str: +def _unassigned_section(unassigned: list[dict]) -> str: + """Render a section listing issues that could not be matched to any topic.""" + lines: list[str] = [ + "== Unassigned Issues\n", + f"The following {len(unassigned)} issue(s) could not be matched to any known " + "tool or commandlet. Add the appropriate label on GitHub, or extend " + "`TOOLS`, `COMMANDLETS`, or their `\"labels\"` lists in this script.\n", + ] + if not unassigned: + lines.append("_All issues are assigned._ 🎉\n") + return "\n".join(lines) + + lines += [ + '[cols="1,4,3", options="header"]', + "|===", + "| Issue | Title | Labels", + ] + for issue in sorted(unassigned, key=lambda i: i["number"]): + num = issue["number"] + url = issue["html_url"] + lbls = ", ".join(lbl["name"] for lbl in issue.get("labels", [])) + lines += [ + f"| link:{url}[#{num}]", + f"| {_safe(issue['title'])}", + f"| {lbls or '—'}", + "", + ] + lines.append("|===\n") + return "\n".join(lines) + + +# ─── Header template ────────────────────────────────────────────────────────── + +_HEADER = """\ += Quality Status +:toc: left +:toclevels: 2 +:icons: font +:source-highlighter: rouge + +== Overview + +This document gives an overview of the quality and support status of IDEasy tools +and commandlets across operating systems. +It is *automatically generated* from open GitHub issues in the +https://github.com/{repo}[{repo}] repository. +The tool list is discovered dynamically from the source tree, so it stays +accurate as new tools are added. + +*OS label behaviour:* Issues labelled with a specific OS appear only in that OS +section. Issues with *no OS label* are treated as cross-platform and appear in +*every* OS section (Windows, Linux, macOS). + +Legend: + +[cols="1,4"] +|=== +| Symbol | Meaning + +| 🟢 | No known open issues +| 🟡 | Open feature requests / enhancements only (no bugs) +| 🔴 | At least one open bug +| 🚨 | At least one *blocker* (fully prevents users from working) +|=== + +_Last generated: {date} — {total} issues loaded, {matched} assigned, {unassigned} unassigned_ + +""" + + +# ─── Main generation ────────────────────────────────────────────────────────── + +def generate_adoc(issues: list[dict], tool_names: list[str]) -> str: tool_rows: list[tuple[str, str]] = [ (name, TOOL_DISPLAY_OVERRIDES.get(name, name.replace("-", " ").title())) for name in tool_names ] + cmd_rows: list[tuple[str, str]] = [ + (name, COMMANDLET_DISPLAY_OVERRIDES[name]) + for name in COMMANDLETS + ] - known_topics: set[str] = {t[0] for t in tool_rows} + tool_keys = {r[0] for r in tool_rows} + commandlet_keys = {r[0] for r in cmd_rows} + + tool_data, cmd_data, unassigned = classify_issues(issues, tool_keys, commandlet_keys) - table = build_table(issues, known_topics) date = datetime.now(timezone.utc).strftime("%Y-%m-%d %H:%M UTC") - header = _HEADER.format(repo=REPO, date=date) + header = _HEADER.format( + repo=REPO, date=date, + total=len(issues), + matched=len(issues) - len(unassigned), + unassigned=len(unassigned), + ) parts = [header] + parts.append(_summary_section(tool_data, cmd_data, tool_rows, cmd_rows)) + for os_key in OS_ORDER: - parts.append(_os_section(os_key, table.get(os_key, {}), tool_rows)) + parts.append(_os_section( + os_key, + tool_data.get(os_key, {}), + cmd_data.get(os_key, {}), + tool_rows, + cmd_rows, + )) + + parts.append(_unassigned_section(unassigned)) parts.append("""\ -== How to contribute +== How to Contribute -*Adding a new tool* is automatic: as soon as a new folder is added under +=== Adding a new tool +Adding a new tool is automatic: as soon as a new folder is added under `url-updater/src/main/java/com/devonfw/tools/ide/url/tool/` and issues are labelled with that folder name, the tool appears in the next generated document. -To add a nicer display name, add an entry to `TOOL_DISPLAY_OVERRIDES` in this script. -To map a non-standard label name to a tool, add an entry to `LABEL_ALIASES`. +To override the display name, add an entry to `TOOLS` in this script. + +=== Adding a new commandlet +Add an entry to the `COMMANDLETS` dict in this script. The key is the GitHub +label name; `"display"` is the human-readable name; `"labels"` lists any +alternative label names that should also map to this commandlet. + +=== Mapping a non-standard label +If a GitHub label does not match any key in `TOOLS` or `COMMANDLETS`, add the +label name to the `"labels"` list of the appropriate registry entry. +Any remaining unmatched issues will appear in the *Unassigned Issues* section. """) return "\n".join(parts) +# ─── Main entry point ───────────────────────────────────────────────────────── + def main() -> None: parser = argparse.ArgumentParser(description=f"Generate quality-status.adoc for {REPO}") parser.add_argument("--token", default=os.environ.get("GITHUB_TOKEN"), @@ -420,6 +661,7 @@ def main() -> None: "to 60/hour and the tool list fetch also counts against that quota.", file=sys.stderr) + # ── Fetch tool list ────────────────────────────────────────────────────── print("Fetching tool list from source tree ...", file=sys.stderr) tool_names = fetch_tool_names(args.token) if tool_names: @@ -427,6 +669,7 @@ def main() -> None: else: print(" No tools found — check GITHUB_TOKEN and network access.", file=sys.stderr) + # ── Fetch issues ───────────────────────────────────────────────────────── print(f"Fetching {args.state} issues from {REPO} ...", file=sys.stderr) try: issues = fetch_all_issues(args.token, state=args.state) @@ -435,19 +678,30 @@ def main() -> None: sys.exit(1) print(f" {len(issues)} issues loaded.", file=sys.stderr) - # Debug: report any issue labels that matched neither a tool nor an alias. - # Useful for discovering new LABEL_ALIASES entries to add. - known_topics: set[str] = set(tool_names) - os_label_values = set(OS_LABELS.values()) - skip_labels = os_label_values | {BLOCKER_LABEL, "bug", "enhancement", "question", - "duplicate", "wontfix", "invalid", "help wanted", - "good first issue", "documentation"} - all_issue_labels = {lbl["name"] for issue in issues for lbl in issue.get("labels", [])} - unmatched = all_issue_labels - known_topics - set(LABEL_ALIASES) - skip_labels - if unmatched: - print(f" Unmatched labels (consider adding to LABEL_ALIASES): " - f"{', '.join(sorted(unmatched))}", file=sys.stderr) + # ── Assignment statistics ───────────────────────────────────────────────── + tool_keys = set(tool_names) + commandlet_keys = set(COMMANDLETS.keys()) + _, _, unassigned = classify_issues(issues, tool_keys, commandlet_keys) + matched_count = len(issues) - len(unassigned) + pct = f" ({matched_count / len(issues) * 100:.1f}% of total)" if issues else "" + + print(f" {matched_count} issues assigned{pct}", file=sys.stderr) + print(f" {len(unassigned)} issues unassigned", file=sys.stderr) + + # ── Unmatched label report ──────────────────────────────────────────────── + all_known = tool_keys | commandlet_keys | set(LABEL_ALIASES) + all_issue_labels = { + lbl["name"] for issue in issues for lbl in issue.get("labels", []) + } + unmatched_labels = all_issue_labels - all_known - _SKIP_LABELS + if unmatched_labels: + print( + f" Unmatched labels (consider adding to TOOLS/COMMANDLETS/labels): " + f"{', '.join(sorted(unmatched_labels))}", + file=sys.stderr, + ) + # ── Write output ───────────────────────────────────────────────────────── adoc = generate_adoc(issues, tool_names) with open(args.output, "w", encoding="utf-8") as fh: fh.write(adoc) diff --git a/documentation/quality-status.adoc b/documentation/quality-status.adoc index 504a2dacf8..f5ee5f8438 100644 --- a/documentation/quality-status.adoc +++ b/documentation/quality-status.adoc @@ -6,13 +6,17 @@ == Overview -This document gives an overview of the quality and support status of IDEasy tools across -operating systems. +This document gives an overview of the quality and support status of IDEasy tools +and commandlets across operating systems. It is *automatically generated* from open GitHub issues in the https://github.com/devonfw/IDEasy[devonfw/IDEasy] repository. The tool list is discovered dynamically from the source tree, so it stays accurate as new tools are added. +*OS label behaviour:* Issues labelled with a specific OS appear only in that OS +section. Issues with *no OS label* are treated as cross-platform and appear in +*every* OS section (Windows, Linux, macOS). + Legend: [cols="1,4"] @@ -25,12 +29,192 @@ Legend: | 🚨 | At least one *blocker* (fully prevents users from working) |=== -_Last generated: 2026-05-06 08:11 UTC_ +_Last generated: 2026-05-06 09:19 UTC — 186 issues loaded, 89 assigned, 97 unassigned_ + + +== Summary + +Quick overview of the most critical open issues across all platforms. + +=== 🚨 Active Blockers + +Issues labelled `blocker` that currently prevent users from working. + +_No active blockers_ 🎉 + +=== Status Matrix — Tools + +Only tools with at least one open issue are shown. + +[cols="3,1,1,1", options="header"] +|=== +| Tool | Windows | Linux | macOS +| AWS CLI +| 🟡 +| 🟡 +| 🔴 + +| Azure CLI +| 🔴 +| 🔴 +| 🔴 + +| GitHub Copilot +| 🟡 +| 🟡 +| 🟡 + +| Docker +| 🔴 +| 🔴 +| 🔴 + +| Eclipse +| 🟡 +| 🟡 +| 🔴 + +| gcloud CLI +| 🟡 +| 🟡 +| 🟡 +| GCViewer +| 🟡 +| 🟡 +| 🔴 + +| IntelliJ IDEA +| 🔴 +| 🔴 +| 🔴 + +| Kotlinc +| 🔴 +| 🔴 +| 🔴 + +| Maven +| 🔴 +| 🟢 +| 🟢 + +| Node.js / npm +| 🔴 +| 🔴 +| 🔴 + +| Npm +| 🔴 +| 🔴 +| 🔴 + +| Pgadmin +| 🔴 +| 🔴 +| 🔴 + +| Python +| 🔴 +| 🔴 +| 🔴 + +| Rust +| 🟡 +| 🟡 +| 🟡 + +| SonarQube +| 🟢 +| 🟢 +| 🔴 + +| Terraform +| 🔴 +| 🔴 +| 🔴 + +| Uv +| 🔴 +| 🔴 +| 🔴 + +| VS Code +| 🟡 +| 🔴 +| 🔴 + +|=== + +=== Status Matrix — Commandlets & Core Features + +Only commandlets with at least one open issue are shown. + +[cols="3,1,1,1", options="header"] +|=== +| Commandlet / Feature | Windows | Linux | macOS +| ide install +| 🔴 +| 🔴 +| 🔴 + +| ide uninstall +| 🔴 +| 🟡 +| 🟡 + +| ide update +| 🔴 +| 🔴 +| 🔴 + +| ide create-project +| 🟡 +| 🟡 +| 🟡 + +| Shell integration +| 🔴 +| 🔴 +| 🔴 + +| Shell completion +| 🔴 +| 🔴 +| 🔴 + +| Settings / Properties +| 🔴 +| 🔴 +| 🔴 + +| Security / Credentials +| 🔴 +| 🔴 +| 🔴 + +| Repository management +| 🟡 +| 🟡 +| 🟡 + +| ide status +| 🔴 +| 🔴 +| 🔴 + +| Version management +| 🟡 +| 🟡 +| 🟡 + +|=== == Windows -Open issues labelled `windows` (or without any OS label — those affect all platforms). +Open issues labelled `windows` *or without any OS label*. + +NOTE: Issues without an OS label are cross-platform and therefore appear in every OS section. === Tools @@ -234,9 +418,98 @@ Open issues labelled `windows` (or without any OS label — those affect all pla |=== +=== Commandlets & Core Features + +[cols="2,1,4,5", options="header"] +|=== +| Commandlet / Feature | Status | Issues | Notes +| IDEasy (general) +| 🟢 +| - +| No open issues + +| ide install +| 🔴 +| link:https://github.com/devonfw/IDEasy/issues/421[#421] link:https://github.com/devonfw/IDEasy/issues/422[#422] link:https://github.com/devonfw/IDEasy/issues/594[#594] link:https://github.com/devonfw/IDEasy/issues/703[#703] link:https://github.com/devonfw/IDEasy/issues/714[#714] link:https://github.com/devonfw/IDEasy/issues/861[#861] link:https://github.com/devonfw/IDEasy/issues/1056[#1056] link:https://github.com/devonfw/IDEasy/issues/1102[#1102] link:https://github.com/devonfw/IDEasy/issues/1227[#1227] link:https://github.com/devonfw/IDEasy/issues/1232[#1232] link:https://github.com/devonfw/IDEasy/issues/1517[#1517] link:https://github.com/devonfw/IDEasy/issues/1518[#1518] link:https://github.com/devonfw/IDEasy/issues/1558[#1558] link:https://github.com/devonfw/IDEasy/issues/1579[#1579] link:https://github.com/devonfw/IDEasy/issues/1659[#1659] link:https://github.com/devonfw/IDEasy/issues/1694[#1694] link:https://github.com/devonfw/IDEasy/issues/1763[#1763] link:https://github.com/devonfw/IDEasy/issues/1868[#1868] +| #421: Allow installation of IDEasy via winget; #422: Allow installation of IDEasy via Windows Store; #594: Still windows file locking problems; #703: Support AWS CDK; #714: Improve UX for settings repository; #861: install of pgadmin throws an IllegalStateException when the install wizzard...; #1056: Add Conversion of LICENSE.adoc to RTF Format; #1102: IDEasy MSI installer not working (unsigned); #1227: Guide windows user after installation; #1232: MSI Repair broken; #1517: IDEasy setup does not install Windows Terminal; #1518: uv tools are installed globally; #1558: Add install.log path to msi installer window; #1579: IDEasy uninstall after a failed MSI installation does not work; #1659: Global tools run tool while installation is running in background; #1694: Fix behavior when providing a wrong git URL; #1763: Improve installation/testing of SNAPSHOT releases; #1868: Revision of the functionality of global tool commandlets + +| ide uninstall +| 🔴 +| link:https://github.com/devonfw/IDEasy/issues/785[#785] link:https://github.com/devonfw/IDEasy/issues/1456[#1456] link:https://github.com/devonfw/IDEasy/issues/1868[#1868] link:https://github.com/devonfw/IDEasy/issues/1872[#1872] +| #785: Re-introduce workspace reverse options from devonfw-ide; #1456: Uninstall via Windows settings not working; #1868: Revision of the functionality of global tool commandlets; #1872: Implement generic uninstall implementation for global tools under windows + +| ide update +| 🔴 +| link:https://github.com/devonfw/IDEasy/issues/594[#594] link:https://github.com/devonfw/IDEasy/issues/639[#639] link:https://github.com/devonfw/IDEasy/issues/714[#714] link:https://github.com/devonfw/IDEasy/issues/945[#945] link:https://github.com/devonfw/IDEasy/issues/1333[#1333] link:https://github.com/devonfw/IDEasy/issues/1548[#1548] link:https://github.com/devonfw/IDEasy/issues/1694[#1694] +| #594: Still windows file locking problems; #639: Improve step success logic for sub steps; #714: Improve UX for settings repository; #945: Improve ide update with smart dependency handling; #1333: Step 'Install or update software' already ended with false and now ended ag...; #1548: Windows file locking error on update with plugins; #1694: Fix behavior when providing a wrong git URL + +| ide create-project +| 🟡 +| link:https://github.com/devonfw/IDEasy/issues/714[#714] link:https://github.com/devonfw/IDEasy/issues/1695[#1695] +| #714: Improve UX for settings repository; #1695: Clone settings to temporary directory, analyse, and then move + +| ide build +| 🟢 +| - +| No open issues + +| Shell integration +| 🔴 +| link:https://github.com/devonfw/IDEasy/issues/821[#821] link:https://github.com/devonfw/IDEasy/issues/822[#822] link:https://github.com/devonfw/IDEasy/issues/836[#836] link:https://github.com/devonfw/IDEasy/issues/1746[#1746] link:https://github.com/devonfw/IDEasy/issues/1842[#1842] +| #821: Allow User to remove "ide " prefix in ide shell for non-IDEasy command; #822: Handle long CWD paths in shell prompt; #836: Exit is completed in wrong places; #1746: ide shell broken; #1842: Infinite completion of exit subcommand + +| Shell completion +| 🔴 +| link:https://github.com/devonfw/IDEasy/issues/551[#551] link:https://github.com/devonfw/IDEasy/issues/1392[#1392] link:https://github.com/devonfw/IDEasy/issues/1842[#1842] +| #551: Autocompletion and list-versions make OS-agnostic suggestions ; #1392: Smart completion; #1842: Infinite completion of exit subcommand + +| Settings / Properties +| 🔴 +| link:https://github.com/devonfw/IDEasy/issues/449[#449] link:https://github.com/devonfw/IDEasy/issues/714[#714] link:https://github.com/devonfw/IDEasy/issues/735[#735] link:https://github.com/devonfw/IDEasy/issues/785[#785] link:https://github.com/devonfw/IDEasy/issues/987[#987] link:https://github.com/devonfw/IDEasy/issues/989[#989] link:https://github.com/devonfw/IDEasy/issues/992[#992] link:https://github.com/devonfw/IDEasy/issues/1063[#1063] link:https://github.com/devonfw/IDEasy/issues/1214[#1214] link:https://github.com/devonfw/IDEasy/issues/1518[#1518] link:https://github.com/devonfw/IDEasy/issues/1676[#1676] link:https://github.com/devonfw/IDEasy/issues/1694[#1694] link:https://github.com/devonfw/IDEasy/issues/1695[#1695] link:https://github.com/devonfw/IDEasy/issues/1715[#1715] link:https://github.com/devonfw/IDEasy/issues/1880[#1880] +| #449: Consider integration of continue GenAI coding assistant; #714: Improve UX for settings repository; #735: Enhance workspace configuration with generic overlay from settings/workspac...; #785: Re-introduce workspace reverse options from devonfw-ide; #987: conditional templates; #989: allow expressions in template variable definitions; #992: Support multiple attributes for merge:id; #1063: User specific configurations are not working as described; #1214: preserve EOL style in upgrade-settings; #1518: uv tools are installed globally; #1676: Import extra SDKs automatically into IDE; #1694: Fix behavior when providing a wrong git URL; #1695: Clone settings to temporary directory, analyse, and then move; #1715: Adapt settings to inject java runtime future proove into vscode; #1880: Reinstall all plugins for IDE in force mode + +| Security / Credentials +| 🔴 +| link:https://github.com/devonfw/IDEasy/issues/98[#98] link:https://github.com/devonfw/IDEasy/issues/772[#772] link:https://github.com/devonfw/IDEasy/issues/1628[#1628] link:https://github.com/devonfw/IDEasy/issues/1775[#1775] +| #98: Ability to secure downloads from custom repository; #772: CVE-2023-7272 in org.eclipse.parsson 1.1.7; #1628: Support for OS specific CVEs; #1775: Validate and Fix CPE Vendor/Product Identifiers for All Tools + +| Repository management +| 🟡 +| link:https://github.com/devonfw/IDEasy/issues/1164[#1164] link:https://github.com/devonfw/IDEasy/issues/1165[#1165] link:https://github.com/devonfw/IDEasy/issues/1167[#1167] +| #1164: Automatic project import; #1165: Automatic project import for Eclipse; #1167: Automatic project import for VSCode + +| Environment variables +| 🟢 +| - +| No open issues + +| Plugin management +| 🟢 +| - +| No open issues + +| Migration (devonfw-ide → IDEasy) +| 🟢 +| - +| No open issues + +| ide status +| 🔴 +| link:https://github.com/devonfw/IDEasy/issues/1209[#1209] link:https://github.com/devonfw/IDEasy/issues/1255[#1255] +| #1209: migration version message is confusing; #1255: ide status does not recognize snapshot version correctly + +| Version management +| 🟡 +| link:https://github.com/devonfw/IDEasy/issues/1178[#1178] link:https://github.com/devonfw/IDEasy/issues/1868[#1868] +| #1178: Revisit VersionPhase detection; #1868: Revision of the functionality of global tool commandlets + +|=== + == Linux -Open issues labelled `linux` (or without any OS label — those affect all platforms). +Open issues labelled `linux` *or without any OS label*. + +NOTE: Issues without an OS label are cross-platform and therefore appear in every OS section. === Tools @@ -440,9 +713,98 @@ Open issues labelled `linux` (or without any OS label — those affect all platf |=== +=== Commandlets & Core Features + +[cols="2,1,4,5", options="header"] +|=== +| Commandlet / Feature | Status | Issues | Notes +| IDEasy (general) +| 🟢 +| - +| No open issues + +| ide install +| 🔴 +| link:https://github.com/devonfw/IDEasy/issues/703[#703] link:https://github.com/devonfw/IDEasy/issues/714[#714] link:https://github.com/devonfw/IDEasy/issues/861[#861] link:https://github.com/devonfw/IDEasy/issues/1517[#1517] link:https://github.com/devonfw/IDEasy/issues/1518[#1518] link:https://github.com/devonfw/IDEasy/issues/1659[#1659] link:https://github.com/devonfw/IDEasy/issues/1694[#1694] link:https://github.com/devonfw/IDEasy/issues/1763[#1763] link:https://github.com/devonfw/IDEasy/issues/1868[#1868] +| #703: Support AWS CDK; #714: Improve UX for settings repository; #861: install of pgadmin throws an IllegalStateException when the install wizzard...; #1517: IDEasy setup does not install Windows Terminal; #1518: uv tools are installed globally; #1659: Global tools run tool while installation is running in background; #1694: Fix behavior when providing a wrong git URL; #1763: Improve installation/testing of SNAPSHOT releases; #1868: Revision of the functionality of global tool commandlets + +| ide uninstall +| 🟡 +| link:https://github.com/devonfw/IDEasy/issues/785[#785] link:https://github.com/devonfw/IDEasy/issues/1868[#1868] +| #785: Re-introduce workspace reverse options from devonfw-ide; #1868: Revision of the functionality of global tool commandlets + +| ide update +| 🔴 +| link:https://github.com/devonfw/IDEasy/issues/639[#639] link:https://github.com/devonfw/IDEasy/issues/714[#714] link:https://github.com/devonfw/IDEasy/issues/945[#945] link:https://github.com/devonfw/IDEasy/issues/1333[#1333] link:https://github.com/devonfw/IDEasy/issues/1694[#1694] +| #639: Improve step success logic for sub steps; #714: Improve UX for settings repository; #945: Improve ide update with smart dependency handling; #1333: Step 'Install or update software' already ended with false and now ended ag...; #1694: Fix behavior when providing a wrong git URL + +| ide create-project +| 🟡 +| link:https://github.com/devonfw/IDEasy/issues/714[#714] link:https://github.com/devonfw/IDEasy/issues/1695[#1695] +| #714: Improve UX for settings repository; #1695: Clone settings to temporary directory, analyse, and then move + +| ide build +| 🟢 +| - +| No open issues + +| Shell integration +| 🔴 +| link:https://github.com/devonfw/IDEasy/issues/821[#821] link:https://github.com/devonfw/IDEasy/issues/822[#822] link:https://github.com/devonfw/IDEasy/issues/836[#836] link:https://github.com/devonfw/IDEasy/issues/1746[#1746] link:https://github.com/devonfw/IDEasy/issues/1842[#1842] +| #821: Allow User to remove "ide " prefix in ide shell for non-IDEasy command; #822: Handle long CWD paths in shell prompt; #836: Exit is completed in wrong places; #1746: ide shell broken; #1842: Infinite completion of exit subcommand + +| Shell completion +| 🔴 +| link:https://github.com/devonfw/IDEasy/issues/551[#551] link:https://github.com/devonfw/IDEasy/issues/1392[#1392] link:https://github.com/devonfw/IDEasy/issues/1842[#1842] +| #551: Autocompletion and list-versions make OS-agnostic suggestions ; #1392: Smart completion; #1842: Infinite completion of exit subcommand + +| Settings / Properties +| 🔴 +| link:https://github.com/devonfw/IDEasy/issues/449[#449] link:https://github.com/devonfw/IDEasy/issues/714[#714] link:https://github.com/devonfw/IDEasy/issues/735[#735] link:https://github.com/devonfw/IDEasy/issues/785[#785] link:https://github.com/devonfw/IDEasy/issues/987[#987] link:https://github.com/devonfw/IDEasy/issues/989[#989] link:https://github.com/devonfw/IDEasy/issues/992[#992] link:https://github.com/devonfw/IDEasy/issues/1063[#1063] link:https://github.com/devonfw/IDEasy/issues/1214[#1214] link:https://github.com/devonfw/IDEasy/issues/1518[#1518] link:https://github.com/devonfw/IDEasy/issues/1676[#1676] link:https://github.com/devonfw/IDEasy/issues/1694[#1694] link:https://github.com/devonfw/IDEasy/issues/1695[#1695] link:https://github.com/devonfw/IDEasy/issues/1715[#1715] link:https://github.com/devonfw/IDEasy/issues/1880[#1880] +| #449: Consider integration of continue GenAI coding assistant; #714: Improve UX for settings repository; #735: Enhance workspace configuration with generic overlay from settings/workspac...; #785: Re-introduce workspace reverse options from devonfw-ide; #987: conditional templates; #989: allow expressions in template variable definitions; #992: Support multiple attributes for merge:id; #1063: User specific configurations are not working as described; #1214: preserve EOL style in upgrade-settings; #1518: uv tools are installed globally; #1676: Import extra SDKs automatically into IDE; #1694: Fix behavior when providing a wrong git URL; #1695: Clone settings to temporary directory, analyse, and then move; #1715: Adapt settings to inject java runtime future proove into vscode; #1880: Reinstall all plugins for IDE in force mode + +| Security / Credentials +| 🔴 +| link:https://github.com/devonfw/IDEasy/issues/98[#98] link:https://github.com/devonfw/IDEasy/issues/772[#772] link:https://github.com/devonfw/IDEasy/issues/1628[#1628] link:https://github.com/devonfw/IDEasy/issues/1775[#1775] +| #98: Ability to secure downloads from custom repository; #772: CVE-2023-7272 in org.eclipse.parsson 1.1.7; #1628: Support for OS specific CVEs; #1775: Validate and Fix CPE Vendor/Product Identifiers for All Tools + +| Repository management +| 🟡 +| link:https://github.com/devonfw/IDEasy/issues/1164[#1164] link:https://github.com/devonfw/IDEasy/issues/1165[#1165] link:https://github.com/devonfw/IDEasy/issues/1167[#1167] +| #1164: Automatic project import; #1165: Automatic project import for Eclipse; #1167: Automatic project import for VSCode + +| Environment variables +| 🟢 +| - +| No open issues + +| Plugin management +| 🟢 +| - +| No open issues + +| Migration (devonfw-ide → IDEasy) +| 🟢 +| - +| No open issues + +| ide status +| 🔴 +| link:https://github.com/devonfw/IDEasy/issues/1209[#1209] link:https://github.com/devonfw/IDEasy/issues/1255[#1255] +| #1209: migration version message is confusing; #1255: ide status does not recognize snapshot version correctly + +| Version management +| 🟡 +| link:https://github.com/devonfw/IDEasy/issues/1178[#1178] link:https://github.com/devonfw/IDEasy/issues/1868[#1868] +| #1178: Revisit VersionPhase detection; #1868: Revision of the functionality of global tool commandlets + +|=== + == macOS -Open issues labelled `macOS` (or without any OS label — those affect all platforms). +Open issues labelled `macOS` *or without any OS label*. + +NOTE: Issues without an OS label are cross-platform and therefore appear in every OS section. === Tools @@ -486,8 +848,8 @@ Open issues labelled `macOS` (or without any OS label — those affect all platf | Eclipse | 🔴 -| link:https://github.com/devonfw/IDEasy/issues/1165[#1165] link:https://github.com/devonfw/IDEasy/issues/1187[#1187] link:https://github.com/devonfw/IDEasy/issues/1525[#1525] -| #1165: Automatic project import for Eclipse; #1187: Eclipse plugin installation on mac is not working; #1525: lombok not correctly installed in eclipse +| link:https://github.com/devonfw/IDEasy/issues/868[#868] link:https://github.com/devonfw/IDEasy/issues/1165[#1165] link:https://github.com/devonfw/IDEasy/issues/1187[#1187] link:https://github.com/devonfw/IDEasy/issues/1525[#1525] +| #868: Eclipse does not work on Mac x64; #1165: Automatic project import for Eclipse; #1187: Eclipse plugin installation on mac is not working; #1525: lombok not correctly installed in eclipse | gcloud CLI | 🟡 @@ -495,9 +857,9 @@ Open issues labelled `macOS` (or without any OS label — those affect all platf | #19: Implement ToolCommandlet for Google Cloud CLI | GCViewer -| 🟡 -| link:https://github.com/devonfw/IDEasy/issues/825[#825] -| #825: Consider adding GC Log Analyzer +| 🔴 +| link:https://github.com/devonfw/IDEasy/issues/825[#825] link:https://github.com/devonfw/IDEasy/issues/869[#869] +| #825: Consider adding GC Log Analyzer; #869: gcviewer logs errors on Mac X64 | GitHub CLI | 🟢 @@ -586,8 +948,8 @@ Open issues labelled `macOS` (or without any OS label — those affect all platf | Pgadmin | 🔴 -| link:https://github.com/devonfw/IDEasy/issues/798[#798] link:https://github.com/devonfw/IDEasy/issues/861[#861] link:https://github.com/devonfw/IDEasy/issues/1868[#1868] -| #798: pgadmin not working on Mac; #861: install of pgadmin throws an IllegalStateException when the install wizzard...; #1868: Revision of the functionality of global tool commandlets +| link:https://github.com/devonfw/IDEasy/issues/798[#798] link:https://github.com/devonfw/IDEasy/issues/861[#861] link:https://github.com/devonfw/IDEasy/issues/878[#878] link:https://github.com/devonfw/IDEasy/issues/1868[#1868] +| #798: pgadmin not working on Mac; #861: install of pgadmin throws an IllegalStateException when the install wizzard...; #878: pgadmin does not work on Mac x64; #1868: Revision of the functionality of global tool commandlets | pip | 🟢 @@ -640,16 +1002,510 @@ Open issues labelled `macOS` (or without any OS label — those affect all platf | #1518: uv tools are installed globally | VS Code +| 🔴 +| link:https://github.com/devonfw/IDEasy/issues/787[#787] link:https://github.com/devonfw/IDEasy/issues/862[#862] link:https://github.com/devonfw/IDEasy/issues/1167[#1167] link:https://github.com/devonfw/IDEasy/issues/1715[#1715] link:https://github.com/devonfw/IDEasy/issues/1754[#1754] link:https://github.com/devonfw/IDEasy/issues/1849[#1849] +| #787: Provide variable to disable open new workspace; #862: vscode does not work on Mac; #1167: Automatic project import for VSCode; #1715: Adapt settings to inject java runtime future proove into vscode; #1754: Add version support to vscode settings .plugin files; #1849: Support VSCodium + +|=== + +=== Commandlets & Core Features + +[cols="2,1,4,5", options="header"] +|=== +| Commandlet / Feature | Status | Issues | Notes +| IDEasy (general) +| 🟢 +| - +| No open issues + +| ide install +| 🔴 +| link:https://github.com/devonfw/IDEasy/issues/377[#377] link:https://github.com/devonfw/IDEasy/issues/423[#423] link:https://github.com/devonfw/IDEasy/issues/703[#703] link:https://github.com/devonfw/IDEasy/issues/714[#714] link:https://github.com/devonfw/IDEasy/issues/861[#861] link:https://github.com/devonfw/IDEasy/issues/1517[#1517] link:https://github.com/devonfw/IDEasy/issues/1518[#1518] link:https://github.com/devonfw/IDEasy/issues/1659[#1659] link:https://github.com/devonfw/IDEasy/issues/1694[#1694] link:https://github.com/devonfw/IDEasy/issues/1763[#1763] link:https://github.com/devonfw/IDEasy/issues/1868[#1868] +| #377: Support Homebrew for installation on macOS; #423: Create installer for MacOS; #703: Support AWS CDK; #714: Improve UX for settings repository; #861: install of pgadmin throws an IllegalStateException when the install wizzard...; #1517: IDEasy setup does not install Windows Terminal; #1518: uv tools are installed globally; #1659: Global tools run tool while installation is running in background; #1694: Fix behavior when providing a wrong git URL; #1763: Improve installation/testing of SNAPSHOT releases; #1868: Revision of the functionality of global tool commandlets + +| ide uninstall | 🟡 -| link:https://github.com/devonfw/IDEasy/issues/787[#787] link:https://github.com/devonfw/IDEasy/issues/1167[#1167] link:https://github.com/devonfw/IDEasy/issues/1715[#1715] link:https://github.com/devonfw/IDEasy/issues/1754[#1754] link:https://github.com/devonfw/IDEasy/issues/1849[#1849] -| #787: Provide variable to disable open new workspace; #1167: Automatic project import for VSCode; #1715: Adapt settings to inject java runtime future proove into vscode; #1754: Add version support to vscode settings .plugin files; #1849: Support VSCodium +| link:https://github.com/devonfw/IDEasy/issues/785[#785] link:https://github.com/devonfw/IDEasy/issues/1868[#1868] +| #785: Re-introduce workspace reverse options from devonfw-ide; #1868: Revision of the functionality of global tool commandlets + +| ide update +| 🔴 +| link:https://github.com/devonfw/IDEasy/issues/639[#639] link:https://github.com/devonfw/IDEasy/issues/714[#714] link:https://github.com/devonfw/IDEasy/issues/945[#945] link:https://github.com/devonfw/IDEasy/issues/1333[#1333] link:https://github.com/devonfw/IDEasy/issues/1694[#1694] +| #639: Improve step success logic for sub steps; #714: Improve UX for settings repository; #945: Improve ide update with smart dependency handling; #1333: Step 'Install or update software' already ended with false and now ended ag...; #1694: Fix behavior when providing a wrong git URL + +| ide create-project +| 🟡 +| link:https://github.com/devonfw/IDEasy/issues/714[#714] link:https://github.com/devonfw/IDEasy/issues/1695[#1695] +| #714: Improve UX for settings repository; #1695: Clone settings to temporary directory, analyse, and then move + +| ide build +| 🟢 +| - +| No open issues + +| Shell integration +| 🔴 +| link:https://github.com/devonfw/IDEasy/issues/821[#821] link:https://github.com/devonfw/IDEasy/issues/822[#822] link:https://github.com/devonfw/IDEasy/issues/836[#836] link:https://github.com/devonfw/IDEasy/issues/1746[#1746] link:https://github.com/devonfw/IDEasy/issues/1842[#1842] +| #821: Allow User to remove "ide " prefix in ide shell for non-IDEasy command; #822: Handle long CWD paths in shell prompt; #836: Exit is completed in wrong places; #1746: ide shell broken; #1842: Infinite completion of exit subcommand + +| Shell completion +| 🔴 +| link:https://github.com/devonfw/IDEasy/issues/551[#551] link:https://github.com/devonfw/IDEasy/issues/1392[#1392] link:https://github.com/devonfw/IDEasy/issues/1842[#1842] +| #551: Autocompletion and list-versions make OS-agnostic suggestions ; #1392: Smart completion; #1842: Infinite completion of exit subcommand + +| Settings / Properties +| 🔴 +| link:https://github.com/devonfw/IDEasy/issues/449[#449] link:https://github.com/devonfw/IDEasy/issues/714[#714] link:https://github.com/devonfw/IDEasy/issues/735[#735] link:https://github.com/devonfw/IDEasy/issues/785[#785] link:https://github.com/devonfw/IDEasy/issues/987[#987] link:https://github.com/devonfw/IDEasy/issues/989[#989] link:https://github.com/devonfw/IDEasy/issues/992[#992] link:https://github.com/devonfw/IDEasy/issues/1063[#1063] link:https://github.com/devonfw/IDEasy/issues/1214[#1214] link:https://github.com/devonfw/IDEasy/issues/1518[#1518] link:https://github.com/devonfw/IDEasy/issues/1676[#1676] link:https://github.com/devonfw/IDEasy/issues/1694[#1694] link:https://github.com/devonfw/IDEasy/issues/1695[#1695] link:https://github.com/devonfw/IDEasy/issues/1715[#1715] link:https://github.com/devonfw/IDEasy/issues/1880[#1880] +| #449: Consider integration of continue GenAI coding assistant; #714: Improve UX for settings repository; #735: Enhance workspace configuration with generic overlay from settings/workspac...; #785: Re-introduce workspace reverse options from devonfw-ide; #987: conditional templates; #989: allow expressions in template variable definitions; #992: Support multiple attributes for merge:id; #1063: User specific configurations are not working as described; #1214: preserve EOL style in upgrade-settings; #1518: uv tools are installed globally; #1676: Import extra SDKs automatically into IDE; #1694: Fix behavior when providing a wrong git URL; #1695: Clone settings to temporary directory, analyse, and then move; #1715: Adapt settings to inject java runtime future proove into vscode; #1880: Reinstall all plugins for IDE in force mode + +| Security / Credentials +| 🔴 +| link:https://github.com/devonfw/IDEasy/issues/98[#98] link:https://github.com/devonfw/IDEasy/issues/772[#772] link:https://github.com/devonfw/IDEasy/issues/1628[#1628] link:https://github.com/devonfw/IDEasy/issues/1775[#1775] +| #98: Ability to secure downloads from custom repository; #772: CVE-2023-7272 in org.eclipse.parsson 1.1.7; #1628: Support for OS specific CVEs; #1775: Validate and Fix CPE Vendor/Product Identifiers for All Tools + +| Repository management +| 🟡 +| link:https://github.com/devonfw/IDEasy/issues/1164[#1164] link:https://github.com/devonfw/IDEasy/issues/1165[#1165] link:https://github.com/devonfw/IDEasy/issues/1167[#1167] +| #1164: Automatic project import; #1165: Automatic project import for Eclipse; #1167: Automatic project import for VSCode + +| Environment variables +| 🟢 +| - +| No open issues + +| Plugin management +| 🟢 +| - +| No open issues + +| Migration (devonfw-ide → IDEasy) +| 🟢 +| - +| No open issues + +| ide status +| 🔴 +| link:https://github.com/devonfw/IDEasy/issues/1209[#1209] link:https://github.com/devonfw/IDEasy/issues/1255[#1255] +| #1209: migration version message is confusing; #1255: ide status does not recognize snapshot version correctly + +| Version management +| 🟡 +| link:https://github.com/devonfw/IDEasy/issues/1178[#1178] link:https://github.com/devonfw/IDEasy/issues/1868[#1868] +| #1178: Revisit VersionPhase detection; #1868: Revision of the functionality of global tool commandlets + +|=== + +== Unassigned Issues + +The following 97 issue(s) could not be matched to any known tool or commandlet. Add the appropriate label on GitHub, or extend `TOOLS`, `COMMANDLETS`, or their `"labels"` lists in this script. + +[cols="1,4,3", options="header"] +|=== +| Issue | Title | Labels +| link:https://github.com/devonfw/IDEasy/issues/45[#45] +| Add compression for native images +| enhancement + +| link:https://github.com/devonfw/IDEasy/issues/72[#72] +| Add further editions of java +| enhancement + +| link:https://github.com/devonfw/IDEasy/issues/75[#75] +| Consider integration of oracle XE +| enhancement + +| link:https://github.com/devonfw/IDEasy/issues/162[#162] +| Difficulty to find the right spot in the documentation +| enhancement + +| link:https://github.com/devonfw/IDEasy/issues/169[#169] +| Check if we want to utilize TailTipWidgets for the autocompleter +| enhancement + +| link:https://github.com/devonfw/IDEasy/issues/190[#190] +| Improve #103: security warning for CVEs in file tool/edition/security +| enhancement + +| link:https://github.com/devonfw/IDEasy/issues/218[#218] +| Add possibility to start a command in a new window with the process builder +| enhancement + +| link:https://github.com/devonfw/IDEasy/issues/370[#370] +| Create local github actions for tests +| enhancement + +| link:https://github.com/devonfw/IDEasy/issues/378[#378] +| Missing comprehensive "Getting started guide" causing fail in getting start... +| documentation + +| link:https://github.com/devonfw/IDEasy/issues/379[#379] +| Rename default branch of repo ide-urls from master to main +| enhancement + +| link:https://github.com/devonfw/IDEasy/issues/399[#399] +| Handle uninstall of global tool commandlets +| enhancement + +| link:https://github.com/devonfw/IDEasy/issues/412[#412] +| consider integration of lama +| enhancement, AI + +| link:https://github.com/devonfw/IDEasy/issues/492[#492] +| Use Maven dependency cache to optimize workflow running times +| enhancement, SCM + +| link:https://github.com/devonfw/IDEasy/issues/516[#516] +| IdeToolCommandlet: add option and support for import of project(s) +| enhancement + +| link:https://github.com/devonfw/IDEasy/issues/599[#599] +| Add release for windows-arm architecture +| enhancement + +| link:https://github.com/devonfw/IDEasy/issues/607[#607] +| Test for environment variables of process contexts +| enhancement, test, process + +| link:https://github.com/devonfw/IDEasy/issues/611[#611] +| Git pull on settings with local branch and without remote throws exception +| — + +| link:https://github.com/devonfw/IDEasy/issues/629[#629] +| Recycle devonfw-ide documentation +| enhancement + +| link:https://github.com/devonfw/IDEasy/issues/690[#690] +| UpdateUrls workflow timeout not working +| urls, SCM + +| link:https://github.com/devonfw/IDEasy/issues/694[#694] +| Add linux support to dotnet tool +| enhancement + +| link:https://github.com/devonfw/IDEasy/issues/700[#700] +| Add Npm run test +| enhancement + +| link:https://github.com/devonfw/IDEasy/issues/701[#701] +| Fix Dotnet tests on our CI +| enhancement, internal + +| link:https://github.com/devonfw/IDEasy/issues/726[#726] +| Replace hardcoded dependencies with dependencies.json in ide-urls +| enhancement, Epic + +| link:https://github.com/devonfw/IDEasy/issues/741[#741] +| Add a warning message for legacy devonfw-ide settings users +| enhancement + +| link:https://github.com/devonfw/IDEasy/issues/756[#756] +| Implement CustomToolRepositoryTest +| enhancement, test, custom + +| link:https://github.com/devonfw/IDEasy/issues/768[#768] +| Improve IntelliJ configuration (annotation processing, auto-import, maven a... +| enhancement + +| link:https://github.com/devonfw/IDEasy/issues/771[#771] +| Check URL Updater issues +| urls + +| link:https://github.com/devonfw/IDEasy/issues/780[#780] +| Create IDEasy service +| enhancement, Epic, CLI + +| link:https://github.com/devonfw/IDEasy/issues/788[#788] +| Add more starting flags to IDE commandlets +| enhancement + +| link:https://github.com/devonfw/IDEasy/issues/795[#795] +| Setup not working properly on Mac (and zsh) +| duplicate, macOS + +| link:https://github.com/devonfw/IDEasy/issues/840[#840] +| git fetch does not work with multiple remotes +| — + +| link:https://github.com/devonfw/IDEasy/issues/854[#854] +| Kubectl not working on linux +| linux + +| link:https://github.com/devonfw/IDEasy/issues/863[#863] +| Mac x64 android-studio 2024 releases missing +| enhancement, android-studio, macOS + +| link:https://github.com/devonfw/IDEasy/issues/864[#864] +| AWS is not working on Mac x64 +| macOS + +| link:https://github.com/devonfw/IDEasy/issues/865[#865] +| Az is not working on Mac x64 +| macOS + +| link:https://github.com/devonfw/IDEasy/issues/867[#867] +| Docker (Rancher Desktop) not working on Linux +| invalid, rancher, linux + +| link:https://github.com/devonfw/IDEasy/issues/871[#871] +| Add progressbar to *.dmg extract process +| enhancement, macOS, progressbar + +| link:https://github.com/devonfw/IDEasy/issues/882[#882] +| Skip step if no installation was required +| enhancement + +| link:https://github.com/devonfw/IDEasy/issues/891[#891] +| Improve Url Updater Report Overview +| enhancement, urls + +| link:https://github.com/devonfw/IDEasy/issues/892[#892] +| Improve GitContextTest tests to actually test something +| enhancement + +| link:https://github.com/devonfw/IDEasy/issues/897[#897] +| HTTP Proxy with TLS termination causing errors +| download, proxy + +| link:https://github.com/devonfw/IDEasy/issues/930[#930] +| Refactor `JsonPrettyPrinter` to be usable in CustomToolJson +| custom, json + +| link:https://github.com/devonfw/IDEasy/issues/943[#943] +| XmlMerger: Rework Combine Text Nodes +| merger + +| link:https://github.com/devonfw/IDEasy/issues/1031[#1031] +| Integration of OpenRewrite +| enhancement, rewrite + +| link:https://github.com/devonfw/IDEasy/issues/1041[#1041] +| native image has globbing active +| CLI, core + +| link:https://github.com/devonfw/IDEasy/issues/1054[#1054] +| Incorrect interpretation of trailling and leading spaces in version range p... +| core, dependencies + +| link:https://github.com/devonfw/IDEasy/issues/1059[#1059] +| Improve and fix dependency mechanism +| enhancement, dependencies + +| link:https://github.com/devonfw/IDEasy/issues/1134[#1134] +| IDEasy autocompletion gets stuck if license agreement file was not found +| blocker + +| link:https://github.com/devonfw/IDEasy/issues/1135[#1135] +| IDEasy does not set env variables on Windows PowerShell +| enhancement, PowerShell + +| link:https://github.com/devonfw/IDEasy/issues/1150[#1150] +| Full ARM support +| enhancement, Epic, ARM + +| link:https://github.com/devonfw/IDEasy/issues/1155[#1155] +| Improve IntelliJ layout +| enhancement + +| link:https://github.com/devonfw/IDEasy/issues/1185[#1185] +| icd on mac does not work in zshell +| macOS, icd, ready-to-implement + +| link:https://github.com/devonfw/IDEasy/issues/1206[#1206] +| java.util.zip.ZipException when opening Android Studio archives from versio... +| enhancement + +| link:https://github.com/devonfw/IDEasy/issues/1215[#1215] +| nightly build not executing tests anymore +| enhancement + +| link:https://github.com/devonfw/IDEasy/issues/1216[#1216] +| Release workflow should only deploy artifacts after all tests passed +| enhancement, SCM, release, workflow + +| link:https://github.com/devonfw/IDEasy/issues/1225[#1225] +| Create new IDEasy introduction videos +| enhancement + +| link:https://github.com/devonfw/IDEasy/issues/1263[#1263] +| Fix android-studio workspace templates +| android-studio, plugins + +| link:https://github.com/devonfw/IDEasy/issues/1295[#1295] +| IDEasy Dashboard Epic +| enhancement, Epic, GUI + +| link:https://github.com/devonfw/IDEasy/issues/1296[#1296] +| Implement IdeContext properly for Dashboard +| enhancement, GUI + +| link:https://github.com/devonfw/IDEasy/issues/1311[#1311] +| improve IDE_MIN_VERSION support +| enhancement + +| link:https://github.com/devonfw/IDEasy/issues/1329[#1329] +| Add minikube tool commandlet +| enhancement + +| link:https://github.com/devonfw/IDEasy/issues/1422[#1422] +| Refactor tests to remove windowsJunctionsAreUsed +| test, internal, ready-to-implement + +| link:https://github.com/devonfw/IDEasy/issues/1447[#1447] +| Cover checksum verification in JUnit +| enhancement, test, download, internal, ready-to-implement + +| link:https://github.com/devonfw/IDEasy/issues/1453[#1453] +| Allow co-authored commits in cla assistant +| enhancement, waiting for feedback + +| link:https://github.com/devonfw/IDEasy/issues/1457[#1457] +| Improve CLI error messages on invalid args or commandlets not available in ... +| enhancement, CLI, ready-to-implement + +| link:https://github.com/devonfw/IDEasy/issues/1493[#1493] +| Analyze Scoop Windows CLI installer +| enhancement + +| link:https://github.com/devonfw/IDEasy/issues/1580[#1580] +| Implement cleanup +| enhancement, commandlet, ready-to-implement + +| link:https://github.com/devonfw/IDEasy/issues/1585[#1585] +| Add Insomnia CLI support to IDEasy +| enhancement + +| link:https://github.com/devonfw/IDEasy/issues/1594[#1594] +| implement ReleaseCommandlet +| enhancement, commandlet, ready-to-implement + +| link:https://github.com/devonfw/IDEasy/issues/1634[#1634] +| UrlUpdater creates error entries for HTTP status 200 +| urls, workflow + +| link:https://github.com/devonfw/IDEasy/issues/1651[#1651] +| Move status.json files out of ide-urls to own repo +| enhancement, urls, workflow, ready-to-implement + +| link:https://github.com/devonfw/IDEasy/issues/1688[#1688] +| Remove unnecessary message in the CLI when installing a new tool +| enhancement, logging, ready-to-implement + +| link:https://github.com/devonfw/IDEasy/issues/1689[#1689] +| Fix user commnication when switching the Java version from the default to t... +| enhancement, logging + +| link:https://github.com/devonfw/IDEasy/issues/1701[#1701] +| Implement Mise-en-place +| enhancement + +| link:https://github.com/devonfw/IDEasy/issues/1716[#1716] +| Add claude-cli as software package +| enhancement, AI, ready-to-implement, claude + +| link:https://github.com/devonfw/IDEasy/issues/1720[#1720] +| Integrate SoapUI +| enhancement + +| link:https://github.com/devonfw/IDEasy/issues/1721[#1721] +| Integrate ruby +| enhancement + +| link:https://github.com/devonfw/IDEasy/issues/1748[#1748] +| Improve IDEasy status documentation +| documentation, enhancement, ready-to-implement + +| link:https://github.com/devonfw/IDEasy/issues/1784[#1784] +| Implement JavaFX based progress bars for the GUI +| enhancement, GUI + +| link:https://github.com/devonfw/IDEasy/issues/1785[#1785] +| Implemenent confirmation modals using JavaFX +| enhancement, GUI, ready-to-implement + +| link:https://github.com/devonfw/IDEasy/issues/1787[#1787] +| tracking yarn versions broken +| urls, yarn, software + +| link:https://github.com/devonfw/IDEasy/issues/1788[#1788] +| Add ln commandlet to create links +| enhancement, ready-to-implement + +| link:https://github.com/devonfw/IDEasy/issues/1802[#1802] +| Enable state management for the IdeContext in the GUI. +| enhancement, GUI + +| link:https://github.com/devonfw/IDEasy/issues/1808[#1808] +| icd is not navigating into single available workspace on icd -p project +| invalid, icd + +| link:https://github.com/devonfw/IDEasy/issues/1814[#1814] +| IDEasy still reports updates for settings are available after any number of... +| upgrade-settings + +| link:https://github.com/devonfw/IDEasy/issues/1821[#1821] +| Back up and restore user state before/after integration tests +| enhancement, test, integration, internal, integration-tests, ready-to-implement + +| link:https://github.com/devonfw/IDEasy/issues/1840[#1840] +| Management of tool installations in the GUI +| enhancement, GUI + +| link:https://github.com/devonfw/IDEasy/issues/1846[#1846] +| Mac Gatekeeper workaround causing errors +| macOS, bugfix + +| link:https://github.com/devonfw/IDEasy/issues/1866[#1866] +| Create ClaudeUrlUpdater +| enhancement + +| link:https://github.com/devonfw/IDEasy/issues/1867[#1867] +| Create Claude commandlet +| enhancement + +| link:https://github.com/devonfw/IDEasy/issues/1869[#1869] +| Improve WindowsHelper to search in windows registry +| enhancement, windows, internal, ready-to-implement + +| link:https://github.com/devonfw/IDEasy/issues/1870[#1870] +| Implement generic get-version implementation for global tools under windows +| enhancement, windows + +| link:https://github.com/devonfw/IDEasy/issues/1873[#1873] +| Implement generic get-edition implementation for global tools under windows +| enhancement, windows + +| link:https://github.com/devonfw/IDEasy/issues/1882[#1882] +| Create AWS CDK commandlet +| enhancement + +| link:https://github.com/devonfw/IDEasy/issues/1884[#1884] +| Implement proper ZIP extraction +| enhancement, unpack, ready-to-implement + +| link:https://github.com/devonfw/IDEasy/issues/1892[#1892] +| pom.xml required for launching gui not included in release/native builds +| GUI, internal + +| link:https://github.com/devonfw/IDEasy/issues/1893[#1893] +| Fix Failing Integration Tests workflow +| integration-tests |=== -== How to contribute +== How to Contribute -*Adding a new tool* is automatic: as soon as a new folder is added under +=== Adding a new tool +Adding a new tool is automatic: as soon as a new folder is added under `url-updater/src/main/java/com/devonfw/tools/ide/url/tool/` and issues are labelled with that folder name, the tool appears in the next generated document. -To add a nicer display name, add an entry to `TOOL_DISPLAY_OVERRIDES` in this script. -To map a non-standard label name to a tool, add an entry to `LABEL_ALIASES`. +To override the display name, add an entry to `TOOLS` in this script. + +=== Adding a new commandlet +Add an entry to the `COMMANDLETS` dict in this script. The key is the GitHub +label name; `"display"` is the human-readable name; `"labels"` lists any +alternative label names that should also map to this commandlet. + +=== Mapping a non-standard label +If a GitHub label does not match any key in `TOOLS` or `COMMANDLETS`, add the +label name to the `"labels"` list of the appropriate registry entry. +Any remaining unmatched issues will appear in the *Unassigned Issues* section. From 875dfbc62e98fd43b608fda667c8a88ca6c2be56 Mon Sep 17 00:00:00 2001 From: MarvMa Date: Wed, 6 May 2026 11:49:42 +0200 Subject: [PATCH 06/11] #1748: update labels --- documentation/generate_quality_status.py | 589 ++++------- documentation/quality-status.adoc | 1168 ++++------------------ 2 files changed, 372 insertions(+), 1385 deletions(-) diff --git a/documentation/generate_quality_status.py b/documentation/generate_quality_status.py index 31e49d71b9..948fe32b22 100644 --- a/documentation/generate_quality_status.py +++ b/documentation/generate_quality_status.py @@ -4,47 +4,35 @@ Generates quality-status.adoc for devonfw/IDEasy by: 1. Fetching tool names dynamically from the url-updater source tree - (url-updater/src/main/java/com/devonfw/tools/ide/url/tool/) - so the list stays accurate as new tools are added to the codebase. + (url-updater/src/main/java/com/devonfw/tools/ide/url/tool/). 2. Fetching all open GitHub issues and mapping them to tools or commandlets - by matching issue labels against the discovered tool names and the - COMMANDLETS registry defined in this script. - 3. Writing a quality-status.adoc with: - - A summary section listing all active blockers and a status-at-a-glance matrix - - One section per OS, each with a Tools table and a Commandlets table - - A section for issues that could not be assigned to any known topic + via labels (including aliases for non-standard label names). + 3. Writing a compact quality-status.adoc: + - Overview with legend and issue stats + - Summary: active blockers only + - Tools: one cross-OS table (Win / Linux / macOS columns), non-green rows only + - Commandlets: same + - Unassigned Issues OS LABEL BEHAVIOUR ────────────────── -Issues labelled with a specific OS (windows / linux / macOS) appear *only* in -that OS section. Issues with *no* OS label are treated as cross-platform and -appear in *every* OS section (Windows, Linux, macOS). +Issues with a specific OS label appear only in that OS column. +Issues with NO OS label are cross-platform: they count toward every OS column +and are shown without an OS tag in the Issues cell. -Usage: - python generate_quality_status.py [--token TOKEN] [--output PATH] - -Recommended: set GITHUB_TOKEN to avoid the 60 req/hour rate limit. - export GITHUB_TOKEN=ghp_yourtoken - python generate_quality_status.py - -─── LABEL / TYPE STRUCTURE (as used in devonfw/IDEasy) ────────────────────── - - GitHub Issue TYPES (modern feature, checked via issue["type"]["name"]): - Bug → something is broken - Feature → enhancement / new capability - Task → maintenance / internal work +ISSUE TYPE ICONS IN ISSUES CELL +──────────────────────────────── + 🚨 #N — blocker + 🔴 #N — bug (or legacy "bug" label) + 🟡 #N — enhancement / feature / task (no bug, no blocker) - OS labels (exact case): - windows "specific for Microsoft Windows OS" - linux "specific for linux OS (debian, ubuntu, suse, etc.)" - macOS "specific for Apple MacOS" ← capital OS, NOT 'mac' +OS tags are appended in backticks only for OS-specific issues, e.g.: + 🔴 link:…[#42] `win` Title snippet + 🟡 link:…[#99] Title snippet (cross-platform: no tag) - Severity label: - blocker "severe bug that blocks users in their daily work" - - Tool labels: - One label per tool, name == the folder name under url/tool/ in the repo. - Fetched dynamically via the GitHub Contents API. +Usage: + python generate_quality_status.py [--token TOKEN] [--output PATH] + export GITHUB_TOKEN=ghp_yourtoken && python generate_quality_status.py """ import argparse @@ -61,36 +49,27 @@ REPO = "devonfw/IDEasy" API_BASE = "https://api.github.com" - -# Path inside the repo where one sub-folder == one tool label -# Must be relative to the repo root (no leading ../) TOOL_FOLDER_PATH = "url-updater/src/main/java/com/devonfw/tools/ide/url/tool" -# ── OS labels (exact case as used in the repo) ──────────────────────────────── OS_LABELS = {"windows": "windows", "linux": "linux", "mac": "macOS"} OS_ORDER = ["windows", "linux", "mac"] OS_DISPLAY = {"windows": "Windows", "linux": "Linux", "mac": "macOS"} +OS_SHORT = {"windows": "win", "linux": "linux", "mac": "mac"} -# ── Bug detection ───────────────────────────────────────────────────────────── -BUG_TYPE_NAMES = {"Bug", "bug"} # GitHub Types name OR legacy label +BUG_TYPE_NAMES = {"Bug", "bug"} BLOCKER_LABEL = "blocker" -# ── Tool registry ───────────────────────────────────────────────────────────── -# Single source of truth for every managed tool. -# -# Key → canonical folder name under url/tool/ (also the default label) -# "display" → human-readable name shown in the generated document -# "labels" → (optional) additional GitHub label names that map to this tool, -# for cases where the label differs from the folder name -# -# TOOL_DISPLAY_OVERRIDES and LABEL_ALIASES are derived automatically below. +# ── Tool registry ────────────────────────────────────────────────────────────── +# Key → canonical folder name (= default label) +# display → human-readable name +# labels → extra GitHub label names that also map to this tool TOOLS: dict[str, dict] = { "android-studio": {"display": "Android Studio"}, "aws": {"display": "AWS CLI"}, - "az": {"display": "Azure CLI", "labels": ["azure-cli"]}, - "copilot": {"display": "GitHub Copilot", "labels": ["github-copilot"]}, + "az": {"display": "Azure CLI"}, + "copilot": {"display": "GitHub Copilot"}, "corepack": {"display": "Corepack"}, - "docker": {"display": "Docker"}, + "docker": {"display": "Docker", "labels": ["docker", "rancher"]}, "dotnet": {"display": "dotnet"}, "eclipse": {"display": "Eclipse"}, "gcloud": {"display": "gcloud CLI"}, @@ -99,27 +78,24 @@ "git": {"display": "git"}, "gradle": {"display": "Gradle"}, "helm": {"display": "Helm"}, - "intellij": {"display": "IntelliJ IDEA", "labels": ["intellij-idea"]}, + "intellij": {"display": "IntelliJ IDEA"}, "jackson": {"display": "Jackson"}, - "java": {"display": "Java (JDK)", "labels": ["jdk"]}, + "java": {"display": "Java (JDK)"}, "jasypt": {"display": "Jasypt"}, "jmc": {"display": "JDK Mission Control"}, "kubectl": {"display": "kubectl"}, - "mvn": {"display": "Maven", "labels": ["maven"]}, + "mvn": {"display": "Maven"}, "node": {"display": "Node.js / npm", "labels": ["nodejs", "npm"]}, "oc": {"display": "OpenShift CLI"}, "pip": {"display": "pip"}, "python": {"display": "Python"}, "quarkus": {"display": "Quarkus CLI"}, - "sonar": {"display": "SonarQube", "labels": ["sonarqube"]}, + "sonar": {"display": "SonarQube"}, "terraform": {"display": "Terraform"}, - "vscode": {"display": "VS Code", "labels": ["vsc"]}, + "vscode": {"display": "VS Code"}, } -# ── Commandlet / core-feature registry ─────────────────────────────────────── -# Same structure as TOOLS but for IDEasy commandlets and cross-cutting features. -# The key is the GitHub label name used for that area. -# Add or rename entries here as the project evolves. +# ── Commandlet / core-feature registry ──────────────────────────────────────── COMMANDLETS: dict[str, dict] = { "ide": {"display": "IDEasy (general)"}, "install": {"display": "ide install"}, @@ -129,9 +105,9 @@ "build": {"display": "ide build"}, "shell": {"display": "Shell integration"}, "completion": {"display": "Shell completion"}, - "settings": {"display": "Settings / Properties", "labels": ["configuration", "properties"]}, + "settings": {"display": "Settings / Properties", "labels": ["configuration"]}, "security": {"display": "Security / Credentials"}, - "repository": {"display": "Repository management", "labels": ["repo"]}, + "repository": {"display": "Repository management"}, "env": {"display": "Environment variables"}, "plugin": {"display": "Plugin management"}, "migration": {"display": "Migration (devonfw-ide → IDEasy)"}, @@ -139,25 +115,19 @@ "version": {"display": "Version management"}, } -# ── Derived lookups ──────────────────────────────────────────────────────────── -# Do not edit these directly — maintain TOOLS and COMMANDLETS above instead. - +# ── Derived lookups (do not edit) ───────────────────────────────────────────── TOOL_DISPLAY_OVERRIDES: dict[str, str] = { - name: cfg["display"] for name, cfg in TOOLS.items() + n: c["display"] for n, c in TOOLS.items() } COMMANDLET_DISPLAY_OVERRIDES: dict[str, str] = { - name: cfg["display"] for name, cfg in COMMANDLETS.items() + n: c["display"] for n, c in COMMANDLETS.items() } - -# Combined alias map: non-canonical label → canonical key (tool or commandlet) LABEL_ALIASES: dict[str, str] = { alias: name for registry in (TOOLS, COMMANDLETS) for name, cfg in registry.items() for alias in cfg.get("labels", []) } - -# Labels that are meta/infrastructure — skipped in unmatched-label reporting _SKIP_LABELS: frozenset[str] = frozenset({ BLOCKER_LABEL, "bug", "enhancement", "feature", "task", "question", "duplicate", "wontfix", "invalid", "help wanted", "good first issue", @@ -182,45 +152,27 @@ def _get(path: str, token: str | None, params: dict | None = None): def fetch_tool_names(token: str | None) -> list[str]: - """ - Fetch the sub-folder names under TOOL_FOLDER_PATH via the GitHub Contents - API. Each folder == one tool, and its name == the issue label used for that - tool. Returns a sorted list of names. - Falls back to an empty list if the API call fails (e.g. rate-limited without - a token), in which case only commandlet/core sections will appear. - """ try: entries = _get(f"/repos/{REPO}/contents/{TOOL_FOLDER_PATH}", token) - return sorted( - e["name"] for e in entries - if isinstance(e, dict) and e.get("type") == "dir" - ) + return sorted(e["name"] for e in entries if isinstance(e, dict) and e.get("type") == "dir") except urllib.error.HTTPError as exc: hint = "" if token else " Set GITHUB_TOKEN to avoid rate limiting." print(f"WARNING: Could not fetch tool list ({exc.code} {exc.reason}). " - f"Only commandlet/core sections will be generated.{hint}", - file=sys.stderr) + f"Only commandlet sections will be generated.{hint}", file=sys.stderr) return [] except Exception as exc: - print(f"WARNING: Could not fetch tool list ({exc}). " - "Only commandlet/core sections will be generated.", file=sys.stderr) + print(f"WARNING: Could not fetch tool list ({exc}).", file=sys.stderr) return [] def fetch_all_issues(token: str | None, state: str = "open") -> list[dict]: - """Fetch all issues (not PRs) with pagination.""" - issues: list[dict] = [] - page = 1 + issues, page = [], 1 while True: - batch = _get( - f"/repos/{REPO}/issues", token, - {"state": state, "per_page": 100, "page": page}, - ) + batch = _get(f"/repos/{REPO}/issues", token, + {"state": state, "per_page": 100, "page": page}) if not isinstance(batch, list) or not batch: break - for item in batch: - if "pull_request" not in item: - issues.append(item) + issues.extend(i for i in batch if "pull_request" not in i) if len(batch) < 100: break page += 1 @@ -234,20 +186,10 @@ def label_names(issue: dict) -> set[str]: def is_bug(issue: dict, labels: set[str]) -> bool: - """ - Detect bugs via (in priority order): - 1. GitHub issue type name — modern issues use issue["type"]["name"] - 2. Legacy lowercase 'bug' label — older issues before GitHub Types existed - 3. 'blocker' label — implies a severe bug regardless of type field - """ - issue_type = issue.get("type") - if isinstance(issue_type, dict) and issue_type.get("name") in BUG_TYPE_NAMES: - return True - if "bug" in labels: - return True - if BLOCKER_LABEL in labels: + t = issue.get("type") + if isinstance(t, dict) and t.get("name") in BUG_TYPE_NAMES: return True - return False + return "bug" in labels or BLOCKER_LABEL in labels def is_blocker(labels: set[str]) -> bool: @@ -255,34 +197,26 @@ def is_blocker(labels: set[str]) -> bool: def os_keys_for_issue(labels: set[str]) -> list[str]: - """ - Issues with a specific OS label appear only in that OS section. - Issues with NO OS label are treated as cross-platform and appear in every - OS section (Windows, Linux, macOS). - """ + """OS-specific → that OS only. No OS label → all platforms.""" found = [k for k, lbl in OS_LABELS.items() if lbl in labels] return found if found else list(OS_ORDER) -def topic_labels_for_issue(labels: set[str], known_topics: set[str]) -> list[str]: - """ - Return canonical topic names matched from the issue's labels. - Checks both exact matches and LABEL_ALIASES so that labels whose names - differ from the canonical key are still mapped correctly. - """ +def topic_matches(labels: set[str], known: set[str]) -> list[str]: matched: set[str] = set() for lbl in labels: - if lbl in known_topics: + if lbl in known: matched.add(lbl) - elif lbl in LABEL_ALIASES and LABEL_ALIASES[lbl] in known_topics: + elif lbl in LABEL_ALIASES and LABEL_ALIASES[lbl] in known: matched.add(LABEL_ALIASES[lbl]) return sorted(matched) -# ─── Data aggregation ───────────────────────────────────────────────────────── +# ─── Data model ─────────────────────────────────────────────────────────────── -# IssueRef: (number, title, url, is_bug, is_blocker) -IssueRef = tuple[int, str, str, bool, bool] +# IssueRef: (number, title, url, is_bug, is_blocker, os_keys) +# os_keys is the list of OS keys this issue applies to (for display tagging) +IssueRef = tuple[int, str, str, bool, bool, list[str]] def classify_issues( @@ -290,17 +224,12 @@ def classify_issues( tool_keys: set[str], commandlet_keys: set[str], ) -> tuple[ - dict[str, dict[str, list[IssueRef]]], # tool_data[os_key][tool] - dict[str, dict[str, list[IssueRef]]], # cmd_data[os_key][commandlet] - list[dict], # unassigned issues + dict[str, dict[str, list[IssueRef]]], # tool_data[os_key][topic] + dict[str, dict[str, list[IssueRef]]], # cmd_data[os_key][topic] + list[dict], # unassigned ]: - """ - Classify every issue into tools, commandlets, or unassigned. - An issue can match multiple tools/commandlets and multiple OS sections. - Issues without an OS label appear in every OS section. - """ - tool_data: dict[str, dict[str, list[IssueRef]]] = defaultdict(lambda: defaultdict(list)) - cmd_data: dict[str, dict[str, list[IssueRef]]] = defaultdict(lambda: defaultdict(list)) + tool_data: dict = defaultdict(lambda: defaultdict(list)) + cmd_data: dict = defaultdict(lambda: defaultdict(list)) unassigned: list[dict] = [] for issue in issues: @@ -308,233 +237,164 @@ def classify_issues( bug = is_bug(issue, labels) blocker = is_blocker(labels) os_keys = os_keys_for_issue(labels) - ref: IssueRef = (issue["number"], issue["title"], issue["html_url"], bug, blocker) + ref: IssueRef = (issue["number"], issue["title"], issue["html_url"], bug, blocker, os_keys) - tool_matches = topic_labels_for_issue(labels, tool_keys) - cmd_matches = topic_labels_for_issue(labels, commandlet_keys) + t_matches = topic_matches(labels, tool_keys) + c_matches = topic_matches(labels, commandlet_keys) - if not tool_matches and not cmd_matches: + if not t_matches and not c_matches: unassigned.append(issue) continue for os_key in os_keys: - for t in tool_matches: + for t in t_matches: tool_data[os_key][t].append(ref) - for c in cmd_matches: + for c in c_matches: cmd_data[os_key][c].append(ref) return dict(tool_data), dict(cmd_data), unassigned -# ─── Status symbol ──────────────────────────────────────────────────────────── +# ─── Rendering helpers ──────────────────────────────────────────────────────── -def status_symbol(refs: list[IssueRef]) -> str: - if not refs: - return "🟢" - if any(blk for *_, blk in refs): - return "🚨" - if any(bug for _, _, _, bug, _ in refs): - return "🔴" +def _safe(text: str, max_len: int = 70) -> str: + s = text.replace("|", "-").replace("\n", " ") + return s[:max_len] + ("…" if len(s) > max_len else "") + + +def issue_icon(bug: bool, blocker: bool) -> str: + if blocker: return "🚨" + if bug: return "🔴" return "🟡" -# ─── AsciiDoc cell helpers ──────────────────────────────────────────────────── +def status_symbol(refs: list[IssueRef]) -> str: + if not refs: return "🟢" + if any(r[4] for r in refs): return "🚨" + if any(r[3] for r in refs): return "🔴" + return "🟡" -def _safe(text: str, max_len: int = 75) -> str: - """Strip characters that break AsciiDoc table cells.""" - cleaned = text.replace("|", "-").replace("\n", " ") - return cleaned[:max_len] + ("..." if len(cleaned) > max_len else "") +def fmt_issues_cell(lbl: str, data: dict[str, dict[str, list[IssueRef]]]) -> str: + """ + Collect all issues for `lbl` across all OS, deduplicate, and format as: + icon link:#N[#N] `os-tag` Title snippet + Issues that apply to all OS get no tag. OS-specific ones get a short tag. + Issues are sorted: blockers first, then bugs, then enhancements; by number within each group. + """ + seen: dict[int, IssueRef] = {} + for os_key in OS_ORDER: + for ref in data.get(os_key, {}).get(lbl, []): + if ref[0] not in seen: + seen[ref[0]] = ref -def fmt_links(refs: list[IssueRef]) -> str: - if not refs: + if not seen: return "-" - return " ".join(f"link:{url}[#{num}]" for num, _, url, _, _ in sorted(refs)) + def sort_key(r: IssueRef): + return (0 if r[4] else 1 if r[3] else 2, r[0]) -def fmt_notes(refs: list[IssueRef]) -> str: - if not refs: - return "No open issues" - parts = [ - f"{'🚨 ' if blk else ''}#{num}: {_safe(title)}" - for num, title, _, _, blk in sorted(refs) - ] - return "; ".join(parts) + parts = [] + all_os = set(OS_ORDER) + for ref in sorted(seen.values(), key=sort_key): + num, title, url, bug, blocker, ref_os_keys = ref + icon = issue_icon(bug, blocker) + tag = "" if set(ref_os_keys) == all_os else " `" + "/".join(OS_SHORT[k] for k in ref_os_keys) + "`" + parts.append(f"{icon} link:{url}[#{num}]{tag} {_safe(title)}") + + return " +\n".join(parts) # ─── AsciiDoc section builders ──────────────────────────────────────────────── -def _render_table( - section_title: str, +def _cross_os_table( + heading: str, col_header: str, rows: list[tuple[str, str]], - os_data: dict[str, list[IssueRef]], - level: int = 3, + data: dict[str, dict[str, list[IssueRef]]], + level: int = 2, ) -> list[str]: - """Render one AsciiDoc table. `level` controls the heading depth (= signs).""" - heading = "=" * level + """ + Single table with columns: Name | Win | Linux | macOS | Issues. + Only rows with at least one non-green OS cell are emitted. + """ + h = "=" * level lines = [ - f"{heading} {section_title}\n", - '[cols="2,1,4,5", options="header"]', + f"{h} {heading}\n", + '[cols="2,1,1,1,6", options="header"]', "|===", - f"| {col_header} | Status | Issues | Notes", + f"| {col_header} | Win | Linux | macOS | Issues", ] + any_row = False for lbl, disp in rows: - refs = os_data.get(lbl, []) + cells = [status_symbol(data.get(ok, {}).get(lbl, [])) for ok in OS_ORDER] + if all(c == "🟢" for c in cells): + continue + any_row = True lines += [ f"| {disp}", - f"| {status_symbol(refs)}", - f"| {fmt_links(refs)}", - f"| {fmt_notes(refs)}", + *[f"| {c}" for c in cells], + f"| {fmt_issues_cell(lbl, data)}", "", ] + if not any_row: + lines.append("| _No open issues_ | | | |\n") lines.append("|===\n") return lines def _summary_section( - tool_data: dict[str, dict[str, list[IssueRef]]], - cmd_data: dict[str, dict[str, list[IssueRef]]], + tool_data: dict, + cmd_data: dict, tool_rows: list[tuple[str, str]], cmd_rows: list[tuple[str, str]], ) -> str: - """ - Render the top-level Summary section: - 1. Active Blockers table (🚨 only, deduplicated across OS) - 2. Status-at-a-glance matrix for Tools (non-green rows only) - 3. Status-at-a-glance matrix for Commandlets (non-green rows only) - """ - lines: list[str] = [ - "== Summary\n", - "Quick overview of the most critical open issues across all platforms.\n", - ] - - # ── 1. Active Blockers ──────────────────────────────────────────────────── - lines += [ - "=== 🚨 Active Blockers\n", - "Issues labelled `blocker` that currently prevent users from working.\n", - ] - - # Collect all blocker refs, deduplicated by issue number - seen_blocker_ids: set[int] = set() - unique_blockers: list[tuple[str, str, IssueRef]] = [] # (category, display, ref) - - for os_key in OS_ORDER: - for lbl, disp in tool_rows: - for ref in tool_data.get(os_key, {}).get(lbl, []): - if ref[4] and ref[0] not in seen_blocker_ids: - seen_blocker_ids.add(ref[0]) - unique_blockers.append(("Tool", disp, ref)) - for lbl, disp in cmd_rows: - for ref in cmd_data.get(os_key, {}).get(lbl, []): - if ref[4] and ref[0] not in seen_blocker_ids: - seen_blocker_ids.add(ref[0]) - unique_blockers.append(("Commandlet", disp, ref)) - - if unique_blockers: + """Active blockers table (deduplicated across OS) + compact status legend.""" + lines = ["== Summary\n"] + + # Collect unique blockers + seen_ids: set[int] = set() + blockers: list[tuple[str, str, IssueRef]] = [] + for registry_rows, data, cat in ((tool_rows, tool_data, "Tool"), + (cmd_rows, cmd_data, "Commandlet")): + for lbl, disp in registry_rows: + for os_key in OS_ORDER: + for ref in data.get(os_key, {}).get(lbl, []): + if ref[4] and ref[0] not in seen_ids: + seen_ids.add(ref[0]) + blockers.append((cat, disp, ref)) + + lines.append("=== 🚨 Active Blockers\n") + if blockers: lines += [ - '[cols="1,2,2,5", options="header"]', + '[cols="1,2,1,5", options="header"]', "|===", "| Type | Tool / Commandlet | Issue | Title", ] - for cat, disp, (num, title, url, _, _) in sorted( - unique_blockers, key=lambda r: r[2][0] - ): - lines += [ - f"| {cat}", - f"| {disp}", - f"| link:{url}[#{num}]", - f"| {_safe(title)}", - "", - ] + for cat, disp, (num, title, url, *_rest) in sorted(blockers, key=lambda r: r[2][0]): + lines += [f"| {cat}", f"| {disp}", f"| link:{url}[#{num}]", f"| {_safe(title)}", ""] lines.append("|===\n") else: lines.append("_No active blockers_ 🎉\n") - # ── 2. Status matrix — Tools ────────────────────────────────────────────── - lines += [ - "=== Status Matrix — Tools\n", - "Only tools with at least one open issue are shown.\n", - '[cols="3,1,1,1", options="header"]', - "|===", - "| Tool | Windows | Linux | macOS", - ] - for lbl, disp in tool_rows: - cells = [ - status_symbol(tool_data.get(os_key, {}).get(lbl, [])) - for os_key in OS_ORDER - ] - if any(c != "🟢" for c in cells): - lines += [f"| {disp}", *[f"| {c}" for c in cells], ""] - lines.append("|===\n") - - # ── 3. Status matrix — Commandlets ─────────────────────────────────────── - lines += [ - "=== Status Matrix — Commandlets & Core Features\n", - "Only commandlets with at least one open issue are shown.\n", - '[cols="3,1,1,1", options="header"]', - "|===", - "| Commandlet / Feature | Windows | Linux | macOS", - ] - for lbl, disp in cmd_rows: - cells = [ - status_symbol(cmd_data.get(os_key, {}).get(lbl, [])) - for os_key in OS_ORDER - ] - if any(c != "🟢" for c in cells): - lines += [f"| {disp}", *[f"| {c}" for c in cells], ""] - lines.append("|===\n") - - return "\n".join(lines) - - -def _os_section( - os_key: str, - tool_data_for_os: dict[str, list[IssueRef]], - cmd_data_for_os: dict[str, list[IssueRef]], - tool_rows: list[tuple[str, str]], - cmd_rows: list[tuple[str, str]], -) -> str: - os_name = OS_DISPLAY[os_key] - os_lbl = OS_LABELS[os_key] - - lines: list[str] = [ - f"== {os_name}\n", - f"Open issues labelled `{os_lbl}` *or without any OS label*.\n", - "NOTE: Issues without an OS label are cross-platform and therefore " - "appear in every OS section.\n", - ] - lines += _render_table("Tools", "Tool", tool_rows, tool_data_for_os, level=3) - lines += _render_table( - "Commandlets & Core Features", "Commandlet / Feature", - cmd_rows, cmd_data_for_os, level=3, - ) return "\n".join(lines) def _unassigned_section(unassigned: list[dict]) -> str: - """Render a section listing issues that could not be matched to any topic.""" - lines: list[str] = [ + lines = [ "== Unassigned Issues\n", - f"The following {len(unassigned)} issue(s) could not be matched to any known " - "tool or commandlet. Add the appropriate label on GitHub, or extend " - "`TOOLS`, `COMMANDLETS`, or their `\"labels\"` lists in this script.\n", + f"{len(unassigned)} issue(s) matched no known tool or commandlet. " + "Add the appropriate label on GitHub or extend `TOOLS`/`COMMANDLETS` " + "in this script.\n", ] if not unassigned: lines.append("_All issues are assigned._ 🎉\n") return "\n".join(lines) - - lines += [ - '[cols="1,4,3", options="header"]', - "|===", - "| Issue | Title | Labels", - ] + lines += ['[cols="1,4,3", options="header"]', "|===", "| # | Title | Labels"] for issue in sorted(unassigned, key=lambda i: i["number"]): - num = issue["number"] - url = issue["html_url"] - lbls = ", ".join(lbl["name"] for lbl in issue.get("labels", [])) + lbls = ", ".join(l["name"] for l in issue.get("labels", [])) lines += [ - f"| link:{url}[#{num}]", + f"| link:{issue['html_url']}[#{issue['number']}]", f"| {_safe(issue['title'])}", f"| {lbls or '—'}", "", @@ -543,7 +403,7 @@ def _unassigned_section(unassigned: list[dict]) -> str: return "\n".join(lines) -# ─── Header template ────────────────────────────────────────────────────────── +# ─── Header & document assembly ─────────────────────────────────────────────── _HEADER = """\ = Quality Status @@ -554,122 +414,80 @@ def _unassigned_section(unassigned: list[dict]) -> str: == Overview -This document gives an overview of the quality and support status of IDEasy tools -and commandlets across operating systems. -It is *automatically generated* from open GitHub issues in the -https://github.com/{repo}[{repo}] repository. -The tool list is discovered dynamically from the source tree, so it stays -accurate as new tools are added. - -*OS label behaviour:* Issues labelled with a specific OS appear only in that OS -section. Issues with *no OS label* are treated as cross-platform and appear in -*every* OS section (Windows, Linux, macOS). +Automatically generated quality and support status for https://github.com/{repo}[{repo}]. +Tool list is discovered dynamically from the source tree. -Legend: +*OS behaviour:* Issues labelled with a specific OS appear only in that OS column. +Issues with *no OS label* are cross-platform and count toward every OS column (no tag shown). -[cols="1,4"] +[cols="1,1,1,1,1", options="header"] |=== -| Symbol | Meaning - -| 🟢 | No known open issues -| 🟡 | Open feature requests / enhancements only (no bugs) -| 🔴 | At least one open bug -| 🚨 | At least one *blocker* (fully prevents users from working) +| 🟢 | 🟡 | 🔴 | 🚨 | Issue icon +| No issues | Enhancements only | Bug(s) | Blocker | 🟡 enhancement · 🔴 bug · 🚨 blocker |=== -_Last generated: {date} — {total} issues loaded, {matched} assigned, {unassigned} unassigned_ +_Generated: {date} · {total} issues · {matched} assigned · {unassigned} unassigned_ """ -# ─── Main generation ────────────────────────────────────────────────────────── - def generate_adoc(issues: list[dict], tool_names: list[str]) -> str: tool_rows: list[tuple[str, str]] = [ - (name, TOOL_DISPLAY_OVERRIDES.get(name, name.replace("-", " ").title())) - for name in tool_names + (n, TOOL_DISPLAY_OVERRIDES.get(n, n.replace("-", " ").title())) + for n in tool_names ] cmd_rows: list[tuple[str, str]] = [ - (name, COMMANDLET_DISPLAY_OVERRIDES[name]) - for name in COMMANDLETS + (n, COMMANDLET_DISPLAY_OVERRIDES[n]) for n in COMMANDLETS ] tool_keys = {r[0] for r in tool_rows} commandlet_keys = {r[0] for r in cmd_rows} - tool_data, cmd_data, unassigned = classify_issues(issues, tool_keys, commandlet_keys) date = datetime.now(timezone.utc).strftime("%Y-%m-%d %H:%M UTC") header = _HEADER.format( repo=REPO, date=date, - total=len(issues), - matched=len(issues) - len(unassigned), - unassigned=len(unassigned), + total=len(issues), matched=len(issues) - len(unassigned), unassigned=len(unassigned), ) parts = [header] parts.append(_summary_section(tool_data, cmd_data, tool_rows, cmd_rows)) - - for os_key in OS_ORDER: - parts.append(_os_section( - os_key, - tool_data.get(os_key, {}), - cmd_data.get(os_key, {}), - tool_rows, - cmd_rows, - )) - + parts += _cross_os_table("Tools", "Tool", tool_rows, tool_data, level=2) + parts += _cross_os_table("Commandlets & Core Features", "Commandlet / Feature", + cmd_rows, cmd_data, level=2) parts.append(_unassigned_section(unassigned)) - parts.append("""\ == How to Contribute -=== Adding a new tool -Adding a new tool is automatic: as soon as a new folder is added under -`url-updater/src/main/java/com/devonfw/tools/ide/url/tool/` and issues are -labelled with that folder name, the tool appears in the next generated document. -To override the display name, add an entry to `TOOLS` in this script. - -=== Adding a new commandlet -Add an entry to the `COMMANDLETS` dict in this script. The key is the GitHub -label name; `"display"` is the human-readable name; `"labels"` lists any -alternative label names that should also map to this commandlet. - -=== Mapping a non-standard label -If a GitHub label does not match any key in `TOOLS` or `COMMANDLETS`, add the -label name to the `"labels"` list of the appropriate registry entry. -Any remaining unmatched issues will appear in the *Unassigned Issues* section. +*New tool:* Automatic once a folder exists under `url-updater/.../url/tool/` and issues use that name as label. +Override the display name in `TOOLS["display"]`. + +*New commandlet:* Add an entry to `COMMANDLETS` — key = GitHub label, `"display"` = name, `"labels"` = aliases. + +*Non-standard label:* Add it to the `"labels"` list of the matching `TOOLS` or `COMMANDLETS` entry. +Unmatched issues appear in the *Unassigned Issues* section. """) return "\n".join(parts) -# ─── Main entry point ───────────────────────────────────────────────────────── +# ─── Main ───────────────────────────────────────────────────────────────────── def main() -> None: parser = argparse.ArgumentParser(description=f"Generate quality-status.adoc for {REPO}") - parser.add_argument("--token", default=os.environ.get("GITHUB_TOKEN"), - help="GitHub personal access token (or set GITHUB_TOKEN env var)") - parser.add_argument("--output", default="quality-status.adoc", - help="Output file path (default: quality-status.adoc)") - parser.add_argument("--state", default="open", choices=["open", "all"], - help="Issue state to include (default: open)") + parser.add_argument("--token", default=os.environ.get("GITHUB_TOKEN")) + parser.add_argument("--output", default="quality-status.adoc") + parser.add_argument("--state", default="open", choices=["open", "all"]) args = parser.parse_args() if not args.token: - print("WARNING: No GITHUB_TOKEN set — unauthenticated requests are limited " - "to 60/hour and the tool list fetch also counts against that quota.", - file=sys.stderr) + print("WARNING: No GITHUB_TOKEN — rate-limited to 60 req/hour.", file=sys.stderr) - # ── Fetch tool list ────────────────────────────────────────────────────── - print("Fetching tool list from source tree ...", file=sys.stderr) + print("Fetching tool list ...", file=sys.stderr) tool_names = fetch_tool_names(args.token) - if tool_names: - print(f" {len(tool_names)} tools found: {', '.join(tool_names)}", file=sys.stderr) - else: - print(" No tools found — check GITHUB_TOKEN and network access.", file=sys.stderr) + print(f" {len(tool_names)} tools found." if tool_names + else " No tools found — check token and network.", file=sys.stderr) - # ── Fetch issues ───────────────────────────────────────────────────────── print(f"Fetching {args.state} issues from {REPO} ...", file=sys.stderr) try: issues = fetch_all_issues(args.token, state=args.state) @@ -678,30 +496,19 @@ def main() -> None: sys.exit(1) print(f" {len(issues)} issues loaded.", file=sys.stderr) - # ── Assignment statistics ───────────────────────────────────────────────── tool_keys = set(tool_names) commandlet_keys = set(COMMANDLETS.keys()) _, _, unassigned = classify_issues(issues, tool_keys, commandlet_keys) - matched_count = len(issues) - len(unassigned) - pct = f" ({matched_count / len(issues) * 100:.1f}% of total)" if issues else "" + matched = len(issues) - len(unassigned) + pct = f" ({matched / len(issues) * 100:.1f}%)" if issues else "" + print(f" {matched} assigned{pct}, {len(unassigned)} unassigned.", file=sys.stderr) - print(f" {matched_count} issues assigned{pct}", file=sys.stderr) - print(f" {len(unassigned)} issues unassigned", file=sys.stderr) - - # ── Unmatched label report ──────────────────────────────────────────────── all_known = tool_keys | commandlet_keys | set(LABEL_ALIASES) - all_issue_labels = { - lbl["name"] for issue in issues for lbl in issue.get("labels", []) - } - unmatched_labels = all_issue_labels - all_known - _SKIP_LABELS - if unmatched_labels: - print( - f" Unmatched labels (consider adding to TOOLS/COMMANDLETS/labels): " - f"{', '.join(sorted(unmatched_labels))}", - file=sys.stderr, - ) - - # ── Write output ───────────────────────────────────────────────────────── + all_labels = {l["name"] for i in issues for l in i.get("labels", [])} + unmatched = all_labels - all_known - _SKIP_LABELS + if unmatched: + print(f" Unmatched labels: {', '.join(sorted(unmatched))}", file=sys.stderr) + adoc = generate_adoc(issues, tool_names) with open(args.output, "w", encoding="utf-8") as fh: fh.write(adoc) diff --git a/documentation/quality-status.adoc b/documentation/quality-status.adoc index f5ee5f8438..4dd6a1d6a7 100644 --- a/documentation/quality-status.adoc +++ b/documentation/quality-status.adoc @@ -6,1146 +6,358 @@ == Overview -This document gives an overview of the quality and support status of IDEasy tools -and commandlets across operating systems. -It is *automatically generated* from open GitHub issues in the -https://github.com/devonfw/IDEasy[devonfw/IDEasy] repository. -The tool list is discovered dynamically from the source tree, so it stays -accurate as new tools are added. +Automatically generated quality and support status for https://github.com/devonfw/IDEasy[devonfw/IDEasy]. +Tool list is discovered dynamically from the source tree. -*OS label behaviour:* Issues labelled with a specific OS appear only in that OS -section. Issues with *no OS label* are treated as cross-platform and appear in -*every* OS section (Windows, Linux, macOS). +*OS behaviour:* Issues labelled with a specific OS appear only in that OS column. +Issues with *no OS label* are cross-platform and count toward every OS column (no tag shown). -Legend: - -[cols="1,4"] +[cols="1,1,1,1,1", options="header"] |=== -| Symbol | Meaning - -| 🟢 | No known open issues -| 🟡 | Open feature requests / enhancements only (no bugs) -| 🔴 | At least one open bug -| 🚨 | At least one *blocker* (fully prevents users from working) +| 🟢 | 🟡 | 🔴 | 🚨 | Issue icon +| No issues | Enhancements only | Bug(s) | Blocker | 🟡 enhancement · 🔴 bug · 🚨 blocker |=== -_Last generated: 2026-05-06 09:19 UTC — 186 issues loaded, 89 assigned, 97 unassigned_ +_Generated: 2026-05-06 09:45 UTC · 186 issues · 99 assigned · 87 unassigned_ == Summary -Quick overview of the most critical open issues across all platforms. - === 🚨 Active Blockers -Issues labelled `blocker` that currently prevent users from working. - _No active blockers_ 🎉 -=== Status Matrix — Tools +== Tools -Only tools with at least one open issue are shown. - -[cols="3,1,1,1", options="header"] +[cols="2,1,1,1,6", options="header"] |=== -| Tool | Windows | Linux | macOS +| Tool | Win | Linux | macOS | Issues | AWS CLI | 🟡 | 🟡 | 🔴 +| 🔴 link:https://github.com/devonfw/IDEasy/issues/796[#796] `mac` cannot install aws on Mac + +🔴 link:https://github.com/devonfw/IDEasy/issues/864[#864] `mac` AWS is not working on Mac x64 + +🟡 link:https://github.com/devonfw/IDEasy/issues/703[#703] Support AWS CDK | Azure CLI | 🔴 | 🔴 | 🔴 +| 🔴 link:https://github.com/devonfw/IDEasy/issues/802[#802] `linux/mac` az not working on Mac + +🔴 link:https://github.com/devonfw/IDEasy/issues/855[#855] ide az config not working + +🔴 link:https://github.com/devonfw/IDEasy/issues/865[#865] `mac` Az is not working on Mac x64 | GitHub Copilot | 🟡 | 🟡 | 🟡 +| 🟡 link:https://github.com/devonfw/IDEasy/issues/1717[#1717] Add github-copliot-cli as software package | Docker | 🔴 | 🔴 | 🔴 +| 🔴 link:https://github.com/devonfw/IDEasy/issues/44[#44] DockerUrlUpdater not finding/adding specific versions + +🔴 link:https://github.com/devonfw/IDEasy/issues/867[#867] `linux` Docker (Rancher Desktop) not working on Linux + +🔴 link:https://github.com/devonfw/IDEasy/issues/1659[#1659] Global tools run tool while installation is running in background + +🟡 link:https://github.com/devonfw/IDEasy/issues/950[#950] `linux` avoid --no-gpg-checks for docker installation on SUSE Linux + +🟡 link:https://github.com/devonfw/IDEasy/issues/1181[#1181] Improve url updater for docker desktop to pull all necessary versions + +🟡 link:https://github.com/devonfw/IDEasy/issues/1868[#1868] Revision of the functionality of global tool commandlets + +| dotnet +| 🟡 +| 🟡 +| 🟡 +| 🟡 link:https://github.com/devonfw/IDEasy/issues/694[#694] `linux` Add linux support to dotnet tool + +🟡 link:https://github.com/devonfw/IDEasy/issues/701[#701] Fix Dotnet tests on our CI | Eclipse | 🟡 | 🟡 | 🔴 +| 🔴 link:https://github.com/devonfw/IDEasy/issues/868[#868] `mac` Eclipse does not work on Mac x64 + +🔴 link:https://github.com/devonfw/IDEasy/issues/1187[#1187] `mac` Eclipse plugin installation on mac is not working + +🟡 link:https://github.com/devonfw/IDEasy/issues/1165[#1165] Automatic project import for Eclipse + +🟡 link:https://github.com/devonfw/IDEasy/issues/1525[#1525] lombok not correctly installed in eclipse | gcloud CLI | 🟡 | 🟡 | 🟡 +| 🟡 link:https://github.com/devonfw/IDEasy/issues/19[#19] Implement ToolCommandlet for Google Cloud CLI | GCViewer | 🟡 | 🟡 | 🔴 +| 🔴 link:https://github.com/devonfw/IDEasy/issues/869[#869] `mac` gcviewer logs errors on Mac X64 + +🟡 link:https://github.com/devonfw/IDEasy/issues/825[#825] Consider adding GC Log Analyzer | IntelliJ IDEA | 🔴 | 🔴 | 🔴 +| 🔴 link:https://github.com/devonfw/IDEasy/issues/120[#120] intellij does not use our settings when we create a new project within… + +🔴 link:https://github.com/devonfw/IDEasy/issues/717[#717] IDEasy does not start Intellij if license was not accepted + +🔴 link:https://github.com/devonfw/IDEasy/issues/1501[#1501] Starting intellij leads to error popup + +🟡 link:https://github.com/devonfw/IDEasy/issues/992[#992] Support multiple attributes for merge:id + +🟡 link:https://github.com/devonfw/IDEasy/issues/1512[#1512] `mac` Cannot run Intellij on Mac due to file permission error + +| Java (JDK) +| 🟡 +| 🟡 +| 🟡 +| 🟡 link:https://github.com/devonfw/IDEasy/issues/72[#72] Add further editions of java | Kotlinc | 🔴 | 🔴 | 🔴 +| 🔴 link:https://github.com/devonfw/IDEasy/issues/857[#857] kotlinc bash does not get keyboard inputs | Maven | 🔴 | 🟢 | 🟢 +| 🔴 link:https://github.com/devonfw/IDEasy/issues/594[#594] `win` Still windows file locking problems | Node.js / npm | 🔴 | 🔴 | 🔴 +| 🔴 link:https://github.com/devonfw/IDEasy/issues/859[#859] node shell not starting | Npm | 🔴 | 🔴 | 🔴 +| 🔴 link:https://github.com/devonfw/IDEasy/issues/801[#801] `mac` npm not working on Mac + +🔴 link:https://github.com/devonfw/IDEasy/issues/1886[#1886] NpmBasedCommandlet shows wrong tool version after install + +🟡 link:https://github.com/devonfw/IDEasy/issues/700[#700] Add Npm run test | Pgadmin | 🔴 | 🔴 | 🔴 +| 🔴 link:https://github.com/devonfw/IDEasy/issues/798[#798] `mac` pgadmin not working on Mac + +🔴 link:https://github.com/devonfw/IDEasy/issues/861[#861] install of pgadmin throws an IllegalStateException when the install wi… + +🔴 link:https://github.com/devonfw/IDEasy/issues/878[#878] `mac` pgadmin does not work on Mac x64 + +🟡 link:https://github.com/devonfw/IDEasy/issues/1868[#1868] Revision of the functionality of global tool commandlets | Python | 🔴 | 🔴 | 🔴 +| 🔴 link:https://github.com/devonfw/IDEasy/issues/1124[#1124] Ensure latest version of Python is installed + +🟡 link:https://github.com/devonfw/IDEasy/issues/1046[#1046] `linux` Add Support for Python on Linux | Rust | 🟡 | 🟡 | 🟡 +| 🟡 link:https://github.com/devonfw/IDEasy/issues/1719[#1719] Integrate rust | SonarQube | 🟢 | 🟢 | 🔴 +| 🔴 link:https://github.com/devonfw/IDEasy/issues/800[#800] `mac` sonar not working on Mac | Terraform | 🔴 | 🔴 | 🔴 +| 🔴 link:https://github.com/devonfw/IDEasy/issues/1391[#1391] bashrc messed with terraform completions | Uv | 🔴 | 🔴 | 🔴 +| 🔴 link:https://github.com/devonfw/IDEasy/issues/1518[#1518] uv tools are installed globally | VS Code | 🟡 | 🔴 | 🔴 +| 🔴 link:https://github.com/devonfw/IDEasy/issues/862[#862] `mac` vscode does not work on Mac + +🔴 link:https://github.com/devonfw/IDEasy/issues/1352[#1352] `linux` VSCode WSL warning prompt blocking VSCode plugin installation + +🔴 link:https://github.com/devonfw/IDEasy/issues/1844[#1844] `linux` `ide install vscode` or `ide vscode` freezes at "installing plugins" s… + +🟡 link:https://github.com/devonfw/IDEasy/issues/787[#787] Provide variable to disable open new workspace + +🟡 link:https://github.com/devonfw/IDEasy/issues/1167[#1167] Automatic project import for VSCode + +🟡 link:https://github.com/devonfw/IDEasy/issues/1715[#1715] Adapt settings to inject java runtime future proove into vscode + +🟡 link:https://github.com/devonfw/IDEasy/issues/1754[#1754] Add version support to vscode settings .plugin files + +🟡 link:https://github.com/devonfw/IDEasy/issues/1849[#1849] Support VSCodium |=== -=== Status Matrix — Commandlets & Core Features - -Only commandlets with at least one open issue are shown. +== Commandlets & Core Features -[cols="3,1,1,1", options="header"] +[cols="2,1,1,1,6", options="header"] |=== -| Commandlet / Feature | Windows | Linux | macOS +| Commandlet / Feature | Win | Linux | macOS | Issues | ide install | 🔴 | 🔴 | 🔴 +| 🔴 link:https://github.com/devonfw/IDEasy/issues/594[#594] `win` Still windows file locking problems + +🔴 link:https://github.com/devonfw/IDEasy/issues/861[#861] install of pgadmin throws an IllegalStateException when the install wi… + +🔴 link:https://github.com/devonfw/IDEasy/issues/1227[#1227] `win` Guide windows user after installation + +🔴 link:https://github.com/devonfw/IDEasy/issues/1232[#1232] `win` MSI Repair broken + +🔴 link:https://github.com/devonfw/IDEasy/issues/1517[#1517] IDEasy setup does not install Windows Terminal + +🔴 link:https://github.com/devonfw/IDEasy/issues/1518[#1518] uv tools are installed globally + +🔴 link:https://github.com/devonfw/IDEasy/issues/1579[#1579] `win` IDEasy uninstall after a failed MSI installation does not work + +🔴 link:https://github.com/devonfw/IDEasy/issues/1659[#1659] Global tools run tool while installation is running in background + +🟡 link:https://github.com/devonfw/IDEasy/issues/377[#377] `mac` Support Homebrew for installation on macOS + +🟡 link:https://github.com/devonfw/IDEasy/issues/421[#421] `win` Allow installation of IDEasy via winget + +🟡 link:https://github.com/devonfw/IDEasy/issues/422[#422] `win` Allow installation of IDEasy via Windows Store + +🟡 link:https://github.com/devonfw/IDEasy/issues/423[#423] `mac` Create installer for MacOS + +🟡 link:https://github.com/devonfw/IDEasy/issues/703[#703] Support AWS CDK + +🟡 link:https://github.com/devonfw/IDEasy/issues/714[#714] Improve UX for settings repository + +🟡 link:https://github.com/devonfw/IDEasy/issues/1056[#1056] `win` Add Conversion of LICENSE.adoc to RTF Format + +🟡 link:https://github.com/devonfw/IDEasy/issues/1102[#1102] `win` IDEasy MSI installer not working (unsigned) + +🟡 link:https://github.com/devonfw/IDEasy/issues/1558[#1558] `win` Add install.log path to msi installer window + +🟡 link:https://github.com/devonfw/IDEasy/issues/1694[#1694] Fix behavior when providing a wrong git URL + +🟡 link:https://github.com/devonfw/IDEasy/issues/1763[#1763] Improve installation/testing of SNAPSHOT releases + +🟡 link:https://github.com/devonfw/IDEasy/issues/1868[#1868] Revision of the functionality of global tool commandlets | ide uninstall | 🔴 | 🟡 | 🟡 +| 🔴 link:https://github.com/devonfw/IDEasy/issues/1456[#1456] `win` Uninstall via Windows settings not working + +🟡 link:https://github.com/devonfw/IDEasy/issues/399[#399] Handle uninstall of global tool commandlets + +🟡 link:https://github.com/devonfw/IDEasy/issues/785[#785] Re-introduce workspace reverse options from devonfw-ide + +🟡 link:https://github.com/devonfw/IDEasy/issues/1868[#1868] Revision of the functionality of global tool commandlets + +🟡 link:https://github.com/devonfw/IDEasy/issues/1872[#1872] `win` Implement generic uninstall implementation for global tools under wind… | ide update | 🔴 | 🔴 | 🔴 +| 🔴 link:https://github.com/devonfw/IDEasy/issues/594[#594] `win` Still windows file locking problems + +🔴 link:https://github.com/devonfw/IDEasy/issues/1333[#1333] Step 'Install or update software' already ended with false and now end… + +🔴 link:https://github.com/devonfw/IDEasy/issues/1548[#1548] `win` Windows file locking error on update with plugins + +🟡 link:https://github.com/devonfw/IDEasy/issues/639[#639] Improve step success logic for sub steps + +🟡 link:https://github.com/devonfw/IDEasy/issues/714[#714] Improve UX for settings repository + +🟡 link:https://github.com/devonfw/IDEasy/issues/945[#945] Improve ide update with smart dependency handling + +🟡 link:https://github.com/devonfw/IDEasy/issues/1694[#1694] Fix behavior when providing a wrong git URL | ide create-project | 🟡 | 🟡 | 🟡 +| 🟡 link:https://github.com/devonfw/IDEasy/issues/714[#714] Improve UX for settings repository + +🟡 link:https://github.com/devonfw/IDEasy/issues/1695[#1695] Clone settings to temporary directory, analyse, and then move | Shell integration | 🔴 | 🔴 | 🔴 +| 🔴 link:https://github.com/devonfw/IDEasy/issues/836[#836] Exit is completed in wrong places + +🔴 link:https://github.com/devonfw/IDEasy/issues/1746[#1746] ide shell broken + +🔴 link:https://github.com/devonfw/IDEasy/issues/1842[#1842] Infinite completion of exit subcommand + +🟡 link:https://github.com/devonfw/IDEasy/issues/821[#821] Allow User to remove "ide " prefix in ide shell for non-IDEasy command + +🟡 link:https://github.com/devonfw/IDEasy/issues/822[#822] Handle long CWD paths in shell prompt | Shell completion | 🔴 | 🔴 | 🔴 +| 🔴 link:https://github.com/devonfw/IDEasy/issues/551[#551] Autocompletion and list-versions make OS-agnostic suggestions + +🔴 link:https://github.com/devonfw/IDEasy/issues/1842[#1842] Infinite completion of exit subcommand + +🟡 link:https://github.com/devonfw/IDEasy/issues/169[#169] Check if we want to utilize TailTipWidgets for the autocompleter + +🟡 link:https://github.com/devonfw/IDEasy/issues/1392[#1392] Smart completion | Settings / Properties | 🔴 | 🔴 | 🔴 +| 🔴 link:https://github.com/devonfw/IDEasy/issues/1063[#1063] User specific configurations are not working as described + +🔴 link:https://github.com/devonfw/IDEasy/issues/1518[#1518] uv tools are installed globally + +🟡 link:https://github.com/devonfw/IDEasy/issues/449[#449] Consider integration of continue GenAI coding assistant + +🟡 link:https://github.com/devonfw/IDEasy/issues/714[#714] Improve UX for settings repository + +🟡 link:https://github.com/devonfw/IDEasy/issues/735[#735] Enhance workspace configuration with generic overlay from settings/wor… + +🟡 link:https://github.com/devonfw/IDEasy/issues/785[#785] Re-introduce workspace reverse options from devonfw-ide + +🟡 link:https://github.com/devonfw/IDEasy/issues/987[#987] conditional templates + +🟡 link:https://github.com/devonfw/IDEasy/issues/989[#989] allow expressions in template variable definitions + +🟡 link:https://github.com/devonfw/IDEasy/issues/992[#992] Support multiple attributes for merge:id + +🟡 link:https://github.com/devonfw/IDEasy/issues/1214[#1214] preserve EOL style in upgrade-settings + +🟡 link:https://github.com/devonfw/IDEasy/issues/1676[#1676] Import extra SDKs automatically into IDE + +🟡 link:https://github.com/devonfw/IDEasy/issues/1694[#1694] Fix behavior when providing a wrong git URL + +🟡 link:https://github.com/devonfw/IDEasy/issues/1695[#1695] Clone settings to temporary directory, analyse, and then move + +🟡 link:https://github.com/devonfw/IDEasy/issues/1715[#1715] Adapt settings to inject java runtime future proove into vscode + +🟡 link:https://github.com/devonfw/IDEasy/issues/1880[#1880] Reinstall all plugins for IDE in force mode | Security / Credentials | 🔴 | 🔴 | 🔴 +| 🔴 link:https://github.com/devonfw/IDEasy/issues/772[#772] CVE-2023-7272 in org.eclipse.parsson 1.1.7 + +🔴 link:https://github.com/devonfw/IDEasy/issues/1775[#1775] Validate and Fix CPE Vendor/Product Identifiers for All Tools + +🟡 link:https://github.com/devonfw/IDEasy/issues/98[#98] Ability to secure downloads from custom repository + +🟡 link:https://github.com/devonfw/IDEasy/issues/190[#190] Improve #103: security warning for CVEs in file tool/edition/security + +🟡 link:https://github.com/devonfw/IDEasy/issues/1628[#1628] Support for OS specific CVEs | Repository management | 🟡 | 🟡 | 🟡 +| 🟡 link:https://github.com/devonfw/IDEasy/issues/1164[#1164] Automatic project import + +🟡 link:https://github.com/devonfw/IDEasy/issues/1165[#1165] Automatic project import for Eclipse + +🟡 link:https://github.com/devonfw/IDEasy/issues/1167[#1167] Automatic project import for VSCode | ide status | 🔴 | 🔴 | 🔴 +| 🔴 link:https://github.com/devonfw/IDEasy/issues/1255[#1255] ide status does not recognize snapshot version correctly + +🟡 link:https://github.com/devonfw/IDEasy/issues/1209[#1209] migration version message is confusing | Version management | 🟡 | 🟡 | 🟡 - -|=== - -== Windows - -Open issues labelled `windows` *or without any OS label*. - -NOTE: Issues without an OS label are cross-platform and therefore appear in every OS section. - -=== Tools - -[cols="2,1,4,5", options="header"] -|=== -| Tool | Status | Issues | Notes -| Androidstudio -| 🟢 -| - -| No open issues - -| AWS CLI -| 🟡 -| link:https://github.com/devonfw/IDEasy/issues/703[#703] -| #703: Support AWS CDK - -| Azure CLI -| 🔴 -| link:https://github.com/devonfw/IDEasy/issues/855[#855] -| #855: ide az config not working - -| GitHub Copilot -| 🟡 -| link:https://github.com/devonfw/IDEasy/issues/1717[#1717] -| #1717: Add github-copliot-cli as software package - -| Corepack -| 🟢 -| - -| No open issues - -| Docker -| 🔴 -| link:https://github.com/devonfw/IDEasy/issues/44[#44] link:https://github.com/devonfw/IDEasy/issues/1181[#1181] link:https://github.com/devonfw/IDEasy/issues/1659[#1659] link:https://github.com/devonfw/IDEasy/issues/1868[#1868] -| #44: DockerUrlUpdater not finding/adding specific versions; #1181: Improve url updater for docker desktop to pull all necessary versions; #1659: Global tools run tool while installation is running in background; #1868: Revision of the functionality of global tool commandlets - -| dotnet -| 🟢 -| - -| No open issues - -| Eclipse -| 🟡 -| link:https://github.com/devonfw/IDEasy/issues/1165[#1165] link:https://github.com/devonfw/IDEasy/issues/1525[#1525] -| #1165: Automatic project import for Eclipse; #1525: lombok not correctly installed in eclipse - -| gcloud CLI -| 🟡 -| link:https://github.com/devonfw/IDEasy/issues/19[#19] -| #19: Implement ToolCommandlet for Google Cloud CLI - -| GCViewer -| 🟡 -| link:https://github.com/devonfw/IDEasy/issues/825[#825] -| #825: Consider adding GC Log Analyzer - -| GitHub CLI -| 🟢 -| - -| No open issues - -| Go -| 🟢 -| - -| No open issues - -| Graalvm -| 🟢 -| - -| No open issues - -| Gradle -| 🟢 -| - -| No open issues - -| Helm -| 🟢 -| - -| No open issues - -| IntelliJ IDEA -| 🔴 -| link:https://github.com/devonfw/IDEasy/issues/120[#120] link:https://github.com/devonfw/IDEasy/issues/717[#717] link:https://github.com/devonfw/IDEasy/issues/992[#992] link:https://github.com/devonfw/IDEasy/issues/1501[#1501] -| #120: intellij does not use our settings when we create a new project within inte...; #717: IDEasy does not start Intellij if license was not accepted; #992: Support multiple attributes for merge:id; #1501: Starting intellij leads to error popup - -| Jasypt -| 🟢 -| - -| No open issues - -| Java (JDK) -| 🟢 -| - -| No open issues - -| Jenkins -| 🟢 -| - -| No open issues - -| JDK Mission Control -| 🟢 -| - -| No open issues - -| Kotlinc -| 🔴 -| link:https://github.com/devonfw/IDEasy/issues/857[#857] -| #857: kotlinc bash does not get keyboard inputs - -| Lazydocker -| 🟢 -| - -| No open issues - -| Maven -| 🔴 -| link:https://github.com/devonfw/IDEasy/issues/594[#594] -| #594: Still windows file locking problems - -| Ng -| 🟢 -| - -| No open issues - -| Node.js / npm -| 🔴 -| link:https://github.com/devonfw/IDEasy/issues/859[#859] -| #859: node shell not starting - -| Npm -| 🔴 -| link:https://github.com/devonfw/IDEasy/issues/1886[#1886] -| #1886: NpmBasedCommandlet shows wrong tool version after install - -| OpenShift CLI -| 🟢 -| - -| No open issues - -| Pgadmin -| 🔴 -| link:https://github.com/devonfw/IDEasy/issues/861[#861] link:https://github.com/devonfw/IDEasy/issues/1868[#1868] -| #861: install of pgadmin throws an IllegalStateException when the install wizzard...; #1868: Revision of the functionality of global tool commandlets - -| pip -| 🟢 -| - -| No open issues - -| Pycharm -| 🟢 -| - -| No open issues - -| Python -| 🔴 -| link:https://github.com/devonfw/IDEasy/issues/1124[#1124] -| #1124: Ensure latest version of Python is installed - -| Quarkus CLI -| 🟢 -| - -| No open issues - -| Rust -| 🟡 -| link:https://github.com/devonfw/IDEasy/issues/1719[#1719] -| #1719: Integrate rust - -| SonarQube -| 🟢 -| - -| No open issues - -| Squirrelsql -| 🟢 -| - -| No open issues - -| Terraform -| 🔴 -| link:https://github.com/devonfw/IDEasy/issues/1391[#1391] -| #1391: bashrc messed with terraform completions - -| Tomcat -| 🟢 -| - -| No open issues - -| Uv -| 🔴 -| link:https://github.com/devonfw/IDEasy/issues/1518[#1518] -| #1518: uv tools are installed globally - -| VS Code -| 🟡 -| link:https://github.com/devonfw/IDEasy/issues/787[#787] link:https://github.com/devonfw/IDEasy/issues/1167[#1167] link:https://github.com/devonfw/IDEasy/issues/1715[#1715] link:https://github.com/devonfw/IDEasy/issues/1754[#1754] link:https://github.com/devonfw/IDEasy/issues/1849[#1849] -| #787: Provide variable to disable open new workspace; #1167: Automatic project import for VSCode; #1715: Adapt settings to inject java runtime future proove into vscode; #1754: Add version support to vscode settings .plugin files; #1849: Support VSCodium - -|=== - -=== Commandlets & Core Features - -[cols="2,1,4,5", options="header"] -|=== -| Commandlet / Feature | Status | Issues | Notes -| IDEasy (general) -| 🟢 -| - -| No open issues - -| ide install -| 🔴 -| link:https://github.com/devonfw/IDEasy/issues/421[#421] link:https://github.com/devonfw/IDEasy/issues/422[#422] link:https://github.com/devonfw/IDEasy/issues/594[#594] link:https://github.com/devonfw/IDEasy/issues/703[#703] link:https://github.com/devonfw/IDEasy/issues/714[#714] link:https://github.com/devonfw/IDEasy/issues/861[#861] link:https://github.com/devonfw/IDEasy/issues/1056[#1056] link:https://github.com/devonfw/IDEasy/issues/1102[#1102] link:https://github.com/devonfw/IDEasy/issues/1227[#1227] link:https://github.com/devonfw/IDEasy/issues/1232[#1232] link:https://github.com/devonfw/IDEasy/issues/1517[#1517] link:https://github.com/devonfw/IDEasy/issues/1518[#1518] link:https://github.com/devonfw/IDEasy/issues/1558[#1558] link:https://github.com/devonfw/IDEasy/issues/1579[#1579] link:https://github.com/devonfw/IDEasy/issues/1659[#1659] link:https://github.com/devonfw/IDEasy/issues/1694[#1694] link:https://github.com/devonfw/IDEasy/issues/1763[#1763] link:https://github.com/devonfw/IDEasy/issues/1868[#1868] -| #421: Allow installation of IDEasy via winget; #422: Allow installation of IDEasy via Windows Store; #594: Still windows file locking problems; #703: Support AWS CDK; #714: Improve UX for settings repository; #861: install of pgadmin throws an IllegalStateException when the install wizzard...; #1056: Add Conversion of LICENSE.adoc to RTF Format; #1102: IDEasy MSI installer not working (unsigned); #1227: Guide windows user after installation; #1232: MSI Repair broken; #1517: IDEasy setup does not install Windows Terminal; #1518: uv tools are installed globally; #1558: Add install.log path to msi installer window; #1579: IDEasy uninstall after a failed MSI installation does not work; #1659: Global tools run tool while installation is running in background; #1694: Fix behavior when providing a wrong git URL; #1763: Improve installation/testing of SNAPSHOT releases; #1868: Revision of the functionality of global tool commandlets - -| ide uninstall -| 🔴 -| link:https://github.com/devonfw/IDEasy/issues/785[#785] link:https://github.com/devonfw/IDEasy/issues/1456[#1456] link:https://github.com/devonfw/IDEasy/issues/1868[#1868] link:https://github.com/devonfw/IDEasy/issues/1872[#1872] -| #785: Re-introduce workspace reverse options from devonfw-ide; #1456: Uninstall via Windows settings not working; #1868: Revision of the functionality of global tool commandlets; #1872: Implement generic uninstall implementation for global tools under windows - -| ide update -| 🔴 -| link:https://github.com/devonfw/IDEasy/issues/594[#594] link:https://github.com/devonfw/IDEasy/issues/639[#639] link:https://github.com/devonfw/IDEasy/issues/714[#714] link:https://github.com/devonfw/IDEasy/issues/945[#945] link:https://github.com/devonfw/IDEasy/issues/1333[#1333] link:https://github.com/devonfw/IDEasy/issues/1548[#1548] link:https://github.com/devonfw/IDEasy/issues/1694[#1694] -| #594: Still windows file locking problems; #639: Improve step success logic for sub steps; #714: Improve UX for settings repository; #945: Improve ide update with smart dependency handling; #1333: Step 'Install or update software' already ended with false and now ended ag...; #1548: Windows file locking error on update with plugins; #1694: Fix behavior when providing a wrong git URL - -| ide create-project -| 🟡 -| link:https://github.com/devonfw/IDEasy/issues/714[#714] link:https://github.com/devonfw/IDEasy/issues/1695[#1695] -| #714: Improve UX for settings repository; #1695: Clone settings to temporary directory, analyse, and then move - -| ide build -| 🟢 -| - -| No open issues - -| Shell integration -| 🔴 -| link:https://github.com/devonfw/IDEasy/issues/821[#821] link:https://github.com/devonfw/IDEasy/issues/822[#822] link:https://github.com/devonfw/IDEasy/issues/836[#836] link:https://github.com/devonfw/IDEasy/issues/1746[#1746] link:https://github.com/devonfw/IDEasy/issues/1842[#1842] -| #821: Allow User to remove "ide " prefix in ide shell for non-IDEasy command; #822: Handle long CWD paths in shell prompt; #836: Exit is completed in wrong places; #1746: ide shell broken; #1842: Infinite completion of exit subcommand - -| Shell completion -| 🔴 -| link:https://github.com/devonfw/IDEasy/issues/551[#551] link:https://github.com/devonfw/IDEasy/issues/1392[#1392] link:https://github.com/devonfw/IDEasy/issues/1842[#1842] -| #551: Autocompletion and list-versions make OS-agnostic suggestions ; #1392: Smart completion; #1842: Infinite completion of exit subcommand - -| Settings / Properties -| 🔴 -| link:https://github.com/devonfw/IDEasy/issues/449[#449] link:https://github.com/devonfw/IDEasy/issues/714[#714] link:https://github.com/devonfw/IDEasy/issues/735[#735] link:https://github.com/devonfw/IDEasy/issues/785[#785] link:https://github.com/devonfw/IDEasy/issues/987[#987] link:https://github.com/devonfw/IDEasy/issues/989[#989] link:https://github.com/devonfw/IDEasy/issues/992[#992] link:https://github.com/devonfw/IDEasy/issues/1063[#1063] link:https://github.com/devonfw/IDEasy/issues/1214[#1214] link:https://github.com/devonfw/IDEasy/issues/1518[#1518] link:https://github.com/devonfw/IDEasy/issues/1676[#1676] link:https://github.com/devonfw/IDEasy/issues/1694[#1694] link:https://github.com/devonfw/IDEasy/issues/1695[#1695] link:https://github.com/devonfw/IDEasy/issues/1715[#1715] link:https://github.com/devonfw/IDEasy/issues/1880[#1880] -| #449: Consider integration of continue GenAI coding assistant; #714: Improve UX for settings repository; #735: Enhance workspace configuration with generic overlay from settings/workspac...; #785: Re-introduce workspace reverse options from devonfw-ide; #987: conditional templates; #989: allow expressions in template variable definitions; #992: Support multiple attributes for merge:id; #1063: User specific configurations are not working as described; #1214: preserve EOL style in upgrade-settings; #1518: uv tools are installed globally; #1676: Import extra SDKs automatically into IDE; #1694: Fix behavior when providing a wrong git URL; #1695: Clone settings to temporary directory, analyse, and then move; #1715: Adapt settings to inject java runtime future proove into vscode; #1880: Reinstall all plugins for IDE in force mode - -| Security / Credentials -| 🔴 -| link:https://github.com/devonfw/IDEasy/issues/98[#98] link:https://github.com/devonfw/IDEasy/issues/772[#772] link:https://github.com/devonfw/IDEasy/issues/1628[#1628] link:https://github.com/devonfw/IDEasy/issues/1775[#1775] -| #98: Ability to secure downloads from custom repository; #772: CVE-2023-7272 in org.eclipse.parsson 1.1.7; #1628: Support for OS specific CVEs; #1775: Validate and Fix CPE Vendor/Product Identifiers for All Tools - -| Repository management -| 🟡 -| link:https://github.com/devonfw/IDEasy/issues/1164[#1164] link:https://github.com/devonfw/IDEasy/issues/1165[#1165] link:https://github.com/devonfw/IDEasy/issues/1167[#1167] -| #1164: Automatic project import; #1165: Automatic project import for Eclipse; #1167: Automatic project import for VSCode - -| Environment variables -| 🟢 -| - -| No open issues - -| Plugin management -| 🟢 -| - -| No open issues - -| Migration (devonfw-ide → IDEasy) -| 🟢 -| - -| No open issues - -| ide status -| 🔴 -| link:https://github.com/devonfw/IDEasy/issues/1209[#1209] link:https://github.com/devonfw/IDEasy/issues/1255[#1255] -| #1209: migration version message is confusing; #1255: ide status does not recognize snapshot version correctly - -| Version management -| 🟡 -| link:https://github.com/devonfw/IDEasy/issues/1178[#1178] link:https://github.com/devonfw/IDEasy/issues/1868[#1868] -| #1178: Revisit VersionPhase detection; #1868: Revision of the functionality of global tool commandlets - -|=== - -== Linux - -Open issues labelled `linux` *or without any OS label*. - -NOTE: Issues without an OS label are cross-platform and therefore appear in every OS section. - -=== Tools - -[cols="2,1,4,5", options="header"] -|=== -| Tool | Status | Issues | Notes -| Androidstudio -| 🟢 -| - -| No open issues - -| AWS CLI -| 🟡 -| link:https://github.com/devonfw/IDEasy/issues/703[#703] -| #703: Support AWS CDK - -| Azure CLI -| 🔴 -| link:https://github.com/devonfw/IDEasy/issues/802[#802] link:https://github.com/devonfw/IDEasy/issues/855[#855] -| #802: az not working on Mac; #855: ide az config not working - -| GitHub Copilot -| 🟡 -| link:https://github.com/devonfw/IDEasy/issues/1717[#1717] -| #1717: Add github-copliot-cli as software package - -| Corepack -| 🟢 -| - -| No open issues - -| Docker -| 🔴 -| link:https://github.com/devonfw/IDEasy/issues/44[#44] link:https://github.com/devonfw/IDEasy/issues/950[#950] link:https://github.com/devonfw/IDEasy/issues/1181[#1181] link:https://github.com/devonfw/IDEasy/issues/1659[#1659] link:https://github.com/devonfw/IDEasy/issues/1868[#1868] -| #44: DockerUrlUpdater not finding/adding specific versions; #950: avoid --no-gpg-checks for docker installation on SUSE Linux; #1181: Improve url updater for docker desktop to pull all necessary versions; #1659: Global tools run tool while installation is running in background; #1868: Revision of the functionality of global tool commandlets - -| dotnet -| 🟢 -| - -| No open issues - -| Eclipse -| 🟡 -| link:https://github.com/devonfw/IDEasy/issues/1165[#1165] link:https://github.com/devonfw/IDEasy/issues/1525[#1525] -| #1165: Automatic project import for Eclipse; #1525: lombok not correctly installed in eclipse - -| gcloud CLI -| 🟡 -| link:https://github.com/devonfw/IDEasy/issues/19[#19] -| #19: Implement ToolCommandlet for Google Cloud CLI - -| GCViewer -| 🟡 -| link:https://github.com/devonfw/IDEasy/issues/825[#825] -| #825: Consider adding GC Log Analyzer - -| GitHub CLI -| 🟢 -| - -| No open issues - -| Go -| 🟢 -| - -| No open issues - -| Graalvm -| 🟢 -| - -| No open issues - -| Gradle -| 🟢 -| - -| No open issues - -| Helm -| 🟢 -| - -| No open issues - -| IntelliJ IDEA -| 🔴 -| link:https://github.com/devonfw/IDEasy/issues/120[#120] link:https://github.com/devonfw/IDEasy/issues/717[#717] link:https://github.com/devonfw/IDEasy/issues/992[#992] link:https://github.com/devonfw/IDEasy/issues/1501[#1501] -| #120: intellij does not use our settings when we create a new project within inte...; #717: IDEasy does not start Intellij if license was not accepted; #992: Support multiple attributes for merge:id; #1501: Starting intellij leads to error popup - -| Jasypt -| 🟢 -| - -| No open issues - -| Java (JDK) -| 🟢 -| - -| No open issues - -| Jenkins -| 🟢 -| - -| No open issues - -| JDK Mission Control -| 🟢 -| - -| No open issues - -| Kotlinc -| 🔴 -| link:https://github.com/devonfw/IDEasy/issues/857[#857] -| #857: kotlinc bash does not get keyboard inputs - -| Lazydocker -| 🟢 -| - -| No open issues - -| Maven -| 🟢 -| - -| No open issues - -| Ng -| 🟢 -| - -| No open issues - -| Node.js / npm -| 🔴 -| link:https://github.com/devonfw/IDEasy/issues/859[#859] -| #859: node shell not starting - -| Npm -| 🔴 -| link:https://github.com/devonfw/IDEasy/issues/1886[#1886] -| #1886: NpmBasedCommandlet shows wrong tool version after install - -| OpenShift CLI -| 🟢 -| - -| No open issues - -| Pgadmin -| 🔴 -| link:https://github.com/devonfw/IDEasy/issues/861[#861] link:https://github.com/devonfw/IDEasy/issues/1868[#1868] -| #861: install of pgadmin throws an IllegalStateException when the install wizzard...; #1868: Revision of the functionality of global tool commandlets - -| pip -| 🟢 -| - -| No open issues - -| Pycharm -| 🟢 -| - -| No open issues - -| Python -| 🔴 -| link:https://github.com/devonfw/IDEasy/issues/1046[#1046] link:https://github.com/devonfw/IDEasy/issues/1124[#1124] -| #1046: Add Support for Python on Linux; #1124: Ensure latest version of Python is installed - -| Quarkus CLI -| 🟢 -| - -| No open issues - -| Rust -| 🟡 -| link:https://github.com/devonfw/IDEasy/issues/1719[#1719] -| #1719: Integrate rust - -| SonarQube -| 🟢 -| - -| No open issues - -| Squirrelsql -| 🟢 -| - -| No open issues - -| Terraform -| 🔴 -| link:https://github.com/devonfw/IDEasy/issues/1391[#1391] -| #1391: bashrc messed with terraform completions - -| Tomcat -| 🟢 -| - -| No open issues - -| Uv -| 🔴 -| link:https://github.com/devonfw/IDEasy/issues/1518[#1518] -| #1518: uv tools are installed globally - -| VS Code -| 🔴 -| link:https://github.com/devonfw/IDEasy/issues/787[#787] link:https://github.com/devonfw/IDEasy/issues/1167[#1167] link:https://github.com/devonfw/IDEasy/issues/1352[#1352] link:https://github.com/devonfw/IDEasy/issues/1715[#1715] link:https://github.com/devonfw/IDEasy/issues/1754[#1754] link:https://github.com/devonfw/IDEasy/issues/1844[#1844] link:https://github.com/devonfw/IDEasy/issues/1849[#1849] -| #787: Provide variable to disable open new workspace; #1167: Automatic project import for VSCode; #1352: VSCode WSL warning prompt blocking VSCode plugin installation; #1715: Adapt settings to inject java runtime future proove into vscode; #1754: Add version support to vscode settings .plugin files; #1844: `ide install vscode` or `ide vscode` freezes at "installing plugins" step o...; #1849: Support VSCodium - -|=== - -=== Commandlets & Core Features - -[cols="2,1,4,5", options="header"] -|=== -| Commandlet / Feature | Status | Issues | Notes -| IDEasy (general) -| 🟢 -| - -| No open issues - -| ide install -| 🔴 -| link:https://github.com/devonfw/IDEasy/issues/703[#703] link:https://github.com/devonfw/IDEasy/issues/714[#714] link:https://github.com/devonfw/IDEasy/issues/861[#861] link:https://github.com/devonfw/IDEasy/issues/1517[#1517] link:https://github.com/devonfw/IDEasy/issues/1518[#1518] link:https://github.com/devonfw/IDEasy/issues/1659[#1659] link:https://github.com/devonfw/IDEasy/issues/1694[#1694] link:https://github.com/devonfw/IDEasy/issues/1763[#1763] link:https://github.com/devonfw/IDEasy/issues/1868[#1868] -| #703: Support AWS CDK; #714: Improve UX for settings repository; #861: install of pgadmin throws an IllegalStateException when the install wizzard...; #1517: IDEasy setup does not install Windows Terminal; #1518: uv tools are installed globally; #1659: Global tools run tool while installation is running in background; #1694: Fix behavior when providing a wrong git URL; #1763: Improve installation/testing of SNAPSHOT releases; #1868: Revision of the functionality of global tool commandlets - -| ide uninstall -| 🟡 -| link:https://github.com/devonfw/IDEasy/issues/785[#785] link:https://github.com/devonfw/IDEasy/issues/1868[#1868] -| #785: Re-introduce workspace reverse options from devonfw-ide; #1868: Revision of the functionality of global tool commandlets - -| ide update -| 🔴 -| link:https://github.com/devonfw/IDEasy/issues/639[#639] link:https://github.com/devonfw/IDEasy/issues/714[#714] link:https://github.com/devonfw/IDEasy/issues/945[#945] link:https://github.com/devonfw/IDEasy/issues/1333[#1333] link:https://github.com/devonfw/IDEasy/issues/1694[#1694] -| #639: Improve step success logic for sub steps; #714: Improve UX for settings repository; #945: Improve ide update with smart dependency handling; #1333: Step 'Install or update software' already ended with false and now ended ag...; #1694: Fix behavior when providing a wrong git URL - -| ide create-project -| 🟡 -| link:https://github.com/devonfw/IDEasy/issues/714[#714] link:https://github.com/devonfw/IDEasy/issues/1695[#1695] -| #714: Improve UX for settings repository; #1695: Clone settings to temporary directory, analyse, and then move - -| ide build -| 🟢 -| - -| No open issues - -| Shell integration -| 🔴 -| link:https://github.com/devonfw/IDEasy/issues/821[#821] link:https://github.com/devonfw/IDEasy/issues/822[#822] link:https://github.com/devonfw/IDEasy/issues/836[#836] link:https://github.com/devonfw/IDEasy/issues/1746[#1746] link:https://github.com/devonfw/IDEasy/issues/1842[#1842] -| #821: Allow User to remove "ide " prefix in ide shell for non-IDEasy command; #822: Handle long CWD paths in shell prompt; #836: Exit is completed in wrong places; #1746: ide shell broken; #1842: Infinite completion of exit subcommand - -| Shell completion -| 🔴 -| link:https://github.com/devonfw/IDEasy/issues/551[#551] link:https://github.com/devonfw/IDEasy/issues/1392[#1392] link:https://github.com/devonfw/IDEasy/issues/1842[#1842] -| #551: Autocompletion and list-versions make OS-agnostic suggestions ; #1392: Smart completion; #1842: Infinite completion of exit subcommand - -| Settings / Properties -| 🔴 -| link:https://github.com/devonfw/IDEasy/issues/449[#449] link:https://github.com/devonfw/IDEasy/issues/714[#714] link:https://github.com/devonfw/IDEasy/issues/735[#735] link:https://github.com/devonfw/IDEasy/issues/785[#785] link:https://github.com/devonfw/IDEasy/issues/987[#987] link:https://github.com/devonfw/IDEasy/issues/989[#989] link:https://github.com/devonfw/IDEasy/issues/992[#992] link:https://github.com/devonfw/IDEasy/issues/1063[#1063] link:https://github.com/devonfw/IDEasy/issues/1214[#1214] link:https://github.com/devonfw/IDEasy/issues/1518[#1518] link:https://github.com/devonfw/IDEasy/issues/1676[#1676] link:https://github.com/devonfw/IDEasy/issues/1694[#1694] link:https://github.com/devonfw/IDEasy/issues/1695[#1695] link:https://github.com/devonfw/IDEasy/issues/1715[#1715] link:https://github.com/devonfw/IDEasy/issues/1880[#1880] -| #449: Consider integration of continue GenAI coding assistant; #714: Improve UX for settings repository; #735: Enhance workspace configuration with generic overlay from settings/workspac...; #785: Re-introduce workspace reverse options from devonfw-ide; #987: conditional templates; #989: allow expressions in template variable definitions; #992: Support multiple attributes for merge:id; #1063: User specific configurations are not working as described; #1214: preserve EOL style in upgrade-settings; #1518: uv tools are installed globally; #1676: Import extra SDKs automatically into IDE; #1694: Fix behavior when providing a wrong git URL; #1695: Clone settings to temporary directory, analyse, and then move; #1715: Adapt settings to inject java runtime future proove into vscode; #1880: Reinstall all plugins for IDE in force mode - -| Security / Credentials -| 🔴 -| link:https://github.com/devonfw/IDEasy/issues/98[#98] link:https://github.com/devonfw/IDEasy/issues/772[#772] link:https://github.com/devonfw/IDEasy/issues/1628[#1628] link:https://github.com/devonfw/IDEasy/issues/1775[#1775] -| #98: Ability to secure downloads from custom repository; #772: CVE-2023-7272 in org.eclipse.parsson 1.1.7; #1628: Support for OS specific CVEs; #1775: Validate and Fix CPE Vendor/Product Identifiers for All Tools - -| Repository management -| 🟡 -| link:https://github.com/devonfw/IDEasy/issues/1164[#1164] link:https://github.com/devonfw/IDEasy/issues/1165[#1165] link:https://github.com/devonfw/IDEasy/issues/1167[#1167] -| #1164: Automatic project import; #1165: Automatic project import for Eclipse; #1167: Automatic project import for VSCode - -| Environment variables -| 🟢 -| - -| No open issues - -| Plugin management -| 🟢 -| - -| No open issues - -| Migration (devonfw-ide → IDEasy) -| 🟢 -| - -| No open issues - -| ide status -| 🔴 -| link:https://github.com/devonfw/IDEasy/issues/1209[#1209] link:https://github.com/devonfw/IDEasy/issues/1255[#1255] -| #1209: migration version message is confusing; #1255: ide status does not recognize snapshot version correctly - -| Version management -| 🟡 -| link:https://github.com/devonfw/IDEasy/issues/1178[#1178] link:https://github.com/devonfw/IDEasy/issues/1868[#1868] -| #1178: Revisit VersionPhase detection; #1868: Revision of the functionality of global tool commandlets - -|=== - -== macOS - -Open issues labelled `macOS` *or without any OS label*. - -NOTE: Issues without an OS label are cross-platform and therefore appear in every OS section. - -=== Tools - -[cols="2,1,4,5", options="header"] -|=== -| Tool | Status | Issues | Notes -| Androidstudio -| 🟢 -| - -| No open issues - -| AWS CLI -| 🔴 -| link:https://github.com/devonfw/IDEasy/issues/703[#703] link:https://github.com/devonfw/IDEasy/issues/796[#796] -| #703: Support AWS CDK; #796: cannot install aws on Mac - -| Azure CLI -| 🔴 -| link:https://github.com/devonfw/IDEasy/issues/802[#802] link:https://github.com/devonfw/IDEasy/issues/855[#855] -| #802: az not working on Mac; #855: ide az config not working - -| GitHub Copilot -| 🟡 -| link:https://github.com/devonfw/IDEasy/issues/1717[#1717] -| #1717: Add github-copliot-cli as software package - -| Corepack -| 🟢 -| - -| No open issues - -| Docker -| 🔴 -| link:https://github.com/devonfw/IDEasy/issues/44[#44] link:https://github.com/devonfw/IDEasy/issues/1181[#1181] link:https://github.com/devonfw/IDEasy/issues/1659[#1659] link:https://github.com/devonfw/IDEasy/issues/1868[#1868] -| #44: DockerUrlUpdater not finding/adding specific versions; #1181: Improve url updater for docker desktop to pull all necessary versions; #1659: Global tools run tool while installation is running in background; #1868: Revision of the functionality of global tool commandlets - -| dotnet -| 🟢 -| - -| No open issues - -| Eclipse -| 🔴 -| link:https://github.com/devonfw/IDEasy/issues/868[#868] link:https://github.com/devonfw/IDEasy/issues/1165[#1165] link:https://github.com/devonfw/IDEasy/issues/1187[#1187] link:https://github.com/devonfw/IDEasy/issues/1525[#1525] -| #868: Eclipse does not work on Mac x64; #1165: Automatic project import for Eclipse; #1187: Eclipse plugin installation on mac is not working; #1525: lombok not correctly installed in eclipse - -| gcloud CLI -| 🟡 -| link:https://github.com/devonfw/IDEasy/issues/19[#19] -| #19: Implement ToolCommandlet for Google Cloud CLI - -| GCViewer -| 🔴 -| link:https://github.com/devonfw/IDEasy/issues/825[#825] link:https://github.com/devonfw/IDEasy/issues/869[#869] -| #825: Consider adding GC Log Analyzer; #869: gcviewer logs errors on Mac X64 - -| GitHub CLI -| 🟢 -| - -| No open issues - -| Go -| 🟢 -| - -| No open issues - -| Graalvm -| 🟢 -| - -| No open issues - -| Gradle -| 🟢 -| - -| No open issues - -| Helm -| 🟢 -| - -| No open issues - -| IntelliJ IDEA -| 🔴 -| link:https://github.com/devonfw/IDEasy/issues/120[#120] link:https://github.com/devonfw/IDEasy/issues/717[#717] link:https://github.com/devonfw/IDEasy/issues/992[#992] link:https://github.com/devonfw/IDEasy/issues/1501[#1501] link:https://github.com/devonfw/IDEasy/issues/1512[#1512] -| #120: intellij does not use our settings when we create a new project within inte...; #717: IDEasy does not start Intellij if license was not accepted; #992: Support multiple attributes for merge:id; #1501: Starting intellij leads to error popup; #1512: Cannot run Intellij on Mac due to file permission error - -| Jasypt -| 🟢 -| - -| No open issues - -| Java (JDK) -| 🟢 -| - -| No open issues - -| Jenkins -| 🟢 -| - -| No open issues - -| JDK Mission Control -| 🟢 -| - -| No open issues - -| Kotlinc -| 🔴 -| link:https://github.com/devonfw/IDEasy/issues/857[#857] -| #857: kotlinc bash does not get keyboard inputs - -| Lazydocker -| 🟢 -| - -| No open issues - -| Maven -| 🟢 -| - -| No open issues - -| Ng -| 🟢 -| - -| No open issues - -| Node.js / npm -| 🔴 -| link:https://github.com/devonfw/IDEasy/issues/859[#859] -| #859: node shell not starting - -| Npm -| 🔴 -| link:https://github.com/devonfw/IDEasy/issues/801[#801] link:https://github.com/devonfw/IDEasy/issues/1886[#1886] -| #801: npm not working on Mac; #1886: NpmBasedCommandlet shows wrong tool version after install - -| OpenShift CLI -| 🟢 -| - -| No open issues - -| Pgadmin -| 🔴 -| link:https://github.com/devonfw/IDEasy/issues/798[#798] link:https://github.com/devonfw/IDEasy/issues/861[#861] link:https://github.com/devonfw/IDEasy/issues/878[#878] link:https://github.com/devonfw/IDEasy/issues/1868[#1868] -| #798: pgadmin not working on Mac; #861: install of pgadmin throws an IllegalStateException when the install wizzard...; #878: pgadmin does not work on Mac x64; #1868: Revision of the functionality of global tool commandlets - -| pip -| 🟢 -| - -| No open issues - -| Pycharm -| 🟢 -| - -| No open issues - -| Python -| 🔴 -| link:https://github.com/devonfw/IDEasy/issues/1124[#1124] -| #1124: Ensure latest version of Python is installed - -| Quarkus CLI -| 🟢 -| - -| No open issues - -| Rust -| 🟡 -| link:https://github.com/devonfw/IDEasy/issues/1719[#1719] -| #1719: Integrate rust - -| SonarQube -| 🔴 -| link:https://github.com/devonfw/IDEasy/issues/800[#800] -| #800: sonar not working on Mac - -| Squirrelsql -| 🟢 -| - -| No open issues - -| Terraform -| 🔴 -| link:https://github.com/devonfw/IDEasy/issues/1391[#1391] -| #1391: bashrc messed with terraform completions - -| Tomcat -| 🟢 -| - -| No open issues - -| Uv -| 🔴 -| link:https://github.com/devonfw/IDEasy/issues/1518[#1518] -| #1518: uv tools are installed globally - -| VS Code -| 🔴 -| link:https://github.com/devonfw/IDEasy/issues/787[#787] link:https://github.com/devonfw/IDEasy/issues/862[#862] link:https://github.com/devonfw/IDEasy/issues/1167[#1167] link:https://github.com/devonfw/IDEasy/issues/1715[#1715] link:https://github.com/devonfw/IDEasy/issues/1754[#1754] link:https://github.com/devonfw/IDEasy/issues/1849[#1849] -| #787: Provide variable to disable open new workspace; #862: vscode does not work on Mac; #1167: Automatic project import for VSCode; #1715: Adapt settings to inject java runtime future proove into vscode; #1754: Add version support to vscode settings .plugin files; #1849: Support VSCodium - -|=== - -=== Commandlets & Core Features - -[cols="2,1,4,5", options="header"] -|=== -| Commandlet / Feature | Status | Issues | Notes -| IDEasy (general) -| 🟢 -| - -| No open issues - -| ide install -| 🔴 -| link:https://github.com/devonfw/IDEasy/issues/377[#377] link:https://github.com/devonfw/IDEasy/issues/423[#423] link:https://github.com/devonfw/IDEasy/issues/703[#703] link:https://github.com/devonfw/IDEasy/issues/714[#714] link:https://github.com/devonfw/IDEasy/issues/861[#861] link:https://github.com/devonfw/IDEasy/issues/1517[#1517] link:https://github.com/devonfw/IDEasy/issues/1518[#1518] link:https://github.com/devonfw/IDEasy/issues/1659[#1659] link:https://github.com/devonfw/IDEasy/issues/1694[#1694] link:https://github.com/devonfw/IDEasy/issues/1763[#1763] link:https://github.com/devonfw/IDEasy/issues/1868[#1868] -| #377: Support Homebrew for installation on macOS; #423: Create installer for MacOS; #703: Support AWS CDK; #714: Improve UX for settings repository; #861: install of pgadmin throws an IllegalStateException when the install wizzard...; #1517: IDEasy setup does not install Windows Terminal; #1518: uv tools are installed globally; #1659: Global tools run tool while installation is running in background; #1694: Fix behavior when providing a wrong git URL; #1763: Improve installation/testing of SNAPSHOT releases; #1868: Revision of the functionality of global tool commandlets - -| ide uninstall -| 🟡 -| link:https://github.com/devonfw/IDEasy/issues/785[#785] link:https://github.com/devonfw/IDEasy/issues/1868[#1868] -| #785: Re-introduce workspace reverse options from devonfw-ide; #1868: Revision of the functionality of global tool commandlets - -| ide update -| 🔴 -| link:https://github.com/devonfw/IDEasy/issues/639[#639] link:https://github.com/devonfw/IDEasy/issues/714[#714] link:https://github.com/devonfw/IDEasy/issues/945[#945] link:https://github.com/devonfw/IDEasy/issues/1333[#1333] link:https://github.com/devonfw/IDEasy/issues/1694[#1694] -| #639: Improve step success logic for sub steps; #714: Improve UX for settings repository; #945: Improve ide update with smart dependency handling; #1333: Step 'Install or update software' already ended with false and now ended ag...; #1694: Fix behavior when providing a wrong git URL - -| ide create-project -| 🟡 -| link:https://github.com/devonfw/IDEasy/issues/714[#714] link:https://github.com/devonfw/IDEasy/issues/1695[#1695] -| #714: Improve UX for settings repository; #1695: Clone settings to temporary directory, analyse, and then move - -| ide build -| 🟢 -| - -| No open issues - -| Shell integration -| 🔴 -| link:https://github.com/devonfw/IDEasy/issues/821[#821] link:https://github.com/devonfw/IDEasy/issues/822[#822] link:https://github.com/devonfw/IDEasy/issues/836[#836] link:https://github.com/devonfw/IDEasy/issues/1746[#1746] link:https://github.com/devonfw/IDEasy/issues/1842[#1842] -| #821: Allow User to remove "ide " prefix in ide shell for non-IDEasy command; #822: Handle long CWD paths in shell prompt; #836: Exit is completed in wrong places; #1746: ide shell broken; #1842: Infinite completion of exit subcommand - -| Shell completion -| 🔴 -| link:https://github.com/devonfw/IDEasy/issues/551[#551] link:https://github.com/devonfw/IDEasy/issues/1392[#1392] link:https://github.com/devonfw/IDEasy/issues/1842[#1842] -| #551: Autocompletion and list-versions make OS-agnostic suggestions ; #1392: Smart completion; #1842: Infinite completion of exit subcommand - -| Settings / Properties -| 🔴 -| link:https://github.com/devonfw/IDEasy/issues/449[#449] link:https://github.com/devonfw/IDEasy/issues/714[#714] link:https://github.com/devonfw/IDEasy/issues/735[#735] link:https://github.com/devonfw/IDEasy/issues/785[#785] link:https://github.com/devonfw/IDEasy/issues/987[#987] link:https://github.com/devonfw/IDEasy/issues/989[#989] link:https://github.com/devonfw/IDEasy/issues/992[#992] link:https://github.com/devonfw/IDEasy/issues/1063[#1063] link:https://github.com/devonfw/IDEasy/issues/1214[#1214] link:https://github.com/devonfw/IDEasy/issues/1518[#1518] link:https://github.com/devonfw/IDEasy/issues/1676[#1676] link:https://github.com/devonfw/IDEasy/issues/1694[#1694] link:https://github.com/devonfw/IDEasy/issues/1695[#1695] link:https://github.com/devonfw/IDEasy/issues/1715[#1715] link:https://github.com/devonfw/IDEasy/issues/1880[#1880] -| #449: Consider integration of continue GenAI coding assistant; #714: Improve UX for settings repository; #735: Enhance workspace configuration with generic overlay from settings/workspac...; #785: Re-introduce workspace reverse options from devonfw-ide; #987: conditional templates; #989: allow expressions in template variable definitions; #992: Support multiple attributes for merge:id; #1063: User specific configurations are not working as described; #1214: preserve EOL style in upgrade-settings; #1518: uv tools are installed globally; #1676: Import extra SDKs automatically into IDE; #1694: Fix behavior when providing a wrong git URL; #1695: Clone settings to temporary directory, analyse, and then move; #1715: Adapt settings to inject java runtime future proove into vscode; #1880: Reinstall all plugins for IDE in force mode - -| Security / Credentials -| 🔴 -| link:https://github.com/devonfw/IDEasy/issues/98[#98] link:https://github.com/devonfw/IDEasy/issues/772[#772] link:https://github.com/devonfw/IDEasy/issues/1628[#1628] link:https://github.com/devonfw/IDEasy/issues/1775[#1775] -| #98: Ability to secure downloads from custom repository; #772: CVE-2023-7272 in org.eclipse.parsson 1.1.7; #1628: Support for OS specific CVEs; #1775: Validate and Fix CPE Vendor/Product Identifiers for All Tools - -| Repository management -| 🟡 -| link:https://github.com/devonfw/IDEasy/issues/1164[#1164] link:https://github.com/devonfw/IDEasy/issues/1165[#1165] link:https://github.com/devonfw/IDEasy/issues/1167[#1167] -| #1164: Automatic project import; #1165: Automatic project import for Eclipse; #1167: Automatic project import for VSCode - -| Environment variables -| 🟢 -| - -| No open issues - -| Plugin management -| 🟢 -| - -| No open issues - -| Migration (devonfw-ide → IDEasy) -| 🟢 -| - -| No open issues - -| ide status -| 🔴 -| link:https://github.com/devonfw/IDEasy/issues/1209[#1209] link:https://github.com/devonfw/IDEasy/issues/1255[#1255] -| #1209: migration version message is confusing; #1255: ide status does not recognize snapshot version correctly - -| Version management -| 🟡 -| link:https://github.com/devonfw/IDEasy/issues/1178[#1178] link:https://github.com/devonfw/IDEasy/issues/1868[#1868] -| #1178: Revisit VersionPhase detection; #1868: Revision of the functionality of global tool commandlets +| 🟡 link:https://github.com/devonfw/IDEasy/issues/1178[#1178] Revisit VersionPhase detection + +🟡 link:https://github.com/devonfw/IDEasy/issues/1868[#1868] Revision of the functionality of global tool commandlets |=== == Unassigned Issues -The following 97 issue(s) could not be matched to any known tool or commandlet. Add the appropriate label on GitHub, or extend `TOOLS`, `COMMANDLETS`, or their `"labels"` lists in this script. +87 issue(s) matched no known tool or commandlet. Add the appropriate label on GitHub or extend `TOOLS`/`COMMANDLETS` in this script. [cols="1,4,3", options="header"] |=== -| Issue | Title | Labels +| # | Title | Labels | link:https://github.com/devonfw/IDEasy/issues/45[#45] | Add compression for native images | enhancement -| link:https://github.com/devonfw/IDEasy/issues/72[#72] -| Add further editions of java -| enhancement - | link:https://github.com/devonfw/IDEasy/issues/75[#75] | Consider integration of oracle XE | enhancement | link:https://github.com/devonfw/IDEasy/issues/162[#162] | Difficulty to find the right spot in the documentation -| enhancement - -| link:https://github.com/devonfw/IDEasy/issues/169[#169] -| Check if we want to utilize TailTipWidgets for the autocompleter -| enhancement - -| link:https://github.com/devonfw/IDEasy/issues/190[#190] -| Improve #103: security warning for CVEs in file tool/edition/security -| enhancement +| documentation, enhancement | link:https://github.com/devonfw/IDEasy/issues/218[#218] -| Add possibility to start a command in a new window with the process builder +| Add possibility to start a command in a new window with the process bu… | enhancement | link:https://github.com/devonfw/IDEasy/issues/370[#370] | Create local github actions for tests -| enhancement +| enhancement, test, integration-tests, workflow | link:https://github.com/devonfw/IDEasy/issues/378[#378] -| Missing comprehensive "Getting started guide" causing fail in getting start... +| Missing comprehensive "Getting started guide" causing fail in getting … | documentation | link:https://github.com/devonfw/IDEasy/issues/379[#379] | Rename default branch of repo ide-urls from master to main | enhancement -| link:https://github.com/devonfw/IDEasy/issues/399[#399] -| Handle uninstall of global tool commandlets -| enhancement - | link:https://github.com/devonfw/IDEasy/issues/412[#412] | consider integration of lama | enhancement, AI @@ -1160,14 +372,14 @@ The following 97 issue(s) could not be matched to any known tool or commandlet. | link:https://github.com/devonfw/IDEasy/issues/599[#599] | Add release for windows-arm architecture -| enhancement +| enhancement, windows, ARM | link:https://github.com/devonfw/IDEasy/issues/607[#607] | Test for environment variables of process contexts | enhancement, test, process | link:https://github.com/devonfw/IDEasy/issues/611[#611] -| Git pull on settings with local branch and without remote throws exception +| Git pull on settings with local branch and without remote throws excep… | — | link:https://github.com/devonfw/IDEasy/issues/629[#629] @@ -1178,18 +390,6 @@ The following 97 issue(s) could not be matched to any known tool or commandlet. | UpdateUrls workflow timeout not working | urls, SCM -| link:https://github.com/devonfw/IDEasy/issues/694[#694] -| Add linux support to dotnet tool -| enhancement - -| link:https://github.com/devonfw/IDEasy/issues/700[#700] -| Add Npm run test -| enhancement - -| link:https://github.com/devonfw/IDEasy/issues/701[#701] -| Fix Dotnet tests on our CI -| enhancement, internal - | link:https://github.com/devonfw/IDEasy/issues/726[#726] | Replace hardcoded dependencies with dependencies.json in ide-urls | enhancement, Epic @@ -1203,7 +403,7 @@ The following 97 issue(s) could not be matched to any known tool or commandlet. | enhancement, test, custom | link:https://github.com/devonfw/IDEasy/issues/768[#768] -| Improve IntelliJ configuration (annotation processing, auto-import, maven a... +| Improve IntelliJ configuration (annotation processing, auto-import, ma… | enhancement | link:https://github.com/devonfw/IDEasy/issues/771[#771] @@ -1234,18 +434,6 @@ The following 97 issue(s) could not be matched to any known tool or commandlet. | Mac x64 android-studio 2024 releases missing | enhancement, android-studio, macOS -| link:https://github.com/devonfw/IDEasy/issues/864[#864] -| AWS is not working on Mac x64 -| macOS - -| link:https://github.com/devonfw/IDEasy/issues/865[#865] -| Az is not working on Mac x64 -| macOS - -| link:https://github.com/devonfw/IDEasy/issues/867[#867] -| Docker (Rancher Desktop) not working on Linux -| invalid, rancher, linux - | link:https://github.com/devonfw/IDEasy/issues/871[#871] | Add progressbar to *.dmg extract process | enhancement, macOS, progressbar @@ -1283,7 +471,7 @@ The following 97 issue(s) could not be matched to any known tool or commandlet. | CLI, core | link:https://github.com/devonfw/IDEasy/issues/1054[#1054] -| Incorrect interpretation of trailling and leading spaces in version range p... +| Incorrect interpretation of trailling and leading spaces in version ra… | core, dependencies | link:https://github.com/devonfw/IDEasy/issues/1059[#1059] @@ -1291,7 +479,7 @@ The following 97 issue(s) could not be matched to any known tool or commandlet. | enhancement, dependencies | link:https://github.com/devonfw/IDEasy/issues/1134[#1134] -| IDEasy autocompletion gets stuck if license agreement file was not found +| IDEasy autocompletion gets stuck if license agreement file was not fou… | blocker | link:https://github.com/devonfw/IDEasy/issues/1135[#1135] @@ -1311,7 +499,7 @@ The following 97 issue(s) could not be matched to any known tool or commandlet. | macOS, icd, ready-to-implement | link:https://github.com/devonfw/IDEasy/issues/1206[#1206] -| java.util.zip.ZipException when opening Android Studio archives from versio... +| java.util.zip.ZipException when opening Android Studio archives from v… | enhancement | link:https://github.com/devonfw/IDEasy/issues/1215[#1215] @@ -1359,7 +547,7 @@ The following 97 issue(s) could not be matched to any known tool or commandlet. | enhancement, waiting for feedback | link:https://github.com/devonfw/IDEasy/issues/1457[#1457] -| Improve CLI error messages on invalid args or commandlets not available in ... +| Improve CLI error messages on invalid args or commandlets not availabl… | enhancement, CLI, ready-to-implement | link:https://github.com/devonfw/IDEasy/issues/1493[#1493] @@ -1391,7 +579,7 @@ The following 97 issue(s) could not be matched to any known tool or commandlet. | enhancement, logging, ready-to-implement | link:https://github.com/devonfw/IDEasy/issues/1689[#1689] -| Fix user commnication when switching the Java version from the default to t... +| Fix user commnication when switching the Java version from the default… | enhancement, logging | link:https://github.com/devonfw/IDEasy/issues/1701[#1701] @@ -1435,11 +623,11 @@ The following 97 issue(s) could not be matched to any known tool or commandlet. | enhancement, GUI | link:https://github.com/devonfw/IDEasy/issues/1808[#1808] -| icd is not navigating into single available workspace on icd -p project +| icd is not navigating into single available workspace on icd -p projec… | invalid, icd | link:https://github.com/devonfw/IDEasy/issues/1814[#1814] -| IDEasy still reports updates for settings are available after any number of... +| IDEasy still reports updates for settings are available after any numb… | upgrade-settings | link:https://github.com/devonfw/IDEasy/issues/1821[#1821] @@ -1456,22 +644,22 @@ The following 97 issue(s) could not be matched to any known tool or commandlet. | link:https://github.com/devonfw/IDEasy/issues/1866[#1866] | Create ClaudeUrlUpdater -| enhancement +| enhancement, claude | link:https://github.com/devonfw/IDEasy/issues/1867[#1867] | Create Claude commandlet -| enhancement +| enhancement, commandlet, claude | link:https://github.com/devonfw/IDEasy/issues/1869[#1869] | Improve WindowsHelper to search in windows registry | enhancement, windows, internal, ready-to-implement | link:https://github.com/devonfw/IDEasy/issues/1870[#1870] -| Implement generic get-version implementation for global tools under windows +| Implement generic get-version implementation for global tools under wi… | enhancement, windows | link:https://github.com/devonfw/IDEasy/issues/1873[#1873] -| Implement generic get-edition implementation for global tools under windows +| Implement generic get-edition implementation for global tools under wi… | enhancement, windows | link:https://github.com/devonfw/IDEasy/issues/1882[#1882] @@ -1483,7 +671,7 @@ The following 97 issue(s) could not be matched to any known tool or commandlet. | enhancement, unpack, ready-to-implement | link:https://github.com/devonfw/IDEasy/issues/1892[#1892] -| pom.xml required for launching gui not included in release/native builds +| pom.xml required for launching gui not included in release/native buil… | GUI, internal | link:https://github.com/devonfw/IDEasy/issues/1893[#1893] @@ -1494,18 +682,10 @@ The following 97 issue(s) could not be matched to any known tool or commandlet. == How to Contribute -=== Adding a new tool -Adding a new tool is automatic: as soon as a new folder is added under -`url-updater/src/main/java/com/devonfw/tools/ide/url/tool/` and issues are -labelled with that folder name, the tool appears in the next generated document. -To override the display name, add an entry to `TOOLS` in this script. - -=== Adding a new commandlet -Add an entry to the `COMMANDLETS` dict in this script. The key is the GitHub -label name; `"display"` is the human-readable name; `"labels"` lists any -alternative label names that should also map to this commandlet. - -=== Mapping a non-standard label -If a GitHub label does not match any key in `TOOLS` or `COMMANDLETS`, add the -label name to the `"labels"` list of the appropriate registry entry. -Any remaining unmatched issues will appear in the *Unassigned Issues* section. +*New tool:* Automatic once a folder exists under `url-updater/.../url/tool/` and issues use that name as label. +Override the display name in `TOOLS["display"]`. + +*New commandlet:* Add an entry to `COMMANDLETS` — key = GitHub label, `"display"` = name, `"labels"` = aliases. + +*Non-standard label:* Add it to the `"labels"` list of the matching `TOOLS` or `COMMANDLETS` entry. +Unmatched issues appear in the *Unassigned Issues* section. From 23053a85eef604cbfe62d2fef0324feacdd05d65 Mon Sep 17 00:00:00 2001 From: MarvMa Date: Wed, 6 May 2026 13:30:27 +0200 Subject: [PATCH 07/11] #1748: update visualisation --- documentation/generate_quality_status.py | 127 +++++-- documentation/quality-status.adoc | 411 ++++++++++++----------- 2 files changed, 308 insertions(+), 230 deletions(-) diff --git a/documentation/generate_quality_status.py b/documentation/generate_quality_status.py index 948fe32b22..9f3adbda4e 100644 --- a/documentation/generate_quality_status.py +++ b/documentation/generate_quality_status.py @@ -49,7 +49,7 @@ REPO = "devonfw/IDEasy" API_BASE = "https://api.github.com" -TOOL_FOLDER_PATH = "url-updater/src/main/java/com/devonfw/tools/ide/url/tool" +TOOL_FOLDER_PATH = "cli/src/main/java/com/devonfw/tools/ide/tool" OS_LABELS = {"windows": "windows", "linux": "linux", "mac": "macOS"} OS_ORDER = ["windows", "linux", "mac"] @@ -64,55 +64,95 @@ # display → human-readable name # labels → extra GitHub label names that also map to this tool TOOLS: dict[str, dict] = { - "android-studio": {"display": "Android Studio"}, - "aws": {"display": "AWS CLI"}, - "az": {"display": "Azure CLI"}, - "copilot": {"display": "GitHub Copilot"}, - "corepack": {"display": "Corepack"}, - "docker": {"display": "Docker", "labels": ["docker", "rancher"]}, - "dotnet": {"display": "dotnet"}, + # ── IDEs & editors ──────────────────────────────────────────────────────── + "androidstudio": {"display": "Android Studio", "labels": ["android-studio"]}, "eclipse": {"display": "Eclipse"}, - "gcloud": {"display": "gcloud CLI"}, - "gcviewer": {"display": "GCViewer"}, - "gh": {"display": "GitHub CLI"}, - "git": {"display": "git"}, + "intellij": {"display": "IntelliJ IDEA", "labels": ["intellij-idea"]}, + "pycharm": {"display": "PyCharm"}, + "vscode": {"display": "VS Code", "labels": ["vsc"]}, + # ── JVM / build tools ───────────────────────────────────────────────────── + "java": {"display": "Java (JDK)", "labels": ["jdk"]}, + "graalvm": {"display": "GraalVM"}, + "kotlinc": {"display": "Kotlin Compiler"}, + "mvn": {"display": "Maven", "labels": ["maven"]}, "gradle": {"display": "Gradle"}, - "helm": {"display": "Helm"}, - "intellij": {"display": "IntelliJ IDEA"}, - "jackson": {"display": "Jackson"}, - "java": {"display": "Java (JDK)"}, + "spring": {"display": "Spring Boot CLI"}, + "quarkus": {"display": "Quarkus CLI"}, + "tomcat": {"display": "Apache Tomcat"}, "jasypt": {"display": "Jasypt"}, "jmc": {"display": "JDK Mission Control"}, + "gcviewer": {"display": "GCViewer"}, + # ── Python ──────────────────────────────────────────────────────────────── + "python": {"display": "Python"}, + "pip": {"display": "pip"}, + "uv": {"display": "uv (Python package mgr)"}, + # ── JavaScript / Node.js ───────────────────────────────────────────────── + "node": {"display": "Node.js", "labels": ["nodejs"]}, + "npm": {"display": "npm"}, + "ng": {"display": "Angular CLI"}, + "yarn": {"display": "Yarn"}, + "corepack": {"display": "Corepack"}, + # ── Go ──────────────────────────────────────────────────────────────────── + "go": {"display": "Go"}, + # ── Container / cloud / DevOps ──────────────────────────────────────────── + "docker": {"display": "Docker", "labels": ["rancher", "docker"]}, + "lazydocker": {"display": "Lazydocker"}, "kubectl": {"display": "kubectl"}, - "mvn": {"display": "Maven"}, - "node": {"display": "Node.js / npm", "labels": ["nodejs", "npm"]}, "oc": {"display": "OpenShift CLI"}, - "pip": {"display": "pip"}, - "python": {"display": "Python"}, - "quarkus": {"display": "Quarkus CLI"}, - "sonar": {"display": "SonarQube"}, + "helm": {"display": "Helm"}, "terraform": {"display": "Terraform"}, - "vscode": {"display": "VS Code"}, + "aws": {"display": "AWS CLI"}, + "az": {"display": "Azure CLI", "labels": ["azure-cli"]}, + "dotnet": {"display": "dotnet"}, + # ── Developer tools ─────────────────────────────────────────────────────── + "gh": {"display": "GitHub CLI"}, + "copilot": {"display": "GitHub Copilot", "labels": ["github-copilot"]}, + "sonar": {"display": "SonarQube", "labels": ["sonarqube"]}, + # ── Database & data ─────────────────────────────────────────────────────── + "pgadmin": {"display": "pgAdmin"}, + "squirrelsql": {"display": "SQuirreL SQL"}, + # ── IDEasy tool mechanisms ──────────────────────────────────────────────── + "custom": {"display": "Custom tool support"}, + "extra": {"display": "Extra tools"}, + "gui": {"display": "GUI / IDE launcher", "labels": ["GUI"]}, + # ── Manually maintained (no CLI folder but label exists on issues) ───────── + "git": {"display": "git"}, } # ── Commandlet / core-feature registry ──────────────────────────────────────── COMMANDLETS: dict[str, dict] = { - "ide": {"display": "IDEasy (general)"}, + # ── Core IDEasy functionality ────────────────────────────────────────────── + "ide": {"display": "IDEasy (general)", "labels": ["CLI", "commandlet", "integration"]}, + "core": {"display": "Core / Runtime", "labels": ["progressbar"]}, "install": {"display": "ide install"}, "uninstall": {"display": "ide uninstall"}, "update": {"display": "ide update"}, "create-project": {"display": "ide create-project", "labels": ["create"]}, "build": {"display": "ide build"}, - "shell": {"display": "Shell integration"}, + "status": {"display": "ide status"}, + "version": {"display": "Version management"}, + # ── Configuration & settings ─────────────────────────────────────────────── + "settings": {"display": "Settings / Properties", "labels": ["configuration", "json", "upgrade-settings"]}, + "icd": {"display": "IDE Configuration Doc"}, + "merger": {"display": "Settings merger"}, + "env": {"display": "Environment variables"}, + # ── Download & installation pipeline ────────────────────────────────────── + "download": {"display": "Download & Extraction", "labels": ["unpack", "urls"]}, + # ── Shell & terminal ─────────────────────────────────────────────────────── + "shell": {"display": "Shell integration", "labels": ["PowerShell"]}, "completion": {"display": "Shell completion"}, - "settings": {"display": "Settings / Properties", "labels": ["configuration"]}, + # ── Infrastructure & networking ──────────────────────────────────────────── + "proxy": {"display": "Proxy / Network"}, "security": {"display": "Security / Credentials"}, - "repository": {"display": "Repository management"}, - "env": {"display": "Environment variables"}, - "plugin": {"display": "Plugin management"}, + # ── Repository & workspace ───────────────────────────────────────────────── + "repository": {"display": "Repository management", "labels": ["SCM"]}, + "workspace": {"display": "Workspace management"}, + # ── Plugin management (also a CLI folder) ───────────────────────────────── + "plugin": {"display": "Plugin management", "labels": ["plugins"]}, + # ── Observability ───────────────────────────────────────────────────────── + "logging": {"display": "Logging / Debug output"}, + # ── Migration ───────────────────────────────────────────────────────────── "migration": {"display": "Migration (devonfw-ide → IDEasy)"}, - "status": {"display": "ide status"}, - "version": {"display": "Version management"}, } # ── Derived lookups (do not edit) ───────────────────────────────────────────── @@ -129,9 +169,17 @@ for alias in cfg.get("labels", []) } _SKIP_LABELS: frozenset[str] = frozenset({ - BLOCKER_LABEL, "bug", "enhancement", "feature", "task", "question", - "duplicate", "wontfix", "invalid", "help wanted", "good first issue", - "documentation", "dependencies", "refactoring", "testing", + # issue types + BLOCKER_LABEL, "bug", "bugfix", "enhancement", "feature", "task", + # workflow / triage status + "Epic", "ready-to-implement", "waiting for feedback", "release", + # meta / project management + "AI", "ARM", "claude", "internal", "process", "rewrite", "software", "workflow", + # testing + "test", "integration-tests", "testing", + # other infra + "question", "duplicate", "wontfix", "invalid", "help wanted", + "good first issue", "documentation", "dependencies", "refactoring", *OS_LABELS.values(), }) @@ -432,15 +480,19 @@ def _unassigned_section(unassigned: list[dict]) -> str: def generate_adoc(issues: list[dict], tool_names: list[str]) -> str: + # Merge API-fetched names with statically registered TOOLS so that tools + # present in the registry but not (yet) in the url-updater source tree + # (e.g. git, kubectl) are still recognised and shown. + all_tool_names = sorted(set(tool_names) | set(TOOLS.keys())) tool_rows: list[tuple[str, str]] = [ (n, TOOL_DISPLAY_OVERRIDES.get(n, n.replace("-", " ").title())) - for n in tool_names + for n in all_tool_names ] cmd_rows: list[tuple[str, str]] = [ (n, COMMANDLET_DISPLAY_OVERRIDES[n]) for n in COMMANDLETS ] - tool_keys = {r[0] for r in tool_rows} + tool_keys = {r[0] for r in tool_rows} # merged fetched + static commandlet_keys = {r[0] for r in cmd_rows} tool_data, cmd_data, unassigned = classify_issues(issues, tool_keys, commandlet_keys) @@ -496,7 +548,8 @@ def main() -> None: sys.exit(1) print(f" {len(issues)} issues loaded.", file=sys.stderr) - tool_keys = set(tool_names) + # Merge fetched names with statically registered TOOLS (same logic as generate_adoc) + tool_keys = set(tool_names) | set(TOOLS.keys()) commandlet_keys = set(COMMANDLETS.keys()) _, _, unassigned = classify_issues(issues, tool_keys, commandlet_keys) matched = len(issues) - len(unassigned) diff --git a/documentation/quality-status.adoc b/documentation/quality-status.adoc index 4dd6a1d6a7..bb7d9cc1f6 100644 --- a/documentation/quality-status.adoc +++ b/documentation/quality-status.adoc @@ -18,7 +18,7 @@ Issues with *no OS label* are cross-platform and count toward every OS column (n | No issues | Enhancements only | Bug(s) | Blocker | 🟡 enhancement · 🔴 bug · 🚨 blocker |=== -_Generated: 2026-05-06 09:45 UTC · 186 issues · 99 assigned · 87 unassigned_ +_Generated: 2026-05-06 09:57 UTC · 186 issues · 136 assigned · 50 unassigned_ == Summary @@ -32,6 +32,13 @@ _No active blockers_ 🎉 [cols="2,1,1,1,6", options="header"] |=== | Tool | Win | Linux | macOS | Issues +| Android Studio +| 🔴 +| 🔴 +| 🔴 +| 🔴 link:https://github.com/devonfw/IDEasy/issues/1263[#1263] Fix android-studio workspace templates + +🟡 link:https://github.com/devonfw/IDEasy/issues/863[#863] `mac` Mac x64 android-studio 2024 releases missing + | AWS CLI | 🟡 | 🟡 @@ -54,6 +61,13 @@ _No active blockers_ 🎉 | 🟡 | 🟡 link:https://github.com/devonfw/IDEasy/issues/1717[#1717] Add github-copliot-cli as software package +| Custom tool support +| 🟡 +| 🟡 +| 🟡 +| 🟡 link:https://github.com/devonfw/IDEasy/issues/756[#756] Implement CustomToolRepositoryTest + +🟡 link:https://github.com/devonfw/IDEasy/issues/930[#930] Refactor `JsonPrettyPrinter` to be usable in CustomToolJson + | Docker | 🔴 | 🔴 @@ -81,12 +95,6 @@ _No active blockers_ 🎉 🟡 link:https://github.com/devonfw/IDEasy/issues/1165[#1165] Automatic project import for Eclipse + 🟡 link:https://github.com/devonfw/IDEasy/issues/1525[#1525] lombok not correctly installed in eclipse -| gcloud CLI -| 🟡 -| 🟡 -| 🟡 -| 🟡 link:https://github.com/devonfw/IDEasy/issues/19[#19] Implement ToolCommandlet for Google Cloud CLI - | GCViewer | 🟡 | 🟡 @@ -94,6 +102,44 @@ _No active blockers_ 🎉 | 🔴 link:https://github.com/devonfw/IDEasy/issues/869[#869] `mac` gcviewer logs errors on Mac X64 + 🟡 link:https://github.com/devonfw/IDEasy/issues/825[#825] Consider adding GC Log Analyzer +| git +| 🔴 +| 🟡 +| 🟡 +| 🔴 link:https://github.com/devonfw/IDEasy/issues/1579[#1579] `win` IDEasy uninstall after a failed MSI installation does not work + +🟡 link:https://github.com/devonfw/IDEasy/issues/714[#714] Improve UX for settings repository + +🟡 link:https://github.com/devonfw/IDEasy/issues/1694[#1694] Fix behavior when providing a wrong git URL + +🟡 link:https://github.com/devonfw/IDEasy/issues/1695[#1695] Clone settings to temporary directory, analyse, and then move + +| GUI / IDE launcher +| 🔴 +| 🔴 +| 🔴 +| 🔴 link:https://github.com/devonfw/IDEasy/issues/1892[#1892] pom.xml required for launching gui not included in release/native buil… + +🟡 link:https://github.com/devonfw/IDEasy/issues/1295[#1295] IDEasy Dashboard Epic + +🟡 link:https://github.com/devonfw/IDEasy/issues/1296[#1296] Implement IdeContext properly for Dashboard + +🟡 link:https://github.com/devonfw/IDEasy/issues/1784[#1784] Implement JavaFX based progress bars for the GUI + +🟡 link:https://github.com/devonfw/IDEasy/issues/1785[#1785] Implemenent confirmation modals using JavaFX + +🟡 link:https://github.com/devonfw/IDEasy/issues/1802[#1802] Enable state management for the IdeContext in the GUI. + +🟡 link:https://github.com/devonfw/IDEasy/issues/1840[#1840] Management of tool installations in the GUI + +| Ide +| 🔴 +| 🔴 +| 🔴 +| 🔴 link:https://github.com/devonfw/IDEasy/issues/1041[#1041] native image has globbing active + +🔴 link:https://github.com/devonfw/IDEasy/issues/1844[#1844] `linux` `ide install vscode` or `ide vscode` freezes at "installing plugins" s… + +🟡 link:https://github.com/devonfw/IDEasy/issues/19[#19] Implement ToolCommandlet for Google Cloud CLI + +🟡 link:https://github.com/devonfw/IDEasy/issues/703[#703] Support AWS CDK + +🟡 link:https://github.com/devonfw/IDEasy/issues/780[#780] Create IDEasy service + +🟡 link:https://github.com/devonfw/IDEasy/issues/825[#825] Consider adding GC Log Analyzer + +🟡 link:https://github.com/devonfw/IDEasy/issues/1457[#1457] Improve CLI error messages on invalid args or commandlets not availabl… + +🟡 link:https://github.com/devonfw/IDEasy/issues/1580[#1580] Implement cleanup + +🟡 link:https://github.com/devonfw/IDEasy/issues/1594[#1594] implement ReleaseCommandlet + +🟡 link:https://github.com/devonfw/IDEasy/issues/1821[#1821] Back up and restore user state before/after integration tests + +🟡 link:https://github.com/devonfw/IDEasy/issues/1867[#1867] Create Claude commandlet + +🟡 link:https://github.com/devonfw/IDEasy/issues/1868[#1868] Revision of the functionality of global tool commandlets + | IntelliJ IDEA | 🔴 | 🔴 @@ -110,25 +156,31 @@ _No active blockers_ 🎉 | 🟡 | 🟡 link:https://github.com/devonfw/IDEasy/issues/72[#72] Add further editions of java -| Kotlinc +| Kotlin Compiler | 🔴 | 🔴 | 🔴 | 🔴 link:https://github.com/devonfw/IDEasy/issues/857[#857] kotlinc bash does not get keyboard inputs +| kubectl +| 🔴 +| 🔴 +| 🔴 +| 🔴 link:https://github.com/devonfw/IDEasy/issues/1659[#1659] Global tools run tool while installation is running in background + | Maven | 🔴 | 🟢 | 🟢 | 🔴 link:https://github.com/devonfw/IDEasy/issues/594[#594] `win` Still windows file locking problems -| Node.js / npm +| Node.js | 🔴 | 🔴 | 🔴 | 🔴 link:https://github.com/devonfw/IDEasy/issues/859[#859] node shell not starting -| Npm +| npm | 🔴 | 🔴 | 🔴 @@ -136,7 +188,7 @@ _No active blockers_ 🎉 🔴 link:https://github.com/devonfw/IDEasy/issues/1886[#1886] NpmBasedCommandlet shows wrong tool version after install + 🟡 link:https://github.com/devonfw/IDEasy/issues/700[#700] Add Npm run test -| Pgadmin +| pgAdmin | 🔴 | 🔴 | 🔴 @@ -145,6 +197,19 @@ _No active blockers_ 🎉 🔴 link:https://github.com/devonfw/IDEasy/issues/878[#878] `mac` pgadmin does not work on Mac x64 + 🟡 link:https://github.com/devonfw/IDEasy/issues/1868[#1868] Revision of the functionality of global tool commandlets +| Plugin +| 🔴 +| 🔴 +| 🔴 +| 🔴 link:https://github.com/devonfw/IDEasy/issues/1263[#1263] Fix android-studio workspace templates + +🔴 link:https://github.com/devonfw/IDEasy/issues/1352[#1352] `linux` VSCode WSL warning prompt blocking VSCode plugin installation + +🔴 link:https://github.com/devonfw/IDEasy/issues/1548[#1548] `win` Windows file locking error on update with plugins + +🔴 link:https://github.com/devonfw/IDEasy/issues/1844[#1844] `linux` `ide install vscode` or `ide vscode` freezes at "installing plugins" s… + +🟡 link:https://github.com/devonfw/IDEasy/issues/449[#449] Consider integration of continue GenAI coding assistant + +🟡 link:https://github.com/devonfw/IDEasy/issues/1525[#1525] lombok not correctly installed in eclipse + +🟡 link:https://github.com/devonfw/IDEasy/issues/1754[#1754] Add version support to vscode settings .plugin files + +🟡 link:https://github.com/devonfw/IDEasy/issues/1880[#1880] Reinstall all plugins for IDE in force mode + | Python | 🔴 | 🔴 @@ -152,11 +217,16 @@ _No active blockers_ 🎉 | 🔴 link:https://github.com/devonfw/IDEasy/issues/1124[#1124] Ensure latest version of Python is installed + 🟡 link:https://github.com/devonfw/IDEasy/issues/1046[#1046] `linux` Add Support for Python on Linux -| Rust -| 🟡 -| 🟡 -| 🟡 -| 🟡 link:https://github.com/devonfw/IDEasy/issues/1719[#1719] Integrate rust +| Repository +| 🔴 +| 🔴 +| 🔴 +| 🔴 link:https://github.com/devonfw/IDEasy/issues/690[#690] UpdateUrls workflow timeout not working + +🟡 link:https://github.com/devonfw/IDEasy/issues/492[#492] Use Maven dependency cache to optimize workflow running times + +🟡 link:https://github.com/devonfw/IDEasy/issues/1164[#1164] Automatic project import + +🟡 link:https://github.com/devonfw/IDEasy/issues/1165[#1165] Automatic project import for Eclipse + +🟡 link:https://github.com/devonfw/IDEasy/issues/1167[#1167] Automatic project import for VSCode + +🟡 link:https://github.com/devonfw/IDEasy/issues/1216[#1216] Release workflow should only deploy artifacts after all tests passed | SonarQube | 🟢 @@ -170,7 +240,7 @@ _No active blockers_ 🎉 | 🔴 | 🔴 link:https://github.com/devonfw/IDEasy/issues/1391[#1391] bashrc messed with terraform completions -| Uv +| uv (Python package mgr) | 🔴 | 🔴 | 🔴 @@ -189,6 +259,12 @@ _No active blockers_ 🎉 🟡 link:https://github.com/devonfw/IDEasy/issues/1754[#1754] Add version support to vscode settings .plugin files + 🟡 link:https://github.com/devonfw/IDEasy/issues/1849[#1849] Support VSCodium +| Yarn +| 🔴 +| 🔴 +| 🔴 +| 🔴 link:https://github.com/devonfw/IDEasy/issues/1787[#1787] tracking yarn versions broken + |=== == Commandlets & Core Features @@ -196,6 +272,32 @@ _No active blockers_ 🎉 [cols="2,1,1,1,6", options="header"] |=== | Commandlet / Feature | Win | Linux | macOS | Issues +| IDEasy (general) +| 🔴 +| 🔴 +| 🔴 +| 🔴 link:https://github.com/devonfw/IDEasy/issues/1041[#1041] native image has globbing active + +🔴 link:https://github.com/devonfw/IDEasy/issues/1844[#1844] `linux` `ide install vscode` or `ide vscode` freezes at "installing plugins" s… + +🟡 link:https://github.com/devonfw/IDEasy/issues/19[#19] Implement ToolCommandlet for Google Cloud CLI + +🟡 link:https://github.com/devonfw/IDEasy/issues/703[#703] Support AWS CDK + +🟡 link:https://github.com/devonfw/IDEasy/issues/780[#780] Create IDEasy service + +🟡 link:https://github.com/devonfw/IDEasy/issues/825[#825] Consider adding GC Log Analyzer + +🟡 link:https://github.com/devonfw/IDEasy/issues/1457[#1457] Improve CLI error messages on invalid args or commandlets not availabl… + +🟡 link:https://github.com/devonfw/IDEasy/issues/1580[#1580] Implement cleanup + +🟡 link:https://github.com/devonfw/IDEasy/issues/1594[#1594] implement ReleaseCommandlet + +🟡 link:https://github.com/devonfw/IDEasy/issues/1821[#1821] Back up and restore user state before/after integration tests + +🟡 link:https://github.com/devonfw/IDEasy/issues/1867[#1867] Create Claude commandlet + +🟡 link:https://github.com/devonfw/IDEasy/issues/1868[#1868] Revision of the functionality of global tool commandlets + +| Core / Runtime +| 🔴 +| 🔴 +| 🔴 +| 🔴 link:https://github.com/devonfw/IDEasy/issues/1041[#1041] native image has globbing active + +🔴 link:https://github.com/devonfw/IDEasy/issues/1054[#1054] Incorrect interpretation of trailling and leading spaces in version ra… + +🟡 link:https://github.com/devonfw/IDEasy/issues/871[#871] `mac` Add progressbar to *.dmg extract process + +🟡 link:https://github.com/devonfw/IDEasy/issues/1512[#1512] `mac` Cannot run Intellij on Mac due to file permission error + | ide install | 🔴 | 🔴 @@ -250,24 +352,19 @@ _No active blockers_ 🎉 | 🟡 link:https://github.com/devonfw/IDEasy/issues/714[#714] Improve UX for settings repository + 🟡 link:https://github.com/devonfw/IDEasy/issues/1695[#1695] Clone settings to temporary directory, analyse, and then move -| Shell integration +| ide status | 🔴 | 🔴 | 🔴 -| 🔴 link:https://github.com/devonfw/IDEasy/issues/836[#836] Exit is completed in wrong places + -🔴 link:https://github.com/devonfw/IDEasy/issues/1746[#1746] ide shell broken + -🔴 link:https://github.com/devonfw/IDEasy/issues/1842[#1842] Infinite completion of exit subcommand + -🟡 link:https://github.com/devonfw/IDEasy/issues/821[#821] Allow User to remove "ide " prefix in ide shell for non-IDEasy command + -🟡 link:https://github.com/devonfw/IDEasy/issues/822[#822] Handle long CWD paths in shell prompt +| 🔴 link:https://github.com/devonfw/IDEasy/issues/1255[#1255] ide status does not recognize snapshot version correctly + +🟡 link:https://github.com/devonfw/IDEasy/issues/1209[#1209] migration version message is confusing -| Shell completion -| 🔴 -| 🔴 -| 🔴 -| 🔴 link:https://github.com/devonfw/IDEasy/issues/551[#551] Autocompletion and list-versions make OS-agnostic suggestions + -🔴 link:https://github.com/devonfw/IDEasy/issues/1842[#1842] Infinite completion of exit subcommand + -🟡 link:https://github.com/devonfw/IDEasy/issues/169[#169] Check if we want to utilize TailTipWidgets for the autocompleter + -🟡 link:https://github.com/devonfw/IDEasy/issues/1392[#1392] Smart completion +| Version management +| 🟡 +| 🟡 +| 🟡 +| 🟡 link:https://github.com/devonfw/IDEasy/issues/1178[#1178] Revisit VersionPhase detection + +🟡 link:https://github.com/devonfw/IDEasy/issues/1868[#1868] Revision of the functionality of global tool commandlets | Settings / Properties | 🔴 @@ -275,10 +372,12 @@ _No active blockers_ 🎉 | 🔴 | 🔴 link:https://github.com/devonfw/IDEasy/issues/1063[#1063] User specific configurations are not working as described + 🔴 link:https://github.com/devonfw/IDEasy/issues/1518[#1518] uv tools are installed globally + +🔴 link:https://github.com/devonfw/IDEasy/issues/1814[#1814] IDEasy still reports updates for settings are available after any numb… + 🟡 link:https://github.com/devonfw/IDEasy/issues/449[#449] Consider integration of continue GenAI coding assistant + 🟡 link:https://github.com/devonfw/IDEasy/issues/714[#714] Improve UX for settings repository + 🟡 link:https://github.com/devonfw/IDEasy/issues/735[#735] Enhance workspace configuration with generic overlay from settings/wor… + 🟡 link:https://github.com/devonfw/IDEasy/issues/785[#785] Re-introduce workspace reverse options from devonfw-ide + +🟡 link:https://github.com/devonfw/IDEasy/issues/930[#930] Refactor `JsonPrettyPrinter` to be usable in CustomToolJson + 🟡 link:https://github.com/devonfw/IDEasy/issues/987[#987] conditional templates + 🟡 link:https://github.com/devonfw/IDEasy/issues/989[#989] allow expressions in template variable definitions + 🟡 link:https://github.com/devonfw/IDEasy/issues/992[#992] Support multiple attributes for merge:id + @@ -289,6 +388,65 @@ _No active blockers_ 🎉 🟡 link:https://github.com/devonfw/IDEasy/issues/1715[#1715] Adapt settings to inject java runtime future proove into vscode + 🟡 link:https://github.com/devonfw/IDEasy/issues/1880[#1880] Reinstall all plugins for IDE in force mode +| IDE Configuration Doc +| 🔴 +| 🔴 +| 🔴 +| 🔴 link:https://github.com/devonfw/IDEasy/issues/1185[#1185] `mac` icd on mac does not work in zshell + +🔴 link:https://github.com/devonfw/IDEasy/issues/1808[#1808] icd is not navigating into single available workspace on icd -p projec… + +| Settings merger +| 🔴 +| 🔴 +| 🔴 +| 🔴 link:https://github.com/devonfw/IDEasy/issues/943[#943] XmlMerger: Rework Combine Text Nodes + +🟡 link:https://github.com/devonfw/IDEasy/issues/735[#735] Enhance workspace configuration with generic overlay from settings/wor… + +🟡 link:https://github.com/devonfw/IDEasy/issues/987[#987] conditional templates + +🟡 link:https://github.com/devonfw/IDEasy/issues/989[#989] allow expressions in template variable definitions + +🟡 link:https://github.com/devonfw/IDEasy/issues/992[#992] Support multiple attributes for merge:id + +| Download & Extraction +| 🔴 +| 🔴 +| 🔴 +| 🔴 link:https://github.com/devonfw/IDEasy/issues/690[#690] UpdateUrls workflow timeout not working + +🔴 link:https://github.com/devonfw/IDEasy/issues/771[#771] Check URL Updater issues + +🔴 link:https://github.com/devonfw/IDEasy/issues/897[#897] HTTP Proxy with TLS termination causing errors + +🔴 link:https://github.com/devonfw/IDEasy/issues/1124[#1124] Ensure latest version of Python is installed + +🔴 link:https://github.com/devonfw/IDEasy/issues/1634[#1634] UrlUpdater creates error entries for HTTP status 200 + +🔴 link:https://github.com/devonfw/IDEasy/issues/1787[#1787] tracking yarn versions broken + +🟡 link:https://github.com/devonfw/IDEasy/issues/891[#891] Improve Url Updater Report Overview + +🟡 link:https://github.com/devonfw/IDEasy/issues/1447[#1447] Cover checksum verification in JUnit + +🟡 link:https://github.com/devonfw/IDEasy/issues/1651[#1651] Move status.json files out of ide-urls to own repo + +🟡 link:https://github.com/devonfw/IDEasy/issues/1849[#1849] Support VSCodium + +🟡 link:https://github.com/devonfw/IDEasy/issues/1884[#1884] Implement proper ZIP extraction + +| Shell integration +| 🔴 +| 🔴 +| 🔴 +| 🔴 link:https://github.com/devonfw/IDEasy/issues/836[#836] Exit is completed in wrong places + +🔴 link:https://github.com/devonfw/IDEasy/issues/1746[#1746] ide shell broken + +🔴 link:https://github.com/devonfw/IDEasy/issues/1842[#1842] Infinite completion of exit subcommand + +🟡 link:https://github.com/devonfw/IDEasy/issues/821[#821] Allow User to remove "ide " prefix in ide shell for non-IDEasy command + +🟡 link:https://github.com/devonfw/IDEasy/issues/822[#822] Handle long CWD paths in shell prompt + +🟡 link:https://github.com/devonfw/IDEasy/issues/1135[#1135] IDEasy does not set env variables on Windows PowerShell + +| Shell completion +| 🔴 +| 🔴 +| 🔴 +| 🔴 link:https://github.com/devonfw/IDEasy/issues/551[#551] Autocompletion and list-versions make OS-agnostic suggestions + +🔴 link:https://github.com/devonfw/IDEasy/issues/1842[#1842] Infinite completion of exit subcommand + +🟡 link:https://github.com/devonfw/IDEasy/issues/169[#169] Check if we want to utilize TailTipWidgets for the autocompleter + +🟡 link:https://github.com/devonfw/IDEasy/issues/1392[#1392] Smart completion + +| Proxy / Network +| 🔴 +| 🔴 +| 🔴 +| 🔴 link:https://github.com/devonfw/IDEasy/issues/897[#897] HTTP Proxy with TLS termination causing errors + | Security / Credentials | 🔴 | 🔴 @@ -300,32 +458,47 @@ _No active blockers_ 🎉 🟡 link:https://github.com/devonfw/IDEasy/issues/1628[#1628] Support for OS specific CVEs | Repository management +| 🔴 +| 🔴 +| 🔴 +| 🔴 link:https://github.com/devonfw/IDEasy/issues/690[#690] UpdateUrls workflow timeout not working + +🟡 link:https://github.com/devonfw/IDEasy/issues/492[#492] Use Maven dependency cache to optimize workflow running times + +🟡 link:https://github.com/devonfw/IDEasy/issues/1164[#1164] Automatic project import + +🟡 link:https://github.com/devonfw/IDEasy/issues/1165[#1165] Automatic project import for Eclipse + +🟡 link:https://github.com/devonfw/IDEasy/issues/1167[#1167] Automatic project import for VSCode + +🟡 link:https://github.com/devonfw/IDEasy/issues/1216[#1216] Release workflow should only deploy artifacts after all tests passed + +| Workspace management | 🟡 | 🟡 | 🟡 -| 🟡 link:https://github.com/devonfw/IDEasy/issues/1164[#1164] Automatic project import + -🟡 link:https://github.com/devonfw/IDEasy/issues/1165[#1165] Automatic project import for Eclipse + -🟡 link:https://github.com/devonfw/IDEasy/issues/1167[#1167] Automatic project import for VSCode +| 🟡 link:https://github.com/devonfw/IDEasy/issues/735[#735] Enhance workspace configuration with generic overlay from settings/wor… -| ide status +| Plugin management | 🔴 | 🔴 | 🔴 -| 🔴 link:https://github.com/devonfw/IDEasy/issues/1255[#1255] ide status does not recognize snapshot version correctly + -🟡 link:https://github.com/devonfw/IDEasy/issues/1209[#1209] migration version message is confusing +| 🔴 link:https://github.com/devonfw/IDEasy/issues/1263[#1263] Fix android-studio workspace templates + +🔴 link:https://github.com/devonfw/IDEasy/issues/1352[#1352] `linux` VSCode WSL warning prompt blocking VSCode plugin installation + +🔴 link:https://github.com/devonfw/IDEasy/issues/1548[#1548] `win` Windows file locking error on update with plugins + +🔴 link:https://github.com/devonfw/IDEasy/issues/1844[#1844] `linux` `ide install vscode` or `ide vscode` freezes at "installing plugins" s… + +🟡 link:https://github.com/devonfw/IDEasy/issues/449[#449] Consider integration of continue GenAI coding assistant + +🟡 link:https://github.com/devonfw/IDEasy/issues/1525[#1525] lombok not correctly installed in eclipse + +🟡 link:https://github.com/devonfw/IDEasy/issues/1754[#1754] Add version support to vscode settings .plugin files + +🟡 link:https://github.com/devonfw/IDEasy/issues/1880[#1880] Reinstall all plugins for IDE in force mode -| Version management +| Logging / Debug output | 🟡 | 🟡 | 🟡 -| 🟡 link:https://github.com/devonfw/IDEasy/issues/1178[#1178] Revisit VersionPhase detection + -🟡 link:https://github.com/devonfw/IDEasy/issues/1868[#1868] Revision of the functionality of global tool commandlets +| 🟡 link:https://github.com/devonfw/IDEasy/issues/1688[#1688] Remove unnecessary message in the CLI when installing a new tool + +🟡 link:https://github.com/devonfw/IDEasy/issues/1689[#1689] Fix user commnication when switching the Java version from the default… |=== == Unassigned Issues -87 issue(s) matched no known tool or commandlet. Add the appropriate label on GitHub or extend `TOOLS`/`COMMANDLETS` in this script. +50 issue(s) matched no known tool or commandlet. Add the appropriate label on GitHub or extend `TOOLS`/`COMMANDLETS` in this script. [cols="1,4,3", options="header"] |=== @@ -362,10 +535,6 @@ _No active blockers_ 🎉 | consider integration of lama | enhancement, AI -| link:https://github.com/devonfw/IDEasy/issues/492[#492] -| Use Maven dependency cache to optimize workflow running times -| enhancement, SCM - | link:https://github.com/devonfw/IDEasy/issues/516[#516] | IdeToolCommandlet: add option and support for import of project(s) | enhancement @@ -386,10 +555,6 @@ _No active blockers_ 🎉 | Recycle devonfw-ide documentation | enhancement -| link:https://github.com/devonfw/IDEasy/issues/690[#690] -| UpdateUrls workflow timeout not working -| urls, SCM - | link:https://github.com/devonfw/IDEasy/issues/726[#726] | Replace hardcoded dependencies with dependencies.json in ide-urls | enhancement, Epic @@ -398,22 +563,10 @@ _No active blockers_ 🎉 | Add a warning message for legacy devonfw-ide settings users | enhancement -| link:https://github.com/devonfw/IDEasy/issues/756[#756] -| Implement CustomToolRepositoryTest -| enhancement, test, custom - | link:https://github.com/devonfw/IDEasy/issues/768[#768] | Improve IntelliJ configuration (annotation processing, auto-import, ma… | enhancement -| link:https://github.com/devonfw/IDEasy/issues/771[#771] -| Check URL Updater issues -| urls - -| link:https://github.com/devonfw/IDEasy/issues/780[#780] -| Create IDEasy service -| enhancement, Epic, CLI - | link:https://github.com/devonfw/IDEasy/issues/788[#788] | Add more starting flags to IDE commandlets | enhancement @@ -430,50 +583,18 @@ _No active blockers_ 🎉 | Kubectl not working on linux | linux -| link:https://github.com/devonfw/IDEasy/issues/863[#863] -| Mac x64 android-studio 2024 releases missing -| enhancement, android-studio, macOS - -| link:https://github.com/devonfw/IDEasy/issues/871[#871] -| Add progressbar to *.dmg extract process -| enhancement, macOS, progressbar - | link:https://github.com/devonfw/IDEasy/issues/882[#882] | Skip step if no installation was required | enhancement -| link:https://github.com/devonfw/IDEasy/issues/891[#891] -| Improve Url Updater Report Overview -| enhancement, urls - | link:https://github.com/devonfw/IDEasy/issues/892[#892] | Improve GitContextTest tests to actually test something | enhancement -| link:https://github.com/devonfw/IDEasy/issues/897[#897] -| HTTP Proxy with TLS termination causing errors -| download, proxy - -| link:https://github.com/devonfw/IDEasy/issues/930[#930] -| Refactor `JsonPrettyPrinter` to be usable in CustomToolJson -| custom, json - -| link:https://github.com/devonfw/IDEasy/issues/943[#943] -| XmlMerger: Rework Combine Text Nodes -| merger - | link:https://github.com/devonfw/IDEasy/issues/1031[#1031] | Integration of OpenRewrite | enhancement, rewrite -| link:https://github.com/devonfw/IDEasy/issues/1041[#1041] -| native image has globbing active -| CLI, core - -| link:https://github.com/devonfw/IDEasy/issues/1054[#1054] -| Incorrect interpretation of trailling and leading spaces in version ra… -| core, dependencies - | link:https://github.com/devonfw/IDEasy/issues/1059[#1059] | Improve and fix dependency mechanism | enhancement, dependencies @@ -482,10 +603,6 @@ _No active blockers_ 🎉 | IDEasy autocompletion gets stuck if license agreement file was not fou… | blocker -| link:https://github.com/devonfw/IDEasy/issues/1135[#1135] -| IDEasy does not set env variables on Windows PowerShell -| enhancement, PowerShell - | link:https://github.com/devonfw/IDEasy/issues/1150[#1150] | Full ARM support | enhancement, Epic, ARM @@ -494,10 +611,6 @@ _No active blockers_ 🎉 | Improve IntelliJ layout | enhancement -| link:https://github.com/devonfw/IDEasy/issues/1185[#1185] -| icd on mac does not work in zshell -| macOS, icd, ready-to-implement - | link:https://github.com/devonfw/IDEasy/issues/1206[#1206] | java.util.zip.ZipException when opening Android Studio archives from v… | enhancement @@ -506,26 +619,10 @@ _No active blockers_ 🎉 | nightly build not executing tests anymore | enhancement -| link:https://github.com/devonfw/IDEasy/issues/1216[#1216] -| Release workflow should only deploy artifacts after all tests passed -| enhancement, SCM, release, workflow - | link:https://github.com/devonfw/IDEasy/issues/1225[#1225] | Create new IDEasy introduction videos | enhancement -| link:https://github.com/devonfw/IDEasy/issues/1263[#1263] -| Fix android-studio workspace templates -| android-studio, plugins - -| link:https://github.com/devonfw/IDEasy/issues/1295[#1295] -| IDEasy Dashboard Epic -| enhancement, Epic, GUI - -| link:https://github.com/devonfw/IDEasy/issues/1296[#1296] -| Implement IdeContext properly for Dashboard -| enhancement, GUI - | link:https://github.com/devonfw/IDEasy/issues/1311[#1311] | improve IDE_MIN_VERSION support | enhancement @@ -538,50 +635,18 @@ _No active blockers_ 🎉 | Refactor tests to remove windowsJunctionsAreUsed | test, internal, ready-to-implement -| link:https://github.com/devonfw/IDEasy/issues/1447[#1447] -| Cover checksum verification in JUnit -| enhancement, test, download, internal, ready-to-implement - | link:https://github.com/devonfw/IDEasy/issues/1453[#1453] | Allow co-authored commits in cla assistant | enhancement, waiting for feedback -| link:https://github.com/devonfw/IDEasy/issues/1457[#1457] -| Improve CLI error messages on invalid args or commandlets not availabl… -| enhancement, CLI, ready-to-implement - | link:https://github.com/devonfw/IDEasy/issues/1493[#1493] | Analyze Scoop Windows CLI installer | enhancement -| link:https://github.com/devonfw/IDEasy/issues/1580[#1580] -| Implement cleanup -| enhancement, commandlet, ready-to-implement - | link:https://github.com/devonfw/IDEasy/issues/1585[#1585] | Add Insomnia CLI support to IDEasy | enhancement -| link:https://github.com/devonfw/IDEasy/issues/1594[#1594] -| implement ReleaseCommandlet -| enhancement, commandlet, ready-to-implement - -| link:https://github.com/devonfw/IDEasy/issues/1634[#1634] -| UrlUpdater creates error entries for HTTP status 200 -| urls, workflow - -| link:https://github.com/devonfw/IDEasy/issues/1651[#1651] -| Move status.json files out of ide-urls to own repo -| enhancement, urls, workflow, ready-to-implement - -| link:https://github.com/devonfw/IDEasy/issues/1688[#1688] -| Remove unnecessary message in the CLI when installing a new tool -| enhancement, logging, ready-to-implement - -| link:https://github.com/devonfw/IDEasy/issues/1689[#1689] -| Fix user commnication when switching the Java version from the default… -| enhancement, logging - | link:https://github.com/devonfw/IDEasy/issues/1701[#1701] | Implement Mise-en-place | enhancement @@ -590,6 +655,10 @@ _No active blockers_ 🎉 | Add claude-cli as software package | enhancement, AI, ready-to-implement, claude +| link:https://github.com/devonfw/IDEasy/issues/1719[#1719] +| Integrate rust +| enhancement, ready-to-implement, rust + | link:https://github.com/devonfw/IDEasy/issues/1720[#1720] | Integrate SoapUI | enhancement @@ -602,42 +671,10 @@ _No active blockers_ 🎉 | Improve IDEasy status documentation | documentation, enhancement, ready-to-implement -| link:https://github.com/devonfw/IDEasy/issues/1784[#1784] -| Implement JavaFX based progress bars for the GUI -| enhancement, GUI - -| link:https://github.com/devonfw/IDEasy/issues/1785[#1785] -| Implemenent confirmation modals using JavaFX -| enhancement, GUI, ready-to-implement - -| link:https://github.com/devonfw/IDEasy/issues/1787[#1787] -| tracking yarn versions broken -| urls, yarn, software - | link:https://github.com/devonfw/IDEasy/issues/1788[#1788] | Add ln commandlet to create links | enhancement, ready-to-implement -| link:https://github.com/devonfw/IDEasy/issues/1802[#1802] -| Enable state management for the IdeContext in the GUI. -| enhancement, GUI - -| link:https://github.com/devonfw/IDEasy/issues/1808[#1808] -| icd is not navigating into single available workspace on icd -p projec… -| invalid, icd - -| link:https://github.com/devonfw/IDEasy/issues/1814[#1814] -| IDEasy still reports updates for settings are available after any numb… -| upgrade-settings - -| link:https://github.com/devonfw/IDEasy/issues/1821[#1821] -| Back up and restore user state before/after integration tests -| enhancement, test, integration, internal, integration-tests, ready-to-implement - -| link:https://github.com/devonfw/IDEasy/issues/1840[#1840] -| Management of tool installations in the GUI -| enhancement, GUI - | link:https://github.com/devonfw/IDEasy/issues/1846[#1846] | Mac Gatekeeper workaround causing errors | macOS, bugfix @@ -646,10 +683,6 @@ _No active blockers_ 🎉 | Create ClaudeUrlUpdater | enhancement, claude -| link:https://github.com/devonfw/IDEasy/issues/1867[#1867] -| Create Claude commandlet -| enhancement, commandlet, claude - | link:https://github.com/devonfw/IDEasy/issues/1869[#1869] | Improve WindowsHelper to search in windows registry | enhancement, windows, internal, ready-to-implement @@ -666,14 +699,6 @@ _No active blockers_ 🎉 | Create AWS CDK commandlet | enhancement -| link:https://github.com/devonfw/IDEasy/issues/1884[#1884] -| Implement proper ZIP extraction -| enhancement, unpack, ready-to-implement - -| link:https://github.com/devonfw/IDEasy/issues/1892[#1892] -| pom.xml required for launching gui not included in release/native buil… -| GUI, internal - | link:https://github.com/devonfw/IDEasy/issues/1893[#1893] | Fix Failing Integration Tests workflow | integration-tests From e1c00eff9c2bd557e8fd8ddd40bd9eb8ceca12cc Mon Sep 17 00:00:00 2001 From: MarvMa Date: Wed, 6 May 2026 13:56:48 +0200 Subject: [PATCH 08/11] #1748: enhance structure and visual representation --- documentation/generate_quality_status.py | 874 +++++++++---- documentation/quality-status.adoc | 1505 ++++++++++++++++------ 2 files changed, 1737 insertions(+), 642 deletions(-) diff --git a/documentation/generate_quality_status.py b/documentation/generate_quality_status.py index 9f3adbda4e..c710c13d47 100644 --- a/documentation/generate_quality_status.py +++ b/documentation/generate_quality_status.py @@ -1,38 +1,33 @@ #!/usr/bin/env python3 -""" -generate_quality_status.py - -Generates quality-status.adoc for devonfw/IDEasy by: - 1. Fetching tool names dynamically from the url-updater source tree - (url-updater/src/main/java/com/devonfw/tools/ide/url/tool/). - 2. Fetching all open GitHub issues and mapping them to tools or commandlets - via labels (including aliases for non-standard label names). - 3. Writing a compact quality-status.adoc: - - Overview with legend and issue stats - - Summary: active blockers only - - Tools: one cross-OS table (Win / Linux / macOS columns), non-green rows only - - Commandlets: same - - Unassigned Issues - -OS LABEL BEHAVIOUR -────────────────── -Issues with a specific OS label appear only in that OS column. -Issues with NO OS label are cross-platform: they count toward every OS column -and are shown without an OS tag in the Issues cell. - -ISSUE TYPE ICONS IN ISSUES CELL -──────────────────────────────── - 🚨 #N — blocker - 🔴 #N — bug (or legacy "bug" label) - 🟡 #N — enhancement / feature / task (no bug, no blocker) - -OS tags are appended in backticks only for OS-specific issues, e.g.: - 🔴 link:…[#42] `win` Title snippet - 🟡 link:…[#99] Title snippet (cross-platform: no tag) - -Usage: +"""Generates quality-status.adoc for the devonfw/IDEasy GitHub repository. + +The script fetches open issues via the GitHub REST API and maps them to known +tools and commandlets by matching issue labels against the registries defined +in this module. The output document follows standard QA reporting structure: + +1. Overview — metadata, severity legend, issue statistics +2. Bugs & Blockers — deduplicated table of all bugs/blockers with OS columns +3. Commandlets — one cross-OS table grouped by functional category +4. Windows Tools — per-OS tool status table +5. Linux Tools — per-OS tool status table +6. macOS Tools — per-OS tool status table +7. Unassigned — issues that matched no known label +8. How to Contribute + +OS label behaviour: + Issues labelled with a specific OS (windows / linux / macOS) appear only + in that OS section. Issues without any OS label are treated as + cross-platform and appear in every OS section. + +Severity model: + Blocker — labelled "blocker"; fully prevents users from working + Bug — GitHub issue type "Bug", legacy "bug" label, or "blocker" + Enhancement — everything else (feature request, improvement, task) + +Usage:: + python generate_quality_status.py [--token TOKEN] [--output PATH] - export GITHUB_TOKEN=ghp_yourtoken && python generate_quality_status.py + export GITHUB_TOKEN=ghp_... && python generate_quality_status.py """ import argparse @@ -45,7 +40,7 @@ from collections import defaultdict from datetime import datetime, timezone -# ─── Configuration ──────────────────────────────────────────────────────────── +# ─── Repository configuration ───────────────────────────────────────────────── REPO = "devonfw/IDEasy" API_BASE = "https://api.github.com" @@ -54,23 +49,24 @@ OS_LABELS = {"windows": "windows", "linux": "linux", "mac": "macOS"} OS_ORDER = ["windows", "linux", "mac"] OS_DISPLAY = {"windows": "Windows", "linux": "Linux", "mac": "macOS"} -OS_SHORT = {"windows": "win", "linux": "linux", "mac": "mac"} +OS_SHORT = {"windows": "Win", "linux": "Linux", "mac": "macOS"} BUG_TYPE_NAMES = {"Bug", "bug"} BLOCKER_LABEL = "blocker" -# ── Tool registry ────────────────────────────────────────────────────────────── -# Key → canonical folder name (= default label) -# display → human-readable name -# labels → extra GitHub label names that also map to this tool +# ─── Tool registry ──────────────────────────────────────────────────────────── +# Each key is the canonical tool folder name under TOOL_FOLDER_PATH, which is +# also the default GitHub label. "display" is the human-readable table name. +# "labels" lists any additional GitHub label names that map to this entry. + TOOLS: dict[str, dict] = { - # ── IDEs & editors ──────────────────────────────────────────────────────── + # IDEs & Editors "androidstudio": {"display": "Android Studio", "labels": ["android-studio"]}, "eclipse": {"display": "Eclipse"}, "intellij": {"display": "IntelliJ IDEA", "labels": ["intellij-idea"]}, "pycharm": {"display": "PyCharm"}, "vscode": {"display": "VS Code", "labels": ["vsc"]}, - # ── JVM / build tools ───────────────────────────────────────────────────── + # JVM & Build "java": {"display": "Java (JDK)", "labels": ["jdk"]}, "graalvm": {"display": "GraalVM"}, "kotlinc": {"display": "Kotlin Compiler"}, @@ -82,20 +78,20 @@ "jasypt": {"display": "Jasypt"}, "jmc": {"display": "JDK Mission Control"}, "gcviewer": {"display": "GCViewer"}, - # ── Python ──────────────────────────────────────────────────────────────── + # Python "python": {"display": "Python"}, "pip": {"display": "pip"}, - "uv": {"display": "uv (Python package mgr)"}, - # ── JavaScript / Node.js ───────────────────────────────────────────────── + "uv": {"display": "uv"}, + # JavaScript / Node.js "node": {"display": "Node.js", "labels": ["nodejs"]}, "npm": {"display": "npm"}, "ng": {"display": "Angular CLI"}, "yarn": {"display": "Yarn"}, "corepack": {"display": "Corepack"}, - # ── Go ──────────────────────────────────────────────────────────────────── + # Go "go": {"display": "Go"}, - # ── Container / cloud / DevOps ──────────────────────────────────────────── - "docker": {"display": "Docker", "labels": ["rancher", "docker"]}, + # Cloud & DevOps + "docker": {"display": "Docker"}, "lazydocker": {"display": "Lazydocker"}, "kubectl": {"display": "kubectl"}, "oc": {"display": "OpenShift CLI"}, @@ -104,24 +100,26 @@ "aws": {"display": "AWS CLI"}, "az": {"display": "Azure CLI", "labels": ["azure-cli"]}, "dotnet": {"display": "dotnet"}, - # ── Developer tools ─────────────────────────────────────────────────────── + # Developer Tools "gh": {"display": "GitHub CLI"}, "copilot": {"display": "GitHub Copilot", "labels": ["github-copilot"]}, "sonar": {"display": "SonarQube", "labels": ["sonarqube"]}, - # ── Database & data ─────────────────────────────────────────────────────── + # Database "pgadmin": {"display": "pgAdmin"}, "squirrelsql": {"display": "SQuirreL SQL"}, - # ── IDEasy tool mechanisms ──────────────────────────────────────────────── + # IDEasy extensions / manually maintained entries without a tool folder "custom": {"display": "Custom tool support"}, "extra": {"display": "Extra tools"}, "gui": {"display": "GUI / IDE launcher", "labels": ["GUI"]}, - # ── Manually maintained (no CLI folder but label exists on issues) ───────── "git": {"display": "git"}, + "rancher": {"display": "Rancher Desktop"}, } -# ── Commandlet / core-feature registry ──────────────────────────────────────── +# ─── Commandlet / core-feature registry ─────────────────────────────────────── +# Same structure as TOOLS. The key is the GitHub label for that functional area. + COMMANDLETS: dict[str, dict] = { - # ── Core IDEasy functionality ────────────────────────────────────────────── + # Core commands "ide": {"display": "IDEasy (general)", "labels": ["CLI", "commandlet", "integration"]}, "core": {"display": "Core / Runtime", "labels": ["progressbar"]}, "install": {"display": "ide install"}, @@ -131,53 +129,79 @@ "build": {"display": "ide build"}, "status": {"display": "ide status"}, "version": {"display": "Version management"}, - # ── Configuration & settings ─────────────────────────────────────────────── + # Configuration "settings": {"display": "Settings / Properties", "labels": ["configuration", "json", "upgrade-settings"]}, "icd": {"display": "IDE Configuration Doc"}, "merger": {"display": "Settings merger"}, "env": {"display": "Environment variables"}, - # ── Download & installation pipeline ────────────────────────────────────── + # Download & install "download": {"display": "Download & Extraction", "labels": ["unpack", "urls"]}, - # ── Shell & terminal ─────────────────────────────────────────────────────── + # Shell & terminal "shell": {"display": "Shell integration", "labels": ["PowerShell"]}, "completion": {"display": "Shell completion"}, - # ── Infrastructure & networking ──────────────────────────────────────────── + # Infrastructure "proxy": {"display": "Proxy / Network"}, "security": {"display": "Security / Credentials"}, - # ── Repository & workspace ───────────────────────────────────────────────── + # Repository & workspace "repository": {"display": "Repository management", "labels": ["SCM"]}, "workspace": {"display": "Workspace management"}, - # ── Plugin management (also a CLI folder) ───────────────────────────────── + # Plugin management "plugin": {"display": "Plugin management", "labels": ["plugins"]}, - # ── Observability ───────────────────────────────────────────────────────── + # Observability "logging": {"display": "Logging / Debug output"}, - # ── Migration ───────────────────────────────────────────────────────────── - "migration": {"display": "Migration (devonfw-ide → IDEasy)"}, + # Migration + "migration": {"display": "Migration (devonfw-ide to IDEasy)"}, } -# ── Derived lookups (do not edit) ───────────────────────────────────────────── -TOOL_DISPLAY_OVERRIDES: dict[str, str] = { - n: c["display"] for n, c in TOOLS.items() -} -COMMANDLET_DISPLAY_OVERRIDES: dict[str, str] = { - n: c["display"] for n, c in COMMANDLETS.items() -} +# ─── Category groupings ──────────────────────────────────────────────────────── +# Ordered list of (category_label, [canonical_keys]). Controls the spanning +# header rows and row order in the rendered status tables. + +TOOL_CATEGORIES: list[tuple[str, list[str]]] = [ + ("IDEs and Editors", ["androidstudio", "eclipse", "intellij", "pycharm", "vscode"]), + ("JVM and Build Tools", ["java", "graalvm", "kotlinc", "mvn", "gradle", + "spring", "quarkus", "tomcat", "jasypt", "jmc", "gcviewer"]), + ("Python", ["python", "pip", "uv"]), + ("JavaScript / Node.js", ["node", "npm", "ng", "yarn", "corepack"]), + ("Go", ["go"]), + ("Cloud and DevOps", ["docker", "lazydocker", "kubectl", "oc", "helm", + "terraform", "aws", "az", "dotnet"]), + ("Developer Tools", ["gh", "copilot", "sonar"]), + ("Database", ["pgadmin", "squirrelsql"]), + ("IDEasy Extensions", ["custom", "extra", "gui", "git", "rancher"]), +] + +COMMANDLET_CATEGORIES: list[tuple[str, list[str]]] = [ + ("Core Commands", ["ide", "core", "install", "uninstall", "update", + "create-project", "build", "status", "version"]), + ("Configuration", ["settings", "icd", "merger", "env"]), + ("Download and Install", ["download"]), + ("Shell and Terminal", ["shell", "completion"]), + ("Infrastructure", ["proxy", "security"]), + ("Repository and Workspace", ["repository", "workspace"]), + ("Plugin Management", ["plugin"]), + ("Observability", ["logging"]), + ("Migration", ["migration"]), +] + +# ─── Derived lookups ────────────────────────────────────────────────────────── +# These are computed from the registries above and must not be edited directly. + +TOOL_DISPLAY: dict[str, str] = {n: c["display"] for n, c in TOOLS.items()} +CMD_DISPLAY: dict[str, str] = {n: c["display"] for n, c in COMMANDLETS.items()} + LABEL_ALIASES: dict[str, str] = { alias: name for registry in (TOOLS, COMMANDLETS) for name, cfg in registry.items() for alias in cfg.get("labels", []) } + _SKIP_LABELS: frozenset[str] = frozenset({ - # issue types BLOCKER_LABEL, "bug", "bugfix", "enhancement", "feature", "task", - # workflow / triage status "Epic", "ready-to-implement", "waiting for feedback", "release", - # meta / project management "AI", "ARM", "claude", "internal", "process", "rewrite", "software", "workflow", - # testing "test", "integration-tests", "testing", - # other infra "question", "duplicate", "wontfix", "invalid", "help wanted", "good first issue", "documentation", "dependencies", "refactoring", *OS_LABELS.values(), @@ -186,7 +210,21 @@ # ─── GitHub API helpers ─────────────────────────────────────────────────────── -def _get(path: str, token: str | None, params: dict | None = None): +def _get(path: str, token: str | None, params: dict | None = None) -> object: + """Send an authenticated GET request to the GitHub REST API. + + Args: + path: API path relative to API_BASE, e.g. "/repos/owner/repo/issues". + token: Personal access token. When ``None`` requests are unauthenticated + and subject to a 60 req/hour rate limit. + params: Optional query-string parameters. + + Returns: + The parsed JSON response body. + + Raises: + urllib.error.HTTPError: When the server returns a 4xx or 5xx status. + """ url = f"{API_BASE}{path}" if params: url += "?" + urllib.parse.urlencode(params) @@ -200,13 +238,28 @@ def _get(path: str, token: str | None, params: dict | None = None): def fetch_tool_names(token: str | None) -> list[str]: + """Return the sorted list of tool folder names from the source tree. + + Queries the GitHub Contents API for the sub-directories of TOOL_FOLDER_PATH. + Each directory name corresponds to a tool and is also its default issue label. + Returns an empty list and prints a warning if the request fails. + + Args: + token: GitHub personal access token. + """ try: entries = _get(f"/repos/{REPO}/contents/{TOOL_FOLDER_PATH}", token) - return sorted(e["name"] for e in entries if isinstance(e, dict) and e.get("type") == "dir") + return sorted( + e["name"] for e in entries + if isinstance(e, dict) and e.get("type") == "dir" + ) except urllib.error.HTTPError as exc: hint = "" if token else " Set GITHUB_TOKEN to avoid rate limiting." - print(f"WARNING: Could not fetch tool list ({exc.code} {exc.reason}). " - f"Only commandlet sections will be generated.{hint}", file=sys.stderr) + print( + f"WARNING: Could not fetch tool list ({exc.code} {exc.reason}). " + f"Only commandlet sections will be generated.{hint}", + file=sys.stderr, + ) return [] except Exception as exc: print(f"WARNING: Could not fetch tool list ({exc}).", file=sys.stderr) @@ -214,10 +267,21 @@ def fetch_tool_names(token: str | None) -> list[str]: def fetch_all_issues(token: str | None, state: str = "open") -> list[dict]: + """Fetch all non-pull-request issues from the repository with pagination. + + Args: + token: GitHub personal access token. + state: Issue state filter — ``"open"`` or ``"all"``. + + Returns: + A flat list of issue objects as returned by the GitHub API. + """ issues, page = [], 1 while True: - batch = _get(f"/repos/{REPO}/issues", token, - {"state": state, "per_page": 100, "page": page}) + batch = _get( + f"/repos/{REPO}/issues", token, + {"state": state, "per_page": 100, "page": page}, + ) if not isinstance(batch, list) or not batch: break issues.extend(i for i in batch if "pull_request" not in i) @@ -230,10 +294,18 @@ def fetch_all_issues(token: str | None, state: str = "open") -> list[dict]: # ─── Issue classification ───────────────────────────────────────────────────── def label_names(issue: dict) -> set[str]: + """Return the set of label name strings attached to an issue.""" return {lbl["name"] for lbl in issue.get("labels", [])} def is_bug(issue: dict, labels: set[str]) -> bool: + """Return True if the issue is classified as a bug. + + Detection priority: + 1. GitHub issue type field (``issue["type"]["name"]``). + 2. Legacy ``"bug"`` label, predating GitHub issue types. + 3. ``"blocker"`` label — implies a severe bug by definition. + """ t = issue.get("type") if isinstance(t, dict) and t.get("name") in BUG_TYPE_NAMES: return True @@ -241,16 +313,34 @@ def is_bug(issue: dict, labels: set[str]) -> bool: def is_blocker(labels: set[str]) -> bool: + """Return True if the issue carries the ``"blocker"`` label.""" return BLOCKER_LABEL in labels def os_keys_for_issue(labels: set[str]) -> list[str]: - """OS-specific → that OS only. No OS label → all platforms.""" + """Return the OS keys an issue applies to. + + Issues labelled with a specific OS (e.g. ``"windows"``) are scoped to that + OS only. Issues without any OS label are treated as cross-platform and + return all keys from OS_ORDER. + """ found = [k for k, lbl in OS_LABELS.items() if lbl in labels] return found if found else list(OS_ORDER) def topic_matches(labels: set[str], known: set[str]) -> list[str]: + """Return the canonical topic keys matched by the given label set. + + Checks both exact matches against ``known`` and indirect matches via + LABEL_ALIASES, enabling non-standard label names to map to canonical keys. + + Args: + labels: Label names attached to an issue. + known: Canonical key set to match against (tool keys or commandlet keys). + + Returns: + Sorted list of matching canonical keys. + """ matched: set[str] = set() for lbl in labels: if lbl in known: @@ -262,20 +352,36 @@ def topic_matches(labels: set[str], known: set[str]) -> list[str]: # ─── Data model ─────────────────────────────────────────────────────────────── -# IssueRef: (number, title, url, is_bug, is_blocker, os_keys) -# os_keys is the list of OS keys this issue applies to (for display tagging) +#: Immutable record for a classified issue. +#: Fields: (number, title, url, is_bug, is_blocker, os_keys) IssueRef = tuple[int, str, str, bool, bool, list[str]] def classify_issues( issues: list[dict], tool_keys: set[str], - commandlet_keys: set[str], + cmd_keys: set[str], ) -> tuple[ - dict[str, dict[str, list[IssueRef]]], # tool_data[os_key][topic] - dict[str, dict[str, list[IssueRef]]], # cmd_data[os_key][topic] - list[dict], # unassigned + dict[str, dict[str, list[IssueRef]]], + dict[str, dict[str, list[IssueRef]]], + list[dict], ]: + """Classify every issue into tool data, commandlet data, or unassigned. + + An issue may match multiple topics and multiple OS sections simultaneously. + Issues without an OS label are inserted into every OS bucket. + + Args: + issues: Raw issue objects from the GitHub API. + tool_keys: Canonical tool key set used for label matching. + cmd_keys: Canonical commandlet key set used for label matching. + + Returns: + A three-tuple of: + - ``tool_data[os_key][topic]`` — IssueRef lists for tool rows + - ``cmd_data[os_key][topic]`` — IssueRef lists for commandlet rows + - ``unassigned`` — issues that matched no known topic + """ tool_data: dict = defaultdict(lambda: defaultdict(list)) cmd_data: dict = defaultdict(lambda: defaultdict(list)) unassigned: list[dict] = [] @@ -285,249 +391,508 @@ def classify_issues( bug = is_bug(issue, labels) blocker = is_blocker(labels) os_keys = os_keys_for_issue(labels) - ref: IssueRef = (issue["number"], issue["title"], issue["html_url"], bug, blocker, os_keys) + ref: IssueRef = ( + issue["number"], issue["title"], issue["html_url"], bug, blocker, os_keys + ) + t_hits = topic_matches(labels, tool_keys) + c_hits = topic_matches(labels, cmd_keys) - t_matches = topic_matches(labels, tool_keys) - c_matches = topic_matches(labels, commandlet_keys) - - if not t_matches and not c_matches: + if not t_hits and not c_hits: unassigned.append(issue) continue - for os_key in os_keys: - for t in t_matches: - tool_data[os_key][t].append(ref) - for c in c_matches: - cmd_data[os_key][c].append(ref) + for ok in os_keys: + for t in t_hits: + tool_data[ok][t].append(ref) + for c in c_hits: + cmd_data[ok][c].append(ref) return dict(tool_data), dict(cmd_data), unassigned -# ─── Rendering helpers ──────────────────────────────────────────────────────── +# ─── AsciiDoc rendering helpers ─────────────────────────────────────────────── + +def _safe(text: str, max_len: int = 72) -> str: + """Sanitise text for use inside an AsciiDoc table cell. -def _safe(text: str, max_len: int = 70) -> str: + Replaces pipe characters (which would break cell boundaries) and newlines, + then truncates to ``max_len`` characters, appending an ellipsis if needed. + """ s = text.replace("|", "-").replace("\n", " ") - return s[:max_len] + ("…" if len(s) > max_len else "") + return s[:max_len] + (" \u2026" if len(s) > max_len else "") + + +def _severity_label(bug: bool, blocker: bool) -> str: + """Return the human-readable severity label for a given bug/blocker pair.""" + if blocker: return "Blocker" + if bug: return "Bug" + return "Enhancement" -def issue_icon(bug: bool, blocker: bool) -> str: +def _severity_icon(bug: bool, blocker: bool) -> str: + """Return the status emoji for a given bug/blocker pair.""" if blocker: return "🚨" if bug: return "🔴" return "🟡" -def status_symbol(refs: list[IssueRef]) -> str: - if not refs: return "🟢" - if any(r[4] for r in refs): return "🚨" - if any(r[3] for r in refs): return "🔴" - return "🟡" +def _status_cell(refs: list[IssueRef]) -> str: + """Return the worst-case status cell string for a list of issue refs. + + Evaluates blockers before bugs before enhancements, so a single blocker + in an otherwise green component produces ``"🚨 Blocker"``. + """ + if not refs: return "🟢 OK" + if any(r[4] for r in refs): return "🚨 Blocker" + if any(r[3] for r in refs): return "🔴 Bug" + return "🟡 Enhancement" + +def _issue_cell(refs: list[IssueRef]) -> str: + """Format a list of issue refs as an AsciiDoc line-break-separated cell. -def fmt_issues_cell(lbl: str, data: dict[str, dict[str, list[IssueRef]]]) -> str: + Entries are sorted by severity descending (blocker → bug → enhancement), + then by issue number ascending. Each entry renders as: + `` link:[#N] `` """ - Collect all issues for `lbl` across all OS, deduplicate, and format as: - icon link:#N[#N] `os-tag` Title snippet - Issues that apply to all OS get no tag. OS-specific ones get a short tag. - Issues are sorted: blockers first, then bugs, then enhancements; by number within each group. + if not refs: + return "—" + + def _sort_key(r: IssueRef) -> tuple: + return (0 if r[4] else 1 if r[3] else 2, r[0]) + + parts = [ + f"{_severity_icon(bug, blocker)} link:{url}[#{num}] {_safe(title)}" + for num, title, url, bug, blocker, _ in sorted(refs, key=_sort_key) + ] + return " +\n".join(parts) + + +# ─── Section renderers ──────────────────────────────────────────────────────── + +def _bugs_all_platforms_section( + tool_data: dict, + cmd_data: dict, + tool_disp: dict[str, str], + cmd_disp: dict[str, str], + unassigned: list[dict], +) -> str: + """Render the global Bugs and Blockers section. + + Collects every bug and blocker from tool_data and cmd_data across all OS + buckets, then deduplicates by issue number so each issue appears once. + Also includes any bugs or blockers from the unassigned list (e.g. issues + labelled only ``"blocker"`` without a tool or commandlet label). + + Enhancements are excluded; they belong in the per-OS and commandlet tables. + + Columns: Issue | Severity | Component | Summary | Win | Linux | macOS + Rows sorted: blockers first, then bugs, both ascending by issue number. + + Args: + tool_data: Classified tool issue data from :func:`classify_issues`. + cmd_data: Classified commandlet issue data from :func:`classify_issues`. + tool_disp: Mapping of tool key to display name. + cmd_disp: Mapping of commandlet key to display name. + unassigned: Issues that matched no known topic. """ - seen: dict[int, IssueRef] = {} - for os_key in OS_ORDER: - for ref in data.get(os_key, {}).get(lbl, []): - if ref[0] not in seen: - seen[ref[0]] = ref + seen: dict[int, tuple[str, str, IssueRef]] = {} + + for lbl, disp in tool_disp.items(): + for ok in OS_ORDER: + for ref in tool_data.get(ok, {}).get(lbl, []): + if (ref[3] or ref[4]) and ref[0] not in seen: + seen[ref[0]] = ("Tool", disp, ref) + + for lbl, disp in cmd_disp.items(): + for ok in OS_ORDER: + for ref in cmd_data.get(ok, {}).get(lbl, []): + if (ref[3] or ref[4]) and ref[0] not in seen: + seen[ref[0]] = ("Commandlet", disp, ref) + + for issue in unassigned: + lbls = {lbl["name"] for lbl in issue.get("labels", [])} + bug = is_bug(issue, lbls) + blocker = is_blocker(lbls) + if not (bug or blocker): + continue + num = issue["number"] + if num in seen: + continue + os_keys = os_keys_for_issue(lbls) + ref: IssueRef = (num, issue["title"], issue["html_url"], bug, blocker, os_keys) + seen[num] = ("\u2014", "Unassigned", ref) + + blocker_count = sum(1 for _, _, r in seen.values() if r[4]) + bug_count = len(seen) - blocker_count + + lines: list[str] = [ + "== Bugs and Blockers\n", + f"All open bugs and blockers across all platforms — " + f"{blocker_count} blocker(s), {bug_count} bug(s).\n", + "NOTE: Issues without an OS label are cross-platform and marked with a " + "checkmark in every OS column.\n", + ] if not seen: - return "-" + lines.append("_No open bugs or blockers._ \U0001f389\n") + return "\n".join(lines) - def sort_key(r: IssueRef): - return (0 if r[4] else 1 if r[3] else 2, r[0]) + lines += [ + '[%header, cols="^1,^2,3,4,^1,^1,^1"]', + "|===", + "| # | Severity | Component | Summary | Win | Linux | macOS", + ] + + def _row_sort(item: tuple) -> tuple: + _, _, ref = item + return (0 if ref[4] else 1, ref[0]) + + for _, (_, disp, ref) in sorted(seen.items(), key=lambda x: _row_sort(x[1])): + num, title, url, bug, blocker, ref_os = ref + sev = f"{_severity_icon(bug, blocker)} {_severity_label(bug, blocker)}" + os_checks = ["✓" if ok in ref_os else "—" for ok in OS_ORDER] + lines += [ + f"| link:{url}[#{num}]", + f"| {sev}", + f"| {disp}", + f"| {_safe(title)}", + *[f"| {c}" for c in os_checks], + "", + ] + + lines.append("|===\n") + return "\n".join(lines) - parts = [] + +def _commandlets_global_table(cmd_data: dict) -> str: + """Render the single cross-OS Commandlets and Core Features section. + + Issue refs from all OS buckets are merged and deduplicated per commandlet + so that each issue appears only once. Issues specific to a single OS carry + a platform tag in brackets (e.g. ``[win]``); cross-platform issues carry + no tag. Rows are grouped by functional category; components with no open + issues are omitted. + + Args: + cmd_data: Classified commandlet issue data from :func:`classify_issues`. + """ all_os = set(OS_ORDER) - for ref in sorted(seen.values(), key=sort_key): - num, title, url, bug, blocker, ref_os_keys = ref - icon = issue_icon(bug, blocker) - tag = "" if set(ref_os_keys) == all_os else " `" + "/".join(OS_SHORT[k] for k in ref_os_keys) + "`" - parts.append(f"{icon} link:{url}[#{num}]{tag} {_safe(title)}") + N = 3 - return " +\n".join(parts) + lines = [ + "== Commandlets and Core Features", + "", + "NOTE: Components with no open issues are omitted. " + "OS-specific issues are tagged with their platform in brackets.", + "", + '[%header, cols="3,^2,7"]', + "|===", + "| Commandlet / Feature | Status | Issues", + ] + def _sort_key(r: IssueRef) -> tuple: + return (0 if r[4] else 1 if r[3] else 2, r[0]) + + for cat_name, keys in COMMANDLET_CATEGORIES: + cat_rows = [] + for key in keys: + if key not in CMD_DISPLAY: + continue + merged: dict[int, IssueRef] = {} + for ok in OS_ORDER: + for ref in cmd_data.get(ok, {}).get(key, []): + if ref[0] not in merged: + merged[ref[0]] = ref + if merged: + cat_rows.append((key, list(merged.values()))) + + if not cat_rows: + continue + + lines += ["", f"{N}+^h| {cat_name}"] + for key, refs in cat_rows: + parts = [] + for r in sorted(refs, key=_sort_key): + num, title, url, bug, blocker, ref_os = r + icon = _severity_icon(bug, blocker) + os_tag = ( + "" if set(ref_os) == all_os + else " [" + "/".join(OS_SHORT[k] for k in ref_os) + "]" + ) + parts.append(f"{icon} link:{url}[#{num}]{os_tag} {_safe(title)}") + lines += [ + f"| {CMD_DISPLAY[key]}", + f"| {_status_cell(refs)}", + f"| {' +' + chr(10) + ''.join(parts[0:1]) if len(parts) == 1 else (' +' + chr(10)).join(parts)}", + "", + ] + + lines += ["|===", ""] + return "\n".join(lines) -# ─── AsciiDoc section builders ──────────────────────────────────────────────── -def _cross_os_table( - heading: str, +def _os_status_table( + section_heading: str, + categories: list[tuple[str, list[str]]], + display_map: dict[str, str], + os_data: dict[str, list[IssueRef]], col_header: str, - rows: list[tuple[str, str]], - data: dict[str, dict[str, list[IssueRef]]], - level: int = 2, + grouped: bool = True, ) -> list[str]: + """Render a status table for one OS section. + + Columns: Component | Status | Issues. + Components with no open issues are omitted; a note above the table states + this explicitly. + + Args: + section_heading: AsciiDoc heading text for the sub-section. + categories: Ordered category/key groupings from TOOL_CATEGORIES or + COMMANDLET_CATEGORIES. + display_map: Mapping of canonical key to display name. + os_data: ``{topic: [IssueRef]}`` for the target OS. + col_header: Header label for the first column. + grouped: When ``True``, emit spanning category header rows between + groups (suitable for commandlets). When ``False``, flatten + all rows and sort alphabetically by display name (suitable + for tools). """ - Single table with columns: Name | Win | Linux | macOS | Issues. - Only rows with at least one non-green OS cell are emitted. - """ - h = "=" * level - lines = [ - f"{h} {heading}\n", - '[cols="2,1,1,1,6", options="header"]', + N = 3 + lines: list[str] = [ + f"=== {section_heading}\n", + "NOTE: Components with no open issues are omitted from this table.\n", + '[%header, cols="3,^2,7"]', "|===", - f"| {col_header} | Win | Linux | macOS | Issues", + f"| {col_header} | Status | Issues", ] - any_row = False - for lbl, disp in rows: - cells = [status_symbol(data.get(ok, {}).get(lbl, [])) for ok in OS_ORDER] - if all(c == "🟢" for c in cells): - continue - any_row = True - lines += [ - f"| {disp}", - *[f"| {c}" for c in cells], - f"| {fmt_issues_cell(lbl, data)}", - "", - ] - if not any_row: - lines.append("| _No open issues_ | | | |\n") + + if not grouped: + flat = sorted( + ( + (key, display_map[key]) + for cat_keys in (k for _, k in categories) + for key in cat_keys + if key in display_map + ), + key=lambda x: x[1].lower(), + ) + for key, disp in flat: + refs = os_data.get(key, []) + if refs: + lines += [f"| {disp}", f"| {_status_cell(refs)}", f"| {_issue_cell(refs)}", ""] + else: + for cat_name, keys in categories: + cat_rows = [ + (k, os_data.get(k, [])) + for k in keys + if k in display_map and os_data.get(k) + ] + if not cat_rows: + continue + lines.append(f"\n{N}+^h| {cat_name}") + for key, refs in cat_rows: + lines += [f"| {display_map[key]}", f"| {_status_cell(refs)}", f"| {_issue_cell(refs)}", ""] + lines.append("|===\n") return lines -def _summary_section( - tool_data: dict, - cmd_data: dict, - tool_rows: list[tuple[str, str]], - cmd_rows: list[tuple[str, str]], -) -> str: - """Active blockers table (deduplicated across OS) + compact status legend.""" - lines = ["== Summary\n"] - - # Collect unique blockers - seen_ids: set[int] = set() - blockers: list[tuple[str, str, IssueRef]] = [] - for registry_rows, data, cat in ((tool_rows, tool_data, "Tool"), - (cmd_rows, cmd_data, "Commandlet")): - for lbl, disp in registry_rows: - for os_key in OS_ORDER: - for ref in data.get(os_key, {}).get(lbl, []): - if ref[4] and ref[0] not in seen_ids: - seen_ids.add(ref[0]) - blockers.append((cat, disp, ref)) - - lines.append("=== 🚨 Active Blockers\n") - if blockers: - lines += [ - '[cols="1,2,1,5", options="header"]', - "|===", - "| Type | Tool / Commandlet | Issue | Title", - ] - for cat, disp, (num, title, url, *_rest) in sorted(blockers, key=lambda r: r[2][0]): - lines += [f"| {cat}", f"| {disp}", f"| link:{url}[#{num}]", f"| {_safe(title)}", ""] - lines.append("|===\n") - else: - lines.append("_No active blockers_ 🎉\n") +def _os_section(os_key: str, tool_data_for_os: dict[str, list[IssueRef]]) -> str: + """Render the Tools status section for one operating system. + + Generates a sub-heading with deduplicated issue counts and delegates to + :func:`_os_status_table` for the actual table. Commandlets are intentionally + excluded here; they are covered by the global :func:`_commandlets_global_table`. + Args: + os_key: One of the keys from OS_ORDER (``"windows"``, etc.). + tool_data_for_os: ``{topic: [IssueRef]}`` pre-filtered for this OS. + """ + os_name = OS_DISPLAY[os_key] + os_label = OS_LABELS[os_key] + + all_refs = {r[0]: r for refs in tool_data_for_os.values() for r in refs} + n_blockers = sum(1 for r in all_refs.values() if r[4]) + n_bugs = sum(1 for r in all_refs.values() if r[3] and not r[4]) + n_enhs = sum(1 for r in all_refs.values() if not r[3] and not r[4]) + + stat_str = ( + f"{n_blockers} blocker(s), {n_bugs} bug(s), {n_enhs} enhancement(s)" + if all_refs else "no open issues" + ) + + lines: list[str] = [ + f"== {os_name} Tools \u2014 {stat_str}\n", + f"Open issues labelled `{os_label}` or without any OS label " + f"(cross-platform issues appear in every OS section).\n", + ] + lines += _os_status_table( + "Tools", TOOL_CATEGORIES, TOOL_DISPLAY, tool_data_for_os, "Tool", + grouped=False, + ) return "\n".join(lines) def _unassigned_section(unassigned: list[dict]) -> str: - lines = [ + """Render the Unassigned Issues section. + + Lists every issue that matched no tool or commandlet label, including its + raw label set. This section guides maintainers in either adding labels to + the issues on GitHub or extending the registries in this script. + + Args: + unassigned: Issues collected by :func:`classify_issues`. + """ + lines: list[str] = [ "== Unassigned Issues\n", - f"{len(unassigned)} issue(s) matched no known tool or commandlet. " - "Add the appropriate label on GitHub or extend `TOOLS`/`COMMANDLETS` " - "in this script.\n", + f"{len(unassigned)} issue(s) matched no known tool or commandlet label. " + "Apply the appropriate label on GitHub, or add an entry to ``TOOLS``, " + "``COMMANDLETS``, or their ``labels`` list in this script.\n", ] if not unassigned: - lines.append("_All issues are assigned._ 🎉\n") + lines.append("_All issues are assigned._\n") return "\n".join(lines) - lines += ['[cols="1,4,3", options="header"]', "|===", "| # | Title | Labels"] + + lines += ['[%header, cols="^1,4,3"]', "|===", "| Issue | Summary | Labels"] for issue in sorted(unassigned, key=lambda i: i["number"]): - lbls = ", ".join(l["name"] for l in issue.get("labels", [])) + lbls = ", ".join(lbl["name"] for lbl in issue.get("labels", [])) lines += [ f"| link:{issue['html_url']}[#{issue['number']}]", f"| {_safe(issue['title'])}", - f"| {lbls or '—'}", + f"| {lbls or '\u2014'}", "", ] lines.append("|===\n") return "\n".join(lines) -# ─── Header & document assembly ─────────────────────────────────────────────── +# ─── Document header template ───────────────────────────────────────────────── _HEADER = """\ -= Quality Status += IDEasy Quality Status :toc: left -:toclevels: 2 +:toclevels: 3 :icons: font :source-highlighter: rouge +:nofooter: == Overview -Automatically generated quality and support status for https://github.com/{repo}[{repo}]. -Tool list is discovered dynamically from the source tree. +Automatically generated quality and support status for +https://github.com/{repo}[{repo}]. +The tool list is discovered from the source tree at +`{tool_path}`. -*OS behaviour:* Issues labelled with a specific OS appear only in that OS column. -Issues with *no OS label* are cross-platform and count toward every OS column (no tag shown). +NOTE: Issues without an OS label are treated as cross-platform and appear in +every OS section. Issues with a specific OS label appear only in that +OS section. -[cols="1,1,1,1,1", options="header"] +.Severity Legend +[%header, cols="^1,^2,5"] |=== -| 🟢 | 🟡 | 🔴 | 🚨 | Issue icon -| No issues | Enhancements only | Bug(s) | Blocker | 🟡 enhancement · 🔴 bug · 🚨 blocker +| Icon | Severity | Description + +| 🚨 | Blocker | Fully prevents users from working; must be fixed immediately +| 🔴 | Bug | Confirmed defect with functional impact +| 🟡 | Enhancement | Feature request, improvement, or task (no functional breakage) +| 🟢 | OK | No open issues |=== -_Generated: {date} · {total} issues · {matched} assigned · {unassigned} unassigned_ +.Issue Statistics +[%header, cols="2,^1,^1,^1,^1"] +|=== +| Scope | Total | Blockers | Bugs | Enhancements + +| All platforms (deduplicated) | {total} | {n_blockers} | {n_bugs} | {n_enhs} +| Unassigned (no label match) | {unassigned} | — | — | — +|=== + +_Generated: {date}_ """ +# ─── Document assembly ──────────────────────────────────────────────────────── + def generate_adoc(issues: list[dict], tool_names: list[str]) -> str: - # Merge API-fetched names with statically registered TOOLS so that tools - # present in the registry but not (yet) in the url-updater source tree - # (e.g. git, kubectl) are still recognised and shown. - all_tool_names = sorted(set(tool_names) | set(TOOLS.keys())) - tool_rows: list[tuple[str, str]] = [ - (n, TOOL_DISPLAY_OVERRIDES.get(n, n.replace("-", " ").title())) - for n in all_tool_names - ] - cmd_rows: list[tuple[str, str]] = [ - (n, COMMANDLET_DISPLAY_OVERRIDES[n]) for n in COMMANDLETS - ] + """Assemble and return the complete AsciiDoc quality-status document. - tool_keys = {r[0] for r in tool_rows} # merged fetched + static - commandlet_keys = {r[0] for r in cmd_rows} - tool_data, cmd_data, unassigned = classify_issues(issues, tool_keys, commandlet_keys) + Merges the dynamically fetched tool folder names with the statically + registered TOOLS entries so that tools present in the registry but absent + from the source tree (e.g. ``git``, ``rancher``) are still recognised. - date = datetime.now(timezone.utc).strftime("%Y-%m-%d %H:%M UTC") - header = _HEADER.format( - repo=REPO, date=date, - total=len(issues), matched=len(issues) - len(unassigned), unassigned=len(unassigned), - ) + Args: + issues: Raw issue objects from :func:`fetch_all_issues`. + tool_names: Tool folder names from :func:`fetch_tool_names`. - parts = [header] - parts.append(_summary_section(tool_data, cmd_data, tool_rows, cmd_rows)) - parts += _cross_os_table("Tools", "Tool", tool_rows, tool_data, level=2) - parts += _cross_os_table("Commandlets & Core Features", "Commandlet / Feature", - cmd_rows, cmd_data, level=2) - parts.append(_unassigned_section(unassigned)) - parts.append("""\ -== How to Contribute + Returns: + The rendered AsciiDoc document as a string. + """ + tool_keys = set(tool_names) | set(TOOLS.keys()) + cmd_keys = set(COMMANDLETS.keys()) -*New tool:* Automatic once a folder exists under `url-updater/.../url/tool/` and issues use that name as label. -Override the display name in `TOOLS["display"]`. + tool_data, cmd_data, unassigned = classify_issues(issues, tool_keys, cmd_keys) -*New commandlet:* Add an entry to `COMMANDLETS` — key = GitHub label, `"display"` = name, `"labels"` = aliases. + seen_refs: dict[int, IssueRef] = {} + for ok in OS_ORDER: + for refs in (*tool_data.get(ok, {}).values(), *cmd_data.get(ok, {}).values()): + for r in refs: + if r[0] not in seen_refs: + seen_refs[r[0]] = r -*Non-standard label:* Add it to the `"labels"` list of the matching `TOOLS` or `COMMANDLETS` entry. -Unmatched issues appear in the *Unassigned Issues* section. -""") + n_blockers = sum(1 for r in seen_refs.values() if r[4]) + n_bugs = sum(1 for r in seen_refs.values() if r[3] and not r[4]) + n_enhs = sum(1 for r in seen_refs.values() if not r[3] and not r[4]) - return "\n".join(parts) + header = _HEADER.format( + repo=REPO, + tool_path=TOOL_FOLDER_PATH, + date=datetime.now(timezone.utc).strftime("%Y-%m-%d %H:%M UTC"), + total=len(seen_refs), + n_blockers=n_blockers, + n_bugs=n_bugs, + n_enhs=n_enhs, + unassigned=len(unassigned), + ) + + parts = [ + header, + _bugs_all_platforms_section(tool_data, cmd_data, TOOL_DISPLAY, CMD_DISPLAY, unassigned), + _commandlets_global_table(cmd_data), + *[_os_section(ok, tool_data.get(ok, {})) for ok in OS_ORDER], + _unassigned_section(unassigned), + f"""\ +== How to Contribute +=== Adding a new tool +Once a folder is added under `{TOOL_FOLDER_PATH}` and issues use that folder +name as a label, the tool appears automatically in the next generated document. +Override the display name by adding an entry to ``TOOLS`` in this script. + +=== Adding a new commandlet or core feature +Add an entry to ``COMMANDLETS``: key = GitHub label, ``display`` = name, +``labels`` = list of alternative label names. Add the key to the appropriate +category in ``COMMANDLET_CATEGORIES``. + +=== Mapping a non-standard label +Add the label to the ``labels`` list of the matching ``TOOLS`` or +``COMMANDLETS`` entry. Issues that still match nothing appear in the +*Unassigned Issues* section. +""", + ] + return "\n".join(parts) -# ─── Main ───────────────────────────────────────────────────────────────────── def main() -> None: - parser = argparse.ArgumentParser(description=f"Generate quality-status.adoc for {REPO}") - parser.add_argument("--token", default=os.environ.get("GITHUB_TOKEN")) + """Parse command-line arguments, fetch data, and write the output file.""" + parser = argparse.ArgumentParser( + description=f"Generate quality-status.adoc for {REPO}", + ) + parser.add_argument( + "--token", default=os.environ.get("GITHUB_TOKEN"), + help="GitHub personal access token (or set the GITHUB_TOKEN env var)", + ) parser.add_argument("--output", default="quality-status.adoc") parser.add_argument("--state", default="open", choices=["open", "all"]) args = parser.parse_args() @@ -535,10 +900,12 @@ def main() -> None: if not args.token: print("WARNING: No GITHUB_TOKEN — rate-limited to 60 req/hour.", file=sys.stderr) - print("Fetching tool list ...", file=sys.stderr) + print("Fetching tool list from source tree ...", file=sys.stderr) tool_names = fetch_tool_names(args.token) - print(f" {len(tool_names)} tools found." if tool_names - else " No tools found — check token and network.", file=sys.stderr) + if tool_names: + print(f" {len(tool_names)} tools found: {', '.join(tool_names)}", file=sys.stderr) + else: + print(" No tools found — check token and network.", file=sys.stderr) print(f"Fetching {args.state} issues from {REPO} ...", file=sys.stderr) try: @@ -548,19 +915,22 @@ def main() -> None: sys.exit(1) print(f" {len(issues)} issues loaded.", file=sys.stderr) - # Merge fetched names with statically registered TOOLS (same logic as generate_adoc) tool_keys = set(tool_names) | set(TOOLS.keys()) - commandlet_keys = set(COMMANDLETS.keys()) - _, _, unassigned = classify_issues(issues, tool_keys, commandlet_keys) + cmd_keys = set(COMMANDLETS.keys()) + _, _, unassigned = classify_issues(issues, tool_keys, cmd_keys) matched = len(issues) - len(unassigned) pct = f" ({matched / len(issues) * 100:.1f}%)" if issues else "" print(f" {matched} assigned{pct}, {len(unassigned)} unassigned.", file=sys.stderr) - all_known = tool_keys | commandlet_keys | set(LABEL_ALIASES) - all_labels = {l["name"] for i in issues for l in i.get("labels", [])} + all_known = tool_keys | cmd_keys | set(LABEL_ALIASES) + all_labels = {lbl["name"] for issue in issues for lbl in issue.get("labels", [])} unmatched = all_labels - all_known - _SKIP_LABELS if unmatched: - print(f" Unmatched labels: {', '.join(sorted(unmatched))}", file=sys.stderr) + print( + f" Labels with no mapping (consider adding to TOOLS/COMMANDLETS): " + f"{', '.join(sorted(unmatched))}", + file=sys.stderr, + ) adoc = generate_adoc(issues, tool_names) with open(args.output, "w", encoding="utf-8") as fh: diff --git a/documentation/quality-status.adoc b/documentation/quality-status.adoc index bb7d9cc1f6..59aea81b2c 100644 --- a/documentation/quality-status.adoc +++ b/documentation/quality-status.adoc @@ -1,121 +1,1001 @@ -= Quality Status += IDEasy Quality Status :toc: left -:toclevels: 2 +:toclevels: 3 :icons: font :source-highlighter: rouge +:nofooter: == Overview -Automatically generated quality and support status for https://github.com/devonfw/IDEasy[devonfw/IDEasy]. -Tool list is discovered dynamically from the source tree. +Automatically generated quality and support status for +https://github.com/devonfw/IDEasy[devonfw/IDEasy]. +The tool list is discovered from the source tree at +`cli/src/main/java/com/devonfw/tools/ide/tool`. -*OS behaviour:* Issues labelled with a specific OS appear only in that OS column. -Issues with *no OS label* are cross-platform and count toward every OS column (no tag shown). +NOTE: Issues without an OS label are treated as cross-platform and appear in +every OS section. Issues with a specific OS label appear only in that +OS section. -[cols="1,1,1,1,1", options="header"] +.Severity Legend +[%header, cols="^1,^2,5"] |=== -| 🟢 | 🟡 | 🔴 | 🚨 | Issue icon -| No issues | Enhancements only | Bug(s) | Blocker | 🟡 enhancement · 🔴 bug · 🚨 blocker +| Icon | Severity | Description + +| 🚨 | Blocker | Fully prevents users from working; must be fixed immediately +| 🔴 | Bug | Confirmed defect with functional impact +| 🟡 | Enhancement | Feature request, improvement, or task (no functional breakage) +| 🟢 | OK | No open issues +|=== + +.Issue Statistics +[%header, cols="2,^1,^1,^1,^1"] +|=== +| Scope | Total | Blockers | Bugs | Enhancements + +| All platforms (deduplicated) | 137 | 1 | 57 | 79 +| Unassigned (no label match) | 49 | — | — | — +|=== + +_Generated: 2026-05-06 11:55 UTC_ + + +== Bugs and Blockers + +All open bugs and blockers across all platforms — 1 blocker(s), 66 bug(s). + +NOTE: Issues without an OS label are cross-platform and marked with a checkmark in every OS column. + +[%header, cols="^1,^2,3,4,^1,^1,^1"] +|=== +| # | Severity | Component | Summary | Win | Linux | macOS +| link:https://github.com/devonfw/IDEasy/issues/1134[#1134] +| 🚨 Blocker +| Shell completion +| IDEasy autocompletion gets stuck if license agreement file was not found +| ✓ +| ✓ +| ✓ + +| link:https://github.com/devonfw/IDEasy/issues/44[#44] +| 🔴 Bug +| Docker +| DockerUrlUpdater not finding/adding specific versions +| ✓ +| ✓ +| ✓ + +| link:https://github.com/devonfw/IDEasy/issues/120[#120] +| 🔴 Bug +| IntelliJ IDEA +| intellij does not use our settings when we create a new project within i … +| ✓ +| ✓ +| ✓ + +| link:https://github.com/devonfw/IDEasy/issues/378[#378] +| 🔴 Bug +| Unassigned +| Missing comprehensive "Getting started guide" causing fail in getting st … +| ✓ +| ✓ +| ✓ + +| link:https://github.com/devonfw/IDEasy/issues/551[#551] +| 🔴 Bug +| Shell completion +| Autocompletion and list-versions make OS-agnostic suggestions +| ✓ +| ✓ +| ✓ + +| link:https://github.com/devonfw/IDEasy/issues/594[#594] +| 🔴 Bug +| Maven +| Still windows file locking problems +| ✓ +| — +| — + +| link:https://github.com/devonfw/IDEasy/issues/611[#611] +| 🔴 Bug +| Unassigned +| Git pull on settings with local branch and without remote throws excepti … +| ✓ +| ✓ +| ✓ + +| link:https://github.com/devonfw/IDEasy/issues/690[#690] +| 🔴 Bug +| Download & Extraction +| UpdateUrls workflow timeout not working +| ✓ +| ✓ +| ✓ + +| link:https://github.com/devonfw/IDEasy/issues/717[#717] +| 🔴 Bug +| IntelliJ IDEA +| IDEasy does not start Intellij if license was not accepted +| ✓ +| ✓ +| ✓ + +| link:https://github.com/devonfw/IDEasy/issues/771[#771] +| 🔴 Bug +| Download & Extraction +| Check URL Updater issues +| ✓ +| ✓ +| ✓ + +| link:https://github.com/devonfw/IDEasy/issues/772[#772] +| 🔴 Bug +| Security / Credentials +| CVE-2023-7272 in org.eclipse.parsson 1.1.7 +| ✓ +| ✓ +| ✓ + +| link:https://github.com/devonfw/IDEasy/issues/795[#795] +| 🔴 Bug +| Unassigned +| Setup not working properly on Mac (and zsh) +| — +| — +| ✓ + +| link:https://github.com/devonfw/IDEasy/issues/796[#796] +| 🔴 Bug +| AWS CLI +| cannot install aws on Mac +| — +| — +| ✓ + +| link:https://github.com/devonfw/IDEasy/issues/798[#798] +| 🔴 Bug +| pgAdmin +| pgadmin not working on Mac +| — +| — +| ✓ + +| link:https://github.com/devonfw/IDEasy/issues/800[#800] +| 🔴 Bug +| SonarQube +| sonar not working on Mac +| — +| — +| ✓ + +| link:https://github.com/devonfw/IDEasy/issues/801[#801] +| 🔴 Bug +| npm +| npm not working on Mac +| — +| — +| ✓ + +| link:https://github.com/devonfw/IDEasy/issues/802[#802] +| 🔴 Bug +| Azure CLI +| az not working on Mac +| — +| ✓ +| ✓ + +| link:https://github.com/devonfw/IDEasy/issues/836[#836] +| 🔴 Bug +| Shell integration +| Exit is completed in wrong places +| ✓ +| ✓ +| ✓ + +| link:https://github.com/devonfw/IDEasy/issues/840[#840] +| 🔴 Bug +| Unassigned +| git fetch does not work with multiple remotes +| ✓ +| ✓ +| ✓ + +| link:https://github.com/devonfw/IDEasy/issues/854[#854] +| 🔴 Bug +| Unassigned +| Kubectl not working on linux +| — +| ✓ +| — + +| link:https://github.com/devonfw/IDEasy/issues/855[#855] +| 🔴 Bug +| Azure CLI +| ide az config not working +| ✓ +| ✓ +| ✓ + +| link:https://github.com/devonfw/IDEasy/issues/857[#857] +| 🔴 Bug +| Kotlin Compiler +| kotlinc bash does not get keyboard inputs +| ✓ +| ✓ +| ✓ + +| link:https://github.com/devonfw/IDEasy/issues/859[#859] +| 🔴 Bug +| Node.js +| node shell not starting +| ✓ +| ✓ +| ✓ + +| link:https://github.com/devonfw/IDEasy/issues/861[#861] +| 🔴 Bug +| pgAdmin +| install of pgadmin throws an IllegalStateException when the install wizz … +| ✓ +| ✓ +| ✓ + +| link:https://github.com/devonfw/IDEasy/issues/862[#862] +| 🔴 Bug +| VS Code +| vscode does not work on Mac +| — +| — +| ✓ + +| link:https://github.com/devonfw/IDEasy/issues/864[#864] +| 🔴 Bug +| AWS CLI +| AWS is not working on Mac x64 +| — +| — +| ✓ + +| link:https://github.com/devonfw/IDEasy/issues/865[#865] +| 🔴 Bug +| Azure CLI +| Az is not working on Mac x64 +| — +| — +| ✓ + +| link:https://github.com/devonfw/IDEasy/issues/867[#867] +| 🔴 Bug +| Rancher Desktop +| Docker (Rancher Desktop) not working on Linux +| — +| ✓ +| — + +| link:https://github.com/devonfw/IDEasy/issues/868[#868] +| 🔴 Bug +| Eclipse +| Eclipse does not work on Mac x64 +| — +| — +| ✓ + +| link:https://github.com/devonfw/IDEasy/issues/869[#869] +| 🔴 Bug +| GCViewer +| gcviewer logs errors on Mac X64 +| — +| — +| ✓ + +| link:https://github.com/devonfw/IDEasy/issues/878[#878] +| 🔴 Bug +| pgAdmin +| pgadmin does not work on Mac x64 +| — +| — +| ✓ + +| link:https://github.com/devonfw/IDEasy/issues/892[#892] +| 🔴 Bug +| Unassigned +| Improve GitContextTest tests to actually test something +| ✓ +| ✓ +| ✓ + +| link:https://github.com/devonfw/IDEasy/issues/897[#897] +| 🔴 Bug +| Download & Extraction +| HTTP Proxy with TLS termination causing errors +| ✓ +| ✓ +| ✓ + +| link:https://github.com/devonfw/IDEasy/issues/943[#943] +| 🔴 Bug +| Settings merger +| XmlMerger: Rework Combine Text Nodes +| ✓ +| ✓ +| ✓ + +| link:https://github.com/devonfw/IDEasy/issues/1041[#1041] +| 🔴 Bug +| IDEasy (general) +| native image has globbing active +| ✓ +| ✓ +| ✓ + +| link:https://github.com/devonfw/IDEasy/issues/1054[#1054] +| 🔴 Bug +| Core / Runtime +| Incorrect interpretation of trailling and leading spaces in version rang … +| ✓ +| ✓ +| ✓ + +| link:https://github.com/devonfw/IDEasy/issues/1063[#1063] +| 🔴 Bug +| Settings / Properties +| User specific configurations are not working as described +| ✓ +| ✓ +| ✓ + +| link:https://github.com/devonfw/IDEasy/issues/1124[#1124] +| 🔴 Bug +| Python +| Ensure latest version of Python is installed +| ✓ +| ✓ +| ✓ + +| link:https://github.com/devonfw/IDEasy/issues/1185[#1185] +| 🔴 Bug +| IDE Configuration Doc +| icd on mac does not work in zshell +| — +| — +| ✓ + +| link:https://github.com/devonfw/IDEasy/issues/1187[#1187] +| 🔴 Bug +| Eclipse +| Eclipse plugin installation on mac is not working +| — +| — +| ✓ + +| link:https://github.com/devonfw/IDEasy/issues/1206[#1206] +| 🔴 Bug +| Unassigned +| java.util.zip.ZipException when opening Android Studio archives from ver … +| ✓ +| ✓ +| ✓ + +| link:https://github.com/devonfw/IDEasy/issues/1227[#1227] +| 🔴 Bug +| ide install +| Guide windows user after installation +| ✓ +| — +| — + +| link:https://github.com/devonfw/IDEasy/issues/1232[#1232] +| 🔴 Bug +| ide install +| MSI Repair broken +| ✓ +| — +| — + +| link:https://github.com/devonfw/IDEasy/issues/1255[#1255] +| 🔴 Bug +| ide status +| ide status does not recognize snapshot version correctly +| ✓ +| ✓ +| ✓ + +| link:https://github.com/devonfw/IDEasy/issues/1263[#1263] +| 🔴 Bug +| Android Studio +| Fix android-studio workspace templates +| ✓ +| ✓ +| ✓ + +| link:https://github.com/devonfw/IDEasy/issues/1333[#1333] +| 🔴 Bug +| ide update +| Step 'Install or update software' already ended with false and now ended … +| ✓ +| ✓ +| ✓ + +| link:https://github.com/devonfw/IDEasy/issues/1352[#1352] +| 🔴 Bug +| VS Code +| VSCode WSL warning prompt blocking VSCode plugin installation +| — +| ✓ +| — + +| link:https://github.com/devonfw/IDEasy/issues/1391[#1391] +| 🔴 Bug +| Terraform +| bashrc messed with terraform completions +| ✓ +| ✓ +| ✓ + +| link:https://github.com/devonfw/IDEasy/issues/1456[#1456] +| 🔴 Bug +| ide uninstall +| Uninstall via Windows settings not working +| ✓ +| — +| — + +| link:https://github.com/devonfw/IDEasy/issues/1501[#1501] +| 🔴 Bug +| IntelliJ IDEA +| Starting intellij leads to error popup +| ✓ +| ✓ +| ✓ + +| link:https://github.com/devonfw/IDEasy/issues/1517[#1517] +| 🔴 Bug +| ide install +| IDEasy setup does not install Windows Terminal +| ✓ +| ✓ +| ✓ + +| link:https://github.com/devonfw/IDEasy/issues/1518[#1518] +| 🔴 Bug +| uv +| uv tools are installed globally +| ✓ +| ✓ +| ✓ + +| link:https://github.com/devonfw/IDEasy/issues/1548[#1548] +| 🔴 Bug +| ide update +| Windows file locking error on update with plugins +| ✓ +| — +| — + +| link:https://github.com/devonfw/IDEasy/issues/1579[#1579] +| 🔴 Bug +| git +| IDEasy uninstall after a failed MSI installation does not work +| ✓ +| — +| — + +| link:https://github.com/devonfw/IDEasy/issues/1634[#1634] +| 🔴 Bug +| Download & Extraction +| UrlUpdater creates error entries for HTTP status 200 +| ✓ +| ✓ +| ✓ + +| link:https://github.com/devonfw/IDEasy/issues/1659[#1659] +| 🔴 Bug +| Docker +| Global tools run tool while installation is running in background +| ✓ +| ✓ +| ✓ + +| link:https://github.com/devonfw/IDEasy/issues/1746[#1746] +| 🔴 Bug +| Shell integration +| ide shell broken +| ✓ +| ✓ +| ✓ + +| link:https://github.com/devonfw/IDEasy/issues/1775[#1775] +| 🔴 Bug +| Security / Credentials +| Validate and Fix CPE Vendor/Product Identifiers for All Tools +| ✓ +| ✓ +| ✓ + +| link:https://github.com/devonfw/IDEasy/issues/1787[#1787] +| 🔴 Bug +| Yarn +| tracking yarn versions broken +| ✓ +| ✓ +| ✓ + +| link:https://github.com/devonfw/IDEasy/issues/1808[#1808] +| 🔴 Bug +| IDE Configuration Doc +| icd is not navigating into single available workspace on icd -p project +| ✓ +| ✓ +| ✓ + +| link:https://github.com/devonfw/IDEasy/issues/1814[#1814] +| 🔴 Bug +| Settings / Properties +| IDEasy still reports updates for settings are available after any number … +| ✓ +| ✓ +| ✓ + +| link:https://github.com/devonfw/IDEasy/issues/1842[#1842] +| 🔴 Bug +| Shell integration +| Infinite completion of exit subcommand +| ✓ +| ✓ +| ✓ + +| link:https://github.com/devonfw/IDEasy/issues/1844[#1844] +| 🔴 Bug +| VS Code +| `ide install vscode` or `ide vscode` freezes at "installing plugins" ste … +| — +| ✓ +| — + +| link:https://github.com/devonfw/IDEasy/issues/1846[#1846] +| 🔴 Bug +| Unassigned +| Mac Gatekeeper workaround causing errors +| — +| — +| ✓ + +| link:https://github.com/devonfw/IDEasy/issues/1886[#1886] +| 🔴 Bug +| npm +| NpmBasedCommandlet shows wrong tool version after install +| ✓ +| ✓ +| ✓ + +| link:https://github.com/devonfw/IDEasy/issues/1892[#1892] +| 🔴 Bug +| GUI / IDE launcher +| pom.xml required for launching gui not included in release/native builds +| ✓ +| ✓ +| ✓ + +| link:https://github.com/devonfw/IDEasy/issues/1893[#1893] +| 🔴 Bug +| Unassigned +| Fix Failing Integration Tests workflow +| ✓ +| ✓ +| ✓ + +|=== + +== Commandlets and Core Features + +NOTE: Components with no open issues are omitted. OS-specific issues are tagged with their platform in brackets. + +[%header, cols="3,^2,7"] +|=== +| Commandlet / Feature | Status | Issues + +3+^h| Core Commands +| IDEasy (general) +| 🔴 Bug +| 🔴 link:https://github.com/devonfw/IDEasy/issues/1041[#1041] native image has globbing active + +🔴 link:https://github.com/devonfw/IDEasy/issues/1844[#1844] [Linux] `ide install vscode` or `ide vscode` freezes at "installing plugins" ste … + +🟡 link:https://github.com/devonfw/IDEasy/issues/19[#19] Implement ToolCommandlet for Google Cloud CLI + +🟡 link:https://github.com/devonfw/IDEasy/issues/703[#703] Support AWS CDK + +🟡 link:https://github.com/devonfw/IDEasy/issues/780[#780] Create IDEasy service + +🟡 link:https://github.com/devonfw/IDEasy/issues/825[#825] Consider adding GC Log Analyzer + +🟡 link:https://github.com/devonfw/IDEasy/issues/1457[#1457] Improve CLI error messages on invalid args or commandlets not available … + +🟡 link:https://github.com/devonfw/IDEasy/issues/1580[#1580] Implement cleanup + +🟡 link:https://github.com/devonfw/IDEasy/issues/1594[#1594] implement ReleaseCommandlet + +🟡 link:https://github.com/devonfw/IDEasy/issues/1821[#1821] Back up and restore user state before/after integration tests + +🟡 link:https://github.com/devonfw/IDEasy/issues/1867[#1867] Create Claude commandlet + +🟡 link:https://github.com/devonfw/IDEasy/issues/1868[#1868] Revision of the functionality of global tool commandlets + +| Core / Runtime +| 🔴 Bug +| 🔴 link:https://github.com/devonfw/IDEasy/issues/1041[#1041] native image has globbing active + +🔴 link:https://github.com/devonfw/IDEasy/issues/1054[#1054] Incorrect interpretation of trailling and leading spaces in version rang … + +🟡 link:https://github.com/devonfw/IDEasy/issues/871[#871] [macOS] Add progressbar to *.dmg extract process + +🟡 link:https://github.com/devonfw/IDEasy/issues/1512[#1512] [macOS] Cannot run Intellij on Mac due to file permission error + +| ide install +| 🔴 Bug +| 🔴 link:https://github.com/devonfw/IDEasy/issues/594[#594] [Win] Still windows file locking problems + +🔴 link:https://github.com/devonfw/IDEasy/issues/861[#861] install of pgadmin throws an IllegalStateException when the install wizz … + +🔴 link:https://github.com/devonfw/IDEasy/issues/1227[#1227] [Win] Guide windows user after installation + +🔴 link:https://github.com/devonfw/IDEasy/issues/1232[#1232] [Win] MSI Repair broken + +🔴 link:https://github.com/devonfw/IDEasy/issues/1517[#1517] IDEasy setup does not install Windows Terminal + +🔴 link:https://github.com/devonfw/IDEasy/issues/1518[#1518] uv tools are installed globally + +🔴 link:https://github.com/devonfw/IDEasy/issues/1579[#1579] [Win] IDEasy uninstall after a failed MSI installation does not work + +🔴 link:https://github.com/devonfw/IDEasy/issues/1659[#1659] Global tools run tool while installation is running in background + +🟡 link:https://github.com/devonfw/IDEasy/issues/377[#377] [macOS] Support Homebrew for installation on macOS + +🟡 link:https://github.com/devonfw/IDEasy/issues/421[#421] [Win] Allow installation of IDEasy via winget + +🟡 link:https://github.com/devonfw/IDEasy/issues/422[#422] [Win] Allow installation of IDEasy via Windows Store + +🟡 link:https://github.com/devonfw/IDEasy/issues/423[#423] [macOS] Create installer for MacOS + +🟡 link:https://github.com/devonfw/IDEasy/issues/703[#703] Support AWS CDK + +🟡 link:https://github.com/devonfw/IDEasy/issues/714[#714] Improve UX for settings repository + +🟡 link:https://github.com/devonfw/IDEasy/issues/1056[#1056] [Win] Add Conversion of LICENSE.adoc to RTF Format + +🟡 link:https://github.com/devonfw/IDEasy/issues/1102[#1102] [Win] IDEasy MSI installer not working (unsigned) + +🟡 link:https://github.com/devonfw/IDEasy/issues/1558[#1558] [Win] Add install.log path to msi installer window + +🟡 link:https://github.com/devonfw/IDEasy/issues/1694[#1694] Fix behavior when providing a wrong git URL + +🟡 link:https://github.com/devonfw/IDEasy/issues/1763[#1763] Improve installation/testing of SNAPSHOT releases + +🟡 link:https://github.com/devonfw/IDEasy/issues/1868[#1868] Revision of the functionality of global tool commandlets + +| ide uninstall +| 🔴 Bug +| 🔴 link:https://github.com/devonfw/IDEasy/issues/1456[#1456] [Win] Uninstall via Windows settings not working + +🟡 link:https://github.com/devonfw/IDEasy/issues/399[#399] Handle uninstall of global tool commandlets + +🟡 link:https://github.com/devonfw/IDEasy/issues/785[#785] Re-introduce workspace reverse options from devonfw-ide + +🟡 link:https://github.com/devonfw/IDEasy/issues/1868[#1868] Revision of the functionality of global tool commandlets + +🟡 link:https://github.com/devonfw/IDEasy/issues/1872[#1872] [Win] Implement generic uninstall implementation for global tools under window … + +| ide update +| 🔴 Bug +| 🔴 link:https://github.com/devonfw/IDEasy/issues/594[#594] [Win] Still windows file locking problems + +🔴 link:https://github.com/devonfw/IDEasy/issues/1333[#1333] Step 'Install or update software' already ended with false and now ended … + +🔴 link:https://github.com/devonfw/IDEasy/issues/1548[#1548] [Win] Windows file locking error on update with plugins + +🟡 link:https://github.com/devonfw/IDEasy/issues/639[#639] Improve step success logic for sub steps + +🟡 link:https://github.com/devonfw/IDEasy/issues/714[#714] Improve UX for settings repository + +🟡 link:https://github.com/devonfw/IDEasy/issues/945[#945] Improve ide update with smart dependency handling + +🟡 link:https://github.com/devonfw/IDEasy/issues/1694[#1694] Fix behavior when providing a wrong git URL + +| ide create-project +| 🟡 Enhancement +| 🟡 link:https://github.com/devonfw/IDEasy/issues/714[#714] Improve UX for settings repository + +🟡 link:https://github.com/devonfw/IDEasy/issues/1695[#1695] Clone settings to temporary directory, analyse, and then move + +| ide status +| 🔴 Bug +| 🔴 link:https://github.com/devonfw/IDEasy/issues/1255[#1255] ide status does not recognize snapshot version correctly + +🟡 link:https://github.com/devonfw/IDEasy/issues/1209[#1209] migration version message is confusing + +| Version management +| 🟡 Enhancement +| 🟡 link:https://github.com/devonfw/IDEasy/issues/1178[#1178] Revisit VersionPhase detection + +🟡 link:https://github.com/devonfw/IDEasy/issues/1868[#1868] Revision of the functionality of global tool commandlets + + +3+^h| Configuration +| Settings / Properties +| 🔴 Bug +| 🔴 link:https://github.com/devonfw/IDEasy/issues/1063[#1063] User specific configurations are not working as described + +🔴 link:https://github.com/devonfw/IDEasy/issues/1518[#1518] uv tools are installed globally + +🔴 link:https://github.com/devonfw/IDEasy/issues/1814[#1814] IDEasy still reports updates for settings are available after any number … + +🟡 link:https://github.com/devonfw/IDEasy/issues/449[#449] Consider integration of continue GenAI coding assistant + +🟡 link:https://github.com/devonfw/IDEasy/issues/714[#714] Improve UX for settings repository + +🟡 link:https://github.com/devonfw/IDEasy/issues/735[#735] Enhance workspace configuration with generic overlay from settings/works … + +🟡 link:https://github.com/devonfw/IDEasy/issues/785[#785] Re-introduce workspace reverse options from devonfw-ide + +🟡 link:https://github.com/devonfw/IDEasy/issues/930[#930] Refactor `JsonPrettyPrinter` to be usable in CustomToolJson + +🟡 link:https://github.com/devonfw/IDEasy/issues/987[#987] conditional templates + +🟡 link:https://github.com/devonfw/IDEasy/issues/989[#989] allow expressions in template variable definitions + +🟡 link:https://github.com/devonfw/IDEasy/issues/992[#992] Support multiple attributes for merge:id + +🟡 link:https://github.com/devonfw/IDEasy/issues/1214[#1214] preserve EOL style in upgrade-settings + +🟡 link:https://github.com/devonfw/IDEasy/issues/1676[#1676] Import extra SDKs automatically into IDE + +🟡 link:https://github.com/devonfw/IDEasy/issues/1694[#1694] Fix behavior when providing a wrong git URL + +🟡 link:https://github.com/devonfw/IDEasy/issues/1695[#1695] Clone settings to temporary directory, analyse, and then move + +🟡 link:https://github.com/devonfw/IDEasy/issues/1715[#1715] Adapt settings to inject java runtime future proove into vscode + +🟡 link:https://github.com/devonfw/IDEasy/issues/1880[#1880] Reinstall all plugins for IDE in force mode + +| IDE Configuration Doc +| 🔴 Bug +| 🔴 link:https://github.com/devonfw/IDEasy/issues/1185[#1185] [macOS] icd on mac does not work in zshell + +🔴 link:https://github.com/devonfw/IDEasy/issues/1808[#1808] icd is not navigating into single available workspace on icd -p project + +| Settings merger +| 🔴 Bug +| 🔴 link:https://github.com/devonfw/IDEasy/issues/943[#943] XmlMerger: Rework Combine Text Nodes + +🟡 link:https://github.com/devonfw/IDEasy/issues/735[#735] Enhance workspace configuration with generic overlay from settings/works … + +🟡 link:https://github.com/devonfw/IDEasy/issues/987[#987] conditional templates + +🟡 link:https://github.com/devonfw/IDEasy/issues/989[#989] allow expressions in template variable definitions + +🟡 link:https://github.com/devonfw/IDEasy/issues/992[#992] Support multiple attributes for merge:id + + +3+^h| Download and Install +| Download & Extraction +| 🔴 Bug +| 🔴 link:https://github.com/devonfw/IDEasy/issues/690[#690] UpdateUrls workflow timeout not working + +🔴 link:https://github.com/devonfw/IDEasy/issues/771[#771] Check URL Updater issues + +🔴 link:https://github.com/devonfw/IDEasy/issues/897[#897] HTTP Proxy with TLS termination causing errors + +🔴 link:https://github.com/devonfw/IDEasy/issues/1124[#1124] Ensure latest version of Python is installed + +🔴 link:https://github.com/devonfw/IDEasy/issues/1634[#1634] UrlUpdater creates error entries for HTTP status 200 + +🔴 link:https://github.com/devonfw/IDEasy/issues/1787[#1787] tracking yarn versions broken + +🟡 link:https://github.com/devonfw/IDEasy/issues/891[#891] Improve Url Updater Report Overview + +🟡 link:https://github.com/devonfw/IDEasy/issues/1447[#1447] Cover checksum verification in JUnit + +🟡 link:https://github.com/devonfw/IDEasy/issues/1651[#1651] Move status.json files out of ide-urls to own repo + +🟡 link:https://github.com/devonfw/IDEasy/issues/1849[#1849] Support VSCodium + +🟡 link:https://github.com/devonfw/IDEasy/issues/1884[#1884] Implement proper ZIP extraction + + +3+^h| Shell and Terminal +| Shell integration +| 🔴 Bug +| 🔴 link:https://github.com/devonfw/IDEasy/issues/836[#836] Exit is completed in wrong places + +🔴 link:https://github.com/devonfw/IDEasy/issues/1746[#1746] ide shell broken + +🔴 link:https://github.com/devonfw/IDEasy/issues/1842[#1842] Infinite completion of exit subcommand + +🟡 link:https://github.com/devonfw/IDEasy/issues/821[#821] Allow User to remove "ide " prefix in ide shell for non-IDEasy command + +🟡 link:https://github.com/devonfw/IDEasy/issues/822[#822] Handle long CWD paths in shell prompt + +🟡 link:https://github.com/devonfw/IDEasy/issues/1135[#1135] IDEasy does not set env variables on Windows PowerShell + +| Shell completion +| 🚨 Blocker +| 🚨 link:https://github.com/devonfw/IDEasy/issues/1134[#1134] IDEasy autocompletion gets stuck if license agreement file was not found + +🔴 link:https://github.com/devonfw/IDEasy/issues/551[#551] Autocompletion and list-versions make OS-agnostic suggestions + +🔴 link:https://github.com/devonfw/IDEasy/issues/1842[#1842] Infinite completion of exit subcommand + +🟡 link:https://github.com/devonfw/IDEasy/issues/169[#169] Check if we want to utilize TailTipWidgets for the autocompleter + +🟡 link:https://github.com/devonfw/IDEasy/issues/1392[#1392] Smart completion + + +3+^h| Infrastructure +| Proxy / Network +| 🔴 Bug +| + +🔴 link:https://github.com/devonfw/IDEasy/issues/897[#897] HTTP Proxy with TLS termination causing errors + +| Security / Credentials +| 🔴 Bug +| 🔴 link:https://github.com/devonfw/IDEasy/issues/772[#772] CVE-2023-7272 in org.eclipse.parsson 1.1.7 + +🔴 link:https://github.com/devonfw/IDEasy/issues/1775[#1775] Validate and Fix CPE Vendor/Product Identifiers for All Tools + +🟡 link:https://github.com/devonfw/IDEasy/issues/98[#98] Ability to secure downloads from custom repository + +🟡 link:https://github.com/devonfw/IDEasy/issues/190[#190] Improve #103: security warning for CVEs in file tool/edition/security + +🟡 link:https://github.com/devonfw/IDEasy/issues/1628[#1628] Support for OS specific CVEs + + +3+^h| Repository and Workspace +| Repository management +| 🔴 Bug +| 🔴 link:https://github.com/devonfw/IDEasy/issues/690[#690] UpdateUrls workflow timeout not working + +🟡 link:https://github.com/devonfw/IDEasy/issues/492[#492] Use Maven dependency cache to optimize workflow running times + +🟡 link:https://github.com/devonfw/IDEasy/issues/1164[#1164] Automatic project import + +🟡 link:https://github.com/devonfw/IDEasy/issues/1165[#1165] Automatic project import for Eclipse + +🟡 link:https://github.com/devonfw/IDEasy/issues/1167[#1167] Automatic project import for VSCode + +🟡 link:https://github.com/devonfw/IDEasy/issues/1216[#1216] Release workflow should only deploy artifacts after all tests passed + +| Workspace management +| 🟡 Enhancement +| + +🟡 link:https://github.com/devonfw/IDEasy/issues/735[#735] Enhance workspace configuration with generic overlay from settings/works … + + +3+^h| Plugin Management +| Plugin management +| 🔴 Bug +| 🔴 link:https://github.com/devonfw/IDEasy/issues/1263[#1263] Fix android-studio workspace templates + +🔴 link:https://github.com/devonfw/IDEasy/issues/1352[#1352] [Linux] VSCode WSL warning prompt blocking VSCode plugin installation + +🔴 link:https://github.com/devonfw/IDEasy/issues/1548[#1548] [Win] Windows file locking error on update with plugins + +🔴 link:https://github.com/devonfw/IDEasy/issues/1844[#1844] [Linux] `ide install vscode` or `ide vscode` freezes at "installing plugins" ste … + +🟡 link:https://github.com/devonfw/IDEasy/issues/449[#449] Consider integration of continue GenAI coding assistant + +🟡 link:https://github.com/devonfw/IDEasy/issues/1525[#1525] lombok not correctly installed in eclipse + +🟡 link:https://github.com/devonfw/IDEasy/issues/1754[#1754] Add version support to vscode settings .plugin files + +🟡 link:https://github.com/devonfw/IDEasy/issues/1880[#1880] Reinstall all plugins for IDE in force mode + + +3+^h| Observability +| Logging / Debug output +| 🟡 Enhancement +| 🟡 link:https://github.com/devonfw/IDEasy/issues/1688[#1688] Remove unnecessary message in the CLI when installing a new tool + +🟡 link:https://github.com/devonfw/IDEasy/issues/1689[#1689] Fix user commnication when switching the Java version from the default t … + +|=== + +== Windows Tools — 0 blocker(s), 21 bug(s), 39 enhancement(s) + +Open issues labelled `windows` or without any OS label (cross-platform issues appear in every OS section). + +=== Tools + +NOTE: Components with no open issues are omitted from this table. + +[%header, cols="3,^2,7"] |=== +| Tool | Status | Issues +| Android Studio +| 🔴 Bug +| 🔴 link:https://github.com/devonfw/IDEasy/issues/1263[#1263] Fix android-studio workspace templates + +| AWS CLI +| 🟡 Enhancement +| 🟡 link:https://github.com/devonfw/IDEasy/issues/703[#703] Support AWS CDK + +| Azure CLI +| 🔴 Bug +| 🔴 link:https://github.com/devonfw/IDEasy/issues/855[#855] ide az config not working + +| Custom tool support +| 🟡 Enhancement +| 🟡 link:https://github.com/devonfw/IDEasy/issues/756[#756] Implement CustomToolRepositoryTest + +🟡 link:https://github.com/devonfw/IDEasy/issues/930[#930] Refactor `JsonPrettyPrinter` to be usable in CustomToolJson + +| Docker +| 🔴 Bug +| 🔴 link:https://github.com/devonfw/IDEasy/issues/44[#44] DockerUrlUpdater not finding/adding specific versions + +🔴 link:https://github.com/devonfw/IDEasy/issues/1659[#1659] Global tools run tool while installation is running in background + +🟡 link:https://github.com/devonfw/IDEasy/issues/1181[#1181] Improve url updater for docker desktop to pull all necessary versions + +🟡 link:https://github.com/devonfw/IDEasy/issues/1868[#1868] Revision of the functionality of global tool commandlets + +| dotnet +| 🟡 Enhancement +| 🟡 link:https://github.com/devonfw/IDEasy/issues/701[#701] Fix Dotnet tests on our CI + +| Eclipse +| 🟡 Enhancement +| 🟡 link:https://github.com/devonfw/IDEasy/issues/1165[#1165] Automatic project import for Eclipse + +🟡 link:https://github.com/devonfw/IDEasy/issues/1525[#1525] lombok not correctly installed in eclipse + +| GCViewer +| 🟡 Enhancement +| 🟡 link:https://github.com/devonfw/IDEasy/issues/825[#825] Consider adding GC Log Analyzer + +| git +| 🔴 Bug +| 🔴 link:https://github.com/devonfw/IDEasy/issues/1579[#1579] IDEasy uninstall after a failed MSI installation does not work + +🟡 link:https://github.com/devonfw/IDEasy/issues/714[#714] Improve UX for settings repository + +🟡 link:https://github.com/devonfw/IDEasy/issues/1694[#1694] Fix behavior when providing a wrong git URL + +🟡 link:https://github.com/devonfw/IDEasy/issues/1695[#1695] Clone settings to temporary directory, analyse, and then move + +| GitHub Copilot +| 🟡 Enhancement +| 🟡 link:https://github.com/devonfw/IDEasy/issues/1717[#1717] Add github-copliot-cli as software package + +| GUI / IDE launcher +| 🔴 Bug +| 🔴 link:https://github.com/devonfw/IDEasy/issues/1892[#1892] pom.xml required for launching gui not included in release/native builds + +🟡 link:https://github.com/devonfw/IDEasy/issues/1295[#1295] IDEasy Dashboard Epic + +🟡 link:https://github.com/devonfw/IDEasy/issues/1296[#1296] Implement IdeContext properly for Dashboard + +🟡 link:https://github.com/devonfw/IDEasy/issues/1784[#1784] Implement JavaFX based progress bars for the GUI + +🟡 link:https://github.com/devonfw/IDEasy/issues/1785[#1785] Implemenent confirmation modals using JavaFX + +🟡 link:https://github.com/devonfw/IDEasy/issues/1802[#1802] Enable state management for the IdeContext in the GUI. + +🟡 link:https://github.com/devonfw/IDEasy/issues/1840[#1840] Management of tool installations in the GUI + +| IntelliJ IDEA +| 🔴 Bug +| 🔴 link:https://github.com/devonfw/IDEasy/issues/120[#120] intellij does not use our settings when we create a new project within i … + +🔴 link:https://github.com/devonfw/IDEasy/issues/717[#717] IDEasy does not start Intellij if license was not accepted + +🔴 link:https://github.com/devonfw/IDEasy/issues/1501[#1501] Starting intellij leads to error popup + +🟡 link:https://github.com/devonfw/IDEasy/issues/992[#992] Support multiple attributes for merge:id + +| Java (JDK) +| 🟡 Enhancement +| 🟡 link:https://github.com/devonfw/IDEasy/issues/72[#72] Add further editions of java + +| Kotlin Compiler +| 🔴 Bug +| 🔴 link:https://github.com/devonfw/IDEasy/issues/857[#857] kotlinc bash does not get keyboard inputs + +| kubectl +| 🔴 Bug +| 🔴 link:https://github.com/devonfw/IDEasy/issues/1659[#1659] Global tools run tool while installation is running in background + +| Maven +| 🔴 Bug +| 🔴 link:https://github.com/devonfw/IDEasy/issues/594[#594] Still windows file locking problems + +| Node.js +| 🔴 Bug +| 🔴 link:https://github.com/devonfw/IDEasy/issues/859[#859] node shell not starting + +| npm +| 🔴 Bug +| 🔴 link:https://github.com/devonfw/IDEasy/issues/1886[#1886] NpmBasedCommandlet shows wrong tool version after install + +🟡 link:https://github.com/devonfw/IDEasy/issues/700[#700] Add Npm run test + +| pgAdmin +| 🔴 Bug +| 🔴 link:https://github.com/devonfw/IDEasy/issues/861[#861] install of pgadmin throws an IllegalStateException when the install wizz … + +🟡 link:https://github.com/devonfw/IDEasy/issues/1868[#1868] Revision of the functionality of global tool commandlets + +| Python +| 🔴 Bug +| 🔴 link:https://github.com/devonfw/IDEasy/issues/1124[#1124] Ensure latest version of Python is installed + +| Rancher Desktop +| 🟡 Enhancement +| 🟡 link:https://github.com/devonfw/IDEasy/issues/1868[#1868] Revision of the functionality of global tool commandlets + +| Terraform +| 🔴 Bug +| 🔴 link:https://github.com/devonfw/IDEasy/issues/1391[#1391] bashrc messed with terraform completions -_Generated: 2026-05-06 09:57 UTC · 186 issues · 136 assigned · 50 unassigned_ +| uv +| 🔴 Bug +| 🔴 link:https://github.com/devonfw/IDEasy/issues/1518[#1518] uv tools are installed globally + +| VS Code +| 🟡 Enhancement +| 🟡 link:https://github.com/devonfw/IDEasy/issues/787[#787] Provide variable to disable open new workspace + +🟡 link:https://github.com/devonfw/IDEasy/issues/1167[#1167] Automatic project import for VSCode + +🟡 link:https://github.com/devonfw/IDEasy/issues/1715[#1715] Adapt settings to inject java runtime future proove into vscode + +🟡 link:https://github.com/devonfw/IDEasy/issues/1754[#1754] Add version support to vscode settings .plugin files + +🟡 link:https://github.com/devonfw/IDEasy/issues/1849[#1849] Support VSCodium + +| Yarn +| 🔴 Bug +| 🔴 link:https://github.com/devonfw/IDEasy/issues/1787[#1787] tracking yarn versions broken +|=== -== Summary +== Linux Tools — 0 blocker(s), 22 bug(s), 42 enhancement(s) -=== 🚨 Active Blockers +Open issues labelled `linux` or without any OS label (cross-platform issues appear in every OS section). -_No active blockers_ 🎉 +=== Tools -== Tools +NOTE: Components with no open issues are omitted from this table. -[cols="2,1,1,1,6", options="header"] +[%header, cols="3,^2,7"] |=== -| Tool | Win | Linux | macOS | Issues +| Tool | Status | Issues | Android Studio -| 🔴 -| 🔴 -| 🔴 -| 🔴 link:https://github.com/devonfw/IDEasy/issues/1263[#1263] Fix android-studio workspace templates + -🟡 link:https://github.com/devonfw/IDEasy/issues/863[#863] `mac` Mac x64 android-studio 2024 releases missing +| 🔴 Bug +| 🔴 link:https://github.com/devonfw/IDEasy/issues/1263[#1263] Fix android-studio workspace templates | AWS CLI -| 🟡 -| 🟡 -| 🔴 -| 🔴 link:https://github.com/devonfw/IDEasy/issues/796[#796] `mac` cannot install aws on Mac + -🔴 link:https://github.com/devonfw/IDEasy/issues/864[#864] `mac` AWS is not working on Mac x64 + -🟡 link:https://github.com/devonfw/IDEasy/issues/703[#703] Support AWS CDK +| 🟡 Enhancement +| 🟡 link:https://github.com/devonfw/IDEasy/issues/703[#703] Support AWS CDK | Azure CLI -| 🔴 -| 🔴 -| 🔴 -| 🔴 link:https://github.com/devonfw/IDEasy/issues/802[#802] `linux/mac` az not working on Mac + -🔴 link:https://github.com/devonfw/IDEasy/issues/855[#855] ide az config not working + -🔴 link:https://github.com/devonfw/IDEasy/issues/865[#865] `mac` Az is not working on Mac x64 - -| GitHub Copilot -| 🟡 -| 🟡 -| 🟡 -| 🟡 link:https://github.com/devonfw/IDEasy/issues/1717[#1717] Add github-copliot-cli as software package +| 🔴 Bug +| 🔴 link:https://github.com/devonfw/IDEasy/issues/802[#802] az not working on Mac + +🔴 link:https://github.com/devonfw/IDEasy/issues/855[#855] ide az config not working | Custom tool support -| 🟡 -| 🟡 -| 🟡 +| 🟡 Enhancement | 🟡 link:https://github.com/devonfw/IDEasy/issues/756[#756] Implement CustomToolRepositoryTest + 🟡 link:https://github.com/devonfw/IDEasy/issues/930[#930] Refactor `JsonPrettyPrinter` to be usable in CustomToolJson | Docker -| 🔴 -| 🔴 -| 🔴 +| 🔴 Bug | 🔴 link:https://github.com/devonfw/IDEasy/issues/44[#44] DockerUrlUpdater not finding/adding specific versions + -🔴 link:https://github.com/devonfw/IDEasy/issues/867[#867] `linux` Docker (Rancher Desktop) not working on Linux + 🔴 link:https://github.com/devonfw/IDEasy/issues/1659[#1659] Global tools run tool while installation is running in background + -🟡 link:https://github.com/devonfw/IDEasy/issues/950[#950] `linux` avoid --no-gpg-checks for docker installation on SUSE Linux + +🟡 link:https://github.com/devonfw/IDEasy/issues/950[#950] avoid --no-gpg-checks for docker installation on SUSE Linux + 🟡 link:https://github.com/devonfw/IDEasy/issues/1181[#1181] Improve url updater for docker desktop to pull all necessary versions + 🟡 link:https://github.com/devonfw/IDEasy/issues/1868[#1868] Revision of the functionality of global tool commandlets | dotnet -| 🟡 -| 🟡 -| 🟡 -| 🟡 link:https://github.com/devonfw/IDEasy/issues/694[#694] `linux` Add linux support to dotnet tool + +| 🟡 Enhancement +| 🟡 link:https://github.com/devonfw/IDEasy/issues/694[#694] Add linux support to dotnet tool + 🟡 link:https://github.com/devonfw/IDEasy/issues/701[#701] Fix Dotnet tests on our CI | Eclipse -| 🟡 -| 🟡 -| 🔴 -| 🔴 link:https://github.com/devonfw/IDEasy/issues/868[#868] `mac` Eclipse does not work on Mac x64 + -🔴 link:https://github.com/devonfw/IDEasy/issues/1187[#1187] `mac` Eclipse plugin installation on mac is not working + -🟡 link:https://github.com/devonfw/IDEasy/issues/1165[#1165] Automatic project import for Eclipse + +| 🟡 Enhancement +| 🟡 link:https://github.com/devonfw/IDEasy/issues/1165[#1165] Automatic project import for Eclipse + 🟡 link:https://github.com/devonfw/IDEasy/issues/1525[#1525] lombok not correctly installed in eclipse | GCViewer -| 🟡 -| 🟡 -| 🔴 -| 🔴 link:https://github.com/devonfw/IDEasy/issues/869[#869] `mac` gcviewer logs errors on Mac X64 + -🟡 link:https://github.com/devonfw/IDEasy/issues/825[#825] Consider adding GC Log Analyzer +| 🟡 Enhancement +| 🟡 link:https://github.com/devonfw/IDEasy/issues/825[#825] Consider adding GC Log Analyzer | git -| 🔴 -| 🟡 -| 🟡 -| 🔴 link:https://github.com/devonfw/IDEasy/issues/1579[#1579] `win` IDEasy uninstall after a failed MSI installation does not work + -🟡 link:https://github.com/devonfw/IDEasy/issues/714[#714] Improve UX for settings repository + +| 🟡 Enhancement +| 🟡 link:https://github.com/devonfw/IDEasy/issues/714[#714] Improve UX for settings repository + 🟡 link:https://github.com/devonfw/IDEasy/issues/1694[#1694] Fix behavior when providing a wrong git URL + 🟡 link:https://github.com/devonfw/IDEasy/issues/1695[#1695] Clone settings to temporary directory, analyse, and then move +| GitHub Copilot +| 🟡 Enhancement +| 🟡 link:https://github.com/devonfw/IDEasy/issues/1717[#1717] Add github-copliot-cli as software package + | GUI / IDE launcher -| 🔴 -| 🔴 -| 🔴 -| 🔴 link:https://github.com/devonfw/IDEasy/issues/1892[#1892] pom.xml required for launching gui not included in release/native buil… + +| 🔴 Bug +| 🔴 link:https://github.com/devonfw/IDEasy/issues/1892[#1892] pom.xml required for launching gui not included in release/native builds + 🟡 link:https://github.com/devonfw/IDEasy/issues/1295[#1295] IDEasy Dashboard Epic + 🟡 link:https://github.com/devonfw/IDEasy/issues/1296[#1296] Implement IdeContext properly for Dashboard + 🟡 link:https://github.com/devonfw/IDEasy/issues/1784[#1784] Implement JavaFX based progress bars for the GUI + @@ -123,136 +1003,61 @@ _No active blockers_ 🎉 🟡 link:https://github.com/devonfw/IDEasy/issues/1802[#1802] Enable state management for the IdeContext in the GUI. + 🟡 link:https://github.com/devonfw/IDEasy/issues/1840[#1840] Management of tool installations in the GUI -| Ide -| 🔴 -| 🔴 -| 🔴 -| 🔴 link:https://github.com/devonfw/IDEasy/issues/1041[#1041] native image has globbing active + -🔴 link:https://github.com/devonfw/IDEasy/issues/1844[#1844] `linux` `ide install vscode` or `ide vscode` freezes at "installing plugins" s… + -🟡 link:https://github.com/devonfw/IDEasy/issues/19[#19] Implement ToolCommandlet for Google Cloud CLI + -🟡 link:https://github.com/devonfw/IDEasy/issues/703[#703] Support AWS CDK + -🟡 link:https://github.com/devonfw/IDEasy/issues/780[#780] Create IDEasy service + -🟡 link:https://github.com/devonfw/IDEasy/issues/825[#825] Consider adding GC Log Analyzer + -🟡 link:https://github.com/devonfw/IDEasy/issues/1457[#1457] Improve CLI error messages on invalid args or commandlets not availabl… + -🟡 link:https://github.com/devonfw/IDEasy/issues/1580[#1580] Implement cleanup + -🟡 link:https://github.com/devonfw/IDEasy/issues/1594[#1594] implement ReleaseCommandlet + -🟡 link:https://github.com/devonfw/IDEasy/issues/1821[#1821] Back up and restore user state before/after integration tests + -🟡 link:https://github.com/devonfw/IDEasy/issues/1867[#1867] Create Claude commandlet + -🟡 link:https://github.com/devonfw/IDEasy/issues/1868[#1868] Revision of the functionality of global tool commandlets - | IntelliJ IDEA -| 🔴 -| 🔴 -| 🔴 -| 🔴 link:https://github.com/devonfw/IDEasy/issues/120[#120] intellij does not use our settings when we create a new project within… + +| 🔴 Bug +| 🔴 link:https://github.com/devonfw/IDEasy/issues/120[#120] intellij does not use our settings when we create a new project within i … + 🔴 link:https://github.com/devonfw/IDEasy/issues/717[#717] IDEasy does not start Intellij if license was not accepted + 🔴 link:https://github.com/devonfw/IDEasy/issues/1501[#1501] Starting intellij leads to error popup + -🟡 link:https://github.com/devonfw/IDEasy/issues/992[#992] Support multiple attributes for merge:id + -🟡 link:https://github.com/devonfw/IDEasy/issues/1512[#1512] `mac` Cannot run Intellij on Mac due to file permission error +🟡 link:https://github.com/devonfw/IDEasy/issues/992[#992] Support multiple attributes for merge:id | Java (JDK) -| 🟡 -| 🟡 -| 🟡 +| 🟡 Enhancement | 🟡 link:https://github.com/devonfw/IDEasy/issues/72[#72] Add further editions of java | Kotlin Compiler -| 🔴 -| 🔴 -| 🔴 +| 🔴 Bug | 🔴 link:https://github.com/devonfw/IDEasy/issues/857[#857] kotlinc bash does not get keyboard inputs | kubectl -| 🔴 -| 🔴 -| 🔴 +| 🔴 Bug | 🔴 link:https://github.com/devonfw/IDEasy/issues/1659[#1659] Global tools run tool while installation is running in background -| Maven -| 🔴 -| 🟢 -| 🟢 -| 🔴 link:https://github.com/devonfw/IDEasy/issues/594[#594] `win` Still windows file locking problems - | Node.js -| 🔴 -| 🔴 -| 🔴 +| 🔴 Bug | 🔴 link:https://github.com/devonfw/IDEasy/issues/859[#859] node shell not starting | npm -| 🔴 -| 🔴 -| 🔴 -| 🔴 link:https://github.com/devonfw/IDEasy/issues/801[#801] `mac` npm not working on Mac + -🔴 link:https://github.com/devonfw/IDEasy/issues/1886[#1886] NpmBasedCommandlet shows wrong tool version after install + +| 🔴 Bug +| 🔴 link:https://github.com/devonfw/IDEasy/issues/1886[#1886] NpmBasedCommandlet shows wrong tool version after install + 🟡 link:https://github.com/devonfw/IDEasy/issues/700[#700] Add Npm run test | pgAdmin -| 🔴 -| 🔴 -| 🔴 -| 🔴 link:https://github.com/devonfw/IDEasy/issues/798[#798] `mac` pgadmin not working on Mac + -🔴 link:https://github.com/devonfw/IDEasy/issues/861[#861] install of pgadmin throws an IllegalStateException when the install wi… + -🔴 link:https://github.com/devonfw/IDEasy/issues/878[#878] `mac` pgadmin does not work on Mac x64 + +| 🔴 Bug +| 🔴 link:https://github.com/devonfw/IDEasy/issues/861[#861] install of pgadmin throws an IllegalStateException when the install wizz … + 🟡 link:https://github.com/devonfw/IDEasy/issues/1868[#1868] Revision of the functionality of global tool commandlets -| Plugin -| 🔴 -| 🔴 -| 🔴 -| 🔴 link:https://github.com/devonfw/IDEasy/issues/1263[#1263] Fix android-studio workspace templates + -🔴 link:https://github.com/devonfw/IDEasy/issues/1352[#1352] `linux` VSCode WSL warning prompt blocking VSCode plugin installation + -🔴 link:https://github.com/devonfw/IDEasy/issues/1548[#1548] `win` Windows file locking error on update with plugins + -🔴 link:https://github.com/devonfw/IDEasy/issues/1844[#1844] `linux` `ide install vscode` or `ide vscode` freezes at "installing plugins" s… + -🟡 link:https://github.com/devonfw/IDEasy/issues/449[#449] Consider integration of continue GenAI coding assistant + -🟡 link:https://github.com/devonfw/IDEasy/issues/1525[#1525] lombok not correctly installed in eclipse + -🟡 link:https://github.com/devonfw/IDEasy/issues/1754[#1754] Add version support to vscode settings .plugin files + -🟡 link:https://github.com/devonfw/IDEasy/issues/1880[#1880] Reinstall all plugins for IDE in force mode - | Python -| 🔴 -| 🔴 -| 🔴 +| 🔴 Bug | 🔴 link:https://github.com/devonfw/IDEasy/issues/1124[#1124] Ensure latest version of Python is installed + -🟡 link:https://github.com/devonfw/IDEasy/issues/1046[#1046] `linux` Add Support for Python on Linux - -| Repository -| 🔴 -| 🔴 -| 🔴 -| 🔴 link:https://github.com/devonfw/IDEasy/issues/690[#690] UpdateUrls workflow timeout not working + -🟡 link:https://github.com/devonfw/IDEasy/issues/492[#492] Use Maven dependency cache to optimize workflow running times + -🟡 link:https://github.com/devonfw/IDEasy/issues/1164[#1164] Automatic project import + -🟡 link:https://github.com/devonfw/IDEasy/issues/1165[#1165] Automatic project import for Eclipse + -🟡 link:https://github.com/devonfw/IDEasy/issues/1167[#1167] Automatic project import for VSCode + -🟡 link:https://github.com/devonfw/IDEasy/issues/1216[#1216] Release workflow should only deploy artifacts after all tests passed +🟡 link:https://github.com/devonfw/IDEasy/issues/1046[#1046] Add Support for Python on Linux -| SonarQube -| 🟢 -| 🟢 -| 🔴 -| 🔴 link:https://github.com/devonfw/IDEasy/issues/800[#800] `mac` sonar not working on Mac +| Rancher Desktop +| 🔴 Bug +| 🔴 link:https://github.com/devonfw/IDEasy/issues/867[#867] Docker (Rancher Desktop) not working on Linux + +🟡 link:https://github.com/devonfw/IDEasy/issues/1868[#1868] Revision of the functionality of global tool commandlets | Terraform -| 🔴 -| 🔴 -| 🔴 +| 🔴 Bug | 🔴 link:https://github.com/devonfw/IDEasy/issues/1391[#1391] bashrc messed with terraform completions -| uv (Python package mgr) -| 🔴 -| 🔴 -| 🔴 +| uv +| 🔴 Bug | 🔴 link:https://github.com/devonfw/IDEasy/issues/1518[#1518] uv tools are installed globally | VS Code -| 🟡 -| 🔴 -| 🔴 -| 🔴 link:https://github.com/devonfw/IDEasy/issues/862[#862] `mac` vscode does not work on Mac + -🔴 link:https://github.com/devonfw/IDEasy/issues/1352[#1352] `linux` VSCode WSL warning prompt blocking VSCode plugin installation + -🔴 link:https://github.com/devonfw/IDEasy/issues/1844[#1844] `linux` `ide install vscode` or `ide vscode` freezes at "installing plugins" s… + +| 🔴 Bug +| 🔴 link:https://github.com/devonfw/IDEasy/issues/1352[#1352] VSCode WSL warning prompt blocking VSCode plugin installation + +🔴 link:https://github.com/devonfw/IDEasy/issues/1844[#1844] `ide install vscode` or `ide vscode` freezes at "installing plugins" ste … + 🟡 link:https://github.com/devonfw/IDEasy/issues/787[#787] Provide variable to disable open new workspace + 🟡 link:https://github.com/devonfw/IDEasy/issues/1167[#1167] Automatic project import for VSCode + 🟡 link:https://github.com/devonfw/IDEasy/issues/1715[#1715] Adapt settings to inject java runtime future proove into vscode + @@ -260,249 +1065,166 @@ _No active blockers_ 🎉 🟡 link:https://github.com/devonfw/IDEasy/issues/1849[#1849] Support VSCodium | Yarn -| 🔴 -| 🔴 -| 🔴 +| 🔴 Bug | 🔴 link:https://github.com/devonfw/IDEasy/issues/1787[#1787] tracking yarn versions broken |=== -== Commandlets & Core Features +== macOS Tools — 0 blocker(s), 30 bug(s), 41 enhancement(s) + +Open issues labelled `macOS` or without any OS label (cross-platform issues appear in every OS section). -[cols="2,1,1,1,6", options="header"] +=== Tools + +NOTE: Components with no open issues are omitted from this table. + +[%header, cols="3,^2,7"] |=== -| Commandlet / Feature | Win | Linux | macOS | Issues -| IDEasy (general) -| 🔴 -| 🔴 -| 🔴 -| 🔴 link:https://github.com/devonfw/IDEasy/issues/1041[#1041] native image has globbing active + -🔴 link:https://github.com/devonfw/IDEasy/issues/1844[#1844] `linux` `ide install vscode` or `ide vscode` freezes at "installing plugins" s… + -🟡 link:https://github.com/devonfw/IDEasy/issues/19[#19] Implement ToolCommandlet for Google Cloud CLI + -🟡 link:https://github.com/devonfw/IDEasy/issues/703[#703] Support AWS CDK + -🟡 link:https://github.com/devonfw/IDEasy/issues/780[#780] Create IDEasy service + -🟡 link:https://github.com/devonfw/IDEasy/issues/825[#825] Consider adding GC Log Analyzer + -🟡 link:https://github.com/devonfw/IDEasy/issues/1457[#1457] Improve CLI error messages on invalid args or commandlets not availabl… + -🟡 link:https://github.com/devonfw/IDEasy/issues/1580[#1580] Implement cleanup + -🟡 link:https://github.com/devonfw/IDEasy/issues/1594[#1594] implement ReleaseCommandlet + -🟡 link:https://github.com/devonfw/IDEasy/issues/1821[#1821] Back up and restore user state before/after integration tests + -🟡 link:https://github.com/devonfw/IDEasy/issues/1867[#1867] Create Claude commandlet + -🟡 link:https://github.com/devonfw/IDEasy/issues/1868[#1868] Revision of the functionality of global tool commandlets +| Tool | Status | Issues +| Android Studio +| 🔴 Bug +| 🔴 link:https://github.com/devonfw/IDEasy/issues/1263[#1263] Fix android-studio workspace templates + +🟡 link:https://github.com/devonfw/IDEasy/issues/863[#863] Mac x64 android-studio 2024 releases missing -| Core / Runtime -| 🔴 -| 🔴 -| 🔴 -| 🔴 link:https://github.com/devonfw/IDEasy/issues/1041[#1041] native image has globbing active + -🔴 link:https://github.com/devonfw/IDEasy/issues/1054[#1054] Incorrect interpretation of trailling and leading spaces in version ra… + -🟡 link:https://github.com/devonfw/IDEasy/issues/871[#871] `mac` Add progressbar to *.dmg extract process + -🟡 link:https://github.com/devonfw/IDEasy/issues/1512[#1512] `mac` Cannot run Intellij on Mac due to file permission error +| AWS CLI +| 🔴 Bug +| 🔴 link:https://github.com/devonfw/IDEasy/issues/796[#796] cannot install aws on Mac + +🔴 link:https://github.com/devonfw/IDEasy/issues/864[#864] AWS is not working on Mac x64 + +🟡 link:https://github.com/devonfw/IDEasy/issues/703[#703] Support AWS CDK -| ide install -| 🔴 -| 🔴 -| 🔴 -| 🔴 link:https://github.com/devonfw/IDEasy/issues/594[#594] `win` Still windows file locking problems + -🔴 link:https://github.com/devonfw/IDEasy/issues/861[#861] install of pgadmin throws an IllegalStateException when the install wi… + -🔴 link:https://github.com/devonfw/IDEasy/issues/1227[#1227] `win` Guide windows user after installation + -🔴 link:https://github.com/devonfw/IDEasy/issues/1232[#1232] `win` MSI Repair broken + -🔴 link:https://github.com/devonfw/IDEasy/issues/1517[#1517] IDEasy setup does not install Windows Terminal + -🔴 link:https://github.com/devonfw/IDEasy/issues/1518[#1518] uv tools are installed globally + -🔴 link:https://github.com/devonfw/IDEasy/issues/1579[#1579] `win` IDEasy uninstall after a failed MSI installation does not work + +| Azure CLI +| 🔴 Bug +| 🔴 link:https://github.com/devonfw/IDEasy/issues/802[#802] az not working on Mac + +🔴 link:https://github.com/devonfw/IDEasy/issues/855[#855] ide az config not working + +🔴 link:https://github.com/devonfw/IDEasy/issues/865[#865] Az is not working on Mac x64 + +| Custom tool support +| 🟡 Enhancement +| 🟡 link:https://github.com/devonfw/IDEasy/issues/756[#756] Implement CustomToolRepositoryTest + +🟡 link:https://github.com/devonfw/IDEasy/issues/930[#930] Refactor `JsonPrettyPrinter` to be usable in CustomToolJson + +| Docker +| 🔴 Bug +| 🔴 link:https://github.com/devonfw/IDEasy/issues/44[#44] DockerUrlUpdater not finding/adding specific versions + 🔴 link:https://github.com/devonfw/IDEasy/issues/1659[#1659] Global tools run tool while installation is running in background + -🟡 link:https://github.com/devonfw/IDEasy/issues/377[#377] `mac` Support Homebrew for installation on macOS + -🟡 link:https://github.com/devonfw/IDEasy/issues/421[#421] `win` Allow installation of IDEasy via winget + -🟡 link:https://github.com/devonfw/IDEasy/issues/422[#422] `win` Allow installation of IDEasy via Windows Store + -🟡 link:https://github.com/devonfw/IDEasy/issues/423[#423] `mac` Create installer for MacOS + -🟡 link:https://github.com/devonfw/IDEasy/issues/703[#703] Support AWS CDK + -🟡 link:https://github.com/devonfw/IDEasy/issues/714[#714] Improve UX for settings repository + -🟡 link:https://github.com/devonfw/IDEasy/issues/1056[#1056] `win` Add Conversion of LICENSE.adoc to RTF Format + -🟡 link:https://github.com/devonfw/IDEasy/issues/1102[#1102] `win` IDEasy MSI installer not working (unsigned) + -🟡 link:https://github.com/devonfw/IDEasy/issues/1558[#1558] `win` Add install.log path to msi installer window + -🟡 link:https://github.com/devonfw/IDEasy/issues/1694[#1694] Fix behavior when providing a wrong git URL + -🟡 link:https://github.com/devonfw/IDEasy/issues/1763[#1763] Improve installation/testing of SNAPSHOT releases + +🟡 link:https://github.com/devonfw/IDEasy/issues/1181[#1181] Improve url updater for docker desktop to pull all necessary versions + 🟡 link:https://github.com/devonfw/IDEasy/issues/1868[#1868] Revision of the functionality of global tool commandlets -| ide uninstall -| 🔴 -| 🟡 -| 🟡 -| 🔴 link:https://github.com/devonfw/IDEasy/issues/1456[#1456] `win` Uninstall via Windows settings not working + -🟡 link:https://github.com/devonfw/IDEasy/issues/399[#399] Handle uninstall of global tool commandlets + -🟡 link:https://github.com/devonfw/IDEasy/issues/785[#785] Re-introduce workspace reverse options from devonfw-ide + -🟡 link:https://github.com/devonfw/IDEasy/issues/1868[#1868] Revision of the functionality of global tool commandlets + -🟡 link:https://github.com/devonfw/IDEasy/issues/1872[#1872] `win` Implement generic uninstall implementation for global tools under wind… +| dotnet +| 🟡 Enhancement +| 🟡 link:https://github.com/devonfw/IDEasy/issues/701[#701] Fix Dotnet tests on our CI -| ide update -| 🔴 -| 🔴 -| 🔴 -| 🔴 link:https://github.com/devonfw/IDEasy/issues/594[#594] `win` Still windows file locking problems + -🔴 link:https://github.com/devonfw/IDEasy/issues/1333[#1333] Step 'Install or update software' already ended with false and now end… + -🔴 link:https://github.com/devonfw/IDEasy/issues/1548[#1548] `win` Windows file locking error on update with plugins + -🟡 link:https://github.com/devonfw/IDEasy/issues/639[#639] Improve step success logic for sub steps + -🟡 link:https://github.com/devonfw/IDEasy/issues/714[#714] Improve UX for settings repository + -🟡 link:https://github.com/devonfw/IDEasy/issues/945[#945] Improve ide update with smart dependency handling + -🟡 link:https://github.com/devonfw/IDEasy/issues/1694[#1694] Fix behavior when providing a wrong git URL +| Eclipse +| 🔴 Bug +| 🔴 link:https://github.com/devonfw/IDEasy/issues/868[#868] Eclipse does not work on Mac x64 + +🔴 link:https://github.com/devonfw/IDEasy/issues/1187[#1187] Eclipse plugin installation on mac is not working + +🟡 link:https://github.com/devonfw/IDEasy/issues/1165[#1165] Automatic project import for Eclipse + +🟡 link:https://github.com/devonfw/IDEasy/issues/1525[#1525] lombok not correctly installed in eclipse -| ide create-project -| 🟡 -| 🟡 -| 🟡 +| GCViewer +| 🔴 Bug +| 🔴 link:https://github.com/devonfw/IDEasy/issues/869[#869] gcviewer logs errors on Mac X64 + +🟡 link:https://github.com/devonfw/IDEasy/issues/825[#825] Consider adding GC Log Analyzer + +| git +| 🟡 Enhancement | 🟡 link:https://github.com/devonfw/IDEasy/issues/714[#714] Improve UX for settings repository + +🟡 link:https://github.com/devonfw/IDEasy/issues/1694[#1694] Fix behavior when providing a wrong git URL + 🟡 link:https://github.com/devonfw/IDEasy/issues/1695[#1695] Clone settings to temporary directory, analyse, and then move -| ide status -| 🔴 -| 🔴 -| 🔴 -| 🔴 link:https://github.com/devonfw/IDEasy/issues/1255[#1255] ide status does not recognize snapshot version correctly + -🟡 link:https://github.com/devonfw/IDEasy/issues/1209[#1209] migration version message is confusing +| GitHub Copilot +| 🟡 Enhancement +| 🟡 link:https://github.com/devonfw/IDEasy/issues/1717[#1717] Add github-copliot-cli as software package -| Version management -| 🟡 -| 🟡 -| 🟡 -| 🟡 link:https://github.com/devonfw/IDEasy/issues/1178[#1178] Revisit VersionPhase detection + -🟡 link:https://github.com/devonfw/IDEasy/issues/1868[#1868] Revision of the functionality of global tool commandlets +| GUI / IDE launcher +| 🔴 Bug +| 🔴 link:https://github.com/devonfw/IDEasy/issues/1892[#1892] pom.xml required for launching gui not included in release/native builds + +🟡 link:https://github.com/devonfw/IDEasy/issues/1295[#1295] IDEasy Dashboard Epic + +🟡 link:https://github.com/devonfw/IDEasy/issues/1296[#1296] Implement IdeContext properly for Dashboard + +🟡 link:https://github.com/devonfw/IDEasy/issues/1784[#1784] Implement JavaFX based progress bars for the GUI + +🟡 link:https://github.com/devonfw/IDEasy/issues/1785[#1785] Implemenent confirmation modals using JavaFX + +🟡 link:https://github.com/devonfw/IDEasy/issues/1802[#1802] Enable state management for the IdeContext in the GUI. + +🟡 link:https://github.com/devonfw/IDEasy/issues/1840[#1840] Management of tool installations in the GUI -| Settings / Properties -| 🔴 -| 🔴 -| 🔴 -| 🔴 link:https://github.com/devonfw/IDEasy/issues/1063[#1063] User specific configurations are not working as described + -🔴 link:https://github.com/devonfw/IDEasy/issues/1518[#1518] uv tools are installed globally + -🔴 link:https://github.com/devonfw/IDEasy/issues/1814[#1814] IDEasy still reports updates for settings are available after any numb… + -🟡 link:https://github.com/devonfw/IDEasy/issues/449[#449] Consider integration of continue GenAI coding assistant + -🟡 link:https://github.com/devonfw/IDEasy/issues/714[#714] Improve UX for settings repository + -🟡 link:https://github.com/devonfw/IDEasy/issues/735[#735] Enhance workspace configuration with generic overlay from settings/wor… + -🟡 link:https://github.com/devonfw/IDEasy/issues/785[#785] Re-introduce workspace reverse options from devonfw-ide + -🟡 link:https://github.com/devonfw/IDEasy/issues/930[#930] Refactor `JsonPrettyPrinter` to be usable in CustomToolJson + -🟡 link:https://github.com/devonfw/IDEasy/issues/987[#987] conditional templates + -🟡 link:https://github.com/devonfw/IDEasy/issues/989[#989] allow expressions in template variable definitions + +| IntelliJ IDEA +| 🔴 Bug +| 🔴 link:https://github.com/devonfw/IDEasy/issues/120[#120] intellij does not use our settings when we create a new project within i … + +🔴 link:https://github.com/devonfw/IDEasy/issues/717[#717] IDEasy does not start Intellij if license was not accepted + +🔴 link:https://github.com/devonfw/IDEasy/issues/1501[#1501] Starting intellij leads to error popup + 🟡 link:https://github.com/devonfw/IDEasy/issues/992[#992] Support multiple attributes for merge:id + -🟡 link:https://github.com/devonfw/IDEasy/issues/1214[#1214] preserve EOL style in upgrade-settings + -🟡 link:https://github.com/devonfw/IDEasy/issues/1676[#1676] Import extra SDKs automatically into IDE + -🟡 link:https://github.com/devonfw/IDEasy/issues/1694[#1694] Fix behavior when providing a wrong git URL + -🟡 link:https://github.com/devonfw/IDEasy/issues/1695[#1695] Clone settings to temporary directory, analyse, and then move + -🟡 link:https://github.com/devonfw/IDEasy/issues/1715[#1715] Adapt settings to inject java runtime future proove into vscode + -🟡 link:https://github.com/devonfw/IDEasy/issues/1880[#1880] Reinstall all plugins for IDE in force mode +🟡 link:https://github.com/devonfw/IDEasy/issues/1512[#1512] Cannot run Intellij on Mac due to file permission error -| IDE Configuration Doc -| 🔴 -| 🔴 -| 🔴 -| 🔴 link:https://github.com/devonfw/IDEasy/issues/1185[#1185] `mac` icd on mac does not work in zshell + -🔴 link:https://github.com/devonfw/IDEasy/issues/1808[#1808] icd is not navigating into single available workspace on icd -p projec… +| Java (JDK) +| 🟡 Enhancement +| 🟡 link:https://github.com/devonfw/IDEasy/issues/72[#72] Add further editions of java -| Settings merger -| 🔴 -| 🔴 -| 🔴 -| 🔴 link:https://github.com/devonfw/IDEasy/issues/943[#943] XmlMerger: Rework Combine Text Nodes + -🟡 link:https://github.com/devonfw/IDEasy/issues/735[#735] Enhance workspace configuration with generic overlay from settings/wor… + -🟡 link:https://github.com/devonfw/IDEasy/issues/987[#987] conditional templates + -🟡 link:https://github.com/devonfw/IDEasy/issues/989[#989] allow expressions in template variable definitions + -🟡 link:https://github.com/devonfw/IDEasy/issues/992[#992] Support multiple attributes for merge:id +| Kotlin Compiler +| 🔴 Bug +| 🔴 link:https://github.com/devonfw/IDEasy/issues/857[#857] kotlinc bash does not get keyboard inputs -| Download & Extraction -| 🔴 -| 🔴 -| 🔴 -| 🔴 link:https://github.com/devonfw/IDEasy/issues/690[#690] UpdateUrls workflow timeout not working + -🔴 link:https://github.com/devonfw/IDEasy/issues/771[#771] Check URL Updater issues + -🔴 link:https://github.com/devonfw/IDEasy/issues/897[#897] HTTP Proxy with TLS termination causing errors + -🔴 link:https://github.com/devonfw/IDEasy/issues/1124[#1124] Ensure latest version of Python is installed + -🔴 link:https://github.com/devonfw/IDEasy/issues/1634[#1634] UrlUpdater creates error entries for HTTP status 200 + -🔴 link:https://github.com/devonfw/IDEasy/issues/1787[#1787] tracking yarn versions broken + -🟡 link:https://github.com/devonfw/IDEasy/issues/891[#891] Improve Url Updater Report Overview + -🟡 link:https://github.com/devonfw/IDEasy/issues/1447[#1447] Cover checksum verification in JUnit + -🟡 link:https://github.com/devonfw/IDEasy/issues/1651[#1651] Move status.json files out of ide-urls to own repo + -🟡 link:https://github.com/devonfw/IDEasy/issues/1849[#1849] Support VSCodium + -🟡 link:https://github.com/devonfw/IDEasy/issues/1884[#1884] Implement proper ZIP extraction +| kubectl +| 🔴 Bug +| 🔴 link:https://github.com/devonfw/IDEasy/issues/1659[#1659] Global tools run tool while installation is running in background -| Shell integration -| 🔴 -| 🔴 -| 🔴 -| 🔴 link:https://github.com/devonfw/IDEasy/issues/836[#836] Exit is completed in wrong places + -🔴 link:https://github.com/devonfw/IDEasy/issues/1746[#1746] ide shell broken + -🔴 link:https://github.com/devonfw/IDEasy/issues/1842[#1842] Infinite completion of exit subcommand + -🟡 link:https://github.com/devonfw/IDEasy/issues/821[#821] Allow User to remove "ide " prefix in ide shell for non-IDEasy command + -🟡 link:https://github.com/devonfw/IDEasy/issues/822[#822] Handle long CWD paths in shell prompt + -🟡 link:https://github.com/devonfw/IDEasy/issues/1135[#1135] IDEasy does not set env variables on Windows PowerShell +| Node.js +| 🔴 Bug +| 🔴 link:https://github.com/devonfw/IDEasy/issues/859[#859] node shell not starting -| Shell completion -| 🔴 -| 🔴 -| 🔴 -| 🔴 link:https://github.com/devonfw/IDEasy/issues/551[#551] Autocompletion and list-versions make OS-agnostic suggestions + -🔴 link:https://github.com/devonfw/IDEasy/issues/1842[#1842] Infinite completion of exit subcommand + -🟡 link:https://github.com/devonfw/IDEasy/issues/169[#169] Check if we want to utilize TailTipWidgets for the autocompleter + -🟡 link:https://github.com/devonfw/IDEasy/issues/1392[#1392] Smart completion +| npm +| 🔴 Bug +| 🔴 link:https://github.com/devonfw/IDEasy/issues/801[#801] npm not working on Mac + +🔴 link:https://github.com/devonfw/IDEasy/issues/1886[#1886] NpmBasedCommandlet shows wrong tool version after install + +🟡 link:https://github.com/devonfw/IDEasy/issues/700[#700] Add Npm run test -| Proxy / Network -| 🔴 -| 🔴 -| 🔴 -| 🔴 link:https://github.com/devonfw/IDEasy/issues/897[#897] HTTP Proxy with TLS termination causing errors +| pgAdmin +| 🔴 Bug +| 🔴 link:https://github.com/devonfw/IDEasy/issues/798[#798] pgadmin not working on Mac + +🔴 link:https://github.com/devonfw/IDEasy/issues/861[#861] install of pgadmin throws an IllegalStateException when the install wizz … + +🔴 link:https://github.com/devonfw/IDEasy/issues/878[#878] pgadmin does not work on Mac x64 + +🟡 link:https://github.com/devonfw/IDEasy/issues/1868[#1868] Revision of the functionality of global tool commandlets -| Security / Credentials -| 🔴 -| 🔴 -| 🔴 -| 🔴 link:https://github.com/devonfw/IDEasy/issues/772[#772] CVE-2023-7272 in org.eclipse.parsson 1.1.7 + -🔴 link:https://github.com/devonfw/IDEasy/issues/1775[#1775] Validate and Fix CPE Vendor/Product Identifiers for All Tools + -🟡 link:https://github.com/devonfw/IDEasy/issues/98[#98] Ability to secure downloads from custom repository + -🟡 link:https://github.com/devonfw/IDEasy/issues/190[#190] Improve #103: security warning for CVEs in file tool/edition/security + -🟡 link:https://github.com/devonfw/IDEasy/issues/1628[#1628] Support for OS specific CVEs +| Python +| 🔴 Bug +| 🔴 link:https://github.com/devonfw/IDEasy/issues/1124[#1124] Ensure latest version of Python is installed -| Repository management -| 🔴 -| 🔴 -| 🔴 -| 🔴 link:https://github.com/devonfw/IDEasy/issues/690[#690] UpdateUrls workflow timeout not working + -🟡 link:https://github.com/devonfw/IDEasy/issues/492[#492] Use Maven dependency cache to optimize workflow running times + -🟡 link:https://github.com/devonfw/IDEasy/issues/1164[#1164] Automatic project import + -🟡 link:https://github.com/devonfw/IDEasy/issues/1165[#1165] Automatic project import for Eclipse + -🟡 link:https://github.com/devonfw/IDEasy/issues/1167[#1167] Automatic project import for VSCode + -🟡 link:https://github.com/devonfw/IDEasy/issues/1216[#1216] Release workflow should only deploy artifacts after all tests passed +| Rancher Desktop +| 🟡 Enhancement +| 🟡 link:https://github.com/devonfw/IDEasy/issues/1868[#1868] Revision of the functionality of global tool commandlets -| Workspace management -| 🟡 -| 🟡 -| 🟡 -| 🟡 link:https://github.com/devonfw/IDEasy/issues/735[#735] Enhance workspace configuration with generic overlay from settings/wor… +| SonarQube +| 🔴 Bug +| 🔴 link:https://github.com/devonfw/IDEasy/issues/800[#800] sonar not working on Mac -| Plugin management -| 🔴 -| 🔴 -| 🔴 -| 🔴 link:https://github.com/devonfw/IDEasy/issues/1263[#1263] Fix android-studio workspace templates + -🔴 link:https://github.com/devonfw/IDEasy/issues/1352[#1352] `linux` VSCode WSL warning prompt blocking VSCode plugin installation + -🔴 link:https://github.com/devonfw/IDEasy/issues/1548[#1548] `win` Windows file locking error on update with plugins + -🔴 link:https://github.com/devonfw/IDEasy/issues/1844[#1844] `linux` `ide install vscode` or `ide vscode` freezes at "installing plugins" s… + -🟡 link:https://github.com/devonfw/IDEasy/issues/449[#449] Consider integration of continue GenAI coding assistant + -🟡 link:https://github.com/devonfw/IDEasy/issues/1525[#1525] lombok not correctly installed in eclipse + +| Terraform +| 🔴 Bug +| 🔴 link:https://github.com/devonfw/IDEasy/issues/1391[#1391] bashrc messed with terraform completions + +| uv +| 🔴 Bug +| 🔴 link:https://github.com/devonfw/IDEasy/issues/1518[#1518] uv tools are installed globally + +| VS Code +| 🔴 Bug +| 🔴 link:https://github.com/devonfw/IDEasy/issues/862[#862] vscode does not work on Mac + +🟡 link:https://github.com/devonfw/IDEasy/issues/787[#787] Provide variable to disable open new workspace + +🟡 link:https://github.com/devonfw/IDEasy/issues/1167[#1167] Automatic project import for VSCode + +🟡 link:https://github.com/devonfw/IDEasy/issues/1715[#1715] Adapt settings to inject java runtime future proove into vscode + 🟡 link:https://github.com/devonfw/IDEasy/issues/1754[#1754] Add version support to vscode settings .plugin files + -🟡 link:https://github.com/devonfw/IDEasy/issues/1880[#1880] Reinstall all plugins for IDE in force mode +🟡 link:https://github.com/devonfw/IDEasy/issues/1849[#1849] Support VSCodium -| Logging / Debug output -| 🟡 -| 🟡 -| 🟡 -| 🟡 link:https://github.com/devonfw/IDEasy/issues/1688[#1688] Remove unnecessary message in the CLI when installing a new tool + -🟡 link:https://github.com/devonfw/IDEasy/issues/1689[#1689] Fix user commnication when switching the Java version from the default… +| Yarn +| 🔴 Bug +| 🔴 link:https://github.com/devonfw/IDEasy/issues/1787[#1787] tracking yarn versions broken |=== == Unassigned Issues -50 issue(s) matched no known tool or commandlet. Add the appropriate label on GitHub or extend `TOOLS`/`COMMANDLETS` in this script. +49 issue(s) matched no known tool or commandlet label. Apply the appropriate label on GitHub, or add an entry to ``TOOLS``, ``COMMANDLETS``, or their ``labels`` list in this script. -[cols="1,4,3", options="header"] +[%header, cols="^1,4,3"] |=== -| # | Title | Labels +| Issue | Summary | Labels | link:https://github.com/devonfw/IDEasy/issues/45[#45] | Add compression for native images | enhancement @@ -516,7 +1238,7 @@ _No active blockers_ 🎉 | documentation, enhancement | link:https://github.com/devonfw/IDEasy/issues/218[#218] -| Add possibility to start a command in a new window with the process bu… +| Add possibility to start a command in a new window with the process buil … | enhancement | link:https://github.com/devonfw/IDEasy/issues/370[#370] @@ -524,7 +1246,7 @@ _No active blockers_ 🎉 | enhancement, test, integration-tests, workflow | link:https://github.com/devonfw/IDEasy/issues/378[#378] -| Missing comprehensive "Getting started guide" causing fail in getting … +| Missing comprehensive "Getting started guide" causing fail in getting st … | documentation | link:https://github.com/devonfw/IDEasy/issues/379[#379] @@ -548,7 +1270,7 @@ _No active blockers_ 🎉 | enhancement, test, process | link:https://github.com/devonfw/IDEasy/issues/611[#611] -| Git pull on settings with local branch and without remote throws excep… +| Git pull on settings with local branch and without remote throws excepti … | — | link:https://github.com/devonfw/IDEasy/issues/629[#629] @@ -564,7 +1286,7 @@ _No active blockers_ 🎉 | enhancement | link:https://github.com/devonfw/IDEasy/issues/768[#768] -| Improve IntelliJ configuration (annotation processing, auto-import, ma… +| Improve IntelliJ configuration (annotation processing, auto-import, mave … | enhancement | link:https://github.com/devonfw/IDEasy/issues/788[#788] @@ -599,10 +1321,6 @@ _No active blockers_ 🎉 | Improve and fix dependency mechanism | enhancement, dependencies -| link:https://github.com/devonfw/IDEasy/issues/1134[#1134] -| IDEasy autocompletion gets stuck if license agreement file was not fou… -| blocker - | link:https://github.com/devonfw/IDEasy/issues/1150[#1150] | Full ARM support | enhancement, Epic, ARM @@ -612,7 +1330,7 @@ _No active blockers_ 🎉 | enhancement | link:https://github.com/devonfw/IDEasy/issues/1206[#1206] -| java.util.zip.ZipException when opening Android Studio archives from v… +| java.util.zip.ZipException when opening Android Studio archives from ver … | enhancement | link:https://github.com/devonfw/IDEasy/issues/1215[#1215] @@ -688,11 +1406,11 @@ _No active blockers_ 🎉 | enhancement, windows, internal, ready-to-implement | link:https://github.com/devonfw/IDEasy/issues/1870[#1870] -| Implement generic get-version implementation for global tools under wi… +| Implement generic get-version implementation for global tools under wind … | enhancement, windows | link:https://github.com/devonfw/IDEasy/issues/1873[#1873] -| Implement generic get-edition implementation for global tools under wi… +| Implement generic get-edition implementation for global tools under wind … | enhancement, windows | link:https://github.com/devonfw/IDEasy/issues/1882[#1882] @@ -707,10 +1425,17 @@ _No active blockers_ 🎉 == How to Contribute -*New tool:* Automatic once a folder exists under `url-updater/.../url/tool/` and issues use that name as label. -Override the display name in `TOOLS["display"]`. +=== Adding a new tool +Once a folder is added under `cli/src/main/java/com/devonfw/tools/ide/tool` and issues use that folder +name as a label, the tool appears automatically in the next generated document. +Override the display name by adding an entry to ``TOOLS`` in this script. -*New commandlet:* Add an entry to `COMMANDLETS` — key = GitHub label, `"display"` = name, `"labels"` = aliases. +=== Adding a new commandlet or core feature +Add an entry to ``COMMANDLETS``: key = GitHub label, ``display`` = name, +``labels`` = list of alternative label names. Add the key to the appropriate +category in ``COMMANDLET_CATEGORIES``. -*Non-standard label:* Add it to the `"labels"` list of the matching `TOOLS` or `COMMANDLETS` entry. -Unmatched issues appear in the *Unassigned Issues* section. +=== Mapping a non-standard label +Add the label to the ``labels`` list of the matching ``TOOLS`` or +``COMMANDLETS`` entry. Issues that still match nothing appear in the +*Unassigned Issues* section. From ccf57139a19fbaabac061404ca6692bb076eb216 Mon Sep 17 00:00:00 2001 From: MarvMa <marvin.meitzner@capgemini.com> Date: Fri, 8 May 2026 08:38:29 +0200 Subject: [PATCH 09/11] #1748: update readme to reference quality status adoc, update changelog, improve code quality --- documentation/generate_quality_status.py | 568 ++++++++++------------- documentation/quality-status.adoc | 67 ++- 2 files changed, 301 insertions(+), 334 deletions(-) diff --git a/documentation/generate_quality_status.py b/documentation/generate_quality_status.py index c710c13d47..0aac7dbeb0 100644 --- a/documentation/generate_quality_status.py +++ b/documentation/generate_quality_status.py @@ -32,6 +32,7 @@ import argparse import json +import logging import os import sys import urllib.error @@ -39,13 +40,20 @@ import urllib.request from collections import defaultdict from datetime import datetime, timezone +from typing import Any, NamedTuple -# ─── Repository configuration ───────────────────────────────────────────────── +log = logging.getLogger(__name__) + +# --- Repository configuration --- REPO = "devonfw/IDEasy" API_BASE = "https://api.github.com" TOOL_FOLDER_PATH = "cli/src/main/java/com/devonfw/tools/ide/tool" +GITHUB_ACCEPT_HEADER = "application/vnd.github+json" +GITHUB_API_VERSION = "2022-11-28" +GITHUB_PAGE_SIZE = 100 + OS_LABELS = {"windows": "windows", "linux": "linux", "mac": "macOS"} OS_ORDER = ["windows", "linux", "mac"] OS_DISPLAY = {"windows": "Windows", "linux": "Linux", "mac": "macOS"} @@ -54,7 +62,10 @@ BUG_TYPE_NAMES = {"Bug", "bug"} BLOCKER_LABEL = "blocker" -# ─── Tool registry ──────────────────────────────────────────────────────────── +# Number of columns in the status tables, used for AsciiDoc column spanning. +TABLE_COLSPAN = 3 + +# --- Tool registry --- # Each key is the canonical tool folder name under TOOL_FOLDER_PATH, which is # also the default GitHub label. "display" is the human-readable table name. # "labels" lists any additional GitHub label names that map to this entry. @@ -115,7 +126,7 @@ "rancher": {"display": "Rancher Desktop"}, } -# ─── Commandlet / core-feature registry ─────────────────────────────────────── +# --- Commandlet / core-feature registry --- # Same structure as TOOLS. The key is the GitHub label for that functional area. COMMANDLETS: dict[str, dict] = { @@ -153,7 +164,7 @@ "migration": {"display": "Migration (devonfw-ide to IDEasy)"}, } -# ─── Category groupings ──────────────────────────────────────────────────────── +# --- Category groupings --- # Ordered list of (category_label, [canonical_keys]). Controls the spanning # header rows and row order in the rendered status tables. @@ -184,11 +195,11 @@ ("Migration", ["migration"]), ] -# ─── Derived lookups ────────────────────────────────────────────────────────── -# These are computed from the registries above and must not be edited directly. +# --- Derived lookups --- +# Computed from the registries above — do not edit directly. -TOOL_DISPLAY: dict[str, str] = {n: c["display"] for n, c in TOOLS.items()} -CMD_DISPLAY: dict[str, str] = {n: c["display"] for n, c in COMMANDLETS.items()} +TOOL_DISPLAY: dict[str, str] = {name: cfg["display"] for name, cfg in TOOLS.items()} +CMD_DISPLAY: dict[str, str] = {name: cfg["display"] for name, cfg in COMMANDLETS.items()} LABEL_ALIASES: dict[str, str] = { alias: name @@ -197,7 +208,7 @@ for alias in cfg.get("labels", []) } -_SKIP_LABELS: frozenset[str] = frozenset({ +SKIP_LABELS: frozenset[str] = frozenset({ BLOCKER_LABEL, "bug", "bugfix", "enhancement", "feature", "task", "Epic", "ready-to-implement", "waiting for feedback", "release", "AI", "ARM", "claude", "internal", "process", "rewrite", "software", "workflow", @@ -208,29 +219,31 @@ }) -# ─── GitHub API helpers ─────────────────────────────────────────────────────── +# --- Data model --- -def _get(path: str, token: str | None, params: dict | None = None) -> object: - """Send an authenticated GET request to the GitHub REST API. +class IssueRef(NamedTuple): + """Classified issue record used throughout the rendering pipeline.""" + number: int + title: str + url: str + bug: bool + blocker: bool + os_keys: list[str] - Args: - path: API path relative to API_BASE, e.g. "/repos/owner/repo/issues". - token: Personal access token. When ``None`` requests are unauthenticated - and subject to a 60 req/hour rate limit. - params: Optional query-string parameters. - Returns: - The parsed JSON response body. +# --- GitHub API helpers --- - Raises: - urllib.error.HTTPError: When the server returns a 4xx or 5xx status. +def _get(path: str, token: str | None, params: dict | None = None) -> Any: + """Send an authenticated GET to the GitHub REST API and return parsed JSON. + + Raises urllib.error.HTTPError on 4xx/5xx responses. """ url = f"{API_BASE}{path}" if params: url += "?" + urllib.parse.urlencode(params) req = urllib.request.Request(url) - req.add_header("Accept", "application/vnd.github+json") - req.add_header("X-GitHub-Api-Version", "2022-11-28") + req.add_header("Accept", GITHUB_ACCEPT_HEADER) + req.add_header("X-GitHub-Api-Version", GITHUB_API_VERSION) if token: req.add_header("Authorization", f"Bearer {token}") with urllib.request.urlopen(req) as resp: @@ -238,125 +251,92 @@ def _get(path: str, token: str | None, params: dict | None = None) -> object: def fetch_tool_names(token: str | None) -> list[str]: - """Return the sorted list of tool folder names from the source tree. - - Queries the GitHub Contents API for the sub-directories of TOOL_FOLDER_PATH. - Each directory name corresponds to a tool and is also its default issue label. - Returns an empty list and prints a warning if the request fails. + """Return sorted tool folder names from the source tree. - Args: - token: GitHub personal access token. + Queries the GitHub Contents API for sub-directories of TOOL_FOLDER_PATH. + Each directory name is also its default issue label. Returns an empty list + if the request fails so the rest of the pipeline can still run. """ try: entries = _get(f"/repos/{REPO}/contents/{TOOL_FOLDER_PATH}", token) return sorted( - e["name"] for e in entries - if isinstance(e, dict) and e.get("type") == "dir" + entry["name"] for entry in entries + if isinstance(entry, dict) and entry.get("type") == "dir" ) except urllib.error.HTTPError as exc: hint = "" if token else " Set GITHUB_TOKEN to avoid rate limiting." - print( - f"WARNING: Could not fetch tool list ({exc.code} {exc.reason}). " - f"Only commandlet sections will be generated.{hint}", - file=sys.stderr, + log.warning( + "Could not fetch tool list from %s (%s %s). " + "Only commandlet sections will be generated.%s", + TOOL_FOLDER_PATH, exc.code, exc.reason, hint, ) return [] - except Exception as exc: - print(f"WARNING: Could not fetch tool list ({exc}).", file=sys.stderr) + except (urllib.error.URLError, json.JSONDecodeError) as exc: + log.warning("Could not fetch tool list from %s: %s", TOOL_FOLDER_PATH, exc, exc_info=True) return [] def fetch_all_issues(token: str | None, state: str = "open") -> list[dict]: - """Fetch all non-pull-request issues from the repository with pagination. - - Args: - token: GitHub personal access token. - state: Issue state filter — ``"open"`` or ``"all"``. - - Returns: - A flat list of issue objects as returned by the GitHub API. - """ - issues, page = [], 1 + """Fetch all non-pull-request issues from the repository, handling pagination.""" + issues: list[dict] = [] + page = 1 while True: batch = _get( f"/repos/{REPO}/issues", token, - {"state": state, "per_page": 100, "page": page}, + {"state": state, "per_page": GITHUB_PAGE_SIZE, "page": page}, ) if not isinstance(batch, list) or not batch: break - issues.extend(i for i in batch if "pull_request" not in i) - if len(batch) < 100: + issues.extend(item for item in batch if "pull_request" not in item) + if len(batch) < GITHUB_PAGE_SIZE: break page += 1 return issues -# ─── Issue classification ───────────────────────────────────────────────────── +# --- Issue classification --- def label_names(issue: dict) -> set[str]: - """Return the set of label name strings attached to an issue.""" - return {lbl["name"] for lbl in issue.get("labels", [])} + return {label["name"] for label in issue.get("labels", [])} def is_bug(issue: dict, labels: set[str]) -> bool: - """Return True if the issue is classified as a bug. + """Check whether the issue counts as a bug. - Detection priority: - 1. GitHub issue type field (``issue["type"]["name"]``). - 2. Legacy ``"bug"`` label, predating GitHub issue types. - 3. ``"blocker"`` label — implies a severe bug by definition. + Detection: GitHub issue type field first, then legacy "bug" label, + then "blocker" (which implies a severe bug by definition). """ - t = issue.get("type") - if isinstance(t, dict) and t.get("name") in BUG_TYPE_NAMES: + issue_type = issue.get("type") + if isinstance(issue_type, dict) and issue_type.get("name") in BUG_TYPE_NAMES: return True return "bug" in labels or BLOCKER_LABEL in labels def is_blocker(labels: set[str]) -> bool: - """Return True if the issue carries the ``"blocker"`` label.""" return BLOCKER_LABEL in labels def os_keys_for_issue(labels: set[str]) -> list[str]: - """Return the OS keys an issue applies to. - - Issues labelled with a specific OS (e.g. ``"windows"``) are scoped to that - OS only. Issues without any OS label are treated as cross-platform and - return all keys from OS_ORDER. - """ - found = [k for k, lbl in OS_LABELS.items() if lbl in labels] + """Determine which OS keys apply. No OS label means cross-platform.""" + found = [key for key, label in OS_LABELS.items() if label in labels] return found if found else list(OS_ORDER) def topic_matches(labels: set[str], known: set[str]) -> list[str]: - """Return the canonical topic keys matched by the given label set. - - Checks both exact matches against ``known`` and indirect matches via - LABEL_ALIASES, enabling non-standard label names to map to canonical keys. + """Return canonical topic keys matched by the given label set. - Args: - labels: Label names attached to an issue. - known: Canonical key set to match against (tool keys or commandlet keys). - - Returns: - Sorted list of matching canonical keys. + Checks both direct matches against ``known`` and indirect matches via + LABEL_ALIASES so that non-standard label names resolve to canonical keys. """ matched: set[str] = set() - for lbl in labels: - if lbl in known: - matched.add(lbl) - elif lbl in LABEL_ALIASES and LABEL_ALIASES[lbl] in known: - matched.add(LABEL_ALIASES[lbl]) + for label in labels: + if label in known: + matched.add(label) + elif label in LABEL_ALIASES and LABEL_ALIASES[label] in known: + matched.add(LABEL_ALIASES[label]) return sorted(matched) -# ─── Data model ─────────────────────────────────────────────────────────────── - -#: Immutable record for a classified issue. -#: Fields: (number, title, url, is_bug, is_blocker, os_keys) -IssueRef = tuple[int, str, str, bool, bool, list[str]] - - def classify_issues( issues: list[dict], tool_keys: set[str], @@ -371,16 +351,10 @@ def classify_issues( An issue may match multiple topics and multiple OS sections simultaneously. Issues without an OS label are inserted into every OS bucket. - Args: - issues: Raw issue objects from the GitHub API. - tool_keys: Canonical tool key set used for label matching. - cmd_keys: Canonical commandlet key set used for label matching. - - Returns: - A three-tuple of: - - ``tool_data[os_key][topic]`` — IssueRef lists for tool rows - - ``cmd_data[os_key][topic]`` — IssueRef lists for commandlet rows - - ``unassigned`` — issues that matched no known topic + Returns a three-tuple of: + - tool_data[os_key][topic] — IssueRef lists for tool rows + - cmd_data[os_key][topic] — IssueRef lists for commandlet rows + - unassigned — issues that matched no known topic """ tool_data: dict = defaultdict(lambda: defaultdict(list)) cmd_data: dict = defaultdict(lambda: defaultdict(list)) @@ -391,139 +365,138 @@ def classify_issues( bug = is_bug(issue, labels) blocker = is_blocker(labels) os_keys = os_keys_for_issue(labels) - ref: IssueRef = ( - issue["number"], issue["title"], issue["html_url"], bug, blocker, os_keys + ref = IssueRef( + number=issue["number"], + title=issue["title"], + url=issue["html_url"], + bug=bug, + blocker=blocker, + os_keys=os_keys, ) - t_hits = topic_matches(labels, tool_keys) - c_hits = topic_matches(labels, cmd_keys) + tool_matches = topic_matches(labels, tool_keys) + cmd_matches = topic_matches(labels, cmd_keys) - if not t_hits and not c_hits: + if not tool_matches and not cmd_matches: unassigned.append(issue) continue - for ok in os_keys: - for t in t_hits: - tool_data[ok][t].append(ref) - for c in c_hits: - cmd_data[ok][c].append(ref) + for os_key in os_keys: + for tool_key in tool_matches: + tool_data[os_key][tool_key].append(ref) + for cmd_key in cmd_matches: + cmd_data[os_key][cmd_key].append(ref) return dict(tool_data), dict(cmd_data), unassigned -# ─── AsciiDoc rendering helpers ─────────────────────────────────────────────── +# --- AsciiDoc rendering helpers --- def _safe(text: str, max_len: int = 72) -> str: - """Sanitise text for use inside an AsciiDoc table cell. + """Sanitise text for AsciiDoc table cells — escapes pipes, truncates.""" + sanitised = text.replace("|", "-").replace("\n", " ") + if len(sanitised) > max_len: + return sanitised[:max_len] + " \u2026" + return sanitised - Replaces pipe characters (which would break cell boundaries) and newlines, - then truncates to ``max_len`` characters, appending an ellipsis if needed. - """ - s = text.replace("|", "-").replace("\n", " ") - return s[:max_len] + (" \u2026" if len(s) > max_len else "") + +def _severity_sort_key(ref: IssueRef) -> tuple: + """Sort key: blockers first, then bugs, then enhancements, then by number.""" + return (0 if ref.blocker else 1 if ref.bug else 2, ref.number) def _severity_label(bug: bool, blocker: bool) -> str: - """Return the human-readable severity label for a given bug/blocker pair.""" - if blocker: return "Blocker" - if bug: return "Bug" + if blocker: + return "Blocker" + if bug: + return "Bug" return "Enhancement" def _severity_icon(bug: bool, blocker: bool) -> str: - """Return the status emoji for a given bug/blocker pair.""" - if blocker: return "🚨" - if bug: return "🔴" + if blocker: + return "🚨" + if bug: + return "🔴" return "🟡" def _status_cell(refs: list[IssueRef]) -> str: - """Return the worst-case status cell string for a list of issue refs. - - Evaluates blockers before bugs before enhancements, so a single blocker - in an otherwise green component produces ``"🚨 Blocker"``. - """ - if not refs: return "🟢 OK" - if any(r[4] for r in refs): return "🚨 Blocker" - if any(r[3] for r in refs): return "🔴 Bug" + """Return the worst-case status string for a list of issue refs.""" + if not refs: + return "🟢 OK" + if any(ref.blocker for ref in refs): + return "🚨 Blocker" + if any(ref.bug for ref in refs): + return "🔴 Bug" return "🟡 Enhancement" def _issue_cell(refs: list[IssueRef]) -> str: - """Format a list of issue refs as an AsciiDoc line-break-separated cell. + """Format issue refs as an AsciiDoc line-break-separated cell. - Entries are sorted by severity descending (blocker → bug → enhancement), - then by issue number ascending. Each entry renders as: - ``<icon> link:<url>[#N] <title>`` + Sorted by severity descending, then issue number ascending. """ if not refs: return "—" - - def _sort_key(r: IssueRef) -> tuple: - return (0 if r[4] else 1 if r[3] else 2, r[0]) - parts = [ - f"{_severity_icon(bug, blocker)} link:{url}[#{num}] {_safe(title)}" - for num, title, url, bug, blocker, _ in sorted(refs, key=_sort_key) + f"{_severity_icon(ref.bug, ref.blocker)} link:{ref.url}[#{ref.number}] {_safe(ref.title)}" + for ref in sorted(refs, key=_severity_sort_key) ] return " +\n".join(parts) -# ─── Section renderers ──────────────────────────────────────────────────────── +# --- Section renderers --- def _bugs_all_platforms_section( tool_data: dict, cmd_data: dict, - tool_disp: dict[str, str], - cmd_disp: dict[str, str], + tool_display: dict[str, str], + cmd_display: dict[str, str], unassigned: list[dict], ) -> str: """Render the global Bugs and Blockers section. - Collects every bug and blocker from tool_data and cmd_data across all OS - buckets, then deduplicates by issue number so each issue appears once. - Also includes any bugs or blockers from the unassigned list (e.g. issues - labelled only ``"blocker"`` without a tool or commandlet label). - - Enhancements are excluded; they belong in the per-OS and commandlet tables. - - Columns: Issue | Severity | Component | Summary | Win | Linux | macOS - Rows sorted: blockers first, then bugs, both ascending by issue number. - - Args: - tool_data: Classified tool issue data from :func:`classify_issues`. - cmd_data: Classified commandlet issue data from :func:`classify_issues`. - tool_disp: Mapping of tool key to display name. - cmd_disp: Mapping of commandlet key to display name. - unassigned: Issues that matched no known topic. + Collects every bug/blocker from tool and commandlet data across all OS + buckets, deduplicates by issue number, and includes unassigned bugs/blockers. + Enhancements are excluded — they belong in the per-OS and commandlet tables. """ seen: dict[int, tuple[str, str, IssueRef]] = {} - for lbl, disp in tool_disp.items(): - for ok in OS_ORDER: - for ref in tool_data.get(ok, {}).get(lbl, []): - if (ref[3] or ref[4]) and ref[0] not in seen: - seen[ref[0]] = ("Tool", disp, ref) + for label, display_name in tool_display.items(): + for os_key in OS_ORDER: + os_bucket = tool_data.get(os_key, {}) + for ref in os_bucket.get(label, []): + if (ref.bug or ref.blocker) and ref.number not in seen: + seen[ref.number] = ("Tool", display_name, ref) - for lbl, disp in cmd_disp.items(): - for ok in OS_ORDER: - for ref in cmd_data.get(ok, {}).get(lbl, []): - if (ref[3] or ref[4]) and ref[0] not in seen: - seen[ref[0]] = ("Commandlet", disp, ref) + for label, display_name in cmd_display.items(): + for os_key in OS_ORDER: + os_bucket = cmd_data.get(os_key, {}) + for ref in os_bucket.get(label, []): + if (ref.bug or ref.blocker) and ref.number not in seen: + seen[ref.number] = ("Commandlet", display_name, ref) for issue in unassigned: - lbls = {lbl["name"] for lbl in issue.get("labels", [])} - bug = is_bug(issue, lbls) - blocker = is_blocker(lbls) + labels = {label["name"] for label in issue.get("labels", [])} + bug = is_bug(issue, labels) + blocker = is_blocker(labels) if not (bug or blocker): continue - num = issue["number"] - if num in seen: + issue_number = issue["number"] + if issue_number in seen: continue - os_keys = os_keys_for_issue(lbls) - ref: IssueRef = (num, issue["title"], issue["html_url"], bug, blocker, os_keys) - seen[num] = ("\u2014", "Unassigned", ref) + os_keys = os_keys_for_issue(labels) + ref = IssueRef( + number=issue_number, + title=issue["title"], + url=issue["html_url"], + bug=bug, + blocker=blocker, + os_keys=os_keys, + ) + seen[issue_number] = ("\u2014", "Unassigned", ref) - blocker_count = sum(1 for _, _, r in seen.values() if r[4]) + blocker_count = sum(1 for _, _, ref in seen.values() if ref.blocker) bug_count = len(seen) - blocker_count lines: list[str] = [ @@ -546,18 +519,17 @@ def _bugs_all_platforms_section( def _row_sort(item: tuple) -> tuple: _, _, ref = item - return (0 if ref[4] else 1, ref[0]) + return (0 if ref.blocker else 1, ref.number) - for _, (_, disp, ref) in sorted(seen.items(), key=lambda x: _row_sort(x[1])): - num, title, url, bug, blocker, ref_os = ref - sev = f"{_severity_icon(bug, blocker)} {_severity_label(bug, blocker)}" - os_checks = ["✓" if ok in ref_os else "—" for ok in OS_ORDER] + for _, (_, display_name, ref) in sorted(seen.items(), key=lambda x: _row_sort(x[1])): + severity = f"{_severity_icon(ref.bug, ref.blocker)} {_severity_label(ref.bug, ref.blocker)}" + os_checks = ["✓" if os_key in ref.os_keys else "—" for os_key in OS_ORDER] lines += [ - f"| link:{url}[#{num}]", - f"| {sev}", - f"| {disp}", - f"| {_safe(title)}", - *[f"| {c}" for c in os_checks], + f"| link:{ref.url}[#{ref.number}]", + f"| {severity}", + f"| {display_name}", + f"| {_safe(ref.title)}", + *[f"| {check}" for check in os_checks], "", ] @@ -566,19 +538,14 @@ def _row_sort(item: tuple) -> tuple: def _commandlets_global_table(cmd_data: dict) -> str: - """Render the single cross-OS Commandlets and Core Features section. - - Issue refs from all OS buckets are merged and deduplicated per commandlet - so that each issue appears only once. Issues specific to a single OS carry - a platform tag in brackets (e.g. ``[win]``); cross-platform issues carry - no tag. Rows are grouped by functional category; components with no open - issues are omitted. + """Render the cross-OS Commandlets and Core Features section. - Args: - cmd_data: Classified commandlet issue data from :func:`classify_issues`. + Issue refs from all OS buckets are merged and deduplicated per commandlet. + OS-specific issues carry a platform tag in brackets; cross-platform ones don't. + Components with no open issues are omitted. """ all_os = set(OS_ORDER) - N = 3 + line_break = " +\n" lines = [ "== Commandlets and Core Features", @@ -591,40 +558,39 @@ def _commandlets_global_table(cmd_data: dict) -> str: "| Commandlet / Feature | Status | Issues", ] - def _sort_key(r: IssueRef) -> tuple: - return (0 if r[4] else 1 if r[3] else 2, r[0]) - for cat_name, keys in COMMANDLET_CATEGORIES: cat_rows = [] for key in keys: if key not in CMD_DISPLAY: continue merged: dict[int, IssueRef] = {} - for ok in OS_ORDER: - for ref in cmd_data.get(ok, {}).get(key, []): - if ref[0] not in merged: - merged[ref[0]] = ref + for os_key in OS_ORDER: + os_bucket = cmd_data.get(os_key, {}) + for ref in os_bucket.get(key, []): + if ref.number not in merged: + merged[ref.number] = ref if merged: cat_rows.append((key, list(merged.values()))) if not cat_rows: continue - lines += ["", f"{N}+^h| {cat_name}"] + lines += ["", f"{TABLE_COLSPAN}+^h| {cat_name}"] for key, refs in cat_rows: parts = [] - for r in sorted(refs, key=_sort_key): - num, title, url, bug, blocker, ref_os = r - icon = _severity_icon(bug, blocker) + for ref in sorted(refs, key=_severity_sort_key): + icon = _severity_icon(ref.bug, ref.blocker) os_tag = ( - "" if set(ref_os) == all_os - else " [" + "/".join(OS_SHORT[k] for k in ref_os) + "]" + "" if set(ref.os_keys) == all_os + else " [" + "/".join(OS_SHORT[k] for k in ref.os_keys) + "]" ) - parts.append(f"{icon} link:{url}[#{num}]{os_tag} {_safe(title)}") + parts.append(f"{icon} link:{ref.url}[#{ref.number}]{os_tag} {_safe(ref.title)}") + + issue_cell = line_break.join(parts) lines += [ f"| {CMD_DISPLAY[key]}", f"| {_status_cell(refs)}", - f"| {' +' + chr(10) + ''.join(parts[0:1]) if len(parts) == 1 else (' +' + chr(10)).join(parts)}", + f"| {issue_cell}", "", ] @@ -642,23 +608,10 @@ def _os_status_table( ) -> list[str]: """Render a status table for one OS section. - Columns: Component | Status | Issues. - Components with no open issues are omitted; a note above the table states - this explicitly. - - Args: - section_heading: AsciiDoc heading text for the sub-section. - categories: Ordered category/key groupings from TOOL_CATEGORIES or - COMMANDLET_CATEGORIES. - display_map: Mapping of canonical key to display name. - os_data: ``{topic: [IssueRef]}`` for the target OS. - col_header: Header label for the first column. - grouped: When ``True``, emit spanning category header rows between - groups (suitable for commandlets). When ``False``, flatten - all rows and sort alphabetically by display name (suitable - for tools). + When grouped is False, rows are flattened and sorted alphabetically + (used for tools). When True, category spanning headers are emitted + (used for commandlets). Components with no open issues are omitted. """ - N = 3 lines: list[str] = [ f"=== {section_heading}\n", "NOTE: Components with no open issues are omitted from this table.\n", @@ -671,26 +624,26 @@ def _os_status_table( flat = sorted( ( (key, display_map[key]) - for cat_keys in (k for _, k in categories) + for cat_keys in (keys for _, keys in categories) for key in cat_keys if key in display_map ), - key=lambda x: x[1].lower(), + key=lambda pair: pair[1].lower(), ) - for key, disp in flat: + for key, display_name in flat: refs = os_data.get(key, []) if refs: - lines += [f"| {disp}", f"| {_status_cell(refs)}", f"| {_issue_cell(refs)}", ""] + lines += [f"| {display_name}", f"| {_status_cell(refs)}", f"| {_issue_cell(refs)}", ""] else: for cat_name, keys in categories: cat_rows = [ - (k, os_data.get(k, [])) - for k in keys - if k in display_map and os_data.get(k) + (key, os_data.get(key, [])) + for key in keys + if key in display_map and os_data.get(key) ] if not cat_rows: continue - lines.append(f"\n{N}+^h| {cat_name}") + lines.append(f"\n{TABLE_COLSPAN}+^h| {cat_name}") for key, refs in cat_rows: lines += [f"| {display_map[key]}", f"| {_status_cell(refs)}", f"| {_issue_cell(refs)}", ""] @@ -699,28 +652,19 @@ def _os_status_table( def _os_section(os_key: str, tool_data_for_os: dict[str, list[IssueRef]]) -> str: - """Render the Tools status section for one operating system. - - Generates a sub-heading with deduplicated issue counts and delegates to - :func:`_os_status_table` for the actual table. Commandlets are intentionally - excluded here; they are covered by the global :func:`_commandlets_global_table`. - - Args: - os_key: One of the keys from OS_ORDER (``"windows"``, etc.). - tool_data_for_os: ``{topic: [IssueRef]}`` pre-filtered for this OS. - """ + """Render the Tools status section for one operating system.""" os_name = OS_DISPLAY[os_key] os_label = OS_LABELS[os_key] - all_refs = {r[0]: r for refs in tool_data_for_os.values() for r in refs} - n_blockers = sum(1 for r in all_refs.values() if r[4]) - n_bugs = sum(1 for r in all_refs.values() if r[3] and not r[4]) - n_enhs = sum(1 for r in all_refs.values() if not r[3] and not r[4]) + all_refs = {ref.number: ref for refs in tool_data_for_os.values() for ref in refs} + blocker_count = sum(1 for ref in all_refs.values() if ref.blocker) + bug_count = sum(1 for ref in all_refs.values() if ref.bug and not ref.blocker) + enhancement_count = sum(1 for ref in all_refs.values() if not ref.bug and not ref.blocker) - stat_str = ( - f"{n_blockers} blocker(s), {n_bugs} bug(s), {n_enhs} enhancement(s)" - if all_refs else "no open issues" - ) + if all_refs: + stat_str = f"{blocker_count} blocker(s), {bug_count} bug(s), {enhancement_count} enhancement(s)" + else: + stat_str = "no open issues" lines: list[str] = [ f"== {os_name} Tools \u2014 {stat_str}\n", @@ -737,12 +681,8 @@ def _os_section(os_key: str, tool_data_for_os: dict[str, list[IssueRef]]) -> str def _unassigned_section(unassigned: list[dict]) -> str: """Render the Unassigned Issues section. - Lists every issue that matched no tool or commandlet label, including its - raw label set. This section guides maintainers in either adding labels to - the issues on GitHub or extending the registries in this script. - - Args: - unassigned: Issues collected by :func:`classify_issues`. + Lists every issue that matched no tool or commandlet label so maintainers + can either fix labels on GitHub or extend the registries in this script. """ lines: list[str] = [ "== Unassigned Issues\n", @@ -755,21 +695,21 @@ def _unassigned_section(unassigned: list[dict]) -> str: return "\n".join(lines) lines += ['[%header, cols="^1,4,3"]', "|===", "| Issue | Summary | Labels"] - for issue in sorted(unassigned, key=lambda i: i["number"]): - lbls = ", ".join(lbl["name"] for lbl in issue.get("labels", [])) + for issue in sorted(unassigned, key=lambda item: item["number"]): + label_str = ", ".join(label["name"] for label in issue.get("labels", [])) lines += [ f"| link:{issue['html_url']}[#{issue['number']}]", f"| {_safe(issue['title'])}", - f"| {lbls or '\u2014'}", + f"| {label_str or '\u2014'}", "", ] lines.append("|===\n") return "\n".join(lines) -# ─── Document header template ───────────────────────────────────────────────── +# --- Document header template --- -_HEADER = """\ +HEADER_TEMPLATE = """\ = IDEasy Quality Status :toc: left :toclevels: 3 @@ -813,46 +753,42 @@ def _unassigned_section(unassigned: list[dict]) -> str: """ -# ─── Document assembly ──────────────────────────────────────────────────────── +# --- Document assembly --- def generate_adoc(issues: list[dict], tool_names: list[str]) -> str: - """Assemble and return the complete AsciiDoc quality-status document. + """Assemble the complete AsciiDoc quality-status document. - Merges the dynamically fetched tool folder names with the statically - registered TOOLS entries so that tools present in the registry but absent - from the source tree (e.g. ``git``, ``rancher``) are still recognised. - - Args: - issues: Raw issue objects from :func:`fetch_all_issues`. - tool_names: Tool folder names from :func:`fetch_tool_names`. - - Returns: - The rendered AsciiDoc document as a string. + Merges dynamically fetched tool folder names with the static TOOLS registry + so that tools present in the registry but absent from the source tree + (e.g. git, rancher) are still recognised. """ tool_keys = set(tool_names) | set(TOOLS.keys()) cmd_keys = set(COMMANDLETS.keys()) tool_data, cmd_data, unassigned = classify_issues(issues, tool_keys, cmd_keys) + # Deduplicate across all OS buckets for global statistics seen_refs: dict[int, IssueRef] = {} - for ok in OS_ORDER: - for refs in (*tool_data.get(ok, {}).values(), *cmd_data.get(ok, {}).values()): - for r in refs: - if r[0] not in seen_refs: - seen_refs[r[0]] = r - - n_blockers = sum(1 for r in seen_refs.values() if r[4]) - n_bugs = sum(1 for r in seen_refs.values() if r[3] and not r[4]) - n_enhs = sum(1 for r in seen_refs.values() if not r[3] and not r[4]) - - header = _HEADER.format( + for os_key in OS_ORDER: + tool_bucket = tool_data.get(os_key, {}) + cmd_bucket = cmd_data.get(os_key, {}) + for refs in (*tool_bucket.values(), *cmd_bucket.values()): + for ref in refs: + if ref.number not in seen_refs: + seen_refs[ref.number] = ref + + blocker_count = sum(1 for ref in seen_refs.values() if ref.blocker) + bug_count = sum(1 for ref in seen_refs.values() if ref.bug and not ref.blocker) + enhancement_count = sum(1 for ref in seen_refs.values() if not ref.bug and not ref.blocker) + + header = HEADER_TEMPLATE.format( repo=REPO, tool_path=TOOL_FOLDER_PATH, date=datetime.now(timezone.utc).strftime("%Y-%m-%d %H:%M UTC"), total=len(seen_refs), - n_blockers=n_blockers, - n_bugs=n_bugs, - n_enhs=n_enhs, + n_blockers=blocker_count, + n_bugs=bug_count, + n_enhs=enhancement_count, unassigned=len(unassigned), ) @@ -860,10 +796,10 @@ def generate_adoc(issues: list[dict], tool_names: list[str]) -> str: header, _bugs_all_platforms_section(tool_data, cmd_data, TOOL_DISPLAY, CMD_DISPLAY, unassigned), _commandlets_global_table(cmd_data), - *[_os_section(ok, tool_data.get(ok, {})) for ok in OS_ORDER], + *[_os_section(os_key, tool_data.get(os_key, {})) for os_key in OS_ORDER], _unassigned_section(unassigned), f"""\ -== How to Contribute +== How to update this document === Adding a new tool Once a folder is added under `{TOOL_FOLDER_PATH}` and issues use that folder @@ -885,7 +821,9 @@ def generate_adoc(issues: list[dict], tool_names: list[str]) -> str: def main() -> None: - """Parse command-line arguments, fetch data, and write the output file.""" + """Entry point: parse arguments, fetch data, write the output file.""" + logging.basicConfig(level=logging.INFO, format="%(levelname)s: %(message)s") + parser = argparse.ArgumentParser( description=f"Generate quality-status.adoc for {REPO}", ) @@ -898,44 +836,46 @@ def main() -> None: args = parser.parse_args() if not args.token: - print("WARNING: No GITHUB_TOKEN — rate-limited to 60 req/hour.", file=sys.stderr) + log.warning("No GITHUB_TOKEN set — requests will be rate-limited to 60/hour.") - print("Fetching tool list from source tree ...", file=sys.stderr) + log.info("Fetching tool list from source tree ...") tool_names = fetch_tool_names(args.token) if tool_names: - print(f" {len(tool_names)} tools found: {', '.join(tool_names)}", file=sys.stderr) + log.info(" %d tools found: %s", len(tool_names), ", ".join(tool_names)) else: - print(" No tools found — check token and network.", file=sys.stderr) + log.warning(" No tools found — check token permissions and network connectivity.") - print(f"Fetching {args.state} issues from {REPO} ...", file=sys.stderr) + log.info("Fetching %s issues from %s ...", args.state, REPO) try: issues = fetch_all_issues(args.token, state=args.state) except urllib.error.HTTPError as exc: - print(f"GitHub API error: HTTP {exc.code} {exc.reason}", file=sys.stderr) + log.error("GitHub API request failed: HTTP %s %s", exc.code, exc.reason) sys.exit(1) - print(f" {len(issues)} issues loaded.", file=sys.stderr) + log.info(" %d issues loaded.", len(issues)) + # Classify once here for stats, then pass issues to generate_adoc which + # classifies again internally. The duplication is minor compared to the + # API calls above, and keeps generate_adoc self-contained. tool_keys = set(tool_names) | set(TOOLS.keys()) cmd_keys = set(COMMANDLETS.keys()) _, _, unassigned = classify_issues(issues, tool_keys, cmd_keys) matched = len(issues) - len(unassigned) pct = f" ({matched / len(issues) * 100:.1f}%)" if issues else "" - print(f" {matched} assigned{pct}, {len(unassigned)} unassigned.", file=sys.stderr) + log.info(" %d assigned%s, %d unassigned.", matched, pct, len(unassigned)) all_known = tool_keys | cmd_keys | set(LABEL_ALIASES) - all_labels = {lbl["name"] for issue in issues for lbl in issue.get("labels", [])} - unmatched = all_labels - all_known - _SKIP_LABELS + all_labels = {label["name"] for issue in issues for label in issue.get("labels", [])} + unmatched = all_labels - all_known - SKIP_LABELS if unmatched: - print( - f" Labels with no mapping (consider adding to TOOLS/COMMANDLETS): " - f"{', '.join(sorted(unmatched))}", - file=sys.stderr, + log.info( + " Labels with no mapping (consider adding to TOOLS/COMMANDLETS): %s", + ", ".join(sorted(unmatched)), ) adoc = generate_adoc(issues, tool_names) - with open(args.output, "w", encoding="utf-8") as fh: - fh.write(adoc) - print(f"Written to {args.output}", file=sys.stderr) + with open(args.output, "w", encoding="utf-8") as output_file: + output_file.write(adoc) + log.info("Written to %s", args.output) if __name__ == "__main__": diff --git a/documentation/quality-status.adoc b/documentation/quality-status.adoc index 59aea81b2c..8025c6f54f 100644 --- a/documentation/quality-status.adoc +++ b/documentation/quality-status.adoc @@ -32,16 +32,16 @@ OS section. |=== | Scope | Total | Blockers | Bugs | Enhancements -| All platforms (deduplicated) | 137 | 1 | 57 | 79 -| Unassigned (no label match) | 49 | — | — | — +| All platforms (deduplicated) | 138 | 1 | 58 | 79 +| Unassigned (no label match) | 52 | — | — | — |=== -_Generated: 2026-05-06 11:55 UTC_ +_Generated: 2026-05-08 06:27 UTC_ == Bugs and Blockers -All open bugs and blockers across all platforms — 1 blocker(s), 66 bug(s). +All open bugs and blockers across all platforms — 1 blocker(s), 68 bug(s). NOTE: Issues without an OS label are cross-platform and marked with a checkmark in every OS column. @@ -448,6 +448,14 @@ NOTE: Issues without an OS label are cross-platform and marked with a checkmark | ✓ | ✓ +| link:https://github.com/devonfw/IDEasy/issues/1512[#1512] +| 🔴 Bug +| IntelliJ IDEA +| Cannot run Intellij on Mac due to file permission error +| — +| — +| ✓ + | link:https://github.com/devonfw/IDEasy/issues/1517[#1517] | 🔴 Bug | ide install @@ -584,6 +592,14 @@ NOTE: Issues without an OS label are cross-platform and marked with a checkmark | ✓ | ✓ +| link:https://github.com/devonfw/IDEasy/issues/1901[#1901] +| 🔴 Bug +| Unassigned +| HelpCommandletTest.testIcdHelp fails on german systems +| ✓ +| ✓ +| ✓ + |=== == Commandlets and Core Features @@ -608,14 +624,16 @@ NOTE: Components with no open issues are omitted. OS-specific issues are tagged 🟡 link:https://github.com/devonfw/IDEasy/issues/1594[#1594] implement ReleaseCommandlet + 🟡 link:https://github.com/devonfw/IDEasy/issues/1821[#1821] Back up and restore user state before/after integration tests + 🟡 link:https://github.com/devonfw/IDEasy/issues/1867[#1867] Create Claude commandlet + -🟡 link:https://github.com/devonfw/IDEasy/issues/1868[#1868] Revision of the functionality of global tool commandlets +🟡 link:https://github.com/devonfw/IDEasy/issues/1868[#1868] Revision of the functionality of global tool commandlets + +🟡 link:https://github.com/devonfw/IDEasy/issues/1902[#1902] Create InsoUrlUpdater + +🟡 link:https://github.com/devonfw/IDEasy/issues/1903[#1903] Create Inso Commandlet | Core / Runtime | 🔴 Bug | 🔴 link:https://github.com/devonfw/IDEasy/issues/1041[#1041] native image has globbing active + 🔴 link:https://github.com/devonfw/IDEasy/issues/1054[#1054] Incorrect interpretation of trailling and leading spaces in version rang … + -🟡 link:https://github.com/devonfw/IDEasy/issues/871[#871] [macOS] Add progressbar to *.dmg extract process + -🟡 link:https://github.com/devonfw/IDEasy/issues/1512[#1512] [macOS] Cannot run Intellij on Mac due to file permission error +🔴 link:https://github.com/devonfw/IDEasy/issues/1512[#1512] [macOS] Cannot run Intellij on Mac due to file permission error + +🟡 link:https://github.com/devonfw/IDEasy/issues/871[#871] [macOS] Add progressbar to *.dmg extract process | ide install | 🔴 Bug @@ -747,8 +765,7 @@ NOTE: Components with no open issues are omitted. OS-specific issues are tagged 3+^h| Infrastructure | Proxy / Network | 🔴 Bug -| + -🔴 link:https://github.com/devonfw/IDEasy/issues/897[#897] HTTP Proxy with TLS termination causing errors +| 🔴 link:https://github.com/devonfw/IDEasy/issues/897[#897] HTTP Proxy with TLS termination causing errors | Security / Credentials | 🔴 Bug @@ -771,8 +788,7 @@ NOTE: Components with no open issues are omitted. OS-specific issues are tagged | Workspace management | 🟡 Enhancement -| + -🟡 link:https://github.com/devonfw/IDEasy/issues/735[#735] Enhance workspace configuration with generic overlay from settings/works … +| 🟡 link:https://github.com/devonfw/IDEasy/issues/735[#735] Enhance workspace configuration with generic overlay from settings/works … 3+^h| Plugin Management @@ -791,12 +807,11 @@ NOTE: Components with no open issues are omitted. OS-specific issues are tagged 3+^h| Observability | Logging / Debug output | 🟡 Enhancement -| 🟡 link:https://github.com/devonfw/IDEasy/issues/1688[#1688] Remove unnecessary message in the CLI when installing a new tool + -🟡 link:https://github.com/devonfw/IDEasy/issues/1689[#1689] Fix user commnication when switching the Java version from the default t … +| 🟡 link:https://github.com/devonfw/IDEasy/issues/1689[#1689] Fix user commnication when switching the Java version from the default t … |=== -== Windows Tools — 0 blocker(s), 21 bug(s), 39 enhancement(s) +== Windows Tools — 0 blocker(s), 21 bug(s), 41 enhancement(s) Open issues labelled `windows` or without any OS label (cross-platform issues appear in every OS section). @@ -932,7 +947,7 @@ NOTE: Components with no open issues are omitted from this table. |=== -== Linux Tools — 0 blocker(s), 22 bug(s), 42 enhancement(s) +== Linux Tools — 0 blocker(s), 22 bug(s), 44 enhancement(s) Open issues labelled `linux` or without any OS label (cross-platform issues appear in every OS section). @@ -1070,7 +1085,7 @@ NOTE: Components with no open issues are omitted from this table. |=== -== macOS Tools — 0 blocker(s), 30 bug(s), 41 enhancement(s) +== macOS Tools — 0 blocker(s), 31 bug(s), 42 enhancement(s) Open issues labelled `macOS` or without any OS label (cross-platform issues appear in every OS section). @@ -1151,8 +1166,8 @@ NOTE: Components with no open issues are omitted from this table. | 🔴 link:https://github.com/devonfw/IDEasy/issues/120[#120] intellij does not use our settings when we create a new project within i … + 🔴 link:https://github.com/devonfw/IDEasy/issues/717[#717] IDEasy does not start Intellij if license was not accepted + 🔴 link:https://github.com/devonfw/IDEasy/issues/1501[#1501] Starting intellij leads to error popup + -🟡 link:https://github.com/devonfw/IDEasy/issues/992[#992] Support multiple attributes for merge:id + -🟡 link:https://github.com/devonfw/IDEasy/issues/1512[#1512] Cannot run Intellij on Mac due to file permission error +🔴 link:https://github.com/devonfw/IDEasy/issues/1512[#1512] Cannot run Intellij on Mac due to file permission error + +🟡 link:https://github.com/devonfw/IDEasy/issues/992[#992] Support multiple attributes for merge:id | Java (JDK) | 🟡 Enhancement @@ -1220,7 +1235,7 @@ NOTE: Components with no open issues are omitted from this table. == Unassigned Issues -49 issue(s) matched no known tool or commandlet label. Apply the appropriate label on GitHub, or add an entry to ``TOOLS``, ``COMMANDLETS``, or their ``labels`` list in this script. +52 issue(s) matched no known tool or commandlet label. Apply the appropriate label on GitHub, or add an entry to ``TOOLS``, ``COMMANDLETS``, or their ``labels`` list in this script. [%header, cols="^1,4,3"] |=== @@ -1419,7 +1434,19 @@ NOTE: Components with no open issues are omitted from this table. | link:https://github.com/devonfw/IDEasy/issues/1893[#1893] | Fix Failing Integration Tests workflow -| integration-tests +| internal, integration-tests, ready-to-implement + +| link:https://github.com/devonfw/IDEasy/issues/1901[#1901] +| HelpCommandletTest.testIcdHelp fails on german systems +| test + +| link:https://github.com/devonfw/IDEasy/issues/1904[#1904] +| Create Inso commandlet +| enhancement + +| link:https://github.com/devonfw/IDEasy/issues/1905[#1905] +| Create InsoUrlUpdater +| enhancement |=== From a8f2c3df1b33606a14e3482fbce5702db4f1bc27 Mon Sep 17 00:00:00 2001 From: MarvMa <marvin.meitzner@capgemini.com> Date: Fri, 8 May 2026 08:38:29 +0200 Subject: [PATCH 10/11] #1748: update readme to reference quality status adoc, update changelog, improve code quality --- CHANGELOG.adoc | 1 + README.adoc | 2 + documentation/generate_quality_status.py | 568 ++++++++++------------- documentation/quality-status.adoc | 67 ++- 4 files changed, 304 insertions(+), 334 deletions(-) diff --git a/CHANGELOG.adoc b/CHANGELOG.adoc index 7c2e2ca190..f4ce2bbe80 100644 --- a/CHANGELOG.adoc +++ b/CHANGELOG.adoc @@ -22,6 +22,7 @@ Release with new features and bugfixes: * https://github.com/devonfw/IDEasy/issues/1723[#1723]: Add commandlet for GitHub Copilot CLI * https://github.com/devonfw/IDEasy/issues/1688[#1688]: Remove unnecessary message in the CLI when installing a new tool * https://github.com/devonfw/IDEasy/issues/1685[#1685]: Add Nest CLI to IDEasy commandlets +* https://github.com/devonfw/IDEasy/issues/1748[#1748]: Improve IDEasy status documentation The full list of changes for this release can be found in https://github.com/devonfw/IDEasy/milestone/44?closed=1[milestone 2026.05.001]. diff --git a/README.adoc b/README.adoc index bb89575858..a4971135d7 100644 --- a/README.adoc +++ b/README.adoc @@ -35,6 +35,8 @@ Currently we focused on support for Windows while official Linux and Mac support Further, we still recommend that you should contact us if you plan to use IDEasy in your project with a larger developer team. We surely try to fix bugs as soon as possible but we do not work extra shifts or prioritize your issues if you are blocked and we never promised any help before. +For a detailed overview of the quality and support status of IDEasy tools across operating systems, see link:../quality-status.adoc[Quality Status]. + == Setup === Prerequisites diff --git a/documentation/generate_quality_status.py b/documentation/generate_quality_status.py index c710c13d47..0aac7dbeb0 100644 --- a/documentation/generate_quality_status.py +++ b/documentation/generate_quality_status.py @@ -32,6 +32,7 @@ import argparse import json +import logging import os import sys import urllib.error @@ -39,13 +40,20 @@ import urllib.request from collections import defaultdict from datetime import datetime, timezone +from typing import Any, NamedTuple -# ─── Repository configuration ───────────────────────────────────────────────── +log = logging.getLogger(__name__) + +# --- Repository configuration --- REPO = "devonfw/IDEasy" API_BASE = "https://api.github.com" TOOL_FOLDER_PATH = "cli/src/main/java/com/devonfw/tools/ide/tool" +GITHUB_ACCEPT_HEADER = "application/vnd.github+json" +GITHUB_API_VERSION = "2022-11-28" +GITHUB_PAGE_SIZE = 100 + OS_LABELS = {"windows": "windows", "linux": "linux", "mac": "macOS"} OS_ORDER = ["windows", "linux", "mac"] OS_DISPLAY = {"windows": "Windows", "linux": "Linux", "mac": "macOS"} @@ -54,7 +62,10 @@ BUG_TYPE_NAMES = {"Bug", "bug"} BLOCKER_LABEL = "blocker" -# ─── Tool registry ──────────────────────────────────────────────────────────── +# Number of columns in the status tables, used for AsciiDoc column spanning. +TABLE_COLSPAN = 3 + +# --- Tool registry --- # Each key is the canonical tool folder name under TOOL_FOLDER_PATH, which is # also the default GitHub label. "display" is the human-readable table name. # "labels" lists any additional GitHub label names that map to this entry. @@ -115,7 +126,7 @@ "rancher": {"display": "Rancher Desktop"}, } -# ─── Commandlet / core-feature registry ─────────────────────────────────────── +# --- Commandlet / core-feature registry --- # Same structure as TOOLS. The key is the GitHub label for that functional area. COMMANDLETS: dict[str, dict] = { @@ -153,7 +164,7 @@ "migration": {"display": "Migration (devonfw-ide to IDEasy)"}, } -# ─── Category groupings ──────────────────────────────────────────────────────── +# --- Category groupings --- # Ordered list of (category_label, [canonical_keys]). Controls the spanning # header rows and row order in the rendered status tables. @@ -184,11 +195,11 @@ ("Migration", ["migration"]), ] -# ─── Derived lookups ────────────────────────────────────────────────────────── -# These are computed from the registries above and must not be edited directly. +# --- Derived lookups --- +# Computed from the registries above — do not edit directly. -TOOL_DISPLAY: dict[str, str] = {n: c["display"] for n, c in TOOLS.items()} -CMD_DISPLAY: dict[str, str] = {n: c["display"] for n, c in COMMANDLETS.items()} +TOOL_DISPLAY: dict[str, str] = {name: cfg["display"] for name, cfg in TOOLS.items()} +CMD_DISPLAY: dict[str, str] = {name: cfg["display"] for name, cfg in COMMANDLETS.items()} LABEL_ALIASES: dict[str, str] = { alias: name @@ -197,7 +208,7 @@ for alias in cfg.get("labels", []) } -_SKIP_LABELS: frozenset[str] = frozenset({ +SKIP_LABELS: frozenset[str] = frozenset({ BLOCKER_LABEL, "bug", "bugfix", "enhancement", "feature", "task", "Epic", "ready-to-implement", "waiting for feedback", "release", "AI", "ARM", "claude", "internal", "process", "rewrite", "software", "workflow", @@ -208,29 +219,31 @@ }) -# ─── GitHub API helpers ─────────────────────────────────────────────────────── +# --- Data model --- -def _get(path: str, token: str | None, params: dict | None = None) -> object: - """Send an authenticated GET request to the GitHub REST API. +class IssueRef(NamedTuple): + """Classified issue record used throughout the rendering pipeline.""" + number: int + title: str + url: str + bug: bool + blocker: bool + os_keys: list[str] - Args: - path: API path relative to API_BASE, e.g. "/repos/owner/repo/issues". - token: Personal access token. When ``None`` requests are unauthenticated - and subject to a 60 req/hour rate limit. - params: Optional query-string parameters. - Returns: - The parsed JSON response body. +# --- GitHub API helpers --- - Raises: - urllib.error.HTTPError: When the server returns a 4xx or 5xx status. +def _get(path: str, token: str | None, params: dict | None = None) -> Any: + """Send an authenticated GET to the GitHub REST API and return parsed JSON. + + Raises urllib.error.HTTPError on 4xx/5xx responses. """ url = f"{API_BASE}{path}" if params: url += "?" + urllib.parse.urlencode(params) req = urllib.request.Request(url) - req.add_header("Accept", "application/vnd.github+json") - req.add_header("X-GitHub-Api-Version", "2022-11-28") + req.add_header("Accept", GITHUB_ACCEPT_HEADER) + req.add_header("X-GitHub-Api-Version", GITHUB_API_VERSION) if token: req.add_header("Authorization", f"Bearer {token}") with urllib.request.urlopen(req) as resp: @@ -238,125 +251,92 @@ def _get(path: str, token: str | None, params: dict | None = None) -> object: def fetch_tool_names(token: str | None) -> list[str]: - """Return the sorted list of tool folder names from the source tree. - - Queries the GitHub Contents API for the sub-directories of TOOL_FOLDER_PATH. - Each directory name corresponds to a tool and is also its default issue label. - Returns an empty list and prints a warning if the request fails. + """Return sorted tool folder names from the source tree. - Args: - token: GitHub personal access token. + Queries the GitHub Contents API for sub-directories of TOOL_FOLDER_PATH. + Each directory name is also its default issue label. Returns an empty list + if the request fails so the rest of the pipeline can still run. """ try: entries = _get(f"/repos/{REPO}/contents/{TOOL_FOLDER_PATH}", token) return sorted( - e["name"] for e in entries - if isinstance(e, dict) and e.get("type") == "dir" + entry["name"] for entry in entries + if isinstance(entry, dict) and entry.get("type") == "dir" ) except urllib.error.HTTPError as exc: hint = "" if token else " Set GITHUB_TOKEN to avoid rate limiting." - print( - f"WARNING: Could not fetch tool list ({exc.code} {exc.reason}). " - f"Only commandlet sections will be generated.{hint}", - file=sys.stderr, + log.warning( + "Could not fetch tool list from %s (%s %s). " + "Only commandlet sections will be generated.%s", + TOOL_FOLDER_PATH, exc.code, exc.reason, hint, ) return [] - except Exception as exc: - print(f"WARNING: Could not fetch tool list ({exc}).", file=sys.stderr) + except (urllib.error.URLError, json.JSONDecodeError) as exc: + log.warning("Could not fetch tool list from %s: %s", TOOL_FOLDER_PATH, exc, exc_info=True) return [] def fetch_all_issues(token: str | None, state: str = "open") -> list[dict]: - """Fetch all non-pull-request issues from the repository with pagination. - - Args: - token: GitHub personal access token. - state: Issue state filter — ``"open"`` or ``"all"``. - - Returns: - A flat list of issue objects as returned by the GitHub API. - """ - issues, page = [], 1 + """Fetch all non-pull-request issues from the repository, handling pagination.""" + issues: list[dict] = [] + page = 1 while True: batch = _get( f"/repos/{REPO}/issues", token, - {"state": state, "per_page": 100, "page": page}, + {"state": state, "per_page": GITHUB_PAGE_SIZE, "page": page}, ) if not isinstance(batch, list) or not batch: break - issues.extend(i for i in batch if "pull_request" not in i) - if len(batch) < 100: + issues.extend(item for item in batch if "pull_request" not in item) + if len(batch) < GITHUB_PAGE_SIZE: break page += 1 return issues -# ─── Issue classification ───────────────────────────────────────────────────── +# --- Issue classification --- def label_names(issue: dict) -> set[str]: - """Return the set of label name strings attached to an issue.""" - return {lbl["name"] for lbl in issue.get("labels", [])} + return {label["name"] for label in issue.get("labels", [])} def is_bug(issue: dict, labels: set[str]) -> bool: - """Return True if the issue is classified as a bug. + """Check whether the issue counts as a bug. - Detection priority: - 1. GitHub issue type field (``issue["type"]["name"]``). - 2. Legacy ``"bug"`` label, predating GitHub issue types. - 3. ``"blocker"`` label — implies a severe bug by definition. + Detection: GitHub issue type field first, then legacy "bug" label, + then "blocker" (which implies a severe bug by definition). """ - t = issue.get("type") - if isinstance(t, dict) and t.get("name") in BUG_TYPE_NAMES: + issue_type = issue.get("type") + if isinstance(issue_type, dict) and issue_type.get("name") in BUG_TYPE_NAMES: return True return "bug" in labels or BLOCKER_LABEL in labels def is_blocker(labels: set[str]) -> bool: - """Return True if the issue carries the ``"blocker"`` label.""" return BLOCKER_LABEL in labels def os_keys_for_issue(labels: set[str]) -> list[str]: - """Return the OS keys an issue applies to. - - Issues labelled with a specific OS (e.g. ``"windows"``) are scoped to that - OS only. Issues without any OS label are treated as cross-platform and - return all keys from OS_ORDER. - """ - found = [k for k, lbl in OS_LABELS.items() if lbl in labels] + """Determine which OS keys apply. No OS label means cross-platform.""" + found = [key for key, label in OS_LABELS.items() if label in labels] return found if found else list(OS_ORDER) def topic_matches(labels: set[str], known: set[str]) -> list[str]: - """Return the canonical topic keys matched by the given label set. - - Checks both exact matches against ``known`` and indirect matches via - LABEL_ALIASES, enabling non-standard label names to map to canonical keys. + """Return canonical topic keys matched by the given label set. - Args: - labels: Label names attached to an issue. - known: Canonical key set to match against (tool keys or commandlet keys). - - Returns: - Sorted list of matching canonical keys. + Checks both direct matches against ``known`` and indirect matches via + LABEL_ALIASES so that non-standard label names resolve to canonical keys. """ matched: set[str] = set() - for lbl in labels: - if lbl in known: - matched.add(lbl) - elif lbl in LABEL_ALIASES and LABEL_ALIASES[lbl] in known: - matched.add(LABEL_ALIASES[lbl]) + for label in labels: + if label in known: + matched.add(label) + elif label in LABEL_ALIASES and LABEL_ALIASES[label] in known: + matched.add(LABEL_ALIASES[label]) return sorted(matched) -# ─── Data model ─────────────────────────────────────────────────────────────── - -#: Immutable record for a classified issue. -#: Fields: (number, title, url, is_bug, is_blocker, os_keys) -IssueRef = tuple[int, str, str, bool, bool, list[str]] - - def classify_issues( issues: list[dict], tool_keys: set[str], @@ -371,16 +351,10 @@ def classify_issues( An issue may match multiple topics and multiple OS sections simultaneously. Issues without an OS label are inserted into every OS bucket. - Args: - issues: Raw issue objects from the GitHub API. - tool_keys: Canonical tool key set used for label matching. - cmd_keys: Canonical commandlet key set used for label matching. - - Returns: - A three-tuple of: - - ``tool_data[os_key][topic]`` — IssueRef lists for tool rows - - ``cmd_data[os_key][topic]`` — IssueRef lists for commandlet rows - - ``unassigned`` — issues that matched no known topic + Returns a three-tuple of: + - tool_data[os_key][topic] — IssueRef lists for tool rows + - cmd_data[os_key][topic] — IssueRef lists for commandlet rows + - unassigned — issues that matched no known topic """ tool_data: dict = defaultdict(lambda: defaultdict(list)) cmd_data: dict = defaultdict(lambda: defaultdict(list)) @@ -391,139 +365,138 @@ def classify_issues( bug = is_bug(issue, labels) blocker = is_blocker(labels) os_keys = os_keys_for_issue(labels) - ref: IssueRef = ( - issue["number"], issue["title"], issue["html_url"], bug, blocker, os_keys + ref = IssueRef( + number=issue["number"], + title=issue["title"], + url=issue["html_url"], + bug=bug, + blocker=blocker, + os_keys=os_keys, ) - t_hits = topic_matches(labels, tool_keys) - c_hits = topic_matches(labels, cmd_keys) + tool_matches = topic_matches(labels, tool_keys) + cmd_matches = topic_matches(labels, cmd_keys) - if not t_hits and not c_hits: + if not tool_matches and not cmd_matches: unassigned.append(issue) continue - for ok in os_keys: - for t in t_hits: - tool_data[ok][t].append(ref) - for c in c_hits: - cmd_data[ok][c].append(ref) + for os_key in os_keys: + for tool_key in tool_matches: + tool_data[os_key][tool_key].append(ref) + for cmd_key in cmd_matches: + cmd_data[os_key][cmd_key].append(ref) return dict(tool_data), dict(cmd_data), unassigned -# ─── AsciiDoc rendering helpers ─────────────────────────────────────────────── +# --- AsciiDoc rendering helpers --- def _safe(text: str, max_len: int = 72) -> str: - """Sanitise text for use inside an AsciiDoc table cell. + """Sanitise text for AsciiDoc table cells — escapes pipes, truncates.""" + sanitised = text.replace("|", "-").replace("\n", " ") + if len(sanitised) > max_len: + return sanitised[:max_len] + " \u2026" + return sanitised - Replaces pipe characters (which would break cell boundaries) and newlines, - then truncates to ``max_len`` characters, appending an ellipsis if needed. - """ - s = text.replace("|", "-").replace("\n", " ") - return s[:max_len] + (" \u2026" if len(s) > max_len else "") + +def _severity_sort_key(ref: IssueRef) -> tuple: + """Sort key: blockers first, then bugs, then enhancements, then by number.""" + return (0 if ref.blocker else 1 if ref.bug else 2, ref.number) def _severity_label(bug: bool, blocker: bool) -> str: - """Return the human-readable severity label for a given bug/blocker pair.""" - if blocker: return "Blocker" - if bug: return "Bug" + if blocker: + return "Blocker" + if bug: + return "Bug" return "Enhancement" def _severity_icon(bug: bool, blocker: bool) -> str: - """Return the status emoji for a given bug/blocker pair.""" - if blocker: return "🚨" - if bug: return "🔴" + if blocker: + return "🚨" + if bug: + return "🔴" return "🟡" def _status_cell(refs: list[IssueRef]) -> str: - """Return the worst-case status cell string for a list of issue refs. - - Evaluates blockers before bugs before enhancements, so a single blocker - in an otherwise green component produces ``"🚨 Blocker"``. - """ - if not refs: return "🟢 OK" - if any(r[4] for r in refs): return "🚨 Blocker" - if any(r[3] for r in refs): return "🔴 Bug" + """Return the worst-case status string for a list of issue refs.""" + if not refs: + return "🟢 OK" + if any(ref.blocker for ref in refs): + return "🚨 Blocker" + if any(ref.bug for ref in refs): + return "🔴 Bug" return "🟡 Enhancement" def _issue_cell(refs: list[IssueRef]) -> str: - """Format a list of issue refs as an AsciiDoc line-break-separated cell. + """Format issue refs as an AsciiDoc line-break-separated cell. - Entries are sorted by severity descending (blocker → bug → enhancement), - then by issue number ascending. Each entry renders as: - ``<icon> link:<url>[#N] <title>`` + Sorted by severity descending, then issue number ascending. """ if not refs: return "—" - - def _sort_key(r: IssueRef) -> tuple: - return (0 if r[4] else 1 if r[3] else 2, r[0]) - parts = [ - f"{_severity_icon(bug, blocker)} link:{url}[#{num}] {_safe(title)}" - for num, title, url, bug, blocker, _ in sorted(refs, key=_sort_key) + f"{_severity_icon(ref.bug, ref.blocker)} link:{ref.url}[#{ref.number}] {_safe(ref.title)}" + for ref in sorted(refs, key=_severity_sort_key) ] return " +\n".join(parts) -# ─── Section renderers ──────────────────────────────────────────────────────── +# --- Section renderers --- def _bugs_all_platforms_section( tool_data: dict, cmd_data: dict, - tool_disp: dict[str, str], - cmd_disp: dict[str, str], + tool_display: dict[str, str], + cmd_display: dict[str, str], unassigned: list[dict], ) -> str: """Render the global Bugs and Blockers section. - Collects every bug and blocker from tool_data and cmd_data across all OS - buckets, then deduplicates by issue number so each issue appears once. - Also includes any bugs or blockers from the unassigned list (e.g. issues - labelled only ``"blocker"`` without a tool or commandlet label). - - Enhancements are excluded; they belong in the per-OS and commandlet tables. - - Columns: Issue | Severity | Component | Summary | Win | Linux | macOS - Rows sorted: blockers first, then bugs, both ascending by issue number. - - Args: - tool_data: Classified tool issue data from :func:`classify_issues`. - cmd_data: Classified commandlet issue data from :func:`classify_issues`. - tool_disp: Mapping of tool key to display name. - cmd_disp: Mapping of commandlet key to display name. - unassigned: Issues that matched no known topic. + Collects every bug/blocker from tool and commandlet data across all OS + buckets, deduplicates by issue number, and includes unassigned bugs/blockers. + Enhancements are excluded — they belong in the per-OS and commandlet tables. """ seen: dict[int, tuple[str, str, IssueRef]] = {} - for lbl, disp in tool_disp.items(): - for ok in OS_ORDER: - for ref in tool_data.get(ok, {}).get(lbl, []): - if (ref[3] or ref[4]) and ref[0] not in seen: - seen[ref[0]] = ("Tool", disp, ref) + for label, display_name in tool_display.items(): + for os_key in OS_ORDER: + os_bucket = tool_data.get(os_key, {}) + for ref in os_bucket.get(label, []): + if (ref.bug or ref.blocker) and ref.number not in seen: + seen[ref.number] = ("Tool", display_name, ref) - for lbl, disp in cmd_disp.items(): - for ok in OS_ORDER: - for ref in cmd_data.get(ok, {}).get(lbl, []): - if (ref[3] or ref[4]) and ref[0] not in seen: - seen[ref[0]] = ("Commandlet", disp, ref) + for label, display_name in cmd_display.items(): + for os_key in OS_ORDER: + os_bucket = cmd_data.get(os_key, {}) + for ref in os_bucket.get(label, []): + if (ref.bug or ref.blocker) and ref.number not in seen: + seen[ref.number] = ("Commandlet", display_name, ref) for issue in unassigned: - lbls = {lbl["name"] for lbl in issue.get("labels", [])} - bug = is_bug(issue, lbls) - blocker = is_blocker(lbls) + labels = {label["name"] for label in issue.get("labels", [])} + bug = is_bug(issue, labels) + blocker = is_blocker(labels) if not (bug or blocker): continue - num = issue["number"] - if num in seen: + issue_number = issue["number"] + if issue_number in seen: continue - os_keys = os_keys_for_issue(lbls) - ref: IssueRef = (num, issue["title"], issue["html_url"], bug, blocker, os_keys) - seen[num] = ("\u2014", "Unassigned", ref) + os_keys = os_keys_for_issue(labels) + ref = IssueRef( + number=issue_number, + title=issue["title"], + url=issue["html_url"], + bug=bug, + blocker=blocker, + os_keys=os_keys, + ) + seen[issue_number] = ("\u2014", "Unassigned", ref) - blocker_count = sum(1 for _, _, r in seen.values() if r[4]) + blocker_count = sum(1 for _, _, ref in seen.values() if ref.blocker) bug_count = len(seen) - blocker_count lines: list[str] = [ @@ -546,18 +519,17 @@ def _bugs_all_platforms_section( def _row_sort(item: tuple) -> tuple: _, _, ref = item - return (0 if ref[4] else 1, ref[0]) + return (0 if ref.blocker else 1, ref.number) - for _, (_, disp, ref) in sorted(seen.items(), key=lambda x: _row_sort(x[1])): - num, title, url, bug, blocker, ref_os = ref - sev = f"{_severity_icon(bug, blocker)} {_severity_label(bug, blocker)}" - os_checks = ["✓" if ok in ref_os else "—" for ok in OS_ORDER] + for _, (_, display_name, ref) in sorted(seen.items(), key=lambda x: _row_sort(x[1])): + severity = f"{_severity_icon(ref.bug, ref.blocker)} {_severity_label(ref.bug, ref.blocker)}" + os_checks = ["✓" if os_key in ref.os_keys else "—" for os_key in OS_ORDER] lines += [ - f"| link:{url}[#{num}]", - f"| {sev}", - f"| {disp}", - f"| {_safe(title)}", - *[f"| {c}" for c in os_checks], + f"| link:{ref.url}[#{ref.number}]", + f"| {severity}", + f"| {display_name}", + f"| {_safe(ref.title)}", + *[f"| {check}" for check in os_checks], "", ] @@ -566,19 +538,14 @@ def _row_sort(item: tuple) -> tuple: def _commandlets_global_table(cmd_data: dict) -> str: - """Render the single cross-OS Commandlets and Core Features section. - - Issue refs from all OS buckets are merged and deduplicated per commandlet - so that each issue appears only once. Issues specific to a single OS carry - a platform tag in brackets (e.g. ``[win]``); cross-platform issues carry - no tag. Rows are grouped by functional category; components with no open - issues are omitted. + """Render the cross-OS Commandlets and Core Features section. - Args: - cmd_data: Classified commandlet issue data from :func:`classify_issues`. + Issue refs from all OS buckets are merged and deduplicated per commandlet. + OS-specific issues carry a platform tag in brackets; cross-platform ones don't. + Components with no open issues are omitted. """ all_os = set(OS_ORDER) - N = 3 + line_break = " +\n" lines = [ "== Commandlets and Core Features", @@ -591,40 +558,39 @@ def _commandlets_global_table(cmd_data: dict) -> str: "| Commandlet / Feature | Status | Issues", ] - def _sort_key(r: IssueRef) -> tuple: - return (0 if r[4] else 1 if r[3] else 2, r[0]) - for cat_name, keys in COMMANDLET_CATEGORIES: cat_rows = [] for key in keys: if key not in CMD_DISPLAY: continue merged: dict[int, IssueRef] = {} - for ok in OS_ORDER: - for ref in cmd_data.get(ok, {}).get(key, []): - if ref[0] not in merged: - merged[ref[0]] = ref + for os_key in OS_ORDER: + os_bucket = cmd_data.get(os_key, {}) + for ref in os_bucket.get(key, []): + if ref.number not in merged: + merged[ref.number] = ref if merged: cat_rows.append((key, list(merged.values()))) if not cat_rows: continue - lines += ["", f"{N}+^h| {cat_name}"] + lines += ["", f"{TABLE_COLSPAN}+^h| {cat_name}"] for key, refs in cat_rows: parts = [] - for r in sorted(refs, key=_sort_key): - num, title, url, bug, blocker, ref_os = r - icon = _severity_icon(bug, blocker) + for ref in sorted(refs, key=_severity_sort_key): + icon = _severity_icon(ref.bug, ref.blocker) os_tag = ( - "" if set(ref_os) == all_os - else " [" + "/".join(OS_SHORT[k] for k in ref_os) + "]" + "" if set(ref.os_keys) == all_os + else " [" + "/".join(OS_SHORT[k] for k in ref.os_keys) + "]" ) - parts.append(f"{icon} link:{url}[#{num}]{os_tag} {_safe(title)}") + parts.append(f"{icon} link:{ref.url}[#{ref.number}]{os_tag} {_safe(ref.title)}") + + issue_cell = line_break.join(parts) lines += [ f"| {CMD_DISPLAY[key]}", f"| {_status_cell(refs)}", - f"| {' +' + chr(10) + ''.join(parts[0:1]) if len(parts) == 1 else (' +' + chr(10)).join(parts)}", + f"| {issue_cell}", "", ] @@ -642,23 +608,10 @@ def _os_status_table( ) -> list[str]: """Render a status table for one OS section. - Columns: Component | Status | Issues. - Components with no open issues are omitted; a note above the table states - this explicitly. - - Args: - section_heading: AsciiDoc heading text for the sub-section. - categories: Ordered category/key groupings from TOOL_CATEGORIES or - COMMANDLET_CATEGORIES. - display_map: Mapping of canonical key to display name. - os_data: ``{topic: [IssueRef]}`` for the target OS. - col_header: Header label for the first column. - grouped: When ``True``, emit spanning category header rows between - groups (suitable for commandlets). When ``False``, flatten - all rows and sort alphabetically by display name (suitable - for tools). + When grouped is False, rows are flattened and sorted alphabetically + (used for tools). When True, category spanning headers are emitted + (used for commandlets). Components with no open issues are omitted. """ - N = 3 lines: list[str] = [ f"=== {section_heading}\n", "NOTE: Components with no open issues are omitted from this table.\n", @@ -671,26 +624,26 @@ def _os_status_table( flat = sorted( ( (key, display_map[key]) - for cat_keys in (k for _, k in categories) + for cat_keys in (keys for _, keys in categories) for key in cat_keys if key in display_map ), - key=lambda x: x[1].lower(), + key=lambda pair: pair[1].lower(), ) - for key, disp in flat: + for key, display_name in flat: refs = os_data.get(key, []) if refs: - lines += [f"| {disp}", f"| {_status_cell(refs)}", f"| {_issue_cell(refs)}", ""] + lines += [f"| {display_name}", f"| {_status_cell(refs)}", f"| {_issue_cell(refs)}", ""] else: for cat_name, keys in categories: cat_rows = [ - (k, os_data.get(k, [])) - for k in keys - if k in display_map and os_data.get(k) + (key, os_data.get(key, [])) + for key in keys + if key in display_map and os_data.get(key) ] if not cat_rows: continue - lines.append(f"\n{N}+^h| {cat_name}") + lines.append(f"\n{TABLE_COLSPAN}+^h| {cat_name}") for key, refs in cat_rows: lines += [f"| {display_map[key]}", f"| {_status_cell(refs)}", f"| {_issue_cell(refs)}", ""] @@ -699,28 +652,19 @@ def _os_status_table( def _os_section(os_key: str, tool_data_for_os: dict[str, list[IssueRef]]) -> str: - """Render the Tools status section for one operating system. - - Generates a sub-heading with deduplicated issue counts and delegates to - :func:`_os_status_table` for the actual table. Commandlets are intentionally - excluded here; they are covered by the global :func:`_commandlets_global_table`. - - Args: - os_key: One of the keys from OS_ORDER (``"windows"``, etc.). - tool_data_for_os: ``{topic: [IssueRef]}`` pre-filtered for this OS. - """ + """Render the Tools status section for one operating system.""" os_name = OS_DISPLAY[os_key] os_label = OS_LABELS[os_key] - all_refs = {r[0]: r for refs in tool_data_for_os.values() for r in refs} - n_blockers = sum(1 for r in all_refs.values() if r[4]) - n_bugs = sum(1 for r in all_refs.values() if r[3] and not r[4]) - n_enhs = sum(1 for r in all_refs.values() if not r[3] and not r[4]) + all_refs = {ref.number: ref for refs in tool_data_for_os.values() for ref in refs} + blocker_count = sum(1 for ref in all_refs.values() if ref.blocker) + bug_count = sum(1 for ref in all_refs.values() if ref.bug and not ref.blocker) + enhancement_count = sum(1 for ref in all_refs.values() if not ref.bug and not ref.blocker) - stat_str = ( - f"{n_blockers} blocker(s), {n_bugs} bug(s), {n_enhs} enhancement(s)" - if all_refs else "no open issues" - ) + if all_refs: + stat_str = f"{blocker_count} blocker(s), {bug_count} bug(s), {enhancement_count} enhancement(s)" + else: + stat_str = "no open issues" lines: list[str] = [ f"== {os_name} Tools \u2014 {stat_str}\n", @@ -737,12 +681,8 @@ def _os_section(os_key: str, tool_data_for_os: dict[str, list[IssueRef]]) -> str def _unassigned_section(unassigned: list[dict]) -> str: """Render the Unassigned Issues section. - Lists every issue that matched no tool or commandlet label, including its - raw label set. This section guides maintainers in either adding labels to - the issues on GitHub or extending the registries in this script. - - Args: - unassigned: Issues collected by :func:`classify_issues`. + Lists every issue that matched no tool or commandlet label so maintainers + can either fix labels on GitHub or extend the registries in this script. """ lines: list[str] = [ "== Unassigned Issues\n", @@ -755,21 +695,21 @@ def _unassigned_section(unassigned: list[dict]) -> str: return "\n".join(lines) lines += ['[%header, cols="^1,4,3"]', "|===", "| Issue | Summary | Labels"] - for issue in sorted(unassigned, key=lambda i: i["number"]): - lbls = ", ".join(lbl["name"] for lbl in issue.get("labels", [])) + for issue in sorted(unassigned, key=lambda item: item["number"]): + label_str = ", ".join(label["name"] for label in issue.get("labels", [])) lines += [ f"| link:{issue['html_url']}[#{issue['number']}]", f"| {_safe(issue['title'])}", - f"| {lbls or '\u2014'}", + f"| {label_str or '\u2014'}", "", ] lines.append("|===\n") return "\n".join(lines) -# ─── Document header template ───────────────────────────────────────────────── +# --- Document header template --- -_HEADER = """\ +HEADER_TEMPLATE = """\ = IDEasy Quality Status :toc: left :toclevels: 3 @@ -813,46 +753,42 @@ def _unassigned_section(unassigned: list[dict]) -> str: """ -# ─── Document assembly ──────────────────────────────────────────────────────── +# --- Document assembly --- def generate_adoc(issues: list[dict], tool_names: list[str]) -> str: - """Assemble and return the complete AsciiDoc quality-status document. + """Assemble the complete AsciiDoc quality-status document. - Merges the dynamically fetched tool folder names with the statically - registered TOOLS entries so that tools present in the registry but absent - from the source tree (e.g. ``git``, ``rancher``) are still recognised. - - Args: - issues: Raw issue objects from :func:`fetch_all_issues`. - tool_names: Tool folder names from :func:`fetch_tool_names`. - - Returns: - The rendered AsciiDoc document as a string. + Merges dynamically fetched tool folder names with the static TOOLS registry + so that tools present in the registry but absent from the source tree + (e.g. git, rancher) are still recognised. """ tool_keys = set(tool_names) | set(TOOLS.keys()) cmd_keys = set(COMMANDLETS.keys()) tool_data, cmd_data, unassigned = classify_issues(issues, tool_keys, cmd_keys) + # Deduplicate across all OS buckets for global statistics seen_refs: dict[int, IssueRef] = {} - for ok in OS_ORDER: - for refs in (*tool_data.get(ok, {}).values(), *cmd_data.get(ok, {}).values()): - for r in refs: - if r[0] not in seen_refs: - seen_refs[r[0]] = r - - n_blockers = sum(1 for r in seen_refs.values() if r[4]) - n_bugs = sum(1 for r in seen_refs.values() if r[3] and not r[4]) - n_enhs = sum(1 for r in seen_refs.values() if not r[3] and not r[4]) - - header = _HEADER.format( + for os_key in OS_ORDER: + tool_bucket = tool_data.get(os_key, {}) + cmd_bucket = cmd_data.get(os_key, {}) + for refs in (*tool_bucket.values(), *cmd_bucket.values()): + for ref in refs: + if ref.number not in seen_refs: + seen_refs[ref.number] = ref + + blocker_count = sum(1 for ref in seen_refs.values() if ref.blocker) + bug_count = sum(1 for ref in seen_refs.values() if ref.bug and not ref.blocker) + enhancement_count = sum(1 for ref in seen_refs.values() if not ref.bug and not ref.blocker) + + header = HEADER_TEMPLATE.format( repo=REPO, tool_path=TOOL_FOLDER_PATH, date=datetime.now(timezone.utc).strftime("%Y-%m-%d %H:%M UTC"), total=len(seen_refs), - n_blockers=n_blockers, - n_bugs=n_bugs, - n_enhs=n_enhs, + n_blockers=blocker_count, + n_bugs=bug_count, + n_enhs=enhancement_count, unassigned=len(unassigned), ) @@ -860,10 +796,10 @@ def generate_adoc(issues: list[dict], tool_names: list[str]) -> str: header, _bugs_all_platforms_section(tool_data, cmd_data, TOOL_DISPLAY, CMD_DISPLAY, unassigned), _commandlets_global_table(cmd_data), - *[_os_section(ok, tool_data.get(ok, {})) for ok in OS_ORDER], + *[_os_section(os_key, tool_data.get(os_key, {})) for os_key in OS_ORDER], _unassigned_section(unassigned), f"""\ -== How to Contribute +== How to update this document === Adding a new tool Once a folder is added under `{TOOL_FOLDER_PATH}` and issues use that folder @@ -885,7 +821,9 @@ def generate_adoc(issues: list[dict], tool_names: list[str]) -> str: def main() -> None: - """Parse command-line arguments, fetch data, and write the output file.""" + """Entry point: parse arguments, fetch data, write the output file.""" + logging.basicConfig(level=logging.INFO, format="%(levelname)s: %(message)s") + parser = argparse.ArgumentParser( description=f"Generate quality-status.adoc for {REPO}", ) @@ -898,44 +836,46 @@ def main() -> None: args = parser.parse_args() if not args.token: - print("WARNING: No GITHUB_TOKEN — rate-limited to 60 req/hour.", file=sys.stderr) + log.warning("No GITHUB_TOKEN set — requests will be rate-limited to 60/hour.") - print("Fetching tool list from source tree ...", file=sys.stderr) + log.info("Fetching tool list from source tree ...") tool_names = fetch_tool_names(args.token) if tool_names: - print(f" {len(tool_names)} tools found: {', '.join(tool_names)}", file=sys.stderr) + log.info(" %d tools found: %s", len(tool_names), ", ".join(tool_names)) else: - print(" No tools found — check token and network.", file=sys.stderr) + log.warning(" No tools found — check token permissions and network connectivity.") - print(f"Fetching {args.state} issues from {REPO} ...", file=sys.stderr) + log.info("Fetching %s issues from %s ...", args.state, REPO) try: issues = fetch_all_issues(args.token, state=args.state) except urllib.error.HTTPError as exc: - print(f"GitHub API error: HTTP {exc.code} {exc.reason}", file=sys.stderr) + log.error("GitHub API request failed: HTTP %s %s", exc.code, exc.reason) sys.exit(1) - print(f" {len(issues)} issues loaded.", file=sys.stderr) + log.info(" %d issues loaded.", len(issues)) + # Classify once here for stats, then pass issues to generate_adoc which + # classifies again internally. The duplication is minor compared to the + # API calls above, and keeps generate_adoc self-contained. tool_keys = set(tool_names) | set(TOOLS.keys()) cmd_keys = set(COMMANDLETS.keys()) _, _, unassigned = classify_issues(issues, tool_keys, cmd_keys) matched = len(issues) - len(unassigned) pct = f" ({matched / len(issues) * 100:.1f}%)" if issues else "" - print(f" {matched} assigned{pct}, {len(unassigned)} unassigned.", file=sys.stderr) + log.info(" %d assigned%s, %d unassigned.", matched, pct, len(unassigned)) all_known = tool_keys | cmd_keys | set(LABEL_ALIASES) - all_labels = {lbl["name"] for issue in issues for lbl in issue.get("labels", [])} - unmatched = all_labels - all_known - _SKIP_LABELS + all_labels = {label["name"] for issue in issues for label in issue.get("labels", [])} + unmatched = all_labels - all_known - SKIP_LABELS if unmatched: - print( - f" Labels with no mapping (consider adding to TOOLS/COMMANDLETS): " - f"{', '.join(sorted(unmatched))}", - file=sys.stderr, + log.info( + " Labels with no mapping (consider adding to TOOLS/COMMANDLETS): %s", + ", ".join(sorted(unmatched)), ) adoc = generate_adoc(issues, tool_names) - with open(args.output, "w", encoding="utf-8") as fh: - fh.write(adoc) - print(f"Written to {args.output}", file=sys.stderr) + with open(args.output, "w", encoding="utf-8") as output_file: + output_file.write(adoc) + log.info("Written to %s", args.output) if __name__ == "__main__": diff --git a/documentation/quality-status.adoc b/documentation/quality-status.adoc index 59aea81b2c..8025c6f54f 100644 --- a/documentation/quality-status.adoc +++ b/documentation/quality-status.adoc @@ -32,16 +32,16 @@ OS section. |=== | Scope | Total | Blockers | Bugs | Enhancements -| All platforms (deduplicated) | 137 | 1 | 57 | 79 -| Unassigned (no label match) | 49 | — | — | — +| All platforms (deduplicated) | 138 | 1 | 58 | 79 +| Unassigned (no label match) | 52 | — | — | — |=== -_Generated: 2026-05-06 11:55 UTC_ +_Generated: 2026-05-08 06:27 UTC_ == Bugs and Blockers -All open bugs and blockers across all platforms — 1 blocker(s), 66 bug(s). +All open bugs and blockers across all platforms — 1 blocker(s), 68 bug(s). NOTE: Issues without an OS label are cross-platform and marked with a checkmark in every OS column. @@ -448,6 +448,14 @@ NOTE: Issues without an OS label are cross-platform and marked with a checkmark | ✓ | ✓ +| link:https://github.com/devonfw/IDEasy/issues/1512[#1512] +| 🔴 Bug +| IntelliJ IDEA +| Cannot run Intellij on Mac due to file permission error +| — +| — +| ✓ + | link:https://github.com/devonfw/IDEasy/issues/1517[#1517] | 🔴 Bug | ide install @@ -584,6 +592,14 @@ NOTE: Issues without an OS label are cross-platform and marked with a checkmark | ✓ | ✓ +| link:https://github.com/devonfw/IDEasy/issues/1901[#1901] +| 🔴 Bug +| Unassigned +| HelpCommandletTest.testIcdHelp fails on german systems +| ✓ +| ✓ +| ✓ + |=== == Commandlets and Core Features @@ -608,14 +624,16 @@ NOTE: Components with no open issues are omitted. OS-specific issues are tagged 🟡 link:https://github.com/devonfw/IDEasy/issues/1594[#1594] implement ReleaseCommandlet + 🟡 link:https://github.com/devonfw/IDEasy/issues/1821[#1821] Back up and restore user state before/after integration tests + 🟡 link:https://github.com/devonfw/IDEasy/issues/1867[#1867] Create Claude commandlet + -🟡 link:https://github.com/devonfw/IDEasy/issues/1868[#1868] Revision of the functionality of global tool commandlets +🟡 link:https://github.com/devonfw/IDEasy/issues/1868[#1868] Revision of the functionality of global tool commandlets + +🟡 link:https://github.com/devonfw/IDEasy/issues/1902[#1902] Create InsoUrlUpdater + +🟡 link:https://github.com/devonfw/IDEasy/issues/1903[#1903] Create Inso Commandlet | Core / Runtime | 🔴 Bug | 🔴 link:https://github.com/devonfw/IDEasy/issues/1041[#1041] native image has globbing active + 🔴 link:https://github.com/devonfw/IDEasy/issues/1054[#1054] Incorrect interpretation of trailling and leading spaces in version rang … + -🟡 link:https://github.com/devonfw/IDEasy/issues/871[#871] [macOS] Add progressbar to *.dmg extract process + -🟡 link:https://github.com/devonfw/IDEasy/issues/1512[#1512] [macOS] Cannot run Intellij on Mac due to file permission error +🔴 link:https://github.com/devonfw/IDEasy/issues/1512[#1512] [macOS] Cannot run Intellij on Mac due to file permission error + +🟡 link:https://github.com/devonfw/IDEasy/issues/871[#871] [macOS] Add progressbar to *.dmg extract process | ide install | 🔴 Bug @@ -747,8 +765,7 @@ NOTE: Components with no open issues are omitted. OS-specific issues are tagged 3+^h| Infrastructure | Proxy / Network | 🔴 Bug -| + -🔴 link:https://github.com/devonfw/IDEasy/issues/897[#897] HTTP Proxy with TLS termination causing errors +| 🔴 link:https://github.com/devonfw/IDEasy/issues/897[#897] HTTP Proxy with TLS termination causing errors | Security / Credentials | 🔴 Bug @@ -771,8 +788,7 @@ NOTE: Components with no open issues are omitted. OS-specific issues are tagged | Workspace management | 🟡 Enhancement -| + -🟡 link:https://github.com/devonfw/IDEasy/issues/735[#735] Enhance workspace configuration with generic overlay from settings/works … +| 🟡 link:https://github.com/devonfw/IDEasy/issues/735[#735] Enhance workspace configuration with generic overlay from settings/works … 3+^h| Plugin Management @@ -791,12 +807,11 @@ NOTE: Components with no open issues are omitted. OS-specific issues are tagged 3+^h| Observability | Logging / Debug output | 🟡 Enhancement -| 🟡 link:https://github.com/devonfw/IDEasy/issues/1688[#1688] Remove unnecessary message in the CLI when installing a new tool + -🟡 link:https://github.com/devonfw/IDEasy/issues/1689[#1689] Fix user commnication when switching the Java version from the default t … +| 🟡 link:https://github.com/devonfw/IDEasy/issues/1689[#1689] Fix user commnication when switching the Java version from the default t … |=== -== Windows Tools — 0 blocker(s), 21 bug(s), 39 enhancement(s) +== Windows Tools — 0 blocker(s), 21 bug(s), 41 enhancement(s) Open issues labelled `windows` or without any OS label (cross-platform issues appear in every OS section). @@ -932,7 +947,7 @@ NOTE: Components with no open issues are omitted from this table. |=== -== Linux Tools — 0 blocker(s), 22 bug(s), 42 enhancement(s) +== Linux Tools — 0 blocker(s), 22 bug(s), 44 enhancement(s) Open issues labelled `linux` or without any OS label (cross-platform issues appear in every OS section). @@ -1070,7 +1085,7 @@ NOTE: Components with no open issues are omitted from this table. |=== -== macOS Tools — 0 blocker(s), 30 bug(s), 41 enhancement(s) +== macOS Tools — 0 blocker(s), 31 bug(s), 42 enhancement(s) Open issues labelled `macOS` or without any OS label (cross-platform issues appear in every OS section). @@ -1151,8 +1166,8 @@ NOTE: Components with no open issues are omitted from this table. | 🔴 link:https://github.com/devonfw/IDEasy/issues/120[#120] intellij does not use our settings when we create a new project within i … + 🔴 link:https://github.com/devonfw/IDEasy/issues/717[#717] IDEasy does not start Intellij if license was not accepted + 🔴 link:https://github.com/devonfw/IDEasy/issues/1501[#1501] Starting intellij leads to error popup + -🟡 link:https://github.com/devonfw/IDEasy/issues/992[#992] Support multiple attributes for merge:id + -🟡 link:https://github.com/devonfw/IDEasy/issues/1512[#1512] Cannot run Intellij on Mac due to file permission error +🔴 link:https://github.com/devonfw/IDEasy/issues/1512[#1512] Cannot run Intellij on Mac due to file permission error + +🟡 link:https://github.com/devonfw/IDEasy/issues/992[#992] Support multiple attributes for merge:id | Java (JDK) | 🟡 Enhancement @@ -1220,7 +1235,7 @@ NOTE: Components with no open issues are omitted from this table. == Unassigned Issues -49 issue(s) matched no known tool or commandlet label. Apply the appropriate label on GitHub, or add an entry to ``TOOLS``, ``COMMANDLETS``, or their ``labels`` list in this script. +52 issue(s) matched no known tool or commandlet label. Apply the appropriate label on GitHub, or add an entry to ``TOOLS``, ``COMMANDLETS``, or their ``labels`` list in this script. [%header, cols="^1,4,3"] |=== @@ -1419,7 +1434,19 @@ NOTE: Components with no open issues are omitted from this table. | link:https://github.com/devonfw/IDEasy/issues/1893[#1893] | Fix Failing Integration Tests workflow -| integration-tests +| internal, integration-tests, ready-to-implement + +| link:https://github.com/devonfw/IDEasy/issues/1901[#1901] +| HelpCommandletTest.testIcdHelp fails on german systems +| test + +| link:https://github.com/devonfw/IDEasy/issues/1904[#1904] +| Create Inso commandlet +| enhancement + +| link:https://github.com/devonfw/IDEasy/issues/1905[#1905] +| Create InsoUrlUpdater +| enhancement |=== From 979629d73e1da90a9e7c25eb836ae7e8880b8065 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=B6rg=20Hohwiller?= <hohwille@users.noreply.github.com> Date: Sun, 17 May 2026 16:46:38 +0200 Subject: [PATCH 11/11] Update README to reflect IDEasy's stability Removed outdated information about OS support and developer team recommendations. --- README.adoc | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/README.adoc b/README.adoc index a4971135d7..5d35a32030 100644 --- a/README.adoc +++ b/README.adoc @@ -31,10 +31,8 @@ See link:documentation/features.adoc[features]. == Status -Currently we focused on support for Windows while official Linux and Mac support are still a little bit work in progress (see e.g. bug https://github.com/devonfw/IDEasy/issues/451[#451]). -Further, we still recommend that you should contact us if you plan to use IDEasy in your project with a larger developer team. -We surely try to fix bugs as soon as possible but we do not work extra shifts or prioritize your issues if you are blocked and we never promised any help before. - +IDEasy is stable and ready for production usage. +However, there may be some know issues. For a detailed overview of the quality and support status of IDEasy tools across operating systems, see link:../quality-status.adoc[Quality Status]. == Setup