@klarocards/cli 1.0.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 +125 -0
- package/dist/commands/cheatsheet.d.ts +3 -0
- package/dist/commands/cheatsheet.d.ts.map +1 -0
- package/dist/commands/cheatsheet.js +80 -0
- package/dist/commands/cheatsheet.js.map +1 -0
- package/dist/commands/completion.d.ts +3 -0
- package/dist/commands/completion.d.ts.map +1 -0
- package/dist/commands/completion.js +191 -0
- package/dist/commands/completion.js.map +1 -0
- package/dist/commands/config.d.ts +3 -0
- package/dist/commands/config.d.ts.map +1 -0
- package/dist/commands/config.js +77 -0
- package/dist/commands/config.js.map +1 -0
- package/dist/commands/create.d.ts +3 -0
- package/dist/commands/create.d.ts.map +1 -0
- package/dist/commands/create.js +121 -0
- package/dist/commands/create.js.map +1 -0
- package/dist/commands/del.d.ts +3 -0
- package/dist/commands/del.d.ts.map +1 -0
- package/dist/commands/del.js +49 -0
- package/dist/commands/del.js.map +1 -0
- package/dist/commands/describe.d.ts +3 -0
- package/dist/commands/describe.d.ts.map +1 -0
- package/dist/commands/describe.js +105 -0
- package/dist/commands/describe.js.map +1 -0
- package/dist/commands/edit.d.ts +3 -0
- package/dist/commands/edit.d.ts.map +1 -0
- package/dist/commands/edit.js +91 -0
- package/dist/commands/edit.js.map +1 -0
- package/dist/commands/fetch.d.ts +3 -0
- package/dist/commands/fetch.d.ts.map +1 -0
- package/dist/commands/fetch.js +129 -0
- package/dist/commands/fetch.js.map +1 -0
- package/dist/commands/init.d.ts +3 -0
- package/dist/commands/init.d.ts.map +1 -0
- package/dist/commands/init.js +122 -0
- package/dist/commands/init.js.map +1 -0
- package/dist/commands/login.d.ts +7 -0
- package/dist/commands/login.d.ts.map +1 -0
- package/dist/commands/login.js +101 -0
- package/dist/commands/login.js.map +1 -0
- package/dist/commands/logout.d.ts +3 -0
- package/dist/commands/logout.d.ts.map +1 -0
- package/dist/commands/logout.js +34 -0
- package/dist/commands/logout.js.map +1 -0
- package/dist/commands/ls.d.ts +3 -0
- package/dist/commands/ls.d.ts.map +1 -0
- package/dist/commands/ls.js +174 -0
- package/dist/commands/ls.js.map +1 -0
- package/dist/commands/read.d.ts +3 -0
- package/dist/commands/read.d.ts.map +1 -0
- package/dist/commands/read.js +64 -0
- package/dist/commands/read.js.map +1 -0
- package/dist/commands/set.d.ts +3 -0
- package/dist/commands/set.d.ts.map +1 -0
- package/dist/commands/set.js +61 -0
- package/dist/commands/set.js.map +1 -0
- package/dist/commands/sync.d.ts +3 -0
- package/dist/commands/sync.d.ts.map +1 -0
- package/dist/commands/sync.js +157 -0
- package/dist/commands/sync.js.map +1 -0
- package/dist/commands/update.d.ts +4 -0
- package/dist/commands/update.d.ts.map +1 -0
- package/dist/commands/update.js +68 -0
- package/dist/commands/update.js.map +1 -0
- package/dist/commands/use.d.ts +3 -0
- package/dist/commands/use.d.ts.map +1 -0
- package/dist/commands/use.js +29 -0
- package/dist/commands/use.js.map +1 -0
- package/dist/commands/whoami.d.ts +3 -0
- package/dist/commands/whoami.d.ts.map +1 -0
- package/dist/commands/whoami.js +30 -0
- package/dist/commands/whoami.js.map +1 -0
- package/dist/completions/bash.d.ts +2 -0
- package/dist/completions/bash.d.ts.map +1 -0
- package/dist/completions/bash.js +134 -0
- package/dist/completions/bash.js.map +1 -0
- package/dist/completions/commands.d.ts +18 -0
- package/dist/completions/commands.d.ts.map +1 -0
- package/dist/completions/commands.js +173 -0
- package/dist/completions/commands.js.map +1 -0
- package/dist/completions/fish.d.ts +2 -0
- package/dist/completions/fish.d.ts.map +1 -0
- package/dist/completions/fish.js +84 -0
- package/dist/completions/fish.js.map +1 -0
- package/dist/completions/zsh.d.ts +2 -0
- package/dist/completions/zsh.d.ts.map +1 -0
- package/dist/completions/zsh.js +113 -0
- package/dist/completions/zsh.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +158 -0
- package/dist/index.js.map +1 -0
- package/dist/lib/api.d.ts +34 -0
- package/dist/lib/api.d.ts.map +1 -0
- package/dist/lib/api.js +146 -0
- package/dist/lib/api.js.map +1 -0
- package/dist/lib/completion-cache.d.ts +34 -0
- package/dist/lib/completion-cache.d.ts.map +1 -0
- package/dist/lib/completion-cache.js +99 -0
- package/dist/lib/completion-cache.js.map +1 -0
- package/dist/lib/config.d.ts +12 -0
- package/dist/lib/config.d.ts.map +1 -0
- package/dist/lib/config.js +111 -0
- package/dist/lib/config.js.map +1 -0
- package/dist/lib/connector.d.ts +17 -0
- package/dist/lib/connector.d.ts.map +1 -0
- package/dist/lib/connector.js +2 -0
- package/dist/lib/connector.js.map +1 -0
- package/dist/lib/defaults.d.ts +9 -0
- package/dist/lib/defaults.d.ts.map +1 -0
- package/dist/lib/defaults.js +58 -0
- package/dist/lib/defaults.js.map +1 -0
- package/dist/lib/trace.d.ts +4 -0
- package/dist/lib/trace.d.ts.map +1 -0
- package/dist/lib/trace.js +13 -0
- package/dist/lib/trace.js.map +1 -0
- package/dist/lib/types.d.ts +70 -0
- package/dist/lib/types.d.ts.map +1 -0
- package/dist/lib/types.js +2 -0
- package/dist/lib/types.js.map +1 -0
- package/dist/utils/content.d.ts +26 -0
- package/dist/utils/content.d.ts.map +1 -0
- package/dist/utils/content.js +52 -0
- package/dist/utils/content.js.map +1 -0
- package/dist/utils/dimensions.d.ts +17 -0
- package/dist/utils/dimensions.d.ts.map +1 -0
- package/dist/utils/dimensions.js +41 -0
- package/dist/utils/dimensions.js.map +1 -0
- package/dist/utils/editor.d.ts +14 -0
- package/dist/utils/editor.d.ts.map +1 -0
- package/dist/utils/editor.js +56 -0
- package/dist/utils/editor.js.map +1 -0
- package/dist/utils/format.d.ts +17 -0
- package/dist/utils/format.d.ts.map +1 -0
- package/dist/utils/format.js +27 -0
- package/dist/utils/format.js.map +1 -0
- package/dist/utils/markdown.d.ts +24 -0
- package/dist/utils/markdown.d.ts.map +1 -0
- package/dist/utils/markdown.js +50 -0
- package/dist/utils/markdown.js.map +1 -0
- package/dist/utils/objects.d.ts +12 -0
- package/dist/utils/objects.d.ts.map +1 -0
- package/dist/utils/objects.js +31 -0
- package/dist/utils/objects.js.map +1 -0
- package/dist/utils/slugify.d.ts +10 -0
- package/dist/utils/slugify.d.ts.map +1 -0
- package/dist/utils/slugify.js +18 -0
- package/dist/utils/slugify.js.map +1 -0
- package/dist/utils/story-editor.d.ts +15 -0
- package/dist/utils/story-editor.d.ts.map +1 -0
- package/dist/utils/story-editor.js +43 -0
- package/dist/utils/story-editor.js.map +1 -0
- package/dist/utils/story-markdown.d.ts +36 -0
- package/dist/utils/story-markdown.d.ts.map +1 -0
- package/dist/utils/story-markdown.js +114 -0
- package/dist/utils/story-markdown.js.map +1 -0
- package/dist/utils/table.d.ts +18 -0
- package/dist/utils/table.d.ts.map +1 -0
- package/dist/utils/table.js +57 -0
- package/dist/utils/table.js.map +1 -0
- package/dist/utils/validation.d.ts +8 -0
- package/dist/utils/validation.d.ts.map +1 -0
- package/dist/utils/validation.js +17 -0
- package/dist/utils/validation.js.map +1 -0
- package/package.json +45 -0
|
@@ -0,0 +1,157 @@
|
|
|
1
|
+
import { Command } from 'commander';
|
|
2
|
+
import { readFileSync, unlinkSync } from 'node:fs';
|
|
3
|
+
import { join } from 'node:path';
|
|
4
|
+
import { createClient, KlaroApiError } from '../lib/api.js';
|
|
5
|
+
import { requireProject, requireToken } from '../lib/config.js';
|
|
6
|
+
import { resolveBoard } from '../lib/defaults.js';
|
|
7
|
+
import { parseStoryMarkdown } from '../utils/story-markdown.js';
|
|
8
|
+
import { getContentDir, listContentFiles, extractIdentifierFromFilename } from '../utils/content.js';
|
|
9
|
+
async function syncAction(options, command) {
|
|
10
|
+
try {
|
|
11
|
+
const globalOpts = command.optsWithGlobals();
|
|
12
|
+
const project = requireProject(globalOpts.project);
|
|
13
|
+
const token = requireToken();
|
|
14
|
+
const board = resolveBoard(globalOpts.board ?? options.board, project);
|
|
15
|
+
// Find content directory
|
|
16
|
+
const contentDir = getContentDir(project);
|
|
17
|
+
const files = listContentFiles(project);
|
|
18
|
+
if (files.length === 0) {
|
|
19
|
+
console.log('Nothing to sync.');
|
|
20
|
+
return;
|
|
21
|
+
}
|
|
22
|
+
// Parse all files and build updates
|
|
23
|
+
const results = [];
|
|
24
|
+
const updates = [];
|
|
25
|
+
const fileMap = new Map(); // identifier -> filename
|
|
26
|
+
for (const filename of files) {
|
|
27
|
+
const identifier = extractIdentifierFromFilename(filename);
|
|
28
|
+
if (identifier === null) {
|
|
29
|
+
results.push({
|
|
30
|
+
filename,
|
|
31
|
+
identifier: 0,
|
|
32
|
+
synced: false,
|
|
33
|
+
deleted: false,
|
|
34
|
+
error: 'Invalid filename format (expected {id}-{title}.md)',
|
|
35
|
+
});
|
|
36
|
+
continue;
|
|
37
|
+
}
|
|
38
|
+
const filepath = join(contentDir, filename);
|
|
39
|
+
try {
|
|
40
|
+
const content = readFileSync(filepath, 'utf-8');
|
|
41
|
+
const parsed = parseStoryMarkdown(content);
|
|
42
|
+
const update = {
|
|
43
|
+
identifier,
|
|
44
|
+
title: parsed.title,
|
|
45
|
+
specification: parsed.specification ?? '',
|
|
46
|
+
};
|
|
47
|
+
// Add dimensions if present
|
|
48
|
+
if (parsed.dimensions) {
|
|
49
|
+
for (const [key, value] of Object.entries(parsed.dimensions)) {
|
|
50
|
+
if (typeof value === 'string' || typeof value === 'number') {
|
|
51
|
+
update[key] = value;
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
updates.push(update);
|
|
56
|
+
fileMap.set(identifier, filename);
|
|
57
|
+
results.push({
|
|
58
|
+
filename,
|
|
59
|
+
identifier,
|
|
60
|
+
synced: false, // Will be set to true after API call
|
|
61
|
+
deleted: false,
|
|
62
|
+
});
|
|
63
|
+
}
|
|
64
|
+
catch (error) {
|
|
65
|
+
const message = error instanceof Error ? error.message : 'Failed to parse file';
|
|
66
|
+
results.push({
|
|
67
|
+
filename,
|
|
68
|
+
identifier,
|
|
69
|
+
synced: false,
|
|
70
|
+
deleted: false,
|
|
71
|
+
error: message,
|
|
72
|
+
});
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
if (updates.length === 0) {
|
|
76
|
+
console.log('No valid cards to sync.');
|
|
77
|
+
return;
|
|
78
|
+
}
|
|
79
|
+
// Dry run: show what would be synced
|
|
80
|
+
if (options.dryRun) {
|
|
81
|
+
console.log('Dry run - would sync:');
|
|
82
|
+
for (const update of updates) {
|
|
83
|
+
const filename = fileMap.get(update.identifier);
|
|
84
|
+
console.log(` ${filename} (card ${update.identifier})`);
|
|
85
|
+
}
|
|
86
|
+
if (!options.keep) {
|
|
87
|
+
console.log(`Would delete ${updates.length} file(s) after sync.`);
|
|
88
|
+
}
|
|
89
|
+
return;
|
|
90
|
+
}
|
|
91
|
+
// Submit updates to API
|
|
92
|
+
const api = createClient(project, token);
|
|
93
|
+
await api.updateStories(board, updates);
|
|
94
|
+
// Mark successful syncs
|
|
95
|
+
for (const update of updates) {
|
|
96
|
+
const result = results.find(r => r.identifier === update.identifier);
|
|
97
|
+
if (result) {
|
|
98
|
+
result.synced = true;
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
// Delete files (unless --keep)
|
|
102
|
+
if (!options.keep) {
|
|
103
|
+
for (const result of results) {
|
|
104
|
+
if (result.synced) {
|
|
105
|
+
try {
|
|
106
|
+
const filepath = join(contentDir, result.filename);
|
|
107
|
+
unlinkSync(filepath);
|
|
108
|
+
result.deleted = true;
|
|
109
|
+
}
|
|
110
|
+
catch {
|
|
111
|
+
// Ignore delete errors
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
// Report results
|
|
117
|
+
const synced = results.filter(r => r.synced);
|
|
118
|
+
const errors = results.filter(r => r.error);
|
|
119
|
+
if (errors.length > 0) {
|
|
120
|
+
for (const r of errors) {
|
|
121
|
+
console.error(`Error with ${r.filename}: ${r.error}`);
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
if (synced.length === 0) {
|
|
125
|
+
console.log('No cards synced.');
|
|
126
|
+
}
|
|
127
|
+
else if (synced.length === 1) {
|
|
128
|
+
const msg = options.keep ? 'synced' : 'synced and deleted';
|
|
129
|
+
console.log(`Card ${synced[0].identifier} ${msg}.`);
|
|
130
|
+
}
|
|
131
|
+
else {
|
|
132
|
+
const msg = options.keep ? 'synced' : 'synced and deleted';
|
|
133
|
+
console.log(`${synced.length} cards ${msg}.`);
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
catch (error) {
|
|
137
|
+
if (error instanceof KlaroApiError) {
|
|
138
|
+
console.error(`Error: ${error.message}`);
|
|
139
|
+
}
|
|
140
|
+
else if (error instanceof Error) {
|
|
141
|
+
console.error(`Error: ${error.message}`);
|
|
142
|
+
}
|
|
143
|
+
else {
|
|
144
|
+
console.error('An unexpected error occurred');
|
|
145
|
+
}
|
|
146
|
+
process.exit(1);
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
export function createSyncCommand() {
|
|
150
|
+
return new Command('sync')
|
|
151
|
+
.description('Upload local card changes and delete synced files')
|
|
152
|
+
.option('-b, --board <board>', 'Board identifier (default: "all")')
|
|
153
|
+
.option('--keep', 'Keep local files after syncing')
|
|
154
|
+
.option('--dry-run', 'Show what would be synced without making changes')
|
|
155
|
+
.action(syncAction);
|
|
156
|
+
}
|
|
157
|
+
//# 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 @@
|
|
|
1
|
+
{"version":3,"file":"update.d.ts","sourceRoot":"","sources":["../../src/commands/update.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AA8DpC,wBAAgB,mBAAmB,IAAI,OAAO,CAM7C;AAED,wBAAgB,gBAAgB,IAAI,OAAO,CAM1C"}
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
import { Command } from 'commander';
|
|
2
|
+
import { createClient, KlaroApiError } from '../lib/api.js';
|
|
3
|
+
import { requireProject, requireToken } from '../lib/config.js';
|
|
4
|
+
import { resolveBoard } from '../lib/defaults.js';
|
|
5
|
+
import { splitArgs, parseDimensions } from '../utils/dimensions.js';
|
|
6
|
+
import { printTable } from '../utils/table.js';
|
|
7
|
+
async function updateAction(args, options, command) {
|
|
8
|
+
try {
|
|
9
|
+
// Split args into identifiers and key=value dimensions
|
|
10
|
+
const { regularArgs, dimensionArgs } = splitArgs(args);
|
|
11
|
+
if (regularArgs.length === 0) {
|
|
12
|
+
console.error('Error: At least one identifier is required');
|
|
13
|
+
process.exit(1);
|
|
14
|
+
return;
|
|
15
|
+
}
|
|
16
|
+
const numericIds = regularArgs.map(id => {
|
|
17
|
+
const num = parseInt(id, 10);
|
|
18
|
+
if (isNaN(num)) {
|
|
19
|
+
throw new Error(`Invalid identifier "${id}": must be a number`);
|
|
20
|
+
}
|
|
21
|
+
return num;
|
|
22
|
+
});
|
|
23
|
+
const dimensions = parseDimensions(dimensionArgs);
|
|
24
|
+
if (Object.keys(dimensions).length === 0) {
|
|
25
|
+
console.error('Error: At least one dimension is required (key=value)');
|
|
26
|
+
process.exit(1);
|
|
27
|
+
return;
|
|
28
|
+
}
|
|
29
|
+
const globalOpts = command.optsWithGlobals();
|
|
30
|
+
const project = requireProject(globalOpts.project);
|
|
31
|
+
const token = requireToken();
|
|
32
|
+
const board = resolveBoard(globalOpts.board ?? options.board, project);
|
|
33
|
+
const api = createClient(project, token);
|
|
34
|
+
const updates = numericIds.map(identifier => ({ identifier, ...dimensions }));
|
|
35
|
+
const stories = await api.updateStories(board, updates);
|
|
36
|
+
if (stories.length > 0) {
|
|
37
|
+
const columns = ['identifier', 'title', ...Object.keys(dimensions)];
|
|
38
|
+
printTable(stories, columns);
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
catch (error) {
|
|
42
|
+
if (error instanceof KlaroApiError) {
|
|
43
|
+
console.error(`Error: ${error.message}`);
|
|
44
|
+
}
|
|
45
|
+
else if (error instanceof Error) {
|
|
46
|
+
console.error(`Error: ${error.message}`);
|
|
47
|
+
}
|
|
48
|
+
else {
|
|
49
|
+
console.error('An unexpected error occurred');
|
|
50
|
+
}
|
|
51
|
+
process.exit(1);
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
export function createUpdateCommand() {
|
|
55
|
+
return new Command('update')
|
|
56
|
+
.description('Update one or more cards by identifier')
|
|
57
|
+
.argument('<args...>', 'Card identifier(s) followed by key=value dimension(s)')
|
|
58
|
+
.option('-b, --board <board>', 'Board identifier (default: "all")')
|
|
59
|
+
.action(updateAction);
|
|
60
|
+
}
|
|
61
|
+
export function createUpdCommand() {
|
|
62
|
+
return new Command('upd')
|
|
63
|
+
.description('Update one or more cards by identifier')
|
|
64
|
+
.argument('<args...>', 'Card identifier(s) followed by key=value dimension(s)')
|
|
65
|
+
.option('-b, --board <board>', 'Board identifier (default: "all")')
|
|
66
|
+
.action(updateAction);
|
|
67
|
+
}
|
|
68
|
+
//# sourceMappingURL=update.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"update.js","sourceRoot":"","sources":["../../src/commands/update.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"use.d.ts","sourceRoot":"","sources":["../../src/commands/use.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAwBpC,wBAAgB,gBAAgB,IAAI,OAAO,CAK1C"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import { Command } from 'commander';
|
|
2
|
+
import { readConfig, writeConfig } from '../lib/config.js';
|
|
3
|
+
import { validateSubdomain } from '../utils/validation.js';
|
|
4
|
+
function useAction(subdomain) {
|
|
5
|
+
try {
|
|
6
|
+
validateSubdomain(subdomain);
|
|
7
|
+
}
|
|
8
|
+
catch (error) {
|
|
9
|
+
console.error(error.message);
|
|
10
|
+
process.exit(1);
|
|
11
|
+
}
|
|
12
|
+
const config = readConfig();
|
|
13
|
+
const oldProject = config.project;
|
|
14
|
+
config.project = subdomain;
|
|
15
|
+
writeConfig(config);
|
|
16
|
+
if (oldProject) {
|
|
17
|
+
console.log(`Switched from "${oldProject}" to "${subdomain}"`);
|
|
18
|
+
}
|
|
19
|
+
else {
|
|
20
|
+
console.log(`Default project set to "${subdomain}"`);
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
export function createUseCommand() {
|
|
24
|
+
return new Command('use')
|
|
25
|
+
.description('Set the default Klaro project')
|
|
26
|
+
.argument('<subdomain>', 'Project subdomain')
|
|
27
|
+
.action(useAction);
|
|
28
|
+
}
|
|
29
|
+
//# sourceMappingURL=use.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"use.js","sourceRoot":"","sources":["../../src/commands/use.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAC3D,OAAO,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAE3D,SAAS,SAAS,CAAC,SAAiB;IAClC,IAAI,CAAC;QACH,iBAAiB,CAAC,SAAS,CAAC,CAAC;IAC/B,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,CAAC,KAAK,CAAE,KAAe,CAAC,OAAO,CAAC,CAAC;QACxC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,MAAM,MAAM,GAAG,UAAU,EAAE,CAAC;IAC5B,MAAM,UAAU,GAAG,MAAM,CAAC,OAAO,CAAC;IAClC,MAAM,CAAC,OAAO,GAAG,SAAS,CAAC;IAC3B,WAAW,CAAC,MAAM,CAAC,CAAC;IAEpB,IAAI,UAAU,EAAE,CAAC;QACf,OAAO,CAAC,GAAG,CAAC,kBAAkB,UAAU,SAAS,SAAS,GAAG,CAAC,CAAC;IACjE,CAAC;SAAM,CAAC;QACN,OAAO,CAAC,GAAG,CAAC,2BAA2B,SAAS,GAAG,CAAC,CAAC;IACvD,CAAC;AACH,CAAC;AAED,MAAM,UAAU,gBAAgB;IAC9B,OAAO,IAAI,OAAO,CAAC,KAAK,CAAC;SACtB,WAAW,CAAC,+BAA+B,CAAC;SAC5C,QAAQ,CAAC,aAAa,EAAE,mBAAmB,CAAC;SAC5C,MAAM,CAAC,SAAS,CAAC,CAAC;AACvB,CAAC"}
|
|
@@ -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,CAAC;AAyBpC,wBAAgB,mBAAmB,IAAI,OAAO,CAI7C"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import { Command } from 'commander';
|
|
2
|
+
import { KlaroApi, KlaroApiError } from '../lib/api.js';
|
|
3
|
+
import { getToken } from '../lib/config.js';
|
|
4
|
+
async function whoamiAction() {
|
|
5
|
+
const token = getToken();
|
|
6
|
+
if (!token) {
|
|
7
|
+
console.error('Not logged in. Run "klaro login" first.');
|
|
8
|
+
process.exit(1);
|
|
9
|
+
}
|
|
10
|
+
try {
|
|
11
|
+
const api = new KlaroApi('app', token);
|
|
12
|
+
const me = await api.getMe();
|
|
13
|
+
console.log(me.nickname ? `${me.email} (${me.nickname})` : me.email);
|
|
14
|
+
}
|
|
15
|
+
catch (error) {
|
|
16
|
+
if (error instanceof KlaroApiError) {
|
|
17
|
+
console.error(`Failed to get user info: ${error.message}`);
|
|
18
|
+
}
|
|
19
|
+
else {
|
|
20
|
+
console.error('Failed to get user info: An unexpected error occurred');
|
|
21
|
+
}
|
|
22
|
+
process.exit(1);
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
export function createWhoamiCommand() {
|
|
26
|
+
return new Command('whoami')
|
|
27
|
+
.description('Show the currently logged in user')
|
|
28
|
+
.action(whoamiAction);
|
|
29
|
+
}
|
|
30
|
+
//# 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,CAAC;AACpC,OAAO,EAAE,QAAQ,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AACxD,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAE5C,KAAK,UAAU,YAAY;IACzB,MAAM,KAAK,GAAG,QAAQ,EAAE,CAAC;IACzB,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,OAAO,CAAC,KAAK,CAAC,yCAAyC,CAAC,CAAC;QACzD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,IAAI,QAAQ,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;QACvC,MAAM,EAAE,GAAG,MAAM,GAAG,CAAC,KAAK,EAAE,CAAC;QAC7B,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,QAAQ,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC,KAAK,KAAK,EAAE,CAAC,QAAQ,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC;IACvE,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,IAAI,KAAK,YAAY,aAAa,EAAE,CAAC;YACnC,OAAO,CAAC,KAAK,CAAC,4BAA4B,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC;QAC7D,CAAC;aAAM,CAAC;YACN,OAAO,CAAC,KAAK,CAAC,uDAAuD,CAAC,CAAC;QACzE,CAAC;QACD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC;AAED,MAAM,UAAU,mBAAmB;IACjC,OAAO,IAAI,OAAO,CAAC,QAAQ,CAAC;SACzB,WAAW,CAAC,mCAAmC,CAAC;SAChD,MAAM,CAAC,YAAY,CAAC,CAAC;AAC1B,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bash.d.ts","sourceRoot":"","sources":["../../src/completions/bash.ts"],"names":[],"mappings":"AAaA,wBAAgB,sBAAsB,IAAI,MAAM,CA6H/C"}
|
|
@@ -0,0 +1,134 @@
|
|
|
1
|
+
import { COMMANDS, GLOBAL_OPTIONS } from './commands.js';
|
|
2
|
+
function formatOptions(options) {
|
|
3
|
+
return options
|
|
4
|
+
.flatMap(o => [o.short, o.long].filter(Boolean))
|
|
5
|
+
.join(' ');
|
|
6
|
+
}
|
|
7
|
+
function getCommandOptions(cmd) {
|
|
8
|
+
const opts = [...GLOBAL_OPTIONS, ...(cmd.options ?? [])];
|
|
9
|
+
return formatOptions(opts);
|
|
10
|
+
}
|
|
11
|
+
export function generateBashCompletion() {
|
|
12
|
+
const commandNames = COMMANDS.map(c => c.name).join(' ');
|
|
13
|
+
// Build case statements for subcommands
|
|
14
|
+
const subcommandCases = COMMANDS
|
|
15
|
+
.filter(c => c.subcommands)
|
|
16
|
+
.map(cmd => {
|
|
17
|
+
const subNames = cmd.subcommands.map(s => s.name).join(' ');
|
|
18
|
+
return ` ${cmd.name})
|
|
19
|
+
COMPREPLY=($(compgen -W "${subNames}" -- "\${cur}"))
|
|
20
|
+
return
|
|
21
|
+
;;`;
|
|
22
|
+
})
|
|
23
|
+
.join('\n');
|
|
24
|
+
// Build case statements for command options
|
|
25
|
+
const optionCases = COMMANDS
|
|
26
|
+
.map(cmd => {
|
|
27
|
+
const opts = getCommandOptions(cmd);
|
|
28
|
+
return ` ${cmd.name})
|
|
29
|
+
opts="${opts}"
|
|
30
|
+
;;`;
|
|
31
|
+
})
|
|
32
|
+
.join('\n');
|
|
33
|
+
return `# Bash completion for klaro CLI
|
|
34
|
+
# Add to ~/.bashrc: eval "$(klaro completion bash)"
|
|
35
|
+
|
|
36
|
+
_klaro_completions() {
|
|
37
|
+
local cur prev words cword
|
|
38
|
+
if type _init_completion &>/dev/null; then
|
|
39
|
+
_init_completion || return
|
|
40
|
+
else
|
|
41
|
+
cur="\${COMP_WORDS[COMP_CWORD]}"
|
|
42
|
+
prev="\${COMP_WORDS[COMP_CWORD-1]}"
|
|
43
|
+
words=("\${COMP_WORDS[@]}")
|
|
44
|
+
cword=$COMP_CWORD
|
|
45
|
+
fi
|
|
46
|
+
|
|
47
|
+
local commands="${commandNames}"
|
|
48
|
+
local global_opts="${formatOptions(GLOBAL_OPTIONS)}"
|
|
49
|
+
|
|
50
|
+
# Handle option arguments that need dynamic completion
|
|
51
|
+
case "\${prev}" in
|
|
52
|
+
-p|--project|use)
|
|
53
|
+
local projects
|
|
54
|
+
projects="$(klaro completion --list-projects 2>/dev/null)"
|
|
55
|
+
COMPREPLY=($(compgen -W "\${projects}" -- "\${cur}"))
|
|
56
|
+
return
|
|
57
|
+
;;
|
|
58
|
+
-b|--board)
|
|
59
|
+
local boards
|
|
60
|
+
boards="$(klaro completion --list-boards 2>/dev/null)"
|
|
61
|
+
COMPREPLY=($(compgen -W "\${boards}" -- "\${cur}"))
|
|
62
|
+
return
|
|
63
|
+
;;
|
|
64
|
+
esac
|
|
65
|
+
|
|
66
|
+
# Find the command (first non-option argument after klaro)
|
|
67
|
+
local cmd=""
|
|
68
|
+
local i=1
|
|
69
|
+
while [[ $i -lt $cword ]]; do
|
|
70
|
+
local word="\${words[$i]}"
|
|
71
|
+
if [[ "\${word}" != -* ]]; then
|
|
72
|
+
cmd="\${word}"
|
|
73
|
+
break
|
|
74
|
+
fi
|
|
75
|
+
# Skip option arguments
|
|
76
|
+
case "\${word}" in
|
|
77
|
+
-p|--project|--board|--dims)
|
|
78
|
+
((i++))
|
|
79
|
+
;;
|
|
80
|
+
esac
|
|
81
|
+
((i++))
|
|
82
|
+
done
|
|
83
|
+
|
|
84
|
+
# No command yet - complete commands or global options
|
|
85
|
+
if [[ -z "\${cmd}" ]]; then
|
|
86
|
+
if [[ "\${cur}" == -* ]]; then
|
|
87
|
+
COMPREPLY=($(compgen -W "\${global_opts}" -- "\${cur}"))
|
|
88
|
+
else
|
|
89
|
+
COMPREPLY=($(compgen -W "\${commands}" -- "\${cur}"))
|
|
90
|
+
fi
|
|
91
|
+
return
|
|
92
|
+
fi
|
|
93
|
+
|
|
94
|
+
# Find subcommand position
|
|
95
|
+
local subcmd=""
|
|
96
|
+
((i++))
|
|
97
|
+
while [[ $i -lt $cword ]]; do
|
|
98
|
+
local word="\${words[$i]}"
|
|
99
|
+
if [[ "\${word}" != -* ]]; then
|
|
100
|
+
subcmd="\${word}"
|
|
101
|
+
break
|
|
102
|
+
fi
|
|
103
|
+
((i++))
|
|
104
|
+
done
|
|
105
|
+
|
|
106
|
+
# Complete subcommands if command has them and no subcommand yet
|
|
107
|
+
if [[ -z "\${subcmd}" ]] && [[ "\${cur}" != -* ]]; then
|
|
108
|
+
case "\${cmd}" in
|
|
109
|
+
${subcommandCases}
|
|
110
|
+
esac
|
|
111
|
+
fi
|
|
112
|
+
|
|
113
|
+
# Complete options based on command
|
|
114
|
+
if [[ "\${cur}" == -* ]]; then
|
|
115
|
+
local opts=""
|
|
116
|
+
case "\${cmd}" in
|
|
117
|
+
${optionCases}
|
|
118
|
+
esac
|
|
119
|
+
COMPREPLY=($(compgen -W "\${opts}" -- "\${cur}"))
|
|
120
|
+
return
|
|
121
|
+
fi
|
|
122
|
+
|
|
123
|
+
# Default: complete files for commands that accept file arguments
|
|
124
|
+
case "\${cmd}" in
|
|
125
|
+
create)
|
|
126
|
+
COMPREPLY=($(compgen -f -- "\${cur}"))
|
|
127
|
+
;;
|
|
128
|
+
esac
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
complete -F _klaro_completions klaro
|
|
132
|
+
`;
|
|
133
|
+
}
|
|
134
|
+
//# sourceMappingURL=bash.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bash.js","sourceRoot":"","sources":["../../src/completions/bash.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,cAAc,EAAmC,MAAM,eAAe,CAAC;AAE1F,SAAS,aAAa,CAAC,OAAoB;IACzC,OAAO,OAAO;SACX,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;SAC/C,IAAI,CAAC,GAAG,CAAC,CAAC;AACf,CAAC;AAED,SAAS,iBAAiB,CAAC,GAAe;IACxC,MAAM,IAAI,GAAG,CAAC,GAAG,cAAc,EAAE,GAAG,CAAC,GAAG,CAAC,OAAO,IAAI,EAAE,CAAC,CAAC,CAAC;IACzD,OAAO,aAAa,CAAC,IAAI,CAAC,CAAC;AAC7B,CAAC;AAED,MAAM,UAAU,sBAAsB;IACpC,MAAM,YAAY,GAAG,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAEzD,wCAAwC;IACxC,MAAM,eAAe,GAAG,QAAQ;SAC7B,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,WAAW,CAAC;SAC1B,GAAG,CAAC,GAAG,CAAC,EAAE;QACT,MAAM,QAAQ,GAAG,GAAG,CAAC,WAAY,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QAC7D,OAAO,SAAS,GAAG,CAAC,IAAI;mCACK,QAAQ;;WAEhC,CAAC;IACR,CAAC,CAAC;SACD,IAAI,CAAC,IAAI,CAAC,CAAC;IAEd,4CAA4C;IAC5C,MAAM,WAAW,GAAG,QAAQ;SACzB,GAAG,CAAC,GAAG,CAAC,EAAE;QACT,MAAM,IAAI,GAAG,iBAAiB,CAAC,GAAG,CAAC,CAAC;QACpC,OAAO,SAAS,GAAG,CAAC,IAAI;gBACd,IAAI;WACT,CAAC;IACR,CAAC,CAAC;SACD,IAAI,CAAC,IAAI,CAAC,CAAC;IAEd,OAAO;;;;;;;;;;;;;;oBAcW,YAAY;uBACT,aAAa,CAAC,cAAc,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EA6DlD,eAAe;;;;;;;;EAQf,WAAW;;;;;;;;;;;;;;;CAeZ,CAAC;AACF,CAAC"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
export interface CommandDef {
|
|
2
|
+
name: string;
|
|
3
|
+
description: string;
|
|
4
|
+
subcommands?: CommandDef[];
|
|
5
|
+
options?: OptionDef[];
|
|
6
|
+
takesArgs?: 'projects' | 'boards' | 'identifiers' | 'files' | 'none';
|
|
7
|
+
}
|
|
8
|
+
export interface OptionDef {
|
|
9
|
+
short?: string;
|
|
10
|
+
long: string;
|
|
11
|
+
description: string;
|
|
12
|
+
takesArg?: 'projects' | 'boards' | 'files' | 'string' | 'none';
|
|
13
|
+
}
|
|
14
|
+
export declare const GLOBAL_OPTIONS: OptionDef[];
|
|
15
|
+
export declare const COMMANDS: CommandDef[];
|
|
16
|
+
export declare function getCommandNames(): string[];
|
|
17
|
+
export declare function getSubcommandNames(command: string): string[];
|
|
18
|
+
//# sourceMappingURL=commands.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"commands.d.ts","sourceRoot":"","sources":["../../src/completions/commands.ts"],"names":[],"mappings":"AAEA,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,CAAC,EAAE,UAAU,EAAE,CAAC;IAC3B,OAAO,CAAC,EAAE,SAAS,EAAE,CAAC;IACtB,SAAS,CAAC,EAAE,UAAU,GAAG,QAAQ,GAAG,aAAa,GAAG,OAAO,GAAG,MAAM,CAAC;CACtE;AAED,MAAM,WAAW,SAAS;IACxB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,EAAE,UAAU,GAAG,QAAQ,GAAG,OAAO,GAAG,QAAQ,GAAG,MAAM,CAAC;CAChE;AAGD,eAAO,MAAM,cAAc,EAAE,SAAS,EAMrC,CAAC;AAGF,eAAO,MAAM,QAAQ,EAAE,UAAU,EAwJhC,CAAC;AAGF,wBAAgB,eAAe,IAAI,MAAM,EAAE,CAE1C;AAGD,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,EAAE,CAG5D"}
|