@companyhelm/cli 0.4.3 → 0.4.5

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/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 CompanyHelm
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,55 @@
1
+ # CompanyHelm CLI
2
+
3
+ Standalone source repository for the public `@companyhelm/cli` npm package.
4
+
5
+ ## Install or run
6
+
7
+ Run the latest CLI without a global install:
8
+
9
+ ```bash
10
+ npx -y @companyhelm/cli@latest --help
11
+ ```
12
+
13
+ Complete a CompanyHelm provider subscription login command generated by the CompanyHelm web app:
14
+
15
+ ```bash
16
+ npx -y @companyhelm/cli@latest provider login --code <code>
17
+ ```
18
+
19
+ For non-production CompanyHelm API URLs, pass the generated API URL:
20
+
21
+ ```bash
22
+ npx -y @companyhelm/cli@latest provider login --code <code> --api-url https://api.example.test
23
+ ```
24
+
25
+ ## Development
26
+
27
+ ```bash
28
+ npm ci
29
+ npm run check
30
+ npm run test
31
+ npm run build
32
+ ```
33
+
34
+ Local development entrypoint:
35
+
36
+ ```bash
37
+ npm run dev -- provider --help
38
+ ```
39
+
40
+ ## Publishing
41
+
42
+ This repository publishes `@companyhelm/cli` with npm trusted publishing from GitHub Actions.
43
+
44
+ Trusted publisher configuration on npm must match:
45
+
46
+ - Repository: `CompanyHelm/companyhelm-cli`
47
+ - Workflow filename: `npm-publish.yml`
48
+ - Environment: blank / no environment
49
+
50
+ Publish options:
51
+
52
+ 1. Create and push a semver tag such as `v0.4.5` on a commit contained in `main`.
53
+ 2. Or manually run the **Publish npm package** workflow from `main`.
54
+
55
+ The workflow verifies the package, packs it, skips if the exact version is already on npm, and publishes with provenance using OIDC.
@@ -8,12 +8,13 @@ import type { CliIo } from "./cli_io_interface.js";
8
8
  export declare class CompanyHelmCli {
9
9
  private readonly io;
10
10
  constructor(io?: CliIo);
11
- run(argv: string[]): Promise<void>;
11
+ run(argv: string[]): Promise<number>;
12
12
  createProgram(): Command;
13
13
  private createStatusCommand;
14
14
  private createServerCommand;
15
15
  private createRunnerCommand;
16
16
  private createProviderCommand;
17
+ private static errorMessage;
17
18
  private printStatus;
18
19
  private printServerCommand;
19
20
  private printRunnerCommand;
@@ -2,6 +2,7 @@ import { readFileSync } from "node:fs";
2
2
  import { Command } from "commander";
3
3
  import { ConsoleIo } from "./console_io.js";
4
4
  import { ProviderLoginCommand } from "./provider/login_command.js";
5
+ import { TerminalStyle } from "./terminal_style.js";
5
6
  /**
6
7
  * Defines the public `companyhelm` command that npm users install. The initial
7
8
  * command surface intentionally focuses on package discovery and local stack
@@ -13,9 +14,16 @@ export class CompanyHelmCli {
13
14
  this.io = io;
14
15
  }
15
16
  async run(argv) {
16
- await this.createProgram().parseAsync(argv, {
17
- from: "node",
18
- });
17
+ try {
18
+ await this.createProgram().parseAsync(argv, {
19
+ from: "node",
20
+ });
21
+ return 0;
22
+ }
23
+ catch (error) {
24
+ this.io.writeError(TerminalStyle.error(CompanyHelmCli.errorMessage(error)));
25
+ return 1;
26
+ }
19
27
  }
20
28
  createProgram() {
21
29
  const program = new Command()
@@ -65,6 +73,15 @@ export class CompanyHelmCli {
65
73
  }));
66
74
  return providerCommand;
67
75
  }
76
+ static errorMessage(error) {
77
+ if (error instanceof Error && error.message.length > 0) {
78
+ if (error.message === "This login code is invalid or expired.") {
79
+ return "This login code is invalid or expired. Create a new provider login command in CompanyHelm and run it again.";
80
+ }
81
+ return error.message;
82
+ }
83
+ return "CompanyHelm CLI failed. Try again, or contact support if the issue continues.";
84
+ }
68
85
  printStatus() {
69
86
  this.io.writeLine("CompanyHelm CLI is installed.");
70
87
  this.io.writeLine("Main CLI package: @companyhelm/cli");
@@ -1 +1 @@
1
- {"version":3,"file":"companyhelm_cli.js","sourceRoot":"","sources":["../src/companyhelm_cli.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACvC,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAEpC,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAC5C,OAAO,EAAE,oBAAoB,EAAE,MAAM,6BAA6B,CAAC;AAMnE;;;;GAIG;AACH,MAAM,OAAO,cAAc;IACR,EAAE,CAAQ;IAE3B,YAAY,KAAY,IAAI,SAAS,EAAE;QACrC,IAAI,CAAC,EAAE,GAAG,EAAE,CAAC;IACf,CAAC;IAED,KAAK,CAAC,GAAG,CAAC,IAAc;QACtB,MAAM,IAAI,CAAC,aAAa,EAAE,CAAC,UAAU,CAAC,IAAI,EAAE;YAC1C,IAAI,EAAE,MAAM;SACb,CAAC,CAAC;IACL,CAAC;IAED,aAAa;QACX,MAAM,OAAO,GAAG,IAAI,OAAO,EAAE;aAC1B,IAAI,CAAC,aAAa,CAAC;aACnB,WAAW,CAAC,+BAA+B,CAAC;aAC5C,OAAO,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC;aAC3B,kBAAkB,EAAE;aACpB,eAAe,CAAC;YACf,QAAQ,EAAE,CAAC,OAAO,EAAE,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC;YAC5D,QAAQ,EAAE,CAAC,OAAO,EAAE,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,SAAS,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC;SAC5D,CAAC,CAAC;QAEL,OAAO,CAAC,UAAU,CAAC,IAAI,CAAC,mBAAmB,EAAE,CAAC,CAAC;QAC/C,OAAO,CAAC,UAAU,CAAC,IAAI,CAAC,mBAAmB,EAAE,CAAC,CAAC;QAC/C,OAAO,CAAC,UAAU,CAAC,IAAI,CAAC,mBAAmB,EAAE,CAAC,CAAC;QAC/C,OAAO,CAAC,UAAU,CAAC,IAAI,CAAC,qBAAqB,EAAE,CAAC,CAAC;QACjD,OAAO,OAAO,CAAC;IACjB,CAAC;IAEO,mBAAmB;QACzB,OAAO,IAAI,OAAO,CAAC,QAAQ,CAAC;aACzB,WAAW,CAAC,oDAAoD,CAAC;aACjE,MAAM,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,CAAC;IACtC,CAAC;IAEO,mBAAmB;QACzB,OAAO,IAAI,OAAO,CAAC,QAAQ,CAAC;aACzB,WAAW,CAAC,uDAAuD,CAAC;aACpE,QAAQ,CAAC,WAAW,EAAE,gCAAgC,EAAE,OAAO,CAAC;aAChE,MAAM,CAAC,CAAC,OAAe,EAAE,EAAE,CAAC,IAAI,CAAC,kBAAkB,CAAC,OAAO,CAAC,CAAC,CAAC;IACnE,CAAC;IAEO,mBAAmB;QACzB,OAAO,IAAI,OAAO,CAAC,QAAQ,CAAC;aACzB,WAAW,CAAC,uDAAuD,CAAC;aACpE,QAAQ,CAAC,WAAW,EAAE,gCAAgC,EAAE,OAAO,CAAC;aAChE,MAAM,CAAC,CAAC,OAAe,EAAE,EAAE,CAAC,IAAI,CAAC,kBAAkB,CAAC,OAAO,CAAC,CAAC,CAAC;IACnE,CAAC;IAGO,qBAAqB;QAC3B,MAAM,eAAe,GAAG,IAAI,OAAO,CAAC,UAAU,CAAC;aAC5C,WAAW,CAAC,mDAAmD,CAAC,CAAC;QAEpE,eAAe,CAAC,UAAU,CAAC,IAAI,OAAO,CAAC,OAAO,CAAC;aAC5C,WAAW,CAAC,4DAA4D,CAAC;aACzE,cAAc,CAAC,eAAe,EAAE,uCAAuC,CAAC;aACxE,MAAM,CAAC,iBAAiB,EAAE,sBAAsB,EAAE,oBAAoB,CAAC,eAAe,CAAC;aACvF,MAAM,CAAC,KAAK,EAAE,OAAyC,EAAE,EAAE;YAC1D,MAAM,IAAI,oBAAoB,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC;gBAC1C,MAAM,EAAE,OAAO,CAAC,MAAM;gBACtB,IAAI,EAAE,OAAO,CAAC,IAAI;aACnB,CAAC,CAAC;QACL,CAAC,CAAC,CAAC,CAAC;QAEN,OAAO,eAAe,CAAC;IACzB,CAAC;IAEO,WAAW;QACjB,IAAI,CAAC,EAAE,CAAC,SAAS,CAAC,+BAA+B,CAAC,CAAC;QACnD,IAAI,CAAC,EAAE,CAAC,SAAS,CAAC,oCAAoC,CAAC,CAAC;QACxD,IAAI,CAAC,EAAE,CAAC,SAAS,CAAC,qCAAqC,CAAC,CAAC;QACzD,IAAI,CAAC,EAAE,CAAC,SAAS,CAAC,+CAA+C,CAAC,CAAC;IACrE,CAAC;IAEO,kBAAkB,CAAC,OAAe;QACxC,IAAI,CAAC,EAAE,CAAC,SAAS,CAAC,6BAA6B,OAAO,EAAE,CAAC,CAAC;QAC1D,IAAI,CAAC,EAAE,CAAC,SAAS,CAAC,0HAA0H,CAAC,CAAC;IAChJ,CAAC;IAEO,kBAAkB,CAAC,OAAe;QACxC,IAAI,CAAC,EAAE,CAAC,SAAS,CAAC,6BAA6B,OAAO,EAAE,CAAC,CAAC;QAC1D,IAAI,CAAC,EAAE,CAAC,SAAS,CAAC,4IAA4I,CAAC,CAAC;IAClK,CAAC;IAEO,WAAW;QACjB,MAAM,eAAe,GAAG,IAAI,CAAC,KAAK,CAChC,YAAY,CAAC,IAAI,GAAG,CAAC,iBAAiB,EAAE,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,MAAM,CAAC,CAC/C,CAAC;QAErB,IAAI,OAAO,eAAe,CAAC,OAAO,KAAK,QAAQ,IAAI,eAAe,CAAC,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACxF,OAAO,OAAO,CAAC;QACjB,CAAC;QACD,OAAO,eAAe,CAAC,OAAO,CAAC;IACjC,CAAC;CACF"}
1
+ {"version":3,"file":"companyhelm_cli.js","sourceRoot":"","sources":["../src/companyhelm_cli.ts"],"names":[],"mappings":"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"}
package/dist/index.js CHANGED
@@ -1,4 +1,4 @@
1
1
  #!/usr/bin/env node
2
2
  import { CompanyHelmCli } from "./companyhelm_cli.js";
3
- await new CompanyHelmCli().run(process.argv);
3
+ process.exitCode = await new CompanyHelmCli().run(process.argv);
4
4
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAEtD,MAAM,IAAI,cAAc,EAAE,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAEtD,OAAO,CAAC,QAAQ,GAAG,MAAM,IAAI,cAAc,EAAE,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC"}
@@ -1,3 +1,4 @@
1
+ import { TerminalStyle } from "../terminal_style.js";
1
2
  import { ProviderLoginClient } from "./login_client.js";
2
3
  import { ProviderOauthLoginRunner } from "./oauth_login_runner.js";
3
4
  /**
@@ -17,10 +18,14 @@ export class ProviderLoginCommand {
17
18
  async run(options) {
18
19
  const client = this.clientFactory(options.apiUrl);
19
20
  const request = await client.resolve(options.code);
20
- this.io.writeLine(`Adding ${request.providerName} credential "${request.credentialName}" to ${request.companyName}.`);
21
- this.io.writeLine(`Requested by ${request.requestedBy}. Expires at ${request.expiresAt}.`);
21
+ this.io.writeLine(TerminalStyle.info(`Adding ${request.providerName} credential to CompanyHelm.`));
22
+ this.io.writeLine(TerminalStyle.detail("Credential", request.credentialName));
23
+ this.io.writeLine(TerminalStyle.detail("Company", request.companyName));
24
+ this.io.writeLine(TerminalStyle.detail("Requested by", request.requestedBy));
25
+ this.io.writeLine(TerminalStyle.detail("Expires", request.expiresAt));
22
26
  const credentials = await this.oauthLoginRunner.login(request.piOauthProviderId);
23
- const result = await client.complete({
27
+ this.io.writeLine(TerminalStyle.progress("Saving credential in CompanyHelm..."));
28
+ await client.complete({
24
29
  code: options.code,
25
30
  credentials: {
26
31
  ...credentials,
@@ -29,7 +34,7 @@ export class ProviderLoginCommand {
29
34
  refresh: credentials.refresh,
30
35
  },
31
36
  });
32
- this.io.writeLine(`Credential added successfully: ${result.credentialId}`);
37
+ this.io.writeLine(TerminalStyle.success(`Credential "${request.credentialName}" added to ${request.companyName}.`));
33
38
  }
34
39
  }
35
40
  //# sourceMappingURL=login_command.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"login_command.js","sourceRoot":"","sources":["../../src/provider/login_command.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,mBAAmB,EAAE,MAAM,mBAAmB,CAAC;AACxD,OAAO,EAAE,wBAAwB,EAAE,MAAM,yBAAyB,CAAC;AAOnE;;;GAGG;AACH,MAAM,OAAO,oBAAoB;IAC/B,MAAM,CAAU,eAAe,GAAG,6BAA6B,CAAC;IAE/C,aAAa,CAA0C;IACvD,EAAE,CAAQ;IACV,gBAAgB,CAA2B;IAE5D,YACE,EAAS,EACT,gBAAyD,CAAC,MAAM,EAAE,EAAE,CAAC,IAAI,mBAAmB,CAAC,MAAM,CAAC,EACpG,mBAA6C,IAAI,wBAAwB,CAAC,EAAE,CAAC;QAE7E,IAAI,CAAC,aAAa,GAAG,aAAa,CAAC;QACnC,IAAI,CAAC,EAAE,GAAG,EAAE,CAAC;QACb,IAAI,CAAC,gBAAgB,GAAG,gBAAgB,CAAC;IAC3C,CAAC;IAED,KAAK,CAAC,GAAG,CAAC,OAAoC;QAC5C,MAAM,MAAM,GAAG,IAAI,CAAC,aAAa,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;QAClD,MAAM,OAAO,GAAG,MAAM,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;QACnD,IAAI,CAAC,EAAE,CAAC,SAAS,CAAC,UAAU,OAAO,CAAC,YAAY,gBAAgB,OAAO,CAAC,cAAc,QAAQ,OAAO,CAAC,WAAW,GAAG,CAAC,CAAC;QACtH,IAAI,CAAC,EAAE,CAAC,SAAS,CAAC,gBAAgB,OAAO,CAAC,WAAW,gBAAgB,OAAO,CAAC,SAAS,GAAG,CAAC,CAAC;QAC3F,MAAM,WAAW,GAAG,MAAM,IAAI,CAAC,gBAAgB,CAAC,KAAK,CAAC,OAAO,CAAC,iBAAiB,CAAC,CAAC;QACjF,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,QAAQ,CAAC;YACnC,IAAI,EAAE,OAAO,CAAC,IAAI;YAClB,WAAW,EAAE;gBACX,GAAG,WAAW;gBACd,MAAM,EAAE,WAAW,CAAC,MAAM;gBAC1B,OAAO,EAAE,WAAW,CAAC,OAAO;gBAC5B,OAAO,EAAE,WAAW,CAAC,OAAO;aAC7B;SACF,CAAC,CAAC;QACH,IAAI,CAAC,EAAE,CAAC,SAAS,CAAC,kCAAkC,MAAM,CAAC,YAAY,EAAE,CAAC,CAAC;IAC7E,CAAC"}
1
+ {"version":3,"file":"login_command.js","sourceRoot":"","sources":["../../src/provider/login_command.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,EAAE,mBAAmB,EAAE,MAAM,mBAAmB,CAAC;AACxD,OAAO,EAAE,wBAAwB,EAAE,MAAM,yBAAyB,CAAC;AAOnE;;;GAGG;AACH,MAAM,OAAO,oBAAoB;IAC/B,MAAM,CAAU,eAAe,GAAG,6BAA6B,CAAC;IAE/C,aAAa,CAA0C;IACvD,EAAE,CAAQ;IACV,gBAAgB,CAA2B;IAE5D,YACE,EAAS,EACT,gBAAyD,CAAC,MAAM,EAAE,EAAE,CAAC,IAAI,mBAAmB,CAAC,MAAM,CAAC,EACpG,mBAA6C,IAAI,wBAAwB,CAAC,EAAE,CAAC;QAE7E,IAAI,CAAC,aAAa,GAAG,aAAa,CAAC;QACnC,IAAI,CAAC,EAAE,GAAG,EAAE,CAAC;QACb,IAAI,CAAC,gBAAgB,GAAG,gBAAgB,CAAC;IAC3C,CAAC;IAED,KAAK,CAAC,GAAG,CAAC,OAAoC;QAC5C,MAAM,MAAM,GAAG,IAAI,CAAC,aAAa,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;QAClD,MAAM,OAAO,GAAG,MAAM,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;QACnD,IAAI,CAAC,EAAE,CAAC,SAAS,CAAC,aAAa,CAAC,IAAI,CAAC,UAAU,OAAO,CAAC,YAAY,6BAA6B,CAAC,CAAC,CAAC;QACnG,IAAI,CAAC,EAAE,CAAC,SAAS,CAAC,aAAa,CAAC,MAAM,CAAC,YAAY,EAAE,OAAO,CAAC,cAAc,CAAC,CAAC,CAAC;QAC9E,IAAI,CAAC,EAAE,CAAC,SAAS,CAAC,aAAa,CAAC,MAAM,CAAC,SAAS,EAAE,OAAO,CAAC,WAAW,CAAC,CAAC,CAAC;QACxE,IAAI,CAAC,EAAE,CAAC,SAAS,CAAC,aAAa,CAAC,MAAM,CAAC,cAAc,EAAE,OAAO,CAAC,WAAW,CAAC,CAAC,CAAC;QAC7E,IAAI,CAAC,EAAE,CAAC,SAAS,CAAC,aAAa,CAAC,MAAM,CAAC,SAAS,EAAE,OAAO,CAAC,SAAS,CAAC,CAAC,CAAC;QACtE,MAAM,WAAW,GAAG,MAAM,IAAI,CAAC,gBAAgB,CAAC,KAAK,CAAC,OAAO,CAAC,iBAAiB,CAAC,CAAC;QACjF,IAAI,CAAC,EAAE,CAAC,SAAS,CAAC,aAAa,CAAC,QAAQ,CAAC,qCAAqC,CAAC,CAAC,CAAC;QACjF,MAAM,MAAM,CAAC,QAAQ,CAAC;YACpB,IAAI,EAAE,OAAO,CAAC,IAAI;YAClB,WAAW,EAAE;gBACX,GAAG,WAAW;gBACd,MAAM,EAAE,WAAW,CAAC,MAAM;gBAC1B,OAAO,EAAE,WAAW,CAAC,OAAO;gBAC5B,OAAO,EAAE,WAAW,CAAC,OAAO;aAC7B;SACF,CAAC,CAAC;QACH,IAAI,CAAC,EAAE,CAAC,SAAS,CAAC,aAAa,CAAC,OAAO,CAAC,eAAe,OAAO,CAAC,cAAc,cAAc,OAAO,CAAC,WAAW,GAAG,CAAC,CAAC,CAAC;IACtH,CAAC"}
@@ -8,5 +8,4 @@ export declare class ProviderOauthLoginRunner {
8
8
  private readonly io;
9
9
  constructor(io: CliIo);
10
10
  login(providerId: string): Promise<OAuthCredentials>;
11
- private static promptLabel;
12
11
  }
@@ -1,4 +1,5 @@
1
1
  import { getOAuthProvider } from "@mariozechner/pi-ai/oauth";
2
+ import { TerminalStyle } from "../terminal_style.js";
2
3
  /**
3
4
  * Runs the provider OAuth flow supplied by Pi Mono and adapts its terminal callbacks to CompanyHelm's
4
5
  * small CLI IO interface. This keeps provider-specific login mechanics outside command parsing.
@@ -15,23 +16,16 @@ export class ProviderOauthLoginRunner {
15
16
  }
16
17
  return provider.login({
17
18
  onAuth: (info) => {
18
- if (info.instructions) {
19
- this.io.writeLine(info.instructions);
20
- }
21
- this.io.writeLine(info.url);
19
+ this.io.writeLine(TerminalStyle.info("Complete the provider login in your browser."));
20
+ this.io.writeLine(TerminalStyle.detail("Login URL", info.url));
22
21
  },
23
- onManualCodeInput: async () => this.io.readLine("Paste the authorization code or redirect URL: "),
24
22
  onProgress: (message) => {
25
- this.io.writeLine(message);
23
+ this.io.writeLine(TerminalStyle.progress(message));
24
+ },
25
+ onPrompt: async () => {
26
+ throw new Error("CompanyHelm CLI did not receive the provider browser callback. Open the login URL on this machine and try again.");
26
27
  },
27
- onPrompt: async (prompt) => this.io.readLine(ProviderOauthLoginRunner.promptLabel(prompt)),
28
28
  });
29
29
  }
30
- static promptLabel(prompt) {
31
- if (prompt.placeholder) {
32
- return `${prompt.message} (${prompt.placeholder}): `;
33
- }
34
- return `${prompt.message}: `;
35
- }
36
30
  }
37
31
  //# sourceMappingURL=oauth_login_runner.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"oauth_login_runner.js","sourceRoot":"","sources":["../../src/provider/oauth_login_runner.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAA2C,MAAM,2BAA2B,CAAC;AAGtG;;;GAGG;AACH,MAAM,OAAO,wBAAwB;IAClB,EAAE,CAAQ;IAE3B,YAAY,EAAS;QACnB,IAAI,CAAC,EAAE,GAAG,EAAE,CAAC;IACf,CAAC;IAED,KAAK,CAAC,KAAK,CAAC,UAAkB;QAC5B,MAAM,QAAQ,GAAG,gBAAgB,CAAC,UAAU,CAAC,CAAC;QAC9C,IAAI,CAAC,QAAQ,EAAE,CAAC;YACd,MAAM,IAAI,KAAK,CAAC,wCAAwC,UAAU,EAAE,CAAC,CAAC;QACxE,CAAC;QAED,OAAO,QAAQ,CAAC,KAAK,CAAC;YACpB,MAAM,EAAE,CAAC,IAAI,EAAE,EAAE;gBACf,IAAI,IAAI,CAAC,YAAY,EAAE,CAAC;oBACtB,IAAI,CAAC,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;gBACvC,CAAC;gBACD,IAAI,CAAC,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;YAC9B,CAAC;YACD,iBAAiB,EAAE,KAAK,IAAI,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,QAAQ,CAAC,gDAAgD,CAAC;YACjG,UAAU,EAAE,CAAC,OAAO,EAAE,EAAE;gBACtB,IAAI,CAAC,EAAE,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC;YAC7B,CAAC;YACD,QAAQ,EAAE,KAAK,EAAE,MAAmB,EAAE,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,QAAQ,CAAC,wBAAwB,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC;SACxG,CAAC,CAAC;IACL,CAAC;IAEO,MAAM,CAAC,WAAW,CAAC,MAAmB;QAC5C,IAAI,MAAM,CAAC,WAAW,EAAE,CAAC;YACvB,OAAO,GAAG,MAAM,CAAC,OAAO,KAAK,MAAM,CAAC,WAAW,KAAK,CAAC;QACvD,CAAC;QAED,OAAO,GAAG,MAAM,CAAC,OAAO,IAAI,CAAC;IAC/B,CAAC;CACF"}
1
+ {"version":3,"file":"oauth_login_runner.js","sourceRoot":"","sources":["../../src/provider/oauth_login_runner.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAyB,MAAM,2BAA2B,CAAC;AAEpF,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAErD;;;GAGG;AACH,MAAM,OAAO,wBAAwB;IAClB,EAAE,CAAQ;IAE3B,YAAY,EAAS;QACnB,IAAI,CAAC,EAAE,GAAG,EAAE,CAAC;IACf,CAAC;IAED,KAAK,CAAC,KAAK,CAAC,UAAkB;QAC5B,MAAM,QAAQ,GAAG,gBAAgB,CAAC,UAAU,CAAC,CAAC;QAC9C,IAAI,CAAC,QAAQ,EAAE,CAAC;YACd,MAAM,IAAI,KAAK,CAAC,wCAAwC,UAAU,EAAE,CAAC,CAAC;QACxE,CAAC;QAED,OAAO,QAAQ,CAAC,KAAK,CAAC;YACpB,MAAM,EAAE,CAAC,IAAI,EAAE,EAAE;gBACf,IAAI,CAAC,EAAE,CAAC,SAAS,CAAC,aAAa,CAAC,IAAI,CAAC,8CAA8C,CAAC,CAAC,CAAC;gBACtF,IAAI,CAAC,EAAE,CAAC,SAAS,CAAC,aAAa,CAAC,MAAM,CAAC,WAAW,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;YACjE,CAAC;YACD,UAAU,EAAE,CAAC,OAAO,EAAE,EAAE;gBACtB,IAAI,CAAC,EAAE,CAAC,SAAS,CAAC,aAAa,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC;YACrD,CAAC;YACD,QAAQ,EAAE,KAAK,IAAI,EAAE;gBACnB,MAAM,IAAI,KAAK,CACb,kHAAkH,CACnH,CAAC;YACJ,CAAC;SACF,CAAC,CAAC;IACL,CAAC;CACF"}
@@ -0,0 +1,17 @@
1
+ /**
2
+ * Formats concise terminal status lines with ANSI color while keeping the command handlers focused on
3
+ * provider login behavior. The output intentionally stays readable when colors are not interpreted.
4
+ */
5
+ export declare class TerminalStyle {
6
+ static readonly blue = "\u001B[34m";
7
+ static readonly green = "\u001B[32m";
8
+ static readonly gray = "\u001B[90m";
9
+ static readonly red = "\u001B[31m";
10
+ static readonly reset = "\u001B[0m";
11
+ static readonly yellow = "\u001B[33m";
12
+ static detail(label: string, value: string): string;
13
+ static error(message: string): string;
14
+ static info(message: string): string;
15
+ static progress(message: string): string;
16
+ static success(message: string): string;
17
+ }
@@ -0,0 +1,28 @@
1
+ /**
2
+ * Formats concise terminal status lines with ANSI color while keeping the command handlers focused on
3
+ * provider login behavior. The output intentionally stays readable when colors are not interpreted.
4
+ */
5
+ export class TerminalStyle {
6
+ static blue = "\u001B[34m";
7
+ static green = "\u001B[32m";
8
+ static gray = "\u001B[90m";
9
+ static red = "\u001B[31m";
10
+ static reset = "\u001B[0m";
11
+ static yellow = "\u001B[33m";
12
+ static detail(label, value) {
13
+ return `${TerminalStyle.gray}•${TerminalStyle.reset} ${label}: ${value}`;
14
+ }
15
+ static error(message) {
16
+ return `${TerminalStyle.red}❌${TerminalStyle.reset} ${message}`;
17
+ }
18
+ static info(message) {
19
+ return `${TerminalStyle.blue}ℹ${TerminalStyle.reset} ${message}`;
20
+ }
21
+ static progress(message) {
22
+ return `${TerminalStyle.yellow}⏳${TerminalStyle.reset} ${message}`;
23
+ }
24
+ static success(message) {
25
+ return `${TerminalStyle.green}✅${TerminalStyle.reset} ${message}`;
26
+ }
27
+ }
28
+ //# sourceMappingURL=terminal_style.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"terminal_style.js","sourceRoot":"","sources":["../src/terminal_style.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,MAAM,OAAO,aAAa;IACxB,MAAM,CAAU,IAAI,GAAG,YAAY,CAAC;IACpC,MAAM,CAAU,KAAK,GAAG,YAAY,CAAC;IACrC,MAAM,CAAU,IAAI,GAAG,YAAY,CAAC;IACpC,MAAM,CAAU,GAAG,GAAG,YAAY,CAAC;IACnC,MAAM,CAAU,KAAK,GAAG,WAAW,CAAC;IACpC,MAAM,CAAU,MAAM,GAAG,YAAY,CAAC;IAEtC,MAAM,CAAC,MAAM,CAAC,KAAa,EAAE,KAAa;QACxC,OAAO,GAAG,aAAa,CAAC,IAAI,IAAI,aAAa,CAAC,KAAK,IAAI,KAAK,KAAK,KAAK,EAAE,CAAC;IAC3E,CAAC;IAED,MAAM,CAAC,KAAK,CAAC,OAAe;QAC1B,OAAO,GAAG,aAAa,CAAC,GAAG,IAAI,aAAa,CAAC,KAAK,IAAI,OAAO,EAAE,CAAC;IAClE,CAAC;IAED,MAAM,CAAC,IAAI,CAAC,OAAe;QACzB,OAAO,GAAG,aAAa,CAAC,IAAI,IAAI,aAAa,CAAC,KAAK,IAAI,OAAO,EAAE,CAAC;IACnE,CAAC;IAED,MAAM,CAAC,QAAQ,CAAC,OAAe;QAC7B,OAAO,GAAG,aAAa,CAAC,MAAM,IAAI,aAAa,CAAC,KAAK,IAAI,OAAO,EAAE,CAAC;IACrE,CAAC;IAED,MAAM,CAAC,OAAO,CAAC,OAAe;QAC5B,OAAO,GAAG,aAAa,CAAC,KAAK,IAAI,aAAa,CAAC,KAAK,IAAI,OAAO,EAAE,CAAC;IACpE,CAAC"}
package/package.json CHANGED
@@ -1,12 +1,16 @@
1
1
  {
2
2
  "name": "@companyhelm/cli",
3
- "version": "0.4.3",
4
- "description": "CompanyHelm self-hosting command-line interface.",
3
+ "version": "0.4.5",
4
+ "description": "CompanyHelm command-line interface.",
5
5
  "repository": {
6
6
  "type": "git",
7
- "url": "git+https://github.com/CompanyHelm/companyhelm.git",
8
- "directory": "packages/cli"
7
+ "url": "git+https://github.com/CompanyHelm/companyhelm-cli.git"
9
8
  },
9
+ "homepage": "https://github.com/CompanyHelm/companyhelm-cli#readme",
10
+ "bugs": {
11
+ "url": "https://github.com/CompanyHelm/companyhelm-cli/issues"
12
+ },
13
+ "license": "MIT",
10
14
  "type": "module",
11
15
  "bin": {
12
16
  "companyhelm": "dist/index.js"
@@ -24,14 +28,20 @@
24
28
  "test": "npm run check && node --import tsx --test tests/*.test.ts"
25
29
  },
26
30
  "dependencies": {
27
- "commander": "^14.0.3",
28
- "@mariozechner/pi-ai": "0.70.6"
31
+ "@mariozechner/pi-ai": "0.70.6",
32
+ "commander": "^14.0.3"
29
33
  },
30
34
  "devDependencies": {
35
+ "@eslint/js": "^10.0.1",
31
36
  "@types/node": "^20.19.41",
32
- "typescript": "^5.9.3"
37
+ "eslint": "^10.1.0",
38
+ "globals": "^17.4.0",
39
+ "tsx": "^4.21.0",
40
+ "typescript": "^5.9.3",
41
+ "typescript-eslint": "^8.57.1"
33
42
  },
34
43
  "engines": {
35
44
  "node": ">=20.20.0"
36
- }
45
+ },
46
+ "packageManager": "npm@11.6.2"
37
47
  }