mcp-perforce-server 2.1.2 → 3.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.
@@ -0,0 +1,475 @@
1
+ "use strict";
2
+ /**
3
+ * Composite workflow tools for MCP Perforce server
4
+ */
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.p4ReviewBundle = p4ReviewBundle;
7
+ exports.p4ChangeInspect = p4ChangeInspect;
8
+ exports.p4PathSyncCheck = p4PathSyncCheck;
9
+ const basic_js_1 = require("./basic.js");
10
+ const changelist_js_1 = require("./changelist.js");
11
+ const advanced_js_1 = require("./advanced.js");
12
+ const utils_js_1 = require("./utils.js");
13
+ function getArrayResult(value) {
14
+ return Array.isArray(value) ? value : [];
15
+ }
16
+ function getStringChangelist(value) {
17
+ if (typeof value === 'number' && Number.isFinite(value)) {
18
+ return String(Math.trunc(value));
19
+ }
20
+ if (typeof value === 'string' && /^\d+$/.test(value.trim())) {
21
+ return value.trim();
22
+ }
23
+ return null;
24
+ }
25
+ function getWorkflowConcurrency() {
26
+ const parsed = parseInt(process.env.P4_WORKFLOW_CONCURRENCY || '6', 10);
27
+ if (!Number.isFinite(parsed) || parsed <= 0) {
28
+ return 6;
29
+ }
30
+ return Math.min(parsed, 32);
31
+ }
32
+ async function runWithConcurrencyLimit(items, limit, worker) {
33
+ if (items.length === 0) {
34
+ return [];
35
+ }
36
+ const normalizedLimit = Math.max(1, Math.min(limit, items.length));
37
+ const results = new Array(items.length);
38
+ let nextIndex = 0;
39
+ const runWorker = async () => {
40
+ while (true) {
41
+ const current = nextIndex;
42
+ nextIndex += 1;
43
+ if (current >= items.length) {
44
+ return;
45
+ }
46
+ results[current] = await worker(items[current], current);
47
+ }
48
+ };
49
+ const workers = [];
50
+ for (let i = 0; i < normalizedLimit; i += 1) {
51
+ workers.push(runWorker());
52
+ }
53
+ await Promise.all(workers);
54
+ return results;
55
+ }
56
+ /**
57
+ * p4.review.bundle - Aggregate pending review changelists with optional details/reviewers
58
+ */
59
+ async function p4ReviewBundle(context, args = {}) {
60
+ const workflowConcurrency = getWorkflowConcurrency();
61
+ const includeDescribe = args.includeDescribe !== false;
62
+ const includeReviewers = args.includeReviewers !== false;
63
+ const maxChanges = Math.max(1, Math.min(args.maxChanges || 10, 100));
64
+ const reviewResult = await (0, basic_js_1.p4Review)(context, {
65
+ counter: args.counter,
66
+ filespec: args.filespec,
67
+ workspacePath: args.workspacePath,
68
+ });
69
+ if (!reviewResult.ok) {
70
+ return {
71
+ ok: false,
72
+ command: 'review.bundle',
73
+ args: [],
74
+ cwd: reviewResult.cwd,
75
+ configUsed: reviewResult.configUsed || {},
76
+ error: reviewResult.error,
77
+ warnings: reviewResult.warnings,
78
+ result: {
79
+ steps: {
80
+ review: {
81
+ ok: false,
82
+ error: reviewResult.error,
83
+ },
84
+ },
85
+ },
86
+ };
87
+ }
88
+ const pendingChanges = getArrayResult(reviewResult.result);
89
+ const selectedChanges = pendingChanges.slice(0, maxChanges);
90
+ const changelists = selectedChanges
91
+ .map((record) => getStringChangelist(record.change))
92
+ .filter((value) => value !== null);
93
+ const describeByChange = new Map();
94
+ const reviewersByChange = new Map();
95
+ const subcallCounts = {
96
+ review: 1,
97
+ describe: 0,
98
+ reviews: 0,
99
+ };
100
+ const warnings = [...(reviewResult.warnings || [])];
101
+ if (includeDescribe && changelists.length > 0) {
102
+ const describeResults = await runWithConcurrencyLimit(changelists, workflowConcurrency, async (changelist) => {
103
+ const result = await (0, changelist_js_1.p4Describe)(context, { changelist, workspacePath: args.workspacePath });
104
+ return { changelist, result };
105
+ });
106
+ subcallCounts.describe = describeResults.length;
107
+ for (const entry of describeResults) {
108
+ describeByChange.set(entry.changelist, {
109
+ ok: entry.result.ok,
110
+ result: entry.result.result,
111
+ error: entry.result.error,
112
+ });
113
+ if (!entry.result.ok && entry.result.error) {
114
+ warnings.push(`describe failed for changelist ${entry.changelist}`);
115
+ }
116
+ }
117
+ }
118
+ if (includeReviewers && changelists.length > 0) {
119
+ const reviewerResults = await runWithConcurrencyLimit(changelists, workflowConcurrency, async (changelist) => {
120
+ const result = await (0, basic_js_1.p4Reviews)(context, { changelist, workspacePath: args.workspacePath });
121
+ return { changelist, result };
122
+ });
123
+ subcallCounts.reviews = reviewerResults.length;
124
+ for (const entry of reviewerResults) {
125
+ reviewersByChange.set(entry.changelist, {
126
+ ok: entry.result.ok,
127
+ result: entry.result.result,
128
+ error: entry.result.error,
129
+ });
130
+ if (!entry.result.ok && entry.result.error) {
131
+ warnings.push(`reviews failed for changelist ${entry.changelist}`);
132
+ }
133
+ }
134
+ }
135
+ const bundled = selectedChanges.map((record) => {
136
+ const change = getStringChangelist(record.change);
137
+ return {
138
+ ...record,
139
+ details: change ? describeByChange.get(change) : undefined,
140
+ reviewers: change ? reviewersByChange.get(change) : undefined,
141
+ };
142
+ });
143
+ const summary = {
144
+ totalPending: pendingChanges.length,
145
+ included: bundled.length,
146
+ includeDescribe,
147
+ includeReviewers,
148
+ byUser: bundled.reduce((acc, change) => {
149
+ const userValue = change['user'];
150
+ const user = typeof userValue === 'string' ? userValue : 'unknown';
151
+ acc[user] = (acc[user] || 0) + 1;
152
+ return acc;
153
+ }, {}),
154
+ };
155
+ return {
156
+ ok: true,
157
+ command: 'review.bundle',
158
+ args: [],
159
+ cwd: reviewResult.cwd,
160
+ configUsed: reviewResult.configUsed || {},
161
+ warnings: warnings.length > 0 ? warnings : undefined,
162
+ result: {
163
+ summary,
164
+ changes: bundled,
165
+ meta: {
166
+ subcallCounts,
167
+ totalSubcalls: Object.values(subcallCounts).reduce((sum, value) => sum + value, 0),
168
+ workflowConcurrency,
169
+ },
170
+ steps: {
171
+ review: { ok: true, result: selectedChanges },
172
+ },
173
+ },
174
+ };
175
+ }
176
+ /**
177
+ * p4.change.inspect - Aggregate changelist details, jobs, reviewers, and optional file history
178
+ */
179
+ async function p4ChangeInspect(context, args) {
180
+ const workflowConcurrency = getWorkflowConcurrency();
181
+ if (!args.changelist || !/^\d+$/.test(args.changelist)) {
182
+ return {
183
+ ok: false,
184
+ command: 'change.inspect',
185
+ args: [],
186
+ cwd: process.cwd(),
187
+ configUsed: {},
188
+ error: {
189
+ code: 'P4_INVALID_ARGS',
190
+ message: 'changelist parameter is required and must be numeric',
191
+ },
192
+ };
193
+ }
194
+ const includeFileHistory = args.includeFileHistory === true;
195
+ const maxFilesWithHistory = Math.max(1, Math.min(args.maxFilesWithHistory || 5, 20));
196
+ const maxRevisions = Math.max(1, Math.min(args.maxRevisions || 5, 50));
197
+ const [describeResult, fixesResult, reviewersResult] = await Promise.all([
198
+ (0, changelist_js_1.p4Describe)(context, {
199
+ changelist: args.changelist,
200
+ includeDiff: args.includeDiff,
201
+ diffFormat: args.diffFormat,
202
+ workspacePath: args.workspacePath,
203
+ }),
204
+ (0, advanced_js_1.p4Fixes)(context, { changelist: args.changelist, workspacePath: args.workspacePath }),
205
+ (0, basic_js_1.p4Reviews)(context, { changelist: args.changelist, workspacePath: args.workspacePath }),
206
+ ]);
207
+ if (!describeResult.ok) {
208
+ return {
209
+ ok: false,
210
+ command: 'change.inspect',
211
+ args: [],
212
+ cwd: describeResult.cwd,
213
+ configUsed: describeResult.configUsed || {},
214
+ error: describeResult.error,
215
+ warnings: describeResult.warnings,
216
+ result: {
217
+ steps: {
218
+ describe: { ok: false, error: describeResult.error },
219
+ },
220
+ },
221
+ };
222
+ }
223
+ const describeData = describeResult.result && typeof describeResult.result === 'object'
224
+ ? describeResult.result
225
+ : {};
226
+ const files = Array.isArray(describeData.files)
227
+ ? describeData.files
228
+ : [];
229
+ const warnings = [
230
+ ...(describeResult.warnings || []),
231
+ ...(fixesResult.warnings || []),
232
+ ...(reviewersResult.warnings || []),
233
+ ];
234
+ const subcallCounts = {
235
+ describe: 1,
236
+ fixes: 1,
237
+ reviews: 1,
238
+ filelog: 0,
239
+ };
240
+ const fileHistory = [];
241
+ if (includeFileHistory && files.length > 0) {
242
+ const fileSpecs = files
243
+ .map((f) => (typeof f.depotFile === 'string' ? f.depotFile : null))
244
+ .filter((f) => f !== null)
245
+ .slice(0, maxFilesWithHistory);
246
+ const historyResults = await runWithConcurrencyLimit(fileSpecs, workflowConcurrency, async (filespec) => {
247
+ const history = await (0, utils_js_1.p4Filelog)(context, {
248
+ filespec,
249
+ maxRevisions,
250
+ workspacePath: args.workspacePath,
251
+ });
252
+ return { filespec, history };
253
+ });
254
+ subcallCounts.filelog = historyResults.length;
255
+ for (const entry of historyResults) {
256
+ fileHistory.push({
257
+ filespec: entry.filespec,
258
+ step: {
259
+ ok: entry.history.ok,
260
+ result: entry.history.result,
261
+ error: entry.history.error,
262
+ },
263
+ });
264
+ if (!entry.history.ok && entry.history.error) {
265
+ warnings.push(`filelog failed for ${entry.filespec}`);
266
+ }
267
+ }
268
+ }
269
+ return {
270
+ ok: true,
271
+ command: 'change.inspect',
272
+ args: [],
273
+ cwd: describeResult.cwd,
274
+ configUsed: describeResult.configUsed || {},
275
+ warnings: warnings.length > 0 ? warnings : undefined,
276
+ result: {
277
+ summary: {
278
+ changelist: args.changelist,
279
+ fileCount: files.length,
280
+ fixesCount: getArrayResult(fixesResult.result).length,
281
+ reviewerCount: getArrayResult(reviewersResult.result).length,
282
+ hasDiff: typeof describeData.hasDiff === 'boolean'
283
+ ? describeData.hasDiff
284
+ : false,
285
+ includeFileHistory,
286
+ },
287
+ meta: {
288
+ subcallCounts,
289
+ totalSubcalls: Object.values(subcallCounts).reduce((sum, value) => sum + value, 0),
290
+ workflowConcurrency,
291
+ },
292
+ steps: {
293
+ describe: {
294
+ ok: describeResult.ok,
295
+ result: describeResult.result,
296
+ error: describeResult.error,
297
+ },
298
+ fixes: {
299
+ ok: fixesResult.ok,
300
+ result: fixesResult.result,
301
+ error: fixesResult.error,
302
+ },
303
+ reviews: {
304
+ ok: reviewersResult.ok,
305
+ result: reviewersResult.result,
306
+ error: reviewersResult.error,
307
+ },
308
+ fileHistory,
309
+ },
310
+ },
311
+ };
312
+ }
313
+ /**
314
+ * p4.path.synccheck - Compare integration drift between two paths
315
+ */
316
+ async function p4PathSyncCheck(context, args) {
317
+ if (!args.sourcePath || !args.targetPath) {
318
+ return {
319
+ ok: false,
320
+ command: 'path.synccheck',
321
+ args: [],
322
+ cwd: process.cwd(),
323
+ configUsed: {},
324
+ error: {
325
+ code: 'P4_INVALID_ARGS',
326
+ message: 'sourcePath and targetPath are required',
327
+ },
328
+ };
329
+ }
330
+ const maxInterchanges = Math.max(1, Math.min(args.maxInterchanges || 50, 200));
331
+ const includeIntegrated = args.includeIntegrated !== false;
332
+ const checkBothDirections = args.checkBothDirections !== false;
333
+ const workflowConcurrency = getWorkflowConcurrency();
334
+ const interchangesPromises = [
335
+ (0, basic_js_1.p4Interchanges)(context, {
336
+ sourcePath: args.sourcePath,
337
+ targetPath: args.targetPath,
338
+ max: maxInterchanges,
339
+ workspacePath: args.workspacePath,
340
+ }),
341
+ ];
342
+ if (checkBothDirections) {
343
+ interchangesPromises.push((0, basic_js_1.p4Interchanges)(context, {
344
+ sourcePath: args.targetPath,
345
+ targetPath: args.sourcePath,
346
+ max: maxInterchanges,
347
+ workspacePath: args.workspacePath,
348
+ }));
349
+ }
350
+ const [forwardInterchanges, reverseInterchangesResult] = await Promise.all(interchangesPromises);
351
+ let reverseInterchanges = checkBothDirections ? (reverseInterchangesResult || null) : null;
352
+ if (!forwardInterchanges.ok) {
353
+ return {
354
+ ok: false,
355
+ command: 'path.synccheck',
356
+ args: [],
357
+ cwd: forwardInterchanges.cwd,
358
+ configUsed: forwardInterchanges.configUsed || {},
359
+ error: forwardInterchanges.error,
360
+ warnings: forwardInterchanges.warnings,
361
+ result: {
362
+ steps: {
363
+ interchangesForward: {
364
+ ok: false,
365
+ error: forwardInterchanges.error,
366
+ },
367
+ },
368
+ },
369
+ };
370
+ }
371
+ const warnings = [...(forwardInterchanges.warnings || [])];
372
+ const subcallCounts = {
373
+ interchanges: checkBothDirections ? 2 : 1,
374
+ integrated: 0,
375
+ };
376
+ if (reverseInterchanges?.warnings) {
377
+ warnings.push(...reverseInterchanges.warnings);
378
+ }
379
+ if (checkBothDirections && reverseInterchanges && !reverseInterchanges.ok) {
380
+ warnings.push('reverse interchanges check failed');
381
+ }
382
+ let integratedForward = null;
383
+ let integratedReverse = null;
384
+ if (includeIntegrated) {
385
+ [integratedForward, integratedReverse] = await Promise.all([
386
+ (0, basic_js_1.p4Integrated)(context, {
387
+ sourcePath: args.sourcePath,
388
+ targetPath: args.targetPath,
389
+ workspacePath: args.workspacePath,
390
+ }),
391
+ checkBothDirections
392
+ ? (0, basic_js_1.p4Integrated)(context, {
393
+ sourcePath: args.targetPath,
394
+ targetPath: args.sourcePath,
395
+ workspacePath: args.workspacePath,
396
+ })
397
+ : Promise.resolve(null),
398
+ ]);
399
+ subcallCounts.integrated = checkBothDirections ? 2 : 1;
400
+ if (integratedForward?.warnings) {
401
+ warnings.push(...integratedForward.warnings);
402
+ }
403
+ if (integratedReverse?.warnings) {
404
+ warnings.push(...integratedReverse.warnings);
405
+ }
406
+ }
407
+ const aheadToTarget = getArrayResult(forwardInterchanges.result).length;
408
+ const aheadToSource = reverseInterchanges && reverseInterchanges.ok
409
+ ? getArrayResult(reverseInterchanges.result).length
410
+ : checkBothDirections
411
+ ? null
412
+ : 0;
413
+ const syncState = aheadToSource === null
414
+ ? 'partial'
415
+ : aheadToTarget === 0 && aheadToSource === 0
416
+ ? 'in_sync'
417
+ : aheadToTarget > 0 && aheadToSource > 0
418
+ ? 'diverged'
419
+ : aheadToTarget > 0
420
+ ? 'source_ahead'
421
+ : 'target_ahead';
422
+ return {
423
+ ok: true,
424
+ command: 'path.synccheck',
425
+ args: [],
426
+ cwd: forwardInterchanges.cwd,
427
+ configUsed: forwardInterchanges.configUsed || {},
428
+ warnings: warnings.length > 0 ? warnings : undefined,
429
+ result: {
430
+ summary: {
431
+ sourcePath: args.sourcePath,
432
+ targetPath: args.targetPath,
433
+ aheadToTarget,
434
+ aheadToSource,
435
+ syncState,
436
+ includeIntegrated,
437
+ checkBothDirections,
438
+ workflowConcurrency,
439
+ },
440
+ meta: {
441
+ subcallCounts,
442
+ totalSubcalls: Object.values(subcallCounts).reduce((sum, value) => sum + value, 0),
443
+ },
444
+ steps: {
445
+ interchangesForward: {
446
+ ok: forwardInterchanges.ok,
447
+ result: forwardInterchanges.result,
448
+ error: forwardInterchanges.error,
449
+ },
450
+ interchangesReverse: reverseInterchanges
451
+ ? {
452
+ ok: reverseInterchanges.ok,
453
+ result: reverseInterchanges.result,
454
+ error: reverseInterchanges.error,
455
+ }
456
+ : undefined,
457
+ integratedForward: integratedForward
458
+ ? {
459
+ ok: integratedForward.ok,
460
+ result: integratedForward.result,
461
+ error: integratedForward.error,
462
+ }
463
+ : undefined,
464
+ integratedReverse: integratedReverse
465
+ ? {
466
+ ok: integratedReverse.ok,
467
+ result: integratedReverse.result,
468
+ error: integratedReverse.error,
469
+ }
470
+ : undefined,
471
+ },
472
+ },
473
+ };
474
+ }
475
+ //# sourceMappingURL=workflows.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"workflows.js","sourceRoot":"","sources":["../../src/tools/workflows.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "mcp-perforce-server",
3
- "version": "2.1.2",
3
+ "version": "3.1.0",
4
4
  "description": "Enterprise-grade MCP (Model Context Protocol) server for Perforce P4 integration with AI assistants. Features 37+ Perforce operations including merge resolution, shelving, advanced search, blame annotations, and comprehensive security with audit logging, rate limiting, input sanitization, and compliance reporting. SOC 2 ready with GDPR/HIPAA-friendly architecture. Created by Pratik Bhuite using vibe coding to solve real-world Perforce automation challenges. Open source, production-ready, and enterprise-compliant.",
5
5
  "main": "dist/server.js",
6
6
  "bin": {