@contextium/cli 0.3.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.
Files changed (86) hide show
  1. package/README.md +227 -0
  2. package/dist/commands/cat.d.ts +3 -0
  3. package/dist/commands/cat.d.ts.map +1 -0
  4. package/dist/commands/cat.js +153 -0
  5. package/dist/commands/cat.js.map +1 -0
  6. package/dist/commands/files.d.ts +3 -0
  7. package/dist/commands/files.d.ts.map +1 -0
  8. package/dist/commands/files.js +121 -0
  9. package/dist/commands/files.js.map +1 -0
  10. package/dist/commands/find.d.ts +3 -0
  11. package/dist/commands/find.d.ts.map +1 -0
  12. package/dist/commands/find.js +119 -0
  13. package/dist/commands/find.js.map +1 -0
  14. package/dist/commands/init.d.ts +3 -0
  15. package/dist/commands/init.d.ts.map +1 -0
  16. package/dist/commands/init.js +157 -0
  17. package/dist/commands/init.js.map +1 -0
  18. package/dist/commands/login.d.ts +3 -0
  19. package/dist/commands/login.d.ts.map +1 -0
  20. package/dist/commands/login.js +44 -0
  21. package/dist/commands/login.js.map +1 -0
  22. package/dist/commands/logout.d.ts +3 -0
  23. package/dist/commands/logout.d.ts.map +1 -0
  24. package/dist/commands/logout.js +22 -0
  25. package/dist/commands/logout.js.map +1 -0
  26. package/dist/commands/projects.d.ts +3 -0
  27. package/dist/commands/projects.d.ts.map +1 -0
  28. package/dist/commands/projects.js +64 -0
  29. package/dist/commands/projects.js.map +1 -0
  30. package/dist/commands/search.d.ts +3 -0
  31. package/dist/commands/search.d.ts.map +1 -0
  32. package/dist/commands/search.js +79 -0
  33. package/dist/commands/search.js.map +1 -0
  34. package/dist/commands/setup-claude.d.ts +3 -0
  35. package/dist/commands/setup-claude.d.ts.map +1 -0
  36. package/dist/commands/setup-claude.js +106 -0
  37. package/dist/commands/setup-claude.js.map +1 -0
  38. package/dist/commands/status.d.ts +3 -0
  39. package/dist/commands/status.d.ts.map +1 -0
  40. package/dist/commands/status.js +103 -0
  41. package/dist/commands/status.js.map +1 -0
  42. package/dist/commands/sync.d.ts +3 -0
  43. package/dist/commands/sync.d.ts.map +1 -0
  44. package/dist/commands/sync.js +118 -0
  45. package/dist/commands/sync.js.map +1 -0
  46. package/dist/commands/tags.d.ts +3 -0
  47. package/dist/commands/tags.d.ts.map +1 -0
  48. package/dist/commands/tags.js +312 -0
  49. package/dist/commands/tags.js.map +1 -0
  50. package/dist/commands/whoami.d.ts +3 -0
  51. package/dist/commands/whoami.d.ts.map +1 -0
  52. package/dist/commands/whoami.js +35 -0
  53. package/dist/commands/whoami.js.map +1 -0
  54. package/dist/commands/workspaces.d.ts +3 -0
  55. package/dist/commands/workspaces.d.ts.map +1 -0
  56. package/dist/commands/workspaces.js +48 -0
  57. package/dist/commands/workspaces.js.map +1 -0
  58. package/dist/index.d.ts +3 -0
  59. package/dist/index.d.ts.map +1 -0
  60. package/dist/index.js +56 -0
  61. package/dist/index.js.map +1 -0
  62. package/dist/lib/api-client.d.ts +11 -0
  63. package/dist/lib/api-client.d.ts.map +1 -0
  64. package/dist/lib/api-client.js +61 -0
  65. package/dist/lib/api-client.js.map +1 -0
  66. package/dist/lib/cache.d.ts +20 -0
  67. package/dist/lib/cache.d.ts.map +1 -0
  68. package/dist/lib/cache.js +79 -0
  69. package/dist/lib/cache.js.map +1 -0
  70. package/dist/lib/config.d.ts +4 -0
  71. package/dist/lib/config.d.ts.map +1 -0
  72. package/dist/lib/config.js +40 -0
  73. package/dist/lib/config.js.map +1 -0
  74. package/dist/lib/msal.d.ts +25 -0
  75. package/dist/lib/msal.d.ts.map +1 -0
  76. package/dist/lib/msal.js +150 -0
  77. package/dist/lib/msal.js.map +1 -0
  78. package/dist/lib/output.d.ts +40 -0
  79. package/dist/lib/output.d.ts.map +1 -0
  80. package/dist/lib/output.js +70 -0
  81. package/dist/lib/output.js.map +1 -0
  82. package/dist/types/index.d.ts +58 -0
  83. package/dist/types/index.d.ts.map +1 -0
  84. package/dist/types/index.js +2 -0
  85. package/dist/types/index.js.map +1 -0
  86. package/package.json +58 -0
@@ -0,0 +1,103 @@
1
+ import { Command } from 'commander';
2
+ import { ApiClient } from '../lib/api-client.js';
3
+ import { loadConfig } from '../lib/config.js';
4
+ import { Cache } from '../lib/cache.js';
5
+ import { chalk, ora } from '../lib/output.js';
6
+ export const statusCommand = new Command('status')
7
+ .description('Check sync status of files')
8
+ .option('--workspace <slug>', 'Specify workspace')
9
+ .action(async (options) => {
10
+ const spinner = ora('Checking status...').start();
11
+ try {
12
+ const config = await loadConfig();
13
+ const client = new ApiClient(config.api_key, config.api_url);
14
+ const cache = new Cache(config.cache);
15
+ // Resolve workspace
16
+ let workspaceId;
17
+ let workspaceSlug;
18
+ if (options.workspace) {
19
+ const { data: workspacesData } = await client.get('/workspaces');
20
+ const workspaces = workspacesData.data || workspacesData;
21
+ const workspace = workspaces.find((w) => w.slug === options.workspace);
22
+ if (!workspace) {
23
+ spinner.fail(`Workspace '${options.workspace}' not found`);
24
+ process.exit(1);
25
+ }
26
+ workspaceId = workspace.id;
27
+ workspaceSlug = workspace.slug;
28
+ }
29
+ else if (config.workspace_id && config.workspace) {
30
+ workspaceId = config.workspace_id;
31
+ workspaceSlug = config.workspace;
32
+ }
33
+ else {
34
+ spinner.fail('Workspace required');
35
+ console.log();
36
+ console.log(chalk.dim('Set a default workspace with:'));
37
+ console.log(chalk.white(' contextium init --api-key YOUR_KEY --workspace <slug>'));
38
+ console.log();
39
+ console.log(chalk.dim('Or specify one with:'));
40
+ console.log(chalk.white(' contextium status --workspace <slug>'));
41
+ process.exit(1);
42
+ }
43
+ // Get all projects in workspace
44
+ const { data: projectsData } = await client.get(`/workspaces/${workspaceId}/projects`);
45
+ const projects = projectsData.data || projectsData;
46
+ // Get files from all projects (in parallel)
47
+ const projectFilesPromises = projects.map(async (project) => {
48
+ const { data } = await client.get(`/projects/${project.id}/files`);
49
+ const files = data.data || data;
50
+ return { project, files };
51
+ });
52
+ const projectsWithFiles = await Promise.all(projectFilesPromises);
53
+ const remoteFiles = projectsWithFiles.flatMap(p => p.files);
54
+ spinner.stop();
55
+ console.log(chalk.bold(`\nWorkspace: ${workspaceSlug}`));
56
+ console.log(chalk.dim(`Projects: ${projects.length}\n`));
57
+ // List projects with file counts
58
+ console.log(chalk.bold('Projects:'));
59
+ for (const { project, files } of projectsWithFiles) {
60
+ console.log(chalk.cyan(` ${project.name}`), chalk.dim(`(${files.length} file${files.length !== 1 ? 's' : ''})`));
61
+ }
62
+ console.log();
63
+ if (remoteFiles.length === 0) {
64
+ console.log(chalk.yellow('No files in workspace'));
65
+ return;
66
+ }
67
+ console.log(chalk.bold('Files:'));
68
+ for (const remote of remoteFiles) {
69
+ const cached = await cache.get(remote.title);
70
+ if (!cached) {
71
+ console.log(chalk.yellow('?'), chalk.white(remote.title), chalk.dim('(not cached)'));
72
+ }
73
+ else if (cached.currentVersion < remote.currentVersion) {
74
+ const behind = remote.currentVersion - cached.currentVersion;
75
+ console.log(chalk.blue('↓'), chalk.white(remote.title), chalk.dim(`v${cached.currentVersion}`), chalk.yellow(`(v${remote.currentVersion} available, ${behind} versions behind)`));
76
+ }
77
+ else {
78
+ console.log(chalk.green('✓'), chalk.white(remote.title), chalk.dim(`v${remote.currentVersion} (up to date)`));
79
+ }
80
+ }
81
+ // Summary
82
+ const notCached = remoteFiles.filter((f) => !cache.getSync(f.title)).length;
83
+ const needsUpdate = remoteFiles.filter((f) => {
84
+ const cached = cache.getSync(f.title);
85
+ return cached && cached.currentVersion < f.currentVersion;
86
+ }).length;
87
+ console.log();
88
+ if (needsUpdate > 0) {
89
+ console.log(chalk.yellow(`${needsUpdate} file(s) need update - run 'contexthub sync'`));
90
+ }
91
+ if (notCached > 0) {
92
+ console.log(chalk.gray(`${notCached} file(s) not cached - run 'contexthub sync'`));
93
+ }
94
+ if (needsUpdate === 0 && notCached === 0) {
95
+ console.log(chalk.green('All files up to date'));
96
+ }
97
+ }
98
+ catch (error) {
99
+ spinner.fail(`Status check failed: ${error.message}`);
100
+ process.exit(1);
101
+ }
102
+ });
103
+ //# sourceMappingURL=status.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"status.js","sourceRoot":"","sources":["../../src/commands/status.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import { Command } from 'commander';
2
+ export declare const syncCommand: Command;
3
+ //# sourceMappingURL=sync.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sync.d.ts","sourceRoot":"","sources":["../../src/commands/sync.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AAOnC,eAAO,MAAM,WAAW,SA2IpB,CAAA"}
@@ -0,0 +1,118 @@
1
+ import { Command } from 'commander';
2
+ import { ApiClient } from '../lib/api-client.js';
3
+ import { loadConfig } from '../lib/config.js';
4
+ import { Cache } from '../lib/cache.js';
5
+ import { chalk, ora } from '../lib/output.js';
6
+ export const syncCommand = new Command('sync')
7
+ .description('Sync workspace files to local cache')
8
+ .argument('[files...]', 'Specific files to sync')
9
+ .option('--workspace <slug>', 'Specify workspace')
10
+ .option('--force', 'Force re-download all files')
11
+ .option('--tag <tags...>', 'Sync only files with these tags')
12
+ .option('--dry-run', 'Show what would be synced')
13
+ .action(async (files, options) => {
14
+ const spinner = ora('Syncing files...').start();
15
+ try {
16
+ const config = await loadConfig();
17
+ const client = new ApiClient(config.api_key, config.api_url);
18
+ const cache = new Cache(config.cache);
19
+ // Resolve workspace
20
+ let workspaceId;
21
+ if (options.workspace) {
22
+ const { data: workspacesData } = await client.get('/workspaces');
23
+ const workspaces = workspacesData.data || workspacesData;
24
+ const workspace = workspaces.find((w) => w.slug === options.workspace);
25
+ if (!workspace) {
26
+ spinner.fail(`Workspace '${options.workspace}' not found`);
27
+ process.exit(1);
28
+ }
29
+ workspaceId = workspace.id;
30
+ }
31
+ else if (config.workspace_id) {
32
+ workspaceId = config.workspace_id;
33
+ }
34
+ else {
35
+ spinner.fail('Workspace required');
36
+ console.log();
37
+ console.log(chalk.dim('Set a default workspace with:'));
38
+ console.log(chalk.white(' contextium init --api-key YOUR_KEY --workspace <slug>'));
39
+ console.log();
40
+ console.log(chalk.dim('Or specify one with:'));
41
+ console.log(chalk.white(' contextium sync --workspace <slug>'));
42
+ process.exit(1);
43
+ }
44
+ // Get all projects in workspace
45
+ const { data: projectsData } = await client.get(`/workspaces/${workspaceId}/projects`);
46
+ const projects = projectsData.data || projectsData;
47
+ // Determine which files to sync
48
+ let filesToSync = [];
49
+ if (files.length > 0) {
50
+ // Sync specific files
51
+ for (const fileName of files) {
52
+ let found = false;
53
+ for (const project of projects) {
54
+ const { data } = await client.get(`/projects/${project.id}/files`, { params: { search: fileName } });
55
+ const file = data.find((f) => f.title === fileName || f.path === fileName);
56
+ if (file) {
57
+ filesToSync.push(file);
58
+ found = true;
59
+ break;
60
+ }
61
+ }
62
+ if (!found) {
63
+ spinner.warn(`File not found: ${fileName}`);
64
+ }
65
+ }
66
+ }
67
+ else {
68
+ // Sync all files from all projects
69
+ const params = {};
70
+ if (options.tag && options.tag.length > 0) {
71
+ params.tags = options.tag.join(',');
72
+ }
73
+ else if (config.files.auto_include_tags && config.files.tags.length > 0) {
74
+ params.tags = config.files.tags.join(',');
75
+ }
76
+ for (const project of projects) {
77
+ const { data } = await client.get(`/projects/${project.id}/files`, { params });
78
+ filesToSync.push(...data);
79
+ }
80
+ }
81
+ if (filesToSync.length === 0) {
82
+ spinner.info('No files to sync');
83
+ return;
84
+ }
85
+ if (options.dryRun) {
86
+ spinner.info('Dry run - would sync:');
87
+ filesToSync.forEach((file) => {
88
+ console.log(chalk.dim(` - ${file.title} (v${file.currentVersion})`));
89
+ });
90
+ return;
91
+ }
92
+ // Sync files
93
+ let downloaded = 0;
94
+ let cached = 0;
95
+ for (const file of filesToSync) {
96
+ // Check if cached and current
97
+ if (!options.force) {
98
+ const cachedFile = await cache.get(file.title);
99
+ if (cachedFile && cachedFile.currentVersion === file.currentVersion) {
100
+ cached++;
101
+ continue;
102
+ }
103
+ }
104
+ // Download full content
105
+ const { data: fileData } = await client.get(`/files/${file.id}`);
106
+ // Save to cache
107
+ await cache.set(file.title, fileData);
108
+ downloaded++;
109
+ spinner.setText = `Syncing... (${downloaded + cached}/${filesToSync.length})`;
110
+ }
111
+ spinner.succeed(`Synced ${filesToSync.length} files (${downloaded} downloaded, ${cached} cached)`);
112
+ }
113
+ catch (error) {
114
+ spinner.fail(`Sync failed: ${error.message}`);
115
+ process.exit(1);
116
+ }
117
+ });
118
+ //# sourceMappingURL=sync.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sync.js","sourceRoot":"","sources":["../../src/commands/sync.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import { Command } from 'commander';
2
+ export declare const tagsCommand: Command;
3
+ //# sourceMappingURL=tags.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tags.d.ts","sourceRoot":"","sources":["../../src/commands/tags.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAKpC,eAAO,MAAM,WAAW,SACmB,CAAC"}
@@ -0,0 +1,312 @@
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
+ export const tagsCommand = new Command('tags')
6
+ .description('Manage tags and tag types');
7
+ // List tag types
8
+ tagsCommand
9
+ .command('types')
10
+ .description('List tag types in a workspace')
11
+ .option('-w, --workspace <id>', 'Workspace ID (uses workspace from .contextiumrc if not provided)')
12
+ .action(async (options) => {
13
+ const spinner = ora('Loading tag types...').start();
14
+ try {
15
+ const config = await loadConfig();
16
+ const client = new ApiClient(config.api_key, config.api_url);
17
+ // Get workspace ID from config if not provided
18
+ const workspaceId = options.workspace;
19
+ if (!workspaceId) {
20
+ spinner.fail('Error: Workspace ID is required. Use -w flag.');
21
+ process.exit(1);
22
+ }
23
+ const response = await client.get(`/workspaces/${workspaceId}/tag-types`);
24
+ const tagTypesData = response.data;
25
+ const tagTypes = tagTypesData.data || tagTypesData || [];
26
+ if (tagTypes.length === 0) {
27
+ spinner.stop();
28
+ console.log(chalk.yellow('No tag types found.'));
29
+ return;
30
+ }
31
+ spinner.stop();
32
+ console.log(chalk.bold(`\n${tagTypes.length} tag type(s):\n`));
33
+ tagTypes.forEach((type) => {
34
+ console.log(chalk.cyan(`${type.name} (${type.slug})`));
35
+ console.log(` ID: ${type.id}`);
36
+ console.log(` Color: ${type.color}`);
37
+ if (type.icon)
38
+ console.log(` Icon: ${type.icon}`);
39
+ if (type.description)
40
+ console.log(` Description: ${type.description}`);
41
+ console.log(` System: ${type.isSystem ? 'Yes' : 'No'}`);
42
+ console.log(` Display Order: ${type.displayOrder}`);
43
+ if (type.tagCount !== undefined)
44
+ console.log(` Tag Count: ${type.tagCount}`);
45
+ console.log('');
46
+ });
47
+ }
48
+ catch (error) {
49
+ spinner.fail(`Failed to load tag types: ${error.message}`);
50
+ process.exit(1);
51
+ }
52
+ });
53
+ // Create tag type
54
+ tagsCommand
55
+ .command('create-type')
56
+ .description('Create a new tag type')
57
+ .requiredOption('-w, --workspace <id>', 'Workspace ID')
58
+ .requiredOption('-n, --name <name>', 'Type name')
59
+ .requiredOption('-s, --slug <slug>', 'Type slug (lowercase, hyphen-separated)')
60
+ .option('-c, --color <hex>', 'Hex color code')
61
+ .option('-i, --icon <icon>', 'Icon name')
62
+ .option('-d, --description <text>', 'Description')
63
+ .action(async (options) => {
64
+ const spinner = ora('Creating tag type...').start();
65
+ try {
66
+ const config = await loadConfig();
67
+ const client = new ApiClient(config.api_key, config.api_url);
68
+ // Validate slug format
69
+ if (!/^[a-z0-9-]+$/.test(options.slug)) {
70
+ spinner.fail('Error: Slug must contain only lowercase letters, numbers, and hyphens');
71
+ process.exit(1);
72
+ }
73
+ const data = {
74
+ name: options.name,
75
+ slug: options.slug,
76
+ };
77
+ if (options.color)
78
+ data.color = options.color;
79
+ if (options.icon)
80
+ data.icon = options.icon;
81
+ if (options.description)
82
+ data.description = options.description;
83
+ const response = await client.post(`/workspaces/${options.workspace}/tag-types`, data);
84
+ const tagTypeData = response.data;
85
+ const tagType = tagTypeData.data || tagTypeData;
86
+ spinner.stop();
87
+ console.log(chalk.green('\n✓ Tag type created successfully!'));
88
+ console.log(` ID: ${tagType.id}`);
89
+ console.log(` Name: ${tagType.name}`);
90
+ console.log(` Slug: ${tagType.slug}`);
91
+ console.log(` Color: ${tagType.color}\n`);
92
+ }
93
+ catch (error) {
94
+ spinner.fail(`Failed to create tag type: ${error.message}`);
95
+ process.exit(1);
96
+ }
97
+ });
98
+ // List tags
99
+ tagsCommand
100
+ .command('list')
101
+ .description('List tags in a workspace')
102
+ .option('-w, --workspace <id>', 'Workspace ID')
103
+ .option('-t, --type <typeId>', 'Filter by tag type ID')
104
+ .action(async (options) => {
105
+ const spinner = ora('Loading tags...').start();
106
+ try {
107
+ const config = await loadConfig();
108
+ const client = new ApiClient(config.api_key, config.api_url);
109
+ const workspaceId = options.workspace;
110
+ if (!workspaceId) {
111
+ spinner.fail('Error: Workspace ID is required. Use -w flag.');
112
+ process.exit(1);
113
+ }
114
+ let url = `/workspaces/${workspaceId}/tags`;
115
+ if (options.type) {
116
+ url += `?typeId=${options.type}`;
117
+ }
118
+ const response = await client.get(url);
119
+ const tagsData = response.data;
120
+ const tags = tagsData.data || tagsData || [];
121
+ if (tags.length === 0) {
122
+ spinner.stop();
123
+ console.log(chalk.yellow('No tags found.'));
124
+ return;
125
+ }
126
+ spinner.stop();
127
+ console.log(chalk.bold(`\n${tags.length} tag(s):\n`));
128
+ // Group by type
129
+ const tagsByType = new Map();
130
+ tags.forEach((tag) => {
131
+ const typeName = tag.typeName || 'Unknown';
132
+ if (!tagsByType.has(typeName)) {
133
+ tagsByType.set(typeName, []);
134
+ }
135
+ tagsByType.get(typeName).push(tag);
136
+ });
137
+ tagsByType.forEach((typeTags, typeName) => {
138
+ console.log(chalk.cyan(typeName + ':'));
139
+ typeTags.forEach((tag) => {
140
+ console.log(` ${tag.typeSlug}:${tag.value}`);
141
+ console.log(` ID: ${tag.id}`);
142
+ console.log(` Color: ${tag.color}`);
143
+ if (tag.usageCount !== undefined)
144
+ console.log(` Usage: ${tag.usageCount} files`);
145
+ console.log('');
146
+ });
147
+ });
148
+ }
149
+ catch (error) {
150
+ spinner.fail(`Failed to load tags: ${error.message}`);
151
+ process.exit(1);
152
+ }
153
+ });
154
+ // Create tag
155
+ tagsCommand
156
+ .command('create')
157
+ .description('Create a new tag')
158
+ .requiredOption('-w, --workspace <id>', 'Workspace ID')
159
+ .requiredOption('-t, --type <typeId>', 'Tag type ID')
160
+ .requiredOption('-v, --value <value>', 'Tag value (lowercase, hyphen-separated)')
161
+ .option('-c, --color <hex>', 'Hex color code')
162
+ .action(async (options) => {
163
+ const spinner = ora('Creating tag...').start();
164
+ try {
165
+ const config = await loadConfig();
166
+ const client = new ApiClient(config.api_key, config.api_url);
167
+ // Validate value format
168
+ if (!/^[a-z0-9-]+$/.test(options.value)) {
169
+ spinner.fail('Error: Tag value must contain only lowercase letters, numbers, and hyphens');
170
+ process.exit(1);
171
+ }
172
+ const data = {
173
+ typeId: options.type,
174
+ value: options.value,
175
+ };
176
+ if (options.color)
177
+ data.color = options.color;
178
+ const response = await client.post(`/workspaces/${options.workspace}/tags`, data);
179
+ const tagData = response.data;
180
+ const tag = tagData.data || tagData;
181
+ spinner.stop();
182
+ console.log(chalk.green('\n✓ Tag created successfully!'));
183
+ console.log(` ID: ${tag.id}`);
184
+ console.log(` Tag: ${tag.typeSlug}:${tag.value}`);
185
+ console.log(` Type: ${tag.typeName}`);
186
+ console.log(` Color: ${tag.color}\n`);
187
+ }
188
+ catch (error) {
189
+ spinner.fail(`Failed to create tag: ${error.message}`);
190
+ process.exit(1);
191
+ }
192
+ });
193
+ // Search files by tags
194
+ tagsCommand
195
+ .command('search')
196
+ .description('Search files by tags')
197
+ .requiredOption('-w, --workspace <id>', 'Workspace ID')
198
+ .requiredOption('-t, --tags <tagIds>', 'Comma-separated tag IDs or tag values (e.g., "md" or "file-type:md")')
199
+ .option('-p, --project <projectId>', 'Filter by project ID')
200
+ .action(async (options) => {
201
+ const spinner = ora('Searching files...').start();
202
+ try {
203
+ const config = await loadConfig();
204
+ const client = new ApiClient(config.api_key, config.api_url);
205
+ const workspaceId = options.workspace;
206
+ // Parse tag input - support both IDs and slug:value format
207
+ let tagIds = [];
208
+ const tagInput = options.tags.split(',').map((t) => t.trim());
209
+ // Check if inputs are UUIDs or need to be resolved
210
+ const uuidRegex = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i;
211
+ const needsResolution = tagInput.some((t) => !uuidRegex.test(t));
212
+ if (needsResolution) {
213
+ // Fetch all tags to resolve slug:value to IDs
214
+ const tagsResponse = await client.get(`/workspaces/${workspaceId}/tags`);
215
+ const allTags = tagsResponse.data.data || tagsResponse.data || [];
216
+ for (const input of tagInput) {
217
+ if (uuidRegex.test(input)) {
218
+ tagIds.push(input);
219
+ }
220
+ else {
221
+ // Try to match slug:value or just value
222
+ const [typeSlug, value] = input.includes(':') ? input.split(':') : [null, input];
223
+ const matchingTag = allTags.find((tag) => {
224
+ if (typeSlug) {
225
+ return tag.typeSlug === typeSlug && tag.value === value;
226
+ }
227
+ return tag.value === value;
228
+ });
229
+ if (matchingTag) {
230
+ tagIds.push(matchingTag.id);
231
+ }
232
+ else {
233
+ spinner.fail(`Tag not found: ${input}`);
234
+ process.exit(1);
235
+ }
236
+ }
237
+ }
238
+ }
239
+ else {
240
+ tagIds = tagInput;
241
+ }
242
+ // Search files by tag IDs
243
+ let url = `/workspaces/${workspaceId}/tags/search?tagIds=${tagIds.join(',')}`;
244
+ if (options.project) {
245
+ url += `&projectId=${options.project}`;
246
+ }
247
+ const searchResponse = await client.get(url);
248
+ const searchData = searchResponse.data;
249
+ const fileIds = searchData.data?.fileIds || searchData.fileIds || [];
250
+ if (fileIds.length === 0) {
251
+ spinner.stop();
252
+ console.log(chalk.yellow('No files found with the specified tags.'));
253
+ return;
254
+ }
255
+ // Fetch file details for each file ID with error handling
256
+ const files = [];
257
+ const errors = [];
258
+ for (const fileId of fileIds) {
259
+ try {
260
+ const fileResponse = await client.get(`/files/${fileId}`, {
261
+ params: { workspaceId }
262
+ });
263
+ const file = fileResponse.data.data || fileResponse.data;
264
+ if (file) {
265
+ files.push(file);
266
+ }
267
+ }
268
+ catch (error) {
269
+ errors.push({ fileId, error: error.message });
270
+ }
271
+ }
272
+ spinner.stop();
273
+ if (files.length === 0) {
274
+ console.log(chalk.yellow('No files could be retrieved.'));
275
+ if (errors.length > 0) {
276
+ console.log(chalk.red(`\nErrors encountered:`));
277
+ errors.forEach(({ fileId, error }) => {
278
+ console.log(chalk.dim(` ${fileId}: ${error}`));
279
+ });
280
+ }
281
+ return;
282
+ }
283
+ console.log(chalk.bold(`\n${files.length} file(s) found:\n`));
284
+ // Group by project
285
+ const filesByProject = new Map();
286
+ files.forEach((file) => {
287
+ const projectName = file.project?.name || 'No project';
288
+ if (!filesByProject.has(projectName)) {
289
+ filesByProject.set(projectName, []);
290
+ }
291
+ filesByProject.get(projectName).push(file);
292
+ });
293
+ filesByProject.forEach((projectFiles, projectName) => {
294
+ console.log(chalk.cyan(`${projectName}:`));
295
+ projectFiles.forEach((file) => {
296
+ const sizeKB = file.fileSize ? (file.fileSize / 1024).toFixed(2) : '0';
297
+ console.log(` - ${chalk.white(file.title)}`);
298
+ console.log(` Path: ${chalk.dim(file.path || 'N/A')}`);
299
+ console.log(` Size: ${chalk.dim(sizeKB + ' KB')}`);
300
+ console.log('');
301
+ });
302
+ });
303
+ if (errors.length > 0) {
304
+ console.log(chalk.yellow(`\n${errors.length} file(s) could not be retrieved.`));
305
+ }
306
+ }
307
+ catch (error) {
308
+ spinner.fail(`Failed to search files: ${error.message}`);
309
+ process.exit(1);
310
+ }
311
+ });
312
+ //# sourceMappingURL=tags.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tags.js","sourceRoot":"","sources":["../../src/commands/tags.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import { Command } from 'commander';
2
+ export declare const whoamiCommand: Command;
3
+ //# sourceMappingURL=whoami.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"whoami.d.ts","sourceRoot":"","sources":["../../src/commands/whoami.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AAInC,eAAO,MAAM,aAAa,SAgCtB,CAAA"}
@@ -0,0 +1,35 @@
1
+ import { Command } from 'commander';
2
+ import { getCachedAccount, acquireTokenSilent } from '../lib/msal.js';
3
+ import { chalk } from '../lib/output.js';
4
+ export const whoamiCommand = new Command('whoami')
5
+ .description('Show the currently logged-in Contextium account')
6
+ .action(async () => {
7
+ try {
8
+ const account = await getCachedAccount();
9
+ if (!account) {
10
+ console.log(chalk.yellow('Not logged in.'));
11
+ console.log(chalk.dim('Run "contextium login" to authenticate.'));
12
+ return;
13
+ }
14
+ // Try a silent token refresh to verify the session is still valid
15
+ const token = await acquireTokenSilent();
16
+ console.log();
17
+ console.log(chalk.bold('👤 Current Account'));
18
+ console.log();
19
+ console.log(` ${chalk.dim('Name:')} ${chalk.cyan(account.name || 'N/A')}`);
20
+ console.log(` ${chalk.dim('Email:')} ${chalk.white(account.username)}`);
21
+ console.log(` ${chalk.dim('Tenant:')} ${chalk.dim(account.tenantId || 'N/A')}`);
22
+ if (token) {
23
+ console.log(` ${chalk.dim('Token:')} ${chalk.green('Valid')} (expires ${token.expiresOn?.toLocaleString() || 'N/A'})`);
24
+ }
25
+ else {
26
+ console.log(` ${chalk.dim('Token:')} ${chalk.yellow('Expired')} — run "contextium login" to re-authenticate`);
27
+ }
28
+ console.log();
29
+ }
30
+ catch (error) {
31
+ console.error(chalk.red('✗') + ' Error: ' + error.message);
32
+ process.exit(1);
33
+ }
34
+ });
35
+ //# sourceMappingURL=whoami.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"whoami.js","sourceRoot":"","sources":["../../src/commands/whoami.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AACnC,OAAO,EAAE,gBAAgB,EAAE,kBAAkB,EAAE,MAAM,gBAAgB,CAAA;AACrE,OAAO,EAAE,KAAK,EAAE,MAAM,kBAAkB,CAAA;AAExC,MAAM,CAAC,MAAM,aAAa,GAAG,IAAI,OAAO,CAAC,QAAQ,CAAC;KAC/C,WAAW,CAAC,iDAAiD,CAAC;KAC9D,MAAM,CAAC,KAAK,IAAI,EAAE;IACjB,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,MAAM,gBAAgB,EAAE,CAAA;QAExC,IAAI,CAAC,OAAO,EAAE,CAAC;YACb,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,gBAAgB,CAAC,CAAC,CAAA;YAC3C,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,yCAAyC,CAAC,CAAC,CAAA;YACjE,OAAM;QACR,CAAC;QAED,kEAAkE;QAClE,MAAM,KAAK,GAAG,MAAM,kBAAkB,EAAE,CAAA;QAExC,OAAO,CAAC,GAAG,EAAE,CAAA;QACb,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,oBAAoB,CAAC,CAAC,CAAA;QAC7C,OAAO,CAAC,GAAG,EAAE,CAAA;QACb,OAAO,CAAC,GAAG,CAAC,KAAK,KAAK,CAAC,GAAG,CAAC,OAAO,CAAC,QAAQ,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,IAAI,KAAK,CAAC,EAAE,CAAC,CAAA;QAC/E,OAAO,CAAC,GAAG,CAAC,KAAK,KAAK,CAAC,GAAG,CAAC,QAAQ,CAAC,OAAO,KAAK,CAAC,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAA;QAC3E,OAAO,CAAC,GAAG,CAAC,KAAK,KAAK,CAAC,GAAG,CAAC,SAAS,CAAC,MAAM,KAAK,CAAC,GAAG,CAAC,OAAO,CAAC,QAAQ,IAAI,KAAK,CAAC,EAAE,CAAC,CAAA;QAElF,IAAI,KAAK,EAAE,CAAC;YACV,OAAO,CAAC,GAAG,CAAC,KAAK,KAAK,CAAC,GAAG,CAAC,QAAQ,CAAC,OAAO,KAAK,CAAC,KAAK,CAAC,OAAO,CAAC,aAAa,KAAK,CAAC,SAAS,EAAE,cAAc,EAAE,IAAI,KAAK,GAAG,CAAC,CAAA;QAC5H,CAAC;aAAM,CAAC;YACN,OAAO,CAAC,GAAG,CAAC,KAAK,KAAK,CAAC,GAAG,CAAC,QAAQ,CAAC,OAAO,KAAK,CAAC,MAAM,CAAC,SAAS,CAAC,8CAA8C,CAAC,CAAA;QACnH,CAAC;QACD,OAAO,CAAC,GAAG,EAAE,CAAA;IACf,CAAC;IAAC,OAAO,KAAU,EAAE,CAAC;QACpB,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,UAAU,GAAG,KAAK,CAAC,OAAO,CAAC,CAAA;QAC1D,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;IACjB,CAAC;AACH,CAAC,CAAC,CAAA"}
@@ -0,0 +1,3 @@
1
+ import { Command } from 'commander';
2
+ export declare const workspacesCommand: Command;
3
+ //# sourceMappingURL=workspaces.d.ts.map