shyp 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (123) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +218 -0
  3. package/dist/cli.d.ts +3 -0
  4. package/dist/cli.d.ts.map +1 -0
  5. package/dist/cli.js +64 -0
  6. package/dist/cli.js.map +1 -0
  7. package/dist/commands/add.d.ts +9 -0
  8. package/dist/commands/add.d.ts.map +1 -0
  9. package/dist/commands/add.js +69 -0
  10. package/dist/commands/add.js.map +1 -0
  11. package/dist/commands/deploy.d.ts +4 -0
  12. package/dist/commands/deploy.d.ts.map +1 -0
  13. package/dist/commands/deploy.js +104 -0
  14. package/dist/commands/deploy.js.map +1 -0
  15. package/dist/commands/doctor.d.ts +2 -0
  16. package/dist/commands/doctor.d.ts.map +1 -0
  17. package/dist/commands/doctor.js +97 -0
  18. package/dist/commands/doctor.js.map +1 -0
  19. package/dist/commands/index.d.ts +10 -0
  20. package/dist/commands/index.d.ts.map +1 -0
  21. package/dist/commands/index.js +10 -0
  22. package/dist/commands/index.js.map +1 -0
  23. package/dist/commands/init.d.ts +4 -0
  24. package/dist/commands/init.d.ts.map +1 -0
  25. package/dist/commands/init.js +150 -0
  26. package/dist/commands/init.js.map +1 -0
  27. package/dist/commands/logs.d.ts +5 -0
  28. package/dist/commands/logs.d.ts.map +1 -0
  29. package/dist/commands/logs.js +56 -0
  30. package/dist/commands/logs.js.map +1 -0
  31. package/dist/commands/ports.d.ts +2 -0
  32. package/dist/commands/ports.d.ts.map +1 -0
  33. package/dist/commands/ports.js +73 -0
  34. package/dist/commands/ports.js.map +1 -0
  35. package/dist/commands/start.d.ts +2 -0
  36. package/dist/commands/start.d.ts.map +1 -0
  37. package/dist/commands/start.js +11 -0
  38. package/dist/commands/start.js.map +1 -0
  39. package/dist/commands/status.d.ts +2 -0
  40. package/dist/commands/status.d.ts.map +1 -0
  41. package/dist/commands/status.js +73 -0
  42. package/dist/commands/status.js.map +1 -0
  43. package/dist/commands/sync.d.ts +4 -0
  44. package/dist/commands/sync.d.ts.map +1 -0
  45. package/dist/commands/sync.js +95 -0
  46. package/dist/commands/sync.js.map +1 -0
  47. package/dist/index.d.ts +4 -0
  48. package/dist/index.d.ts.map +1 -0
  49. package/dist/index.js +6 -0
  50. package/dist/index.js.map +1 -0
  51. package/dist/lib/config.d.ts +10 -0
  52. package/dist/lib/config.d.ts.map +1 -0
  53. package/dist/lib/config.js +116 -0
  54. package/dist/lib/config.js.map +1 -0
  55. package/dist/lib/deploy.d.ts +12 -0
  56. package/dist/lib/deploy.d.ts.map +1 -0
  57. package/dist/lib/deploy.js +288 -0
  58. package/dist/lib/deploy.js.map +1 -0
  59. package/dist/lib/git.d.ts +24 -0
  60. package/dist/lib/git.d.ts.map +1 -0
  61. package/dist/lib/git.js +82 -0
  62. package/dist/lib/git.js.map +1 -0
  63. package/dist/lib/index.d.ts +7 -0
  64. package/dist/lib/index.d.ts.map +1 -0
  65. package/dist/lib/index.js +7 -0
  66. package/dist/lib/index.js.map +1 -0
  67. package/dist/lib/nginx.d.ts +16 -0
  68. package/dist/lib/nginx.d.ts.map +1 -0
  69. package/dist/lib/nginx.js +312 -0
  70. package/dist/lib/nginx.js.map +1 -0
  71. package/dist/lib/pm2.d.ts +25 -0
  72. package/dist/lib/pm2.d.ts.map +1 -0
  73. package/dist/lib/pm2.js +106 -0
  74. package/dist/lib/pm2.js.map +1 -0
  75. package/dist/lib/state.d.ts +12 -0
  76. package/dist/lib/state.d.ts.map +1 -0
  77. package/dist/lib/state.js +112 -0
  78. package/dist/lib/state.js.map +1 -0
  79. package/dist/schemas/app.d.ts +272 -0
  80. package/dist/schemas/app.d.ts.map +1 -0
  81. package/dist/schemas/app.js +79 -0
  82. package/dist/schemas/app.js.map +1 -0
  83. package/dist/schemas/config.d.ts +508 -0
  84. package/dist/schemas/config.d.ts.map +1 -0
  85. package/dist/schemas/config.js +62 -0
  86. package/dist/schemas/config.js.map +1 -0
  87. package/dist/schemas/engine.d.ts +772 -0
  88. package/dist/schemas/engine.d.ts.map +1 -0
  89. package/dist/schemas/engine.js +93 -0
  90. package/dist/schemas/engine.js.map +1 -0
  91. package/dist/schemas/index.d.ts +5 -0
  92. package/dist/schemas/index.d.ts.map +1 -0
  93. package/dist/schemas/index.js +5 -0
  94. package/dist/schemas/index.js.map +1 -0
  95. package/dist/schemas/state.d.ts +416 -0
  96. package/dist/schemas/state.d.ts.map +1 -0
  97. package/dist/schemas/state.js +56 -0
  98. package/dist/schemas/state.js.map +1 -0
  99. package/dist/server/index.d.ts +2 -0
  100. package/dist/server/index.d.ts.map +1 -0
  101. package/dist/server/index.js +51 -0
  102. package/dist/server/index.js.map +1 -0
  103. package/dist/server/webhook.d.ts +6 -0
  104. package/dist/server/webhook.d.ts.map +1 -0
  105. package/dist/server/webhook.js +163 -0
  106. package/dist/server/webhook.js.map +1 -0
  107. package/dist/utils/index.d.ts +4 -0
  108. package/dist/utils/index.d.ts.map +1 -0
  109. package/dist/utils/index.js +4 -0
  110. package/dist/utils/index.js.map +1 -0
  111. package/dist/utils/logger.d.ts +17 -0
  112. package/dist/utils/logger.d.ts.map +1 -0
  113. package/dist/utils/logger.js +25 -0
  114. package/dist/utils/logger.js.map +1 -0
  115. package/dist/utils/paths.d.ts +37 -0
  116. package/dist/utils/paths.d.ts.map +1 -0
  117. package/dist/utils/paths.js +35 -0
  118. package/dist/utils/paths.js.map +1 -0
  119. package/dist/utils/spinner.d.ts +4 -0
  120. package/dist/utils/spinner.d.ts.map +1 -0
  121. package/dist/utils/spinner.js +20 -0
  122. package/dist/utils/spinner.js.map +1 -0
  123. package/package.json +58 -0
package/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2025 shypd
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.
package/README.md ADDED
@@ -0,0 +1,218 @@
1
+ <p align="center">
2
+ <img src="https://shyp.now/assets/shyp.png" alt="Shyp" width="120" height="120">
3
+ </p>
4
+
5
+ <h1 align="center">Shyp</h1>
6
+
7
+ <p align="center">
8
+ <strong>Zero Friction Deployment</strong>
9
+ </p>
10
+
11
+ <p align="center">
12
+ From code to production. Shyp now.<br>
13
+ AI-native deployment for Node.js apps on Linux VPS.
14
+ </p>
15
+
16
+ <p align="center">
17
+ <a href="https://www.npmjs.com/package/shyp"><img src="https://img.shields.io/npm/v/shyp.svg?style=flat-square" alt="npm version"></a>
18
+ <a href="https://www.npmjs.com/package/shyp"><img src="https://img.shields.io/npm/dm/shyp.svg?style=flat-square" alt="npm downloads"></a>
19
+ <a href="https://github.com/shypd/shyp/blob/main/LICENSE"><img src="https://img.shields.io/github/license/shypd/shyp?style=flat-square" alt="license"></a>
20
+ <img src="https://img.shields.io/badge/platform-linux-blue?style=flat-square" alt="platform">
21
+ </p>
22
+
23
+ <p align="center">
24
+ <a href="https://shyp.now">Website</a> •
25
+ <a href="#installation">Installation</a> •
26
+ <a href="#quick-start">Quick Start</a> •
27
+ <a href="#commands">Commands</a>
28
+ </p>
29
+
30
+ ---
31
+
32
+ ## Requirements
33
+
34
+ - **Linux/Unix** (Debian, Ubuntu, etc.)
35
+ - Node.js 20+
36
+ - PM2 (auto-installed)
37
+ - Nginx (optional, for domains)
38
+ - Git
39
+
40
+ > ⚠️ **Windows is not supported.** Shyp is designed for Linux VPS deployment.
41
+
42
+ ## Installation
43
+
44
+ ```bash
45
+ npm install -g shyp
46
+ ```
47
+
48
+ ## Quick Start
49
+
50
+ ```bash
51
+ # Initialize shyp (checks/installs prerequisites)
52
+ shyp init
53
+
54
+ # Add an app
55
+ shyp add my-app --repo git@github.com:you/my-app.git --domain my-app.com
56
+
57
+ # Apply configuration (generates nginx configs)
58
+ shyp sync
59
+
60
+ # Deploy
61
+ shyp deploy my-app
62
+
63
+ # Start webhook server for auto-deploys
64
+ shyp start
65
+ ```
66
+
67
+ ## Why Shyp
68
+
69
+ Modern deployment tools are either too simplistic (manual PM2 + nginx) or too complex (Kubernetes, Docker Swarm).
70
+
71
+ Shyp is the sweet spot:
72
+ - **File-based config** - YAML files an AI can read and write
73
+ - **No Docker required** - Direct PM2 + Nginx, no container overhead
74
+ - **Webhook auto-deploy** - Push to GitHub, deploy automatically
75
+ - **Multi-app management** - One server, many apps, one tool
76
+
77
+ ```bash
78
+ $ shyp status
79
+
80
+ Apps
81
+ ──────────────────────────────────────────────────────────────────────
82
+ NAME STATUS PORT MEMORY UPTIME DOMAIN
83
+ my-app ● online 3001 156MB 2d 4h my-app.com
84
+ api-server ● online 3002 89MB 5d 12h api.example.com
85
+ landing-page ● online 3003 45MB 12d 3h example.com
86
+ ```
87
+
88
+ ## Commands
89
+
90
+ | Command | Description |
91
+ |---------|-------------|
92
+ | `shyp init` | Initialize shyp, install prerequisites |
93
+ | `shyp status` | Show status of all apps |
94
+ | `shyp deploy <name>` | Deploy an app |
95
+ | `shyp add <name>` | Add a new app configuration |
96
+ | `shyp sync` | Apply configs to PM2 + Nginx |
97
+ | `shyp ports` | Show port allocations |
98
+ | `shyp logs <name>` | View deployment logs |
99
+ | `shyp doctor` | Check system health |
100
+ | `shyp start` | Start webhook server |
101
+
102
+ ## Configuration
103
+
104
+ Shyp uses YAML files in `/etc/shyp/`:
105
+
106
+ ```
107
+ /etc/shyp/
108
+ ├── config.yaml # Global configuration
109
+ ├── apps/ # App configurations
110
+ │ ├── my-app.yaml
111
+ │ └── ...
112
+ ├── engines/ # Engine configurations (modular apps)
113
+ └── state/ # Runtime state (ports, deployments)
114
+ ```
115
+
116
+ ### App Configuration
117
+
118
+ ```yaml
119
+ name: my-app
120
+ repo: git@github.com:you/my-app.git
121
+ branch: main
122
+ path: /var/www/my-app
123
+ type: nextjs
124
+ domain: my-app.com
125
+
126
+ build:
127
+ command: npm ci && npm run build
128
+
129
+ start:
130
+ command: npm start
131
+
132
+ env:
133
+ NODE_ENV: production
134
+
135
+ resources:
136
+ memory: 512M
137
+ instances: 1
138
+ ```
139
+
140
+ ### Engine Configuration (Modular Apps)
141
+
142
+ For apps with multiple modules (like game engines):
143
+
144
+ ```yaml
145
+ type: engine
146
+ name: my-engine
147
+
148
+ server:
149
+ repo: git@github.com:you/my-engine.git
150
+ path: /var/www/my-engine
151
+ pm2:
152
+ name: my-engine
153
+ memory: 2G
154
+
155
+ modules:
156
+ game-frontend:
157
+ domain: game.example.com
158
+ port: 8000
159
+ deploy:
160
+ mode: script
161
+ script: deploy.sh
162
+ ```
163
+
164
+ ## Webhook Auto-Deploy
165
+
166
+ Set up GitHub webhooks to auto-deploy on push:
167
+
168
+ 1. Go to your repo → Settings → Webhooks → Add webhook
169
+ 2. **Payload URL:** `http://your-server:9000/`
170
+ 3. **Content type:** `application/json`
171
+ 4. **Secret:** Your `SHYP_WEBHOOK_SECRET`
172
+ 5. **Events:** Just the push event
173
+
174
+ Set the secret on your server:
175
+
176
+ ```bash
177
+ export SHYP_WEBHOOK_SECRET=your-secret-here
178
+ ```
179
+
180
+ Start the webhook server:
181
+
182
+ ```bash
183
+ shyp start
184
+ ```
185
+
186
+ ## AI-Native Design
187
+
188
+ Shyp is designed for AI coding assistants like Claude Code:
189
+
190
+ - **File-based** - All config in readable YAML files
191
+ - **Predictable paths** - `/etc/shyp/apps/*.yaml`
192
+ - **Idempotent** - Run `shyp sync` safely anytime
193
+ - **Clear output** - Structured status for easy parsing
194
+
195
+ ```bash
196
+ # AI can easily add a new app
197
+ cat > /etc/shyp/apps/new-project.yaml << 'EOF'
198
+ name: new-project
199
+ repo: git@github.com:you/new-project.git
200
+ path: /var/www/new-project
201
+ type: nextjs
202
+ domain: new-project.com
203
+ EOF
204
+
205
+ shyp sync
206
+ shyp deploy new-project
207
+ ```
208
+
209
+ ## Links
210
+
211
+ - **Website:** [shyp.now](https://shyp.now)
212
+ - **GitHub:** [github.com/shypd/shyp](https://github.com/shypd/shyp)
213
+ - **Issues:** [github.com/shypd/shyp/issues](https://github.com/shypd/shyp/issues)
214
+ - **npm:** [npmjs.com/package/shyp](https://www.npmjs.com/package/shyp)
215
+
216
+ ## License
217
+
218
+ MIT
package/dist/cli.d.ts ADDED
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env node
2
+ export {};
3
+ //# sourceMappingURL=cli.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":""}
package/dist/cli.js ADDED
@@ -0,0 +1,64 @@
1
+ #!/usr/bin/env node
2
+ import { program } from 'commander';
3
+ import { statusCommand, deployCommand, portsCommand, doctorCommand, initCommand, startCommand, syncCommand, logsCommand, addCommand, } from './commands/index.js';
4
+ program
5
+ .name('shyp')
6
+ .description('Zero friction deployment for Node.js apps')
7
+ .version('0.1.0');
8
+ // shyp status
9
+ program
10
+ .command('status')
11
+ .description('Show status of all apps and engines')
12
+ .action(statusCommand);
13
+ // shyp deploy <name>
14
+ program
15
+ .command('deploy <name>')
16
+ .description('Deploy an app or engine')
17
+ .option('-m, --module <module>', 'Deploy a specific engine module')
18
+ .action(deployCommand);
19
+ // shyp ports
20
+ program
21
+ .command('ports')
22
+ .description('Show port allocations')
23
+ .action(portsCommand);
24
+ // shyp doctor
25
+ program
26
+ .command('doctor')
27
+ .description('Check system health and prerequisites')
28
+ .action(doctorCommand);
29
+ // shyp init
30
+ program
31
+ .command('init')
32
+ .description('Initialize Shyp on this server')
33
+ .option('-f, --force', 'Reinitialize even if already initialized')
34
+ .action(initCommand);
35
+ // shyp start
36
+ program
37
+ .command('start')
38
+ .description('Start the webhook server')
39
+ .action(startCommand);
40
+ // shyp sync
41
+ program
42
+ .command('sync')
43
+ .description('Apply all configs to PM2 and Nginx')
44
+ .option('-n, --dry-run', 'Show what would be done without making changes')
45
+ .action(syncCommand);
46
+ // shyp logs <name>
47
+ program
48
+ .command('logs <name>')
49
+ .description('View deployment logs for an app')
50
+ .option('-f, --follow', 'Follow log output')
51
+ .option('-n, --lines <number>', 'Number of lines to show', '50')
52
+ .action((name, options) => logsCommand(name, { ...options, lines: parseInt(options.lines) }));
53
+ // shyp add <name>
54
+ program
55
+ .command('add <name>')
56
+ .description('Add a new app configuration')
57
+ .option('-r, --repo <url>', 'Git repository URL')
58
+ .option('-d, --domain <domain>', 'Domain name')
59
+ .option('-t, --type <type>', 'App type (nextjs, node, static, script)')
60
+ .option('-p, --port <port>', 'Port number')
61
+ .action(addCommand);
62
+ // Parse arguments
63
+ program.parse();
64
+ //# sourceMappingURL=cli.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";AAEA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AACnC,OAAO,EACL,aAAa,EACb,aAAa,EACb,YAAY,EACZ,aAAa,EACb,WAAW,EACX,YAAY,EACZ,WAAW,EACX,WAAW,EACX,UAAU,GACX,MAAM,qBAAqB,CAAA;AAE5B,OAAO;KACJ,IAAI,CAAC,MAAM,CAAC;KACZ,WAAW,CAAC,2CAA2C,CAAC;KACxD,OAAO,CAAC,OAAO,CAAC,CAAA;AAEnB,cAAc;AACd,OAAO;KACJ,OAAO,CAAC,QAAQ,CAAC;KACjB,WAAW,CAAC,qCAAqC,CAAC;KAClD,MAAM,CAAC,aAAa,CAAC,CAAA;AAExB,qBAAqB;AACrB,OAAO;KACJ,OAAO,CAAC,eAAe,CAAC;KACxB,WAAW,CAAC,yBAAyB,CAAC;KACtC,MAAM,CAAC,uBAAuB,EAAE,iCAAiC,CAAC;KAClE,MAAM,CAAC,aAAa,CAAC,CAAA;AAExB,aAAa;AACb,OAAO;KACJ,OAAO,CAAC,OAAO,CAAC;KAChB,WAAW,CAAC,uBAAuB,CAAC;KACpC,MAAM,CAAC,YAAY,CAAC,CAAA;AAEvB,cAAc;AACd,OAAO;KACJ,OAAO,CAAC,QAAQ,CAAC;KACjB,WAAW,CAAC,uCAAuC,CAAC;KACpD,MAAM,CAAC,aAAa,CAAC,CAAA;AAExB,YAAY;AACZ,OAAO;KACJ,OAAO,CAAC,MAAM,CAAC;KACf,WAAW,CAAC,gCAAgC,CAAC;KAC7C,MAAM,CAAC,aAAa,EAAE,0CAA0C,CAAC;KACjE,MAAM,CAAC,WAAW,CAAC,CAAA;AAEtB,aAAa;AACb,OAAO;KACJ,OAAO,CAAC,OAAO,CAAC;KAChB,WAAW,CAAC,0BAA0B,CAAC;KACvC,MAAM,CAAC,YAAY,CAAC,CAAA;AAEvB,YAAY;AACZ,OAAO;KACJ,OAAO,CAAC,MAAM,CAAC;KACf,WAAW,CAAC,oCAAoC,CAAC;KACjD,MAAM,CAAC,eAAe,EAAE,gDAAgD,CAAC;KACzE,MAAM,CAAC,WAAW,CAAC,CAAA;AAEtB,mBAAmB;AACnB,OAAO;KACJ,OAAO,CAAC,aAAa,CAAC;KACtB,WAAW,CAAC,iCAAiC,CAAC;KAC9C,MAAM,CAAC,cAAc,EAAE,mBAAmB,CAAC;KAC3C,MAAM,CAAC,sBAAsB,EAAE,yBAAyB,EAAE,IAAI,CAAC;KAC/D,MAAM,CAAC,CAAC,IAAI,EAAE,OAAO,EAAE,EAAE,CAAC,WAAW,CAAC,IAAI,EAAE,EAAE,GAAG,OAAO,EAAE,KAAK,EAAE,QAAQ,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,CAAA;AAE/F,kBAAkB;AAClB,OAAO;KACJ,OAAO,CAAC,YAAY,CAAC;KACrB,WAAW,CAAC,6BAA6B,CAAC;KAC1C,MAAM,CAAC,kBAAkB,EAAE,oBAAoB,CAAC;KAChD,MAAM,CAAC,uBAAuB,EAAE,aAAa,CAAC;KAC9C,MAAM,CAAC,mBAAmB,EAAE,yCAAyC,CAAC;KACtE,MAAM,CAAC,mBAAmB,EAAE,aAAa,CAAC;KAC1C,MAAM,CAAC,UAAU,CAAC,CAAA;AAErB,kBAAkB;AAClB,OAAO,CAAC,KAAK,EAAE,CAAA"}
@@ -0,0 +1,9 @@
1
+ interface AddOptions {
2
+ repo?: string;
3
+ domain?: string;
4
+ type?: string;
5
+ port?: number;
6
+ }
7
+ export declare function addCommand(name: string, options: AddOptions): Promise<void>;
8
+ export {};
9
+ //# sourceMappingURL=add.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"add.d.ts","sourceRoot":"","sources":["../../src/commands/add.ts"],"names":[],"mappings":"AAQA,UAAU,UAAU;IAClB,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,IAAI,CAAC,EAAE,MAAM,CAAA;CACd;AAED,wBAAsB,UAAU,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC,CA0EjF"}
@@ -0,0 +1,69 @@
1
+ import { writeFile } from 'fs/promises';
2
+ import { existsSync } from 'fs';
3
+ import { stringify as yamlStringify } from 'yaml';
4
+ import chalk from 'chalk';
5
+ import { isInitialized, getAppConfigPath } from '../lib/config.js';
6
+ import { allocatePort } from '../lib/state.js';
7
+ import { log } from '../utils/logger.js';
8
+ export async function addCommand(name, options) {
9
+ log.banner();
10
+ if (!isInitialized()) {
11
+ log.error('Shyp is not initialized. Run: shyp init');
12
+ process.exit(1);
13
+ }
14
+ const configPath = getAppConfigPath(name);
15
+ if (existsSync(configPath)) {
16
+ log.error(`App already exists: ${name}`);
17
+ log.dim(`Config: ${configPath}`);
18
+ process.exit(1);
19
+ }
20
+ // Allocate port if not specified
21
+ const port = options.port || await allocatePort(name, 'standard');
22
+ // Build config
23
+ const config = {
24
+ name,
25
+ description: `${name} application`,
26
+ repo: options.repo || `git@github.com:YOUR_ORG/${name}.git`,
27
+ branch: 'main',
28
+ path: `/var/www/${name}`,
29
+ type: options.type || 'nextjs',
30
+ port,
31
+ };
32
+ if (options.domain) {
33
+ config.domain = options.domain;
34
+ }
35
+ config.build = {
36
+ command: 'npm ci && npm run build',
37
+ timeout: 600,
38
+ };
39
+ config.start = {
40
+ command: 'npm start',
41
+ };
42
+ config.env = {
43
+ NODE_ENV: 'production',
44
+ };
45
+ config.resources = {
46
+ memory: '512M',
47
+ instances: 1,
48
+ };
49
+ config.pm2 = {
50
+ name,
51
+ };
52
+ // Write config file
53
+ const yaml = yamlStringify(config);
54
+ await writeFile(configPath, yaml);
55
+ log.success(`Created app config: ${name}`);
56
+ console.log();
57
+ console.log(chalk.dim('Config file:'));
58
+ console.log(chalk.dim(` ${configPath}`));
59
+ console.log();
60
+ console.log(chalk.dim('Configuration:'));
61
+ console.log(chalk.cyan(yaml));
62
+ console.log();
63
+ log.info('Next steps:');
64
+ console.log(chalk.dim(` 1. Edit the config: nano ${configPath}`));
65
+ console.log(chalk.dim(` 2. Apply changes: shyp sync`));
66
+ console.log(chalk.dim(` 3. Deploy: shyp deploy ${name}`));
67
+ console.log();
68
+ }
69
+ //# sourceMappingURL=add.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"add.js","sourceRoot":"","sources":["../../src/commands/add.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ export declare function deployCommand(name: string, options: {
2
+ module?: string;
3
+ }): Promise<void>;
4
+ //# sourceMappingURL=deploy.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"deploy.d.ts","sourceRoot":"","sources":["../../src/commands/deploy.ts"],"names":[],"mappings":"AAKA,wBAAsB,aAAa,CACjC,IAAI,EAAE,MAAM,EACZ,OAAO,EAAE;IAAE,MAAM,CAAC,EAAE,MAAM,CAAA;CAAE,GAC3B,OAAO,CAAC,IAAI,CAAC,CA+Bf"}
@@ -0,0 +1,104 @@
1
+ import { loadAppConfig, loadEngineConfig, isInitialized } from '../lib/config.js';
2
+ import { deployApp, deployEngine, deployModule } from '../lib/deploy.js';
3
+ import { log } from '../utils/logger.js';
4
+ import { createSpinner } from '../utils/spinner.js';
5
+ export async function deployCommand(name, options) {
6
+ log.banner();
7
+ if (!isInitialized()) {
8
+ log.error('Shyp is not initialized. Run: shyp init');
9
+ process.exit(1);
10
+ }
11
+ // Check if deploying an engine module
12
+ if (options.module) {
13
+ await deployEngineModule(name, options.module);
14
+ return;
15
+ }
16
+ // Try to find as app first
17
+ const appConfig = await loadAppConfig(name);
18
+ if (appConfig) {
19
+ await deployAppByConfig(name, appConfig);
20
+ return;
21
+ }
22
+ // Try as engine
23
+ const engineConfig = await loadEngineConfig(name);
24
+ if (engineConfig) {
25
+ await deployEngineByConfig(name, engineConfig);
26
+ return;
27
+ }
28
+ log.error(`App or engine not found: ${name}`);
29
+ log.dim('Run "shyp status" to see available apps');
30
+ process.exit(1);
31
+ }
32
+ async function deployAppByConfig(name, config) {
33
+ log.info(`Deploying ${name}...`);
34
+ console.log();
35
+ const spinner = createSpinner('Deploying...').start();
36
+ const result = await deployApp(config);
37
+ if (result.success) {
38
+ spinner.succeed(`Deployed ${name}`);
39
+ console.log();
40
+ log.row('Commit:', result.commit || '-');
41
+ log.row('Duration:', `${Math.round(result.duration / 1000)}s`);
42
+ log.row('Deployment ID:', result.deploymentId);
43
+ }
44
+ else {
45
+ spinner.fail(`Deployment failed`);
46
+ console.log();
47
+ log.error(result.error || 'Unknown error');
48
+ process.exit(1);
49
+ }
50
+ }
51
+ async function deployEngineByConfig(name, config) {
52
+ log.info(`Deploying engine ${name}...`);
53
+ log.warn('This will restart the engine and all managed modules');
54
+ console.log();
55
+ const spinner = createSpinner('Deploying engine...').start();
56
+ const result = await deployEngine(config);
57
+ if (result.success) {
58
+ spinner.succeed(`Deployed engine ${name}`);
59
+ console.log();
60
+ log.row('Commit:', result.commit || '-');
61
+ log.row('Duration:', `${Math.round(result.duration / 1000)}s`);
62
+ log.row('Deployment ID:', result.deploymentId);
63
+ }
64
+ else {
65
+ spinner.fail(`Engine deployment failed`);
66
+ console.log();
67
+ log.error(result.error || 'Unknown error');
68
+ process.exit(1);
69
+ }
70
+ }
71
+ async function deployEngineModule(engineName, moduleName) {
72
+ const engineConfig = await loadEngineConfig(engineName);
73
+ if (!engineConfig) {
74
+ log.error(`Engine not found: ${engineName}`);
75
+ process.exit(1);
76
+ }
77
+ const moduleConfig = engineConfig.modules[moduleName];
78
+ if (!moduleConfig) {
79
+ log.error(`Module not found: ${moduleName} in engine ${engineName}`);
80
+ log.dim('Available modules:');
81
+ for (const name of Object.keys(engineConfig.modules)) {
82
+ log.dim(` - ${name}`);
83
+ }
84
+ process.exit(1);
85
+ }
86
+ log.info(`Deploying ${engineName}/${moduleName}...`);
87
+ console.log();
88
+ const spinner = createSpinner('Deploying module...').start();
89
+ const result = await deployModule(engineConfig, moduleName, moduleConfig);
90
+ if (result.success) {
91
+ spinner.succeed(`Deployed ${engineName}/${moduleName}`);
92
+ console.log();
93
+ log.row('Commit:', result.commit || '-');
94
+ log.row('Duration:', `${Math.round(result.duration / 1000)}s`);
95
+ log.row('Deployment ID:', result.deploymentId);
96
+ }
97
+ else {
98
+ spinner.fail(`Module deployment failed`);
99
+ console.log();
100
+ log.error(result.error || 'Unknown error');
101
+ process.exit(1);
102
+ }
103
+ }
104
+ //# sourceMappingURL=deploy.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"deploy.js","sourceRoot":"","sources":["../../src/commands/deploy.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export declare function doctorCommand(): Promise<void>;
2
+ //# sourceMappingURL=doctor.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"doctor.d.ts","sourceRoot":"","sources":["../../src/commands/doctor.ts"],"names":[],"mappings":"AAsBA,wBAAsB,aAAa,IAAI,OAAO,CAAC,IAAI,CAAC,CAqGnD"}
@@ -0,0 +1,97 @@
1
+ import chalk from 'chalk';
2
+ import { existsSync } from 'fs';
3
+ import { isGitAvailable } from '../lib/git.js';
4
+ import { isPM2Available } from '../lib/pm2.js';
5
+ import { isNginxAvailable, testNginxConfig } from '../lib/nginx.js';
6
+ import { isInitialized } from '../lib/config.js';
7
+ import { log } from '../utils/logger.js';
8
+ import { SHYP_DIR, APPS_DIR, STATE_DIR, LOG_DIR, DEFAULT_SSH_KEY, } from '../utils/paths.js';
9
+ export async function doctorCommand() {
10
+ log.banner();
11
+ console.log(chalk.bold.white('System Health Check\n'));
12
+ const checks = [];
13
+ // Check prerequisites
14
+ console.log(chalk.dim('Checking prerequisites...'));
15
+ // Git
16
+ const gitOk = await isGitAvailable();
17
+ checks.push({
18
+ name: 'Git',
19
+ ok: gitOk,
20
+ message: gitOk ? undefined : 'Git not found in PATH',
21
+ });
22
+ // PM2
23
+ const pm2Ok = await isPM2Available();
24
+ checks.push({
25
+ name: 'PM2',
26
+ ok: pm2Ok,
27
+ message: pm2Ok ? undefined : 'PM2 not found. Install with: npm install -g pm2',
28
+ });
29
+ // Nginx
30
+ const nginxOk = await isNginxAvailable();
31
+ checks.push({
32
+ name: 'Nginx',
33
+ ok: nginxOk,
34
+ message: nginxOk ? undefined : 'Nginx not found. This is optional for static sites.',
35
+ });
36
+ // Nginx config valid
37
+ if (nginxOk) {
38
+ const nginxTest = await testNginxConfig();
39
+ checks.push({
40
+ name: 'Nginx config',
41
+ ok: nginxTest.valid,
42
+ message: nginxTest.valid ? undefined : nginxTest.error,
43
+ });
44
+ }
45
+ // SSH key
46
+ const sshKeyOk = existsSync(DEFAULT_SSH_KEY);
47
+ checks.push({
48
+ name: 'SSH key',
49
+ ok: sshKeyOk,
50
+ message: sshKeyOk ? DEFAULT_SSH_KEY : `Not found at ${DEFAULT_SSH_KEY}`,
51
+ });
52
+ // Shyp initialization
53
+ console.log(chalk.dim('\nChecking Shyp configuration...'));
54
+ const shypInitialized = isInitialized();
55
+ checks.push({
56
+ name: 'Shyp initialized',
57
+ ok: shypInitialized,
58
+ message: shypInitialized ? undefined : `Run: shyp init`,
59
+ });
60
+ // Check directories
61
+ const dirs = [
62
+ { name: 'Config directory', path: SHYP_DIR },
63
+ { name: 'Apps directory', path: APPS_DIR },
64
+ { name: 'State directory', path: STATE_DIR },
65
+ { name: 'Log directory', path: LOG_DIR },
66
+ ];
67
+ for (const dir of dirs) {
68
+ const exists = existsSync(dir.path);
69
+ checks.push({
70
+ name: dir.name,
71
+ ok: exists,
72
+ message: exists ? dir.path : `Missing: ${dir.path}`,
73
+ });
74
+ }
75
+ // Display results
76
+ console.log(chalk.bold.white('\nResults'));
77
+ console.log(chalk.dim('─'.repeat(50)));
78
+ let hasErrors = false;
79
+ for (const check of checks) {
80
+ const icon = check.ok ? chalk.green('✓') : chalk.red('✗');
81
+ const name = check.ok ? chalk.white(check.name) : chalk.red(check.name);
82
+ console.log(`${icon} ${name}`);
83
+ if (check.message && !check.ok) {
84
+ console.log(chalk.dim(` ${check.message}`));
85
+ hasErrors = true;
86
+ }
87
+ }
88
+ console.log();
89
+ if (hasErrors) {
90
+ log.warn('Some checks failed. See above for details.');
91
+ process.exit(1);
92
+ }
93
+ else {
94
+ log.success('All checks passed!');
95
+ }
96
+ }
97
+ //# sourceMappingURL=doctor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"doctor.js","sourceRoot":"","sources":["../../src/commands/doctor.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ export { statusCommand } from './status.js';
2
+ export { deployCommand } from './deploy.js';
3
+ export { portsCommand } from './ports.js';
4
+ export { doctorCommand } from './doctor.js';
5
+ export { initCommand } from './init.js';
6
+ export { startCommand } from './start.js';
7
+ export { syncCommand } from './sync.js';
8
+ export { logsCommand } from './logs.js';
9
+ export { addCommand } from './add.js';
10
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/commands/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAA;AAC3C,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAA;AAC3C,OAAO,EAAE,YAAY,EAAE,MAAM,YAAY,CAAA;AACzC,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAA;AAC3C,OAAO,EAAE,WAAW,EAAE,MAAM,WAAW,CAAA;AACvC,OAAO,EAAE,YAAY,EAAE,MAAM,YAAY,CAAA;AACzC,OAAO,EAAE,WAAW,EAAE,MAAM,WAAW,CAAA;AACvC,OAAO,EAAE,WAAW,EAAE,MAAM,WAAW,CAAA;AACvC,OAAO,EAAE,UAAU,EAAE,MAAM,UAAU,CAAA"}