@mcoda/core 0.1.20 → 0.1.21
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/services/execution/WorkOnTasksService.d.ts +1 -1
- package/dist/services/execution/WorkOnTasksService.d.ts.map +1 -1
- package/dist/services/execution/WorkOnTasksService.js +37 -15
- package/dist/services/planning/CreateTasksService.d.ts +2 -0
- package/dist/services/planning/CreateTasksService.d.ts.map +1 -1
- package/dist/services/planning/CreateTasksService.js +107 -6
- package/package.json +6 -6
|
@@ -41,7 +41,7 @@ export interface WorkOnTasksResult {
|
|
|
41
41
|
results: TaskExecutionResult[];
|
|
42
42
|
warnings: string[];
|
|
43
43
|
}
|
|
44
|
-
export type MissingTestsPolicy = "block_job" | "skip_task" | "fail_task";
|
|
44
|
+
export type MissingTestsPolicy = "block_job" | "skip_task" | "fail_task" | "continue_task";
|
|
45
45
|
export type ExecutionContextPolicy = "best_effort" | "require_any" | "require_sds_or_openapi";
|
|
46
46
|
export declare class WorkOnTasksService {
|
|
47
47
|
private workspace;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"WorkOnTasksService.d.ts","sourceRoot":"","sources":["../../../src/services/execution/WorkOnTasksService.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,YAAY,EAAgD,MAAM,eAAe,CAAC;AAC3F,OAAO,EAAE,YAAY,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAC;AAE9D,OAAO,EAAE,gBAAgB,EAAE,mBAAmB,EAAuB,MAAM,WAAW,CAAC;AAEvF,OAAO,EAAE,mBAAmB,EAAE,MAAM,qCAAqC,CAAC;AAC1E,OAAO,EAAE,UAAU,EAAiB,MAAM,uBAAuB,CAAC;AAClE,OAAO,EAAE,oBAAoB,EAAE,oBAAoB,EAAE,iBAAiB,EAAE,MAAM,2BAA2B,CAAC;AAC1G,OAAO,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AAEzD,OAAO,EAAE,cAAc,EAAE,MAAM,6BAA6B,CAAC;AAE7D,OAAO,EAAE,kBAAkB,EAAE,MAAM,iCAAiC,CAAC;AAsFrE,MAAM,WAAW,kBAAmB,SAAQ,oBAAoB;IAC9D,SAAS,EAAE,mBAAmB,CAAC;IAC/B,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,oBAAoB,CAAC,EAAE,MAAM,CAAC;IAC9B,YAAY,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IACvC,WAAW,CAAC,EAAE,WAAW,CAAC;IAC1B,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,kBAAkB,CAAC,EAAE,OAAO,CAAC;IAC7B,kBAAkB,CAAC,EAAE,kBAAkB,CAAC;IACxC,iBAAiB,CAAC,EAAE,OAAO,CAAC;IAC5B,sBAAsB,CAAC,EAAE,sBAAsB,CAAC;CACjD;AAED,MAAM,WAAW,mBAAmB;IAClC,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,WAAW,GAAG,QAAQ,GAAG,SAAS,CAAC;IAC3C,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,iBAAiB;IAChC,KAAK,EAAE,MAAM,CAAC;IACd,YAAY,EAAE,MAAM,CAAC;IACrB,SAAS,EAAE,iBAAiB,CAAC;IAC7B,OAAO,EAAE,mBAAmB,EAAE,CAAC;IAC/B,QAAQ,EAAE,MAAM,EAAE,CAAC;CACpB;AA6wBD,MAAM,MAAM,kBAAkB,GAAG,WAAW,GAAG,WAAW,GAAG,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"WorkOnTasksService.d.ts","sourceRoot":"","sources":["../../../src/services/execution/WorkOnTasksService.ts"],"names":[],"mappings":"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"}
|
|
@@ -833,13 +833,22 @@ const splitFileBlocksByExistence = (fileBlocks, cwd) => {
|
|
|
833
833
|
}
|
|
834
834
|
return { existing, remaining };
|
|
835
835
|
};
|
|
836
|
-
const DEFAULT_MISSING_TESTS_POLICY = "
|
|
836
|
+
const DEFAULT_MISSING_TESTS_POLICY = "continue_task";
|
|
837
837
|
const DEFAULT_EXECUTION_CONTEXT_POLICY = "best_effort";
|
|
838
838
|
const normalizeMissingTestsPolicy = (value) => {
|
|
839
839
|
if (typeof value !== "string")
|
|
840
840
|
return undefined;
|
|
841
841
|
const normalized = value.trim().toLowerCase().replace(/-/g, "_");
|
|
842
|
-
if (normalized === "block_job" ||
|
|
842
|
+
if (normalized === "block_job" ||
|
|
843
|
+
normalized === "skip_task" ||
|
|
844
|
+
normalized === "fail_task" ||
|
|
845
|
+
normalized === "continue_task" ||
|
|
846
|
+
normalized === "continue" ||
|
|
847
|
+
normalized === "allow" ||
|
|
848
|
+
normalized === "warn_task") {
|
|
849
|
+
if (normalized === "continue" || normalized === "allow" || normalized === "warn_task") {
|
|
850
|
+
return "continue_task";
|
|
851
|
+
}
|
|
843
852
|
return normalized;
|
|
844
853
|
}
|
|
845
854
|
return undefined;
|
|
@@ -3489,7 +3498,12 @@ export class WorkOnTasksService {
|
|
|
3489
3498
|
const enforceCommentBacklog = isCommentBacklogEnforced();
|
|
3490
3499
|
const commentBacklogMaxFails = resolveCommentBacklogMaxFails();
|
|
3491
3500
|
const requestedMissingTestsPolicy = normalizeMissingTestsPolicy(request.missingTestsPolicy);
|
|
3492
|
-
const missingTestsPolicy = requestedMissingTestsPolicy ??
|
|
3501
|
+
const missingTestsPolicy = requestedMissingTestsPolicy ??
|
|
3502
|
+
(request.allowMissingTests === true
|
|
3503
|
+
? "continue_task"
|
|
3504
|
+
: request.allowMissingTests === false
|
|
3505
|
+
? "block_job"
|
|
3506
|
+
: DEFAULT_MISSING_TESTS_POLICY);
|
|
3493
3507
|
const requestedExecutionContextPolicy = normalizeExecutionContextPolicy(request.executionContextPolicy);
|
|
3494
3508
|
const executionContextPolicy = requestedExecutionContextPolicy ?? DEFAULT_EXECUTION_CONTEXT_POLICY;
|
|
3495
3509
|
const baseCodaliEnvOverrides = codaliRequired ? buildCodaliEnvOverrides() : {};
|
|
@@ -4212,18 +4226,26 @@ export class WorkOnTasksService {
|
|
|
4212
4226
|
await emitTaskEndOnce();
|
|
4213
4227
|
throw new Error(`missing_test_harness: ${task.task.key} requires tests but no runnable test commands were found`);
|
|
4214
4228
|
}
|
|
4215
|
-
|
|
4216
|
-
|
|
4217
|
-
|
|
4218
|
-
|
|
4219
|
-
|
|
4220
|
-
}
|
|
4221
|
-
|
|
4222
|
-
|
|
4223
|
-
|
|
4224
|
-
|
|
4225
|
-
|
|
4226
|
-
|
|
4229
|
+
if (missingTestsPolicy === "continue_task") {
|
|
4230
|
+
const warning = `Task ${task.task.key}: tests required but no runnable test harness was found; proceeding without automated tests.` +
|
|
4231
|
+
" Add metadata.tests/testCommands or tests/all.js.";
|
|
4232
|
+
warnings.push(warning);
|
|
4233
|
+
await this.logTask(taskRun.id, "Tests required but no runnable test commands were found; continuing without automated tests due to missing-tests policy.", "tests", { testRequirements, missingTestsPolicy });
|
|
4234
|
+
}
|
|
4235
|
+
else {
|
|
4236
|
+
await this.logTask(taskRun.id, "Tests required but no runnable test commands were found; failing task.", "tests", { testRequirements, missingTestsPolicy });
|
|
4237
|
+
await this.stateService.markFailed(task.task, "tests_not_configured", statusContext);
|
|
4238
|
+
await this.deps.workspaceRepo.updateTaskRun(taskRun.id, {
|
|
4239
|
+
status: "failed",
|
|
4240
|
+
finishedAt: new Date().toISOString(),
|
|
4241
|
+
});
|
|
4242
|
+
setFailureReason("tests_not_configured");
|
|
4243
|
+
results.push({ taskKey: task.task.key, status: "failed", notes: "tests_not_configured" });
|
|
4244
|
+
taskStatus = "failed";
|
|
4245
|
+
await this.deps.jobService.updateJobStatus(job.id, "running", { processedItems: index + 1 });
|
|
4246
|
+
await emitTaskEndOnce();
|
|
4247
|
+
continue taskLoop;
|
|
4248
|
+
}
|
|
4227
4249
|
}
|
|
4228
4250
|
const shouldRunTests = !request.dryRun && (testsRequired ? hasRunnableTests : testCommands.length > 0);
|
|
4229
4251
|
let mergeConflicts = [];
|
|
@@ -105,6 +105,8 @@ export declare class CreateTasksService {
|
|
|
105
105
|
private parseEpics;
|
|
106
106
|
private generateStoriesForEpic;
|
|
107
107
|
private generateTasksForStory;
|
|
108
|
+
private buildFallbackStoryForEpic;
|
|
109
|
+
private buildFallbackTasksForStory;
|
|
108
110
|
private generatePlanFromAgent;
|
|
109
111
|
private writePlanArtifacts;
|
|
110
112
|
private persistPlanToDb;
|
|
@@ -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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"}
|
|
@@ -2360,6 +2360,71 @@ export class CreateTasksService {
|
|
|
2360
2360
|
})
|
|
2361
2361
|
.filter((t) => t.title);
|
|
2362
2362
|
}
|
|
2363
|
+
buildFallbackStoryForEpic(epic) {
|
|
2364
|
+
const criteria = epic.acceptanceCriteria?.filter(Boolean) ?? [];
|
|
2365
|
+
return {
|
|
2366
|
+
localId: "us-fallback-1",
|
|
2367
|
+
title: `Deliver ${epic.title}`,
|
|
2368
|
+
userStory: `As a delivery team, we need an executable implementation story for ${epic.title}.`,
|
|
2369
|
+
description: [
|
|
2370
|
+
`Deterministic fallback story generated because model output for epic "${epic.title}" could not be parsed reliably.`,
|
|
2371
|
+
"Use SDS and related docs to decompose this story into concrete implementation tasks.",
|
|
2372
|
+
].join("\n"),
|
|
2373
|
+
acceptanceCriteria: criteria.length > 0
|
|
2374
|
+
? criteria
|
|
2375
|
+
: [
|
|
2376
|
+
"Story has actionable implementation tasks.",
|
|
2377
|
+
"Dependencies are explicit and story-scoped.",
|
|
2378
|
+
"Tasks are ready for execution.",
|
|
2379
|
+
],
|
|
2380
|
+
relatedDocs: epic.relatedDocs ?? [],
|
|
2381
|
+
priorityHint: 1,
|
|
2382
|
+
tasks: [],
|
|
2383
|
+
};
|
|
2384
|
+
}
|
|
2385
|
+
buildFallbackTasksForStory(story) {
|
|
2386
|
+
const criteriaLines = (story.acceptanceCriteria ?? [])
|
|
2387
|
+
.slice(0, 6)
|
|
2388
|
+
.map((criterion) => `- ${criterion}`)
|
|
2389
|
+
.join("\n");
|
|
2390
|
+
return [
|
|
2391
|
+
{
|
|
2392
|
+
localId: "t-fallback-1",
|
|
2393
|
+
title: `Fallback planning for ${story.title}`,
|
|
2394
|
+
type: "chore",
|
|
2395
|
+
description: [
|
|
2396
|
+
`Draft a concrete implementation plan for story "${story.title}" using SDS/OpenAPI context.`,
|
|
2397
|
+
"List exact files/modules to touch and implementation order.",
|
|
2398
|
+
criteriaLines ? `Acceptance criteria to satisfy:\n${criteriaLines}` : "Acceptance criteria: use story definition.",
|
|
2399
|
+
].join("\n"),
|
|
2400
|
+
estimatedStoryPoints: 2,
|
|
2401
|
+
priorityHint: 1,
|
|
2402
|
+
dependsOnKeys: [],
|
|
2403
|
+
relatedDocs: story.relatedDocs ?? [],
|
|
2404
|
+
unitTests: [],
|
|
2405
|
+
componentTests: [],
|
|
2406
|
+
integrationTests: [],
|
|
2407
|
+
apiTests: [],
|
|
2408
|
+
},
|
|
2409
|
+
{
|
|
2410
|
+
localId: "t-fallback-2",
|
|
2411
|
+
title: `Fallback implementation for ${story.title}`,
|
|
2412
|
+
type: "feature",
|
|
2413
|
+
description: [
|
|
2414
|
+
`Implement story "${story.title}" according to the fallback planning task.`,
|
|
2415
|
+
"Ensure done criteria and test requirements are explicitly documented for execution.",
|
|
2416
|
+
].join("\n"),
|
|
2417
|
+
estimatedStoryPoints: 3,
|
|
2418
|
+
priorityHint: 2,
|
|
2419
|
+
dependsOnKeys: ["t-fallback-1"],
|
|
2420
|
+
relatedDocs: story.relatedDocs ?? [],
|
|
2421
|
+
unitTests: [],
|
|
2422
|
+
componentTests: [],
|
|
2423
|
+
integrationTests: [],
|
|
2424
|
+
apiTests: [],
|
|
2425
|
+
},
|
|
2426
|
+
];
|
|
2427
|
+
}
|
|
2363
2428
|
async generatePlanFromAgent(epics, agent, docSummary, options) {
|
|
2364
2429
|
const planEpics = epics.map((epic, idx) => ({
|
|
2365
2430
|
...epic,
|
|
@@ -2367,20 +2432,56 @@ export class CreateTasksService {
|
|
|
2367
2432
|
}));
|
|
2368
2433
|
const planStories = [];
|
|
2369
2434
|
const planTasks = [];
|
|
2435
|
+
const fallbackStoryScopes = new Set();
|
|
2370
2436
|
for (const epic of planEpics) {
|
|
2371
|
-
|
|
2372
|
-
|
|
2437
|
+
let stories = [];
|
|
2438
|
+
let usedFallbackStories = false;
|
|
2439
|
+
try {
|
|
2440
|
+
stories = await this.generateStoriesForEpic(agent, { ...epic }, docSummary, options.projectBuildMethod, options.agentStream, options.jobId, options.commandRunId);
|
|
2441
|
+
}
|
|
2442
|
+
catch (error) {
|
|
2443
|
+
usedFallbackStories = true;
|
|
2444
|
+
await this.jobService.appendLog(options.jobId, `Story generation failed for epic "${epic.title}". Using deterministic fallback story. Reason: ${error.message ?? String(error)}\n`);
|
|
2445
|
+
stories = [this.buildFallbackStoryForEpic(epic)];
|
|
2446
|
+
}
|
|
2447
|
+
let limitedStories = stories.slice(0, options.maxStoriesPerEpic ?? stories.length);
|
|
2448
|
+
if (limitedStories.length === 0) {
|
|
2449
|
+
usedFallbackStories = true;
|
|
2450
|
+
await this.jobService.appendLog(options.jobId, `Story generation returned no stories for epic "${epic.title}". Using deterministic fallback story.\n`);
|
|
2451
|
+
limitedStories = [this.buildFallbackStoryForEpic(epic)];
|
|
2452
|
+
}
|
|
2373
2453
|
limitedStories.forEach((story, idx) => {
|
|
2374
|
-
|
|
2454
|
+
const planStory = {
|
|
2375
2455
|
...story,
|
|
2376
2456
|
localId: story.localId ?? `us${idx + 1}`,
|
|
2377
2457
|
epicLocalId: epic.localId,
|
|
2378
|
-
}
|
|
2458
|
+
};
|
|
2459
|
+
planStories.push(planStory);
|
|
2460
|
+
if (usedFallbackStories) {
|
|
2461
|
+
fallbackStoryScopes.add(this.storyScopeKey(planStory.epicLocalId, planStory.localId));
|
|
2462
|
+
}
|
|
2379
2463
|
});
|
|
2380
2464
|
}
|
|
2381
2465
|
for (const story of planStories) {
|
|
2382
|
-
const
|
|
2383
|
-
|
|
2466
|
+
const storyScope = this.storyScopeKey(story.epicLocalId, story.localId);
|
|
2467
|
+
let tasks = [];
|
|
2468
|
+
if (fallbackStoryScopes.has(storyScope)) {
|
|
2469
|
+
tasks = this.buildFallbackTasksForStory(story);
|
|
2470
|
+
}
|
|
2471
|
+
else {
|
|
2472
|
+
try {
|
|
2473
|
+
tasks = await this.generateTasksForStory(agent, { key: story.epicLocalId, title: story.title }, story, docSummary, options.projectBuildMethod, options.agentStream, options.jobId, options.commandRunId);
|
|
2474
|
+
}
|
|
2475
|
+
catch (error) {
|
|
2476
|
+
await this.jobService.appendLog(options.jobId, `Task generation failed for story "${story.title}" (${storyScope}). Using deterministic fallback tasks. Reason: ${error.message ?? String(error)}\n`);
|
|
2477
|
+
tasks = this.buildFallbackTasksForStory(story);
|
|
2478
|
+
}
|
|
2479
|
+
}
|
|
2480
|
+
let limitedTasks = tasks.slice(0, options.maxTasksPerStory ?? tasks.length);
|
|
2481
|
+
if (limitedTasks.length === 0) {
|
|
2482
|
+
await this.jobService.appendLog(options.jobId, `Task generation returned no tasks for story "${story.title}" (${storyScope}). Using deterministic fallback tasks.\n`);
|
|
2483
|
+
limitedTasks = this.buildFallbackTasksForStory(story).slice(0, options.maxTasksPerStory ?? Number.MAX_SAFE_INTEGER);
|
|
2484
|
+
}
|
|
2384
2485
|
limitedTasks.forEach((task, idx) => {
|
|
2385
2486
|
planTasks.push({
|
|
2386
2487
|
...task,
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@mcoda/core",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.21",
|
|
4
4
|
"description": "Core services and APIs for the mcoda CLI.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "dist/index.js",
|
|
@@ -32,11 +32,11 @@
|
|
|
32
32
|
"dependencies": {
|
|
33
33
|
"@apidevtools/swagger-parser": "^10.1.0",
|
|
34
34
|
"yaml": "^2.4.2",
|
|
35
|
-
"@mcoda/shared": "0.1.
|
|
36
|
-
"@mcoda/db": "0.1.
|
|
37
|
-
"@mcoda/agents": "0.1.
|
|
38
|
-
"@mcoda/generators": "0.1.
|
|
39
|
-
"@mcoda/integrations": "0.1.
|
|
35
|
+
"@mcoda/shared": "0.1.21",
|
|
36
|
+
"@mcoda/db": "0.1.21",
|
|
37
|
+
"@mcoda/agents": "0.1.21",
|
|
38
|
+
"@mcoda/generators": "0.1.21",
|
|
39
|
+
"@mcoda/integrations": "0.1.21"
|
|
40
40
|
},
|
|
41
41
|
"scripts": {
|
|
42
42
|
"build": "tsc -p tsconfig.json",
|