xdebug-mcp 1.0.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 (78) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +341 -0
  3. package/dist/config.d.ts +36 -0
  4. package/dist/config.js +47 -0
  5. package/dist/config.js.map +1 -0
  6. package/dist/dbgp/connection.d.ts +52 -0
  7. package/dist/dbgp/connection.js +362 -0
  8. package/dist/dbgp/connection.js.map +1 -0
  9. package/dist/dbgp/index.d.ts +3 -0
  10. package/dist/dbgp/index.js +4 -0
  11. package/dist/dbgp/index.js.map +1 -0
  12. package/dist/dbgp/server.d.ts +34 -0
  13. package/dist/dbgp/server.js +94 -0
  14. package/dist/dbgp/server.js.map +1 -0
  15. package/dist/dbgp/types.d.ts +112 -0
  16. package/dist/dbgp/types.js +28 -0
  17. package/dist/dbgp/types.js.map +1 -0
  18. package/dist/index.d.ts +7 -0
  19. package/dist/index.js +93 -0
  20. package/dist/index.js.map +1 -0
  21. package/dist/session/code-coverage.d.ts +94 -0
  22. package/dist/session/code-coverage.js +226 -0
  23. package/dist/session/code-coverage.js.map +1 -0
  24. package/dist/session/debug-config.d.ts +102 -0
  25. package/dist/session/debug-config.js +194 -0
  26. package/dist/session/debug-config.js.map +1 -0
  27. package/dist/session/index.d.ts +10 -0
  28. package/dist/session/index.js +11 -0
  29. package/dist/session/index.js.map +1 -0
  30. package/dist/session/logpoint-manager.d.ts +94 -0
  31. package/dist/session/logpoint-manager.js +167 -0
  32. package/dist/session/logpoint-manager.js.map +1 -0
  33. package/dist/session/manager.d.ts +41 -0
  34. package/dist/session/manager.js +135 -0
  35. package/dist/session/manager.js.map +1 -0
  36. package/dist/session/profiler.d.ts +89 -0
  37. package/dist/session/profiler.js +191 -0
  38. package/dist/session/profiler.js.map +1 -0
  39. package/dist/session/request-context.d.ts +50 -0
  40. package/dist/session/request-context.js +182 -0
  41. package/dist/session/request-context.js.map +1 -0
  42. package/dist/session/session-export.d.ts +83 -0
  43. package/dist/session/session-export.js +320 -0
  44. package/dist/session/session-export.js.map +1 -0
  45. package/dist/session/session.d.ts +92 -0
  46. package/dist/session/session.js +369 -0
  47. package/dist/session/session.js.map +1 -0
  48. package/dist/session/step-filter.d.ts +81 -0
  49. package/dist/session/step-filter.js +174 -0
  50. package/dist/session/step-filter.js.map +1 -0
  51. package/dist/session/watch-manager.d.ts +64 -0
  52. package/dist/session/watch-manager.js +137 -0
  53. package/dist/session/watch-manager.js.map +1 -0
  54. package/dist/tools/advanced.d.ts +26 -0
  55. package/dist/tools/advanced.js +502 -0
  56. package/dist/tools/advanced.js.map +1 -0
  57. package/dist/tools/breakpoints.d.ts +6 -0
  58. package/dist/tools/breakpoints.js +308 -0
  59. package/dist/tools/breakpoints.js.map +1 -0
  60. package/dist/tools/execution.d.ts +6 -0
  61. package/dist/tools/execution.js +283 -0
  62. package/dist/tools/execution.js.map +1 -0
  63. package/dist/tools/index.d.ts +31 -0
  64. package/dist/tools/index.js +44 -0
  65. package/dist/tools/index.js.map +1 -0
  66. package/dist/tools/inspection.d.ts +7 -0
  67. package/dist/tools/inspection.js +431 -0
  68. package/dist/tools/inspection.js.map +1 -0
  69. package/dist/tools/session.d.ts +6 -0
  70. package/dist/tools/session.js +164 -0
  71. package/dist/tools/session.js.map +1 -0
  72. package/dist/utils/logger.d.ts +16 -0
  73. package/dist/utils/logger.js +47 -0
  74. package/dist/utils/logger.js.map +1 -0
  75. package/dist/utils/path-mapper.d.ts +13 -0
  76. package/dist/utils/path-mapper.js +56 -0
  77. package/dist/utils/path-mapper.js.map +1 -0
  78. package/package.json +56 -0
@@ -0,0 +1,64 @@
1
+ /**
2
+ * Watch Manager
3
+ * Manages persistent watch expressions that auto-evaluate on each break.
4
+ */
5
+ import { EventEmitter } from 'events';
6
+ import { Property } from '../dbgp/types.js';
7
+ import { DebugSession } from './session.js';
8
+ export interface WatchExpression {
9
+ id: string;
10
+ expression: string;
11
+ lastValue?: Property | null;
12
+ previousValue?: Property | null;
13
+ hasChanged: boolean;
14
+ errorMessage?: string;
15
+ evaluationCount: number;
16
+ createdAt: Date;
17
+ lastEvaluatedAt?: Date;
18
+ }
19
+ export interface WatchEvaluationResult {
20
+ id: string;
21
+ expression: string;
22
+ value: Property | null;
23
+ previousValue: Property | null;
24
+ hasChanged: boolean;
25
+ error?: string;
26
+ }
27
+ export declare class WatchManager extends EventEmitter {
28
+ private watches;
29
+ private watchIdCounter;
30
+ constructor();
31
+ addWatch(expression: string): WatchExpression;
32
+ removeWatch(id: string): boolean;
33
+ getWatch(id: string): WatchExpression | undefined;
34
+ getAllWatches(): WatchExpression[];
35
+ clearAllWatches(): void;
36
+ /**
37
+ * Evaluate all watch expressions in the current session context
38
+ */
39
+ evaluateAll(session: DebugSession, stackDepth?: number): Promise<WatchEvaluationResult[]>;
40
+ /**
41
+ * Evaluate a single watch expression
42
+ */
43
+ evaluateWatch(session: DebugSession, watch: WatchExpression, stackDepth?: number): Promise<WatchEvaluationResult>;
44
+ /**
45
+ * Compare two property values to detect changes
46
+ */
47
+ private hasValueChanged;
48
+ /**
49
+ * Get watches that have changed since last evaluation
50
+ */
51
+ getChangedWatches(): WatchExpression[];
52
+ /**
53
+ * Export watch configuration for saving
54
+ */
55
+ exportConfig(): {
56
+ expressions: string[];
57
+ };
58
+ /**
59
+ * Import watch configuration
60
+ */
61
+ importConfig(config: {
62
+ expressions: string[];
63
+ }): void;
64
+ }
@@ -0,0 +1,137 @@
1
+ /**
2
+ * Watch Manager
3
+ * Manages persistent watch expressions that auto-evaluate on each break.
4
+ */
5
+ import { EventEmitter } from 'events';
6
+ import { logger } from '../utils/logger.js';
7
+ export class WatchManager extends EventEmitter {
8
+ watches = new Map();
9
+ watchIdCounter = 0;
10
+ constructor() {
11
+ super();
12
+ }
13
+ addWatch(expression) {
14
+ const id = `watch_${++this.watchIdCounter}`;
15
+ const watch = {
16
+ id,
17
+ expression,
18
+ hasChanged: false,
19
+ evaluationCount: 0,
20
+ createdAt: new Date(),
21
+ };
22
+ this.watches.set(id, watch);
23
+ logger.debug(`Watch added: ${id} = ${expression}`);
24
+ return watch;
25
+ }
26
+ removeWatch(id) {
27
+ const removed = this.watches.delete(id);
28
+ if (removed) {
29
+ logger.debug(`Watch removed: ${id}`);
30
+ }
31
+ return removed;
32
+ }
33
+ getWatch(id) {
34
+ return this.watches.get(id);
35
+ }
36
+ getAllWatches() {
37
+ return Array.from(this.watches.values());
38
+ }
39
+ clearAllWatches() {
40
+ this.watches.clear();
41
+ logger.debug('All watches cleared');
42
+ }
43
+ /**
44
+ * Evaluate all watch expressions in the current session context
45
+ */
46
+ async evaluateAll(session, stackDepth = 0) {
47
+ const results = [];
48
+ for (const watch of this.watches.values()) {
49
+ const result = await this.evaluateWatch(session, watch, stackDepth);
50
+ results.push(result);
51
+ }
52
+ return results;
53
+ }
54
+ /**
55
+ * Evaluate a single watch expression
56
+ */
57
+ async evaluateWatch(session, watch, stackDepth = 0) {
58
+ try {
59
+ const value = await session.evaluate(watch.expression, stackDepth);
60
+ // Track previous value for change detection
61
+ watch.previousValue = watch.lastValue;
62
+ watch.lastValue = value;
63
+ watch.lastEvaluatedAt = new Date();
64
+ watch.evaluationCount++;
65
+ watch.errorMessage = undefined;
66
+ // Detect changes
67
+ watch.hasChanged = this.hasValueChanged(watch.previousValue, watch.lastValue);
68
+ if (watch.hasChanged) {
69
+ this.emit('watchChanged', watch);
70
+ }
71
+ return {
72
+ id: watch.id,
73
+ expression: watch.expression,
74
+ value,
75
+ previousValue: watch.previousValue || null,
76
+ hasChanged: watch.hasChanged,
77
+ };
78
+ }
79
+ catch (error) {
80
+ const errorMessage = error instanceof Error ? error.message : String(error);
81
+ watch.errorMessage = errorMessage;
82
+ watch.lastEvaluatedAt = new Date();
83
+ watch.evaluationCount++;
84
+ return {
85
+ id: watch.id,
86
+ expression: watch.expression,
87
+ value: null,
88
+ previousValue: watch.previousValue || null,
89
+ hasChanged: false,
90
+ error: errorMessage,
91
+ };
92
+ }
93
+ }
94
+ /**
95
+ * Compare two property values to detect changes
96
+ */
97
+ hasValueChanged(prev, curr) {
98
+ if (!prev && !curr)
99
+ return false;
100
+ if (!prev || !curr)
101
+ return true;
102
+ // Compare type
103
+ if (prev.type !== curr.type)
104
+ return true;
105
+ // Compare value
106
+ if (prev.value !== curr.value)
107
+ return true;
108
+ // For complex types, compare number of children
109
+ if (prev.numchildren !== curr.numchildren)
110
+ return true;
111
+ return false;
112
+ }
113
+ /**
114
+ * Get watches that have changed since last evaluation
115
+ */
116
+ getChangedWatches() {
117
+ return Array.from(this.watches.values()).filter((w) => w.hasChanged);
118
+ }
119
+ /**
120
+ * Export watch configuration for saving
121
+ */
122
+ exportConfig() {
123
+ return {
124
+ expressions: Array.from(this.watches.values()).map((w) => w.expression),
125
+ };
126
+ }
127
+ /**
128
+ * Import watch configuration
129
+ */
130
+ importConfig(config) {
131
+ this.clearAllWatches();
132
+ for (const expr of config.expressions) {
133
+ this.addWatch(expr);
134
+ }
135
+ }
136
+ }
137
+ //# sourceMappingURL=watch-manager.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"watch-manager.js","sourceRoot":"","sources":["../../src/session/watch-manager.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,26 @@
1
+ /**
2
+ * Advanced Debugging MCP Tools
3
+ * Watch expressions, logpoints, profiling, coverage, and more.
4
+ */
5
+ import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
6
+ import { SessionManager } from '../session/manager.js';
7
+ import { WatchManager } from '../session/watch-manager.js';
8
+ import { LogpointManager } from '../session/logpoint-manager.js';
9
+ import { Profiler } from '../session/profiler.js';
10
+ import { RequestContextCapture } from '../session/request-context.js';
11
+ import { StepFilter } from '../session/step-filter.js';
12
+ import { DebugConfigManager } from '../session/debug-config.js';
13
+ import { CodeCoverageTracker } from '../session/code-coverage.js';
14
+ import { SessionExporter } from '../session/session-export.js';
15
+ export interface AdvancedToolsContext {
16
+ sessionManager: SessionManager;
17
+ watchManager: WatchManager;
18
+ logpointManager: LogpointManager;
19
+ profiler: Profiler;
20
+ requestCapture: RequestContextCapture;
21
+ stepFilter: StepFilter;
22
+ configManager: DebugConfigManager;
23
+ coverageTracker: CodeCoverageTracker;
24
+ sessionExporter: SessionExporter;
25
+ }
26
+ export declare function registerAdvancedTools(server: McpServer, ctx: AdvancedToolsContext): void;