git-impact 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 (56) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +305 -0
  3. package/dist/cli/index.d.ts +3 -0
  4. package/dist/cli/index.d.ts.map +1 -0
  5. package/dist/cli/index.js +267 -0
  6. package/dist/cli/index.js.map +1 -0
  7. package/dist/init/installer.d.ts +31 -0
  8. package/dist/init/installer.d.ts.map +1 -0
  9. package/dist/init/installer.js +225 -0
  10. package/dist/init/installer.js.map +1 -0
  11. package/dist/init/templates.d.ts +12 -0
  12. package/dist/init/templates.d.ts.map +1 -0
  13. package/dist/init/templates.js +258 -0
  14. package/dist/init/templates.js.map +1 -0
  15. package/dist/mcp/prompts.d.ts +4 -0
  16. package/dist/mcp/prompts.d.ts.map +1 -0
  17. package/dist/mcp/prompts.js +242 -0
  18. package/dist/mcp/prompts.js.map +1 -0
  19. package/dist/mcp/repo.d.ts +14 -0
  20. package/dist/mcp/repo.d.ts.map +1 -0
  21. package/dist/mcp/repo.js +106 -0
  22. package/dist/mcp/repo.js.map +1 -0
  23. package/dist/mcp/resources.d.ts +4 -0
  24. package/dist/mcp/resources.d.ts.map +1 -0
  25. package/dist/mcp/resources.js +98 -0
  26. package/dist/mcp/resources.js.map +1 -0
  27. package/dist/mcp/server.d.ts +14 -0
  28. package/dist/mcp/server.d.ts.map +1 -0
  29. package/dist/mcp/server.js +61 -0
  30. package/dist/mcp/server.js.map +1 -0
  31. package/dist/mcp/tools.d.ts +12 -0
  32. package/dist/mcp/tools.d.ts.map +1 -0
  33. package/dist/mcp/tools.js +285 -0
  34. package/dist/mcp/tools.js.map +1 -0
  35. package/dist/readers/git.d.ts +23 -0
  36. package/dist/readers/git.d.ts.map +1 -0
  37. package/dist/readers/git.js +120 -0
  38. package/dist/readers/git.js.map +1 -0
  39. package/dist/readers/github.d.ts +22 -0
  40. package/dist/readers/github.d.ts.map +1 -0
  41. package/dist/readers/github.js +94 -0
  42. package/dist/readers/github.js.map +1 -0
  43. package/dist/storage/db.d.ts +31 -0
  44. package/dist/storage/db.d.ts.map +1 -0
  45. package/dist/storage/db.js +170 -0
  46. package/dist/storage/db.js.map +1 -0
  47. package/dist/translator/prompt.d.ts +21 -0
  48. package/dist/translator/prompt.d.ts.map +1 -0
  49. package/dist/translator/prompt.js +117 -0
  50. package/dist/translator/prompt.js.map +1 -0
  51. package/dist/translator/translate.d.ts +36 -0
  52. package/dist/translator/translate.d.ts.map +1 -0
  53. package/dist/translator/translate.js +73 -0
  54. package/dist/translator/translate.js.map +1 -0
  55. package/package.json +55 -0
  56. package/skill/SKILL.md +238 -0
@@ -0,0 +1,285 @@
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.TOOL_DEFINITIONS = void 0;
37
+ exports.handleTool = handleTool;
38
+ const git_1 = require("../readers/git");
39
+ const github_1 = require("../readers/github");
40
+ const db_1 = require("../storage/db");
41
+ const repo_1 = require("./repo");
42
+ // ─── Tool definitions ────────────────────────────────────────────────────────
43
+ exports.TOOL_DEFINITIONS = [
44
+ {
45
+ name: "get_git_activity",
46
+ description: "Read raw git commits and file changes from the current repository. " +
47
+ "Automatically detects the open project — no path needed. " +
48
+ "Returns structured commit data: messages, bodies, changed file paths, and diff stats. " +
49
+ "Always call this first before generating a standup or impact summary.",
50
+ inputSchema: {
51
+ type: "object",
52
+ properties: {
53
+ repo_path: {
54
+ type: "string",
55
+ description: "Override the repo path. Omit to auto-detect from the open project.",
56
+ },
57
+ since_iso: {
58
+ type: "string",
59
+ description: "ISO 8601 start time. Defaults to start of today.",
60
+ },
61
+ until_iso: {
62
+ type: "string",
63
+ description: "ISO 8601 end time. Defaults to now.",
64
+ },
65
+ },
66
+ },
67
+ },
68
+ {
69
+ name: "get_github_activity",
70
+ description: "Fetch GitHub PR activity (opened, merged, reviewed) for the current repo. " +
71
+ "Requires a GitHub token saved in .git-impact/context.json via update_context.",
72
+ inputSchema: {
73
+ type: "object",
74
+ properties: {
75
+ repo_path: { type: "string", description: "Override the repo path." },
76
+ since_iso: { type: "string", description: "ISO 8601 start time. Defaults to start of today." },
77
+ until_iso: { type: "string", description: "ISO 8601 end time. Defaults to now." },
78
+ },
79
+ },
80
+ },
81
+ {
82
+ name: "save_impact_entry",
83
+ description: "Persist a completed impact translation to this repo's local history (.git-impact/history.db). " +
84
+ "Call after translating commits into business impact bullets.",
85
+ inputSchema: {
86
+ type: "object",
87
+ required: ["date", "repo_name", "items"],
88
+ properties: {
89
+ repo_path: { type: "string", description: "Override the repo path." },
90
+ date: { type: "string", description: "ISO date YYYY-MM-DD." },
91
+ repo_name: { type: "string", description: "Human-readable name e.g. 'org/repo'." },
92
+ total_commits: { type: "number" },
93
+ total_files: { type: "number" },
94
+ files_summary: { type: "string" },
95
+ items: {
96
+ type: "array",
97
+ description: "The translated impact bullets.",
98
+ items: {
99
+ type: "object",
100
+ required: ["status", "summary", "impact"],
101
+ properties: {
102
+ status: { type: "string", enum: ["done", "in_progress"] },
103
+ summary: { type: "string" },
104
+ impact: { type: "string" },
105
+ technical_note: { type: "string" },
106
+ },
107
+ },
108
+ },
109
+ },
110
+ },
111
+ },
112
+ {
113
+ name: "get_history",
114
+ description: "Retrieve saved impact entries from this repo's history. " +
115
+ "Use when generating a performance review or when the user asks about past work.",
116
+ inputSchema: {
117
+ type: "object",
118
+ properties: {
119
+ repo_path: { type: "string", description: "Override the repo path." },
120
+ last_days: { type: "number", description: "Last N days. Defaults to 30." },
121
+ from_date: { type: "string", description: "ISO date YYYY-MM-DD." },
122
+ to_date: { type: "string", description: "ISO date YYYY-MM-DD." },
123
+ },
124
+ },
125
+ },
126
+ {
127
+ name: "update_context",
128
+ description: "Save personalization to this repo's .git-impact/context.json: " +
129
+ "company description, manager priorities, technical glossary, GitHub token. " +
130
+ "context.json can be committed to share settings with teammates. " +
131
+ "Call when the user wants to configure the tool for this project.",
132
+ inputSchema: {
133
+ type: "object",
134
+ properties: {
135
+ repo_path: { type: "string", description: "Override the repo path." },
136
+ company_description: { type: "string" },
137
+ manager_priorities: { type: "string" },
138
+ glossary: {
139
+ type: "object",
140
+ description: "Technical term → plain English. e.g. { 'RLS': 'data security layer' }",
141
+ additionalProperties: { type: "string" },
142
+ },
143
+ github_token: { type: "string" },
144
+ anthropic_api_key: { type: "string" },
145
+ },
146
+ },
147
+ },
148
+ ];
149
+ async function handleTool(name, args) {
150
+ switch (name) {
151
+ case "get_git_activity": return handleGetGitActivity(args);
152
+ case "get_github_activity": return handleGetGitHubActivity(args);
153
+ case "save_impact_entry": return handleSaveImpactEntry(args);
154
+ case "get_history": return handleGetHistory(args);
155
+ case "update_context": return handleUpdateContext(args);
156
+ default: return error(`Unknown tool: ${name}`);
157
+ }
158
+ }
159
+ // ─── Handlers ────────────────────────────────────────────────────────────────
160
+ async function handleGetGitActivity(args) {
161
+ const repo = resolveRepo(args.repo_path);
162
+ if ("error" in repo)
163
+ return error(repo.error);
164
+ const since = args.since_iso ? new Date(args.since_iso) : (0, git_1.startOfDay)();
165
+ const until = args.until_iso ? new Date(args.until_iso) : new Date();
166
+ try {
167
+ const git = await (0, git_1.readGitActivity)(repo.path, since, until);
168
+ return ok(JSON.stringify({ ...git, _repo_root: repo.path }, null, 2));
169
+ }
170
+ catch (err) {
171
+ return error(`Could not read git history: ${err.message}`);
172
+ }
173
+ }
174
+ async function handleGetGitHubActivity(args) {
175
+ const repo = resolveRepo(args.repo_path);
176
+ if ("error" in repo)
177
+ return error(repo.error);
178
+ const context = (0, db_1.loadContext)(repo.path);
179
+ if (!context?.githubToken) {
180
+ return error("No GitHub token in .git-impact/context.json. " +
181
+ 'Call update_context with github_token first.');
182
+ }
183
+ const since = args.since_iso ? new Date(args.since_iso) : (0, git_1.startOfDay)();
184
+ const until = args.until_iso ? new Date(args.until_iso) : new Date();
185
+ try {
186
+ const simpleGit = (await Promise.resolve().then(() => __importStar(require("simple-git")))).default;
187
+ const remotes = await simpleGit(repo.path).getRemotes(true);
188
+ const remoteUrl = remotes.find((r) => r.name === "origin")?.refs?.fetch;
189
+ if (!remoteUrl)
190
+ return error("No origin remote found.");
191
+ const github = await (0, github_1.readGitHubActivity)(context.githubToken, remoteUrl, since, until);
192
+ if (!github)
193
+ return error("Could not parse GitHub repo from remote URL.");
194
+ return ok(JSON.stringify(github, null, 2));
195
+ }
196
+ catch (err) {
197
+ return error(`GitHub fetch failed: ${err.message}`);
198
+ }
199
+ }
200
+ function handleSaveImpactEntry(args) {
201
+ const repo = resolveRepo(args.repo_path);
202
+ if ("error" in repo)
203
+ return error(repo.error);
204
+ try {
205
+ const id = (0, db_1.saveEntry)({
206
+ date: args.date,
207
+ repoPath: repo.path,
208
+ repoName: args.repo_name,
209
+ totalCommits: args.total_commits || 0,
210
+ totalFiles: args.total_files || 0,
211
+ filesSummary: args.files_summary || "",
212
+ items: args.items || [],
213
+ rawJson: JSON.stringify(args.items),
214
+ createdAt: new Date().toISOString(),
215
+ }, repo.path);
216
+ return ok(JSON.stringify({ saved: true, id, repo: repo.path }));
217
+ }
218
+ catch (err) {
219
+ return error(`Failed to save entry: ${err.message}`);
220
+ }
221
+ }
222
+ function handleGetHistory(args) {
223
+ const repo = resolveRepo(args.repo_path);
224
+ if ("error" in repo)
225
+ return error(repo.error);
226
+ try {
227
+ const entries = args.from_date && args.to_date
228
+ ? (0, db_1.getEntriesForRange)(args.from_date, args.to_date, repo.path)
229
+ : (0, db_1.getEntriesForDaysAgo)(args.last_days || 30, repo.path);
230
+ return ok(JSON.stringify(entries, null, 2));
231
+ }
232
+ catch (err) {
233
+ return error(`Failed to read history: ${err.message}`);
234
+ }
235
+ }
236
+ function handleUpdateContext(args) {
237
+ const repo = resolveRepo(args.repo_path);
238
+ if ("error" in repo)
239
+ return error(repo.error);
240
+ const existing = (0, db_1.loadContext)(repo.path) ?? {
241
+ companyDescription: "",
242
+ managerPriorities: "",
243
+ glossary: {},
244
+ };
245
+ const updated = {
246
+ companyDescription: args.company_description ?? existing.companyDescription,
247
+ managerPriorities: args.manager_priorities ?? existing.managerPriorities,
248
+ glossary: args.glossary ?? existing.glossary,
249
+ githubToken: args.github_token ?? existing.githubToken,
250
+ anthropicApiKey: args.anthropic_api_key ?? existing.anthropicApiKey,
251
+ };
252
+ try {
253
+ (0, db_1.saveContext)(updated, repo.path);
254
+ return ok(JSON.stringify({
255
+ saved: true,
256
+ location: `${repo.path}/.git-impact/context.json`,
257
+ context: {
258
+ ...updated,
259
+ githubToken: updated.githubToken ? "***" : undefined,
260
+ anthropicApiKey: updated.anthropicApiKey ? "***" : undefined,
261
+ },
262
+ }, null, 2));
263
+ }
264
+ catch (err) {
265
+ return error(`Failed to save context: ${err.message}`);
266
+ }
267
+ }
268
+ // ─── Repo resolution helper ───────────────────────────────────────────────────
269
+ function resolveRepo(explicitPath) {
270
+ try {
271
+ const { path } = (0, repo_1.resolveRepoPath)(explicitPath);
272
+ return { path };
273
+ }
274
+ catch (err) {
275
+ return { error: err.message };
276
+ }
277
+ }
278
+ // ─── Response helpers ─────────────────────────────────────────────────────────
279
+ function ok(text) {
280
+ return { content: [{ type: "text", text }] };
281
+ }
282
+ function error(message) {
283
+ return { content: [{ type: "text", text: message }], isError: true };
284
+ }
285
+ //# sourceMappingURL=tools.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tools.js","sourceRoot":"","sources":["../../src/mcp/tools.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,23 @@
1
+ export interface CommitInfo {
2
+ hash: string;
3
+ date: string;
4
+ message: string;
5
+ author: string;
6
+ body: string;
7
+ diff: string;
8
+ filesChanged: string[];
9
+ }
10
+ export interface GitSummary {
11
+ commits: CommitInfo[];
12
+ totalFilesChanged: number;
13
+ repoName: string;
14
+ branch: string;
15
+ dateRange: {
16
+ from: string;
17
+ to: string;
18
+ };
19
+ }
20
+ export declare function readGitActivity(repoPath: string, since: Date, until?: Date): Promise<GitSummary>;
21
+ export declare function startOfDay(date?: Date): Date;
22
+ export declare function startOfDaysAgo(days: number): Date;
23
+ //# sourceMappingURL=git.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"git.d.ts","sourceRoot":"","sources":["../../src/readers/git.ts"],"names":[],"mappings":"AAGA,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,YAAY,EAAE,MAAM,EAAE,CAAC;CACxB;AAED,MAAM,WAAW,UAAU;IACzB,OAAO,EAAE,UAAU,EAAE,CAAC;IACtB,iBAAiB,EAAE,MAAM,CAAC;IAC1B,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,EAAE,EAAE,MAAM,CAAA;KAAE,CAAC;CACzC;AAaD,wBAAsB,eAAe,CACnC,QAAQ,EAAE,MAAM,EAChB,KAAK,EAAE,IAAI,EACX,KAAK,GAAE,IAAiB,GACvB,OAAO,CAAC,UAAU,CAAC,CAgErB;AAED,wBAAgB,UAAU,CAAC,IAAI,GAAE,IAAiB,GAAG,IAAI,CAIxD;AAED,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAKjD"}
@@ -0,0 +1,120 @@
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
+ var __importDefault = (this && this.__importDefault) || function (mod) {
36
+ return (mod && mod.__esModule) ? mod : { "default": mod };
37
+ };
38
+ Object.defineProperty(exports, "__esModule", { value: true });
39
+ exports.readGitActivity = readGitActivity;
40
+ exports.startOfDay = startOfDay;
41
+ exports.startOfDaysAgo = startOfDaysAgo;
42
+ const simple_git_1 = __importDefault(require("simple-git"));
43
+ const path = __importStar(require("path"));
44
+ function stripCredentials(url) {
45
+ try {
46
+ const parsed = new URL(url);
47
+ parsed.username = "";
48
+ parsed.password = "";
49
+ return parsed.toString();
50
+ }
51
+ catch {
52
+ return url.replace(/\/\/[^@]+@/, "//");
53
+ }
54
+ }
55
+ async function readGitActivity(repoPath, since, until = new Date()) {
56
+ const git = (0, simple_git_1.default)(repoPath);
57
+ const sinceStr = since.toISOString();
58
+ const untilStr = until.toISOString();
59
+ const log = await git.log([
60
+ `--since=${sinceStr}`,
61
+ `--until=${untilStr}`,
62
+ "--author-date-order",
63
+ ]);
64
+ const remotes = await git.getRemotes(true);
65
+ const originRemote = remotes.find((r) => r.name === "origin");
66
+ const remoteUrl = originRemote?.refs?.fetch
67
+ ? stripCredentials(originRemote.refs.fetch)
68
+ : "";
69
+ const repoName = remoteUrl
70
+ .replace(/\.git$/, "")
71
+ .split("/")
72
+ .slice(-2)
73
+ .join("/") || path.basename(repoPath);
74
+ const branch = await git.revparse(["--abbrev-ref", "HEAD"]);
75
+ const commits = await Promise.all(log.all.map(async (entry) => {
76
+ const diff = await git.diff([`${entry.hash}^`, entry.hash, "--stat"]);
77
+ const showOutput = await git.show([
78
+ "--stat",
79
+ "--name-only",
80
+ "--format=",
81
+ entry.hash,
82
+ ]);
83
+ const filesChanged = showOutput
84
+ .split("\n")
85
+ .map((l) => l.trim())
86
+ .filter((l) => l && !l.includes("|") && !l.startsWith("=>") && !l.match(/^\d+ file/));
87
+ return {
88
+ hash: entry.hash.slice(0, 8),
89
+ date: entry.date,
90
+ message: entry.message,
91
+ author: entry.author_name,
92
+ body: entry.body || "",
93
+ diff,
94
+ filesChanged,
95
+ };
96
+ }));
97
+ const allFiles = new Set(commits.flatMap((c) => c.filesChanged));
98
+ return {
99
+ commits,
100
+ totalFilesChanged: allFiles.size,
101
+ repoName,
102
+ branch: branch.trim(),
103
+ dateRange: {
104
+ from: sinceStr,
105
+ to: untilStr,
106
+ },
107
+ };
108
+ }
109
+ function startOfDay(date = new Date()) {
110
+ const d = new Date(date);
111
+ d.setHours(0, 0, 0, 0);
112
+ return d;
113
+ }
114
+ function startOfDaysAgo(days) {
115
+ const d = new Date();
116
+ d.setDate(d.getDate() - days);
117
+ d.setHours(0, 0, 0, 0);
118
+ return d;
119
+ }
120
+ //# sourceMappingURL=git.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"git.js","sourceRoot":"","sources":["../../src/readers/git.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,22 @@
1
+ export interface PullRequestInfo {
2
+ number: number;
3
+ title: string;
4
+ url: string;
5
+ state: "open" | "closed" | "merged";
6
+ body: string;
7
+ additions: number;
8
+ deletions: number;
9
+ changedFiles: number;
10
+ labels: string[];
11
+ mergedAt: string | null;
12
+ createdAt: string;
13
+ updatedAt: string;
14
+ }
15
+ export interface GitHubSummary {
16
+ prsOpened: PullRequestInfo[];
17
+ prsMerged: PullRequestInfo[];
18
+ prsReviewed: PullRequestInfo[];
19
+ repoFullName: string;
20
+ }
21
+ export declare function readGitHubActivity(token: string, remoteUrl: string, since: Date, until?: Date): Promise<GitHubSummary | null>;
22
+ //# sourceMappingURL=github.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"github.d.ts","sourceRoot":"","sources":["../../src/readers/github.ts"],"names":[],"mappings":"AAEA,MAAM,WAAW,eAAe;IAC9B,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,MAAM,GAAG,QAAQ,GAAG,QAAQ,CAAC;IACpC,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,YAAY,EAAE,MAAM,CAAC;IACrB,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,aAAa;IAC5B,SAAS,EAAE,eAAe,EAAE,CAAC;IAC7B,SAAS,EAAE,eAAe,EAAE,CAAC;IAC7B,WAAW,EAAE,eAAe,EAAE,CAAC;IAC/B,YAAY,EAAE,MAAM,CAAC;CACtB;AAWD,wBAAsB,kBAAkB,CACtC,KAAK,EAAE,MAAM,EACb,SAAS,EAAE,MAAM,EACjB,KAAK,EAAE,IAAI,EACX,KAAK,GAAE,IAAiB,GACvB,OAAO,CAAC,aAAa,GAAG,IAAI,CAAC,CAyG/B"}
@@ -0,0 +1,94 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.readGitHubActivity = readGitHubActivity;
4
+ const rest_1 = require("@octokit/rest");
5
+ function parseRepoFromRemote(remoteUrl) {
6
+ // handles https://github.com/owner/repo.git and git@github.com:owner/repo.git
7
+ const httpsMatch = remoteUrl.match(/github\.com[/:]([^/]+)\/([^/.]+)/);
8
+ if (httpsMatch) {
9
+ return { owner: httpsMatch[1], repo: httpsMatch[2].replace(/\.git$/, "") };
10
+ }
11
+ return null;
12
+ }
13
+ async function readGitHubActivity(token, remoteUrl, since, until = new Date()) {
14
+ const parsed = parseRepoFromRemote(remoteUrl);
15
+ if (!parsed)
16
+ return null;
17
+ const octokit = new rest_1.Octokit({ auth: token });
18
+ const { owner, repo } = parsed;
19
+ const username = await octokit.users.getAuthenticated().then((r) => r.data.login).catch(() => null);
20
+ const sinceIso = since.toISOString();
21
+ const untilIso = until.toISOString();
22
+ const [openedPRs, mergedPRs, reviewedPRs] = await Promise.allSettled([
23
+ username
24
+ ? octokit.rest.pulls.list({
25
+ owner, repo, state: "all", sort: "created", direction: "desc", per_page: 50,
26
+ }).then((r) => r.data.filter((pr) => pr.user?.login === username &&
27
+ pr.created_at >= sinceIso &&
28
+ pr.created_at <= untilIso))
29
+ : Promise.resolve([]),
30
+ octokit.rest.pulls.list({
31
+ owner, repo, state: "closed", sort: "updated", direction: "desc", per_page: 50,
32
+ }).then((r) => r.data.filter((pr) => pr.merged_at &&
33
+ pr.merged_at >= sinceIso &&
34
+ pr.merged_at <= untilIso)),
35
+ username
36
+ ? octokit.rest.pulls.list({
37
+ owner, repo, state: "all", sort: "updated", direction: "desc", per_page: 50,
38
+ }).then(async (r) => {
39
+ const reviewed = [];
40
+ for (const pr of r.data.slice(0, 20)) {
41
+ const reviews = await octokit.rest.pulls.listReviews({
42
+ owner, repo, pull_number: pr.number,
43
+ }).catch(() => ({ data: [] }));
44
+ if (reviews.data.some((rv) => rv.user?.login === username &&
45
+ rv.submitted_at &&
46
+ rv.submitted_at >= sinceIso &&
47
+ rv.submitted_at <= untilIso)) {
48
+ reviewed.push(pr);
49
+ }
50
+ }
51
+ return reviewed;
52
+ })
53
+ : Promise.resolve([]),
54
+ ]);
55
+ const toPRInfo = async (pr) => {
56
+ let additions = pr.additions ?? 0;
57
+ let deletions = pr.deletions ?? 0;
58
+ let changedFiles = pr.changed_files ?? 0;
59
+ if (!pr.additions) {
60
+ const detail = await octokit.rest.pulls.get({ owner, repo, pull_number: pr.number }).catch(() => null);
61
+ if (detail) {
62
+ additions = detail.data.additions;
63
+ deletions = detail.data.deletions;
64
+ changedFiles = detail.data.changed_files;
65
+ }
66
+ }
67
+ return {
68
+ number: pr.number,
69
+ title: pr.title,
70
+ url: pr.html_url,
71
+ state: pr.merged_at ? "merged" : pr.state === "closed" ? "closed" : "open",
72
+ body: pr.body?.slice(0, 500) ?? "",
73
+ additions,
74
+ deletions,
75
+ changedFiles,
76
+ labels: pr.labels.map((l) => l.name ?? ""),
77
+ mergedAt: pr.merged_at ?? null,
78
+ createdAt: pr.created_at,
79
+ updatedAt: pr.updated_at,
80
+ };
81
+ };
82
+ const mapSettled = async (result) => {
83
+ if (result.status === "rejected")
84
+ return [];
85
+ return Promise.all(result.value.map(toPRInfo));
86
+ };
87
+ return {
88
+ prsOpened: await mapSettled(openedPRs),
89
+ prsMerged: await mapSettled(mergedPRs),
90
+ prsReviewed: await mapSettled(reviewedPRs),
91
+ repoFullName: `${owner}/${repo}`,
92
+ };
93
+ }
94
+ //# sourceMappingURL=github.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"github.js","sourceRoot":"","sources":["../../src/readers/github.ts"],"names":[],"mappings":";;AAiCA,gDA8GC;AA/ID,wCAAwC;AAwBxC,SAAS,mBAAmB,CAAC,SAAiB;IAC5C,8EAA8E;IAC9E,MAAM,UAAU,GAAG,SAAS,CAAC,KAAK,CAAC,kCAAkC,CAAC,CAAC;IACvE,IAAI,UAAU,EAAE,CAAC;QACf,OAAO,EAAE,KAAK,EAAE,UAAU,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,UAAU,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,QAAQ,EAAE,EAAE,CAAC,EAAE,CAAC;IAC7E,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAEM,KAAK,UAAU,kBAAkB,CACtC,KAAa,EACb,SAAiB,EACjB,KAAW,EACX,QAAc,IAAI,IAAI,EAAE;IAExB,MAAM,MAAM,GAAG,mBAAmB,CAAC,SAAS,CAAC,CAAC;IAC9C,IAAI,CAAC,MAAM;QAAE,OAAO,IAAI,CAAC;IAEzB,MAAM,OAAO,GAAG,IAAI,cAAO,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;IAC7C,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,GAAG,MAAM,CAAC;IAC/B,MAAM,QAAQ,GAAG,MAAM,OAAO,CAAC,KAAK,CAAC,gBAAgB,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,CAAC;IAEpG,MAAM,QAAQ,GAAG,KAAK,CAAC,WAAW,EAAE,CAAC;IACrC,MAAM,QAAQ,GAAG,KAAK,CAAC,WAAW,EAAE,CAAC;IAErC,MAAM,CAAC,SAAS,EAAE,SAAS,EAAE,WAAW,CAAC,GAAG,MAAM,OAAO,CAAC,UAAU,CAAC;QACnE,QAAQ;YACN,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC;gBACtB,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAE,EAAE;aAC5E,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CACZ,CAAC,CAAC,IAAI,CAAC,MAAM,CACX,CAAC,EAAE,EAAE,EAAE,CACL,EAAE,CAAC,IAAI,EAAE,KAAK,KAAK,QAAQ;gBAC3B,EAAE,CAAC,UAAU,IAAI,QAAQ;gBACzB,EAAE,CAAC,UAAU,IAAI,QAAQ,CAC5B,CACF;YACH,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC;QAEvB,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC;YACtB,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,QAAQ,EAAE,IAAI,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAE,EAAE;SAC/E,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CACZ,CAAC,CAAC,IAAI,CAAC,MAAM,CACX,CAAC,EAAE,EAAE,EAAE,CACL,EAAE,CAAC,SAAS;YACZ,EAAE,CAAC,SAAS,IAAI,QAAQ;YACxB,EAAE,CAAC,SAAS,IAAI,QAAQ,CAC3B,CACF;QAED,QAAQ;YACN,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC;gBACtB,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAE,EAAE;aAC5E,CAAC,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC,EAAE,EAAE;gBAClB,MAAM,QAAQ,GAAkB,EAAE,CAAC;gBACnC,KAAK,MAAM,EAAE,IAAI,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC;oBACrC,MAAM,OAAO,GAAG,MAAM,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC;wBACnD,KAAK,EAAE,IAAI,EAAE,WAAW,EAAE,EAAE,CAAC,MAAM;qBACpC,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC;oBAC/B,IAAI,OAAO,CAAC,IAAI,CAAC,IAAI,CACnB,CAAC,EAAE,EAAE,EAAE,CACL,EAAE,CAAC,IAAI,EAAE,KAAK,KAAK,QAAQ;wBAC3B,EAAE,CAAC,YAAY;wBACf,EAAE,CAAC,YAAY,IAAI,QAAQ;wBAC3B,EAAE,CAAC,YAAY,IAAI,QAAQ,CAC9B,EAAE,CAAC;wBACF,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;oBACpB,CAAC;gBACH,CAAC;gBACD,OAAO,QAAQ,CAAC;YAClB,CAAC,CAAC;YACJ,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC;KACxB,CAAC,CAAC;IAEH,MAAM,QAAQ,GAAG,KAAK,EAAE,EAIvB,EAA4B,EAAE;QAC7B,IAAI,SAAS,GAAG,EAAE,CAAC,SAAS,IAAI,CAAC,CAAC;QAClC,IAAI,SAAS,GAAG,EAAE,CAAC,SAAS,IAAI,CAAC,CAAC;QAClC,IAAI,YAAY,GAAG,EAAE,CAAC,aAAa,IAAI,CAAC,CAAC;QAEzC,IAAI,CAAC,EAAE,CAAC,SAAS,EAAE,CAAC;YAClB,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,WAAW,EAAE,EAAE,CAAC,MAAM,EAAE,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,CAAC;YACvG,IAAI,MAAM,EAAE,CAAC;gBACX,SAAS,GAAG,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC;gBAClC,SAAS,GAAG,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC;gBAClC,YAAY,GAAG,MAAM,CAAC,IAAI,CAAC,aAAa,CAAC;YAC3C,CAAC;QACH,CAAC;QAED,OAAO;YACL,MAAM,EAAE,EAAE,CAAC,MAAM;YACjB,KAAK,EAAE,EAAE,CAAC,KAAK;YACf,GAAG,EAAE,EAAE,CAAC,QAAQ;YAChB,KAAK,EAAE,EAAE,CAAC,SAAS,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAM;YAC1E,IAAI,EAAE,EAAE,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,IAAI,EAAE;YAClC,SAAS;YACT,SAAS;YACT,YAAY;YACZ,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,IAAI,EAAE,CAAC;YAC1C,QAAQ,EAAE,EAAE,CAAC,SAAS,IAAI,IAAI;YAC9B,SAAS,EAAE,EAAE,CAAC,UAAU;YACxB,SAAS,EAAE,EAAE,CAAC,UAAU;SACzB,CAAC;IACJ,CAAC,CAAC;IAEF,MAAM,UAAU,GAAG,KAAK,EAAE,MAAuC,EAAE,EAAE;QACnE,IAAI,MAAM,CAAC,MAAM,KAAK,UAAU;YAAE,OAAO,EAAE,CAAC;QAC5C,OAAO,OAAO,CAAC,GAAG,CAAE,MAAM,CAAC,KAA0C,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC;IACvF,CAAC,CAAC;IAEF,OAAO;QACL,SAAS,EAAE,MAAM,UAAU,CAAC,SAAS,CAAC;QACtC,SAAS,EAAE,MAAM,UAAU,CAAC,SAAS,CAAC;QACtC,WAAW,EAAE,MAAM,UAAU,CAAC,WAAW,CAAC;QAC1C,YAAY,EAAE,GAAG,KAAK,IAAI,IAAI,EAAE;KACjC,CAAC;AACJ,CAAC"}
@@ -0,0 +1,31 @@
1
+ export interface UserContext {
2
+ companyDescription: string;
3
+ managerPriorities: string;
4
+ glossary: Record<string, string>;
5
+ githubToken?: string;
6
+ anthropicApiKey?: string;
7
+ }
8
+ export interface ImpactItem {
9
+ status: "done" | "in_progress";
10
+ summary: string;
11
+ impact: string;
12
+ technical_note?: string;
13
+ }
14
+ export interface ImpactEntry {
15
+ id?: number;
16
+ date: string;
17
+ repoPath: string;
18
+ repoName: string;
19
+ totalCommits: number;
20
+ totalFiles: number;
21
+ filesSummary: string;
22
+ items: ImpactItem[];
23
+ rawJson: string;
24
+ createdAt: string;
25
+ }
26
+ export declare function loadContext(repoRoot: string): UserContext | null;
27
+ export declare function saveContext(ctx: UserContext, repoRoot: string): void;
28
+ export declare function saveEntry(entry: ImpactEntry, repoRoot: string): number;
29
+ export declare function getEntriesForRange(fromDate: string, toDate: string, repoRoot: string): ImpactEntry[];
30
+ export declare function getEntriesForDaysAgo(days: number, repoRoot: string): ImpactEntry[];
31
+ //# sourceMappingURL=db.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"db.d.ts","sourceRoot":"","sources":["../../src/storage/db.ts"],"names":[],"mappings":"AAoBA,MAAM,WAAW,WAAW;IAC1B,kBAAkB,EAAE,MAAM,CAAC;IAC3B,iBAAiB,EAAE,MAAM,CAAC;IAC1B,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACjC,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,eAAe,CAAC,EAAE,MAAM,CAAC;CAC1B;AAED,MAAM,WAAW,UAAU;IACzB,MAAM,EAAE,MAAM,GAAG,aAAa,CAAC;IAC/B,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;IACf,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB;AAED,MAAM,WAAW,WAAW;IAC1B,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,YAAY,EAAE,MAAM,CAAC;IACrB,UAAU,EAAE,MAAM,CAAC;IACnB,YAAY,EAAE,MAAM,CAAC;IACrB,KAAK,EAAE,UAAU,EAAE,CAAC;IACpB,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;CACnB;AAuCD,wBAAgB,WAAW,CAAC,QAAQ,EAAE,MAAM,GAAG,WAAW,GAAG,IAAI,CAQhE;AAED,wBAAgB,WAAW,CAAC,GAAG,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM,GAAG,IAAI,CASpE;AAID,wBAAgB,SAAS,CAAC,KAAK,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM,CAmBtE;AAED,wBAAgB,kBAAkB,CAChC,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,MAAM,EACd,QAAQ,EAAE,MAAM,GACf,WAAW,EAAE,CAMf;AAED,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,WAAW,EAAE,CAMlF"}