@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,92 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.QueryBuilder = void 0;
4
+ const DatabaseConnection_1 = require("../database/DatabaseConnection");
5
+ class QueryBuilder {
6
+ constructor() {
7
+ this.db = DatabaseConnection_1.DatabaseConnection.getInstance();
8
+ }
9
+ findProjects(filters) {
10
+ const rawDb = this.db.getRawDatabase();
11
+ let query = 'SELECT DISTINCT p.* FROM projects p';
12
+ const params = [];
13
+ // Joins
14
+ if (filters.tags && filters.tags.length > 0) {
15
+ query += ' JOIN project_tags pt ON p.id = pt.project_id';
16
+ query += ' JOIN tags t ON pt.tag_id = t.id';
17
+ }
18
+ if (filters.technologies && filters.technologies.length > 0) {
19
+ query += ' JOIN technologies tech ON p.id = tech.project_id';
20
+ }
21
+ // Where clauses
22
+ const whereClauses = [];
23
+ if (filters.name) {
24
+ whereClauses.push('p.name LIKE ?');
25
+ params.push(`%${filters.name}%`);
26
+ }
27
+ if (filters.path) {
28
+ whereClauses.push('p.path LIKE ?');
29
+ params.push(`%${filters.path}%`);
30
+ }
31
+ if (filters.is_favorite !== undefined) {
32
+ whereClauses.push('p.is_favorite = ?');
33
+ params.push(filters.is_favorite ? 1 : 0);
34
+ }
35
+ if (filters.tags && filters.tags.length > 0) {
36
+ const placeholders = filters.tags.map(() => '?').join(',');
37
+ whereClauses.push(`t.name IN (${placeholders})`);
38
+ params.push(...filters.tags);
39
+ }
40
+ if (filters.technologies && filters.technologies.length > 0) {
41
+ const placeholders = filters.technologies.map(() => '?').join(',');
42
+ whereClauses.push(`tech.name IN (${placeholders})`);
43
+ params.push(...filters.technologies);
44
+ }
45
+ if (whereClauses.length > 0) {
46
+ query += ' WHERE ' + whereClauses.join(' AND ');
47
+ }
48
+ // Sort
49
+ const sortField = filters.sort === 'created_at' ? 'p.created_at'
50
+ : filters.sort === 'last_opened' ? 'p.last_opened'
51
+ : 'p.name';
52
+ const sortOrder = filters.order === 'DESC' ? 'DESC' : 'ASC';
53
+ query += ` ORDER BY ${sortField} ${sortOrder}`;
54
+ // Pagination
55
+ if (filters.limit !== undefined) {
56
+ query += ' LIMIT ?';
57
+ params.push(filters.limit);
58
+ if (filters.offset !== undefined) {
59
+ query += ' OFFSET ?';
60
+ params.push(filters.offset);
61
+ }
62
+ }
63
+ // Fetch projects
64
+ const stmt = rawDb.prepare(query);
65
+ const projects = stmt.all(...params);
66
+ // Fetch related data (in a real app, might want to batch this or use JSON grouping if SQLite version supports it)
67
+ const result = [];
68
+ for (const project of projects) {
69
+ // Get Tags
70
+ const tagsStmt = rawDb.prepare(`
71
+ SELECT t.* FROM tags t
72
+ JOIN project_tags pt ON t.id = pt.tag_id
73
+ WHERE pt.project_id = ?
74
+ `);
75
+ const tags = tagsStmt.all(project.id);
76
+ // Get Technologies
77
+ const techStmt = rawDb.prepare(`
78
+ SELECT * FROM technologies WHERE project_id = ?
79
+ `);
80
+ const technologies = techStmt.all(project.id);
81
+ result.push({
82
+ ...project,
83
+ is_favorite: Boolean(project.is_favorite), // ensure boolean
84
+ tags,
85
+ technologies
86
+ });
87
+ }
88
+ return result;
89
+ }
90
+ }
91
+ exports.QueryBuilder = QueryBuilder;
92
+ //# sourceMappingURL=QueryBuilder.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"QueryBuilder.js","sourceRoot":"","sources":["../../../src/infrastructure/repositories/QueryBuilder.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,18 @@
1
+ export interface TagEntity {
2
+ id: string;
3
+ name: string;
4
+ created_at: string;
5
+ }
6
+ export declare class TagRepository {
7
+ private db;
8
+ constructor();
9
+ findAll(): TagEntity[];
10
+ findById(id: string): TagEntity | undefined;
11
+ findByName(name: string): TagEntity | undefined;
12
+ create(tag: TagEntity): void;
13
+ delete(id: string): void;
14
+ getTagsForProject(projectId: string): TagEntity[];
15
+ addTagToProject(projectId: string, tagId: string): void;
16
+ removeTagFromProject(projectId: string, tagId: string): void;
17
+ }
18
+ //# sourceMappingURL=TagRepository.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"TagRepository.d.ts","sourceRoot":"","sources":["../../../src/infrastructure/repositories/TagRepository.ts"],"names":[],"mappings":"AAEA,MAAM,WAAW,SAAS;IACxB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,qBAAa,aAAa;IACxB,OAAO,CAAC,EAAE,CAAqB;;IAMxB,OAAO,IAAI,SAAS,EAAE;IAMtB,QAAQ,CAAC,EAAE,EAAE,MAAM,GAAG,SAAS,GAAG,SAAS;IAM3C,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,SAAS,GAAG,SAAS;IAM/C,MAAM,CAAC,GAAG,EAAE,SAAS,GAAG,IAAI;IAU5B,MAAM,CAAC,EAAE,EAAE,MAAM,GAAG,IAAI;IAQxB,iBAAiB,CAAC,SAAS,EAAE,MAAM,GAAG,SAAS,EAAE;IAWjD,eAAe,CAAC,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI;IASvD,oBAAoB,CAAC,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI;CAQpE"}
@@ -0,0 +1,66 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.TagRepository = void 0;
4
+ const DatabaseConnection_1 = require("../database/DatabaseConnection");
5
+ class TagRepository {
6
+ constructor() {
7
+ this.db = DatabaseConnection_1.DatabaseConnection.getInstance();
8
+ }
9
+ findAll() {
10
+ const rawDb = this.db.getRawDatabase();
11
+ const stmt = rawDb.prepare('SELECT * FROM tags ORDER BY name ASC');
12
+ return stmt.all();
13
+ }
14
+ findById(id) {
15
+ const rawDb = this.db.getRawDatabase();
16
+ const stmt = rawDb.prepare('SELECT * FROM tags WHERE id = ?');
17
+ return stmt.get(id);
18
+ }
19
+ findByName(name) {
20
+ const rawDb = this.db.getRawDatabase();
21
+ const stmt = rawDb.prepare('SELECT * FROM tags WHERE name = ?');
22
+ return stmt.get(name);
23
+ }
24
+ create(tag) {
25
+ const rawDb = this.db.getRawDatabase();
26
+ const stmt = rawDb.prepare(`
27
+ INSERT INTO tags (id, name, created_at)
28
+ VALUES (?, ?, ?)
29
+ `);
30
+ stmt.run(tag.id, tag.name, tag.created_at);
31
+ }
32
+ delete(id) {
33
+ const rawDb = this.db.getRawDatabase();
34
+ const stmt = rawDb.prepare('DELETE FROM tags WHERE id = ?');
35
+ stmt.run(id);
36
+ }
37
+ // --- Project Tags operations ---
38
+ getTagsForProject(projectId) {
39
+ const rawDb = this.db.getRawDatabase();
40
+ const stmt = rawDb.prepare(`
41
+ SELECT t.* FROM tags t
42
+ JOIN project_tags pt ON t.id = pt.tag_id
43
+ WHERE pt.project_id = ?
44
+ ORDER BY t.name ASC
45
+ `);
46
+ return stmt.all(projectId);
47
+ }
48
+ addTagToProject(projectId, tagId) {
49
+ const rawDb = this.db.getRawDatabase();
50
+ const stmt = rawDb.prepare(`
51
+ INSERT OR IGNORE INTO project_tags (project_id, tag_id)
52
+ VALUES (?, ?)
53
+ `);
54
+ stmt.run(projectId, tagId);
55
+ }
56
+ removeTagFromProject(projectId, tagId) {
57
+ const rawDb = this.db.getRawDatabase();
58
+ const stmt = rawDb.prepare(`
59
+ DELETE FROM project_tags
60
+ WHERE project_id = ? AND tag_id = ?
61
+ `);
62
+ stmt.run(projectId, tagId);
63
+ }
64
+ }
65
+ exports.TagRepository = TagRepository;
66
+ //# sourceMappingURL=TagRepository.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"TagRepository.js","sourceRoot":"","sources":["../../../src/infrastructure/repositories/TagRepository.ts"],"names":[],"mappings":";;;AAAA,uEAAoE;AAQpE,MAAa,aAAa;IAGxB;QACE,IAAI,CAAC,EAAE,GAAG,uCAAkB,CAAC,WAAW,EAAE,CAAC;IAC7C,CAAC;IAEM,OAAO;QACZ,MAAM,KAAK,GAAG,IAAI,CAAC,EAAE,CAAC,cAAc,EAAE,CAAC;QACvC,MAAM,IAAI,GAAG,KAAK,CAAC,OAAO,CAAC,sCAAsC,CAAC,CAAC;QACnE,OAAO,IAAI,CAAC,GAAG,EAAiB,CAAC;IACnC,CAAC;IAEM,QAAQ,CAAC,EAAU;QACxB,MAAM,KAAK,GAAG,IAAI,CAAC,EAAE,CAAC,cAAc,EAAE,CAAC;QACvC,MAAM,IAAI,GAAG,KAAK,CAAC,OAAO,CAAC,iCAAiC,CAAC,CAAC;QAC9D,OAAO,IAAI,CAAC,GAAG,CAAC,EAAE,CAA0B,CAAC;IAC/C,CAAC;IAEM,UAAU,CAAC,IAAY;QAC5B,MAAM,KAAK,GAAG,IAAI,CAAC,EAAE,CAAC,cAAc,EAAE,CAAC;QACvC,MAAM,IAAI,GAAG,KAAK,CAAC,OAAO,CAAC,mCAAmC,CAAC,CAAC;QAChE,OAAO,IAAI,CAAC,GAAG,CAAC,IAAI,CAA0B,CAAC;IACjD,CAAC;IAEM,MAAM,CAAC,GAAc;QAC1B,MAAM,KAAK,GAAG,IAAI,CAAC,EAAE,CAAC,cAAc,EAAE,CAAC;QACvC,MAAM,IAAI,GAAG,KAAK,CAAC,OAAO,CAAC;;;KAG1B,CAAC,CAAC;QAEH,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,EAAE,GAAG,CAAC,IAAI,EAAE,GAAG,CAAC,UAAU,CAAC,CAAC;IAC7C,CAAC;IAEM,MAAM,CAAC,EAAU;QACtB,MAAM,KAAK,GAAG,IAAI,CAAC,EAAE,CAAC,cAAc,EAAE,CAAC;QACvC,MAAM,IAAI,GAAG,KAAK,CAAC,OAAO,CAAC,+BAA+B,CAAC,CAAC;QAC5D,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IACf,CAAC;IAED,kCAAkC;IAE3B,iBAAiB,CAAC,SAAiB;QACxC,MAAM,KAAK,GAAG,IAAI,CAAC,EAAE,CAAC,cAAc,EAAE,CAAC;QACvC,MAAM,IAAI,GAAG,KAAK,CAAC,OAAO,CAAC;;;;;KAK1B,CAAC,CAAC;QACH,OAAO,IAAI,CAAC,GAAG,CAAC,SAAS,CAAgB,CAAC;IAC5C,CAAC;IAEM,eAAe,CAAC,SAAiB,EAAE,KAAa;QACrD,MAAM,KAAK,GAAG,IAAI,CAAC,EAAE,CAAC,cAAc,EAAE,CAAC;QACvC,MAAM,IAAI,GAAG,KAAK,CAAC,OAAO,CAAC;;;KAG1B,CAAC,CAAC;QACH,IAAI,CAAC,GAAG,CAAC,SAAS,EAAE,KAAK,CAAC,CAAC;IAC7B,CAAC;IAEM,oBAAoB,CAAC,SAAiB,EAAE,KAAa;QAC1D,MAAM,KAAK,GAAG,IAAI,CAAC,EAAE,CAAC,cAAc,EAAE,CAAC;QACvC,MAAM,IAAI,GAAG,KAAK,CAAC,OAAO,CAAC;;;KAG1B,CAAC,CAAC;QACH,IAAI,CAAC,GAAG,CAAC,SAAS,EAAE,KAAK,CAAC,CAAC;IAC7B,CAAC;CACF;AAvED,sCAuEC"}
@@ -0,0 +1,16 @@
1
+ export interface TechnologyEntity {
2
+ id: string;
3
+ project_id: string;
4
+ name: string;
5
+ version: string | null;
6
+ category: string;
7
+ }
8
+ export declare class TechnologyRepository {
9
+ private db;
10
+ constructor();
11
+ getTechnologiesForProject(projectId: string): TechnologyEntity[];
12
+ addTechnology(technology: TechnologyEntity): void;
13
+ removeTechnology(id: string): void;
14
+ replaceProjectTechnologies(projectId: string, technologies: TechnologyEntity[]): void;
15
+ }
16
+ //# sourceMappingURL=TechnologyRepository.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"TechnologyRepository.d.ts","sourceRoot":"","sources":["../../../src/infrastructure/repositories/TechnologyRepository.ts"],"names":[],"mappings":"AAEA,MAAM,WAAW,gBAAgB;IAC/B,EAAE,EAAE,MAAM,CAAC;IACX,UAAU,EAAE,MAAM,CAAC;IACnB,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,qBAAa,oBAAoB;IAC/B,OAAO,CAAC,EAAE,CAAqB;;IAMxB,yBAAyB,CAAC,SAAS,EAAE,MAAM,GAAG,gBAAgB,EAAE;IAUhE,aAAa,CAAC,UAAU,EAAE,gBAAgB,GAAG,IAAI;IAgBjD,gBAAgB,CAAC,EAAE,EAAE,MAAM,GAAG,IAAI;IAMlC,0BAA0B,CAAC,SAAS,EAAE,MAAM,EAAE,YAAY,EAAE,gBAAgB,EAAE,GAAG,IAAI;CAgB7F"}
@@ -0,0 +1,46 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.TechnologyRepository = void 0;
4
+ const DatabaseConnection_1 = require("../database/DatabaseConnection");
5
+ class TechnologyRepository {
6
+ constructor() {
7
+ this.db = DatabaseConnection_1.DatabaseConnection.getInstance();
8
+ }
9
+ getTechnologiesForProject(projectId) {
10
+ const rawDb = this.db.getRawDatabase();
11
+ const stmt = rawDb.prepare(`
12
+ SELECT * FROM technologies
13
+ WHERE project_id = ?
14
+ ORDER BY category ASC, name ASC
15
+ `);
16
+ return stmt.all(projectId);
17
+ }
18
+ addTechnology(technology) {
19
+ const rawDb = this.db.getRawDatabase();
20
+ const stmt = rawDb.prepare(`
21
+ INSERT INTO technologies (id, project_id, name, version, category)
22
+ VALUES (?, ?, ?, ?, ?)
23
+ `);
24
+ stmt.run(technology.id, technology.project_id, technology.name, technology.version, technology.category);
25
+ }
26
+ removeTechnology(id) {
27
+ const rawDb = this.db.getRawDatabase();
28
+ const stmt = rawDb.prepare('DELETE FROM technologies WHERE id = ?');
29
+ stmt.run(id);
30
+ }
31
+ replaceProjectTechnologies(projectId, technologies) {
32
+ const rawDb = this.db.getRawDatabase();
33
+ // Delete all existing technologies for this project
34
+ rawDb.prepare('DELETE FROM technologies WHERE project_id = ?').run(projectId);
35
+ // Insert the new ones
36
+ const insertStmt = rawDb.prepare(`
37
+ INSERT INTO technologies (id, project_id, name, version, category)
38
+ VALUES (?, ?, ?, ?, ?)
39
+ `);
40
+ for (const tech of technologies) {
41
+ insertStmt.run(tech.id, tech.project_id, tech.name, tech.version, tech.category);
42
+ }
43
+ }
44
+ }
45
+ exports.TechnologyRepository = TechnologyRepository;
46
+ //# sourceMappingURL=TechnologyRepository.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"TechnologyRepository.js","sourceRoot":"","sources":["../../../src/infrastructure/repositories/TechnologyRepository.ts"],"names":[],"mappings":";;;AAAA,uEAAoE;AAUpE,MAAa,oBAAoB;IAG/B;QACE,IAAI,CAAC,EAAE,GAAG,uCAAkB,CAAC,WAAW,EAAE,CAAC;IAC7C,CAAC;IAEM,yBAAyB,CAAC,SAAiB;QAChD,MAAM,KAAK,GAAG,IAAI,CAAC,EAAE,CAAC,cAAc,EAAE,CAAC;QACvC,MAAM,IAAI,GAAG,KAAK,CAAC,OAAO,CAAC;;;;KAI1B,CAAC,CAAC;QACH,OAAO,IAAI,CAAC,GAAG,CAAC,SAAS,CAAuB,CAAC;IACnD,CAAC;IAEM,aAAa,CAAC,UAA4B;QAC/C,MAAM,KAAK,GAAG,IAAI,CAAC,EAAE,CAAC,cAAc,EAAE,CAAC;QACvC,MAAM,IAAI,GAAG,KAAK,CAAC,OAAO,CAAC;;;KAG1B,CAAC,CAAC;QAEH,IAAI,CAAC,GAAG,CACN,UAAU,CAAC,EAAE,EACb,UAAU,CAAC,UAAU,EACrB,UAAU,CAAC,IAAI,EACf,UAAU,CAAC,OAAO,EAClB,UAAU,CAAC,QAAQ,CACpB,CAAC;IACJ,CAAC;IAEM,gBAAgB,CAAC,EAAU;QAChC,MAAM,KAAK,GAAG,IAAI,CAAC,EAAE,CAAC,cAAc,EAAE,CAAC;QACvC,MAAM,IAAI,GAAG,KAAK,CAAC,OAAO,CAAC,uCAAuC,CAAC,CAAC;QACpE,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IACf,CAAC;IAEM,0BAA0B,CAAC,SAAiB,EAAE,YAAgC;QACnF,MAAM,KAAK,GAAG,IAAI,CAAC,EAAE,CAAC,cAAc,EAAE,CAAC;QAEvC,oDAAoD;QACpD,KAAK,CAAC,OAAO,CAAC,+CAA+C,CAAC,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;QAE9E,sBAAsB;QACtB,MAAM,UAAU,GAAG,KAAK,CAAC,OAAO,CAAC;;;KAGhC,CAAC,CAAC;QAEH,KAAK,MAAM,IAAI,IAAI,YAAY,EAAE,CAAC;YAChC,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,EAAE,IAAI,CAAC,UAAU,EAAE,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAC;QACnF,CAAC;IACH,CAAC;CACF;AAvDD,oDAuDC"}
@@ -0,0 +1,11 @@
1
+ export declare class TransactionManager {
2
+ private db;
3
+ constructor();
4
+ /**
5
+ * Execute a callback function within a database transaction
6
+ * @param callback Function to execute
7
+ * @returns The result of the callback
8
+ */
9
+ executeTransaction<T>(callback: () => T): T;
10
+ }
11
+ //# sourceMappingURL=TransactionManager.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"TransactionManager.d.ts","sourceRoot":"","sources":["../../../src/infrastructure/repositories/TransactionManager.ts"],"names":[],"mappings":"AAEA,qBAAa,kBAAkB;IAC7B,OAAO,CAAC,EAAE,CAAqB;;IAM/B;;;;OAIG;IACI,kBAAkB,CAAC,CAAC,EAAE,QAAQ,EAAE,MAAM,CAAC,GAAG,CAAC;CAKnD"}
@@ -0,0 +1,21 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.TransactionManager = void 0;
4
+ const DatabaseConnection_1 = require("../database/DatabaseConnection");
5
+ class TransactionManager {
6
+ constructor() {
7
+ this.db = DatabaseConnection_1.DatabaseConnection.getInstance();
8
+ }
9
+ /**
10
+ * Execute a callback function within a database transaction
11
+ * @param callback Function to execute
12
+ * @returns The result of the callback
13
+ */
14
+ executeTransaction(callback) {
15
+ const rawDb = this.db.getRawDatabase();
16
+ const transaction = rawDb.transaction(callback);
17
+ return transaction();
18
+ }
19
+ }
20
+ exports.TransactionManager = TransactionManager;
21
+ //# sourceMappingURL=TransactionManager.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"TransactionManager.js","sourceRoot":"","sources":["../../../src/infrastructure/repositories/TransactionManager.ts"],"names":[],"mappings":";;;AAAA,uEAAoE;AAEpE,MAAa,kBAAkB;IAG7B;QACE,IAAI,CAAC,EAAE,GAAG,uCAAkB,CAAC,WAAW,EAAE,CAAC;IAC7C,CAAC;IAED;;;;OAIG;IACI,kBAAkB,CAAI,QAAiB;QAC5C,MAAM,KAAK,GAAG,IAAI,CAAC,EAAE,CAAC,cAAc,EAAE,CAAC;QACvC,MAAM,WAAW,GAAG,KAAK,CAAC,WAAW,CAAC,QAAQ,CAAC,CAAC;QAChD,OAAO,WAAW,EAAE,CAAC;IACvB,CAAC;CACF;AAjBD,gDAiBC"}
@@ -0,0 +1,11 @@
1
+ import * as blessed from 'blessed';
2
+ export declare class ScreenManager {
3
+ private static instance;
4
+ private screen;
5
+ private constructor();
6
+ static getInstance(): ScreenManager;
7
+ getScreen(): blessed.Widgets.Screen;
8
+ render(): void;
9
+ destroy(): void;
10
+ }
11
+ //# sourceMappingURL=ScreenManager.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ScreenManager.d.ts","sourceRoot":"","sources":["../../../src/infrastructure/ui/ScreenManager.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,OAAO,MAAM,SAAS,CAAC;AAEnC,qBAAa,aAAa;IACxB,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAgB;IACvC,OAAO,CAAC,MAAM,CAAyB;IAEvC,OAAO;WAeO,WAAW,IAAI,aAAa;IAOnC,SAAS,IAAI,OAAO,CAAC,OAAO,CAAC,MAAM;IAInC,MAAM,IAAI,IAAI;IAId,OAAO,IAAI,IAAI;CAGvB"}
@@ -0,0 +1,69 @@
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.ScreenManager = void 0;
37
+ const blessed = __importStar(require("blessed"));
38
+ class ScreenManager {
39
+ constructor() {
40
+ this.screen = blessed.screen({
41
+ smartCSR: true,
42
+ title: 'Project Hub',
43
+ fullUnicode: true,
44
+ dockBorders: true,
45
+ ignoreLocked: ['C-c', 'escape']
46
+ });
47
+ // Handle global exit
48
+ this.screen.key(['escape', 'q', 'C-c'], () => {
49
+ return process.exit(0);
50
+ });
51
+ }
52
+ static getInstance() {
53
+ if (!ScreenManager.instance) {
54
+ ScreenManager.instance = new ScreenManager();
55
+ }
56
+ return ScreenManager.instance;
57
+ }
58
+ getScreen() {
59
+ return this.screen;
60
+ }
61
+ render() {
62
+ this.screen.render();
63
+ }
64
+ destroy() {
65
+ this.screen.destroy();
66
+ }
67
+ }
68
+ exports.ScreenManager = ScreenManager;
69
+ //# sourceMappingURL=ScreenManager.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ScreenManager.js","sourceRoot":"","sources":["../../../src/infrastructure/ui/ScreenManager.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,iDAAmC;AAEnC,MAAa,aAAa;IAIxB;QACE,IAAI,CAAC,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;YAC3B,QAAQ,EAAE,IAAI;YACd,KAAK,EAAE,aAAa;YACpB,WAAW,EAAE,IAAI;YACjB,WAAW,EAAE,IAAI;YACjB,YAAY,EAAE,CAAC,KAAK,EAAE,QAAQ,CAAC;SAChC,CAAC,CAAC;QAEH,qBAAqB;QACrB,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,QAAQ,EAAE,GAAG,EAAE,KAAK,CAAC,EAAE,GAAG,EAAE;YAC3C,OAAO,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QACzB,CAAC,CAAC,CAAC;IACL,CAAC;IAEM,MAAM,CAAC,WAAW;QACvB,IAAI,CAAC,aAAa,CAAC,QAAQ,EAAE,CAAC;YAC5B,aAAa,CAAC,QAAQ,GAAG,IAAI,aAAa,EAAE,CAAC;QAC/C,CAAC;QACD,OAAO,aAAa,CAAC,QAAQ,CAAC;IAChC,CAAC;IAEM,SAAS;QACd,OAAO,IAAI,CAAC,MAAM,CAAC;IACrB,CAAC;IAEM,MAAM;QACX,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC;IACvB,CAAC;IAEM,OAAO;QACZ,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;IACxB,CAAC;CACF;AArCD,sCAqCC"}
@@ -0,0 +1,9 @@
1
+ export declare class CLI {
2
+ private program;
3
+ constructor();
4
+ private setupProgram;
5
+ private initDb;
6
+ private setupCommands;
7
+ run(argv: string[]): void;
8
+ }
9
+ //# sourceMappingURL=CLI.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"CLI.d.ts","sourceRoot":"","sources":["../../../src/ui/cli/CLI.ts"],"names":[],"mappings":"AASA,qBAAa,GAAG;IACd,OAAO,CAAC,OAAO,CAAU;;IAQzB,OAAO,CAAC,YAAY;IAOpB,OAAO,CAAC,MAAM;IASd,OAAO,CAAC,aAAa;IAoJd,GAAG,CAAC,IAAI,EAAE,MAAM,EAAE;CAG1B"}
@@ -0,0 +1,211 @@
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.CLI = void 0;
37
+ const commander_1 = require("commander");
38
+ const ScanProjectsUseCase_1 = require("../../application/use_cases/ScanProjectsUseCase");
39
+ const AddProjectUseCase_1 = require("../../application/use_cases/AddProjectUseCase");
40
+ const RemoveProjectUseCase_1 = require("../../application/use_cases/RemoveProjectUseCase");
41
+ const OpenProjectUseCase_1 = require("../../application/use_cases/OpenProjectUseCase");
42
+ const DatabaseConnection_1 = require("../../infrastructure/database/DatabaseConnection");
43
+ const MigrationRunner_1 = require("../../infrastructure/database/migrations/MigrationRunner");
44
+ const migrations_1 = require("../../infrastructure/database/migrations");
45
+ class CLI {
46
+ constructor() {
47
+ this.program = new commander_1.Command();
48
+ this.setupProgram();
49
+ this.setupCommands();
50
+ }
51
+ setupProgram() {
52
+ this.program
53
+ .name('project-hub')
54
+ .description('A CLI application for managing development projects across multiple technologies')
55
+ .version('0.1.0');
56
+ }
57
+ initDb() {
58
+ const db = DatabaseConnection_1.DatabaseConnection.getInstance();
59
+ if (!db.isConnected()) {
60
+ db.open();
61
+ }
62
+ const migrationRunner = new MigrationRunner_1.MigrationRunner();
63
+ migrationRunner.runPending((0, migrations_1.getAllMigrations)());
64
+ }
65
+ setupCommands() {
66
+ this.program
67
+ .command('scan')
68
+ .description('Scan a directory for projects and add them to the hub')
69
+ .argument('[path]', 'Directory to scan', '.')
70
+ .option('--deep', 'Perform a deep scan')
71
+ .action((pathStr, options) => {
72
+ try {
73
+ this.initDb();
74
+ console.log(`Scanning ${pathStr}...`);
75
+ const useCase = new ScanProjectsUseCase_1.ScanProjectsUseCase();
76
+ const result = useCase.execute(pathStr);
77
+ console.log(`Scan complete! Scanned ${result.scanned} directories.`);
78
+ console.log(`Added: ${result.added}, Updated: ${result.updated} projects.`);
79
+ }
80
+ catch (err) {
81
+ console.error(`Error scanning: ${err.message}`);
82
+ }
83
+ });
84
+ this.program
85
+ .command('add')
86
+ .description('Add a specific project by path')
87
+ .argument('<path>', 'Path to the project')
88
+ .action((pathStr) => {
89
+ try {
90
+ this.initDb();
91
+ const useCase = new AddProjectUseCase_1.AddProjectUseCase();
92
+ const project = useCase.execute(pathStr);
93
+ console.log(`Added project: ${project.name} (${project.path})`);
94
+ }
95
+ catch (err) {
96
+ console.error(`Error adding project: ${err.message}`);
97
+ }
98
+ });
99
+ this.program
100
+ .command('remove')
101
+ .description('Remove a project from the hub by ID')
102
+ .argument('<id>', 'Project ID to remove')
103
+ .action((id) => {
104
+ try {
105
+ this.initDb();
106
+ const useCase = new RemoveProjectUseCase_1.RemoveProjectUseCase();
107
+ useCase.execute(id);
108
+ console.log(`Removed project with ID: ${id}`);
109
+ }
110
+ catch (err) {
111
+ console.error(`Error removing project: ${err.message}`);
112
+ }
113
+ });
114
+ this.program
115
+ .command('open')
116
+ .description('Open a project by ID')
117
+ .argument('<id>', 'Project ID')
118
+ .option('--with <tool>', 'Open with specific tool (e.g. code, cursor, subl)')
119
+ .action((id, options) => {
120
+ try {
121
+ this.initDb();
122
+ const useCase = new OpenProjectUseCase_1.OpenProjectUseCase();
123
+ useCase.execute(id, options.with);
124
+ console.log(`Opening project...`);
125
+ }
126
+ catch (err) {
127
+ console.error(`Error opening project: ${err.message}`);
128
+ }
129
+ });
130
+ this.program
131
+ .command('doctor')
132
+ .description('Run system diagnostics')
133
+ .action(async () => {
134
+ const { SystemDiagnostics } = await Promise.resolve().then(() => __importStar(require('../../application/use_cases/SystemDiagnostics')));
135
+ try {
136
+ this.initDb();
137
+ const diagnostics = new SystemDiagnostics();
138
+ const report = diagnostics.runDiagnostics();
139
+ console.log('\\n--- Editors ---');
140
+ console.log(report.tools.editors.join('\\n') || 'None detected');
141
+ console.log('\\n--- Runtimes ---');
142
+ console.log(report.tools.runtimes.join('\\n') || 'None detected');
143
+ console.log('\\n--- Development Tools ---');
144
+ console.log(report.tools.development.join('\\n') || 'None detected');
145
+ console.log('\\n--- Database Status ---');
146
+ console.log(report.database.isValid ? 'VALID' : 'INVALID');
147
+ if (report.database.errors.length > 0) {
148
+ console.log('Errors:', report.database.errors);
149
+ }
150
+ }
151
+ catch (err) {
152
+ console.error(`Diagnostics failed: ${err.message}`);
153
+ }
154
+ });
155
+ this.program
156
+ .command('sync')
157
+ .description('Sync all configured projects')
158
+ .action(async () => {
159
+ const { SyncProjectsUseCase } = await Promise.resolve().then(() => __importStar(require('../../application/use_cases/SyncProjectsUseCase')));
160
+ try {
161
+ this.initDb();
162
+ const useCase = new SyncProjectsUseCase();
163
+ const result = useCase.execute();
164
+ console.log(`Sync complete!`);
165
+ console.log(`Removed: ${result.removed}`);
166
+ console.log(`Added: ${result.added}`);
167
+ console.log(`Updated: ${result.updated}`);
168
+ }
169
+ catch (err) {
170
+ console.error(`Error syncing projects: ${err.message}`);
171
+ }
172
+ });
173
+ const config = this.program.command('config').description('Manage configuration');
174
+ config.command('list')
175
+ .description('List all configurations')
176
+ .action(async () => {
177
+ const { ConfigManager } = await Promise.resolve().then(() => __importStar(require('../../application/ConfigManager')));
178
+ const cm = new ConfigManager();
179
+ console.log(JSON.stringify(cm.getAll(), null, 2));
180
+ });
181
+ config.command('get <key>')
182
+ .description('Get a configuration value')
183
+ .action(async (key) => {
184
+ const { ConfigManager } = await Promise.resolve().then(() => __importStar(require('../../application/ConfigManager')));
185
+ const cm = new ConfigManager();
186
+ const value = cm.get(key);
187
+ console.log(value);
188
+ });
189
+ config.command('set <key> <value>')
190
+ .description('Set a configuration value')
191
+ .action(async (key, value) => {
192
+ const { ConfigManager } = await Promise.resolve().then(() => __importStar(require('../../application/ConfigManager')));
193
+ const cm = new ConfigManager();
194
+ cm.set(key, value);
195
+ console.log(`Config ${key} set successfully.`);
196
+ });
197
+ config.command('reset')
198
+ .description('Reset configuration to default')
199
+ .action(async () => {
200
+ const { ConfigManager } = await Promise.resolve().then(() => __importStar(require('../../application/ConfigManager')));
201
+ const cm = new ConfigManager();
202
+ cm.reset();
203
+ console.log('Configuration reset to defaults.');
204
+ });
205
+ }
206
+ run(argv) {
207
+ this.program.parse(argv);
208
+ }
209
+ }
210
+ exports.CLI = CLI;
211
+ //# sourceMappingURL=CLI.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"CLI.js","sourceRoot":"","sources":["../../../src/ui/cli/CLI.ts"],"names":[],"mappings":"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"}