agentplane 0.3.16 → 0.3.17
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/dist/.build-manifest.json +159 -54
- package/dist/backends/task-backend/redmine/backend-runtime.d.ts +4 -146
- package/dist/backends/task-backend/redmine/backend-runtime.d.ts.map +1 -1
- package/dist/backends/task-backend/redmine/backend-runtime.js +4 -258
- package/dist/backends/task-backend/redmine/mapping.js +1 -1
- package/dist/backends/task-backend/redmine/runtime-context.d.ts +98 -0
- package/dist/backends/task-backend/redmine/runtime-context.d.ts.map +1 -0
- package/dist/backends/task-backend/redmine/runtime-context.js +57 -0
- package/dist/backends/task-backend/redmine/runtime-methods.d.ts +33 -0
- package/dist/backends/task-backend/redmine/runtime-methods.d.ts.map +1 -0
- package/dist/backends/task-backend/redmine/runtime-methods.js +86 -0
- package/dist/backends/task-backend/redmine/runtime-operations.d.ts +19 -0
- package/dist/backends/task-backend/redmine/runtime-operations.d.ts.map +1 -0
- package/dist/backends/task-backend/redmine/runtime-operations.js +83 -0
- package/dist/backends/task-backend/redmine/runtime-state.d.ts +10 -0
- package/dist/backends/task-backend/redmine/runtime-state.d.ts.map +1 -0
- package/dist/backends/task-backend/redmine/runtime-state.js +45 -0
- package/dist/backends/task-backend/shared/constants.d.ts +1 -1
- package/dist/backends/task-backend/shared/constants.d.ts.map +1 -1
- package/dist/backends/task-backend/shared/constants.js +1 -1
- package/dist/backends/task-index.d.ts +0 -4
- package/dist/backends/task-index.d.ts.map +1 -1
- package/dist/backends/task-index.js +0 -33
- package/dist/cli/exit-codes.d.ts.map +1 -1
- package/dist/cli/exit-codes.js +1 -0
- package/dist/cli/http.d.ts.map +1 -1
- package/dist/cli/http.js +34 -15
- package/dist/cli/run-cli/command-loaders.d.ts +1 -5
- package/dist/cli/run-cli/command-loaders.d.ts.map +1 -1
- package/dist/cli/spec/errors.d.ts +5 -0
- package/dist/cli/spec/errors.d.ts.map +1 -1
- package/dist/cli/spec/errors.js +14 -1
- package/dist/cli/spec/parse.d.ts.map +1 -1
- package/dist/cli/spec/parse.js +8 -1
- package/dist/commands/branch/work-start.d.ts.map +1 -1
- package/dist/commands/branch/work-start.direct.d.ts +13 -0
- package/dist/commands/branch/work-start.direct.d.ts.map +1 -0
- package/dist/commands/branch/work-start.direct.js +75 -0
- package/dist/commands/branch/work-start.git.d.ts +3 -0
- package/dist/commands/branch/work-start.git.d.ts.map +1 -0
- package/dist/commands/branch/work-start.git.js +19 -0
- package/dist/commands/branch/work-start.hook-shim.d.ts +2 -0
- package/dist/commands/branch/work-start.hook-shim.d.ts.map +1 -0
- package/dist/commands/branch/work-start.hook-shim.js +38 -0
- package/dist/commands/branch/work-start.js +6 -235
- package/dist/commands/branch/work-start.materialize.d.ts +16 -0
- package/dist/commands/branch/work-start.materialize.d.ts.map +1 -0
- package/dist/commands/branch/work-start.materialize.js +110 -0
- package/dist/commands/doctor/fixes.d.ts +0 -5
- package/dist/commands/doctor/fixes.d.ts.map +1 -1
- package/dist/commands/doctor/fixes.js +0 -70
- package/dist/commands/doctor/workflow.d.ts.map +1 -1
- package/dist/commands/doctor/workflow.js +2 -23
- package/dist/commands/doctor.run.d.ts.map +1 -1
- package/dist/commands/doctor.run.js +1 -3
- package/dist/commands/hooks/index.d.ts +4 -20
- package/dist/commands/hooks/index.d.ts.map +1 -1
- package/dist/commands/hooks/index.js +4 -432
- package/dist/commands/hooks/install.d.ts +11 -0
- package/dist/commands/hooks/install.d.ts.map +1 -0
- package/dist/commands/hooks/install.js +136 -0
- package/dist/commands/hooks/run.commit-msg.d.ts +3 -0
- package/dist/commands/hooks/run.commit-msg.d.ts.map +1 -0
- package/dist/commands/hooks/run.commit-msg.js +67 -0
- package/dist/commands/hooks/run.d.ts +9 -0
- package/dist/commands/hooks/run.d.ts.map +1 -0
- package/dist/commands/hooks/run.js +45 -0
- package/dist/commands/hooks/run.post-merge.d.ts +3 -0
- package/dist/commands/hooks/run.post-merge.d.ts.map +1 -0
- package/dist/commands/hooks/run.post-merge.js +44 -0
- package/dist/commands/hooks/run.pre-commit.d.ts +3 -0
- package/dist/commands/hooks/run.pre-commit.d.ts.map +1 -0
- package/dist/commands/hooks/run.pre-commit.js +48 -0
- package/dist/commands/hooks/run.pre-push.d.ts +6 -0
- package/dist/commands/hooks/run.pre-push.d.ts.map +1 -0
- package/dist/commands/hooks/run.pre-push.js +88 -0
- package/dist/commands/hooks/shared.d.ts +7 -0
- package/dist/commands/hooks/shared.d.ts.map +1 -0
- package/dist/commands/hooks/shared.js +41 -0
- package/dist/commands/recipes/impl/index.d.ts.map +1 -1
- package/dist/commands/recipes/impl/index.js +13 -3
- package/dist/commands/task/hosted-close-pr.command.d.ts +2 -7
- package/dist/commands/task/hosted-close-pr.command.d.ts.map +1 -1
- package/dist/commands/task/hosted-close-pr.command.js +9 -373
- package/dist/commands/task/hosted-close-pr.execute.d.ts +3 -0
- package/dist/commands/task/hosted-close-pr.execute.d.ts.map +1 -0
- package/dist/commands/task/hosted-close-pr.execute.js +135 -0
- package/dist/commands/task/hosted-close-pr.postcheck.d.ts +3 -0
- package/dist/commands/task/hosted-close-pr.postcheck.d.ts.map +1 -0
- package/dist/commands/task/hosted-close-pr.postcheck.js +13 -0
- package/dist/commands/task/hosted-close-pr.precheck.d.ts +4 -0
- package/dist/commands/task/hosted-close-pr.precheck.d.ts.map +1 -0
- package/dist/commands/task/hosted-close-pr.precheck.js +288 -0
- package/dist/commands/task/hosted-close-pr.report.d.ts +4 -0
- package/dist/commands/task/hosted-close-pr.report.d.ts.map +1 -0
- package/dist/commands/task/hosted-close-pr.report.js +42 -0
- package/dist/commands/task/hosted-close-pr.types.d.ts +75 -0
- package/dist/commands/task/hosted-close-pr.types.d.ts.map +1 -0
- package/dist/commands/task/hosted-close-pr.types.js +1 -0
- package/dist/commands/upgrade/materialize.d.ts.map +1 -1
- package/dist/commands/upgrade/materialize.js +0 -7
- package/dist/commands/upgrade/source.d.ts +0 -1
- package/dist/commands/upgrade/source.d.ts.map +1 -1
- package/dist/commands/upgrade/source.js +1 -9
- package/dist/runner/context/base-prompts.d.ts.map +1 -1
- package/dist/runner/context/base-prompts.js +4 -0
- package/dist/runner/context/project-skill-prompt-blocks.d.ts +5 -0
- package/dist/runner/context/project-skill-prompt-blocks.d.ts.map +1 -0
- package/dist/runner/context/project-skill-prompt-blocks.js +57 -0
- package/dist/runner/process-supervision/run.d.ts.map +1 -1
- package/dist/runner/process-supervision/run.js +61 -59
- package/dist/shared/errors.d.ts +4 -1
- package/dist/shared/errors.d.ts.map +1 -1
- package/dist/shared/errors.js +6 -0
- package/dist/shared/workflow-artifacts.d.ts.map +1 -1
- package/dist/shared/workflow-artifacts.js +1 -8
- package/dist/workflow-runtime/file-ops.d.ts.map +1 -1
- package/dist/workflow-runtime/file-ops.js +1 -20
- package/dist/workflow-runtime/paths.d.ts.map +1 -1
- package/dist/workflow-runtime/paths.js +0 -1
- package/dist/workflow-runtime/types.d.ts +0 -1
- package/dist/workflow-runtime/types.d.ts.map +1 -1
- package/package.json +3 -3
|
@@ -1,258 +1,4 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
import { doneRatioForStatus, issueToTask as issueToTaskImpl, startDateFromTaskId, taskToIssuePayload as taskToIssuePayloadImpl, } from "./mapping.js";
|
|
6
|
-
import { maybeParseJson as maybeParseRedmineJson } from "./parse.js";
|
|
7
|
-
import { findIssueByTaskId as findIssueByTaskIdImpl, listTasksRemote as listTasksRemoteImpl, } from "./remote.js";
|
|
8
|
-
import { diffRedmineTasks, redmineTasksDiffer } from "./backend-report.js";
|
|
9
|
-
export function createRedmineCacheDocContext(host) {
|
|
10
|
-
return {
|
|
11
|
-
cache: host.cache,
|
|
12
|
-
customFields: host.customFields,
|
|
13
|
-
ownerAgent: host.ownerAgent,
|
|
14
|
-
batchSize: host.batchSize,
|
|
15
|
-
findIssueByTaskId: async (taskId) => await host.findIssueByTaskId(taskId),
|
|
16
|
-
issueToTask: (issue, taskIdOverride) => host.issueToTask(issue, taskIdOverride),
|
|
17
|
-
customFieldValue: (issue, fieldId) => host.customFieldValue(issue, fieldId),
|
|
18
|
-
appendCustomField: (fields, key, value) => host.appendCustomField(fields, key, value),
|
|
19
|
-
requestJson: async (method, reqPath, payload, params) => await host.requestJson(method, reqPath, payload, params),
|
|
20
|
-
assertExpectedRevisionSupported: (taskId, opts) => host.assertExpectedRevisionSupported(taskId, opts),
|
|
21
|
-
assertExpectedRevision: (taskId, expectedRevision, currentRevision) => host.assertExpectedRevision(taskId, expectedRevision, currentRevision),
|
|
22
|
-
cacheTask: async (task, dirty) => await host.cacheTask(task, dirty),
|
|
23
|
-
};
|
|
24
|
-
}
|
|
25
|
-
export function createRedmineReportContext(host) {
|
|
26
|
-
return {
|
|
27
|
-
projectId: host.projectId,
|
|
28
|
-
customFields: host.customFields,
|
|
29
|
-
requestJson: async (method, reqPath, payload, params) => await host.requestJson(method, reqPath, payload, params),
|
|
30
|
-
};
|
|
31
|
-
}
|
|
32
|
-
export function createRedmineSyncContext(host) {
|
|
33
|
-
return {
|
|
34
|
-
cache: host.cache,
|
|
35
|
-
customFields: host.customFields,
|
|
36
|
-
ownerAgent: host.ownerAgent,
|
|
37
|
-
projectId: host.projectId,
|
|
38
|
-
batchSize: host.batchSize,
|
|
39
|
-
batchPauseMs: host.batchPauseMs,
|
|
40
|
-
statusMap: host.statusMap,
|
|
41
|
-
issueCache: host.issueCache,
|
|
42
|
-
inferredStatusByTaskStatus: host.inferredStatusByTaskStatus,
|
|
43
|
-
setInferredStatusByTaskStatus: host.setInferredStatusByTaskStatus,
|
|
44
|
-
listTasksRemote: async () => await host.listTasksRemote(),
|
|
45
|
-
writeTask: async (task, opts) => await host.writeTask(task, opts),
|
|
46
|
-
writeTasks: async (tasks, opts) => await host.writeTasks(tasks, opts),
|
|
47
|
-
findIssueByTaskId: async (taskId) => await host.findIssueByTaskId(taskId),
|
|
48
|
-
issueToTask: (issue, taskIdOverride) => host.issueToTask(issue, taskIdOverride),
|
|
49
|
-
taskToIssuePayload: (task, existingIssue) => host.taskToIssuePayload(task, existingIssue),
|
|
50
|
-
appendCustomField: (fields, key, value) => host.appendCustomField(fields, key, value),
|
|
51
|
-
customFieldValue: (issue, fieldId) => host.customFieldValue(issue, fieldId),
|
|
52
|
-
maybeParseJson: (value) => host.maybeParseJson(value),
|
|
53
|
-
normalizeComments: (value) => host.normalizeComments(value),
|
|
54
|
-
appendCommentNotes: async (issueId, existingComments, desiredComments) => await host.appendCommentNotes(issueId, existingComments, desiredComments),
|
|
55
|
-
cacheTask: async (task, dirty) => await host.cacheTask(task, dirty),
|
|
56
|
-
assertExpectedRevisionSupported: (taskId, opts) => host.assertExpectedRevisionSupported(taskId, opts),
|
|
57
|
-
assertExpectedRevision: (taskId, expectedRevision, currentRevision) => host.assertExpectedRevision(taskId, expectedRevision, currentRevision),
|
|
58
|
-
ensureDocMetadata: (task) => host.ensureDocMetadata(task),
|
|
59
|
-
diffTasks: (localTask, remoteTask) => host.diffTasks(localTask, remoteTask),
|
|
60
|
-
tasksDiffer: (localTask, remoteTask) => host.tasksDiffer(localTask, remoteTask),
|
|
61
|
-
taskIdFieldId: () => host.taskIdFieldId(),
|
|
62
|
-
setIssueCustomFieldValue: (issue, fieldId, value) => host.setIssueCustomFieldValue(issue, fieldId, value),
|
|
63
|
-
requestJson: async (method, reqPath, payload, params, opts) => await host.requestJson(method, reqPath, payload, params, opts),
|
|
64
|
-
};
|
|
65
|
-
}
|
|
66
|
-
export function ensureRedmineDocMetadata(task) {
|
|
67
|
-
if (task.doc === undefined)
|
|
68
|
-
return;
|
|
69
|
-
task.doc_version = normalizeDocVersion(task.doc_version);
|
|
70
|
-
task.doc_updated_at ??= nowIso();
|
|
71
|
-
task.doc_updated_by ??= DEFAULT_DOC_UPDATED_BY;
|
|
72
|
-
}
|
|
73
|
-
export async function cacheRedmineTask(host, task, dirty) {
|
|
74
|
-
if (!host.cache)
|
|
75
|
-
return;
|
|
76
|
-
const next = { ...task, dirty };
|
|
77
|
-
await host.cache.writeTask(next);
|
|
78
|
-
}
|
|
79
|
-
export function assertRedmineExpectedRevisionSupported(host, taskId, opts) {
|
|
80
|
-
if (opts?.expectedRevision === undefined)
|
|
81
|
-
return;
|
|
82
|
-
if (host.capabilities.supports_revision_guarded_writes)
|
|
83
|
-
return;
|
|
84
|
-
throw new BackendError(`Task revision guarding is unavailable for ${taskId} without AGENTPLANE_REDMINE_CUSTOM_FIELDS_CANONICAL_STATE`, "E_BACKEND");
|
|
85
|
-
}
|
|
86
|
-
export function assertRedmineExpectedRevision(taskId, expectedRevision, currentRevision) {
|
|
87
|
-
if (expectedRevision === undefined)
|
|
88
|
-
return;
|
|
89
|
-
const expected = Math.trunc(expectedRevision);
|
|
90
|
-
if (expected <= 0 || expected === currentRevision)
|
|
91
|
-
return;
|
|
92
|
-
throw new BackendError(`Task revision changed concurrently: ${taskId} ` +
|
|
93
|
-
`(expected revision ${expected}, current revision ${currentRevision})`, "E_BACKEND");
|
|
94
|
-
}
|
|
95
|
-
export function redmineTaskIdFieldId(host) {
|
|
96
|
-
const fieldId = host.customFields?.task_id;
|
|
97
|
-
if (fieldId)
|
|
98
|
-
return fieldId;
|
|
99
|
-
throw new BackendError(redmineConfigMissingEnvMessage("AGENTPLANE_REDMINE_CUSTOM_FIELDS_TASK_ID"), "E_BACKEND");
|
|
100
|
-
}
|
|
101
|
-
export function setRedmineIssueCustomField(issue, fieldId, value) {
|
|
102
|
-
setRedmineIssueCustomFieldValue(issue, fieldId, value);
|
|
103
|
-
}
|
|
104
|
-
export async function listRedmineRemoteTasks(host) {
|
|
105
|
-
const taskFieldId = redmineTaskIdFieldId(host);
|
|
106
|
-
return await listTasksRemoteImpl({
|
|
107
|
-
projectId: host.projectId,
|
|
108
|
-
taskFieldId,
|
|
109
|
-
issueCache: host.issueCache,
|
|
110
|
-
requestJson: async (method, reqPath, payload, params) => await host.requestJson(method, reqPath, payload, params),
|
|
111
|
-
customFieldValue: (issue, fieldId) => host.customFieldValue(issue, fieldId),
|
|
112
|
-
issueToTask: (issue, taskIdOverride) => host.issueToTask(issue, taskIdOverride),
|
|
113
|
-
});
|
|
114
|
-
}
|
|
115
|
-
export async function findRedmineIssueByTaskId(host, taskId) {
|
|
116
|
-
const taskFieldId = redmineTaskIdFieldId(host);
|
|
117
|
-
return await findIssueByTaskIdImpl({
|
|
118
|
-
taskId,
|
|
119
|
-
projectId: host.projectId,
|
|
120
|
-
taskFieldId,
|
|
121
|
-
issueCache: host.issueCache,
|
|
122
|
-
requestJson: async (method, reqPath, payload, params) => await host.requestJson(method, reqPath, payload, params),
|
|
123
|
-
customFieldValue: (issue, fieldId) => host.customFieldValue(issue, fieldId),
|
|
124
|
-
refreshList: async () => {
|
|
125
|
-
await host.listTasksRemote();
|
|
126
|
-
},
|
|
127
|
-
});
|
|
128
|
-
}
|
|
129
|
-
export function redmineIssueToTask(host, issue, taskIdOverride) {
|
|
130
|
-
return issueToTaskImpl({
|
|
131
|
-
issue,
|
|
132
|
-
taskIdOverride,
|
|
133
|
-
reverseStatus: host.reverseStatus,
|
|
134
|
-
customFields: host.customFields,
|
|
135
|
-
ownerAgent: host.ownerAgent,
|
|
136
|
-
defaultDocVersion: DOC_VERSION,
|
|
137
|
-
});
|
|
138
|
-
}
|
|
139
|
-
export function redmineTaskToIssuePayload(host, task, existingIssue) {
|
|
140
|
-
return taskToIssuePayloadImpl({
|
|
141
|
-
task,
|
|
142
|
-
existingIssue,
|
|
143
|
-
statusMap: host.statusMap,
|
|
144
|
-
assigneeId: host.assigneeId,
|
|
145
|
-
customFields: host.customFields,
|
|
146
|
-
appendCustomField: (fields, key, value) => appendRedmineBackendCustomField(host, fields, key, value),
|
|
147
|
-
});
|
|
148
|
-
}
|
|
149
|
-
export function appendRedmineBackendCustomField(host, fields, key, value) {
|
|
150
|
-
appendRedmineCustomField({ customFields: host.customFields, fields, key, value });
|
|
151
|
-
}
|
|
152
|
-
export function normalizeRedmineBackendComments(value) {
|
|
153
|
-
return normalizeCommentsImpl(value);
|
|
154
|
-
}
|
|
155
|
-
export async function appendRedmineBackendCommentNotes(host, issueId, existingComments, desiredComments) {
|
|
156
|
-
await appendCommentNotesImpl({
|
|
157
|
-
issueId,
|
|
158
|
-
existingComments,
|
|
159
|
-
desiredComments,
|
|
160
|
-
requestJson: async (method, reqPath, payload, params) => await requestRedmineBackendJson(host, method, reqPath, payload, params),
|
|
161
|
-
});
|
|
162
|
-
}
|
|
163
|
-
export function redmineBackendCustomFieldValue(issue, fieldId) {
|
|
164
|
-
return redmineCustomFieldValue(issue, fieldId);
|
|
165
|
-
}
|
|
166
|
-
export function maybeParseRedmineBackendJson(value) {
|
|
167
|
-
return maybeParseRedmineJson(value);
|
|
168
|
-
}
|
|
169
|
-
export function coerceRedmineBackendDocVersion(value) {
|
|
170
|
-
if (value === 2 || value === 3)
|
|
171
|
-
return value;
|
|
172
|
-
return null;
|
|
173
|
-
}
|
|
174
|
-
export async function requestRedmineBackendJson(host, method, reqPath, payload, params, opts) {
|
|
175
|
-
return await requestRedmineJson({ baseUrl: host.baseUrl, apiKey: host.apiKey }, method, reqPath, payload, params, opts);
|
|
176
|
-
}
|
|
177
|
-
export const redmineBackendRuntimeMethods = {
|
|
178
|
-
setInferredStatusByTaskStatus(next) {
|
|
179
|
-
this.inferredStatusByTaskStatus = next;
|
|
180
|
-
},
|
|
181
|
-
ensureDocMetadata(task) {
|
|
182
|
-
ensureRedmineDocMetadata(task);
|
|
183
|
-
},
|
|
184
|
-
async cacheTask(task, dirty) {
|
|
185
|
-
await cacheRedmineTask(this, task, dirty);
|
|
186
|
-
},
|
|
187
|
-
assertExpectedRevisionSupported(taskId, opts) {
|
|
188
|
-
assertRedmineExpectedRevisionSupported(this, taskId, opts);
|
|
189
|
-
},
|
|
190
|
-
assertExpectedRevision(taskId, expectedRevision, currentRevision) {
|
|
191
|
-
assertRedmineExpectedRevision(taskId, expectedRevision, currentRevision);
|
|
192
|
-
},
|
|
193
|
-
taskIdFieldId() {
|
|
194
|
-
return redmineTaskIdFieldId(this);
|
|
195
|
-
},
|
|
196
|
-
setIssueCustomFieldValue(issue, fieldId, value) {
|
|
197
|
-
setRedmineIssueCustomField(issue, fieldId, value);
|
|
198
|
-
},
|
|
199
|
-
async listTasksRemote() {
|
|
200
|
-
return await listRedmineRemoteTasks(this);
|
|
201
|
-
},
|
|
202
|
-
async findIssueByTaskId(taskId) {
|
|
203
|
-
return await findRedmineIssueByTaskId(this, taskId);
|
|
204
|
-
},
|
|
205
|
-
issueToTask(issue, taskIdOverride) {
|
|
206
|
-
return redmineIssueToTask(this, issue, taskIdOverride);
|
|
207
|
-
},
|
|
208
|
-
taskToIssuePayload(task, existingIssue) {
|
|
209
|
-
return redmineTaskToIssuePayload(this, task, existingIssue);
|
|
210
|
-
},
|
|
211
|
-
appendCustomField(fields, key, value) {
|
|
212
|
-
appendRedmineBackendCustomField(this, fields, key, value);
|
|
213
|
-
},
|
|
214
|
-
normalizeComments(value) {
|
|
215
|
-
return normalizeRedmineBackendComments(value);
|
|
216
|
-
},
|
|
217
|
-
commentsToPairs(comments) {
|
|
218
|
-
const pairs = [];
|
|
219
|
-
for (const comment of comments) {
|
|
220
|
-
const author = toStringSafe(comment.author).trim();
|
|
221
|
-
const body = toStringSafe(comment.body).trim();
|
|
222
|
-
if (!author && !body)
|
|
223
|
-
continue;
|
|
224
|
-
pairs.push([author, body]);
|
|
225
|
-
}
|
|
226
|
-
return pairs;
|
|
227
|
-
},
|
|
228
|
-
formatCommentNote(author = "unknown", body = "") {
|
|
229
|
-
return `[comment] ${author}: ${body}`.trim();
|
|
230
|
-
},
|
|
231
|
-
async appendCommentNotes(issueId, existingComments, desiredComments) {
|
|
232
|
-
await appendRedmineBackendCommentNotes(this, issueId, existingComments, desiredComments);
|
|
233
|
-
},
|
|
234
|
-
startDateFromTaskId(taskId) {
|
|
235
|
-
return startDateFromTaskId(taskId);
|
|
236
|
-
},
|
|
237
|
-
doneRatioForStatus(status) {
|
|
238
|
-
return doneRatioForStatus(status);
|
|
239
|
-
},
|
|
240
|
-
customFieldValue(issue, fieldId) {
|
|
241
|
-
return redmineBackendCustomFieldValue(issue, fieldId);
|
|
242
|
-
},
|
|
243
|
-
maybeParseJson(value) {
|
|
244
|
-
return maybeParseRedmineBackendJson(value);
|
|
245
|
-
},
|
|
246
|
-
coerceDocVersion(value) {
|
|
247
|
-
return coerceRedmineBackendDocVersion(value);
|
|
248
|
-
},
|
|
249
|
-
diffTasks(localTask, remoteTask) {
|
|
250
|
-
return diffRedmineTasks(localTask, remoteTask);
|
|
251
|
-
},
|
|
252
|
-
tasksDiffer(localTask, remoteTask) {
|
|
253
|
-
return redmineTasksDiffer(localTask, remoteTask);
|
|
254
|
-
},
|
|
255
|
-
async requestJson(method, reqPath, payload, params, opts) {
|
|
256
|
-
return await requestRedmineBackendJson(this, method, reqPath, payload, params, opts);
|
|
257
|
-
},
|
|
258
|
-
};
|
|
1
|
+
export { createRedmineCacheDocContext, createRedmineReportContext, createRedmineSyncContext, } from "./runtime-context.js";
|
|
2
|
+
export { redmineBackendRuntimeMethods } from "./runtime-methods.js";
|
|
3
|
+
export { appendRedmineBackendCommentNotes, appendRedmineBackendCustomField, diffRedmineBackendTasks, findRedmineIssueByTaskId, listRedmineRemoteTasks, maybeParseRedmineBackendJson, normalizeRedmineBackendComments, redmineBackendCustomFieldValue, redmineBackendTasksDiffer, redmineIssueToTask, redmineTaskToIssuePayload, requestRedmineBackendJson, } from "./runtime-operations.js";
|
|
4
|
+
export { assertRedmineExpectedRevision, assertRedmineExpectedRevisionSupported, cacheRedmineTask, coerceRedmineBackendDocVersion, ensureRedmineDocMetadata, redmineTaskIdFieldId, setRedmineIssueCustomField, } from "./runtime-state.js";
|
|
@@ -139,7 +139,7 @@ export function issueToTask(opts) {
|
|
|
139
139
|
task.doc = derivedDoc;
|
|
140
140
|
task.sections = canonicalSections ?? (derivedDoc ? taskDocToSectionMap(derivedDoc) : undefined);
|
|
141
141
|
const docVersion = coerceDocVersion(docVersionVal);
|
|
142
|
-
task.doc_version = docVersion
|
|
142
|
+
task.doc_version = docVersion === opts.defaultDocVersion ? docVersion : opts.defaultDocVersion;
|
|
143
143
|
task.doc_updated_at = docUpdatedAtVal ? toStringSafe(docUpdatedAtVal) : (updatedOn ?? nowIso());
|
|
144
144
|
task.doc_updated_by = docUpdatedByVal ? toStringSafe(docUpdatedByVal) : opts.ownerAgent;
|
|
145
145
|
return task;
|
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
import type { LocalBackend } from "../local-backend.js";
|
|
2
|
+
import type { TaskBackend, TaskData, TaskDocMeta, TaskWriteOptions } from "../shared.js";
|
|
3
|
+
import type { TaskComment } from "./comments.js";
|
|
4
|
+
export type RedmineBackendRuntimeHost = {
|
|
5
|
+
baseUrl: string;
|
|
6
|
+
apiKey: string;
|
|
7
|
+
projectId: string;
|
|
8
|
+
assigneeId: number | null;
|
|
9
|
+
ownerAgent: string;
|
|
10
|
+
statusMap: Record<string, unknown>;
|
|
11
|
+
customFields: Record<string, unknown>;
|
|
12
|
+
batchSize: number;
|
|
13
|
+
batchPauseMs: number;
|
|
14
|
+
cache: LocalBackend | null;
|
|
15
|
+
issueCache: Map<string, Record<string, unknown>>;
|
|
16
|
+
reverseStatus: Map<number, string>;
|
|
17
|
+
inferredStatusByTaskStatus: Map<string, number> | null;
|
|
18
|
+
capabilities: TaskBackend["capabilities"];
|
|
19
|
+
setInferredStatusByTaskStatus: (next: Map<string, number> | null) => void;
|
|
20
|
+
ensureDocMetadata: (task: TaskDocMeta) => void;
|
|
21
|
+
cacheTask: (task: TaskData, dirty: boolean) => Promise<void>;
|
|
22
|
+
assertExpectedRevisionSupported: (taskId: string, opts?: TaskWriteOptions) => void;
|
|
23
|
+
assertExpectedRevision: (taskId: string, expectedRevision: number | undefined, currentRevision: number) => void;
|
|
24
|
+
taskIdFieldId: () => unknown;
|
|
25
|
+
setIssueCustomFieldValue: (issue: Record<string, unknown>, fieldId: unknown, value: unknown) => void;
|
|
26
|
+
listTasksRemote: () => Promise<TaskData[]>;
|
|
27
|
+
findIssueByTaskId: (taskId: string) => Promise<Record<string, unknown> | null>;
|
|
28
|
+
issueToTask: (issue: Record<string, unknown>, taskIdOverride?: string) => TaskData | null;
|
|
29
|
+
taskToIssuePayload: (task: TaskData, existingIssue?: Record<string, unknown>) => Record<string, unknown>;
|
|
30
|
+
appendCustomField: (fields: Record<string, unknown>[], key: string, value: unknown) => void;
|
|
31
|
+
normalizeComments: (value: unknown) => TaskComment[];
|
|
32
|
+
appendCommentNotes: (issueId: string, existingComments: TaskComment[], desiredComments: TaskComment[]) => Promise<void>;
|
|
33
|
+
customFieldValue: (issue: Record<string, unknown>, fieldId: unknown) => string | null;
|
|
34
|
+
maybeParseJson: (value: unknown) => unknown;
|
|
35
|
+
requestJson: (method: string, reqPath: string, payload?: Record<string, unknown>, params?: Record<string, unknown>, opts?: {
|
|
36
|
+
attempts?: number;
|
|
37
|
+
backoff?: number;
|
|
38
|
+
}) => Promise<Record<string, unknown>>;
|
|
39
|
+
diffTasks: (localTask: TaskData, remoteTask: TaskData) => string;
|
|
40
|
+
tasksDiffer: (localTask: TaskData, remoteTask: TaskData) => boolean;
|
|
41
|
+
writeTask: (task: TaskData, opts?: TaskWriteOptions) => Promise<void>;
|
|
42
|
+
writeTasks: (tasks: TaskData[], opts?: TaskWriteOptions) => Promise<void>;
|
|
43
|
+
};
|
|
44
|
+
export declare function createRedmineCacheDocContext(host: RedmineBackendRuntimeHost): {
|
|
45
|
+
cache: LocalBackend | null;
|
|
46
|
+
customFields: Record<string, unknown>;
|
|
47
|
+
ownerAgent: string;
|
|
48
|
+
batchSize: number;
|
|
49
|
+
findIssueByTaskId: (taskId: string) => Promise<Record<string, unknown> | null>;
|
|
50
|
+
issueToTask: (issue: Record<string, unknown>, taskIdOverride?: string) => TaskData | null;
|
|
51
|
+
customFieldValue: (issue: Record<string, unknown>, fieldId: unknown) => string | null;
|
|
52
|
+
appendCustomField: (fields: Record<string, unknown>[], key: string, value: unknown) => void;
|
|
53
|
+
requestJson: (method: string, reqPath: string, payload?: Record<string, unknown>, params?: Record<string, unknown>) => Promise<Record<string, unknown>>;
|
|
54
|
+
assertExpectedRevisionSupported: (taskId: string, opts?: TaskWriteOptions) => void;
|
|
55
|
+
assertExpectedRevision: (taskId: string, expectedRevision: number | undefined, currentRevision: number) => void;
|
|
56
|
+
cacheTask: (task: TaskData, dirty: boolean) => Promise<void>;
|
|
57
|
+
};
|
|
58
|
+
export declare function createRedmineReportContext(host: RedmineBackendRuntimeHost): {
|
|
59
|
+
projectId: string;
|
|
60
|
+
customFields: Record<string, unknown>;
|
|
61
|
+
requestJson: (method: string, reqPath: string, payload?: Record<string, unknown>, params?: Record<string, unknown>) => Promise<Record<string, unknown>>;
|
|
62
|
+
};
|
|
63
|
+
export declare function createRedmineSyncContext(host: RedmineBackendRuntimeHost): {
|
|
64
|
+
cache: LocalBackend | null;
|
|
65
|
+
customFields: Record<string, unknown>;
|
|
66
|
+
ownerAgent: string;
|
|
67
|
+
projectId: string;
|
|
68
|
+
batchSize: number;
|
|
69
|
+
batchPauseMs: number;
|
|
70
|
+
statusMap: Record<string, unknown>;
|
|
71
|
+
issueCache: Map<string, Record<string, unknown>>;
|
|
72
|
+
inferredStatusByTaskStatus: Map<string, number> | null;
|
|
73
|
+
setInferredStatusByTaskStatus: (next: Map<string, number> | null) => void;
|
|
74
|
+
listTasksRemote: () => Promise<TaskData[]>;
|
|
75
|
+
writeTask: (task: TaskData, opts?: TaskWriteOptions) => Promise<void>;
|
|
76
|
+
writeTasks: (tasks: TaskData[], opts?: TaskWriteOptions) => Promise<void>;
|
|
77
|
+
findIssueByTaskId: (taskId: string) => Promise<Record<string, unknown> | null>;
|
|
78
|
+
issueToTask: (issue: Record<string, unknown>, taskIdOverride?: string) => TaskData | null;
|
|
79
|
+
taskToIssuePayload: (task: TaskData, existingIssue?: Record<string, unknown>) => Record<string, unknown>;
|
|
80
|
+
appendCustomField: (fields: Record<string, unknown>[], key: string, value: unknown) => void;
|
|
81
|
+
customFieldValue: (issue: Record<string, unknown>, fieldId: unknown) => string | null;
|
|
82
|
+
maybeParseJson: (value: unknown) => unknown;
|
|
83
|
+
normalizeComments: (value: unknown) => TaskComment[];
|
|
84
|
+
appendCommentNotes: (issueId: string, existingComments: TaskComment[], desiredComments: TaskComment[]) => Promise<void>;
|
|
85
|
+
cacheTask: (task: TaskData, dirty: boolean) => Promise<void>;
|
|
86
|
+
assertExpectedRevisionSupported: (taskId: string, opts?: TaskWriteOptions) => void;
|
|
87
|
+
assertExpectedRevision: (taskId: string, expectedRevision: number | undefined, currentRevision: number) => void;
|
|
88
|
+
ensureDocMetadata: (task: TaskDocMeta) => void;
|
|
89
|
+
diffTasks: (localTask: TaskData, remoteTask: TaskData) => string;
|
|
90
|
+
tasksDiffer: (localTask: TaskData, remoteTask: TaskData) => boolean;
|
|
91
|
+
taskIdFieldId: () => unknown;
|
|
92
|
+
setIssueCustomFieldValue: (issue: Record<string, unknown>, fieldId: unknown, value: unknown) => void;
|
|
93
|
+
requestJson: (method: string, reqPath: string, payload?: Record<string, unknown>, params?: Record<string, unknown>, opts?: {
|
|
94
|
+
attempts?: number;
|
|
95
|
+
backoff?: number;
|
|
96
|
+
}) => Promise<Record<string, unknown>>;
|
|
97
|
+
};
|
|
98
|
+
//# sourceMappingURL=runtime-context.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"runtime-context.d.ts","sourceRoot":"","sources":["../../../../src/backends/task-backend/redmine/runtime-context.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACxD,OAAO,KAAK,EAAE,WAAW,EAAE,QAAQ,EAAE,WAAW,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;AACzF,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAEjD,MAAM,MAAM,yBAAyB,GAAG;IACtC,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACnC,YAAY,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACtC,SAAS,EAAE,MAAM,CAAC;IAClB,YAAY,EAAE,MAAM,CAAC;IACrB,KAAK,EAAE,YAAY,GAAG,IAAI,CAAC;IAC3B,UAAU,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;IACjD,aAAa,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACnC,0BAA0B,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,IAAI,CAAC;IACvD,YAAY,EAAE,WAAW,CAAC,cAAc,CAAC,CAAC;IAC1C,6BAA6B,EAAE,CAAC,IAAI,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,IAAI,KAAK,IAAI,CAAC;IAC1E,iBAAiB,EAAE,CAAC,IAAI,EAAE,WAAW,KAAK,IAAI,CAAC;IAC/C,SAAS,EAAE,CAAC,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,OAAO,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IAC7D,+BAA+B,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,gBAAgB,KAAK,IAAI,CAAC;IACnF,sBAAsB,EAAE,CACtB,MAAM,EAAE,MAAM,EACd,gBAAgB,EAAE,MAAM,GAAG,SAAS,EACpC,eAAe,EAAE,MAAM,KACpB,IAAI,CAAC;IACV,aAAa,EAAE,MAAM,OAAO,CAAC;IAC7B,wBAAwB,EAAE,CACxB,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC9B,OAAO,EAAE,OAAO,EAChB,KAAK,EAAE,OAAO,KACX,IAAI,CAAC;IACV,eAAe,EAAE,MAAM,OAAO,CAAC,QAAQ,EAAE,CAAC,CAAC;IAC3C,iBAAiB,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAAC,CAAC;IAC/E,WAAW,EAAE,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,cAAc,CAAC,EAAE,MAAM,KAAK,QAAQ,GAAG,IAAI,CAAC;IAC1F,kBAAkB,EAAE,CAClB,IAAI,EAAE,QAAQ,EACd,aAAa,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KACpC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC7B,iBAAiB,EAAE,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,EAAE,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,KAAK,IAAI,CAAC;IAC5F,iBAAiB,EAAE,CAAC,KAAK,EAAE,OAAO,KAAK,WAAW,EAAE,CAAC;IACrD,kBAAkB,EAAE,CAClB,OAAO,EAAE,MAAM,EACf,gBAAgB,EAAE,WAAW,EAAE,EAC/B,eAAe,EAAE,WAAW,EAAE,KAC3B,OAAO,CAAC,IAAI,CAAC,CAAC;IACnB,gBAAgB,EAAE,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,OAAO,EAAE,OAAO,KAAK,MAAM,GAAG,IAAI,CAAC;IACtF,cAAc,EAAE,CAAC,KAAK,EAAE,OAAO,KAAK,OAAO,CAAC;IAC5C,WAAW,EAAE,CACX,MAAM,EAAE,MAAM,EACd,OAAO,EAAE,MAAM,EACf,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EACjC,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAChC,IAAI,CAAC,EAAE;QAAE,QAAQ,CAAC,EAAE,MAAM,CAAC;QAAC,OAAO,CAAC,EAAE,MAAM,CAAA;KAAE,KAC3C,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;IACtC,SAAS,EAAE,CAAC,SAAS,EAAE,QAAQ,EAAE,UAAU,EAAE,QAAQ,KAAK,MAAM,CAAC;IACjE,WAAW,EAAE,CAAC,SAAS,EAAE,QAAQ,EAAE,UAAU,EAAE,QAAQ,KAAK,OAAO,CAAC;IACpE,SAAS,EAAE,CAAC,IAAI,EAAE,QAAQ,EAAE,IAAI,CAAC,EAAE,gBAAgB,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IACtE,UAAU,EAAE,CAAC,KAAK,EAAE,QAAQ,EAAE,EAAE,IAAI,CAAC,EAAE,gBAAgB,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;CAC3E,CAAC;AAEF,wBAAgB,4BAA4B,CAAC,IAAI,EAAE,yBAAyB;;;;;gCAMtC,MAAM;yBACnB,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,mBAAmB,MAAM;8BAE3C,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,WAAW,OAAO;gCAEvC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,OAAO,MAAM,SAAS,OAAO;0BAGxE,MAAM,WACL,MAAM,YACL,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,WACxB,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;8CAEQ,MAAM,SAAS,gBAAgB;qCAG/D,MAAM,oBACI,MAAM,GAAG,SAAS,mBACnB,MAAM;sBAED,QAAQ,SAAS,OAAO;EAEnD;AAED,wBAAgB,0BAA0B,CAAC,IAAI,EAAE,yBAAyB;;;0BAK5D,MAAM,WACL,MAAM,YACL,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,WACxB,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;EAGrC;AAED,wBAAgB,wBAAwB,CAAC,IAAI,EAAE,yBAAyB;;;;;;;;;;0CAvFhC,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,IAAI,KAAK,IAAI;;sBAoG/C,QAAQ,SAAS,gBAAgB;wBAC/B,QAAQ,EAAE,SAAS,gBAAgB;gCAE3B,MAAM;yBACnB,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,mBAAmB,MAAM;+BAE1C,QAAQ,kBAAkB,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;gCAEhD,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,OAAO,MAAM,SAAS,OAAO;8BAExD,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,WAAW,OAAO;4BAE3C,OAAO;+BACJ,OAAO;kCAEvB,MAAM,oBACG,WAAW,EAAE,mBACd,WAAW,EAAE;sBAER,QAAQ,SAAS,OAAO;8CACN,MAAM,SAAS,gBAAgB;qCAG/D,MAAM,oBACI,MAAM,GAAG,SAAS,mBACnB,MAAM;8BAEC,WAAW;2BACd,QAAQ,cAAc,QAAQ;6BAC5B,QAAQ,cAAc,QAAQ;;sCAGrB,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,WAAW,OAAO,SAAS,OAAO;0BAGjF,MAAM,WACL,MAAM,YACL,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,WACxB,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,SACzB;QAAE,QAAQ,CAAC,EAAE,MAAM,CAAC;QAAC,OAAO,CAAC,EAAE,MAAM,CAAA;KAAE;EAGnD"}
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
export function createRedmineCacheDocContext(host) {
|
|
2
|
+
return {
|
|
3
|
+
cache: host.cache,
|
|
4
|
+
customFields: host.customFields,
|
|
5
|
+
ownerAgent: host.ownerAgent,
|
|
6
|
+
batchSize: host.batchSize,
|
|
7
|
+
findIssueByTaskId: async (taskId) => await host.findIssueByTaskId(taskId),
|
|
8
|
+
issueToTask: (issue, taskIdOverride) => host.issueToTask(issue, taskIdOverride),
|
|
9
|
+
customFieldValue: (issue, fieldId) => host.customFieldValue(issue, fieldId),
|
|
10
|
+
appendCustomField: (fields, key, value) => host.appendCustomField(fields, key, value),
|
|
11
|
+
requestJson: async (method, reqPath, payload, params) => await host.requestJson(method, reqPath, payload, params),
|
|
12
|
+
assertExpectedRevisionSupported: (taskId, opts) => host.assertExpectedRevisionSupported(taskId, opts),
|
|
13
|
+
assertExpectedRevision: (taskId, expectedRevision, currentRevision) => host.assertExpectedRevision(taskId, expectedRevision, currentRevision),
|
|
14
|
+
cacheTask: async (task, dirty) => await host.cacheTask(task, dirty),
|
|
15
|
+
};
|
|
16
|
+
}
|
|
17
|
+
export function createRedmineReportContext(host) {
|
|
18
|
+
return {
|
|
19
|
+
projectId: host.projectId,
|
|
20
|
+
customFields: host.customFields,
|
|
21
|
+
requestJson: async (method, reqPath, payload, params) => await host.requestJson(method, reqPath, payload, params),
|
|
22
|
+
};
|
|
23
|
+
}
|
|
24
|
+
export function createRedmineSyncContext(host) {
|
|
25
|
+
return {
|
|
26
|
+
cache: host.cache,
|
|
27
|
+
customFields: host.customFields,
|
|
28
|
+
ownerAgent: host.ownerAgent,
|
|
29
|
+
projectId: host.projectId,
|
|
30
|
+
batchSize: host.batchSize,
|
|
31
|
+
batchPauseMs: host.batchPauseMs,
|
|
32
|
+
statusMap: host.statusMap,
|
|
33
|
+
issueCache: host.issueCache,
|
|
34
|
+
inferredStatusByTaskStatus: host.inferredStatusByTaskStatus,
|
|
35
|
+
setInferredStatusByTaskStatus: host.setInferredStatusByTaskStatus,
|
|
36
|
+
listTasksRemote: async () => await host.listTasksRemote(),
|
|
37
|
+
writeTask: async (task, opts) => await host.writeTask(task, opts),
|
|
38
|
+
writeTasks: async (tasks, opts) => await host.writeTasks(tasks, opts),
|
|
39
|
+
findIssueByTaskId: async (taskId) => await host.findIssueByTaskId(taskId),
|
|
40
|
+
issueToTask: (issue, taskIdOverride) => host.issueToTask(issue, taskIdOverride),
|
|
41
|
+
taskToIssuePayload: (task, existingIssue) => host.taskToIssuePayload(task, existingIssue),
|
|
42
|
+
appendCustomField: (fields, key, value) => host.appendCustomField(fields, key, value),
|
|
43
|
+
customFieldValue: (issue, fieldId) => host.customFieldValue(issue, fieldId),
|
|
44
|
+
maybeParseJson: (value) => host.maybeParseJson(value),
|
|
45
|
+
normalizeComments: (value) => host.normalizeComments(value),
|
|
46
|
+
appendCommentNotes: async (issueId, existingComments, desiredComments) => await host.appendCommentNotes(issueId, existingComments, desiredComments),
|
|
47
|
+
cacheTask: async (task, dirty) => await host.cacheTask(task, dirty),
|
|
48
|
+
assertExpectedRevisionSupported: (taskId, opts) => host.assertExpectedRevisionSupported(taskId, opts),
|
|
49
|
+
assertExpectedRevision: (taskId, expectedRevision, currentRevision) => host.assertExpectedRevision(taskId, expectedRevision, currentRevision),
|
|
50
|
+
ensureDocMetadata: (task) => host.ensureDocMetadata(task),
|
|
51
|
+
diffTasks: (localTask, remoteTask) => host.diffTasks(localTask, remoteTask),
|
|
52
|
+
tasksDiffer: (localTask, remoteTask) => host.tasksDiffer(localTask, remoteTask),
|
|
53
|
+
taskIdFieldId: () => host.taskIdFieldId(),
|
|
54
|
+
setIssueCustomFieldValue: (issue, fieldId, value) => host.setIssueCustomFieldValue(issue, fieldId, value),
|
|
55
|
+
requestJson: async (method, reqPath, payload, params, opts) => await host.requestJson(method, reqPath, payload, params, opts),
|
|
56
|
+
};
|
|
57
|
+
}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import { type TaskData, type TaskDocMeta, type TaskWriteOptions } from "../shared.js";
|
|
2
|
+
import type { TaskComment } from "./comments.js";
|
|
3
|
+
import type { RedmineBackendRuntimeHost } from "./runtime-context.js";
|
|
4
|
+
export declare const redmineBackendRuntimeMethods: {
|
|
5
|
+
setInferredStatusByTaskStatus(this: RedmineBackendRuntimeHost, next: Map<string, number> | null): void;
|
|
6
|
+
ensureDocMetadata(this: RedmineBackendRuntimeHost, task: TaskDocMeta): void;
|
|
7
|
+
cacheTask(this: RedmineBackendRuntimeHost, task: TaskData, dirty: boolean): Promise<void>;
|
|
8
|
+
assertExpectedRevisionSupported(this: RedmineBackendRuntimeHost, taskId: string, opts?: TaskWriteOptions): void;
|
|
9
|
+
assertExpectedRevision(this: RedmineBackendRuntimeHost, taskId: string, expectedRevision: number | undefined, currentRevision: number): void;
|
|
10
|
+
taskIdFieldId(this: RedmineBackendRuntimeHost): unknown;
|
|
11
|
+
setIssueCustomFieldValue(this: RedmineBackendRuntimeHost, issue: Record<string, unknown>, fieldId: unknown, value: unknown): void;
|
|
12
|
+
listTasksRemote(this: RedmineBackendRuntimeHost): Promise<TaskData[]>;
|
|
13
|
+
findIssueByTaskId(this: RedmineBackendRuntimeHost, taskId: string): Promise<Record<string, unknown> | null>;
|
|
14
|
+
issueToTask(this: RedmineBackendRuntimeHost, issue: Record<string, unknown>, taskIdOverride?: string): TaskData | null;
|
|
15
|
+
taskToIssuePayload(this: RedmineBackendRuntimeHost, task: TaskData, existingIssue?: Record<string, unknown>): Record<string, unknown>;
|
|
16
|
+
appendCustomField(this: RedmineBackendRuntimeHost, fields: Record<string, unknown>[], key: string, value: unknown): void;
|
|
17
|
+
normalizeComments(this: RedmineBackendRuntimeHost, value: unknown): TaskComment[];
|
|
18
|
+
commentsToPairs(this: RedmineBackendRuntimeHost, comments: TaskComment[]): [string, string][];
|
|
19
|
+
formatCommentNote(this: RedmineBackendRuntimeHost, author?: string, body?: string): string;
|
|
20
|
+
appendCommentNotes(this: RedmineBackendRuntimeHost, issueId: string, existingComments: TaskComment[], desiredComments: TaskComment[]): Promise<void>;
|
|
21
|
+
startDateFromTaskId(this: RedmineBackendRuntimeHost, taskId: string): string | null;
|
|
22
|
+
doneRatioForStatus(this: RedmineBackendRuntimeHost, status: string): number | null;
|
|
23
|
+
customFieldValue(this: RedmineBackendRuntimeHost, issue: Record<string, unknown>, fieldId: unknown): string | null;
|
|
24
|
+
maybeParseJson(this: RedmineBackendRuntimeHost, value: unknown): unknown;
|
|
25
|
+
coerceDocVersion(this: RedmineBackendRuntimeHost, value: unknown): 2 | 3 | null;
|
|
26
|
+
diffTasks(this: RedmineBackendRuntimeHost, localTask: TaskData, remoteTask: TaskData): string;
|
|
27
|
+
tasksDiffer(this: RedmineBackendRuntimeHost, localTask: TaskData, remoteTask: TaskData): boolean;
|
|
28
|
+
requestJson(this: RedmineBackendRuntimeHost, method: string, reqPath: string, payload?: Record<string, unknown>, params?: Record<string, unknown>, opts?: {
|
|
29
|
+
attempts?: number;
|
|
30
|
+
backoff?: number;
|
|
31
|
+
}): Promise<Record<string, unknown>>;
|
|
32
|
+
};
|
|
33
|
+
//# sourceMappingURL=runtime-methods.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"runtime-methods.d.ts","sourceRoot":"","sources":["../../../../src/backends/task-backend/redmine/runtime-methods.ts"],"names":[],"mappings":"AAAA,OAAO,EAAgB,KAAK,QAAQ,EAAE,KAAK,WAAW,EAAE,KAAK,gBAAgB,EAAE,MAAM,cAAc,CAAC;AAEpG,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAwBjD,OAAO,KAAK,EAAE,yBAAyB,EAAE,MAAM,sBAAsB,CAAC;AAEtE,eAAO,MAAM,4BAA4B;wCAE/B,yBAAyB,QACzB,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,IAAI,GAC/B,IAAI;4BAIiB,yBAAyB,QAAQ,WAAW,GAAG,IAAI;oBAIrD,yBAAyB,QAAQ,QAAQ,SAAS,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC;0CAKvF,yBAAyB,UACvB,MAAM,SACP,gBAAgB,GACtB,IAAI;iCAKC,yBAAyB,UACvB,MAAM,oBACI,MAAM,GAAG,SAAS,mBACnB,MAAM,GACtB,IAAI;wBAIa,yBAAyB,GAAG,OAAO;mCAK/C,yBAAyB,SACxB,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,WACrB,OAAO,SACT,OAAO,GACb,IAAI;0BAIqB,yBAAyB,GAAG,OAAO,CAAC,QAAQ,EAAE,CAAC;4BAKnE,yBAAyB,UACvB,MAAM,GACb,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAAC;sBAKlC,yBAAyB,SACxB,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,mBACb,MAAM,GACtB,QAAQ,GAAG,IAAI;6BAKV,yBAAyB,QACzB,QAAQ,kBACE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GACtC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;4BAKlB,yBAAyB,UACvB,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,OAC5B,MAAM,SACJ,OAAO,GACb,IAAI;4BAIiB,yBAAyB,SAAS,OAAO,GAAG,WAAW,EAAE;0BAI3D,yBAAyB,YAAY,WAAW,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,EAAE;4BAWrE,yBAAyB,mCAAkC,MAAM;6BAKjF,yBAAyB,WACtB,MAAM,oBACG,WAAW,EAAE,mBACd,WAAW,EAAE,GAC7B,OAAO,CAAC,IAAI,CAAC;8BAIU,yBAAyB,UAAU,MAAM,GAAG,MAAM,GAAG,IAAI;6BAI1D,yBAAyB,UAAU,MAAM,GAAG,MAAM,GAAG,IAAI;2BAK1E,yBAAyB,SACxB,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,WACrB,OAAO,GACf,MAAM,GAAG,IAAI;yBAIK,yBAAyB,SAAS,OAAO,GAAG,OAAO;2BAIjD,yBAAyB,SAAS,OAAO,GAAG,CAAC,GAAG,CAAC,GAAG,IAAI;oBAI/D,yBAAyB,aAAa,QAAQ,cAAc,QAAQ,GAAG,MAAM;sBAI3E,yBAAyB,aAAa,QAAQ,cAAc,QAAQ,GAAG,OAAO;sBAKxF,yBAAyB,UACvB,MAAM,WACL,MAAM,YACL,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,WACxB,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,SACzB;QAAE,QAAQ,CAAC,EAAE,MAAM,CAAC;QAAC,OAAO,CAAC,EAAE,MAAM,CAAA;KAAE,GAC7C,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CAGpC,CAAC"}
|
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
import { toStringSafe } from "../shared.js";
|
|
2
|
+
import { doneRatioForStatus, startDateFromTaskId } from "./mapping.js";
|
|
3
|
+
import { appendRedmineBackendCommentNotes, appendRedmineBackendCustomField, diffRedmineBackendTasks, findRedmineIssueByTaskId, listRedmineRemoteTasks, maybeParseRedmineBackendJson, normalizeRedmineBackendComments, redmineBackendCustomFieldValue, redmineBackendTasksDiffer, redmineIssueToTask, redmineTaskToIssuePayload, requestRedmineBackendJson, } from "./runtime-operations.js";
|
|
4
|
+
import { assertRedmineExpectedRevision, assertRedmineExpectedRevisionSupported, cacheRedmineTask, coerceRedmineBackendDocVersion, ensureRedmineDocMetadata, redmineTaskIdFieldId, setRedmineIssueCustomField, } from "./runtime-state.js";
|
|
5
|
+
export const redmineBackendRuntimeMethods = {
|
|
6
|
+
setInferredStatusByTaskStatus(next) {
|
|
7
|
+
this.inferredStatusByTaskStatus = next;
|
|
8
|
+
},
|
|
9
|
+
ensureDocMetadata(task) {
|
|
10
|
+
ensureRedmineDocMetadata(task);
|
|
11
|
+
},
|
|
12
|
+
async cacheTask(task, dirty) {
|
|
13
|
+
await cacheRedmineTask(this, task, dirty);
|
|
14
|
+
},
|
|
15
|
+
assertExpectedRevisionSupported(taskId, opts) {
|
|
16
|
+
assertRedmineExpectedRevisionSupported(this, taskId, opts);
|
|
17
|
+
},
|
|
18
|
+
assertExpectedRevision(taskId, expectedRevision, currentRevision) {
|
|
19
|
+
assertRedmineExpectedRevision(taskId, expectedRevision, currentRevision);
|
|
20
|
+
},
|
|
21
|
+
taskIdFieldId() {
|
|
22
|
+
return redmineTaskIdFieldId(this);
|
|
23
|
+
},
|
|
24
|
+
setIssueCustomFieldValue(issue, fieldId, value) {
|
|
25
|
+
setRedmineIssueCustomField(issue, fieldId, value);
|
|
26
|
+
},
|
|
27
|
+
async listTasksRemote() {
|
|
28
|
+
return await listRedmineRemoteTasks(this);
|
|
29
|
+
},
|
|
30
|
+
async findIssueByTaskId(taskId) {
|
|
31
|
+
return await findRedmineIssueByTaskId(this, taskId);
|
|
32
|
+
},
|
|
33
|
+
issueToTask(issue, taskIdOverride) {
|
|
34
|
+
return redmineIssueToTask(this, issue, taskIdOverride);
|
|
35
|
+
},
|
|
36
|
+
taskToIssuePayload(task, existingIssue) {
|
|
37
|
+
return redmineTaskToIssuePayload(this, task, existingIssue);
|
|
38
|
+
},
|
|
39
|
+
appendCustomField(fields, key, value) {
|
|
40
|
+
appendRedmineBackendCustomField(this, fields, key, value);
|
|
41
|
+
},
|
|
42
|
+
normalizeComments(value) {
|
|
43
|
+
return normalizeRedmineBackendComments(value);
|
|
44
|
+
},
|
|
45
|
+
commentsToPairs(comments) {
|
|
46
|
+
const pairs = [];
|
|
47
|
+
for (const comment of comments) {
|
|
48
|
+
const author = toStringSafe(comment.author).trim();
|
|
49
|
+
const body = toStringSafe(comment.body).trim();
|
|
50
|
+
if (!author && !body)
|
|
51
|
+
continue;
|
|
52
|
+
pairs.push([author, body]);
|
|
53
|
+
}
|
|
54
|
+
return pairs;
|
|
55
|
+
},
|
|
56
|
+
formatCommentNote(author = "unknown", body = "") {
|
|
57
|
+
return `[comment] ${author}: ${body}`.trim();
|
|
58
|
+
},
|
|
59
|
+
async appendCommentNotes(issueId, existingComments, desiredComments) {
|
|
60
|
+
await appendRedmineBackendCommentNotes(this, issueId, existingComments, desiredComments);
|
|
61
|
+
},
|
|
62
|
+
startDateFromTaskId(taskId) {
|
|
63
|
+
return startDateFromTaskId(taskId);
|
|
64
|
+
},
|
|
65
|
+
doneRatioForStatus(status) {
|
|
66
|
+
return doneRatioForStatus(status);
|
|
67
|
+
},
|
|
68
|
+
customFieldValue(issue, fieldId) {
|
|
69
|
+
return redmineBackendCustomFieldValue(issue, fieldId);
|
|
70
|
+
},
|
|
71
|
+
maybeParseJson(value) {
|
|
72
|
+
return maybeParseRedmineBackendJson(value);
|
|
73
|
+
},
|
|
74
|
+
coerceDocVersion(value) {
|
|
75
|
+
return coerceRedmineBackendDocVersion(value);
|
|
76
|
+
},
|
|
77
|
+
diffTasks(localTask, remoteTask) {
|
|
78
|
+
return diffRedmineBackendTasks(localTask, remoteTask);
|
|
79
|
+
},
|
|
80
|
+
tasksDiffer(localTask, remoteTask) {
|
|
81
|
+
return redmineBackendTasksDiffer(localTask, remoteTask);
|
|
82
|
+
},
|
|
83
|
+
async requestJson(method, reqPath, payload, params, opts) {
|
|
84
|
+
return await requestRedmineBackendJson(this, method, reqPath, payload, params, opts);
|
|
85
|
+
},
|
|
86
|
+
};
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { type TaskData } from "../shared.js";
|
|
2
|
+
import { type TaskComment } from "./comments.js";
|
|
3
|
+
import type { RedmineBackendRuntimeHost } from "./runtime-context.js";
|
|
4
|
+
export declare function listRedmineRemoteTasks(host: RedmineBackendRuntimeHost): Promise<TaskData[]>;
|
|
5
|
+
export declare function findRedmineIssueByTaskId(host: RedmineBackendRuntimeHost, taskId: string): Promise<Record<string, unknown> | null>;
|
|
6
|
+
export declare function redmineIssueToTask(host: RedmineBackendRuntimeHost, issue: Record<string, unknown>, taskIdOverride?: string): TaskData | null;
|
|
7
|
+
export declare function redmineTaskToIssuePayload(host: RedmineBackendRuntimeHost, task: TaskData, existingIssue?: Record<string, unknown>): Record<string, unknown>;
|
|
8
|
+
export declare function appendRedmineBackendCustomField(host: RedmineBackendRuntimeHost, fields: Record<string, unknown>[], key: string, value: unknown): void;
|
|
9
|
+
export declare function normalizeRedmineBackendComments(value: unknown): TaskComment[];
|
|
10
|
+
export declare function appendRedmineBackendCommentNotes(host: RedmineBackendRuntimeHost, issueId: string, existingComments: TaskComment[], desiredComments: TaskComment[]): Promise<void>;
|
|
11
|
+
export declare function redmineBackendCustomFieldValue(issue: Record<string, unknown>, fieldId: unknown): string | null;
|
|
12
|
+
export declare function maybeParseRedmineBackendJson(value: unknown): unknown;
|
|
13
|
+
export declare function diffRedmineBackendTasks(localTask: TaskData, remoteTask: TaskData): string;
|
|
14
|
+
export declare function redmineBackendTasksDiffer(localTask: TaskData, remoteTask: TaskData): boolean;
|
|
15
|
+
export declare function requestRedmineBackendJson(host: RedmineBackendRuntimeHost, method: string, reqPath: string, payload?: Record<string, unknown>, params?: Record<string, unknown>, opts?: {
|
|
16
|
+
attempts?: number;
|
|
17
|
+
backoff?: number;
|
|
18
|
+
}): Promise<Record<string, unknown>>;
|
|
19
|
+
//# sourceMappingURL=runtime-operations.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"runtime-operations.d.ts","sourceRoot":"","sources":["../../../../src/backends/task-backend/redmine/runtime-operations.ts"],"names":[],"mappings":"AAAA,OAAO,EAAe,KAAK,QAAQ,EAAE,MAAM,cAAc,CAAC;AAC1D,OAAO,EAGL,KAAK,WAAW,EACjB,MAAM,eAAe,CAAC;AAgBvB,OAAO,KAAK,EAAE,yBAAyB,EAAE,MAAM,sBAAsB,CAAC;AAGtE,wBAAsB,sBAAsB,CAAC,IAAI,EAAE,yBAAyB,GAAG,OAAO,CAAC,QAAQ,EAAE,CAAC,CAWjG;AAED,wBAAsB,wBAAwB,CAC5C,IAAI,EAAE,yBAAyB,EAC/B,MAAM,EAAE,MAAM,GACb,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAAC,CAczC;AAED,wBAAgB,kBAAkB,CAChC,IAAI,EAAE,yBAAyB,EAC/B,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC9B,cAAc,CAAC,EAAE,MAAM,GACtB,QAAQ,GAAG,IAAI,CASjB;AAED,wBAAgB,yBAAyB,CACvC,IAAI,EAAE,yBAAyB,EAC/B,IAAI,EAAE,QAAQ,EACd,aAAa,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GACtC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAUzB;AAED,wBAAgB,+BAA+B,CAC7C,IAAI,EAAE,yBAAyB,EAC/B,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,EACjC,GAAG,EAAE,MAAM,EACX,KAAK,EAAE,OAAO,GACb,IAAI,CAEN;AAED,wBAAgB,+BAA+B,CAAC,KAAK,EAAE,OAAO,GAAG,WAAW,EAAE,CAE7E;AAED,wBAAsB,gCAAgC,CACpD,IAAI,EAAE,yBAAyB,EAC/B,OAAO,EAAE,MAAM,EACf,gBAAgB,EAAE,WAAW,EAAE,EAC/B,eAAe,EAAE,WAAW,EAAE,GAC7B,OAAO,CAAC,IAAI,CAAC,CAQf;AAED,wBAAgB,8BAA8B,CAC5C,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC9B,OAAO,EAAE,OAAO,GACf,MAAM,GAAG,IAAI,CAEf;AAED,wBAAgB,4BAA4B,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO,CAEpE;AAED,wBAAgB,uBAAuB,CAAC,SAAS,EAAE,QAAQ,EAAE,UAAU,EAAE,QAAQ,GAAG,MAAM,CAEzF;AAED,wBAAgB,yBAAyB,CAAC,SAAS,EAAE,QAAQ,EAAE,UAAU,EAAE,QAAQ,GAAG,OAAO,CAE5F;AAED,wBAAsB,yBAAyB,CAC7C,IAAI,EAAE,yBAAyB,EAC/B,MAAM,EAAE,MAAM,EACd,OAAO,EAAE,MAAM,EACf,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EACjC,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAChC,IAAI,CAAC,EAAE;IAAE,QAAQ,CAAC,EAAE,MAAM,CAAC;IAAC,OAAO,CAAC,EAAE,MAAM,CAAA;CAAE,GAC7C,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CASlC"}
|