terse-cli 0.1.18 → 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.
Files changed (105) hide show
  1. package/README.md +15 -0
  2. package/dist/api.d.ts +3 -0
  3. package/dist/api.d.ts.map +1 -1
  4. package/dist/api.js +16 -6
  5. package/dist/api.js.map +1 -1
  6. package/dist/assertProjectRoot.d.ts +4 -1
  7. package/dist/assertProjectRoot.d.ts.map +1 -1
  8. package/dist/assertProjectRoot.js +3 -3
  9. package/dist/assertProjectRoot.js.map +1 -1
  10. package/dist/attach.d.ts +3 -0
  11. package/dist/attach.d.ts.map +1 -0
  12. package/dist/attach.js +61 -0
  13. package/dist/attach.js.map +1 -0
  14. package/dist/auth.d.ts +1 -0
  15. package/dist/auth.d.ts.map +1 -1
  16. package/dist/auth.js +29 -18
  17. package/dist/auth.js.map +1 -1
  18. package/dist/deploy.d.ts +1 -1
  19. package/dist/deploy.d.ts.map +1 -1
  20. package/dist/deploy.js +42 -10
  21. package/dist/deploy.js.map +1 -1
  22. package/dist/generate.d.ts.map +1 -1
  23. package/dist/generate.js +7 -39
  24. package/dist/generate.js.map +1 -1
  25. package/dist/index.js +26 -5
  26. package/dist/index.js.map +1 -1
  27. package/dist/init.d.ts.map +1 -1
  28. package/dist/init.js +11 -1
  29. package/dist/init.js.map +1 -1
  30. package/dist/loadJob.d.ts +2 -2
  31. package/dist/loadJob.d.ts.map +1 -1
  32. package/dist/loadJob.js +11 -5
  33. package/dist/loadJob.js.map +1 -1
  34. package/dist/promptErrors.d.ts +2 -0
  35. package/dist/promptErrors.d.ts.map +1 -0
  36. package/dist/promptErrors.js +8 -0
  37. package/dist/promptErrors.js.map +1 -0
  38. package/dist/providers/LanguageProvider.d.ts +8 -2
  39. package/dist/providers/LanguageProvider.d.ts.map +1 -1
  40. package/dist/providers/codegenTypes.d.ts +6 -16
  41. package/dist/providers/codegenTypes.d.ts.map +1 -1
  42. package/dist/providers/fetchSdkVersion.d.ts +4 -0
  43. package/dist/providers/fetchSdkVersion.d.ts.map +1 -0
  44. package/dist/providers/fetchSdkVersion.js +24 -0
  45. package/dist/providers/fetchSdkVersion.js.map +1 -0
  46. package/dist/providers/python/PythonProvider.d.ts +20 -2
  47. package/dist/providers/python/PythonProvider.d.ts.map +1 -1
  48. package/dist/providers/python/PythonProvider.js +65 -28
  49. package/dist/providers/python/PythonProvider.js.map +1 -1
  50. package/dist/providers/python/preparePythonCodegenData.d.ts +50 -0
  51. package/dist/providers/python/preparePythonCodegenData.d.ts.map +1 -1
  52. package/dist/providers/python/preparePythonCodegenData.js +100 -7
  53. package/dist/providers/python/preparePythonCodegenData.js.map +1 -1
  54. package/dist/providers/resolveProvider.js +2 -2
  55. package/dist/providers/resolveProvider.js.map +1 -1
  56. package/dist/providers/shared/entryFileGuidance.d.ts +10 -0
  57. package/dist/providers/shared/entryFileGuidance.d.ts.map +1 -0
  58. package/dist/providers/shared/entryFileGuidance.js +20 -0
  59. package/dist/providers/shared/entryFileGuidance.js.map +1 -0
  60. package/dist/providers/shared/sessionStream.d.ts +4 -11
  61. package/dist/providers/shared/sessionStream.d.ts.map +1 -1
  62. package/dist/providers/shared/sessionStream.js +13 -68
  63. package/dist/providers/shared/sessionStream.js.map +1 -1
  64. package/dist/providers/typescript/TypeScriptProvider.d.ts +9 -3
  65. package/dist/providers/typescript/TypeScriptProvider.d.ts.map +1 -1
  66. package/dist/providers/typescript/TypeScriptProvider.js +43 -22
  67. package/dist/providers/typescript/TypeScriptProvider.js.map +1 -1
  68. package/dist/providers/typescript/prepareCodegenData.d.ts +1 -11
  69. package/dist/providers/typescript/prepareCodegenData.d.ts.map +1 -1
  70. package/dist/providers/typescript/prepareCodegenData.js +47 -50
  71. package/dist/providers/typescript/prepareCodegenData.js.map +1 -1
  72. package/dist/run.d.ts +1 -1
  73. package/dist/run.d.ts.map +1 -1
  74. package/dist/run.js +8 -8
  75. package/dist/run.js.map +1 -1
  76. package/dist/test.d.ts +1 -1
  77. package/dist/test.d.ts.map +1 -1
  78. package/dist/test.js +32 -10
  79. package/dist/test.js.map +1 -1
  80. package/dist/util.d.ts +2 -3
  81. package/dist/util.d.ts.map +1 -1
  82. package/dist/util.js +3 -3
  83. package/dist/util.js.map +1 -1
  84. package/package.json +3 -3
  85. package/templates/python/codegen/generated.hbs +5 -0
  86. package/templates/python/codegen/partials/github-section.hbs +149 -0
  87. package/templates/python/codegen/partials/gmail-section.hbs +30 -0
  88. package/templates/python/codegen/partials/linear-section.hbs +229 -0
  89. package/templates/python/codegen/partials/schedule-section.hbs +8 -2
  90. package/templates/python/codegen/partials/slack-section.hbs +110 -22
  91. package/templates/python/codegen/partials/webhook-section.hbs +15 -0
  92. package/templates/python/codegen/partials/workos-section.hbs +149 -0
  93. package/templates/python/init/README.md.hbs +5 -3
  94. package/templates/python/init/src/main.py.hbs +10 -13
  95. package/templates/typescript/codegen/generated.hbs +0 -2
  96. package/templates/typescript/codegen/partials/github-section.hbs +16 -12
  97. package/templates/typescript/codegen/partials/gmail-section.hbs +2 -2
  98. package/templates/typescript/codegen/partials/linear-section.hbs +19 -13
  99. package/templates/typescript/codegen/partials/slack-section.hbs +15 -7
  100. package/templates/typescript/codegen/partials/system-section.hbs +11 -2
  101. package/templates/typescript/codegen/partials/workos-section.hbs +34 -22
  102. package/templates/typescript/init/package.json.hbs +1 -1
  103. package/templates/typescript/init/src/{index.ts.hbs → terse.jobs.ts.hbs} +2 -2
  104. package/templates/typescript/codegen/partials/atlassian-section.hbs +0 -32
  105. 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,CAiB1C;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"}
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 readApiKey() {
6
- const envPath = path.resolve(process.cwd(), ".env");
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() === "TERSE_API_KEY") {
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":"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"}
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): void;
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,CAQlE"}
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 = provider.projectMarkers.requiredFiles.filter(relativePath => !fs.existsSync(path.join(cwd, relativePath)));
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 ${provider.projectMarkers.description}. Missing: ${missingFiles.join(", ")}.`));
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;IACxD,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,EAAE,CAAA;IACzB,MAAM,YAAY,GAAG,QAAQ,CAAC,cAAc,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/H,IAAI,YAAY,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC1B,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,qCAAqC,QAAQ,CAAC,cAAc,CAAC,WAAW,cAAc,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAA;QAC1I,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;IACnB,CAAC;AACL,CAAC"}
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"}
@@ -0,0 +1,3 @@
1
+ import type { LanguageProvider } from "./providers/LanguageProvider.js";
2
+ export declare function attach(provider?: LanguageProvider): Promise<void>;
3
+ //# sourceMappingURL=attach.d.ts.map
@@ -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
@@ -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, readApiKey } from "./api.js";
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 existingKey = readApiKey();
128
- if (existingKey) {
127
+ const existingUserName = await getExistingAuthenticatedUserName(targetDir);
128
+ if (existingUserName) {
129
129
  const spinner = ora("Checking existing API key").start();
130
- try {
131
- const me = await fetchWithAuth("/sdk/me", existingKey);
132
- const name = me.displayName || me.firstName || me.email || "Unknown user";
133
- spinner.succeed(`Already logged in as ${chalk.bold(name)}`);
134
- const shouldContinue = await confirm({ message: "Log in again with a different account?", default: false });
135
- if (!shouldContinue)
136
- return true;
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
- const apiKey = result?.apiKey ?? "";
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":"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"}
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
@@ -1 +1 @@
1
- {"version":3,"file":"deploy.d.ts","sourceRoot":"","sources":["../src/deploy.ts"],"names":[],"mappings":"AAWA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,iCAAiC,CAAA;AAGvE,wBAAsB,MAAM,CAAC,QAAQ,GAAE,gBAAoC,iBAwD1E"}
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
- const { sourceZipBase64, fileCount, zipSizeBytes } = buildZipPayload(provider);
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");
@@ -41,9 +51,31 @@ export async function deploy(provider = resolveProvider()) {
41
51
  for (const r of result.results) {
42
52
  const verb = r.isUpdate ? "Updated" : "Created";
43
53
  console.log(chalk.dim(` ${verb} "${r.jobName}" (${r.automationId})`));
54
+ if (r.triggers) {
55
+ for (const t of r.triggers) {
56
+ if (t.metadata?.webhookUrl) {
57
+ console.log(chalk.cyan(` Webhook URL: ${t.metadata.webhookUrl}`));
58
+ }
59
+ }
60
+ }
61
+ }
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`));
44
78
  }
45
- console.log(chalk.dim(` Files: ${fileCount}`));
46
- console.log(chalk.dim(` Zip size: ${(zipSizeBytes / 1024).toFixed(1)} KB`));
47
79
  if (result.removed.length > 0) {
48
80
  console.log(chalk.yellow(`\nRemoved ${result.removed.length} stale job${result.removed.length === 1 ? "" : "s"} no longer in project:`));
49
81
  for (const r of result.removed) {
@@ -1 +1 @@
1
- {"version":3,"file":"deploy.js","sourceRoot":"","sources":["../src/deploy.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"deploy.js","sourceRoot":"","sources":["../src/deploy.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"generate.d.ts","sourceRoot":"","sources":["../src/generate.ts"],"names":[],"mappings":"AAwBA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,iCAAiC,CAAA;AAmBvE,wBAAsB,QAAQ,CAAC,QAAQ,GAAE,gBAAoC,GAAG,OAAO,CAAC,IAAI,CAAC,CAsV5F"}
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
- return { id: inst.id, displayName: inst.workspaceName || inst.id, teams: Array.isArray(teams) ? teams : [] };
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.siteName || inst.email || inst.id,
134
- jiraProjects: jiraResp?.resources?.projects || [],
135
- confluencePages: confResp?.resources || []
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.generatedCodePath}`);
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 = path.resolve(process.cwd(), provider.generatedCodePath);
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;