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.
Files changed (71) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +296 -0
  3. package/dist/api/auth.d.ts +71 -0
  4. package/dist/api/auth.d.ts.map +1 -0
  5. package/dist/api/auth.js +257 -0
  6. package/dist/api/auth.js.map +1 -0
  7. package/dist/api/client.d.ts +37 -0
  8. package/dist/api/client.d.ts.map +1 -0
  9. package/dist/api/client.js +101 -0
  10. package/dist/api/client.js.map +1 -0
  11. package/dist/api/todo.d.ts +167 -0
  12. package/dist/api/todo.d.ts.map +1 -0
  13. package/dist/api/todo.js +137 -0
  14. package/dist/api/todo.js.map +1 -0
  15. package/dist/cli.d.ts +7 -0
  16. package/dist/cli.d.ts.map +1 -0
  17. package/dist/cli.js +36 -0
  18. package/dist/cli.js.map +1 -0
  19. package/dist/commands/context.d.ts +7 -0
  20. package/dist/commands/context.d.ts.map +1 -0
  21. package/dist/commands/context.js +155 -0
  22. package/dist/commands/context.js.map +1 -0
  23. package/dist/commands/login.d.ts +7 -0
  24. package/dist/commands/login.d.ts.map +1 -0
  25. package/dist/commands/login.js +108 -0
  26. package/dist/commands/login.js.map +1 -0
  27. package/dist/commands/logout.d.ts +7 -0
  28. package/dist/commands/logout.d.ts.map +1 -0
  29. package/dist/commands/logout.js +27 -0
  30. package/dist/commands/logout.js.map +1 -0
  31. package/dist/commands/serve.d.ts +7 -0
  32. package/dist/commands/serve.d.ts.map +1 -0
  33. package/dist/commands/serve.js +29 -0
  34. package/dist/commands/serve.js.map +1 -0
  35. package/dist/commands/tasks.d.ts +7 -0
  36. package/dist/commands/tasks.d.ts.map +1 -0
  37. package/dist/commands/tasks.js +276 -0
  38. package/dist/commands/tasks.js.map +1 -0
  39. package/dist/commands/validate.d.ts +7 -0
  40. package/dist/commands/validate.d.ts.map +1 -0
  41. package/dist/commands/validate.js +123 -0
  42. package/dist/commands/validate.js.map +1 -0
  43. package/dist/index.d.ts +13 -0
  44. package/dist/index.d.ts.map +1 -0
  45. package/dist/index.js +19 -0
  46. package/dist/index.js.map +1 -0
  47. package/dist/mcp/resources.d.ts +14 -0
  48. package/dist/mcp/resources.d.ts.map +1 -0
  49. package/dist/mcp/resources.js +166 -0
  50. package/dist/mcp/resources.js.map +1 -0
  51. package/dist/mcp/server.d.ts +12 -0
  52. package/dist/mcp/server.d.ts.map +1 -0
  53. package/dist/mcp/server.js +82 -0
  54. package/dist/mcp/server.js.map +1 -0
  55. package/dist/mcp/tools.d.ts +14 -0
  56. package/dist/mcp/tools.d.ts.map +1 -0
  57. package/dist/mcp/tools.js +341 -0
  58. package/dist/mcp/tools.js.map +1 -0
  59. package/dist/utils/config.d.ts +69 -0
  60. package/dist/utils/config.d.ts.map +1 -0
  61. package/dist/utils/config.js +129 -0
  62. package/dist/utils/config.js.map +1 -0
  63. package/dist/utils/output.d.ts +79 -0
  64. package/dist/utils/output.d.ts.map +1 -0
  65. package/dist/utils/output.js +157 -0
  66. package/dist/utils/output.js.map +1 -0
  67. package/dist/utils/project.d.ts +29 -0
  68. package/dist/utils/project.d.ts.map +1 -0
  69. package/dist/utils/project.js +135 -0
  70. package/dist/utils/project.js.map +1 -0
  71. 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":"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"}
@@ -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":"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"}