@emaenriquez/projectmanager-cli 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 (174) hide show
  1. package/README.md +98 -0
  2. package/dist/application/ConfigManager.d.ts +73 -0
  3. package/dist/application/ConfigManager.d.ts.map +1 -0
  4. package/dist/application/ConfigManager.js +253 -0
  5. package/dist/application/ConfigManager.js.map +1 -0
  6. package/dist/application/errors/ErrorHandler.d.ts +27 -0
  7. package/dist/application/errors/ErrorHandler.d.ts.map +1 -0
  8. package/dist/application/errors/ErrorHandler.js +88 -0
  9. package/dist/application/errors/ErrorHandler.js.map +1 -0
  10. package/dist/application/state/StateManager.d.ts +26 -0
  11. package/dist/application/state/StateManager.d.ts.map +1 -0
  12. package/dist/application/state/StateManager.js +114 -0
  13. package/dist/application/state/StateManager.js.map +1 -0
  14. package/dist/application/use_cases/AddProjectUseCase.d.ts +9 -0
  15. package/dist/application/use_cases/AddProjectUseCase.d.ts.map +1 -0
  16. package/dist/application/use_cases/AddProjectUseCase.js +85 -0
  17. package/dist/application/use_cases/AddProjectUseCase.js.map +1 -0
  18. package/dist/application/use_cases/ListProjectsUseCase.d.ts +7 -0
  19. package/dist/application/use_cases/ListProjectsUseCase.d.ts.map +1 -0
  20. package/dist/application/use_cases/ListProjectsUseCase.js +14 -0
  21. package/dist/application/use_cases/ListProjectsUseCase.js.map +1 -0
  22. package/dist/application/use_cases/OpenProjectUseCase.d.ts +10 -0
  23. package/dist/application/use_cases/OpenProjectUseCase.d.ts.map +1 -0
  24. package/dist/application/use_cases/OpenProjectUseCase.js +168 -0
  25. package/dist/application/use_cases/OpenProjectUseCase.js.map +1 -0
  26. package/dist/application/use_cases/RemoveProjectUseCase.d.ts +7 -0
  27. package/dist/application/use_cases/RemoveProjectUseCase.d.ts.map +1 -0
  28. package/dist/application/use_cases/RemoveProjectUseCase.js +24 -0
  29. package/dist/application/use_cases/RemoveProjectUseCase.js.map +1 -0
  30. package/dist/application/use_cases/ScanProjectsUseCase.d.ts +13 -0
  31. package/dist/application/use_cases/ScanProjectsUseCase.d.ts.map +1 -0
  32. package/dist/application/use_cases/ScanProjectsUseCase.js +57 -0
  33. package/dist/application/use_cases/ScanProjectsUseCase.js.map +1 -0
  34. package/dist/application/use_cases/SyncProjectsUseCase.d.ts +12 -0
  35. package/dist/application/use_cases/SyncProjectsUseCase.d.ts.map +1 -0
  36. package/dist/application/use_cases/SyncProjectsUseCase.js +74 -0
  37. package/dist/application/use_cases/SyncProjectsUseCase.js.map +1 -0
  38. package/dist/application/use_cases/SystemDiagnostics.d.ts +16 -0
  39. package/dist/application/use_cases/SystemDiagnostics.d.ts.map +1 -0
  40. package/dist/application/use_cases/SystemDiagnostics.js +35 -0
  41. package/dist/application/use_cases/SystemDiagnostics.js.map +1 -0
  42. package/dist/application/use_cases/TagProjectUseCase.d.ts +9 -0
  43. package/dist/application/use_cases/TagProjectUseCase.d.ts.map +1 -0
  44. package/dist/application/use_cases/TagProjectUseCase.js +41 -0
  45. package/dist/application/use_cases/TagProjectUseCase.js.map +1 -0
  46. package/dist/domain/patterns/ProjectPatterns.d.ts +47 -0
  47. package/dist/domain/patterns/ProjectPatterns.d.ts.map +1 -0
  48. package/dist/domain/patterns/ProjectPatterns.js +200 -0
  49. package/dist/domain/patterns/ProjectPatterns.js.map +1 -0
  50. package/dist/domain/services/GitService.d.ts +23 -0
  51. package/dist/domain/services/GitService.d.ts.map +1 -0
  52. package/dist/domain/services/GitService.js +155 -0
  53. package/dist/domain/services/GitService.js.map +1 -0
  54. package/dist/domain/services/IgnoreFileParser.d.ts +55 -0
  55. package/dist/domain/services/IgnoreFileParser.d.ts.map +1 -0
  56. package/dist/domain/services/IgnoreFileParser.js +200 -0
  57. package/dist/domain/services/IgnoreFileParser.js.map +1 -0
  58. package/dist/domain/services/ProjectScanner.d.ts +65 -0
  59. package/dist/domain/services/ProjectScanner.d.ts.map +1 -0
  60. package/dist/domain/services/ProjectScanner.js +207 -0
  61. package/dist/domain/services/ProjectScanner.js.map +1 -0
  62. package/dist/domain/services/TechnologyDetector.d.ts +78 -0
  63. package/dist/domain/services/TechnologyDetector.d.ts.map +1 -0
  64. package/dist/domain/services/TechnologyDetector.js +633 -0
  65. package/dist/domain/services/TechnologyDetector.js.map +1 -0
  66. package/dist/domain/services/ToolDetector.d.ts +74 -0
  67. package/dist/domain/services/ToolDetector.d.ts.map +1 -0
  68. package/dist/domain/services/ToolDetector.js +344 -0
  69. package/dist/domain/services/ToolDetector.js.map +1 -0
  70. package/dist/domain/services/index.d.ts +5 -0
  71. package/dist/domain/services/index.d.ts.map +1 -0
  72. package/dist/domain/services/index.js +12 -0
  73. package/dist/domain/services/index.js.map +1 -0
  74. package/dist/domain/types/Config.d.ts +37 -0
  75. package/dist/domain/types/Config.d.ts.map +1 -0
  76. package/dist/domain/types/Config.js +6 -0
  77. package/dist/domain/types/Config.js.map +1 -0
  78. package/dist/index.d.ts +6 -0
  79. package/dist/index.d.ts.map +1 -0
  80. package/dist/index.js +17 -0
  81. package/dist/index.js.map +1 -0
  82. package/dist/infrastructure/database/DatabaseConnection.d.ts +88 -0
  83. package/dist/infrastructure/database/DatabaseConnection.d.ts.map +1 -0
  84. package/dist/infrastructure/database/DatabaseConnection.js +318 -0
  85. package/dist/infrastructure/database/DatabaseConnection.js.map +1 -0
  86. package/dist/infrastructure/database/DatabaseValidator.d.ts +154 -0
  87. package/dist/infrastructure/database/DatabaseValidator.d.ts.map +1 -0
  88. package/dist/infrastructure/database/DatabaseValidator.js +583 -0
  89. package/dist/infrastructure/database/DatabaseValidator.js.map +1 -0
  90. package/dist/infrastructure/database/index.d.ts +8 -0
  91. package/dist/infrastructure/database/index.d.ts.map +1 -0
  92. package/dist/infrastructure/database/index.js +14 -0
  93. package/dist/infrastructure/database/index.js.map +1 -0
  94. package/dist/infrastructure/database/migrations/001_initial.d.ts +24 -0
  95. package/dist/infrastructure/database/migrations/001_initial.d.ts.map +1 -0
  96. package/dist/infrastructure/database/migrations/001_initial.js +109 -0
  97. package/dist/infrastructure/database/migrations/001_initial.js.map +1 -0
  98. package/dist/infrastructure/database/migrations/Migration.d.ts +27 -0
  99. package/dist/infrastructure/database/migrations/Migration.d.ts.map +1 -0
  100. package/dist/infrastructure/database/migrations/Migration.js +3 -0
  101. package/dist/infrastructure/database/migrations/Migration.js.map +1 -0
  102. package/dist/infrastructure/database/migrations/MigrationRunner.d.ts +52 -0
  103. package/dist/infrastructure/database/migrations/MigrationRunner.d.ts.map +1 -0
  104. package/dist/infrastructure/database/migrations/MigrationRunner.js +167 -0
  105. package/dist/infrastructure/database/migrations/MigrationRunner.js.map +1 -0
  106. package/dist/infrastructure/database/migrations/index.d.ts +10 -0
  107. package/dist/infrastructure/database/migrations/index.d.ts.map +1 -0
  108. package/dist/infrastructure/database/migrations/index.js +22 -0
  109. package/dist/infrastructure/database/migrations/index.js.map +1 -0
  110. package/dist/infrastructure/filesystem/DirectoryManager.d.ts +50 -0
  111. package/dist/infrastructure/filesystem/DirectoryManager.d.ts.map +1 -0
  112. package/dist/infrastructure/filesystem/DirectoryManager.js +143 -0
  113. package/dist/infrastructure/filesystem/DirectoryManager.js.map +1 -0
  114. package/dist/infrastructure/filesystem/index.d.ts +2 -0
  115. package/dist/infrastructure/filesystem/index.d.ts.map +1 -0
  116. package/dist/infrastructure/filesystem/index.js +6 -0
  117. package/dist/infrastructure/filesystem/index.js.map +1 -0
  118. package/dist/infrastructure/logging/LogRotator.d.ts +43 -0
  119. package/dist/infrastructure/logging/LogRotator.d.ts.map +1 -0
  120. package/dist/infrastructure/logging/LogRotator.js +172 -0
  121. package/dist/infrastructure/logging/LogRotator.js.map +1 -0
  122. package/dist/infrastructure/logging/Logger.d.ts +59 -0
  123. package/dist/infrastructure/logging/Logger.d.ts.map +1 -0
  124. package/dist/infrastructure/logging/Logger.js +182 -0
  125. package/dist/infrastructure/logging/Logger.js.map +1 -0
  126. package/dist/infrastructure/logging/index.d.ts +3 -0
  127. package/dist/infrastructure/logging/index.d.ts.map +1 -0
  128. package/dist/infrastructure/logging/index.js +8 -0
  129. package/dist/infrastructure/logging/index.js.map +1 -0
  130. package/dist/infrastructure/repositories/ProjectRepository.d.ts +20 -0
  131. package/dist/infrastructure/repositories/ProjectRepository.d.ts.map +1 -0
  132. package/dist/infrastructure/repositories/ProjectRepository.js +61 -0
  133. package/dist/infrastructure/repositories/ProjectRepository.js.map +1 -0
  134. package/dist/infrastructure/repositories/QueryBuilder.d.ts +24 -0
  135. package/dist/infrastructure/repositories/QueryBuilder.d.ts.map +1 -0
  136. package/dist/infrastructure/repositories/QueryBuilder.js +92 -0
  137. package/dist/infrastructure/repositories/QueryBuilder.js.map +1 -0
  138. package/dist/infrastructure/repositories/TagRepository.d.ts +18 -0
  139. package/dist/infrastructure/repositories/TagRepository.d.ts.map +1 -0
  140. package/dist/infrastructure/repositories/TagRepository.js +66 -0
  141. package/dist/infrastructure/repositories/TagRepository.js.map +1 -0
  142. package/dist/infrastructure/repositories/TechnologyRepository.d.ts +16 -0
  143. package/dist/infrastructure/repositories/TechnologyRepository.d.ts.map +1 -0
  144. package/dist/infrastructure/repositories/TechnologyRepository.js +46 -0
  145. package/dist/infrastructure/repositories/TechnologyRepository.js.map +1 -0
  146. package/dist/infrastructure/repositories/TransactionManager.d.ts +11 -0
  147. package/dist/infrastructure/repositories/TransactionManager.d.ts.map +1 -0
  148. package/dist/infrastructure/repositories/TransactionManager.js +21 -0
  149. package/dist/infrastructure/repositories/TransactionManager.js.map +1 -0
  150. package/dist/infrastructure/ui/ScreenManager.d.ts +11 -0
  151. package/dist/infrastructure/ui/ScreenManager.d.ts.map +1 -0
  152. package/dist/infrastructure/ui/ScreenManager.js +69 -0
  153. package/dist/infrastructure/ui/ScreenManager.js.map +1 -0
  154. package/dist/ui/cli/CLI.d.ts +9 -0
  155. package/dist/ui/cli/CLI.d.ts.map +1 -0
  156. package/dist/ui/cli/CLI.js +211 -0
  157. package/dist/ui/cli/CLI.js.map +1 -0
  158. package/dist/ui/components/DetailsPanel.d.ts +11 -0
  159. package/dist/ui/components/DetailsPanel.d.ts.map +1 -0
  160. package/dist/ui/components/DetailsPanel.js +181 -0
  161. package/dist/ui/components/DetailsPanel.js.map +1 -0
  162. package/dist/ui/components/ProjectListView.d.ts +15 -0
  163. package/dist/ui/components/ProjectListView.d.ts.map +1 -0
  164. package/dist/ui/components/ProjectListView.js +122 -0
  165. package/dist/ui/components/ProjectListView.js.map +1 -0
  166. package/dist/ui/tui/TUIApplication.d.ts +17 -0
  167. package/dist/ui/tui/TUIApplication.d.ts.map +1 -0
  168. package/dist/ui/tui/TUIApplication.js +532 -0
  169. package/dist/ui/tui/TUIApplication.js.map +1 -0
  170. package/dist/ui/tui/Theme.d.ts +25 -0
  171. package/dist/ui/tui/Theme.d.ts.map +1 -0
  172. package/dist/ui/tui/Theme.js +62 -0
  173. package/dist/ui/tui/Theme.js.map +1 -0
  174. package/package.json +56 -0
@@ -0,0 +1,11 @@
1
+ import * as blessed from 'blessed';
2
+ import { DetailedProject } from '../../infrastructure/repositories/QueryBuilder';
3
+ export declare class DetailsPanel {
4
+ private box;
5
+ private screenManager;
6
+ private gitService;
7
+ constructor(parent: blessed.Widgets.Node);
8
+ setProject(project: DetailedProject | null): void;
9
+ private detectSubprojects;
10
+ }
11
+ //# sourceMappingURL=DetailsPanel.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"DetailsPanel.d.ts","sourceRoot":"","sources":["../../../src/ui/components/DetailsPanel.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,OAAO,MAAM,SAAS,CAAC;AAInC,OAAO,EAAE,eAAe,EAAE,MAAM,gDAAgD,CAAC;AAejF,qBAAa,YAAY;IACvB,OAAO,CAAC,GAAG,CAA6B;IACxC,OAAO,CAAC,aAAa,CAAgB;IACrC,OAAO,CAAC,UAAU,CAAa;gBAEnB,MAAM,EAAE,OAAO,CAAC,OAAO,CAAC,IAAI;IAoCjC,UAAU,CAAC,OAAO,EAAE,eAAe,GAAG,IAAI,GAAG,IAAI;IA+DxD,OAAO,CAAC,iBAAiB;CAsC1B"}
@@ -0,0 +1,181 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ Object.defineProperty(exports, "__esModule", { value: true });
36
+ exports.DetailsPanel = void 0;
37
+ const blessed = __importStar(require("blessed"));
38
+ const fs = __importStar(require("fs"));
39
+ const path = __importStar(require("path"));
40
+ const ScreenManager_1 = require("../../infrastructure/ui/ScreenManager");
41
+ const GitService_1 = require("../../domain/services/GitService");
42
+ const PROJECT_CONFIG_FILES = [
43
+ 'package.json', 'Cargo.toml', 'go.mod', 'pyproject.toml',
44
+ 'requirements.txt', 'pom.xml', 'build.gradle', 'Gemfile',
45
+ 'composer.json', 'setup.py', 'CMakeLists.txt'
46
+ ];
47
+ class DetailsPanel {
48
+ constructor(parent) {
49
+ this.screenManager = ScreenManager_1.ScreenManager.getInstance();
50
+ this.gitService = new GitService_1.GitService();
51
+ this.box = blessed.box({
52
+ parent,
53
+ top: 0,
54
+ left: '45%',
55
+ width: '55%',
56
+ height: '100%',
57
+ border: {
58
+ type: 'line'
59
+ },
60
+ padding: {
61
+ left: 1,
62
+ right: 1,
63
+ top: 1,
64
+ bottom: 1
65
+ },
66
+ style: {
67
+ bg: 'black',
68
+ fg: 'white',
69
+ border: {
70
+ fg: 'green',
71
+ bg: 'black'
72
+ }
73
+ },
74
+ tags: true,
75
+ scrollable: true,
76
+ alwaysScroll: true,
77
+ keys: true,
78
+ vi: true,
79
+ label: ' Project Details '
80
+ });
81
+ }
82
+ setProject(project) {
83
+ if (!project) {
84
+ this.box.setContent('{gray-fg}Select a project to view details{/gray-fg}');
85
+ this.screenManager.render();
86
+ return;
87
+ }
88
+ let content = `{bold}${project.name}{/bold} ${project.is_favorite ? '{yellow-fg}★{/yellow-fg}' : ''}\n`;
89
+ content += `{gray-fg}${project.path}{/gray-fg}\n\n`;
90
+ content += `{bold}Timestamps{/bold}\n`;
91
+ content += `Created: ${new Date(project.created_at).toLocaleString()}\n`;
92
+ content += `Last Opened: ${project.last_opened ? new Date(project.last_opened).toLocaleString() : 'Never'}\n\n`;
93
+ // Git status
94
+ const gitStatus = this.gitService.getStatus(project.path);
95
+ content += `{bold}Git{/bold}\n`;
96
+ if (gitStatus.isGitRepo) {
97
+ if (gitStatus.branch)
98
+ content += `Branch: {cyan-fg}${gitStatus.branch}{/cyan-fg}\n`;
99
+ if (gitStatus.uncommittedChanges > 0) {
100
+ content += `{yellow-fg}⚠ ${gitStatus.uncommittedChanges} uncommitted changes{/yellow-fg}\n`;
101
+ }
102
+ if (gitStatus.unpushedCommits > 0) {
103
+ content += `{yellow-fg}↑ ${gitStatus.unpushedCommits} unpushed commits{/yellow-fg}\n`;
104
+ }
105
+ if (gitStatus.uncommittedChanges === 0 && gitStatus.unpushedCommits === 0) {
106
+ content += `{green-fg}✓ Clean{/green-fg}\n`;
107
+ }
108
+ }
109
+ else {
110
+ content += '{gray-fg}Not a git repository{/gray-fg}\n';
111
+ }
112
+ content += '\n';
113
+ const subprojects = this.detectSubprojects(project.path);
114
+ if (subprojects.length > 0) {
115
+ content += `{bold}Subprojects (${subprojects.length}){/bold}\n`;
116
+ for (const sub of subprojects) {
117
+ content += `{cyan-fg}📁 ${sub.name}{/cyan-fg}\n`;
118
+ content += ` ${sub.configFiles.join(', ')}\n`;
119
+ }
120
+ content += '\n';
121
+ }
122
+ content += `{bold}Technologies (${project.technologies.length}){/bold}\n`;
123
+ if (project.technologies.length > 0) {
124
+ project.technologies.forEach(t => {
125
+ content += `- ${t.name} ${t.version ? `(v${t.version})` : ''} [${t.category}]\n`;
126
+ });
127
+ }
128
+ else {
129
+ content += '{gray-fg}No technologies detected{/gray-fg}\n';
130
+ }
131
+ content += '\n';
132
+ content += `{bold}Tags (${project.tags.length}){/bold}\n`;
133
+ if (project.tags.length > 0) {
134
+ content += project.tags.map(t => `{cyan-bg}{black-fg} ${t.name} {/black-fg}{/cyan-bg}`).join(' ') + '\n';
135
+ }
136
+ else {
137
+ content += '{gray-fg}No tags{/gray-fg}\n';
138
+ }
139
+ this.box.setContent(content);
140
+ this.screenManager.render();
141
+ }
142
+ detectSubprojects(projectPath) {
143
+ const subprojects = [];
144
+ try {
145
+ if (!fs.existsSync(projectPath))
146
+ return subprojects;
147
+ const entries = fs.readdirSync(projectPath, { withFileTypes: true });
148
+ for (const entry of entries) {
149
+ if (!entry.isDirectory() || entry.name.startsWith('.') || entry.name === 'node_modules') {
150
+ continue;
151
+ }
152
+ const subPath = path.join(projectPath, entry.name);
153
+ const configFiles = [];
154
+ try {
155
+ const subFiles = fs.readdirSync(subPath).map(f => f.toLowerCase());
156
+ for (const configFile of PROJECT_CONFIG_FILES) {
157
+ if (subFiles.includes(configFile.toLowerCase())) {
158
+ configFiles.push(configFile);
159
+ }
160
+ }
161
+ }
162
+ catch {
163
+ continue;
164
+ }
165
+ if (configFiles.length > 0) {
166
+ subprojects.push({
167
+ name: entry.name,
168
+ path: subPath,
169
+ configFiles
170
+ });
171
+ }
172
+ }
173
+ }
174
+ catch {
175
+ // Ignore errors
176
+ }
177
+ return subprojects;
178
+ }
179
+ }
180
+ exports.DetailsPanel = DetailsPanel;
181
+ //# sourceMappingURL=DetailsPanel.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"DetailsPanel.js","sourceRoot":"","sources":["../../../src/ui/components/DetailsPanel.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,15 @@
1
+ import * as blessed from 'blessed';
2
+ import { DetailedProject } from '../../infrastructure/repositories/QueryBuilder';
3
+ export declare class ProjectListView {
4
+ private list;
5
+ private screenManager;
6
+ private projects;
7
+ constructor(parent: blessed.Widgets.Node);
8
+ setProjects(projects: DetailedProject[]): void;
9
+ onSelect(callback: (project: DetailedProject) => void): void;
10
+ getCurrentSelectedProject(): DetailedProject | null;
11
+ get selected(): number;
12
+ select(index: number): void;
13
+ focus(): void;
14
+ }
15
+ //# sourceMappingURL=ProjectListView.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ProjectListView.d.ts","sourceRoot":"","sources":["../../../src/ui/components/ProjectListView.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,OAAO,MAAM,SAAS,CAAC;AAEnC,OAAO,EAAE,eAAe,EAAE,MAAM,gDAAgD,CAAC;AAEjF,qBAAa,eAAe;IAC1B,OAAO,CAAC,IAAI,CAA8B;IAC1C,OAAO,CAAC,aAAa,CAAgB;IACrC,OAAO,CAAC,QAAQ,CAAyB;gBAE7B,MAAM,EAAE,OAAO,CAAC,OAAO,CAAC,IAAI;IAuCjC,WAAW,CAAC,QAAQ,EAAE,eAAe,EAAE,GAAG,IAAI;IAc9C,QAAQ,CAAC,QAAQ,EAAE,CAAC,OAAO,EAAE,eAAe,KAAK,IAAI,GAAG,IAAI;IAe5D,yBAAyB,IAAI,eAAe,GAAG,IAAI;IAQ1D,IAAW,QAAQ,IAAI,MAAM,CAE5B;IAEM,MAAM,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI;IAK3B,KAAK,IAAI,IAAI;CAGrB"}
@@ -0,0 +1,122 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ Object.defineProperty(exports, "__esModule", { value: true });
36
+ exports.ProjectListView = void 0;
37
+ const blessed = __importStar(require("blessed"));
38
+ const ScreenManager_1 = require("../../infrastructure/ui/ScreenManager");
39
+ class ProjectListView {
40
+ constructor(parent) {
41
+ this.projects = [];
42
+ this.screenManager = ScreenManager_1.ScreenManager.getInstance();
43
+ this.list = blessed.list({
44
+ parent,
45
+ top: 0,
46
+ left: 0,
47
+ width: '45%',
48
+ height: '100%',
49
+ border: {
50
+ type: 'line'
51
+ },
52
+ padding: {
53
+ left: 1,
54
+ right: 1
55
+ },
56
+ style: {
57
+ bg: 'black',
58
+ fg: 'white',
59
+ selected: {
60
+ bg: 'blue',
61
+ fg: 'white'
62
+ },
63
+ border: {
64
+ fg: 'cyan',
65
+ bg: 'black'
66
+ }
67
+ },
68
+ keys: true,
69
+ vi: true,
70
+ interactive: true,
71
+ label: ' Projects ',
72
+ tags: true,
73
+ scrollbar: {
74
+ ch: ' '
75
+ }
76
+ });
77
+ }
78
+ setProjects(projects) {
79
+ this.projects = projects;
80
+ const items = projects.map(p => {
81
+ let label = p.name;
82
+ if (p.is_favorite)
83
+ label = `★ ${label}`;
84
+ const techStack = p.technologies.slice(0, 3).map(t => t.name).join(' | ');
85
+ return `${label}\n {gray-fg}${techStack || 'No tech detected'}{/gray-fg}`;
86
+ });
87
+ this.list.setItems(items);
88
+ this.screenManager.render();
89
+ }
90
+ onSelect(callback) {
91
+ this.list.on('select', (item, index) => {
92
+ if (this.projects[index]) {
93
+ callback(this.projects[index]);
94
+ }
95
+ });
96
+ this.list.key(['d', 'D'], () => {
97
+ const selectedIndex = this.list.selected;
98
+ if (this.projects[selectedIndex]) {
99
+ callback(this.projects[selectedIndex]);
100
+ }
101
+ });
102
+ }
103
+ getCurrentSelectedProject() {
104
+ const selectedIndex = this.list.selected;
105
+ if (selectedIndex !== undefined && selectedIndex !== null && selectedIndex >= 0 && this.projects[selectedIndex]) {
106
+ return this.projects[selectedIndex];
107
+ }
108
+ return null;
109
+ }
110
+ get selected() {
111
+ return this.list.selected;
112
+ }
113
+ select(index) {
114
+ this.list.select(index);
115
+ this.screenManager.render();
116
+ }
117
+ focus() {
118
+ this.list.focus();
119
+ }
120
+ }
121
+ exports.ProjectListView = ProjectListView;
122
+ //# sourceMappingURL=ProjectListView.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ProjectListView.js","sourceRoot":"","sources":["../../../src/ui/components/ProjectListView.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,17 @@
1
+ export declare class TUIApplication {
2
+ private screenManager;
3
+ private projectListView;
4
+ private detailsPanel;
5
+ private listUseCase;
6
+ private stateManager;
7
+ private currentProjects;
8
+ private allProjects;
9
+ private isFiltered;
10
+ constructor();
11
+ private initDb;
12
+ private showMessage;
13
+ private getSelectedProject;
14
+ private setupEvents;
15
+ run(): void;
16
+ }
17
+ //# sourceMappingURL=TUIApplication.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"TUIApplication.d.ts","sourceRoot":"","sources":["../../../src/ui/tui/TUIApplication.ts"],"names":[],"mappings":"AAWA,qBAAa,cAAc;IACzB,OAAO,CAAC,aAAa,CAAgB;IACrC,OAAO,CAAC,eAAe,CAAkB;IACzC,OAAO,CAAC,YAAY,CAAe;IACnC,OAAO,CAAC,WAAW,CAAsB;IACzC,OAAO,CAAC,YAAY,CAAe;IACnC,OAAO,CAAC,eAAe,CAAyB;IAChD,OAAO,CAAC,WAAW,CAAyB;IAC5C,OAAO,CAAC,UAAU,CAAkB;;IA4CpC,OAAO,CAAC,MAAM;IASd,OAAO,CAAC,WAAW;IAoBnB,OAAO,CAAC,kBAAkB;IAU1B,OAAO,CAAC,WAAW;IAoaZ,GAAG;CAiBX"}