Zum Hauptinhalt springen
tsecurity.de LIVE
Echtzeit-Radar & Feeds
Alle RSS Feeds ➔
👥 Community & Social
YouTube Security VideosMicrosoft Developer: Skill up on Copilot Studio Oct 8th!(24.09.2026 um 01:01 Uhr)
•••
Sichere Programmierung🦄 Sharing DEV Followers Count on Github Profile 🦄(24.09.2026 um 00:42 Uhr)
••
Sichere ProgrammierungHow I Would Build a Private AI Coding Workstation in 2026(24.09.2026 um 00:46 Uhr)
•
Sichere ProgrammierungBuilding a TWAP Distance-Based Polymarket Trading Strategy(24.09.2026 um 00:50 Uhr)
•••
Sichere ProgrammierungMy factual-recall tasks were scoring format, not facts(24.09.2026 um 01:15 Uhr)
•
YouTube Security VideosMicrosoft Developer: Skill up on Copilot Studio Oct 8th!(24.09.2026 um 01:01 Uhr)
•••
Sichere Programmierung🦄 Sharing DEV Followers Count on Github Profile 🦄(24.09.2026 um 00:42 Uhr)
••
Sichere ProgrammierungHow I Would Build a Private AI Coding Workstation in 2026(24.09.2026 um 00:46 Uhr)
•
Sichere ProgrammierungBuilding a TWAP Distance-Based Polymarket Trading Strategy(24.09.2026 um 00:50 Uhr)
•••
Sichere ProgrammierungMy factual-recall tasks were scoring format, not facts(24.09.2026 um 01:15 Uhr)
•
Intelligence View
⚡ tsecurity.de Intelligence

Refactoring ReadmeGenie

Introduction This week I was tasked to refactor the ReadmeGenie. If you just arrived here, ReadmeGenie is my open-source project that uses AI to generate readmes based on the files that the user inputs. Initially, my thoughts were, "The…

0
↗ Quelle (dev.to)
Reagiere als Erste:r — dein Feedback zählt!




Introduction



This week I was tasked to refactor the ReadmeGenie. If you just arrived here, ReadmeGenie is my open-source project that uses AI to generate readmes based on the files that the user inputs.



Initially, my thoughts were, "The program is working fine. I’ve been developing it in an organized way since day one... so why change it?"



Well, after taking a week-long break from the project, I opened it up again and immediately thought, "What is this?"






Why refactor?



To give you some context, here’s an example: One of my core functions, which I once thought was perfect, turned out to be much more complex than necessary. During the refactoring process, I broke it down into five separate functions—and guess what? The code is much cleaner and easier to manage now.



Take a look at the original version of this function:




def generate_readme(file_paths, api_key, base_url, output_filename, token_usage):
try:
load_dotenv()

# Check if the api_key was provided either as an environment variable or as an argument
if not api_key and not get_env():
logger.error(f"{Fore.RED}API key is required but not provided. Exiting.{Style.RESET_ALL}")
sys.exit(1)

# Concatenate content from multiple files
file_content = ""
try:
for file_path in file_paths:
with open(file_path, 'r') as file:
file_content += file.read() + "\\n\\n"
except FileNotFoundError as fnf_error:
logger.error(f"{Fore.RED}File not found: {file_path}{Style.RESET_ALL}")
sys.exit(1)

# Get the base_url from arguments, environment, or use the default
chosenModel = selectModel(base_url)
try:
if chosenModel == 'cohere':
base_url = os.getenv("COHERE_BASE_URL", "https://api.cohere.ai/v1")
response = cohereAPI(api_key, file_content)
readme_content = response.generations[0].text.strip() + FOOTER_STRING
else:
base_url = os.getenv("GROQ_BASE_URL", "https://api.groq.com")
response = groqAPI(api_key, base_url, file_content)
readme_content = response.choices[0].message.content.strip() + FOOTER_STRING
except AuthenticationError as auth_error:
logger.error(f"{Fore.RED}Authentication failed: Invalid API key. Please check your API key and try again.{Style.RESET_ALL}")
sys.exit(1)
except Exception as api_error:
logger.error(f"{Fore.RED}API request failed: {api_error}{Style.RESET_ALL}")
sys.exit(1)

# Process and save the generated README content
if readme_content[0] != '*':
readme_content = "\n".join(readme_content.split('\n')[1:])

try:
with open(output_filename, 'w') as output_file:
output_file.write(readme_content)
logger.info(f"README.md file generated and saved as {output_filename}")
logger.warning(f"This is your file's content:\n{readme_content}")
except IOError as io_error:
logger.error(f"{Fore.RED}Failed to write to output file: {output_filename}. Error: {io_error}{Style.RESET_ALL}")
sys.exit(1)

# Save API key if needed
if not get_env() and api_key is not None:
logger.warning("Would you like to save your API key and base URL in a .env file for future use? [y/n]")
answer = input()
if answer.lower() == 'y':
create_env(api_key, base_url, chosenModel)
elif get_env():
if chosenModel == 'cohere' and api_key != os.getenv("COHERE_API_KEY"):
if api_key is not None:
logger.warning("Would you like to save this API Key? [y/n]")
answer = input()
if answer.lower() == 'y':
create_env(api_key, base_url, chosenModel)
elif chosenModel == 'groq' and api_key != os.getenv("GROQ_API_KEY"):
if api_key is not None:
logger.warning("Would you like to save this API Key? [y/n]")
answer = input()
if answer.lower() == 'y':
create_env(api_key, base_url, chosenModel)

# Report token usage if the flag is set
if token_usage:
try:
usage = response.usage
logger.info(f"Token Usage Information: Prompt tokens: {usage.prompt_tokens}, Completion tokens: {usage.completion_tokens}, Total tokens: {usage.total_tokens}")
except AttributeError:
logger.warning(f"{Fore.YELLOW}Token usage information is not available for this response.{Style.RESET_ALL}")
logger.info(f"{Fore.GREEN}File created successfully")
sys.exit(0)






1. Eliminate Global Variables

Global variables can lead to unexpected side effects. Keep the state within the scope it belongs to, and pass values explicitly when necessary.



2. Use Functions for Calculations

Avoid storing intermediate values in variables where possible. Instead, use functions to perform calculations when needed—this keeps your code flexible and easier to debug.



3. Separate Responsibilities

A single function should do one thing, and do it well. Split tasks like command-line argument parsing, file reading, AI model management, and output generation into separate functions or classes. This separation allows for easier testing and modification in the future.



4. Improve Naming

Meaningful variable and function names are crucial. When revisiting your code after some time, clear names help you understand the flow without needing to re-learn everything.



5. Reduce Duplication

If you find yourself copying and pasting code, it’s a sign that you could benefit from shared functions or classes. Duplication makes maintenance harder, and small changes can easily result in bugs.





Commiting and pushing to GitHub



1. Create a branch

I started by creating a branch using:




git checkout -b <branch-name>






This command creates a new branch and switches to it.



2. Making a Series of Commits

Once on the new branch, I made incremental commits. Each commit represents a logical chunk of work, whether it was refactoring a function, fixing a bug, or adding a new feature. Making frequent, small commits helps track changes more effectively and makes it easier to review the history of the project.




git status
git add <file_name>
git commit -m "Refactored function"






3. Rebasing to Keep a Clean History

After making several commits, I rebased my branch to keep the history clean and linear. Rebasing allows me to reorder, combine, or modify commits before they are pushed to GitHub. This is especially useful if some of the commits are very small or if I want to avoid cluttering the commit history with too many incremental changes.




git rebase -i main






In this step, I initiated an interactive rebase on top of the main branch. The -i flag allows me to modify the commit history interactively. I could squash some of my smaller commits into one larger, cohesive commit. For instance, if I had a series of commits like:



Refactor part 1

Refactor part 2

Fix bug in refactor



I could squash them into a single commit with a clearer message



4. Pushing Changes to GitHub

Once I was satisfied with the commit history after the rebase, I pushed the changes to GitHub. If you’ve just created a new branch, you’ll need to push it to the remote repository with the -u flag, which sets the upstream branch for future pushes.




git push -u origin <branch-name>






5. Merging

In the last step I did a fast-forward merge to the main branch and pushed again




git checkout main # change to the main branch
git merge --ff-only <branch-name> # make a fast-forward merge
git push origin main # push to the main









Takeaways



Everything has room to improve. Refactoring may seem like a hassle, but it often results in cleaner, more maintainable, and more efficient code. So, the next time you feel hesitant about refactoring, remember: there’s always a better way to do things.

Even though I think it's perfect now, I will definitely have something to improve on my next commit.

IR-PLAYBOOK-RCE
HIGH
SOC Incident Playbook: Remote Code Execution (RCE) Defense
1-Click Detection Engineering: Sigma & YARA Rules
SOC Ready
title: Detect Exploitation - Refactoring ReadmeGenie
id: 2ef43b0b-8b79-4a0a-a5f6-aad4398dec17
status: experimental
description: Automatisch generierte SIEM-Erkennungsregel basierend auf CTI Intelligence
references:
  - https://tsecurity.de/
author: iShareStuff CTI Automated Detection Engine
date: 2026-09-24
logsource:
  category: network_connection
  product: any
detection:
  selection:
      CommandLine|contains:
        - 'exploit'
  condition: selection
falsepositives:
  - Legitime administrative Zugriffe oder Penetrationstests
level: high
tags:
  - attack.initial_access
rule CTI_Threat_Indicator {
    meta:
        author = "iShareStuff CTI Automated Detection Engine"
        date = "2026-09-24"
        description = "YARA Signature for "
    strings:
        $str = "Refactoring ReadmeGenie" ascii wide
    condition:
        any of them
}
Ähnliche Beiträge
🔍 Verwandte News

Auch interessante Nachrichten Refactoring ReadmeGenie

Thematisch verwandte Begriffe: Refactoring, ReadmeGenie · 6 Treffer

Laden...

Videos werden geladen ...

Laden...

Beiträge werden geladen ...

Laden...

Videos werden geladen ...

Laden...

Beiträge werden geladen ...

Laden...

Videos werden geladen ...

Zum Aktualisieren ziehen
ZERO-DAY CVE-2026-96550 | A vulnerability was found in sfturing hosp_order up to 627f426331da8086c…
Advisory →
TTS Reader • tsecurity.de Voice
tsecurity.de Icon
tsecurity.de App
Offline-Lesen, Eilmeldungen & 0ms Ladezeit

Installiere tsecurity.de direkt auf deinen Home-Bildschirm für das ultimative Vollbild-Magazinerlebnis ohne Browser-Leisten.

Nächster Beitrag
Themen-Radar & Intelligence Matrix
Echtzeit-Taxonomie nach Angriffsvektoren & Plattformen

tsecurity.de Live Threat Radar

🔴 LIVE RADAR
MONITORING
AKTIV
CVE-DATENBANK
LIVE
🔍
Community Radar & Live Chat
Sentinel Bot online • Live-Stream
Dein Cluster: Security Explorer
Match:
lädt…
Verbindung zum Community-Stream wird aufgebaut...
Bearbeitungsmodus — Senden überschreibt deine Nachricht
Community-Puls — was gerade passiert
lädt…
Aktivitäten deiner Analysten
lädt…
Neues Thema oder Eilmeldung einreichen

Reiche interessante Links, Zero-Days oder Debatten ein. Die Community entscheidet per Upvote über die Veröffentlichung.

Heiß diskutierte Einreichungen
🔖 Gespeicherte Artikel
📂 Keine gespeicherten Artikel vorhanden.
Zurück Ziehen Vor
Links: vorheriger Artikel • Rechts: nächster Artikel • unten: schließen
News NIS-2 Frühwarnung Tier-1 Intel TTP ⏱️ 3 Min vor 10 Min
Artikeldaten werden geladen...

Zurück: vorheriger • Vor: nächster
↗ Original-Quelle
Social Reaktionen Deine Reaktion zählt
Einstufung & Relevanz-Poll 0 Stimmen
In sozialen Netzwerken teilen 1-Klick