projex-cli 0.2.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 (85) hide show
  1. package/dist/cli.d.ts +6 -0
  2. package/dist/cli.d.ts.map +1 -0
  3. package/dist/cli.js +321 -0
  4. package/dist/cli.js.map +1 -0
  5. package/dist/event-bus.d.ts +35 -0
  6. package/dist/event-bus.d.ts.map +1 -0
  7. package/dist/event-bus.js +71 -0
  8. package/dist/event-bus.js.map +1 -0
  9. package/dist/events/event-bus.d.ts +35 -0
  10. package/dist/events/event-bus.d.ts.map +1 -0
  11. package/dist/events/event-bus.js +71 -0
  12. package/dist/events/event-bus.js.map +1 -0
  13. package/dist/events/index.d.ts +3 -0
  14. package/dist/events/index.d.ts.map +1 -0
  15. package/dist/events/index.js +3 -0
  16. package/dist/events/index.js.map +1 -0
  17. package/dist/events/types.d.ts +143 -0
  18. package/dist/events/types.d.ts.map +1 -0
  19. package/dist/events/types.js +6 -0
  20. package/dist/events/types.js.map +1 -0
  21. package/dist/index.d.ts +11 -0
  22. package/dist/index.d.ts.map +1 -0
  23. package/dist/index.js +12 -0
  24. package/dist/index.js.map +1 -0
  25. package/dist/inference/enricher.d.ts +18 -0
  26. package/dist/inference/enricher.d.ts.map +1 -0
  27. package/dist/inference/enricher.js +290 -0
  28. package/dist/inference/enricher.js.map +1 -0
  29. package/dist/inference/index.d.ts +5 -0
  30. package/dist/inference/index.d.ts.map +1 -0
  31. package/dist/inference/index.js +5 -0
  32. package/dist/inference/index.js.map +1 -0
  33. package/dist/inference/lifecycle-tracker.d.ts +40 -0
  34. package/dist/inference/lifecycle-tracker.d.ts.map +1 -0
  35. package/dist/inference/lifecycle-tracker.js +132 -0
  36. package/dist/inference/lifecycle-tracker.js.map +1 -0
  37. package/dist/inference/portfolio-generator.d.ts +44 -0
  38. package/dist/inference/portfolio-generator.d.ts.map +1 -0
  39. package/dist/inference/portfolio-generator.js +239 -0
  40. package/dist/inference/portfolio-generator.js.map +1 -0
  41. package/dist/inference/project-detector.d.ts +17 -0
  42. package/dist/inference/project-detector.d.ts.map +1 -0
  43. package/dist/inference/project-detector.js +127 -0
  44. package/dist/inference/project-detector.js.map +1 -0
  45. package/dist/ingestion/github-client.d.ts +56 -0
  46. package/dist/ingestion/github-client.d.ts.map +1 -0
  47. package/dist/ingestion/github-client.js +213 -0
  48. package/dist/ingestion/github-client.js.map +1 -0
  49. package/dist/ingestion/github-poller.d.ts +41 -0
  50. package/dist/ingestion/github-poller.d.ts.map +1 -0
  51. package/dist/ingestion/github-poller.js +121 -0
  52. package/dist/ingestion/github-poller.js.map +1 -0
  53. package/dist/ingestion/normalizer.d.ts +41 -0
  54. package/dist/ingestion/normalizer.d.ts.map +1 -0
  55. package/dist/ingestion/normalizer.js +173 -0
  56. package/dist/ingestion/normalizer.js.map +1 -0
  57. package/dist/integrations/analyzer.d.ts +74 -0
  58. package/dist/integrations/analyzer.d.ts.map +1 -0
  59. package/dist/integrations/analyzer.js +287 -0
  60. package/dist/integrations/analyzer.js.map +1 -0
  61. package/dist/integrations/index.d.ts +4 -0
  62. package/dist/integrations/index.d.ts.map +1 -0
  63. package/dist/integrations/index.js +5 -0
  64. package/dist/integrations/index.js.map +1 -0
  65. package/dist/integrations/injectors.d.ts +60 -0
  66. package/dist/integrations/injectors.d.ts.map +1 -0
  67. package/dist/integrations/injectors.js +361 -0
  68. package/dist/integrations/injectors.js.map +1 -0
  69. package/dist/integrations/template-generator.d.ts +45 -0
  70. package/dist/integrations/template-generator.d.ts.map +1 -0
  71. package/dist/integrations/template-generator.js +187 -0
  72. package/dist/integrations/template-generator.js.map +1 -0
  73. package/dist/storage/index.d.ts +2 -0
  74. package/dist/storage/index.d.ts.map +1 -0
  75. package/dist/storage/index.js +2 -0
  76. package/dist/storage/index.js.map +1 -0
  77. package/dist/storage/project-store.d.ts +23 -0
  78. package/dist/storage/project-store.d.ts.map +1 -0
  79. package/dist/storage/project-store.js +107 -0
  80. package/dist/storage/project-store.js.map +1 -0
  81. package/dist/types.d.ts +143 -0
  82. package/dist/types.d.ts.map +1 -0
  83. package/dist/types.js +6 -0
  84. package/dist/types.js.map +1 -0
  85. package/package.json +55 -0
@@ -0,0 +1,107 @@
1
+ /**
2
+ * Project Store - JSON file-based storage for projects
3
+ * Simple MVP storage that can be swapped for a database later.
4
+ */
5
+ import { readFileSync, writeFileSync, existsSync, mkdirSync } from 'fs';
6
+ import { dirname, join } from 'path';
7
+ export class ProjectStore {
8
+ projects = new Map();
9
+ filePath;
10
+ constructor(config) {
11
+ this.filePath = join(config.storage.dataDir, 'projects.json');
12
+ this.ensureDataDir();
13
+ this.load();
14
+ }
15
+ ensureDataDir() {
16
+ const dir = dirname(this.filePath);
17
+ if (!existsSync(dir)) {
18
+ mkdirSync(dir, { recursive: true });
19
+ }
20
+ }
21
+ load() {
22
+ if (!existsSync(this.filePath)) {
23
+ this.projects = new Map();
24
+ return;
25
+ }
26
+ try {
27
+ const data = readFileSync(this.filePath, 'utf-8');
28
+ const parsed = JSON.parse(data);
29
+ for (const item of parsed) {
30
+ this.projects.set(item.id, this.deserialize(item));
31
+ }
32
+ console.log(`[ProjectStore] Loaded ${this.projects.size} projects`);
33
+ }
34
+ catch (error) {
35
+ console.error('[ProjectStore] Error loading projects:', error);
36
+ this.projects = new Map();
37
+ }
38
+ }
39
+ save() {
40
+ try {
41
+ const serialized = Array.from(this.projects.values()).map(p => this.serialize(p));
42
+ writeFileSync(this.filePath, JSON.stringify(serialized, null, 2));
43
+ }
44
+ catch (error) {
45
+ console.error('[ProjectStore] Error saving projects:', error);
46
+ }
47
+ }
48
+ getProject(id) {
49
+ return this.projects.get(id);
50
+ }
51
+ saveProject(project) {
52
+ this.projects.set(project.id, project);
53
+ this.save(); // Auto-save on each update
54
+ }
55
+ deleteProject(id) {
56
+ const deleted = this.projects.delete(id);
57
+ if (deleted)
58
+ this.save();
59
+ return deleted;
60
+ }
61
+ getAllProjects() {
62
+ return Array.from(this.projects.values());
63
+ }
64
+ getProjectsByStatus(status) {
65
+ return this.getAllProjects().filter(p => p.status === status);
66
+ }
67
+ getProjectsNeedingReview() {
68
+ return this.getAllProjects().filter(p => p.portfolioStatus === 'PENDING_REVIEW');
69
+ }
70
+ getApprovedPortfolios() {
71
+ return this.getAllProjects().filter(p => p.portfolioStatus === 'APPROVED');
72
+ }
73
+ // Serialization helpers for dates
74
+ serialize(project) {
75
+ return {
76
+ ...project,
77
+ startDate: project.startDate.toISOString(),
78
+ lastActivityDate: project.lastActivityDate.toISOString(),
79
+ completionDate: project.completionDate?.toISOString() ?? null,
80
+ createdAt: project.createdAt.toISOString(),
81
+ updatedAt: project.updatedAt.toISOString(),
82
+ portfolioDraft: project.portfolioDraft ? {
83
+ ...project.portfolioDraft,
84
+ timelineStart: project.portfolioDraft.timelineStart.toISOString(),
85
+ timelineEnd: project.portfolioDraft.timelineEnd?.toISOString() ?? null,
86
+ approvedAt: project.portfolioDraft.approvedAt?.toISOString() ?? null,
87
+ } : null,
88
+ };
89
+ }
90
+ deserialize(data) {
91
+ return {
92
+ ...data,
93
+ startDate: new Date(data.startDate),
94
+ lastActivityDate: new Date(data.lastActivityDate),
95
+ completionDate: data.completionDate ? new Date(data.completionDate) : null,
96
+ createdAt: new Date(data.createdAt),
97
+ updatedAt: new Date(data.updatedAt),
98
+ portfolioDraft: data.portfolioDraft ? {
99
+ ...data.portfolioDraft,
100
+ timelineStart: new Date(data.portfolioDraft.timelineStart),
101
+ timelineEnd: data.portfolioDraft.timelineEnd ? new Date(data.portfolioDraft.timelineEnd) : null,
102
+ approvedAt: data.portfolioDraft.approvedAt ? new Date(data.portfolioDraft.approvedAt) : null,
103
+ } : null,
104
+ };
105
+ }
106
+ }
107
+ //# sourceMappingURL=project-store.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"project-store.js","sourceRoot":"","sources":["../../src/storage/project-store.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,143 @@
1
+ /**
2
+ * Core event types for the portfolio inference system.
3
+ * All signals are normalized to these event structures.
4
+ */
5
+ export type EventType = 'repo.created' | 'repo.pushed' | 'repo.topics_changed' | 'repo.description_changed' | 'repo.archived' | 'repo.enriched';
6
+ export interface RepoIdentifier {
7
+ /** Unique ID in format "github:owner/repo" */
8
+ id: string;
9
+ /** Repository name */
10
+ name: string;
11
+ /** Full repository URL */
12
+ url: string;
13
+ /** Owner (user or org) */
14
+ owner: string;
15
+ }
16
+ export interface BaseEvent {
17
+ eventId: string;
18
+ eventType: EventType;
19
+ timestamp: Date;
20
+ source: 'github';
21
+ repo: RepoIdentifier;
22
+ }
23
+ export interface RepoCreatedEvent extends BaseEvent {
24
+ eventType: 'repo.created';
25
+ payload: {
26
+ description: string | null;
27
+ topics: string[];
28
+ isPrivate: boolean;
29
+ };
30
+ }
31
+ export interface RepoPushedEvent extends BaseEvent {
32
+ eventType: 'repo.pushed';
33
+ payload: {
34
+ commitCount: number;
35
+ branch: string;
36
+ };
37
+ }
38
+ export interface RepoTopicsChangedEvent extends BaseEvent {
39
+ eventType: 'repo.topics_changed';
40
+ payload: {
41
+ topics: string[];
42
+ previousTopics: string[];
43
+ };
44
+ }
45
+ export interface RepoDescriptionChangedEvent extends BaseEvent {
46
+ eventType: 'repo.description_changed';
47
+ payload: {
48
+ description: string | null;
49
+ previousDescription: string | null;
50
+ };
51
+ }
52
+ export interface RepoArchivedEvent extends BaseEvent {
53
+ eventType: 'repo.archived';
54
+ payload: {
55
+ archivedAt: Date;
56
+ };
57
+ }
58
+ export interface RepoEnrichedEvent extends BaseEvent {
59
+ eventType: 'repo.enriched';
60
+ payload: {
61
+ languages: Record<string, number>;
62
+ readme: string | null;
63
+ packageFiles: PackageFileInfo[];
64
+ defaultBranch: string;
65
+ starCount: number;
66
+ forkCount: number;
67
+ };
68
+ }
69
+ export interface PackageFileInfo {
70
+ type: 'npm' | 'cargo' | 'pip' | 'go' | 'gem' | 'composer';
71
+ filename: string;
72
+ dependencies: string[];
73
+ devDependencies: string[];
74
+ }
75
+ export type SignalEvent = RepoCreatedEvent | RepoPushedEvent | RepoTopicsChangedEvent | RepoDescriptionChangedEvent | RepoArchivedEvent | RepoEnrichedEvent;
76
+ export type ProjectStatus = 'ACTIVE' | 'LIKELY_COMPLETED' | 'COMPLETED' | 'ARCHIVED' | 'IGNORED';
77
+ export type PortfolioStatus = 'NONE' | 'DRAFT' | 'PENDING_REVIEW' | 'APPROVED' | 'REJECTED';
78
+ export interface TechStackItem {
79
+ name: string;
80
+ category: 'language' | 'framework' | 'library' | 'tool' | 'platform';
81
+ confidence: number;
82
+ source: 'languages_api' | 'package_file' | 'readme' | 'topics';
83
+ }
84
+ export interface Project {
85
+ /** Unique ID: "github:owner/repo" */
86
+ id: string;
87
+ name: string;
88
+ displayName: string;
89
+ owner: string;
90
+ url: string;
91
+ status: ProjectStatus;
92
+ isPrivate: boolean;
93
+ purpose: string | null;
94
+ techStack: TechStackItem[];
95
+ topics: string[];
96
+ startDate: Date;
97
+ lastActivityDate: Date;
98
+ completionDate: Date | null;
99
+ confidence: {
100
+ purpose: number;
101
+ techStack: number;
102
+ completion: number;
103
+ };
104
+ rawData: {
105
+ description: string | null;
106
+ readme: string | null;
107
+ languages: Record<string, number>;
108
+ packageFiles: PackageFileInfo[];
109
+ };
110
+ portfolioStatus: PortfolioStatus;
111
+ portfolioDraft: PortfolioDraft | null;
112
+ createdAt: Date;
113
+ updatedAt: Date;
114
+ }
115
+ export interface PortfolioDraft {
116
+ title: string;
117
+ tagline: string;
118
+ description: string;
119
+ techStack: string[];
120
+ timelineStart: Date;
121
+ timelineEnd: Date | null;
122
+ highlights: string[];
123
+ githubUrl: string;
124
+ liveUrl: string | null;
125
+ userEdits: Partial<Omit<PortfolioDraft, 'userEdits' | 'approved' | 'approvedAt'>>;
126
+ approved: boolean;
127
+ approvedAt: Date | null;
128
+ }
129
+ export interface Config {
130
+ github: {
131
+ token: string;
132
+ username: string;
133
+ pollingIntervalMinutes: number;
134
+ };
135
+ inference: {
136
+ completionThresholdDays: number;
137
+ minCommitsForCompletion: number;
138
+ };
139
+ storage: {
140
+ dataDir: string;
141
+ };
142
+ }
143
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
package/dist/types.js ADDED
@@ -0,0 +1,6 @@
1
+ /**
2
+ * Core event types for the portfolio inference system.
3
+ * All signals are normalized to these event structures.
4
+ */
5
+ export {};
6
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA;;;GAGG"}
package/package.json ADDED
@@ -0,0 +1,55 @@
1
+ {
2
+ "name": "projex-cli",
3
+ "version": "0.2.0",
4
+ "description": "Automatically infer projects from GitHub and generate portfolio entries",
5
+ "type": "module",
6
+ "bin": {
7
+ "projex": "./dist/cli.js"
8
+ },
9
+ "main": "dist/index.js",
10
+ "types": "dist/index.d.ts",
11
+ "files": [
12
+ "dist",
13
+ "README.md"
14
+ ],
15
+ "scripts": {
16
+ "build": "tsc",
17
+ "dev": "tsx src/cli.ts",
18
+ "prepublishOnly": "npm run build"
19
+ },
20
+ "keywords": [
21
+ "portfolio",
22
+ "github",
23
+ "automation",
24
+ "inference",
25
+ "projects",
26
+ "cli"
27
+ ],
28
+ "author": "Mapetere",
29
+ "license": "MIT",
30
+ "repository": {
31
+ "type": "git",
32
+ "url": "https://github.com/Mapetere/projex.git"
33
+ },
34
+ "homepage": "https://github.com/Mapetere/projex#readme",
35
+ "bugs": {
36
+ "url": "https://github.com/Mapetere/projex/issues"
37
+ },
38
+ "engines": {
39
+ "node": ">=18.0.0"
40
+ },
41
+ "dependencies": {
42
+ "@octokit/rest": "^20.0.0",
43
+ "commander": "^11.1.0",
44
+ "chalk": "^5.3.0",
45
+ "ora": "^8.0.0",
46
+ "inquirer": "^9.2.0",
47
+ "zod": "^3.22.0"
48
+ },
49
+ "devDependencies": {
50
+ "@types/inquirer": "^9.0.0",
51
+ "@types/node": "^20.10.0",
52
+ "tsx": "^4.7.0",
53
+ "typescript": "^5.3.0"
54
+ }
55
+ }