entrify-deploy 1.2.0 → 1.3.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.
- package/README.md +59 -2
- package/dist/api.d.ts +34 -0
- package/dist/api.d.ts.map +1 -1
- package/dist/api.js +31 -3
- package/dist/api.js.map +1 -1
- package/dist/cli.js +446 -198
- package/dist/cli.js.map +1 -1
- package/dist/util.d.ts +38 -0
- package/dist/util.d.ts.map +1 -1
- package/dist/util.js +65 -1
- package/dist/util.js.map +1 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -12,6 +12,20 @@ This installs the `entrify` command. The older `dropdeploy` command is installed
|
|
|
12
12
|
|
|
13
13
|
---
|
|
14
14
|
|
|
15
|
+
## Use it from Claude Code
|
|
16
|
+
|
|
17
|
+
Install the plugin, then ask Claude to "deploy this":
|
|
18
|
+
|
|
19
|
+
```
|
|
20
|
+
/plugin install entrify --marketplace kpndevrootentri/entrify-cli
|
|
21
|
+
```
|
|
22
|
+
|
|
23
|
+
On Claude Code older than 2.1.275, run `/plugin marketplace add kpndevrootentri/entrify-cli`, then `/plugin install entrify@entrify`.
|
|
24
|
+
|
|
25
|
+
Claude installs the CLI if needed, deploys, and reads the build log when a deploy fails. It then fixes the cause (code, settings or environment variables) and deploys again. It asks before pushing code or rolling back, and never asks for your password in the chat.
|
|
26
|
+
|
|
27
|
+
---
|
|
28
|
+
|
|
15
29
|
## Quick start
|
|
16
30
|
|
|
17
31
|
```bash
|
|
@@ -51,10 +65,11 @@ Trigger a deployment for the current repository.
|
|
|
51
65
|
entrify deploy # auto-match project by git remote
|
|
52
66
|
entrify deploy --project-id my-app # deploy to a specific project
|
|
53
67
|
entrify deploy --project-id=my-app # same
|
|
68
|
+
entrify deploy --create # create a project from this repo if none matches
|
|
54
69
|
entrify deploy --dir /path/to/repo # use a different directory
|
|
55
70
|
```
|
|
56
71
|
|
|
57
|
-
Entrify deploys from your **git remote**, not local files. Push your changes before deploying.
|
|
72
|
+
Entrify deploys from your **git remote**, not local files. Push your changes before deploying. With `--create`, a repository that has no project yet gets one, named after the repository, with its framework detected.
|
|
58
73
|
|
|
59
74
|
The project is matched by your `origin` remote, whether it's an HTTPS or SSH URL. If several projects use the same repo, the one on your current branch wins. The server always builds the **project's** branch; the CLI warns you when that isn't the branch you have checked out.
|
|
60
75
|
|
|
@@ -95,6 +110,39 @@ Your projects:
|
|
|
95
110
|
|
|
96
111
|
---
|
|
97
112
|
|
|
113
|
+
The commands below act on the project matched from the current repository. Pass `--project-id <id|slug>` to choose another.
|
|
114
|
+
|
|
115
|
+
### `entrify status`
|
|
116
|
+
The latest deployment and the live URL. The live version can be older than the latest deployment when the latest one failed.
|
|
117
|
+
|
|
118
|
+
### `entrify logs`
|
|
119
|
+
The build log of the latest deployment.
|
|
120
|
+
|
|
121
|
+
```bash
|
|
122
|
+
entrify logs # last 200 lines
|
|
123
|
+
entrify logs --lines all
|
|
124
|
+
entrify logs --follow # stream a build that is still running
|
|
125
|
+
entrify logs --deployment <id> # a specific deployment
|
|
126
|
+
```
|
|
127
|
+
|
|
128
|
+
### `entrify env`
|
|
129
|
+
Environment variables. Entrify stores the values encrypted, and the CLI never prints them back. Changes apply on the next deploy.
|
|
130
|
+
|
|
131
|
+
```bash
|
|
132
|
+
entrify env list # names only
|
|
133
|
+
entrify env set API_URL=https://x.io DEBUG=0
|
|
134
|
+
entrify env push .env.production # every variable in a .env file (default: .env)
|
|
135
|
+
entrify env unset DEBUG
|
|
136
|
+
```
|
|
137
|
+
|
|
138
|
+
### `entrify rollback`
|
|
139
|
+
Go back to the previous successful deployment, or to `--to <deployment-id>`.
|
|
140
|
+
|
|
141
|
+
### `entrify cancel`
|
|
142
|
+
Cancel the deployment that is queued or building.
|
|
143
|
+
|
|
144
|
+
---
|
|
145
|
+
|
|
98
146
|
### `entrify help`
|
|
99
147
|
Print the full command reference.
|
|
100
148
|
|
|
@@ -114,7 +162,16 @@ export ENTRIFY_URL=https://entrify.site
|
|
|
114
162
|
entrify deploy --project-id my-app
|
|
115
163
|
```
|
|
116
164
|
|
|
117
|
-
`DROPDEPLOY_TOKEN`, `DROPDEPLOY_URL` and `DROPDEPLOY_EMAIL` still work. Without a terminal, the CLI never prompts. If it can't match the repository to a project, it exits with an error asking for `--project-id`.
|
|
165
|
+
`DROPDEPLOY_TOKEN`, `DROPDEPLOY_URL` and `DROPDEPLOY_EMAIL` still work. Without a terminal, the CLI never prompts. If it can't match the repository to a project, it exits with an error asking for `--project-id` or `--create`.
|
|
166
|
+
|
|
167
|
+
Add `--json` to any command for a single JSON object on stdout: `{ "ok": true, ... }`, or `{ "ok": false, "error": { "code": "...", "message": "..." }, ... }`. A failed deploy also includes `cause`, `fix` and the last 40 lines of the log (`logTail`). Exit codes:
|
|
168
|
+
|
|
169
|
+
| Code | Meaning |
|
|
170
|
+
|---|---|
|
|
171
|
+
| 0 | Success |
|
|
172
|
+
| 1 | The operation failed (for example, the build failed) |
|
|
173
|
+
| 2 | Needs input: a flag, a project, a file |
|
|
174
|
+
| 3 | Not logged in, or the login expired |
|
|
118
175
|
|
|
119
176
|
---
|
|
120
177
|
|
package/dist/api.d.ts
CHANGED
|
@@ -4,6 +4,8 @@ export interface Project {
|
|
|
4
4
|
name: string;
|
|
5
5
|
slug: string;
|
|
6
6
|
type: string;
|
|
7
|
+
/** GITHUB, GITLAB or UPLOAD. */
|
|
8
|
+
source?: string;
|
|
7
9
|
githubUrl: string | null;
|
|
8
10
|
/** The branch the server builds, whatever is checked out locally. */
|
|
9
11
|
branch?: string;
|
|
@@ -25,6 +27,18 @@ export interface DeployStatus {
|
|
|
25
27
|
commitHash: string | null;
|
|
26
28
|
subdomain: string | null;
|
|
27
29
|
}
|
|
30
|
+
export interface Deployment {
|
|
31
|
+
id: string;
|
|
32
|
+
status: string;
|
|
33
|
+
subdomain: string | null;
|
|
34
|
+
commitHash?: string | null;
|
|
35
|
+
createdAt: string;
|
|
36
|
+
}
|
|
37
|
+
export interface EnvVar {
|
|
38
|
+
id: string;
|
|
39
|
+
key: string;
|
|
40
|
+
environment: string;
|
|
41
|
+
}
|
|
28
42
|
export interface DetectResult {
|
|
29
43
|
type: string;
|
|
30
44
|
confidence: 'high' | 'medium' | 'low';
|
|
@@ -48,6 +62,26 @@ export declare class EntrifyApi {
|
|
|
48
62
|
listProjects(): Promise<Project[]>;
|
|
49
63
|
detectType(repoUrl: string, branch: string): Promise<DetectResult>;
|
|
50
64
|
triggerDeploy(projectId: string): Promise<DeployResult>;
|
|
65
|
+
createProject(dto: {
|
|
66
|
+
name: string;
|
|
67
|
+
source: 'GITHUB' | 'GITLAB';
|
|
68
|
+
githubUrl: string;
|
|
69
|
+
type?: string;
|
|
70
|
+
branch?: string;
|
|
71
|
+
}): Promise<Project>;
|
|
72
|
+
/** Newest first. */
|
|
73
|
+
listDeployments(projectId: string, limit?: number): Promise<Deployment[]>;
|
|
74
|
+
/** Re-runs an earlier deployment; resolves to the new deployment's id. */
|
|
75
|
+
rollback(projectId: string, deploymentId: string): Promise<{
|
|
76
|
+
deploymentId: string;
|
|
77
|
+
queued: boolean;
|
|
78
|
+
}>;
|
|
79
|
+
cancelDeployment(projectId: string, deploymentId: string): Promise<void>;
|
|
80
|
+
/** Keys only: the API never returns values. */
|
|
81
|
+
listEnv(projectId: string): Promise<EnvVar[]>;
|
|
82
|
+
createEnv(projectId: string, key: string, value: string): Promise<void>;
|
|
83
|
+
updateEnv(projectId: string, varId: string, value: string): Promise<void>;
|
|
84
|
+
deleteEnv(projectId: string, varId: string): Promise<void>;
|
|
51
85
|
getDeploymentStatus(projectId: string, deploymentId: string): Promise<DeployStatus>;
|
|
52
86
|
streamLogs(projectId: string, deploymentId: string): AsyncGenerator<SseEvent>;
|
|
53
87
|
}
|
package/dist/api.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"api.d.ts","sourceRoot":"","sources":["../src/api.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AAG7C,MAAM,WAAW,OAAO;IACtB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,qEAAqE;IACrE,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,WAAW,CAAC,EAAE,KAAK,CAAC;QAClB,EAAE,EAAE,MAAM,CAAC;QACX,MAAM,EAAE,MAAM,CAAC;QACf,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;QACzB,SAAS,EAAE,MAAM,CAAC;KACnB,CAAC,CAAC;CACJ;AAED,MAAM,WAAW,YAAY;IAC3B,YAAY,EAAE,MAAM,CAAC;IACrB,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,OAAO,CAAC;CACjB;AAED,MAAM,WAAW,YAAY;IAC3B,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;CAC1B;AAED,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,EAAE,MAAM,GAAG,QAAQ,GAAG,KAAK,CAAC;IACtC,IAAI,EAAE,MAAM,CAAC;CACd;AAED,MAAM,MAAM,QAAQ,GAChB;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,GAC9B;IAAE,IAAI,EAAE,UAAU,CAAC;IAAC,GAAG,EAAE,MAAM,CAAA;CAAE,GACjC;IAAE,IAAI,EAAE,MAAM,CAAA;CAAE,CAAC;AAQrB,qBAAa,UAAU;IACrB,OAAO,CAAC,IAAI,CAAS;IACrB,OAAO,CAAC,KAAK,CAAS;gBAEV,KAAK,EAAE,WAAW;IAK9B,OAAO,CAAC,WAAW;YAOL,IAAI;
|
|
1
|
+
{"version":3,"file":"api.d.ts","sourceRoot":"","sources":["../src/api.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AAG7C,MAAM,WAAW,OAAO;IACtB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,gCAAgC;IAChC,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,qEAAqE;IACrE,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,WAAW,CAAC,EAAE,KAAK,CAAC;QAClB,EAAE,EAAE,MAAM,CAAC;QACX,MAAM,EAAE,MAAM,CAAC;QACf,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;QACzB,SAAS,EAAE,MAAM,CAAC;KACnB,CAAC,CAAC;CACJ;AAED,MAAM,WAAW,YAAY;IAC3B,YAAY,EAAE,MAAM,CAAC;IACrB,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,OAAO,CAAC;CACjB;AAED,MAAM,WAAW,YAAY;IAC3B,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;CAC1B;AAED,MAAM,WAAW,UAAU;IACzB,EAAE,EAAE,MAAM,CAAC;IACX,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,UAAU,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,MAAM;IACrB,EAAE,EAAE,MAAM,CAAC;IACX,GAAG,EAAE,MAAM,CAAC;IACZ,WAAW,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,EAAE,MAAM,GAAG,QAAQ,GAAG,KAAK,CAAC;IACtC,IAAI,EAAE,MAAM,CAAC;CACd;AAED,MAAM,MAAM,QAAQ,GAChB;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,GAC9B;IAAE,IAAI,EAAE,UAAU,CAAC;IAAC,GAAG,EAAE,MAAM,CAAA;CAAE,GACjC;IAAE,IAAI,EAAE,MAAM,CAAA;CAAE,CAAC;AAQrB,qBAAa,UAAU;IACrB,OAAO,CAAC,IAAI,CAAS;IACrB,OAAO,CAAC,KAAK,CAAS;gBAEV,KAAK,EAAE,WAAW;IAK9B,OAAO,CAAC,WAAW;YAOL,IAAI;IA6BZ,YAAY,IAAI,OAAO,CAAC,OAAO,EAAE,CAAC;IAIlC,UAAU,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,CAAC;IAIlE,aAAa,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,CAAC;IAIvD,aAAa,CAAC,GAAG,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,QAAQ,GAAG,QAAQ,CAAC;QAAC,SAAS,EAAE,MAAM,CAAC;QAAC,IAAI,CAAC,EAAE,MAAM,CAAC;QAAC,MAAM,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC,OAAO,CAAC;IAI5I,oBAAoB;IACd,eAAe,CAAC,SAAS,EAAE,MAAM,EAAE,KAAK,SAAK,GAAG,OAAO,CAAC,UAAU,EAAE,CAAC;IAK3E,0EAA0E;IACpE,QAAQ,CAAC,SAAS,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,GAAG,OAAO,CAAC;QAAE,YAAY,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,OAAO,CAAA;KAAE,CAAC;IAIrG,gBAAgB,CAAC,SAAS,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAI9E,+CAA+C;IACzC,OAAO,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;IAI7C,SAAS,CAAC,SAAS,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAIvE,SAAS,CAAC,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAIzE,SAAS,CAAC,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAI1D,mBAAmB,CACvB,SAAS,EAAE,MAAM,EACjB,YAAY,EAAE,MAAM,GACnB,OAAO,CAAC,YAAY,CAAC;IAOjB,UAAU,CACf,SAAS,EAAE,MAAM,EACjB,YAAY,EAAE,MAAM,GACnB,cAAc,CAAC,QAAQ,CAAC;CAoC5B"}
|
package/dist/api.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { apiErrorMessage, cliName } from './util.js';
|
|
1
|
+
import { CliError, EXIT, apiErrorMessage, cliName } from './util.js';
|
|
2
2
|
function isSseEvent(x) {
|
|
3
3
|
if (typeof x !== 'object' || x === null)
|
|
4
4
|
return false;
|
|
@@ -30,11 +30,11 @@ export class EntrifyApi {
|
|
|
30
30
|
});
|
|
31
31
|
if (res.status === 401) {
|
|
32
32
|
// CLI logins are JWTs that expire (7 days by default).
|
|
33
|
-
throw new
|
|
33
|
+
throw new CliError(`Your login has expired or is no longer valid. Run: ${cliName()} auth login`, 'AUTH_EXPIRED', EXIT.AUTH);
|
|
34
34
|
}
|
|
35
35
|
if (!res.ok) {
|
|
36
36
|
const body = await res.json().catch(() => null);
|
|
37
|
-
throw new
|
|
37
|
+
throw new CliError(apiErrorMessage(body, `API ${res.status} on ${method} ${path}`), `HTTP_${res.status}`);
|
|
38
38
|
}
|
|
39
39
|
const payload = (await res.json());
|
|
40
40
|
return payload.data;
|
|
@@ -52,6 +52,34 @@ export class EntrifyApi {
|
|
|
52
52
|
async triggerDeploy(projectId) {
|
|
53
53
|
return this.json('POST', `/api/projects/${projectId}/deploy`);
|
|
54
54
|
}
|
|
55
|
+
async createProject(dto) {
|
|
56
|
+
return this.json('POST', '/api/projects', dto);
|
|
57
|
+
}
|
|
58
|
+
/** Newest first. */
|
|
59
|
+
async listDeployments(projectId, limit = 20) {
|
|
60
|
+
const data = await this.json('GET', `/api/projects/${projectId}/deployments?limit=${limit}`);
|
|
61
|
+
return data.deployments;
|
|
62
|
+
}
|
|
63
|
+
/** Re-runs an earlier deployment; resolves to the new deployment's id. */
|
|
64
|
+
async rollback(projectId, deploymentId) {
|
|
65
|
+
return this.json('POST', `/api/projects/${projectId}/deployments/${deploymentId}/rollback`);
|
|
66
|
+
}
|
|
67
|
+
async cancelDeployment(projectId, deploymentId) {
|
|
68
|
+
await this.json('POST', `/api/projects/${projectId}/deployments/${deploymentId}/cancel`);
|
|
69
|
+
}
|
|
70
|
+
/** Keys only: the API never returns values. */
|
|
71
|
+
async listEnv(projectId) {
|
|
72
|
+
return this.json('GET', `/api/projects/${projectId}/env-vars`);
|
|
73
|
+
}
|
|
74
|
+
async createEnv(projectId, key, value) {
|
|
75
|
+
await this.json('POST', `/api/projects/${projectId}/env-vars`, { key, value });
|
|
76
|
+
}
|
|
77
|
+
async updateEnv(projectId, varId, value) {
|
|
78
|
+
await this.json('PUT', `/api/projects/${projectId}/env-vars/${varId}`, { value });
|
|
79
|
+
}
|
|
80
|
+
async deleteEnv(projectId, varId) {
|
|
81
|
+
await this.json('DELETE', `/api/projects/${projectId}/env-vars/${varId}`);
|
|
82
|
+
}
|
|
55
83
|
async getDeploymentStatus(projectId, deploymentId) {
|
|
56
84
|
return this.json('GET', `/api/projects/${projectId}/deployments/${deploymentId}/logs`);
|
|
57
85
|
}
|
package/dist/api.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"api.js","sourceRoot":"","sources":["../src/api.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,eAAe,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"api.js","sourceRoot":"","sources":["../src/api.ts"],"names":[],"mappings":"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"}
|