foldermaker 1.0.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.
- foldermaker-1.0.0/LICENSE +21 -0
- foldermaker-1.0.0/PKG-INFO +274 -0
- foldermaker-1.0.0/README.md +262 -0
- foldermaker-1.0.0/foldermaker/__init__.py +16 -0
- foldermaker-1.0.0/foldermaker/builder.py +122 -0
- foldermaker-1.0.0/foldermaker/parser.py +117 -0
- foldermaker-1.0.0/foldermaker.egg-info/PKG-INFO +274 -0
- foldermaker-1.0.0/foldermaker.egg-info/SOURCES.txt +11 -0
- foldermaker-1.0.0/foldermaker.egg-info/dependency_links.txt +1 -0
- foldermaker-1.0.0/foldermaker.egg-info/entry_points.txt +2 -0
- foldermaker-1.0.0/foldermaker.egg-info/top_level.txt +1 -0
- foldermaker-1.0.0/pyproject.toml +21 -0
- foldermaker-1.0.0/setup.cfg +4 -0
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 LetWeDo.freedev.app
|
|
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.
|
|
@@ -0,0 +1,274 @@
|
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
|
+
Name: foldermaker
|
|
3
|
+
Version: 1.0.0
|
|
4
|
+
Summary: Create folders and files automatically from AI-generated text folder trees.
|
|
5
|
+
Author: Aniruddha Singh
|
|
6
|
+
License: MIT
|
|
7
|
+
Keywords: folder,tree,scaffold,project-generator,ai
|
|
8
|
+
Requires-Python: >=3.9
|
|
9
|
+
Description-Content-Type: text/markdown
|
|
10
|
+
License-File: LICENSE
|
|
11
|
+
Dynamic: license-file
|
|
12
|
+
|
|
13
|
+
# FolderMaker
|
|
14
|
+
|
|
15
|
+
**FolderMaker** is a free and open-source Python library that creates complete project folder and file structures from a text tree copied from AI assistant.
|
|
16
|
+
|
|
17
|
+
Instead of manually creating every folder and file, paste the AI-generated structure into a `.txt` file and run one Python command. FolderForge will create the full structure automatically.
|
|
18
|
+
|
|
19
|
+
## Features
|
|
20
|
+
|
|
21
|
+
- Creates folders and files from an AI-generated text tree
|
|
22
|
+
- Supports nested folders and files
|
|
23
|
+
- Understands tree symbols such as `│`, `├──`, and `└──`
|
|
24
|
+
- Supports Windows paths such as `D:\MY_AGENT\`
|
|
25
|
+
- Detects folders with trailing `\` or `/`
|
|
26
|
+
- Detects files such as `main.py`, `README.md`, and `Modelfile`
|
|
27
|
+
- Creates empty folders such as `logs\`, `workspace\`, and `venv\`
|
|
28
|
+
- Includes a dry-run mode to preview the result
|
|
29
|
+
- No external dependencies
|
|
30
|
+
- MIT licensed
|
|
31
|
+
|
|
32
|
+
## Installation
|
|
33
|
+
|
|
34
|
+
### Install from source
|
|
35
|
+
|
|
36
|
+
1. Download or clone this repository.
|
|
37
|
+
|
|
38
|
+
```powershell
|
|
39
|
+
git clone [https://github.com/your-username/foldermaker.git]
|
|
40
|
+
cd foldermaker
|
|
41
|
+
```
|
|
42
|
+
|
|
43
|
+
2. Install the library:
|
|
44
|
+
|
|
45
|
+
```powershell
|
|
46
|
+
pip install foldermaker.
|
|
47
|
+
```
|
|
48
|
+
### 1. Create a structure file
|
|
49
|
+
|
|
50
|
+
Create a file named `structure.txt`.
|
|
51
|
+
|
|
52
|
+
Paste your AI-generated folder tree into it exactly as shown by the AI assistant.
|
|
53
|
+
|
|
54
|
+
Example:
|
|
55
|
+
|
|
56
|
+
```text
|
|
57
|
+
D:\MY_AGENT\
|
|
58
|
+
│
|
|
59
|
+
├── Modelfile
|
|
60
|
+
├── main.py
|
|
61
|
+
├── config\
|
|
62
|
+
│ └── settings.py
|
|
63
|
+
│
|
|
64
|
+
├── core\
|
|
65
|
+
│ ├── ollama_client.py
|
|
66
|
+
│ ├── agent.py
|
|
67
|
+
│ ├── planner.py
|
|
68
|
+
│ └── tool_executor.py
|
|
69
|
+
│
|
|
70
|
+
├── tools\
|
|
71
|
+
│ ├── web_search.py
|
|
72
|
+
│ ├── browser.py
|
|
73
|
+
│ ├── file_manager.py
|
|
74
|
+
│ └── code_executor.py
|
|
75
|
+
│
|
|
76
|
+
├── memory\
|
|
77
|
+
│ ├── database.py
|
|
78
|
+
│ ├── long_term_memory.py
|
|
79
|
+
│ └── feedback.py
|
|
80
|
+
│
|
|
81
|
+
├── knowledge\
|
|
82
|
+
│ └── document_reader.py
|
|
83
|
+
│
|
|
84
|
+
├── task_manager\
|
|
85
|
+
│ └── queue.py
|
|
86
|
+
│
|
|
87
|
+
├── logs\
|
|
88
|
+
├── generated_tools\
|
|
89
|
+
├── workspace\
|
|
90
|
+
└── venv\
|
|
91
|
+
```
|
|
92
|
+
|
|
93
|
+
### 2. Create a Python runner file
|
|
94
|
+
|
|
95
|
+
Create a file named `main.py`:
|
|
96
|
+
|
|
97
|
+
```python
|
|
98
|
+
import foldermaker
|
|
99
|
+
|
|
100
|
+
folderforge.build(
|
|
101
|
+
structure_file="structure.txt",
|
|
102
|
+
output_dir=r"D:\MY_AGENT"
|
|
103
|
+
)
|
|
104
|
+
```
|
|
105
|
+
|
|
106
|
+
### 3. Run the script
|
|
107
|
+
|
|
108
|
+
```powershell
|
|
109
|
+
python main.py
|
|
110
|
+
```
|
|
111
|
+
|
|
112
|
+
FolderMaker will create this structure:
|
|
113
|
+
|
|
114
|
+
```text
|
|
115
|
+
D:\MY_AGENT\
|
|
116
|
+
├── Modelfile
|
|
117
|
+
├── main.py
|
|
118
|
+
├── config\settings.py
|
|
119
|
+
├── core\ollama_client.py
|
|
120
|
+
├── core\agent.py
|
|
121
|
+
├── core\planner.py
|
|
122
|
+
├── core\tool_executor.py
|
|
123
|
+
├── tools\web_search.py
|
|
124
|
+
├── tools\browser.py
|
|
125
|
+
├── tools\file_manager.py
|
|
126
|
+
├── tools\code_executor.py
|
|
127
|
+
├── memory\database.py
|
|
128
|
+
├── memory\long_term_memory.py
|
|
129
|
+
├── memory\feedback.py
|
|
130
|
+
├── knowledge\document_reader.py
|
|
131
|
+
├── task_manager\queue.py
|
|
132
|
+
├── logs\
|
|
133
|
+
├── generated_tools\
|
|
134
|
+
├── workspace\
|
|
135
|
+
└── venv\
|
|
136
|
+
```
|
|
137
|
+
|
|
138
|
+
## Command-Line Usage
|
|
139
|
+
|
|
140
|
+
After installing FolderForge, you can also use it from the terminal:
|
|
141
|
+
|
|
142
|
+
```powershell
|
|
143
|
+
foldermaker structure.txt -o D:\MY_AGENT
|
|
144
|
+
```
|
|
145
|
+
|
|
146
|
+
To preview what will be created without creating anything:
|
|
147
|
+
|
|
148
|
+
```powershell
|
|
149
|
+
foldermaker structure.txt -o D:\MY_AGENT --dry-run
|
|
150
|
+
```
|
|
151
|
+
|
|
152
|
+
## Python API
|
|
153
|
+
|
|
154
|
+
### Create from a `.txt` file
|
|
155
|
+
|
|
156
|
+
```python
|
|
157
|
+
import foldermaker
|
|
158
|
+
|
|
159
|
+
folderforge.build(
|
|
160
|
+
structure_file="structure.txt",
|
|
161
|
+
output_dir=r"D:\MY_AGENT"
|
|
162
|
+
)
|
|
163
|
+
```
|
|
164
|
+
|
|
165
|
+
### Create from tree text directly
|
|
166
|
+
|
|
167
|
+
```python
|
|
168
|
+
import foldermaker
|
|
169
|
+
|
|
170
|
+
tree = """
|
|
171
|
+
D:\MY_AGENT\
|
|
172
|
+
│
|
|
173
|
+
├── main.py
|
|
174
|
+
├── config\
|
|
175
|
+
│ └── settings.py
|
|
176
|
+
├── core\
|
|
177
|
+
│ ├── agent.py
|
|
178
|
+
│ └── planner.py
|
|
179
|
+
"""
|
|
180
|
+
|
|
181
|
+
foldermaker.build_from_text(
|
|
182
|
+
tree_text=tree,
|
|
183
|
+
output_dir=r"D:\MY_AGENT"
|
|
184
|
+
)
|
|
185
|
+
```
|
|
186
|
+
|
|
187
|
+
### Preview without creating files
|
|
188
|
+
|
|
189
|
+
```python
|
|
190
|
+
import foldermaker
|
|
191
|
+
|
|
192
|
+
folderforge.build(
|
|
193
|
+
structure_file="structure.txt",
|
|
194
|
+
output_dir=r"D:\MY_AGENT",
|
|
195
|
+
dry_run=True
|
|
196
|
+
)
|
|
197
|
+
```
|
|
198
|
+
|
|
199
|
+
## Folder and File Detection
|
|
200
|
+
|
|
201
|
+
FolderForge uses these rules:
|
|
202
|
+
|
|
203
|
+
| Example | Created as | Reason |
|
|
204
|
+
|---|---|---|
|
|
205
|
+
| `config\` | Folder | Ends with `\` |
|
|
206
|
+
| `tools/` | Folder | Ends with `/` |
|
|
207
|
+
| `main.py` | File | Has a file extension |
|
|
208
|
+
| `README.md` | File | Has a file extension |
|
|
209
|
+
| `Modelfile` | File | Has no children |
|
|
210
|
+
| `logs\` | Folder | Ends with `\` |
|
|
211
|
+
| `core` | Folder | Has child files or folders |
|
|
212
|
+
|
|
213
|
+
## Supported Tree Formats
|
|
214
|
+
|
|
215
|
+
FolderForge supports common AI-generated tree formats, including:
|
|
216
|
+
|
|
217
|
+
```text
|
|
218
|
+
project/
|
|
219
|
+
├── main.py
|
|
220
|
+
├── config/
|
|
221
|
+
│ └── settings.py
|
|
222
|
+
└── core/
|
|
223
|
+
├── agent.py
|
|
224
|
+
└── planner.py
|
|
225
|
+
```
|
|
226
|
+
|
|
227
|
+
And Windows-style trees:
|
|
228
|
+
|
|
229
|
+
```text
|
|
230
|
+
D:\MY_AGENT\
|
|
231
|
+
│
|
|
232
|
+
├── main.py
|
|
233
|
+
├── config\
|
|
234
|
+
│ └── settings.py
|
|
235
|
+
└── core\
|
|
236
|
+
├── agent.py
|
|
237
|
+
└── planner.py
|
|
238
|
+
```
|
|
239
|
+
|
|
240
|
+
## Project Structure
|
|
241
|
+
|
|
242
|
+
```text
|
|
243
|
+
folderforge/
|
|
244
|
+
├── folderforge/
|
|
245
|
+
│ ├── __init__.py
|
|
246
|
+
│ ├── parser.py
|
|
247
|
+
│ └── builder.py
|
|
248
|
+
├── structure.txt
|
|
249
|
+
├── generate_project.py
|
|
250
|
+
├── README.md
|
|
251
|
+
├── LICENSE
|
|
252
|
+
└── pyproject.toml
|
|
253
|
+
```
|
|
254
|
+
|
|
255
|
+
## Safety Notes
|
|
256
|
+
|
|
257
|
+
- FolderMaker creates empty files only; it does not generate file contents.
|
|
258
|
+
- Existing files are not overwritten.
|
|
259
|
+
- Existing folders are reused safely.
|
|
260
|
+
- Use `dry_run=True` first if you are unsure where the structure will be created.
|
|
261
|
+
|
|
262
|
+
## Contributing
|
|
263
|
+
|
|
264
|
+
Contributions are welcome.
|
|
265
|
+
|
|
266
|
+
1. Fork the repository
|
|
267
|
+
2. Create a new branch
|
|
268
|
+
3. Make your changes
|
|
269
|
+
4. Add examples or tests if possible
|
|
270
|
+
5. Submit a pull request
|
|
271
|
+
|
|
272
|
+
## License
|
|
273
|
+
|
|
274
|
+
This project is released under the MIT License. See the [`LICENSE`](LICENSE) file for details.
|
|
@@ -0,0 +1,262 @@
|
|
|
1
|
+
# FolderMaker
|
|
2
|
+
|
|
3
|
+
**FolderMaker** is a free and open-source Python library that creates complete project folder and file structures from a text tree copied from AI assistant.
|
|
4
|
+
|
|
5
|
+
Instead of manually creating every folder and file, paste the AI-generated structure into a `.txt` file and run one Python command. FolderForge will create the full structure automatically.
|
|
6
|
+
|
|
7
|
+
## Features
|
|
8
|
+
|
|
9
|
+
- Creates folders and files from an AI-generated text tree
|
|
10
|
+
- Supports nested folders and files
|
|
11
|
+
- Understands tree symbols such as `│`, `├──`, and `└──`
|
|
12
|
+
- Supports Windows paths such as `D:\MY_AGENT\`
|
|
13
|
+
- Detects folders with trailing `\` or `/`
|
|
14
|
+
- Detects files such as `main.py`, `README.md`, and `Modelfile`
|
|
15
|
+
- Creates empty folders such as `logs\`, `workspace\`, and `venv\`
|
|
16
|
+
- Includes a dry-run mode to preview the result
|
|
17
|
+
- No external dependencies
|
|
18
|
+
- MIT licensed
|
|
19
|
+
|
|
20
|
+
## Installation
|
|
21
|
+
|
|
22
|
+
### Install from source
|
|
23
|
+
|
|
24
|
+
1. Download or clone this repository.
|
|
25
|
+
|
|
26
|
+
```powershell
|
|
27
|
+
git clone [https://github.com/your-username/foldermaker.git]
|
|
28
|
+
cd foldermaker
|
|
29
|
+
```
|
|
30
|
+
|
|
31
|
+
2. Install the library:
|
|
32
|
+
|
|
33
|
+
```powershell
|
|
34
|
+
pip install foldermaker.
|
|
35
|
+
```
|
|
36
|
+
### 1. Create a structure file
|
|
37
|
+
|
|
38
|
+
Create a file named `structure.txt`.
|
|
39
|
+
|
|
40
|
+
Paste your AI-generated folder tree into it exactly as shown by the AI assistant.
|
|
41
|
+
|
|
42
|
+
Example:
|
|
43
|
+
|
|
44
|
+
```text
|
|
45
|
+
D:\MY_AGENT\
|
|
46
|
+
│
|
|
47
|
+
├── Modelfile
|
|
48
|
+
├── main.py
|
|
49
|
+
├── config\
|
|
50
|
+
│ └── settings.py
|
|
51
|
+
│
|
|
52
|
+
├── core\
|
|
53
|
+
│ ├── ollama_client.py
|
|
54
|
+
│ ├── agent.py
|
|
55
|
+
│ ├── planner.py
|
|
56
|
+
│ └── tool_executor.py
|
|
57
|
+
│
|
|
58
|
+
├── tools\
|
|
59
|
+
│ ├── web_search.py
|
|
60
|
+
│ ├── browser.py
|
|
61
|
+
│ ├── file_manager.py
|
|
62
|
+
│ └── code_executor.py
|
|
63
|
+
│
|
|
64
|
+
├── memory\
|
|
65
|
+
│ ├── database.py
|
|
66
|
+
│ ├── long_term_memory.py
|
|
67
|
+
│ └── feedback.py
|
|
68
|
+
│
|
|
69
|
+
├── knowledge\
|
|
70
|
+
│ └── document_reader.py
|
|
71
|
+
│
|
|
72
|
+
├── task_manager\
|
|
73
|
+
│ └── queue.py
|
|
74
|
+
│
|
|
75
|
+
├── logs\
|
|
76
|
+
├── generated_tools\
|
|
77
|
+
├── workspace\
|
|
78
|
+
└── venv\
|
|
79
|
+
```
|
|
80
|
+
|
|
81
|
+
### 2. Create a Python runner file
|
|
82
|
+
|
|
83
|
+
Create a file named `main.py`:
|
|
84
|
+
|
|
85
|
+
```python
|
|
86
|
+
import foldermaker
|
|
87
|
+
|
|
88
|
+
folderforge.build(
|
|
89
|
+
structure_file="structure.txt",
|
|
90
|
+
output_dir=r"D:\MY_AGENT"
|
|
91
|
+
)
|
|
92
|
+
```
|
|
93
|
+
|
|
94
|
+
### 3. Run the script
|
|
95
|
+
|
|
96
|
+
```powershell
|
|
97
|
+
python main.py
|
|
98
|
+
```
|
|
99
|
+
|
|
100
|
+
FolderMaker will create this structure:
|
|
101
|
+
|
|
102
|
+
```text
|
|
103
|
+
D:\MY_AGENT\
|
|
104
|
+
├── Modelfile
|
|
105
|
+
├── main.py
|
|
106
|
+
├── config\settings.py
|
|
107
|
+
├── core\ollama_client.py
|
|
108
|
+
├── core\agent.py
|
|
109
|
+
├── core\planner.py
|
|
110
|
+
├── core\tool_executor.py
|
|
111
|
+
├── tools\web_search.py
|
|
112
|
+
├── tools\browser.py
|
|
113
|
+
├── tools\file_manager.py
|
|
114
|
+
├── tools\code_executor.py
|
|
115
|
+
├── memory\database.py
|
|
116
|
+
├── memory\long_term_memory.py
|
|
117
|
+
├── memory\feedback.py
|
|
118
|
+
├── knowledge\document_reader.py
|
|
119
|
+
├── task_manager\queue.py
|
|
120
|
+
├── logs\
|
|
121
|
+
├── generated_tools\
|
|
122
|
+
├── workspace\
|
|
123
|
+
└── venv\
|
|
124
|
+
```
|
|
125
|
+
|
|
126
|
+
## Command-Line Usage
|
|
127
|
+
|
|
128
|
+
After installing FolderForge, you can also use it from the terminal:
|
|
129
|
+
|
|
130
|
+
```powershell
|
|
131
|
+
foldermaker structure.txt -o D:\MY_AGENT
|
|
132
|
+
```
|
|
133
|
+
|
|
134
|
+
To preview what will be created without creating anything:
|
|
135
|
+
|
|
136
|
+
```powershell
|
|
137
|
+
foldermaker structure.txt -o D:\MY_AGENT --dry-run
|
|
138
|
+
```
|
|
139
|
+
|
|
140
|
+
## Python API
|
|
141
|
+
|
|
142
|
+
### Create from a `.txt` file
|
|
143
|
+
|
|
144
|
+
```python
|
|
145
|
+
import foldermaker
|
|
146
|
+
|
|
147
|
+
folderforge.build(
|
|
148
|
+
structure_file="structure.txt",
|
|
149
|
+
output_dir=r"D:\MY_AGENT"
|
|
150
|
+
)
|
|
151
|
+
```
|
|
152
|
+
|
|
153
|
+
### Create from tree text directly
|
|
154
|
+
|
|
155
|
+
```python
|
|
156
|
+
import foldermaker
|
|
157
|
+
|
|
158
|
+
tree = """
|
|
159
|
+
D:\MY_AGENT\
|
|
160
|
+
│
|
|
161
|
+
├── main.py
|
|
162
|
+
├── config\
|
|
163
|
+
│ └── settings.py
|
|
164
|
+
├── core\
|
|
165
|
+
│ ├── agent.py
|
|
166
|
+
│ └── planner.py
|
|
167
|
+
"""
|
|
168
|
+
|
|
169
|
+
foldermaker.build_from_text(
|
|
170
|
+
tree_text=tree,
|
|
171
|
+
output_dir=r"D:\MY_AGENT"
|
|
172
|
+
)
|
|
173
|
+
```
|
|
174
|
+
|
|
175
|
+
### Preview without creating files
|
|
176
|
+
|
|
177
|
+
```python
|
|
178
|
+
import foldermaker
|
|
179
|
+
|
|
180
|
+
folderforge.build(
|
|
181
|
+
structure_file="structure.txt",
|
|
182
|
+
output_dir=r"D:\MY_AGENT",
|
|
183
|
+
dry_run=True
|
|
184
|
+
)
|
|
185
|
+
```
|
|
186
|
+
|
|
187
|
+
## Folder and File Detection
|
|
188
|
+
|
|
189
|
+
FolderForge uses these rules:
|
|
190
|
+
|
|
191
|
+
| Example | Created as | Reason |
|
|
192
|
+
|---|---|---|
|
|
193
|
+
| `config\` | Folder | Ends with `\` |
|
|
194
|
+
| `tools/` | Folder | Ends with `/` |
|
|
195
|
+
| `main.py` | File | Has a file extension |
|
|
196
|
+
| `README.md` | File | Has a file extension |
|
|
197
|
+
| `Modelfile` | File | Has no children |
|
|
198
|
+
| `logs\` | Folder | Ends with `\` |
|
|
199
|
+
| `core` | Folder | Has child files or folders |
|
|
200
|
+
|
|
201
|
+
## Supported Tree Formats
|
|
202
|
+
|
|
203
|
+
FolderForge supports common AI-generated tree formats, including:
|
|
204
|
+
|
|
205
|
+
```text
|
|
206
|
+
project/
|
|
207
|
+
├── main.py
|
|
208
|
+
├── config/
|
|
209
|
+
│ └── settings.py
|
|
210
|
+
└── core/
|
|
211
|
+
├── agent.py
|
|
212
|
+
└── planner.py
|
|
213
|
+
```
|
|
214
|
+
|
|
215
|
+
And Windows-style trees:
|
|
216
|
+
|
|
217
|
+
```text
|
|
218
|
+
D:\MY_AGENT\
|
|
219
|
+
│
|
|
220
|
+
├── main.py
|
|
221
|
+
├── config\
|
|
222
|
+
│ └── settings.py
|
|
223
|
+
└── core\
|
|
224
|
+
├── agent.py
|
|
225
|
+
└── planner.py
|
|
226
|
+
```
|
|
227
|
+
|
|
228
|
+
## Project Structure
|
|
229
|
+
|
|
230
|
+
```text
|
|
231
|
+
folderforge/
|
|
232
|
+
├── folderforge/
|
|
233
|
+
│ ├── __init__.py
|
|
234
|
+
│ ├── parser.py
|
|
235
|
+
│ └── builder.py
|
|
236
|
+
├── structure.txt
|
|
237
|
+
├── generate_project.py
|
|
238
|
+
├── README.md
|
|
239
|
+
├── LICENSE
|
|
240
|
+
└── pyproject.toml
|
|
241
|
+
```
|
|
242
|
+
|
|
243
|
+
## Safety Notes
|
|
244
|
+
|
|
245
|
+
- FolderMaker creates empty files only; it does not generate file contents.
|
|
246
|
+
- Existing files are not overwritten.
|
|
247
|
+
- Existing folders are reused safely.
|
|
248
|
+
- Use `dry_run=True` first if you are unsure where the structure will be created.
|
|
249
|
+
|
|
250
|
+
## Contributing
|
|
251
|
+
|
|
252
|
+
Contributions are welcome.
|
|
253
|
+
|
|
254
|
+
1. Fork the repository
|
|
255
|
+
2. Create a new branch
|
|
256
|
+
3. Make your changes
|
|
257
|
+
4. Add examples or tests if possible
|
|
258
|
+
5. Submit a pull request
|
|
259
|
+
|
|
260
|
+
## License
|
|
261
|
+
|
|
262
|
+
This project is released under the MIT License. See the [`LICENSE`](LICENSE) file for details.
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
"""
|
|
2
|
+
folderforge
|
|
3
|
+
|
|
4
|
+
Create folders and files automatically from an AI-generated
|
|
5
|
+
text folder-tree structure.
|
|
6
|
+
|
|
7
|
+
Example:
|
|
8
|
+
import folderforge
|
|
9
|
+
folderforge.build("structure.txt")
|
|
10
|
+
|
|
11
|
+
"""
|
|
12
|
+
|
|
13
|
+
from .builder import build, build_from_text
|
|
14
|
+
|
|
15
|
+
__version__ = "1.0.0"
|
|
16
|
+
__all__ = ["build", "build_from_text"]
|
|
@@ -0,0 +1,122 @@
|
|
|
1
|
+
from pathlib import Path
|
|
2
|
+
|
|
3
|
+
from .parser import parse_tree
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
def build_from_text(
|
|
7
|
+
tree_text: str,
|
|
8
|
+
output_dir: str | Path = ".",
|
|
9
|
+
dry_run: bool = False,
|
|
10
|
+
) -> list[str]:
|
|
11
|
+
output_path = Path(output_dir).expanduser().resolve()
|
|
12
|
+
nodes = parse_tree(tree_text)
|
|
13
|
+
|
|
14
|
+
created: list[str] = []
|
|
15
|
+
node_map = {node.name: node for node in nodes}
|
|
16
|
+
|
|
17
|
+
for node in nodes:
|
|
18
|
+
relative_path = _get_relative_path(node, node_map)
|
|
19
|
+
target = output_path / relative_path
|
|
20
|
+
|
|
21
|
+
if node.is_folder:
|
|
22
|
+
_create_folder(target, dry_run, created)
|
|
23
|
+
else:
|
|
24
|
+
_create_file(target, dry_run, created)
|
|
25
|
+
|
|
26
|
+
return created
|
|
27
|
+
|
|
28
|
+
|
|
29
|
+
def build(
|
|
30
|
+
structure_file: str | Path,
|
|
31
|
+
output_dir: str | Path = ".",
|
|
32
|
+
dry_run: bool = False,
|
|
33
|
+
) -> list[str]:
|
|
34
|
+
"""
|
|
35
|
+
Reads a .txt file containing a folder tree and creates it.
|
|
36
|
+
|
|
37
|
+
Example:
|
|
38
|
+
import folderforge
|
|
39
|
+
folderforge.build("structure.txt", output_dir="D:/MY_AGENT")
|
|
40
|
+
"""
|
|
41
|
+
structure_path = Path(structure_file).expanduser().resolve()
|
|
42
|
+
|
|
43
|
+
if not structure_path.exists():
|
|
44
|
+
raise FileNotFoundError(f"Structure file not found: {structure_path}")
|
|
45
|
+
|
|
46
|
+
tree_text = structure_path.read_text(encoding="utf-8")
|
|
47
|
+
return build_from_text(tree_text, output_dir=output_dir, dry_run=dry_run)
|
|
48
|
+
|
|
49
|
+
|
|
50
|
+
def _get_relative_path(node, node_map) -> Path:
|
|
51
|
+
"""
|
|
52
|
+
Builds the full relative path, such as:
|
|
53
|
+
core/ollama_client.py
|
|
54
|
+
"""
|
|
55
|
+
parts = [node.name]
|
|
56
|
+
current = node
|
|
57
|
+
|
|
58
|
+
while current.parent:
|
|
59
|
+
parent = node_map.get(current.parent)
|
|
60
|
+
|
|
61
|
+
if parent is None:
|
|
62
|
+
break
|
|
63
|
+
|
|
64
|
+
parts.append(parent.name)
|
|
65
|
+
current = parent
|
|
66
|
+
|
|
67
|
+
return Path(*reversed(parts))
|
|
68
|
+
|
|
69
|
+
|
|
70
|
+
def _create_folder(path: Path, dry_run: bool, created: list[str]) -> None:
|
|
71
|
+
if dry_run:
|
|
72
|
+
print(f"[DRY RUN] Would create folder: {path}")
|
|
73
|
+
created.append(str(path))
|
|
74
|
+
return
|
|
75
|
+
|
|
76
|
+
path.mkdir(parents=True, exist_ok=True)
|
|
77
|
+
print(f"Created folder: {path}")
|
|
78
|
+
created.append(str(path))
|
|
79
|
+
|
|
80
|
+
|
|
81
|
+
def _create_file(path: Path, dry_run: bool, created: list[str]) -> None:
|
|
82
|
+
if dry_run:
|
|
83
|
+
print(f"[DRY RUN] Would create file: {path}")
|
|
84
|
+
created.append(str(path))
|
|
85
|
+
return
|
|
86
|
+
|
|
87
|
+
path.parent.mkdir(parents=True, exist_ok=True)
|
|
88
|
+
|
|
89
|
+
if not path.exists():
|
|
90
|
+
path.touch()
|
|
91
|
+
print(f"Created file: {path}")
|
|
92
|
+
else:
|
|
93
|
+
print(f"File already exists: {path}")
|
|
94
|
+
|
|
95
|
+
created.append(str(path))
|
|
96
|
+
|
|
97
|
+
|
|
98
|
+
def cli():
|
|
99
|
+
import argparse
|
|
100
|
+
|
|
101
|
+
parser = argparse.ArgumentParser(
|
|
102
|
+
description="Create folders and files from a text folder-tree structure."
|
|
103
|
+
)
|
|
104
|
+
parser.add_argument("structure_file", help="Path to the .txt tree file")
|
|
105
|
+
parser.add_argument(
|
|
106
|
+
"-o", "--output",
|
|
107
|
+
default=".",
|
|
108
|
+
help="Output directory where the structure will be created"
|
|
109
|
+
)
|
|
110
|
+
parser.add_argument(
|
|
111
|
+
"--dry-run",
|
|
112
|
+
action="store_true",
|
|
113
|
+
help="Show what would be created without creating anything"
|
|
114
|
+
)
|
|
115
|
+
|
|
116
|
+
args = parser.parse_args()
|
|
117
|
+
|
|
118
|
+
build(
|
|
119
|
+
structure_file=args.structure_file,
|
|
120
|
+
output_dir=args.output,
|
|
121
|
+
dry_run=args.dry_run,
|
|
122
|
+
)
|
|
@@ -0,0 +1,117 @@
|
|
|
1
|
+
import re
|
|
2
|
+
from dataclasses import dataclass, field
|
|
3
|
+
from pathlib import PureWindowsPath, PurePosixPath
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
TREE_NAME_PATTERN = re.compile(r"(?:├──|└──|--)\s*(.+)$")
|
|
7
|
+
CLEAN_NAME_PATTERN = re.compile(r"[\u2500-\u257F│├└─]")
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
@dataclass
|
|
11
|
+
class Node:
|
|
12
|
+
name: str
|
|
13
|
+
depth: int
|
|
14
|
+
parent: str | None = None
|
|
15
|
+
is_folder: bool = False
|
|
16
|
+
children: list["Node"] = field(default_factory=list)
|
|
17
|
+
|
|
18
|
+
|
|
19
|
+
def _get_indent_depth(prefix: str) -> int:
|
|
20
|
+
"""
|
|
21
|
+
Calculates nesting depth from the space before a file/folder name.
|
|
22
|
+
|
|
23
|
+
Examples:
|
|
24
|
+
"│ " -> depth 1
|
|
25
|
+
"│ ├── " -> depth 1
|
|
26
|
+
"│ │ " -> depth 2
|
|
27
|
+
"""
|
|
28
|
+
cleaned = CLEAN_NAME_PATTERN.sub(" ", prefix)
|
|
29
|
+
cleaned = cleaned.replace("\t", " ")
|
|
30
|
+
|
|
31
|
+
leading_spaces = len(cleaned) - len(cleaned.lstrip(" "))
|
|
32
|
+
return leading_spaces // 4
|
|
33
|
+
|
|
34
|
+
|
|
35
|
+
def _extract_name(line: str) -> tuple[str, int]:
|
|
36
|
+
"""
|
|
37
|
+
Returns (name, depth) from one tree line.
|
|
38
|
+
"""
|
|
39
|
+
match = TREE_NAME_PATTERN.search(line)
|
|
40
|
+
|
|
41
|
+
if match:
|
|
42
|
+
name = match.group(1).strip()
|
|
43
|
+
prefix = line[: match.start()]
|
|
44
|
+
else:
|
|
45
|
+
name = line.strip()
|
|
46
|
+
prefix = ""
|
|
47
|
+
|
|
48
|
+
if not name:
|
|
49
|
+
raise ValueError(f"Could not find a folder or file name in line: {line!r}")
|
|
50
|
+
|
|
51
|
+
depth = _get_indent_depth(prefix)
|
|
52
|
+
return name, depth
|
|
53
|
+
|
|
54
|
+
|
|
55
|
+
def _is_folder(name: str, has_children: bool) -> bool:
|
|
56
|
+
"""
|
|
57
|
+
Folder detection rules:
|
|
58
|
+
|
|
59
|
+
1. `config\\` or `config/` is always a folder.
|
|
60
|
+
2. `script.py`, `README.md`, `image.png` are files.
|
|
61
|
+
3. Names without an extension are folders if they have children.
|
|
62
|
+
This correctly treats `Modelfile` as a file and `logs\\` as a folder.
|
|
63
|
+
"""
|
|
64
|
+
if name.endswith("\\") or name.endswith("/"):
|
|
65
|
+
return True
|
|
66
|
+
|
|
67
|
+
if "." in PureWindowsPath(name).name or "." in PurePosixPath(name).name:
|
|
68
|
+
return False
|
|
69
|
+
|
|
70
|
+
return has_children
|
|
71
|
+
|
|
72
|
+
|
|
73
|
+
def parse_tree(text: str) -> list[Node]:
|
|
74
|
+
"""
|
|
75
|
+
Converts tree text into a list of nested Node objects.
|
|
76
|
+
"""
|
|
77
|
+
lines = [line.rstrip() for line in text.splitlines()]
|
|
78
|
+
lines = [line for line in lines if line.strip()]
|
|
79
|
+
|
|
80
|
+
if not lines:
|
|
81
|
+
raise ValueError("The structure file is empty.")
|
|
82
|
+
|
|
83
|
+
nodes: list[Node] = []
|
|
84
|
+
stack: list[Node] = []
|
|
85
|
+
|
|
86
|
+
for line in lines:
|
|
87
|
+
name, depth = _extract_name(line)
|
|
88
|
+
|
|
89
|
+
|
|
90
|
+
clean_name = name.rstrip("\\/").strip()
|
|
91
|
+
|
|
92
|
+
if not clean_name:
|
|
93
|
+
continue
|
|
94
|
+
|
|
95
|
+
node = Node(
|
|
96
|
+
name=clean_name,
|
|
97
|
+
depth=depth,
|
|
98
|
+
)
|
|
99
|
+
|
|
100
|
+
|
|
101
|
+
while stack and stack[-1].depth >= depth:
|
|
102
|
+
stack.pop()
|
|
103
|
+
|
|
104
|
+
if stack:
|
|
105
|
+
node.parent = stack[-1].name
|
|
106
|
+
stack[-1].children.append(node)
|
|
107
|
+
else:
|
|
108
|
+
|
|
109
|
+
node.parent = None
|
|
110
|
+
|
|
111
|
+
stack.append(node)
|
|
112
|
+
nodes.append(node)
|
|
113
|
+
|
|
114
|
+
for node in nodes:
|
|
115
|
+
node.is_folder = _is_folder(node.name, bool(node.children))
|
|
116
|
+
|
|
117
|
+
return nodes
|
|
@@ -0,0 +1,274 @@
|
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
|
+
Name: foldermaker
|
|
3
|
+
Version: 1.0.0
|
|
4
|
+
Summary: Create folders and files automatically from AI-generated text folder trees.
|
|
5
|
+
Author: Aniruddha Singh
|
|
6
|
+
License: MIT
|
|
7
|
+
Keywords: folder,tree,scaffold,project-generator,ai
|
|
8
|
+
Requires-Python: >=3.9
|
|
9
|
+
Description-Content-Type: text/markdown
|
|
10
|
+
License-File: LICENSE
|
|
11
|
+
Dynamic: license-file
|
|
12
|
+
|
|
13
|
+
# FolderMaker
|
|
14
|
+
|
|
15
|
+
**FolderMaker** is a free and open-source Python library that creates complete project folder and file structures from a text tree copied from AI assistant.
|
|
16
|
+
|
|
17
|
+
Instead of manually creating every folder and file, paste the AI-generated structure into a `.txt` file and run one Python command. FolderForge will create the full structure automatically.
|
|
18
|
+
|
|
19
|
+
## Features
|
|
20
|
+
|
|
21
|
+
- Creates folders and files from an AI-generated text tree
|
|
22
|
+
- Supports nested folders and files
|
|
23
|
+
- Understands tree symbols such as `│`, `├──`, and `└──`
|
|
24
|
+
- Supports Windows paths such as `D:\MY_AGENT\`
|
|
25
|
+
- Detects folders with trailing `\` or `/`
|
|
26
|
+
- Detects files such as `main.py`, `README.md`, and `Modelfile`
|
|
27
|
+
- Creates empty folders such as `logs\`, `workspace\`, and `venv\`
|
|
28
|
+
- Includes a dry-run mode to preview the result
|
|
29
|
+
- No external dependencies
|
|
30
|
+
- MIT licensed
|
|
31
|
+
|
|
32
|
+
## Installation
|
|
33
|
+
|
|
34
|
+
### Install from source
|
|
35
|
+
|
|
36
|
+
1. Download or clone this repository.
|
|
37
|
+
|
|
38
|
+
```powershell
|
|
39
|
+
git clone [https://github.com/your-username/foldermaker.git]
|
|
40
|
+
cd foldermaker
|
|
41
|
+
```
|
|
42
|
+
|
|
43
|
+
2. Install the library:
|
|
44
|
+
|
|
45
|
+
```powershell
|
|
46
|
+
pip install foldermaker.
|
|
47
|
+
```
|
|
48
|
+
### 1. Create a structure file
|
|
49
|
+
|
|
50
|
+
Create a file named `structure.txt`.
|
|
51
|
+
|
|
52
|
+
Paste your AI-generated folder tree into it exactly as shown by the AI assistant.
|
|
53
|
+
|
|
54
|
+
Example:
|
|
55
|
+
|
|
56
|
+
```text
|
|
57
|
+
D:\MY_AGENT\
|
|
58
|
+
│
|
|
59
|
+
├── Modelfile
|
|
60
|
+
├── main.py
|
|
61
|
+
├── config\
|
|
62
|
+
│ └── settings.py
|
|
63
|
+
│
|
|
64
|
+
├── core\
|
|
65
|
+
│ ├── ollama_client.py
|
|
66
|
+
│ ├── agent.py
|
|
67
|
+
│ ├── planner.py
|
|
68
|
+
│ └── tool_executor.py
|
|
69
|
+
│
|
|
70
|
+
├── tools\
|
|
71
|
+
│ ├── web_search.py
|
|
72
|
+
│ ├── browser.py
|
|
73
|
+
│ ├── file_manager.py
|
|
74
|
+
│ └── code_executor.py
|
|
75
|
+
│
|
|
76
|
+
├── memory\
|
|
77
|
+
│ ├── database.py
|
|
78
|
+
│ ├── long_term_memory.py
|
|
79
|
+
│ └── feedback.py
|
|
80
|
+
│
|
|
81
|
+
├── knowledge\
|
|
82
|
+
│ └── document_reader.py
|
|
83
|
+
│
|
|
84
|
+
├── task_manager\
|
|
85
|
+
│ └── queue.py
|
|
86
|
+
│
|
|
87
|
+
├── logs\
|
|
88
|
+
├── generated_tools\
|
|
89
|
+
├── workspace\
|
|
90
|
+
└── venv\
|
|
91
|
+
```
|
|
92
|
+
|
|
93
|
+
### 2. Create a Python runner file
|
|
94
|
+
|
|
95
|
+
Create a file named `main.py`:
|
|
96
|
+
|
|
97
|
+
```python
|
|
98
|
+
import foldermaker
|
|
99
|
+
|
|
100
|
+
folderforge.build(
|
|
101
|
+
structure_file="structure.txt",
|
|
102
|
+
output_dir=r"D:\MY_AGENT"
|
|
103
|
+
)
|
|
104
|
+
```
|
|
105
|
+
|
|
106
|
+
### 3. Run the script
|
|
107
|
+
|
|
108
|
+
```powershell
|
|
109
|
+
python main.py
|
|
110
|
+
```
|
|
111
|
+
|
|
112
|
+
FolderMaker will create this structure:
|
|
113
|
+
|
|
114
|
+
```text
|
|
115
|
+
D:\MY_AGENT\
|
|
116
|
+
├── Modelfile
|
|
117
|
+
├── main.py
|
|
118
|
+
├── config\settings.py
|
|
119
|
+
├── core\ollama_client.py
|
|
120
|
+
├── core\agent.py
|
|
121
|
+
├── core\planner.py
|
|
122
|
+
├── core\tool_executor.py
|
|
123
|
+
├── tools\web_search.py
|
|
124
|
+
├── tools\browser.py
|
|
125
|
+
├── tools\file_manager.py
|
|
126
|
+
├── tools\code_executor.py
|
|
127
|
+
├── memory\database.py
|
|
128
|
+
├── memory\long_term_memory.py
|
|
129
|
+
├── memory\feedback.py
|
|
130
|
+
├── knowledge\document_reader.py
|
|
131
|
+
├── task_manager\queue.py
|
|
132
|
+
├── logs\
|
|
133
|
+
├── generated_tools\
|
|
134
|
+
├── workspace\
|
|
135
|
+
└── venv\
|
|
136
|
+
```
|
|
137
|
+
|
|
138
|
+
## Command-Line Usage
|
|
139
|
+
|
|
140
|
+
After installing FolderForge, you can also use it from the terminal:
|
|
141
|
+
|
|
142
|
+
```powershell
|
|
143
|
+
foldermaker structure.txt -o D:\MY_AGENT
|
|
144
|
+
```
|
|
145
|
+
|
|
146
|
+
To preview what will be created without creating anything:
|
|
147
|
+
|
|
148
|
+
```powershell
|
|
149
|
+
foldermaker structure.txt -o D:\MY_AGENT --dry-run
|
|
150
|
+
```
|
|
151
|
+
|
|
152
|
+
## Python API
|
|
153
|
+
|
|
154
|
+
### Create from a `.txt` file
|
|
155
|
+
|
|
156
|
+
```python
|
|
157
|
+
import foldermaker
|
|
158
|
+
|
|
159
|
+
folderforge.build(
|
|
160
|
+
structure_file="structure.txt",
|
|
161
|
+
output_dir=r"D:\MY_AGENT"
|
|
162
|
+
)
|
|
163
|
+
```
|
|
164
|
+
|
|
165
|
+
### Create from tree text directly
|
|
166
|
+
|
|
167
|
+
```python
|
|
168
|
+
import foldermaker
|
|
169
|
+
|
|
170
|
+
tree = """
|
|
171
|
+
D:\MY_AGENT\
|
|
172
|
+
│
|
|
173
|
+
├── main.py
|
|
174
|
+
├── config\
|
|
175
|
+
│ └── settings.py
|
|
176
|
+
├── core\
|
|
177
|
+
│ ├── agent.py
|
|
178
|
+
│ └── planner.py
|
|
179
|
+
"""
|
|
180
|
+
|
|
181
|
+
foldermaker.build_from_text(
|
|
182
|
+
tree_text=tree,
|
|
183
|
+
output_dir=r"D:\MY_AGENT"
|
|
184
|
+
)
|
|
185
|
+
```
|
|
186
|
+
|
|
187
|
+
### Preview without creating files
|
|
188
|
+
|
|
189
|
+
```python
|
|
190
|
+
import foldermaker
|
|
191
|
+
|
|
192
|
+
folderforge.build(
|
|
193
|
+
structure_file="structure.txt",
|
|
194
|
+
output_dir=r"D:\MY_AGENT",
|
|
195
|
+
dry_run=True
|
|
196
|
+
)
|
|
197
|
+
```
|
|
198
|
+
|
|
199
|
+
## Folder and File Detection
|
|
200
|
+
|
|
201
|
+
FolderForge uses these rules:
|
|
202
|
+
|
|
203
|
+
| Example | Created as | Reason |
|
|
204
|
+
|---|---|---|
|
|
205
|
+
| `config\` | Folder | Ends with `\` |
|
|
206
|
+
| `tools/` | Folder | Ends with `/` |
|
|
207
|
+
| `main.py` | File | Has a file extension |
|
|
208
|
+
| `README.md` | File | Has a file extension |
|
|
209
|
+
| `Modelfile` | File | Has no children |
|
|
210
|
+
| `logs\` | Folder | Ends with `\` |
|
|
211
|
+
| `core` | Folder | Has child files or folders |
|
|
212
|
+
|
|
213
|
+
## Supported Tree Formats
|
|
214
|
+
|
|
215
|
+
FolderForge supports common AI-generated tree formats, including:
|
|
216
|
+
|
|
217
|
+
```text
|
|
218
|
+
project/
|
|
219
|
+
├── main.py
|
|
220
|
+
├── config/
|
|
221
|
+
│ └── settings.py
|
|
222
|
+
└── core/
|
|
223
|
+
├── agent.py
|
|
224
|
+
└── planner.py
|
|
225
|
+
```
|
|
226
|
+
|
|
227
|
+
And Windows-style trees:
|
|
228
|
+
|
|
229
|
+
```text
|
|
230
|
+
D:\MY_AGENT\
|
|
231
|
+
│
|
|
232
|
+
├── main.py
|
|
233
|
+
├── config\
|
|
234
|
+
│ └── settings.py
|
|
235
|
+
└── core\
|
|
236
|
+
├── agent.py
|
|
237
|
+
└── planner.py
|
|
238
|
+
```
|
|
239
|
+
|
|
240
|
+
## Project Structure
|
|
241
|
+
|
|
242
|
+
```text
|
|
243
|
+
folderforge/
|
|
244
|
+
├── folderforge/
|
|
245
|
+
│ ├── __init__.py
|
|
246
|
+
│ ├── parser.py
|
|
247
|
+
│ └── builder.py
|
|
248
|
+
├── structure.txt
|
|
249
|
+
├── generate_project.py
|
|
250
|
+
├── README.md
|
|
251
|
+
├── LICENSE
|
|
252
|
+
└── pyproject.toml
|
|
253
|
+
```
|
|
254
|
+
|
|
255
|
+
## Safety Notes
|
|
256
|
+
|
|
257
|
+
- FolderMaker creates empty files only; it does not generate file contents.
|
|
258
|
+
- Existing files are not overwritten.
|
|
259
|
+
- Existing folders are reused safely.
|
|
260
|
+
- Use `dry_run=True` first if you are unsure where the structure will be created.
|
|
261
|
+
|
|
262
|
+
## Contributing
|
|
263
|
+
|
|
264
|
+
Contributions are welcome.
|
|
265
|
+
|
|
266
|
+
1. Fork the repository
|
|
267
|
+
2. Create a new branch
|
|
268
|
+
3. Make your changes
|
|
269
|
+
4. Add examples or tests if possible
|
|
270
|
+
5. Submit a pull request
|
|
271
|
+
|
|
272
|
+
## License
|
|
273
|
+
|
|
274
|
+
This project is released under the MIT License. See the [`LICENSE`](LICENSE) file for details.
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
LICENSE
|
|
2
|
+
README.md
|
|
3
|
+
pyproject.toml
|
|
4
|
+
foldermaker/__init__.py
|
|
5
|
+
foldermaker/builder.py
|
|
6
|
+
foldermaker/parser.py
|
|
7
|
+
foldermaker.egg-info/PKG-INFO
|
|
8
|
+
foldermaker.egg-info/SOURCES.txt
|
|
9
|
+
foldermaker.egg-info/dependency_links.txt
|
|
10
|
+
foldermaker.egg-info/entry_points.txt
|
|
11
|
+
foldermaker.egg-info/top_level.txt
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
foldermaker
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
[build-system]
|
|
2
|
+
requires = ["setuptools>=68"]
|
|
3
|
+
build-backend = "setuptools.build_meta"
|
|
4
|
+
|
|
5
|
+
[project]
|
|
6
|
+
name = "foldermaker"
|
|
7
|
+
version = "1.0.0"
|
|
8
|
+
description = "Create folders and files automatically from AI-generated text folder trees."
|
|
9
|
+
readme = "README.md"
|
|
10
|
+
license = { text = "MIT" }
|
|
11
|
+
authors = [
|
|
12
|
+
{ name = "Aniruddha Singh" }
|
|
13
|
+
]
|
|
14
|
+
requires-python = ">=3.9"
|
|
15
|
+
keywords = ["folder", "tree", "scaffold", "project-generator", "ai"]
|
|
16
|
+
|
|
17
|
+
[project.scripts]
|
|
18
|
+
folderforge = "foldermaker.builder:cli"
|
|
19
|
+
|
|
20
|
+
[tool.setuptools.packages.find]
|
|
21
|
+
include = ["foldermaker*"]
|