@contextium/cli 1.7.1 → 1.8.1

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
@@ -131,28 +131,17 @@ contextium find "api" -w <workspace> # Find files by name/co
131
131
 
132
132
  ### Tags
133
133
 
134
- ```bash
135
- # Tag types (categories)
136
- contextium tags types -w <workspace>
137
- contextium tags create-type -w <workspace> -n "Topic"
138
- contextium tags type-get -w <workspace> --type <typeId>
139
- contextium tags type-update -w <workspace> --type <typeId> --name "Topic"
134
+ Tags are flat and untyped — a tag is just a `#value` (no categories, no `type:value` format). A file is tagged by typing `#value` inside its content; the tag is reconciled when the file is saved.
140
135
 
141
- # Tags
136
+ ```bash
137
+ # Read-only — tags are content-driven, so there are no create/update/delete commands
142
138
  contextium tags list -w <workspace>
143
- contextium tags create -w <workspace> --type <typeId> --value authentication
144
- contextium tags update -w <workspace> --tag <tagId> --value auth
145
-
146
- # Apply / remove
147
- contextium tags apply -w <workspace> --tag topic:authentication --file <fileId>
148
- contextium tags apply-bulk -w <workspace> --tag <tagId> --files <file1,file2>
149
- contextium tags remove -w <workspace> --tag <tagId> --file <fileId>
150
-
151
- # Search by tags
152
- contextium tags search -w <workspace> --tags topic:authentication
139
+ contextium tags search -w <workspace> --tags authentication
153
140
  contextium tags file-tags -w <workspace> --file <fileId>
154
141
  ```
155
142
 
143
+ To tag a file, author the tag inline — add a `#authentication` token to the file's content (e.g. `contextium edit-file <id> --content "… #authentication"`); the tag is created on save. To untag, remove the token. There are no `tags create`, `tags update`, or `tags delete` commands, and `tags apply`/`apply-bulk`/`remove` are deprecated — tagging is entirely inline.
144
+
156
145
  ### Agents and Skills
157
146
 
158
147
  ```bash
@@ -230,18 +219,12 @@ contextium workflow "Onboarding" -w acme-corp
230
219
  ### Organise docs with tags
231
220
 
232
221
  ```bash
233
- # Create a tag type
234
- contextium tags create-type -w my-workspace -n "Topic" --slug topic
235
-
236
- # Create tags
237
- contextium tags create -w my-workspace --type <typeId> --value authentication
238
- contextium tags create -w my-workspace --type <typeId> --value deployment
239
-
240
- # Tag files
241
- contextium tags apply -w my-workspace --tag topic:authentication --file <fileId>
222
+ # Tag a file by adding #authentication inside its content, then save —
223
+ # the tag is created and reconciled from the file content automatically.
224
+ contextium edit-file <fileId> --content "… #authentication"
242
225
 
243
226
  # Find all authentication files
244
- contextium tags search -w my-workspace --tags topic:authentication
227
+ contextium tags search -w my-workspace --tags authentication
245
228
  ```
246
229
 
247
230
  ## Links
@@ -0,0 +1,3 @@
1
+ import { Command } from 'commander';
2
+ export declare const connectorsCommand: Command;
3
+ //# sourceMappingURL=connectors.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"connectors.d.ts","sourceRoot":"","sources":["../../src/commands/connectors.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AAuCnC,eAAO,MAAM,iBAAiB,SAC8D,CAAA"}
@@ -0,0 +1,152 @@
1
+ import { Command } from 'commander';
2
+ import { ApiClient } from '../lib/api-client.js';
3
+ import { loadConfig } from '../lib/config.js';
4
+ import { chalk, ora } from '../lib/output.js';
5
+ /**
6
+ * Access Token Handshake — CLI carrier. Lets a script or terminal session
7
+ * that's already authenticated as a Contextium user reach the platforms
8
+ * allocated to a workflow, brokered through the workflow's alias. No real
9
+ * token is ever seen here — mirrors packages/mcp-server/src/tools/connectors.ts.
10
+ */
11
+ async function resolveWorkspace(client, workspaceName) {
12
+ const { data: workspacesData } = await client.get('/workspaces');
13
+ const workspaces = workspacesData.data || workspacesData;
14
+ const workspace = workspaces.find((w) => w.slug?.toLowerCase().trim() === workspaceName.toLowerCase().trim() ||
15
+ w.name?.toLowerCase().trim() === workspaceName.toLowerCase().trim() ||
16
+ w.id === workspaceName);
17
+ if (!workspace) {
18
+ console.log(chalk.dim('Available workspaces:'));
19
+ workspaces.forEach((w) => console.log(chalk.dim(` - ${w.name} (${w.slug})`)));
20
+ throw new Error(`Workspace '${workspaceName}' not found`);
21
+ }
22
+ return workspace;
23
+ }
24
+ const UUID_RE = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i;
25
+ async function resolveWorkflow(client, workspaceId, workflowRef) {
26
+ if (UUID_RE.test(workflowRef))
27
+ return workflowRef;
28
+ const { data } = await client.get(`/workspaces/${workspaceId}/workflows`);
29
+ const workflows = data.data || data || [];
30
+ const match = workflows.find((w) => w.name?.toLowerCase().trim() === workflowRef.toLowerCase().trim());
31
+ if (!match)
32
+ throw new Error(`Workflow '${workflowRef}' not found in this workspace`);
33
+ return match.id;
34
+ }
35
+ export const connectorsCommand = new Command('connector')
36
+ .description('Use third-party platforms allocated to a workflow (Access Token Handshake)');
37
+ // ── connector list ───────────────────────────────────────────────────────────
38
+ connectorsCommand
39
+ .command('list')
40
+ .description("List the connectors allocated to a workflow")
41
+ .requiredOption('-w, --workspace <workspace>', 'Workspace name, slug, or ID')
42
+ .requiredOption('--workflow <workflow>', 'Workflow name or ID')
43
+ .option('--format <format>', 'Output format (text|json)', 'text')
44
+ .action(async (options) => {
45
+ const spinner = ora('Loading connectors...').start();
46
+ try {
47
+ const config = await loadConfig();
48
+ const client = new ApiClient(config.api_key, config.api_url);
49
+ const workspace = await resolveWorkspace(client, options.workspace);
50
+ const workflowId = await resolveWorkflow(client, workspace.id, options.workflow);
51
+ const { data } = await client.get(`/workspaces/${workspace.id}/workflows/${workflowId}/connectors`);
52
+ const aliases = (data.data || data)?.connectors ?? (data.data || data) ?? [];
53
+ const list = (Array.isArray(aliases) ? aliases : []).map((a) => ({
54
+ connector_id: a.connector?.id ?? a.connectorId,
55
+ name: a.connector?.displayName ?? null,
56
+ platform: a.connector?.platform ?? null,
57
+ status: a.connector?.status ?? null,
58
+ })).filter((c) => c.connector_id);
59
+ spinner.stop();
60
+ if (options.format === 'json') {
61
+ console.log(JSON.stringify(list, null, 2));
62
+ return;
63
+ }
64
+ console.log();
65
+ console.log(chalk.bold(`Connectors on this workflow`));
66
+ console.log();
67
+ if (list.length === 0) {
68
+ console.log(chalk.dim(' None allocated. Allocate one from the Connectors page first.'));
69
+ }
70
+ else {
71
+ for (const c of list) {
72
+ console.log(` ${chalk.cyan(c.name ?? c.platform)} ${chalk.dim(c.platform)} ${c.status === 'active' ? chalk.green(c.status) : chalk.yellow(c.status)}`);
73
+ console.log(` ${chalk.gray('connector_id: ' + c.connector_id)}`);
74
+ console.log();
75
+ }
76
+ }
77
+ }
78
+ catch (error) {
79
+ spinner.fail(`Failed to load connectors: ${error.message}`);
80
+ process.exit(1);
81
+ }
82
+ });
83
+ // ── connector request ────────────────────────────────────────────────────────
84
+ connectorsCommand
85
+ .command('request')
86
+ .description('Broker an HTTP request to a platform through a workflow connector — you never see a real token')
87
+ .requiredOption('-w, --workspace <workspace>', 'Workspace name, slug, or ID')
88
+ .requiredOption('--workflow <workflow>', 'Workflow name or ID')
89
+ .requiredOption('--connector <connectorId>', 'connector_id from "contextium connector list"')
90
+ .requiredOption('--method <method>', 'HTTP method (GET/POST/PUT/PATCH/DELETE)')
91
+ .requiredOption('--path <path>', 'Path relative to the connector base URL, e.g. /user')
92
+ .option('--query <query>', 'Raw query string including the leading "?"')
93
+ .option('--body <json>', 'JSON request body for POST/PUT/PATCH')
94
+ .action(async (options) => {
95
+ const spinner = ora('Brokering request...').start();
96
+ try {
97
+ const config = await loadConfig();
98
+ const client = new ApiClient(config.api_key, config.api_url);
99
+ const workspace = await resolveWorkspace(client, options.workspace);
100
+ const workflowId = await resolveWorkflow(client, workspace.id, options.workflow);
101
+ const method = String(options.method).toUpperCase();
102
+ let path = String(options.path);
103
+ if (!path.startsWith('/'))
104
+ path = '/' + path;
105
+ const url = `/workspaces/${workspace.id}/workflows/${workflowId}/connectors/${options.connector}/broker${path}${options.query || ''}`;
106
+ let body;
107
+ if (options.body) {
108
+ try {
109
+ body = JSON.parse(options.body);
110
+ }
111
+ catch {
112
+ throw new Error('--body must be valid JSON');
113
+ }
114
+ }
115
+ // Bypass ApiClient's throw-on-error / JSON-envelope assumptions here: the
116
+ // broker's response is the raw platform response (may not be JSON), or a
117
+ // {success:false,error:{code,message}} soft-failure — neither fits the
118
+ // normal Contextium API envelope ApiClient expects. validateStatus lets us
119
+ // inspect any status ourselves instead of having it thrown as an Error.
120
+ const axiosConfig = { validateStatus: () => true, responseType: 'text', data: body };
121
+ const res = method === 'GET' ? await client.get(url, axiosConfig)
122
+ : method === 'DELETE' ? await client.delete(url, axiosConfig)
123
+ : method === 'POST' ? await client.post(url, body, axiosConfig)
124
+ : method === 'PUT' ? await client.put(url, body, axiosConfig)
125
+ : method === 'PATCH' ? await client.patch(url, body, axiosConfig)
126
+ : (() => { throw new Error(`Unsupported method: ${method}`); })();
127
+ spinner.stop();
128
+ // Broker-level failure comes back as a Contextium JSON envelope even though
129
+ // platform responses don't — detect and print it distinctly.
130
+ let brokerError;
131
+ if (typeof res.data === 'string') {
132
+ try {
133
+ const parsed = JSON.parse(res.data);
134
+ if (parsed && parsed.success === false && parsed.error)
135
+ brokerError = parsed.error;
136
+ }
137
+ catch { /* not JSON — a real platform response */ }
138
+ }
139
+ if (brokerError) {
140
+ console.log(chalk.red(`\nRequest not completed (${brokerError.code}): ${brokerError.message}`));
141
+ process.exit(1);
142
+ }
143
+ console.log(chalk.bold(`\nHTTP ${res.status}`));
144
+ console.log(res.data || chalk.dim('(empty response body)'));
145
+ console.log();
146
+ }
147
+ catch (error) {
148
+ spinner.fail(`Broker request failed: ${error.message}`);
149
+ process.exit(1);
150
+ }
151
+ });
152
+ //# sourceMappingURL=connectors.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"connectors.js","sourceRoot":"","sources":["../../src/commands/connectors.ts"],"names":[],"mappings":"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"}