@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.
- package/README.md +98 -0
- package/dist/application/ConfigManager.d.ts +73 -0
- package/dist/application/ConfigManager.d.ts.map +1 -0
- package/dist/application/ConfigManager.js +253 -0
- package/dist/application/ConfigManager.js.map +1 -0
- package/dist/application/errors/ErrorHandler.d.ts +27 -0
- package/dist/application/errors/ErrorHandler.d.ts.map +1 -0
- package/dist/application/errors/ErrorHandler.js +88 -0
- package/dist/application/errors/ErrorHandler.js.map +1 -0
- package/dist/application/state/StateManager.d.ts +26 -0
- package/dist/application/state/StateManager.d.ts.map +1 -0
- package/dist/application/state/StateManager.js +114 -0
- package/dist/application/state/StateManager.js.map +1 -0
- package/dist/application/use_cases/AddProjectUseCase.d.ts +9 -0
- package/dist/application/use_cases/AddProjectUseCase.d.ts.map +1 -0
- package/dist/application/use_cases/AddProjectUseCase.js +85 -0
- package/dist/application/use_cases/AddProjectUseCase.js.map +1 -0
- package/dist/application/use_cases/ListProjectsUseCase.d.ts +7 -0
- package/dist/application/use_cases/ListProjectsUseCase.d.ts.map +1 -0
- package/dist/application/use_cases/ListProjectsUseCase.js +14 -0
- package/dist/application/use_cases/ListProjectsUseCase.js.map +1 -0
- package/dist/application/use_cases/OpenProjectUseCase.d.ts +10 -0
- package/dist/application/use_cases/OpenProjectUseCase.d.ts.map +1 -0
- package/dist/application/use_cases/OpenProjectUseCase.js +168 -0
- package/dist/application/use_cases/OpenProjectUseCase.js.map +1 -0
- package/dist/application/use_cases/RemoveProjectUseCase.d.ts +7 -0
- package/dist/application/use_cases/RemoveProjectUseCase.d.ts.map +1 -0
- package/dist/application/use_cases/RemoveProjectUseCase.js +24 -0
- package/dist/application/use_cases/RemoveProjectUseCase.js.map +1 -0
- package/dist/application/use_cases/ScanProjectsUseCase.d.ts +13 -0
- package/dist/application/use_cases/ScanProjectsUseCase.d.ts.map +1 -0
- package/dist/application/use_cases/ScanProjectsUseCase.js +57 -0
- package/dist/application/use_cases/ScanProjectsUseCase.js.map +1 -0
- package/dist/application/use_cases/SyncProjectsUseCase.d.ts +12 -0
- package/dist/application/use_cases/SyncProjectsUseCase.d.ts.map +1 -0
- package/dist/application/use_cases/SyncProjectsUseCase.js +74 -0
- package/dist/application/use_cases/SyncProjectsUseCase.js.map +1 -0
- package/dist/application/use_cases/SystemDiagnostics.d.ts +16 -0
- package/dist/application/use_cases/SystemDiagnostics.d.ts.map +1 -0
- package/dist/application/use_cases/SystemDiagnostics.js +35 -0
- package/dist/application/use_cases/SystemDiagnostics.js.map +1 -0
- package/dist/application/use_cases/TagProjectUseCase.d.ts +9 -0
- package/dist/application/use_cases/TagProjectUseCase.d.ts.map +1 -0
- package/dist/application/use_cases/TagProjectUseCase.js +41 -0
- package/dist/application/use_cases/TagProjectUseCase.js.map +1 -0
- package/dist/domain/patterns/ProjectPatterns.d.ts +47 -0
- package/dist/domain/patterns/ProjectPatterns.d.ts.map +1 -0
- package/dist/domain/patterns/ProjectPatterns.js +200 -0
- package/dist/domain/patterns/ProjectPatterns.js.map +1 -0
- package/dist/domain/services/GitService.d.ts +23 -0
- package/dist/domain/services/GitService.d.ts.map +1 -0
- package/dist/domain/services/GitService.js +155 -0
- package/dist/domain/services/GitService.js.map +1 -0
- package/dist/domain/services/IgnoreFileParser.d.ts +55 -0
- package/dist/domain/services/IgnoreFileParser.d.ts.map +1 -0
- package/dist/domain/services/IgnoreFileParser.js +200 -0
- package/dist/domain/services/IgnoreFileParser.js.map +1 -0
- package/dist/domain/services/ProjectScanner.d.ts +65 -0
- package/dist/domain/services/ProjectScanner.d.ts.map +1 -0
- package/dist/domain/services/ProjectScanner.js +207 -0
- package/dist/domain/services/ProjectScanner.js.map +1 -0
- package/dist/domain/services/TechnologyDetector.d.ts +78 -0
- package/dist/domain/services/TechnologyDetector.d.ts.map +1 -0
- package/dist/domain/services/TechnologyDetector.js +633 -0
- package/dist/domain/services/TechnologyDetector.js.map +1 -0
- package/dist/domain/services/ToolDetector.d.ts +74 -0
- package/dist/domain/services/ToolDetector.d.ts.map +1 -0
- package/dist/domain/services/ToolDetector.js +344 -0
- package/dist/domain/services/ToolDetector.js.map +1 -0
- package/dist/domain/services/index.d.ts +5 -0
- package/dist/domain/services/index.d.ts.map +1 -0
- package/dist/domain/services/index.js +12 -0
- package/dist/domain/services/index.js.map +1 -0
- package/dist/domain/types/Config.d.ts +37 -0
- package/dist/domain/types/Config.d.ts.map +1 -0
- package/dist/domain/types/Config.js +6 -0
- package/dist/domain/types/Config.js.map +1 -0
- package/dist/index.d.ts +6 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +17 -0
- package/dist/index.js.map +1 -0
- package/dist/infrastructure/database/DatabaseConnection.d.ts +88 -0
- package/dist/infrastructure/database/DatabaseConnection.d.ts.map +1 -0
- package/dist/infrastructure/database/DatabaseConnection.js +318 -0
- package/dist/infrastructure/database/DatabaseConnection.js.map +1 -0
- package/dist/infrastructure/database/DatabaseValidator.d.ts +154 -0
- package/dist/infrastructure/database/DatabaseValidator.d.ts.map +1 -0
- package/dist/infrastructure/database/DatabaseValidator.js +583 -0
- package/dist/infrastructure/database/DatabaseValidator.js.map +1 -0
- package/dist/infrastructure/database/index.d.ts +8 -0
- package/dist/infrastructure/database/index.d.ts.map +1 -0
- package/dist/infrastructure/database/index.js +14 -0
- package/dist/infrastructure/database/index.js.map +1 -0
- package/dist/infrastructure/database/migrations/001_initial.d.ts +24 -0
- package/dist/infrastructure/database/migrations/001_initial.d.ts.map +1 -0
- package/dist/infrastructure/database/migrations/001_initial.js +109 -0
- package/dist/infrastructure/database/migrations/001_initial.js.map +1 -0
- package/dist/infrastructure/database/migrations/Migration.d.ts +27 -0
- package/dist/infrastructure/database/migrations/Migration.d.ts.map +1 -0
- package/dist/infrastructure/database/migrations/Migration.js +3 -0
- package/dist/infrastructure/database/migrations/Migration.js.map +1 -0
- package/dist/infrastructure/database/migrations/MigrationRunner.d.ts +52 -0
- package/dist/infrastructure/database/migrations/MigrationRunner.d.ts.map +1 -0
- package/dist/infrastructure/database/migrations/MigrationRunner.js +167 -0
- package/dist/infrastructure/database/migrations/MigrationRunner.js.map +1 -0
- package/dist/infrastructure/database/migrations/index.d.ts +10 -0
- package/dist/infrastructure/database/migrations/index.d.ts.map +1 -0
- package/dist/infrastructure/database/migrations/index.js +22 -0
- package/dist/infrastructure/database/migrations/index.js.map +1 -0
- package/dist/infrastructure/filesystem/DirectoryManager.d.ts +50 -0
- package/dist/infrastructure/filesystem/DirectoryManager.d.ts.map +1 -0
- package/dist/infrastructure/filesystem/DirectoryManager.js +143 -0
- package/dist/infrastructure/filesystem/DirectoryManager.js.map +1 -0
- package/dist/infrastructure/filesystem/index.d.ts +2 -0
- package/dist/infrastructure/filesystem/index.d.ts.map +1 -0
- package/dist/infrastructure/filesystem/index.js +6 -0
- package/dist/infrastructure/filesystem/index.js.map +1 -0
- package/dist/infrastructure/logging/LogRotator.d.ts +43 -0
- package/dist/infrastructure/logging/LogRotator.d.ts.map +1 -0
- package/dist/infrastructure/logging/LogRotator.js +172 -0
- package/dist/infrastructure/logging/LogRotator.js.map +1 -0
- package/dist/infrastructure/logging/Logger.d.ts +59 -0
- package/dist/infrastructure/logging/Logger.d.ts.map +1 -0
- package/dist/infrastructure/logging/Logger.js +182 -0
- package/dist/infrastructure/logging/Logger.js.map +1 -0
- package/dist/infrastructure/logging/index.d.ts +3 -0
- package/dist/infrastructure/logging/index.d.ts.map +1 -0
- package/dist/infrastructure/logging/index.js +8 -0
- package/dist/infrastructure/logging/index.js.map +1 -0
- package/dist/infrastructure/repositories/ProjectRepository.d.ts +20 -0
- package/dist/infrastructure/repositories/ProjectRepository.d.ts.map +1 -0
- package/dist/infrastructure/repositories/ProjectRepository.js +61 -0
- package/dist/infrastructure/repositories/ProjectRepository.js.map +1 -0
- package/dist/infrastructure/repositories/QueryBuilder.d.ts +24 -0
- package/dist/infrastructure/repositories/QueryBuilder.d.ts.map +1 -0
- package/dist/infrastructure/repositories/QueryBuilder.js +92 -0
- package/dist/infrastructure/repositories/QueryBuilder.js.map +1 -0
- package/dist/infrastructure/repositories/TagRepository.d.ts +18 -0
- package/dist/infrastructure/repositories/TagRepository.d.ts.map +1 -0
- package/dist/infrastructure/repositories/TagRepository.js +66 -0
- package/dist/infrastructure/repositories/TagRepository.js.map +1 -0
- package/dist/infrastructure/repositories/TechnologyRepository.d.ts +16 -0
- package/dist/infrastructure/repositories/TechnologyRepository.d.ts.map +1 -0
- package/dist/infrastructure/repositories/TechnologyRepository.js +46 -0
- package/dist/infrastructure/repositories/TechnologyRepository.js.map +1 -0
- package/dist/infrastructure/repositories/TransactionManager.d.ts +11 -0
- package/dist/infrastructure/repositories/TransactionManager.d.ts.map +1 -0
- package/dist/infrastructure/repositories/TransactionManager.js +21 -0
- package/dist/infrastructure/repositories/TransactionManager.js.map +1 -0
- package/dist/infrastructure/ui/ScreenManager.d.ts +11 -0
- package/dist/infrastructure/ui/ScreenManager.d.ts.map +1 -0
- package/dist/infrastructure/ui/ScreenManager.js +69 -0
- package/dist/infrastructure/ui/ScreenManager.js.map +1 -0
- package/dist/ui/cli/CLI.d.ts +9 -0
- package/dist/ui/cli/CLI.d.ts.map +1 -0
- package/dist/ui/cli/CLI.js +211 -0
- package/dist/ui/cli/CLI.js.map +1 -0
- package/dist/ui/components/DetailsPanel.d.ts +11 -0
- package/dist/ui/components/DetailsPanel.d.ts.map +1 -0
- package/dist/ui/components/DetailsPanel.js +181 -0
- package/dist/ui/components/DetailsPanel.js.map +1 -0
- package/dist/ui/components/ProjectListView.d.ts +15 -0
- package/dist/ui/components/ProjectListView.d.ts.map +1 -0
- package/dist/ui/components/ProjectListView.js +122 -0
- package/dist/ui/components/ProjectListView.js.map +1 -0
- package/dist/ui/tui/TUIApplication.d.ts +17 -0
- package/dist/ui/tui/TUIApplication.d.ts.map +1 -0
- package/dist/ui/tui/TUIApplication.js +532 -0
- package/dist/ui/tui/TUIApplication.js.map +1 -0
- package/dist/ui/tui/Theme.d.ts +25 -0
- package/dist/ui/tui/Theme.d.ts.map +1 -0
- package/dist/ui/tui/Theme.js +62 -0
- package/dist/ui/tui/Theme.js.map +1 -0
- 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 @@
|
|
|
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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"}
|