@mcoda/core 0.1.17 → 0.1.19

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.
@@ -1 +1 @@
1
- {"version":3,"file":"TaskOrderingService.d.ts","sourceRoot":"","sources":["../../../src/services/backlog/TaskOrderingService.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"TaskOrderingService.d.ts","sourceRoot":"","sources":["../../../src/services/backlog/TaskOrderingService.ts"],"names":[],"mappings":"AAMA,OAAO,EAAE,mBAAmB,EAAE,MAAM,qCAAqC,CAAC;AAG1E,OAAO,EAAgB,SAAS,EAAE,MAAM,6BAA6B,CAAC;AAiDtE,UAAU,UAAU;IAClB,EAAE,EAAE,MAAM,CAAC;IACX,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CACtB;AAED,UAAU,OAAO;IACf,EAAE,EAAE,MAAM,CAAC;IACX,GAAG,EAAE,MAAM,CAAC;IACZ,UAAU,EAAE,MAAM,CAAC;IACnB,KAAK,EAAE,MAAM,CAAC;CACf;AAsCD,UAAU,gBAAgB;IACxB,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,aAAa;IAC5B,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC;IACnB,cAAc,EAAE,MAAM,EAAE,CAAC;IACzB,gBAAgB,EAAE,gBAAgB,CAAC;IACnC,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAAC;CAC3C;AAED,MAAM,WAAW,kBAAkB;IACjC,OAAO,EAAE,UAAU,CAAC;IACpB,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,OAAO,EAAE,aAAa,EAAE,CAAC;IACzB,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED,MAAM,WAAW,kBAAkB;IACjC,OAAO,EAAE,MAAM,CAAC;IAChB,aAAa,EAAE,MAAM,EAAE,CAAC;CACzB;AAED,MAAM,WAAW,mBAAmB;IAClC,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,YAAY,CAAC,EAAE,MAAM,EAAE,CAAC;IACxB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,UAAU,CAAC,EAAE,SAAS,EAAE,CAAC;IACzB,oBAAoB,CAAC,EAAE,OAAO,CAAC;IAC/B,iBAAiB,CAAC,EAAE,OAAO,CAAC;CAC7B;AAmFD,eAAO,MAAM,8BAA8B,GACzC,QAAQ,MAAM,EACd,eAAe,GAAG,CAAC,MAAM,CAAC,EAC1B,UAAU,MAAM,EAAE,KACjB,kBAAkB,EA2EpB,CAAC;AAEF,qBAAa,mBAAmB;IAE5B,OAAO,CAAC,SAAS;IACjB,OAAO,CAAC,EAAE;IACV,OAAO,CAAC,IAAI;IACZ,OAAO,CAAC,UAAU;IAClB,OAAO,CAAC,YAAY;IACpB,OAAO,CAAC,UAAU;IAClB,OAAO,CAAC,cAAc;IACtB,OAAO,CAAC,MAAM;IACd,OAAO,CAAC,eAAe;IATzB,OAAO;WAYM,MAAM,CACjB,SAAS,EAAE,mBAAmB,EAC9B,OAAO,GAAE;QAAE,eAAe,CAAC,EAAE,OAAO,CAAA;KAAO,GAC1C,OAAO,CAAC,mBAAmB,CAAC;YAsCjB,eAAe;IAsCvB,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;YAgBd,UAAU;YAQV,OAAO;YASP,QAAQ;YAeR,UAAU;YAkEV,iBAAiB;YAyBjB,kBAAkB;IAgBhC,OAAO,CAAC,mBAAmB;IA8B3B,OAAO,CAAC,qBAAqB;IAgB7B,OAAO,CAAC,oBAAoB;IAkB5B,OAAO,CAAC,iBAAiB;YAkBX,4BAA4B;YA8E5B,yBAAyB;IA6EvC,OAAO,CAAC,YAAY;IAgDpB,OAAO,CAAC,eAAe;IAoDvB,OAAO,CAAC,UAAU;YAuCJ,YAAY;YASZ,WAAW;IAwBzB,OAAO,CAAC,iBAAiB;YAqCX,0BAA0B;YAmD1B,iBAAiB;IAqC/B,OAAO,CAAC,SAAS;IAyBX,UAAU,CAAC,OAAO,EAAE,mBAAmB,GAAG,OAAO,CAAC,kBAAkB,CAAC;CA+Q5E"}
@@ -9,6 +9,7 @@ import { classifyTask } from "./TaskOrderingHeuristics.js";
9
9
  const DEFAULT_STATUSES = ["not_started", "in_progress", "changes_requested", READY_TO_CODE_REVIEW, "ready_to_qa"];
10
10
  const DONE_STATUSES = new Set(["completed", "cancelled"]);
11
11
  const DEFAULT_STAGE_ORDER = ["foundation", "backend", "frontend", "other"];
12
+ const PLANNING_DOC_HINT_PATTERN = /(sds|pdr|rfp|requirements|architecture|openapi|swagger|design)/i;
12
13
  const STATUS_RANK = {
13
14
  in_progress: 0,
14
15
  changes_requested: 0,
@@ -230,10 +231,21 @@ export class TaskOrderingService {
230
231
  }
231
232
  async buildDocContext(projectKey, warnings) {
232
233
  try {
233
- const docs = await this.docdex.search({ docType: "SDS", projectKey });
234
+ let docs = await this.docdex.search({ docType: "SDS", projectKey });
235
+ if (!docs.length) {
236
+ docs = await this.docdex.search({
237
+ projectKey,
238
+ profile: "workspace-code",
239
+ query: "sds requirements architecture openapi",
240
+ });
241
+ }
234
242
  if (!docs.length)
235
243
  return undefined;
236
- const doc = docs[0];
244
+ const doc = docs.find((entry) => {
245
+ const type = (entry.docType ?? "").toLowerCase();
246
+ const label = `${entry.path ?? ""} ${entry.title ?? ""}`.toLowerCase();
247
+ return type.includes("sds") || type.includes("pdr") || type.includes("rfp") || PLANNING_DOC_HINT_PATTERN.test(label);
248
+ }) ?? docs[0];
237
249
  const segments = (doc.segments ?? []).slice(0, 3);
238
250
  const body = segments.length > 0
239
251
  ? segments
@@ -323,9 +335,11 @@ export class TaskOrderingService {
323
335
  t.assignee_human,
324
336
  t.epic_id,
325
337
  e.key as epic_key,
338
+ e.priority as epic_priority,
326
339
  t.user_story_id as story_id,
327
340
  us.key as story_key,
328
341
  us.title as story_title,
342
+ us.priority as story_priority,
329
343
  t.created_at,
330
344
  t.updated_at,
331
345
  t.metadata_json
@@ -339,6 +353,8 @@ export class TaskOrderingService {
339
353
  ...row,
340
354
  story_points: row.story_points ?? null,
341
355
  priority: row.priority ?? null,
356
+ epic_priority: row.epic_priority ?? null,
357
+ story_priority: row.story_priority ?? null,
342
358
  metadata: row.metadata_json ? JSON.parse(row.metadata_json) : null,
343
359
  }));
344
360
  }
@@ -604,6 +620,14 @@ export class TaskOrderingService {
604
620
  }
605
621
  }
606
622
  compareTasks(a, b, impact, agentRank, stageOrderMap) {
623
+ const epicPriorityA = a.epic_priority ?? Number.MAX_SAFE_INTEGER;
624
+ const epicPriorityB = b.epic_priority ?? Number.MAX_SAFE_INTEGER;
625
+ if (epicPriorityA !== epicPriorityB)
626
+ return epicPriorityA - epicPriorityB;
627
+ const storyPriorityA = a.story_priority ?? Number.MAX_SAFE_INTEGER;
628
+ const storyPriorityB = b.story_priority ?? Number.MAX_SAFE_INTEGER;
629
+ if (storyPriorityA !== storyPriorityB)
630
+ return storyPriorityA - storyPriorityB;
607
631
  const priorityA = a.priority ?? Number.MAX_SAFE_INTEGER;
608
632
  const priorityB = b.priority ?? Number.MAX_SAFE_INTEGER;
609
633
  if (priorityA !== priorityB)
@@ -8,6 +8,8 @@ export declare class EstimateService {
8
8
  private computeElapsedLaneHours;
9
9
  private computeDurations;
10
10
  private computeEtas;
11
+ private buildStatusCounts;
12
+ private buildCompletion;
11
13
  estimate(options: Omit<EstimateOptions, "workspace">): Promise<EstimateResult>;
12
14
  close(): Promise<void>;
13
15
  }
@@ -1 +1 @@
1
- {"version":3,"file":"EstimateService.d.ts","sourceRoot":"","sources":["../../../src/services/estimate/EstimateService.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAmC,eAAe,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAEnG,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,qCAAqC,CAAC;AAI/E,qBAAa,eAAe;IACN,OAAO,CAAC,SAAS;IAArC,OAAO;WAEM,MAAM,CAAC,SAAS,EAAE,mBAAmB,GAAG,OAAO,CAAC,eAAe,CAAC;IAI7E,OAAO,CAAC,UAAU;YAMJ,uBAAuB;IAmCrC,OAAO,CAAC,gBAAgB;IA8BxB,OAAO,CAAC,WAAW;IA+Bb,QAAQ,CAAC,OAAO,EAAE,IAAI,CAAC,eAAe,EAAE,WAAW,CAAC,GAAG,OAAO,CAAC,cAAc,CAAC;IAwD9E,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;CAG7B"}
1
+ {"version":3,"file":"EstimateService.d.ts","sourceRoot":"","sources":["../../../src/services/estimate/EstimateService.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAmC,eAAe,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAEnG,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,qCAAqC,CAAC;AAI/E,qBAAa,eAAe;IACN,OAAO,CAAC,SAAS;IAArC,OAAO;WAEM,MAAM,CAAC,SAAS,EAAE,mBAAmB,GAAG,OAAO,CAAC,eAAe,CAAC;IAI7E,OAAO,CAAC,UAAU;YAMJ,uBAAuB;IAmCrC,OAAO,CAAC,gBAAgB;IA8BxB,OAAO,CAAC,WAAW;IA+BnB,OAAO,CAAC,iBAAiB;IAoBzB,OAAO,CAAC,eAAe;IA0BjB,QAAQ,CAAC,OAAO,EAAE,IAAI,CAAC,eAAe,EAAE,WAAW,CAAC,GAAG,OAAO,CAAC,cAAc,CAAC;IA4D9E,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;CAG7B"}
@@ -91,6 +91,56 @@ export class EstimateService {
91
91
  completeEta,
92
92
  };
93
93
  }
94
+ buildStatusCounts(backlogTasks) {
95
+ const counts = {
96
+ total: backlogTasks.length,
97
+ readyToCodeReview: 0,
98
+ failed: 0,
99
+ inProgress: 0,
100
+ readyToQa: 0,
101
+ completed: 0,
102
+ };
103
+ for (const task of backlogTasks) {
104
+ const status = task.status.trim().toLowerCase();
105
+ if (status === "ready_to_code_review")
106
+ counts.readyToCodeReview += 1;
107
+ if (status === "failed")
108
+ counts.failed += 1;
109
+ if (status === "in_progress")
110
+ counts.inProgress += 1;
111
+ if (status === "ready_to_qa")
112
+ counts.readyToQa += 1;
113
+ if (status === "completed")
114
+ counts.completed += 1;
115
+ }
116
+ return counts;
117
+ }
118
+ buildCompletion(statusCounts) {
119
+ const ratio = (done, total) => {
120
+ if (!total || total <= 0)
121
+ return 0;
122
+ return Math.max(0, Math.min(100, (done / total) * 100));
123
+ };
124
+ const workDone = statusCounts.readyToCodeReview + statusCounts.readyToQa + statusCounts.completed;
125
+ const qaDone = statusCounts.readyToQa + statusCounts.completed;
126
+ return {
127
+ workOnTasks: {
128
+ done: workDone,
129
+ total: statusCounts.total,
130
+ percent: ratio(workDone, statusCounts.total),
131
+ },
132
+ readyToQa: {
133
+ done: qaDone,
134
+ total: statusCounts.total,
135
+ percent: ratio(qaDone, statusCounts.total),
136
+ },
137
+ done: {
138
+ done: statusCounts.completed,
139
+ total: statusCounts.total,
140
+ percent: ratio(statusCounts.completed, statusCounts.total),
141
+ },
142
+ };
143
+ }
94
144
  async estimate(options) {
95
145
  const backlogService = await BacklogService.create(this.workspace);
96
146
  let backlogTotals;
@@ -131,6 +181,8 @@ export class EstimateService {
131
181
  const elapsedImplementationHours = await this.computeElapsedLaneHours(inProgressTaskIds, "in_progress");
132
182
  const durationsHours = this.computeDurations(backlogTotals, effectiveVelocity, elapsedImplementationHours);
133
183
  const etas = this.computeEtas(backlogTotals, effectiveVelocity, durationsHours);
184
+ const statusCounts = this.buildStatusCounts(backlogTasks);
185
+ const completion = this.buildCompletion(statusCounts);
134
186
  return {
135
187
  scope: {
136
188
  workspaceId: this.workspace.workspaceId,
@@ -143,6 +195,8 @@ export class EstimateService {
143
195
  effectiveVelocity,
144
196
  durationsHours,
145
197
  etas,
198
+ statusCounts,
199
+ completion,
146
200
  };
147
201
  }
148
202
  async close() {
@@ -1 +1 @@
1
- {"version":3,"file":"WorkOnTasksService.d.ts","sourceRoot":"","sources":["../../../src/services/execution/WorkOnTasksService.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"WorkOnTasksService.d.ts","sourceRoot":"","sources":["../../../src/services/execution/WorkOnTasksService.ts"],"names":[],"mappings":"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"}
@@ -38,7 +38,7 @@ const DEFAULT_CODE_WRITER_PROMPT = [
38
38
  "Use docdex snippets to ground decisions (data model, offline/online expectations, constraints, acceptance criteria).",
39
39
  "When a comment backlog is provided (code-review/qa-tasks), resolve those items first and do not mark a slug resolved unless you made real repo changes that address it.",
40
40
  "Do not ignore the main task description or acceptance criteria; address them after resolving comment backlog items.",
41
- "Re-use existing store/slices/adapters and tests; avoid inventing new backends or ad-hoc actions. Keep behavior backward-compatible and scoped to the documented contracts.",
41
+ "Re-use existing store/slices/adapters and documented product patterns; avoid inventing new backends or ad-hoc actions. Prioritize product behavior changes first, then align tests.",
42
42
  "Do not hardcode ports. Read PORT/HOST (or MCODA_QA_PORT/MCODA_QA_HOST) from env, and document base URLs with http://localhost:<PORT> placeholders when needed.",
43
43
  "Do not create docs/qa/* reports unless the task explicitly requests one. Work-on-tasks should not generate QA reports.",
44
44
  "If you encounter merge conflicts or conflict markers, stop and report; do not attempt to merge them.",
@@ -1330,6 +1330,125 @@ const findOutOfScopeActionPaths = (actions, workspaceRoot) => {
1330
1330
  return Array.from(invalid);
1331
1331
  };
1332
1332
  const normalizePaths = (workspaceRoot, files) => files.map((f) => PathHelper.resolveRelativePath(workspaceRoot, f));
1333
+ const DOC_CONTEXT_QUERY_TOKEN_LIMIT = 24;
1334
+ const DOC_CONTEXT_QUERY_MAX_CHARS = 320;
1335
+ const DOC_CONTEXT_STOP_WORDS = new Set([
1336
+ "and",
1337
+ "the",
1338
+ "for",
1339
+ "with",
1340
+ "that",
1341
+ "this",
1342
+ "from",
1343
+ "into",
1344
+ "onto",
1345
+ "task",
1346
+ "story",
1347
+ "epic",
1348
+ "add",
1349
+ "update",
1350
+ "implement",
1351
+ "ensure",
1352
+ "support",
1353
+ "across",
1354
+ "should",
1355
+ "must",
1356
+ "able",
1357
+ "when",
1358
+ "then",
1359
+ "than",
1360
+ "using",
1361
+ "user",
1362
+ "users",
1363
+ "project",
1364
+ ]);
1365
+ const TEST_CONTEXT_PATH_PATTERN = /(^|[\\/])(__tests__|tests?|specs?|fixtures?|mocks?)([\\/]|$)|\.(test|spec)\.[cm]?[jt]sx?$/i;
1366
+ const DOC_PATH_PATTERN = /(^|[\\/])docs?([\\/]|$)|\.(md|mdx|rst|adoc)$/i;
1367
+ const TEST_TASK_HINT_PATTERN = /\b(test|tests|qa|quality|e2e|unit|integration|spec|regression|coverage|benchmark|throughput|resilience|audit)\b/i;
1368
+ const DOC_TASK_HINT_PATTERN = /\b(doc|docs|documentation|readme|sds|rfp|openapi|changelog|guide)\b/i;
1369
+ const normalizeMatcherPath = (value) => value.replace(/\\/g, "/").replace(/^\.\/+/, "").toLowerCase();
1370
+ const isTestLikePath = (value) => {
1371
+ if (!value)
1372
+ return false;
1373
+ return TEST_CONTEXT_PATH_PATTERN.test(normalizeMatcherPath(value));
1374
+ };
1375
+ const isDocumentationPath = (value) => {
1376
+ if (!value)
1377
+ return false;
1378
+ return DOC_PATH_PATTERN.test(normalizeMatcherPath(value));
1379
+ };
1380
+ const buildTaskTextBlob = (task) => [
1381
+ task.type,
1382
+ task.title,
1383
+ task.description,
1384
+ task.epicTitle,
1385
+ task.storyTitle,
1386
+ task.storyDescription,
1387
+ ...(task.acceptanceCriteria ?? []),
1388
+ ]
1389
+ .filter((value) => typeof value === "string" && value.trim().length > 0)
1390
+ .join(" ");
1391
+ const isTestFocusedTask = (task) => TEST_TASK_HINT_PATTERN.test(buildTaskTextBlob(task)) ||
1392
+ (task.type ?? "").toLowerCase().includes("test") ||
1393
+ (task.type ?? "").toLowerCase().includes("qa");
1394
+ const isDocumentationFocusedTask = (task) => DOC_TASK_HINT_PATTERN.test(buildTaskTextBlob(task));
1395
+ const normalizeBoolean = (value) => value === true || value === "true";
1396
+ const allowsTestsOnlyCompletion = (task, metadata, allowedFiles) => {
1397
+ if (normalizeBoolean(metadata.allow_doc_edits) || normalizeBoolean(metadata.allowDocEdits)) {
1398
+ return true;
1399
+ }
1400
+ if (normalizeBoolean(metadata.allow_large_doc_edits) || normalizeBoolean(metadata.allowLargeDocEdits)) {
1401
+ return true;
1402
+ }
1403
+ if (normalizeBoolean(metadata.allow_tests_only_completion) || normalizeBoolean(metadata.allowTestOnlyCompletion)) {
1404
+ return true;
1405
+ }
1406
+ if (isTestFocusedTask(task) || isDocumentationFocusedTask(task)) {
1407
+ return true;
1408
+ }
1409
+ if (allowedFiles.length > 0 && allowedFiles.every((file) => isTestLikePath(file) || isDocumentationPath(file))) {
1410
+ return true;
1411
+ }
1412
+ return false;
1413
+ };
1414
+ const hasProductTouchedFiles = (touchedFiles) => touchedFiles.some((file) => !isTestLikePath(file) && !isDocumentationPath(file));
1415
+ const buildDocContextQuery = (task, allowedFiles) => {
1416
+ const seeds = [
1417
+ task.key,
1418
+ task.title,
1419
+ task.description,
1420
+ task.epicTitle,
1421
+ task.storyTitle,
1422
+ task.storyDescription,
1423
+ ...(task.acceptanceCriteria ?? []),
1424
+ ...allowedFiles.map((file) => path.basename(file)),
1425
+ ];
1426
+ const tokens = [];
1427
+ const seen = new Set();
1428
+ for (const seed of seeds) {
1429
+ if (!seed)
1430
+ continue;
1431
+ const rawTokens = seed.toLowerCase().split(/[^a-z0-9]+/g);
1432
+ for (const token of rawTokens) {
1433
+ if (token.length < 3)
1434
+ continue;
1435
+ if (DOC_CONTEXT_STOP_WORDS.has(token))
1436
+ continue;
1437
+ if (seen.has(token))
1438
+ continue;
1439
+ seen.add(token);
1440
+ tokens.push(token);
1441
+ if (tokens.length >= DOC_CONTEXT_QUERY_TOKEN_LIMIT)
1442
+ break;
1443
+ }
1444
+ if (tokens.length >= DOC_CONTEXT_QUERY_TOKEN_LIMIT)
1445
+ break;
1446
+ }
1447
+ if (!tokens.length)
1448
+ return undefined;
1449
+ const query = tokens.join(" ").slice(0, DOC_CONTEXT_QUERY_MAX_CHARS).trim();
1450
+ return query || undefined;
1451
+ };
1333
1452
  const resolveLockTtlSeconds = (maxAgentSeconds) => {
1334
1453
  if (!maxAgentSeconds || maxAgentSeconds <= 0)
1335
1454
  return TASK_LOCK_TTL_SECONDS;
@@ -2141,11 +2260,13 @@ export class WorkOnTasksService {
2141
2260
  await this.logTask(taskRunId, `${phase}:${status}`, phase, payload);
2142
2261
  await this.checkpoint(jobId, `task:${taskKey}:${phase}:${status}`, payload);
2143
2262
  }
2144
- async gatherDocContext(projectKey, docLinks = []) {
2263
+ async gatherDocContext(task, projectKey, docLinks = [], allowedFiles = []) {
2145
2264
  const warnings = [];
2146
2265
  const parts = [];
2147
2266
  let openApiIncluded = false;
2148
2267
  let docdexUnavailable = false;
2268
+ const includeTestDocs = isTestFocusedTask(task);
2269
+ const docQuery = buildDocContextQuery(task, allowedFiles);
2149
2270
  const shouldIncludeDocType = (docType) => {
2150
2271
  if (docType.toUpperCase() !== "OPENAPI")
2151
2272
  return true;
@@ -2165,8 +2286,12 @@ export class WorkOnTasksService {
2165
2286
  }
2166
2287
  }
2167
2288
  try {
2168
- const docs = await this.deps.docdex.search({ projectKey, profile: "workspace-code" });
2169
- const filteredDocs = docs.filter((doc) => !isDocContextExcluded(doc.path ?? doc.title ?? doc.id, false));
2289
+ let docs = await this.deps.docdex.search({ projectKey, profile: "workspace-code", query: docQuery });
2290
+ if (!docs.length && docQuery) {
2291
+ docs = await this.deps.docdex.search({ projectKey, profile: "workspace-code" });
2292
+ }
2293
+ const filteredDocs = docs.filter((doc) => !isDocContextExcluded(doc.path ?? doc.title ?? doc.id, false) &&
2294
+ (includeTestDocs || !isTestLikePath(doc.path ?? doc.title ?? doc.id)));
2170
2295
  const resolveDocType = (doc) => {
2171
2296
  const content = doc.segments?.[0]?.content ?? doc.content ?? "";
2172
2297
  const normalized = normalizeDocType({
@@ -3280,7 +3405,9 @@ export class WorkOnTasksService {
3280
3405
  if (request.missingTestsPolicy && !requestedMissingTestsPolicy) {
3281
3406
  runnerWarnings.push(`Unknown missing-tests policy "${String(request.missingTestsPolicy)}"; using "${missingTestsPolicy}".`);
3282
3407
  }
3283
- const ignoreStatusFilter = Boolean(request.taskKeys?.length) || request.ignoreStatusFilter === true;
3408
+ const explicitTaskSelection = Boolean(request.taskKeys?.length);
3409
+ const ignoreDependencies = request.ignoreDependencies === true || explicitTaskSelection;
3410
+ const ignoreStatusFilter = explicitTaskSelection || request.ignoreStatusFilter === true;
3284
3411
  const { filtered: statusFilter, rejected } = ignoreStatusFilter
3285
3412
  ? { filtered: request.statusFilter ?? [], rejected: [] }
3286
3413
  : filterTaskStatuses(request.statusFilter, WORK_ALLOWED_STATUSES, WORK_ALLOWED_STATUSES);
@@ -3318,7 +3445,7 @@ export class WorkOnTasksService {
3318
3445
  ignoreStatusFilter,
3319
3446
  includeTypes,
3320
3447
  excludeTypes,
3321
- ignoreDependencies: true,
3448
+ ignoreDependencies,
3322
3449
  limit: request.limit,
3323
3450
  parallel: request.parallel,
3324
3451
  noCommit: request.noCommit ?? false,
@@ -3402,7 +3529,7 @@ export class WorkOnTasksService {
3402
3529
  ignoreStatusFilter,
3403
3530
  includeTypes,
3404
3531
  excludeTypes,
3405
- ignoreDependencies: true,
3532
+ ignoreDependencies,
3406
3533
  limit: request.limit,
3407
3534
  parallel: request.parallel,
3408
3535
  });
@@ -4308,7 +4435,7 @@ export class WorkOnTasksService {
4308
4435
  docWarnings = ["Gateway handoff present; skipping docdex context gathering."];
4309
4436
  }
4310
4437
  else {
4311
- const docContext = await this.gatherDocContext(request.projectKey, docLinks);
4438
+ const docContext = await this.gatherDocContext(task.task, request.projectKey, docLinks, allowedFiles);
4312
4439
  docSummary = docContext.summary;
4313
4440
  docWarnings = docContext.warnings;
4314
4441
  docdexUnavailable = docContext.docdexUnavailable;
@@ -5672,6 +5799,43 @@ export class WorkOnTasksService {
5672
5799
  await this.deps.jobService.updateJobStatus(job.id, "running", { processedItems: index + 1 });
5673
5800
  continue taskLoop;
5674
5801
  }
5802
+ const allowTestOnlyCompletion = allowsTestsOnlyCompletion(task.task, metadata, allowedFiles);
5803
+ if (!allowTestOnlyCompletion && !hasProductTouchedFiles(touched)) {
5804
+ const body = [
5805
+ "[work-on-tasks]",
5806
+ "Completion guard blocked finalization.",
5807
+ "Only test/documentation files were touched for a task that appears to require product implementation changes.",
5808
+ `Touched files: ${touched.join(", ")}`,
5809
+ "Update product code (or set metadata.allow_tests_only_completion=true for explicitly test-only tasks) and rerun.",
5810
+ ].join("\n");
5811
+ await this.deps.workspaceRepo.createTaskComment({
5812
+ taskId: task.task.id,
5813
+ taskRunId: taskRun.id,
5814
+ jobId: job.id,
5815
+ sourceCommand: "work-on-tasks",
5816
+ authorType: "agent",
5817
+ authorAgentId: agent.id,
5818
+ category: "completion_guard",
5819
+ body,
5820
+ createdAt: new Date().toISOString(),
5821
+ metadata: { reason: "tests_only_changes", touchedFiles: touched, allowedFiles },
5822
+ });
5823
+ await this.logTask(taskRun.id, `Completion guard blocked task: non-product touched files only (${touched.join(", ")}).`, "execution");
5824
+ await this.updateTaskPhase(job.id, taskRun.id, task.task.key, "finalize", "error", {
5825
+ error: "tests_only_changes",
5826
+ touchedFiles: touched,
5827
+ });
5828
+ await this.stateService.markChangesRequested(task.task, { failed_reason: "tests_only_changes", touched_files: touched }, statusContext);
5829
+ await this.deps.workspaceRepo.updateTaskRun(taskRun.id, {
5830
+ status: "failed",
5831
+ finishedAt: new Date().toISOString(),
5832
+ });
5833
+ setFailureReason("tests_only_changes");
5834
+ results.push({ taskKey: task.task.key, status: "failed", notes: "tests_only_changes" });
5835
+ taskStatus = "failed";
5836
+ await this.deps.jobService.updateJobStatus(job.id, "running", { processedItems: index + 1 });
5837
+ continue taskLoop;
5838
+ }
5675
5839
  }
5676
5840
  if (runVcsPhase) {
5677
5841
  const vcsOutcome = await runVcsPhase({ allowResultUpdate: true, reason: "primary" });
@@ -58,11 +58,34 @@ export declare class CreateTasksService {
58
58
  });
59
59
  static create(workspace: WorkspaceResolution): Promise<CreateTasksService>;
60
60
  close(): Promise<void>;
61
+ private storyScopeKey;
62
+ private taskScopeKey;
63
+ private scopeStory;
64
+ private scopeTask;
61
65
  private seedPriorities;
62
66
  private resolveAgent;
63
67
  private ensureRatingService;
64
68
  private prepareDocs;
65
69
  private resolveDefaultDocInputs;
70
+ private walkDocCandidates;
71
+ private scoreDocCandidate;
72
+ private findFuzzyDocInputs;
73
+ private normalizeStructurePathToken;
74
+ private extractStructureTargets;
75
+ private normalizeServiceName;
76
+ private deriveServiceFromPathToken;
77
+ private addServiceAlias;
78
+ private extractServiceMentionsFromText;
79
+ private resolveServiceMentionFromPhrase;
80
+ private collectDependencyStatements;
81
+ private sortServicesByDependency;
82
+ private buildServiceDependencyGraph;
83
+ private orderStoryTasksByDependencies;
84
+ private applyServiceDependencySequencing;
85
+ private shouldInjectStructureBootstrap;
86
+ private injectStructureBootstrapPlan;
87
+ private enforceStoryScopedDependencies;
88
+ private validatePlanLocalIdentifiers;
66
89
  private buildQaPreflight;
67
90
  private buildQaOverrides;
68
91
  private buildDocContext;
@@ -1 +1 @@
1
- {"version":3,"file":"CreateTasksService.d.ts","sourceRoot":"","sources":["../../../src/services/planning/CreateTasksService.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"CreateTasksService.d.ts","sourceRoot":"","sources":["../../../src/services/planning/CreateTasksService.ts"],"names":[],"mappings":"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"}