terse-cli 0.1.19 → 0.1.20
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 +15 -0
- package/dist/api.d.ts +3 -0
- package/dist/api.d.ts.map +1 -1
- package/dist/api.js +16 -6
- package/dist/api.js.map +1 -1
- package/dist/assertProjectRoot.d.ts +4 -1
- package/dist/assertProjectRoot.d.ts.map +1 -1
- package/dist/assertProjectRoot.js +3 -3
- package/dist/assertProjectRoot.js.map +1 -1
- package/dist/attach.d.ts +3 -0
- package/dist/attach.d.ts.map +1 -0
- package/dist/attach.js +61 -0
- package/dist/attach.js.map +1 -0
- package/dist/auth.d.ts +1 -0
- package/dist/auth.d.ts.map +1 -1
- package/dist/auth.js +29 -18
- package/dist/auth.js.map +1 -1
- package/dist/deploy.d.ts +1 -1
- package/dist/deploy.d.ts.map +1 -1
- package/dist/deploy.js +35 -10
- package/dist/deploy.js.map +1 -1
- package/dist/generate.d.ts.map +1 -1
- package/dist/generate.js +7 -39
- package/dist/generate.js.map +1 -1
- package/dist/index.js +26 -5
- package/dist/index.js.map +1 -1
- package/dist/init.d.ts.map +1 -1
- package/dist/init.js +11 -1
- package/dist/init.js.map +1 -1
- package/dist/loadJob.d.ts +2 -2
- package/dist/loadJob.d.ts.map +1 -1
- package/dist/loadJob.js +11 -5
- package/dist/loadJob.js.map +1 -1
- package/dist/promptErrors.d.ts +2 -0
- package/dist/promptErrors.d.ts.map +1 -0
- package/dist/promptErrors.js +8 -0
- package/dist/promptErrors.js.map +1 -0
- package/dist/providers/LanguageProvider.d.ts +8 -2
- package/dist/providers/LanguageProvider.d.ts.map +1 -1
- package/dist/providers/codegenTypes.d.ts +6 -16
- package/dist/providers/codegenTypes.d.ts.map +1 -1
- package/dist/providers/fetchSdkVersion.d.ts +4 -0
- package/dist/providers/fetchSdkVersion.d.ts.map +1 -0
- package/dist/providers/fetchSdkVersion.js +24 -0
- package/dist/providers/fetchSdkVersion.js.map +1 -0
- package/dist/providers/python/PythonProvider.d.ts +20 -2
- package/dist/providers/python/PythonProvider.d.ts.map +1 -1
- package/dist/providers/python/PythonProvider.js +65 -28
- package/dist/providers/python/PythonProvider.js.map +1 -1
- package/dist/providers/python/preparePythonCodegenData.d.ts +50 -0
- package/dist/providers/python/preparePythonCodegenData.d.ts.map +1 -1
- package/dist/providers/python/preparePythonCodegenData.js +100 -7
- package/dist/providers/python/preparePythonCodegenData.js.map +1 -1
- package/dist/providers/resolveProvider.js +2 -2
- package/dist/providers/resolveProvider.js.map +1 -1
- package/dist/providers/shared/entryFileGuidance.d.ts +10 -0
- package/dist/providers/shared/entryFileGuidance.d.ts.map +1 -0
- package/dist/providers/shared/entryFileGuidance.js +20 -0
- package/dist/providers/shared/entryFileGuidance.js.map +1 -0
- package/dist/providers/shared/sessionStream.d.ts +4 -11
- package/dist/providers/shared/sessionStream.d.ts.map +1 -1
- package/dist/providers/shared/sessionStream.js +13 -68
- package/dist/providers/shared/sessionStream.js.map +1 -1
- package/dist/providers/typescript/TypeScriptProvider.d.ts +9 -3
- package/dist/providers/typescript/TypeScriptProvider.d.ts.map +1 -1
- package/dist/providers/typescript/TypeScriptProvider.js +43 -22
- package/dist/providers/typescript/TypeScriptProvider.js.map +1 -1
- package/dist/providers/typescript/prepareCodegenData.d.ts +1 -11
- package/dist/providers/typescript/prepareCodegenData.d.ts.map +1 -1
- package/dist/providers/typescript/prepareCodegenData.js +47 -50
- package/dist/providers/typescript/prepareCodegenData.js.map +1 -1
- package/dist/run.d.ts +1 -1
- package/dist/run.d.ts.map +1 -1
- package/dist/run.js +8 -8
- package/dist/run.js.map +1 -1
- package/dist/test.d.ts +1 -1
- package/dist/test.d.ts.map +1 -1
- package/dist/test.js +26 -14
- package/dist/test.js.map +1 -1
- package/dist/util.d.ts +2 -3
- package/dist/util.d.ts.map +1 -1
- package/dist/util.js +3 -3
- package/dist/util.js.map +1 -1
- package/package.json +3 -3
- package/templates/python/codegen/generated.hbs +5 -0
- package/templates/python/codegen/partials/github-section.hbs +149 -0
- package/templates/python/codegen/partials/gmail-section.hbs +30 -0
- package/templates/python/codegen/partials/linear-section.hbs +229 -0
- package/templates/python/codegen/partials/schedule-section.hbs +8 -2
- package/templates/python/codegen/partials/slack-section.hbs +110 -22
- package/templates/python/codegen/partials/webhook-section.hbs +15 -0
- package/templates/python/codegen/partials/workos-section.hbs +149 -0
- package/templates/python/init/README.md.hbs +5 -3
- package/templates/python/init/src/main.py.hbs +10 -13
- package/templates/typescript/codegen/generated.hbs +0 -2
- package/templates/typescript/codegen/partials/github-section.hbs +16 -12
- package/templates/typescript/codegen/partials/gmail-section.hbs +2 -2
- package/templates/typescript/codegen/partials/linear-section.hbs +19 -13
- package/templates/typescript/codegen/partials/slack-section.hbs +15 -7
- package/templates/typescript/codegen/partials/system-section.hbs +4 -4
- package/templates/typescript/codegen/partials/workos-section.hbs +34 -22
- package/templates/typescript/init/package.json.hbs +1 -1
- package/templates/typescript/init/src/{index.ts.hbs → terse.jobs.ts.hbs} +2 -2
- package/templates/typescript/codegen/partials/atlassian-section.hbs +0 -32
- package/templates/typescript/codegen/partials/figma-section.hbs +0 -13
package/README.md
CHANGED
|
@@ -24,6 +24,11 @@ pnpm run install-global
|
|
|
24
24
|
|
|
25
25
|
Scaffold a new Terse project with boilerplate code and config.
|
|
26
26
|
|
|
27
|
+
If you run `terse init` inside an existing npm project with no project name, the CLI uses attach mode instead of overwriting `package.json`. In attach mode it asks whether you want to self-host via `TERSE_JOB_URL` or use serverless deploys, and it warns that serverless deploys upload a zip of the current project directory to GCS.
|
|
28
|
+
|
|
29
|
+
TypeScript projects register jobs in `src/terse.jobs.ts`. In existing apps, import that file from your normal startup path.
|
|
30
|
+
If your self-hosted app keeps jobs in another file, pass `--entry-file` to `terse test`, `terse run`, or `terse deploy`.
|
|
31
|
+
|
|
27
32
|
### `terse generate`
|
|
28
33
|
|
|
29
34
|
Generate TypeScript types for your connected integrations (creates `terse.generated.ts`).
|
|
@@ -39,16 +44,26 @@ Execute a job's `onTrigger` handler locally with a mock or provided event.
|
|
|
39
44
|
```bash
|
|
40
45
|
terse run my-job --event '{"key": "value"}'
|
|
41
46
|
terse run my-job --event-file ./event.json
|
|
47
|
+
terse run my-job --entry-file src/server.py --event-file ./event.json
|
|
42
48
|
```
|
|
43
49
|
|
|
44
50
|
### `terse test [job-name]`
|
|
45
51
|
|
|
46
52
|
Fetch sample events from your connected integrations and run a job interactively.
|
|
47
53
|
|
|
54
|
+
For self-hosted or custom layouts that do not use the canonical entry file, pass `--entry-file` explicitly:
|
|
55
|
+
|
|
56
|
+
```bash
|
|
57
|
+
terse test --entry-file src/server.ts
|
|
58
|
+
terse test --entry-file src/server.py
|
|
59
|
+
```
|
|
60
|
+
|
|
48
61
|
### `terse deploy`
|
|
49
62
|
|
|
50
63
|
Deploy all jobs to the Terse platform. This syncs with the server — jobs that have been removed locally will be deleted remotely.
|
|
51
64
|
|
|
65
|
+
If `TERSE_JOB_URL` is unset, hosted deploys now prompt for confirmation before uploading a zip of the current project directory.
|
|
66
|
+
|
|
52
67
|
## Getting Started
|
|
53
68
|
|
|
54
69
|
```bash
|
package/dist/api.d.ts
CHANGED
|
@@ -1,4 +1,7 @@
|
|
|
1
|
+
export declare function readEnvVar(name: string): string | null;
|
|
2
|
+
export declare function readEnvVarFromDir(dir: string, name: string): string | null;
|
|
1
3
|
export declare function readApiKey(): string | null;
|
|
4
|
+
export declare function readApiKeyFromDir(dir: string): string | null;
|
|
2
5
|
export declare function readApiKeyOrBail(options?: {
|
|
3
6
|
title?: string;
|
|
4
7
|
detail?: string;
|
package/dist/api.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"api.d.ts","sourceRoot":"","sources":["../src/api.ts"],"names":[],"mappings":"AAMA,wBAAgB,UAAU,IAAI,MAAM,GAAG,IAAI,
|
|
1
|
+
{"version":3,"file":"api.d.ts","sourceRoot":"","sources":["../src/api.ts"],"names":[],"mappings":"AAMA,wBAAgB,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAEtD;AAED,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAc1E;AAED,wBAAgB,UAAU,IAAI,MAAM,GAAG,IAAI,CAE1C;AAED,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAM5D;AAED,wBAAgB,gBAAgB,CAAC,OAAO,CAAC,EAAE;IAAE,KAAK,CAAC,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAA;CAAE,GAAG,MAAM,CAWtF;AAED,wBAAsB,aAAa,CAAC,CAAC,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAM,EAAE,IAAI,GAAE,KAAK,GAAG,MAAc,GAAG,OAAO,CAAC,CAAC,CAAC,CA0BtJ"}
|
package/dist/api.js
CHANGED
|
@@ -2,8 +2,11 @@ import chalk from "chalk";
|
|
|
2
2
|
import fs from "node:fs";
|
|
3
3
|
import path from "node:path";
|
|
4
4
|
import { BACKEND_URL } from "./config.js";
|
|
5
|
-
export function
|
|
6
|
-
|
|
5
|
+
export function readEnvVar(name) {
|
|
6
|
+
return readEnvVarFromDir(process.cwd(), name);
|
|
7
|
+
}
|
|
8
|
+
export function readEnvVarFromDir(dir, name) {
|
|
9
|
+
const envPath = path.resolve(dir, ".env");
|
|
7
10
|
if (!fs.existsSync(envPath))
|
|
8
11
|
return null;
|
|
9
12
|
const content = fs.readFileSync(envPath, "utf-8");
|
|
@@ -12,16 +15,23 @@ export function readApiKey() {
|
|
|
12
15
|
if (trimmed.startsWith("#") || !trimmed.includes("="))
|
|
13
16
|
continue;
|
|
14
17
|
const [key, ...rest] = trimmed.split("=");
|
|
15
|
-
if (key.trim() ===
|
|
18
|
+
if (key.trim() === name) {
|
|
16
19
|
const val = rest.join("=").trim();
|
|
17
|
-
if (val) {
|
|
18
|
-
process.env.TERSE_API_KEY = val;
|
|
19
|
-
}
|
|
20
20
|
return val || null;
|
|
21
21
|
}
|
|
22
22
|
}
|
|
23
23
|
return null;
|
|
24
24
|
}
|
|
25
|
+
export function readApiKey() {
|
|
26
|
+
return readApiKeyFromDir(process.cwd());
|
|
27
|
+
}
|
|
28
|
+
export function readApiKeyFromDir(dir) {
|
|
29
|
+
const val = readEnvVarFromDir(dir, "TERSE_API_KEY");
|
|
30
|
+
if (val) {
|
|
31
|
+
process.env.TERSE_API_KEY = val;
|
|
32
|
+
}
|
|
33
|
+
return val;
|
|
34
|
+
}
|
|
25
35
|
export function readApiKeyOrBail(options) {
|
|
26
36
|
const apiKey = readApiKey();
|
|
27
37
|
if (apiKey)
|
package/dist/api.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"api.js","sourceRoot":"","sources":["../src/api.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAA;AACzB,OAAO,EAAE,MAAM,SAAS,CAAA;AACxB,OAAO,IAAI,MAAM,WAAW,CAAA;AAE5B,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAA;AAEzC,MAAM,UAAU,UAAU;
|
|
1
|
+
{"version":3,"file":"api.js","sourceRoot":"","sources":["../src/api.ts"],"names":[],"mappings":"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"}
|
|
@@ -3,5 +3,8 @@ import type { LanguageProvider } from "./providers/LanguageProvider.js";
|
|
|
3
3
|
* Verify the CWD is the root of a Terse project for the active language provider.
|
|
4
4
|
* Exits with a clear error message if not.
|
|
5
5
|
*/
|
|
6
|
-
export declare function assertProjectRoot(provider: LanguageProvider
|
|
6
|
+
export declare function assertProjectRoot(provider: LanguageProvider, markers?: {
|
|
7
|
+
requiredFiles: string[];
|
|
8
|
+
description: string;
|
|
9
|
+
}): void;
|
|
7
10
|
//# sourceMappingURL=assertProjectRoot.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"assertProjectRoot.d.ts","sourceRoot":"","sources":["../src/assertProjectRoot.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,iCAAiC,CAAA;AAEvE;;;GAGG;AACH,wBAAgB,iBAAiB,CAAC,QAAQ,EAAE,gBAAgB,GAAG,IAAI,
|
|
1
|
+
{"version":3,"file":"assertProjectRoot.d.ts","sourceRoot":"","sources":["../src/assertProjectRoot.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,iCAAiC,CAAA;AAEvE;;;GAGG;AACH,wBAAgB,iBAAiB,CAAC,QAAQ,EAAE,gBAAgB,EAAE,OAAO,GAAE;IAAE,aAAa,EAAE,MAAM,EAAE,CAAC;IAAC,WAAW,EAAE,MAAM,CAAA;CAA4B,GAAG,IAAI,CAQvJ"}
|
|
@@ -5,11 +5,11 @@ import path from "node:path";
|
|
|
5
5
|
* Verify the CWD is the root of a Terse project for the active language provider.
|
|
6
6
|
* Exits with a clear error message if not.
|
|
7
7
|
*/
|
|
8
|
-
export function assertProjectRoot(provider) {
|
|
8
|
+
export function assertProjectRoot(provider, markers = provider.projectMarkers) {
|
|
9
9
|
const cwd = process.cwd();
|
|
10
|
-
const missingFiles =
|
|
10
|
+
const missingFiles = markers.requiredFiles.filter(relativePath => !fs.existsSync(path.join(cwd, relativePath)));
|
|
11
11
|
if (missingFiles.length > 0) {
|
|
12
|
-
console.error(chalk.red(`Error: Current directory is not a ${
|
|
12
|
+
console.error(chalk.red(`Error: Current directory is not a ${markers.description}. Missing: ${missingFiles.join(", ")}.`));
|
|
13
13
|
process.exit(1);
|
|
14
14
|
}
|
|
15
15
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"assertProjectRoot.js","sourceRoot":"","sources":["../src/assertProjectRoot.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAA;AACzB,OAAO,EAAE,MAAM,SAAS,CAAA;AACxB,OAAO,IAAI,MAAM,WAAW,CAAA;AAI5B;;;GAGG;AACH,MAAM,UAAU,iBAAiB,CAAC,QAA0B;
|
|
1
|
+
{"version":3,"file":"assertProjectRoot.js","sourceRoot":"","sources":["../src/assertProjectRoot.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAA;AACzB,OAAO,EAAE,MAAM,SAAS,CAAA;AACxB,OAAO,IAAI,MAAM,WAAW,CAAA;AAI5B;;;GAGG;AACH,MAAM,UAAU,iBAAiB,CAAC,QAA0B,EAAE,UAA4D,QAAQ,CAAC,cAAc;IAC7I,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,EAAE,CAAA;IACzB,MAAM,YAAY,GAAG,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC,YAAY,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,YAAY,CAAC,CAAC,CAAC,CAAA;IAE/G,IAAI,YAAY,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC1B,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,qCAAqC,OAAO,CAAC,WAAW,cAAc,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAA;QAC1H,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;IACnB,CAAC;AACL,CAAC"}
|
package/dist/attach.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"attach.d.ts","sourceRoot":"","sources":["../src/attach.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,iCAAiC,CAAA;AAGvE,wBAAsB,MAAM,CAAC,QAAQ,GAAE,gBAAoC,GAAG,OAAO,CAAC,IAAI,CAAC,CAoD1F"}
|
package/dist/attach.js
ADDED
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
import chalk from "chalk";
|
|
2
|
+
import fs from "node:fs";
|
|
3
|
+
import path from "node:path";
|
|
4
|
+
import ora from "ora";
|
|
5
|
+
import { getExistingAuthenticatedUserName, login } from "./auth.js";
|
|
6
|
+
import { generate } from "./generate.js";
|
|
7
|
+
import { listAndPromptIntegrations } from "./integrate.js";
|
|
8
|
+
import { resolveProvider } from "./providers/resolveProvider.js";
|
|
9
|
+
export async function attach(provider = resolveProvider()) {
|
|
10
|
+
const cwd = process.cwd();
|
|
11
|
+
const projectName = path.basename(cwd);
|
|
12
|
+
const existingUserName = await getExistingAuthenticatedUserName(cwd);
|
|
13
|
+
if (existingUserName) {
|
|
14
|
+
console.log(`\n ${chalk.green.bold("Already set up")} for ${chalk.bold(existingUserName)}.\n`);
|
|
15
|
+
console.log(chalk.dim(" This project already has a valid TERSE_API_KEY, so attach does not need to run again.\n"));
|
|
16
|
+
console.log(" Next steps:\n");
|
|
17
|
+
console.log(` 1. Run ${chalk.cyan("terse integrate")} to connect or review integrations`);
|
|
18
|
+
console.log(` 2. Run ${chalk.cyan("terse generate")} to refresh generated helpers`);
|
|
19
|
+
console.log(` 3. Run ${chalk.cyan("terse deploy")} when you're ready to sync jobs`);
|
|
20
|
+
console.log("");
|
|
21
|
+
return;
|
|
22
|
+
}
|
|
23
|
+
console.log(`\n Attaching Terse to existing project ${chalk.bold(projectName)}\n`);
|
|
24
|
+
console.log(chalk.dim(" Your jobs will run on your own infrastructure via TERSE_REMOTE_SERVER_URL. No source code is uploaded to Terse.\n"));
|
|
25
|
+
const result = await login();
|
|
26
|
+
if (result?.apiKey) {
|
|
27
|
+
console.log(`\n Add this to your ${chalk.bold(".env")} file:\n`);
|
|
28
|
+
console.log(`TERSE_API_KEY=${result.apiKey}`);
|
|
29
|
+
console.log("");
|
|
30
|
+
}
|
|
31
|
+
else {
|
|
32
|
+
console.log(chalk.dim(" You can run `terse login` later to authenticate."));
|
|
33
|
+
}
|
|
34
|
+
await listAndPromptIntegrations();
|
|
35
|
+
if (canGenerateFromCurrentDirectory(provider, cwd)) {
|
|
36
|
+
const spinner = ora("Generating code").start();
|
|
37
|
+
try {
|
|
38
|
+
await generate(provider);
|
|
39
|
+
spinner.succeed("Generated code");
|
|
40
|
+
}
|
|
41
|
+
catch {
|
|
42
|
+
spinner.warn(`Failed to generate code. Run ${chalk.cyan("terse generate")} manually.`);
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
else {
|
|
46
|
+
console.log(chalk.yellow(`\n Skipped code generation because this repo is missing ${provider.detectionMarkers.requiredFiles.join(", ")}.`));
|
|
47
|
+
console.log(chalk.dim(` Add your job entrypoint at ${provider.entryFile}, then run ${chalk.cyan("terse generate")} manually.\n`));
|
|
48
|
+
}
|
|
49
|
+
console.log(`\n ${chalk.green.bold("Done!")} Terse is attached to your existing project.\n`);
|
|
50
|
+
console.log(" Next steps:\n");
|
|
51
|
+
console.log(` 1. Install ${chalk.cyan("terse-sdk")} in this repo if you haven't already`);
|
|
52
|
+
console.log(` 2. Add your Terse job definitions to ${chalk.cyan(provider.entryFile)} and import that file from your app startup path`);
|
|
53
|
+
console.log(chalk.dim(` If your self-hosted app keeps jobs in another file, use ${chalk.cyan("--entry-file")} with terse test, terse run, and terse deploy.`));
|
|
54
|
+
console.log(` 3. Set ${chalk.cyan("TERSE_REMOTE_SERVER_URL")} in ${chalk.cyan(".env")} before running ${chalk.cyan("terse deploy")}`);
|
|
55
|
+
console.log(` 4. Run ${chalk.cyan("terse integrate")} to connect integrations`);
|
|
56
|
+
console.log("");
|
|
57
|
+
}
|
|
58
|
+
function canGenerateFromCurrentDirectory(provider, cwd) {
|
|
59
|
+
return provider.detectionMarkers.requiredFiles.every(relativePath => fs.existsSync(path.join(cwd, relativePath)));
|
|
60
|
+
}
|
|
61
|
+
//# sourceMappingURL=attach.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"attach.js","sourceRoot":"","sources":["../src/attach.ts"],"names":[],"mappings":"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"}
|
package/dist/auth.d.ts
CHANGED
|
@@ -11,4 +11,5 @@ export declare function login(): Promise<{
|
|
|
11
11
|
* If a valid key already exists, prompts the user to confirm before re-authenticating.
|
|
12
12
|
*/
|
|
13
13
|
export declare function loginAndWriteEnv(targetDir: string): Promise<boolean>;
|
|
14
|
+
export declare function getExistingAuthenticatedUserName(targetDir?: string): Promise<string | null>;
|
|
14
15
|
//# sourceMappingURL=auth.d.ts.map
|
package/dist/auth.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"auth.d.ts","sourceRoot":"","sources":["../src/auth.ts"],"names":[],"mappings":"AAqHA;;;GAGG;AACH,wBAAsB,KAAK,IAAI,OAAO,CAAC;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,WAAW,EAAE,MAAM,GAAG,IAAI,CAAA;CAAE,GAAG,IAAI,CAAC,CA0C5F;AAED;;;GAGG;AACH,wBAAsB,gBAAgB,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAiC1E"}
|
|
1
|
+
{"version":3,"file":"auth.d.ts","sourceRoot":"","sources":["../src/auth.ts"],"names":[],"mappings":"AAqHA;;;GAGG;AACH,wBAAsB,KAAK,IAAI,OAAO,CAAC;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,WAAW,EAAE,MAAM,GAAG,IAAI,CAAA;CAAE,GAAG,IAAI,CAAC,CA0C5F;AAED;;;GAGG;AACH,wBAAsB,gBAAgB,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAiC1E;AAED,wBAAsB,gCAAgC,CAAC,SAAS,GAAE,MAAsB,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAYhH"}
|
package/dist/auth.js
CHANGED
|
@@ -5,7 +5,7 @@ import fs from "node:fs";
|
|
|
5
5
|
import path from "node:path";
|
|
6
6
|
import process from "node:process";
|
|
7
7
|
import ora from "ora";
|
|
8
|
-
import { fetchWithAuth,
|
|
8
|
+
import { fetchWithAuth, readApiKeyFromDir } from "./api.js";
|
|
9
9
|
import { BACKEND_URL, WORKOS_CLIENT_ID } from "./config.js";
|
|
10
10
|
const DEVICE_AUTH_URL = "https://api.workos.com/user_management/authorize/device";
|
|
11
11
|
const TOKEN_URL = "https://api.workos.com/user_management/authenticate";
|
|
@@ -124,23 +124,24 @@ export async function login() {
|
|
|
124
124
|
* If a valid key already exists, prompts the user to confirm before re-authenticating.
|
|
125
125
|
*/
|
|
126
126
|
export async function loginAndWriteEnv(targetDir) {
|
|
127
|
-
const
|
|
128
|
-
if (
|
|
127
|
+
const existingUserName = await getExistingAuthenticatedUserName(targetDir);
|
|
128
|
+
if (existingUserName) {
|
|
129
129
|
const spinner = ora("Checking existing API key").start();
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
catch {
|
|
139
|
-
spinner.warn("Existing API key is invalid or expired");
|
|
140
|
-
}
|
|
130
|
+
spinner.succeed(`Already logged in as ${chalk.bold(existingUserName)}`);
|
|
131
|
+
const shouldContinue = await confirm({ message: "Log in again with a different account?", default: false });
|
|
132
|
+
if (!shouldContinue)
|
|
133
|
+
return true;
|
|
134
|
+
}
|
|
135
|
+
if (readApiKeyFromDir(targetDir)) {
|
|
136
|
+
const spinner = ora("Checking existing API key").start();
|
|
137
|
+
spinner.warn("Existing API key is invalid or expired");
|
|
141
138
|
}
|
|
142
139
|
const result = await login();
|
|
143
|
-
|
|
140
|
+
if (!result?.apiKey) {
|
|
141
|
+
console.log(chalk.dim(" You can run `terse login` later to authenticate."));
|
|
142
|
+
return false;
|
|
143
|
+
}
|
|
144
|
+
const apiKey = result.apiKey;
|
|
144
145
|
const envPath = path.resolve(targetDir, ".env");
|
|
145
146
|
const envContent = fs.existsSync(envPath) ? fs.readFileSync(envPath, "utf-8") : "";
|
|
146
147
|
if (envContent.includes("TERSE_API_KEY=")) {
|
|
@@ -150,9 +151,19 @@ export async function loginAndWriteEnv(targetDir) {
|
|
|
150
151
|
else {
|
|
151
152
|
fs.writeFileSync(envPath, envContent ? `${envContent.trimEnd()}\nTERSE_API_KEY=${apiKey}\n` : `TERSE_API_KEY=${apiKey}\n`);
|
|
152
153
|
}
|
|
153
|
-
if (!result) {
|
|
154
|
-
console.log(chalk.dim(" You can run `terse login` later to authenticate."));
|
|
155
|
-
}
|
|
156
154
|
return true;
|
|
157
155
|
}
|
|
156
|
+
export async function getExistingAuthenticatedUserName(targetDir = process.cwd()) {
|
|
157
|
+
const existingKey = readApiKeyFromDir(targetDir);
|
|
158
|
+
if (!existingKey) {
|
|
159
|
+
return null;
|
|
160
|
+
}
|
|
161
|
+
try {
|
|
162
|
+
const me = await fetchWithAuth("/sdk/me", existingKey);
|
|
163
|
+
return me.displayName || me.firstName || me.email || "Unknown user";
|
|
164
|
+
}
|
|
165
|
+
catch {
|
|
166
|
+
return null;
|
|
167
|
+
}
|
|
168
|
+
}
|
|
158
169
|
//# sourceMappingURL=auth.js.map
|
package/dist/auth.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"auth.js","sourceRoot":"","sources":["../src/auth.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,mBAAmB,CAAA;AAC3C,OAAO,KAAK,MAAM,OAAO,CAAA;AACzB,OAAO,EAAE,IAAI,EAAE,MAAM,oBAAoB,CAAA;AACzC,OAAO,EAAE,MAAM,SAAS,CAAA;AACxB,OAAO,IAAI,MAAM,WAAW,CAAA;AAC5B,OAAO,OAAO,MAAM,cAAc,CAAA;AAClC,OAAO,GAAG,MAAM,KAAK,CAAA;AAGrB,OAAO,EAAE,aAAa,EAAE,
|
|
1
|
+
{"version":3,"file":"auth.js","sourceRoot":"","sources":["../src/auth.ts"],"names":[],"mappings":"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"}
|
package/dist/deploy.d.ts
CHANGED
|
@@ -1,3 +1,3 @@
|
|
|
1
1
|
import type { LanguageProvider } from "./providers/LanguageProvider.js";
|
|
2
|
-
export declare function deploy(provider?: LanguageProvider): Promise<void>;
|
|
2
|
+
export declare function deploy(provider?: LanguageProvider, entryFile?: string): Promise<void>;
|
|
3
3
|
//# sourceMappingURL=deploy.d.ts.map
|
package/dist/deploy.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"deploy.d.ts","sourceRoot":"","sources":["../src/deploy.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"deploy.d.ts","sourceRoot":"","sources":["../src/deploy.ts"],"names":[],"mappings":"AAUA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,iCAAiC,CAAA;AAGvE,wBAAsB,MAAM,CAAC,QAAQ,GAAE,gBAAoC,EAAE,SAAS,CAAC,EAAE,MAAM,iBA2F9F"}
|
package/dist/deploy.js
CHANGED
|
@@ -4,19 +4,29 @@ import fs from "node:fs";
|
|
|
4
4
|
import path from "node:path";
|
|
5
5
|
import ora from "ora";
|
|
6
6
|
import { ApiRoutes, sdkDeployRequestBodySchema } from "terse-types";
|
|
7
|
-
import { fetchWithAuth, readApiKeyOrBail } from "./api.js";
|
|
8
|
-
import { assertProjectRoot } from "./assertProjectRoot.js";
|
|
7
|
+
import { fetchWithAuth, readApiKeyOrBail, readEnvVar } from "./api.js";
|
|
9
8
|
import { loadJobRegistry } from "./loadJob.js";
|
|
10
9
|
import { resolveProvider } from "./providers/resolveProvider.js";
|
|
11
|
-
export async function deploy(provider = resolveProvider()) {
|
|
12
|
-
assertProjectRoot(provider);
|
|
10
|
+
export async function deploy(provider = resolveProvider(), entryFile) {
|
|
13
11
|
const apiKey = readApiKeyOrBail({
|
|
14
12
|
title: "Error: No TERSE_API_KEY found in .env",
|
|
15
13
|
detail: "Run `terse init` to set up your project, or add TERSE_API_KEY to your .env file."
|
|
16
14
|
});
|
|
17
|
-
const registry = await loadJobRegistry(provider);
|
|
15
|
+
const registry = await loadJobRegistry(provider, entryFile);
|
|
18
16
|
const jobs = [...registry.values()];
|
|
19
|
-
|
|
17
|
+
// If TERSE_REMOTE_SERVER_URL (or legacy TERSE_JOB_URL) is set in .env, deploy
|
|
18
|
+
// in URL mode (user infrastructure). No source code is zipped or uploaded.
|
|
19
|
+
const remoteServerUrl = readEnvVar("TERSE_REMOTE_SERVER_URL") ?? readEnvVar("TERSE_JOB_URL");
|
|
20
|
+
const isUrlMode = !!remoteServerUrl;
|
|
21
|
+
let sourceZipBase64;
|
|
22
|
+
let fileCount = 0;
|
|
23
|
+
let zipSizeBytes = 0;
|
|
24
|
+
if (!isUrlMode) {
|
|
25
|
+
const zipPayload = buildZipPayload(provider);
|
|
26
|
+
sourceZipBase64 = zipPayload.sourceZipBase64;
|
|
27
|
+
fileCount = zipPayload.fileCount;
|
|
28
|
+
zipSizeBytes = zipPayload.zipSizeBytes;
|
|
29
|
+
}
|
|
20
30
|
const spinner = ora(`Deploying ${jobs.length} job${jobs.length === 1 ? "" : "s"}...`).start();
|
|
21
31
|
try {
|
|
22
32
|
const body = sdkDeployRequestBodySchema.parse({
|
|
@@ -24,9 +34,9 @@ export async function deploy(provider = resolveProvider()) {
|
|
|
24
34
|
jobName: job.name,
|
|
25
35
|
triggers: job.triggers,
|
|
26
36
|
outputs: job.skills ?? [],
|
|
27
|
-
toolApprovals: job.toolApprovals ?? []
|
|
28
|
-
webhookURL: job.webhookURL
|
|
37
|
+
toolApprovals: job.toolApprovals ?? []
|
|
29
38
|
})),
|
|
39
|
+
remoteServerUrl: isUrlMode ? remoteServerUrl : undefined,
|
|
30
40
|
sourceZipBase64
|
|
31
41
|
});
|
|
32
42
|
const result = await fetchWithAuth(ApiRoutes.SDK.DEPLOY, apiKey, body, "POST");
|
|
@@ -49,8 +59,23 @@ export async function deploy(provider = resolveProvider()) {
|
|
|
49
59
|
}
|
|
50
60
|
}
|
|
51
61
|
}
|
|
52
|
-
|
|
53
|
-
|
|
62
|
+
if (isUrlMode) {
|
|
63
|
+
console.log(chalk.dim(` Mode: user infrastructure`));
|
|
64
|
+
console.log(chalk.dim(` Server URL: ${remoteServerUrl}`));
|
|
65
|
+
const signingSecret = result.results.find(r => r.signingSecret)?.signingSecret;
|
|
66
|
+
if (signingSecret) {
|
|
67
|
+
const existingSecret = readEnvVar("TERSE_SIGNING_SECRET");
|
|
68
|
+
if (!existingSecret) {
|
|
69
|
+
console.log(`\n Add this to your ${chalk.bold(".env")} file:\n`);
|
|
70
|
+
console.log(`TERSE_SIGNING_SECRET=${signingSecret}`);
|
|
71
|
+
console.log("");
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
else {
|
|
76
|
+
console.log(chalk.dim(` Files: ${fileCount}`));
|
|
77
|
+
console.log(chalk.dim(` Zip size: ${(zipSizeBytes / 1024).toFixed(1)} KB`));
|
|
78
|
+
}
|
|
54
79
|
if (result.removed.length > 0) {
|
|
55
80
|
console.log(chalk.yellow(`\nRemoved ${result.removed.length} stale job${result.removed.length === 1 ? "" : "s"} no longer in project:`));
|
|
56
81
|
for (const r of result.removed) {
|
package/dist/deploy.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"deploy.js","sourceRoot":"","sources":["../src/deploy.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAA;AACzB,OAAO,EAAE,OAAO,EAAE,MAAM,QAAQ,CAAA;AAChC,OAAO,EAAE,MAAM,SAAS,CAAA;AACxB,OAAO,IAAI,MAAM,WAAW,CAAA;AAC5B,OAAO,GAAG,MAAM,KAAK,CAAA;AACrB,OAAO,EAAE,SAAS,EAAE,0BAA0B,EAAE,MAAM,aAAa,CAAA;AAGnE,OAAO,EAAE,aAAa,EAAE,gBAAgB,EAAE,
|
|
1
|
+
{"version":3,"file":"deploy.js","sourceRoot":"","sources":["../src/deploy.ts"],"names":[],"mappings":"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"}
|
package/dist/generate.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"generate.d.ts","sourceRoot":"","sources":["../src/generate.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"generate.d.ts","sourceRoot":"","sources":["../src/generate.ts"],"names":[],"mappings":"AAsBA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,iCAAiC,CAAA;AAkBvE,wBAAsB,QAAQ,CAAC,QAAQ,GAAE,gBAAoC,GAAG,OAAO,CAAC,IAAI,CAAC,CAoT5F"}
|
package/dist/generate.js
CHANGED
|
@@ -9,7 +9,7 @@ import { assertProjectRoot } from "./assertProjectRoot.js";
|
|
|
9
9
|
import { resolveProvider } from "./providers/resolveProvider.js";
|
|
10
10
|
// ── Main ──────────────────────────────────────────────────────────────
|
|
11
11
|
export async function generate(provider = resolveProvider()) {
|
|
12
|
-
assertProjectRoot(provider);
|
|
12
|
+
assertProjectRoot(provider, provider.detectionMarkers);
|
|
13
13
|
const totalStart = performance.now();
|
|
14
14
|
// 1. Read API key
|
|
15
15
|
const apiKey = readApiKeyOrBail({
|
|
@@ -61,9 +61,7 @@ export async function generate(provider = resolveProvider()) {
|
|
|
61
61
|
github: [],
|
|
62
62
|
slack: [],
|
|
63
63
|
gmail: [],
|
|
64
|
-
figma: [],
|
|
65
64
|
linear: [],
|
|
66
|
-
atlassian: [],
|
|
67
65
|
notion: [],
|
|
68
66
|
posthog: [],
|
|
69
67
|
datadog: [],
|
|
@@ -102,37 +100,18 @@ export async function generate(provider = resolveProvider()) {
|
|
|
102
100
|
}));
|
|
103
101
|
}));
|
|
104
102
|
}
|
|
105
|
-
// ── Figma (no resources) ──
|
|
106
|
-
if (has(IntegrationType.FIGMA)) {
|
|
107
|
-
promises.push(safely(async () => {
|
|
108
|
-
const instances = await fetchWithAuth(ApiRoutes.FIGMA.INTEGRATIONS, apiKey);
|
|
109
|
-
input.figma = instances.map(inst => ({ id: inst.id, displayName: inst.handle || inst.id }));
|
|
110
|
-
}));
|
|
111
|
-
}
|
|
112
103
|
// ── Linear (fetches teams per instance) ──
|
|
113
104
|
if (has(IntegrationType.LINEAR)) {
|
|
114
105
|
promises.push(safely(async () => {
|
|
115
106
|
const instances = await fetchWithAuth(ApiRoutes.LINEAR.INTEGRATIONS, apiKey);
|
|
116
107
|
input.linear = await Promise.all(instances.map(async (inst) => {
|
|
117
108
|
const teams = await fetchWithAuth(`${ApiRoutes.LINEAR.TEAMS}?integrationId=${encodeURIComponent(inst.id)}`, apiKey).catch(() => []);
|
|
118
|
-
|
|
119
|
-
}));
|
|
120
|
-
}));
|
|
121
|
-
}
|
|
122
|
-
// ── Atlassian — fetches Jira projects + Confluence pages per instance ──
|
|
123
|
-
if (has(IntegrationType.ATLASSIAN)) {
|
|
124
|
-
promises.push(safely(async () => {
|
|
125
|
-
const instances = await fetchWithAuth(ApiRoutes.ATLASSIAN.INTEGRATIONS, apiKey);
|
|
126
|
-
input.atlassian = await Promise.all(instances.map(async (inst) => {
|
|
127
|
-
const [jiraResp, confResp] = await Promise.all([
|
|
128
|
-
fetchWithAuth(`${ApiRoutes.JIRA.RESOURCES}?integrationId=${encodeURIComponent(inst.id)}`, apiKey).catch(() => null),
|
|
129
|
-
fetchWithAuth(`${ApiRoutes.CONFLUENCE.RESOURCES}?integrationId=${encodeURIComponent(inst.id)}`, apiKey).catch(() => null)
|
|
130
|
-
]);
|
|
109
|
+
const projects = await fetchWithAuth(`${ApiRoutes.LINEAR.PROJECTS}?integrationId=${encodeURIComponent(inst.id)}`, apiKey).catch(() => []);
|
|
131
110
|
return {
|
|
132
111
|
id: inst.id,
|
|
133
|
-
displayName: inst.
|
|
134
|
-
|
|
135
|
-
|
|
112
|
+
displayName: inst.workspaceName || inst.id,
|
|
113
|
+
teams: Array.isArray(teams) ? teams : [],
|
|
114
|
+
projects: Array.isArray(projects) ? projects : []
|
|
136
115
|
};
|
|
137
116
|
}));
|
|
138
117
|
}));
|
|
@@ -212,9 +191,7 @@ export async function generate(provider = resolveProvider()) {
|
|
|
212
191
|
const integrationCount = input.github.length +
|
|
213
192
|
input.slack.length +
|
|
214
193
|
input.gmail.length +
|
|
215
|
-
input.figma.length +
|
|
216
194
|
input.linear.length +
|
|
217
|
-
input.atlassian.length +
|
|
218
195
|
input.notion.length +
|
|
219
196
|
input.posthog.length +
|
|
220
197
|
input.datadog.length +
|
|
@@ -238,7 +215,7 @@ export async function generate(provider = resolveProvider()) {
|
|
|
238
215
|
console.log(` ${chalk.green("+")} Schedule trigger`);
|
|
239
216
|
console.log(` ${chalk.green("+")} Terse skills (web search)`);
|
|
240
217
|
console.log("");
|
|
241
|
-
console.log(` ${chalk.green.bold("Generated")} ${provider.
|
|
218
|
+
console.log(` ${chalk.green.bold("Generated")} ${path.relative(process.cwd(), provider.resolveGeneratedCodePath(process.cwd()))}`);
|
|
242
219
|
console.log(` ${chalk.dim(`Codegen: ${codegenMs.toFixed(0)}ms | Total: ${totalMs.toFixed(0)}ms`)}`);
|
|
243
220
|
console.log("");
|
|
244
221
|
}
|
|
@@ -252,7 +229,7 @@ async function safely(fn) {
|
|
|
252
229
|
}
|
|
253
230
|
}
|
|
254
231
|
function writeOutput(code, provider) {
|
|
255
|
-
const outputPath =
|
|
232
|
+
const outputPath = provider.resolveGeneratedCodePath(process.cwd());
|
|
256
233
|
const outputDir = path.dirname(outputPath);
|
|
257
234
|
if (!fs.existsSync(outputDir)) {
|
|
258
235
|
fs.mkdirSync(outputDir, { recursive: true });
|
|
@@ -273,19 +250,10 @@ function printSummary(input) {
|
|
|
273
250
|
const n = inst.channels.length;
|
|
274
251
|
console.log(` ${g} Slack (${inst.displayName}) — ${n} ${n === 1 ? "channel" : "channels"}`);
|
|
275
252
|
}
|
|
276
|
-
for (const inst of input.figma) {
|
|
277
|
-
console.log(` ${g} Figma (${inst.displayName})`);
|
|
278
|
-
}
|
|
279
253
|
for (const inst of input.linear) {
|
|
280
254
|
const n = inst.teams.length;
|
|
281
255
|
console.log(` ${g} Linear (${inst.displayName}) — ${n} ${n === 1 ? "team" : "teams"}`);
|
|
282
256
|
}
|
|
283
|
-
for (const inst of input.atlassian) {
|
|
284
|
-
const jp = inst.jiraProjects.length;
|
|
285
|
-
const cp = inst.confluencePages.length;
|
|
286
|
-
console.log(` ${g} Jira (${inst.displayName}) — ${jp} ${jp === 1 ? "project" : "projects"}`);
|
|
287
|
-
console.log(` ${g} Confluence (${inst.displayName}) — ${cp} ${cp === 1 ? "page" : "pages"}`);
|
|
288
|
-
}
|
|
289
257
|
for (const inst of input.notion) {
|
|
290
258
|
const d = inst.databases.length;
|
|
291
259
|
const p = inst.pages.length;
|