@dosu/cli 0.3.4 → 0.3.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.
Files changed (2) hide show
  1. package/bin/dosu.js +234 -195
  2. package/package.json +1 -1
package/bin/dosu.js CHANGED
@@ -3747,18 +3747,6 @@ var init_client = __esm(() => {
3747
3747
  };
3748
3748
  });
3749
3749
 
3750
- // src/setup/styles.ts
3751
- function dim(msg) {
3752
- return import_picocolors2.default.dim(msg);
3753
- }
3754
- function info(msg) {
3755
- return import_picocolors2.default.cyan(msg);
3756
- }
3757
- var import_picocolors2;
3758
- var init_styles = __esm(() => {
3759
- import_picocolors2 = __toESM(require_picocolors(), 1);
3760
- });
3761
-
3762
3750
  // src/auth/server.ts
3763
3751
  function buildSuccessHtml(email) {
3764
3752
  const emailLine = email ? `<p class="email">Signed in as <strong>${email.replace(/&/g, "&amp;").replace(/</g, "&lt;").replace(/>/g, "&gt;")}</strong></p>` : "";
@@ -4535,6 +4523,239 @@ var init_flow = __esm(() => {
4535
4523
  init_server();
4536
4524
  });
4537
4525
 
4526
+ // src/tui/tui.ts
4527
+ var exports_tui = {};
4528
+ __export(exports_tui, {
4529
+ runTUI: () => runTUI,
4530
+ handleLogout: () => handleLogout
4531
+ });
4532
+ async function runTUI() {
4533
+ console.log(import_picocolors2.default.magenta(LOGO));
4534
+ const cfg = loadConfig();
4535
+ if (!isAuthenticated(cfg)) {
4536
+ await handleAuthenticate(cfg);
4537
+ if (!isAuthenticated(cfg))
4538
+ return;
4539
+ }
4540
+ while (true) {
4541
+ const hasDeployment = !!cfg.deployment_id;
4542
+ const action = await ve({
4543
+ message: "What would you like to do?",
4544
+ options: [
4545
+ {
4546
+ label: "Authenticate",
4547
+ value: "auth",
4548
+ hint: isAuthenticated(cfg) ? "Re-authenticate" : undefined
4549
+ },
4550
+ {
4551
+ label: "Choose Deployment",
4552
+ value: "deployments",
4553
+ hint: !isAuthenticated(cfg) ? "Login first" : undefined
4554
+ },
4555
+ {
4556
+ label: "Add MCP",
4557
+ value: "mcp-add",
4558
+ hint: !hasDeployment ? "Select deployment first" : undefined
4559
+ },
4560
+ {
4561
+ label: "Remove MCP",
4562
+ value: "mcp-remove",
4563
+ hint: !hasDeployment ? "Select deployment first" : undefined
4564
+ },
4565
+ { label: "Clear Credentials", value: "logout" },
4566
+ { label: "Exit", value: "exit" }
4567
+ ]
4568
+ });
4569
+ if (pD(action) || action === "exit") {
4570
+ break;
4571
+ }
4572
+ switch (action) {
4573
+ case "auth":
4574
+ await handleAuthenticate(cfg);
4575
+ break;
4576
+ case "deployments":
4577
+ await handleDeployments(cfg);
4578
+ break;
4579
+ case "mcp-add":
4580
+ if (!hasDeployment) {
4581
+ M2.warn("Please select a deployment first.");
4582
+ continue;
4583
+ }
4584
+ await handleMCPAdd(cfg);
4585
+ break;
4586
+ case "mcp-remove":
4587
+ if (!hasDeployment) {
4588
+ M2.warn("Please select a deployment first.");
4589
+ continue;
4590
+ }
4591
+ await handleMCPRemove(cfg);
4592
+ break;
4593
+ case "logout":
4594
+ handleLogout(cfg);
4595
+ break;
4596
+ }
4597
+ }
4598
+ Se("Goodbye!");
4599
+ }
4600
+ async function handleDeployments(cfg) {
4601
+ if (!isAuthenticated(cfg)) {
4602
+ M2.warn("Please authenticate first.");
4603
+ return;
4604
+ }
4605
+ const client = new Client(cfg);
4606
+ try {
4607
+ const deployments = await client.getDeployments();
4608
+ if (deployments.length === 0) {
4609
+ M2.warn("No deployments found.");
4610
+ return;
4611
+ }
4612
+ const selected = await ve({
4613
+ message: "Select a deployment",
4614
+ options: deployments.map((d3) => ({
4615
+ label: `${d3.name} ${import_picocolors2.default.dim(`(${d3.org_name})`)}`,
4616
+ value: d3.deployment_id
4617
+ }))
4618
+ });
4619
+ if (pD(selected))
4620
+ return;
4621
+ const deployment = deployments.find((d3) => d3.deployment_id === selected);
4622
+ if (deployment) {
4623
+ cfg.deployment_id = deployment.deployment_id;
4624
+ cfg.deployment_name = deployment.name;
4625
+ saveConfig(cfg);
4626
+ M2.success(`Selected: ${deployment.name}`);
4627
+ }
4628
+ } catch (err) {
4629
+ M2.error(`Failed: ${err instanceof Error ? err.message : String(err)}`);
4630
+ }
4631
+ }
4632
+ async function handleMCPAdd(cfg) {
4633
+ const { allProviders: allProviders2 } = await Promise.resolve().then(() => (init_providers(), exports_providers));
4634
+ const providers = allProviders2();
4635
+ const selected = await ve({
4636
+ message: "Select tool to add MCP to",
4637
+ options: providers.map((p2) => ({
4638
+ label: p2.name(),
4639
+ value: p2.id(),
4640
+ hint: p2.supportsLocal() ? "local + global" : "global only"
4641
+ }))
4642
+ });
4643
+ if (pD(selected))
4644
+ return;
4645
+ const provider = providers.find((p2) => p2.id() === selected);
4646
+ if (!provider)
4647
+ return;
4648
+ try {
4649
+ provider.install(cfg, true);
4650
+ M2.success(`Added Dosu MCP to ${provider.name()}`);
4651
+ } catch (err) {
4652
+ M2.error(`Failed: ${err instanceof Error ? err.message : String(err)}`);
4653
+ }
4654
+ }
4655
+ async function handleMCPRemove(_cfg) {
4656
+ const { allProviders: allProviders2 } = await Promise.resolve().then(() => (init_providers(), exports_providers));
4657
+ const providers = allProviders2();
4658
+ const selected = await ve({
4659
+ message: "Select tool to remove MCP from",
4660
+ options: providers.filter((p2) => p2.id() !== "manual").map((p2) => ({
4661
+ label: p2.name(),
4662
+ value: p2.id()
4663
+ }))
4664
+ });
4665
+ if (pD(selected))
4666
+ return;
4667
+ const provider = providers.find((p2) => p2.id() === selected);
4668
+ if (!provider)
4669
+ return;
4670
+ try {
4671
+ provider.remove(true);
4672
+ M2.success(`Removed Dosu MCP from ${provider.name()}`);
4673
+ } catch (err) {
4674
+ M2.error(`Failed: ${err instanceof Error ? err.message : String(err)}`);
4675
+ }
4676
+ }
4677
+ async function handleAuthenticate(cfg) {
4678
+ if (cfg.access_token) {
4679
+ const s = Y2();
4680
+ s.start("Verifying session...");
4681
+ try {
4682
+ const apiClient = new Client(cfg);
4683
+ const resp = await apiClient.doRequestRaw("GET", "/v1/mcp/deployments");
4684
+ if (resp.status === 200) {
4685
+ s.stop("Already authenticated.");
4686
+ return;
4687
+ }
4688
+ try {
4689
+ await apiClient.refreshToken();
4690
+ s.stop("Session refreshed.");
4691
+ return;
4692
+ } catch {}
4693
+ s.stop("Session expired.");
4694
+ } catch {
4695
+ s.stop("Verification failed.");
4696
+ }
4697
+ }
4698
+ const shouldLogin = await ye({ message: "Open browser to log in?" });
4699
+ if (pD(shouldLogin) || !shouldLogin)
4700
+ return;
4701
+ try {
4702
+ const { startOAuthFlow: startOAuthFlow2 } = await Promise.resolve().then(() => (init_flow(), exports_flow));
4703
+ const s = Y2();
4704
+ s.start("Waiting for authentication...");
4705
+ const token = await startOAuthFlow2(undefined, "/cli/auth");
4706
+ s.stop("Authenticated");
4707
+ cfg.access_token = token.access_token;
4708
+ cfg.refresh_token = token.refresh_token;
4709
+ cfg.expires_at = Math.floor(Date.now() / 1000) + token.expires_in;
4710
+ cfg.mode = token.mode === MODE_OSS ? MODE_OSS : undefined;
4711
+ saveConfig(cfg);
4712
+ } catch (err) {
4713
+ M2.error(`Authentication failed: ${err instanceof Error ? err.message : String(err)}`);
4714
+ }
4715
+ }
4716
+ function handleLogout(cfg) {
4717
+ if (!isAuthenticated(cfg)) {
4718
+ M2.warn("You are not logged in.");
4719
+ return;
4720
+ }
4721
+ cfg.access_token = "";
4722
+ cfg.refresh_token = "";
4723
+ cfg.expires_at = 0;
4724
+ cfg.deployment_id = undefined;
4725
+ cfg.deployment_name = undefined;
4726
+ cfg.api_key = undefined;
4727
+ saveConfig(cfg);
4728
+ M2.success("Credentials cleared.");
4729
+ }
4730
+ var import_picocolors2, LOGO = `
4731
+ /$$$$$$$
4732
+ | $$__ $$
4733
+ | $$ \\ $$ /$$$$$$ /$$$$$$$ /$$ /$$
4734
+ | $$ | $$ /$$__ $$ /$$_____/| $$ | $$
4735
+ | $$ | $$| $$ \\ $$| $$$$$$ | $$ | $$
4736
+ | $$ | $$| $$ | $$ \\____ $$| $$ | $$
4737
+ | $$$$$$$/| $$$$$$/ /$$$$$$$/| $$$$$$/
4738
+ |_______/ \\______/ |_______/ \\______/
4739
+ `;
4740
+ var init_tui = __esm(() => {
4741
+ init_dist2();
4742
+ init_client();
4743
+ init_config();
4744
+ import_picocolors2 = __toESM(require_picocolors(), 1);
4745
+ });
4746
+
4747
+ // src/setup/styles.ts
4748
+ function dim(msg) {
4749
+ return import_picocolors3.default.dim(msg);
4750
+ }
4751
+ function info(msg) {
4752
+ return import_picocolors3.default.cyan(msg);
4753
+ }
4754
+ var import_picocolors3;
4755
+ var init_styles = __esm(() => {
4756
+ import_picocolors3 = __toESM(require_picocolors(), 1);
4757
+ });
4758
+
4538
4759
  // src/setup/flow.ts
4539
4760
  var exports_flow2 = {};
4540
4761
  __export(exports_flow2, {
@@ -4864,188 +5085,6 @@ var init_flow2 = __esm(() => {
4864
5085
  init_styles();
4865
5086
  });
4866
5087
 
4867
- // src/tui/tui.ts
4868
- var exports_tui = {};
4869
- __export(exports_tui, {
4870
- runTUI: () => runTUI,
4871
- handleLogout: () => handleLogout
4872
- });
4873
- async function runTUI() {
4874
- console.log(import_picocolors3.default.magenta(LOGO));
4875
- const cfg = loadConfig();
4876
- if (!isAuthenticated(cfg)) {
4877
- await runSetup();
4878
- return;
4879
- }
4880
- while (true) {
4881
- const hasDeployment = !!cfg.deployment_id;
4882
- const action = await ve({
4883
- message: "What would you like to do?",
4884
- options: [
4885
- {
4886
- label: "Authenticate",
4887
- value: "setup",
4888
- hint: isAuthenticated(cfg) ? "Re-authenticate" : undefined
4889
- },
4890
- {
4891
- label: "Choose Deployment",
4892
- value: "deployments",
4893
- hint: !isAuthenticated(cfg) ? "Login first" : undefined
4894
- },
4895
- {
4896
- label: "Add MCP",
4897
- value: "mcp-add",
4898
- hint: !hasDeployment ? "Select deployment first" : undefined
4899
- },
4900
- {
4901
- label: "Remove MCP",
4902
- value: "mcp-remove",
4903
- hint: !hasDeployment ? "Select deployment first" : undefined
4904
- },
4905
- { label: "Clear Credentials", value: "logout" },
4906
- { label: "Exit", value: "exit" }
4907
- ]
4908
- });
4909
- if (pD(action) || action === "exit") {
4910
- break;
4911
- }
4912
- switch (action) {
4913
- case "setup":
4914
- await runSetup();
4915
- break;
4916
- case "deployments":
4917
- await handleDeployments(cfg);
4918
- break;
4919
- case "mcp-add":
4920
- if (!hasDeployment) {
4921
- M2.warn("Please select a deployment first.");
4922
- continue;
4923
- }
4924
- await handleMCPAdd(cfg);
4925
- break;
4926
- case "mcp-remove":
4927
- if (!hasDeployment) {
4928
- M2.warn("Please select a deployment first.");
4929
- continue;
4930
- }
4931
- await handleMCPRemove(cfg);
4932
- break;
4933
- case "logout":
4934
- handleLogout(cfg);
4935
- break;
4936
- }
4937
- }
4938
- Se("Goodbye!");
4939
- }
4940
- async function handleDeployments(cfg) {
4941
- if (!isAuthenticated(cfg)) {
4942
- M2.warn("Please authenticate first.");
4943
- return;
4944
- }
4945
- const client = new Client(cfg);
4946
- try {
4947
- const deployments = await client.getDeployments();
4948
- if (deployments.length === 0) {
4949
- M2.warn("No deployments found.");
4950
- return;
4951
- }
4952
- const selected = await ve({
4953
- message: "Select a deployment",
4954
- options: deployments.map((d3) => ({
4955
- label: `${d3.name} ${import_picocolors3.default.dim(`(${d3.org_name})`)}`,
4956
- value: d3.deployment_id
4957
- }))
4958
- });
4959
- if (pD(selected))
4960
- return;
4961
- const deployment = deployments.find((d3) => d3.deployment_id === selected);
4962
- if (deployment) {
4963
- cfg.deployment_id = deployment.deployment_id;
4964
- cfg.deployment_name = deployment.name;
4965
- saveConfig(cfg);
4966
- M2.success(`Selected: ${deployment.name}`);
4967
- }
4968
- } catch (err) {
4969
- M2.error(`Failed: ${err instanceof Error ? err.message : String(err)}`);
4970
- }
4971
- }
4972
- async function handleMCPAdd(cfg) {
4973
- const { allProviders: allProviders2 } = await Promise.resolve().then(() => (init_providers(), exports_providers));
4974
- const providers = allProviders2();
4975
- const selected = await ve({
4976
- message: "Select tool to add MCP to",
4977
- options: providers.map((p2) => ({
4978
- label: p2.name(),
4979
- value: p2.id(),
4980
- hint: p2.supportsLocal() ? "local + global" : "global only"
4981
- }))
4982
- });
4983
- if (pD(selected))
4984
- return;
4985
- const provider = providers.find((p2) => p2.id() === selected);
4986
- if (!provider)
4987
- return;
4988
- try {
4989
- provider.install(cfg, true);
4990
- M2.success(`Added Dosu MCP to ${provider.name()}`);
4991
- } catch (err) {
4992
- M2.error(`Failed: ${err instanceof Error ? err.message : String(err)}`);
4993
- }
4994
- }
4995
- async function handleMCPRemove(_cfg) {
4996
- const { allProviders: allProviders2 } = await Promise.resolve().then(() => (init_providers(), exports_providers));
4997
- const providers = allProviders2();
4998
- const selected = await ve({
4999
- message: "Select tool to remove MCP from",
5000
- options: providers.filter((p2) => p2.id() !== "manual").map((p2) => ({
5001
- label: p2.name(),
5002
- value: p2.id()
5003
- }))
5004
- });
5005
- if (pD(selected))
5006
- return;
5007
- const provider = providers.find((p2) => p2.id() === selected);
5008
- if (!provider)
5009
- return;
5010
- try {
5011
- provider.remove(true);
5012
- M2.success(`Removed Dosu MCP from ${provider.name()}`);
5013
- } catch (err) {
5014
- M2.error(`Failed: ${err instanceof Error ? err.message : String(err)}`);
5015
- }
5016
- }
5017
- function handleLogout(cfg) {
5018
- if (!isAuthenticated(cfg)) {
5019
- M2.warn("You are not logged in.");
5020
- return;
5021
- }
5022
- cfg.access_token = "";
5023
- cfg.refresh_token = "";
5024
- cfg.expires_at = 0;
5025
- cfg.deployment_id = undefined;
5026
- cfg.deployment_name = undefined;
5027
- cfg.api_key = undefined;
5028
- saveConfig(cfg);
5029
- M2.success("Credentials cleared.");
5030
- }
5031
- var import_picocolors3, LOGO = `
5032
- /$$$$$$$
5033
- | $$__ $$
5034
- | $$ \\ $$ /$$$$$$ /$$$$$$$ /$$ /$$
5035
- | $$ | $$ /$$__ $$ /$$_____/| $$ | $$
5036
- | $$ | $$| $$ \\ $$| $$$$$$ | $$ | $$
5037
- | $$ | $$| $$ | $$ \\____ $$| $$ | $$
5038
- | $$$$$$$/| $$$$$$/ /$$$$$$$/| $$$$$$/
5039
- |_______/ \\______/ |_______/ \\______/
5040
- `;
5041
- var init_tui = __esm(() => {
5042
- init_dist2();
5043
- init_client();
5044
- init_config();
5045
- init_flow2();
5046
- import_picocolors3 = __toESM(require_picocolors(), 1);
5047
- });
5048
-
5049
5088
  // node_modules/commander/esm.mjs
5050
5089
  var import__ = __toESM(require_commander(), 1);
5051
5090
  var {
@@ -5067,7 +5106,7 @@ init_config();
5067
5106
  init_providers();
5068
5107
 
5069
5108
  // src/version/version.ts
5070
- var VERSION = "0.3.4";
5109
+ var VERSION = "0.3.5";
5071
5110
  function getVersionString() {
5072
5111
  return `v${VERSION}`;
5073
5112
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@dosu/cli",
3
- "version": "0.3.4",
3
+ "version": "0.3.5",
4
4
  "type": "module",
5
5
  "description": "Dosu CLI - Manage MCP servers for AI tools",
6
6
  "license": "MIT",