@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.
Files changed (204) hide show
  1. package/README.md +2 -2
  2. package/dist/api/AgentsApi.d.ts +1 -0
  3. package/dist/api/AgentsApi.d.ts.map +1 -1
  4. package/dist/api/AgentsApi.js +136 -11
  5. package/dist/api/QaTasksApi.d.ts.map +1 -1
  6. package/dist/api/QaTasksApi.js +4 -0
  7. package/dist/prompts/PdrPrompts.d.ts.map +1 -1
  8. package/dist/prompts/PdrPrompts.js +6 -0
  9. package/dist/prompts/SdsPrompts.d.ts.map +1 -1
  10. package/dist/prompts/SdsPrompts.js +7 -0
  11. package/dist/services/agents/AgentRatingService.d.ts +19 -0
  12. package/dist/services/agents/AgentRatingService.d.ts.map +1 -1
  13. package/dist/services/agents/AgentRatingService.js +66 -2
  14. package/dist/services/agents/GatewayAgentService.d.ts +8 -0
  15. package/dist/services/agents/GatewayAgentService.d.ts.map +1 -1
  16. package/dist/services/agents/GatewayAgentService.js +462 -65
  17. package/dist/services/agents/GatewayHandoff.d.ts +5 -1
  18. package/dist/services/agents/GatewayHandoff.d.ts.map +1 -1
  19. package/dist/services/agents/GatewayHandoff.js +65 -32
  20. package/dist/services/agents/RoutingService.d.ts +1 -0
  21. package/dist/services/agents/RoutingService.d.ts.map +1 -1
  22. package/dist/services/agents/RoutingService.js +4 -4
  23. package/dist/services/backlog/BacklogService.d.ts +23 -0
  24. package/dist/services/backlog/BacklogService.d.ts.map +1 -1
  25. package/dist/services/backlog/BacklogService.js +62 -7
  26. package/dist/services/backlog/TaskOrderingHeuristics.d.ts +12 -0
  27. package/dist/services/backlog/TaskOrderingHeuristics.d.ts.map +1 -0
  28. package/dist/services/backlog/TaskOrderingHeuristics.js +56 -0
  29. package/dist/services/backlog/TaskOrderingService.d.ts +16 -4
  30. package/dist/services/backlog/TaskOrderingService.d.ts.map +1 -1
  31. package/dist/services/backlog/TaskOrderingService.js +529 -73
  32. package/dist/services/docs/DocInventory.d.ts +11 -0
  33. package/dist/services/docs/DocInventory.d.ts.map +1 -0
  34. package/dist/services/docs/DocInventory.js +230 -0
  35. package/dist/services/docs/DocgenRunContext.d.ts +59 -0
  36. package/dist/services/docs/DocgenRunContext.d.ts.map +1 -0
  37. package/dist/services/docs/DocgenRunContext.js +4 -0
  38. package/dist/services/docs/DocsService.d.ts +59 -2
  39. package/dist/services/docs/DocsService.d.ts.map +1 -1
  40. package/dist/services/docs/DocsService.js +1701 -48
  41. package/dist/services/docs/alignment/DocAlignmentGraph.d.ts +23 -0
  42. package/dist/services/docs/alignment/DocAlignmentGraph.d.ts.map +1 -0
  43. package/dist/services/docs/alignment/DocAlignmentGraph.js +78 -0
  44. package/dist/services/docs/alignment/DocAlignmentPatcher.d.ts +19 -0
  45. package/dist/services/docs/alignment/DocAlignmentPatcher.d.ts.map +1 -0
  46. package/dist/services/docs/alignment/DocAlignmentPatcher.js +222 -0
  47. package/dist/services/docs/patch/DocPatchEngine.d.ts +57 -0
  48. package/dist/services/docs/patch/DocPatchEngine.d.ts.map +1 -0
  49. package/dist/services/docs/patch/DocPatchEngine.js +331 -0
  50. package/dist/services/docs/review/Glossary.d.ts +16 -0
  51. package/dist/services/docs/review/Glossary.d.ts.map +1 -0
  52. package/dist/services/docs/review/Glossary.js +47 -0
  53. package/dist/services/docs/review/ReviewReportRenderer.d.ts +3 -0
  54. package/dist/services/docs/review/ReviewReportRenderer.d.ts.map +1 -0
  55. package/dist/services/docs/review/ReviewReportRenderer.js +133 -0
  56. package/dist/services/docs/review/ReviewReportSchema.d.ts +39 -0
  57. package/dist/services/docs/review/ReviewReportSchema.d.ts.map +1 -0
  58. package/dist/services/docs/review/ReviewReportSchema.js +47 -0
  59. package/dist/services/docs/review/ReviewTypes.d.ts +76 -0
  60. package/dist/services/docs/review/ReviewTypes.d.ts.map +1 -0
  61. package/dist/services/docs/review/ReviewTypes.js +94 -0
  62. package/dist/services/docs/review/gates/AdminOpenApiSpecGate.d.ts +7 -0
  63. package/dist/services/docs/review/gates/AdminOpenApiSpecGate.d.ts.map +1 -0
  64. package/dist/services/docs/review/gates/AdminOpenApiSpecGate.js +93 -0
  65. package/dist/services/docs/review/gates/ApiPathConsistencyGate.d.ts +7 -0
  66. package/dist/services/docs/review/gates/ApiPathConsistencyGate.d.ts.map +1 -0
  67. package/dist/services/docs/review/gates/ApiPathConsistencyGate.js +308 -0
  68. package/dist/services/docs/review/gates/BuildReadyCompletenessGate.d.ts +8 -0
  69. package/dist/services/docs/review/gates/BuildReadyCompletenessGate.d.ts.map +1 -0
  70. package/dist/services/docs/review/gates/BuildReadyCompletenessGate.js +278 -0
  71. package/dist/services/docs/review/gates/DeploymentBlueprintGate.d.ts +8 -0
  72. package/dist/services/docs/review/gates/DeploymentBlueprintGate.d.ts.map +1 -0
  73. package/dist/services/docs/review/gates/DeploymentBlueprintGate.js +487 -0
  74. package/dist/services/docs/review/gates/NoMaybesGate.d.ts +8 -0
  75. package/dist/services/docs/review/gates/NoMaybesGate.d.ts.map +1 -0
  76. package/dist/services/docs/review/gates/NoMaybesGate.js +145 -0
  77. package/dist/services/docs/review/gates/OpenApiCoverageGate.d.ts +7 -0
  78. package/dist/services/docs/review/gates/OpenApiCoverageGate.d.ts.map +1 -0
  79. package/dist/services/docs/review/gates/OpenApiCoverageGate.js +266 -0
  80. package/dist/services/docs/review/gates/OpenApiSchemaSanityGate.d.ts +7 -0
  81. package/dist/services/docs/review/gates/OpenApiSchemaSanityGate.d.ts.map +1 -0
  82. package/dist/services/docs/review/gates/OpenApiSchemaSanityGate.js +59 -0
  83. package/dist/services/docs/review/gates/OpenQuestionsGate.d.ts +7 -0
  84. package/dist/services/docs/review/gates/OpenQuestionsGate.d.ts.map +1 -0
  85. package/dist/services/docs/review/gates/OpenQuestionsGate.js +200 -0
  86. package/dist/services/docs/review/gates/PdrInterfacesGate.d.ts +7 -0
  87. package/dist/services/docs/review/gates/PdrInterfacesGate.d.ts.map +1 -0
  88. package/dist/services/docs/review/gates/PdrInterfacesGate.js +159 -0
  89. package/dist/services/docs/review/gates/PdrOpenQuestionsGate.d.ts +8 -0
  90. package/dist/services/docs/review/gates/PdrOpenQuestionsGate.d.ts.map +1 -0
  91. package/dist/services/docs/review/gates/PdrOpenQuestionsGate.js +129 -0
  92. package/dist/services/docs/review/gates/PdrOwnershipGate.d.ts +7 -0
  93. package/dist/services/docs/review/gates/PdrOwnershipGate.d.ts.map +1 -0
  94. package/dist/services/docs/review/gates/PdrOwnershipGate.js +169 -0
  95. package/dist/services/docs/review/gates/PlaceholderArtifactGate.d.ts +10 -0
  96. package/dist/services/docs/review/gates/PlaceholderArtifactGate.d.ts.map +1 -0
  97. package/dist/services/docs/review/gates/PlaceholderArtifactGate.js +261 -0
  98. package/dist/services/docs/review/gates/RfpConsentGate.d.ts +6 -0
  99. package/dist/services/docs/review/gates/RfpConsentGate.d.ts.map +1 -0
  100. package/dist/services/docs/review/gates/RfpConsentGate.js +127 -0
  101. package/dist/services/docs/review/gates/RfpDefinitionGate.d.ts +7 -0
  102. package/dist/services/docs/review/gates/RfpDefinitionGate.d.ts.map +1 -0
  103. package/dist/services/docs/review/gates/RfpDefinitionGate.js +173 -0
  104. package/dist/services/docs/review/gates/SdsAdaptersGate.d.ts +7 -0
  105. package/dist/services/docs/review/gates/SdsAdaptersGate.d.ts.map +1 -0
  106. package/dist/services/docs/review/gates/SdsAdaptersGate.js +196 -0
  107. package/dist/services/docs/review/gates/SdsDecisionsGate.d.ts +7 -0
  108. package/dist/services/docs/review/gates/SdsDecisionsGate.d.ts.map +1 -0
  109. package/dist/services/docs/review/gates/SdsDecisionsGate.js +89 -0
  110. package/dist/services/docs/review/gates/SdsOpsGate.d.ts +7 -0
  111. package/dist/services/docs/review/gates/SdsOpsGate.d.ts.map +1 -0
  112. package/dist/services/docs/review/gates/SdsOpsGate.js +162 -0
  113. package/dist/services/docs/review/gates/SdsPolicyTelemetryGate.d.ts +7 -0
  114. package/dist/services/docs/review/gates/SdsPolicyTelemetryGate.d.ts.map +1 -0
  115. package/dist/services/docs/review/gates/SdsPolicyTelemetryGate.js +166 -0
  116. package/dist/services/docs/review/gates/SqlRequiredTablesGate.d.ts +7 -0
  117. package/dist/services/docs/review/gates/SqlRequiredTablesGate.d.ts.map +1 -0
  118. package/dist/services/docs/review/gates/SqlRequiredTablesGate.js +273 -0
  119. package/dist/services/docs/review/gates/SqlSyntaxGate.d.ts +7 -0
  120. package/dist/services/docs/review/gates/SqlSyntaxGate.d.ts.map +1 -0
  121. package/dist/services/docs/review/gates/SqlSyntaxGate.js +203 -0
  122. package/dist/services/docs/review/gates/TerminologyNormalizationGate.d.ts +9 -0
  123. package/dist/services/docs/review/gates/TerminologyNormalizationGate.d.ts.map +1 -0
  124. package/dist/services/docs/review/gates/TerminologyNormalizationGate.js +217 -0
  125. package/dist/services/docs/review/glossary.json +47 -0
  126. package/dist/services/estimate/EstimateService.d.ts +2 -0
  127. package/dist/services/estimate/EstimateService.d.ts.map +1 -1
  128. package/dist/services/estimate/EstimateService.js +66 -18
  129. package/dist/services/estimate/VelocityService.d.ts +4 -0
  130. package/dist/services/estimate/VelocityService.d.ts.map +1 -1
  131. package/dist/services/estimate/VelocityService.js +179 -36
  132. package/dist/services/estimate/types.d.ts +1 -0
  133. package/dist/services/estimate/types.d.ts.map +1 -1
  134. package/dist/services/execution/GatewayTrioService.d.ts +71 -4
  135. package/dist/services/execution/GatewayTrioService.d.ts.map +1 -1
  136. package/dist/services/execution/GatewayTrioService.js +1695 -328
  137. package/dist/services/execution/QaApiRunner.d.ts +30 -0
  138. package/dist/services/execution/QaApiRunner.d.ts.map +1 -0
  139. package/dist/services/execution/QaApiRunner.js +881 -0
  140. package/dist/services/execution/QaFollowupService.d.ts +1 -0
  141. package/dist/services/execution/QaFollowupService.d.ts.map +1 -1
  142. package/dist/services/execution/QaFollowupService.js +8 -2
  143. package/dist/services/execution/QaPlanValidator.d.ts +10 -0
  144. package/dist/services/execution/QaPlanValidator.d.ts.map +1 -0
  145. package/dist/services/execution/QaPlanValidator.js +128 -0
  146. package/dist/services/execution/QaProfileService.d.ts +21 -1
  147. package/dist/services/execution/QaProfileService.d.ts.map +1 -1
  148. package/dist/services/execution/QaProfileService.js +214 -29
  149. package/dist/services/execution/QaTasksService.d.ts +41 -1
  150. package/dist/services/execution/QaTasksService.d.ts.map +1 -1
  151. package/dist/services/execution/QaTasksService.js +2851 -500
  152. package/dist/services/execution/QaTestCommandBuilder.d.ts +51 -0
  153. package/dist/services/execution/QaTestCommandBuilder.d.ts.map +1 -0
  154. package/dist/services/execution/QaTestCommandBuilder.js +495 -0
  155. package/dist/services/execution/TaskSelectionService.d.ts +4 -2
  156. package/dist/services/execution/TaskSelectionService.d.ts.map +1 -1
  157. package/dist/services/execution/TaskSelectionService.js +144 -28
  158. package/dist/services/execution/TaskStateService.d.ts +19 -6
  159. package/dist/services/execution/TaskStateService.d.ts.map +1 -1
  160. package/dist/services/execution/TaskStateService.js +128 -13
  161. package/dist/services/execution/WorkOnTasksService.d.ts +19 -2
  162. package/dist/services/execution/WorkOnTasksService.d.ts.map +1 -1
  163. package/dist/services/execution/WorkOnTasksService.js +3913 -1225
  164. package/dist/services/jobs/JobInsightsService.d.ts +4 -0
  165. package/dist/services/jobs/JobInsightsService.d.ts.map +1 -1
  166. package/dist/services/jobs/JobInsightsService.js +51 -5
  167. package/dist/services/jobs/JobResumeService.d.ts.map +1 -1
  168. package/dist/services/jobs/JobResumeService.js +23 -10
  169. package/dist/services/jobs/JobService.d.ts +56 -4
  170. package/dist/services/jobs/JobService.d.ts.map +1 -1
  171. package/dist/services/jobs/JobService.js +232 -1
  172. package/dist/services/openapi/OpenApiService.d.ts +41 -0
  173. package/dist/services/openapi/OpenApiService.d.ts.map +1 -1
  174. package/dist/services/openapi/OpenApiService.js +889 -98
  175. package/dist/services/planning/CreateTasksService.d.ts +15 -0
  176. package/dist/services/planning/CreateTasksService.d.ts.map +1 -1
  177. package/dist/services/planning/CreateTasksService.js +311 -6
  178. package/dist/services/planning/RefineTasksService.d.ts +4 -0
  179. package/dist/services/planning/RefineTasksService.d.ts.map +1 -1
  180. package/dist/services/planning/RefineTasksService.js +225 -24
  181. package/dist/services/review/CodeReviewService.d.ts +4 -0
  182. package/dist/services/review/CodeReviewService.d.ts.map +1 -1
  183. package/dist/services/review/CodeReviewService.js +778 -232
  184. package/dist/services/review/ReviewNormalizer.d.ts +9 -0
  185. package/dist/services/review/ReviewNormalizer.d.ts.map +1 -0
  186. package/dist/services/review/ReviewNormalizer.js +147 -0
  187. package/dist/services/shared/AuthErrors.d.ts +3 -0
  188. package/dist/services/shared/AuthErrors.d.ts.map +1 -0
  189. package/dist/services/shared/AuthErrors.js +17 -0
  190. package/dist/services/shared/DocdexGuidance.d.ts +7 -0
  191. package/dist/services/shared/DocdexGuidance.d.ts.map +1 -0
  192. package/dist/services/shared/DocdexGuidance.js +12 -0
  193. package/dist/services/shared/ProjectGuidance.d.ts +12 -1
  194. package/dist/services/shared/ProjectGuidance.d.ts.map +1 -1
  195. package/dist/services/shared/ProjectGuidance.js +64 -7
  196. package/dist/services/system/ToolDenylist.d.ts +13 -0
  197. package/dist/services/system/ToolDenylist.d.ts.map +1 -0
  198. package/dist/services/system/ToolDenylist.js +85 -0
  199. package/dist/services/telemetry/TelemetryService.d.ts.map +1 -1
  200. package/dist/services/telemetry/TelemetryService.js +39 -7
  201. package/dist/workspace/WorkspaceManager.d.ts +22 -0
  202. package/dist/workspace/WorkspaceManager.d.ts.map +1 -1
  203. package/dist/workspace/WorkspaceManager.js +203 -32
  204. 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(["ready_to_review", "ready_to_qa", "completed"]);
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
- const resolved = await this.routingService.resolveAgentForCommand({
212
- workspace: this.workspace,
213
- commandName: "refine-tasks",
214
- overrideAgentSlug: agentName,
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 resolved.agent;
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: updates.status ?? "not_started",
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 ready_to_review/qa/completed).",
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 metadata = this.mergeMetadata(target.metadata, op.updates.metadata);
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: this.mergeMetadata(target.metadata, op.parentUpdates.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: this.mergeMetadata(before.metadata, op.parentUpdates.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: this.mergeMetadata({}, child.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({ childKey, dependsOnId: depTask.id, relationType: "blocks" });
853
- dependencyEdges.push({ from: childKey, to: depTask.key });
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: this.mergeMetadata(target.metadata, op.updates.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: this.mergeMetadata(before.metadata, op.updates.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: { ...target, storyPoints: afterSp, type: op.type ?? target.type ?? null, priority: op.priority ?? target.priority ?? null },
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 task of group.tasks) {
968
- for (const dep of task.dependencies) {
969
- edgeSet.push({ from: task.key, to: dep });
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: { command: "refine-tasks", action: "agent_refine", ...(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.workspaceRoot, ".mcoda", "tasks", options.projectKey, "refinements", job.id, "plan.json");
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":"AAEA,OAAO,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAC7C,OAAO,EAAE,YAAY,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAC;AAC9D,OAAO,EACL,gBAAgB,EAChB,mBAAmB,EAMpB,MAAM,WAAW,CAAC;AAEnB,OAAO,EAAE,mBAAmB,EAAE,MAAM,qCAAqC,CAAC;AAC1E,OAAO,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAC;AACnD,OAAO,EAAE,oBAAoB,EAAE,oBAAoB,EAAE,MAAM,sCAAsC,CAAC;AAClG,OAAO,EAAE,gBAAgB,EAAE,MAAM,kCAAkC,CAAC;AAIpE,OAAO,EAAE,cAAc,EAAE,MAAM,6BAA6B,CAAC;AAC7D,OAAO,EAAE,kBAAkB,EAAE,MAAM,iCAAiC,CAAC;AAuBrE,MAAM,WAAW,iBAAkB,SAAQ,oBAAoB;IAC7D,SAAS,EAAE,mBAAmB,CAAC;IAC/B,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,WAAW,CAAC,EAAE,WAAW,CAAC;CAC3B;AAED,MAAM,WAAW,aAAa;IAC5B,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED,MAAM,WAAW,iBAAiB;IAChC,QAAQ,EAAE,SAAS,GAAG,mBAAmB,GAAG,OAAO,GAAG,WAAW,CAAC;IAClE,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,aAAa,EAAE,CAAC;IAC1B,mBAAmB,CAAC,EAAE,MAAM,EAAE,CAAC;IAC/B,aAAa,CAAC,EAAE,MAAM,EAAE,CAAC;IACzB,eAAe,CAAC,EAAE,MAAM,EAAE,CAAC;IAC3B,GAAG,CAAC,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,gBAAgB;IAC/B,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;IAChB,YAAY,EAAE,MAAM,CAAC;IACrB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,EAAE,iBAAiB,CAAC,UAAU,CAAC,CAAC;IACzC,QAAQ,EAAE,aAAa,EAAE,CAAC;IAC1B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,aAAa,CAAC,EAAE;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAC;QAAC,WAAW,EAAE,MAAM,CAAC;QAAC,OAAO,CAAC,EAAE,OAAO,CAAA;KAAE,EAAE,CAAC;CAC/G;AAED,MAAM,WAAW,gBAAgB;IAC/B,KAAK,EAAE,MAAM,CAAC;IACd,YAAY,EAAE,MAAM,CAAC;IACrB,KAAK,EAAE,gBAAgB,EAAE,CAAC;IAC1B,QAAQ,EAAE,MAAM,EAAE,CAAC;CACpB;AA4OD,qBAAa,iBAAiB;IAS1B,OAAO,CAAC,SAAS;IACjB,OAAO,CAAC,IAAI;IATd,OAAO,CAAC,gBAAgB,CAAuB;IAC/C,OAAO,CAAC,YAAY,CAAmB;IACvC,OAAO,CAAC,GAAG,CAAY;IACvB,OAAO,CAAC,UAAU,CAA6B;IAC/C,OAAO,CAAC,cAAc,CAAiB;IACvC,OAAO,CAAC,aAAa,CAAC,CAAqB;gBAGjC,SAAS,EAAE,mBAAmB,EAC9B,IAAI,EAAE;QACZ,YAAY,EAAE,YAAY,CAAC;QAC3B,MAAM,EAAE,YAAY,CAAC;QACrB,UAAU,EAAE,UAAU,CAAC;QACvB,aAAa,EAAE,mBAAmB,CAAC;QACnC,gBAAgB,CAAC,EAAE,oBAAoB,CAAC;QACxC,YAAY,CAAC,EAAE,gBAAgB,CAAC;QAChC,IAAI,EAAE,gBAAgB,CAAC;QACvB,SAAS,CAAC,EAAE,SAAS,CAAC;QACtB,cAAc,EAAE,cAAc,CAAC;QAC/B,aAAa,CAAC,EAAE,kBAAkB,CAAC;KACpC;WASU,MAAM,CAAC,SAAS,EAAE,mBAAmB,GAAG,OAAO,CAAC,iBAAiB,CAAC;IA0BzE,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;YAkBd,eAAe;YAkBf,WAAW;YAcX,WAAW;YAmCX,wBAAwB;YAuBxB,YAAY;IAS1B,OAAO,CAAC,mBAAmB;IAY3B,OAAO,CAAC,qBAAqB;YAUf,iBAAiB;YAoCjB,YAAY;YAUZ,SAAS;YAST,eAAe;IAI7B,OAAO,CAAC,uBAAuB;YAiBjB,gBAAgB;IAsD9B,OAAO,CAAC,iBAAiB;YAoDX,mBAAmB;YA+BnB,kBAAkB;IAShC,OAAO,CAAC,cAAc;IAQtB,OAAO,CAAC,qBAAqB;IAW7B,OAAO,CAAC,kBAAkB;YAcZ,uBAAuB;IAiKrC,OAAO,CAAC,oBAAoB;YAWd,iBAAiB;YA6CjB,SAAS;YA+BT,yBAAyB;YAyCzB,cAAc;YAUd,WAAW;IA+BzB,OAAO,CAAC,kBAAkB;IAO1B,OAAO,CAAC,wBAAwB;IAYhC,OAAO,CAAC,kBAAkB;IAQ1B,OAAO,CAAC,wBAAwB;YAalB,uBAAuB;YAkDvB,8BAA8B;IAuFtC,WAAW,CAAC,OAAO,EAAE,iBAAiB,GAAG,OAAO,CAAC,gBAAgB,CAAC;IA2uBxE,OAAO,CAAC,eAAe;CAMxB"}
1
+ {"version":3,"file":"CodeReviewService.d.ts","sourceRoot":"","sources":["../../../src/services/review/CodeReviewService.ts"],"names":[],"mappings":"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"}