redmine-devrelay-client 0.3.1 → 0.3.3
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 +12 -3
- package/dist/index.d.ts +1 -1
- package/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/dist/textile.d.ts +11 -3
- package/dist/textile.js +37 -4
- package/dist/textile.js.map +1 -1
- package/dist/writes.js +4 -3
- package/dist/writes.js.map +1 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -2,15 +2,24 @@
|
|
|
2
2
|
|
|
3
3
|
[redmine-devrelay](https://www.npmjs.com/package/redmine-devrelay) MCP 서버가 사용하는 Redmine REST 클라이언트입니다.
|
|
4
4
|
|
|
5
|
+
- **버전:** `0.3.3` (MCP 서버와 맞춤)
|
|
5
6
|
- **GitHub:** https://github.com/HuijungYoon/devrelay
|
|
6
7
|
- **MCP 서버:** [redmine-devrelay](https://www.npmjs.com/package/redmine-devrelay)
|
|
7
8
|
|
|
8
|
-
지원: 이슈 조회/생성/댓글/상태, **사용자 검색(`searchUsers`)**, 사설 IP HTTP 등.
|
|
9
|
-
|
|
10
9
|
```bash
|
|
11
|
-
npm install redmine-devrelay-client
|
|
10
|
+
npm install redmine-devrelay-client@0.3.3
|
|
12
11
|
```
|
|
13
12
|
|
|
13
|
+
## 지원 기능
|
|
14
|
+
|
|
15
|
+
- 이슈 조회 / 생성 / 수정 / 댓글 / 상태 변경
|
|
16
|
+
- 프로젝트·멤버 목록, 사용자 검색 (`searchUsers`)
|
|
17
|
+
- 담당자·관리자(`watchers`) 이름/id 해석
|
|
18
|
+
- 사설 IPv4 HTTP, `/redmine` 등 base path 유지
|
|
19
|
+
- HTML 본문 포맷
|
|
20
|
+
- `formatDescriptionForRedmine` — 평문 줄 → `<p>…</p>`
|
|
21
|
+
- `formatNotesForRedmine` — `\n` → `<br />`
|
|
22
|
+
|
|
14
23
|
## License
|
|
15
24
|
|
|
16
25
|
MIT
|
package/dist/index.d.ts
CHANGED
|
@@ -7,5 +7,5 @@ export { buildIssueQuery } from "./issues.js";
|
|
|
7
7
|
export { addComment, createIssue, updateIssue, updateIssueStatus, } from "./writes.js";
|
|
8
8
|
export { searchUsers, normalizeListedUser } from "./users.js";
|
|
9
9
|
export { listProjectMembers, matchMemberByName } from "./memberships.js";
|
|
10
|
-
export { formatNotesForRedmine } from "./textile.js";
|
|
10
|
+
export { formatNotesForRedmine, formatDescriptionForRedmine } from "./textile.js";
|
|
11
11
|
export type * from "./types.js";
|
package/dist/index.js
CHANGED
|
@@ -7,5 +7,5 @@ export { buildIssueQuery } from "./issues.js";
|
|
|
7
7
|
export { addComment, createIssue, updateIssue, updateIssueStatus, } from "./writes.js";
|
|
8
8
|
export { searchUsers, normalizeListedUser } from "./users.js";
|
|
9
9
|
export { listProjectMembers, matchMemberByName } from "./memberships.js";
|
|
10
|
-
export { formatNotesForRedmine } from "./textile.js";
|
|
10
|
+
export { formatNotesForRedmine, formatDescriptionForRedmine } from "./textile.js";
|
|
11
11
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAsB,MAAM,aAAa,CAAC;AAC7D,OAAO,EAAE,YAAY,EAAyB,MAAM,aAAa,CAAC;AAClE,OAAO,EAAE,UAAU,EAAE,MAAM,WAAW,CAAC;AACvC,OAAO,EAAE,WAAW,EAA2B,MAAM,WAAW,CAAC;AACjE,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAC9C,OAAO,EACL,UAAU,EACV,WAAW,EACX,WAAW,EACX,iBAAiB,GAClB,MAAM,aAAa,CAAC;AACrB,OAAO,EAAE,WAAW,EAAE,mBAAmB,EAAE,MAAM,YAAY,CAAC;AAC9D,OAAO,EAAE,kBAAkB,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AACzE,OAAO,EAAE,qBAAqB,EAAE,MAAM,cAAc,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAsB,MAAM,aAAa,CAAC;AAC7D,OAAO,EAAE,YAAY,EAAyB,MAAM,aAAa,CAAC;AAClE,OAAO,EAAE,UAAU,EAAE,MAAM,WAAW,CAAC;AACvC,OAAO,EAAE,WAAW,EAA2B,MAAM,WAAW,CAAC;AACjE,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAC9C,OAAO,EACL,UAAU,EACV,WAAW,EACX,WAAW,EACX,iBAAiB,GAClB,MAAM,aAAa,CAAC;AACrB,OAAO,EAAE,WAAW,EAAE,mBAAmB,EAAE,MAAM,YAAY,CAAC;AAC9D,OAAO,EAAE,kBAAkB,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AACzE,OAAO,EAAE,qBAAqB,EAAE,2BAA2B,EAAE,MAAM,cAAc,CAAC"}
|
package/dist/textile.d.ts
CHANGED
|
@@ -1,6 +1,14 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Redmine
|
|
3
|
-
*
|
|
4
|
-
|
|
2
|
+
* This Redmine instance stores issue bodies as HTML (not Textile).
|
|
3
|
+
* Plain-text newlines are collapsed; convert to HTML so multi-line text renders.
|
|
4
|
+
*/
|
|
5
|
+
/**
|
|
6
|
+
* Comments/journals: append <br /> per line (works when notes accept HTML breaks).
|
|
7
|
+
* Idempotent if a line already ends with <br>.
|
|
5
8
|
*/
|
|
6
9
|
export declare function formatNotesForRedmine(notes: string): string;
|
|
10
|
+
/**
|
|
11
|
+
* Issue description: wrap each non-empty line in <p>...</p>.
|
|
12
|
+
* Leaves content unchanged when it already looks like HTML.
|
|
13
|
+
*/
|
|
14
|
+
export declare function formatDescriptionForRedmine(description: string): string;
|
package/dist/textile.js
CHANGED
|
@@ -1,10 +1,26 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Redmine
|
|
3
|
-
*
|
|
4
|
-
|
|
2
|
+
* This Redmine instance stores issue bodies as HTML (not Textile).
|
|
3
|
+
* Plain-text newlines are collapsed; convert to HTML so multi-line text renders.
|
|
4
|
+
*/
|
|
5
|
+
function normalizeNewlines(text) {
|
|
6
|
+
return text.replace(/\r\n/g, "\n").replace(/\r/g, "\n");
|
|
7
|
+
}
|
|
8
|
+
function looksLikeHtml(text) {
|
|
9
|
+
return /<\/?[a-z][\s\S]*>/i.test(text.trim());
|
|
10
|
+
}
|
|
11
|
+
function escapeHtml(text) {
|
|
12
|
+
return text
|
|
13
|
+
.replace(/&/g, "&")
|
|
14
|
+
.replace(/</g, "<")
|
|
15
|
+
.replace(/>/g, ">")
|
|
16
|
+
.replace(/"/g, """);
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* Comments/journals: append <br /> per line (works when notes accept HTML breaks).
|
|
20
|
+
* Idempotent if a line already ends with <br>.
|
|
5
21
|
*/
|
|
6
22
|
export function formatNotesForRedmine(notes) {
|
|
7
|
-
const normalized = notes
|
|
23
|
+
const normalized = normalizeNewlines(notes);
|
|
8
24
|
return normalized
|
|
9
25
|
.split("\n")
|
|
10
26
|
.map((line) => {
|
|
@@ -15,4 +31,21 @@ export function formatNotesForRedmine(notes) {
|
|
|
15
31
|
})
|
|
16
32
|
.join("\n");
|
|
17
33
|
}
|
|
34
|
+
/**
|
|
35
|
+
* Issue description: wrap each non-empty line in <p>...</p>.
|
|
36
|
+
* Leaves content unchanged when it already looks like HTML.
|
|
37
|
+
*/
|
|
38
|
+
export function formatDescriptionForRedmine(description) {
|
|
39
|
+
const normalized = normalizeNewlines(description);
|
|
40
|
+
if (!normalized.trim())
|
|
41
|
+
return normalized;
|
|
42
|
+
if (looksLikeHtml(normalized))
|
|
43
|
+
return normalized;
|
|
44
|
+
return normalized
|
|
45
|
+
.split("\n")
|
|
46
|
+
.map((line) => line.replace(/\s+$/u, ""))
|
|
47
|
+
.filter((line) => line.trim().length > 0)
|
|
48
|
+
.map((line) => `<p>${escapeHtml(line.trim())}</p>`)
|
|
49
|
+
.join("\n");
|
|
50
|
+
}
|
|
18
51
|
//# sourceMappingURL=textile.js.map
|
package/dist/textile.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"textile.js","sourceRoot":"","sources":["../src/textile.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"textile.js","sourceRoot":"","sources":["../src/textile.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,SAAS,iBAAiB,CAAC,IAAY;IACrC,OAAO,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;AAC1D,CAAC;AAED,SAAS,aAAa,CAAC,IAAY;IACjC,OAAO,oBAAoB,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC;AAChD,CAAC;AAED,SAAS,UAAU,CAAC,IAAY;IAC9B,OAAO,IAAI;SACR,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC;SACtB,OAAO,CAAC,IAAI,EAAE,MAAM,CAAC;SACrB,OAAO,CAAC,IAAI,EAAE,MAAM,CAAC;SACrB,OAAO,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;AAC7B,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,qBAAqB,CAAC,KAAa;IACjD,MAAM,UAAU,GAAG,iBAAiB,CAAC,KAAK,CAAC,CAAC;IAC5C,OAAO,UAAU;SACd,KAAK,CAAC,IAAI,CAAC;SACX,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE;QACZ,MAAM,UAAU,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;QAC7C,IAAI,iBAAiB,CAAC,IAAI,CAAC,UAAU,CAAC;YAAE,OAAO,UAAU,CAAC;QAC1D,OAAO,GAAG,UAAU,QAAQ,CAAC;IAC/B,CAAC,CAAC;SACD,IAAI,CAAC,IAAI,CAAC,CAAC;AAChB,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,2BAA2B,CAAC,WAAmB;IAC7D,MAAM,UAAU,GAAG,iBAAiB,CAAC,WAAW,CAAC,CAAC;IAClD,IAAI,CAAC,UAAU,CAAC,IAAI,EAAE;QAAE,OAAO,UAAU,CAAC;IAC1C,IAAI,aAAa,CAAC,UAAU,CAAC;QAAE,OAAO,UAAU,CAAC;IAEjD,OAAO,UAAU;SACd,KAAK,CAAC,IAAI,CAAC;SACX,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;SACxC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,MAAM,GAAG,CAAC,CAAC;SACxC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,MAAM,UAAU,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,MAAM,CAAC;SAClD,IAAI,CAAC,IAAI,CAAC,CAAC;AAChB,CAAC"}
|
package/dist/writes.js
CHANGED
|
@@ -1,7 +1,8 @@
|
|
|
1
|
-
import { formatNotesForRedmine } from "./textile.js";
|
|
1
|
+
import { formatDescriptionForRedmine, formatNotesForRedmine } from "./textile.js";
|
|
2
2
|
function applyOptionalIssueFields(issue, input, opts = {}) {
|
|
3
|
-
if (input.description !== undefined)
|
|
4
|
-
issue.description = input.description;
|
|
3
|
+
if (input.description !== undefined) {
|
|
4
|
+
issue.description = formatDescriptionForRedmine(input.description);
|
|
5
|
+
}
|
|
5
6
|
if (input.trackerId !== undefined)
|
|
6
7
|
issue.tracker_id = input.trackerId;
|
|
7
8
|
if (input.statusId !== undefined)
|
package/dist/writes.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"writes.js","sourceRoot":"","sources":["../src/writes.ts"],"names":[],"mappings":"AASA,OAAO,EAAE,qBAAqB,EAAE,MAAM,cAAc,CAAC;
|
|
1
|
+
{"version":3,"file":"writes.js","sourceRoot":"","sources":["../src/writes.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED