├── .gitignore ├── README.md ├── docs ├── android-chrome-192x192.png ├── android-chrome-512x512.png ├── apple-touch-icon.png ├── docs │ ├── README.md │ ├── android-chrome-192x192.png │ ├── android-chrome-512x512.png │ ├── apple-touch-icon.png │ ├── favicon-16x16.png │ ├── favicon-32x32.png │ ├── favicon.ico │ ├── gepeto.jpg │ ├── index.html │ ├── prism.css │ ├── prism2.css │ └── style.css ├── favicon-16x16.png ├── favicon-32x32.png ├── favicon.ico ├── gepeto.jpg └── index.html ├── index.js ├── package-lock.json ├── package.json └── templates ├── 1 ├── icon.png ├── install.js ├── link.js ├── pinokio.js ├── reset.js ├── start.js ├── torch.js └── update.js └── 2 ├── app.py ├── icon.png ├── install.js ├── link.js ├── pinokio.js ├── requirements.txt ├── reset.js ├── start.js ├── torch.js └── update.js /.gitignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # gepeto 2 | 3 | ## How to use 4 | 5 | ``` 6 | npx gepeto@latest 7 | ``` 8 | 9 | Docs: https://gepeto.pinokio.computer 10 | -------------------------------------------------------------------------------- /docs/android-chrome-192x192.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pinokiocomputer/gepeto/f8342439eda1a1fc131236c886ae6f6063871ae4/docs/android-chrome-192x192.png -------------------------------------------------------------------------------- /docs/android-chrome-512x512.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pinokiocomputer/gepeto/f8342439eda1a1fc131236c886ae6f6063871ae4/docs/android-chrome-512x512.png -------------------------------------------------------------------------------- /docs/apple-touch-icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pinokiocomputer/gepeto/f8342439eda1a1fc131236c886ae6f6063871ae4/docs/apple-touch-icon.png -------------------------------------------------------------------------------- /docs/docs/README.md: -------------------------------------------------------------------------------- 1 | # gepeto 2 | 3 | Generate 1-Click AI Launchers, Instantly. 4 | 5 | --- 6 | 7 | ![gepeto.jpg](gepeto.jpg) 8 | 9 | --- 10 | 11 | # community 12 | 13 | Gepeto is new and evolving, so please join the community to stay on top and ask questions: 14 | 15 | 1. Discord: https://discord.gg/TQdNwadtE4 16 | 2. X (Twitter): https://x.com/cocktailpeanut 17 | 18 | --- 19 | 20 | # usage 21 | 22 | #### 1. Get Pinokio 23 | 24 | Gepeto generates Pinokio scripts, so you will need Pinokio to test them. 25 | 26 | Download Pinokio here: https://program.pinokio.computer/#/?id=install 27 | 28 | #### 2. Run 29 | 30 | To make sure the generated scripts show up on your Pinokio app, first go to your `/PINOKIO_HOME/api` folder. Then run: 31 | 32 | ``` 33 | npx gepeto@latest 34 | ``` 35 | 36 | This will ask some questions and create a new project folder for you under the `/PINOKIO_HOME/api` folder. 37 | 38 | > Learn more about Pinokio File System here: https://program.pinokio.computer/#/?id=home-directory 39 | 40 | --- 41 | 42 | # how does it work? 43 | 44 | Gepeto is a script that generates [Pinokio scripts](https://program.pinokio.computer) automatically. 45 | 46 | By default it assumes that there's: 47 | 48 | 1. A `requirements.txt` file for installation 49 | 2. An `app.py` file for running the app 50 | 51 | It's the same convention used by [huggingface spaces](https://huggingface.co/spaces), which means any huggingface space app can be easily ported (with some code modifications to localize) 52 | 53 | --- 54 | 55 | # customizable 56 | 57 | By default Gepeto generates some scripts that follow the convention, but you can very easily modify the generated scripts yourself since they are very short. 58 | 59 | > To learn how to customize the scripts, check out the Pinokio Programming Manual: https://program.pinokio.computer 60 | 61 | --- 62 | 63 | 64 | # CLI Usage 65 | 66 | ## 1. Generate Scripts 67 | 68 | ``` 69 | npx gepeto@latest --name --git --icon 70 | ``` 71 | 72 | ## 2. Set metadata 73 | 74 | Adding X.com posts to the `posts` array in `pinokio_meta.json` 75 | 76 | ``` 77 | npx gepeto@latest add post --value 78 | ``` 79 | 80 | Adding X.com posts to the `links` array in `pinokio_meta.json` 81 | 82 | ``` 83 | npx gepeto@latest add link --type --title --value <value> 84 | ``` 85 | -------------------------------------------------------------------------------- /docs/docs/android-chrome-192x192.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pinokiocomputer/gepeto/f8342439eda1a1fc131236c886ae6f6063871ae4/docs/docs/android-chrome-192x192.png -------------------------------------------------------------------------------- /docs/docs/android-chrome-512x512.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pinokiocomputer/gepeto/f8342439eda1a1fc131236c886ae6f6063871ae4/docs/docs/android-chrome-512x512.png -------------------------------------------------------------------------------- /docs/docs/apple-touch-icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pinokiocomputer/gepeto/f8342439eda1a1fc131236c886ae6f6063871ae4/docs/docs/apple-touch-icon.png -------------------------------------------------------------------------------- /docs/docs/favicon-16x16.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pinokiocomputer/gepeto/f8342439eda1a1fc131236c886ae6f6063871ae4/docs/docs/favicon-16x16.png -------------------------------------------------------------------------------- /docs/docs/favicon-32x32.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pinokiocomputer/gepeto/f8342439eda1a1fc131236c886ae6f6063871ae4/docs/docs/favicon-32x32.png -------------------------------------------------------------------------------- /docs/docs/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pinokiocomputer/gepeto/f8342439eda1a1fc131236c886ae6f6063871ae4/docs/docs/favicon.ico -------------------------------------------------------------------------------- /docs/docs/gepeto.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pinokiocomputer/gepeto/f8342439eda1a1fc131236c886ae6f6063871ae4/docs/docs/gepeto.jpg -------------------------------------------------------------------------------- /docs/docs/index.html: -------------------------------------------------------------------------------- 1 | <!DOCTYPE html> 2 | <html lang="en"> 3 | <head> 4 | <meta charset="UTF-8"> 5 | <title>Gepeto 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 |
28 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | 52 | 53 | -------------------------------------------------------------------------------- /docs/docs/prism.css: -------------------------------------------------------------------------------- 1 | /** 2 | * Coy without shadows 3 | * Based on Tim Shedor's Coy theme for prism.js 4 | * Author: RunDevelopment 5 | */ 6 | 7 | code[class*="language-"], 8 | pre[class*="language-"] { 9 | color: black; 10 | background: none; 11 | font-family: Consolas, Monaco, 'Andale Mono', 'Ubuntu Mono', monospace; 12 | font-size: 1em; 13 | text-align: left; 14 | white-space: pre; 15 | word-spacing: normal; 16 | word-break: normal; 17 | word-wrap: normal; 18 | line-height: 1.5; 19 | 20 | -moz-tab-size: 4; 21 | -o-tab-size: 4; 22 | tab-size: 4; 23 | 24 | -webkit-hyphens: none; 25 | -moz-hyphens: none; 26 | -ms-hyphens: none; 27 | hyphens: none; 28 | } 29 | 30 | /* Code blocks */ 31 | pre[class*="language-"] { 32 | position: relative; 33 | border-left: 10px solid #358ccb; 34 | box-shadow: -1px 0 0 0 #358ccb, 0 0 0 1px #dfdfdf; 35 | background-color: #fdfdfd; 36 | background-image: linear-gradient(transparent 50%, rgba(69, 142, 209, 0.04) 50%); 37 | background-size: 3em 3em; 38 | background-origin: content-box; 39 | background-attachment: local; 40 | margin: .5em 0; 41 | padding: 0 1em; 42 | } 43 | 44 | pre[class*="language-"] > code { 45 | display: block; 46 | } 47 | 48 | /* Inline code */ 49 | :not(pre) > code[class*="language-"] { 50 | position: relative; 51 | padding: .2em; 52 | border-radius: 0.3em; 53 | color: #e22020; 54 | border: 1px solid rgba(0, 0, 0, 0.1); 55 | display: inline; 56 | white-space: normal; 57 | background-color: #fdfdfd; 58 | -webkit-box-sizing: border-box; 59 | -moz-box-sizing: border-box; 60 | box-sizing: border-box; 61 | } 62 | 63 | .token.comment, 64 | .token.block-comment, 65 | .token.prolog, 66 | .token.doctype, 67 | .token.cdata { 68 | color: #7D8B99; 69 | } 70 | 71 | .token.punctuation { 72 | color: #5F6364; 73 | } 74 | 75 | .token.property, 76 | .token.tag, 77 | .token.boolean, 78 | .token.number, 79 | .token.function-name, 80 | .token.constant, 81 | .token.symbol, 82 | .token.deleted { 83 | color: #e22020; 84 | } 85 | 86 | .token.selector, 87 | .token.attr-name, 88 | .token.string, 89 | .token.char, 90 | .token.function, 91 | .token.builtin, 92 | .token.inserted { 93 | color: #47ba21; 94 | } 95 | 96 | .token.operator, 97 | .token.entity, 98 | .token.url, 99 | .token.variable { 100 | color: #a67f59; 101 | background: rgba(255, 255, 255, 0.5); 102 | } 103 | 104 | .token.atrule, 105 | .token.attr-value, 106 | .token.keyword, 107 | .token.class-name { 108 | color: #1990b8; 109 | } 110 | 111 | .token.regex, 112 | .token.important { 113 | color: #e90; 114 | } 115 | 116 | .language-css .token.string, 117 | .style .token.string { 118 | color: #a67f59; 119 | background: rgba(255, 255, 255, 0.5); 120 | } 121 | 122 | .token.important { 123 | font-weight: normal; 124 | } 125 | 126 | .token.bold { 127 | font-weight: bold; 128 | } 129 | 130 | .token.italic { 131 | font-style: italic; 132 | } 133 | 134 | .token.entity { 135 | cursor: help; 136 | } 137 | 138 | .token.namespace { 139 | opacity: .7; 140 | } 141 | -------------------------------------------------------------------------------- /docs/docs/prism2.css: -------------------------------------------------------------------------------- 1 | /** 2 | * Coldark Theme for Prism.js 3 | * Theme variation: Dark 4 | * Tested with HTML, CSS, JS, JSON, PHP, YAML, Bash script 5 | * @author Armand Philippot 6 | * @homepage https://github.com/ArmandPhilippot/coldark-prism 7 | * @license MIT 8 | */ 9 | code[class*="language-"], 10 | pre[class*="language-"] { 11 | color: #e3eaf2; 12 | background: none; 13 | font-family: Consolas, Monaco, "Andale Mono", "Ubuntu Mono", monospace; 14 | text-align: left; 15 | white-space: pre; 16 | word-spacing: normal; 17 | word-break: normal; 18 | word-wrap: normal; 19 | line-height: 1.5; 20 | -moz-tab-size: 4; 21 | -o-tab-size: 4; 22 | tab-size: 4; 23 | -webkit-hyphens: none; 24 | -moz-hyphens: none; 25 | -ms-hyphens: none; 26 | hyphens: none; 27 | } 28 | 29 | pre[class*="language-"]::-moz-selection, 30 | pre[class*="language-"] ::-moz-selection, 31 | code[class*="language-"]::-moz-selection, 32 | code[class*="language-"] ::-moz-selection { 33 | background: #3c526d; 34 | } 35 | 36 | pre[class*="language-"]::selection, 37 | pre[class*="language-"] ::selection, 38 | code[class*="language-"]::selection, 39 | code[class*="language-"] ::selection { 40 | background: #3c526d; 41 | } 42 | 43 | /* Code blocks */ 44 | pre[class*="language-"] { 45 | padding: 1em; 46 | margin: 0.5em 0; 47 | overflow: auto; 48 | } 49 | 50 | :not(pre) > code[class*="language-"], 51 | pre[class*="language-"] { 52 | background: #111b27; 53 | } 54 | 55 | /* Inline code */ 56 | :not(pre) > code[class*="language-"] { 57 | padding: 0.1em 0.3em; 58 | border-radius: 0.3em; 59 | white-space: normal; 60 | } 61 | 62 | .token.comment, 63 | .token.prolog, 64 | .token.doctype, 65 | .token.cdata { 66 | color: #8da1b9; 67 | } 68 | 69 | .token.punctuation { 70 | color: #e3eaf2; 71 | } 72 | 73 | .token.delimiter.important, 74 | .token.selector .parent, 75 | .token.tag, 76 | .token.tag .token.punctuation { 77 | color: #66cccc; 78 | } 79 | 80 | .token.attr-name, 81 | .token.boolean, 82 | .token.boolean.important, 83 | .token.number, 84 | .token.constant, 85 | .token.selector .token.attribute { 86 | color: #e6d37a; 87 | } 88 | 89 | .token.class-name, 90 | .token.key, 91 | .token.parameter, 92 | .token.property, 93 | .token.property-access, 94 | .token.variable { 95 | color: #6cb8e6; 96 | } 97 | 98 | .token.attr-value, 99 | .token.inserted, 100 | .token.color, 101 | .token.selector .token.value, 102 | .token.string, 103 | .token.string .token.url-link { 104 | color: #91d076; 105 | } 106 | 107 | .token.builtin, 108 | .token.keyword-array, 109 | .token.package, 110 | .token.regex { 111 | color: #f4adf4; 112 | } 113 | 114 | .token.function, 115 | .token.selector .token.class, 116 | .token.selector .token.id { 117 | color: #c699e3; 118 | } 119 | 120 | .token.atrule .token.rule, 121 | .token.combinator, 122 | .token.keyword, 123 | .token.operator, 124 | .token.pseudo-class, 125 | .token.pseudo-element, 126 | .token.selector, 127 | .token.unit { 128 | color: #e9ae7e; 129 | } 130 | 131 | .token.deleted, 132 | .token.important { 133 | color: #cd6660; 134 | } 135 | 136 | .token.keyword-this, 137 | .token.this { 138 | color: #6cb8e6; 139 | } 140 | 141 | .token.important, 142 | .token.keyword-this, 143 | .token.this, 144 | .token.bold { 145 | font-weight: bold; 146 | } 147 | 148 | .token.delimiter.important { 149 | font-weight: inherit; 150 | } 151 | 152 | .token.italic { 153 | font-style: italic; 154 | } 155 | 156 | .token.entity { 157 | cursor: help; 158 | } 159 | 160 | .language-markdown .token.title, 161 | .language-markdown .token.title .token.punctuation { 162 | color: #6cb8e6; 163 | font-weight: bold; 164 | } 165 | 166 | .language-markdown .token.blockquote.punctuation { 167 | color: #f4adf4; 168 | } 169 | 170 | .language-markdown .token.code { 171 | color: #66cccc; 172 | } 173 | 174 | .language-markdown .token.hr.punctuation { 175 | color: #6cb8e6; 176 | } 177 | 178 | .language-markdown .token.url .token.content { 179 | color: #91d076; 180 | } 181 | 182 | .language-markdown .token.url-link { 183 | color: #e6d37a; 184 | } 185 | 186 | .language-markdown .token.list.punctuation { 187 | color: #f4adf4; 188 | } 189 | 190 | .language-markdown .token.table-header { 191 | color: #e3eaf2; 192 | } 193 | 194 | .language-json .token.operator { 195 | color: #e3eaf2; 196 | } 197 | 198 | .language-scss .token.variable { 199 | color: #66cccc; 200 | } 201 | 202 | /* overrides color-values for the Show Invisibles plugin 203 | * https://prismjs.com/plugins/show-invisibles/ 204 | */ 205 | .token.token.tab:not(:empty):before, 206 | .token.token.cr:before, 207 | .token.token.lf:before, 208 | .token.token.space:before { 209 | color: #8da1b9; 210 | } 211 | 212 | /* overrides color-values for the Toolbar plugin 213 | * https://prismjs.com/plugins/toolbar/ 214 | */ 215 | div.code-toolbar > .toolbar.toolbar > .toolbar-item > a, 216 | div.code-toolbar > .toolbar.toolbar > .toolbar-item > button { 217 | color: #111b27; 218 | background: #6cb8e6; 219 | } 220 | 221 | div.code-toolbar > .toolbar.toolbar > .toolbar-item > a:hover, 222 | div.code-toolbar > .toolbar.toolbar > .toolbar-item > a:focus, 223 | div.code-toolbar > .toolbar.toolbar > .toolbar-item > button:hover, 224 | div.code-toolbar > .toolbar.toolbar > .toolbar-item > button:focus { 225 | color: #111b27; 226 | background: #6cb8e6da; 227 | text-decoration: none; 228 | } 229 | 230 | div.code-toolbar > .toolbar.toolbar > .toolbar-item > span, 231 | div.code-toolbar > .toolbar.toolbar > .toolbar-item > span:hover, 232 | div.code-toolbar > .toolbar.toolbar > .toolbar-item > span:focus { 233 | color: #111b27; 234 | background: #8da1b9; 235 | } 236 | 237 | /* overrides color-values for the Line Highlight plugin 238 | * http://prismjs.com/plugins/line-highlight/ 239 | */ 240 | .line-highlight.line-highlight { 241 | background: #3c526d5f; 242 | background: linear-gradient(to right, #3c526d5f 70%, #3c526d55); 243 | } 244 | 245 | .line-highlight.line-highlight:before, 246 | .line-highlight.line-highlight[data-end]:after { 247 | background-color: #8da1b9; 248 | color: #111b27; 249 | box-shadow: 0 1px #3c526d; 250 | } 251 | 252 | pre[id].linkable-line-numbers.linkable-line-numbers span.line-numbers-rows > span:hover:before { 253 | background-color: #8da1b918; 254 | } 255 | 256 | /* overrides color-values for the Line Numbers plugin 257 | * http://prismjs.com/plugins/line-numbers/ 258 | */ 259 | .line-numbers.line-numbers .line-numbers-rows { 260 | border-right: 1px solid #0b121b; 261 | background: #0b121b7a; 262 | } 263 | 264 | .line-numbers .line-numbers-rows > span:before { 265 | color: #8da1b9da; 266 | } 267 | 268 | /* overrides color-values for the Match Braces plugin 269 | * https://prismjs.com/plugins/match-braces/ 270 | */ 271 | .rainbow-braces .token.token.punctuation.brace-level-1, 272 | .rainbow-braces .token.token.punctuation.brace-level-5, 273 | .rainbow-braces .token.token.punctuation.brace-level-9 { 274 | color: #e6d37a; 275 | } 276 | 277 | .rainbow-braces .token.token.punctuation.brace-level-2, 278 | .rainbow-braces .token.token.punctuation.brace-level-6, 279 | .rainbow-braces .token.token.punctuation.brace-level-10 { 280 | color: #f4adf4; 281 | } 282 | 283 | .rainbow-braces .token.token.punctuation.brace-level-3, 284 | .rainbow-braces .token.token.punctuation.brace-level-7, 285 | .rainbow-braces .token.token.punctuation.brace-level-11 { 286 | color: #6cb8e6; 287 | } 288 | 289 | .rainbow-braces .token.token.punctuation.brace-level-4, 290 | .rainbow-braces .token.token.punctuation.brace-level-8, 291 | .rainbow-braces .token.token.punctuation.brace-level-12 { 292 | color: #c699e3; 293 | } 294 | 295 | /* overrides color-values for the Diff Highlight plugin 296 | * https://prismjs.com/plugins/diff-highlight/ 297 | */ 298 | pre.diff-highlight > code .token.token.deleted:not(.prefix), 299 | pre > code.diff-highlight .token.token.deleted:not(.prefix) { 300 | background-color: #cd66601f; 301 | } 302 | 303 | pre.diff-highlight > code .token.token.inserted:not(.prefix), 304 | pre > code.diff-highlight .token.token.inserted:not(.prefix) { 305 | background-color: #91d0761f; 306 | } 307 | 308 | /* overrides color-values for the Command Line plugin 309 | * https://prismjs.com/plugins/command-line/ 310 | */ 311 | .command-line .command-line-prompt { 312 | border-right: 1px solid #0b121b; 313 | } 314 | 315 | .command-line .command-line-prompt > span:before { 316 | color: #8da1b9da; 317 | } 318 | -------------------------------------------------------------------------------- /docs/docs/style.css: -------------------------------------------------------------------------------- 1 | body { 2 | /* 3 | background: rgb(27, 28, 29); 4 | */ 5 | background: #C0341D; 6 | color: white; 7 | } 8 | a.btn { 9 | display: inline-block; 10 | padding: 10px 20px; 11 | margin: 5px 5px 5px 0; 12 | background: black; 13 | text-decoration: none; 14 | color: white; 15 | border-radius: 10px; 16 | font-weight: bold; 17 | } 18 | .sidebar { 19 | background: none; 20 | color: white; 21 | } 22 | blockquote { 23 | border-left: 10px solid rgba(145,208,118,1) !important; 24 | padding: 10px; 25 | /* 26 | background: rgba(154,205,50,0.1); 27 | */ 28 | background: rgba(145,208,118,0.1); 29 | color: rgba(255,255,255,0.9) !important; 30 | 31 | } 32 | .app-name { 33 | display: none; 34 | } 35 | .markdown-section { 36 | max-width: 800px; 37 | margin: 0; 38 | } 39 | a.anchor:hover { 40 | color: white; 41 | } 42 | /* 43 | .markdown-section a { 44 | width: 100%; 45 | } 46 | */ 47 | .markdown-section img { 48 | background: rgba(255,255,255,0.1); 49 | padding: 10px; 50 | box-sizing: border-box; 51 | border-radius: 10px; 52 | } 53 | .markdown-section img.fixed { 54 | height: 300px; 55 | text-align: center; 56 | display: block; 57 | width: 100%; 58 | object-fit: contain; 59 | } 60 | .markdown-section h1 { 61 | font-size: 180px; 62 | line-height: 140px; 63 | letter-spacing: -4px; 64 | /* 65 | font-family: sans-serif; 66 | letter-spacing: -10px; 67 | */ 68 | /* 69 | padding: 0 40px; 70 | border-left: 40px solid white; 71 | */ 72 | text-transform: uppercase; 73 | font-family: "Micro 5", sans-serif; 74 | font-weight: 400; 75 | font-style: normal; 76 | 77 | } 78 | .hidden { 79 | display: none !important; 80 | } 81 | 82 | .markdown-section h2, .markdown h3, .markdown h4 { 83 | font-family: "Inter", sans-serif; 84 | font-optical-sizing: auto; 85 | font-weight: 900; 86 | font-style: normal; 87 | font-variation-settings: "slnt" 0; 88 | text-transform: lowercase; 89 | } 90 | 91 | 92 | .markdown-section h2 { 93 | letter-spacing: -5px; 94 | font-size: 70px; 95 | line-height: 70px; 96 | } 97 | 98 | .markdown-section h3 { 99 | letter-spacing: -1px; 100 | font-size: 50px; 101 | line-height: 50px; 102 | } 103 | .markdown-section h4 { 104 | letter-spacing: -1px; 105 | font-size: 30px; 106 | line-height: 30px; 107 | /* 108 | font-family: sans-serif; 109 | */ 110 | display: inline-block; 111 | margin: 15px 0 0; 112 | padding-left: 10px; 113 | border-left: 20px solid white; 114 | } 115 | .markdown-section h5 { 116 | font-size: 20px; 117 | line-height: 20px; 118 | border-left: 15px solid white; 119 | border-radius: 20px; 120 | padding-left: 10px; 121 | margin: 30px 0 0 0; 122 | } 123 | .markdown-section h4 a.anchor span { 124 | /* 125 | color: rgb(145, 208, 118); 126 | */ 127 | } 128 | /* 129 | .markdown-section h4 a.anchor span { 130 | color: #91d076; 131 | } 132 | */ 133 | a.anchor span { 134 | color: white; 135 | word-wrap: break-word; 136 | } 137 | .sidebar li { 138 | margin: 0; 139 | } 140 | .sidebar ul li.active a { 141 | color: white; 142 | } 143 | .sidebar ul li a { 144 | color: white; 145 | line-height: 22px; 146 | } 147 | .markdown-section h6 a.anchor span { 148 | color: #91d076; 149 | } 150 | .markdown-section h6 { 151 | padding: 5px 10px; 152 | border-left: 6px solid #91d076; 153 | margin: 0; 154 | } 155 | .markdown-section>:not(h1):not(h2):not(h3):not(h4):not(h5):not(h6) code { 156 | line-height: 1rem; 157 | } 158 | .markdown-section code { 159 | padding: 3px; 160 | background: rgba(0,0,0,0.4); 161 | } 162 | .markdown-section pre>code { 163 | color: rgba(255,255,255,0.8); 164 | background: none; 165 | } 166 | .markdown-section pre { 167 | background: rgba(0,0,0,0.2); 168 | } 169 | /* 170 | .markdown-section code { 171 | background: none; 172 | } 173 | */ 174 | .markdown-section h1, .markdown-section h2, .markdown-section h3, .markdown-section h4, .markdown-section strong { 175 | color: #91d076; 176 | } 177 | .markdown-section li p { 178 | margin: 0; 179 | } 180 | .markdown-section ol, .markdown-section p, .markdown-section ul { 181 | line-height: 1.5rem; 182 | } 183 | .markdown-section a { 184 | /* 185 | color: #91d076; 186 | color: cornflowerblue; 187 | */ 188 | color: white; 189 | } 190 | hr { 191 | border-bottom: 1px solid rgba(255,255,255,0.1) !important; 192 | } 193 | 194 | 195 | @media screen and (max-width: 600px) { 196 | .markdown-section h1 { 197 | font-size: 120px; 198 | line-height: 100px; 199 | letter-spacing: -2px; 200 | } 201 | } 202 | -------------------------------------------------------------------------------- /docs/favicon-16x16.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pinokiocomputer/gepeto/f8342439eda1a1fc131236c886ae6f6063871ae4/docs/favicon-16x16.png -------------------------------------------------------------------------------- /docs/favicon-32x32.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pinokiocomputer/gepeto/f8342439eda1a1fc131236c886ae6f6063871ae4/docs/favicon-32x32.png -------------------------------------------------------------------------------- /docs/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pinokiocomputer/gepeto/f8342439eda1a1fc131236c886ae6f6063871ae4/docs/favicon.ico -------------------------------------------------------------------------------- /docs/gepeto.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pinokiocomputer/gepeto/f8342439eda1a1fc131236c886ae6f6063871ae4/docs/gepeto.jpg -------------------------------------------------------------------------------- /docs/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | Gepeto 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 98 | 99 | 100 |
101 |
102 |

Gepeto

103 |
104 | Generate Local AI Launchers, Instantly. 105 |
106 |
107 | Learn more 108 |
109 |
110 | 111 |
112 |
113 |
114 | 115 | 116 | -------------------------------------------------------------------------------- /index.js: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env node 2 | // 1. npx gepeto : external git 3 | // 2. npx gepeto : no external git 4 | const fs = require('fs') 5 | const path = require('path') 6 | const { pipeline } = require('stream'); 7 | const { promisify } = require('util'); 8 | const { bold, green } = require('kleur'); 9 | const yargs = require('yargs/yargs') 10 | const { hideBin } = require('yargs/helpers') 11 | const prompts = require('prompts'); 12 | const git = require('isomorphic-git'); 13 | const add = async (type, argv) => { 14 | console.log("add", type, argv) 15 | let pinokio_meta = path.resolve(process.cwd(), "pinokio_meta.json") 16 | let meta 17 | try { 18 | meta = require(pinokio_meta) 19 | } catch (e) { 20 | meta = {} 21 | } 22 | delete argv._ 23 | for(let key in argv) { 24 | if (key.startsWith("$")) { 25 | delete argv[key] 26 | } 27 | } 28 | if (type === "link") { 29 | if (argv.value && argv.value.length > 0) { 30 | if (meta.links) { 31 | if (Array.isArray(meta.links)) { 32 | meta.links = meta.links.concat(argv) 33 | } else { 34 | meta.links = [argv] 35 | } 36 | } else { 37 | meta.links = [argv] 38 | } 39 | } 40 | } 41 | if (type === "post") { 42 | if (meta.posts) { 43 | if (argv.value) { 44 | if (Array.isArray(meta.posts)) { 45 | meta.posts = meta.posts.concat(argv.value) 46 | } else { 47 | meta.posts = [argv.value] 48 | } 49 | } 50 | } else { 51 | if (argv.value) { 52 | meta.posts = [argv.value] 53 | } 54 | } 55 | } 56 | let str = JSON.stringify(meta, null, 2) 57 | console.log({ str }) 58 | fs.writeFileSync(pinokio_meta, str) 59 | } 60 | 61 | const bootstrap = async (argv) => { 62 | let response 63 | if (argv.name) { 64 | response = { 65 | name: decodeURIComponent(argv.name), 66 | git: (argv.git ? decodeURIComponent(argv.git) : ""), 67 | icon: (argv.icon ? decodeURIComponent(argv.icon) : ""), 68 | install: (argv.install ? decodeURIComponent(argv.install) : "requirements.txt"), 69 | start: (argv.start ? decodeURIComponent(argv.start) : "app.py"), 70 | } 71 | } else { 72 | response = await prompts([{ 73 | type: 'text', 74 | initial: 'my-app', 75 | name: 'name', 76 | message: '', 77 | onRender(kleur) { 78 | this.msg = `${kleur.green('Project name')}` 79 | } 80 | }, { 81 | type: 'text', 82 | name: 'icon', 83 | message: '', 84 | onRender(kleur) { 85 | this.msg = `${kleur.green('Icon URL')} (Leave empty to use the default icon)` 86 | } 87 | }, { 88 | type: 'text', 89 | name: 'git', 90 | message: '', 91 | onRender(kleur) { 92 | this.msg = `${kleur.green('3rd party git URL')} (Leave empty if not using an external repository)` 93 | } 94 | }, { 95 | type: 'text', 96 | name: 'start', 97 | message: '', 98 | initial: "app.py", 99 | onRender(kleur) { 100 | this.msg = `${kleur.green('App python file')} (Leave empty to use the default)` 101 | } 102 | }, { 103 | type: 'text', 104 | name: 'install', 105 | message: '', 106 | initial: "requirements.txt", 107 | onRender(kleur) { 108 | this.msg = `${kleur.green('PIP install file')} (Leave empty to use the default)` 109 | } 110 | }]); 111 | } 112 | 113 | let url = response.git.trim().length > 0 ? response.git.trim() : null 114 | let name = response.name 115 | let template = (url ? "templates/1" : "templates/2") 116 | 117 | // 1. copy common files 118 | let dest = path.resolve(process.cwd(), name) 119 | let src = path.resolve(__dirname, template) 120 | fs.cpSync(src, dest, { recursive: true }) 121 | 122 | // 2. replace $GIT_REPOSITORY from install.js 123 | if (url) { 124 | let installFile = path.resolve(dest, "install.js") 125 | let str = fs.readFileSync(installFile, "utf8") 126 | str = str.replaceAll("", url) 127 | fs.writeFileSync(installFile, str) 128 | } 129 | 130 | // 3. replace $TITLE from pinokio.js 131 | if (name) { 132 | let pinokioFile = path.resolve(dest, "pinokio.js") 133 | let str = fs.readFileSync(pinokioFile, "utf8") 134 | str = str.replaceAll("", name) 135 | fs.writeFileSync(pinokioFile, str) 136 | 137 | let pinokio_meta = path.resolve(dest, "pinokio_meta.json") 138 | let str2 = JSON.stringify({ 139 | links: [], 140 | posts: [] 141 | }, null, 2) 142 | fs.writeFileSync(pinokio_meta, str2) 143 | } 144 | 145 | // 4. replace <INSTALL_FILE> with response.install 146 | let installFile = path.resolve(dest, "install.js") 147 | let install_str = fs.readFileSync(installFile, "utf8") 148 | install_str = install_str.replaceAll("<INSTALL_FILE>", response.install) 149 | fs.writeFileSync(installFile, install_str) 150 | 151 | // 5. replace <START_FILE> with response.start 152 | let startFile = path.resolve(dest, "start.js") 153 | let start_str = fs.readFileSync(startFile, "utf8") 154 | start_str = start_str.replaceAll("<START_FILE>", response.start) 155 | fs.writeFileSync(startFile, start_str) 156 | 157 | // If url doesn't exist => means start fresh, so create those files 158 | // if url exists => assume the files exist in the cloned repo 159 | if (!url) { 160 | // 6, if url does not exist, it's template/2 => create an empty start file and install file 161 | let requirementsFile = path.resolve(dest, response.install) 162 | await fs.promises.rename(path.resolve(dest, "requirements.txt"), requirementsFile) 163 | 164 | let appFile = path.resolve(dest, response.start) 165 | await fs.promises.rename(path.resolve(dest, "app.py"), appFile) 166 | } 167 | 168 | // 7. icon handling 169 | let icon 170 | if (response.icon) { 171 | const streamPipeline = promisify(pipeline); 172 | const res = await fetch(response.icon); 173 | if (!res.ok) { 174 | throw new Error(`unexpected response ${res.statusText}`); 175 | } 176 | const contentType = res.headers.get('content-type'); 177 | const extension = contentType.split('/')[1]; 178 | icon = `icon.${extension}` 179 | const iconFile = path.resolve(dest, icon); 180 | await streamPipeline(res.body, fs.createWriteStream(iconFile)); 181 | } else { 182 | icon = "icon.png" 183 | } 184 | let pinokioFile = path.resolve(dest, "pinokio.js") 185 | let str = fs.readFileSync(pinokioFile, "utf8") 186 | str = str.replaceAll("<ICON>", icon) 187 | fs.writeFileSync(pinokioFile, str) 188 | 189 | // Autogenerate README 190 | if (url) { 191 | let readme = `# ${name} 192 | 193 | A pinokio script for ${url} 194 | 195 | ` 196 | const readmeFile = path.resolve(dest, "README.md") 197 | fs.writeFileSync(readmeFile, readme) 198 | } 199 | 200 | // 8. add .gitignore 201 | let gitIgnore = path.resolve(dest, ".gitignore") 202 | let gitIgnoreContent = [ 203 | "node_modules", 204 | ".DS_Store" 205 | ].join("\n") 206 | fs.writeFileSync(gitIgnore, gitIgnoreContent) 207 | 208 | // 9. git init 209 | await git.init({ fs, dir: dest }) 210 | 211 | // 10. git add 212 | await git.add({ fs, dir: dest, filepath: '.' }) 213 | 214 | // 11. git commit 215 | let sha = await git.commit({ 216 | fs, 217 | dir: dest, 218 | author: { name: 'gepeto', email: 'gepeto@pinokio.computer', }, 219 | message: 'init' 220 | }) 221 | 222 | // 12. git branch main 223 | await git.branch({ fs, dir: dest, ref: 'main' }) 224 | 225 | } 226 | 227 | (async () => { 228 | const argv = yargs(hideBin(process.argv)).parse(); 229 | console.log({ argv }) 230 | if (argv._ && argv._.length > 0) { 231 | if (argv._.length > 1 && argv._[0] === "add") { 232 | // type := "post"|"link" 233 | let type = argv._[1] 234 | await add(type, argv) 235 | } 236 | } else { 237 | await bootstrap(argv) 238 | } 239 | })(); 240 | -------------------------------------------------------------------------------- /package-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "gepeto", 3 | "version": "0.4.9", 4 | "lockfileVersion": 2, 5 | "requires": true, 6 | "packages": { 7 | "": { 8 | "name": "gepeto", 9 | "version": "0.4.9", 10 | "license": "MIT", 11 | "dependencies": { 12 | "isomorphic-git": "^1.25.7", 13 | "kleur": "^4.1.5", 14 | "prompts": "^2.4.2", 15 | "yargs": "^17.7.2" 16 | }, 17 | "bin": { 18 | "gepeto": "index.js" 19 | } 20 | }, 21 | "node_modules/ansi-regex": { 22 | "version": "5.0.1", 23 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", 24 | "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", 25 | "engines": { 26 | "node": ">=8" 27 | } 28 | }, 29 | "node_modules/ansi-styles": { 30 | "version": "4.3.0", 31 | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", 32 | "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", 33 | "dependencies": { 34 | "color-convert": "^2.0.1" 35 | }, 36 | "engines": { 37 | "node": ">=8" 38 | }, 39 | "funding": { 40 | "url": "https://github.com/chalk/ansi-styles?sponsor=1" 41 | } 42 | }, 43 | "node_modules/async-lock": { 44 | "version": "1.4.1", 45 | "resolved": "https://registry.npmjs.org/async-lock/-/async-lock-1.4.1.tgz", 46 | "integrity": "sha512-Az2ZTpuytrtqENulXwO3GGv1Bztugx6TT37NIo7imr/Qo0gsYiGtSdBa2B6fsXhTpVZDNfu1Qn3pk531e3q+nQ==" 47 | }, 48 | "node_modules/clean-git-ref": { 49 | "version": "2.0.1", 50 | "resolved": "https://registry.npmjs.org/clean-git-ref/-/clean-git-ref-2.0.1.tgz", 51 | "integrity": "sha512-bLSptAy2P0s6hU4PzuIMKmMJJSE6gLXGH1cntDu7bWJUksvuM+7ReOK61mozULErYvP6a15rnYl0zFDef+pyPw==" 52 | }, 53 | "node_modules/cliui": { 54 | "version": "8.0.1", 55 | "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", 56 | "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", 57 | "dependencies": { 58 | "string-width": "^4.2.0", 59 | "strip-ansi": "^6.0.1", 60 | "wrap-ansi": "^7.0.0" 61 | }, 62 | "engines": { 63 | "node": ">=12" 64 | } 65 | }, 66 | "node_modules/color-convert": { 67 | "version": "2.0.1", 68 | "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", 69 | "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", 70 | "dependencies": { 71 | "color-name": "~1.1.4" 72 | }, 73 | "engines": { 74 | "node": ">=7.0.0" 75 | } 76 | }, 77 | "node_modules/color-name": { 78 | "version": "1.1.4", 79 | "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", 80 | "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" 81 | }, 82 | "node_modules/crc-32": { 83 | "version": "1.2.2", 84 | "resolved": "https://registry.npmjs.org/crc-32/-/crc-32-1.2.2.tgz", 85 | "integrity": "sha512-ROmzCKrTnOwybPcJApAA6WBWij23HVfGVNKqqrZpuyZOHqK2CwHSvpGuyt/UNNvaIjEd8X5IFGp4Mh+Ie1IHJQ==", 86 | "bin": { 87 | "crc32": "bin/crc32.njs" 88 | }, 89 | "engines": { 90 | "node": ">=0.8" 91 | } 92 | }, 93 | "node_modules/decompress-response": { 94 | "version": "6.0.0", 95 | "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-6.0.0.tgz", 96 | "integrity": "sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==", 97 | "dependencies": { 98 | "mimic-response": "^3.1.0" 99 | }, 100 | "engines": { 101 | "node": ">=10" 102 | }, 103 | "funding": { 104 | "url": "https://github.com/sponsors/sindresorhus" 105 | } 106 | }, 107 | "node_modules/diff3": { 108 | "version": "0.0.3", 109 | "resolved": "https://registry.npmjs.org/diff3/-/diff3-0.0.3.tgz", 110 | "integrity": "sha512-iSq8ngPOt0K53A6eVr4d5Kn6GNrM2nQZtC740pzIriHtn4pOQ2lyzEXQMBeVcWERN0ye7fhBsk9PbLLQOnUx/g==" 111 | }, 112 | "node_modules/emoji-regex": { 113 | "version": "8.0.0", 114 | "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", 115 | "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" 116 | }, 117 | "node_modules/escalade": { 118 | "version": "3.1.2", 119 | "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.2.tgz", 120 | "integrity": "sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA==", 121 | "engines": { 122 | "node": ">=6" 123 | } 124 | }, 125 | "node_modules/get-caller-file": { 126 | "version": "2.0.5", 127 | "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", 128 | "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", 129 | "engines": { 130 | "node": "6.* || 8.* || >= 10.*" 131 | } 132 | }, 133 | "node_modules/ignore": { 134 | "version": "5.3.1", 135 | "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.1.tgz", 136 | "integrity": "sha512-5Fytz/IraMjqpwfd34ke28PTVMjZjJG2MPn5t7OE4eUCUNf8BAa7b5WUS9/Qvr6mwOQS7Mk6vdsMno5he+T8Xw==", 137 | "engines": { 138 | "node": ">= 4" 139 | } 140 | }, 141 | "node_modules/inherits": { 142 | "version": "2.0.4", 143 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", 144 | "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" 145 | }, 146 | "node_modules/is-fullwidth-code-point": { 147 | "version": "3.0.0", 148 | "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", 149 | "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", 150 | "engines": { 151 | "node": ">=8" 152 | } 153 | }, 154 | "node_modules/isomorphic-git": { 155 | "version": "1.25.7", 156 | "resolved": "https://registry.npmjs.org/isomorphic-git/-/isomorphic-git-1.25.7.tgz", 157 | "integrity": "sha512-KE10ejaIsEpQ+I/apS33qqTjyzCXgOniEaL32DwNbXtboKG8H3cu+RiBcdp3G9w4MpOOTQfGPsWp4i8UxRfDLg==", 158 | "dependencies": { 159 | "async-lock": "^1.1.0", 160 | "clean-git-ref": "^2.0.1", 161 | "crc-32": "^1.2.0", 162 | "diff3": "0.0.3", 163 | "ignore": "^5.1.4", 164 | "minimisted": "^2.0.0", 165 | "pako": "^1.0.10", 166 | "pify": "^4.0.1", 167 | "readable-stream": "^3.4.0", 168 | "sha.js": "^2.4.9", 169 | "simple-get": "^4.0.1" 170 | }, 171 | "bin": { 172 | "isogit": "cli.cjs" 173 | }, 174 | "engines": { 175 | "node": ">=12" 176 | } 177 | }, 178 | "node_modules/kleur": { 179 | "version": "4.1.5", 180 | "resolved": "https://registry.npmjs.org/kleur/-/kleur-4.1.5.tgz", 181 | "integrity": "sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ==", 182 | "engines": { 183 | "node": ">=6" 184 | } 185 | }, 186 | "node_modules/mimic-response": { 187 | "version": "3.1.0", 188 | "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-3.1.0.tgz", 189 | "integrity": "sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==", 190 | "engines": { 191 | "node": ">=10" 192 | }, 193 | "funding": { 194 | "url": "https://github.com/sponsors/sindresorhus" 195 | } 196 | }, 197 | "node_modules/minimist": { 198 | "version": "1.2.8", 199 | "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", 200 | "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", 201 | "funding": { 202 | "url": "https://github.com/sponsors/ljharb" 203 | } 204 | }, 205 | "node_modules/minimisted": { 206 | "version": "2.0.1", 207 | "resolved": "https://registry.npmjs.org/minimisted/-/minimisted-2.0.1.tgz", 208 | "integrity": "sha512-1oPjfuLQa2caorJUM8HV8lGgWCc0qqAO1MNv/k05G4qslmsndV/5WdNZrqCiyqiz3wohia2Ij2B7w2Dr7/IyrA==", 209 | "dependencies": { 210 | "minimist": "^1.2.5" 211 | } 212 | }, 213 | "node_modules/once": { 214 | "version": "1.4.0", 215 | "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", 216 | "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", 217 | "dependencies": { 218 | "wrappy": "1" 219 | } 220 | }, 221 | "node_modules/pako": { 222 | "version": "1.0.11", 223 | "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.11.tgz", 224 | "integrity": "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==" 225 | }, 226 | "node_modules/pify": { 227 | "version": "4.0.1", 228 | "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", 229 | "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", 230 | "engines": { 231 | "node": ">=6" 232 | } 233 | }, 234 | "node_modules/prompts": { 235 | "version": "2.4.2", 236 | "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.4.2.tgz", 237 | "integrity": "sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==", 238 | "dependencies": { 239 | "kleur": "^3.0.3", 240 | "sisteransi": "^1.0.5" 241 | }, 242 | "engines": { 243 | "node": ">= 6" 244 | } 245 | }, 246 | "node_modules/prompts/node_modules/kleur": { 247 | "version": "3.0.3", 248 | "resolved": "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz", 249 | "integrity": "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==", 250 | "engines": { 251 | "node": ">=6" 252 | } 253 | }, 254 | "node_modules/readable-stream": { 255 | "version": "3.6.2", 256 | "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", 257 | "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", 258 | "dependencies": { 259 | "inherits": "^2.0.3", 260 | "string_decoder": "^1.1.1", 261 | "util-deprecate": "^1.0.1" 262 | }, 263 | "engines": { 264 | "node": ">= 6" 265 | } 266 | }, 267 | "node_modules/require-directory": { 268 | "version": "2.1.1", 269 | "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", 270 | "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", 271 | "engines": { 272 | "node": ">=0.10.0" 273 | } 274 | }, 275 | "node_modules/safe-buffer": { 276 | "version": "5.2.1", 277 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", 278 | "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", 279 | "funding": [ 280 | { 281 | "type": "github", 282 | "url": "https://github.com/sponsors/feross" 283 | }, 284 | { 285 | "type": "patreon", 286 | "url": "https://www.patreon.com/feross" 287 | }, 288 | { 289 | "type": "consulting", 290 | "url": "https://feross.org/support" 291 | } 292 | ] 293 | }, 294 | "node_modules/sha.js": { 295 | "version": "2.4.11", 296 | "resolved": "https://registry.npmjs.org/sha.js/-/sha.js-2.4.11.tgz", 297 | "integrity": "sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==", 298 | "dependencies": { 299 | "inherits": "^2.0.1", 300 | "safe-buffer": "^5.0.1" 301 | }, 302 | "bin": { 303 | "sha.js": "bin.js" 304 | } 305 | }, 306 | "node_modules/simple-concat": { 307 | "version": "1.0.1", 308 | "resolved": "https://registry.npmjs.org/simple-concat/-/simple-concat-1.0.1.tgz", 309 | "integrity": "sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q==", 310 | "funding": [ 311 | { 312 | "type": "github", 313 | "url": "https://github.com/sponsors/feross" 314 | }, 315 | { 316 | "type": "patreon", 317 | "url": "https://www.patreon.com/feross" 318 | }, 319 | { 320 | "type": "consulting", 321 | "url": "https://feross.org/support" 322 | } 323 | ] 324 | }, 325 | "node_modules/simple-get": { 326 | "version": "4.0.1", 327 | "resolved": "https://registry.npmjs.org/simple-get/-/simple-get-4.0.1.tgz", 328 | "integrity": "sha512-brv7p5WgH0jmQJr1ZDDfKDOSeWWg+OVypG99A/5vYGPqJ6pxiaHLy8nxtFjBA7oMa01ebA9gfh1uMCFqOuXxvA==", 329 | "funding": [ 330 | { 331 | "type": "github", 332 | "url": "https://github.com/sponsors/feross" 333 | }, 334 | { 335 | "type": "patreon", 336 | "url": "https://www.patreon.com/feross" 337 | }, 338 | { 339 | "type": "consulting", 340 | "url": "https://feross.org/support" 341 | } 342 | ], 343 | "dependencies": { 344 | "decompress-response": "^6.0.0", 345 | "once": "^1.3.1", 346 | "simple-concat": "^1.0.0" 347 | } 348 | }, 349 | "node_modules/sisteransi": { 350 | "version": "1.0.5", 351 | "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz", 352 | "integrity": "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==" 353 | }, 354 | "node_modules/string_decoder": { 355 | "version": "1.3.0", 356 | "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", 357 | "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", 358 | "dependencies": { 359 | "safe-buffer": "~5.2.0" 360 | } 361 | }, 362 | "node_modules/string-width": { 363 | "version": "4.2.3", 364 | "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", 365 | "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", 366 | "dependencies": { 367 | "emoji-regex": "^8.0.0", 368 | "is-fullwidth-code-point": "^3.0.0", 369 | "strip-ansi": "^6.0.1" 370 | }, 371 | "engines": { 372 | "node": ">=8" 373 | } 374 | }, 375 | "node_modules/strip-ansi": { 376 | "version": "6.0.1", 377 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", 378 | "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", 379 | "dependencies": { 380 | "ansi-regex": "^5.0.1" 381 | }, 382 | "engines": { 383 | "node": ">=8" 384 | } 385 | }, 386 | "node_modules/util-deprecate": { 387 | "version": "1.0.2", 388 | "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", 389 | "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==" 390 | }, 391 | "node_modules/wrap-ansi": { 392 | "version": "7.0.0", 393 | "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", 394 | "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", 395 | "dependencies": { 396 | "ansi-styles": "^4.0.0", 397 | "string-width": "^4.1.0", 398 | "strip-ansi": "^6.0.0" 399 | }, 400 | "engines": { 401 | "node": ">=10" 402 | }, 403 | "funding": { 404 | "url": "https://github.com/chalk/wrap-ansi?sponsor=1" 405 | } 406 | }, 407 | "node_modules/wrappy": { 408 | "version": "1.0.2", 409 | "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", 410 | "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==" 411 | }, 412 | "node_modules/y18n": { 413 | "version": "5.0.8", 414 | "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", 415 | "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", 416 | "engines": { 417 | "node": ">=10" 418 | } 419 | }, 420 | "node_modules/yargs": { 421 | "version": "17.7.2", 422 | "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", 423 | "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", 424 | "dependencies": { 425 | "cliui": "^8.0.1", 426 | "escalade": "^3.1.1", 427 | "get-caller-file": "^2.0.5", 428 | "require-directory": "^2.1.1", 429 | "string-width": "^4.2.3", 430 | "y18n": "^5.0.5", 431 | "yargs-parser": "^21.1.1" 432 | }, 433 | "engines": { 434 | "node": ">=12" 435 | } 436 | }, 437 | "node_modules/yargs-parser": { 438 | "version": "21.1.1", 439 | "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", 440 | "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", 441 | "engines": { 442 | "node": ">=12" 443 | } 444 | } 445 | }, 446 | "dependencies": { 447 | "ansi-regex": { 448 | "version": "5.0.1", 449 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", 450 | "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==" 451 | }, 452 | "ansi-styles": { 453 | "version": "4.3.0", 454 | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", 455 | "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", 456 | "requires": { 457 | "color-convert": "^2.0.1" 458 | } 459 | }, 460 | "async-lock": { 461 | "version": "1.4.1", 462 | "resolved": "https://registry.npmjs.org/async-lock/-/async-lock-1.4.1.tgz", 463 | "integrity": "sha512-Az2ZTpuytrtqENulXwO3GGv1Bztugx6TT37NIo7imr/Qo0gsYiGtSdBa2B6fsXhTpVZDNfu1Qn3pk531e3q+nQ==" 464 | }, 465 | "clean-git-ref": { 466 | "version": "2.0.1", 467 | "resolved": "https://registry.npmjs.org/clean-git-ref/-/clean-git-ref-2.0.1.tgz", 468 | "integrity": "sha512-bLSptAy2P0s6hU4PzuIMKmMJJSE6gLXGH1cntDu7bWJUksvuM+7ReOK61mozULErYvP6a15rnYl0zFDef+pyPw==" 469 | }, 470 | "cliui": { 471 | "version": "8.0.1", 472 | "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", 473 | "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", 474 | "requires": { 475 | "string-width": "^4.2.0", 476 | "strip-ansi": "^6.0.1", 477 | "wrap-ansi": "^7.0.0" 478 | } 479 | }, 480 | "color-convert": { 481 | "version": "2.0.1", 482 | "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", 483 | "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", 484 | "requires": { 485 | "color-name": "~1.1.4" 486 | } 487 | }, 488 | "color-name": { 489 | "version": "1.1.4", 490 | "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", 491 | "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" 492 | }, 493 | "crc-32": { 494 | "version": "1.2.2", 495 | "resolved": "https://registry.npmjs.org/crc-32/-/crc-32-1.2.2.tgz", 496 | "integrity": "sha512-ROmzCKrTnOwybPcJApAA6WBWij23HVfGVNKqqrZpuyZOHqK2CwHSvpGuyt/UNNvaIjEd8X5IFGp4Mh+Ie1IHJQ==" 497 | }, 498 | "decompress-response": { 499 | "version": "6.0.0", 500 | "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-6.0.0.tgz", 501 | "integrity": "sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==", 502 | "requires": { 503 | "mimic-response": "^3.1.0" 504 | } 505 | }, 506 | "diff3": { 507 | "version": "0.0.3", 508 | "resolved": "https://registry.npmjs.org/diff3/-/diff3-0.0.3.tgz", 509 | "integrity": "sha512-iSq8ngPOt0K53A6eVr4d5Kn6GNrM2nQZtC740pzIriHtn4pOQ2lyzEXQMBeVcWERN0ye7fhBsk9PbLLQOnUx/g==" 510 | }, 511 | "emoji-regex": { 512 | "version": "8.0.0", 513 | "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", 514 | "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" 515 | }, 516 | "escalade": { 517 | "version": "3.1.2", 518 | "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.2.tgz", 519 | "integrity": "sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA==" 520 | }, 521 | "get-caller-file": { 522 | "version": "2.0.5", 523 | "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", 524 | "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==" 525 | }, 526 | "ignore": { 527 | "version": "5.3.1", 528 | "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.1.tgz", 529 | "integrity": "sha512-5Fytz/IraMjqpwfd34ke28PTVMjZjJG2MPn5t7OE4eUCUNf8BAa7b5WUS9/Qvr6mwOQS7Mk6vdsMno5he+T8Xw==" 530 | }, 531 | "inherits": { 532 | "version": "2.0.4", 533 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", 534 | "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" 535 | }, 536 | "is-fullwidth-code-point": { 537 | "version": "3.0.0", 538 | "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", 539 | "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==" 540 | }, 541 | "isomorphic-git": { 542 | "version": "1.25.7", 543 | "resolved": "https://registry.npmjs.org/isomorphic-git/-/isomorphic-git-1.25.7.tgz", 544 | "integrity": "sha512-KE10ejaIsEpQ+I/apS33qqTjyzCXgOniEaL32DwNbXtboKG8H3cu+RiBcdp3G9w4MpOOTQfGPsWp4i8UxRfDLg==", 545 | "requires": { 546 | "async-lock": "^1.1.0", 547 | "clean-git-ref": "^2.0.1", 548 | "crc-32": "^1.2.0", 549 | "diff3": "0.0.3", 550 | "ignore": "^5.1.4", 551 | "minimisted": "^2.0.0", 552 | "pako": "^1.0.10", 553 | "pify": "^4.0.1", 554 | "readable-stream": "^3.4.0", 555 | "sha.js": "^2.4.9", 556 | "simple-get": "^4.0.1" 557 | } 558 | }, 559 | "kleur": { 560 | "version": "4.1.5", 561 | "resolved": "https://registry.npmjs.org/kleur/-/kleur-4.1.5.tgz", 562 | "integrity": "sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ==" 563 | }, 564 | "mimic-response": { 565 | "version": "3.1.0", 566 | "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-3.1.0.tgz", 567 | "integrity": "sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==" 568 | }, 569 | "minimist": { 570 | "version": "1.2.8", 571 | "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", 572 | "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==" 573 | }, 574 | "minimisted": { 575 | "version": "2.0.1", 576 | "resolved": "https://registry.npmjs.org/minimisted/-/minimisted-2.0.1.tgz", 577 | "integrity": "sha512-1oPjfuLQa2caorJUM8HV8lGgWCc0qqAO1MNv/k05G4qslmsndV/5WdNZrqCiyqiz3wohia2Ij2B7w2Dr7/IyrA==", 578 | "requires": { 579 | "minimist": "^1.2.5" 580 | } 581 | }, 582 | "once": { 583 | "version": "1.4.0", 584 | "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", 585 | "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", 586 | "requires": { 587 | "wrappy": "1" 588 | } 589 | }, 590 | "pako": { 591 | "version": "1.0.11", 592 | "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.11.tgz", 593 | "integrity": "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==" 594 | }, 595 | "pify": { 596 | "version": "4.0.1", 597 | "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", 598 | "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==" 599 | }, 600 | "prompts": { 601 | "version": "2.4.2", 602 | "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.4.2.tgz", 603 | "integrity": "sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==", 604 | "requires": { 605 | "kleur": "^3.0.3", 606 | "sisteransi": "^1.0.5" 607 | }, 608 | "dependencies": { 609 | "kleur": { 610 | "version": "3.0.3", 611 | "resolved": "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz", 612 | "integrity": "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==" 613 | } 614 | } 615 | }, 616 | "readable-stream": { 617 | "version": "3.6.2", 618 | "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", 619 | "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", 620 | "requires": { 621 | "inherits": "^2.0.3", 622 | "string_decoder": "^1.1.1", 623 | "util-deprecate": "^1.0.1" 624 | } 625 | }, 626 | "require-directory": { 627 | "version": "2.1.1", 628 | "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", 629 | "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==" 630 | }, 631 | "safe-buffer": { 632 | "version": "5.2.1", 633 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", 634 | "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==" 635 | }, 636 | "sha.js": { 637 | "version": "2.4.11", 638 | "resolved": "https://registry.npmjs.org/sha.js/-/sha.js-2.4.11.tgz", 639 | "integrity": "sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==", 640 | "requires": { 641 | "inherits": "^2.0.1", 642 | "safe-buffer": "^5.0.1" 643 | } 644 | }, 645 | "simple-concat": { 646 | "version": "1.0.1", 647 | "resolved": "https://registry.npmjs.org/simple-concat/-/simple-concat-1.0.1.tgz", 648 | "integrity": "sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q==" 649 | }, 650 | "simple-get": { 651 | "version": "4.0.1", 652 | "resolved": "https://registry.npmjs.org/simple-get/-/simple-get-4.0.1.tgz", 653 | "integrity": "sha512-brv7p5WgH0jmQJr1ZDDfKDOSeWWg+OVypG99A/5vYGPqJ6pxiaHLy8nxtFjBA7oMa01ebA9gfh1uMCFqOuXxvA==", 654 | "requires": { 655 | "decompress-response": "^6.0.0", 656 | "once": "^1.3.1", 657 | "simple-concat": "^1.0.0" 658 | } 659 | }, 660 | "sisteransi": { 661 | "version": "1.0.5", 662 | "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz", 663 | "integrity": "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==" 664 | }, 665 | "string_decoder": { 666 | "version": "1.3.0", 667 | "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", 668 | "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", 669 | "requires": { 670 | "safe-buffer": "~5.2.0" 671 | } 672 | }, 673 | "string-width": { 674 | "version": "4.2.3", 675 | "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", 676 | "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", 677 | "requires": { 678 | "emoji-regex": "^8.0.0", 679 | "is-fullwidth-code-point": "^3.0.0", 680 | "strip-ansi": "^6.0.1" 681 | } 682 | }, 683 | "strip-ansi": { 684 | "version": "6.0.1", 685 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", 686 | "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", 687 | "requires": { 688 | "ansi-regex": "^5.0.1" 689 | } 690 | }, 691 | "util-deprecate": { 692 | "version": "1.0.2", 693 | "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", 694 | "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==" 695 | }, 696 | "wrap-ansi": { 697 | "version": "7.0.0", 698 | "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", 699 | "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", 700 | "requires": { 701 | "ansi-styles": "^4.0.0", 702 | "string-width": "^4.1.0", 703 | "strip-ansi": "^6.0.0" 704 | } 705 | }, 706 | "wrappy": { 707 | "version": "1.0.2", 708 | "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", 709 | "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==" 710 | }, 711 | "y18n": { 712 | "version": "5.0.8", 713 | "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", 714 | "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==" 715 | }, 716 | "yargs": { 717 | "version": "17.7.2", 718 | "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", 719 | "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", 720 | "requires": { 721 | "cliui": "^8.0.1", 722 | "escalade": "^3.1.1", 723 | "get-caller-file": "^2.0.5", 724 | "require-directory": "^2.1.1", 725 | "string-width": "^4.2.3", 726 | "y18n": "^5.0.5", 727 | "yargs-parser": "^21.1.1" 728 | } 729 | }, 730 | "yargs-parser": { 731 | "version": "21.1.1", 732 | "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", 733 | "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==" 734 | } 735 | } 736 | } 737 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "gepeto", 3 | "version": "0.4.9", 4 | "description": "", 5 | "main": "index.js", 6 | "scripts": { 7 | "test": "echo \"Error: no test specified\" && exit 1" 8 | }, 9 | "bin": { 10 | "gepeto": "./index.js" 11 | }, 12 | "author": "cocktailpeanut", 13 | "license": "MIT", 14 | "dependencies": { 15 | "isomorphic-git": "^1.25.7", 16 | "kleur": "^4.1.5", 17 | "prompts": "^2.4.2", 18 | "yargs": "^17.7.2" 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /templates/1/icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pinokiocomputer/gepeto/f8342439eda1a1fc131236c886ae6f6063871ae4/templates/1/icon.png -------------------------------------------------------------------------------- /templates/1/install.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | run: [ 3 | // Edit this step to customize the git repository to use 4 | { 5 | method: "shell.run", 6 | params: { 7 | message: [ 8 | "git clone <GIT_REPOSITORY> app", 9 | ] 10 | } 11 | }, 12 | // Delete this step if your project does not use torch 13 | { 14 | method: "script.start", 15 | params: { 16 | uri: "torch.js", 17 | params: { 18 | venv: "env", // Edit this to customize the venv folder path 19 | path: "app", // Edit this to customize the path to start the shell from 20 | // xformers: true // uncomment this line if your project requires xformers 21 | // triton: true // uncomment this line if your project requires triton 22 | // sageattention: true // uncomment this line if your project requires sageattention 23 | } 24 | } 25 | }, 26 | // Edit this step with your custom install commands 27 | { 28 | method: "shell.run", 29 | params: { 30 | venv: "env", // Edit this to customize the venv folder path 31 | path: "app", // Edit this to customize the path to start the shell from 32 | message: [ 33 | "uv pip install gradio devicetorch", 34 | "uv pip install -r <INSTALL_FILE>" 35 | ] 36 | } 37 | }, 38 | ] 39 | } 40 | -------------------------------------------------------------------------------- /templates/1/link.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | run: [ 3 | { 4 | method: "fs.link", 5 | params: { 6 | venv: "app/env" 7 | } 8 | } 9 | ] 10 | } 11 | -------------------------------------------------------------------------------- /templates/1/pinokio.js: -------------------------------------------------------------------------------- 1 | const path = require('path') 2 | module.exports = { 3 | version: "3.7", 4 | title: "<TITLE>", 5 | description: "", 6 | icon: "<ICON>", 7 | menu: async (kernel, info) => { 8 | let installed = info.exists("app/env") 9 | let running = { 10 | install: info.running("install.js"), 11 | start: info.running("start.js"), 12 | update: info.running("update.js"), 13 | reset: info.running("reset.js"), 14 | link: info.running("link.js") 15 | } 16 | if (running.install) { 17 | return [{ 18 | default: true, 19 | icon: "fa-solid fa-plug", 20 | text: "Installing", 21 | href: "install.js", 22 | }] 23 | } else if (installed) { 24 | if (running.start) { 25 | let local = info.local("start.js") 26 | if (local && local.url) { 27 | return [{ 28 | default: true, 29 | icon: "fa-solid fa-rocket", 30 | text: "Open Web UI", 31 | href: local.url, 32 | }, { 33 | icon: 'fa-solid fa-terminal', 34 | text: "Terminal", 35 | href: "start.js", 36 | }] 37 | } else { 38 | return [{ 39 | default: true, 40 | icon: 'fa-solid fa-terminal', 41 | text: "Terminal", 42 | href: "start.js", 43 | }] 44 | } 45 | } else if (running.update) { 46 | return [{ 47 | default: true, 48 | icon: 'fa-solid fa-terminal', 49 | text: "Updating", 50 | href: "update.js", 51 | }] 52 | } else if (running.reset) { 53 | return [{ 54 | default: true, 55 | icon: 'fa-solid fa-terminal', 56 | text: "Resetting", 57 | href: "reset.js", 58 | }] 59 | } else if (running.link) { 60 | return [{ 61 | default: true, 62 | icon: 'fa-solid fa-terminal', 63 | text: "Deduplicating", 64 | href: "link.js", 65 | }] 66 | } else { 67 | return [{ 68 | default: true, 69 | icon: "fa-solid fa-power-off", 70 | text: "Start", 71 | href: "start.js", 72 | }, { 73 | icon: "fa-solid fa-plug", 74 | text: "Update", 75 | href: "update.js", 76 | }, { 77 | icon: "fa-solid fa-plug", 78 | text: "Install", 79 | href: "install.js", 80 | }, { 81 | icon: "fa-solid fa-file-zipper", 82 | text: "<div><strong>Save Disk Space</strong><div>Deduplicates redundant library files</div></div>", 83 | href: "link.js", 84 | }, { 85 | icon: "fa-regular fa-circle-xmark", 86 | text: "<div><strong>Reset</strong><div>Revert to pre-install state</div></div>", 87 | href: "reset.js", 88 | confirm: "Are you sure you wish to reset the app?" 89 | 90 | }] 91 | } 92 | } else { 93 | return [{ 94 | default: true, 95 | icon: "fa-solid fa-plug", 96 | text: "Install", 97 | href: "install.js", 98 | }] 99 | } 100 | } 101 | } 102 | -------------------------------------------------------------------------------- /templates/1/reset.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | run: [{ 3 | method: "fs.rm", 4 | params: { 5 | path: "app" 6 | } 7 | }] 8 | } 9 | -------------------------------------------------------------------------------- /templates/1/start.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | daemon: true, 3 | run: [ 4 | { 5 | method: "shell.run", 6 | params: { 7 | venv: "env", // Edit this to customize the venv folder path 8 | env: { }, // Edit this to customize environment variables (see documentation) 9 | path: "app", // Edit this to customize the path to start the shell from 10 | message: [ 11 | "python <START_FILE>", // Edit with your custom commands 12 | ], 13 | on: [{ 14 | // The regular expression pattern to monitor. 15 | // When this pattern occurs in the shell terminal, the shell will return, 16 | // and the script will go onto the next step. 17 | "event": "/http:\/\/\\S+/", 18 | 19 | // "done": true will move to the next step while keeping the shell alive. 20 | // "kill": true will move to the next step after killing the shell. 21 | "done": true 22 | }] 23 | } 24 | }, 25 | { 26 | // This step sets the local variable 'url'. 27 | // This local variable will be used in pinokio.js to display the "Open WebUI" tab when the value is set. 28 | method: "local.set", 29 | params: { 30 | // the input.event is the regular expression match object from the previous step 31 | url: "{{input.event[0]}}" 32 | } 33 | } 34 | ] 35 | } 36 | -------------------------------------------------------------------------------- /templates/1/torch.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | run: [ 3 | // windows nvidia 50 series 4 | { 5 | "when": "{{platform === 'win32' && gpu === 'nvidia' && kernel.gpus && kernel.gpus.find(x => / 50.+/.test(x.model))}}", 6 | "method": "shell.run", 7 | "params": { 8 | "venv": "{{args && args.venv ? args.venv : null}}", 9 | "path": "{{args && args.path ? args.path : '.'}}", 10 | "message": [ 11 | 'uv pip install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu128', 12 | "{{args && args.triton ? 'uv pip install -U --pre triton-windows' : ''}}", 13 | "{{args && args.sageattention ? 'uv pip install https://github.com/woct0rdho/SageAttention/releases/download/v2.1.1-windows/sageattention-2.1.1+cu128torch2.7.0-cp310-cp310-win_amd64.whl' : ''}}", 14 | ] 15 | }, 16 | "next": null 17 | }, 18 | // windows nvidia 19 | { 20 | "when": "{{platform === 'win32' && gpu === 'nvidia'}}", 21 | "method": "shell.run", 22 | "params": { 23 | "venv": "{{args && args.venv ? args.venv : null}}", 24 | "path": "{{args && args.path ? args.path : '.'}}", 25 | "message": [ 26 | "uv pip install torch torchvision torchaudio {{args && args.xformers ? 'xformers' : ''}} --index-url https://download.pytorch.org/whl/cu124", 27 | "{{args && args.triton ? 'uv pip install -U triton-windows --force-reinstall' : ''}}", 28 | "{{args && args.sageattention ? 'uv pip install https://github.com/deepbeepmeep/SageAttention/raw/refs/heads/main/releases/sageattention-2.1.0-cp310-cp310-win_amd64.whl --force-reinstall' : ''}}" 29 | ] 30 | }, 31 | "next": null 32 | }, 33 | // windows amd 34 | { 35 | "when": "{{platform === 'win32' && gpu === 'amd'}}", 36 | "method": "shell.run", 37 | "params": { 38 | "venv": "{{args && args.venv ? args.venv : null}}", 39 | "path": "{{args && args.path ? args.path : '.'}}", 40 | "message": "uv pip install torch-directml torchaudio torchvision numpy==1.26.4" 41 | }, 42 | "next": null 43 | }, 44 | // windows cpu 45 | { 46 | "when": "{{platform === 'win32' && (gpu !== 'nvidia' && gpu !== 'amd')}}", 47 | "method": "shell.run", 48 | "params": { 49 | "venv": "{{args && args.venv ? args.venv : null}}", 50 | "path": "{{args && args.path ? args.path : '.'}}", 51 | "message": "uv pip install torch torchvision torchaudio numpy==1.26.4" 52 | }, 53 | "next": null 54 | }, 55 | // mac 56 | { 57 | "when": "{{platform === 'darwin'}}", 58 | "method": "shell.run", 59 | "params": { 60 | "venv": "{{args && args.venv ? args.venv : null}}", 61 | "path": "{{args && args.path ? args.path : '.'}}", 62 | "message": "uv pip install torch torchvision torchaudio" 63 | }, 64 | "next": null 65 | }, 66 | // linux nvidia 50 series 67 | { 68 | "when": "{{platform === 'linux' && gpu === 'nvidia' && kernel.gpus && kernel.gpus.find(x => / 50.+/.test(x.model))}}", 69 | "method": "shell.run", 70 | "params": { 71 | "venv": "{{args && args.venv ? args.venv : null}}", 72 | "path": "{{args && args.path ? args.path : '.'}}", 73 | "message": [ 74 | 'uv pip install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu128', 75 | "{{args && args.sageattention ? 'uv pip install git+https://github.com/thu-ml/SageAttention.git' : ''}}" 76 | ] 77 | }, 78 | "next": null 79 | }, 80 | // linux nvidia 81 | { 82 | "when": "{{platform === 'linux' && gpu === 'nvidia'}}", 83 | "method": "shell.run", 84 | "params": { 85 | "venv": "{{args && args.venv ? args.venv : null}}", 86 | "path": "{{args && args.path ? args.path : '.'}}", 87 | "message": [ 88 | "uv pip install torch torchvision torchaudio {{args && args.xformers ? 'xformers' : ''}} --index-url https://download.pytorch.org/whl/cu124", 89 | "{{args && args.sageattention ? 'uv pip install git+https://github.com/thu-ml/SageAttention.git' : ''}}" 90 | ] 91 | }, 92 | "next": null 93 | }, 94 | // linux rocm (amd) 95 | { 96 | "when": "{{platform === 'linux' && gpu === 'amd'}}", 97 | "method": "shell.run", 98 | "params": { 99 | "venv": "{{args && args.venv ? args.venv : null}}", 100 | "path": "{{args && args.path ? args.path : '.'}}", 101 | "message": "uv pip install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/rocm6.2.4" 102 | }, 103 | "next": null 104 | }, 105 | // linux cpu 106 | { 107 | "when": "{{platform === 'linux' && (gpu !== 'amd' && gpu !=='nvidia')}}", 108 | "method": "shell.run", 109 | "params": { 110 | "venv": "{{args && args.venv ? args.venv : null}}", 111 | "path": "{{args && args.path ? args.path : '.'}}", 112 | "message": "uv pip install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cpu" 113 | }, 114 | "next": null 115 | } 116 | ] 117 | } 118 | -------------------------------------------------------------------------------- /templates/1/update.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | run: [{ 3 | method: "shell.run", 4 | params: { 5 | message: "git pull" 6 | } 7 | }, { 8 | method: "shell.run", 9 | params: { 10 | path: "app", 11 | message: "git pull" 12 | } 13 | }] 14 | } 15 | -------------------------------------------------------------------------------- /templates/2/app.py: -------------------------------------------------------------------------------- 1 | import gradio as gr 2 | import torch 3 | from diffusers import DiffusionPipeline 4 | import devicetorch 5 | device = devicetorch.get(torch) 6 | pipe = DiffusionPipeline.from_pretrained("stabilityai/sdxl-turbo").to(device) 7 | def generate_image(prompt): 8 | return pipe( 9 | prompt, 10 | num_inference_steps=2, 11 | strength=0.5, 12 | guidance_scale=0.0 13 | ).images[0] 14 | app = gr.Interface(fn=generate_image, inputs="text", outputs="image") 15 | app.launch() 16 | -------------------------------------------------------------------------------- /templates/2/icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pinokiocomputer/gepeto/f8342439eda1a1fc131236c886ae6f6063871ae4/templates/2/icon.png -------------------------------------------------------------------------------- /templates/2/install.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | run: [ 3 | // Delete this step if your project does not use torch 4 | { 5 | method: "script.start", 6 | params: { 7 | uri: "torch.js", 8 | params: { 9 | venv: "env", // Edit this to customize the venv folder path 10 | // xformers: true // uncomment this line if your project requires xformers 11 | // triton: true // uncomment this line if your project requires triton 12 | // sageattention: true // uncomment this line if your project requires sageattention 13 | } 14 | } 15 | }, 16 | // Edit this step with your custom install commands 17 | { 18 | method: "shell.run", 19 | params: { 20 | venv: "env", // Edit this to customize the venv folder path 21 | message: [ 22 | "uv pip install -r <INSTALL_FILE>" 23 | ], 24 | } 25 | }, 26 | ] 27 | } 28 | -------------------------------------------------------------------------------- /templates/2/link.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | run: [ 3 | { 4 | method: "fs.link", 5 | params: { 6 | venv: "env" 7 | } 8 | } 9 | ] 10 | } 11 | -------------------------------------------------------------------------------- /templates/2/pinokio.js: -------------------------------------------------------------------------------- 1 | const path = require('path') 2 | module.exports = { 3 | version: "3.7", 4 | title: "<TITLE>", 5 | description: "", 6 | icon: "<ICON>", 7 | menu: async (kernel, info) => { 8 | let installed = info.exists("env") 9 | let running = { 10 | install: info.running("install.js"), 11 | start: info.running("start.js"), 12 | update: info.running("update.js"), 13 | reset: info.running("reset.js"), 14 | link: info.running("link.js") 15 | } 16 | if (running.install) { 17 | return [{ 18 | default: true, 19 | icon: "fa-solid fa-plug", 20 | text: "Installing", 21 | href: "install.js", 22 | }] 23 | } else if (installed) { 24 | if (running.start) { 25 | let local = info.local("start.js") 26 | if (local && local.url) { 27 | return [{ 28 | default: true, 29 | icon: "fa-solid fa-rocket", 30 | text: "Open Web UI", 31 | href: local.url, 32 | }, { 33 | icon: 'fa-solid fa-terminal', 34 | text: "Terminal", 35 | href: "start.js", 36 | }] 37 | } else { 38 | return [{ 39 | default: true, 40 | icon: 'fa-solid fa-terminal', 41 | text: "Terminal", 42 | href: "start.js", 43 | }] 44 | } 45 | } else if (running.update) { 46 | return [{ 47 | default: true, 48 | icon: 'fa-solid fa-terminal', 49 | text: "Updating", 50 | href: "update.js", 51 | }] 52 | } else if (running.reset) { 53 | return [{ 54 | default: true, 55 | icon: 'fa-solid fa-terminal', 56 | text: "Resetting", 57 | href: "reset.js", 58 | }] 59 | } else if (running.link) { 60 | return [{ 61 | default: true, 62 | icon: 'fa-solid fa-terminal', 63 | text: "Deduplicating", 64 | href: "link.js", 65 | }] 66 | } else { 67 | return [{ 68 | default: true, 69 | icon: "fa-solid fa-power-off", 70 | text: "Start", 71 | href: "start.js", 72 | }, { 73 | icon: "fa-solid fa-plug", 74 | text: "Update", 75 | href: "update.js", 76 | }, { 77 | icon: "fa-solid fa-plug", 78 | text: "Install", 79 | href: "install.js", 80 | }, { 81 | icon: "fa-solid fa-file-zipper", 82 | text: "<div><strong>Save Disk Space</strong><div>Deduplicates redundant library files</div></div>", 83 | href: "link.js", 84 | }, { 85 | icon: "fa-regular fa-circle-xmark", 86 | text: "<div><strong>Reset</strong><div>Revert to pre-install state</div></div>", 87 | href: "reset.js", 88 | confirm: "Are you sure you wish to reset the app?" 89 | 90 | }] 91 | } 92 | } else { 93 | return [{ 94 | default: true, 95 | icon: "fa-solid fa-plug", 96 | text: "Install", 97 | href: "install.js", 98 | }] 99 | } 100 | } 101 | } 102 | -------------------------------------------------------------------------------- /templates/2/requirements.txt: -------------------------------------------------------------------------------- 1 | transformers 2 | accelerate 3 | diffusers 4 | gradio 5 | devicetorch 6 | -------------------------------------------------------------------------------- /templates/2/reset.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | run: [{ 3 | method: "fs.rm", 4 | params: { 5 | path: "env" 6 | } 7 | }] 8 | } 9 | -------------------------------------------------------------------------------- /templates/2/start.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | daemon: true, 3 | run: [ 4 | // Edit this step to customize your app's launch command 5 | { 6 | method: "shell.run", 7 | params: { 8 | venv: "env", // Edit this to customize the venv folder path 9 | env: { }, // Edit this to customize environment variables (see documentation) 10 | message: [ 11 | "python <START_FILE>", // Edit with your custom commands 12 | ], 13 | on: [{ 14 | // The regular expression pattern to monitor. 15 | // When this pattern occurs in the shell terminal, the shell will return, 16 | // and the script will go onto the next step. 17 | "event": "/http:\/\/\\S+/", 18 | 19 | // "done": true will move to the next step while keeping the shell alive. 20 | // "kill": true will move to the next step after killing the shell. 21 | "done": true 22 | }] 23 | } 24 | }, 25 | // This step sets the local variable 'url'. 26 | // This local variable will be used in pinokio.js to display the "Open WebUI" tab when the value is set. 27 | { 28 | method: "local.set", 29 | params: { 30 | // the input.event is the regular expression match object from the previous step 31 | url: "{{input.event[0]}}" 32 | } 33 | }, 34 | ] 35 | } 36 | 37 | -------------------------------------------------------------------------------- /templates/2/torch.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | run: [ 3 | // windows nvidia 50 series 4 | { 5 | "when": "{{platform === 'win32' && gpu === 'nvidia' && kernel.gpus && kernel.gpus.find(x => / 50.+/.test(x.model))}}", 6 | "method": "shell.run", 7 | "params": { 8 | "venv": "{{args && args.venv ? args.venv : null}}", 9 | "path": "{{args && args.path ? args.path : '.'}}", 10 | "message": [ 11 | 'uv pip install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu128', 12 | "{{args && args.triton ? 'uv pip install -U --pre triton-windows' : ''}}", 13 | "{{args && args.sageattention ? 'uv pip install https://github.com/woct0rdho/SageAttention/releases/download/v2.1.1-windows/sageattention-2.1.1+cu128torch2.7.0-cp310-cp310-win_amd64.whl' : ''}}", 14 | ] 15 | }, 16 | "next": null 17 | }, 18 | // windows nvidia 19 | { 20 | "when": "{{platform === 'win32' && gpu === 'nvidia'}}", 21 | "method": "shell.run", 22 | "params": { 23 | "venv": "{{args && args.venv ? args.venv : null}}", 24 | "path": "{{args && args.path ? args.path : '.'}}", 25 | "message": [ 26 | "uv pip install torch torchvision torchaudio {{args && args.xformers ? 'xformers' : ''}} --index-url https://download.pytorch.org/whl/cu124", 27 | "{{args && args.triton ? 'uv pip install -U triton-windows --force-reinstall' : ''}}", 28 | "{{args && args.sageattention ? 'uv pip install https://github.com/deepbeepmeep/SageAttention/raw/refs/heads/main/releases/sageattention-2.1.0-cp310-cp310-win_amd64.whl --force-reinstall' : ''}}" 29 | ] 30 | }, 31 | "next": null 32 | }, 33 | // windows amd 34 | { 35 | "when": "{{platform === 'win32' && gpu === 'amd'}}", 36 | "method": "shell.run", 37 | "params": { 38 | "venv": "{{args && args.venv ? args.venv : null}}", 39 | "path": "{{args && args.path ? args.path : '.'}}", 40 | "message": "uv pip install torch-directml torchaudio torchvision numpy==1.26.4" 41 | }, 42 | "next": null 43 | }, 44 | // windows cpu 45 | { 46 | "when": "{{platform === 'win32' && (gpu !== 'nvidia' && gpu !== 'amd')}}", 47 | "method": "shell.run", 48 | "params": { 49 | "venv": "{{args && args.venv ? args.venv : null}}", 50 | "path": "{{args && args.path ? args.path : '.'}}", 51 | "message": "uv pip install torch torchvision torchaudio numpy==1.26.4" 52 | }, 53 | "next": null 54 | }, 55 | // mac 56 | { 57 | "when": "{{platform === 'darwin'}}", 58 | "method": "shell.run", 59 | "params": { 60 | "venv": "{{args && args.venv ? args.venv : null}}", 61 | "path": "{{args && args.path ? args.path : '.'}}", 62 | "message": "uv pip install torch torchvision torchaudio" 63 | }, 64 | "next": null 65 | }, 66 | // linux nvidia 50 series 67 | { 68 | "when": "{{platform === 'linux' && gpu === 'nvidia' && kernel.gpus && kernel.gpus.find(x => / 50.+/.test(x.model))}}", 69 | "method": "shell.run", 70 | "params": { 71 | "venv": "{{args && args.venv ? args.venv : null}}", 72 | "path": "{{args && args.path ? args.path : '.'}}", 73 | "message": [ 74 | 'uv pip install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu128', 75 | "{{args && args.sageattention ? 'uv pip install git+https://github.com/thu-ml/SageAttention.git' : ''}}" 76 | ] 77 | }, 78 | "next": null 79 | }, 80 | // linux nvidia 81 | { 82 | "when": "{{platform === 'linux' && gpu === 'nvidia'}}", 83 | "method": "shell.run", 84 | "params": { 85 | "venv": "{{args && args.venv ? args.venv : null}}", 86 | "path": "{{args && args.path ? args.path : '.'}}", 87 | "message": [ 88 | "uv pip install torch torchvision torchaudio {{args && args.xformers ? 'xformers' : ''}} --index-url https://download.pytorch.org/whl/cu124", 89 | "{{args && args.sageattention ? 'uv pip install git+https://github.com/thu-ml/SageAttention.git' : ''}}" 90 | ] 91 | }, 92 | "next": null 93 | }, 94 | // linux rocm (amd) 95 | { 96 | "when": "{{platform === 'linux' && gpu === 'amd'}}", 97 | "method": "shell.run", 98 | "params": { 99 | "venv": "{{args && args.venv ? args.venv : null}}", 100 | "path": "{{args && args.path ? args.path : '.'}}", 101 | "message": "uv pip install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/rocm6.2.4" 102 | }, 103 | "next": null 104 | }, 105 | // linux cpu 106 | { 107 | "when": "{{platform === 'linux' && (gpu !== 'amd' && gpu !=='nvidia')}}", 108 | "method": "shell.run", 109 | "params": { 110 | "venv": "{{args && args.venv ? args.venv : null}}", 111 | "path": "{{args && args.path ? args.path : '.'}}", 112 | "message": "uv pip install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cpu" 113 | }, 114 | "next": null 115 | } 116 | ] 117 | } 118 | -------------------------------------------------------------------------------- /templates/2/update.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | run: [{ 3 | method: "shell.run", 4 | params: { 5 | message: "git pull" 6 | } 7 | }] 8 | } 9 | --------------------------------------------------------------------------------