@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
package/dist/lib/api.js
ADDED
|
@@ -0,0 +1,146 @@
|
|
|
1
|
+
import { trace } from './trace.js';
|
|
2
|
+
import { getProject } from './config.js';
|
|
3
|
+
const AUTH_API_URL = 'https://api.klaro.cards/v1';
|
|
4
|
+
export class KlaroApiError extends Error {
|
|
5
|
+
status;
|
|
6
|
+
code;
|
|
7
|
+
constructor(status, message, code) {
|
|
8
|
+
super(message);
|
|
9
|
+
this.status = status;
|
|
10
|
+
this.code = code;
|
|
11
|
+
this.name = 'KlaroApiError';
|
|
12
|
+
}
|
|
13
|
+
}
|
|
14
|
+
export function buildHeaders(subdomain, token, accept) {
|
|
15
|
+
const headers = {
|
|
16
|
+
'Content-Type': 'application/json',
|
|
17
|
+
'Accept': accept || 'application/json',
|
|
18
|
+
'X-Klaro-Project-Subdomain': subdomain,
|
|
19
|
+
};
|
|
20
|
+
if (token) {
|
|
21
|
+
headers['Authorization'] = `Bearer ${token}`;
|
|
22
|
+
}
|
|
23
|
+
return headers;
|
|
24
|
+
}
|
|
25
|
+
export function sanitizeHeaders(headers) {
|
|
26
|
+
return {
|
|
27
|
+
...headers,
|
|
28
|
+
Authorization: headers.Authorization ? '***' : undefined,
|
|
29
|
+
};
|
|
30
|
+
}
|
|
31
|
+
async function doFetch(method, url, headers, body, sanitizeBody) {
|
|
32
|
+
const traceBody = sanitizeBody ? sanitizeBody(body) : body;
|
|
33
|
+
trace('Request', { method, url, headers: sanitizeHeaders(headers), body: traceBody });
|
|
34
|
+
const response = await fetch(url, {
|
|
35
|
+
method,
|
|
36
|
+
headers,
|
|
37
|
+
body: body ? JSON.stringify(body) : undefined,
|
|
38
|
+
});
|
|
39
|
+
if (!response.ok) {
|
|
40
|
+
let message = `API error: ${response.status} ${response.statusText}`;
|
|
41
|
+
let errorBody;
|
|
42
|
+
try {
|
|
43
|
+
errorBody = await response.json();
|
|
44
|
+
const err = errorBody;
|
|
45
|
+
message = err.message || err.error || message;
|
|
46
|
+
}
|
|
47
|
+
catch {
|
|
48
|
+
// Use default message
|
|
49
|
+
}
|
|
50
|
+
trace('Response Error', { status: response.status, body: errorBody });
|
|
51
|
+
throw new KlaroApiError(response.status, message);
|
|
52
|
+
}
|
|
53
|
+
// Handle empty responses (e.g., 204 No Content)
|
|
54
|
+
const text = await response.text();
|
|
55
|
+
const result = text ? JSON.parse(text) : undefined;
|
|
56
|
+
trace('Response', { status: response.status, body: result });
|
|
57
|
+
return result;
|
|
58
|
+
}
|
|
59
|
+
export class KlaroApi {
|
|
60
|
+
subdomain;
|
|
61
|
+
baseUrl;
|
|
62
|
+
token;
|
|
63
|
+
constructor(subdomain, token) {
|
|
64
|
+
this.subdomain = subdomain;
|
|
65
|
+
this.baseUrl = `https://${subdomain}.klaro.cards/api/v1`;
|
|
66
|
+
this.token = token;
|
|
67
|
+
}
|
|
68
|
+
async request(method, path, body, accept) {
|
|
69
|
+
const url = `${this.baseUrl}${path}`;
|
|
70
|
+
const headers = buildHeaders(this.subdomain, this.token, accept);
|
|
71
|
+
return doFetch(method, url, headers, body);
|
|
72
|
+
}
|
|
73
|
+
async login(email, password) {
|
|
74
|
+
const subdomain = getProject() || 'app';
|
|
75
|
+
const url = `${AUTH_API_URL}/auth/tokens/`;
|
|
76
|
+
const body = {
|
|
77
|
+
grant_type: subdomain == 'app' ? 'auto_login' : 'client_credentials',
|
|
78
|
+
client_id: email,
|
|
79
|
+
client_secret: password,
|
|
80
|
+
};
|
|
81
|
+
const headers = buildHeaders(subdomain);
|
|
82
|
+
const result = await doFetch('POST', url, headers, body, (b) => ({ ...b, client_secret: '***' }));
|
|
83
|
+
// Re-trace with sanitized token for security
|
|
84
|
+
trace('Response (sanitized)', { access_token: '***', token_type: result.token_type, expires_in: result.expires_in });
|
|
85
|
+
return result;
|
|
86
|
+
}
|
|
87
|
+
async getMe() {
|
|
88
|
+
const url = `${AUTH_API_URL}/auth/me`;
|
|
89
|
+
const headers = buildHeaders(this.subdomain, this.token);
|
|
90
|
+
return doFetch('GET', url, headers);
|
|
91
|
+
}
|
|
92
|
+
async logout() {
|
|
93
|
+
const url = `${AUTH_API_URL}/auth/tokens/self`;
|
|
94
|
+
const headers = buildHeaders(this.subdomain, this.token);
|
|
95
|
+
await doFetch('DELETE', url, headers);
|
|
96
|
+
}
|
|
97
|
+
async listStories(boardId, options) {
|
|
98
|
+
const params = new URLSearchParams();
|
|
99
|
+
if (options?.limit) {
|
|
100
|
+
params.set('limit', options.limit.toString());
|
|
101
|
+
}
|
|
102
|
+
if (options?.filters) {
|
|
103
|
+
for (const [key, value] of Object.entries(options.filters)) {
|
|
104
|
+
params.set(key, value);
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
const queryString = params.toString();
|
|
108
|
+
const path = `/boards/${boardId}/stories${queryString ? `?${queryString}` : ''}`;
|
|
109
|
+
return this.request('GET', path);
|
|
110
|
+
}
|
|
111
|
+
async getStories(boardId, identifiers) {
|
|
112
|
+
const params = new URLSearchParams();
|
|
113
|
+
for (const id of identifiers) {
|
|
114
|
+
params.append('identifier[]', id.toString());
|
|
115
|
+
}
|
|
116
|
+
const path = `/boards/${boardId}/stories?${params.toString()}`;
|
|
117
|
+
return this.request('GET', path, undefined, 'application/vnd+klaro.stories.medium+json');
|
|
118
|
+
}
|
|
119
|
+
async createStory(boardId, input) {
|
|
120
|
+
return this.request('POST', `/boards/${boardId}/stories`, input);
|
|
121
|
+
}
|
|
122
|
+
async deleteStories(boardId, identifiers) {
|
|
123
|
+
const body = { stories: identifiers.map(identifier => ({ identifier })) };
|
|
124
|
+
await this.request('DELETE', `/boards/${boardId}/stories`, body);
|
|
125
|
+
}
|
|
126
|
+
async updateStories(boardId, updates) {
|
|
127
|
+
const body = { patch: updates };
|
|
128
|
+
return this.request('PATCH', `/boards/${boardId}/stories`, body);
|
|
129
|
+
}
|
|
130
|
+
async listProjects() {
|
|
131
|
+
return this.request('GET', '/my/projects/');
|
|
132
|
+
}
|
|
133
|
+
async listBoards() {
|
|
134
|
+
return this.request('GET', '/my/boards/');
|
|
135
|
+
}
|
|
136
|
+
async getBoard(boardId) {
|
|
137
|
+
return this.request('GET', `/boards/${boardId}`);
|
|
138
|
+
}
|
|
139
|
+
async listDimensions() {
|
|
140
|
+
return this.request('GET', '/dimensions/');
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
export function createClient(subdomain, token) {
|
|
144
|
+
return new KlaroApi(subdomain, token);
|
|
145
|
+
}
|
|
146
|
+
//# sourceMappingURL=api.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"api.js","sourceRoot":"","sources":["../../src/lib/api.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import type { CompletionCache } from './types.js';
|
|
2
|
+
export declare function readCompletionCache(): CompletionCache;
|
|
3
|
+
export declare function writeCompletionCache(cache: CompletionCache): void;
|
|
4
|
+
/**
|
|
5
|
+
* Get cached project subdomains, or empty array if cache is stale/missing.
|
|
6
|
+
*/
|
|
7
|
+
export declare function getCachedProjects(): string[];
|
|
8
|
+
/**
|
|
9
|
+
* Get cached board identifiers for a project, or empty array if cache is stale/missing.
|
|
10
|
+
*/
|
|
11
|
+
export declare function getCachedBoards(project: string): string[];
|
|
12
|
+
/**
|
|
13
|
+
* Update the projects cache with fresh data.
|
|
14
|
+
*/
|
|
15
|
+
export declare function setCachedProjects(projects: Array<{
|
|
16
|
+
subdomain: string;
|
|
17
|
+
label: string;
|
|
18
|
+
}>): void;
|
|
19
|
+
/**
|
|
20
|
+
* Update the boards cache for a specific project with fresh data.
|
|
21
|
+
*/
|
|
22
|
+
export declare function setCachedBoards(project: string, boards: Array<{
|
|
23
|
+
identifier: string;
|
|
24
|
+
label: string;
|
|
25
|
+
}>): void;
|
|
26
|
+
/**
|
|
27
|
+
* Check if projects cache needs refresh.
|
|
28
|
+
*/
|
|
29
|
+
export declare function needsProjectsRefresh(): boolean;
|
|
30
|
+
/**
|
|
31
|
+
* Check if boards cache for a project needs refresh.
|
|
32
|
+
*/
|
|
33
|
+
export declare function needsBoardsRefresh(project: string): boolean;
|
|
34
|
+
//# sourceMappingURL=completion-cache.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"completion-cache.d.ts","sourceRoot":"","sources":["../../src/lib/completion-cache.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,eAAe,EAAc,MAAM,YAAY,CAAC;AAc9D,wBAAgB,mBAAmB,IAAI,eAAe,CAWrD;AAED,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,eAAe,GAAG,IAAI,CAQjE;AAOD;;GAEG;AACH,wBAAgB,iBAAiB,IAAI,MAAM,EAAE,CAM5C;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,EAAE,CAOzD;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,QAAQ,EAAE,KAAK,CAAC;IAAE,SAAS,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAAC,GAAG,IAAI,CAO7F;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,CAAC;IAAE,UAAU,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAAC,GAAG,IAAI,CAU3G;AAED;;GAEG;AACH,wBAAgB,oBAAoB,IAAI,OAAO,CAG9C;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAG3D"}
|
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
import { homedir } from 'node:os';
|
|
2
|
+
import { join } from 'node:path';
|
|
3
|
+
import { existsSync, mkdirSync, readFileSync, writeFileSync } from 'node:fs';
|
|
4
|
+
const CACHE_FILE = 'completion-cache.json';
|
|
5
|
+
const CACHE_TTL_MS = 60 * 60 * 1000; // 1 hour
|
|
6
|
+
function getCacheDir() {
|
|
7
|
+
const home = process.env.KLARO_HOME ?? homedir();
|
|
8
|
+
return join(home, '.klaro');
|
|
9
|
+
}
|
|
10
|
+
function getCacheFile() {
|
|
11
|
+
return join(getCacheDir(), CACHE_FILE);
|
|
12
|
+
}
|
|
13
|
+
export function readCompletionCache() {
|
|
14
|
+
const cacheFile = getCacheFile();
|
|
15
|
+
if (!existsSync(cacheFile)) {
|
|
16
|
+
return {};
|
|
17
|
+
}
|
|
18
|
+
try {
|
|
19
|
+
const content = readFileSync(cacheFile, 'utf-8');
|
|
20
|
+
return JSON.parse(content);
|
|
21
|
+
}
|
|
22
|
+
catch {
|
|
23
|
+
return {};
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
export function writeCompletionCache(cache) {
|
|
27
|
+
const cacheDir = getCacheDir();
|
|
28
|
+
const cacheFile = getCacheFile();
|
|
29
|
+
if (!existsSync(cacheDir)) {
|
|
30
|
+
mkdirSync(cacheDir, { recursive: true });
|
|
31
|
+
}
|
|
32
|
+
writeFileSync(cacheFile, JSON.stringify(cache, null, 2), 'utf-8');
|
|
33
|
+
}
|
|
34
|
+
function isCacheValid(entry) {
|
|
35
|
+
if (!entry)
|
|
36
|
+
return false;
|
|
37
|
+
return Date.now() - entry.timestamp < CACHE_TTL_MS;
|
|
38
|
+
}
|
|
39
|
+
/**
|
|
40
|
+
* Get cached project subdomains, or empty array if cache is stale/missing.
|
|
41
|
+
*/
|
|
42
|
+
export function getCachedProjects() {
|
|
43
|
+
const cache = readCompletionCache();
|
|
44
|
+
if (!isCacheValid(cache.projects)) {
|
|
45
|
+
return [];
|
|
46
|
+
}
|
|
47
|
+
return cache.projects.data.map(p => p.subdomain);
|
|
48
|
+
}
|
|
49
|
+
/**
|
|
50
|
+
* Get cached board identifiers for a project, or empty array if cache is stale/missing.
|
|
51
|
+
*/
|
|
52
|
+
export function getCachedBoards(project) {
|
|
53
|
+
const cache = readCompletionCache();
|
|
54
|
+
const entry = cache.boards?.[project];
|
|
55
|
+
if (!isCacheValid(entry)) {
|
|
56
|
+
return [];
|
|
57
|
+
}
|
|
58
|
+
return entry.data.map(b => b.identifier);
|
|
59
|
+
}
|
|
60
|
+
/**
|
|
61
|
+
* Update the projects cache with fresh data.
|
|
62
|
+
*/
|
|
63
|
+
export function setCachedProjects(projects) {
|
|
64
|
+
const cache = readCompletionCache();
|
|
65
|
+
cache.projects = {
|
|
66
|
+
data: projects,
|
|
67
|
+
timestamp: Date.now(),
|
|
68
|
+
};
|
|
69
|
+
writeCompletionCache(cache);
|
|
70
|
+
}
|
|
71
|
+
/**
|
|
72
|
+
* Update the boards cache for a specific project with fresh data.
|
|
73
|
+
*/
|
|
74
|
+
export function setCachedBoards(project, boards) {
|
|
75
|
+
const cache = readCompletionCache();
|
|
76
|
+
if (!cache.boards) {
|
|
77
|
+
cache.boards = {};
|
|
78
|
+
}
|
|
79
|
+
cache.boards[project] = {
|
|
80
|
+
data: boards,
|
|
81
|
+
timestamp: Date.now(),
|
|
82
|
+
};
|
|
83
|
+
writeCompletionCache(cache);
|
|
84
|
+
}
|
|
85
|
+
/**
|
|
86
|
+
* Check if projects cache needs refresh.
|
|
87
|
+
*/
|
|
88
|
+
export function needsProjectsRefresh() {
|
|
89
|
+
const cache = readCompletionCache();
|
|
90
|
+
return !isCacheValid(cache.projects);
|
|
91
|
+
}
|
|
92
|
+
/**
|
|
93
|
+
* Check if boards cache for a project needs refresh.
|
|
94
|
+
*/
|
|
95
|
+
export function needsBoardsRefresh(project) {
|
|
96
|
+
const cache = readCompletionCache();
|
|
97
|
+
return !isCacheValid(cache.boards?.[project]);
|
|
98
|
+
}
|
|
99
|
+
//# sourceMappingURL=completion-cache.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"completion-cache.js","sourceRoot":"","sources":["../../src/lib/completion-cache.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import type { Config } from './types.js';
|
|
2
|
+
export declare function getConfigDir(): string;
|
|
3
|
+
export declare function getConfigPath(): string;
|
|
4
|
+
export declare function getSecretsPath(): string;
|
|
5
|
+
export declare function isUsingLocalConfig(): boolean;
|
|
6
|
+
export declare function readConfig(): Config;
|
|
7
|
+
export declare function writeConfig(config: Config): void;
|
|
8
|
+
export declare function getProject(cliOption?: string): string | undefined;
|
|
9
|
+
export declare function getToken(): string | undefined;
|
|
10
|
+
export declare function requireProject(cliOption?: string): string;
|
|
11
|
+
export declare function requireToken(): string;
|
|
12
|
+
//# sourceMappingURL=config.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/lib/config.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,MAAM,EAAW,MAAM,YAAY,CAAC;AAuBlD,wBAAgB,YAAY,IAAI,MAAM,CAErC;AAUD,wBAAgB,aAAa,IAAI,MAAM,CAEtC;AAED,wBAAgB,cAAc,IAAI,MAAM,CAEvC;AAED,wBAAgB,kBAAkB,IAAI,OAAO,CAE5C;AAsBD,wBAAgB,UAAU,IAAI,MAAM,CAQnC;AAED,wBAAgB,WAAW,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAwBhD;AAED,wBAAgB,UAAU,CAAC,SAAS,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAMjE;AAED,wBAAgB,QAAQ,IAAI,MAAM,GAAG,SAAS,CAG7C;AAED,wBAAgB,cAAc,CAAC,SAAS,CAAC,EAAE,MAAM,GAAG,MAAM,CAQzD;AAED,wBAAgB,YAAY,IAAI,MAAM,CAMrC"}
|
|
@@ -0,0 +1,111 @@
|
|
|
1
|
+
import { homedir } from 'node:os';
|
|
2
|
+
import { join } from 'node:path';
|
|
3
|
+
import { existsSync, mkdirSync, readFileSync, writeFileSync } from 'node:fs';
|
|
4
|
+
import { deepMerge } from '../utils/objects.js';
|
|
5
|
+
const CONFIG_FILE = 'config.json';
|
|
6
|
+
const SECRETS_FILE = 'secrets.json';
|
|
7
|
+
function getGlobalConfigDir() {
|
|
8
|
+
const home = process.env.KLARO_HOME ?? homedir();
|
|
9
|
+
return join(home, '.klaro');
|
|
10
|
+
}
|
|
11
|
+
function getLocalConfigDir() {
|
|
12
|
+
return join(process.cwd(), '.klaro');
|
|
13
|
+
}
|
|
14
|
+
function findConfigDir() {
|
|
15
|
+
const localDir = getLocalConfigDir();
|
|
16
|
+
if (existsSync(localDir)) {
|
|
17
|
+
return localDir;
|
|
18
|
+
}
|
|
19
|
+
return getGlobalConfigDir();
|
|
20
|
+
}
|
|
21
|
+
export function getConfigDir() {
|
|
22
|
+
return findConfigDir();
|
|
23
|
+
}
|
|
24
|
+
function getConfigFile() {
|
|
25
|
+
return join(getConfigDir(), CONFIG_FILE);
|
|
26
|
+
}
|
|
27
|
+
function getSecretsFile() {
|
|
28
|
+
return join(getConfigDir(), SECRETS_FILE);
|
|
29
|
+
}
|
|
30
|
+
export function getConfigPath() {
|
|
31
|
+
return getConfigFile();
|
|
32
|
+
}
|
|
33
|
+
export function getSecretsPath() {
|
|
34
|
+
return getSecretsFile();
|
|
35
|
+
}
|
|
36
|
+
export function isUsingLocalConfig() {
|
|
37
|
+
return existsSync(getLocalConfigDir());
|
|
38
|
+
}
|
|
39
|
+
function readJsonFile(filePath) {
|
|
40
|
+
if (!existsSync(filePath)) {
|
|
41
|
+
return null;
|
|
42
|
+
}
|
|
43
|
+
try {
|
|
44
|
+
const content = readFileSync(filePath, 'utf-8');
|
|
45
|
+
return JSON.parse(content);
|
|
46
|
+
}
|
|
47
|
+
catch {
|
|
48
|
+
return null;
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
function writeJsonFile(filePath, data) {
|
|
52
|
+
const dir = join(filePath, '..');
|
|
53
|
+
if (!existsSync(dir)) {
|
|
54
|
+
mkdirSync(dir, { recursive: true });
|
|
55
|
+
}
|
|
56
|
+
writeFileSync(filePath, JSON.stringify(data, null, 2), 'utf-8');
|
|
57
|
+
}
|
|
58
|
+
export function readConfig() {
|
|
59
|
+
const configFile = getConfigFile();
|
|
60
|
+
const secretsFile = getSecretsFile();
|
|
61
|
+
const config = readJsonFile(configFile) ?? {};
|
|
62
|
+
const secrets = readJsonFile(secretsFile) ?? {};
|
|
63
|
+
return deepMerge(config, secrets);
|
|
64
|
+
}
|
|
65
|
+
export function writeConfig(config) {
|
|
66
|
+
const configDir = getConfigDir();
|
|
67
|
+
const configFile = join(configDir, CONFIG_FILE);
|
|
68
|
+
const secretsFile = join(configDir, SECRETS_FILE);
|
|
69
|
+
// Split config into public and secret parts
|
|
70
|
+
const { token, ...publicConfig } = config;
|
|
71
|
+
const secrets = {};
|
|
72
|
+
if (token !== undefined) {
|
|
73
|
+
secrets.token = token;
|
|
74
|
+
}
|
|
75
|
+
// Ensure directory exists
|
|
76
|
+
if (!existsSync(configDir)) {
|
|
77
|
+
mkdirSync(configDir, { recursive: true });
|
|
78
|
+
}
|
|
79
|
+
// Write public config
|
|
80
|
+
writeJsonFile(configFile, publicConfig);
|
|
81
|
+
// Write secrets (only if there are secrets to write, or file already exists)
|
|
82
|
+
if (Object.keys(secrets).length > 0 || existsSync(secretsFile)) {
|
|
83
|
+
writeJsonFile(secretsFile, secrets);
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
export function getProject(cliOption) {
|
|
87
|
+
if (cliOption) {
|
|
88
|
+
return cliOption;
|
|
89
|
+
}
|
|
90
|
+
const config = readConfig();
|
|
91
|
+
return config.project;
|
|
92
|
+
}
|
|
93
|
+
export function getToken() {
|
|
94
|
+
const config = readConfig();
|
|
95
|
+
return config.token;
|
|
96
|
+
}
|
|
97
|
+
export function requireProject(cliOption) {
|
|
98
|
+
const project = getProject(cliOption);
|
|
99
|
+
if (!project) {
|
|
100
|
+
throw new Error('No project specified. Use -p/--project option or run "klaro use <subdomain>" to set a default project.');
|
|
101
|
+
}
|
|
102
|
+
return project;
|
|
103
|
+
}
|
|
104
|
+
export function requireToken() {
|
|
105
|
+
const token = getToken();
|
|
106
|
+
if (!token) {
|
|
107
|
+
throw new Error('Not logged in. Run "klaro login" first.');
|
|
108
|
+
}
|
|
109
|
+
return token;
|
|
110
|
+
}
|
|
111
|
+
//# sourceMappingURL=config.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/lib/config.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import type { Story, CreateStoryInput, ListStoriesOptions, UpdateStoryInput, Project, Board, Dimension } from './types.js';
|
|
2
|
+
/**
|
|
3
|
+
* Abstract interface for data operations.
|
|
4
|
+
* Implementations can use the Klaro API or local filesystem.
|
|
5
|
+
*/
|
|
6
|
+
export interface Connector {
|
|
7
|
+
listStories(boardId: string, options?: ListStoriesOptions): Promise<Story[]>;
|
|
8
|
+
getStories(boardId: string, identifiers: number[]): Promise<Story[]>;
|
|
9
|
+
createStory(boardId: string, input: CreateStoryInput): Promise<Story>;
|
|
10
|
+
updateStories(boardId: string, updates: UpdateStoryInput[]): Promise<Story[]>;
|
|
11
|
+
deleteStories(boardId: string, identifiers: number[]): Promise<void>;
|
|
12
|
+
listProjects(): Promise<Project[]>;
|
|
13
|
+
listBoards(): Promise<Board[]>;
|
|
14
|
+
getBoard(boardId: string): Promise<Board>;
|
|
15
|
+
listDimensions(): Promise<Dimension[]>;
|
|
16
|
+
}
|
|
17
|
+
//# sourceMappingURL=connector.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"connector.d.ts","sourceRoot":"","sources":["../../src/lib/connector.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAE,gBAAgB,EAAE,kBAAkB,EAAE,gBAAgB,EAAE,OAAO,EAAE,KAAK,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAE3H;;;GAGG;AACH,MAAM,WAAW,SAAS;IAExB,WAAW,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,kBAAkB,GAAG,OAAO,CAAC,KAAK,EAAE,CAAC,CAAC;IAC7E,UAAU,CAAC,OAAO,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,KAAK,EAAE,CAAC,CAAC;IACrE,WAAW,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,gBAAgB,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC;IACtE,aAAa,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,gBAAgB,EAAE,GAAG,OAAO,CAAC,KAAK,EAAE,CAAC,CAAC;IAC9E,aAAa,CAAC,OAAO,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAGrE,YAAY,IAAI,OAAO,CAAC,OAAO,EAAE,CAAC,CAAC;IAGnC,UAAU,IAAI,OAAO,CAAC,KAAK,EAAE,CAAC,CAAC;IAC/B,QAAQ,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC;IAG1C,cAAc,IAAI,OAAO,CAAC,SAAS,EAAE,CAAC,CAAC;CACxC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"connector.js","sourceRoot":"","sources":["../../src/lib/connector.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import type { ProjectDefaults } from './types.js';
|
|
2
|
+
export declare function getProjectDefaults(project: string): ProjectDefaults;
|
|
3
|
+
export declare function setProjectDefault(project: string, key: keyof ProjectDefaults, value: string): void;
|
|
4
|
+
export declare function unsetProjectDefault(project: string, key: keyof ProjectDefaults): void;
|
|
5
|
+
export declare function resolveOption<K extends keyof ProjectDefaults>(cliValue: ProjectDefaults[K] | undefined, projectDefaults: ProjectDefaults, key: K): NonNullable<ProjectDefaults[K]>;
|
|
6
|
+
export declare function resolveBoard(cliValue: string | undefined, project: string): string;
|
|
7
|
+
export declare function resolveDims(cliValue: string | undefined, project: string): string | undefined;
|
|
8
|
+
export declare function listProjectDefaults(project: string): ProjectDefaults;
|
|
9
|
+
//# sourceMappingURL=defaults.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"defaults.d.ts","sourceRoot":"","sources":["../../src/lib/defaults.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAMlD,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,MAAM,GAAG,eAAe,CAGnE;AAED,wBAAgB,iBAAiB,CAC/B,OAAO,EAAE,MAAM,EACf,GAAG,EAAE,MAAM,eAAe,EAC1B,KAAK,EAAE,MAAM,GACZ,IAAI,CAUN;AAED,wBAAgB,mBAAmB,CACjC,OAAO,EAAE,MAAM,EACf,GAAG,EAAE,MAAM,eAAe,GACzB,IAAI,CAYN;AAED,wBAAgB,aAAa,CAAC,CAAC,SAAS,MAAM,eAAe,EAC3D,QAAQ,EAAE,eAAe,CAAC,CAAC,CAAC,GAAG,SAAS,EACxC,eAAe,EAAE,eAAe,EAChC,GAAG,EAAE,CAAC,GACL,WAAW,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC,CASjC;AAED,wBAAgB,YAAY,CAC1B,QAAQ,EAAE,MAAM,GAAG,SAAS,EAC5B,OAAO,EAAE,MAAM,GACd,MAAM,CAGR;AAED,wBAAgB,WAAW,CACzB,QAAQ,EAAE,MAAM,GAAG,SAAS,EAC5B,OAAO,EAAE,MAAM,GACd,MAAM,GAAG,SAAS,CAMpB;AAED,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,MAAM,GAAG,eAAe,CAGpE"}
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
import { readConfig, writeConfig } from './config.js';
|
|
2
|
+
const HARDCODED_DEFAULTS = {
|
|
3
|
+
board: 'all',
|
|
4
|
+
};
|
|
5
|
+
export function getProjectDefaults(project) {
|
|
6
|
+
const config = readConfig();
|
|
7
|
+
return config.projectDefaults?.[project] ?? {};
|
|
8
|
+
}
|
|
9
|
+
export function setProjectDefault(project, key, value) {
|
|
10
|
+
const config = readConfig();
|
|
11
|
+
if (!config.projectDefaults) {
|
|
12
|
+
config.projectDefaults = {};
|
|
13
|
+
}
|
|
14
|
+
if (!config.projectDefaults[project]) {
|
|
15
|
+
config.projectDefaults[project] = {};
|
|
16
|
+
}
|
|
17
|
+
config.projectDefaults[project][key] = value;
|
|
18
|
+
writeConfig(config);
|
|
19
|
+
}
|
|
20
|
+
export function unsetProjectDefault(project, key) {
|
|
21
|
+
const config = readConfig();
|
|
22
|
+
if (config.projectDefaults?.[project]?.[key] !== undefined) {
|
|
23
|
+
delete config.projectDefaults[project][key];
|
|
24
|
+
if (Object.keys(config.projectDefaults[project]).length === 0) {
|
|
25
|
+
delete config.projectDefaults[project];
|
|
26
|
+
}
|
|
27
|
+
if (Object.keys(config.projectDefaults).length === 0) {
|
|
28
|
+
delete config.projectDefaults;
|
|
29
|
+
}
|
|
30
|
+
writeConfig(config);
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
export function resolveOption(cliValue, projectDefaults, key) {
|
|
34
|
+
if (cliValue !== undefined) {
|
|
35
|
+
return cliValue;
|
|
36
|
+
}
|
|
37
|
+
const projectValue = projectDefaults[key];
|
|
38
|
+
if (projectValue !== undefined) {
|
|
39
|
+
return projectValue;
|
|
40
|
+
}
|
|
41
|
+
return HARDCODED_DEFAULTS[key];
|
|
42
|
+
}
|
|
43
|
+
export function resolveBoard(cliValue, project) {
|
|
44
|
+
const defaults = getProjectDefaults(project);
|
|
45
|
+
return resolveOption(cliValue, defaults, 'board');
|
|
46
|
+
}
|
|
47
|
+
export function resolveDims(cliValue, project) {
|
|
48
|
+
if (cliValue !== undefined) {
|
|
49
|
+
return cliValue;
|
|
50
|
+
}
|
|
51
|
+
const defaults = getProjectDefaults(project);
|
|
52
|
+
return defaults.dims;
|
|
53
|
+
}
|
|
54
|
+
export function listProjectDefaults(project) {
|
|
55
|
+
const projectDefaults = getProjectDefaults(project);
|
|
56
|
+
return { ...HARDCODED_DEFAULTS, ...projectDefaults };
|
|
57
|
+
}
|
|
58
|
+
//# sourceMappingURL=defaults.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"defaults.js","sourceRoot":"","sources":["../../src/lib/defaults.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAGtD,MAAM,kBAAkB,GAAoB;IAC1C,KAAK,EAAE,KAAK;CACb,CAAC;AAEF,MAAM,UAAU,kBAAkB,CAAC,OAAe;IAChD,MAAM,MAAM,GAAG,UAAU,EAAE,CAAC;IAC5B,OAAO,MAAM,CAAC,eAAe,EAAE,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC;AACjD,CAAC;AAED,MAAM,UAAU,iBAAiB,CAC/B,OAAe,EACf,GAA0B,EAC1B,KAAa;IAEb,MAAM,MAAM,GAAG,UAAU,EAAE,CAAC;IAC5B,IAAI,CAAC,MAAM,CAAC,eAAe,EAAE,CAAC;QAC5B,MAAM,CAAC,eAAe,GAAG,EAAE,CAAC;IAC9B,CAAC;IACD,IAAI,CAAC,MAAM,CAAC,eAAe,CAAC,OAAO,CAAC,EAAE,CAAC;QACrC,MAAM,CAAC,eAAe,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC;IACvC,CAAC;IACD,MAAM,CAAC,eAAe,CAAC,OAAO,CAAC,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC;IAC7C,WAAW,CAAC,MAAM,CAAC,CAAC;AACtB,CAAC;AAED,MAAM,UAAU,mBAAmB,CACjC,OAAe,EACf,GAA0B;IAE1B,MAAM,MAAM,GAAG,UAAU,EAAE,CAAC;IAC5B,IAAI,MAAM,CAAC,eAAe,EAAE,CAAC,OAAO,CAAC,EAAE,CAAC,GAAG,CAAC,KAAK,SAAS,EAAE,CAAC;QAC3D,OAAO,MAAM,CAAC,eAAe,CAAC,OAAO,CAAC,CAAC,GAAG,CAAC,CAAC;QAC5C,IAAI,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,eAAe,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC9D,OAAO,MAAM,CAAC,eAAe,CAAC,OAAO,CAAC,CAAC;QACzC,CAAC;QACD,IAAI,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,eAAe,CAAC,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACrD,OAAO,MAAM,CAAC,eAAe,CAAC;QAChC,CAAC;QACD,WAAW,CAAC,MAAM,CAAC,CAAC;IACtB,CAAC;AACH,CAAC;AAED,MAAM,UAAU,aAAa,CAC3B,QAAwC,EACxC,eAAgC,EAChC,GAAM;IAEN,IAAI,QAAQ,KAAK,SAAS,EAAE,CAAC;QAC3B,OAAO,QAA2C,CAAC;IACrD,CAAC;IACD,MAAM,YAAY,GAAG,eAAe,CAAC,GAAG,CAAC,CAAC;IAC1C,IAAI,YAAY,KAAK,SAAS,EAAE,CAAC;QAC/B,OAAO,YAA+C,CAAC;IACzD,CAAC;IACD,OAAO,kBAAkB,CAAC,GAAG,CAAoC,CAAC;AACpE,CAAC;AAED,MAAM,UAAU,YAAY,CAC1B,QAA4B,EAC5B,OAAe;IAEf,MAAM,QAAQ,GAAG,kBAAkB,CAAC,OAAO,CAAC,CAAC;IAC7C,OAAO,aAAa,CAAC,QAAQ,EAAE,QAAQ,EAAE,OAAO,CAAC,CAAC;AACpD,CAAC;AAED,MAAM,UAAU,WAAW,CACzB,QAA4B,EAC5B,OAAe;IAEf,IAAI,QAAQ,KAAK,SAAS,EAAE,CAAC;QAC3B,OAAO,QAAQ,CAAC;IAClB,CAAC;IACD,MAAM,QAAQ,GAAG,kBAAkB,CAAC,OAAO,CAAC,CAAC;IAC7C,OAAO,QAAQ,CAAC,IAAI,CAAC;AACvB,CAAC;AAED,MAAM,UAAU,mBAAmB,CAAC,OAAe;IACjD,MAAM,eAAe,GAAG,kBAAkB,CAAC,OAAO,CAAC,CAAC;IACpD,OAAO,EAAE,GAAG,kBAAkB,EAAE,GAAG,eAAe,EAAE,CAAC;AACvD,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"trace.d.ts","sourceRoot":"","sources":["../../src/lib/trace.ts"],"names":[],"mappings":"AAEA,wBAAgB,QAAQ,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAE/C;AAED,wBAAgB,cAAc,IAAI,OAAO,CAExC;AAED,wBAAgB,KAAK,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,GAAG,IAAI,CAIxD"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
let traceEnabled = false;
|
|
2
|
+
export function setTrace(enabled) {
|
|
3
|
+
traceEnabled = enabled;
|
|
4
|
+
}
|
|
5
|
+
export function isTraceEnabled() {
|
|
6
|
+
return traceEnabled;
|
|
7
|
+
}
|
|
8
|
+
export function trace(label, data) {
|
|
9
|
+
if (traceEnabled) {
|
|
10
|
+
console.error(`[TRACE] ${label}:`, JSON.stringify(data, null, 2));
|
|
11
|
+
}
|
|
12
|
+
}
|
|
13
|
+
//# sourceMappingURL=trace.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"trace.js","sourceRoot":"","sources":["../../src/lib/trace.ts"],"names":[],"mappings":"AAAA,IAAI,YAAY,GAAG,KAAK,CAAC;AAEzB,MAAM,UAAU,QAAQ,CAAC,OAAgB;IACvC,YAAY,GAAG,OAAO,CAAC;AACzB,CAAC;AAED,MAAM,UAAU,cAAc;IAC5B,OAAO,YAAY,CAAC;AACtB,CAAC;AAED,MAAM,UAAU,KAAK,CAAC,KAAa,EAAE,IAAa;IAChD,IAAI,YAAY,EAAE,CAAC;QACjB,OAAO,CAAC,KAAK,CAAC,WAAW,KAAK,GAAG,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;IACpE,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
export interface ProjectDefaults {
|
|
2
|
+
board?: string;
|
|
3
|
+
dims?: string;
|
|
4
|
+
}
|
|
5
|
+
export interface Secrets {
|
|
6
|
+
token?: string;
|
|
7
|
+
}
|
|
8
|
+
export interface Config {
|
|
9
|
+
token?: string;
|
|
10
|
+
project?: string;
|
|
11
|
+
email?: string;
|
|
12
|
+
projectDefaults?: Record<string, ProjectDefaults>;
|
|
13
|
+
}
|
|
14
|
+
export interface AuthToken {
|
|
15
|
+
token_type: string;
|
|
16
|
+
access_token: string;
|
|
17
|
+
expires_in: number;
|
|
18
|
+
}
|
|
19
|
+
export interface Story {
|
|
20
|
+
id: number;
|
|
21
|
+
identifier: string;
|
|
22
|
+
title: string;
|
|
23
|
+
specification?: string;
|
|
24
|
+
createdAt: string;
|
|
25
|
+
updatedAt: string;
|
|
26
|
+
[key: string]: unknown;
|
|
27
|
+
}
|
|
28
|
+
export interface Board {
|
|
29
|
+
id: number;
|
|
30
|
+
identifier: string;
|
|
31
|
+
label: string;
|
|
32
|
+
location?: string;
|
|
33
|
+
filters?: Record<string, string[]>;
|
|
34
|
+
[key: string]: unknown;
|
|
35
|
+
}
|
|
36
|
+
export interface Project {
|
|
37
|
+
id: number;
|
|
38
|
+
subdomain: string;
|
|
39
|
+
label: string;
|
|
40
|
+
[key: string]: unknown;
|
|
41
|
+
}
|
|
42
|
+
export interface ApiError {
|
|
43
|
+
status: number;
|
|
44
|
+
message: string;
|
|
45
|
+
code?: string;
|
|
46
|
+
}
|
|
47
|
+
export interface CreateStoryInput {
|
|
48
|
+
title: string;
|
|
49
|
+
specification?: string;
|
|
50
|
+
[key: string]: string | undefined;
|
|
51
|
+
}
|
|
52
|
+
export interface ListStoriesOptions {
|
|
53
|
+
limit?: number;
|
|
54
|
+
filters?: Record<string, string>;
|
|
55
|
+
}
|
|
56
|
+
export interface UpdateStoryInput {
|
|
57
|
+
identifier: number;
|
|
58
|
+
[key: string]: string | number | undefined;
|
|
59
|
+
}
|
|
60
|
+
export interface Dimension {
|
|
61
|
+
code: string;
|
|
62
|
+
label?: string;
|
|
63
|
+
datatype: string;
|
|
64
|
+
values?: Array<{
|
|
65
|
+
id: number | null;
|
|
66
|
+
label?: string;
|
|
67
|
+
}>;
|
|
68
|
+
[key: string]: unknown;
|
|
69
|
+
}
|
|
70
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/lib/types.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,eAAe;IAC9B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,OAAO;IACtB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,MAAM;IACrB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,eAAe,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,eAAe,CAAC,CAAC;CACnD;AAED,MAAM,WAAW,SAAS;IACxB,UAAU,EAAE,MAAM,CAAC;IACnB,YAAY,EAAE,MAAM,CAAC;IACrB,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,KAAK;IACpB,EAAE,EAAE,MAAM,CAAC;IACX,UAAU,EAAE,MAAM,CAAC;IACnB,KAAK,EAAE,MAAM,CAAC;IACd,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CACxB;AAED,MAAM,WAAW,KAAK;IACpB,EAAE,EAAE,MAAM,CAAC;IACX,UAAU,EAAE,MAAM,CAAC;IACnB,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC;IACnC,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CACxB;AAED,MAAM,WAAW,OAAO;IACtB,EAAE,EAAE,MAAM,CAAC;IACX,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,MAAM,CAAC;IACd,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CACxB;AAED,MAAM,WAAW,QAAQ;IACvB,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,gBAAgB;IAC/B,KAAK,EAAE,MAAM,CAAC;IACd,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAAC;CACnC;AAED,MAAM,WAAW,kBAAkB;IACjC,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CAClC;AAED,MAAM,WAAW,gBAAgB;IAC/B,UAAU,EAAE,MAAM,CAAC;IACnB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,MAAM,GAAG,SAAS,CAAC;CAC5C;AAED,MAAM,WAAW,SAAS;IACxB,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,CAAC,EAAE,KAAK,CAAC;QAAE,EAAE,EAAE,MAAM,GAAG,IAAI,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IACtD,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CACxB"}
|