developer-assistant 0.3.5__tar.gz → 0.3.6__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (26) hide show
  1. {developer_assistant-0.3.5/developer_assistant.egg-info → developer_assistant-0.3.6}/PKG-INFO +14 -16
  2. {developer_assistant-0.3.5 → developer_assistant-0.3.6}/PYPI.md +12 -6
  3. {developer_assistant-0.3.5 → developer_assistant-0.3.6}/README.md +7 -5
  4. {developer_assistant-0.3.5 → developer_assistant-0.3.6}/da/interface.py +59 -35
  5. {developer_assistant-0.3.5 → developer_assistant-0.3.6}/da/modules/config_manager.py +24 -8
  6. {developer_assistant-0.3.5 → developer_assistant-0.3.6}/da/modules/opener.py +1 -1
  7. {developer_assistant-0.3.5 → developer_assistant-0.3.6}/da/modules/projects_manager.py +6 -7
  8. {developer_assistant-0.3.5 → developer_assistant-0.3.6}/da/modules/version_logic.py +6 -6
  9. {developer_assistant-0.3.5 → developer_assistant-0.3.6/developer_assistant.egg-info}/PKG-INFO +14 -16
  10. {developer_assistant-0.3.5 → developer_assistant-0.3.6}/pyproject.toml +2 -2
  11. {developer_assistant-0.3.5 → developer_assistant-0.3.6}/LICENSE +0 -0
  12. {developer_assistant-0.3.5 → developer_assistant-0.3.6}/da/__init__.py +0 -0
  13. {developer_assistant-0.3.5 → developer_assistant-0.3.6}/da/default/default-changelog.md +0 -0
  14. {developer_assistant-0.3.5 → developer_assistant-0.3.6}/da/default/default-memory.ini +0 -0
  15. {developer_assistant-0.3.5 → developer_assistant-0.3.6}/da/default/test-project.ini +0 -0
  16. {developer_assistant-0.3.5 → developer_assistant-0.3.6}/da/intro.md +0 -0
  17. {developer_assistant-0.3.5 → developer_assistant-0.3.6}/da/modules/__init__.py +0 -0
  18. {developer_assistant-0.3.5 → developer_assistant-0.3.6}/da/templates/changelog_template.txt +0 -0
  19. {developer_assistant-0.3.5 → developer_assistant-0.3.6}/da/templates/entry_template.txt +0 -0
  20. {developer_assistant-0.3.5 → developer_assistant-0.3.6}/da/templates/header_template.txt +0 -0
  21. {developer_assistant-0.3.5 → developer_assistant-0.3.6}/developer_assistant.egg-info/SOURCES.txt +0 -0
  22. {developer_assistant-0.3.5 → developer_assistant-0.3.6}/developer_assistant.egg-info/dependency_links.txt +0 -0
  23. {developer_assistant-0.3.5 → developer_assistant-0.3.6}/developer_assistant.egg-info/entry_points.txt +0 -0
  24. {developer_assistant-0.3.5 → developer_assistant-0.3.6}/developer_assistant.egg-info/requires.txt +0 -0
  25. {developer_assistant-0.3.5 → developer_assistant-0.3.6}/developer_assistant.egg-info/top_level.txt +0 -0
  26. {developer_assistant-0.3.5 → developer_assistant-0.3.6}/setup.cfg +0 -0
@@ -1,16 +1,8 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: developer-assistant
3
- Version: 0.3.5
3
+ Version: 0.3.6
4
4
  Summary: A lightweight TUI app for managing and simplifying your Markdown changelogs.
5
- License: The MIT License (MIT)
6
-
7
- Copyright (c) 2026 Ivori Huobolainen
8
-
9
- 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:
10
-
11
- The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
12
-
13
- 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.
5
+ License-Expression: MIT
14
6
  Project-URL: Homepage, https://github.com/Ivory-Hubert/Developer-Assistant
15
7
  Project-URL: Changelog, https://github.com/Ivory-Hubert/Developer-Assistant/blob/main/CHANGELOG.md
16
8
  Classifier: Programming Language :: Python :: 3
@@ -30,7 +22,7 @@ Dynamic: license-file
30
22
 
31
23
  ## Installing from PyPI
32
24
 
33
- The program is designed for minimal friction and simple setup. Only installation is required, on first run DA will create local user data automatically. The same process is used for new profiles.
25
+ The program is designed for minimal friction and simple setup. Only installation is required, on first run DA will create local user data automatically. The same automatic process is used for creating new profiles.
34
26
 
35
27
  **Using uv:**
36
28
  `uv tool install developer-assistant`
@@ -46,6 +38,8 @@ The program is designed for minimal friction and simple setup. Only installation
46
38
  > Avoid using `sudo pip install` because it installs into the system Python.
47
39
  If you want a system‑wide install, use the uv method or use `pip install --user`
48
40
 
41
+ ---
42
+
49
43
  ## Updating DA
50
44
  Two possibilities, depending on how you installed.
51
45
 
@@ -56,13 +50,16 @@ B. **Using pip:** `python -m pip install -U developer-assistant`
56
50
 
57
51
  ## Introduction
58
52
 
59
- ### What does this tool do?
53
+ ### What does this program do?
60
54
  Developer Assistant is a lightweight TUI for simplifying and managing your changelogs. You can customize the templates for **each profile** to match your existing format, and use DA as a central hub to access every changelog and project folder you maintain.
61
55
 
62
56
  You can create as many profiles as you need. Each profile gets its own **project specific** `.ini` files, created automatically through the menu based on the information you provide. These act as links that tell DA where your changelogs are, which profile owns them and what's the last version number.
63
57
 
64
- Your files are kept safe at all times. Before adding new changes, your existing `CHANGELOG.md` is automatically backed up. While editing, all changes are written to a temporary file first and only prepended to & replaced with your real changelog once you confirm them.
58
+ Each project `.ini` can also hold a custom terminal command, that is run in that projects folder. So you can easly integrate updating your changelogs in DA with Git commands for example.
65
59
 
60
+ **Your files are kept safe at all times.** Before adding new changes, your existing `CHANGELOG.md` is automatically backed up. While editing, all changes are written to a temporary file first and only prepended to & replaced with your real changelog once you confirm them.
61
+
62
+ ---
66
63
 
67
64
  ### Using the program.
68
65
  1. **What *not* to do**
@@ -81,13 +78,13 @@ Don't change the folder structure or modify variable names inside `.ini` files.
81
78
 
82
79
  The `da-ui/` folder and subfolders will be created automatically.
83
80
 
84
- You can access its content quickly when going to: `Main menu / Settings`
81
+ > **Tip:** You can access its content quickly when going to: `Main menu / Settings`
85
82
 
86
83
  **Profiles for seperate projects and templates**
87
84
 
88
85
  The program comes with the "Default" profile, you can choose to either stick with this one or create your own profiles in `Main menu / Profiles`. Each profile has seperate projects and they can't be accessed by other profiles. You can choose to customize the templates seperately too.
89
86
 
90
- Migrating a project or template from one profile to another is currently manual, **make sure to also change the "*owner*" value in `.ini` files accordingly**.
87
+ > **Note:** Migrating a project or template from one profile to another is currently manual, **make sure to also change the "*owner*" value in `.ini` files accordingly**.
91
88
 
92
89
  ---
93
90
 
@@ -144,8 +141,9 @@ The `memory.ini` file does exactly what you'd expect, it features:
144
141
 
145
142
  Last project & active profile get updated automatically, the rest are up to you.
146
143
 
147
- **`Ctrl+C` works everywhere to quickly exit DA.**
144
+ > **Tip:** `Ctrl+C` works everywhere to quickly exit DA.
148
145
 
146
+ ---
149
147
 
150
148
  ### Setting up the test project
151
149
  For a dummy changelog to experiment with, navigate to `Main menu / Projects`, choose `test-project`, then choose option `3.` to start adjusting this projects paths. **Before setting up your own profile don't change "*Default*"**
@@ -2,7 +2,7 @@
2
2
 
3
3
  ## Installing from PyPI
4
4
 
5
- The program is designed for minimal friction and simple setup. Only installation is required, on first run DA will create local user data automatically. The same process is used for new profiles.
5
+ The program is designed for minimal friction and simple setup. Only installation is required, on first run DA will create local user data automatically. The same automatic process is used for creating new profiles.
6
6
 
7
7
  **Using uv:**
8
8
  `uv tool install developer-assistant`
@@ -18,6 +18,8 @@ The program is designed for minimal friction and simple setup. Only installation
18
18
  > Avoid using `sudo pip install` because it installs into the system Python.
19
19
  If you want a system‑wide install, use the uv method or use `pip install --user`
20
20
 
21
+ ---
22
+
21
23
  ## Updating DA
22
24
  Two possibilities, depending on how you installed.
23
25
 
@@ -28,13 +30,16 @@ B. **Using pip:** `python -m pip install -U developer-assistant`
28
30
 
29
31
  ## Introduction
30
32
 
31
- ### What does this tool do?
33
+ ### What does this program do?
32
34
  Developer Assistant is a lightweight TUI for simplifying and managing your changelogs. You can customize the templates for **each profile** to match your existing format, and use DA as a central hub to access every changelog and project folder you maintain.
33
35
 
34
36
  You can create as many profiles as you need. Each profile gets its own **project specific** `.ini` files, created automatically through the menu based on the information you provide. These act as links that tell DA where your changelogs are, which profile owns them and what's the last version number.
35
37
 
36
- Your files are kept safe at all times. Before adding new changes, your existing `CHANGELOG.md` is automatically backed up. While editing, all changes are written to a temporary file first and only prepended to & replaced with your real changelog once you confirm them.
38
+ Each project `.ini` can also hold a custom terminal command, that is run in that projects folder. So you can easly integrate updating your changelogs in DA with Git commands for example.
37
39
 
40
+ **Your files are kept safe at all times.** Before adding new changes, your existing `CHANGELOG.md` is automatically backed up. While editing, all changes are written to a temporary file first and only prepended to & replaced with your real changelog once you confirm them.
41
+
42
+ ---
38
43
 
39
44
  ### Using the program.
40
45
  1. **What *not* to do**
@@ -53,13 +58,13 @@ Don't change the folder structure or modify variable names inside `.ini` files.
53
58
 
54
59
  The `da-ui/` folder and subfolders will be created automatically.
55
60
 
56
- You can access its content quickly when going to: `Main menu / Settings`
61
+ > **Tip:** You can access its content quickly when going to: `Main menu / Settings`
57
62
 
58
63
  **Profiles for seperate projects and templates**
59
64
 
60
65
  The program comes with the "Default" profile, you can choose to either stick with this one or create your own profiles in `Main menu / Profiles`. Each profile has seperate projects and they can't be accessed by other profiles. You can choose to customize the templates seperately too.
61
66
 
62
- Migrating a project or template from one profile to another is currently manual, **make sure to also change the "*owner*" value in `.ini` files accordingly**.
67
+ > **Note:** Migrating a project or template from one profile to another is currently manual, **make sure to also change the "*owner*" value in `.ini` files accordingly**.
63
68
 
64
69
  ---
65
70
 
@@ -116,8 +121,9 @@ The `memory.ini` file does exactly what you'd expect, it features:
116
121
 
117
122
  Last project & active profile get updated automatically, the rest are up to you.
118
123
 
119
- **`Ctrl+C` works everywhere to quickly exit DA.**
124
+ > **Tip:** `Ctrl+C` works everywhere to quickly exit DA.
120
125
 
126
+ ---
121
127
 
122
128
  ### Setting up the test project
123
129
  For a dummy changelog to experiment with, navigate to `Main menu / Projects`, choose `test-project`, then choose option `3.` to start adjusting this projects paths. **Before setting up your own profile don't change "*Default*"**
@@ -5,7 +5,7 @@
5
5
 
6
6
  > `pip install developer-assistant`
7
7
 
8
- * **Installation:** detailed instructions in [SETUP](./SETUP.md)
8
+ * **Installation:** more options in [SETUP](./SETUP.md)
9
9
 
10
10
  * **Changes:** yes, I keep a [CHANGELOG](./CHANGELOG.md)
11
11
 
@@ -33,12 +33,14 @@ Preview your Markdown changelogs directly in the terminal with Rich rendering:
33
33
 
34
34
  ## Introduction
35
35
 
36
- ### What does this tool do?
36
+ ### What does this program do?
37
37
  Developer Assistant is a lightweight TUI for simplifying and managing your changelogs. You can customize the templates for **each profile** to match your existing format, and use DA as a central hub to access every changelog and project folder you maintain.
38
38
 
39
39
  You can create as many profiles as you need. Each profile gets its own **project specific** `.ini` files, created automatically through the menu based on the information you provide. These act as links that tell DA where your changelogs are, which profile owns them and what's the last version number.
40
40
 
41
- Your files are kept safe at all times. Before adding new changes, your existing `CHANGELOG.md` is automatically backed up. While editing, all changes are written to a temporary file first and only prepended to & replaced with your real changelog once you confirm them.
41
+ Each project `.ini` can also hold a custom terminal command, that is run in that projects folder. So you can easly integrate updating your changelogs in DA with Git commands for example.
42
+
43
+ **Your files are kept safe at all times.** Before adding new changes, your existing `CHANGELOG.md` is automatically backed up. While editing, all changes are written to a temporary file first and only prepended to & replaced with your real changelog once you confirm them.
42
44
 
43
45
  ---
44
46
 
@@ -60,7 +62,7 @@ Don't change the folder structure or modify variable names inside `.ini` files.
60
62
  The `da-ui/` folder and subfolders will be created automatically.
61
63
 
62
64
  > [!TIP]
63
- > You can access its content quickly when going to: `Main menu / Settings`
65
+ > You can access its contents quickly when going to: `Main menu / Settings`
64
66
 
65
67
  **Profiles for seperate projects and templates**
66
68
 
@@ -90,7 +92,7 @@ The `Projects/` folder holds the `.ini` files you create when starting a new pro
90
92
 
91
93
  [Project.ini example](./documents/project-example.ini)
92
94
 
93
- The `command` variable is a custom command that DA will run in your project folder once you choose "Format & commit" in `Main menu / Projects / Project menu / Changelog`. Even when provided, it is **not** run without your confirmation, first it's printed with the folder name and you can choose to skip it.
95
+ The `command` variable is a custom command that DA will run in your project folder once you choose "Format & commit" in `Main menu / Projects / Project menu / Changelog`. Even if provided, it is **not** run without your confirmation, first it's printed with the folder name and you can choose to skip it.
94
96
 
95
97
  `owner` & `edited` are filled out automatically when a new project is created and `edited` updates with every changelog update.
96
98
 
@@ -17,7 +17,7 @@ from importlib import resources
17
17
 
18
18
  class Interface:
19
19
  def __init__(self):
20
- self.version = "0.3.5"
20
+ self.version = "0.3.6"
21
21
  self.clear = 'cls' if platform.system() == 'Windows' else 'clear'
22
22
 
23
23
  title = f"DA - {self.version}"
@@ -50,14 +50,14 @@ class Interface:
50
50
  if isinstance(result, list):
51
51
  for msg in result:
52
52
  print(msg.center(65))
53
- time.sleep(2)
53
+ time.sleep(1)
54
54
 
55
55
  temp_log = Path(__file__).parent / "CHANGELOG.tmp"
56
56
 
57
57
  if os.path.exists(temp_log):
58
58
  while True:
59
59
  os.system(self.clear)
60
- print(colored(f"Temporary changelog detected in:\n{temp_log}\n", "yellow"))
60
+ print(colored(f"Temporary changelog detected from your last session!\n", "yellow"))
61
61
  print(colored("D", "light_red") + "elete or " + colored("K", "light_red") + "eep?\n")
62
62
  choice = input(f"{self.user_path}> ").lower()
63
63
  if choice == "d":
@@ -67,7 +67,7 @@ class Interface:
67
67
  break
68
68
  else:
69
69
  print(colored("\nPlease make a valid choice.", "light_red"))
70
- time.sleep(1.5)
70
+ time.sleep(0.5)
71
71
 
72
72
  state = "intro" if self.first_run else "menu"
73
73
 
@@ -132,7 +132,7 @@ class Interface:
132
132
  else:
133
133
  print("")
134
134
  print(colored("Unknown option...", "light_red", attrs=["bold"]))
135
- time.sleep(1)
135
+ time.sleep(0.5)
136
136
 
137
137
  def settings(self):
138
138
  while True:
@@ -167,7 +167,7 @@ class Interface:
167
167
  else:
168
168
  print("")
169
169
  print(colored("Unknown option...", "light_red", attrs=["bold"]))
170
- time.sleep(1)
170
+ time.sleep(0.5)
171
171
 
172
172
  def profiles(self):
173
173
  while True:
@@ -176,48 +176,43 @@ class Interface:
176
176
  print(self.header)
177
177
  print("E. Back\n")
178
178
 
179
- print("1. Create a new profile")
180
- print("2. Switch profiles\n")
179
+ print("1. Switch profiles\n")
180
+
181
+ print("2. Create a new profile")
182
+ print("3. Delete a profile\n")
181
183
 
182
184
  choice = input(f"{self.user_path}> ").strip()
183
185
 
184
186
  if choice.lower() == "e":
185
187
  return
186
188
  elif choice == "1":
187
- self.new_profile()
188
- elif choice == "2":
189
189
  self.switch_profile()
190
+ elif choice == "2":
191
+ self.new_profile()
192
+ elif choice == "3":
193
+ self.delete_profile()
190
194
  else:
191
195
  print("")
192
196
  print(colored("Unknown option...", "light_red", attrs=["bold"]))
193
- time.sleep(1)
197
+ time.sleep(0.5)
194
198
 
195
199
  def switch_profile(self):
196
- while True:
197
- prof_dir = self.config.profile_dir
198
- contents = os.listdir(prof_dir)
199
-
200
- print("\nYour profiles:")
201
- for item in contents:
202
- print(colored(f" - {item}", f"{self.color}"))
203
-
204
- name = input("\nProfile name > ").strip()
200
+ prof_dir = self.config.profile_dir
201
+ contents = os.listdir(prof_dir)
205
202
 
206
- if name in contents:
207
- self.config.update_memory("CONFIG", "profile", name)
203
+ print("\nYour profiles:")
204
+ for item in contents:
205
+ print(" -" + colored(f" {item}", f"{self.color}"))
208
206
 
209
- self.memory = self.config.load_memory()
207
+ name = input("\nProfile name > ").strip()
210
208
 
211
- profile = self.memory.get('profile')
212
- self.config = ConfigManager("memory.ini", profile=profile)
213
-
214
- self.memory = self.config.load_memory()
215
- self.active_profile = self.memory.get('profile')
216
- return
217
- else:
218
- print(colored("\nInvalid name!", "yellow"))
219
- time.sleep(1)
220
- os.system(self.clear)
209
+ if name in contents:
210
+ self.load_profile(name)
211
+ return
212
+ else:
213
+ print(colored("\nInvalid name!", "yellow"))
214
+ time.sleep(0.5)
215
+ os.system(self.clear)
221
216
 
222
217
  def new_profile(self):
223
218
  name = input("\nNew profile name > ").strip()
@@ -233,6 +228,33 @@ class Interface:
233
228
  dest = profile_dir / "Templates"
234
229
  shutil.copy(item, dest)
235
230
 
231
+ self.load_profile(name)
232
+ return
233
+
234
+ def delete_profile(self):
235
+ prof_dir = self.config.profile_dir
236
+ contents = os.listdir(prof_dir)
237
+
238
+ print("\nYour profiles:")
239
+ for item in contents:
240
+ print(" -" + colored(f" {item}", f"{self.color}"))
241
+
242
+ name = input("\nProfile name > ").strip()
243
+
244
+ if name in contents and name != "Default":
245
+ profiles = self.config.profile_dir
246
+ profile = profiles / name
247
+ shutil.rmtree(profile)
248
+
249
+ if name == self.active_profile:
250
+ self.load_profile(name="Default")
251
+ return
252
+ else:
253
+ print(colored("\nInvalid name!", "yellow"))
254
+ time.sleep(0.5)
255
+ os.system(self.clear)
256
+
257
+ def load_profile(self, name):
236
258
  self.config.update_memory("CONFIG", "profile", name)
237
259
 
238
260
  self.memory = self.config.load_memory()
@@ -242,7 +264,6 @@ class Interface:
242
264
 
243
265
  self.memory = self.config.load_memory()
244
266
  self.active_profile = self.memory.get('profile')
245
- return
246
267
 
247
268
  def runtime_init(self):
248
269
  if not self.config.memory_ini.exists():
@@ -268,6 +289,7 @@ class Interface:
268
289
  self.header = f"{bars}{brand}{bars}"
269
290
 
270
291
  def local_init(self):
292
+ #==Works together with ConfigManager.data_check==
271
293
  default_files = resources.files("da.default")
272
294
  dest = self.config.memory_ini
273
295
 
@@ -301,9 +323,11 @@ def main():
301
323
  try:
302
324
  app = Interface()
303
325
  app.run()
326
+ os.system(app.clear)
304
327
  except KeyboardInterrupt:
305
328
  print("\n\n" + colored("Execution interrupted. Exiting...", "cyan", attrs=["bold"]))
306
- time.sleep(1)
329
+ time.sleep(0.5)
330
+ os.system(app.clear)
307
331
  sys.exit(0)
308
332
 
309
333
  if __name__ == "__main__":
@@ -114,24 +114,40 @@ class ConfigManager:
114
114
 
115
115
  def data_check(self):
116
116
  internal_dir = Path(__file__).resolve().parents[1]
117
- default_profile = self.profile_dir / "Default"
118
- default_profile.mkdir(parents=True, exist_ok=True)
117
+ default_templates = resources.files("da.templates")
118
+
119
+ messages = []
120
+ #==Always ensure fallback profile exists, not just on first run==
121
+ if not (self.profile_dir / "Default").exists():
122
+ default = self.profile_dir / "Default"
123
+ default.mkdir()
124
+
125
+ templates = default / "Templates"
126
+ templates.mkdir()
127
+
128
+ projects = default / "Projects"
129
+ projects.mkdir()
130
+
131
+ for item in default_templates.iterdir():
132
+ dest = templates / item.name
133
+ if not dest.exists():
134
+ shutil.copy(item, dest)
135
+
136
+ messages.append("Restored the Default profile")
119
137
 
120
138
  old_memory = internal_dir / "memory.ini"
121
139
  old_projects = self.global_dir / "Projects"
122
140
 
123
- messages = []
124
-
125
141
  if old_memory.exists() and not self.memory_ini.exists():
126
142
  shutil.move(str(old_memory), str(self.memory_ini))
127
- messages.append(f"Migrated memory.ini to {self.global_dir}")
143
+ messages.append(f"Migrated memory.ini to: {self.global_dir}")
128
144
 
129
145
  if old_projects.exists() and not self.projects_folder.exists():
130
146
  shutil.move(str(old_projects), str(self.projects_folder))
131
- messages.append(f"Migrated Projects folder to {self.projects_folder}")
147
+ messages.append(f"Migrated Projects folder to: {self.projects_folder}")
132
148
 
149
+ #==Always ensure default templates exist, no matter what profile is active==
133
150
  if not self.templates_folder.exists():
134
- default_templates = resources.files("da.templates")
135
151
  user_templates = self.templates_folder
136
152
 
137
153
  user_templates.mkdir(parents=True, exist_ok=True)
@@ -141,7 +157,7 @@ class ConfigManager:
141
157
  if not dest.exists():
142
158
  shutil.copy(item, dest)
143
159
 
144
- messages.append(f"Copied default Templates to {self.templates_folder}")
160
+ messages.append(f"Copied default Templates to: {self.templates_folder}")
145
161
 
146
162
  return messages
147
163
 
@@ -9,7 +9,7 @@ class Opener:
9
9
  def open(path):
10
10
  if not os.path.exists(path):
11
11
  print(colored("\nThis path does not exist.", "light_red"))
12
- time.sleep(1)
12
+ time.sleep(0.5)
13
13
  return
14
14
  else:
15
15
  system = platform.system()
@@ -78,7 +78,7 @@ class ProjectsManager:
78
78
  else:
79
79
  print("")
80
80
  print(colored("Unknown option...", "light_red", attrs=["bold"]))
81
- time.sleep(1)
81
+ time.sleep(0.5)
82
82
 
83
83
  def new_project(self):
84
84
  os.system(self.clear)
@@ -143,7 +143,7 @@ class ProjectsManager:
143
143
 
144
144
  print("Your projects:")
145
145
  for name in projects:
146
- print(colored(f" - {name}", f"{self.color}"))
146
+ print(" -" + colored(f" {name}", f"{self.color}"))
147
147
 
148
148
  project = input("\nProject name > ").strip()
149
149
 
@@ -152,9 +152,8 @@ class ProjectsManager:
152
152
  elif project in projects:
153
153
  self.load_project(project)
154
154
  else:
155
- print("")
156
- print(colored("Unknown option...", "light_red", attrs=["bold"]))
157
- time.sleep(1)
155
+ print(colored("\nInvalid name!", "light_red", attrs=["bold"]))
156
+ time.sleep(0.5)
158
157
 
159
158
  def load_project(self, project):
160
159
  version_logic = VersionLogic(
@@ -176,7 +175,7 @@ class ProjectsManager:
176
175
  setting = load_manager.load_project()
177
176
  except KeyError:
178
177
  print(colored(f"\nCan't find {project}.ini", "light_red"))
179
- time.sleep(1)
178
+ time.sleep(0.5)
180
179
  return
181
180
 
182
181
  edited = setting.get('edited')
@@ -241,7 +240,7 @@ class ProjectsManager:
241
240
 
242
241
  if not has_bak:
243
242
  print(colored(f"\nCan't find any .bak files for {project}", "yellow"))
244
- time.sleep(1)
243
+ time.sleep(0.5)
245
244
  return
246
245
 
247
246
  bak = has_bak[0]
@@ -102,7 +102,7 @@ class VersionLogic:
102
102
  else:
103
103
  print("")
104
104
  print(colored("Unknown option...", "light_red", attrs=["bold"]))
105
- time.sleep(1)
105
+ time.sleep(0.5)
106
106
 
107
107
  def finalise(self):
108
108
  with open(self.changelog_path, "r", encoding="utf-8") as f:
@@ -212,7 +212,7 @@ class VersionLogic:
212
212
  else:
213
213
  print("")
214
214
  print(colored("Unknown option...", "light_red", attrs=["bold"]))
215
- time.sleep(1)
215
+ time.sleep(0.5)
216
216
 
217
217
  def prepend_changes(self):
218
218
  header = f"### {self.change_type}"
@@ -249,7 +249,7 @@ class VersionLogic:
249
249
  with open(self.templog_path, "a", encoding="utf-8") as f:
250
250
  f.write(rendered + "\n")
251
251
 
252
- choice = input("\nNew type [E] or add more [Enter] > ")
252
+ choice = input("\nNew type [E] or add more [Enter] > ").strip()
253
253
  if choice.lower() == "e":
254
254
  return
255
255
 
@@ -268,7 +268,7 @@ class VersionLogic:
268
268
  self.view_md(templog_content, message)
269
269
  else:
270
270
  print(colored("No changes added.", "light_red"))
271
- time.sleep(1)
271
+ time.sleep(0.5)
272
272
  return
273
273
 
274
274
  choice = input("\nContinue" + colored("[Enter]", f"{self.color}") + " or add more" + colored("[E] ", f"{self.color}"))
@@ -331,7 +331,7 @@ class VersionLogic:
331
331
  self.config.update_memory("ITEMS", "last_project", self.active_project)
332
332
 
333
333
  print(colored("\nChangelog updated, returning...", f"{self.color}"))
334
- time.sleep(2)
334
+ time.sleep(1.5)
335
335
  return
336
336
 
337
337
  def view_md(self, log_content, message=None):
@@ -370,7 +370,7 @@ class VersionLogic:
370
370
 
371
371
  if size > max_size:
372
372
  print(colored(f"\nChangelog too large to load safely: {size_mb:.2f} MB", "light_red"))
373
- time.sleep(2)
373
+ time.sleep(1.5)
374
374
  return "reject"
375
375
 
376
376
  elif size > print_size:
@@ -1,16 +1,8 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: developer-assistant
3
- Version: 0.3.5
3
+ Version: 0.3.6
4
4
  Summary: A lightweight TUI app for managing and simplifying your Markdown changelogs.
5
- License: The MIT License (MIT)
6
-
7
- Copyright (c) 2026 Ivori Huobolainen
8
-
9
- 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:
10
-
11
- The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
12
-
13
- 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.
5
+ License-Expression: MIT
14
6
  Project-URL: Homepage, https://github.com/Ivory-Hubert/Developer-Assistant
15
7
  Project-URL: Changelog, https://github.com/Ivory-Hubert/Developer-Assistant/blob/main/CHANGELOG.md
16
8
  Classifier: Programming Language :: Python :: 3
@@ -30,7 +22,7 @@ Dynamic: license-file
30
22
 
31
23
  ## Installing from PyPI
32
24
 
33
- The program is designed for minimal friction and simple setup. Only installation is required, on first run DA will create local user data automatically. The same process is used for new profiles.
25
+ The program is designed for minimal friction and simple setup. Only installation is required, on first run DA will create local user data automatically. The same automatic process is used for creating new profiles.
34
26
 
35
27
  **Using uv:**
36
28
  `uv tool install developer-assistant`
@@ -46,6 +38,8 @@ The program is designed for minimal friction and simple setup. Only installation
46
38
  > Avoid using `sudo pip install` because it installs into the system Python.
47
39
  If you want a system‑wide install, use the uv method or use `pip install --user`
48
40
 
41
+ ---
42
+
49
43
  ## Updating DA
50
44
  Two possibilities, depending on how you installed.
51
45
 
@@ -56,13 +50,16 @@ B. **Using pip:** `python -m pip install -U developer-assistant`
56
50
 
57
51
  ## Introduction
58
52
 
59
- ### What does this tool do?
53
+ ### What does this program do?
60
54
  Developer Assistant is a lightweight TUI for simplifying and managing your changelogs. You can customize the templates for **each profile** to match your existing format, and use DA as a central hub to access every changelog and project folder you maintain.
61
55
 
62
56
  You can create as many profiles as you need. Each profile gets its own **project specific** `.ini` files, created automatically through the menu based on the information you provide. These act as links that tell DA where your changelogs are, which profile owns them and what's the last version number.
63
57
 
64
- Your files are kept safe at all times. Before adding new changes, your existing `CHANGELOG.md` is automatically backed up. While editing, all changes are written to a temporary file first and only prepended to & replaced with your real changelog once you confirm them.
58
+ Each project `.ini` can also hold a custom terminal command, that is run in that projects folder. So you can easly integrate updating your changelogs in DA with Git commands for example.
65
59
 
60
+ **Your files are kept safe at all times.** Before adding new changes, your existing `CHANGELOG.md` is automatically backed up. While editing, all changes are written to a temporary file first and only prepended to & replaced with your real changelog once you confirm them.
61
+
62
+ ---
66
63
 
67
64
  ### Using the program.
68
65
  1. **What *not* to do**
@@ -81,13 +78,13 @@ Don't change the folder structure or modify variable names inside `.ini` files.
81
78
 
82
79
  The `da-ui/` folder and subfolders will be created automatically.
83
80
 
84
- You can access its content quickly when going to: `Main menu / Settings`
81
+ > **Tip:** You can access its content quickly when going to: `Main menu / Settings`
85
82
 
86
83
  **Profiles for seperate projects and templates**
87
84
 
88
85
  The program comes with the "Default" profile, you can choose to either stick with this one or create your own profiles in `Main menu / Profiles`. Each profile has seperate projects and they can't be accessed by other profiles. You can choose to customize the templates seperately too.
89
86
 
90
- Migrating a project or template from one profile to another is currently manual, **make sure to also change the "*owner*" value in `.ini` files accordingly**.
87
+ > **Note:** Migrating a project or template from one profile to another is currently manual, **make sure to also change the "*owner*" value in `.ini` files accordingly**.
91
88
 
92
89
  ---
93
90
 
@@ -144,8 +141,9 @@ The `memory.ini` file does exactly what you'd expect, it features:
144
141
 
145
142
  Last project & active profile get updated automatically, the rest are up to you.
146
143
 
147
- **`Ctrl+C` works everywhere to quickly exit DA.**
144
+ > **Tip:** `Ctrl+C` works everywhere to quickly exit DA.
148
145
 
146
+ ---
149
147
 
150
148
  ### Setting up the test project
151
149
  For a dummy changelog to experiment with, navigate to `Main menu / Projects`, choose `test-project`, then choose option `3.` to start adjusting this projects paths. **Before setting up your own profile don't change "*Default*"**
@@ -1,10 +1,10 @@
1
1
  [project]
2
2
  name = "developer-assistant"
3
- version = "0.3.5"
3
+ version = "0.3.6"
4
4
  description = "A lightweight TUI app for managing and simplifying your Markdown changelogs."
5
5
  readme = "PYPI.md"
6
6
  requires-python = ">=3.10"
7
- license = {file = "LICENSE"}
7
+ license = "MIT"
8
8
  dependencies = [
9
9
  "platformdirs>=4.9.4",
10
10
  "prompt-toolkit>=3.0.52",