An unofficial rules engine for the world's greatest card game.
This report summarizes scanner evidence for Card-Forge/forge, a Java project with 2,870 GitHub stars. SynthScan examined 1,393,992 lines of code across 40899 source files, recording 360 pattern matches distributed across 17 syntactic categories. The legacy adjusted pattern signal is 0.3 (Low pattern signal); it is not an authorship estimate.
Use the findings to ask whether maintainers can explain intent, verify dependencies, simplify unnecessary scaffolding, and focus review effort. Risk Payload v1 adds ownership, supply-chain, over-engineering, and review-effort vectors when available. These are prompts for human verification, not probabilities, security findings, or measured maintenance costs.
Use each vector to guide manual verification of the underlying findings.
Payload schema: 1.0.0 · Engine: 2.0.0 · Scoring: heuristic-density-v1 · Scan date: 2026-10-31.
Can maintainers explain intent, assumptions, and trade-offs? 317 finding(s).
Are imports declared and package/API names verified? 20 finding(s).
Are wrappers, guards, and repeated structures necessary? 33 finding(s).
Which changes need focused human review? 360 finding(s).
This chart tracks the legacy adjusted pattern score across scan runs. Changes can reflect source changes, scan coverage, or detector/scoring versions; they do not measure AI adoption or prove that a team refactored code. Compare runs only when their scoring versions are compatible. The dashed line tracks the raw pattern-hit count.
Groups findings by configured severity weight. Severity is not a confidence estimate, security rating, or proof that a package is missing. Verify imports against the project's manifests and inspect each finding in its local design context.
This horizontal bar chart shows where configured pattern scores accumulate across directories. Treat the bars as locations to inspect, not as evidence of authorship or code quality. Use the file-level findings to decide whether a directory needs a focused ownership, dependency, complexity, or review check.
The scanner identified 360 distinct pattern matches across 17 syntactic categories. Each entry below represents a discrete location in the source code where the engine recorded a detector match to inspect in context. Expand any category row to inspect the individual file paths, line numbers, code snippets, and the lexical context (CODE, COMMENT, or STRING) in which each match was detected.
Reading the findings table: The Severity column indicates the configured finding weight (CRITICAL / HIGH / MEDIUM / LOW). The Context column identifies whether the match occurred inside executable code, an inline comment, or a string literal — legacy comment-context matches receive a ×1.5 score weight. The ⚡ bolt icon marks clustered matches: three or more patterns within a 10-line window, each receiving an additional ×1.5 density multiplier under the legacy scoring model.
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | forge-gui-ios/pipeline/relocate-time.cfg | 1 | # Relocate the ThreeTen backport into the java.time namespace so upstream | COMMENT |
| LOW | forge-gui-ios/pipeline/ios-pipeline.sh | 1 | #!/bin/bash | COMMENT |
| LOW | forge-gui-ios/pipeline/ios-pipeline.sh | 21 | # APP_EXEC executable name (default: app.executable from robovm.properties) | COMMENT |
| LOW | forge-core/src/main/java/forge/token/TokenDb.java | 21 | // token_name | COMMENT |
| LOW | …/main/java/forge/item/generation/BoosterGenerator.java | 161 | // 1 Rare or Mythic rare (distribution ratio same as nonfoils) | COMMENT |
| LOW | forge-gui-desktop/src/main/java/forge/GuiDesktop.java | 301 | // escapes, and a nested one can name a directory that does not exist, which | COMMENT |
| LOW | …src/main/java/forge/screens/deckeditor/DeckImport.java | 841 | } | COMMENT |
| LOW | forge-gui-desktop/src/main/java/forge/view/Main.java | 41 | // -Djava.awt.headless=false on the command line, since it runs before GraphicsEnvironment | COMMENT |
| LOW | …src/main/java/forge/adventure/editor/TextListEdit.java | 41 | // fc.setCurrentDirectory(new File(Config.instance().getFilePath(""))); | COMMENT |
| LOW | forge-gui-mobile/src/forge/util/Shaders.java | 1041 | // " return hue * ( 1.630\n" + | COMMENT |
| LOW | forge-gui-mobile/src/forge/util/Shaders.java | 1061 | // " + hue * ( 3.659\n" + | COMMENT |
| LOW | forge-gui-mobile/src/forge/util/Shaders.java | 1081 | // " return pow(hue, 0.5625);\n" + | COMMENT |
| LOW | forge-gui-mobile/src/forge/util/Shaders.java | 1101 | COMMENT | |
| LOW | …rc/forge/adventure/util/pathfinding/NavigationMap.java | 41 | // | COMMENT |
| LOW | …rc/forge/adventure/util/pathfinding/NavigationMap.java | 61 | // | COMMENT |
| LOW | …rc/forge/adventure/util/pathfinding/NavigationMap.java | 81 | // if (i > 0 && j + 1 < height) { | COMMENT |
| LOW | …rc/forge/adventure/util/pathfinding/NavigationMap.java | 261 | throw(e); | COMMENT |
| LOW | …rc/forge/adventure/util/pathfinding/NavigationMap.java | 281 | // if (!(originPrecalculated && destinationPrecalculated)) { | COMMENT |
| LOW | …rc/forge/adventure/util/pathfinding/NavigationMap.java | 301 | // if (destination.epsilonEquals(vertices.get(i).pos)) | COMMENT |
| LOW | …rc/forge/adventure/util/pathfinding/NavigationMap.java | 321 | // if (!rayCollided) { | COMMENT |
| LOW | …e-gui-mobile/src/forge/screens/settings/FilesPage.java | 141 | // @Override | COMMENT |
| LOW | docs/Adventure/Dungeons.md | 21 | ### Aerie | COMMENT |
| LOW | docs/Adventure/Dungeons.md | 41 | ### Phyrexian Outposts | COMMENT |
| LOW | docs/Adventure/Dungeons.md | 61 | ### Nahiri's Encampment | COMMENT |
| LOW | docs/Adventure/Dungeons.md | 81 | ### Sorin's Dungeon | COMMENT |
| LOW | …ame/src/main/java/forge/game/ability/AbilityUtils.java | 3921 | // Refined qualities | COMMENT |
| LOW | forge-gui/res/draft/rankings_cubecobra.txt | 1 | Rank|Name|Rarity|Set | COMMENT |
| LOW | forge-gui/res/draft/rankings_cubecobra.txt | 21 | #20|The Warrior|C|CUSTOM | COMMENT |
| LOW | forge-gui/res/draft/rankings_cubecobra.txt | 41 | #40|Oracle of the Alpha|C|CUSTOM | COMMENT |
| LOW | forge-gui/res/draft/rankings_cubecobra.txt | 61 | #60|Forth Eorlingas!|C|CUSTOM | COMMENT |
| LOW | forge-gui/res/draft/rankings_cubecobra.txt | 81 | #80|Broadside Bombardiers|C|CUSTOM | COMMENT |
| LOW | forge-gui/res/draft/rankings_cubecobra.txt | 101 | #100|Jace, the Mind Sculptor|C|CUSTOM | COMMENT |
| LOW | forge-gui/res/draft/rankings_cubecobra.txt | 121 | #120|Fury|C|CUSTOM | COMMENT |
| LOW | forge-gui/res/draft/rankings_cubecobra.txt | 141 | #140|Snapcaster Mage|C|CUSTOM | COMMENT |
| LOW | forge-gui/res/draft/rankings_cubecobra.txt | 161 | #160|Mystic Confluence|C|CUSTOM | COMMENT |
| LOW | forge-gui/res/draft/rankings_cubecobra.txt | 181 | #180|Your Puny Minds Cannot Fathom|C|CUSTOM | COMMENT |
| LOW | forge-gui/res/draft/rankings_cubecobra.txt | 201 | #200|Necroskitter|C|CUSTOM | COMMENT |
| LOW | forge-gui/res/draft/rankings_cubecobra.txt | 221 | #220|The Slayer|C|CUSTOM | COMMENT |
| LOW | forge-gui/res/draft/rankings_cubecobra.txt | 241 | #240|Lich-Knights' Conquest|C|CUSTOM | COMMENT |
| LOW | forge-gui/res/draft/rankings_cubecobra.txt | 261 | #260|Ravenous Tyrannosaurus|C|CUSTOM | COMMENT |
| LOW | forge-gui/res/draft/rankings_cubecobra.txt | 281 | #280|Farseek|C|CUSTOM | COMMENT |
| LOW | forge-gui/res/draft/rankings_cubecobra.txt | 301 | #300|Ramunap Excavator|C|CUSTOM | COMMENT |
| LOW | forge-gui/res/draft/rankings_cubecobra.txt | 321 | #320|Channeled Dragonfire|C|CUSTOM | COMMENT |
| LOW | forge-gui/res/draft/rankings_cubecobra.txt | 341 | #340|Bloodchief's Thirst|C|CUSTOM | COMMENT |
| LOW | forge-gui/res/draft/rankings_cubecobra.txt | 361 | #360|Heralds of Tzeentch|C|CUSTOM | COMMENT |
| LOW | forge-gui/res/draft/rankings_cubecobra.txt | 381 | #380|Final Act|C|CUSTOM | COMMENT |
| LOW | forge-gui/res/draft/rankings_cubecobra.txt | 401 | #400|Gifts Given|C|CUSTOM | COMMENT |
| LOW | forge-gui/res/draft/rankings_cubecobra.txt | 421 | #420|Frogkin Kidnapper|C|CUSTOM | COMMENT |
| LOW | forge-gui/res/draft/rankings_cubecobra.txt | 441 | #440|Yuffie, Materia Hunter|C|CUSTOM | COMMENT |
| LOW | forge-gui/res/draft/rankings_cubecobra.txt | 461 | #460|Vampire Nighthawk|C|CUSTOM | COMMENT |
| LOW | forge-gui/res/draft/rankings_cubecobra.txt | 481 | #480|Traveling Chocobo|C|CUSTOM | COMMENT |
| LOW | forge-gui/res/draft/rankings_cubecobra.txt | 501 | #500|Morphling|C|CUSTOM | COMMENT |
| LOW | forge-gui/res/draft/rankings_cubecobra.txt | 521 | #520|Kozilek's Command|C|CUSTOM | COMMENT |
| LOW | forge-gui/res/draft/rankings_cubecobra.txt | 541 | #540|Kura, the Boundless Sky|C|CUSTOM | COMMENT |
| LOW | forge-gui/res/draft/rankings_cubecobra.txt | 561 | #560|Bloodthirster|C|CUSTOM | COMMENT |
| LOW | forge-gui/res/draft/rankings_cubecobra.txt | 581 | #580|Worldknit|C|CUSTOM | COMMENT |
| LOW | forge-gui/res/draft/rankings_cubecobra.txt | 601 | #600|Realmbreaker, the Invasion Tree|C|CUSTOM | COMMENT |
| LOW | forge-gui/res/draft/rankings_cubecobra.txt | 621 | #620|Pillar of the Paruns|C|CUSTOM | COMMENT |
| LOW | forge-gui/res/draft/rankings_cubecobra.txt | 641 | #640|Stocking Tiger|C|CUSTOM | COMMENT |
| LOW | forge-gui/res/draft/rankings_cubecobra.txt | 661 | #660|Starscape Cleric|C|CUSTOM | COMMENT |
| 176 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| CRITICAL | forge-gui-ios/src/forge/ios/Main.java | 42 | org.robovm.apple.foundation.Foundation.log("%@", | CODE |
| CRITICAL | forge-gui-ios/src/forge/ios/Main.java | 48 | org.robovm.apple.foundation.Foundation.log("%@", | CODE |
| CRITICAL | forge-gui-ios/src/forge/ios/Main.java | 135 | boolean isTablet = org.robovm.apple.uikit.UIDevice.getCurrentDevice().getUserInterfaceIdiom() | CODE |
| CRITICAL | forge-gui-ios/src/forge/ios/Main.java | 256 | options.setDebugMetaLoader(io.sentry.internal.debugmeta.NoOpDebugMetaLoader.getInstance()); | CODE |
| CRITICAL | …rc/test/java/forge/net/NetworkPlayIntegrationTest.java | 87 | var server = forge.gamemodes.net.server.FServerManager.getInstance(); | CODE |
| CRITICAL | …top/src/test/java/forge/ai/FlatMonteCarloPlanTest.java | 119 | cfg.budgetNanos = java.util.concurrent.TimeUnit.SECONDS.toNanos(8); // the test is about the choice, not about s | CODE |
| CRITICAL | forge-gui-mobile/src/forge/adventure/util/Config.java | 697 | CardRules rules = rulesReader.readCard(lines, com.google.common.io.Files.getNameWithoutExtension(cardFil | CODE |
| CRITICAL | …ge-gui-mobile/src/forge/screens/match/MatchScreen.java | 1412 | forge.gamemodes.net.client.ReplayPlayer.stopFor(MatchController.instance, true); // just leave a recording | CODE |
| CRITICAL | …ui-mobile/src/forge/screens/match/views/VGameMenu.java | 27 | forge.gamemodes.net.client.ReplayPlayer.stopFor(MatchController.instance, true))); | CODE |
| CRITICAL | …c/main/java/forge/gamemodes/match/AbstractGuiGame.java | 429 | forge.gamemodes.net.client.ReplayPlayer.stopFor(this, false); | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| HIGH | forge-gui/tools/cardnamesTranslations.py | 121 | except: | CODE |
| HIGH | forge-gui/tools/cardnamesTranslations.py | 130 | except: | CODE |
| HIGH | forge-gui/tools/cardnamesTranslations.py | 135 | except: | CODE |
| HIGH | forge-gui/tools/cardnamesTranslations.py | 145 | except: | CODE |
| HIGH | forge-gui/tools/cardnamesTranslations.py | 165 | except: | CODE |
| HIGH | forge-gui/tools/cardnamesTranslations.py | 170 | except: | CODE |
| HIGH | forge-gui/tools/cardnamesTranslations.py | 175 | except: | CODE |
| HIGH | forge-gui/tools/cardnamesTranslations.py | 180 | except: | CODE |
| HIGH | forge-gui/tools/cardnamesTranslations.py | 185 | except: | CODE |
| HIGH | forge-gui/tools/cardnamesTranslations.py | 190 | except: | CODE |
| HIGH | forge-gui/tools/cardnamesTranslations.py | 199 | except: | CODE |
| HIGH | forge-gui/tools/cardnamesTranslations.py | 208 | except: | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | …i-desktop/src/main/java/forge/screens/home/CLobby.java | 289 | // Step 0: If past events exist, offer a choice between creating new and loading one | COMMENT |
| LOW | …i-desktop/src/main/java/forge/screens/home/CLobby.java | 304 | // Step 1: Choose event type (Draft / Sealed) | COMMENT |
| LOW⚡ | …i-desktop/src/main/java/forge/screens/home/CLobby.java | 315 | // Step 2: Choose pool type | COMMENT |
| LOW⚡ | …i-desktop/src/main/java/forge/screens/home/CLobby.java | 322 | // Step 3: For draft, build the BoosterDraft now so block/set/cube/theme sub-dialogs | COMMENT |
| LOW | …i-desktop/src/main/java/forge/screens/home/CLobby.java | 333 | // Step 4: Pod size, picks per pack, pick timer and disconnect grace (draft only) | COMMENT |
| LOW⚡ | …a/forge/screens/home/settings/CSubmenuPreferences.java | 466 | // Step 1: Define the localized strings and mappings | COMMENT |
| LOW⚡ | …a/forge/screens/home/settings/CSubmenuPreferences.java | 470 | // Step 2: Get the preference key | COMMENT |
| LOW⚡ | …a/forge/screens/home/settings/CSubmenuPreferences.java | 473 | // Step 3: Create the combo box with localized strings | COMMENT |
| LOW⚡ | …a/forge/screens/home/settings/CSubmenuPreferences.java | 477 | // Step 4: Pre-select the localized value based on the saved internal value | COMMENT |
| LOW⚡ | …a/forge/screens/home/settings/CSubmenuPreferences.java | 765 | //Step 1: Create the combo box | COMMENT |
| LOW⚡ | …a/forge/screens/home/settings/CSubmenuPreferences.java | 768 | //Step 2: Add a listener using the localized to internal mappings to save internal values based on localized sel | COMMENT |
| LOW | …desktop/src/main/java/forge/toolbox/FCheckBoxTree.java | 463 | // NOTE: This class ignores the original "selection" mechanism and determines the status | COMMENT |
| LOW | …gui/src/main/java/forge/deck/DeckImportController.java | 516 | //Step 1: For each token, if it's asking for more copies of a print than we can supply, split the difference out | COMMENT |
| LOW | …gui/src/main/java/forge/deck/DeckImportController.java | 547 | //Step 2: Try to find alternative prints for the ones that do not request an edition. | COMMENT |
| LOW | …gui/src/main/java/forge/deck/DeckImportController.java | 582 | //Step 3: Apply the replacement list. | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | …i-desktop/src/main/java/forge/screens/home/CLobby.java | 289 | // Step 0: If past events exist, offer a choice between creating new and loading one | COMMENT |
| LOW | …i-desktop/src/main/java/forge/screens/home/CLobby.java | 304 | // Step 1: Choose event type (Draft / Sealed) | COMMENT |
| LOW⚡ | …i-desktop/src/main/java/forge/screens/home/CLobby.java | 315 | // Step 2: Choose pool type | COMMENT |
| LOW⚡ | …i-desktop/src/main/java/forge/screens/home/CLobby.java | 322 | // Step 3: For draft, build the BoosterDraft now so block/set/cube/theme sub-dialogs | COMMENT |
| LOW | …i-desktop/src/main/java/forge/screens/home/CLobby.java | 333 | // Step 4: Pod size, picks per pack, pick timer and disconnect grace (draft only) | COMMENT |
| LOW⚡ | …a/forge/screens/home/settings/CSubmenuPreferences.java | 466 | // Step 1: Define the localized strings and mappings | COMMENT |
| LOW⚡ | …a/forge/screens/home/settings/CSubmenuPreferences.java | 470 | // Step 2: Get the preference key | COMMENT |
| LOW⚡ | …a/forge/screens/home/settings/CSubmenuPreferences.java | 473 | // Step 3: Create the combo box with localized strings | COMMENT |
| LOW⚡ | …a/forge/screens/home/settings/CSubmenuPreferences.java | 477 | // Step 4: Pre-select the localized value based on the saved internal value | COMMENT |
| LOW⚡ | …a/forge/screens/home/settings/CSubmenuPreferences.java | 765 | //Step 1: Create the combo box | COMMENT |
| LOW⚡ | …a/forge/screens/home/settings/CSubmenuPreferences.java | 768 | //Step 2: Add a listener using the localized to internal mappings to save internal values based on localized sel | COMMENT |
| LOW | …gui/src/main/java/forge/deck/DeckImportController.java | 516 | //Step 1: For each token, if it's asking for more copies of a print than we can supply, split the difference out | COMMENT |
| LOW | …gui/src/main/java/forge/deck/DeckImportController.java | 547 | //Step 2: Try to find alternative prints for the ones that do not request an edition. | COMMENT |
| LOW | …gui/src/main/java/forge/deck/DeckImportController.java | 582 | //Step 3: Apply the replacement list. | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM | forge-core/src/main/java/forge/card/CardDb.java | 1002 | // This get is robust even against expansion aliases (e.g. TE and TMP both valid for Tempest) - | COMMENT |
| MEDIUM | …obile/src/forge/adventure/data/AdventureEventData.java | 780 | //todo: more robust logic for event types that can be won without perfect record (Swiss w/cut, round robin) | COMMENT |
| MEDIUM | forge-gui-mobile/src/forge/toolbox/FChoiceList.java | 486 | //must create a fake CardManager in order to utilize advance search filter | COMMENT |
| MEDIUM | forge-gui-mobile/src/forge/toolbox/FSelectionBox.java | 78 | framePhase = (System.currentTimeMillis() % CYCLE_MS) / (float) CYCLE_MS * 2 * DASH; // seamless when the cycle w | CODE |
| MEDIUM | …rc/forge/itemmanager/filters/AdvancedSearchFilter.java | 77 | //This could be made more robust, processing "and"s, "or"s, and parentheses to fully configure the filter, | COMMENT |
| MEDIUM | …ain/java/forge/game/ability/effects/CounterEffect.java | 168 | // TODO: this is hacky... make the detection of this ability more robust and generic? | COMMENT |
| MEDIUM | …va/forge/game/ability/effects/DamagePreventEffect.java | 84 | // only for Whimsy, for more robust version see DamageDealEffect | COMMENT |
| MEDIUM | …/main/java/forge/ai/simulation/SpellAbilityPicker.java | 411 | // TODO: Make the below more robust? | COMMENT |
| MEDIUM | …rc/main/java/forge/ai/ability/PermanentCreatureAi.java | 165 | // to mana lock the AI or lose the chance to consider other options. Try to utilize it as a response to stac | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | forge-gui/tools/adventure_i18n.py | 449 | CODE | |
| LOW | forge-gui/tools/adventure_i18n.py | 542 | CODE | |
| LOW | forge-gui/tools/adventure_i18n.py | 792 | CODE | |
| LOW | forge-gui/tools/RankingScraper.py | 80 | CODE | |
| LOW | forge-gui/tools/EditionTracking.py | 15 | CODE | |
| LOW | forge-gui/tools/EditionTracking.py | 109 | CODE | |
| LOW | forge-gui/tools/EditionTracking.py | 132 | CODE | |
| LOW | forge-gui/tools/EditionTracking.py | 245 | CODE | |
| LOW | forge-gui/tools/JapaneseTranslations.py | 130 | CODE | |
| LOW | forge-gui/tools/cardnamesTranslations.py | 47 | CODE | |
| LOW | forge-gui/tools/tokenCollectorScraper.py | 6 | CODE | |
| LOW | forge-gui/tools/tokenCollectorScraper.py | 93 | CODE | |
| LOW | forge-gui/tools/updateCardnameTranslations.py | 39 | CODE | |
| LOW | forge-gui/tools/updateCardnameTranslations.py | 49 | CODE | |
| LOW | forge-gui/tools/updateCardnameTranslations.py | 93 | CODE | |
| LOW | forge-gui/tools/frenchTranslations.py | 40 | CODE | |
| LOW | forge-gui/tools/frenchTranslations.py | 88 | CODE | |
| LOW | forge-gui/tools/frenchTranslations.py | 171 | CODE | |
| LOW | forge-gui/tools/oracleScript.py | 63 | CODE | |
| LOW | forge-gui/tools/oracleScript.py | 160 | CODE | |
| LOW | forge-gui/tools/build_forge_matrix.py | 45 | CODE | |
| LOW | forge-gui/tools/build_forge_matrix.py | 106 | CODE | |
| LOW | forge-gui/tools/edhrec_to_forge.py | 167 | CODE | |
| LOW | forge-gui/tools/edhrec_to_forge.py | 311 | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM | …src/forge/screens/settings/CardImageBrowserScreen.java | 113 | // ── Search text field ──────────────────────────────────────────────── | COMMENT |
| MEDIUM⚡ | …src/forge/screens/settings/CardImageBrowserScreen.java | 170 | // ── Stats labels ───────────────────────────────────────────────────── | COMMENT |
| MEDIUM⚡ | …src/forge/screens/settings/CardImageBrowserScreen.java | 175 | // ── Download button ────────────────────────────────────────────────── | COMMENT |
| MEDIUM⚡ | …src/forge/screens/settings/CardImageBrowserScreen.java | 179 | // ── Bulk data sync buttons ─────────────────────────────────────────── | COMMENT |
| MEDIUM | …src/forge/screens/settings/CardImageBrowserScreen.java | 214 | // ── Clear CDN cache button ───────────────────────────────────────────── | COMMENT |
| MEDIUM | forge-gui/tools/adventure_i18n.py | 62 | # ---------------------------- | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | forge-gui/tools/extractSetInfo.py | 3 | CODE | |
| LOW | forge-gui/tools/extractSetInfo.py | 3 | CODE | |
| LOW | forge-gui/tools/EditionTracking.py | 5 | CODE | |
| LOW | forge-gui/tools/EditionTracking.py | 5 | CODE | |
| LOW | forge-gui/tools/EditionTracking.py | 7 | CODE | |
| LOW | forge-gui/tools/build_forge_matrix.py | 4 | CODE | |
| LOW | forge-gui/tools/edhrec_to_forge.py | 4 | CODE | |
| LOW | forge-gui/tools/scrape_bracket_details.py | 11 | CODE | |
| LOW | forge-gui/tools/assignSetInfo.py | 3 | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | forge-gui/tools/JapaneseTranslations.py | 92 | def replace_reminder_text_parentheses(text): | CODE |
| LOW | forge-gui/tools/updateCardnameTranslations.py | 93 | def build_scryfall_translation_index(target_langs): | CODE |
| LOW | forge-gui/tools/edhrec_to_forge.py | 181 | def commanders_from_cardviews(cardviews: object) -> list[Commander]: | CODE |
| LOW | forge-gui/tools/edhrec_to_forge.py | 206 | def parse_commanders_from_json_payload(payload: dict, limit: int) -> tuple[list[Commander], str | None]: | CODE |
| LOW | forge-gui/tools/edhrec_to_forge.py | 252 | def parse_commanders_from_html(page: str, limit: int) -> list[Commander]: | CODE |
| LOW | forge-gui/tools/edhrec_to_forge.py | 461 | def parse_card_data_from_json_payload(commander: Commander, payload: dict, per_commander_limit: int) -> list[RawCardData | CODE |
| LOW | …-gui/tools/DeckConversionTools/mtgdecksnet_decksort.py | 155 | def get_earliest_set_for_card(card): | CODE |
| LOW | …/tools/DeckConversionTools/mtgdecksnet_decksort_EDH.py | 158 | def get_earliest_set_for_card(card): | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | forge-gui/tools/cardnamesTranslations.py | 63 | # Check if that card is patched | COMMENT |
| LOW | forge-gui/tools/cardnamesTranslations.py | 88 | # Check if that patched card exists in original file | COMMENT |
| LOW | forge-gui/tools/frenchTranslations.py | 177 | # Check if the request returns HTTP Code OK | COMMENT |
| LOW | forge-gui/tools/frenchTranslations.py | 180 | # Check if the card is found on the website | COMMENT |
| LOW | forge-gui/tools/scryfallPricesGenerator.py | 6 | # Set this to the current Forge editions folder (under res) | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | forge-gui/tools/adventure_i18n.py | 362 | except Exception: | CODE |
| LOW | forge-gui/tools/adventure_i18n.py | 687 | except Exception: | CODE |
| LOW | forge-gui/tools/EditionTracking.py | 352 | except Exception as e: | CODE |
| MEDIUM | forge-gui/tools/tokenCollectorScraper.py | 88 | print(f"Error fetching Scryfall data for {code}") | CODE |
| LOW | forge-gui/tools/updateCardnameTranslations.py | 218 | except Exception: | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| HIGH | docs/User-Guide.md | 256 | 10. **Battlefield** — see [Battlefield Display](#battlefield-display) for stacking and grouping options. (In this exampl | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | …rge-gui/src/main/java/forge/player/GamePlayerUtil.java | 75 | // TODO: implement specific AI profiles for quest mode. | COMMENT |
| LOW | …ai/src/main/java/forge/ai/ability/ChooseGenericAi.java | 282 | // TODO: implement a better way to check for possible benefits in each case. If made generic, replace | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | forge-gui/tools/adventure_i18n.py | 433 | CODE | |
| LOW | forge-gui/tools/adventure_i18n.py | 471 | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | forge-gui/tools/tokenCollectorScraper.py | 114 | # I have duplicates in the data. How do I make sure to skip them doing this method? | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | …/src/main/java/forge/gui/download/ScryfallSetSync.java | 90 | if ("missing".equals(imageStatus) || "placeholder".equals(imageStatus)) return null; | CODE |