@crypto512/jicon-mcp 1.0.4 → 1.1.1
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/README.md +40 -3
- package/TOOL_LIST.md +261 -140
- package/dist/config/constants.d.ts +2 -0
- package/dist/config/constants.d.ts.map +1 -1
- package/dist/config/constants.js +2 -0
- package/dist/config/constants.js.map +1 -1
- package/dist/config/loader.d.ts.map +1 -1
- package/dist/config/loader.js +2 -0
- package/dist/config/loader.js.map +1 -1
- package/dist/config/types.d.ts +6 -0
- package/dist/config/types.d.ts.map +1 -1
- package/dist/config/types.js +4 -0
- package/dist/config/types.js.map +1 -1
- package/dist/confluence/client.d.ts +11 -2
- package/dist/confluence/client.d.ts.map +1 -1
- package/dist/confluence/client.js +29 -12
- package/dist/confluence/client.js.map +1 -1
- package/dist/confluence/tools.d.ts +2 -2
- package/dist/confluence/tools.d.ts.map +1 -1
- package/dist/confluence/tools.js +95 -58
- package/dist/confluence/tools.js.map +1 -1
- package/dist/index.js +17 -2
- package/dist/index.js.map +1 -1
- package/dist/jira/client.d.ts.map +1 -1
- package/dist/jira/client.js +3 -13
- package/dist/jira/client.js.map +1 -1
- package/dist/jira/tools.d.ts.map +1 -1
- package/dist/jira/tools.js +9 -30
- package/dist/jira/tools.js.map +1 -1
- package/dist/permissions/tool-registry.d.ts +4 -2
- package/dist/permissions/tool-registry.d.ts.map +1 -1
- package/dist/permissions/tool-registry.js +14 -2
- package/dist/permissions/tool-registry.js.map +1 -1
- package/dist/tempo/formatters.d.ts.map +1 -1
- package/dist/tempo/formatters.js +1 -16
- package/dist/tempo/formatters.js.map +1 -1
- package/dist/tempo/tools.d.ts +2 -2
- package/dist/tempo/tools.d.ts.map +1 -1
- package/dist/tempo/tools.js +5 -13
- package/dist/tempo/tools.js.map +1 -1
- package/dist/utils/buffer-tools.d.ts +115 -63
- package/dist/utils/buffer-tools.d.ts.map +1 -1
- package/dist/utils/buffer-tools.js +385 -388
- package/dist/utils/buffer-tools.js.map +1 -1
- package/dist/utils/content-buffer.d.ts +24 -1
- package/dist/utils/content-buffer.d.ts.map +1 -1
- package/dist/utils/content-buffer.js +49 -39
- package/dist/utils/content-buffer.js.map +1 -1
- package/dist/utils/jicon-help.d.ts +5 -5
- package/dist/utils/jicon-help.d.ts.map +1 -1
- package/dist/utils/jicon-help.js +258 -588
- package/dist/utils/jicon-help.js.map +1 -1
- package/dist/utils/plantuml/client.d.ts +1 -1
- package/dist/utils/plantuml/client.d.ts.map +1 -1
- package/dist/utils/plantuml/client.js +34 -59
- package/dist/utils/plantuml/client.js.map +1 -1
- package/dist/utils/plantuml/docker-manager.d.ts +3 -1
- package/dist/utils/plantuml/docker-manager.d.ts.map +1 -1
- package/dist/utils/plantuml/docker-manager.js +6 -2
- package/dist/utils/plantuml/docker-manager.js.map +1 -1
- package/dist/utils/plantuml/include-expander.d.ts +32 -0
- package/dist/utils/plantuml/include-expander.d.ts.map +1 -0
- package/dist/utils/plantuml/include-expander.js +129 -0
- package/dist/utils/plantuml/include-expander.js.map +1 -0
- package/dist/utils/plantuml/index.d.ts +2 -1
- package/dist/utils/plantuml/index.d.ts.map +1 -1
- package/dist/utils/plantuml/index.js +3 -1
- package/dist/utils/plantuml/index.js.map +1 -1
- package/dist/utils/plantuml/service.d.ts +32 -8
- package/dist/utils/plantuml/service.d.ts.map +1 -1
- package/dist/utils/plantuml/service.js +108 -15
- package/dist/utils/plantuml/service.js.map +1 -1
- package/dist/utils/plantuml/tools.d.ts +4 -4
- package/dist/utils/plantuml/tools.d.ts.map +1 -1
- package/dist/utils/plantuml/tools.js +50 -5
- package/dist/utils/plantuml/tools.js.map +1 -1
- package/dist/utils/plantuml/types.d.ts +4 -4
- package/dist/utils/plantuml/validation-helper.d.ts +33 -0
- package/dist/utils/plantuml/validation-helper.d.ts.map +1 -0
- package/dist/utils/plantuml/validation-helper.js +97 -0
- package/dist/utils/plantuml/validation-helper.js.map +1 -0
- package/dist/utils/response-formatter.js +7 -7
- package/dist/utils/response-formatter.js.map +1 -1
- package/dist/utils/time-formatter.d.ts +10 -0
- package/dist/utils/time-formatter.d.ts.map +1 -0
- package/dist/utils/time-formatter.js +22 -0
- package/dist/utils/time-formatter.js.map +1 -0
- package/dist/utils/xhtml/error-locator.d.ts +70 -0
- package/dist/utils/xhtml/error-locator.d.ts.map +1 -0
- package/dist/utils/xhtml/error-locator.js +229 -0
- package/dist/utils/xhtml/error-locator.js.map +1 -0
- package/dist/utils/xhtml/index.d.ts +6 -3
- package/dist/utils/xhtml/index.d.ts.map +1 -1
- package/dist/utils/xhtml/index.js +7 -3
- package/dist/utils/xhtml/index.js.map +1 -1
- package/dist/utils/xhtml/operations.d.ts +54 -0
- package/dist/utils/xhtml/operations.d.ts.map +1 -1
- package/dist/utils/xhtml/operations.js +205 -0
- package/dist/utils/xhtml/operations.js.map +1 -1
- package/dist/utils/xhtml/plantuml.d.ts +1 -1
- package/dist/utils/xhtml/plantuml.d.ts.map +1 -1
- package/dist/utils/xhtml/plantuml.js +19 -30
- package/dist/utils/xhtml/plantuml.js.map +1 -1
- package/dist/utils/xhtml/serializer.d.ts +5 -0
- package/dist/utils/xhtml/serializer.d.ts.map +1 -1
- package/dist/utils/xhtml/serializer.js +18 -4
- package/dist/utils/xhtml/serializer.js.map +1 -1
- package/dist/utils/xhtml/types.d.ts +3 -3
- package/dist/utils/xhtml/types.d.ts.map +1 -1
- package/dist/utils/xhtml/validator.d.ts.map +1 -1
- package/dist/utils/xhtml/validator.js +87 -4
- package/dist/utils/xhtml/validator.js.map +1 -1
- package/package.json +1 -1
|
@@ -2,10 +2,12 @@
|
|
|
2
2
|
* PlantUML Service
|
|
3
3
|
*
|
|
4
4
|
* Unified service facade for PlantUML operations.
|
|
5
|
-
* Handles
|
|
5
|
+
* Handles eager container initialization at MCP startup and provides high-level API.
|
|
6
|
+
* Does NOT auto-restart if container dies - requires MCP restart.
|
|
6
7
|
*/
|
|
7
|
-
import {
|
|
8
|
+
import { startContainer, stopContainer, getContainerState } from "./docker-manager.js";
|
|
8
9
|
import { PlantUmlClient, normalizePlantUml, detectDiagramType } from "./client.js";
|
|
10
|
+
import { expandIncludes } from "./include-expander.js";
|
|
9
11
|
import { DEFAULT_PLANTUML_CONFIG } from "./types.js";
|
|
10
12
|
/**
|
|
11
13
|
* Cached client instance
|
|
@@ -15,6 +17,14 @@ let clientInstance = null;
|
|
|
15
17
|
* Service configuration
|
|
16
18
|
*/
|
|
17
19
|
let serviceConfig = { ...DEFAULT_PLANTUML_CONFIG };
|
|
20
|
+
/**
|
|
21
|
+
* Service state flags
|
|
22
|
+
*/
|
|
23
|
+
let dockerDisabled = false;
|
|
24
|
+
let startupFailed = false;
|
|
25
|
+
let startupError = null;
|
|
26
|
+
let containerDied = false;
|
|
27
|
+
let includeExpansionEnabled = true; // Enable !include expansion by default
|
|
18
28
|
/**
|
|
19
29
|
* Configure the PlantUML service
|
|
20
30
|
*/
|
|
@@ -22,55 +32,137 @@ export function configure(config) {
|
|
|
22
32
|
serviceConfig = { ...DEFAULT_PLANTUML_CONFIG, ...config };
|
|
23
33
|
// Reset client to pick up new config
|
|
24
34
|
clientInstance = null;
|
|
35
|
+
// Configure include expansion
|
|
36
|
+
if (config.includeExpansion !== undefined) {
|
|
37
|
+
includeExpansionEnabled = config.includeExpansion;
|
|
38
|
+
}
|
|
25
39
|
}
|
|
26
40
|
/**
|
|
27
|
-
*
|
|
41
|
+
* Initialize PlantUML service at MCP startup.
|
|
42
|
+
* Returns success/failure status. Does not throw.
|
|
43
|
+
*/
|
|
44
|
+
export async function initializePlantUml(options = {}) {
|
|
45
|
+
// Reset state flags
|
|
46
|
+
dockerDisabled = false;
|
|
47
|
+
startupFailed = false;
|
|
48
|
+
startupError = null;
|
|
49
|
+
containerDied = false;
|
|
50
|
+
if (options.disabled) {
|
|
51
|
+
dockerDisabled = true;
|
|
52
|
+
return { success: true, disabled: true };
|
|
53
|
+
}
|
|
54
|
+
try {
|
|
55
|
+
const state = await startContainer(serviceConfig);
|
|
56
|
+
return {
|
|
57
|
+
success: true,
|
|
58
|
+
containerId: state.containerId,
|
|
59
|
+
port: state.port,
|
|
60
|
+
};
|
|
61
|
+
}
|
|
62
|
+
catch (error) {
|
|
63
|
+
startupFailed = true;
|
|
64
|
+
startupError = error instanceof Error ? error.message : String(error);
|
|
65
|
+
return {
|
|
66
|
+
success: false,
|
|
67
|
+
error: startupError,
|
|
68
|
+
};
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
/**
|
|
72
|
+
* Check if PlantUML service can be used.
|
|
73
|
+
* Returns error message if not available, null if available.
|
|
74
|
+
*/
|
|
75
|
+
export function getUnavailableReason() {
|
|
76
|
+
if (dockerDisabled) {
|
|
77
|
+
return "PlantUML is disabled (disableDocker: true in config)";
|
|
78
|
+
}
|
|
79
|
+
if (startupFailed) {
|
|
80
|
+
return `PlantUML failed to start: ${startupError}`;
|
|
81
|
+
}
|
|
82
|
+
if (containerDied) {
|
|
83
|
+
return "PlantUML container has stopped. Restart the MCP server to retry.";
|
|
84
|
+
}
|
|
85
|
+
return null;
|
|
86
|
+
}
|
|
87
|
+
/**
|
|
88
|
+
* Get or create the PlantUML client
|
|
89
|
+
* Does NOT auto-restart if container died - throws error instead
|
|
28
90
|
*/
|
|
29
91
|
async function getClient() {
|
|
92
|
+
// Check if service is unavailable
|
|
93
|
+
const unavailableReason = getUnavailableReason();
|
|
94
|
+
if (unavailableReason) {
|
|
95
|
+
throw new Error(unavailableReason);
|
|
96
|
+
}
|
|
30
97
|
// Check if we have a valid client
|
|
31
98
|
if (clientInstance) {
|
|
32
99
|
const healthy = await clientInstance.healthCheck();
|
|
33
100
|
if (healthy) {
|
|
34
101
|
return clientInstance;
|
|
35
102
|
}
|
|
36
|
-
//
|
|
103
|
+
// Container died, mark it and throw error (no auto-restart)
|
|
37
104
|
clientInstance = null;
|
|
105
|
+
containerDied = true;
|
|
106
|
+
throw new Error("PlantUML container has stopped. Restart the MCP server to retry.");
|
|
107
|
+
}
|
|
108
|
+
// Client not created yet - create from existing container state
|
|
109
|
+
const state = getContainerState();
|
|
110
|
+
if (!state?.ready) {
|
|
111
|
+
throw new Error("PlantUML container is not running");
|
|
38
112
|
}
|
|
39
|
-
// Ensure container is running
|
|
40
|
-
const state = await ensureContainer(serviceConfig);
|
|
41
|
-
// Create new client
|
|
42
113
|
clientInstance = new PlantUmlClient(state.baseUrl, serviceConfig.requestTimeout);
|
|
43
114
|
return clientInstance;
|
|
44
115
|
}
|
|
45
116
|
/**
|
|
46
117
|
* Validate PlantUML syntax
|
|
47
|
-
*
|
|
48
|
-
* Starts the Docker container on first call if not already running.
|
|
118
|
+
* Expands !include directives for validation but returns original code
|
|
49
119
|
*/
|
|
50
120
|
export async function validate(code) {
|
|
51
121
|
const client = await getClient();
|
|
52
|
-
|
|
122
|
+
// Expand includes for validation (so C4/AWS/Azure macros work)
|
|
123
|
+
const codeToValidate = includeExpansionEnabled
|
|
124
|
+
? await expandIncludes(code)
|
|
125
|
+
: code;
|
|
126
|
+
const result = await client.validate(codeToValidate);
|
|
127
|
+
// Return ORIGINAL code as normalizedCode (expansion happens at Confluence send)
|
|
128
|
+
result.normalizedCode = normalizePlantUml(code);
|
|
129
|
+
return result;
|
|
53
130
|
}
|
|
54
131
|
/**
|
|
55
132
|
* Render PlantUML diagram to specified format
|
|
56
|
-
*
|
|
57
|
-
* Starts the Docker container on first call if not already running.
|
|
133
|
+
* Expands !include directives before rendering
|
|
58
134
|
*/
|
|
59
135
|
export async function render(code, format) {
|
|
60
136
|
const client = await getClient();
|
|
61
|
-
|
|
137
|
+
// Must expand includes for rendering to work
|
|
138
|
+
const codeToRender = includeExpansionEnabled
|
|
139
|
+
? await expandIncludes(code)
|
|
140
|
+
: code;
|
|
141
|
+
return client.render(codeToRender, format);
|
|
62
142
|
}
|
|
63
143
|
/**
|
|
64
|
-
* Check if PlantUML service is available (container running)
|
|
144
|
+
* Check if PlantUML service is available (container running and healthy)
|
|
65
145
|
*/
|
|
66
146
|
export function isAvailable() {
|
|
147
|
+
if (dockerDisabled || startupFailed || containerDied) {
|
|
148
|
+
return false;
|
|
149
|
+
}
|
|
67
150
|
const state = getContainerState();
|
|
68
151
|
return state?.ready ?? false;
|
|
69
152
|
}
|
|
70
153
|
/**
|
|
71
|
-
* Get current service status
|
|
154
|
+
* Get current service status with detailed state info
|
|
72
155
|
*/
|
|
73
156
|
export function getStatus() {
|
|
157
|
+
if (dockerDisabled) {
|
|
158
|
+
return { available: false, disabled: true };
|
|
159
|
+
}
|
|
160
|
+
if (startupFailed) {
|
|
161
|
+
return { available: false, startupFailed: true, error: startupError || undefined };
|
|
162
|
+
}
|
|
163
|
+
if (containerDied) {
|
|
164
|
+
return { available: false, containerDied: true };
|
|
165
|
+
}
|
|
74
166
|
const state = getContainerState();
|
|
75
167
|
if (!state?.ready) {
|
|
76
168
|
return { available: false };
|
|
@@ -93,4 +185,5 @@ export async function shutdown() {
|
|
|
93
185
|
* Re-export utility functions for convenience
|
|
94
186
|
*/
|
|
95
187
|
export { normalizePlantUml, detectDiagramType };
|
|
188
|
+
export { expandPlantUmlInXhtml } from "./include-expander.js";
|
|
96
189
|
//# sourceMappingURL=service.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"service.js","sourceRoot":"","sources":["../../../src/utils/plantuml/service.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"service.js","sourceRoot":"","sources":["../../../src/utils/plantuml/service.ts"],"names":[],"mappings":"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"}
|
|
@@ -16,11 +16,11 @@ export declare function createPlantUmlTools(): {
|
|
|
16
16
|
code: z.ZodOptional<z.ZodString>;
|
|
17
17
|
bufferId: z.ZodOptional<z.ZodString>;
|
|
18
18
|
}, "strip", z.ZodTypeAny, {
|
|
19
|
-
bufferId?: string | undefined;
|
|
20
19
|
code?: string | undefined;
|
|
21
|
-
}, {
|
|
22
20
|
bufferId?: string | undefined;
|
|
21
|
+
}, {
|
|
23
22
|
code?: string | undefined;
|
|
23
|
+
bufferId?: string | undefined;
|
|
24
24
|
}>;
|
|
25
25
|
handler: (args: {
|
|
26
26
|
code?: string;
|
|
@@ -36,12 +36,12 @@ export declare function createPlantUmlTools(): {
|
|
|
36
36
|
maxWidth: z.ZodOptional<z.ZodNumber>;
|
|
37
37
|
}, "strip", z.ZodTypeAny, {
|
|
38
38
|
format: "ascii" | "png" | "svg" | "eps";
|
|
39
|
-
bufferId?: string | undefined;
|
|
40
39
|
code?: string | undefined;
|
|
40
|
+
bufferId?: string | undefined;
|
|
41
41
|
maxWidth?: number | undefined;
|
|
42
42
|
}, {
|
|
43
|
-
bufferId?: string | undefined;
|
|
44
43
|
code?: string | undefined;
|
|
44
|
+
bufferId?: string | undefined;
|
|
45
45
|
format?: "ascii" | "png" | "svg" | "eps" | undefined;
|
|
46
46
|
maxWidth?: number | undefined;
|
|
47
47
|
}>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tools.d.ts","sourceRoot":"","sources":["../../../src/utils/plantuml/tools.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,oCAAoC,CAAC;AAIzE,OAAO,EAGL,KAAK,YAAY,EAClB,MAAM,YAAY,CAAC;AA2CpB;;GAEG;AACH,wBAAgB,mBAAmB;;;;;;;;;;;;;wBAkBP;YACpB,IAAI,CAAC,EAAE,MAAM,CAAC;YACd,QAAQ,CAAC,EAAE,MAAM,CAAC;SACnB,KAAG,OAAO,CAAC,cAAc,CAAC;;;;;;;;;;;;;;;;;;;;
|
|
1
|
+
{"version":3,"file":"tools.d.ts","sourceRoot":"","sources":["../../../src/utils/plantuml/tools.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,oCAAoC,CAAC;AAIzE,OAAO,EAGL,KAAK,YAAY,EAClB,MAAM,YAAY,CAAC;AA2CpB;;GAEG;AACH,wBAAgB,mBAAmB;;;;;;;;;;;;;wBAkBP;YACpB,IAAI,CAAC,EAAE,MAAM,CAAC;YACd,QAAQ,CAAC,EAAE,MAAM,CAAC;SACnB,KAAG,OAAO,CAAC,cAAc,CAAC;;;;;;;;;;;;;;;;;;;;wBAmIL;YACpB,IAAI,CAAC,EAAE,MAAM,CAAC;YACd,QAAQ,CAAC,EAAE,MAAM,CAAC;YAClB,MAAM,CAAC,EAAE,YAAY,CAAC;YACtB,QAAQ,CAAC,EAAE,MAAM,CAAC;SACnB,KAAG,OAAO,CAAC,cAAc,CAAC;;;;;uBAmGR,OAAO,CAAC,cAAc,CAAC;;EA6C/C;AAED;;GAEG;AACH,eAAO,MAAM,cAAc,sEAIjB,CAAC"}
|
|
@@ -6,7 +6,7 @@
|
|
|
6
6
|
import { z } from "zod";
|
|
7
7
|
import { formatSuccess, formatError } from "../response-formatter.js";
|
|
8
8
|
import { contentBuffer } from "../content-buffer.js";
|
|
9
|
-
import { validate, render, getStatus } from "./service.js";
|
|
9
|
+
import { validate, render, getStatus, getUnavailableReason } from "./service.js";
|
|
10
10
|
import { PlantUmlValidateInputSchema, PlantUmlRenderInputSchema, } from "./types.js";
|
|
11
11
|
/**
|
|
12
12
|
* Maximum inline content size before buffering (16KB)
|
|
@@ -62,10 +62,22 @@ Validate ONE diagram at a time. Do not pass full document content.
|
|
|
62
62
|
Example:
|
|
63
63
|
plantuml_validate(code="@startuml\\nA -> B: message\\n@enduml")
|
|
64
64
|
|
|
65
|
-
Workflow: validate → then
|
|
65
|
+
Workflow: validate → then buffer_edit with plantuml parameter
|
|
66
66
|
For syntax help: help(topic="plantuml")`,
|
|
67
67
|
inputSchema: PlantUmlValidateInputSchema,
|
|
68
68
|
handler: async (args) => {
|
|
69
|
+
// Check if PlantUML is available
|
|
70
|
+
const unavailableReason = getUnavailableReason();
|
|
71
|
+
if (unavailableReason) {
|
|
72
|
+
return formatError({
|
|
73
|
+
error: true,
|
|
74
|
+
message: unavailableReason,
|
|
75
|
+
statusCode: 503,
|
|
76
|
+
details: {
|
|
77
|
+
hint: "Check MCP server logs for PlantUML startup errors.",
|
|
78
|
+
},
|
|
79
|
+
});
|
|
80
|
+
}
|
|
69
81
|
try {
|
|
70
82
|
const code = resolveCode(args);
|
|
71
83
|
// Detect if this is full document content rather than a single PlantUML diagram
|
|
@@ -170,6 +182,18 @@ Example:
|
|
|
170
182
|
plantuml_render(code="...", format="ascii", maxWidth=80)`,
|
|
171
183
|
inputSchema: PlantUmlRenderInputSchema,
|
|
172
184
|
handler: async (args) => {
|
|
185
|
+
// Check if PlantUML is available
|
|
186
|
+
const unavailableReason = getUnavailableReason();
|
|
187
|
+
if (unavailableReason) {
|
|
188
|
+
return formatError({
|
|
189
|
+
error: true,
|
|
190
|
+
message: unavailableReason,
|
|
191
|
+
statusCode: 503,
|
|
192
|
+
details: {
|
|
193
|
+
hint: "Check MCP server logs for PlantUML startup errors.",
|
|
194
|
+
},
|
|
195
|
+
});
|
|
196
|
+
}
|
|
173
197
|
try {
|
|
174
198
|
let code = resolveCode(args);
|
|
175
199
|
const format = args.format || "svg";
|
|
@@ -239,10 +263,32 @@ Example:
|
|
|
239
263
|
plantuml_status: {
|
|
240
264
|
description: `Check if PlantUML rendering is available.
|
|
241
265
|
|
|
242
|
-
Returns availability status
|
|
266
|
+
Returns availability status and detailed state information.`,
|
|
243
267
|
inputSchema: z.object({}),
|
|
244
268
|
handler: async () => {
|
|
245
269
|
const status = getStatus();
|
|
270
|
+
if (status.disabled) {
|
|
271
|
+
return formatSuccess({
|
|
272
|
+
available: false,
|
|
273
|
+
disabled: true,
|
|
274
|
+
message: "PlantUML is disabled (disableDocker: true in config)",
|
|
275
|
+
});
|
|
276
|
+
}
|
|
277
|
+
if (status.startupFailed) {
|
|
278
|
+
return formatSuccess({
|
|
279
|
+
available: false,
|
|
280
|
+
startupFailed: true,
|
|
281
|
+
error: status.error,
|
|
282
|
+
message: "PlantUML failed to start. Check Docker configuration.",
|
|
283
|
+
});
|
|
284
|
+
}
|
|
285
|
+
if (status.containerDied) {
|
|
286
|
+
return formatSuccess({
|
|
287
|
+
available: false,
|
|
288
|
+
containerDied: true,
|
|
289
|
+
message: "PlantUML container stopped. Restart MCP server to retry.",
|
|
290
|
+
});
|
|
291
|
+
}
|
|
246
292
|
if (status.available) {
|
|
247
293
|
return formatSuccess({
|
|
248
294
|
available: true,
|
|
@@ -254,8 +300,7 @@ Returns availability status. The service starts automatically on first use of pl
|
|
|
254
300
|
}
|
|
255
301
|
return formatSuccess({
|
|
256
302
|
available: false,
|
|
257
|
-
message: "PlantUML service
|
|
258
|
-
hint: "Call plantuml_validate or plantuml_render to start the service",
|
|
303
|
+
message: "PlantUML service status unknown",
|
|
259
304
|
});
|
|
260
305
|
},
|
|
261
306
|
},
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tools.js","sourceRoot":"","sources":["../../../src/utils/plantuml/tools.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,EAAE,aAAa,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAC;AACtE,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;
|
|
1
|
+
{"version":3,"file":"tools.js","sourceRoot":"","sources":["../../../src/utils/plantuml/tools.ts"],"names":[],"mappings":"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"}
|
|
@@ -101,11 +101,11 @@ export declare const PlantUmlValidateInputSchema: z.ZodObject<{
|
|
|
101
101
|
code: z.ZodOptional<z.ZodString>;
|
|
102
102
|
bufferId: z.ZodOptional<z.ZodString>;
|
|
103
103
|
}, "strip", z.ZodTypeAny, {
|
|
104
|
-
bufferId?: string | undefined;
|
|
105
104
|
code?: string | undefined;
|
|
106
|
-
}, {
|
|
107
105
|
bufferId?: string | undefined;
|
|
106
|
+
}, {
|
|
108
107
|
code?: string | undefined;
|
|
108
|
+
bufferId?: string | undefined;
|
|
109
109
|
}>;
|
|
110
110
|
/**
|
|
111
111
|
* Schema for plantuml_render tool input
|
|
@@ -118,12 +118,12 @@ export declare const PlantUmlRenderInputSchema: z.ZodObject<{
|
|
|
118
118
|
maxWidth: z.ZodOptional<z.ZodNumber>;
|
|
119
119
|
}, "strip", z.ZodTypeAny, {
|
|
120
120
|
format: "ascii" | "png" | "svg" | "eps";
|
|
121
|
-
bufferId?: string | undefined;
|
|
122
121
|
code?: string | undefined;
|
|
122
|
+
bufferId?: string | undefined;
|
|
123
123
|
maxWidth?: number | undefined;
|
|
124
124
|
}, {
|
|
125
|
-
bufferId?: string | undefined;
|
|
126
125
|
code?: string | undefined;
|
|
126
|
+
bufferId?: string | undefined;
|
|
127
127
|
format?: "ascii" | "png" | "svg" | "eps" | undefined;
|
|
128
128
|
maxWidth?: number | undefined;
|
|
129
129
|
}>;
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* PlantUML validation helper
|
|
3
|
+
*
|
|
4
|
+
* Consolidates the repeated validation logic from buffer-tools.ts
|
|
5
|
+
* into a single reusable function.
|
|
6
|
+
*
|
|
7
|
+
* Requires Docker-based validation - returns error if unavailable.
|
|
8
|
+
*/
|
|
9
|
+
import type { CallToolResult } from "@modelcontextprotocol/sdk/types.js";
|
|
10
|
+
/**
|
|
11
|
+
* Result of PlantUML validation
|
|
12
|
+
*/
|
|
13
|
+
export interface PlantUmlValidationResult {
|
|
14
|
+
valid: true;
|
|
15
|
+
normalizedCode: string;
|
|
16
|
+
diagramType?: string;
|
|
17
|
+
}
|
|
18
|
+
export interface PlantUmlValidationError {
|
|
19
|
+
valid: false;
|
|
20
|
+
error: CallToolResult;
|
|
21
|
+
}
|
|
22
|
+
export type PlantUmlValidation = PlantUmlValidationResult | PlantUmlValidationError;
|
|
23
|
+
/**
|
|
24
|
+
* Validate PlantUML code using Docker-based validation.
|
|
25
|
+
*
|
|
26
|
+
* Returns error if PlantUML service is unavailable (disabled, failed to start, or container died).
|
|
27
|
+
* Returns either normalized code + diagram type, or a formatted error response.
|
|
28
|
+
*/
|
|
29
|
+
export declare function validatePlantUmlWithFallback(code: string, operation: "insert-plantuml" | "update-plantuml", targetInfo?: {
|
|
30
|
+
selector?: string;
|
|
31
|
+
semanticPosition?: string;
|
|
32
|
+
}): Promise<PlantUmlValidation>;
|
|
33
|
+
//# sourceMappingURL=validation-helper.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validation-helper.d.ts","sourceRoot":"","sources":["../../../src/utils/plantuml/validation-helper.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,oCAAoC,CAAC;AAIzE;;GAEG;AACH,MAAM,WAAW,wBAAwB;IACvC,KAAK,EAAE,IAAI,CAAC;IACZ,cAAc,EAAE,MAAM,CAAC;IACvB,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,uBAAuB;IACtC,KAAK,EAAE,KAAK,CAAC;IACb,KAAK,EAAE,cAAc,CAAC;CACvB;AAED,MAAM,MAAM,kBAAkB,GAAG,wBAAwB,GAAG,uBAAuB,CAAC;AAEpF;;;;;GAKG;AACH,wBAAsB,4BAA4B,CAChD,IAAI,EAAE,MAAM,EACZ,SAAS,EAAE,iBAAiB,GAAG,iBAAiB,EAChD,UAAU,CAAC,EAAE;IAAE,QAAQ,CAAC,EAAE,MAAM,CAAC;IAAC,gBAAgB,CAAC,EAAE,MAAM,CAAA;CAAE,GAC5D,OAAO,CAAC,kBAAkB,CAAC,CAkF7B"}
|
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* PlantUML validation helper
|
|
3
|
+
*
|
|
4
|
+
* Consolidates the repeated validation logic from buffer-tools.ts
|
|
5
|
+
* into a single reusable function.
|
|
6
|
+
*
|
|
7
|
+
* Requires Docker-based validation - returns error if unavailable.
|
|
8
|
+
*/
|
|
9
|
+
import { formatError } from "../response-formatter.js";
|
|
10
|
+
import { validate as validatePlantUmlWithDocker, getUnavailableReason } from "./service.js";
|
|
11
|
+
/**
|
|
12
|
+
* Validate PlantUML code using Docker-based validation.
|
|
13
|
+
*
|
|
14
|
+
* Returns error if PlantUML service is unavailable (disabled, failed to start, or container died).
|
|
15
|
+
* Returns either normalized code + diagram type, or a formatted error response.
|
|
16
|
+
*/
|
|
17
|
+
export async function validatePlantUmlWithFallback(code, operation, targetInfo) {
|
|
18
|
+
const codePreview = code.length > 200 ? code.substring(0, 200) + "..." : code;
|
|
19
|
+
const targetPosition = operation === "insert-plantuml"
|
|
20
|
+
? targetInfo?.semanticPosition || targetInfo?.selector
|
|
21
|
+
: targetInfo?.selector;
|
|
22
|
+
const actionVerb = operation === "insert-plantuml" ? "insert" : "update with";
|
|
23
|
+
// Check if PlantUML is unavailable
|
|
24
|
+
const unavailableReason = getUnavailableReason();
|
|
25
|
+
if (unavailableReason) {
|
|
26
|
+
return {
|
|
27
|
+
valid: false,
|
|
28
|
+
error: formatError({
|
|
29
|
+
error: true,
|
|
30
|
+
message: `PlantUML validation unavailable: ${unavailableReason}`,
|
|
31
|
+
statusCode: 503,
|
|
32
|
+
details: {
|
|
33
|
+
operation,
|
|
34
|
+
codePreview,
|
|
35
|
+
...(operation === "insert-plantuml"
|
|
36
|
+
? { targetPosition }
|
|
37
|
+
: { targetSelector: targetInfo?.selector }),
|
|
38
|
+
hint: "PlantUML diagrams cannot be validated. Fix the Docker configuration or restart the MCP server.",
|
|
39
|
+
},
|
|
40
|
+
}),
|
|
41
|
+
};
|
|
42
|
+
}
|
|
43
|
+
const recoverySteps = [
|
|
44
|
+
"1. Use plantuml_validate(code=...) to check syntax separately",
|
|
45
|
+
"2. Fix the PlantUML code based on the errors above",
|
|
46
|
+
"3. Retry buffer_edit with corrected code",
|
|
47
|
+
];
|
|
48
|
+
// Use Docker-based validation
|
|
49
|
+
try {
|
|
50
|
+
const dockerValidation = await validatePlantUmlWithDocker(code);
|
|
51
|
+
if (!dockerValidation.valid) {
|
|
52
|
+
return {
|
|
53
|
+
valid: false,
|
|
54
|
+
error: formatError({
|
|
55
|
+
error: true,
|
|
56
|
+
message: `PlantUML syntax error - cannot ${actionVerb} invalid diagram`,
|
|
57
|
+
statusCode: 400,
|
|
58
|
+
details: {
|
|
59
|
+
operation,
|
|
60
|
+
plantumlErrors: dockerValidation.errors,
|
|
61
|
+
diagramType: dockerValidation.diagramType,
|
|
62
|
+
codePreview,
|
|
63
|
+
...(operation === "insert-plantuml"
|
|
64
|
+
? { targetPosition }
|
|
65
|
+
: { targetSelector: targetInfo?.selector }),
|
|
66
|
+
recovery: recoverySteps,
|
|
67
|
+
},
|
|
68
|
+
}),
|
|
69
|
+
};
|
|
70
|
+
}
|
|
71
|
+
return {
|
|
72
|
+
valid: true,
|
|
73
|
+
normalizedCode: dockerValidation.normalizedCode,
|
|
74
|
+
diagramType: dockerValidation.diagramType,
|
|
75
|
+
};
|
|
76
|
+
}
|
|
77
|
+
catch (error) {
|
|
78
|
+
// Docker error - return error (no fallback)
|
|
79
|
+
return {
|
|
80
|
+
valid: false,
|
|
81
|
+
error: formatError({
|
|
82
|
+
error: true,
|
|
83
|
+
message: `PlantUML validation failed: ${error instanceof Error ? error.message : String(error)}`,
|
|
84
|
+
statusCode: 503,
|
|
85
|
+
details: {
|
|
86
|
+
operation,
|
|
87
|
+
codePreview,
|
|
88
|
+
...(operation === "insert-plantuml"
|
|
89
|
+
? { targetPosition }
|
|
90
|
+
: { targetSelector: targetInfo?.selector }),
|
|
91
|
+
hint: "PlantUML service is unavailable. Restart the MCP server or check Docker configuration.",
|
|
92
|
+
},
|
|
93
|
+
}),
|
|
94
|
+
};
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
//# sourceMappingURL=validation-helper.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validation-helper.js","sourceRoot":"","sources":["../../../src/utils/plantuml/validation-helper.ts"],"names":[],"mappings":"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"}
|
|
@@ -38,15 +38,15 @@ export function formatSuccess(data, metadata) {
|
|
|
38
38
|
metadata?.resourceType === "confluence_draft";
|
|
39
39
|
const editHint = isConfluence
|
|
40
40
|
? {
|
|
41
|
-
|
|
42
|
-
tool: "
|
|
43
|
-
args: { bufferId,
|
|
44
|
-
description: "
|
|
41
|
+
edit_by_id: {
|
|
42
|
+
tool: "buffer_edit",
|
|
43
|
+
args: { bufferId, after: 1, content: "<p>new paragraph</p>" },
|
|
44
|
+
description: "Insert/replace by element ID. Use buffer_get_structure to see IDs."
|
|
45
45
|
},
|
|
46
|
-
|
|
46
|
+
edit_plantuml: {
|
|
47
47
|
tool: "buffer_edit",
|
|
48
|
-
args: { bufferId,
|
|
49
|
-
description: "
|
|
48
|
+
args: { bufferId, after: 1, plantuml: "@startuml...@enduml" },
|
|
49
|
+
description: "Insert PlantUML diagram (auto-wrapped in Confluence macro)"
|
|
50
50
|
},
|
|
51
51
|
}
|
|
52
52
|
: {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"response-formatter.js","sourceRoot":"","sources":["../../src/utils/response-formatter.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAEpD,4EAA4E;AAC5E,MAAM,kBAAkB,GAAG,KAAK,CAAC;AAEjC;;GAEG;AACH,MAAM,UAAU,gBAAgB;IAC9B,MAAM,QAAQ,GAAG,OAAO,CAAC,GAAG,CAAC,gBAAgB,CAAC;IAC9C,IAAI,QAAQ,EAAE,CAAC;QACb,MAAM,MAAM,GAAG,QAAQ,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC;QACtC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,MAAM,GAAG,CAAC,EAAE,CAAC;YACjC,OAAO,MAAM,CAAC;QAChB,CAAC;IACH,CAAC;IACD,OAAO,kBAAkB,CAAC;AAC5B,CAAC;AAED,MAAM,UAAU,aAAa,CAAC,IAAa,EAAE,QAAkC;IAC7E,MAAM,OAAO,GAAG,gBAAgB,EAAE,CAAC;IACnC,MAAM,QAAQ,GAAG,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;IAE/C,mCAAmC;IACnC,IAAI,QAAQ,CAAC,MAAM,IAAI,OAAO,EAAE,CAAC;QAC/B,OAAO;YACL,OAAO,EAAE;gBACP;oBACE,IAAI,EAAE,MAAM;oBACZ,IAAI,EAAE,QAAQ;iBACf;aACF;SACF,CAAC;IACJ,CAAC;IAED,iEAAiE;IACjE,MAAM,QAAQ,GAAG,aAAa,CAAC,KAAK,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;IAEzD,2DAA2D;IAC3D,MAAM,YAAY,GAAG,QAAQ,EAAE,YAAY,KAAK,iBAAiB;QAC5C,QAAQ,EAAE,YAAY,KAAK,kBAAkB,CAAC;IAEnE,MAAM,QAAQ,GAAG,YAAY;QAC3B,CAAC,CAAC;YACE,UAAU,EAAE;gBACV,IAAI,EAAE,
|
|
1
|
+
{"version":3,"file":"response-formatter.js","sourceRoot":"","sources":["../../src/utils/response-formatter.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Time formatting utilities
|
|
3
|
+
*
|
|
4
|
+
* Shared time conversion and formatting functions used across Jira and Tempo tools.
|
|
5
|
+
*/
|
|
6
|
+
/**
|
|
7
|
+
* Format seconds into human-readable time string (e.g., "2h 30m", "45m", "8h")
|
|
8
|
+
*/
|
|
9
|
+
export declare function formatTimeSpent(seconds: number): string;
|
|
10
|
+
//# sourceMappingURL=time-formatter.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"time-formatter.d.ts","sourceRoot":"","sources":["../../src/utils/time-formatter.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH;;GAEG;AACH,wBAAgB,eAAe,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAWvD"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Time formatting utilities
|
|
3
|
+
*
|
|
4
|
+
* Shared time conversion and formatting functions used across Jira and Tempo tools.
|
|
5
|
+
*/
|
|
6
|
+
/**
|
|
7
|
+
* Format seconds into human-readable time string (e.g., "2h 30m", "45m", "8h")
|
|
8
|
+
*/
|
|
9
|
+
export function formatTimeSpent(seconds) {
|
|
10
|
+
const hours = Math.floor(seconds / 3600);
|
|
11
|
+
const minutes = Math.floor((seconds % 3600) / 60);
|
|
12
|
+
if (hours === 0) {
|
|
13
|
+
return `${minutes}m`;
|
|
14
|
+
}
|
|
15
|
+
else if (minutes === 0) {
|
|
16
|
+
return `${hours}h`;
|
|
17
|
+
}
|
|
18
|
+
else {
|
|
19
|
+
return `${hours}h ${minutes}m`;
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
//# sourceMappingURL=time-formatter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"time-formatter.js","sourceRoot":"","sources":["../../src/utils/time-formatter.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH;;GAEG;AACH,MAAM,UAAU,eAAe,CAAC,OAAe;IAC7C,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,GAAG,IAAI,CAAC,CAAC;IACzC,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,OAAO,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC;IAElD,IAAI,KAAK,KAAK,CAAC,EAAE,CAAC;QAChB,OAAO,GAAG,OAAO,GAAG,CAAC;IACvB,CAAC;SAAM,IAAI,OAAO,KAAK,CAAC,EAAE,CAAC;QACzB,OAAO,GAAG,KAAK,GAAG,CAAC;IACrB,CAAC;SAAM,CAAC;QACN,OAAO,GAAG,KAAK,KAAK,OAAO,GAAG,CAAC;IACjC,CAAC;AACH,CAAC"}
|