redmine-devrelay-client 0.5.1 → 0.6.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.
- package/README.ko.md +29 -0
- package/README.md +15 -13
- package/dist/client.d.ts +9 -1
- package/dist/client.js +21 -0
- package/dist/client.js.map +1 -1
- package/dist/config.d.ts +10 -0
- package/dist/config.js +47 -19
- package/dist/config.js.map +1 -1
- package/dist/http.d.ts +1 -0
- package/dist/http.js +4 -1
- package/dist/http.js.map +1 -1
- package/dist/index.d.ts +3 -2
- package/dist/index.js +3 -2
- package/dist/index.js.map +1 -1
- package/dist/relations.d.ts +11 -0
- package/dist/relations.js +140 -0
- package/dist/relations.js.map +1 -0
- package/dist/types.d.ts +47 -0
- package/dist/types.js +14 -0
- package/dist/types.js.map +1 -1
- package/dist/writes.js +7 -0
- package/dist/writes.js.map +1 -1
- package/package.json +3 -2
package/README.ko.md
ADDED
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
# redmine-devrelay-client
|
|
2
|
+
|
|
3
|
+
[](README.md)
|
|
4
|
+
|
|
5
|
+
[redmine-devrelay](https://www.npmjs.com/package/redmine-devrelay) MCP 서버가 사용하는 Redmine REST 클라이언트입니다.
|
|
6
|
+
|
|
7
|
+
- **버전:** `0.6.0` (MCP 서버와 맞춤)
|
|
8
|
+
- **GitHub:** https://github.com/HuijungYoon/devrelay
|
|
9
|
+
- **MCP 서버:** [redmine-devrelay](https://www.npmjs.com/package/redmine-devrelay)
|
|
10
|
+
|
|
11
|
+
```bash
|
|
12
|
+
npm install redmine-devrelay-client@0.6.0
|
|
13
|
+
```
|
|
14
|
+
|
|
15
|
+
## 지원 기능
|
|
16
|
+
|
|
17
|
+
- 이슈 조회 / 생성 / 수정 / 댓글 / 상태 변경 / **첨부 업로드**
|
|
18
|
+
- 프로젝트·멤버 목록, 사용자 검색 (`searchUsers`)
|
|
19
|
+
- 담당자·관리자(`watchers`) 이름/id 해석
|
|
20
|
+
- 사설 IPv4 HTTP, `/redmine` 등 base path 유지
|
|
21
|
+
- HTML 본문 포맷
|
|
22
|
+
- `formatDescriptionForRedmine` — 평문 줄 → `<p>…</p>`
|
|
23
|
+
- `formatNotesForRedmine` — `\n` → `<br />`
|
|
24
|
+
- `detectNotesMarkup` — Textile/Markdown 감지 (MCP notes 차단용)
|
|
25
|
+
- 첨부: `inspectAttachments` / `uploadFile` / `addIssueAttachments` (최대 5개·10MiB)
|
|
26
|
+
|
|
27
|
+
## License
|
|
28
|
+
|
|
29
|
+
MIT
|
package/README.md
CHANGED
|
@@ -1,26 +1,28 @@
|
|
|
1
1
|
# redmine-devrelay-client
|
|
2
2
|
|
|
3
|
-
[
|
|
3
|
+
[](README.ko.md)
|
|
4
4
|
|
|
5
|
-
|
|
5
|
+
Redmine REST client used by the [redmine-devrelay](https://www.npmjs.com/package/redmine-devrelay) MCP server.
|
|
6
|
+
|
|
7
|
+
- **Version:** `0.6.0` (aligned with the MCP server)
|
|
6
8
|
- **GitHub:** https://github.com/HuijungYoon/devrelay
|
|
7
|
-
- **MCP
|
|
9
|
+
- **MCP server:** [redmine-devrelay](https://www.npmjs.com/package/redmine-devrelay)
|
|
8
10
|
|
|
9
11
|
```bash
|
|
10
|
-
npm install redmine-devrelay-client@0.
|
|
12
|
+
npm install redmine-devrelay-client@0.6.0
|
|
11
13
|
```
|
|
12
14
|
|
|
13
|
-
##
|
|
15
|
+
## Features
|
|
14
16
|
|
|
15
|
-
-
|
|
16
|
-
-
|
|
17
|
-
-
|
|
18
|
-
-
|
|
19
|
-
- HTML
|
|
20
|
-
- `formatDescriptionForRedmine` —
|
|
17
|
+
- Issue read / create / update / comment / status change / **attachment upload**
|
|
18
|
+
- Project and member lists, user search (`searchUsers`)
|
|
19
|
+
- Resolve assignee and watchers by name or id
|
|
20
|
+
- Private IPv4 HTTP, preserve base paths such as `/redmine`
|
|
21
|
+
- HTML body formatting
|
|
22
|
+
- `formatDescriptionForRedmine` — plain lines → `<p>…</p>`
|
|
21
23
|
- `formatNotesForRedmine` — `\n` → `<br />`
|
|
22
|
-
- `detectNotesMarkup` — Textile/Markdown
|
|
23
|
-
-
|
|
24
|
+
- `detectNotesMarkup` — detect Textile/Markdown (used to block MCP notes)
|
|
25
|
+
- Attachments: `inspectAttachments` / `uploadFile` / `addIssueAttachments` (max 5 files · 10MiB)
|
|
24
26
|
|
|
25
27
|
## License
|
|
26
28
|
|
package/dist/client.d.ts
CHANGED
|
@@ -1,11 +1,12 @@
|
|
|
1
1
|
import type { RedmineConfig } from "./config.js";
|
|
2
2
|
import { RedmineHttp } from "./http.js";
|
|
3
|
-
import type { AddCommentResult, AddIssueAttachmentsInput, AddIssueAttachmentsResult, AttachmentInput, AttachmentPreview, CreateIssueInput, CreateIssueResult, IssueInclude, ListProjectMembersResult, ListProjectsResult, NormalizedIssueDetail, RedmineUser, SearchIssuesInput, SearchIssuesResult, SearchUsersResult, UpdateIssueInput, UpdateIssueResult, UpdateStatusResult, UploadedAttachment } from "./types.js";
|
|
3
|
+
import type { AddCommentResult, AddIssueAttachmentsInput, AddIssueAttachmentsResult, AddIssueRelationInput, AttachmentInput, AttachmentPreview, CreateIssueInput, CreateIssueResult, IssueInclude, IssueRelation, ListIssueRelationsResult, ListProjectMembersResult, ListProjectsResult, NormalizedIssueDetail, RedmineUser, RemoveIssueRelationResult, ReplaceIssueRelationInput, ReplaceIssueRelationResult, SearchIssuesInput, SearchIssuesResult, SearchUsersResult, UpdateIssueInput, UpdateIssueResult, UpdateStatusResult, UploadedAttachment } from "./types.js";
|
|
4
4
|
export declare class RedmineClient {
|
|
5
5
|
readonly http: RedmineHttp;
|
|
6
6
|
readonly config: RedmineConfig;
|
|
7
7
|
constructor(http: RedmineHttp, config: RedmineConfig);
|
|
8
8
|
static fromEnv(env?: NodeJS.ProcessEnv): RedmineClient;
|
|
9
|
+
static fromConfig(config: RedmineConfig): RedmineClient;
|
|
9
10
|
getCurrentUser(): Promise<RedmineUser>;
|
|
10
11
|
listProjects(opts?: {
|
|
11
12
|
search?: string;
|
|
@@ -26,6 +27,13 @@ export declare class RedmineClient {
|
|
|
26
27
|
}): Promise<NormalizedIssueDetail>;
|
|
27
28
|
createIssue(input: CreateIssueInput): Promise<CreateIssueResult>;
|
|
28
29
|
updateIssue(input: UpdateIssueInput): Promise<UpdateIssueResult>;
|
|
30
|
+
/** 연결된 일감 목록 (GET /issues/:id/relations.json) */
|
|
31
|
+
listIssueRelations(issueId: number): Promise<ListIssueRelationsResult>;
|
|
32
|
+
getIssueRelation(relationId: number): Promise<IssueRelation>;
|
|
33
|
+
addIssueRelation(input: AddIssueRelationInput): Promise<IssueRelation>;
|
|
34
|
+
removeIssueRelation(relationId: number): Promise<RemoveIssueRelationResult>;
|
|
35
|
+
/** Change a relation (delete + re-create; Redmine has no update endpoint) */
|
|
36
|
+
replaceIssueRelation(input: ReplaceIssueRelationInput): Promise<ReplaceIssueRelationResult>;
|
|
29
37
|
inspectAttachments(inputs: AttachmentInput[]): AttachmentPreview[];
|
|
30
38
|
uploadFile(input: AttachmentInput): Promise<UploadedAttachment>;
|
|
31
39
|
uploadAttachments(inputs: AttachmentInput[]): Promise<UploadedAttachment[]>;
|
package/dist/client.js
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { loadConfig } from "./config.js";
|
|
2
2
|
import { RedmineHttp } from "./http.js";
|
|
3
3
|
import { getIssue, searchIssues } from "./issues.js";
|
|
4
|
+
import { addIssueRelation, getIssueRelation, listIssueRelations, removeIssueRelation, replaceIssueRelation, } from "./relations.js";
|
|
4
5
|
import { listProjectMembers } from "./memberships.js";
|
|
5
6
|
import { searchUsers } from "./users.js";
|
|
6
7
|
import { inspectAttachments, uploadAttachments, uploadFile, } from "./attachments.js";
|
|
@@ -35,6 +36,9 @@ export class RedmineClient {
|
|
|
35
36
|
const config = loadConfig(env);
|
|
36
37
|
return new RedmineClient(new RedmineHttp(config), config);
|
|
37
38
|
}
|
|
39
|
+
static fromConfig(config) {
|
|
40
|
+
return new RedmineClient(new RedmineHttp(config), config);
|
|
41
|
+
}
|
|
38
42
|
async getCurrentUser() {
|
|
39
43
|
const data = await this.http.getJson("/users/current.json");
|
|
40
44
|
return normalizeUser(data.user);
|
|
@@ -85,6 +89,23 @@ export class RedmineClient {
|
|
|
85
89
|
updateIssue(input) {
|
|
86
90
|
return updateIssue(this.http, input);
|
|
87
91
|
}
|
|
92
|
+
/** 연결된 일감 목록 (GET /issues/:id/relations.json) */
|
|
93
|
+
listIssueRelations(issueId) {
|
|
94
|
+
return listIssueRelations(this.http, issueId);
|
|
95
|
+
}
|
|
96
|
+
getIssueRelation(relationId) {
|
|
97
|
+
return getIssueRelation(this.http, relationId);
|
|
98
|
+
}
|
|
99
|
+
addIssueRelation(input) {
|
|
100
|
+
return addIssueRelation(this.http, input);
|
|
101
|
+
}
|
|
102
|
+
removeIssueRelation(relationId) {
|
|
103
|
+
return removeIssueRelation(this.http, relationId);
|
|
104
|
+
}
|
|
105
|
+
/** Change a relation (delete + re-create; Redmine has no update endpoint) */
|
|
106
|
+
replaceIssueRelation(input) {
|
|
107
|
+
return replaceIssueRelation(this.http, input);
|
|
108
|
+
}
|
|
88
109
|
inspectAttachments(inputs) {
|
|
89
110
|
return inspectAttachments(inputs);
|
|
90
111
|
}
|
package/dist/client.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"client.js","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"client.js","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"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"}
|
package/dist/config.d.ts
CHANGED
|
@@ -10,4 +10,14 @@ export type RedmineConfig = {
|
|
|
10
10
|
defaultProjectId?: number;
|
|
11
11
|
userAgent: string;
|
|
12
12
|
};
|
|
13
|
+
export declare function configFromCredentials(input: {
|
|
14
|
+
baseUrl: string;
|
|
15
|
+
apiKey: string;
|
|
16
|
+
allowedHosts?: string[];
|
|
17
|
+
caCertPath?: string;
|
|
18
|
+
connectTimeoutMs?: number;
|
|
19
|
+
requestTimeoutMs?: number;
|
|
20
|
+
maxResultCount?: number;
|
|
21
|
+
logLevel?: string;
|
|
22
|
+
}): RedmineConfig;
|
|
13
23
|
export declare function loadConfig(env?: NodeJS.ProcessEnv): RedmineConfig;
|
package/dist/config.js
CHANGED
|
@@ -32,16 +32,7 @@ function parseIntEnv(env, name, fallback) {
|
|
|
32
32
|
}
|
|
33
33
|
return n;
|
|
34
34
|
}
|
|
35
|
-
|
|
36
|
-
const urlRaw = env.REDMINE_URL?.trim();
|
|
37
|
-
const apiKey = env.REDMINE_API_KEY?.trim();
|
|
38
|
-
if (!urlRaw || !apiKey) {
|
|
39
|
-
throw new RedmineError({
|
|
40
|
-
code: "REDMINE_VALIDATION_ERROR",
|
|
41
|
-
message: "REDMINE_URL and REDMINE_API_KEY are required",
|
|
42
|
-
check: ["Export REDMINE_URL", "Export REDMINE_API_KEY"],
|
|
43
|
-
});
|
|
44
|
-
}
|
|
35
|
+
function validateBaseUrl(urlRaw, allowedHosts, urlName, allowedHostsName) {
|
|
45
36
|
let parsed;
|
|
46
37
|
try {
|
|
47
38
|
parsed = new URL(urlRaw);
|
|
@@ -49,7 +40,7 @@ export function loadConfig(env = process.env) {
|
|
|
49
40
|
catch {
|
|
50
41
|
throw new RedmineError({
|
|
51
42
|
code: "REDMINE_VALIDATION_ERROR",
|
|
52
|
-
message: `Invalid
|
|
43
|
+
message: `Invalid ${urlName}: ${urlRaw}`,
|
|
53
44
|
check: ["Use an absolute URL like https://redmine.example.com"],
|
|
54
45
|
});
|
|
55
46
|
}
|
|
@@ -66,17 +57,13 @@ export function loadConfig(env = process.env) {
|
|
|
66
57
|
message: "Forbidden link-local/metadata host",
|
|
67
58
|
});
|
|
68
59
|
}
|
|
69
|
-
const allowedHosts = env.REDMINE_ALLOWED_HOSTS
|
|
70
|
-
?.split(",")
|
|
71
|
-
.map((h) => h.trim().toLowerCase())
|
|
72
|
-
.filter(Boolean);
|
|
73
60
|
if (allowedHosts?.length &&
|
|
74
61
|
!allowedHosts.includes(host) &&
|
|
75
62
|
!isPrivateIpv4(host)) {
|
|
76
63
|
throw new RedmineError({
|
|
77
64
|
code: "REDMINE_VALIDATION_ERROR",
|
|
78
|
-
message: `Host ${host} is not in
|
|
79
|
-
check: [
|
|
65
|
+
message: `Host ${host} is not in ${allowedHostsName}`,
|
|
66
|
+
check: [`Add the Redmine hostname to ${allowedHostsName}`],
|
|
80
67
|
});
|
|
81
68
|
}
|
|
82
69
|
const isInsecureHttpAllowed = parsed.protocol === "http:" &&
|
|
@@ -85,7 +72,8 @@ export function loadConfig(env = process.env) {
|
|
|
85
72
|
if (parsed.protocol !== "https:" && !isInsecureHttpAllowed) {
|
|
86
73
|
throw new RedmineError({
|
|
87
74
|
code: "REDMINE_VALIDATION_ERROR",
|
|
88
|
-
message:
|
|
75
|
+
message: `${urlName} must use https ` +
|
|
76
|
+
"(http only for private IPs or allowlisted local hosts)",
|
|
89
77
|
check: [
|
|
90
78
|
"Use https://...",
|
|
91
79
|
"Or use an RFC1918 private IP over http",
|
|
@@ -93,7 +81,47 @@ export function loadConfig(env = process.env) {
|
|
|
93
81
|
],
|
|
94
82
|
});
|
|
95
83
|
}
|
|
96
|
-
|
|
84
|
+
return urlRaw.replace(/\/$/, "");
|
|
85
|
+
}
|
|
86
|
+
function normalizeAllowedHosts(hosts) {
|
|
87
|
+
return hosts?.map((host) => host.trim().toLowerCase()).filter(Boolean);
|
|
88
|
+
}
|
|
89
|
+
export function configFromCredentials(input) {
|
|
90
|
+
const urlRaw = input.baseUrl?.trim();
|
|
91
|
+
const apiKey = input.apiKey?.trim();
|
|
92
|
+
if (!urlRaw || !apiKey) {
|
|
93
|
+
throw new RedmineError({
|
|
94
|
+
code: "REDMINE_VALIDATION_ERROR",
|
|
95
|
+
message: "baseUrl and apiKey are required",
|
|
96
|
+
check: ["Provide Redmine URL", "Provide Redmine API key"],
|
|
97
|
+
});
|
|
98
|
+
}
|
|
99
|
+
const allowedHosts = normalizeAllowedHosts(input.allowedHosts);
|
|
100
|
+
const baseUrl = validateBaseUrl(urlRaw, allowedHosts, "baseUrl", "allowedHosts");
|
|
101
|
+
return {
|
|
102
|
+
baseUrl,
|
|
103
|
+
apiKey,
|
|
104
|
+
connectTimeoutMs: input.connectTimeoutMs ?? 5000,
|
|
105
|
+
requestTimeoutMs: input.requestTimeoutMs ?? 15000,
|
|
106
|
+
maxResultCount: input.maxResultCount ?? 100,
|
|
107
|
+
logLevel: input.logLevel ?? "info",
|
|
108
|
+
caCertPath: input.caCertPath || undefined,
|
|
109
|
+
allowedHosts,
|
|
110
|
+
userAgent: "redmine-mcp/0.1.0",
|
|
111
|
+
};
|
|
112
|
+
}
|
|
113
|
+
export function loadConfig(env = process.env) {
|
|
114
|
+
const urlRaw = env.REDMINE_URL?.trim();
|
|
115
|
+
const apiKey = env.REDMINE_API_KEY?.trim();
|
|
116
|
+
if (!urlRaw || !apiKey) {
|
|
117
|
+
throw new RedmineError({
|
|
118
|
+
code: "REDMINE_VALIDATION_ERROR",
|
|
119
|
+
message: "REDMINE_URL and REDMINE_API_KEY are required",
|
|
120
|
+
check: ["Export REDMINE_URL", "Export REDMINE_API_KEY"],
|
|
121
|
+
});
|
|
122
|
+
}
|
|
123
|
+
const allowedHosts = normalizeAllowedHosts(env.REDMINE_ALLOWED_HOSTS?.split(","));
|
|
124
|
+
const baseUrl = validateBaseUrl(urlRaw, allowedHosts, "REDMINE_URL", "REDMINE_ALLOWED_HOSTS");
|
|
97
125
|
return {
|
|
98
126
|
baseUrl,
|
|
99
127
|
apiKey,
|
package/dist/config.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAe3C,MAAM,eAAe,GAAG,IAAI,GAAG,CAAC,CAAC,iBAAiB,EAAE,0BAA0B,CAAC,CAAC,CAAC;AAEjF,sEAAsE;AACtE,MAAM,gBAAgB,GAAG,IAAI,GAAG,CAAC,CAAC,WAAW,EAAE,WAAW,EAAE,SAAS,CAAC,CAAC,CAAC;AAExE,SAAS,aAAa,CAAC,IAAY;IACjC,MAAM,CAAC,GAAG,8CAA8C,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACpE,IAAI,CAAC,CAAC;QAAE,OAAO,KAAK,CAAC;IACrB,MAAM,MAAM,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;IACtC,IAAI,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,GAAG,CAAC;QAAE,OAAO,KAAK,CAAC;IAC9C,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,MAAM,CAAC;IACtB,IAAI,CAAC,KAAK,EAAE;QAAE,OAAO,IAAI,CAAC;IAC1B,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,KAAK,GAAG;QAAE,OAAO,IAAI,CAAC;IACxC,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE;QAAE,OAAO,IAAI,CAAC;IACjD,OAAO,KAAK,CAAC;AACf,CAAC;AAED,SAAS,WAAW,CAClB,GAAsB,EACtB,IAAY,EACZ,QAAgB;IAEhB,MAAM,GAAG,GAAG,GAAG,CAAC,IAAI,CAAC,CAAC;IACtB,IAAI,GAAG,KAAK,SAAS,IAAI,GAAG,KAAK,EAAE;QAAE,OAAO,QAAQ,CAAC;IACrD,MAAM,CAAC,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC;IACtB,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;QAClC,MAAM,IAAI,YAAY,CAAC;YACrB,IAAI,EAAE,0BAA0B;YAChC,OAAO,EAAE,WAAW,IAAI,KAAK,GAAG,EAAE;YAClC,KAAK,EAAE,CAAC,OAAO,IAAI,uBAAuB,CAAC;SAC5C,CAAC,CAAC;IACL,CAAC;IACD,OAAO,CAAC,CAAC;AACX,CAAC;AAED,
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"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"}
|
package/dist/http.d.ts
CHANGED
|
@@ -10,6 +10,7 @@ export declare class RedmineHttp {
|
|
|
10
10
|
getJson<T>(path: string, query?: Record<string, string | number | undefined>): Promise<T>;
|
|
11
11
|
postJson<T>(path: string, body: unknown): Promise<T | undefined>;
|
|
12
12
|
putJson<T>(path: string, body: unknown): Promise<T | undefined>;
|
|
13
|
+
deleteJson<T>(path: string): Promise<T | undefined>;
|
|
13
14
|
postBinary<T>(path: string, body: Buffer | Uint8Array, headers: Record<string, string>, query?: Record<string, string | number | undefined>): Promise<T>;
|
|
14
15
|
private sendJson;
|
|
15
16
|
private buildUrl;
|
package/dist/http.js
CHANGED
|
@@ -55,6 +55,9 @@ export class RedmineHttp {
|
|
|
55
55
|
async putJson(path, body) {
|
|
56
56
|
return this.sendJson("PUT", path, body);
|
|
57
57
|
}
|
|
58
|
+
async deleteJson(path) {
|
|
59
|
+
return this.sendJson("DELETE", path);
|
|
60
|
+
}
|
|
58
61
|
async postBinary(path, body, headers, query) {
|
|
59
62
|
const url = this.buildUrl(path, query);
|
|
60
63
|
try {
|
|
@@ -78,7 +81,7 @@ export class RedmineHttp {
|
|
|
78
81
|
async sendJson(method, path, body) {
|
|
79
82
|
const url = this.buildUrl(path);
|
|
80
83
|
try {
|
|
81
|
-
const response = await this.request(url, method, JSON.stringify(body));
|
|
84
|
+
const response = await this.request(url, method, body === undefined ? undefined : JSON.stringify(body));
|
|
82
85
|
const bodyText = await response.text();
|
|
83
86
|
if (!response.ok) {
|
|
84
87
|
this.mapStatus(response.status, bodyText, path);
|
package/dist/http.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"http.js","sourceRoot":"","sources":["../src/http.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"http.js","sourceRoot":"","sources":["../src/http.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
CHANGED
|
@@ -1,13 +1,14 @@
|
|
|
1
|
-
export { loadConfig, type RedmineConfig } from "./config.js";
|
|
1
|
+
export { configFromCredentials, loadConfig, type RedmineConfig, } from "./config.js";
|
|
2
2
|
export { RedmineError, type RedmineErrorCode } from "./errors.js";
|
|
3
3
|
export { maskSecret } from "./mask.js";
|
|
4
4
|
export { RedmineHttp, type RedmineHttpOptions } from "./http.js";
|
|
5
5
|
export { RedmineClient } from "./client.js";
|
|
6
6
|
export { buildIssueQuery } from "./issues.js";
|
|
7
7
|
export { addComment, addIssueAttachments, createIssue, updateIssue, updateIssueStatus, } from "./writes.js";
|
|
8
|
+
export { addIssueRelation, getIssueRelation, listIssueRelations, removeIssueRelation, replaceIssueRelation, } from "./relations.js";
|
|
8
9
|
export { searchUsers, normalizeListedUser } from "./users.js";
|
|
9
10
|
export { listProjectMembers, matchMemberByName } from "./memberships.js";
|
|
10
11
|
export { inspectAttachments, uploadAttachments, uploadFile, } from "./attachments.js";
|
|
11
|
-
export { ATTACHMENT_MAX_BYTES, ATTACHMENT_MAX_FILES, } from "./types.js";
|
|
12
|
+
export { ATTACHMENT_MAX_BYTES, ATTACHMENT_MAX_FILES, DELAY_RELATION_TYPES, ISSUE_RELATION_TYPES, } from "./types.js";
|
|
12
13
|
export { detectNotesMarkup, formatNotesForRedmine, formatDescriptionForRedmine, } from "./textile.js";
|
|
13
14
|
export type * from "./types.js";
|
package/dist/index.js
CHANGED
|
@@ -1,13 +1,14 @@
|
|
|
1
|
-
export { loadConfig } from "./config.js";
|
|
1
|
+
export { configFromCredentials, loadConfig, } from "./config.js";
|
|
2
2
|
export { RedmineError } from "./errors.js";
|
|
3
3
|
export { maskSecret } from "./mask.js";
|
|
4
4
|
export { RedmineHttp } from "./http.js";
|
|
5
5
|
export { RedmineClient } from "./client.js";
|
|
6
6
|
export { buildIssueQuery } from "./issues.js";
|
|
7
7
|
export { addComment, addIssueAttachments, createIssue, updateIssue, updateIssueStatus, } from "./writes.js";
|
|
8
|
+
export { addIssueRelation, getIssueRelation, listIssueRelations, removeIssueRelation, replaceIssueRelation, } from "./relations.js";
|
|
8
9
|
export { searchUsers, normalizeListedUser } from "./users.js";
|
|
9
10
|
export { listProjectMembers, matchMemberByName } from "./memberships.js";
|
|
10
11
|
export { inspectAttachments, uploadAttachments, uploadFile, } from "./attachments.js";
|
|
11
|
-
export { ATTACHMENT_MAX_BYTES, ATTACHMENT_MAX_FILES, } from "./types.js";
|
|
12
|
+
export { ATTACHMENT_MAX_BYTES, ATTACHMENT_MAX_FILES, DELAY_RELATION_TYPES, ISSUE_RELATION_TYPES, } from "./types.js";
|
|
12
13
|
export { detectNotesMarkup, formatNotesForRedmine, formatDescriptionForRedmine, } from "./textile.js";
|
|
13
14
|
//# 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,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,qBAAqB,EACrB,UAAU,GAEX,MAAM,aAAa,CAAC;AACrB,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,mBAAmB,EACnB,WAAW,EACX,WAAW,EACX,iBAAiB,GAClB,MAAM,aAAa,CAAC;AACrB,OAAO,EACL,gBAAgB,EAChB,gBAAgB,EAChB,kBAAkB,EAClB,mBAAmB,EACnB,oBAAoB,GACrB,MAAM,gBAAgB,CAAC;AACxB,OAAO,EAAE,WAAW,EAAE,mBAAmB,EAAE,MAAM,YAAY,CAAC;AAC9D,OAAO,EAAE,kBAAkB,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AACzE,OAAO,EACL,kBAAkB,EAClB,iBAAiB,EACjB,UAAU,GACX,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EACL,oBAAoB,EACpB,oBAAoB,EACpB,oBAAoB,EACpB,oBAAoB,GACrB,MAAM,YAAY,CAAC;AACpB,OAAO,EACL,iBAAiB,EACjB,qBAAqB,EACrB,2BAA2B,GAC5B,MAAM,cAAc,CAAC"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import type { RedmineHttp } from "./http.js";
|
|
2
|
+
import type { AddIssueRelationInput, IssueRelation, ListIssueRelationsResult, RemoveIssueRelationResult, ReplaceIssueRelationInput, ReplaceIssueRelationResult } from "./types.js";
|
|
3
|
+
export declare function listIssueRelations(http: RedmineHttp, issueId: number): Promise<ListIssueRelationsResult>;
|
|
4
|
+
export declare function getIssueRelation(http: RedmineHttp, relationId: number): Promise<IssueRelation>;
|
|
5
|
+
export declare function addIssueRelation(http: RedmineHttp, input: AddIssueRelationInput): Promise<IssueRelation>;
|
|
6
|
+
export declare function removeIssueRelation(http: RedmineHttp, relationId: number): Promise<RemoveIssueRelationResult>;
|
|
7
|
+
/**
|
|
8
|
+
* Redmine has no relation update endpoint, so a change is delete + re-create.
|
|
9
|
+
* The original relation is read first so unchanged fields carry over.
|
|
10
|
+
*/
|
|
11
|
+
export declare function replaceIssueRelation(http: RedmineHttp, input: ReplaceIssueRelationInput): Promise<ReplaceIssueRelationResult>;
|
|
@@ -0,0 +1,140 @@
|
|
|
1
|
+
import { RedmineError } from "./errors.js";
|
|
2
|
+
import { DELAY_RELATION_TYPES, ISSUE_RELATION_TYPES } from "./types.js";
|
|
3
|
+
function normalizeRelation(raw) {
|
|
4
|
+
return {
|
|
5
|
+
id: raw.id,
|
|
6
|
+
issueId: raw.issue_id,
|
|
7
|
+
issueToId: raw.issue_to_id,
|
|
8
|
+
relationType: raw.relation_type,
|
|
9
|
+
delay: raw.delay ?? null,
|
|
10
|
+
};
|
|
11
|
+
}
|
|
12
|
+
function assertRelationType(relationType) {
|
|
13
|
+
if (ISSUE_RELATION_TYPES.includes(relationType)) {
|
|
14
|
+
return;
|
|
15
|
+
}
|
|
16
|
+
throw new RedmineError({
|
|
17
|
+
code: "REDMINE_VALIDATION_ERROR",
|
|
18
|
+
message: `Unknown relationType "${relationType}"`,
|
|
19
|
+
check: [`Use one of: ${ISSUE_RELATION_TYPES.join(", ")}`],
|
|
20
|
+
});
|
|
21
|
+
}
|
|
22
|
+
function assertDelayAllowed(relationType, delay) {
|
|
23
|
+
if (delay === undefined || delay === null)
|
|
24
|
+
return;
|
|
25
|
+
if (DELAY_RELATION_TYPES.includes(relationType)) {
|
|
26
|
+
return;
|
|
27
|
+
}
|
|
28
|
+
throw new RedmineError({
|
|
29
|
+
code: "REDMINE_VALIDATION_ERROR",
|
|
30
|
+
message: `delay is only valid for ${DELAY_RELATION_TYPES.join("/")} relations, not "${relationType}"`,
|
|
31
|
+
check: [
|
|
32
|
+
"Drop delay for this relation type",
|
|
33
|
+
"Or use relationType precedes/follows",
|
|
34
|
+
],
|
|
35
|
+
});
|
|
36
|
+
}
|
|
37
|
+
export async function listIssueRelations(http, issueId) {
|
|
38
|
+
try {
|
|
39
|
+
const data = await http.getJson(`/issues/${issueId}/relations.json`);
|
|
40
|
+
const relations = (data?.relations ?? []).map(normalizeRelation);
|
|
41
|
+
return {
|
|
42
|
+
issueId,
|
|
43
|
+
relations,
|
|
44
|
+
totalCount: data?.total_count ?? relations.length,
|
|
45
|
+
via: "relations",
|
|
46
|
+
};
|
|
47
|
+
}
|
|
48
|
+
catch (err) {
|
|
49
|
+
// Some projects deny the relations index yet still expose the same
|
|
50
|
+
// relations (ids included) on the issue itself.
|
|
51
|
+
if (err instanceof RedmineError &&
|
|
52
|
+
err.code === "REDMINE_PERMISSION_DENIED") {
|
|
53
|
+
const data = await http.getJson(`/issues/${issueId}.json`, { include: "relations" });
|
|
54
|
+
const relations = (data?.issue?.relations ?? []).map(normalizeRelation);
|
|
55
|
+
return {
|
|
56
|
+
issueId,
|
|
57
|
+
relations,
|
|
58
|
+
totalCount: relations.length,
|
|
59
|
+
via: "issue-include",
|
|
60
|
+
};
|
|
61
|
+
}
|
|
62
|
+
throw err;
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
export async function getIssueRelation(http, relationId) {
|
|
66
|
+
const data = await http.getJson(`/relations/${relationId}.json`);
|
|
67
|
+
if (!data?.relation) {
|
|
68
|
+
throw new RedmineError({
|
|
69
|
+
code: "REDMINE_ISSUE_NOT_FOUND",
|
|
70
|
+
message: `Relation #${relationId} was not found`,
|
|
71
|
+
check: [
|
|
72
|
+
"List relations with redmine_list_issue_relations to get a valid id",
|
|
73
|
+
],
|
|
74
|
+
retrySafe: false,
|
|
75
|
+
});
|
|
76
|
+
}
|
|
77
|
+
return normalizeRelation(data.relation);
|
|
78
|
+
}
|
|
79
|
+
export async function addIssueRelation(http, input) {
|
|
80
|
+
assertRelationType(input.relationType);
|
|
81
|
+
assertDelayAllowed(input.relationType, input.delay);
|
|
82
|
+
if (input.issueId === input.issueToId) {
|
|
83
|
+
throw new RedmineError({
|
|
84
|
+
code: "REDMINE_VALIDATION_ERROR",
|
|
85
|
+
message: "An issue cannot be related to itself",
|
|
86
|
+
check: ["Pass a different issueToId"],
|
|
87
|
+
});
|
|
88
|
+
}
|
|
89
|
+
const relation = {
|
|
90
|
+
issue_to_id: input.issueToId,
|
|
91
|
+
relation_type: input.relationType,
|
|
92
|
+
};
|
|
93
|
+
if (input.delay !== undefined && input.delay !== null) {
|
|
94
|
+
relation.delay = input.delay;
|
|
95
|
+
}
|
|
96
|
+
const data = await http.postJson(`/issues/${input.issueId}/relations.json`, { relation });
|
|
97
|
+
if (!data?.relation) {
|
|
98
|
+
throw new Error("Redmine addIssueRelation returned empty body");
|
|
99
|
+
}
|
|
100
|
+
return normalizeRelation(data.relation);
|
|
101
|
+
}
|
|
102
|
+
export async function removeIssueRelation(http, relationId) {
|
|
103
|
+
await http.deleteJson(`/relations/${relationId}.json`);
|
|
104
|
+
return { relationId, removed: true };
|
|
105
|
+
}
|
|
106
|
+
/**
|
|
107
|
+
* Redmine has no relation update endpoint, so a change is delete + re-create.
|
|
108
|
+
* The original relation is read first so unchanged fields carry over.
|
|
109
|
+
*/
|
|
110
|
+
export async function replaceIssueRelation(http, input) {
|
|
111
|
+
const existing = await getIssueRelation(http, input.relationId);
|
|
112
|
+
const relationType = input.relationType ?? existing.relationType;
|
|
113
|
+
assertRelationType(relationType);
|
|
114
|
+
const delay = input.delay !== undefined ? input.delay : existing.delay;
|
|
115
|
+
assertDelayAllowed(relationType, delay);
|
|
116
|
+
const next = {
|
|
117
|
+
issueId: existing.issueId,
|
|
118
|
+
issueToId: input.issueToId ?? existing.issueToId,
|
|
119
|
+
relationType: relationType,
|
|
120
|
+
delay,
|
|
121
|
+
};
|
|
122
|
+
await removeIssueRelation(http, input.relationId);
|
|
123
|
+
try {
|
|
124
|
+
const relation = await addIssueRelation(http, next);
|
|
125
|
+
return { removedRelationId: input.relationId, relation };
|
|
126
|
+
}
|
|
127
|
+
catch (err) {
|
|
128
|
+
const reason = err instanceof Error ? err.message : String(err);
|
|
129
|
+
throw new RedmineError({
|
|
130
|
+
code: "REDMINE_UNKNOWN_ERROR",
|
|
131
|
+
message: `Relation #${input.relationId} was removed but the replacement failed: ${reason}`,
|
|
132
|
+
check: [
|
|
133
|
+
`Re-add it with redmine_add_issue_relation: issueId=${next.issueId}, issueToId=${next.issueToId}, relationType=${next.relationType}`,
|
|
134
|
+
"Check the issue #" + next.issueId + " relations panel in Redmine",
|
|
135
|
+
],
|
|
136
|
+
retrySafe: false,
|
|
137
|
+
});
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
//# sourceMappingURL=relations.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"relations.js","sourceRoot":"","sources":["../src/relations.ts"],"names":[],"mappings":"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"}
|
package/dist/types.d.ts
CHANGED
|
@@ -136,10 +136,54 @@ export type IssueUploadToken = {
|
|
|
136
136
|
};
|
|
137
137
|
export declare const ATTACHMENT_MAX_FILES = 5;
|
|
138
138
|
export declare const ATTACHMENT_MAX_BYTES: number;
|
|
139
|
+
/** Redmine relation_type values (연결된 일감 관계 종류) */
|
|
140
|
+
export declare const ISSUE_RELATION_TYPES: readonly ["relates", "duplicates", "duplicated", "blocks", "blocked", "precedes", "follows", "copied_to", "copied_from"];
|
|
141
|
+
export type IssueRelationType = (typeof ISSUE_RELATION_TYPES)[number];
|
|
142
|
+
/** Relation types that accept a delay (in days) */
|
|
143
|
+
export declare const DELAY_RELATION_TYPES: readonly ["precedes", "follows"];
|
|
144
|
+
export type IssueRelation = {
|
|
145
|
+
id: number;
|
|
146
|
+
issueId: number;
|
|
147
|
+
issueToId: number;
|
|
148
|
+
relationType: string;
|
|
149
|
+
delay: number | null;
|
|
150
|
+
};
|
|
151
|
+
export type ListIssueRelationsResult = {
|
|
152
|
+
issueId: number;
|
|
153
|
+
relations: IssueRelation[];
|
|
154
|
+
totalCount: number;
|
|
155
|
+
/**
|
|
156
|
+
* Which endpoint answered: the relations index, or the issue itself when
|
|
157
|
+
* the project denies that index (read works, writes will still 403).
|
|
158
|
+
*/
|
|
159
|
+
via?: "relations" | "issue-include";
|
|
160
|
+
};
|
|
161
|
+
export type AddIssueRelationInput = {
|
|
162
|
+
issueId: number;
|
|
163
|
+
issueToId: number;
|
|
164
|
+
relationType: IssueRelationType;
|
|
165
|
+
delay?: number | null;
|
|
166
|
+
};
|
|
167
|
+
export type RemoveIssueRelationResult = {
|
|
168
|
+
relationId: number;
|
|
169
|
+
removed: true;
|
|
170
|
+
};
|
|
171
|
+
export type ReplaceIssueRelationInput = {
|
|
172
|
+
relationId: number;
|
|
173
|
+
issueToId?: number;
|
|
174
|
+
relationType?: IssueRelationType;
|
|
175
|
+
delay?: number | null;
|
|
176
|
+
};
|
|
177
|
+
export type ReplaceIssueRelationResult = {
|
|
178
|
+
removedRelationId: number;
|
|
179
|
+
relation: IssueRelation;
|
|
180
|
+
};
|
|
139
181
|
export type CreateIssueInput = {
|
|
140
182
|
projectId: number;
|
|
141
183
|
subject: string;
|
|
142
184
|
description?: string;
|
|
185
|
+
/** 상위 일감 (parent_issue_id) — creates this issue as a subtask */
|
|
186
|
+
parentIssueId?: number;
|
|
143
187
|
trackerId?: number;
|
|
144
188
|
statusId?: number;
|
|
145
189
|
priorityId?: number;
|
|
@@ -166,6 +210,8 @@ export type UpdateIssueInput = {
|
|
|
166
210
|
issueId: number;
|
|
167
211
|
subject?: string;
|
|
168
212
|
description?: string;
|
|
213
|
+
/** 상위 일감 — number attaches/moves, null detaches (하위일감 연결 해제) */
|
|
214
|
+
parentIssueId?: number | null;
|
|
169
215
|
trackerId?: number;
|
|
170
216
|
statusId?: number;
|
|
171
217
|
priorityId?: number;
|
|
@@ -185,6 +231,7 @@ export type UpdateIssueResult = {
|
|
|
185
231
|
id: number;
|
|
186
232
|
name: string;
|
|
187
233
|
} | null;
|
|
234
|
+
parentIssueId?: number | null;
|
|
188
235
|
};
|
|
189
236
|
export type SearchUsersResult = {
|
|
190
237
|
users: RedmineUser[];
|
package/dist/types.js
CHANGED
|
@@ -1,3 +1,17 @@
|
|
|
1
1
|
export const ATTACHMENT_MAX_FILES = 5;
|
|
2
2
|
export const ATTACHMENT_MAX_BYTES = 10 * 1024 * 1024;
|
|
3
|
+
/** Redmine relation_type values (연결된 일감 관계 종류) */
|
|
4
|
+
export const ISSUE_RELATION_TYPES = [
|
|
5
|
+
"relates",
|
|
6
|
+
"duplicates",
|
|
7
|
+
"duplicated",
|
|
8
|
+
"blocks",
|
|
9
|
+
"blocked",
|
|
10
|
+
"precedes",
|
|
11
|
+
"follows",
|
|
12
|
+
"copied_to",
|
|
13
|
+
"copied_from",
|
|
14
|
+
];
|
|
15
|
+
/** Relation types that accept a delay (in days) */
|
|
16
|
+
export const DELAY_RELATION_TYPES = ["precedes", "follows"];
|
|
3
17
|
//# sourceMappingURL=types.js.map
|
package/dist/types.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAiHA,MAAM,CAAC,MAAM,oBAAoB,GAAG,CAAC,CAAC;AACtC,MAAM,CAAC,MAAM,oBAAoB,GAAG,EAAE,GAAG,IAAI,GAAG,IAAI,CAAC"}
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAiHA,MAAM,CAAC,MAAM,oBAAoB,GAAG,CAAC,CAAC;AACtC,MAAM,CAAC,MAAM,oBAAoB,GAAG,EAAE,GAAG,IAAI,GAAG,IAAI,CAAC;AAErD,kDAAkD;AAClD,MAAM,CAAC,MAAM,oBAAoB,GAAG;IAClC,SAAS;IACT,YAAY;IACZ,YAAY;IACZ,QAAQ;IACR,SAAS;IACT,UAAU;IACV,SAAS;IACT,WAAW;IACX,aAAa;CACL,CAAC;AAIX,mDAAmD;AACnD,MAAM,CAAC,MAAM,oBAAoB,GAAG,CAAC,UAAU,EAAE,SAAS,CAAU,CAAC"}
|
package/dist/writes.js
CHANGED
|
@@ -3,6 +3,10 @@ function applyOptionalIssueFields(issue, input, opts = {}) {
|
|
|
3
3
|
if (input.description !== undefined) {
|
|
4
4
|
issue.description = formatDescriptionForRedmine(input.description);
|
|
5
5
|
}
|
|
6
|
+
if (input.parentIssueId !== undefined) {
|
|
7
|
+
issue.parent_issue_id =
|
|
8
|
+
input.parentIssueId === null ? "" : input.parentIssueId;
|
|
9
|
+
}
|
|
6
10
|
if (input.trackerId !== undefined)
|
|
7
11
|
issue.tracker_id = input.trackerId;
|
|
8
12
|
if (input.statusId !== undefined)
|
|
@@ -64,6 +68,9 @@ export async function updateIssue(http, input) {
|
|
|
64
68
|
issueId: input.issueId,
|
|
65
69
|
subject: data?.issue?.subject ?? input.subject,
|
|
66
70
|
status: data?.issue?.status ?? null,
|
|
71
|
+
...(input.parentIssueId !== undefined
|
|
72
|
+
? { parentIssueId: input.parentIssueId }
|
|
73
|
+
: {}),
|
|
67
74
|
};
|
|
68
75
|
}
|
|
69
76
|
export async function addIssueAttachments(http, input) {
|
package/dist/writes.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"writes.js","sourceRoot":"","sources":["../src/writes.ts"],"names":[],"mappings":"AAWA,OAAO,EAAE,2BAA2B,EAAE,qBAAqB,EAAE,MAAM,cAAc,CAAC;AAWlF,SAAS,wBAAwB,CAC/B,KAA8B,EAC9B,
|
|
1
|
+
{"version":3,"file":"writes.js","sourceRoot":"","sources":["../src/writes.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "redmine-devrelay-client",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.6.0",
|
|
4
4
|
"description": "Redmine REST client for redmine-devrelay MCP ??auth, pagination, issue read/write helpers",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "./dist/index.js",
|
|
@@ -13,7 +13,8 @@
|
|
|
13
13
|
},
|
|
14
14
|
"files": [
|
|
15
15
|
"dist",
|
|
16
|
-
"README.md"
|
|
16
|
+
"README.md",
|
|
17
|
+
"README.ko.md"
|
|
17
18
|
],
|
|
18
19
|
"repository": {
|
|
19
20
|
"type": "git",
|