@vibescope/mcp-server 0.4.4 → 0.4.6
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/CHANGELOG.md +84 -84
- package/README.md +194 -194
- package/dist/api-client/bodies-of-work.d.ts +125 -0
- package/dist/api-client/bodies-of-work.js +78 -0
- package/dist/api-client/chat.d.ts +26 -0
- package/dist/api-client/chat.js +20 -0
- package/dist/api-client/connectors.d.ts +104 -0
- package/dist/api-client/connectors.js +46 -0
- package/dist/api-client/deployment.d.ts +190 -0
- package/dist/api-client/deployment.js +113 -0
- package/dist/api-client/file-checkouts.d.ts +71 -0
- package/dist/api-client/file-checkouts.js +43 -0
- package/dist/api-client/git-issues.d.ts +55 -0
- package/dist/api-client/git-issues.js +34 -0
- package/dist/api-client/index.d.ts +619 -1
- package/dist/api-client/index.js +148 -0
- package/dist/api-client/organizations.d.ts +101 -0
- package/dist/api-client/organizations.js +86 -0
- package/dist/api-client/progress.d.ts +61 -0
- package/dist/api-client/progress.js +34 -0
- package/dist/api-client/project.d.ts +1 -0
- package/dist/api-client/requests.d.ts +28 -0
- package/dist/api-client/requests.js +28 -0
- package/dist/api-client/sprints.d.ts +153 -0
- package/dist/api-client/sprints.js +82 -0
- package/dist/api-client/subtasks.d.ts +37 -0
- package/dist/api-client/subtasks.js +23 -0
- package/dist/api-client.d.ts +23 -0
- package/dist/api-client.js +15 -0
- package/dist/cli-init.js +21 -21
- package/dist/cli.js +26 -26
- package/dist/handlers/blockers.js +4 -0
- package/dist/handlers/chat.d.ts +23 -0
- package/dist/handlers/chat.js +84 -0
- package/dist/handlers/deployment.d.ts +3 -0
- package/dist/handlers/deployment.js +23 -0
- package/dist/handlers/discovery.js +13 -0
- package/dist/handlers/index.d.ts +1 -0
- package/dist/handlers/index.js +3 -0
- package/dist/handlers/project.js +4 -2
- package/dist/handlers/session.js +7 -0
- package/dist/handlers/tasks.js +7 -0
- package/dist/handlers/tool-docs.js +1204 -1131
- package/dist/index.js +73 -73
- package/dist/templates/agent-guidelines.d.ts +1 -1
- package/dist/templates/agent-guidelines.js +205 -187
- package/dist/templates/help-content.js +1621 -1621
- package/dist/tools/bodies-of-work.js +6 -6
- package/dist/tools/chat.d.ts +1 -0
- package/dist/tools/chat.js +24 -0
- package/dist/tools/cloud-agents.js +22 -22
- package/dist/tools/deployment.js +13 -0
- package/dist/tools/features.d.ts +13 -0
- package/dist/tools/features.js +151 -0
- package/dist/tools/index.d.ts +3 -1
- package/dist/tools/index.js +4 -1
- package/dist/tools/milestones.js +2 -2
- package/dist/tools/project.js +4 -0
- package/dist/tools/requests.js +1 -1
- package/dist/tools/session.js +11 -11
- package/dist/tools/sprints.js +9 -9
- package/dist/tools/tasks.js +35 -35
- package/dist/tools/worktrees.js +14 -14
- package/dist/tools.d.ts +2 -0
- package/dist/tools.js +3602 -0
- package/dist/utils.js +11 -11
- package/docs/TOOLS.md +2663 -2545
- package/package.json +53 -53
- package/scripts/generate-docs.ts +212 -212
- package/scripts/version-bump.ts +203 -203
- package/src/api-client/blockers.ts +86 -86
- package/src/api-client/bodies-of-work.ts +194 -0
- package/src/api-client/chat.ts +50 -0
- package/src/api-client/connectors.ts +152 -0
- package/src/api-client/cost.ts +185 -185
- package/src/api-client/decisions.ts +87 -87
- package/src/api-client/deployment.ts +313 -0
- package/src/api-client/discovery.ts +81 -81
- package/src/api-client/fallback.ts +52 -52
- package/src/api-client/file-checkouts.ts +115 -0
- package/src/api-client/findings.ts +100 -100
- package/src/api-client/git-issues.ts +88 -0
- package/src/api-client/ideas.ts +112 -112
- package/src/api-client/index.ts +592 -426
- package/src/api-client/milestones.ts +83 -83
- package/src/api-client/organizations.ts +185 -0
- package/src/api-client/progress.ts +94 -0
- package/src/api-client/project.ts +180 -179
- package/src/api-client/requests.ts +54 -0
- package/src/api-client/session.ts +220 -220
- package/src/api-client/sprints.ts +227 -0
- package/src/api-client/subtasks.ts +57 -0
- package/src/api-client/tasks.ts +450 -450
- package/src/api-client/types.ts +32 -32
- package/src/api-client/validation.ts +60 -60
- package/src/api-client/worktrees.ts +53 -53
- package/src/api-client.test.ts +847 -850
- package/src/api-client.ts +2707 -2672
- package/src/cli-init.ts +557 -557
- package/src/cli.test.ts +284 -284
- package/src/cli.ts +204 -204
- package/src/handlers/__test-setup__.ts +240 -236
- package/src/handlers/__test-utils__.ts +89 -89
- package/src/handlers/blockers.test.ts +468 -468
- package/src/handlers/blockers.ts +172 -163
- package/src/handlers/bodies-of-work.test.ts +704 -704
- package/src/handlers/bodies-of-work.ts +526 -526
- package/src/handlers/chat.test.ts +185 -0
- package/src/handlers/chat.ts +101 -0
- package/src/handlers/cloud-agents.test.ts +438 -438
- package/src/handlers/cloud-agents.ts +156 -156
- package/src/handlers/connectors.test.ts +834 -834
- package/src/handlers/connectors.ts +229 -229
- package/src/handlers/cost.test.ts +462 -462
- package/src/handlers/cost.ts +285 -285
- package/src/handlers/decisions.test.ts +382 -382
- package/src/handlers/decisions.ts +153 -153
- package/src/handlers/deployment.test.ts +551 -551
- package/src/handlers/deployment.ts +570 -541
- package/src/handlers/discovery.test.ts +206 -206
- package/src/handlers/discovery.ts +427 -414
- package/src/handlers/fallback.test.ts +537 -537
- package/src/handlers/fallback.ts +194 -194
- package/src/handlers/file-checkouts.test.ts +750 -750
- package/src/handlers/file-checkouts.ts +185 -185
- package/src/handlers/findings.test.ts +633 -633
- package/src/handlers/findings.ts +239 -239
- package/src/handlers/git-issues.test.ts +631 -631
- package/src/handlers/git-issues.ts +136 -136
- package/src/handlers/ideas.test.ts +644 -644
- package/src/handlers/ideas.ts +207 -207
- package/src/handlers/index.ts +93 -90
- package/src/handlers/milestones.test.ts +475 -475
- package/src/handlers/milestones.ts +180 -180
- package/src/handlers/organizations.test.ts +826 -826
- package/src/handlers/organizations.ts +315 -315
- package/src/handlers/progress.test.ts +269 -269
- package/src/handlers/progress.ts +77 -77
- package/src/handlers/project.test.ts +546 -546
- package/src/handlers/project.ts +242 -239
- package/src/handlers/requests.test.ts +303 -303
- package/src/handlers/requests.ts +99 -99
- package/src/handlers/roles.test.ts +305 -305
- package/src/handlers/roles.ts +219 -219
- package/src/handlers/session.test.ts +998 -998
- package/src/handlers/session.ts +1105 -1093
- package/src/handlers/sprints.test.ts +732 -732
- package/src/handlers/sprints.ts +537 -537
- package/src/handlers/tasks.test.ts +931 -931
- package/src/handlers/tasks.ts +1133 -1121
- package/src/handlers/tool-categories.test.ts +66 -66
- package/src/handlers/tool-docs.test.ts +511 -511
- package/src/handlers/tool-docs.ts +1571 -1491
- package/src/handlers/types.test.ts +259 -259
- package/src/handlers/types.ts +176 -176
- package/src/handlers/validation.test.ts +582 -582
- package/src/handlers/validation.ts +164 -164
- package/src/handlers/version.ts +63 -63
- package/src/index.test.ts +674 -674
- package/src/index.ts +807 -807
- package/src/setup.test.ts +233 -233
- package/src/setup.ts +404 -404
- package/src/templates/agent-guidelines.ts +233 -215
- package/src/templates/help-content.ts +1751 -1751
- package/src/token-tracking.test.ts +463 -463
- package/src/token-tracking.ts +167 -167
- package/src/tools/blockers.ts +122 -122
- package/src/tools/bodies-of-work.ts +283 -283
- package/src/tools/chat.ts +72 -46
- package/src/tools/cloud-agents.ts +101 -101
- package/src/tools/connectors.ts +191 -191
- package/src/tools/cost.ts +111 -111
- package/src/tools/decisions.ts +111 -111
- package/src/tools/deployment.ts +455 -442
- package/src/tools/discovery.ts +76 -76
- package/src/tools/fallback.ts +111 -111
- package/src/tools/features.ts +154 -0
- package/src/tools/file-checkouts.ts +145 -145
- package/src/tools/findings.ts +101 -101
- package/src/tools/git-issues.ts +130 -130
- package/src/tools/ideas.ts +162 -162
- package/src/tools/index.ts +141 -137
- package/src/tools/milestones.ts +118 -118
- package/src/tools/organizations.ts +224 -224
- package/src/tools/progress.ts +73 -73
- package/src/tools/project.ts +206 -202
- package/src/tools/requests.ts +68 -68
- package/src/tools/roles.ts +112 -112
- package/src/tools/session.ts +181 -181
- package/src/tools/sprints.ts +298 -298
- package/src/tools/tasks.ts +550 -550
- package/src/tools/tools.test.ts +222 -222
- package/src/tools/types.ts +9 -9
- package/src/tools/validation.ts +75 -75
- package/src/tools/version.ts +34 -34
- package/src/tools/worktrees.ts +66 -66
- package/src/tools.test.ts +416 -416
- package/src/utils.test.ts +1014 -1014
- package/src/utils.ts +586 -586
- package/src/validators.test.ts +223 -223
- package/src/validators.ts +249 -249
- package/src/version.ts +109 -109
- package/tsconfig.json +16 -16
- package/vitest.config.ts +14 -14
package/scripts/version-bump.ts
CHANGED
|
@@ -1,203 +1,203 @@
|
|
|
1
|
-
#!/usr/bin/env npx tsx
|
|
2
|
-
/**
|
|
3
|
-
* Automatic Semantic Version Bumping Script
|
|
4
|
-
*
|
|
5
|
-
* Analyzes git commit messages since the last version tag to determine
|
|
6
|
-
* the appropriate version bump based on conventional commits.
|
|
7
|
-
*
|
|
8
|
-
* Patterns:
|
|
9
|
-
* - `feat!:` or `BREAKING CHANGE:` → major bump
|
|
10
|
-
* - `feat:` or `feat(scope):` → minor bump
|
|
11
|
-
* - `fix:` or `fix(scope):` → patch bump
|
|
12
|
-
* - `docs:`, `chore:`, `style:`, `refactor:`, `test:` → patch bump (if any fix/feat)
|
|
13
|
-
*
|
|
14
|
-
* Usage:
|
|
15
|
-
* npx tsx scripts/version-bump.ts [--dry-run] [--major|--minor|--patch]
|
|
16
|
-
*
|
|
17
|
-
* Options:
|
|
18
|
-
* --dry-run Show what would be done without making changes
|
|
19
|
-
* --major Force a major version bump
|
|
20
|
-
* --minor Force a minor version bump
|
|
21
|
-
* --patch Force a patch version bump
|
|
22
|
-
*/
|
|
23
|
-
|
|
24
|
-
import { execSync } from 'child_process';
|
|
25
|
-
import { readFileSync, writeFileSync } from 'fs';
|
|
26
|
-
import { resolve, dirname } from 'path';
|
|
27
|
-
import { fileURLToPath } from 'url';
|
|
28
|
-
|
|
29
|
-
const __dirname = dirname(fileURLToPath(import.meta.url));
|
|
30
|
-
const packageJsonPath = resolve(__dirname, '../package.json');
|
|
31
|
-
|
|
32
|
-
interface PackageJson {
|
|
33
|
-
version: string;
|
|
34
|
-
[key: string]: unknown;
|
|
35
|
-
}
|
|
36
|
-
|
|
37
|
-
type BumpType = 'major' | 'minor' | 'patch' | 'none';
|
|
38
|
-
|
|
39
|
-
function parseArgs(): { dryRun: boolean; forceBump: BumpType | null } {
|
|
40
|
-
const args = process.argv.slice(2);
|
|
41
|
-
const dryRun = args.includes('--dry-run');
|
|
42
|
-
|
|
43
|
-
let forceBump: BumpType | null = null;
|
|
44
|
-
if (args.includes('--major')) forceBump = 'major';
|
|
45
|
-
else if (args.includes('--minor')) forceBump = 'minor';
|
|
46
|
-
else if (args.includes('--patch')) forceBump = 'patch';
|
|
47
|
-
|
|
48
|
-
return { dryRun, forceBump };
|
|
49
|
-
}
|
|
50
|
-
|
|
51
|
-
function getCurrentVersion(): string {
|
|
52
|
-
const packageJson: PackageJson = JSON.parse(readFileSync(packageJsonPath, 'utf-8'));
|
|
53
|
-
return packageJson.version;
|
|
54
|
-
}
|
|
55
|
-
|
|
56
|
-
function getLastVersionTag(): string | null {
|
|
57
|
-
try {
|
|
58
|
-
// Get the latest tag that matches a version pattern (v*.*.* or *.*.*)
|
|
59
|
-
const tag = execSync('git describe --tags --abbrev=0 --match "v*" 2>/dev/null || git describe --tags --abbrev=0 --match "[0-9]*" 2>/dev/null', {
|
|
60
|
-
encoding: 'utf-8',
|
|
61
|
-
cwd: resolve(__dirname, '../../..')
|
|
62
|
-
}).trim();
|
|
63
|
-
return tag || null;
|
|
64
|
-
} catch {
|
|
65
|
-
return null;
|
|
66
|
-
}
|
|
67
|
-
}
|
|
68
|
-
|
|
69
|
-
function getCommitsSinceTag(tag: string | null): string[] {
|
|
70
|
-
try {
|
|
71
|
-
const range = tag ? `${tag}..HEAD` : 'HEAD';
|
|
72
|
-
const commits = execSync(`git log ${range} --pretty=format:"%s" -- packages/mcp-server`, {
|
|
73
|
-
encoding: 'utf-8',
|
|
74
|
-
cwd: resolve(__dirname, '../../..')
|
|
75
|
-
}).trim();
|
|
76
|
-
return commits ? commits.split('\n').filter(Boolean) : [];
|
|
77
|
-
} catch {
|
|
78
|
-
return [];
|
|
79
|
-
}
|
|
80
|
-
}
|
|
81
|
-
|
|
82
|
-
function analyzeCommits(commits: string[]): { bumpType: BumpType; reasons: string[] } {
|
|
83
|
-
const reasons: string[] = [];
|
|
84
|
-
let bumpType: BumpType = 'none';
|
|
85
|
-
|
|
86
|
-
for (const commit of commits) {
|
|
87
|
-
const lowerCommit = commit.toLowerCase();
|
|
88
|
-
|
|
89
|
-
// Check for breaking changes (major)
|
|
90
|
-
if (lowerCommit.includes('breaking change') || /^[a-z]+(\([^)]+\))?!:/.test(commit)) {
|
|
91
|
-
bumpType = 'major';
|
|
92
|
-
reasons.push(`BREAKING: ${commit}`);
|
|
93
|
-
}
|
|
94
|
-
// Check for features (minor) - only upgrade if not already major
|
|
95
|
-
else if (/^feat(\([^)]+\))?:/.test(commit)) {
|
|
96
|
-
if (bumpType !== 'major') {
|
|
97
|
-
bumpType = 'minor';
|
|
98
|
-
}
|
|
99
|
-
reasons.push(`Feature: ${commit}`);
|
|
100
|
-
}
|
|
101
|
-
// Check for fixes (patch) - only upgrade if still none
|
|
102
|
-
else if (/^fix(\([^)]+\))?:/.test(commit)) {
|
|
103
|
-
if (bumpType === 'none') {
|
|
104
|
-
bumpType = 'patch';
|
|
105
|
-
}
|
|
106
|
-
reasons.push(`Fix: ${commit}`);
|
|
107
|
-
}
|
|
108
|
-
// Other conventional commits that warrant a patch
|
|
109
|
-
else if (/^(docs|chore|style|refactor|test|perf|build|ci)(\([^)]+\))?:/.test(commit)) {
|
|
110
|
-
reasons.push(`Other: ${commit}`);
|
|
111
|
-
}
|
|
112
|
-
}
|
|
113
|
-
|
|
114
|
-
// If we have reasons but no bump type, default to patch
|
|
115
|
-
if (bumpType === 'none' && reasons.length > 0) {
|
|
116
|
-
bumpType = 'patch';
|
|
117
|
-
}
|
|
118
|
-
|
|
119
|
-
return { bumpType, reasons };
|
|
120
|
-
}
|
|
121
|
-
|
|
122
|
-
function bumpVersion(currentVersion: string, bumpType: BumpType): string {
|
|
123
|
-
const [major, minor, patch] = currentVersion.split('.').map(Number);
|
|
124
|
-
|
|
125
|
-
switch (bumpType) {
|
|
126
|
-
case 'major':
|
|
127
|
-
return `${major + 1}.0.0`;
|
|
128
|
-
case 'minor':
|
|
129
|
-
return `${major}.${minor + 1}.0`;
|
|
130
|
-
case 'patch':
|
|
131
|
-
return `${major}.${minor}.${patch + 1}`;
|
|
132
|
-
default:
|
|
133
|
-
return currentVersion;
|
|
134
|
-
}
|
|
135
|
-
}
|
|
136
|
-
|
|
137
|
-
function updatePackageJson(newVersion: string): void {
|
|
138
|
-
const packageJson: PackageJson = JSON.parse(readFileSync(packageJsonPath, 'utf-8'));
|
|
139
|
-
packageJson.version = newVersion;
|
|
140
|
-
writeFileSync(packageJsonPath, JSON.stringify(packageJson, null, 2) + '\n');
|
|
141
|
-
}
|
|
142
|
-
|
|
143
|
-
function main(): void {
|
|
144
|
-
const { dryRun, forceBump } = parseArgs();
|
|
145
|
-
|
|
146
|
-
console.log('🔍 Analyzing version bump for @vibescope/mcp-server...\n');
|
|
147
|
-
|
|
148
|
-
const currentVersion = getCurrentVersion();
|
|
149
|
-
console.log(`Current version: ${currentVersion}`);
|
|
150
|
-
|
|
151
|
-
const lastTag = getLastVersionTag();
|
|
152
|
-
console.log(`Last version tag: ${lastTag || '(none found)'}`);
|
|
153
|
-
|
|
154
|
-
const commits = getCommitsSinceTag(lastTag);
|
|
155
|
-
console.log(`Commits to analyze: ${commits.length}\n`);
|
|
156
|
-
|
|
157
|
-
let bumpType: BumpType;
|
|
158
|
-
let reasons: string[];
|
|
159
|
-
|
|
160
|
-
if (forceBump) {
|
|
161
|
-
bumpType = forceBump;
|
|
162
|
-
reasons = [`Forced ${forceBump} bump via command line`];
|
|
163
|
-
console.log(`⚡ Forcing ${forceBump} version bump\n`);
|
|
164
|
-
} else {
|
|
165
|
-
const analysis = analyzeCommits(commits);
|
|
166
|
-
bumpType = analysis.bumpType;
|
|
167
|
-
reasons = analysis.reasons;
|
|
168
|
-
|
|
169
|
-
if (reasons.length > 0) {
|
|
170
|
-
console.log('📝 Relevant commits:');
|
|
171
|
-
for (const reason of reasons.slice(0, 10)) {
|
|
172
|
-
console.log(` - ${reason}`);
|
|
173
|
-
}
|
|
174
|
-
if (reasons.length > 10) {
|
|
175
|
-
console.log(` ... and ${reasons.length - 10} more`);
|
|
176
|
-
}
|
|
177
|
-
console.log();
|
|
178
|
-
}
|
|
179
|
-
}
|
|
180
|
-
|
|
181
|
-
if (bumpType === 'none') {
|
|
182
|
-
console.log('✅ No version bump needed - no relevant changes detected.');
|
|
183
|
-
return;
|
|
184
|
-
}
|
|
185
|
-
|
|
186
|
-
const newVersion = bumpVersion(currentVersion, bumpType);
|
|
187
|
-
console.log(`📦 Version bump: ${currentVersion} → ${newVersion} (${bumpType})`);
|
|
188
|
-
|
|
189
|
-
if (dryRun) {
|
|
190
|
-
console.log('\n🔸 Dry run - no changes made.');
|
|
191
|
-
return;
|
|
192
|
-
}
|
|
193
|
-
|
|
194
|
-
updatePackageJson(newVersion);
|
|
195
|
-
console.log(`\n✅ Updated package.json to version ${newVersion}`);
|
|
196
|
-
console.log('\nNext steps:');
|
|
197
|
-
console.log(' 1. Review the changes: git diff packages/mcp-server/package.json');
|
|
198
|
-
console.log(' 2. Commit: git add -A && git commit -m "chore(release): bump @vibescope/mcp-server to ' + newVersion + '"');
|
|
199
|
-
console.log(' 3. Create a tag: git tag -a v' + newVersion + ' -m "Release v' + newVersion + '"');
|
|
200
|
-
console.log(' 4. Push: git push && git push --tags');
|
|
201
|
-
}
|
|
202
|
-
|
|
203
|
-
main();
|
|
1
|
+
#!/usr/bin/env npx tsx
|
|
2
|
+
/**
|
|
3
|
+
* Automatic Semantic Version Bumping Script
|
|
4
|
+
*
|
|
5
|
+
* Analyzes git commit messages since the last version tag to determine
|
|
6
|
+
* the appropriate version bump based on conventional commits.
|
|
7
|
+
*
|
|
8
|
+
* Patterns:
|
|
9
|
+
* - `feat!:` or `BREAKING CHANGE:` → major bump
|
|
10
|
+
* - `feat:` or `feat(scope):` → minor bump
|
|
11
|
+
* - `fix:` or `fix(scope):` → patch bump
|
|
12
|
+
* - `docs:`, `chore:`, `style:`, `refactor:`, `test:` → patch bump (if any fix/feat)
|
|
13
|
+
*
|
|
14
|
+
* Usage:
|
|
15
|
+
* npx tsx scripts/version-bump.ts [--dry-run] [--major|--minor|--patch]
|
|
16
|
+
*
|
|
17
|
+
* Options:
|
|
18
|
+
* --dry-run Show what would be done without making changes
|
|
19
|
+
* --major Force a major version bump
|
|
20
|
+
* --minor Force a minor version bump
|
|
21
|
+
* --patch Force a patch version bump
|
|
22
|
+
*/
|
|
23
|
+
|
|
24
|
+
import { execSync } from 'child_process';
|
|
25
|
+
import { readFileSync, writeFileSync } from 'fs';
|
|
26
|
+
import { resolve, dirname } from 'path';
|
|
27
|
+
import { fileURLToPath } from 'url';
|
|
28
|
+
|
|
29
|
+
const __dirname = dirname(fileURLToPath(import.meta.url));
|
|
30
|
+
const packageJsonPath = resolve(__dirname, '../package.json');
|
|
31
|
+
|
|
32
|
+
interface PackageJson {
|
|
33
|
+
version: string;
|
|
34
|
+
[key: string]: unknown;
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
type BumpType = 'major' | 'minor' | 'patch' | 'none';
|
|
38
|
+
|
|
39
|
+
function parseArgs(): { dryRun: boolean; forceBump: BumpType | null } {
|
|
40
|
+
const args = process.argv.slice(2);
|
|
41
|
+
const dryRun = args.includes('--dry-run');
|
|
42
|
+
|
|
43
|
+
let forceBump: BumpType | null = null;
|
|
44
|
+
if (args.includes('--major')) forceBump = 'major';
|
|
45
|
+
else if (args.includes('--minor')) forceBump = 'minor';
|
|
46
|
+
else if (args.includes('--patch')) forceBump = 'patch';
|
|
47
|
+
|
|
48
|
+
return { dryRun, forceBump };
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
function getCurrentVersion(): string {
|
|
52
|
+
const packageJson: PackageJson = JSON.parse(readFileSync(packageJsonPath, 'utf-8'));
|
|
53
|
+
return packageJson.version;
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
function getLastVersionTag(): string | null {
|
|
57
|
+
try {
|
|
58
|
+
// Get the latest tag that matches a version pattern (v*.*.* or *.*.*)
|
|
59
|
+
const tag = execSync('git describe --tags --abbrev=0 --match "v*" 2>/dev/null || git describe --tags --abbrev=0 --match "[0-9]*" 2>/dev/null', {
|
|
60
|
+
encoding: 'utf-8',
|
|
61
|
+
cwd: resolve(__dirname, '../../..')
|
|
62
|
+
}).trim();
|
|
63
|
+
return tag || null;
|
|
64
|
+
} catch {
|
|
65
|
+
return null;
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
function getCommitsSinceTag(tag: string | null): string[] {
|
|
70
|
+
try {
|
|
71
|
+
const range = tag ? `${tag}..HEAD` : 'HEAD';
|
|
72
|
+
const commits = execSync(`git log ${range} --pretty=format:"%s" -- packages/mcp-server`, {
|
|
73
|
+
encoding: 'utf-8',
|
|
74
|
+
cwd: resolve(__dirname, '../../..')
|
|
75
|
+
}).trim();
|
|
76
|
+
return commits ? commits.split('\n').filter(Boolean) : [];
|
|
77
|
+
} catch {
|
|
78
|
+
return [];
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
function analyzeCommits(commits: string[]): { bumpType: BumpType; reasons: string[] } {
|
|
83
|
+
const reasons: string[] = [];
|
|
84
|
+
let bumpType: BumpType = 'none';
|
|
85
|
+
|
|
86
|
+
for (const commit of commits) {
|
|
87
|
+
const lowerCommit = commit.toLowerCase();
|
|
88
|
+
|
|
89
|
+
// Check for breaking changes (major)
|
|
90
|
+
if (lowerCommit.includes('breaking change') || /^[a-z]+(\([^)]+\))?!:/.test(commit)) {
|
|
91
|
+
bumpType = 'major';
|
|
92
|
+
reasons.push(`BREAKING: ${commit}`);
|
|
93
|
+
}
|
|
94
|
+
// Check for features (minor) - only upgrade if not already major
|
|
95
|
+
else if (/^feat(\([^)]+\))?:/.test(commit)) {
|
|
96
|
+
if (bumpType !== 'major') {
|
|
97
|
+
bumpType = 'minor';
|
|
98
|
+
}
|
|
99
|
+
reasons.push(`Feature: ${commit}`);
|
|
100
|
+
}
|
|
101
|
+
// Check for fixes (patch) - only upgrade if still none
|
|
102
|
+
else if (/^fix(\([^)]+\))?:/.test(commit)) {
|
|
103
|
+
if (bumpType === 'none') {
|
|
104
|
+
bumpType = 'patch';
|
|
105
|
+
}
|
|
106
|
+
reasons.push(`Fix: ${commit}`);
|
|
107
|
+
}
|
|
108
|
+
// Other conventional commits that warrant a patch
|
|
109
|
+
else if (/^(docs|chore|style|refactor|test|perf|build|ci)(\([^)]+\))?:/.test(commit)) {
|
|
110
|
+
reasons.push(`Other: ${commit}`);
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
// If we have reasons but no bump type, default to patch
|
|
115
|
+
if (bumpType === 'none' && reasons.length > 0) {
|
|
116
|
+
bumpType = 'patch';
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
return { bumpType, reasons };
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
function bumpVersion(currentVersion: string, bumpType: BumpType): string {
|
|
123
|
+
const [major, minor, patch] = currentVersion.split('.').map(Number);
|
|
124
|
+
|
|
125
|
+
switch (bumpType) {
|
|
126
|
+
case 'major':
|
|
127
|
+
return `${major + 1}.0.0`;
|
|
128
|
+
case 'minor':
|
|
129
|
+
return `${major}.${minor + 1}.0`;
|
|
130
|
+
case 'patch':
|
|
131
|
+
return `${major}.${minor}.${patch + 1}`;
|
|
132
|
+
default:
|
|
133
|
+
return currentVersion;
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
function updatePackageJson(newVersion: string): void {
|
|
138
|
+
const packageJson: PackageJson = JSON.parse(readFileSync(packageJsonPath, 'utf-8'));
|
|
139
|
+
packageJson.version = newVersion;
|
|
140
|
+
writeFileSync(packageJsonPath, JSON.stringify(packageJson, null, 2) + '\n');
|
|
141
|
+
}
|
|
142
|
+
|
|
143
|
+
function main(): void {
|
|
144
|
+
const { dryRun, forceBump } = parseArgs();
|
|
145
|
+
|
|
146
|
+
console.log('🔍 Analyzing version bump for @vibescope/mcp-server...\n');
|
|
147
|
+
|
|
148
|
+
const currentVersion = getCurrentVersion();
|
|
149
|
+
console.log(`Current version: ${currentVersion}`);
|
|
150
|
+
|
|
151
|
+
const lastTag = getLastVersionTag();
|
|
152
|
+
console.log(`Last version tag: ${lastTag || '(none found)'}`);
|
|
153
|
+
|
|
154
|
+
const commits = getCommitsSinceTag(lastTag);
|
|
155
|
+
console.log(`Commits to analyze: ${commits.length}\n`);
|
|
156
|
+
|
|
157
|
+
let bumpType: BumpType;
|
|
158
|
+
let reasons: string[];
|
|
159
|
+
|
|
160
|
+
if (forceBump) {
|
|
161
|
+
bumpType = forceBump;
|
|
162
|
+
reasons = [`Forced ${forceBump} bump via command line`];
|
|
163
|
+
console.log(`⚡ Forcing ${forceBump} version bump\n`);
|
|
164
|
+
} else {
|
|
165
|
+
const analysis = analyzeCommits(commits);
|
|
166
|
+
bumpType = analysis.bumpType;
|
|
167
|
+
reasons = analysis.reasons;
|
|
168
|
+
|
|
169
|
+
if (reasons.length > 0) {
|
|
170
|
+
console.log('📝 Relevant commits:');
|
|
171
|
+
for (const reason of reasons.slice(0, 10)) {
|
|
172
|
+
console.log(` - ${reason}`);
|
|
173
|
+
}
|
|
174
|
+
if (reasons.length > 10) {
|
|
175
|
+
console.log(` ... and ${reasons.length - 10} more`);
|
|
176
|
+
}
|
|
177
|
+
console.log();
|
|
178
|
+
}
|
|
179
|
+
}
|
|
180
|
+
|
|
181
|
+
if (bumpType === 'none') {
|
|
182
|
+
console.log('✅ No version bump needed - no relevant changes detected.');
|
|
183
|
+
return;
|
|
184
|
+
}
|
|
185
|
+
|
|
186
|
+
const newVersion = bumpVersion(currentVersion, bumpType);
|
|
187
|
+
console.log(`📦 Version bump: ${currentVersion} → ${newVersion} (${bumpType})`);
|
|
188
|
+
|
|
189
|
+
if (dryRun) {
|
|
190
|
+
console.log('\n🔸 Dry run - no changes made.');
|
|
191
|
+
return;
|
|
192
|
+
}
|
|
193
|
+
|
|
194
|
+
updatePackageJson(newVersion);
|
|
195
|
+
console.log(`\n✅ Updated package.json to version ${newVersion}`);
|
|
196
|
+
console.log('\nNext steps:');
|
|
197
|
+
console.log(' 1. Review the changes: git diff packages/mcp-server/package.json');
|
|
198
|
+
console.log(' 2. Commit: git add -A && git commit -m "chore(release): bump @vibescope/mcp-server to ' + newVersion + '"');
|
|
199
|
+
console.log(' 3. Create a tag: git tag -a v' + newVersion + ' -m "Release v' + newVersion + '"');
|
|
200
|
+
console.log(' 4. Push: git push && git push --tags');
|
|
201
|
+
}
|
|
202
|
+
|
|
203
|
+
main();
|
|
@@ -1,86 +1,86 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Blockers API Methods
|
|
3
|
-
*
|
|
4
|
-
* Methods for blocker management:
|
|
5
|
-
* - getBlockers: List blockers for a project
|
|
6
|
-
* - addBlocker: Create a new blocker
|
|
7
|
-
* - resolveBlocker: Mark blocker as resolved
|
|
8
|
-
* - deleteBlocker: Delete a blocker
|
|
9
|
-
* - getBlockersStats: Get blocker statistics
|
|
10
|
-
*/
|
|
11
|
-
|
|
12
|
-
import type { ApiResponse, RequestFn } from './types.js';
|
|
13
|
-
|
|
14
|
-
export interface BlockersMethods {
|
|
15
|
-
getBlockers(projectId: string, params?: {
|
|
16
|
-
status?: 'open' | 'resolved';
|
|
17
|
-
limit?: number;
|
|
18
|
-
offset?: number;
|
|
19
|
-
}): Promise<ApiResponse<{
|
|
20
|
-
blockers: Array<{
|
|
21
|
-
id: string;
|
|
22
|
-
description: string;
|
|
23
|
-
status: string;
|
|
24
|
-
created_at: string;
|
|
25
|
-
resolved_at?: string;
|
|
26
|
-
resolution_note?: string;
|
|
27
|
-
}>;
|
|
28
|
-
total_count: number;
|
|
29
|
-
has_more: boolean;
|
|
30
|
-
}>>;
|
|
31
|
-
|
|
32
|
-
addBlocker(projectId: string, description: string, sessionId?: string): Promise<ApiResponse<{
|
|
33
|
-
success: boolean;
|
|
34
|
-
blocker_id: string;
|
|
35
|
-
}>>;
|
|
36
|
-
|
|
37
|
-
resolveBlocker(blockerId: string, resolutionNote?: string): Promise<ApiResponse<{
|
|
38
|
-
success: boolean;
|
|
39
|
-
blocker_id: string;
|
|
40
|
-
}>>;
|
|
41
|
-
|
|
42
|
-
deleteBlocker(blockerId: string): Promise<ApiResponse<{
|
|
43
|
-
success: boolean;
|
|
44
|
-
}>>;
|
|
45
|
-
|
|
46
|
-
getBlockersStats(projectId: string): Promise<ApiResponse<{
|
|
47
|
-
total: number;
|
|
48
|
-
open: number;
|
|
49
|
-
resolved: number;
|
|
50
|
-
}>>;
|
|
51
|
-
}
|
|
52
|
-
|
|
53
|
-
export function createBlockersMethods(request: RequestFn): BlockersMethods {
|
|
54
|
-
return {
|
|
55
|
-
async getBlockers(projectId, params) {
|
|
56
|
-
const queryParams = new URLSearchParams();
|
|
57
|
-
if (params?.status) queryParams.set('status', params.status);
|
|
58
|
-
if (params?.limit) queryParams.set('limit', params.limit.toString());
|
|
59
|
-
if (params?.offset) queryParams.set('offset', params.offset.toString());
|
|
60
|
-
const query = queryParams.toString();
|
|
61
|
-
const url = `/api/mcp/projects/${projectId}/blockers${query ? `?${query}` : ''}`;
|
|
62
|
-
return request('GET', url);
|
|
63
|
-
},
|
|
64
|
-
|
|
65
|
-
async addBlocker(projectId, description, sessionId) {
|
|
66
|
-
return request('POST', `/api/mcp/projects/${projectId}/blockers`, {
|
|
67
|
-
description,
|
|
68
|
-
session_id: sessionId
|
|
69
|
-
});
|
|
70
|
-
},
|
|
71
|
-
|
|
72
|
-
async resolveBlocker(blockerId, resolutionNote) {
|
|
73
|
-
return request('PATCH', `/api/mcp/blockers/${blockerId}/resolve`, {
|
|
74
|
-
resolution_note: resolutionNote
|
|
75
|
-
});
|
|
76
|
-
},
|
|
77
|
-
|
|
78
|
-
async deleteBlocker(blockerId) {
|
|
79
|
-
return request('DELETE', `/api/mcp/blockers/${blockerId}`);
|
|
80
|
-
},
|
|
81
|
-
|
|
82
|
-
async getBlockersStats(projectId) {
|
|
83
|
-
return request('GET', `/api/mcp/projects/${projectId}/blockers/stats`);
|
|
84
|
-
}
|
|
85
|
-
};
|
|
86
|
-
}
|
|
1
|
+
/**
|
|
2
|
+
* Blockers API Methods
|
|
3
|
+
*
|
|
4
|
+
* Methods for blocker management:
|
|
5
|
+
* - getBlockers: List blockers for a project
|
|
6
|
+
* - addBlocker: Create a new blocker
|
|
7
|
+
* - resolveBlocker: Mark blocker as resolved
|
|
8
|
+
* - deleteBlocker: Delete a blocker
|
|
9
|
+
* - getBlockersStats: Get blocker statistics
|
|
10
|
+
*/
|
|
11
|
+
|
|
12
|
+
import type { ApiResponse, RequestFn } from './types.js';
|
|
13
|
+
|
|
14
|
+
export interface BlockersMethods {
|
|
15
|
+
getBlockers(projectId: string, params?: {
|
|
16
|
+
status?: 'open' | 'resolved';
|
|
17
|
+
limit?: number;
|
|
18
|
+
offset?: number;
|
|
19
|
+
}): Promise<ApiResponse<{
|
|
20
|
+
blockers: Array<{
|
|
21
|
+
id: string;
|
|
22
|
+
description: string;
|
|
23
|
+
status: string;
|
|
24
|
+
created_at: string;
|
|
25
|
+
resolved_at?: string;
|
|
26
|
+
resolution_note?: string;
|
|
27
|
+
}>;
|
|
28
|
+
total_count: number;
|
|
29
|
+
has_more: boolean;
|
|
30
|
+
}>>;
|
|
31
|
+
|
|
32
|
+
addBlocker(projectId: string, description: string, sessionId?: string): Promise<ApiResponse<{
|
|
33
|
+
success: boolean;
|
|
34
|
+
blocker_id: string;
|
|
35
|
+
}>>;
|
|
36
|
+
|
|
37
|
+
resolveBlocker(blockerId: string, resolutionNote?: string): Promise<ApiResponse<{
|
|
38
|
+
success: boolean;
|
|
39
|
+
blocker_id: string;
|
|
40
|
+
}>>;
|
|
41
|
+
|
|
42
|
+
deleteBlocker(blockerId: string): Promise<ApiResponse<{
|
|
43
|
+
success: boolean;
|
|
44
|
+
}>>;
|
|
45
|
+
|
|
46
|
+
getBlockersStats(projectId: string): Promise<ApiResponse<{
|
|
47
|
+
total: number;
|
|
48
|
+
open: number;
|
|
49
|
+
resolved: number;
|
|
50
|
+
}>>;
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
export function createBlockersMethods(request: RequestFn): BlockersMethods {
|
|
54
|
+
return {
|
|
55
|
+
async getBlockers(projectId, params) {
|
|
56
|
+
const queryParams = new URLSearchParams();
|
|
57
|
+
if (params?.status) queryParams.set('status', params.status);
|
|
58
|
+
if (params?.limit) queryParams.set('limit', params.limit.toString());
|
|
59
|
+
if (params?.offset) queryParams.set('offset', params.offset.toString());
|
|
60
|
+
const query = queryParams.toString();
|
|
61
|
+
const url = `/api/mcp/projects/${projectId}/blockers${query ? `?${query}` : ''}`;
|
|
62
|
+
return request('GET', url);
|
|
63
|
+
},
|
|
64
|
+
|
|
65
|
+
async addBlocker(projectId, description, sessionId) {
|
|
66
|
+
return request('POST', `/api/mcp/projects/${projectId}/blockers`, {
|
|
67
|
+
description,
|
|
68
|
+
session_id: sessionId
|
|
69
|
+
});
|
|
70
|
+
},
|
|
71
|
+
|
|
72
|
+
async resolveBlocker(blockerId, resolutionNote) {
|
|
73
|
+
return request('PATCH', `/api/mcp/blockers/${blockerId}/resolve`, {
|
|
74
|
+
resolution_note: resolutionNote
|
|
75
|
+
});
|
|
76
|
+
},
|
|
77
|
+
|
|
78
|
+
async deleteBlocker(blockerId) {
|
|
79
|
+
return request('DELETE', `/api/mcp/blockers/${blockerId}`);
|
|
80
|
+
},
|
|
81
|
+
|
|
82
|
+
async getBlockersStats(projectId) {
|
|
83
|
+
return request('GET', `/api/mcp/projects/${projectId}/blockers/stats`);
|
|
84
|
+
}
|
|
85
|
+
};
|
|
86
|
+
}
|