@keepgoingdev/mcp-server 0.1.0 → 0.1.2

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.
@@ -1,8 +0,0 @@
1
- /**
2
- * Returns the current git branch name, or undefined if not in a git repo.
3
- */
4
- export declare function getCurrentBranch(workspacePath: string): string | undefined;
5
- /**
6
- * Returns a list of commit subject lines since a given ISO timestamp.
7
- */
8
- export declare function getCommitMessagesSince(workspacePath: string, sinceTimestamp?: string): string[];
@@ -1,52 +0,0 @@
1
- /**
2
- * Git utilities for extracting context from the workspace.
3
- * Copied from apps/extension/src/git/gitUtils.ts. Keep in sync manually.
4
- */
5
- import { execFileSync } from 'node:child_process';
6
- /**
7
- * Returns the current git branch name, or undefined if not in a git repo.
8
- */
9
- export function getCurrentBranch(workspacePath) {
10
- try {
11
- const result = execFileSync('git', ['rev-parse', '--abbrev-ref', 'HEAD'], {
12
- cwd: workspacePath,
13
- encoding: 'utf-8',
14
- timeout: 5000,
15
- });
16
- return result.trim() || undefined;
17
- }
18
- catch {
19
- return undefined;
20
- }
21
- }
22
- /**
23
- * Runs git log with the given format since a timestamp.
24
- */
25
- function getGitLogSince(workspacePath, format, sinceTimestamp) {
26
- try {
27
- const since = sinceTimestamp ||
28
- new Date(Date.now() - 24 * 60 * 60 * 1000).toISOString();
29
- const result = execFileSync('git', ['log', `--since=${since}`, `--format=${format}`], {
30
- cwd: workspacePath,
31
- encoding: 'utf-8',
32
- timeout: 5000,
33
- });
34
- if (!result.trim()) {
35
- return [];
36
- }
37
- return result
38
- .trim()
39
- .split('\n')
40
- .filter((line) => line.length > 0);
41
- }
42
- catch {
43
- return [];
44
- }
45
- }
46
- /**
47
- * Returns a list of commit subject lines since a given ISO timestamp.
48
- */
49
- export function getCommitMessagesSince(workspacePath, sinceTimestamp) {
50
- return getGitLogSince(workspacePath, '%s', sinceTimestamp);
51
- }
52
- //# sourceMappingURL=gitUtils.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"gitUtils.js","sourceRoot":"","sources":["../../src/utils/gitUtils.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAElD;;GAEG;AACH,MAAM,UAAU,gBAAgB,CAAC,aAAqB;IACpD,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,YAAY,CAAC,KAAK,EAAE,CAAC,WAAW,EAAE,cAAc,EAAE,MAAM,CAAC,EAAE;YACxE,GAAG,EAAE,aAAa;YAClB,QAAQ,EAAE,OAAO;YACjB,OAAO,EAAE,IAAI;SACd,CAAC,CAAC;QACH,OAAO,MAAM,CAAC,IAAI,EAAE,IAAI,SAAS,CAAC;IACpC,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,SAAS,CAAC;IACnB,CAAC;AACH,CAAC;AAED;;GAEG;AACH,SAAS,cAAc,CACrB,aAAqB,EACrB,MAAc,EACd,cAAuB;IAEvB,IAAI,CAAC;QACH,MAAM,KAAK,GACT,cAAc;YACd,IAAI,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC,CAAC,WAAW,EAAE,CAAC;QAC3D,MAAM,MAAM,GAAG,YAAY,CACzB,KAAK,EACL,CAAC,KAAK,EAAE,WAAW,KAAK,EAAE,EAAE,YAAY,MAAM,EAAE,CAAC,EACjD;YACE,GAAG,EAAE,aAAa;YAClB,QAAQ,EAAE,OAAO;YACjB,OAAO,EAAE,IAAI;SACd,CACF,CAAC;QAEF,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,EAAE,CAAC;YACnB,OAAO,EAAE,CAAC;QACZ,CAAC;QAED,OAAO,MAAM;aACV,IAAI,EAAE;aACN,KAAK,CAAC,IAAI,CAAC;aACX,MAAM,CAAC,CAAC,IAAY,EAAE,EAAE,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;IAC/C,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,CAAC;IACZ,CAAC;AACH,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,sBAAsB,CACpC,aAAqB,EACrB,cAAuB;IAEvB,OAAO,cAAc,CAAC,aAAa,EAAE,IAAI,EAAE,cAAc,CAAC,CAAC;AAC7D,CAAC"}
@@ -1,6 +0,0 @@
1
- /**
2
- * Re-entry briefing generator.
3
- * Ported from apps/extension/src/reentry/reEntryService.ts. Keep in sync manually.
4
- */
5
- import type { SessionCheckpoint, ProjectState, ReEntryBriefing } from '../types.js';
6
- export declare function generateBriefing(lastSession: SessionCheckpoint | undefined, recentSessions: SessionCheckpoint[], projectState: ProjectState, gitBranch?: string, recentCommitMessages?: string[]): ReEntryBriefing | undefined;
@@ -1,197 +0,0 @@
1
- import { formatRelativeTime } from './timeUtils.js';
2
- export function generateBriefing(lastSession, recentSessions, projectState, gitBranch, recentCommitMessages) {
3
- if (!lastSession) {
4
- return undefined;
5
- }
6
- return {
7
- lastWorked: formatRelativeTime(lastSession.timestamp),
8
- currentFocus: buildCurrentFocus(lastSession, projectState, gitBranch),
9
- recentActivity: buildRecentActivity(lastSession, recentSessions, recentCommitMessages),
10
- suggestedNext: buildSuggestedNext(lastSession, gitBranch),
11
- smallNextStep: buildSmallNextStep(lastSession, gitBranch, recentCommitMessages),
12
- };
13
- }
14
- function buildCurrentFocus(lastSession, projectState, gitBranch) {
15
- if (projectState.derivedCurrentFocus) {
16
- return projectState.derivedCurrentFocus;
17
- }
18
- const branchFocus = inferFocusFromBranch(gitBranch);
19
- if (branchFocus) {
20
- return branchFocus;
21
- }
22
- if (lastSession.summary) {
23
- return lastSession.summary;
24
- }
25
- if (lastSession.touchedFiles.length > 0) {
26
- return inferFocusFromFiles(lastSession.touchedFiles);
27
- }
28
- return 'Unknown';
29
- }
30
- function buildRecentActivity(lastSession, recentSessions, recentCommitMessages) {
31
- const parts = [];
32
- const sessionCount = recentSessions.length;
33
- if (sessionCount > 1) {
34
- parts.push(`${sessionCount} recent sessions`);
35
- }
36
- else if (sessionCount === 1) {
37
- parts.push('1 recent session');
38
- }
39
- if (lastSession.summary) {
40
- parts.push(`Last: ${lastSession.summary}`);
41
- }
42
- if (lastSession.touchedFiles.length > 0) {
43
- parts.push(`${lastSession.touchedFiles.length} files touched`);
44
- }
45
- if (recentCommitMessages && recentCommitMessages.length > 0) {
46
- parts.push(`${recentCommitMessages.length} recent commits`);
47
- }
48
- return parts.length > 0 ? parts.join('. ') : 'No recent activity recorded';
49
- }
50
- function buildSuggestedNext(lastSession, gitBranch) {
51
- if (lastSession.nextStep) {
52
- return lastSession.nextStep;
53
- }
54
- const branchFocus = inferFocusFromBranch(gitBranch);
55
- if (branchFocus) {
56
- return `Continue working on ${branchFocus}`;
57
- }
58
- if (lastSession.touchedFiles.length > 0) {
59
- return `Continue working on ${inferFocusFromFiles(lastSession.touchedFiles)}`;
60
- }
61
- return 'Save a checkpoint to track your next step';
62
- }
63
- function buildSmallNextStep(lastSession, gitBranch, recentCommitMessages) {
64
- const fallback = 'Review last changed files to resume flow';
65
- if (lastSession.nextStep) {
66
- const distilled = distillToSmallStep(lastSession.nextStep, lastSession.touchedFiles);
67
- if (distilled) {
68
- return distilled;
69
- }
70
- }
71
- if (recentCommitMessages && recentCommitMessages.length > 0) {
72
- const commitStep = deriveStepFromCommits(recentCommitMessages);
73
- if (commitStep) {
74
- return commitStep;
75
- }
76
- }
77
- if (lastSession.touchedFiles.length > 0) {
78
- const fileStep = deriveStepFromFiles(lastSession.touchedFiles);
79
- if (fileStep) {
80
- return fileStep;
81
- }
82
- }
83
- const branchFocus = inferFocusFromBranch(gitBranch);
84
- if (branchFocus) {
85
- return `Check git status for ${branchFocus}`;
86
- }
87
- return fallback;
88
- }
89
- function distillToSmallStep(nextStep, touchedFiles) {
90
- if (!nextStep.trim()) {
91
- return undefined;
92
- }
93
- const words = nextStep.trim().split(/\s+/);
94
- if (words.length <= 12) {
95
- if (touchedFiles.length > 0 && !mentionsFile(nextStep)) {
96
- const primaryFile = getPrimaryFileName(touchedFiles);
97
- const enhanced = `${nextStep.trim()} in ${primaryFile}`;
98
- if (enhanced.split(/\s+/).length <= 12) {
99
- return enhanced;
100
- }
101
- }
102
- return nextStep.trim();
103
- }
104
- return words.slice(0, 12).join(' ');
105
- }
106
- function deriveStepFromCommits(commitMessages) {
107
- const lastCommit = commitMessages[0];
108
- if (!lastCommit || !lastCommit.trim()) {
109
- return undefined;
110
- }
111
- const wipPattern = /^(?:wip|work in progress|started?|begin|draft)[:\s]/i;
112
- if (wipPattern.test(lastCommit)) {
113
- const topic = lastCommit.replace(wipPattern, '').trim();
114
- if (topic) {
115
- const words = topic.split(/\s+/).slice(0, 8).join(' ');
116
- return `Continue ${words}`;
117
- }
118
- }
119
- return undefined;
120
- }
121
- function deriveStepFromFiles(files) {
122
- const primaryFile = getPrimaryFileName(files);
123
- if (files.length > 1) {
124
- return `Open ${primaryFile} and review ${files.length} changed files`;
125
- }
126
- return `Open ${primaryFile} and pick up where you left off`;
127
- }
128
- function getPrimaryFileName(files) {
129
- const sourceFiles = files.filter((f) => {
130
- const lower = f.toLowerCase();
131
- return (!lower.includes('test') &&
132
- !lower.includes('spec') &&
133
- !lower.includes('.config') &&
134
- !lower.includes('package.json') &&
135
- !lower.includes('tsconfig'));
136
- });
137
- const target = sourceFiles.length > 0 ? sourceFiles[0] : files[0];
138
- const parts = target.replace(/\\/g, '/').split('/');
139
- return parts[parts.length - 1];
140
- }
141
- function mentionsFile(text) {
142
- return /\w+\.(?:ts|tsx|js|jsx|py|go|rs|java|rb|css|scss|html|json|yaml|yml|md|sql|sh)\b/i.test(text);
143
- }
144
- function inferFocusFromBranch(branch) {
145
- if (!branch ||
146
- branch === 'main' ||
147
- branch === 'master' ||
148
- branch === 'develop' ||
149
- branch === 'HEAD') {
150
- return undefined;
151
- }
152
- const prefixPattern = /^(?:feature|feat|fix|bugfix|hotfix|chore|refactor|docs|test|ci)\//i;
153
- const isFix = /^(?:fix|bugfix|hotfix)\//i.test(branch);
154
- const stripped = branch.replace(prefixPattern, '');
155
- const cleaned = stripped
156
- .replace(/[-_/]/g, ' ')
157
- .replace(/^\d+\s*/, '')
158
- .trim();
159
- if (!cleaned) {
160
- return undefined;
161
- }
162
- return isFix ? `${cleaned} fix` : cleaned;
163
- }
164
- function inferFocusFromFiles(files) {
165
- if (files.length === 0) {
166
- return 'unknown files';
167
- }
168
- const dirs = files
169
- .map((f) => {
170
- const parts = f.replace(/\\/g, '/').split('/');
171
- return parts.length > 1 ? parts.slice(0, -1).join('/') : '';
172
- })
173
- .filter((d) => d.length > 0);
174
- if (dirs.length > 0) {
175
- const counts = new Map();
176
- for (const dir of dirs) {
177
- counts.set(dir, (counts.get(dir) ?? 0) + 1);
178
- }
179
- let topDir = '';
180
- let topCount = 0;
181
- for (const [dir, count] of counts) {
182
- if (count > topCount) {
183
- topDir = dir;
184
- topCount = count;
185
- }
186
- }
187
- if (topDir) {
188
- return `files in ${topDir}`;
189
- }
190
- }
191
- const names = files.slice(0, 3).map((f) => {
192
- const parts = f.replace(/\\/g, '/').split('/');
193
- return parts[parts.length - 1];
194
- });
195
- return names.join(', ');
196
- }
197
- //# sourceMappingURL=reentry.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"reentry.js","sourceRoot":"","sources":["../../src/utils/reentry.ts"],"names":[],"mappings":"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"}
@@ -1,5 +0,0 @@
1
- /**
2
- * Formats a timestamp as a human-readable relative time string.
3
- * Copied from apps/extension/src/utils/timeUtils.ts. Keep in sync manually.
4
- */
5
- export declare function formatRelativeTime(timestamp: string): string;
@@ -1,47 +0,0 @@
1
- /**
2
- * Formats a timestamp as a human-readable relative time string.
3
- * Copied from apps/extension/src/utils/timeUtils.ts. Keep in sync manually.
4
- */
5
- export function formatRelativeTime(timestamp) {
6
- const now = Date.now();
7
- const then = new Date(timestamp).getTime();
8
- const diffMs = now - then;
9
- if (isNaN(diffMs)) {
10
- return 'unknown time';
11
- }
12
- if (diffMs < 0) {
13
- return 'in the future';
14
- }
15
- const seconds = Math.floor(diffMs / 1000);
16
- const minutes = Math.floor(seconds / 60);
17
- const hours = Math.floor(minutes / 60);
18
- const days = Math.floor(hours / 24);
19
- const weeks = Math.floor(days / 7);
20
- const months = Math.floor(days / 30);
21
- const years = Math.floor(days / 365);
22
- if (seconds < 10) {
23
- return 'just now';
24
- }
25
- else if (seconds < 60) {
26
- return `${seconds} seconds ago`;
27
- }
28
- else if (minutes < 60) {
29
- return minutes === 1 ? '1 minute ago' : `${minutes} minutes ago`;
30
- }
31
- else if (hours < 24) {
32
- return hours === 1 ? '1 hour ago' : `${hours} hours ago`;
33
- }
34
- else if (days < 7) {
35
- return days === 1 ? '1 day ago' : `${days} days ago`;
36
- }
37
- else if (weeks < 4) {
38
- return weeks === 1 ? '1 week ago' : `${weeks} weeks ago`;
39
- }
40
- else if (months < 12) {
41
- return months === 1 ? '1 month ago' : `${months} months ago`;
42
- }
43
- else {
44
- return years === 1 ? '1 year ago' : `${years} years ago`;
45
- }
46
- }
47
- //# sourceMappingURL=timeUtils.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"timeUtils.js","sourceRoot":"","sources":["../../src/utils/timeUtils.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,MAAM,UAAU,kBAAkB,CAAC,SAAiB;IAClD,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IACvB,MAAM,IAAI,GAAG,IAAI,IAAI,CAAC,SAAS,CAAC,CAAC,OAAO,EAAE,CAAC;IAC3C,MAAM,MAAM,GAAG,GAAG,GAAG,IAAI,CAAC;IAE1B,IAAI,KAAK,CAAC,MAAM,CAAC,EAAE,CAAC;QAClB,OAAO,cAAc,CAAC;IACxB,CAAC;IAED,IAAI,MAAM,GAAG,CAAC,EAAE,CAAC;QACf,OAAO,eAAe,CAAC;IACzB,CAAC;IAED,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC;IAC1C,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,GAAG,EAAE,CAAC,CAAC;IACzC,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,GAAG,EAAE,CAAC,CAAC;IACvC,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,GAAG,EAAE,CAAC,CAAC;IACpC,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC;IACnC,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,GAAG,EAAE,CAAC,CAAC;IACrC,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,GAAG,GAAG,CAAC,CAAC;IAErC,IAAI,OAAO,GAAG,EAAE,EAAE,CAAC;QACjB,OAAO,UAAU,CAAC;IACpB,CAAC;SAAM,IAAI,OAAO,GAAG,EAAE,EAAE,CAAC;QACxB,OAAO,GAAG,OAAO,cAAc,CAAC;IAClC,CAAC;SAAM,IAAI,OAAO,GAAG,EAAE,EAAE,CAAC;QACxB,OAAO,OAAO,KAAK,CAAC,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC,CAAC,GAAG,OAAO,cAAc,CAAC;IACnE,CAAC;SAAM,IAAI,KAAK,GAAG,EAAE,EAAE,CAAC;QACtB,OAAO,KAAK,KAAK,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,GAAG,KAAK,YAAY,CAAC;IAC3D,CAAC;SAAM,IAAI,IAAI,GAAG,CAAC,EAAE,CAAC;QACpB,OAAO,IAAI,KAAK,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,GAAG,IAAI,WAAW,CAAC;IACvD,CAAC;SAAM,IAAI,KAAK,GAAG,CAAC,EAAE,CAAC;QACrB,OAAO,KAAK,KAAK,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,GAAG,KAAK,YAAY,CAAC;IAC3D,CAAC;SAAM,IAAI,MAAM,GAAG,EAAE,EAAE,CAAC;QACvB,OAAO,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,GAAG,MAAM,aAAa,CAAC;IAC/D,CAAC;SAAM,CAAC;QACN,OAAO,KAAK,KAAK,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,GAAG,KAAK,YAAY,CAAC;IAC3D,CAAC;AACH,CAAC"}