notesmgr 0.1.0__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 (62) hide show
  1. notesmgr-0.1.0/LICENSE.txt +22 -0
  2. notesmgr-0.1.0/PKG-INFO +299 -0
  3. notesmgr-0.1.0/README.md +156 -0
  4. notesmgr-0.1.0/README_pypi.md +262 -0
  5. notesmgr-0.1.0/notesmgr.egg-info/PKG-INFO +299 -0
  6. notesmgr-0.1.0/notesmgr.egg-info/SOURCES.txt +60 -0
  7. notesmgr-0.1.0/notesmgr.egg-info/dependency_links.txt +1 -0
  8. notesmgr-0.1.0/notesmgr.egg-info/entry_points.txt +2 -0
  9. notesmgr-0.1.0/notesmgr.egg-info/requires.txt +10 -0
  10. notesmgr-0.1.0/notesmgr.egg-info/top_level.txt +1 -0
  11. notesmgr-0.1.0/pyproject.toml +40 -0
  12. notesmgr-0.1.0/setup.cfg +4 -0
  13. notesmgr-0.1.0/setup.py +33 -0
  14. notesmgr-0.1.0/src/notesmgr/__init__.py +5 -0
  15. notesmgr-0.1.0/src/notesmgr/__main__.py +10 -0
  16. notesmgr-0.1.0/src/notesmgr/actions.py +86 -0
  17. notesmgr-0.1.0/src/notesmgr/application.py +93 -0
  18. notesmgr-0.1.0/src/notesmgr/button_row.py +149 -0
  19. notesmgr-0.1.0/src/notesmgr/clipboard_linux.py +58 -0
  20. notesmgr-0.1.0/src/notesmgr/clipboard_macos.py +78 -0
  21. notesmgr-0.1.0/src/notesmgr/clipboard_tool.py +84 -0
  22. notesmgr-0.1.0/src/notesmgr/clipboard_windows.py +198 -0
  23. notesmgr-0.1.0/src/notesmgr/cmd_line.py +63 -0
  24. notesmgr-0.1.0/src/notesmgr/commands.py +307 -0
  25. notesmgr-0.1.0/src/notesmgr/config.py +152 -0
  26. notesmgr-0.1.0/src/notesmgr/config_defaults.py +41 -0
  27. notesmgr-0.1.0/src/notesmgr/config_editor.py +62 -0
  28. notesmgr-0.1.0/src/notesmgr/config_files.py +147 -0
  29. notesmgr-0.1.0/src/notesmgr/console.py +62 -0
  30. notesmgr-0.1.0/src/notesmgr/descriptions.py +27 -0
  31. notesmgr-0.1.0/src/notesmgr/dialogs.py +389 -0
  32. notesmgr-0.1.0/src/notesmgr/editor_command.py +138 -0
  33. notesmgr-0.1.0/src/notesmgr/errors.py +14 -0
  34. notesmgr-0.1.0/src/notesmgr/explorer_drag.py +222 -0
  35. notesmgr-0.1.0/src/notesmgr/explorer_drop.py +195 -0
  36. notesmgr-0.1.0/src/notesmgr/explorer_font.py +81 -0
  37. notesmgr-0.1.0/src/notesmgr/explorer_tree.py +148 -0
  38. notesmgr-0.1.0/src/notesmgr/failure_report.py +92 -0
  39. notesmgr-0.1.0/src/notesmgr/file_watch.py +115 -0
  40. notesmgr-0.1.0/src/notesmgr/folder_ops.py +173 -0
  41. notesmgr-0.1.0/src/notesmgr/main_window.py +474 -0
  42. notesmgr-0.1.0/src/notesmgr/markdown_render.py +78 -0
  43. notesmgr-0.1.0/src/notesmgr/menu_bar.py +114 -0
  44. notesmgr-0.1.0/src/notesmgr/note_blocks.py +511 -0
  45. notesmgr-0.1.0/src/notesmgr/note_file.py +203 -0
  46. notesmgr-0.1.0/src/notesmgr/note_fonts.py +189 -0
  47. notesmgr-0.1.0/src/notesmgr/note_image.py +75 -0
  48. notesmgr-0.1.0/src/notesmgr/note_ops.py +316 -0
  49. notesmgr-0.1.0/src/notesmgr/note_panel.py +227 -0
  50. notesmgr-0.1.0/src/notesmgr/note_table.py +145 -0
  51. notesmgr-0.1.0/src/notesmgr/note_tags.py +241 -0
  52. notesmgr-0.1.0/src/notesmgr/note_text.py +62 -0
  53. notesmgr-0.1.0/src/notesmgr/note_view.py +273 -0
  54. notesmgr-0.1.0/src/notesmgr/order_file.py +150 -0
  55. notesmgr-0.1.0/src/notesmgr/project.py +168 -0
  56. notesmgr-0.1.0/src/notesmgr/project_ops.py +302 -0
  57. notesmgr-0.1.0/src/notesmgr/py.typed +0 -0
  58. notesmgr-0.1.0/src/notesmgr/rich_clipboard.py +107 -0
  59. notesmgr-0.1.0/src/notesmgr/session.py +71 -0
  60. notesmgr-0.1.0/src/notesmgr/shortcuts.py +131 -0
  61. notesmgr-0.1.0/src/notesmgr/trash.py +31 -0
  62. notesmgr-0.1.0/src/notesmgr/version_info.py +78 -0
@@ -0,0 +1,22 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 Tom Björkholm
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
22
+
@@ -0,0 +1,299 @@
1
+ Metadata-Version: 2.4
2
+ Name: notesmgr
3
+ Version: 0.1.0
4
+ Summary: Manager for small notes and AI prompts.
5
+ Author: Tom Björkholm
6
+ Author-email: Tom Björkholm <klausuler_linnet0q@icloud.com>
7
+ License-Expression: MIT
8
+ Project-URL: Homepage, https://github.com/tom-bjorkholm/notesmgr
9
+ Project-URL: Source code, https://github.com/tom-bjorkholm/notesmgr
10
+ Project-URL: Documentation, https://github.com/tom-bjorkholm/notesmgr/blob/master/doc
11
+ Keywords: notes,prompts,AI
12
+ Classifier: Programming Language :: Python :: 3
13
+ Classifier: Programming Language :: Python :: 3.12
14
+ Classifier: Programming Language :: Python :: 3.13
15
+ Classifier: Programming Language :: Python :: 3.14
16
+ Classifier: Operating System :: OS Independent
17
+ Classifier: Intended Audience :: End Users/Desktop
18
+ Classifier: Intended Audience :: Information Technology
19
+ Classifier: Typing :: Typed
20
+ Requires-Python: >=3.12
21
+ Description-Content-Type: text/markdown
22
+ License-File: LICENSE.txt
23
+ Requires-Dist: argcomplete>=3.7.2
24
+ Requires-Dist: edit-cfg-json-tk>=0.4.0
25
+ Requires-Dist: edit-cfg-json>=0.4.0
26
+ Requires-Dist: config-as-json>=1.7
27
+ Requires-Dist: markdown>=3.11
28
+ Requires-Dist: types-Markdown>=3.10.2.20260712
29
+ Requires-Dist: packaging>=26.3
30
+ Requires-Dist: send2trash>=2.1.0
31
+ Requires-Dist: types-Send2Trash>=2.1.0.20260408
32
+ Requires-Dist: versionreporter>=0.4
33
+ Dynamic: author
34
+ Dynamic: license-file
35
+ Dynamic: requires-dist
36
+ Dynamic: requires-python
37
+
38
+ # notesmgr - Managing small notes and AI prompts
39
+
40
+ ## What it does
41
+
42
+ `notesmgr` is a small desktop application that keeps small notes and AI
43
+ prompts in order. It is made for the texts you keep coming back to: the
44
+ prompts you paste into an AI assistant, snippets, checklists, and short
45
+ notes.
46
+
47
+ - Notes are ordinary text files in ordinary folders, so they can be kept
48
+ in git, synced, backed up and edited with any editor.
49
+ - The notes of a folder are kept in an order of your choosing, and are
50
+ reordered with a button, a key or by dragging.
51
+ - A note is edited in the editor you already use, such as Visual Studio
52
+ Code, and the note shown in `notesmgr` follows as you save.
53
+ - Every folder has a template that each new note of the folder starts
54
+ from.
55
+ - A note is copied to the clipboard with one key, either as it is
56
+ written or formatted, so that pasting it into Mail, Word or Slack keeps
57
+ headings, lists and bold text.
58
+ - Notes written in markdown are shown formatted for reading.
59
+
60
+ It runs on macOS, Microsoft Windows and Linux.
61
+
62
+ ## Installing
63
+
64
+ `notesmgr` needs Python 3.12 or newer, with Tk (tkinter). Install it
65
+ from [PyPI](https://pypi.org/project/notesmgr):
66
+
67
+ On macOS and Linux:
68
+
69
+ ````sh
70
+ pip3 install --upgrade notesmgr
71
+ ````
72
+
73
+ On Microsoft Windows:
74
+
75
+ ````sh
76
+ pip install --upgrade notesmgr
77
+ ````
78
+
79
+ The Python from python.org has Tk built in on macOS and on Windows.
80
+ On Linux Tk is often a package of its own, such as `python3-tk` on
81
+ Debian and Ubuntu. Copying a note formatted needs `xclip` (X11) or
82
+ `wl-copy` (Wayland) on Linux; without them the note is copied as
83
+ plain text.
84
+
85
+ ## Getting started
86
+
87
+ 1. Start `notesmgr`.
88
+ 2. Choose `File` → `New project…` and pick a folder. It can be an empty
89
+ folder or one that already holds notes, which are then taken in.
90
+ 3. Press `New` (`Cmd+N` on mac, `Ctrl+N` elsewhere), give the note a
91
+ name, and write it in the editor that opens.
92
+ 4. Select the note in the tree to the left to read it, and press
93
+ `Copy raw` (`Cmd+C` / `Ctrl+C`) to put it on the clipboard.
94
+
95
+ Next time, open the project with `File` → `Open project…`, or name it
96
+ on the command line: `notesmgr ~/notes`.
97
+
98
+ ## Using notesmgr
99
+
100
+ ### The main window
101
+
102
+ To the left is the tree of the project: its folders, and in each
103
+ folder the template of the folder followed by its notes in their order.
104
+ Subfolders come first, in alphabetical order.
105
+
106
+ To the right is the selected note with a row of buttons above it. A
107
+ note whose name ends with `.md` or `.md.txt` is shown formatted, and a
108
+ note ending with `.txt` is shown exactly as it is written. When a note
109
+ is changed by your editor or by any other program, the note shown
110
+ follows about a second later.
111
+
112
+ A new note or folder is made in the selected folder, in the folder of
113
+ the selected note, or in the root folder of the project when nothing is
114
+ selected.
115
+
116
+ ### Buttons and keyboard shortcuts
117
+
118
+ Every button is also in the `Note` menu. On mac the shortcuts use `Cmd`,
119
+ and on Windows and Linux they use `Ctrl`.
120
+
121
+ | Button | Shortcut | What it does |
122
+ | --- | --- | --- |
123
+ | `Copy raw` | `Cmd+C` | Copies the note as it is written. When part of the note is selected, the key copies just that part. |
124
+ | `Copy formatted` | `Cmd+Shift+C` | Copies the note formatted, for pasting into Mail, Word, Slack and the like. |
125
+ | `Duplicate` | `Cmd+D` | Copies the note, under a name and into a folder you choose. |
126
+ | `Edit` | `Cmd+E` | Opens the note in your editor. `Return` in the tree does the same. |
127
+ | `New` | `Cmd+N` | Makes a note from the template of the folder and opens it in your editor. |
128
+ | `Delete` | `Cmd+Backspace` | Moves the note to the trash, after asking. |
129
+ | `Up` | `Cmd+Up` | Moves the note one place up. |
130
+ | `Down` | `Cmd+Down` | Moves the note one place down. |
131
+
132
+ The other shortcuts are:
133
+
134
+ | Shortcut | What it does |
135
+ | --- | --- |
136
+ | `Cmd+Shift+N` | Makes a folder (`Folder` → `New folder…`). |
137
+ | `Cmd++`, `Cmd+-`, `Cmd+0` | Draws the note and the tree larger, smaller, and in the normal size again (`View` menu). |
138
+ | `Cmd+W` on mac, `Ctrl+Q` elsewhere | Quits. |
139
+ | `Tab` | Goes from the tree to the buttons and on to the note. |
140
+
141
+ The template of a folder is shown, edited and copied like any note,
142
+ but it cannot be duplicated, deleted or moved: every folder has exactly
143
+ one template.
144
+
145
+ ### Dragging
146
+
147
+ Notes and folders can be dragged in the tree. A note dropped above or
148
+ below another note is moved to that place, and a note dropped on a
149
+ folder is moved to the end of that folder. A folder dropped on another
150
+ folder is moved into it with everything it holds. While you drag, a
151
+ line shows where a note would land and the folder that would take it is
152
+ marked. `Escape` gives up the drag. A name that the other folder holds
153
+ already is refused rather than moved.
154
+
155
+ ### Folders
156
+
157
+ The `Folder` menu makes, renames and deletes folders of the project. A
158
+ new folder starts with a copy of the template of the folder above it. A
159
+ folder can be renamed at any time, and is deleted, to the trash, only
160
+ when it holds no notes and no folders. The root folder of the project
161
+ is renamed and deleted outside `notesmgr`.
162
+
163
+ ### Configuration
164
+
165
+ `Configuration` → `Edit configuration…` edits the configuration of the
166
+ open project, which is stored in `notesmgr.cfg` in the root folder of the
167
+ project. It holds:
168
+
169
+ - `editor`: the command that opens a note. `{file}` stands for the note,
170
+ and the note is put last when the command has no `{file}`, so `code`
171
+ and `code {file}` mean the same thing. For a new configuration it is
172
+ Visual Studio Code (`code`) when that is installed, otherwise the
173
+ editor that `$EDITOR` names, otherwise `open` on mac, Notepad on
174
+ Windows and `emacs` elsewhere.
175
+ - `file_extension`: what new notes are called, one of `.md.txt` (the
176
+ default), `.md` and `.txt`. `.md.txt` is the default because many
177
+ systems do not see `.md` as a safe kind of file.
178
+ - `max_note_size`: how many characters of a note are shown, from 2000 to
179
+ 100000 and 25000 unless you say otherwise. A longer note is shown up to
180
+ there, with a warning above it.
181
+
182
+ A configuration file looks like this:
183
+
184
+ ````json
185
+ {
186
+ "editor": "code -n {file}",
187
+ "file_extension": "MD_TXT",
188
+ "max_note_size": 25000
189
+ }
190
+ ````
191
+
192
+ `Configuration` → `Save configuration as user wide…` makes the
193
+ configuration of the project the one that every new project starts
194
+ with. With no project open, `Edit configuration…` edits that user wide
195
+ configuration.
196
+
197
+ ### Command line
198
+
199
+ ````sh
200
+ notesmgr [PROJECT_FOLDER]
201
+ notesmgr --version
202
+ ````
203
+
204
+ Started with a folder, `notesmgr` opens the project in it. `--version`
205
+ reports the versions of `notesmgr` and of the packages it uses, and
206
+ which newer releases there are, just as `Help` → `Version information…`
207
+ does.
208
+
209
+ ## Details
210
+
211
+ This section says what `notesmgr` does in the cases where you might
212
+ wonder.
213
+
214
+ ### The files of a project
215
+
216
+ - `notesmgr.cfg` in the root folder holds the configuration of the
217
+ project.
218
+ - Every folder holds one template, `template.md.txt`, `template.md` or
219
+ `template.txt` after the `file_extension` of the project.
220
+ - Every folder holds a hidden `.notes_order.txt` that lists the notes of
221
+ the folder, one name per line, in the order they are shown. Folders
222
+ are not listed in it.
223
+ - Every other file ending with `.txt`, `.md` or `.md.txt` is a note.
224
+
225
+ All of these can be edited with any text editor while `notesmgr` is not
226
+ looking. Deleting a note, a folder or a template always moves it to the
227
+ trash of the operating system, so it can be taken back.
228
+
229
+ ### What opening a project puts in order
230
+
231
+ - `.notes_order.txt` is repaired: names of notes that are gone are
232
+ removed, and notes it does not name are added at the end in
233
+ alphabetical order. A folder whose `.notes_order.txt` cannot be read or
234
+ written is reported, and its notes are shown in alphabetical order.
235
+ - A folder without a template gets one: an empty one in the root
236
+ folder, and a copy of the template of the folder above it elsewhere.
237
+ - A template whose extension is not the `file_extension` of the project
238
+ is renamed, and you are told so. Changing `file_extension` therefore
239
+ renames the templates the next time the project is opened.
240
+ - A folder holding more than one template is the one thing `notesmgr`
241
+ cannot decide for you. You are asked which one to keep, and the others
242
+ go to the trash. Answering nothing leaves every file as it is, and the
243
+ project is not opened.
244
+
245
+ ### What a formatted note shows
246
+
247
+ Headings, paragraphs, bold, italic, `~~struck through~~` text, code in a
248
+ line and code blocks, lists nested as deeply as you like, tables, block
249
+ quotes, horizontal lines, and the text of links. PNG and GIF images next
250
+ to the note are drawn where the note shows them, and other images are
251
+ named by their description. HTML in a note is shown as the text it is.
252
+ A note that is not valid UTF-8 is not shown, and says why.
253
+
254
+ ### How `Copy formatted` works
255
+
256
+ The note goes on the clipboard as rich text and as plain text, so that
257
+ an application that takes formatting gets it, and a plain text field
258
+ gets the note as it is written. A note that is not markdown is copied
259
+ as preformatted text, so that a table lined up by hand stays lined up.
260
+ It uses what the operating system already has: `textutil` and
261
+ `osascript` on mac, the Windows clipboard itself, and `xclip` or
262
+ `wl-copy` on Linux. When the tool it needs is missing, the note is
263
+ copied as plain text and you are told why.
264
+
265
+ ### Where the user wide configuration is
266
+
267
+ It is read from the file that `$NOTESMGR_CFG` names, when that file
268
+ exists, otherwise from `~/.notesmgr.cfg`, and otherwise the built-in
269
+ defaults are used. It is written to the file that `$NOTESMGR_CFG`
270
+ names, whether that file exists yet or not, and to `~/.notesmgr.cfg`
271
+ when the variable is not set.
272
+
273
+ ### What is remembered
274
+
275
+ Nothing is remembered from one run to the next: not the last project,
276
+ not the size of the window, and not the size of the text. Within one
277
+ run, the folder chooser starts in the project opened last.
278
+
279
+ ## What notesmgr is built on
280
+
281
+ `notesmgr` uses `config-as-json` and `edit-cfg-json-tk` for its
282
+ configuration, `markdown` for reading notes written in markdown,
283
+ `versionreporter` for the version report, `argcomplete` for the command
284
+ line, and `Send2Trash` for moving files to the trash.
285
+
286
+ ## Source code
287
+
288
+ Source code and tests are available at
289
+ [https://github.com/tom-bjorkholm/notesmgr](https://github.com/tom-bjorkholm/notesmgr).
290
+
291
+ ## Test summary
292
+
293
+ - Test result: 1489 passed, 13 deselected in 7s
294
+ - No flake8 warnings.
295
+ - No mypy errors found.
296
+ - No pylint warnings.
297
+ - No python layout warnings.
298
+ - Built version(s): 0.1.0
299
+ - Build and test using Python 3.14.7
@@ -0,0 +1,156 @@
1
+ # notesmgr
2
+
3
+ ## What it does
4
+
5
+ Notes manager is a very small application to keep small notes
6
+ and AI prompts files ordered. The main intended functionality includes:
7
+
8
+ - Keeping a project with folders of notes (that is small text files)
9
+ - Keeping the notes in a defined order, and allowing them to be
10
+ reordered.
11
+ - Opening an external editor to create and edit notes.
12
+ - Keeping a template in each folder that will be prefilled into
13
+ each new notes file.
14
+
15
+ ## Using it
16
+
17
+ If you want to use it, install it using pip from
18
+
19
+ [https://pypi.org/project/notesmgr](https://pypi.org/project/notesmgr).
20
+
21
+ There is no need to download anything from GitHub to use the application
22
+ or to base your code on the library.
23
+
24
+ ### Installing on macOS and Linux
25
+
26
+ ````sh
27
+ pip3 install --upgrade notesmgr
28
+ ````
29
+
30
+ ### Installing on Microsoft Windows
31
+
32
+ ````sh
33
+ pip install --upgrade notesmgr
34
+ ````
35
+
36
+ ### Information for use
37
+
38
+ To learn how to use notesmgr please see
39
+ [https://pypi.org/project/notesmgr](https://pypi.org/project/notesmgr)
40
+ or [README_pypi.md](README_pypi.md).
41
+
42
+ For the code documentation generated from the docstrings, see
43
+ [doc/api.md](doc/api.md).
44
+
45
+ ## Cloning
46
+
47
+ **Note: Repository is not yet uploaded to GitHub.**
48
+
49
+ This repository uses submodules. Clone it with:
50
+
51
+ ```sh
52
+ git clone --recurse-submodules git@github.com:tom-bjorkholm/notesmgr.git
53
+ ```
54
+
55
+ If you already cloned without submodules, initialize them with:
56
+
57
+ ```sh
58
+ git submodule update --init --recursive
59
+ ```
60
+
61
+ To update the checked-out submodule revisions:
62
+
63
+ ```sh
64
+ git submodule update --remote --merge
65
+ ```
66
+
67
+ ## Supported Python versions
68
+
69
+ - Package runtime baseline: Python 3.12 or newer
70
+ - Maintainer validation target: Python 3.12, 3.13, and 3.14
71
+ - Main day-to-day development: usually the newest supported Python version
72
+
73
+ ## Development workflow
74
+
75
+ On macOS and Linux, the normal workflow is:
76
+
77
+ 1. Run `./run_setup_build_environment.py` once after cloning or when the
78
+ build environment needs to be recreated.
79
+ 2. Run `./run_build.py` for the normal build-and-test cycle.
80
+ 3. Run `./run_clean_build.py` before review or release work that needs a
81
+ completely fresh build.
82
+
83
+ The helper scripts are:
84
+
85
+ - `run_setup_build_environment.py`
86
+ Create or refresh the build environment.
87
+ - `run_build.py`
88
+ Build the package and run the configured checks in the project virtual
89
+ environment.
90
+ - `run_clean.py`
91
+ Remove files generated by the build system.
92
+ - `run_clean_build.py`
93
+ Perform a clean build from scratch. This is especially useful because some
94
+ duplicate-code diagnostics only appear on a clean build.
95
+ - `run_pypi_build.py`
96
+ Create the distribution artifacts intended for PyPI publishing.
97
+ - `run_static_checks.py`
98
+ Run mypy, flake8, python-layout and pylint on the named files only, for
99
+ fast iteration while editing. It does not update the virtual environment,
100
+ so imports from `./venv` are not refreshed.
101
+ - `run_focus_sensitive_tests.py`
102
+ Run the GUI tests that need an unlocked display and an uninterrupted
103
+ focused window. These are excluded from the normal build, and the
104
+ computer must be left alone while they run.
105
+
106
+ The standard verification suite includes pytest, pylint, flake8, mypy and
107
+ python-layout. After a build, the generated reports can be browsed through
108
+ `reports/index.html`.
109
+
110
+ After running `run_build.py` or `run_clean_build.py`, you can manually test
111
+ the built and installed application in the virtual environment `./venv`.
112
+
113
+ ## How the code is organised
114
+
115
+ All code is in the single package `src/notesmgr`, and every source module
116
+ has one test module in `test/test_notesmgr`. The code is split in two
117
+ layers:
118
+
119
+ - **Model, free of Tk.** Everything that has a right answer: which note
120
+ is at which place, whether a name can be used, how `.notes_order.txt`
121
+ is repaired, what the editor command line is, and what goes on the
122
+ clipboard. Examples are `project.py`, `project_ops.py`, `note_ops.py`,
123
+ `folder_ops.py`, `order_file.py`, `explorer_drop.py`, `note_blocks.py`
124
+ and `rich_clipboard.py`. These are tested without a display.
125
+ - **View, thin Tk.** Widgets that show what the model says and call the
126
+ model: `main_window.py`, `explorer_tree.py`, `note_panel.py`,
127
+ `note_view.py`, `dialogs.py` and the others. They are tested with a real
128
+ Tk root window that is never shown.
129
+
130
+ What cannot be done is raised as `NotesmgrError`, with a message meant for
131
+ the user, and the view shows it in a message box. Anything else that fails
132
+ inside a Tk callback is shown in a window with its traceback by
133
+ `failure_report.py`, because a program started from a desktop has no
134
+ terminal. On Windows, the `gui-scripts` entry point has no standard
135
+ streams at all, so `console.py` shows command line errors in a window.
136
+
137
+ The keyboard shortcuts are listed in `shortcuts.py`, one entry per action,
138
+ and are shown as accelerators on the menu entries of the same actions.
139
+
140
+ The implementation plan and the decisions taken step by step are in
141
+ `.plans/initials_steps.md`.
142
+
143
+ ## Manual tests before a release
144
+
145
+ Run `./run_focus_sensitive_tests.py` and leave the computer alone while
146
+ it runs.
147
+
148
+ ## Test summary
149
+
150
+ - Test result: 1489 passed, 13 deselected in 7s
151
+ - No flake8 warnings.
152
+ - No mypy errors found.
153
+ - No pylint warnings.
154
+ - No python layout warnings.
155
+ - Built version(s): 0.1.0
156
+ - Build and test using Python 3.14.7