@qcobro/ctl 1.27.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +290 -0
- package/bin/dev.js +7 -0
- package/bin/run.js +9 -0
- package/dist/AuthenticatedCommand.d.ts +13 -0
- package/dist/AuthenticatedCommand.d.ts.map +1 -0
- package/dist/AuthenticatedCommand.js +32 -0
- package/dist/AuthenticatedCommand.js.map +1 -0
- package/dist/BaseCommand.d.ts +22 -0
- package/dist/BaseCommand.d.ts.map +1 -0
- package/dist/BaseCommand.js +33 -0
- package/dist/BaseCommand.js.map +1 -0
- package/dist/commands/agents/create.d.ts +25 -0
- package/dist/commands/agents/create.d.ts.map +1 -0
- package/dist/commands/agents/create.js +96 -0
- package/dist/commands/agents/create.js.map +1 -0
- package/dist/commands/agents/eval.d.ts +15 -0
- package/dist/commands/agents/eval.d.ts.map +1 -0
- package/dist/commands/agents/eval.js +70 -0
- package/dist/commands/agents/eval.js.map +1 -0
- package/dist/commands/agents/preview.d.ts +12 -0
- package/dist/commands/agents/preview.d.ts.map +1 -0
- package/dist/commands/agents/preview.js +35 -0
- package/dist/commands/agents/preview.js.map +1 -0
- package/dist/commands/agents/sync.d.ts +10 -0
- package/dist/commands/agents/sync.d.ts.map +1 -0
- package/dist/commands/agents/sync.js +39 -0
- package/dist/commands/agents/sync.js.map +1 -0
- package/dist/commands/mcp/configure.d.ts +20 -0
- package/dist/commands/mcp/configure.d.ts.map +1 -0
- package/dist/commands/mcp/configure.js +75 -0
- package/dist/commands/mcp/configure.js.map +1 -0
- package/dist/commands/portfolios/get.d.ts +10 -0
- package/dist/commands/portfolios/get.d.ts.map +1 -0
- package/dist/commands/portfolios/get.js +28 -0
- package/dist/commands/portfolios/get.js.map +1 -0
- package/dist/commands/portfolios/list.d.ts +10 -0
- package/dist/commands/portfolios/list.d.ts.map +1 -0
- package/dist/commands/portfolios/list.js +30 -0
- package/dist/commands/portfolios/list.js.map +1 -0
- package/dist/commands/portfolios/sync.d.ts +12 -0
- package/dist/commands/portfolios/sync.d.ts.map +1 -0
- package/dist/commands/portfolios/sync.js +41 -0
- package/dist/commands/portfolios/sync.js.map +1 -0
- package/dist/commands/workspaces/active.d.ts +7 -0
- package/dist/commands/workspaces/active.d.ts.map +1 -0
- package/dist/commands/workspaces/active.js +24 -0
- package/dist/commands/workspaces/active.js.map +1 -0
- package/dist/commands/workspaces/list.d.ts +7 -0
- package/dist/commands/workspaces/list.d.ts.map +1 -0
- package/dist/commands/workspaces/list.js +18 -0
- package/dist/commands/workspaces/list.js.map +1 -0
- package/dist/commands/workspaces/login.d.ts +8 -0
- package/dist/commands/workspaces/login.d.ts.map +1 -0
- package/dist/commands/workspaces/login.js +64 -0
- package/dist/commands/workspaces/login.js.map +1 -0
- package/dist/commands/workspaces/logout.d.ts +10 -0
- package/dist/commands/workspaces/logout.d.ts.map +1 -0
- package/dist/commands/workspaces/logout.js +23 -0
- package/dist/commands/workspaces/logout.js.map +1 -0
- package/dist/commands/workspaces/use.d.ts +10 -0
- package/dist/commands/workspaces/use.d.ts.map +1 -0
- package/dist/commands/workspaces/use.js +29 -0
- package/dist/commands/workspaces/use.js.map +1 -0
- package/dist/config/addWorkspace.d.ts +21 -0
- package/dist/config/addWorkspace.d.ts.map +1 -0
- package/dist/config/addWorkspace.js +27 -0
- package/dist/config/addWorkspace.js.map +1 -0
- package/dist/config/getActiveWorkspace.d.ts +4 -0
- package/dist/config/getActiveWorkspace.d.ts.map +1 -0
- package/dist/config/getActiveWorkspace.js +5 -0
- package/dist/config/getActiveWorkspace.js.map +1 -0
- package/dist/config/getConfig.d.ts +4 -0
- package/dist/config/getConfig.d.ts.map +1 -0
- package/dist/config/getConfig.js +10 -0
- package/dist/config/getConfig.js.map +1 -0
- package/dist/config/index.d.ts +9 -0
- package/dist/config/index.d.ts.map +1 -0
- package/dist/config/index.js +9 -0
- package/dist/config/index.js.map +1 -0
- package/dist/config/removeWorkspace.d.ts +4 -0
- package/dist/config/removeWorkspace.d.ts.map +1 -0
- package/dist/config/removeWorkspace.js +5 -0
- package/dist/config/removeWorkspace.js.map +1 -0
- package/dist/config/saveConfig.d.ts +4 -0
- package/dist/config/saveConfig.d.ts.map +1 -0
- package/dist/config/saveConfig.js +10 -0
- package/dist/config/saveConfig.js.map +1 -0
- package/dist/config/schemas.d.ts +18 -0
- package/dist/config/schemas.d.ts.map +1 -0
- package/dist/config/schemas.js +22 -0
- package/dist/config/schemas.js.map +1 -0
- package/dist/config/setActiveWorkspace.d.ts +4 -0
- package/dist/config/setActiveWorkspace.d.ts.map +1 -0
- package/dist/config/setActiveWorkspace.js +8 -0
- package/dist/config/setActiveWorkspace.js.map +1 -0
- package/dist/config/types.d.ts +4 -0
- package/dist/config/types.d.ts.map +1 -0
- package/dist/config/types.js +2 -0
- package/dist/config/types.js.map +1 -0
- package/dist/constants.d.ts +9 -0
- package/dist/constants.d.ts.map +1 -0
- package/dist/constants.js +11 -0
- package/dist/constants.js.map +1 -0
- package/dist/mcpConfigure/paths.d.ts +9 -0
- package/dist/mcpConfigure/paths.d.ts.map +1 -0
- package/dist/mcpConfigure/paths.js +20 -0
- package/dist/mcpConfigure/paths.js.map +1 -0
- package/dist/mcpConfigure/writeClaudeConfig.d.ts +33 -0
- package/dist/mcpConfigure/writeClaudeConfig.d.ts.map +1 -0
- package/dist/mcpConfigure/writeClaudeConfig.js +44 -0
- package/dist/mcpConfigure/writeClaudeConfig.js.map +1 -0
- package/package.json +58 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"eval.js","sourceRoot":"","sources":["../../../src/commands/agents/eval.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { AuthenticatedCommand } from "../../AuthenticatedCommand.js";
|
|
2
|
+
export default class Preview extends AuthenticatedCommand<typeof Preview> {
|
|
3
|
+
static readonly description: string;
|
|
4
|
+
static readonly examples: string[];
|
|
5
|
+
static readonly flags: {
|
|
6
|
+
"template-id": import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
|
|
7
|
+
file: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
|
|
8
|
+
account: import("@oclif/core/interfaces").OptionFlag<string, import("@oclif/core/interfaces").CustomOptions>;
|
|
9
|
+
};
|
|
10
|
+
run(): Promise<void>;
|
|
11
|
+
}
|
|
12
|
+
//# sourceMappingURL=preview.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"preview.d.ts","sourceRoot":"","sources":["../../../src/commands/agents/preview.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,oBAAoB,EAAE,MAAM,+BAA+B,CAAC;AAErE,MAAM,CAAC,OAAO,OAAO,OAAQ,SAAQ,oBAAoB,CAAC,OAAO,OAAO,CAAC;IACvE,gBAAyB,WAAW,SAGoD;IACxF,gBAAyB,QAAQ,WAG/B;IACF,gBAAyB,KAAK;;;;MAS5B;IAEW,GAAG,IAAI,OAAO,CAAC,IAAI,CAAC;CAgBlC"}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import { readFileSync } from "node:fs";
|
|
2
|
+
import { Flags } from "@oclif/core";
|
|
3
|
+
import { AuthenticatedCommand } from "../../AuthenticatedCommand.js";
|
|
4
|
+
export default class Preview extends AuthenticatedCommand {
|
|
5
|
+
static description = "render an SMS/VOICE_PRERECORDED agent template's message body or script against a " +
|
|
6
|
+
"sample account — no conversation, no streaming. Accepts an existing template id or a " +
|
|
7
|
+
"standalone YAML definition. For VOICE_AI/EMAIL/WHATSAPP, use `agents:eval` instead.";
|
|
8
|
+
static examples = [
|
|
9
|
+
"<%= config.bin %> <%= command.id %> --template-id <id> --account account.json",
|
|
10
|
+
"<%= config.bin %> <%= command.id %> --file sms-draft.yaml --account account.json"
|
|
11
|
+
];
|
|
12
|
+
static flags = {
|
|
13
|
+
"template-id": Flags.string({ description: "an existing agent template id" }),
|
|
14
|
+
file: Flags.string({
|
|
15
|
+
description: "path to a standalone YAML SMS/VOICE_PRERECORDED definition"
|
|
16
|
+
}),
|
|
17
|
+
account: Flags.string({
|
|
18
|
+
description: "path to a JSON file with the sample account fields",
|
|
19
|
+
required: true
|
|
20
|
+
})
|
|
21
|
+
};
|
|
22
|
+
async run() {
|
|
23
|
+
const { flags } = await this.parse(Preview);
|
|
24
|
+
const client = await this.createSdkClient();
|
|
25
|
+
const account = JSON.parse(readFileSync(flags.account, "utf8"));
|
|
26
|
+
if (!flags.file && !flags["template-id"]) {
|
|
27
|
+
this.error("Provide --template-id or --file.", { exit: 1 });
|
|
28
|
+
}
|
|
29
|
+
const { rendered } = await client.agentTemplates.preview(flags.file
|
|
30
|
+
? { yaml: readFileSync(flags.file, "utf8"), account }
|
|
31
|
+
: { agentTemplateId: flags["template-id"], account });
|
|
32
|
+
this.log(rendered);
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
//# sourceMappingURL=preview.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"preview.js","sourceRoot":"","sources":["../../../src/commands/agents/preview.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACvC,OAAO,EAAE,KAAK,EAAE,MAAM,aAAa,CAAC;AACpC,OAAO,EAAE,oBAAoB,EAAE,MAAM,+BAA+B,CAAC;AAErE,MAAM,CAAC,OAAO,OAAO,OAAQ,SAAQ,oBAAoC;IACvE,MAAM,CAAmB,WAAW,GAClC,oFAAoF;QACpF,uFAAuF;QACvF,qFAAqF,CAAC;IACxF,MAAM,CAAmB,QAAQ,GAAG;QAClC,+EAA+E;QAC/E,kFAAkF;KACnF,CAAC;IACF,MAAM,CAAmB,KAAK,GAAG;QAC/B,aAAa,EAAE,KAAK,CAAC,MAAM,CAAC,EAAE,WAAW,EAAE,+BAA+B,EAAE,CAAC;QAC7E,IAAI,EAAE,KAAK,CAAC,MAAM,CAAC;YACjB,WAAW,EAAE,4DAA4D;SAC1E,CAAC;QACF,OAAO,EAAE,KAAK,CAAC,MAAM,CAAC;YACpB,WAAW,EAAE,oDAAoD;YACjE,QAAQ,EAAE,IAAI;SACf,CAAC;KACH,CAAC;IAEK,KAAK,CAAC,GAAG;QACd,MAAM,EAAE,KAAK,EAAE,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;QAC5C,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,eAAe,EAAE,CAAC;QAC5C,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,KAAK,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC,CAAC;QAEhE,IAAI,CAAC,KAAK,CAAC,IAAI,IAAI,CAAC,KAAK,CAAC,aAAa,CAAC,EAAE,CAAC;YACzC,IAAI,CAAC,KAAK,CAAC,kCAAkC,EAAE,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC,CAAC;QAC9D,CAAC;QAED,MAAM,EAAE,QAAQ,EAAE,GAAG,MAAM,MAAM,CAAC,cAAc,CAAC,OAAO,CACtD,KAAK,CAAC,IAAI;YACR,CAAC,CAAC,EAAE,IAAI,EAAE,YAAY,CAAC,KAAK,CAAC,IAAI,EAAE,MAAM,CAAC,EAAE,OAAO,EAAE;YACrD,CAAC,CAAC,EAAE,eAAe,EAAE,KAAK,CAAC,aAAa,CAAW,EAAE,OAAO,EAAE,CACjE,CAAC;QACF,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;IACrB,CAAC"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { AuthenticatedCommand } from "../../AuthenticatedCommand.js";
|
|
2
|
+
export default class Sync extends AuthenticatedCommand<typeof Sync> {
|
|
3
|
+
static readonly description: string;
|
|
4
|
+
static readonly examples: string[];
|
|
5
|
+
static readonly args: {
|
|
6
|
+
templateId: import("@oclif/core/interfaces").Arg<string, Record<string, unknown>>;
|
|
7
|
+
};
|
|
8
|
+
run(): Promise<void>;
|
|
9
|
+
}
|
|
10
|
+
//# sourceMappingURL=sync.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sync.d.ts","sourceRoot":"","sources":["../../../src/commands/agents/sync.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,oBAAoB,EAAE,MAAM,+BAA+B,CAAC;AAErE,MAAM,CAAC,OAAO,OAAO,IAAK,SAAQ,oBAAoB,CAAC,OAAO,IAAI,CAAC;IACjE,gBAAyB,WAAW,SAKZ;IACxB,gBAAyB,QAAQ,WAAwD;IACzF,gBAAyB,IAAI;;MAE3B;IAEW,GAAG,IAAI,OAAO,CAAC,IAAI,CAAC;CA2BlC"}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import { Args } from "@oclif/core";
|
|
2
|
+
import { AuthenticatedCommand } from "../../AuthenticatedCommand.js";
|
|
3
|
+
export default class Sync extends AuthenticatedCommand {
|
|
4
|
+
static description = "re-attempt an agent template's Fonoster sync and report the resulting status. " +
|
|
5
|
+
"This validates the template's configuration and its sync with Fonoster — it does " +
|
|
6
|
+
"not test conversation behavior (see `agents:eval` for that). Only VOICE_AI " +
|
|
7
|
+
"templates sync with Fonoster; other channel types are a no-op that leaves the " +
|
|
8
|
+
"template unchanged.";
|
|
9
|
+
static examples = ["<%= config.bin %> <%= command.id %> <templateId>"];
|
|
10
|
+
static args = {
|
|
11
|
+
templateId: Args.string({ description: "the agent template id", required: true })
|
|
12
|
+
};
|
|
13
|
+
async run() {
|
|
14
|
+
const { args } = await this.parse(Sync);
|
|
15
|
+
const client = await this.createSdkClient();
|
|
16
|
+
try {
|
|
17
|
+
await client.agentTemplates.sync({ id: args.templateId });
|
|
18
|
+
}
|
|
19
|
+
catch (err) {
|
|
20
|
+
this.error(`Sync failed: ${err instanceof Error ? err.message : String(err)}`, { exit: 1 });
|
|
21
|
+
}
|
|
22
|
+
// `sync` doesn't echo the updated config, so re-fetch to report the
|
|
23
|
+
// resulting status — `get` includes each channel's child config.
|
|
24
|
+
const template = await client.agentTemplates.get({ id: args.templateId });
|
|
25
|
+
const voiceConfig = template
|
|
26
|
+
.voiceAiConfig;
|
|
27
|
+
if (template.type !== "VOICE_AI") {
|
|
28
|
+
this.log(`${template.id} is type ${template.type}; sync is a no-op for non-voice templates.`);
|
|
29
|
+
return;
|
|
30
|
+
}
|
|
31
|
+
if (voiceConfig?.fonosterAppRef) {
|
|
32
|
+
this.log(`Synced: ${template.id} → fonosterAppRef=${voiceConfig.fonosterAppRef}`);
|
|
33
|
+
}
|
|
34
|
+
else {
|
|
35
|
+
this.log(`Not synced: ${template.id} has no fonosterAppRef after the sync attempt.`);
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
//# sourceMappingURL=sync.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sync.js","sourceRoot":"","sources":["../../../src/commands/agents/sync.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,aAAa,CAAC;AACnC,OAAO,EAAE,oBAAoB,EAAE,MAAM,+BAA+B,CAAC;AAErE,MAAM,CAAC,OAAO,OAAO,IAAK,SAAQ,oBAAiC;IACjE,MAAM,CAAmB,WAAW,GAClC,gFAAgF;QAChF,mFAAmF;QACnF,6EAA6E;QAC7E,gFAAgF;QAChF,qBAAqB,CAAC;IACxB,MAAM,CAAmB,QAAQ,GAAG,CAAC,kDAAkD,CAAC,CAAC;IACzF,MAAM,CAAmB,IAAI,GAAG;QAC9B,UAAU,EAAE,IAAI,CAAC,MAAM,CAAC,EAAE,WAAW,EAAE,uBAAuB,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;KAClF,CAAC;IAEK,KAAK,CAAC,GAAG;QACd,MAAM,EAAE,IAAI,EAAE,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QACxC,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,eAAe,EAAE,CAAC;QAE5C,IAAI,CAAC;YACH,MAAM,MAAM,CAAC,cAAc,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,IAAI,CAAC,UAAU,EAAE,CAAC,CAAC;QAC5D,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,IAAI,CAAC,KAAK,CAAC,gBAAgB,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC,CAAC;QAC9F,CAAC;QAED,oEAAoE;QACpE,iEAAiE;QACjE,MAAM,QAAQ,GAAG,MAAM,MAAM,CAAC,cAAc,CAAC,GAAG,CAAC,EAAE,EAAE,EAAE,IAAI,CAAC,UAAU,EAAE,CAAC,CAAC;QAC1E,MAAM,WAAW,GAAI,QAAmE;aACrF,aAAa,CAAC;QAEjB,IAAI,QAAQ,CAAC,IAAI,KAAK,UAAU,EAAE,CAAC;YACjC,IAAI,CAAC,GAAG,CAAC,GAAG,QAAQ,CAAC,EAAE,YAAY,QAAQ,CAAC,IAAI,4CAA4C,CAAC,CAAC;YAC9F,OAAO;QACT,CAAC;QAED,IAAI,WAAW,EAAE,cAAc,EAAE,CAAC;YAChC,IAAI,CAAC,GAAG,CAAC,WAAW,QAAQ,CAAC,EAAE,qBAAqB,WAAW,CAAC,cAAc,EAAE,CAAC,CAAC;QACpF,CAAC;aAAM,CAAC;YACN,IAAI,CAAC,GAAG,CAAC,eAAe,QAAQ,CAAC,EAAE,gDAAgD,CAAC,CAAC;QACvF,CAAC;IACH,CAAC"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { BaseCommand } from "../../BaseCommand.js";
|
|
2
|
+
/**
|
|
3
|
+
* Configures an MCP client to use `@qcobro/mcp`. Supersedes `@qcobro/mcp`'s
|
|
4
|
+
* removed `config` subcommand — see `mods/mcp/src/config/` (deleted) and this
|
|
5
|
+
* package's `src/mcpConfigure/` (the ported, unchanged logic).
|
|
6
|
+
*/
|
|
7
|
+
export default class Configure extends BaseCommand<typeof Configure> {
|
|
8
|
+
static readonly description = "configure an MCP client to use @qcobro/mcp";
|
|
9
|
+
static readonly examples: string[];
|
|
10
|
+
static readonly flags: {
|
|
11
|
+
client: import("@oclif/core/interfaces").OptionFlag<string, import("@oclif/core/interfaces").CustomOptions>;
|
|
12
|
+
url: import("@oclif/core/interfaces").OptionFlag<string, import("@oclif/core/interfaces").CustomOptions>;
|
|
13
|
+
"access-key-id": import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
|
|
14
|
+
"access-key-secret": import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
|
|
15
|
+
workspace: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
|
|
16
|
+
};
|
|
17
|
+
run(): Promise<void>;
|
|
18
|
+
private resolveCredentials;
|
|
19
|
+
}
|
|
20
|
+
//# sourceMappingURL=configure.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"configure.d.ts","sourceRoot":"","sources":["../../../src/commands/mcp/configure.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AAMnD;;;;GAIG;AACH,MAAM,CAAC,OAAO,OAAO,SAAU,SAAQ,WAAW,CAAC,OAAO,SAAS,CAAC;IAClE,gBAAyB,WAAW,gDAAgD;IACpF,gBAAyB,QAAQ,WAI/B;IACF,gBAAyB,KAAK;;;;;;MAiB5B;IAEW,GAAG,IAAI,OAAO,CAAC,IAAI,CAAC;IAmBjC,OAAO,CAAC,kBAAkB;CA+B3B"}
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
import { Flags } from "@oclif/core";
|
|
2
|
+
import { BaseCommand } from "../../BaseCommand.js";
|
|
3
|
+
import { getActiveWorkspace, getConfig } from "../../config/index.js";
|
|
4
|
+
import { CONFIG_FILE, DEFAULT_ENDPOINT } from "../../constants.js";
|
|
5
|
+
import { claudeDesktopConfigPath } from "../../mcpConfigure/paths.js";
|
|
6
|
+
import { buildQCobroEntry, writeClaudeConfig } from "../../mcpConfigure/writeClaudeConfig.js";
|
|
7
|
+
/**
|
|
8
|
+
* Configures an MCP client to use `@qcobro/mcp`. Supersedes `@qcobro/mcp`'s
|
|
9
|
+
* removed `config` subcommand — see `mods/mcp/src/config/` (deleted) and this
|
|
10
|
+
* package's `src/mcpConfigure/` (the ported, unchanged logic).
|
|
11
|
+
*/
|
|
12
|
+
export default class Configure extends BaseCommand {
|
|
13
|
+
static description = "configure an MCP client to use @qcobro/mcp";
|
|
14
|
+
static examples = [
|
|
15
|
+
"<%= config.bin %> <%= command.id %>",
|
|
16
|
+
"<%= config.bin %> <%= command.id %> --client claude",
|
|
17
|
+
"<%= config.bin %> <%= command.id %> --access-key-id <id> --access-key-secret <secret> --workspace <workspaceAccessKeyId>"
|
|
18
|
+
];
|
|
19
|
+
static flags = {
|
|
20
|
+
client: Flags.string({
|
|
21
|
+
char: "c",
|
|
22
|
+
description: "MCP client to configure",
|
|
23
|
+
default: "claude",
|
|
24
|
+
options: ["claude"]
|
|
25
|
+
}),
|
|
26
|
+
url: Flags.string({ description: "QCobro API base URL", default: DEFAULT_ENDPOINT }),
|
|
27
|
+
"access-key-id": Flags.string({
|
|
28
|
+
description: "workspace API key id (overrides active workspace)"
|
|
29
|
+
}),
|
|
30
|
+
"access-key-secret": Flags.string({
|
|
31
|
+
description: "workspace API key secret (overrides active workspace)"
|
|
32
|
+
}),
|
|
33
|
+
workspace: Flags.string({
|
|
34
|
+
description: "workspace to act in, its accessKeyId (overrides active workspace)"
|
|
35
|
+
})
|
|
36
|
+
};
|
|
37
|
+
async run() {
|
|
38
|
+
const { flags } = await this.parse(Configure);
|
|
39
|
+
const credentials = this.resolveCredentials(flags);
|
|
40
|
+
const configPath = claudeDesktopConfigPath(process.platform, process.env);
|
|
41
|
+
const entry = buildQCobroEntry({
|
|
42
|
+
endpoint: credentials.endpoint,
|
|
43
|
+
accessKeyId: credentials.accessKeyId,
|
|
44
|
+
accessKeySecret: credentials.accessKeySecret,
|
|
45
|
+
workspace: credentials.workspace
|
|
46
|
+
});
|
|
47
|
+
const warning = writeClaudeConfig(configPath, entry);
|
|
48
|
+
if (warning)
|
|
49
|
+
this.warn(warning);
|
|
50
|
+
this.log(`Configured ${flags.client} to use the QCobro MCP server (${configPath}).`);
|
|
51
|
+
this.log("Restart the client for the change to take effect.");
|
|
52
|
+
}
|
|
53
|
+
resolveCredentials(flags) {
|
|
54
|
+
if (flags["access-key-id"] && flags["access-key-secret"] && flags.workspace) {
|
|
55
|
+
return {
|
|
56
|
+
endpoint: flags.url,
|
|
57
|
+
accessKeyId: flags["access-key-id"],
|
|
58
|
+
accessKeySecret: flags["access-key-secret"],
|
|
59
|
+
workspace: flags.workspace
|
|
60
|
+
};
|
|
61
|
+
}
|
|
62
|
+
const activeWorkspace = getActiveWorkspace(getConfig(CONFIG_FILE));
|
|
63
|
+
if (!activeWorkspace) {
|
|
64
|
+
this.error("No active workspace and no --access-key-id/--access-key-secret/--workspace flags given. " +
|
|
65
|
+
"Run `qcobro workspaces:login` first, or pass all three flags.", { exit: 1 });
|
|
66
|
+
}
|
|
67
|
+
return {
|
|
68
|
+
endpoint: activeWorkspace.endpoint,
|
|
69
|
+
accessKeyId: activeWorkspace.accessKeyId,
|
|
70
|
+
accessKeySecret: activeWorkspace.accessKeySecret,
|
|
71
|
+
workspace: activeWorkspace.workspaceAccessKeyId
|
|
72
|
+
};
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
//# sourceMappingURL=configure.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"configure.js","sourceRoot":"","sources":["../../../src/commands/mcp/configure.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { AuthenticatedCommand } from "../../AuthenticatedCommand.js";
|
|
2
|
+
export default class Get extends AuthenticatedCommand<typeof Get> {
|
|
3
|
+
static readonly description = "display a single portfolio";
|
|
4
|
+
static readonly examples: string[];
|
|
5
|
+
static readonly args: {
|
|
6
|
+
id: import("@oclif/core/interfaces").Arg<string, Record<string, unknown>>;
|
|
7
|
+
};
|
|
8
|
+
run(): Promise<void>;
|
|
9
|
+
}
|
|
10
|
+
//# sourceMappingURL=get.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"get.d.ts","sourceRoot":"","sources":["../../../src/commands/portfolios/get.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,oBAAoB,EAAE,MAAM,+BAA+B,CAAC;AAErE,MAAM,CAAC,OAAO,OAAO,GAAI,SAAQ,oBAAoB,CAAC,OAAO,GAAG,CAAC;IAC/D,gBAAyB,WAAW,gCAAgC;IACpE,gBAAyB,QAAQ,WAAgD;IACjF,gBAAyB,IAAI;;MAE3B;IAEW,GAAG,IAAI,OAAO,CAAC,IAAI,CAAC;CAsBlC"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import cliui from "cliui";
|
|
2
|
+
import { Args } from "@oclif/core";
|
|
3
|
+
import { AuthenticatedCommand } from "../../AuthenticatedCommand.js";
|
|
4
|
+
export default class Get extends AuthenticatedCommand {
|
|
5
|
+
static description = "display a single portfolio";
|
|
6
|
+
static examples = ["<%= config.bin %> <%= command.id %> <id>"];
|
|
7
|
+
static args = {
|
|
8
|
+
id: Args.string({ description: "the portfolio id", required: true })
|
|
9
|
+
};
|
|
10
|
+
async run() {
|
|
11
|
+
const { args } = await this.parse(Get);
|
|
12
|
+
const client = await this.createSdkClient();
|
|
13
|
+
const portfolio = await client.portfolios.get({ id: args.id });
|
|
14
|
+
const ui = cliui({ width: 200 });
|
|
15
|
+
ui.div("PORTFOLIO\n" +
|
|
16
|
+
"------------------\n" +
|
|
17
|
+
`ID: \t${portfolio.id}\n` +
|
|
18
|
+
`NAME: \t${portfolio.name}\n` +
|
|
19
|
+
`CLIENT ID: \t${portfolio.clientId}\n` +
|
|
20
|
+
`ACCOUNTS: \t${portfolio.accountCount}\n` +
|
|
21
|
+
`OUTSTANDING BALANCE: \t${portfolio.totalOutstandingBalance}\n` +
|
|
22
|
+
`RECOVERED: \t${portfolio.recoveredAmount}\n` +
|
|
23
|
+
`LAST SYNCED: \t${portfolio.lastSyncedAt ?? "never"}\n` +
|
|
24
|
+
`ARCHIVED: \t${portfolio.archivedAt ? "yes" : "no"}\n`);
|
|
25
|
+
this.log(ui.toString());
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
//# sourceMappingURL=get.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"get.js","sourceRoot":"","sources":["../../../src/commands/portfolios/get.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,IAAI,EAAE,MAAM,aAAa,CAAC;AACnC,OAAO,EAAE,oBAAoB,EAAE,MAAM,+BAA+B,CAAC;AAErE,MAAM,CAAC,OAAO,OAAO,GAAI,SAAQ,oBAAgC;IAC/D,MAAM,CAAmB,WAAW,GAAG,4BAA4B,CAAC;IACpE,MAAM,CAAmB,QAAQ,GAAG,CAAC,0CAA0C,CAAC,CAAC;IACjF,MAAM,CAAmB,IAAI,GAAG;QAC9B,EAAE,EAAE,IAAI,CAAC,MAAM,CAAC,EAAE,WAAW,EAAE,kBAAkB,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;KACrE,CAAC;IAEK,KAAK,CAAC,GAAG;QACd,MAAM,EAAE,IAAI,EAAE,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QACvC,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,eAAe,EAAE,CAAC;QAC5C,MAAM,SAAS,GAAG,MAAM,MAAM,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,EAAE,EAAE,IAAI,CAAC,EAAE,EAAE,CAAC,CAAC;QAE/D,MAAM,EAAE,GAAG,KAAK,CAAC,EAAE,KAAK,EAAE,GAAG,EAAE,CAAC,CAAC;QAEjC,EAAE,CAAC,GAAG,CACJ,aAAa;YACX,sBAAsB;YACtB,SAAS,SAAS,CAAC,EAAE,IAAI;YACzB,WAAW,SAAS,CAAC,IAAI,IAAI;YAC7B,gBAAgB,SAAS,CAAC,QAAQ,IAAI;YACtC,eAAe,SAAS,CAAC,YAAY,IAAI;YACzC,0BAA0B,SAAS,CAAC,uBAAuB,IAAI;YAC/D,gBAAgB,SAAS,CAAC,eAAe,IAAI;YAC7C,kBAAkB,SAAS,CAAC,YAAY,IAAI,OAAO,IAAI;YACvD,eAAe,SAAS,CAAC,UAAU,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,IAAI,CACzD,CAAC;QAEF,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,QAAQ,EAAE,CAAC,CAAC;IAC1B,CAAC"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { AuthenticatedCommand } from "../../AuthenticatedCommand.js";
|
|
2
|
+
export default class List extends AuthenticatedCommand<typeof List> {
|
|
3
|
+
static readonly description = "display the active workspace's portfolios";
|
|
4
|
+
static readonly examples: string[];
|
|
5
|
+
static readonly flags: {
|
|
6
|
+
"include-archived": import("@oclif/core/interfaces").BooleanFlag<boolean>;
|
|
7
|
+
};
|
|
8
|
+
run(): Promise<void>;
|
|
9
|
+
}
|
|
10
|
+
//# sourceMappingURL=list.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"list.d.ts","sourceRoot":"","sources":["../../../src/commands/portfolios/list.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,oBAAoB,EAAE,MAAM,+BAA+B,CAAC;AAErE,MAAM,CAAC,OAAO,OAAO,IAAK,SAAQ,oBAAoB,CAAC,OAAO,IAAI,CAAC;IACjE,gBAAyB,WAAW,+CAA+C;IACnF,gBAAyB,QAAQ,WAG/B;IACF,gBAAyB,KAAK;;MAK5B;IAEW,GAAG,IAAI,OAAO,CAAC,IAAI,CAAC;CA2BlC"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import cliui from "cliui";
|
|
2
|
+
import { Flags } from "@oclif/core";
|
|
3
|
+
import { AuthenticatedCommand } from "../../AuthenticatedCommand.js";
|
|
4
|
+
export default class List extends AuthenticatedCommand {
|
|
5
|
+
static description = "display the active workspace's portfolios";
|
|
6
|
+
static examples = [
|
|
7
|
+
"<%= config.bin %> <%= command.id %>",
|
|
8
|
+
"<%= config.bin %> <%= command.id %> --include-archived"
|
|
9
|
+
];
|
|
10
|
+
static flags = {
|
|
11
|
+
"include-archived": Flags.boolean({
|
|
12
|
+
description: "include archived portfolios",
|
|
13
|
+
default: false
|
|
14
|
+
})
|
|
15
|
+
};
|
|
16
|
+
async run() {
|
|
17
|
+
const { flags } = await this.parse(List);
|
|
18
|
+
const client = await this.createSdkClient();
|
|
19
|
+
const portfolios = await client.portfolios.list({
|
|
20
|
+
includeArchived: flags["include-archived"]
|
|
21
|
+
});
|
|
22
|
+
const ui = cliui({ width: 140 });
|
|
23
|
+
ui.div({ text: "ID", padding: [0, 0, 0, 0], width: 40 }, { text: "NAME", padding: [0, 0, 0, 0], width: 40 }, { text: "CLIENT ID", padding: [0, 0, 0, 0], width: 30 }, { text: "ARCHIVED", padding: [0, 0, 0, 0] });
|
|
24
|
+
portfolios.forEach((portfolio) => {
|
|
25
|
+
ui.div({ text: portfolio.id, padding: [0, 0, 0, 0], width: 40 }, { text: portfolio.name, padding: [0, 0, 0, 0], width: 40 }, { text: portfolio.clientId, padding: [0, 0, 0, 0], width: 30 }, { text: portfolio.archivedAt ? "yes" : "no", padding: [0, 0, 0, 0] });
|
|
26
|
+
});
|
|
27
|
+
this.log(ui.toString());
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
//# sourceMappingURL=list.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"list.js","sourceRoot":"","sources":["../../../src/commands/portfolios/list.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,KAAK,EAAE,MAAM,aAAa,CAAC;AACpC,OAAO,EAAE,oBAAoB,EAAE,MAAM,+BAA+B,CAAC;AAErE,MAAM,CAAC,OAAO,OAAO,IAAK,SAAQ,oBAAiC;IACjE,MAAM,CAAmB,WAAW,GAAG,2CAA2C,CAAC;IACnF,MAAM,CAAmB,QAAQ,GAAG;QAClC,qCAAqC;QACrC,wDAAwD;KACzD,CAAC;IACF,MAAM,CAAmB,KAAK,GAAG;QAC/B,kBAAkB,EAAE,KAAK,CAAC,OAAO,CAAC;YAChC,WAAW,EAAE,6BAA6B;YAC1C,OAAO,EAAE,KAAK;SACf,CAAC;KACH,CAAC;IAEK,KAAK,CAAC,GAAG;QACd,MAAM,EAAE,KAAK,EAAE,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QACzC,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,eAAe,EAAE,CAAC;QAC5C,MAAM,UAAU,GAAG,MAAM,MAAM,CAAC,UAAU,CAAC,IAAI,CAAC;YAC9C,eAAe,EAAE,KAAK,CAAC,kBAAkB,CAAC;SAC3C,CAAC,CAAC;QAEH,MAAM,EAAE,GAAG,KAAK,CAAC,EAAE,KAAK,EAAE,GAAG,EAAE,CAAC,CAAC;QAEjC,EAAE,CAAC,GAAG,CACJ,EAAE,IAAI,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,KAAK,EAAE,EAAE,EAAE,EAChD,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,KAAK,EAAE,EAAE,EAAE,EAClD,EAAE,IAAI,EAAE,WAAW,EAAE,OAAO,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,KAAK,EAAE,EAAE,EAAE,EACvD,EAAE,IAAI,EAAE,UAAU,EAAE,OAAO,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,CAC5C,CAAC;QAEF,UAAU,CAAC,OAAO,CAAC,CAAC,SAAS,EAAE,EAAE;YAC/B,EAAE,CAAC,GAAG,CACJ,EAAE,IAAI,EAAE,SAAS,CAAC,EAAE,EAAE,OAAO,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,KAAK,EAAE,EAAE,EAAE,EACxD,EAAE,IAAI,EAAE,SAAS,CAAC,IAAI,EAAE,OAAO,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,KAAK,EAAE,EAAE,EAAE,EAC1D,EAAE,IAAI,EAAE,SAAS,CAAC,QAAQ,EAAE,OAAO,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,KAAK,EAAE,EAAE,EAAE,EAC9D,EAAE,IAAI,EAAE,SAAS,CAAC,UAAU,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,EAAE,OAAO,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,CACrE,CAAC;QACJ,CAAC,CAAC,CAAC;QAEH,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,QAAQ,EAAE,CAAC,CAAC;IAC1B,CAAC"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { AuthenticatedCommand } from "../../AuthenticatedCommand.js";
|
|
2
|
+
export default class Sync extends AuthenticatedCommand<typeof Sync> {
|
|
3
|
+
static readonly description = "synchronize a batch of account rows into a portfolio, from a JSON file";
|
|
4
|
+
static readonly examples: string[];
|
|
5
|
+
static readonly flags: {
|
|
6
|
+
"portfolio-id": import("@oclif/core/interfaces").OptionFlag<string, import("@oclif/core/interfaces").CustomOptions>;
|
|
7
|
+
file: import("@oclif/core/interfaces").OptionFlag<string, import("@oclif/core/interfaces").CustomOptions>;
|
|
8
|
+
mode: import("@oclif/core/interfaces").OptionFlag<string, import("@oclif/core/interfaces").CustomOptions>;
|
|
9
|
+
};
|
|
10
|
+
run(): Promise<void>;
|
|
11
|
+
}
|
|
12
|
+
//# sourceMappingURL=sync.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sync.d.ts","sourceRoot":"","sources":["../../../src/commands/portfolios/sync.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,oBAAoB,EAAE,MAAM,+BAA+B,CAAC;AAErE,MAAM,CAAC,OAAO,OAAO,IAAK,SAAQ,oBAAoB,CAAC,OAAO,IAAI,CAAC;IACjE,gBAAyB,WAAW,4EACuC;IAC3E,gBAAyB,QAAQ,WAE/B;IACF,gBAAyB,KAAK;;;;MAW5B;IAEW,GAAG,IAAI,OAAO,CAAC,IAAI,CAAC;CA0BlC"}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
import { readFileSync } from "node:fs";
|
|
2
|
+
import { Flags } from "@oclif/core";
|
|
3
|
+
import { AuthenticatedCommand } from "../../AuthenticatedCommand.js";
|
|
4
|
+
export default class Sync extends AuthenticatedCommand {
|
|
5
|
+
static description = "synchronize a batch of account rows into a portfolio, from a JSON file";
|
|
6
|
+
static examples = [
|
|
7
|
+
"<%= config.bin %> <%= command.id %> --portfolio-id <id> --file rows.json --mode APPEND_ONLY"
|
|
8
|
+
];
|
|
9
|
+
static flags = {
|
|
10
|
+
"portfolio-id": Flags.string({ description: "the portfolio id", required: true }),
|
|
11
|
+
file: Flags.string({
|
|
12
|
+
description: "path to a JSON file containing an array of account rows",
|
|
13
|
+
required: true
|
|
14
|
+
}),
|
|
15
|
+
mode: Flags.string({
|
|
16
|
+
description: "merge strategy",
|
|
17
|
+
options: ["APPEND_ONLY", "UPDATE_EXISTING", "REPLACE"],
|
|
18
|
+
default: "APPEND_ONLY"
|
|
19
|
+
})
|
|
20
|
+
};
|
|
21
|
+
async run() {
|
|
22
|
+
const { flags } = await this.parse(Sync);
|
|
23
|
+
const client = await this.createSdkClient();
|
|
24
|
+
let rows;
|
|
25
|
+
try {
|
|
26
|
+
rows = JSON.parse(readFileSync(flags.file, "utf8"));
|
|
27
|
+
}
|
|
28
|
+
catch (err) {
|
|
29
|
+
this.error(`Could not read/parse ${flags.file}: ${err instanceof Error ? err.message : err}`, {
|
|
30
|
+
exit: 1
|
|
31
|
+
});
|
|
32
|
+
}
|
|
33
|
+
const result = await client.portfolios.syncAccounts({
|
|
34
|
+
portfolioId: flags["portfolio-id"],
|
|
35
|
+
mode: flags.mode,
|
|
36
|
+
rows: rows
|
|
37
|
+
});
|
|
38
|
+
this.log(`Synced: ${result.created} created, ${result.updated} updated, ${result.archived} archived (total ${result.total}).`);
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
//# sourceMappingURL=sync.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sync.js","sourceRoot":"","sources":["../../../src/commands/portfolios/sync.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACvC,OAAO,EAAE,KAAK,EAAE,MAAM,aAAa,CAAC;AAEpC,OAAO,EAAE,oBAAoB,EAAE,MAAM,+BAA+B,CAAC;AAErE,MAAM,CAAC,OAAO,OAAO,IAAK,SAAQ,oBAAiC;IACjE,MAAM,CAAmB,WAAW,GAClC,wEAAwE,CAAC;IAC3E,MAAM,CAAmB,QAAQ,GAAG;QAClC,6FAA6F;KAC9F,CAAC;IACF,MAAM,CAAmB,KAAK,GAAG;QAC/B,cAAc,EAAE,KAAK,CAAC,MAAM,CAAC,EAAE,WAAW,EAAE,kBAAkB,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;QACjF,IAAI,EAAE,KAAK,CAAC,MAAM,CAAC;YACjB,WAAW,EAAE,yDAAyD;YACtE,QAAQ,EAAE,IAAI;SACf,CAAC;QACF,IAAI,EAAE,KAAK,CAAC,MAAM,CAAC;YACjB,WAAW,EAAE,gBAAgB;YAC7B,OAAO,EAAE,CAAC,aAAa,EAAE,iBAAiB,EAAE,SAAS,CAAC;YACtD,OAAO,EAAE,aAAa;SACvB,CAAC;KACH,CAAC;IAEK,KAAK,CAAC,GAAG;QACd,MAAM,EAAE,KAAK,EAAE,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QACzC,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,eAAe,EAAE,CAAC;QAE5C,IAAI,IAAa,CAAC;QAClB,IAAI,CAAC;YACH,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,KAAK,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC,CAAC;QACtD,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,IAAI,CAAC,KAAK,CACR,wBAAwB,KAAK,CAAC,IAAI,KAAK,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,EAAE,EACjF;gBACE,IAAI,EAAE,CAAC;aACR,CACF,CAAC;QACJ,CAAC;QAED,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,UAAU,CAAC,YAAY,CAAC;YAClD,WAAW,EAAE,KAAK,CAAC,cAAc,CAAC;YAClC,IAAI,EAAE,KAAK,CAAC,IAAiC;YAC7C,IAAI,EAAE,IAAiC;SACxC,CAAC,CAAC;QAEH,IAAI,CAAC,GAAG,CACN,WAAW,MAAM,CAAC,OAAO,aAAa,MAAM,CAAC,OAAO,aAAa,MAAM,CAAC,QAAQ,oBAAoB,MAAM,CAAC,KAAK,IAAI,CACrH,CAAC;IACJ,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"active.d.ts","sourceRoot":"","sources":["../../../src/commands/workspaces/active.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;AAItC,MAAM,CAAC,OAAO,OAAO,MAAO,SAAQ,OAAO;IACzC,gBAAyB,WAAW,yCAAyC;IAC7E,gBAAyB,QAAQ,WAA2C;IAE/D,GAAG,IAAI,OAAO,CAAC,IAAI,CAAC;CAqBlC"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import cliui from "cliui";
|
|
2
|
+
import { Command } from "@oclif/core";
|
|
3
|
+
import { getActiveWorkspace, getConfig } from "../../config/index.js";
|
|
4
|
+
import { CONFIG_FILE } from "../../constants.js";
|
|
5
|
+
export default class Active extends Command {
|
|
6
|
+
static description = "display the active QCobro workspace";
|
|
7
|
+
static examples = ["<%= config.bin %> <%= command.id %>"];
|
|
8
|
+
async run() {
|
|
9
|
+
const workspaces = getConfig(CONFIG_FILE);
|
|
10
|
+
const activeWorkspace = getActiveWorkspace(workspaces);
|
|
11
|
+
if (!activeWorkspace) {
|
|
12
|
+
this.error("No active workspace found. Run `qcobro workspaces:login` first.", { exit: 1 });
|
|
13
|
+
}
|
|
14
|
+
const { name, workspaceAccessKeyId, endpoint } = activeWorkspace;
|
|
15
|
+
const ui = cliui({ width: 200 });
|
|
16
|
+
ui.div("ACTIVE WORKSPACE\n" +
|
|
17
|
+
"------------------\n" +
|
|
18
|
+
`NAME: \t${name}\n` +
|
|
19
|
+
`WORKSPACE ACCESS KEY ID: \t${workspaceAccessKeyId}\n` +
|
|
20
|
+
`ENDPOINT: \t${endpoint}\n`);
|
|
21
|
+
this.log(ui.toString());
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
//# sourceMappingURL=active.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"active.js","sourceRoot":"","sources":["../../../src/commands/workspaces/active.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;AACtC,OAAO,EAAE,kBAAkB,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAC;AACtE,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAEjD,MAAM,CAAC,OAAO,OAAO,MAAO,SAAQ,OAAO;IACzC,MAAM,CAAmB,WAAW,GAAG,qCAAqC,CAAC;IAC7E,MAAM,CAAmB,QAAQ,GAAG,CAAC,qCAAqC,CAAC,CAAC;IAErE,KAAK,CAAC,GAAG;QACd,MAAM,UAAU,GAAG,SAAS,CAAC,WAAW,CAAC,CAAC;QAC1C,MAAM,eAAe,GAAG,kBAAkB,CAAC,UAAU,CAAC,CAAC;QAEvD,IAAI,CAAC,eAAe,EAAE,CAAC;YACrB,IAAI,CAAC,KAAK,CAAC,iEAAiE,EAAE,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC,CAAC;QAC7F,CAAC;QAED,MAAM,EAAE,IAAI,EAAE,oBAAoB,EAAE,QAAQ,EAAE,GAAG,eAAe,CAAC;QACjE,MAAM,EAAE,GAAG,KAAK,CAAC,EAAE,KAAK,EAAE,GAAG,EAAE,CAAC,CAAC;QAEjC,EAAE,CAAC,GAAG,CACJ,oBAAoB;YAClB,sBAAsB;YACtB,WAAW,IAAI,IAAI;YACnB,8BAA8B,oBAAoB,IAAI;YACtD,eAAe,QAAQ,IAAI,CAC9B,CAAC;QAEF,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,QAAQ,EAAE,CAAC,CAAC;IAC1B,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"list.d.ts","sourceRoot":"","sources":["../../../src/commands/workspaces/list.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;AAItC,MAAM,CAAC,OAAO,OAAO,IAAK,SAAQ,OAAO;IACvC,gBAAyB,WAAW,0CAA0C;IAC9E,gBAAyB,QAAQ,WAA2C;IAE/D,GAAG,IAAI,OAAO,CAAC,IAAI,CAAC;CAoBlC"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import cliui from "cliui";
|
|
2
|
+
import { Command } from "@oclif/core";
|
|
3
|
+
import { getConfig } from "../../config/index.js";
|
|
4
|
+
import { CONFIG_FILE } from "../../constants.js";
|
|
5
|
+
export default class List extends Command {
|
|
6
|
+
static description = "display all linked QCobro workspaces";
|
|
7
|
+
static examples = ["<%= config.bin %> <%= command.id %>"];
|
|
8
|
+
async run() {
|
|
9
|
+
const workspaces = getConfig(CONFIG_FILE);
|
|
10
|
+
const ui = cliui({ width: 120 });
|
|
11
|
+
ui.div({ text: "WORKSPACE ACCESS KEY ID", padding: [0, 0, 0, 0] }, { text: "NAME", padding: [0, 0, 0, 0] }, { text: "STATUS", padding: [0, 0, 0, 0] });
|
|
12
|
+
workspaces.forEach((workspace) => {
|
|
13
|
+
ui.div({ text: workspace.workspaceAccessKeyId, padding: [0, 0, 0, 0] }, { text: workspace.name, padding: [0, 0, 0, 0] }, { text: workspace.active ? "[ACTIVE]" : "", padding: [0, 0, 0, 0] });
|
|
14
|
+
});
|
|
15
|
+
this.log(ui.toString());
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
//# sourceMappingURL=list.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"list.js","sourceRoot":"","sources":["../../../src/commands/workspaces/list.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;AACtC,OAAO,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAC;AAClD,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAEjD,MAAM,CAAC,OAAO,OAAO,IAAK,SAAQ,OAAO;IACvC,MAAM,CAAmB,WAAW,GAAG,sCAAsC,CAAC;IAC9E,MAAM,CAAmB,QAAQ,GAAG,CAAC,qCAAqC,CAAC,CAAC;IAErE,KAAK,CAAC,GAAG;QACd,MAAM,UAAU,GAAG,SAAS,CAAC,WAAW,CAAC,CAAC;QAC1C,MAAM,EAAE,GAAG,KAAK,CAAC,EAAE,KAAK,EAAE,GAAG,EAAE,CAAC,CAAC;QAEjC,EAAE,CAAC,GAAG,CACJ,EAAE,IAAI,EAAE,yBAAyB,EAAE,OAAO,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,EAC1D,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,EACvC,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,CAC1C,CAAC;QAEF,UAAU,CAAC,OAAO,CAAC,CAAC,SAAS,EAAE,EAAE;YAC/B,EAAE,CAAC,GAAG,CACJ,EAAE,IAAI,EAAE,SAAS,CAAC,oBAAoB,EAAE,OAAO,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,EAC/D,EAAE,IAAI,EAAE,SAAS,CAAC,IAAI,EAAE,OAAO,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,EAC/C,EAAE,IAAI,EAAE,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,EAAE,OAAO,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,CACpE,CAAC;QACJ,CAAC,CAAC,CAAC;QAEH,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,QAAQ,EAAE,CAAC,CAAC;IAC1B,CAAC"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { BaseCommand } from "../../BaseCommand.js";
|
|
2
|
+
export default class Login extends BaseCommand<typeof Login> {
|
|
3
|
+
static readonly description = "link a QCobro workspace to the local environment";
|
|
4
|
+
static readonly examples: string[];
|
|
5
|
+
run(): Promise<void>;
|
|
6
|
+
private validateCredentials;
|
|
7
|
+
}
|
|
8
|
+
//# sourceMappingURL=login.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"login.d.ts","sourceRoot":"","sources":["../../../src/commands/workspaces/login.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AAKnD,MAAM,CAAC,OAAO,OAAO,KAAM,SAAQ,WAAW,CAAC,OAAO,KAAK,CAAC;IAC1D,gBAAyB,WAAW,sDAAsD;IAC1F,gBAAyB,QAAQ,WAA2C;IAE/D,GAAG,IAAI,OAAO,CAAC,IAAI,CAAC;YA8CnB,mBAAmB;CAsBlC"}
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
import { confirm, input, password } from "@inquirer/prompts";
|
|
2
|
+
import { Client } from "@qcobro/sdk";
|
|
3
|
+
import { BaseCommand } from "../../BaseCommand.js";
|
|
4
|
+
import { createAddWorkspace, getConfig, saveConfig } from "../../config/index.js";
|
|
5
|
+
import { CONFIG_FILE, DEFAULT_ENDPOINT } from "../../constants.js";
|
|
6
|
+
export default class Login extends BaseCommand {
|
|
7
|
+
static description = "link a QCobro workspace to the local environment";
|
|
8
|
+
static examples = ["<%= config.bin %> <%= command.id %>"];
|
|
9
|
+
async run() {
|
|
10
|
+
this.log("This utility links a QCobro workspace to the CLI.");
|
|
11
|
+
this.log("Press ^C at any time to quit.");
|
|
12
|
+
const answers = {
|
|
13
|
+
endpoint: await input({ message: "Endpoint", default: DEFAULT_ENDPOINT }),
|
|
14
|
+
accessKeyId: await input({
|
|
15
|
+
message: "Access Key Id (API key, starts with AP)",
|
|
16
|
+
required: true
|
|
17
|
+
}),
|
|
18
|
+
accessKeySecret: await password({ message: "Access Key Secret" }),
|
|
19
|
+
workspaceAccessKeyId: await input({
|
|
20
|
+
message: "Workspace to act in (accessKeyId, starts with WO)",
|
|
21
|
+
required: true
|
|
22
|
+
}),
|
|
23
|
+
confirmed: await confirm({ message: "Ready?" })
|
|
24
|
+
};
|
|
25
|
+
if (!answers.confirmed) {
|
|
26
|
+
this.log("Aborted!");
|
|
27
|
+
return;
|
|
28
|
+
}
|
|
29
|
+
await this.validateCredentials(answers);
|
|
30
|
+
const workspace = {
|
|
31
|
+
name: answers.workspaceAccessKeyId,
|
|
32
|
+
endpoint: answers.endpoint,
|
|
33
|
+
workspaceAccessKeyId: answers.workspaceAccessKeyId,
|
|
34
|
+
accessKeyId: answers.accessKeyId,
|
|
35
|
+
accessKeySecret: answers.accessKeySecret
|
|
36
|
+
};
|
|
37
|
+
const workspaces = getConfig(CONFIG_FILE);
|
|
38
|
+
const addWorkspace = createAddWorkspace(workspaces);
|
|
39
|
+
try {
|
|
40
|
+
const updated = await addWorkspace(workspace);
|
|
41
|
+
saveConfig(CONFIG_FILE, updated);
|
|
42
|
+
}
|
|
43
|
+
catch (err) {
|
|
44
|
+
this.error(err instanceof Error ? err.message : String(err));
|
|
45
|
+
}
|
|
46
|
+
this.log("Done!");
|
|
47
|
+
}
|
|
48
|
+
async validateCredentials(answers) {
|
|
49
|
+
const client = new Client({ endpoint: answers.endpoint });
|
|
50
|
+
try {
|
|
51
|
+
await client.loginWithApiKey({
|
|
52
|
+
accessKeyId: answers.accessKeyId,
|
|
53
|
+
accessKeySecret: answers.accessKeySecret
|
|
54
|
+
});
|
|
55
|
+
client.useWorkspace(answers.workspaceAccessKeyId);
|
|
56
|
+
// Sanity call: confirms the key is valid AND a member of the given workspace.
|
|
57
|
+
await client.portfolios.list();
|
|
58
|
+
}
|
|
59
|
+
catch (err) {
|
|
60
|
+
this.error(`Invalid credentials or workspace: ${err instanceof Error ? err.message : String(err)}`);
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
//# sourceMappingURL=login.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"login.js","sourceRoot":"","sources":["../../../src/commands/workspaces/login.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { Command } from "@oclif/core";
|
|
2
|
+
export default class Logout extends Command {
|
|
3
|
+
static readonly description = "unlink a QCobro workspace from the local environment";
|
|
4
|
+
static readonly examples: string[];
|
|
5
|
+
static readonly args: {
|
|
6
|
+
workspaceAccessKeyId: import("@oclif/core/interfaces").Arg<string, Record<string, unknown>>;
|
|
7
|
+
};
|
|
8
|
+
run(): Promise<void>;
|
|
9
|
+
}
|
|
10
|
+
//# sourceMappingURL=logout.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"logout.d.ts","sourceRoot":"","sources":["../../../src/commands/workspaces/logout.ts"],"names":[],"mappings":"AAAA,OAAO,EAAQ,OAAO,EAAE,MAAM,aAAa,CAAC;AAI5C,MAAM,CAAC,OAAO,OAAO,MAAO,SAAQ,OAAO;IACzC,gBAAyB,WAAW,0DAA0D;IAC9F,gBAAyB,QAAQ,WAE/B;IACF,gBAAyB,IAAI;;MAK3B;IAEW,GAAG,IAAI,OAAO,CAAC,IAAI,CAAC;CAOlC"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import { Args, Command } from "@oclif/core";
|
|
2
|
+
import { getConfig, removeWorkspace, saveConfig } from "../../config/index.js";
|
|
3
|
+
import { CONFIG_FILE } from "../../constants.js";
|
|
4
|
+
export default class Logout extends Command {
|
|
5
|
+
static description = "unlink a QCobro workspace from the local environment";
|
|
6
|
+
static examples = [
|
|
7
|
+
"<%= config.bin %> <%= command.id %> WO6ueex0qan9ojhf820wgiae3qi5luy08y"
|
|
8
|
+
];
|
|
9
|
+
static args = {
|
|
10
|
+
workspaceAccessKeyId: Args.string({
|
|
11
|
+
description: "the workspace to unlink (its accessKeyId)",
|
|
12
|
+
required: true
|
|
13
|
+
})
|
|
14
|
+
};
|
|
15
|
+
async run() {
|
|
16
|
+
const { args } = await this.parse(Logout);
|
|
17
|
+
const workspaces = getConfig(CONFIG_FILE);
|
|
18
|
+
const updated = removeWorkspace(args.workspaceAccessKeyId, workspaces);
|
|
19
|
+
saveConfig(CONFIG_FILE, updated);
|
|
20
|
+
this.log("Done!");
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
//# sourceMappingURL=logout.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"logout.js","sourceRoot":"","sources":["../../../src/commands/workspaces/logout.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAE,SAAS,EAAE,eAAe,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAC;AAC/E,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAEjD,MAAM,CAAC,OAAO,OAAO,MAAO,SAAQ,OAAO;IACzC,MAAM,CAAmB,WAAW,GAAG,sDAAsD,CAAC;IAC9F,MAAM,CAAmB,QAAQ,GAAG;QAClC,wEAAwE;KACzE,CAAC;IACF,MAAM,CAAmB,IAAI,GAAG;QAC9B,oBAAoB,EAAE,IAAI,CAAC,MAAM,CAAC;YAChC,WAAW,EAAE,2CAA2C;YACxD,QAAQ,EAAE,IAAI;SACf,CAAC;KACH,CAAC;IAEK,KAAK,CAAC,GAAG;QACd,MAAM,EAAE,IAAI,EAAE,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;QAC1C,MAAM,UAAU,GAAG,SAAS,CAAC,WAAW,CAAC,CAAC;QAC1C,MAAM,OAAO,GAAG,eAAe,CAAC,IAAI,CAAC,oBAAoB,EAAE,UAAU,CAAC,CAAC;QACvE,UAAU,CAAC,WAAW,EAAE,OAAO,CAAC,CAAC;QACjC,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;IACpB,CAAC"}
|