developer-assistant 0.2.5__tar.gz → 0.3.5__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 (33) hide show
  1. {developer_assistant-0.2.5/developer_assistant.egg-info → developer_assistant-0.3.5}/PKG-INFO +52 -20
  2. developer_assistant-0.3.5/PYPI.md +127 -0
  3. developer_assistant-0.3.5/README.md +169 -0
  4. {developer_assistant-0.2.5 → developer_assistant-0.3.5}/da/default/default-memory.ini +1 -0
  5. developer_assistant-0.3.5/da/default/test-project.ini +9 -0
  6. developer_assistant-0.3.5/da/interface.py +310 -0
  7. developer_assistant-0.3.5/da/intro.md +97 -0
  8. {developer_assistant-0.2.5 → developer_assistant-0.3.5}/da/modules/config_manager.py +66 -35
  9. {developer_assistant-0.2.5 → developer_assistant-0.3.5}/da/modules/opener.py +2 -7
  10. developer_assistant-0.3.5/da/modules/projects_manager.py +270 -0
  11. {developer_assistant-0.2.5 → developer_assistant-0.3.5}/da/modules/version_logic.py +162 -105
  12. developer_assistant-0.3.5/da/templates/changelog_template.txt +5 -0
  13. {developer_assistant-0.2.5 → developer_assistant-0.3.5/developer_assistant.egg-info}/PKG-INFO +52 -20
  14. {developer_assistant-0.2.5 → developer_assistant-0.3.5}/pyproject.toml +2 -5
  15. developer_assistant-0.2.5/PYPI.md +0 -92
  16. developer_assistant-0.2.5/README.md +0 -123
  17. developer_assistant-0.2.5/da/default/test-project.ini +0 -5
  18. developer_assistant-0.2.5/da/interface.py +0 -241
  19. developer_assistant-0.2.5/da/intro.md +0 -63
  20. developer_assistant-0.2.5/da/modules/projects_manager.py +0 -114
  21. developer_assistant-0.2.5/da/templates/changelog_template.txt +0 -6
  22. {developer_assistant-0.2.5 → developer_assistant-0.3.5}/LICENSE +0 -0
  23. {developer_assistant-0.2.5 → developer_assistant-0.3.5}/da/__init__.py +0 -0
  24. {developer_assistant-0.2.5 → developer_assistant-0.3.5}/da/default/default-changelog.md +0 -0
  25. {developer_assistant-0.2.5 → developer_assistant-0.3.5}/da/modules/__init__.py +0 -0
  26. {developer_assistant-0.2.5 → developer_assistant-0.3.5}/da/templates/entry_template.txt +0 -0
  27. {developer_assistant-0.2.5 → developer_assistant-0.3.5}/da/templates/header_template.txt +0 -0
  28. {developer_assistant-0.2.5 → developer_assistant-0.3.5}/developer_assistant.egg-info/SOURCES.txt +0 -0
  29. {developer_assistant-0.2.5 → developer_assistant-0.3.5}/developer_assistant.egg-info/dependency_links.txt +0 -0
  30. {developer_assistant-0.2.5 → developer_assistant-0.3.5}/developer_assistant.egg-info/entry_points.txt +0 -0
  31. {developer_assistant-0.2.5 → developer_assistant-0.3.5}/developer_assistant.egg-info/requires.txt +0 -0
  32. {developer_assistant-0.2.5 → developer_assistant-0.3.5}/developer_assistant.egg-info/top_level.txt +0 -0
  33. {developer_assistant-0.2.5 → developer_assistant-0.3.5}/setup.cfg +0 -0
@@ -1,7 +1,7 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: developer-assistant
3
- Version: 0.2.5
4
- Summary: A lightweight TUI designed to simplify formatting of Markdown changelogs.
3
+ Version: 0.3.5
4
+ Summary: A lightweight TUI app for managing and simplifying your Markdown changelogs.
5
5
  License: The MIT License (MIT)
6
6
 
7
7
  Copyright (c) 2026 Ivori Huobolainen
@@ -12,11 +12,8 @@ License: The MIT License (MIT)
12
12
 
13
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.
14
14
  Project-URL: Homepage, https://github.com/Ivory-Hubert/Developer-Assistant
15
- Project-URL: Repository, https://github.com/Ivory-Hubert/Developer-Assistant.git
16
- Project-URL: Issues, https://github.com/Ivory-Hubert/Developer-Assistant/issues
17
15
  Project-URL: Changelog, https://github.com/Ivory-Hubert/Developer-Assistant/blob/main/CHANGELOG.md
18
16
  Classifier: Programming Language :: Python :: 3
19
- Classifier: License :: OSI Approved :: MIT License
20
17
  Classifier: Operating System :: OS Independent
21
18
  Classifier: Environment :: Console
22
19
  Classifier: Topic :: Software Development :: Libraries :: Python Modules
@@ -32,6 +29,9 @@ Dynamic: license-file
32
29
  # Developer Assistant
33
30
 
34
31
  ## Installing from PyPI
32
+
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.
34
+
35
35
  **Using uv:**
36
36
  `uv tool install developer-assistant`
37
37
 
@@ -53,14 +53,15 @@ A. **Using uv:** `uv tool upgrade developer-assistant`
53
53
 
54
54
  B. **Using pip:** `python -m pip install -U developer-assistant`
55
55
 
56
+
56
57
  ## Introduction
57
58
 
58
59
  ### What does this tool do?
59
- Developer Assistant is a lightweight TUI tool for automating and managing your changelogs. You can customize the templates to match your existing format, and use DA as a central hub to access every changelog and project folder you maintain.
60
+ 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.
60
61
 
61
- You can manage as many projects as you like. Each project gets its own `.ini` file, created automatically through the menu based on the information you provide. These act as links that tell DA where your changelogs are and what's the last version number.
62
+ 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.
62
63
 
63
- 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 applied to the real changelog once you confirm them.
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.
64
65
 
65
66
 
66
67
  ### Using the program.
@@ -78,30 +79,58 @@ Don't change the folder structure or modify variable names inside `.ini` files.
78
79
 
79
80
  * macOS: `~/Library/Application Support/da-ui/`
80
81
 
81
- The `da-ui/` folder will be created automatically.
82
+ The `da-ui/` folder and subfolders will be created automatically.
82
83
 
83
84
  You can access its content quickly when going to: `Main menu / Settings`
84
85
 
85
- - *Customizable templates*
86
+ **Profiles for seperate projects and templates**
87
+
88
+ 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
+
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**.
91
+
92
+ ---
93
+
94
+ **Customizable templates**
86
95
 
87
96
  In the **local** `Templates/` folder you can modify the template contents to your liking - **just avoid changing the `{{placeholder}}` names**.
88
97
 
89
- - *Linked projects all in one place*
98
+ Templates come in three flavours:
99
+
100
+ * changelog_template.txt - *Changelog title*
101
+
102
+ * header_template.txt - *Version and date*
103
+
104
+ * entry_template.txt - *Change entry and comments*
105
+
106
+
107
+ **Linked projects all in one place**
90
108
 
91
109
  The `Projects/` folder holds the `.ini` files you create when starting a new project with DA.
92
110
 
93
- - *Safe changelog updates*
111
+ [Project.ini example](./documents/project-example.ini)
112
+
113
+ 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.
114
+
115
+ `owner` & `edited` are filled out automatically when a new project is created and `edited` updates with every changelog update.
116
+
117
+ ---
118
+
119
+ **Safe changelog updates**
94
120
 
95
121
  Before applying any changes, your previous `CHANGELOG.md` is automatically backed up into your project folder.
96
- New changes are first written to a temporary file and only applied to the real changelog after you confirm them.
122
+ New changes are first written to a temporary file and only prepended to & replaced with your real changelog once you confirm them.
123
+
97
124
  This ensures your existing changelog is never overwritten or corrupted, and you always have a fallback copy.
98
125
  If the temporary changelog is present on startup you are prompted to remove or keep it.
99
126
 
100
- - *Ease of navigation*
127
+
128
+ **Ease of navigation**
101
129
 
102
130
  You can access files/folders and configuration straight from the menus, so you shouldn't find yourself searching through the program's directory or even your local user data very often.
103
131
 
104
- - *Configuration*
132
+
133
+ **Configuration**
105
134
 
106
135
  The `memory.ini` file does exactly what you'd expect, it features:
107
136
 
@@ -109,15 +138,18 @@ The `memory.ini` file does exactly what you'd expect, it features:
109
138
 
110
139
  * Pinned projects
111
140
 
141
+ * Active profile
142
+
112
143
  * Custom colour
113
144
 
114
- Last project gets updated automatically, the rest are up to you.
145
+ Last project & active profile get updated automatically, the rest are up to you.
146
+
147
+ **`Ctrl+C` works everywhere to quickly exit DA.**
115
148
 
116
- - *`Ctrl+C` works everywhere to quickly exit DA.*
117
149
 
118
- ### Setting up your first project
119
- For a dummy changelog to experiment with, navigate to `Main menu / Projects`, choose `test-project`, then choose option `4.` to start adjusting this projects paths.
150
+ ### Setting up the test project
151
+ 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*"**
120
152
 
121
- Now make an optional `test-project/` folder with a `CHANGELOG.md` in it anywhere on your system and point the `.ini` file to it.
153
+ The `test-project/` folder is included in the programs root folder **for repo clones** and is safe to experiment with. If you installed from PyPI just make a `CHANGELOG.md` anywhere and point the `.ini` file to it.
122
154
 
123
155
  Once configured, you can create as many changelog entries as you want by picking that project in the menu.
@@ -0,0 +1,127 @@
1
+ # Developer Assistant
2
+
3
+ ## Installing from PyPI
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.
6
+
7
+ **Using uv:**
8
+ `uv tool install developer-assistant`
9
+
10
+ **Using pip:**
11
+ `pip install developer-assistant`
12
+
13
+ **Then use `da-ui` anywhere in your terminal to run it**
14
+
15
+ > **Tip:** Once setup is complete and you start the program, an intro with all the necessary information will be displayed for you in the terminal.
16
+
17
+ > **Linux note:**
18
+ > Avoid using `sudo pip install` because it installs into the system Python.
19
+ If you want a system‑wide install, use the uv method or use `pip install --user`
20
+
21
+ ## Updating DA
22
+ Two possibilities, depending on how you installed.
23
+
24
+ A. **Using uv:** `uv tool upgrade developer-assistant`
25
+
26
+ B. **Using pip:** `python -m pip install -U developer-assistant`
27
+
28
+
29
+ ## Introduction
30
+
31
+ ### What does this tool do?
32
+ 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
+
34
+ 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
+
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.
37
+
38
+
39
+ ### Using the program.
40
+ 1. **What *not* to do**
41
+
42
+ Don't change the folder structure or modify variable names inside `.ini` files.
43
+
44
+ 2. **Features and information**
45
+
46
+ **The user's data (`Templates/`, `Projects/`, `memory.ini`) is stored in standard locations:**
47
+
48
+ * Windows: `C:\Users\...\AppData\Roaming\da-ui\`
49
+
50
+ * Linux: `~/.config/da-ui/`
51
+
52
+ * macOS: `~/Library/Application Support/da-ui/`
53
+
54
+ The `da-ui/` folder and subfolders will be created automatically.
55
+
56
+ You can access its content quickly when going to: `Main menu / Settings`
57
+
58
+ **Profiles for seperate projects and templates**
59
+
60
+ 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
+
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**.
63
+
64
+ ---
65
+
66
+ **Customizable templates**
67
+
68
+ In the **local** `Templates/` folder you can modify the template contents to your liking - **just avoid changing the `{{placeholder}}` names**.
69
+
70
+ Templates come in three flavours:
71
+
72
+ * changelog_template.txt - *Changelog title*
73
+
74
+ * header_template.txt - *Version and date*
75
+
76
+ * entry_template.txt - *Change entry and comments*
77
+
78
+
79
+ **Linked projects all in one place**
80
+
81
+ The `Projects/` folder holds the `.ini` files you create when starting a new project with DA.
82
+
83
+ [Project.ini example](./documents/project-example.ini)
84
+
85
+ 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.
86
+
87
+ `owner` & `edited` are filled out automatically when a new project is created and `edited` updates with every changelog update.
88
+
89
+ ---
90
+
91
+ **Safe changelog updates**
92
+
93
+ Before applying any changes, your previous `CHANGELOG.md` is automatically backed up into your project folder.
94
+ New changes are first written to a temporary file and only prepended to & replaced with your real changelog once you confirm them.
95
+
96
+ This ensures your existing changelog is never overwritten or corrupted, and you always have a fallback copy.
97
+ If the temporary changelog is present on startup you are prompted to remove or keep it.
98
+
99
+
100
+ **Ease of navigation**
101
+
102
+ You can access files/folders and configuration straight from the menus, so you shouldn't find yourself searching through the program's directory or even your local user data very often.
103
+
104
+
105
+ **Configuration**
106
+
107
+ The `memory.ini` file does exactly what you'd expect, it features:
108
+
109
+ * Last project
110
+
111
+ * Pinned projects
112
+
113
+ * Active profile
114
+
115
+ * Custom colour
116
+
117
+ Last project & active profile get updated automatically, the rest are up to you.
118
+
119
+ **`Ctrl+C` works everywhere to quickly exit DA.**
120
+
121
+
122
+ ### Setting up the test project
123
+ 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*"**
124
+
125
+ The `test-project/` folder is included in the programs root folder **for repo clones** and is safe to experiment with. If you installed from PyPI just make a `CHANGELOG.md` anywhere and point the `.ini` file to it.
126
+
127
+ Once configured, you can create as many changelog entries as you want by picking that project in the menu.
@@ -0,0 +1,169 @@
1
+ # Developer Assistant
2
+ [![PyPI version](https://img.shields.io/pypi/v/developer-assistant?logo=pypi&logoColor=white&color=blue)](https://pypi.org/project/developer-assistant/)
3
+
4
+ > **A lightweight TUI app for managing and simplifying your Markdown changelogs.**
5
+
6
+ > `pip install developer-assistant`
7
+
8
+ * **Installation:** detailed instructions in [SETUP](./SETUP.md)
9
+
10
+ * **Changes:** yes, I keep a [CHANGELOG](./CHANGELOG.md)
11
+
12
+ ---
13
+
14
+ * **Requirements:** Python 3.10 or later.
15
+
16
+ * **Cross-platform:** Windows, Linux, macOS(*unverified*)
17
+
18
+ * **Specifics:** [SYSTEM STRUCTURE](./documents/SYSTEM_STRUCTURE.txt)
19
+
20
+
21
+ ## Appearance
22
+
23
+ ### Coloured, easy-to-use menus
24
+ A comfortable interface with a modern polish, built the good old way:
25
+
26
+ ![Changelog Menu](documents/images/changelog-menu.png)
27
+
28
+ ### Beautiful changelog previews
29
+ Preview your Markdown changelogs directly in the terminal with Rich rendering:
30
+
31
+ ![Changelog Preview](documents/images/md-preview.png)
32
+
33
+
34
+ ## Introduction
35
+
36
+ ### What does this tool do?
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
+
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
+
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.
42
+
43
+ ---
44
+
45
+ ### Using the program.
46
+ 1. **What *not* to do**
47
+
48
+ Don't change the folder structure or modify variable names inside `.ini` files.
49
+
50
+ 2. **Features and information**
51
+
52
+ **The user's data (`Templates/`, `Projects/`, `memory.ini`) is stored in standard locations:**
53
+
54
+ * Windows: `C:\Users\...\AppData\Roaming\da-ui\`
55
+
56
+ * Linux: `~/.config/da-ui/`
57
+
58
+ * macOS: `~/Library/Application Support/da-ui/`
59
+
60
+ The `da-ui/` folder and subfolders will be created automatically.
61
+
62
+ > [!TIP]
63
+ > You can access its content quickly when going to: `Main menu / Settings`
64
+
65
+ **Profiles for seperate projects and templates**
66
+
67
+ 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.
68
+
69
+ > [!NOTE]
70
+ > 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**.
71
+
72
+ ---
73
+
74
+ **Customizable templates**
75
+
76
+ In the **local** `Templates/` folder you can modify the template contents to your liking - **just avoid changing the `{{placeholder}}` names**.
77
+
78
+ Templates come in three flavours:
79
+
80
+ * changelog_template.txt - *Changelog title*
81
+
82
+ * header_template.txt - *Version and date*
83
+
84
+ * entry_template.txt - *Change entry and comments*
85
+
86
+
87
+ **Linked projects all in one place**
88
+
89
+ The `Projects/` folder holds the `.ini` files you create when starting a new project with DA.
90
+
91
+ [Project.ini example](./documents/project-example.ini)
92
+
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.
94
+
95
+ `owner` & `edited` are filled out automatically when a new project is created and `edited` updates with every changelog update.
96
+
97
+ ---
98
+
99
+ **Safe changelog updates**
100
+
101
+ Before applying any changes, your previous `CHANGELOG.md` is automatically backed up into your project folder.
102
+ New changes are first written to a temporary file and only prepended to & replaced with your real changelog once you confirm them.
103
+
104
+ This ensures your existing changelog is never overwritten or corrupted, and you always have a fallback copy.
105
+ If the temporary changelog is present on startup you are prompted to remove or keep it.
106
+
107
+
108
+ **Ease of navigation**
109
+
110
+ You can access files/folders and configuration straight from the menus, so you shouldn't find yourself searching through the program's directory or even your local user data very often.
111
+
112
+
113
+ **Configuration**
114
+
115
+ The `memory.ini` file does exactly what you'd expect, it features:
116
+
117
+ * Last project
118
+
119
+ * Pinned projects
120
+
121
+ * Active profile
122
+
123
+ * Custom colour
124
+
125
+ Last project & active profile get updated automatically, the rest are up to you.
126
+
127
+ > [!TIP]
128
+ > **`Ctrl+C` works everywhere to quickly exit DA.**
129
+
130
+ ---
131
+
132
+ ### Setting up the test project
133
+ 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*"**
134
+
135
+ The `test-project/` folder is included in the programs root folder **for repo clones** and is safe to experiment with. If you installed from PyPI just make a `CHANGELOG.md` anywhere and point the `.ini` file to it.
136
+
137
+ Once configured, you can create as many changelog entries as you want by picking that project in the menu.
138
+
139
+
140
+ ## Updating DA
141
+ Two possibilities, depending on how you installed.
142
+
143
+ ### 1. Installed from PyPI
144
+ A. **Using uv:**
145
+ ```bash
146
+ uv tool upgrade developer-assistant
147
+ ```
148
+
149
+ B. **Using pip:**
150
+ ```bash
151
+ python -m pip install -U developer-assistant
152
+ ```
153
+
154
+ ### 2. Installed from a local clone
155
+ *Run all terminal commands in the repo folder*
156
+
157
+ A. **Using uv:**
158
+
159
+ 1. `git pull`
160
+ 2. `uv tool install .`
161
+
162
+ B. **Using pip:**
163
+
164
+ 1. `git pull`
165
+ 2. `pip install .`
166
+
167
+ C. **No install, running from repo root:**
168
+
169
+ Just `git pull`
@@ -5,5 +5,6 @@ pinned_project1 =
5
5
  pinned_project2 =
6
6
 
7
7
  [CONFIG]
8
+ profile = Default
8
9
  color =
9
10
 
@@ -0,0 +1,9 @@
1
+ [SETTINGS]
2
+ edited =
3
+ owner = Default
4
+ path = C:\Users\...\Developer-Assistant\test-project
5
+ changelog = C:\Users\...\Developer-Assistant\test-project\CHANGELOG.md
6
+ version = 1.0.0
7
+ command = git add CHANGELOG.md
8
+ ;; the command could be anything, DA will run it in your project folder if you add it (runs in "Format & commit")
9
+ cloud =