paean 0.1.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/LICENSE +21 -0
- package/README.md +296 -0
- package/dist/api/auth.d.ts +71 -0
- package/dist/api/auth.d.ts.map +1 -0
- package/dist/api/auth.js +257 -0
- package/dist/api/auth.js.map +1 -0
- package/dist/api/client.d.ts +37 -0
- package/dist/api/client.d.ts.map +1 -0
- package/dist/api/client.js +101 -0
- package/dist/api/client.js.map +1 -0
- package/dist/api/todo.d.ts +167 -0
- package/dist/api/todo.d.ts.map +1 -0
- package/dist/api/todo.js +137 -0
- package/dist/api/todo.js.map +1 -0
- package/dist/cli.d.ts +7 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +36 -0
- package/dist/cli.js.map +1 -0
- package/dist/commands/context.d.ts +7 -0
- package/dist/commands/context.d.ts.map +1 -0
- package/dist/commands/context.js +155 -0
- package/dist/commands/context.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 +108 -0
- package/dist/commands/login.js.map +1 -0
- package/dist/commands/logout.d.ts +7 -0
- package/dist/commands/logout.d.ts.map +1 -0
- package/dist/commands/logout.js +27 -0
- package/dist/commands/logout.js.map +1 -0
- package/dist/commands/serve.d.ts +7 -0
- package/dist/commands/serve.d.ts.map +1 -0
- package/dist/commands/serve.js +29 -0
- package/dist/commands/serve.js.map +1 -0
- package/dist/commands/tasks.d.ts +7 -0
- package/dist/commands/tasks.d.ts.map +1 -0
- package/dist/commands/tasks.js +276 -0
- package/dist/commands/tasks.js.map +1 -0
- package/dist/commands/validate.d.ts +7 -0
- package/dist/commands/validate.d.ts.map +1 -0
- package/dist/commands/validate.js +123 -0
- package/dist/commands/validate.js.map +1 -0
- package/dist/index.d.ts +13 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +19 -0
- package/dist/index.js.map +1 -0
- package/dist/mcp/resources.d.ts +14 -0
- package/dist/mcp/resources.d.ts.map +1 -0
- package/dist/mcp/resources.js +166 -0
- package/dist/mcp/resources.js.map +1 -0
- package/dist/mcp/server.d.ts +12 -0
- package/dist/mcp/server.d.ts.map +1 -0
- package/dist/mcp/server.js +82 -0
- package/dist/mcp/server.js.map +1 -0
- package/dist/mcp/tools.d.ts +14 -0
- package/dist/mcp/tools.d.ts.map +1 -0
- package/dist/mcp/tools.js +341 -0
- package/dist/mcp/tools.js.map +1 -0
- package/dist/utils/config.d.ts +69 -0
- package/dist/utils/config.d.ts.map +1 -0
- package/dist/utils/config.js +129 -0
- package/dist/utils/config.js.map +1 -0
- package/dist/utils/output.d.ts +79 -0
- package/dist/utils/output.d.ts.map +1 -0
- package/dist/utils/output.js +157 -0
- package/dist/utils/output.js.map +1 -0
- package/dist/utils/project.d.ts +29 -0
- package/dist/utils/project.d.ts.map +1 -0
- package/dist/utils/project.js +135 -0
- package/dist/utils/project.js.map +1 -0
- package/package.json +72 -0
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Configuration management for Paean CLI
|
|
3
|
+
* Stores authentication tokens and user preferences in ~/.paean/config.json
|
|
4
|
+
*/
|
|
5
|
+
export interface PaeanConfig {
|
|
6
|
+
token?: string;
|
|
7
|
+
refreshToken?: string;
|
|
8
|
+
userId?: number;
|
|
9
|
+
email?: string;
|
|
10
|
+
expiresAt?: string;
|
|
11
|
+
apiUrl?: string;
|
|
12
|
+
webUrl?: string;
|
|
13
|
+
defaultPriority?: 'high' | 'medium' | 'low';
|
|
14
|
+
outputFormat?: 'table' | 'json' | 'minimal';
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* Get the full configuration
|
|
18
|
+
*/
|
|
19
|
+
export declare function getConfig(): PaeanConfig;
|
|
20
|
+
/**
|
|
21
|
+
* Get a specific config value
|
|
22
|
+
*/
|
|
23
|
+
export declare function getConfigValue<K extends keyof PaeanConfig>(key: K): PaeanConfig[K];
|
|
24
|
+
/**
|
|
25
|
+
* Set a specific config value
|
|
26
|
+
*/
|
|
27
|
+
export declare function setConfigValue<K extends keyof PaeanConfig>(key: K, value: PaeanConfig[K]): void;
|
|
28
|
+
/**
|
|
29
|
+
* Set multiple config values at once
|
|
30
|
+
*/
|
|
31
|
+
export declare function setConfig(values: Partial<PaeanConfig>): void;
|
|
32
|
+
/**
|
|
33
|
+
* Check if user is authenticated
|
|
34
|
+
*/
|
|
35
|
+
export declare function isAuthenticated(): boolean;
|
|
36
|
+
/**
|
|
37
|
+
* Get the authentication token
|
|
38
|
+
*/
|
|
39
|
+
export declare function getToken(): string | undefined;
|
|
40
|
+
/**
|
|
41
|
+
* Get the API URL
|
|
42
|
+
*/
|
|
43
|
+
export declare function getApiUrl(): string;
|
|
44
|
+
/**
|
|
45
|
+
* Get the Web URL
|
|
46
|
+
*/
|
|
47
|
+
export declare function getWebUrl(): string;
|
|
48
|
+
/**
|
|
49
|
+
* Store authentication data
|
|
50
|
+
*/
|
|
51
|
+
export declare function storeAuth(data: {
|
|
52
|
+
token: string;
|
|
53
|
+
userId?: number;
|
|
54
|
+
email?: string;
|
|
55
|
+
expiresAt?: string;
|
|
56
|
+
}): void;
|
|
57
|
+
/**
|
|
58
|
+
* Clear authentication data (logout)
|
|
59
|
+
*/
|
|
60
|
+
export declare function clearAuth(): void;
|
|
61
|
+
/**
|
|
62
|
+
* Get the config file path
|
|
63
|
+
*/
|
|
64
|
+
export declare function getConfigPath(): string;
|
|
65
|
+
/**
|
|
66
|
+
* Reset config to defaults
|
|
67
|
+
*/
|
|
68
|
+
export declare function resetConfig(): void;
|
|
69
|
+
//# sourceMappingURL=config.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/utils/config.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAMH,MAAM,WAAW,WAAW;IAE1B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,SAAS,CAAC,EAAE,MAAM,CAAC;IAGnB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,MAAM,CAAC;IAGhB,eAAe,CAAC,EAAE,MAAM,GAAG,QAAQ,GAAG,KAAK,CAAC;IAC5C,YAAY,CAAC,EAAE,OAAO,GAAG,MAAM,GAAG,SAAS,CAAC;CAC7C;AA2BD;;GAEG;AACH,wBAAgB,SAAS,IAAI,WAAW,CAEvC;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,CAAC,SAAS,MAAM,WAAW,EAAE,GAAG,EAAE,CAAC,GAAG,WAAW,CAAC,CAAC,CAAC,CAElF;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,CAAC,SAAS,MAAM,WAAW,EAAE,GAAG,EAAE,CAAC,EAAE,KAAK,EAAE,WAAW,CAAC,CAAC,CAAC,GAAG,IAAI,CAE/F;AAED;;GAEG;AACH,wBAAgB,SAAS,CAAC,MAAM,EAAE,OAAO,CAAC,WAAW,CAAC,GAAG,IAAI,CAM5D;AAED;;GAEG;AACH,wBAAgB,eAAe,IAAI,OAAO,CAiBzC;AAED;;GAEG;AACH,wBAAgB,QAAQ,IAAI,MAAM,GAAG,SAAS,CAE7C;AAED;;GAEG;AACH,wBAAgB,SAAS,IAAI,MAAM,CAElC;AAED;;GAEG;AACH,wBAAgB,SAAS,IAAI,MAAM,CAElC;AAED;;GAEG;AACH,wBAAgB,SAAS,CAAC,IAAI,EAAE;IAC9B,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB,GAAG,IAAI,CAOP;AAED;;GAEG;AACH,wBAAgB,SAAS,IAAI,IAAI,CAMhC;AAED;;GAEG;AACH,wBAAgB,aAAa,IAAI,MAAM,CAEtC;AAED;;GAEG;AACH,wBAAgB,WAAW,IAAI,IAAI,CAElC"}
|
|
@@ -0,0 +1,129 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Configuration management for Paean CLI
|
|
3
|
+
* Stores authentication tokens and user preferences in ~/.paean/config.json
|
|
4
|
+
*/
|
|
5
|
+
import Conf from 'conf';
|
|
6
|
+
import { homedir } from 'os';
|
|
7
|
+
import { join } from 'path';
|
|
8
|
+
const CONFIG_DEFAULTS = {
|
|
9
|
+
apiUrl: 'https://api.paean.ai',
|
|
10
|
+
webUrl: 'https://m.paean.ai',
|
|
11
|
+
defaultPriority: 'medium',
|
|
12
|
+
outputFormat: 'table',
|
|
13
|
+
};
|
|
14
|
+
// Store config in ~/.paean directory
|
|
15
|
+
const config = new Conf({
|
|
16
|
+
projectName: 'paean',
|
|
17
|
+
cwd: join(homedir(), '.paean'),
|
|
18
|
+
defaults: CONFIG_DEFAULTS,
|
|
19
|
+
schema: {
|
|
20
|
+
token: { type: 'string' },
|
|
21
|
+
refreshToken: { type: 'string' },
|
|
22
|
+
userId: { type: 'number' },
|
|
23
|
+
email: { type: 'string' },
|
|
24
|
+
expiresAt: { type: 'string' },
|
|
25
|
+
apiUrl: { type: 'string' },
|
|
26
|
+
webUrl: { type: 'string' },
|
|
27
|
+
defaultPriority: { type: 'string', enum: ['high', 'medium', 'low'] },
|
|
28
|
+
outputFormat: { type: 'string', enum: ['table', 'json', 'minimal'] },
|
|
29
|
+
},
|
|
30
|
+
});
|
|
31
|
+
/**
|
|
32
|
+
* Get the full configuration
|
|
33
|
+
*/
|
|
34
|
+
export function getConfig() {
|
|
35
|
+
return config.store;
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* Get a specific config value
|
|
39
|
+
*/
|
|
40
|
+
export function getConfigValue(key) {
|
|
41
|
+
return config.get(key);
|
|
42
|
+
}
|
|
43
|
+
/**
|
|
44
|
+
* Set a specific config value
|
|
45
|
+
*/
|
|
46
|
+
export function setConfigValue(key, value) {
|
|
47
|
+
config.set(key, value);
|
|
48
|
+
}
|
|
49
|
+
/**
|
|
50
|
+
* Set multiple config values at once
|
|
51
|
+
*/
|
|
52
|
+
export function setConfig(values) {
|
|
53
|
+
for (const [key, value] of Object.entries(values)) {
|
|
54
|
+
if (value !== undefined) {
|
|
55
|
+
config.set(key, value);
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
/**
|
|
60
|
+
* Check if user is authenticated
|
|
61
|
+
*/
|
|
62
|
+
export function isAuthenticated() {
|
|
63
|
+
const token = config.get('token');
|
|
64
|
+
const expiresAt = config.get('expiresAt');
|
|
65
|
+
if (!token)
|
|
66
|
+
return false;
|
|
67
|
+
// Check if token is expired (with 5 minute buffer)
|
|
68
|
+
if (expiresAt) {
|
|
69
|
+
const expiry = new Date(expiresAt).getTime();
|
|
70
|
+
const now = Date.now();
|
|
71
|
+
const buffer = 5 * 60 * 1000; // 5 minutes
|
|
72
|
+
if (expiry - buffer < now) {
|
|
73
|
+
return false;
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
return true;
|
|
77
|
+
}
|
|
78
|
+
/**
|
|
79
|
+
* Get the authentication token
|
|
80
|
+
*/
|
|
81
|
+
export function getToken() {
|
|
82
|
+
return config.get('token');
|
|
83
|
+
}
|
|
84
|
+
/**
|
|
85
|
+
* Get the API URL
|
|
86
|
+
*/
|
|
87
|
+
export function getApiUrl() {
|
|
88
|
+
return config.get('apiUrl') || CONFIG_DEFAULTS.apiUrl;
|
|
89
|
+
}
|
|
90
|
+
/**
|
|
91
|
+
* Get the Web URL
|
|
92
|
+
*/
|
|
93
|
+
export function getWebUrl() {
|
|
94
|
+
return config.get('webUrl') || CONFIG_DEFAULTS.webUrl;
|
|
95
|
+
}
|
|
96
|
+
/**
|
|
97
|
+
* Store authentication data
|
|
98
|
+
*/
|
|
99
|
+
export function storeAuth(data) {
|
|
100
|
+
setConfig({
|
|
101
|
+
token: data.token,
|
|
102
|
+
userId: data.userId,
|
|
103
|
+
email: data.email,
|
|
104
|
+
expiresAt: data.expiresAt,
|
|
105
|
+
});
|
|
106
|
+
}
|
|
107
|
+
/**
|
|
108
|
+
* Clear authentication data (logout)
|
|
109
|
+
*/
|
|
110
|
+
export function clearAuth() {
|
|
111
|
+
config.delete('token');
|
|
112
|
+
config.delete('refreshToken');
|
|
113
|
+
config.delete('userId');
|
|
114
|
+
config.delete('email');
|
|
115
|
+
config.delete('expiresAt');
|
|
116
|
+
}
|
|
117
|
+
/**
|
|
118
|
+
* Get the config file path
|
|
119
|
+
*/
|
|
120
|
+
export function getConfigPath() {
|
|
121
|
+
return config.path;
|
|
122
|
+
}
|
|
123
|
+
/**
|
|
124
|
+
* Reset config to defaults
|
|
125
|
+
*/
|
|
126
|
+
export function resetConfig() {
|
|
127
|
+
config.clear();
|
|
128
|
+
}
|
|
129
|
+
//# sourceMappingURL=config.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/utils/config.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,EAAE,OAAO,EAAE,MAAM,IAAI,CAAC;AAC7B,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAmB5B,MAAM,eAAe,GAAgB;IACnC,MAAM,EAAE,sBAAsB;IAC9B,MAAM,EAAE,oBAAoB;IAC5B,eAAe,EAAE,QAAQ;IACzB,YAAY,EAAE,OAAO;CACtB,CAAC;AAEF,qCAAqC;AACrC,MAAM,MAAM,GAAG,IAAI,IAAI,CAAc;IACnC,WAAW,EAAE,OAAO;IACpB,GAAG,EAAE,IAAI,CAAC,OAAO,EAAE,EAAE,QAAQ,CAAC;IAC9B,QAAQ,EAAE,eAAe;IACzB,MAAM,EAAE;QACN,KAAK,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;QACzB,YAAY,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;QAChC,MAAM,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;QAC1B,KAAK,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;QACzB,SAAS,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;QAC7B,MAAM,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;QAC1B,MAAM,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;QAC1B,eAAe,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,MAAM,EAAE,QAAQ,EAAE,KAAK,CAAC,EAAE;QACpE,YAAY,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,SAAS,CAAC,EAAE;KACrE;CACF,CAAC,CAAC;AAEH;;GAEG;AACH,MAAM,UAAU,SAAS;IACvB,OAAO,MAAM,CAAC,KAAK,CAAC;AACtB,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,cAAc,CAA8B,GAAM;IAChE,OAAO,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;AACzB,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,cAAc,CAA8B,GAAM,EAAE,KAAqB;IACvF,MAAM,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;AACzB,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,SAAS,CAAC,MAA4B;IACpD,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;QAClD,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;YACxB,MAAM,CAAC,GAAG,CAAC,GAAwB,EAAE,KAAK,CAAC,CAAC;QAC9C,CAAC;IACH,CAAC;AACH,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,eAAe;IAC7B,MAAM,KAAK,GAAG,MAAM,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;IAClC,MAAM,SAAS,GAAG,MAAM,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;IAE1C,IAAI,CAAC,KAAK;QAAE,OAAO,KAAK,CAAC;IAEzB,mDAAmD;IACnD,IAAI,SAAS,EAAE,CAAC;QACd,MAAM,MAAM,GAAG,IAAI,IAAI,CAAC,SAAS,CAAC,CAAC,OAAO,EAAE,CAAC;QAC7C,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QACvB,MAAM,MAAM,GAAG,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,CAAC,YAAY;QAC1C,IAAI,MAAM,GAAG,MAAM,GAAG,GAAG,EAAE,CAAC;YAC1B,OAAO,KAAK,CAAC;QACf,CAAC;IACH,CAAC;IAED,OAAO,IAAI,CAAC;AACd,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,QAAQ;IACtB,OAAO,MAAM,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;AAC7B,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,SAAS;IACvB,OAAO,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC,IAAI,eAAe,CAAC,MAAO,CAAC;AACzD,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,SAAS;IACvB,OAAO,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC,IAAI,eAAe,CAAC,MAAO,CAAC;AACzD,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,SAAS,CAAC,IAKzB;IACC,SAAS,CAAC;QACR,KAAK,EAAE,IAAI,CAAC,KAAK;QACjB,MAAM,EAAE,IAAI,CAAC,MAAM;QACnB,KAAK,EAAE,IAAI,CAAC,KAAK;QACjB,SAAS,EAAE,IAAI,CAAC,SAAS;KAC1B,CAAC,CAAC;AACL,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,SAAS;IACvB,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;IACvB,MAAM,CAAC,MAAM,CAAC,cAAc,CAAC,CAAC;IAC9B,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;IACxB,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;IACvB,MAAM,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC;AAC7B,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,aAAa;IAC3B,OAAO,MAAM,CAAC,IAAI,CAAC;AACrB,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,WAAW;IACzB,MAAM,CAAC,KAAK,EAAE,CAAC;AACjB,CAAC"}
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* CLI output utilities
|
|
3
|
+
* Provides consistent formatting for CLI output
|
|
4
|
+
*/
|
|
5
|
+
import { type Ora } from 'ora';
|
|
6
|
+
export declare const colors: {
|
|
7
|
+
primary: import("chalk").ChalkInstance;
|
|
8
|
+
success: import("chalk").ChalkInstance;
|
|
9
|
+
warning: import("chalk").ChalkInstance;
|
|
10
|
+
error: import("chalk").ChalkInstance;
|
|
11
|
+
info: import("chalk").ChalkInstance;
|
|
12
|
+
dim: import("chalk").ChalkInstance;
|
|
13
|
+
bold: import("chalk").ChalkInstance;
|
|
14
|
+
};
|
|
15
|
+
/**
|
|
16
|
+
* Print a success message
|
|
17
|
+
*/
|
|
18
|
+
export declare function success(message: string): void;
|
|
19
|
+
/**
|
|
20
|
+
* Print an error message
|
|
21
|
+
*/
|
|
22
|
+
export declare function error(message: string): void;
|
|
23
|
+
/**
|
|
24
|
+
* Print a warning message
|
|
25
|
+
*/
|
|
26
|
+
export declare function warning(message: string): void;
|
|
27
|
+
/**
|
|
28
|
+
* Print an info message
|
|
29
|
+
*/
|
|
30
|
+
export declare function info(message: string): void;
|
|
31
|
+
/**
|
|
32
|
+
* Print a primary colored message
|
|
33
|
+
*/
|
|
34
|
+
export declare function primary(message: string): void;
|
|
35
|
+
/**
|
|
36
|
+
* Print a dim/muted message
|
|
37
|
+
*/
|
|
38
|
+
export declare function dim(message: string): void;
|
|
39
|
+
/**
|
|
40
|
+
* Create a spinner
|
|
41
|
+
*/
|
|
42
|
+
export declare function spinner(text: string): Ora;
|
|
43
|
+
/**
|
|
44
|
+
* Print a header/title
|
|
45
|
+
*/
|
|
46
|
+
export declare function header(text: string): void;
|
|
47
|
+
/**
|
|
48
|
+
* Print a table row
|
|
49
|
+
*/
|
|
50
|
+
export declare function tableRow(label: string, value: string, labelWidth?: number): void;
|
|
51
|
+
/**
|
|
52
|
+
* Print a list item
|
|
53
|
+
*/
|
|
54
|
+
export declare function listItem(text: string, indent?: number): void;
|
|
55
|
+
/**
|
|
56
|
+
* Print JSON output
|
|
57
|
+
*/
|
|
58
|
+
export declare function json(data: unknown): void;
|
|
59
|
+
/**
|
|
60
|
+
* Print a newline
|
|
61
|
+
*/
|
|
62
|
+
export declare function newline(): void;
|
|
63
|
+
/**
|
|
64
|
+
* Format a task status with color
|
|
65
|
+
*/
|
|
66
|
+
export declare function formatStatus(status: string): string;
|
|
67
|
+
/**
|
|
68
|
+
* Format a priority with color
|
|
69
|
+
*/
|
|
70
|
+
export declare function formatPriority(priority: string): string;
|
|
71
|
+
/**
|
|
72
|
+
* Format a date for display
|
|
73
|
+
*/
|
|
74
|
+
export declare function formatDate(date: string | Date): string;
|
|
75
|
+
/**
|
|
76
|
+
* Truncate text to a maximum length
|
|
77
|
+
*/
|
|
78
|
+
export declare function truncate(text: string, maxLength: number): string;
|
|
79
|
+
//# sourceMappingURL=output.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"output.d.ts","sourceRoot":"","sources":["../../src/utils/output.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAY,EAAE,KAAK,GAAG,EAAE,MAAM,KAAK,CAAC;AAGpC,eAAO,MAAM,MAAM;;;;;;;;CAQlB,CAAC;AAEF;;GAEG;AACH,wBAAgB,OAAO,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAE7C;AAED;;GAEG;AACH,wBAAgB,KAAK,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAE3C;AAED;;GAEG;AACH,wBAAgB,OAAO,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAE7C;AAED;;GAEG;AACH,wBAAgB,IAAI,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAE1C;AAED;;GAEG;AACH,wBAAgB,OAAO,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAE7C;AAED;;GAEG;AACH,wBAAgB,GAAG,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAEzC;AAED;;GAEG;AACH,wBAAgB,OAAO,CAAC,IAAI,EAAE,MAAM,GAAG,GAAG,CAKzC;AAED;;GAEG;AACH,wBAAgB,MAAM,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAIzC;AAED;;GAEG;AACH,wBAAgB,QAAQ,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,UAAU,SAAK,GAAG,IAAI,CAG5E;AAED;;GAEG;AACH,wBAAgB,QAAQ,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,SAAI,GAAG,IAAI,CAGvD;AAED;;GAEG;AACH,wBAAgB,IAAI,CAAC,IAAI,EAAE,OAAO,GAAG,IAAI,CAExC;AAED;;GAEG;AACH,wBAAgB,OAAO,IAAI,IAAI,CAE9B;AAED;;GAEG;AACH,wBAAgB,YAAY,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAanD;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAWvD;AAED;;GAEG;AACH,wBAAgB,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,GAAG,MAAM,CAetD;AAED;;GAEG;AACH,wBAAgB,QAAQ,CAAC,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,MAAM,CAGhE"}
|
|
@@ -0,0 +1,157 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* CLI output utilities
|
|
3
|
+
* Provides consistent formatting for CLI output
|
|
4
|
+
*/
|
|
5
|
+
import chalk from 'chalk';
|
|
6
|
+
import ora from 'ora';
|
|
7
|
+
// Color scheme matching Paean brand
|
|
8
|
+
export const colors = {
|
|
9
|
+
primary: chalk.hex('#06b6d4'), // Paean Blue
|
|
10
|
+
success: chalk.green,
|
|
11
|
+
warning: chalk.yellow,
|
|
12
|
+
error: chalk.red,
|
|
13
|
+
info: chalk.blue,
|
|
14
|
+
dim: chalk.gray,
|
|
15
|
+
bold: chalk.bold,
|
|
16
|
+
};
|
|
17
|
+
/**
|
|
18
|
+
* Print a success message
|
|
19
|
+
*/
|
|
20
|
+
export function success(message) {
|
|
21
|
+
console.log(colors.success('✓'), message);
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* Print an error message
|
|
25
|
+
*/
|
|
26
|
+
export function error(message) {
|
|
27
|
+
console.error(colors.error('✗'), message);
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* Print a warning message
|
|
31
|
+
*/
|
|
32
|
+
export function warning(message) {
|
|
33
|
+
console.log(colors.warning('⚠'), message);
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* Print an info message
|
|
37
|
+
*/
|
|
38
|
+
export function info(message) {
|
|
39
|
+
console.log(colors.info('ℹ'), message);
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* Print a primary colored message
|
|
43
|
+
*/
|
|
44
|
+
export function primary(message) {
|
|
45
|
+
console.log(colors.primary(message));
|
|
46
|
+
}
|
|
47
|
+
/**
|
|
48
|
+
* Print a dim/muted message
|
|
49
|
+
*/
|
|
50
|
+
export function dim(message) {
|
|
51
|
+
console.log(colors.dim(message));
|
|
52
|
+
}
|
|
53
|
+
/**
|
|
54
|
+
* Create a spinner
|
|
55
|
+
*/
|
|
56
|
+
export function spinner(text) {
|
|
57
|
+
return ora({
|
|
58
|
+
text,
|
|
59
|
+
color: 'cyan',
|
|
60
|
+
});
|
|
61
|
+
}
|
|
62
|
+
/**
|
|
63
|
+
* Print a header/title
|
|
64
|
+
*/
|
|
65
|
+
export function header(text) {
|
|
66
|
+
console.log();
|
|
67
|
+
console.log(colors.bold(colors.primary(text)));
|
|
68
|
+
console.log(colors.dim('─'.repeat(text.length + 4)));
|
|
69
|
+
}
|
|
70
|
+
/**
|
|
71
|
+
* Print a table row
|
|
72
|
+
*/
|
|
73
|
+
export function tableRow(label, value, labelWidth = 20) {
|
|
74
|
+
const paddedLabel = label.padEnd(labelWidth);
|
|
75
|
+
console.log(` ${colors.dim(paddedLabel)} ${value}`);
|
|
76
|
+
}
|
|
77
|
+
/**
|
|
78
|
+
* Print a list item
|
|
79
|
+
*/
|
|
80
|
+
export function listItem(text, indent = 0) {
|
|
81
|
+
const prefix = ' '.repeat(indent) + colors.dim('•');
|
|
82
|
+
console.log(`${prefix} ${text}`);
|
|
83
|
+
}
|
|
84
|
+
/**
|
|
85
|
+
* Print JSON output
|
|
86
|
+
*/
|
|
87
|
+
export function json(data) {
|
|
88
|
+
console.log(JSON.stringify(data, null, 2));
|
|
89
|
+
}
|
|
90
|
+
/**
|
|
91
|
+
* Print a newline
|
|
92
|
+
*/
|
|
93
|
+
export function newline() {
|
|
94
|
+
console.log();
|
|
95
|
+
}
|
|
96
|
+
/**
|
|
97
|
+
* Format a task status with color
|
|
98
|
+
*/
|
|
99
|
+
export function formatStatus(status) {
|
|
100
|
+
switch (status) {
|
|
101
|
+
case 'completed':
|
|
102
|
+
return colors.success('✓ completed');
|
|
103
|
+
case 'pending':
|
|
104
|
+
return colors.warning('○ pending');
|
|
105
|
+
case 'in_progress':
|
|
106
|
+
return colors.info('◐ in progress');
|
|
107
|
+
case 'cancelled':
|
|
108
|
+
return colors.dim('✗ cancelled');
|
|
109
|
+
default:
|
|
110
|
+
return status;
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
/**
|
|
114
|
+
* Format a priority with color
|
|
115
|
+
*/
|
|
116
|
+
export function formatPriority(priority) {
|
|
117
|
+
switch (priority) {
|
|
118
|
+
case 'high':
|
|
119
|
+
return colors.error('▲ high');
|
|
120
|
+
case 'medium':
|
|
121
|
+
return colors.warning('■ medium');
|
|
122
|
+
case 'low':
|
|
123
|
+
return colors.dim('▽ low');
|
|
124
|
+
default:
|
|
125
|
+
return priority;
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
/**
|
|
129
|
+
* Format a date for display
|
|
130
|
+
*/
|
|
131
|
+
export function formatDate(date) {
|
|
132
|
+
const d = new Date(date);
|
|
133
|
+
const now = new Date();
|
|
134
|
+
const diff = now.getTime() - d.getTime();
|
|
135
|
+
const days = Math.floor(diff / (1000 * 60 * 60 * 24));
|
|
136
|
+
if (days === 0) {
|
|
137
|
+
return 'today';
|
|
138
|
+
}
|
|
139
|
+
else if (days === 1) {
|
|
140
|
+
return 'yesterday';
|
|
141
|
+
}
|
|
142
|
+
else if (days < 7) {
|
|
143
|
+
return `${days} days ago`;
|
|
144
|
+
}
|
|
145
|
+
else {
|
|
146
|
+
return d.toLocaleDateString();
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
/**
|
|
150
|
+
* Truncate text to a maximum length
|
|
151
|
+
*/
|
|
152
|
+
export function truncate(text, maxLength) {
|
|
153
|
+
if (text.length <= maxLength)
|
|
154
|
+
return text;
|
|
155
|
+
return text.slice(0, maxLength - 3) + '...';
|
|
156
|
+
}
|
|
157
|
+
//# sourceMappingURL=output.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"output.js","sourceRoot":"","sources":["../../src/utils/output.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Project context detection utilities
|
|
3
|
+
* Detects project information from the current working directory
|
|
4
|
+
*/
|
|
5
|
+
export interface ProjectContext {
|
|
6
|
+
name: string;
|
|
7
|
+
path: string;
|
|
8
|
+
type?: 'node' | 'python' | 'rust' | 'go' | 'other';
|
|
9
|
+
packageManager?: 'npm' | 'yarn' | 'pnpm' | 'pip' | 'cargo' | 'go';
|
|
10
|
+
description?: string;
|
|
11
|
+
version?: string;
|
|
12
|
+
hasGit?: boolean;
|
|
13
|
+
gitRemote?: string;
|
|
14
|
+
gitBranch?: string;
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* Detect project context from current directory
|
|
18
|
+
*/
|
|
19
|
+
export declare function detectProject(cwd?: string): ProjectContext;
|
|
20
|
+
/**
|
|
21
|
+
* Generate a unique project identifier
|
|
22
|
+
* Used for associating tasks with a specific project
|
|
23
|
+
*/
|
|
24
|
+
export declare function getProjectId(context: ProjectContext): string;
|
|
25
|
+
/**
|
|
26
|
+
* Check if we're in a project directory
|
|
27
|
+
*/
|
|
28
|
+
export declare function isInProject(cwd?: string): boolean;
|
|
29
|
+
//# sourceMappingURL=project.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"project.d.ts","sourceRoot":"","sources":["../../src/utils/project.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAKH,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,CAAC,EAAE,MAAM,GAAG,QAAQ,GAAG,MAAM,GAAG,IAAI,GAAG,OAAO,CAAC;IACnD,cAAc,CAAC,EAAE,KAAK,GAAG,MAAM,GAAG,MAAM,GAAG,KAAK,GAAG,OAAO,GAAG,IAAI,CAAC;IAClE,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED;;GAEG;AACH,wBAAgB,aAAa,CAAC,GAAG,GAAE,MAAsB,GAAG,cAAc,CAuGzE;AAED;;;GAGG;AACH,wBAAgB,YAAY,CAAC,OAAO,EAAE,cAAc,GAAG,MAAM,CAc5D;AAED;;GAEG;AACH,wBAAgB,WAAW,CAAC,GAAG,GAAE,MAAsB,GAAG,OAAO,CAGhE"}
|
|
@@ -0,0 +1,135 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Project context detection utilities
|
|
3
|
+
* Detects project information from the current working directory
|
|
4
|
+
*/
|
|
5
|
+
import { existsSync, readFileSync } from 'fs';
|
|
6
|
+
import { basename, join } from 'path';
|
|
7
|
+
/**
|
|
8
|
+
* Detect project context from current directory
|
|
9
|
+
*/
|
|
10
|
+
export function detectProject(cwd = process.cwd()) {
|
|
11
|
+
const context = {
|
|
12
|
+
name: basename(cwd),
|
|
13
|
+
path: cwd,
|
|
14
|
+
};
|
|
15
|
+
// Check for Node.js project
|
|
16
|
+
const packageJsonPath = join(cwd, 'package.json');
|
|
17
|
+
if (existsSync(packageJsonPath)) {
|
|
18
|
+
try {
|
|
19
|
+
const packageJson = JSON.parse(readFileSync(packageJsonPath, 'utf-8'));
|
|
20
|
+
context.type = 'node';
|
|
21
|
+
context.name = packageJson.name || context.name;
|
|
22
|
+
context.description = packageJson.description;
|
|
23
|
+
context.version = packageJson.version;
|
|
24
|
+
// Detect package manager
|
|
25
|
+
if (existsSync(join(cwd, 'pnpm-lock.yaml'))) {
|
|
26
|
+
context.packageManager = 'pnpm';
|
|
27
|
+
}
|
|
28
|
+
else if (existsSync(join(cwd, 'yarn.lock'))) {
|
|
29
|
+
context.packageManager = 'yarn';
|
|
30
|
+
}
|
|
31
|
+
else if (existsSync(join(cwd, 'package-lock.json'))) {
|
|
32
|
+
context.packageManager = 'npm';
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
catch {
|
|
36
|
+
// Ignore parse errors
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
// Check for Python project
|
|
40
|
+
if (!context.type) {
|
|
41
|
+
const pyprojectPath = join(cwd, 'pyproject.toml');
|
|
42
|
+
const setupPyPath = join(cwd, 'setup.py');
|
|
43
|
+
const requirementsPath = join(cwd, 'requirements.txt');
|
|
44
|
+
if (existsSync(pyprojectPath) || existsSync(setupPyPath) || existsSync(requirementsPath)) {
|
|
45
|
+
context.type = 'python';
|
|
46
|
+
context.packageManager = 'pip';
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
// Check for Rust project
|
|
50
|
+
if (!context.type) {
|
|
51
|
+
const cargoPath = join(cwd, 'Cargo.toml');
|
|
52
|
+
if (existsSync(cargoPath)) {
|
|
53
|
+
context.type = 'rust';
|
|
54
|
+
context.packageManager = 'cargo';
|
|
55
|
+
try {
|
|
56
|
+
const cargoContent = readFileSync(cargoPath, 'utf-8');
|
|
57
|
+
const nameMatch = cargoContent.match(/name\s*=\s*"([^"]+)"/);
|
|
58
|
+
const versionMatch = cargoContent.match(/version\s*=\s*"([^"]+)"/);
|
|
59
|
+
if (nameMatch)
|
|
60
|
+
context.name = nameMatch[1];
|
|
61
|
+
if (versionMatch)
|
|
62
|
+
context.version = versionMatch[1];
|
|
63
|
+
}
|
|
64
|
+
catch {
|
|
65
|
+
// Ignore parse errors
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
// Check for Go project
|
|
70
|
+
if (!context.type) {
|
|
71
|
+
const goModPath = join(cwd, 'go.mod');
|
|
72
|
+
if (existsSync(goModPath)) {
|
|
73
|
+
context.type = 'go';
|
|
74
|
+
context.packageManager = 'go';
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
// Check for Git
|
|
78
|
+
const gitPath = join(cwd, '.git');
|
|
79
|
+
if (existsSync(gitPath)) {
|
|
80
|
+
context.hasGit = true;
|
|
81
|
+
// Try to get git remote
|
|
82
|
+
try {
|
|
83
|
+
const gitConfigPath = join(gitPath, 'config');
|
|
84
|
+
if (existsSync(gitConfigPath)) {
|
|
85
|
+
const gitConfig = readFileSync(gitConfigPath, 'utf-8');
|
|
86
|
+
const remoteMatch = gitConfig.match(/url\s*=\s*(.+)/);
|
|
87
|
+
if (remoteMatch) {
|
|
88
|
+
context.gitRemote = remoteMatch[1].trim();
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
// Try to get current branch
|
|
92
|
+
const headPath = join(gitPath, 'HEAD');
|
|
93
|
+
if (existsSync(headPath)) {
|
|
94
|
+
const headContent = readFileSync(headPath, 'utf-8').trim();
|
|
95
|
+
if (headContent.startsWith('ref: refs/heads/')) {
|
|
96
|
+
context.gitBranch = headContent.replace('ref: refs/heads/', '');
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
catch {
|
|
101
|
+
// Ignore errors
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
// Default type
|
|
105
|
+
if (!context.type) {
|
|
106
|
+
context.type = 'other';
|
|
107
|
+
}
|
|
108
|
+
return context;
|
|
109
|
+
}
|
|
110
|
+
/**
|
|
111
|
+
* Generate a unique project identifier
|
|
112
|
+
* Used for associating tasks with a specific project
|
|
113
|
+
*/
|
|
114
|
+
export function getProjectId(context) {
|
|
115
|
+
// Use git remote if available
|
|
116
|
+
if (context.gitRemote) {
|
|
117
|
+
// Normalize git remote URL to create consistent ID
|
|
118
|
+
let remote = context.gitRemote;
|
|
119
|
+
remote = remote.replace(/^(git@|https?:\/\/)/, '');
|
|
120
|
+
remote = remote.replace(/\.git$/, '');
|
|
121
|
+
remote = remote.replace(/:/g, '/');
|
|
122
|
+
return remote;
|
|
123
|
+
}
|
|
124
|
+
// Fall back to project name + path hash
|
|
125
|
+
const pathHash = Buffer.from(context.path).toString('base64').slice(0, 8);
|
|
126
|
+
return `${context.name}-${pathHash}`;
|
|
127
|
+
}
|
|
128
|
+
/**
|
|
129
|
+
* Check if we're in a project directory
|
|
130
|
+
*/
|
|
131
|
+
export function isInProject(cwd = process.cwd()) {
|
|
132
|
+
const context = detectProject(cwd);
|
|
133
|
+
return context.type !== 'other' || context.hasGit === true;
|
|
134
|
+
}
|
|
135
|
+
//# sourceMappingURL=project.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"project.js","sourceRoot":"","sources":["../../src/utils/project.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,IAAI,CAAC;AAC9C,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AActC;;GAEG;AACH,MAAM,UAAU,aAAa,CAAC,MAAc,OAAO,CAAC,GAAG,EAAE;IACvD,MAAM,OAAO,GAAmB;QAC9B,IAAI,EAAE,QAAQ,CAAC,GAAG,CAAC;QACnB,IAAI,EAAE,GAAG;KACV,CAAC;IAEF,4BAA4B;IAC5B,MAAM,eAAe,GAAG,IAAI,CAAC,GAAG,EAAE,cAAc,CAAC,CAAC;IAClD,IAAI,UAAU,CAAC,eAAe,CAAC,EAAE,CAAC;QAChC,IAAI,CAAC;YACH,MAAM,WAAW,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,eAAe,EAAE,OAAO,CAAC,CAAC,CAAC;YACvE,OAAO,CAAC,IAAI,GAAG,MAAM,CAAC;YACtB,OAAO,CAAC,IAAI,GAAG,WAAW,CAAC,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;YAChD,OAAO,CAAC,WAAW,GAAG,WAAW,CAAC,WAAW,CAAC;YAC9C,OAAO,CAAC,OAAO,GAAG,WAAW,CAAC,OAAO,CAAC;YAEtC,yBAAyB;YACzB,IAAI,UAAU,CAAC,IAAI,CAAC,GAAG,EAAE,gBAAgB,CAAC,CAAC,EAAE,CAAC;gBAC5C,OAAO,CAAC,cAAc,GAAG,MAAM,CAAC;YAClC,CAAC;iBAAM,IAAI,UAAU,CAAC,IAAI,CAAC,GAAG,EAAE,WAAW,CAAC,CAAC,EAAE,CAAC;gBAC9C,OAAO,CAAC,cAAc,GAAG,MAAM,CAAC;YAClC,CAAC;iBAAM,IAAI,UAAU,CAAC,IAAI,CAAC,GAAG,EAAE,mBAAmB,CAAC,CAAC,EAAE,CAAC;gBACtD,OAAO,CAAC,cAAc,GAAG,KAAK,CAAC;YACjC,CAAC;QACH,CAAC;QAAC,MAAM,CAAC;YACP,sBAAsB;QACxB,CAAC;IACH,CAAC;IAED,2BAA2B;IAC3B,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC;QAClB,MAAM,aAAa,GAAG,IAAI,CAAC,GAAG,EAAE,gBAAgB,CAAC,CAAC;QAClD,MAAM,WAAW,GAAG,IAAI,CAAC,GAAG,EAAE,UAAU,CAAC,CAAC;QAC1C,MAAM,gBAAgB,GAAG,IAAI,CAAC,GAAG,EAAE,kBAAkB,CAAC,CAAC;QAEvD,IAAI,UAAU,CAAC,aAAa,CAAC,IAAI,UAAU,CAAC,WAAW,CAAC,IAAI,UAAU,CAAC,gBAAgB,CAAC,EAAE,CAAC;YACzF,OAAO,CAAC,IAAI,GAAG,QAAQ,CAAC;YACxB,OAAO,CAAC,cAAc,GAAG,KAAK,CAAC;QACjC,CAAC;IACH,CAAC;IAED,yBAAyB;IACzB,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC;QAClB,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,YAAY,CAAC,CAAC;QAC1C,IAAI,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;YAC1B,OAAO,CAAC,IAAI,GAAG,MAAM,CAAC;YACtB,OAAO,CAAC,cAAc,GAAG,OAAO,CAAC;YACjC,IAAI,CAAC;gBACH,MAAM,YAAY,GAAG,YAAY,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;gBACtD,MAAM,SAAS,GAAG,YAAY,CAAC,KAAK,CAAC,sBAAsB,CAAC,CAAC;gBAC7D,MAAM,YAAY,GAAG,YAAY,CAAC,KAAK,CAAC,yBAAyB,CAAC,CAAC;gBACnE,IAAI,SAAS;oBAAE,OAAO,CAAC,IAAI,GAAG,SAAS,CAAC,CAAC,CAAC,CAAC;gBAC3C,IAAI,YAAY;oBAAE,OAAO,CAAC,OAAO,GAAG,YAAY,CAAC,CAAC,CAAC,CAAC;YACtD,CAAC;YAAC,MAAM,CAAC;gBACP,sBAAsB;YACxB,CAAC;QACH,CAAC;IACH,CAAC;IAED,uBAAuB;IACvB,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC;QAClB,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAC;QACtC,IAAI,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;YAC1B,OAAO,CAAC,IAAI,GAAG,IAAI,CAAC;YACpB,OAAO,CAAC,cAAc,GAAG,IAAI,CAAC;QAChC,CAAC;IACH,CAAC;IAED,gBAAgB;IAChB,MAAM,OAAO,GAAG,IAAI,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC;IAClC,IAAI,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC;QACxB,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;QAEtB,wBAAwB;QACxB,IAAI,CAAC;YACH,MAAM,aAAa,GAAG,IAAI,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC;YAC9C,IAAI,UAAU,CAAC,aAAa,CAAC,EAAE,CAAC;gBAC9B,MAAM,SAAS,GAAG,YAAY,CAAC,aAAa,EAAE,OAAO,CAAC,CAAC;gBACvD,MAAM,WAAW,GAAG,SAAS,CAAC,KAAK,CAAC,gBAAgB,CAAC,CAAC;gBACtD,IAAI,WAAW,EAAE,CAAC;oBAChB,OAAO,CAAC,SAAS,GAAG,WAAW,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;gBAC5C,CAAC;YACH,CAAC;YAED,4BAA4B;YAC5B,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;YACvC,IAAI,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;gBACzB,MAAM,WAAW,GAAG,YAAY,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC,IAAI,EAAE,CAAC;gBAC3D,IAAI,WAAW,CAAC,UAAU,CAAC,kBAAkB,CAAC,EAAE,CAAC;oBAC/C,OAAO,CAAC,SAAS,GAAG,WAAW,CAAC,OAAO,CAAC,kBAAkB,EAAE,EAAE,CAAC,CAAC;gBAClE,CAAC;YACH,CAAC;QACH,CAAC;QAAC,MAAM,CAAC;YACP,gBAAgB;QAClB,CAAC;IACH,CAAC;IAED,eAAe;IACf,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC;QAClB,OAAO,CAAC,IAAI,GAAG,OAAO,CAAC;IACzB,CAAC;IAED,OAAO,OAAO,CAAC;AACjB,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,YAAY,CAAC,OAAuB;IAClD,8BAA8B;IAC9B,IAAI,OAAO,CAAC,SAAS,EAAE,CAAC;QACtB,mDAAmD;QACnD,IAAI,MAAM,GAAG,OAAO,CAAC,SAAS,CAAC;QAC/B,MAAM,GAAG,MAAM,CAAC,OAAO,CAAC,qBAAqB,EAAE,EAAE,CAAC,CAAC;QACnD,MAAM,GAAG,MAAM,CAAC,OAAO,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC;QACtC,MAAM,GAAG,MAAM,CAAC,OAAO,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;QACnC,OAAO,MAAM,CAAC;IAChB,CAAC;IAED,wCAAwC;IACxC,MAAM,QAAQ,GAAG,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IAC1E,OAAO,GAAG,OAAO,CAAC,IAAI,IAAI,QAAQ,EAAE,CAAC;AACvC,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,WAAW,CAAC,MAAc,OAAO,CAAC,GAAG,EAAE;IACrD,MAAM,OAAO,GAAG,aAAa,CAAC,GAAG,CAAC,CAAC;IACnC,OAAO,OAAO,CAAC,IAAI,KAAK,OAAO,IAAI,OAAO,CAAC,MAAM,KAAK,IAAI,CAAC;AAC7D,CAAC"}
|