@mcoda/core 0.1.9 → 0.1.12
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +2 -2
- package/dist/api/AgentsApi.d.ts +1 -0
- package/dist/api/AgentsApi.d.ts.map +1 -1
- package/dist/api/AgentsApi.js +136 -11
- package/dist/api/QaTasksApi.d.ts.map +1 -1
- package/dist/api/QaTasksApi.js +4 -0
- package/dist/prompts/PdrPrompts.d.ts.map +1 -1
- package/dist/prompts/PdrPrompts.js +6 -0
- package/dist/prompts/SdsPrompts.d.ts.map +1 -1
- package/dist/prompts/SdsPrompts.js +7 -0
- package/dist/services/agents/AgentRatingService.d.ts +19 -0
- package/dist/services/agents/AgentRatingService.d.ts.map +1 -1
- package/dist/services/agents/AgentRatingService.js +66 -2
- package/dist/services/agents/GatewayAgentService.d.ts +8 -0
- package/dist/services/agents/GatewayAgentService.d.ts.map +1 -1
- package/dist/services/agents/GatewayAgentService.js +462 -65
- package/dist/services/agents/GatewayHandoff.d.ts +5 -1
- package/dist/services/agents/GatewayHandoff.d.ts.map +1 -1
- package/dist/services/agents/GatewayHandoff.js +65 -32
- package/dist/services/agents/RoutingService.d.ts +1 -0
- package/dist/services/agents/RoutingService.d.ts.map +1 -1
- package/dist/services/agents/RoutingService.js +4 -4
- package/dist/services/backlog/BacklogService.d.ts +23 -0
- package/dist/services/backlog/BacklogService.d.ts.map +1 -1
- package/dist/services/backlog/BacklogService.js +62 -7
- package/dist/services/backlog/TaskOrderingHeuristics.d.ts +12 -0
- package/dist/services/backlog/TaskOrderingHeuristics.d.ts.map +1 -0
- package/dist/services/backlog/TaskOrderingHeuristics.js +56 -0
- package/dist/services/backlog/TaskOrderingService.d.ts +16 -4
- package/dist/services/backlog/TaskOrderingService.d.ts.map +1 -1
- package/dist/services/backlog/TaskOrderingService.js +529 -73
- package/dist/services/docs/DocInventory.d.ts +11 -0
- package/dist/services/docs/DocInventory.d.ts.map +1 -0
- package/dist/services/docs/DocInventory.js +230 -0
- package/dist/services/docs/DocgenRunContext.d.ts +59 -0
- package/dist/services/docs/DocgenRunContext.d.ts.map +1 -0
- package/dist/services/docs/DocgenRunContext.js +4 -0
- package/dist/services/docs/DocsService.d.ts +59 -2
- package/dist/services/docs/DocsService.d.ts.map +1 -1
- package/dist/services/docs/DocsService.js +1701 -48
- package/dist/services/docs/alignment/DocAlignmentGraph.d.ts +23 -0
- package/dist/services/docs/alignment/DocAlignmentGraph.d.ts.map +1 -0
- package/dist/services/docs/alignment/DocAlignmentGraph.js +78 -0
- package/dist/services/docs/alignment/DocAlignmentPatcher.d.ts +19 -0
- package/dist/services/docs/alignment/DocAlignmentPatcher.d.ts.map +1 -0
- package/dist/services/docs/alignment/DocAlignmentPatcher.js +222 -0
- package/dist/services/docs/patch/DocPatchEngine.d.ts +57 -0
- package/dist/services/docs/patch/DocPatchEngine.d.ts.map +1 -0
- package/dist/services/docs/patch/DocPatchEngine.js +331 -0
- package/dist/services/docs/review/Glossary.d.ts +16 -0
- package/dist/services/docs/review/Glossary.d.ts.map +1 -0
- package/dist/services/docs/review/Glossary.js +47 -0
- package/dist/services/docs/review/ReviewReportRenderer.d.ts +3 -0
- package/dist/services/docs/review/ReviewReportRenderer.d.ts.map +1 -0
- package/dist/services/docs/review/ReviewReportRenderer.js +133 -0
- package/dist/services/docs/review/ReviewReportSchema.d.ts +39 -0
- package/dist/services/docs/review/ReviewReportSchema.d.ts.map +1 -0
- package/dist/services/docs/review/ReviewReportSchema.js +47 -0
- package/dist/services/docs/review/ReviewTypes.d.ts +76 -0
- package/dist/services/docs/review/ReviewTypes.d.ts.map +1 -0
- package/dist/services/docs/review/ReviewTypes.js +94 -0
- package/dist/services/docs/review/gates/AdminOpenApiSpecGate.d.ts +7 -0
- package/dist/services/docs/review/gates/AdminOpenApiSpecGate.d.ts.map +1 -0
- package/dist/services/docs/review/gates/AdminOpenApiSpecGate.js +93 -0
- package/dist/services/docs/review/gates/ApiPathConsistencyGate.d.ts +7 -0
- package/dist/services/docs/review/gates/ApiPathConsistencyGate.d.ts.map +1 -0
- package/dist/services/docs/review/gates/ApiPathConsistencyGate.js +308 -0
- package/dist/services/docs/review/gates/BuildReadyCompletenessGate.d.ts +8 -0
- package/dist/services/docs/review/gates/BuildReadyCompletenessGate.d.ts.map +1 -0
- package/dist/services/docs/review/gates/BuildReadyCompletenessGate.js +278 -0
- package/dist/services/docs/review/gates/DeploymentBlueprintGate.d.ts +8 -0
- package/dist/services/docs/review/gates/DeploymentBlueprintGate.d.ts.map +1 -0
- package/dist/services/docs/review/gates/DeploymentBlueprintGate.js +487 -0
- package/dist/services/docs/review/gates/NoMaybesGate.d.ts +8 -0
- package/dist/services/docs/review/gates/NoMaybesGate.d.ts.map +1 -0
- package/dist/services/docs/review/gates/NoMaybesGate.js +145 -0
- package/dist/services/docs/review/gates/OpenApiCoverageGate.d.ts +7 -0
- package/dist/services/docs/review/gates/OpenApiCoverageGate.d.ts.map +1 -0
- package/dist/services/docs/review/gates/OpenApiCoverageGate.js +266 -0
- package/dist/services/docs/review/gates/OpenApiSchemaSanityGate.d.ts +7 -0
- package/dist/services/docs/review/gates/OpenApiSchemaSanityGate.d.ts.map +1 -0
- package/dist/services/docs/review/gates/OpenApiSchemaSanityGate.js +59 -0
- package/dist/services/docs/review/gates/OpenQuestionsGate.d.ts +7 -0
- package/dist/services/docs/review/gates/OpenQuestionsGate.d.ts.map +1 -0
- package/dist/services/docs/review/gates/OpenQuestionsGate.js +200 -0
- package/dist/services/docs/review/gates/PdrInterfacesGate.d.ts +7 -0
- package/dist/services/docs/review/gates/PdrInterfacesGate.d.ts.map +1 -0
- package/dist/services/docs/review/gates/PdrInterfacesGate.js +159 -0
- package/dist/services/docs/review/gates/PdrOpenQuestionsGate.d.ts +8 -0
- package/dist/services/docs/review/gates/PdrOpenQuestionsGate.d.ts.map +1 -0
- package/dist/services/docs/review/gates/PdrOpenQuestionsGate.js +129 -0
- package/dist/services/docs/review/gates/PdrOwnershipGate.d.ts +7 -0
- package/dist/services/docs/review/gates/PdrOwnershipGate.d.ts.map +1 -0
- package/dist/services/docs/review/gates/PdrOwnershipGate.js +169 -0
- package/dist/services/docs/review/gates/PlaceholderArtifactGate.d.ts +10 -0
- package/dist/services/docs/review/gates/PlaceholderArtifactGate.d.ts.map +1 -0
- package/dist/services/docs/review/gates/PlaceholderArtifactGate.js +261 -0
- package/dist/services/docs/review/gates/RfpConsentGate.d.ts +6 -0
- package/dist/services/docs/review/gates/RfpConsentGate.d.ts.map +1 -0
- package/dist/services/docs/review/gates/RfpConsentGate.js +127 -0
- package/dist/services/docs/review/gates/RfpDefinitionGate.d.ts +7 -0
- package/dist/services/docs/review/gates/RfpDefinitionGate.d.ts.map +1 -0
- package/dist/services/docs/review/gates/RfpDefinitionGate.js +173 -0
- package/dist/services/docs/review/gates/SdsAdaptersGate.d.ts +7 -0
- package/dist/services/docs/review/gates/SdsAdaptersGate.d.ts.map +1 -0
- package/dist/services/docs/review/gates/SdsAdaptersGate.js +196 -0
- package/dist/services/docs/review/gates/SdsDecisionsGate.d.ts +7 -0
- package/dist/services/docs/review/gates/SdsDecisionsGate.d.ts.map +1 -0
- package/dist/services/docs/review/gates/SdsDecisionsGate.js +89 -0
- package/dist/services/docs/review/gates/SdsOpsGate.d.ts +7 -0
- package/dist/services/docs/review/gates/SdsOpsGate.d.ts.map +1 -0
- package/dist/services/docs/review/gates/SdsOpsGate.js +162 -0
- package/dist/services/docs/review/gates/SdsPolicyTelemetryGate.d.ts +7 -0
- package/dist/services/docs/review/gates/SdsPolicyTelemetryGate.d.ts.map +1 -0
- package/dist/services/docs/review/gates/SdsPolicyTelemetryGate.js +166 -0
- package/dist/services/docs/review/gates/SqlRequiredTablesGate.d.ts +7 -0
- package/dist/services/docs/review/gates/SqlRequiredTablesGate.d.ts.map +1 -0
- package/dist/services/docs/review/gates/SqlRequiredTablesGate.js +273 -0
- package/dist/services/docs/review/gates/SqlSyntaxGate.d.ts +7 -0
- package/dist/services/docs/review/gates/SqlSyntaxGate.d.ts.map +1 -0
- package/dist/services/docs/review/gates/SqlSyntaxGate.js +203 -0
- package/dist/services/docs/review/gates/TerminologyNormalizationGate.d.ts +9 -0
- package/dist/services/docs/review/gates/TerminologyNormalizationGate.d.ts.map +1 -0
- package/dist/services/docs/review/gates/TerminologyNormalizationGate.js +217 -0
- package/dist/services/docs/review/glossary.json +47 -0
- package/dist/services/estimate/EstimateService.d.ts +2 -0
- package/dist/services/estimate/EstimateService.d.ts.map +1 -1
- package/dist/services/estimate/EstimateService.js +66 -18
- package/dist/services/estimate/VelocityService.d.ts +4 -0
- package/dist/services/estimate/VelocityService.d.ts.map +1 -1
- package/dist/services/estimate/VelocityService.js +179 -36
- package/dist/services/estimate/types.d.ts +1 -0
- package/dist/services/estimate/types.d.ts.map +1 -1
- package/dist/services/execution/GatewayTrioService.d.ts +71 -4
- package/dist/services/execution/GatewayTrioService.d.ts.map +1 -1
- package/dist/services/execution/GatewayTrioService.js +1695 -328
- package/dist/services/execution/QaApiRunner.d.ts +30 -0
- package/dist/services/execution/QaApiRunner.d.ts.map +1 -0
- package/dist/services/execution/QaApiRunner.js +881 -0
- package/dist/services/execution/QaFollowupService.d.ts +1 -0
- package/dist/services/execution/QaFollowupService.d.ts.map +1 -1
- package/dist/services/execution/QaFollowupService.js +8 -2
- package/dist/services/execution/QaPlanValidator.d.ts +10 -0
- package/dist/services/execution/QaPlanValidator.d.ts.map +1 -0
- package/dist/services/execution/QaPlanValidator.js +128 -0
- package/dist/services/execution/QaProfileService.d.ts +21 -1
- package/dist/services/execution/QaProfileService.d.ts.map +1 -1
- package/dist/services/execution/QaProfileService.js +214 -29
- package/dist/services/execution/QaTasksService.d.ts +41 -1
- package/dist/services/execution/QaTasksService.d.ts.map +1 -1
- package/dist/services/execution/QaTasksService.js +2851 -500
- package/dist/services/execution/QaTestCommandBuilder.d.ts +51 -0
- package/dist/services/execution/QaTestCommandBuilder.d.ts.map +1 -0
- package/dist/services/execution/QaTestCommandBuilder.js +495 -0
- package/dist/services/execution/TaskSelectionService.d.ts +4 -2
- package/dist/services/execution/TaskSelectionService.d.ts.map +1 -1
- package/dist/services/execution/TaskSelectionService.js +144 -28
- package/dist/services/execution/TaskStateService.d.ts +19 -6
- package/dist/services/execution/TaskStateService.d.ts.map +1 -1
- package/dist/services/execution/TaskStateService.js +128 -13
- package/dist/services/execution/WorkOnTasksService.d.ts +19 -2
- package/dist/services/execution/WorkOnTasksService.d.ts.map +1 -1
- package/dist/services/execution/WorkOnTasksService.js +3913 -1225
- package/dist/services/jobs/JobInsightsService.d.ts +4 -0
- package/dist/services/jobs/JobInsightsService.d.ts.map +1 -1
- package/dist/services/jobs/JobInsightsService.js +51 -5
- package/dist/services/jobs/JobResumeService.d.ts.map +1 -1
- package/dist/services/jobs/JobResumeService.js +23 -10
- package/dist/services/jobs/JobService.d.ts +56 -4
- package/dist/services/jobs/JobService.d.ts.map +1 -1
- package/dist/services/jobs/JobService.js +232 -1
- package/dist/services/openapi/OpenApiService.d.ts +41 -0
- package/dist/services/openapi/OpenApiService.d.ts.map +1 -1
- package/dist/services/openapi/OpenApiService.js +889 -98
- package/dist/services/planning/CreateTasksService.d.ts +15 -0
- package/dist/services/planning/CreateTasksService.d.ts.map +1 -1
- package/dist/services/planning/CreateTasksService.js +311 -6
- package/dist/services/planning/RefineTasksService.d.ts +4 -0
- package/dist/services/planning/RefineTasksService.d.ts.map +1 -1
- package/dist/services/planning/RefineTasksService.js +225 -24
- package/dist/services/review/CodeReviewService.d.ts +4 -0
- package/dist/services/review/CodeReviewService.d.ts.map +1 -1
- package/dist/services/review/CodeReviewService.js +778 -232
- package/dist/services/review/ReviewNormalizer.d.ts +9 -0
- package/dist/services/review/ReviewNormalizer.d.ts.map +1 -0
- package/dist/services/review/ReviewNormalizer.js +147 -0
- package/dist/services/shared/AuthErrors.d.ts +3 -0
- package/dist/services/shared/AuthErrors.d.ts.map +1 -0
- package/dist/services/shared/AuthErrors.js +17 -0
- package/dist/services/shared/DocdexGuidance.d.ts +7 -0
- package/dist/services/shared/DocdexGuidance.d.ts.map +1 -0
- package/dist/services/shared/DocdexGuidance.js +12 -0
- package/dist/services/shared/ProjectGuidance.d.ts +12 -1
- package/dist/services/shared/ProjectGuidance.d.ts.map +1 -1
- package/dist/services/shared/ProjectGuidance.js +64 -7
- package/dist/services/system/ToolDenylist.d.ts +13 -0
- package/dist/services/system/ToolDenylist.d.ts.map +1 -0
- package/dist/services/system/ToolDenylist.js +85 -0
- package/dist/services/telemetry/TelemetryService.d.ts.map +1 -1
- package/dist/services/telemetry/TelemetryService.js +39 -7
- package/dist/workspace/WorkspaceManager.d.ts +22 -0
- package/dist/workspace/WorkspaceManager.d.ts.map +1 -1
- package/dist/workspace/WorkspaceManager.js +203 -32
- package/package.json +6 -5
|
@@ -2,13 +2,22 @@ import path from "node:path";
|
|
|
2
2
|
import { promises as fs } from "node:fs";
|
|
3
3
|
import { AgentService } from "@mcoda/agents";
|
|
4
4
|
import { DocdexClient } from "@mcoda/integrations";
|
|
5
|
+
import { READY_TO_CODE_REVIEW } from "@mcoda/shared";
|
|
5
6
|
import { GlobalRepository, WorkspaceRepository } from "@mcoda/db";
|
|
7
|
+
import { getCommandRequiredCapabilities, } from "@mcoda/shared";
|
|
6
8
|
import { JobService } from "../jobs/JobService.js";
|
|
7
9
|
import { RoutingService } from "../agents/RoutingService.js";
|
|
8
10
|
import { AgentRatingService } from "../agents/AgentRatingService.js";
|
|
11
|
+
import { classifyTask } from "../backlog/TaskOrderingHeuristics.js";
|
|
12
|
+
import { TaskOrderingService } from "../backlog/TaskOrderingService.js";
|
|
9
13
|
import { createTaskKeyGenerator } from "./KeyHelpers.js";
|
|
10
14
|
const DEFAULT_STRATEGY = "auto";
|
|
11
|
-
const FORBIDDEN_TARGET_STATUSES = new Set([
|
|
15
|
+
const FORBIDDEN_TARGET_STATUSES = new Set([READY_TO_CODE_REVIEW, "ready_to_qa", "completed"]);
|
|
16
|
+
const normalizeCreateStatus = (status) => {
|
|
17
|
+
if (!status)
|
|
18
|
+
return "not_started";
|
|
19
|
+
return status.toLowerCase();
|
|
20
|
+
};
|
|
12
21
|
const DEFAULT_MAX_TASKS = 250;
|
|
13
22
|
const MAX_AGENT_OUTPUT_CHARS = 10000000;
|
|
14
23
|
const estimateTokens = (text) => Math.max(1, Math.ceil(text.length / 4));
|
|
@@ -174,9 +183,11 @@ export class RefineTasksService {
|
|
|
174
183
|
const repo = await GlobalRepository.create();
|
|
175
184
|
const agentService = new AgentService(repo);
|
|
176
185
|
const routingService = await RoutingService.create();
|
|
186
|
+
const docdexRepoId = workspace.config?.docdexRepoId ?? process.env.MCODA_DOCDEX_REPO_ID ?? process.env.DOCDEX_REPO_ID;
|
|
177
187
|
const docdex = new DocdexClient({
|
|
178
188
|
workspaceRoot: workspace.workspaceRoot,
|
|
179
189
|
baseUrl: workspace.config?.docdexUrl ?? process.env.MCODA_DOCDEX_URL,
|
|
190
|
+
repoId: docdexRepoId,
|
|
180
191
|
});
|
|
181
192
|
const workspaceRepo = await WorkspaceRepository.create(workspace.workspaceRoot);
|
|
182
193
|
const jobService = new JobService(workspace, workspaceRepo);
|
|
@@ -207,13 +218,82 @@ export class RefineTasksService {
|
|
|
207
218
|
await tryClose(this.routingService);
|
|
208
219
|
await tryClose(this.docdex);
|
|
209
220
|
}
|
|
221
|
+
async seedPriorities(projectKey) {
|
|
222
|
+
const ordering = await TaskOrderingService.create(this.workspace, { recordTelemetry: false });
|
|
223
|
+
try {
|
|
224
|
+
await ordering.orderTasks({
|
|
225
|
+
projectKey,
|
|
226
|
+
});
|
|
227
|
+
}
|
|
228
|
+
finally {
|
|
229
|
+
await ordering.close();
|
|
230
|
+
}
|
|
231
|
+
}
|
|
210
232
|
async resolveAgent(agentName) {
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
233
|
+
try {
|
|
234
|
+
const resolved = await this.routingService.resolveAgentForCommand({
|
|
235
|
+
workspace: this.workspace,
|
|
236
|
+
commandName: "refine-tasks",
|
|
237
|
+
overrideAgentSlug: agentName,
|
|
238
|
+
});
|
|
239
|
+
return resolved.agent;
|
|
240
|
+
}
|
|
241
|
+
catch (error) {
|
|
242
|
+
const message = error.message ?? "";
|
|
243
|
+
if (!/No routing defaults/i.test(message)) {
|
|
244
|
+
throw error;
|
|
245
|
+
}
|
|
246
|
+
const requiredCaps = getCommandRequiredCapabilities("refine-tasks");
|
|
247
|
+
const fallback = await this.selectFallbackAgent(requiredCaps);
|
|
248
|
+
if (fallback)
|
|
249
|
+
return fallback;
|
|
250
|
+
throw new Error(`No routing defaults found for command refine-tasks. ` +
|
|
251
|
+
`Set a default agent (mcoda agent set-default <NAME> --workspace <PATH>) ` +
|
|
252
|
+
`or pass --agent <NAME> with ${requiredCaps.length ? `capabilities: ${requiredCaps.join(", ")}` : "required capabilities"}.`);
|
|
253
|
+
}
|
|
254
|
+
}
|
|
255
|
+
async selectFallbackAgent(requiredCaps) {
|
|
256
|
+
const agents = await this.repo.listAgents();
|
|
257
|
+
if (!agents.length)
|
|
258
|
+
return undefined;
|
|
259
|
+
let healthRows = [];
|
|
260
|
+
try {
|
|
261
|
+
healthRows = await this.repo.listAgentHealthSummary();
|
|
262
|
+
}
|
|
263
|
+
catch {
|
|
264
|
+
healthRows = [];
|
|
265
|
+
}
|
|
266
|
+
const healthById = new Map(healthRows.map((row) => [row.agentId, row]));
|
|
267
|
+
const candidates = [];
|
|
268
|
+
for (const agent of agents) {
|
|
269
|
+
const health = healthById.get(agent.id);
|
|
270
|
+
if (health?.status === "unreachable")
|
|
271
|
+
continue;
|
|
272
|
+
const caps = await this.repo.getAgentCapabilities(agent.id);
|
|
273
|
+
const hasCaps = requiredCaps.every((cap) => caps.includes(cap));
|
|
274
|
+
candidates.push({
|
|
275
|
+
agent,
|
|
276
|
+
rating: Number(agent.rating ?? 0),
|
|
277
|
+
reasoning: Number(agent.reasoningRating ?? 0),
|
|
278
|
+
cost: Number(agent.costPerMillion ?? 0),
|
|
279
|
+
hasCaps,
|
|
280
|
+
slug: agent.slug ?? agent.id,
|
|
281
|
+
});
|
|
282
|
+
}
|
|
283
|
+
if (!candidates.length)
|
|
284
|
+
return undefined;
|
|
285
|
+
const eligible = candidates.filter((c) => c.hasCaps);
|
|
286
|
+
const pool = eligible.length ? eligible : candidates;
|
|
287
|
+
pool.sort((a, b) => {
|
|
288
|
+
if (b.rating !== a.rating)
|
|
289
|
+
return b.rating - a.rating;
|
|
290
|
+
if (b.reasoning !== a.reasoning)
|
|
291
|
+
return b.reasoning - a.reasoning;
|
|
292
|
+
if (a.cost !== b.cost)
|
|
293
|
+
return a.cost - b.cost;
|
|
294
|
+
return a.slug.localeCompare(b.slug);
|
|
215
295
|
});
|
|
216
|
-
return
|
|
296
|
+
return pool[0]?.agent;
|
|
217
297
|
}
|
|
218
298
|
ensureRatingService() {
|
|
219
299
|
if (!this.ratingService) {
|
|
@@ -468,6 +548,7 @@ export class RefineTasksService {
|
|
|
468
548
|
const updates = seed?.updates ?? seed?.fields ?? {};
|
|
469
549
|
const epic = await ensureEpic();
|
|
470
550
|
const story = await ensureStory(epic.id);
|
|
551
|
+
const status = normalizeCreateStatus(updates.status);
|
|
471
552
|
const [task] = await this.workspaceRepo.insertTasks([
|
|
472
553
|
{
|
|
473
554
|
projectId,
|
|
@@ -477,7 +558,7 @@ export class RefineTasksService {
|
|
|
477
558
|
title: updates.title ?? `Task ${taskKey}`,
|
|
478
559
|
description: updates.description ?? "",
|
|
479
560
|
type: updates.type ?? "feature",
|
|
480
|
-
status
|
|
561
|
+
status,
|
|
481
562
|
storyPoints: updates.storyPoints ?? null,
|
|
482
563
|
priority: updates.priority ?? null,
|
|
483
564
|
metadata: updates.metadata ?? undefined,
|
|
@@ -498,7 +579,7 @@ export class RefineTasksService {
|
|
|
498
579
|
const taskList = group.tasks.map((t) => formatTaskSummary(t)).join("\n");
|
|
499
580
|
const constraints = [
|
|
500
581
|
"- Immutable: project_id, epic_id, user_story_id, task keys.",
|
|
501
|
-
"- Allowed edits: title, description, acceptanceCriteria, metadata/labels, type, priority, storyPoints, status (but NOT
|
|
582
|
+
"- Allowed edits: title, description, acceptanceCriteria, metadata/labels, type, priority, storyPoints, status (but NOT ready_to_code_review/qa/completed).",
|
|
502
583
|
"- Splits: children stay under same story; keep parent unless keepParent=false; child dependsOn must reference existing tasks or siblings.",
|
|
503
584
|
"- Merges: target and sources must be in same story; prefer cancelling redundant sources (status=cancelled) and preserve useful details in target updates.",
|
|
504
585
|
"- Dependencies: maintain DAG; do not introduce cycles or cross-story edges.",
|
|
@@ -637,6 +718,20 @@ export class RefineTasksService {
|
|
|
637
718
|
return existing;
|
|
638
719
|
return { ...(existing ?? {}), ...updates };
|
|
639
720
|
}
|
|
721
|
+
applyStageMetadata(metadata, content, shouldUpdate) {
|
|
722
|
+
if (!shouldUpdate)
|
|
723
|
+
return metadata;
|
|
724
|
+
const classification = classifyTask({
|
|
725
|
+
title: content.title,
|
|
726
|
+
description: content.description ?? undefined,
|
|
727
|
+
type: content.type ?? undefined,
|
|
728
|
+
});
|
|
729
|
+
return {
|
|
730
|
+
...(metadata ?? {}),
|
|
731
|
+
stage: classification.stage,
|
|
732
|
+
foundation: classification.foundation,
|
|
733
|
+
};
|
|
734
|
+
}
|
|
640
735
|
validateOperation(group, op) {
|
|
641
736
|
const allowedOps = new Set(["update_task", "split_task", "merge_tasks", "update_estimate"]);
|
|
642
737
|
if (!op || typeof op.op !== "string" || !allowedOps.has(op.op)) {
|
|
@@ -743,6 +838,28 @@ export class RefineTasksService {
|
|
|
743
838
|
}
|
|
744
839
|
return false;
|
|
745
840
|
}
|
|
841
|
+
hasDependencyPath(graph, fromKey, toKey) {
|
|
842
|
+
if (fromKey === toKey)
|
|
843
|
+
return true;
|
|
844
|
+
const visited = new Set();
|
|
845
|
+
const stack = [fromKey];
|
|
846
|
+
while (stack.length > 0) {
|
|
847
|
+
const current = stack.pop();
|
|
848
|
+
if (current === toKey)
|
|
849
|
+
return true;
|
|
850
|
+
if (visited.has(current))
|
|
851
|
+
continue;
|
|
852
|
+
visited.add(current);
|
|
853
|
+
const neighbors = graph.get(current);
|
|
854
|
+
if (!neighbors)
|
|
855
|
+
continue;
|
|
856
|
+
for (const next of neighbors) {
|
|
857
|
+
if (!visited.has(next))
|
|
858
|
+
stack.push(next);
|
|
859
|
+
}
|
|
860
|
+
}
|
|
861
|
+
return false;
|
|
862
|
+
}
|
|
746
863
|
async applyOperations(projectId, jobId, commandRunId, group, operations) {
|
|
747
864
|
const created = [];
|
|
748
865
|
const updated = [];
|
|
@@ -754,7 +871,6 @@ export class RefineTasksService {
|
|
|
754
871
|
let stage = "start";
|
|
755
872
|
const newTasks = [];
|
|
756
873
|
const pendingDeps = [];
|
|
757
|
-
const dependencyEdges = [];
|
|
758
874
|
try {
|
|
759
875
|
stage = "load:storyKeys";
|
|
760
876
|
const storyKeyRows = await this.workspaceRepo.getDb().all(`SELECT key FROM tasks WHERE user_story_id = ?`, group.story.id);
|
|
@@ -767,7 +883,13 @@ export class RefineTasksService {
|
|
|
767
883
|
if (!target)
|
|
768
884
|
continue;
|
|
769
885
|
const before = { ...target };
|
|
770
|
-
const
|
|
886
|
+
const mergedMetadata = this.mergeMetadata(target.metadata, op.updates.metadata);
|
|
887
|
+
const contentUpdated = op.updates.title !== undefined || op.updates.description !== undefined || op.updates.type !== undefined;
|
|
888
|
+
const metadata = this.applyStageMetadata(mergedMetadata, {
|
|
889
|
+
title: op.updates.title ?? target.title,
|
|
890
|
+
description: op.updates.description ?? target.description ?? null,
|
|
891
|
+
type: op.updates.type ?? target.type ?? null,
|
|
892
|
+
}, contentUpdated);
|
|
771
893
|
const beforeSp = target.storyPoints ?? 0;
|
|
772
894
|
const afterSp = op.updates.storyPoints ?? target.storyPoints ?? null;
|
|
773
895
|
storyPointsDelta += (afterSp ?? 0) - (beforeSp ?? 0);
|
|
@@ -796,13 +918,22 @@ export class RefineTasksService {
|
|
|
796
918
|
continue;
|
|
797
919
|
if (op.parentUpdates) {
|
|
798
920
|
const before = { ...target };
|
|
921
|
+
const mergedMetadata = this.mergeMetadata(target.metadata, op.parentUpdates.metadata);
|
|
922
|
+
const contentUpdated = op.parentUpdates.title !== undefined ||
|
|
923
|
+
op.parentUpdates.description !== undefined ||
|
|
924
|
+
op.parentUpdates.type !== undefined;
|
|
925
|
+
const metadata = this.applyStageMetadata(mergedMetadata, {
|
|
926
|
+
title: op.parentUpdates.title ?? target.title,
|
|
927
|
+
description: op.parentUpdates.description ?? target.description ?? null,
|
|
928
|
+
type: op.parentUpdates.type ?? target.type ?? null,
|
|
929
|
+
}, contentUpdated);
|
|
799
930
|
await this.workspaceRepo.updateTask(target.id, {
|
|
800
931
|
title: op.parentUpdates.title ?? target.title,
|
|
801
932
|
description: op.parentUpdates.description ?? target.description ?? null,
|
|
802
933
|
type: op.parentUpdates.type ?? target.type ?? null,
|
|
803
934
|
storyPoints: op.parentUpdates.storyPoints ?? target.storyPoints ?? null,
|
|
804
935
|
priority: op.parentUpdates.priority ?? target.priority ?? null,
|
|
805
|
-
metadata
|
|
936
|
+
metadata,
|
|
806
937
|
});
|
|
807
938
|
updated.push(target.key);
|
|
808
939
|
await this.workspaceRepo.insertTaskRevision({
|
|
@@ -814,7 +945,7 @@ export class RefineTasksService {
|
|
|
814
945
|
...before,
|
|
815
946
|
...op.parentUpdates,
|
|
816
947
|
storyPoints: op.parentUpdates.storyPoints ?? before.storyPoints,
|
|
817
|
-
metadata
|
|
948
|
+
metadata,
|
|
818
949
|
},
|
|
819
950
|
createdAt: new Date().toISOString(),
|
|
820
951
|
});
|
|
@@ -825,6 +956,13 @@ export class RefineTasksService {
|
|
|
825
956
|
if (childSp) {
|
|
826
957
|
storyPointsDelta += childSp;
|
|
827
958
|
}
|
|
959
|
+
const childMetadata = this.mergeMetadata({}, child.metadata);
|
|
960
|
+
const childContent = {
|
|
961
|
+
title: child.title,
|
|
962
|
+
description: child.description ?? target.description ?? "",
|
|
963
|
+
type: child.type ?? target.type ?? "feature",
|
|
964
|
+
};
|
|
965
|
+
const resolvedChildMetadata = this.applyStageMetadata(childMetadata, childContent, true);
|
|
828
966
|
const childInsert = {
|
|
829
967
|
projectId,
|
|
830
968
|
epicId: target.epicId,
|
|
@@ -836,7 +974,7 @@ export class RefineTasksService {
|
|
|
836
974
|
status: "not_started",
|
|
837
975
|
storyPoints: childSp,
|
|
838
976
|
priority: child.priority ?? target.priority ?? null,
|
|
839
|
-
metadata:
|
|
977
|
+
metadata: resolvedChildMetadata,
|
|
840
978
|
assignedAgentId: target.assignedAgentId ?? null,
|
|
841
979
|
assigneeHuman: target.assigneeHuman ?? null,
|
|
842
980
|
vcsBranch: null,
|
|
@@ -849,8 +987,12 @@ export class RefineTasksService {
|
|
|
849
987
|
for (const depKey of dependsOn) {
|
|
850
988
|
const depTask = taskByKey.get(depKey);
|
|
851
989
|
if (depTask) {
|
|
852
|
-
pendingDeps.push({
|
|
853
|
-
|
|
990
|
+
pendingDeps.push({
|
|
991
|
+
childKey,
|
|
992
|
+
dependsOnId: depTask.id,
|
|
993
|
+
dependsOnKey: depTask.key,
|
|
994
|
+
relationType: "blocks",
|
|
995
|
+
});
|
|
854
996
|
}
|
|
855
997
|
}
|
|
856
998
|
taskByKey.set(childKey, {
|
|
@@ -871,13 +1013,20 @@ export class RefineTasksService {
|
|
|
871
1013
|
continue;
|
|
872
1014
|
if (op.updates) {
|
|
873
1015
|
const before = { ...target };
|
|
1016
|
+
const mergedMetadata = this.mergeMetadata(target.metadata, op.updates.metadata);
|
|
1017
|
+
const contentUpdated = op.updates.title !== undefined || op.updates.description !== undefined || op.updates.type !== undefined;
|
|
1018
|
+
const metadata = this.applyStageMetadata(mergedMetadata, {
|
|
1019
|
+
title: op.updates.title ?? target.title,
|
|
1020
|
+
description: op.updates.description ?? target.description ?? null,
|
|
1021
|
+
type: op.updates.type ?? target.type ?? null,
|
|
1022
|
+
}, contentUpdated);
|
|
874
1023
|
await this.workspaceRepo.updateTask(target.id, {
|
|
875
1024
|
title: op.updates.title ?? target.title,
|
|
876
1025
|
description: op.updates.description ?? target.description ?? null,
|
|
877
1026
|
type: op.updates.type ?? target.type ?? null,
|
|
878
1027
|
storyPoints: op.updates.storyPoints ?? target.storyPoints ?? null,
|
|
879
1028
|
priority: op.updates.priority ?? target.priority ?? null,
|
|
880
|
-
metadata
|
|
1029
|
+
metadata,
|
|
881
1030
|
});
|
|
882
1031
|
updated.push(target.key);
|
|
883
1032
|
await this.workspaceRepo.insertTaskRevision({
|
|
@@ -889,7 +1038,7 @@ export class RefineTasksService {
|
|
|
889
1038
|
...before,
|
|
890
1039
|
...op.updates,
|
|
891
1040
|
storyPoints: op.updates.storyPoints ?? before.storyPoints,
|
|
892
|
-
metadata
|
|
1041
|
+
metadata,
|
|
893
1042
|
},
|
|
894
1043
|
createdAt: new Date().toISOString(),
|
|
895
1044
|
});
|
|
@@ -922,10 +1071,17 @@ export class RefineTasksService {
|
|
|
922
1071
|
const beforeSp = target.storyPoints ?? 0;
|
|
923
1072
|
const afterSp = op.storyPoints ?? target.storyPoints ?? null;
|
|
924
1073
|
storyPointsDelta += (afterSp ?? 0) - (beforeSp ?? 0);
|
|
1074
|
+
const contentUpdated = op.type !== undefined;
|
|
1075
|
+
const metadata = this.applyStageMetadata(target.metadata, {
|
|
1076
|
+
title: target.title,
|
|
1077
|
+
description: target.description ?? null,
|
|
1078
|
+
type: op.type ?? target.type ?? null,
|
|
1079
|
+
}, contentUpdated);
|
|
925
1080
|
await this.workspaceRepo.updateTask(target.id, {
|
|
926
1081
|
storyPoints: afterSp,
|
|
927
1082
|
type: op.type ?? target.type ?? null,
|
|
928
1083
|
priority: op.priority ?? target.priority ?? null,
|
|
1084
|
+
metadata: contentUpdated ? metadata : undefined,
|
|
929
1085
|
});
|
|
930
1086
|
updated.push(target.key);
|
|
931
1087
|
await this.workspaceRepo.insertTaskRevision({
|
|
@@ -933,11 +1089,30 @@ export class RefineTasksService {
|
|
|
933
1089
|
jobId,
|
|
934
1090
|
commandRunId,
|
|
935
1091
|
snapshotBefore: { ...target },
|
|
936
|
-
snapshotAfter: {
|
|
1092
|
+
snapshotAfter: {
|
|
1093
|
+
...target,
|
|
1094
|
+
storyPoints: afterSp,
|
|
1095
|
+
type: op.type ?? target.type ?? null,
|
|
1096
|
+
priority: op.priority ?? target.priority ?? null,
|
|
1097
|
+
metadata: contentUpdated ? metadata : target.metadata,
|
|
1098
|
+
},
|
|
937
1099
|
createdAt: new Date().toISOString(),
|
|
938
1100
|
});
|
|
939
1101
|
}
|
|
940
1102
|
}
|
|
1103
|
+
const dependencyGraph = new Map();
|
|
1104
|
+
const addEdge = (from, to) => {
|
|
1105
|
+
if (!from || !to)
|
|
1106
|
+
return;
|
|
1107
|
+
const edges = dependencyGraph.get(from) ?? new Set();
|
|
1108
|
+
edges.add(to);
|
|
1109
|
+
dependencyGraph.set(from, edges);
|
|
1110
|
+
};
|
|
1111
|
+
for (const task of group.tasks) {
|
|
1112
|
+
for (const dep of task.dependencies) {
|
|
1113
|
+
addEdge(task.key, dep);
|
|
1114
|
+
}
|
|
1115
|
+
}
|
|
941
1116
|
if (newTasks.length > 0) {
|
|
942
1117
|
stage = "insert:newTasks";
|
|
943
1118
|
const inserted = await this.workspaceRepo.insertTasks(newTasks, false);
|
|
@@ -951,7 +1126,27 @@ export class RefineTasksService {
|
|
|
951
1126
|
}
|
|
952
1127
|
}
|
|
953
1128
|
const deps = [];
|
|
1129
|
+
const allowedDeps = [];
|
|
1130
|
+
const skippedDeps = [];
|
|
954
1131
|
for (const dep of pendingDeps) {
|
|
1132
|
+
if (!dep.dependsOnKey)
|
|
1133
|
+
continue;
|
|
1134
|
+
if (this.hasDependencyPath(dependencyGraph, dep.dependsOnKey, dep.childKey)) {
|
|
1135
|
+
skippedDeps.push({ childKey: dep.childKey, dependsOnKey: dep.dependsOnKey });
|
|
1136
|
+
continue;
|
|
1137
|
+
}
|
|
1138
|
+
addEdge(dep.childKey, dep.dependsOnKey);
|
|
1139
|
+
allowedDeps.push(dep);
|
|
1140
|
+
}
|
|
1141
|
+
if (skippedDeps.length > 0) {
|
|
1142
|
+
const sample = skippedDeps
|
|
1143
|
+
.slice(0, 5)
|
|
1144
|
+
.map((dep) => `${dep.childKey}->${dep.dependsOnKey}`)
|
|
1145
|
+
.join(", ");
|
|
1146
|
+
warnings.push(`Skipped ${skippedDeps.length} refine dependencies that would create cycles.` +
|
|
1147
|
+
(sample ? ` Sample: ${sample}` : ""));
|
|
1148
|
+
}
|
|
1149
|
+
for (const dep of allowedDeps) {
|
|
955
1150
|
const childId = idByKey.get(dep.childKey);
|
|
956
1151
|
if (childId) {
|
|
957
1152
|
deps.push({ taskId: childId, dependsOnTaskId: dep.dependsOnId, relationType: dep.relationType });
|
|
@@ -964,12 +1159,11 @@ export class RefineTasksService {
|
|
|
964
1159
|
}
|
|
965
1160
|
// cycle detection on current + new dependencies (by key)
|
|
966
1161
|
const edgeSet = [];
|
|
967
|
-
for (const
|
|
968
|
-
for (const dep of
|
|
969
|
-
edgeSet.push({ from
|
|
1162
|
+
for (const [from, deps] of dependencyGraph.entries()) {
|
|
1163
|
+
for (const dep of deps) {
|
|
1164
|
+
edgeSet.push({ from, to: dep });
|
|
970
1165
|
}
|
|
971
1166
|
}
|
|
972
|
-
edgeSet.push(...dependencyEdges);
|
|
973
1167
|
const hasCycle = this.detectCycle(edgeSet);
|
|
974
1168
|
if (hasCycle) {
|
|
975
1169
|
throw new Error("Dependency cycle detected after refinement; aborting apply.");
|
|
@@ -1096,7 +1290,13 @@ export class RefineTasksService {
|
|
|
1096
1290
|
tokensTotal: promptTokens + completionTokens,
|
|
1097
1291
|
durationSeconds,
|
|
1098
1292
|
timestamp: new Date().toISOString(),
|
|
1099
|
-
metadata: {
|
|
1293
|
+
metadata: {
|
|
1294
|
+
command: "refine-tasks",
|
|
1295
|
+
action: "agent_refine",
|
|
1296
|
+
phase: "agent_refine",
|
|
1297
|
+
attempt: 1,
|
|
1298
|
+
...(metadata ?? {}),
|
|
1299
|
+
},
|
|
1100
1300
|
});
|
|
1101
1301
|
return { raw: output, promptTokens, completionTokens, agentId: agent.id };
|
|
1102
1302
|
}
|
|
@@ -1344,7 +1544,7 @@ export class RefineTasksService {
|
|
|
1344
1544
|
return candidate;
|
|
1345
1545
|
}
|
|
1346
1546
|
};
|
|
1347
|
-
const defaultPlanPath = path.join(this.workspace.
|
|
1547
|
+
const defaultPlanPath = path.join(this.workspace.mcodaDir, "tasks", options.projectKey, "refinements", job.id, "plan.json");
|
|
1348
1548
|
const requestedOutPath = options.planOutPath ? path.resolve(options.planOutPath) : defaultPlanPath;
|
|
1349
1549
|
const outPath = await ensureUniquePath(requestedOutPath);
|
|
1350
1550
|
await fs.mkdir(path.dirname(outPath), { recursive: true });
|
|
@@ -1439,6 +1639,7 @@ export class RefineTasksService {
|
|
|
1439
1639
|
cancelled.push(...x);
|
|
1440
1640
|
storyPointsDelta += delta;
|
|
1441
1641
|
}
|
|
1642
|
+
await this.seedPriorities(options.projectKey);
|
|
1442
1643
|
await this.jobService.updateJobStatus(job.id, "completed", {
|
|
1443
1644
|
payload: {
|
|
1444
1645
|
created: created.length,
|
|
@@ -14,6 +14,7 @@ export interface CodeReviewRequest extends TaskSelectionFilters {
|
|
|
14
14
|
agentName?: string;
|
|
15
15
|
agentStream?: boolean;
|
|
16
16
|
rateAgents?: boolean;
|
|
17
|
+
createFollowupTasks?: boolean;
|
|
17
18
|
resumeJobId?: string;
|
|
18
19
|
abortSignal?: AbortSignal;
|
|
19
20
|
}
|
|
@@ -79,6 +80,7 @@ export declare class CodeReviewService {
|
|
|
79
80
|
});
|
|
80
81
|
static create(workspace: WorkspaceResolution): Promise<CodeReviewService>;
|
|
81
82
|
close(): Promise<void>;
|
|
83
|
+
setDocdexAvailability(available: boolean, reason?: string): void;
|
|
82
84
|
private readPromptFiles;
|
|
83
85
|
private ensureMcoda;
|
|
84
86
|
private loadPrompts;
|
|
@@ -105,7 +107,9 @@ export declare class CodeReviewService {
|
|
|
105
107
|
private writeReviewSummaryComment;
|
|
106
108
|
private persistContext;
|
|
107
109
|
private persistDiff;
|
|
110
|
+
private persistReviewOutput;
|
|
108
111
|
private severityToPriority;
|
|
112
|
+
private severityToStoryPoints;
|
|
109
113
|
private shouldCreateFollowupTask;
|
|
110
114
|
private buildFollowupTitle;
|
|
111
115
|
private buildFollowupDescription;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"CodeReviewService.d.ts","sourceRoot":"","sources":["../../../src/services/review/CodeReviewService.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"CodeReviewService.d.ts","sourceRoot":"","sources":["../../../src/services/review/CodeReviewService.ts"],"names":[],"mappings":"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"}
|