@mcoda/core 0.1.4
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/CHANGELOG.md +7 -0
- package/LICENSE +21 -0
- package/README.md +9 -0
- package/dist/api/AgentsApi.d.ts +36 -0
- package/dist/api/AgentsApi.d.ts.map +1 -0
- package/dist/api/AgentsApi.js +176 -0
- package/dist/api/QaTasksApi.d.ts +8 -0
- package/dist/api/QaTasksApi.d.ts.map +1 -0
- package/dist/api/QaTasksApi.js +36 -0
- package/dist/api/TasksApi.d.ts +7 -0
- package/dist/api/TasksApi.d.ts.map +1 -0
- package/dist/api/TasksApi.js +34 -0
- package/dist/config/ConfigService.d.ts +3 -0
- package/dist/config/ConfigService.d.ts.map +1 -0
- package/dist/config/ConfigService.js +2 -0
- package/dist/domain/dependencies/Dependency.d.ts +3 -0
- package/dist/domain/dependencies/Dependency.d.ts.map +1 -0
- package/dist/domain/dependencies/Dependency.js +2 -0
- package/dist/domain/epics/Epic.d.ts +3 -0
- package/dist/domain/epics/Epic.d.ts.map +1 -0
- package/dist/domain/epics/Epic.js +2 -0
- package/dist/domain/projects/Project.d.ts +3 -0
- package/dist/domain/projects/Project.d.ts.map +1 -0
- package/dist/domain/projects/Project.js +2 -0
- package/dist/domain/tasks/Task.d.ts +3 -0
- package/dist/domain/tasks/Task.d.ts.map +1 -0
- package/dist/domain/tasks/Task.js +2 -0
- package/dist/domain/userStories/UserStory.d.ts +3 -0
- package/dist/domain/userStories/UserStory.d.ts.map +1 -0
- package/dist/domain/userStories/UserStory.js +2 -0
- package/dist/index.d.ts +28 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +27 -0
- package/dist/prompts/PdrPrompts.d.ts +4 -0
- package/dist/prompts/PdrPrompts.d.ts.map +1 -0
- package/dist/prompts/PdrPrompts.js +21 -0
- package/dist/prompts/PromptLoader.d.ts +3 -0
- package/dist/prompts/PromptLoader.d.ts.map +1 -0
- package/dist/prompts/PromptLoader.js +2 -0
- package/dist/prompts/SdsPrompts.d.ts +5 -0
- package/dist/prompts/SdsPrompts.d.ts.map +1 -0
- package/dist/prompts/SdsPrompts.js +44 -0
- package/dist/services/agents/AgentManagementService.d.ts +3 -0
- package/dist/services/agents/AgentManagementService.d.ts.map +1 -0
- package/dist/services/agents/AgentManagementService.js +2 -0
- package/dist/services/agents/GatewayAgentService.d.ts +92 -0
- package/dist/services/agents/GatewayAgentService.d.ts.map +1 -0
- package/dist/services/agents/GatewayAgentService.js +870 -0
- package/dist/services/agents/RoutingApiClient.d.ts +23 -0
- package/dist/services/agents/RoutingApiClient.d.ts.map +1 -0
- package/dist/services/agents/RoutingApiClient.js +62 -0
- package/dist/services/agents/RoutingService.d.ts +50 -0
- package/dist/services/agents/RoutingService.d.ts.map +1 -0
- package/dist/services/agents/RoutingService.js +386 -0
- package/dist/services/agents/generated/RoutingApiClient.d.ts +21 -0
- package/dist/services/agents/generated/RoutingApiClient.d.ts.map +1 -0
- package/dist/services/agents/generated/RoutingApiClient.js +68 -0
- package/dist/services/backlog/BacklogService.d.ts +98 -0
- package/dist/services/backlog/BacklogService.d.ts.map +1 -0
- package/dist/services/backlog/BacklogService.js +453 -0
- package/dist/services/backlog/TaskOrderingService.d.ts +88 -0
- package/dist/services/backlog/TaskOrderingService.d.ts.map +1 -0
- package/dist/services/backlog/TaskOrderingService.js +675 -0
- package/dist/services/docs/DocsService.d.ts +82 -0
- package/dist/services/docs/DocsService.d.ts.map +1 -0
- package/dist/services/docs/DocsService.js +1631 -0
- package/dist/services/estimate/EstimateService.d.ts +12 -0
- package/dist/services/estimate/EstimateService.d.ts.map +1 -0
- package/dist/services/estimate/EstimateService.js +103 -0
- package/dist/services/estimate/VelocityService.d.ts +19 -0
- package/dist/services/estimate/VelocityService.d.ts.map +1 -0
- package/dist/services/estimate/VelocityService.js +237 -0
- package/dist/services/estimate/types.d.ts +30 -0
- package/dist/services/estimate/types.d.ts.map +1 -0
- package/dist/services/estimate/types.js +1 -0
- package/dist/services/execution/ExecutionService.d.ts +3 -0
- package/dist/services/execution/ExecutionService.d.ts.map +1 -0
- package/dist/services/execution/ExecutionService.js +2 -0
- package/dist/services/execution/QaFollowupService.d.ts +38 -0
- package/dist/services/execution/QaFollowupService.d.ts.map +1 -0
- package/dist/services/execution/QaFollowupService.js +236 -0
- package/dist/services/execution/QaProfileService.d.ts +22 -0
- package/dist/services/execution/QaProfileService.d.ts.map +1 -0
- package/dist/services/execution/QaProfileService.js +142 -0
- package/dist/services/execution/QaTasksService.d.ts +101 -0
- package/dist/services/execution/QaTasksService.d.ts.map +1 -0
- package/dist/services/execution/QaTasksService.js +1117 -0
- package/dist/services/execution/TaskSelectionService.d.ts +50 -0
- package/dist/services/execution/TaskSelectionService.d.ts.map +1 -0
- package/dist/services/execution/TaskSelectionService.js +281 -0
- package/dist/services/execution/TaskStateService.d.ts +19 -0
- package/dist/services/execution/TaskStateService.d.ts.map +1 -0
- package/dist/services/execution/TaskStateService.js +59 -0
- package/dist/services/execution/WorkOnTasksService.d.ts +80 -0
- package/dist/services/execution/WorkOnTasksService.d.ts.map +1 -0
- package/dist/services/execution/WorkOnTasksService.js +1833 -0
- package/dist/services/jobs/JobInsightsService.d.ts +97 -0
- package/dist/services/jobs/JobInsightsService.d.ts.map +1 -0
- package/dist/services/jobs/JobInsightsService.js +263 -0
- package/dist/services/jobs/JobResumeService.d.ts +16 -0
- package/dist/services/jobs/JobResumeService.d.ts.map +1 -0
- package/dist/services/jobs/JobResumeService.js +113 -0
- package/dist/services/jobs/JobService.d.ts +149 -0
- package/dist/services/jobs/JobService.d.ts.map +1 -0
- package/dist/services/jobs/JobService.js +490 -0
- package/dist/services/jobs/JobsApiClient.d.ts +73 -0
- package/dist/services/jobs/JobsApiClient.d.ts.map +1 -0
- package/dist/services/jobs/JobsApiClient.js +67 -0
- package/dist/services/openapi/OpenApiService.d.ts +54 -0
- package/dist/services/openapi/OpenApiService.d.ts.map +1 -0
- package/dist/services/openapi/OpenApiService.js +503 -0
- package/dist/services/planning/CreateTasksService.d.ts +68 -0
- package/dist/services/planning/CreateTasksService.d.ts.map +1 -0
- package/dist/services/planning/CreateTasksService.js +989 -0
- package/dist/services/planning/KeyHelpers.d.ts +5 -0
- package/dist/services/planning/KeyHelpers.d.ts.map +1 -0
- package/dist/services/planning/KeyHelpers.js +62 -0
- package/dist/services/planning/PlanningService.d.ts +3 -0
- package/dist/services/planning/PlanningService.d.ts.map +1 -0
- package/dist/services/planning/PlanningService.js +2 -0
- package/dist/services/planning/RefineTasksService.d.ts +56 -0
- package/dist/services/planning/RefineTasksService.d.ts.map +1 -0
- package/dist/services/planning/RefineTasksService.js +1328 -0
- package/dist/services/review/CodeReviewService.d.ts +103 -0
- package/dist/services/review/CodeReviewService.d.ts.map +1 -0
- package/dist/services/review/CodeReviewService.js +1187 -0
- package/dist/services/system/SystemUpdateService.d.ts +55 -0
- package/dist/services/system/SystemUpdateService.d.ts.map +1 -0
- package/dist/services/system/SystemUpdateService.js +136 -0
- package/dist/services/tasks/TaskApiResolver.d.ts +7 -0
- package/dist/services/tasks/TaskApiResolver.d.ts.map +1 -0
- package/dist/services/tasks/TaskApiResolver.js +41 -0
- package/dist/services/tasks/TaskDetailService.d.ts +106 -0
- package/dist/services/tasks/TaskDetailService.d.ts.map +1 -0
- package/dist/services/tasks/TaskDetailService.js +332 -0
- package/dist/services/telemetry/TelemetryService.d.ts +53 -0
- package/dist/services/telemetry/TelemetryService.d.ts.map +1 -0
- package/dist/services/telemetry/TelemetryService.js +434 -0
- package/dist/workspace/WorkspaceManager.d.ts +35 -0
- package/dist/workspace/WorkspaceManager.d.ts.map +1 -0
- package/dist/workspace/WorkspaceManager.js +201 -0
- package/package.json +45 -0
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
import { ApplyUpdateResponse, UpdateChannel, UpdateInfo } from "@mcoda/shared";
|
|
2
|
+
import { GlobalCommandStatus, GlobalRepository } from "@mcoda/db";
|
|
3
|
+
import { SystemClient } from "@mcoda/integrations";
|
|
4
|
+
interface ReleasesState {
|
|
5
|
+
lastCheck?: (UpdateInfo & {
|
|
6
|
+
checkedAt: string;
|
|
7
|
+
});
|
|
8
|
+
preferences?: {
|
|
9
|
+
channel?: UpdateChannel;
|
|
10
|
+
};
|
|
11
|
+
}
|
|
12
|
+
export interface UpdateCheckResult {
|
|
13
|
+
info: UpdateInfo;
|
|
14
|
+
checkedAt: string;
|
|
15
|
+
channel: UpdateChannel;
|
|
16
|
+
}
|
|
17
|
+
export type ApplyStatus = ApplyUpdateResponse["status"];
|
|
18
|
+
export interface ApplyResult extends ApplyUpdateResponse {
|
|
19
|
+
targetVersion: string;
|
|
20
|
+
npmCommand: string;
|
|
21
|
+
}
|
|
22
|
+
export declare class SystemUpdateService {
|
|
23
|
+
private client;
|
|
24
|
+
private repo?;
|
|
25
|
+
private mcodaDir;
|
|
26
|
+
private constructor();
|
|
27
|
+
static create(baseUrl?: string, options?: {
|
|
28
|
+
client?: SystemClient;
|
|
29
|
+
repo?: GlobalRepository;
|
|
30
|
+
mcodaDir?: string;
|
|
31
|
+
}): Promise<SystemUpdateService>;
|
|
32
|
+
close(): Promise<void>;
|
|
33
|
+
private releasesPath;
|
|
34
|
+
readState(): Promise<ReleasesState>;
|
|
35
|
+
private writeState;
|
|
36
|
+
startRun(payload: Record<string, unknown>): Promise<string | undefined>;
|
|
37
|
+
finishRun(id: string | undefined, update: {
|
|
38
|
+
status: GlobalCommandStatus;
|
|
39
|
+
exitCode?: number;
|
|
40
|
+
errorSummary?: string | null;
|
|
41
|
+
result?: Record<string, unknown>;
|
|
42
|
+
}): Promise<void>;
|
|
43
|
+
resolveChannel(preferred?: UpdateChannel): Promise<UpdateChannel>;
|
|
44
|
+
savePreferredChannel(channel: UpdateChannel): Promise<void>;
|
|
45
|
+
checkUpdate(channel?: UpdateChannel): Promise<UpdateCheckResult>;
|
|
46
|
+
applyUpdate(channel?: UpdateChannel): Promise<ApplyUpdateResponse>;
|
|
47
|
+
recordApplyState(info: UpdateInfo, channel: UpdateChannel, targetVersion: string): Promise<void>;
|
|
48
|
+
runNpmInstall(targetVersion: string, options?: {
|
|
49
|
+
quiet?: boolean;
|
|
50
|
+
}): Promise<{
|
|
51
|
+
code: number;
|
|
52
|
+
}>;
|
|
53
|
+
}
|
|
54
|
+
export {};
|
|
55
|
+
//# sourceMappingURL=SystemUpdateService.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SystemUpdateService.d.ts","sourceRoot":"","sources":["../../../src/services/system/SystemUpdateService.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,mBAAmB,EAAc,aAAa,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAC3F,OAAO,EAAE,mBAAmB,EAAE,gBAAgB,EAAE,MAAM,WAAW,CAAC;AAClE,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAInD,UAAU,aAAa;IACrB,SAAS,CAAC,EAAE,CAAC,UAAU,GAAG;QAAE,SAAS,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IACjD,WAAW,CAAC,EAAE;QAAE,OAAO,CAAC,EAAE,aAAa,CAAA;KAAE,CAAC;CAC3C;AAED,MAAM,WAAW,iBAAiB;IAChC,IAAI,EAAE,UAAU,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,aAAa,CAAC;CACxB;AAED,MAAM,MAAM,WAAW,GAAG,mBAAmB,CAAC,QAAQ,CAAC,CAAC;AAExD,MAAM,WAAW,WAAY,SAAQ,mBAAmB;IACtD,aAAa,EAAE,MAAM,CAAC;IACtB,UAAU,EAAE,MAAM,CAAC;CACpB;AAiBD,qBAAa,mBAAmB;IAI5B,OAAO,CAAC,MAAM;IACd,OAAO,CAAC,IAAI,CAAC;IAJf,OAAO,CAAC,QAAQ,CAAS;IAEzB,OAAO;WAQM,MAAM,CACjB,OAAO,CAAC,EAAE,MAAM,EAChB,OAAO,GAAE;QAAE,MAAM,CAAC,EAAE,YAAY,CAAC;QAAC,IAAI,CAAC,EAAE,gBAAgB,CAAC;QAAC,QAAQ,CAAC,EAAE,MAAM,CAAA;KAAO,GAClF,OAAO,CAAC,mBAAmB,CAAC;IAezB,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAM5B,OAAO,CAAC,YAAY;IAId,SAAS,IAAI,OAAO,CAAC,aAAa,CAAC;YAI3B,UAAU;IAKlB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC;IAWvE,SAAS,CACb,EAAE,EAAE,MAAM,GAAG,SAAS,EACtB,MAAM,EAAE;QAAE,MAAM,EAAE,mBAAmB,CAAC;QAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;QAAC,YAAY,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;QAAC,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;KAAE,GACzH,OAAO,CAAC,IAAI,CAAC;IAWV,cAAc,CAAC,SAAS,CAAC,EAAE,aAAa,GAAG,OAAO,CAAC,aAAa,CAAC;IAKjE,oBAAoB,CAAC,OAAO,EAAE,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC;IAQ3D,WAAW,CAAC,OAAO,CAAC,EAAE,aAAa,GAAG,OAAO,CAAC,iBAAiB,CAAC;IAiBhE,WAAW,CAAC,OAAO,CAAC,EAAE,aAAa,GAAG,OAAO,CAAC,mBAAmB,CAAC;IAKlE,gBAAgB,CAAC,IAAI,EAAE,UAAU,EAAE,OAAO,EAAE,aAAa,EAAE,aAAa,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAiBhG,aAAa,CAAC,aAAa,EAAE,MAAM,EAAE,OAAO,GAAE;QAAE,KAAK,CAAC,EAAE,OAAO,CAAA;KAAO,GAAG,OAAO,CAAC;QAAE,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC;CASzG"}
|
|
@@ -0,0 +1,136 @@
|
|
|
1
|
+
import path from "node:path";
|
|
2
|
+
import { promises as fs } from "node:fs";
|
|
3
|
+
import { spawn } from "node:child_process";
|
|
4
|
+
import { PathHelper } from "@mcoda/shared";
|
|
5
|
+
import { GlobalRepository } from "@mcoda/db";
|
|
6
|
+
import { SystemClient } from "@mcoda/integrations";
|
|
7
|
+
const nowIso = () => new Date().toISOString();
|
|
8
|
+
const normalizeChannel = (channel) => {
|
|
9
|
+
if (!channel)
|
|
10
|
+
return "stable";
|
|
11
|
+
if (channel === "stable" || channel === "beta" || channel === "nightly")
|
|
12
|
+
return channel;
|
|
13
|
+
throw new Error(`Unsupported channel: ${channel}`);
|
|
14
|
+
};
|
|
15
|
+
const parseJson = async (filePath) => {
|
|
16
|
+
try {
|
|
17
|
+
const raw = await fs.readFile(filePath, "utf8");
|
|
18
|
+
return JSON.parse(raw);
|
|
19
|
+
}
|
|
20
|
+
catch {
|
|
21
|
+
return undefined;
|
|
22
|
+
}
|
|
23
|
+
};
|
|
24
|
+
export class SystemUpdateService {
|
|
25
|
+
constructor(client, repo, options = {}) {
|
|
26
|
+
this.client = client;
|
|
27
|
+
this.repo = repo;
|
|
28
|
+
this.mcodaDir = options.mcodaDir ?? PathHelper.getGlobalMcodaDir();
|
|
29
|
+
}
|
|
30
|
+
static async create(baseUrl, options = {}) {
|
|
31
|
+
const client = options.client ??
|
|
32
|
+
new SystemClient(baseUrl ?? process.env.MCODA_API_BASE_URL ?? process.env.MCODA_SYSTEM_API_URL);
|
|
33
|
+
let repo = options.repo;
|
|
34
|
+
if (!repo) {
|
|
35
|
+
try {
|
|
36
|
+
repo = await GlobalRepository.create();
|
|
37
|
+
}
|
|
38
|
+
catch {
|
|
39
|
+
repo = undefined;
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
return new SystemUpdateService(client, repo, { mcodaDir: options.mcodaDir });
|
|
43
|
+
}
|
|
44
|
+
async close() {
|
|
45
|
+
if (this.repo) {
|
|
46
|
+
await this.repo.close();
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
releasesPath() {
|
|
50
|
+
return path.join(this.mcodaDir, "releases.json");
|
|
51
|
+
}
|
|
52
|
+
async readState() {
|
|
53
|
+
return (await parseJson(this.releasesPath())) ?? {};
|
|
54
|
+
}
|
|
55
|
+
async writeState(state) {
|
|
56
|
+
await PathHelper.ensureDir(this.mcodaDir);
|
|
57
|
+
await fs.writeFile(this.releasesPath(), JSON.stringify(state, null, 2), "utf8");
|
|
58
|
+
}
|
|
59
|
+
async startRun(payload) {
|
|
60
|
+
const startedAt = nowIso();
|
|
61
|
+
const run = await this.repo?.createCommandRun({
|
|
62
|
+
commandName: "update",
|
|
63
|
+
startedAt,
|
|
64
|
+
status: "running",
|
|
65
|
+
payload,
|
|
66
|
+
});
|
|
67
|
+
return run?.id;
|
|
68
|
+
}
|
|
69
|
+
async finishRun(id, update) {
|
|
70
|
+
if (!id || !this.repo)
|
|
71
|
+
return;
|
|
72
|
+
await this.repo.completeCommandRun(id, {
|
|
73
|
+
status: update.status,
|
|
74
|
+
completedAt: nowIso(),
|
|
75
|
+
exitCode: update.exitCode ?? null,
|
|
76
|
+
errorSummary: update.errorSummary ?? null,
|
|
77
|
+
result: update.result,
|
|
78
|
+
});
|
|
79
|
+
}
|
|
80
|
+
async resolveChannel(preferred) {
|
|
81
|
+
const state = await this.readState();
|
|
82
|
+
return normalizeChannel(preferred ?? state.preferences?.channel ?? "stable");
|
|
83
|
+
}
|
|
84
|
+
async savePreferredChannel(channel) {
|
|
85
|
+
const state = await this.readState();
|
|
86
|
+
await this.writeState({
|
|
87
|
+
...state,
|
|
88
|
+
preferences: { ...(state.preferences ?? {}), channel },
|
|
89
|
+
});
|
|
90
|
+
}
|
|
91
|
+
async checkUpdate(channel) {
|
|
92
|
+
const resolved = await this.resolveChannel(channel);
|
|
93
|
+
const info = await this.client.checkUpdate(resolved);
|
|
94
|
+
const checkedAt = nowIso();
|
|
95
|
+
const state = await this.readState();
|
|
96
|
+
await this.writeState({
|
|
97
|
+
...state,
|
|
98
|
+
preferences: { ...(state.preferences ?? {}), channel: resolved },
|
|
99
|
+
lastCheck: {
|
|
100
|
+
...info,
|
|
101
|
+
checkedAt,
|
|
102
|
+
channel: resolved,
|
|
103
|
+
},
|
|
104
|
+
});
|
|
105
|
+
return { info, checkedAt, channel: resolved };
|
|
106
|
+
}
|
|
107
|
+
async applyUpdate(channel) {
|
|
108
|
+
const resolved = channel ? normalizeChannel(channel) : undefined;
|
|
109
|
+
return this.client.applyUpdate(resolved ? { channel: resolved } : undefined);
|
|
110
|
+
}
|
|
111
|
+
async recordApplyState(info, channel, targetVersion) {
|
|
112
|
+
const checkedAt = nowIso();
|
|
113
|
+
const state = await this.readState();
|
|
114
|
+
await this.writeState({
|
|
115
|
+
...state,
|
|
116
|
+
preferences: { ...(state.preferences ?? {}), channel },
|
|
117
|
+
lastCheck: {
|
|
118
|
+
...info,
|
|
119
|
+
currentVersion: targetVersion,
|
|
120
|
+
latestVersion: targetVersion,
|
|
121
|
+
updateAvailable: false,
|
|
122
|
+
channel,
|
|
123
|
+
checkedAt,
|
|
124
|
+
},
|
|
125
|
+
});
|
|
126
|
+
}
|
|
127
|
+
async runNpmInstall(targetVersion, options = {}) {
|
|
128
|
+
return new Promise((resolve, reject) => {
|
|
129
|
+
const child = spawn("npm", ["install", "-g", `mcoda@${targetVersion}`], {
|
|
130
|
+
stdio: options.quiet ? "ignore" : "inherit",
|
|
131
|
+
});
|
|
132
|
+
child.on("error", (error) => reject(error));
|
|
133
|
+
child.on("close", (code) => resolve({ code: code ?? 0 }));
|
|
134
|
+
});
|
|
135
|
+
}
|
|
136
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"TaskApiResolver.d.ts","sourceRoot":"","sources":["../../../src/services/tasks/TaskApiResolver.ts"],"names":[],"mappings":"AAAA,qBAAa,eAAe;IACd,OAAO,CAAC,OAAO,CAAC;gBAAR,OAAO,CAAC,EAAE,MAAM,YAAA;IAEpC,OAAO,CAAC,UAAU;IAIZ,aAAa,CAAC,OAAO,EAAE,MAAM,EAAE,UAAU,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC;CA6BvF"}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
export class TaskApiResolver {
|
|
2
|
+
constructor(baseUrl) {
|
|
3
|
+
this.baseUrl = baseUrl;
|
|
4
|
+
}
|
|
5
|
+
getBaseUrl() {
|
|
6
|
+
return this.baseUrl ?? process.env.MCODA_API_BASE_URL ?? process.env.MCODA_TASKS_API_URL;
|
|
7
|
+
}
|
|
8
|
+
async resolveTaskId(taskKey, projectKey) {
|
|
9
|
+
const base = this.getBaseUrl();
|
|
10
|
+
if (!base)
|
|
11
|
+
return undefined;
|
|
12
|
+
try {
|
|
13
|
+
const url = new URL("/tasks", base);
|
|
14
|
+
url.searchParams.set("key", taskKey);
|
|
15
|
+
if (projectKey) {
|
|
16
|
+
url.searchParams.set("project", projectKey);
|
|
17
|
+
}
|
|
18
|
+
const resp = await fetch(url, { headers: { accept: "application/json" } });
|
|
19
|
+
if (!resp.ok)
|
|
20
|
+
return undefined;
|
|
21
|
+
const body = await resp.json();
|
|
22
|
+
const candidates = Array.isArray(body)
|
|
23
|
+
? body
|
|
24
|
+
: Array.isArray(body?.tasks)
|
|
25
|
+
? body.tasks
|
|
26
|
+
: Array.isArray(body?.data)
|
|
27
|
+
? body.data
|
|
28
|
+
: [];
|
|
29
|
+
if (!candidates.length)
|
|
30
|
+
return undefined;
|
|
31
|
+
if (candidates.length > 1 && !projectKey) {
|
|
32
|
+
throw new Error(`Multiple tasks found with key "${taskKey}" via OpenAPI; please specify --project.`);
|
|
33
|
+
}
|
|
34
|
+
const taskId = candidates[0]?.id ?? candidates[0]?.task_id;
|
|
35
|
+
return typeof taskId === "string" ? taskId : undefined;
|
|
36
|
+
}
|
|
37
|
+
catch {
|
|
38
|
+
return undefined;
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
}
|
|
@@ -0,0 +1,106 @@
|
|
|
1
|
+
import { WorkspaceRepository, type TaskCommentRow } from "@mcoda/db";
|
|
2
|
+
import type { WorkspaceResolution } from "../../workspace/WorkspaceManager.js";
|
|
3
|
+
export interface DependencySummary {
|
|
4
|
+
taskId: string;
|
|
5
|
+
key: string;
|
|
6
|
+
status: string;
|
|
7
|
+
relationType: string;
|
|
8
|
+
}
|
|
9
|
+
export interface TaskLogSummary {
|
|
10
|
+
taskRunId: string;
|
|
11
|
+
timestamp: string;
|
|
12
|
+
level?: string | null;
|
|
13
|
+
source?: string | null;
|
|
14
|
+
message?: string | null;
|
|
15
|
+
command?: string;
|
|
16
|
+
status?: string;
|
|
17
|
+
details?: Record<string, unknown> | null;
|
|
18
|
+
}
|
|
19
|
+
export interface TaskRevisionSummary {
|
|
20
|
+
id: string;
|
|
21
|
+
jobId?: string | null;
|
|
22
|
+
commandRunId?: string | null;
|
|
23
|
+
changedAt: string;
|
|
24
|
+
statusBefore?: string;
|
|
25
|
+
statusAfter?: string;
|
|
26
|
+
storyPointsBefore?: number | null;
|
|
27
|
+
storyPointsAfter?: number | null;
|
|
28
|
+
changedFields?: string[];
|
|
29
|
+
snapshotBefore?: Record<string, unknown> | null;
|
|
30
|
+
snapshotAfter?: Record<string, unknown> | null;
|
|
31
|
+
}
|
|
32
|
+
export interface TaskDetailRecord {
|
|
33
|
+
id: string;
|
|
34
|
+
key: string;
|
|
35
|
+
title: string;
|
|
36
|
+
description?: string | null;
|
|
37
|
+
type?: string | null;
|
|
38
|
+
status: string;
|
|
39
|
+
storyPoints?: number | null;
|
|
40
|
+
priority?: number | null;
|
|
41
|
+
assignedAgentId?: string | null;
|
|
42
|
+
assignedAgentSlug?: string | null;
|
|
43
|
+
assigneeHuman?: string | null;
|
|
44
|
+
vcsBranch?: string | null;
|
|
45
|
+
vcsBaseBranch?: string | null;
|
|
46
|
+
vcsLastCommitSha?: string | null;
|
|
47
|
+
metadata?: Record<string, unknown> | null;
|
|
48
|
+
project: {
|
|
49
|
+
id: string;
|
|
50
|
+
key: string;
|
|
51
|
+
name?: string | null;
|
|
52
|
+
};
|
|
53
|
+
epic: {
|
|
54
|
+
id: string;
|
|
55
|
+
key: string;
|
|
56
|
+
title: string;
|
|
57
|
+
};
|
|
58
|
+
story: {
|
|
59
|
+
id: string;
|
|
60
|
+
key: string;
|
|
61
|
+
title: string;
|
|
62
|
+
};
|
|
63
|
+
createdAt: string;
|
|
64
|
+
updatedAt: string;
|
|
65
|
+
}
|
|
66
|
+
export interface TaskDetailResult {
|
|
67
|
+
task: TaskDetailRecord;
|
|
68
|
+
dependencies: {
|
|
69
|
+
upstream: DependencySummary[];
|
|
70
|
+
downstream: DependencySummary[];
|
|
71
|
+
};
|
|
72
|
+
comments: TaskCommentRow[];
|
|
73
|
+
logs?: TaskLogSummary[];
|
|
74
|
+
history?: TaskRevisionSummary[];
|
|
75
|
+
}
|
|
76
|
+
export interface TaskDetailOptions {
|
|
77
|
+
taskKey: string;
|
|
78
|
+
projectKey?: string;
|
|
79
|
+
includeLogs?: boolean;
|
|
80
|
+
includeHistory?: boolean;
|
|
81
|
+
commentsLimit?: number;
|
|
82
|
+
logsLimit?: number;
|
|
83
|
+
historyLimit?: number;
|
|
84
|
+
}
|
|
85
|
+
export declare class TaskDetailService {
|
|
86
|
+
private workspace;
|
|
87
|
+
private db;
|
|
88
|
+
private repo;
|
|
89
|
+
private globalRepo?;
|
|
90
|
+
private apiResolver;
|
|
91
|
+
private constructor();
|
|
92
|
+
static create(workspace: WorkspaceResolution): Promise<TaskDetailService>;
|
|
93
|
+
close(): Promise<void>;
|
|
94
|
+
getRepository(): WorkspaceRepository;
|
|
95
|
+
getTaskDetail(options: TaskDetailOptions): Promise<TaskDetailResult>;
|
|
96
|
+
private resolveTask;
|
|
97
|
+
private getDependencies;
|
|
98
|
+
private resolveTaskById;
|
|
99
|
+
private getLogs;
|
|
100
|
+
private resolveAgentSlug;
|
|
101
|
+
private getHistory;
|
|
102
|
+
private safeParse;
|
|
103
|
+
private pickField;
|
|
104
|
+
private diffFields;
|
|
105
|
+
}
|
|
106
|
+
//# sourceMappingURL=TaskDetailService.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"TaskDetailService.d.ts","sourceRoot":"","sources":["../../../src/services/tasks/TaskDetailService.ts"],"names":[],"mappings":"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"}
|