@capitalcheckin/cli 0.0.0-stage → 1.1.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 CHANGED
@@ -1,3 +1,49 @@
1
- # Temporary Holding Version
1
+ # Capital Check In CLI
2
2
 
3
- This version is a temporary placeholder for this package. An operational version to replace this has been submitted for review and is awaiting a staged release.
3
+ Official Capital Check In CLI. It talks to the Capital Check In API so integrators can onboard and operate tenants from the terminal.
4
+
5
+ ## Installation
6
+
7
+ ```bash
8
+ npm install --save @capitalcheckin/cli
9
+ ```
10
+
11
+ Publishing a GitHub Release runs `.github/workflows/publish-npm.yml` and publishes that version to npm with the `NPM_TOKEN` secret. A push to `main` that changes `package.json` does the same when that version is not on the registry yet.
12
+
13
+ Build from source:
14
+
15
+ ```bash
16
+ npm install
17
+ npm run build
18
+ npm link
19
+ ```
20
+
21
+ ## Sandbox
22
+
23
+ Use the demo environment, not production. Credentials, seed data, and the command walkthrough are in [docs/ONBOARDING.md](docs/ONBOARDING.md).
24
+
25
+ ```bash
26
+ cci login --base-url https://demo.capitalcheckin.app --email demo-retail@capitalcheckin.app
27
+ cci tenants list
28
+ cci tenants use <id>
29
+ cci collaborators list
30
+ ```
31
+
32
+ ## Commands
33
+
34
+ | Command | Purpose |
35
+ | --- | --- |
36
+ | `cci login` | Store a session (`POST /auth/login` or `--token`) |
37
+ | `cci logout` | Remove the stored token and active tenant |
38
+ | `cci whoami` | Show the authenticated user |
39
+ | `cci tenants list` | List tenants for the account |
40
+ | `cci tenants use <id>` | Select the active tenant (`X-Company-Id`) |
41
+ | `cci tenants create --name "..."` | Create a tenant and select it |
42
+ | `cci tenants show [id]` | Show a tenant |
43
+ | `cci collaborators list` | List collaborators in the active tenant |
44
+
45
+ The session file is `~/.cci/config.json` (`0600`). Override it with `CCI_API_URL`, `CCI_TOKEN`, `CCI_COMPANY_ID`, or `CCI_CONFIG_PATH`.
46
+
47
+ ```bash
48
+ cci --help
49
+ ```
package/dist/api.js ADDED
@@ -0,0 +1,90 @@
1
+ "use strict";
2
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
3
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
4
+ return new (P || (P = Promise))(function (resolve, reject) {
5
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
6
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
7
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
8
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
9
+ });
10
+ };
11
+ Object.defineProperty(exports, "__esModule", { value: true });
12
+ exports.ApiError = void 0;
13
+ exports.apiRequest = apiRequest;
14
+ exports.unwrapData = unwrapData;
15
+ exports.unwrapList = unwrapList;
16
+ class ApiError extends Error {
17
+ constructor(message, status, payload) {
18
+ super(message);
19
+ this.status = status;
20
+ this.payload = payload;
21
+ this.name = "ApiError";
22
+ }
23
+ }
24
+ exports.ApiError = ApiError;
25
+ function apiRequest(config_1, requestPath_1) {
26
+ return __awaiter(this, arguments, void 0, function* (config, requestPath, options = {}) {
27
+ var _a, _b, _c;
28
+ const headers = {
29
+ Accept: "application/json",
30
+ };
31
+ const token = (_a = options.token) !== null && _a !== void 0 ? _a : config.token;
32
+ if (token) {
33
+ headers.Authorization = `Bearer ${token}`;
34
+ }
35
+ const companyId = options.companyId === null ? undefined : ((_b = options.companyId) !== null && _b !== void 0 ? _b : config.companyId);
36
+ if (companyId) {
37
+ headers["X-Company-Id"] = companyId;
38
+ }
39
+ let body;
40
+ if (options.body !== undefined) {
41
+ headers["Content-Type"] = "application/json";
42
+ body = JSON.stringify(options.body);
43
+ }
44
+ const response = yield fetch(`${config.baseUrl}${requestPath}`, {
45
+ method: (_c = options.method) !== null && _c !== void 0 ? _c : "GET",
46
+ headers,
47
+ body,
48
+ });
49
+ const text = yield response.text();
50
+ const payload = parsePayload(text);
51
+ if (!response.ok) {
52
+ throw new ApiError(messageFromPayload(payload, response.status), response.status, payload);
53
+ }
54
+ return payload;
55
+ });
56
+ }
57
+ function unwrapData(payload) {
58
+ if (payload && typeof payload === "object" && "data" in payload) {
59
+ return payload.data;
60
+ }
61
+ return payload;
62
+ }
63
+ function unwrapList(payload) {
64
+ const data = unwrapData(payload);
65
+ if (!Array.isArray(data)) {
66
+ return [];
67
+ }
68
+ return data.filter((item) => !!item && typeof item === "object");
69
+ }
70
+ function parsePayload(text) {
71
+ if (text === "") {
72
+ return null;
73
+ }
74
+ try {
75
+ return JSON.parse(text);
76
+ }
77
+ catch (_a) {
78
+ return text;
79
+ }
80
+ }
81
+ function messageFromPayload(payload, status) {
82
+ if (payload && typeof payload === "object" && "message" in payload) {
83
+ const message = payload.message;
84
+ if (typeof message === "string" && message !== "") {
85
+ return message;
86
+ }
87
+ }
88
+ return `Request failed (${status})`;
89
+ }
90
+ //# sourceMappingURL=api.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"api.js","sourceRoot":"","sources":["../src/api.ts"],"names":[],"mappings":"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"}
package/dist/config.js ADDED
@@ -0,0 +1,66 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.DEFAULT_BASE_URL = void 0;
7
+ exports.configPath = configPath;
8
+ exports.loadConfig = loadConfig;
9
+ exports.updateConfig = updateConfig;
10
+ const fs_1 = __importDefault(require("fs"));
11
+ const os_1 = __importDefault(require("os"));
12
+ const path_1 = __importDefault(require("path"));
13
+ exports.DEFAULT_BASE_URL = "https://api.capitalcheckin.app";
14
+ function configPath() {
15
+ var _a;
16
+ if (process.env.CCI_CONFIG_PATH) {
17
+ return process.env.CCI_CONFIG_PATH;
18
+ }
19
+ const dir = (_a = process.env.CCI_CONFIG_DIR) !== null && _a !== void 0 ? _a : path_1.default.join(os_1.default.homedir(), ".cci");
20
+ return path_1.default.join(dir, "config.json");
21
+ }
22
+ function readStoredConfig() {
23
+ const file = configPath();
24
+ if (!fs_1.default.existsSync(file)) {
25
+ return {};
26
+ }
27
+ const parsed = JSON.parse(fs_1.default.readFileSync(file, "utf8"));
28
+ if (!parsed || typeof parsed !== "object") {
29
+ return {};
30
+ }
31
+ return parsed;
32
+ }
33
+ function loadConfig() {
34
+ var _a, _b;
35
+ const stored = readStoredConfig();
36
+ const baseUrl = ((_b = (_a = process.env.CCI_API_URL) !== null && _a !== void 0 ? _a : stored.baseUrl) !== null && _b !== void 0 ? _b : exports.DEFAULT_BASE_URL).replace(/\/$/, "");
37
+ const token = process.env.CCI_TOKEN || stored.token;
38
+ const companyId = process.env.CCI_COMPANY_ID || stored.companyId;
39
+ return Object.assign(Object.assign({ baseUrl }, (token ? { token } : {})), (companyId ? { companyId } : {}));
40
+ }
41
+ function updateConfig(patch) {
42
+ var _a, _b;
43
+ const stored = readStoredConfig();
44
+ const next = {
45
+ baseUrl: ((_b = (_a = patch.baseUrl) !== null && _a !== void 0 ? _a : stored.baseUrl) !== null && _b !== void 0 ? _b : exports.DEFAULT_BASE_URL).replace(/\/$/, ""),
46
+ };
47
+ const token = patch.token === undefined ? stored.token : patch.token;
48
+ const companyId = patch.companyId === undefined ? stored.companyId : patch.companyId;
49
+ if (token) {
50
+ next.token = token;
51
+ }
52
+ if (companyId) {
53
+ next.companyId = companyId;
54
+ }
55
+ const file = configPath();
56
+ fs_1.default.mkdirSync(path_1.default.dirname(file), { recursive: true, mode: 0o700 });
57
+ fs_1.default.writeFileSync(file, JSON.stringify(next, null, 2) + "\n", { mode: 0o600 });
58
+ try {
59
+ fs_1.default.chmodSync(file, 0o600);
60
+ }
61
+ catch (_c) {
62
+ // Some filesystems ignore permission bits.
63
+ }
64
+ return loadConfig();
65
+ }
66
+ //# sourceMappingURL=config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"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"}
package/dist/format.js ADDED
@@ -0,0 +1,32 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.formatTable = formatTable;
4
+ exports.displayUserName = displayUserName;
5
+ exports.displayCollaboratorName = displayCollaboratorName;
6
+ function formatTable(headers, rows) {
7
+ const widths = headers.map((header, index) => {
8
+ const cellWidths = rows.map((row) => { var _a; return ((_a = row[index]) !== null && _a !== void 0 ? _a : "").length; });
9
+ return Math.max(header.length, ...cellWidths, 0);
10
+ });
11
+ const render = (cells) => cells.map((cell, index) => { var _a; return cell.padEnd((_a = widths[index]) !== null && _a !== void 0 ? _a : 0); }).join(" ").trimEnd();
12
+ const separator = widths.map((width) => "-".repeat(width));
13
+ return [render(headers), render(separator), ...rows.map(render)].join("\n");
14
+ }
15
+ function displayUserName(user) {
16
+ return joinName([user.name, user.last_name]) || stringValue(user.email);
17
+ }
18
+ function displayCollaboratorName(row) {
19
+ if (typeof row.full_name === "string" && row.full_name !== "") {
20
+ return row.full_name;
21
+ }
22
+ return joinName([row.first_name, row.second_name, row.paternal_surname, row.maternal_surname]) || "—";
23
+ }
24
+ function joinName(parts) {
25
+ return parts
26
+ .filter((part) => typeof part === "string" && part.trim() !== "")
27
+ .join(" ");
28
+ }
29
+ function stringValue(value) {
30
+ return typeof value === "string" ? value : "";
31
+ }
32
+ //# sourceMappingURL=format.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"format.js","sourceRoot":"","sources":["../src/format.ts"],"names":[],"mappings":";;AAAA,kCAWC;AAED,0CAEC;AAED,0DAMC;AAvBD,SAAgB,WAAW,CAAC,OAAiB,EAAE,IAAgB;IAC7D,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,KAAK,EAAE,EAAE;QAC3C,MAAM,UAAU,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,WAAC,OAAA,CAAC,MAAA,GAAG,CAAC,KAAK,CAAC,mCAAI,EAAE,CAAC,CAAC,MAAM,CAAA,EAAA,CAAC,CAAC;QAEhE,OAAO,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,MAAM,EAAE,GAAG,UAAU,EAAE,CAAC,CAAC,CAAC;IACnD,CAAC,CAAC,CAAC;IAEH,MAAM,MAAM,GAAG,CAAC,KAAe,EAAU,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,WAAC,OAAA,IAAI,CAAC,MAAM,CAAC,MAAA,MAAM,CAAC,KAAK,CAAC,mCAAI,CAAC,CAAC,CAAA,EAAA,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,CAAC;IAC7H,MAAM,SAAS,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;IAE3D,OAAO,CAAC,MAAM,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC,SAAS,CAAC,EAAE,GAAG,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC9E,CAAC;AAED,SAAgB,eAAe,CAAC,IAA6B;IAC3D,OAAO,QAAQ,CAAC,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,CAAC,IAAI,WAAW,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;AAC1E,CAAC;AAED,SAAgB,uBAAuB,CAAC,GAA4B;IAClE,IAAI,OAAO,GAAG,CAAC,SAAS,KAAK,QAAQ,IAAI,GAAG,CAAC,SAAS,KAAK,EAAE,EAAE,CAAC;QAC9D,OAAO,GAAG,CAAC,SAAS,CAAC;IACvB,CAAC;IAED,OAAO,QAAQ,CAAC,CAAC,GAAG,CAAC,UAAU,EAAE,GAAG,CAAC,WAAW,EAAE,GAAG,CAAC,gBAAgB,EAAE,GAAG,CAAC,gBAAgB,CAAC,CAAC,IAAI,GAAG,CAAC;AACxG,CAAC;AAED,SAAS,QAAQ,CAAC,KAAgB;IAChC,OAAO,KAAK;SACT,MAAM,CAAC,CAAC,IAAI,EAAkB,EAAE,CAAC,OAAO,IAAI,KAAK,QAAQ,IAAI,IAAI,CAAC,IAAI,EAAE,KAAK,EAAE,CAAC;SAChF,IAAI,CAAC,GAAG,CAAC,CAAC;AACf,CAAC;AAED,SAAS,WAAW,CAAC,KAAc;IACjC,OAAO,OAAO,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC;AAChD,CAAC"}
package/dist/index.js ADDED
@@ -0,0 +1,20 @@
1
+ #!/usr/bin/env node
2
+ "use strict";
3
+ Object.defineProperty(exports, "__esModule", { value: true });
4
+ const prompts_1 = require("@inquirer/prompts");
5
+ const program_1 = require("./program");
6
+ const program = (0, program_1.buildProgram)({
7
+ promptPassword: () => (0, prompts_1.password)({ message: "Password" }),
8
+ log: (message) => {
9
+ console.log(message);
10
+ },
11
+ error: (message) => {
12
+ console.error(message);
13
+ },
14
+ });
15
+ program.parseAsync(process.argv).catch((error) => {
16
+ const message = error instanceof Error ? error.message : String(error);
17
+ console.error(message);
18
+ process.exitCode = 1;
19
+ });
20
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;AAEA,+CAA6C;AAC7C,uCAAyC;AAEzC,MAAM,OAAO,GAAG,IAAA,sBAAY,EAAC;IAC3B,cAAc,EAAE,GAAG,EAAE,CAAC,IAAA,kBAAQ,EAAC,EAAE,OAAO,EAAE,UAAU,EAAE,CAAC;IACvD,GAAG,EAAE,CAAC,OAAO,EAAE,EAAE;QACf,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;IACvB,CAAC;IACD,KAAK,EAAE,CAAC,OAAO,EAAE,EAAE;QACjB,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;IACzB,CAAC;CACF,CAAC,CAAC;AAEH,OAAO,CAAC,UAAU,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,CAAC,KAAc,EAAE,EAAE;IACxD,MAAM,OAAO,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IACvE,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;IACvB,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;AACvB,CAAC,CAAC,CAAC"}
@@ -0,0 +1,105 @@
1
+ "use strict";
2
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
3
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
4
+ return new (P || (P = Promise))(function (resolve, reject) {
5
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
6
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
7
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
8
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
9
+ });
10
+ };
11
+ Object.defineProperty(exports, "__esModule", { value: true });
12
+ exports.buildProgram = buildProgram;
13
+ const commander_1 = require("commander");
14
+ const session_1 = require("./session");
15
+ function buildProgram(io) {
16
+ const program = new commander_1.Command();
17
+ program
18
+ .name("cci")
19
+ .description("Capital Check In CLI for tenant onboarding and operations")
20
+ .version("1.1.0");
21
+ program
22
+ .command("login")
23
+ .description("Authenticate and store the API token")
24
+ .option("--email <email>", "Account email")
25
+ .option("--password <password>", "Account password")
26
+ .option("--token <token>", "Store an existing bearer token")
27
+ .option("--base-url <url>", "API origin (default: production, or CCI_API_URL)")
28
+ .action((options) => __awaiter(this, void 0, void 0, function* () {
29
+ yield run(io, () => (0, session_1.login)({
30
+ email: options.email,
31
+ password: options.password,
32
+ token: options.token,
33
+ baseUrl: options.baseUrl,
34
+ promptPassword: io.promptPassword,
35
+ }));
36
+ }));
37
+ program
38
+ .command("logout")
39
+ .description("Remove the stored token and active tenant")
40
+ .action(() => __awaiter(this, void 0, void 0, function* () {
41
+ yield run(io, () => __awaiter(this, void 0, void 0, function* () { return (0, session_1.logout)(); }));
42
+ }));
43
+ program
44
+ .command("whoami")
45
+ .description("Show the authenticated user")
46
+ .action(() => __awaiter(this, void 0, void 0, function* () {
47
+ yield run(io, () => (0, session_1.whoami)());
48
+ }));
49
+ const tenants = program
50
+ .command("tenants")
51
+ .description("Onboard and operate tenants");
52
+ tenants
53
+ .command("list")
54
+ .description("List tenants available to the current account")
55
+ .action(() => __awaiter(this, void 0, void 0, function* () {
56
+ yield run(io, () => (0, session_1.listTenants)());
57
+ }));
58
+ tenants
59
+ .command("use")
60
+ .description("Select the active tenant for later commands")
61
+ .argument("<id>", "Tenant id")
62
+ .action((id) => __awaiter(this, void 0, void 0, function* () {
63
+ yield run(io, () => (0, session_1.useTenant)(id));
64
+ }));
65
+ tenants
66
+ .command("create")
67
+ .description("Create a tenant and make it active")
68
+ .requiredOption("--name <name>", "Tenant name")
69
+ .option("--description <description>", "Optional description")
70
+ .action((options) => __awaiter(this, void 0, void 0, function* () {
71
+ yield run(io, () => (0, session_1.createTenant)(options));
72
+ }));
73
+ tenants
74
+ .command("show")
75
+ .description("Show the active tenant, or a tenant id")
76
+ .argument("[id]", "Tenant id")
77
+ .action((id) => __awaiter(this, void 0, void 0, function* () {
78
+ yield run(io, () => (0, session_1.showTenant)(id));
79
+ }));
80
+ const collaborators = program
81
+ .command("collaborators")
82
+ .description("Operate collaborators in the active tenant");
83
+ collaborators
84
+ .command("list")
85
+ .description("List collaborators in the active tenant")
86
+ .option("--page <page>", "Page number", "1")
87
+ .action((options) => __awaiter(this, void 0, void 0, function* () {
88
+ var _a;
89
+ const page = Number((_a = options.page) !== null && _a !== void 0 ? _a : "1");
90
+ yield run(io, () => (0, session_1.listCollaborators)(Number.isInteger(page) && page > 0 ? page : 1));
91
+ }));
92
+ return program;
93
+ }
94
+ function run(io, action) {
95
+ return __awaiter(this, void 0, void 0, function* () {
96
+ try {
97
+ io.log(yield action());
98
+ }
99
+ catch (error) {
100
+ io.error(error instanceof Error ? error.message : String(error));
101
+ process.exitCode = 1;
102
+ }
103
+ });
104
+ }
105
+ //# sourceMappingURL=program.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"program.js","sourceRoot":"","sources":["../src/program.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,187 @@
1
+ "use strict";
2
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
3
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
4
+ return new (P || (P = Promise))(function (resolve, reject) {
5
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
6
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
7
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
8
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
9
+ });
10
+ };
11
+ Object.defineProperty(exports, "__esModule", { value: true });
12
+ exports.login = login;
13
+ exports.logout = logout;
14
+ exports.whoami = whoami;
15
+ exports.listTenants = listTenants;
16
+ exports.useTenant = useTenant;
17
+ exports.createTenant = createTenant;
18
+ exports.showTenant = showTenant;
19
+ exports.listCollaborators = listCollaborators;
20
+ const api_1 = require("./api");
21
+ const config_1 = require("./config");
22
+ const format_1 = require("./format");
23
+ function login(input) {
24
+ return __awaiter(this, void 0, void 0, function* () {
25
+ var _a, _b, _c;
26
+ const baseUrl = ((_a = input.baseUrl) !== null && _a !== void 0 ? _a : (0, config_1.loadConfig)().baseUrl).replace(/\/$/, "");
27
+ if (input.token) {
28
+ (0, config_1.updateConfig)({ baseUrl, token: input.token });
29
+ return "Session saved.";
30
+ }
31
+ if (!input.email) {
32
+ throw new Error("Email is required. Pass --email or store an existing token with --token.");
33
+ }
34
+ const password = (_b = input.password) !== null && _b !== void 0 ? _b : (yield ((_c = input.promptPassword) === null || _c === void 0 ? void 0 : _c.call(input)));
35
+ if (!password) {
36
+ throw new Error("Password is required.");
37
+ }
38
+ const payload = yield (0, api_1.apiRequest)({ baseUrl }, "/auth/login", {
39
+ method: "POST",
40
+ companyId: null,
41
+ body: {
42
+ email: input.email,
43
+ password,
44
+ },
45
+ });
46
+ const record = asRecord(payload);
47
+ if (typeof record.mfa_challenge_token === "string") {
48
+ throw new Error("This account requires MFA. Finish it in the app, then run: cci login --token <access_token>");
49
+ }
50
+ const token = record.access_token;
51
+ if (typeof token !== "string" || token === "") {
52
+ throw new Error("Login response did not include an access token.");
53
+ }
54
+ (0, config_1.updateConfig)({ baseUrl, token });
55
+ return "Logged in.";
56
+ });
57
+ }
58
+ function logout() {
59
+ (0, config_1.updateConfig)({ token: null, companyId: null });
60
+ return "Logged out.";
61
+ }
62
+ function whoami() {
63
+ return __awaiter(this, void 0, void 0, function* () {
64
+ const config = requireAuth();
65
+ const user = asRecord((0, api_1.unwrapData)(yield (0, api_1.apiRequest)(config, "/auth/user", { companyId: null })));
66
+ const lines = [
67
+ `id: ${stringValue(user.id)}`,
68
+ `email: ${stringValue(user.email)}`,
69
+ `name: ${(0, format_1.displayUserName)(user)}`,
70
+ ];
71
+ if (config.companyId) {
72
+ lines.push(`company: ${config.companyId}`);
73
+ }
74
+ return lines.join("\n");
75
+ });
76
+ }
77
+ function listTenants() {
78
+ return __awaiter(this, void 0, void 0, function* () {
79
+ const config = requireAuth();
80
+ const companies = yield fetchCompanies(config);
81
+ if (companies.length === 0) {
82
+ return "No tenants.";
83
+ }
84
+ return (0, format_1.formatTable)(["", "id", "name", "blocked"], companies.map((company) => {
85
+ var _a;
86
+ return [
87
+ company.id === config.companyId ? "*" : "",
88
+ stringValue(company.id),
89
+ stringValue(company.name),
90
+ String((_a = company.blocked) !== null && _a !== void 0 ? _a : ""),
91
+ ];
92
+ }));
93
+ });
94
+ }
95
+ function useTenant(id) {
96
+ return __awaiter(this, void 0, void 0, function* () {
97
+ const config = requireAuth();
98
+ const companies = yield fetchCompanies(config);
99
+ const match = companies.find((company) => company.id === id);
100
+ if (!match) {
101
+ throw new Error(`Tenant ${id} is not available for this account.`);
102
+ }
103
+ (0, config_1.updateConfig)({ companyId: id });
104
+ return `Active tenant: ${stringValue(match.name) || id} (${id})`;
105
+ });
106
+ }
107
+ function createTenant(input) {
108
+ return __awaiter(this, void 0, void 0, function* () {
109
+ var _a, _b;
110
+ const name = (_b = (_a = input.name) === null || _a === void 0 ? void 0 : _a.trim()) !== null && _b !== void 0 ? _b : "";
111
+ if (name === "") {
112
+ throw new Error("Tenant name is required. Pass --name.");
113
+ }
114
+ const config = requireAuth();
115
+ const created = asRecord((0, api_1.unwrapData)(yield (0, api_1.apiRequest)(config, "/v1/companies", {
116
+ method: "POST",
117
+ companyId: null,
118
+ body: Object.assign({ name }, (input.description ? { description: input.description } : {})),
119
+ })));
120
+ const id = stringValue(created.id);
121
+ if (id !== "") {
122
+ (0, config_1.updateConfig)({ companyId: id });
123
+ }
124
+ return `Tenant created: ${stringValue(created.name) || name} (${id || "unknown"}). It is now the active tenant.`;
125
+ });
126
+ }
127
+ function showTenant(id) {
128
+ return __awaiter(this, void 0, void 0, function* () {
129
+ var _a;
130
+ const config = requireAuth();
131
+ const companyId = id || config.companyId;
132
+ if (!companyId) {
133
+ throw new Error("No active tenant. Run: cci tenants use <id>");
134
+ }
135
+ const company = asRecord((0, api_1.unwrapData)(yield (0, api_1.apiRequest)(config, `/v1/companies/${encodeURIComponent(companyId)}`, { companyId: null })));
136
+ return [
137
+ `id: ${stringValue(company.id)}`,
138
+ `name: ${stringValue(company.name)}`,
139
+ `blocked: ${String((_a = company.blocked) !== null && _a !== void 0 ? _a : "")}`,
140
+ `timezone: ${stringValue(company.timezone)}`,
141
+ ].join("\n");
142
+ });
143
+ }
144
+ function listCollaborators() {
145
+ return __awaiter(this, arguments, void 0, function* (page = 1) {
146
+ const config = requireCompany();
147
+ const payload = yield (0, api_1.apiRequest)(config, `/v1/collaborators?page=${page}`);
148
+ const collaborators = (0, api_1.unwrapList)(payload);
149
+ if (collaborators.length === 0) {
150
+ return "No collaborators.";
151
+ }
152
+ return (0, format_1.formatTable)(["id", "name", "status"], collaborators.map((row) => [
153
+ stringValue(row.id),
154
+ (0, format_1.displayCollaboratorName)(row),
155
+ stringValue(row.status),
156
+ ]));
157
+ });
158
+ }
159
+ function fetchCompanies(config) {
160
+ return __awaiter(this, void 0, void 0, function* () {
161
+ return (0, api_1.unwrapList)(yield (0, api_1.apiRequest)(config, "/auth/companies", { companyId: null }));
162
+ });
163
+ }
164
+ function requireAuth() {
165
+ const config = (0, config_1.loadConfig)();
166
+ if (!config.token) {
167
+ throw new Error("Not logged in. Run: cci login --email <email>");
168
+ }
169
+ return config;
170
+ }
171
+ function requireCompany() {
172
+ const config = requireAuth();
173
+ if (!config.companyId) {
174
+ throw new Error("No active tenant. Run: cci tenants use <id>");
175
+ }
176
+ return config;
177
+ }
178
+ function asRecord(value) {
179
+ if (!value || typeof value !== "object" || Array.isArray(value)) {
180
+ return {};
181
+ }
182
+ return value;
183
+ }
184
+ function stringValue(value) {
185
+ return typeof value === "string" ? value : "";
186
+ }
187
+ //# sourceMappingURL=session.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"session.js","sourceRoot":"","sources":["../src/session.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,76 @@
1
+ # Onboarding de integradores
2
+
3
+ Guía para operar un tenant de Capital Check In desde `@capitalcheckin/cli` sin entrar a producción con datos reales.
4
+
5
+ ## Sandbox
6
+
7
+ El ambiente de prueba es **staging demo**:
8
+
9
+ - API: `https://demo.capitalcheckin.app`
10
+ - Nunca uses estas cuentas en `https://api.capitalcheckin.app`.
11
+
12
+ Los tenants demo ya tienen datos representativos (colaboradores, sucursales o geocercas, asistencia). Se refrescan en staging; no hace falta sembrarlos desde el CLI.
13
+
14
+ | Vertical | Email | Password |
15
+ | --- | --- | --- |
16
+ | Manufactura | `demo-manufactura@capitalcheckin.app` | `demo_manufactura` |
17
+ | Retail | `demo-retail@capitalcheckin.app` | `demo_retail` |
18
+ | Servicios | `demo-servicios@capitalcheckin.app` | `demo_servicios` |
19
+
20
+ ## Primer uso
21
+
22
+ ```bash
23
+ npm install --save @capitalcheckin/cli
24
+
25
+ cci login \
26
+ --base-url https://demo.capitalcheckin.app \
27
+ --email demo-retail@capitalcheckin.app
28
+ cci whoami
29
+ cci tenants list
30
+ cci tenants use <id>
31
+ cci collaborators list
32
+ ```
33
+
34
+ El token queda en `~/.cci/config.json` con permisos `0600`. La contraseña no se guarda.
35
+
36
+ Si la cuenta tiene MFA, el login con email se detiene. Completa el reto en la app y guarda el bearer:
37
+
38
+ ```bash
39
+ cci login --base-url https://demo.capitalcheckin.app --token <access_token>
40
+ ```
41
+
42
+ ## Comandos clave
43
+
44
+ | Comando | Para qué |
45
+ | --- | --- |
46
+ | `cci login` | Abre sesión contra el API (`POST /auth/login`) o guarda un token |
47
+ | `cci whoami` | Muestra el usuario autenticado (`GET /auth/user`) |
48
+ | `cci tenants list` | Lista los tenants de la cuenta (`GET /auth/companies`) |
49
+ | `cci tenants use <id>` | Fija el tenant activo. Los comandos de tenant envían `X-Company-Id` |
50
+ | `cci tenants create --name "..."` | Alta de tenant (`POST /v1/companies`) y lo deja activo |
51
+ | `cci tenants show [id]` | Detalle del tenant activo o de un id |
52
+ | `cci collaborators list` | Colaboradores del tenant activo (`GET /v1/collaborators`) |
53
+ | `cci logout` | Borra token y tenant activo |
54
+
55
+ `cci tenants list` marca con `*` el tenant activo.
56
+
57
+ ## Tenant nuevo
58
+
59
+ En un ambiente que permita el alta (no el lockdown comercial de staging):
60
+
61
+ ```bash
62
+ cci login --email you@company.com
63
+ cci tenants create --name "Sandbox Norte" --description "Integración de prueba"
64
+ cci collaborators list
65
+ ```
66
+
67
+ Staging demo rechaza compañías que no sean los tenants `demo_*`. Para probar datos ya sembrados, usa `tenants list` y `tenants use` con las cuentas de la tabla.
68
+
69
+ ## Variables
70
+
71
+ | Variable | Efecto |
72
+ | --- | --- |
73
+ | `CCI_API_URL` | Origen del API. Pisa el valor guardado |
74
+ | `CCI_TOKEN` | Bearer. Pisa el token del archivo |
75
+ | `CCI_COMPANY_ID` | Tenant activo. Pisa el archivo |
76
+ | `CCI_CONFIG_PATH` | Ruta del archivo de sesión |
package/package.json CHANGED
@@ -1,6 +1,52 @@
1
1
  {
2
2
  "name": "@capitalcheckin/cli",
3
- "version": "0.0.0-stage",
4
- "stub": true,
5
- "description": "Temporary package placeholder for staged publishing"
3
+ "version": "1.1.0",
4
+ "description": "Capital Check In CLI for tenant onboarding and operations",
5
+ "main": "dist/index.js",
6
+ "bin": {
7
+ "cci": "dist/index.js"
8
+ },
9
+ "files": [
10
+ "dist",
11
+ "docs",
12
+ "README.md"
13
+ ],
14
+ "publishConfig": {
15
+ "access": "public"
16
+ },
17
+ "repository": {
18
+ "type": "git",
19
+ "url": "git+https://github.com/Capital-Check-In/cli.git"
20
+ },
21
+ "keywords": [
22
+ "capitalcheckin",
23
+ "cli"
24
+ ],
25
+ "author": "Ivan Sotelo <ivansotelo@capitalcheckin.app>",
26
+ "license": "ISC",
27
+ "bugs": {
28
+ "url": "https://github.com/Capital-Check-In/cli/issues"
29
+ },
30
+ "homepage": "https://github.com/Capital-Check-In/cli#readme",
31
+ "dependencies": {
32
+ "@inquirer/prompts": "^5.3.8",
33
+ "chalk": "4.1.2",
34
+ "commander": "^12.1.0",
35
+ "figlet": "^1.7.0",
36
+ "ora": "^8.0.1"
37
+ },
38
+ "engines": {
39
+ "node": ">=18"
40
+ },
41
+ "devDependencies": {
42
+ "@commander-js/extra-typings": "^12.1.0",
43
+ "@types/node": "^22.4.0",
44
+ "ts-node": "^10.9.2",
45
+ "typescript": "^5.5.4"
46
+ },
47
+ "scripts": {
48
+ "build": "tsc",
49
+ "dev": "ts-node -T src/index.ts",
50
+ "test": "node --require ts-node/register --test tests/*.test.ts"
51
+ }
6
52
  }