@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 +10 -27
- package/dist/commands/connectors.d.ts +3 -0
- package/dist/commands/connectors.d.ts.map +1 -0
- package/dist/commands/connectors.js +152 -0
- package/dist/commands/connectors.js.map +1 -0
- package/dist/commands/tags.js +23 -713
- package/dist/commands/tags.js.map +1 -1
- package/dist/commands/workflow.d.ts.map +1 -1
- package/dist/commands/workflow.js +17 -0
- package/dist/commands/workflow.js.map +1 -1
- package/dist/commands/workflows.js +91 -67
- package/dist/commands/workflows.js.map +1 -1
- package/dist/index.js +3 -1
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
- package/skills/ium/idea.md +3 -5
- package/skills/ium/new-project.md +16 -19
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
|
-
|
|
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
|
-
|
|
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
|
|
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
|
-
#
|
|
234
|
-
|
|
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
|
|
227
|
+
contextium tags search -w my-workspace --tags authentication
|
|
245
228
|
```
|
|
246
229
|
|
|
247
230
|
## Links
|
|
@@ -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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"}
|