@calmo/task-runner 3.4.0 → 3.4.1
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/.github/dependabot.yml +7 -7
- package/.github/workflows/ci.yml +4 -4
- package/.jules/backlog_maniac.md +1 -0
- package/.jules/nexus.md +1 -0
- package/.jules/sentinel.md +1 -0
- package/.releaserc.json +2 -7
- package/AGENTS.md +8 -2
- package/CHANGELOG.md +178 -174
- package/README.md +23 -23
- package/coverage/coverage-final.json +8 -8
- package/coverage/index.html +7 -7
- package/coverage/lcov-report/index.html +7 -7
- package/coverage/lcov-report/src/EventBus.ts.html +27 -21
- package/coverage/lcov-report/src/TaskGraphValidationError.ts.html +12 -3
- package/coverage/lcov-report/src/TaskGraphValidator.ts.html +152 -137
- package/coverage/lcov-report/src/TaskRunner.ts.html +48 -45
- package/coverage/lcov-report/src/TaskRunnerBuilder.ts.html +29 -5
- package/coverage/lcov-report/src/TaskRunnerExecutionConfig.ts.html +1 -1
- package/coverage/lcov-report/src/TaskStateManager.ts.html +1 -1
- package/coverage/lcov-report/src/WorkflowExecutor.ts.html +21 -12
- package/coverage/lcov-report/src/contracts/RunnerEvents.ts.html +1 -1
- package/coverage/lcov-report/src/contracts/index.html +1 -1
- package/coverage/lcov-report/src/index.html +8 -8
- package/coverage/lcov-report/src/strategies/DryRunExecutionStrategy.ts.html +4 -4
- package/coverage/lcov-report/src/strategies/RetryingExecutionStrategy.ts.html +29 -11
- package/coverage/lcov-report/src/strategies/StandardExecutionStrategy.ts.html +5 -5
- package/coverage/lcov-report/src/strategies/index.html +1 -1
- package/coverage/lcov.info +266 -262
- package/coverage/src/EventBus.ts.html +27 -21
- package/coverage/src/TaskGraphValidationError.ts.html +12 -3
- package/coverage/src/TaskGraphValidator.ts.html +152 -137
- package/coverage/src/TaskRunner.ts.html +48 -45
- package/coverage/src/TaskRunnerBuilder.ts.html +29 -5
- package/coverage/src/TaskRunnerExecutionConfig.ts.html +1 -1
- package/coverage/src/TaskStateManager.ts.html +1 -1
- package/coverage/src/WorkflowExecutor.ts.html +21 -12
- package/coverage/src/contracts/RunnerEvents.ts.html +1 -1
- package/coverage/src/contracts/index.html +1 -1
- package/coverage/src/index.html +8 -8
- package/coverage/src/strategies/DryRunExecutionStrategy.ts.html +4 -4
- package/coverage/src/strategies/RetryingExecutionStrategy.ts.html +29 -11
- package/coverage/src/strategies/StandardExecutionStrategy.ts.html +5 -5
- package/coverage/src/strategies/index.html +1 -1
- package/dist/EventBus.js +13 -11
- package/dist/EventBus.js.map +1 -1
- package/dist/TaskGraphValidationError.js.map +1 -1
- package/dist/TaskGraphValidator.js +9 -9
- package/dist/TaskGraphValidator.js.map +1 -1
- package/dist/TaskRunner.js.map +1 -1
- package/dist/TaskRunnerBuilder.js.map +1 -1
- package/dist/WorkflowExecutor.js +2 -1
- package/dist/WorkflowExecutor.js.map +1 -1
- package/dist/strategies/RetryingExecutionStrategy.js +3 -1
- package/dist/strategies/RetryingExecutionStrategy.js.map +1 -1
- package/dist/strategies/StandardExecutionStrategy.js +1 -1
- package/dist/strategies/StandardExecutionStrategy.js.map +1 -1
- package/openspec/AGENTS.md +81 -15
- package/openspec/changes/archive/2026-01-18-add-concurrency-control/proposal.md +7 -4
- package/openspec/changes/archive/2026-01-18-add-concurrency-control/tasks.md +1 -0
- package/openspec/changes/archive/2026-01-18-add-external-task-cancellation/proposal.md +4 -1
- package/openspec/changes/archive/2026-01-18-add-external-task-cancellation/tasks.md +2 -1
- package/openspec/changes/archive/2026-01-18-add-integration-tests/proposal.md +3 -0
- package/openspec/changes/archive/2026-01-18-add-integration-tests/tasks.md +1 -0
- package/openspec/changes/archive/2026-01-18-add-task-retry-policy/proposal.md +3 -0
- package/openspec/changes/archive/2026-01-18-add-task-retry-policy/tasks.md +1 -0
- package/openspec/changes/archive/2026-01-18-add-workflow-preview/proposal.md +3 -0
- package/openspec/changes/archive/2026-01-18-add-workflow-preview/tasks.md +1 -0
- package/openspec/changes/archive/2026-01-18-refactor-core-architecture/proposal.md +3 -0
- package/openspec/changes/archive/2026-01-18-refactor-core-architecture/tasks.md +1 -0
- package/openspec/changes/feat-per-task-timeout/proposal.md +11 -6
- package/openspec/changes/feat-per-task-timeout/tasks.md +1 -1
- package/openspec/project.md +21 -15
- package/package.json +1 -1
- package/src/EventBus.ts +18 -16
- package/src/TaskGraph.ts +8 -8
- package/src/TaskGraphValidationError.ts +4 -1
- package/src/TaskGraphValidator.ts +148 -143
- package/src/TaskRunner.ts +42 -41
- package/src/TaskRunnerBuilder.ts +11 -3
- package/src/WorkflowExecutor.ts +13 -10
- package/src/contracts/ITaskGraphValidator.ts +12 -12
- package/src/contracts/ValidationError.ts +6 -6
- package/src/contracts/ValidationResult.ts +4 -4
- package/src/strategies/DryRunExecutionStrategy.ts +3 -3
- package/src/strategies/RetryingExecutionStrategy.ts +15 -9
- package/src/strategies/StandardExecutionStrategy.ts +4 -4
- package/test-report.xml +108 -108
|
@@ -18,7 +18,7 @@ export class TaskGraphValidator {
|
|
|
18
18
|
errors.push({
|
|
19
19
|
type: "duplicate_task",
|
|
20
20
|
message: `Duplicate task detected with ID: ${task.id}`,
|
|
21
|
-
details: { taskId: task.id }
|
|
21
|
+
details: { taskId: task.id },
|
|
22
22
|
});
|
|
23
23
|
}
|
|
24
24
|
else {
|
|
@@ -32,18 +32,18 @@ export class TaskGraphValidator {
|
|
|
32
32
|
errors.push({
|
|
33
33
|
type: "missing_dependency",
|
|
34
34
|
message: `Task '${task.id}' depends on missing task '${dependenceId}'`,
|
|
35
|
-
details: { taskId: task.id, missingDependencyId: dependenceId }
|
|
35
|
+
details: { taskId: task.id, missingDependencyId: dependenceId },
|
|
36
36
|
});
|
|
37
37
|
}
|
|
38
38
|
}
|
|
39
39
|
}
|
|
40
40
|
// 3. Check for cycles
|
|
41
41
|
// Only run cycle detection if there are no missing dependencies, otherwise we might chase non-existent nodes.
|
|
42
|
-
const hasMissingDependencies = errors.some(e => e.type === "missing_dependency");
|
|
42
|
+
const hasMissingDependencies = errors.some((e) => e.type === "missing_dependency");
|
|
43
43
|
if (hasMissingDependencies) {
|
|
44
44
|
return {
|
|
45
45
|
isValid: errors.length === 0,
|
|
46
|
-
errors
|
|
46
|
+
errors,
|
|
47
47
|
};
|
|
48
48
|
}
|
|
49
49
|
// Build adjacency list
|
|
@@ -67,7 +67,7 @@ export class TaskGraphValidator {
|
|
|
67
67
|
errors.push({
|
|
68
68
|
type: "cycle",
|
|
69
69
|
message: `Cycle detected: ${cyclePath.join(" -> ")}`,
|
|
70
|
-
details: { cyclePath }
|
|
70
|
+
details: { cyclePath },
|
|
71
71
|
});
|
|
72
72
|
// Break after first cycle found to avoid spamming similar errors
|
|
73
73
|
break;
|
|
@@ -75,7 +75,7 @@ export class TaskGraphValidator {
|
|
|
75
75
|
}
|
|
76
76
|
return {
|
|
77
77
|
isValid: errors.length === 0,
|
|
78
|
-
errors
|
|
78
|
+
errors,
|
|
79
79
|
};
|
|
80
80
|
}
|
|
81
81
|
/**
|
|
@@ -84,7 +84,7 @@ export class TaskGraphValidator {
|
|
|
84
84
|
* @returns A formatted error string.
|
|
85
85
|
*/
|
|
86
86
|
createErrorMessage(result) {
|
|
87
|
-
const errorDetails = result.errors.map(e => e.message);
|
|
87
|
+
const errorDetails = result.errors.map((e) => e.message);
|
|
88
88
|
return `Task graph validation failed: ${errorDetails.join("; ")}`;
|
|
89
89
|
}
|
|
90
90
|
detectCycle(startTaskId, path, visited, recursionStack, adjacencyList) {
|
|
@@ -97,7 +97,7 @@ export class TaskGraphValidator {
|
|
|
97
97
|
taskId: startTaskId,
|
|
98
98
|
index: 0,
|
|
99
99
|
/* v8 ignore next */
|
|
100
|
-
dependencies: adjacencyList.get(startTaskId) ?? []
|
|
100
|
+
dependencies: adjacencyList.get(startTaskId) ?? [],
|
|
101
101
|
});
|
|
102
102
|
while (stack.length > 0) {
|
|
103
103
|
const frame = stack[stack.length - 1];
|
|
@@ -118,7 +118,7 @@ export class TaskGraphValidator {
|
|
|
118
118
|
taskId: dependenceId,
|
|
119
119
|
index: 0,
|
|
120
120
|
/* v8 ignore next */
|
|
121
|
-
dependencies: adjacencyList.get(dependenceId) ?? []
|
|
121
|
+
dependencies: adjacencyList.get(dependenceId) ?? [],
|
|
122
122
|
});
|
|
123
123
|
}
|
|
124
124
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"TaskGraphValidator.js","sourceRoot":"","sources":["../src/TaskGraphValidator.ts"],"names":[],"mappings":"AAKA,MAAM,OAAO,kBAAkB;
|
|
1
|
+
{"version":3,"file":"TaskGraphValidator.js","sourceRoot":"","sources":["../src/TaskGraphValidator.ts"],"names":[],"mappings":"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"}
|
package/dist/TaskRunner.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"TaskRunner.js","sourceRoot":"","sources":["../src/TaskRunner.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAC;
|
|
1
|
+
{"version":3,"file":"TaskRunner.js","sourceRoot":"","sources":["../src/TaskRunner.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"TaskRunnerBuilder.js","sourceRoot":"","sources":["../src/TaskRunnerBuilder.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;
|
|
1
|
+
{"version":3,"file":"TaskRunnerBuilder.js","sourceRoot":"","sources":["../src/TaskRunnerBuilder.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAO7C;;GAEG;AACH,MAAM,OAAO,iBAAiB;IACpB,OAAO,CAAW;IAClB,QAAQ,CAAgC;IACxC,SAAS,GAKb,EAAE,CAAC;IAEP;;OAEG;IACH,YAAY,OAAiB;QAC3B,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;IACzB,CAAC;IAED;;;;OAIG;IACI,WAAW,CAAC,QAAsC;QACvD,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAC;QACzB,OAAO,IAAI,CAAC;IACd,CAAC;IAED;;;;;OAKG;IACI,EAAE,CACP,KAAQ,EACR,QAA0C;QAE1C,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,EAAE,CAAC;YAC3B,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC;QAC7B,CAAC;QACD,IAAI,CAAC,SAAS,CAAC,KAAK,CAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QACtC,OAAO,IAAI,CAAC;IACd,CAAC;IAED;;;OAGG;IACI,KAAK;QACV,MAAM,MAAM,GAAG,IAAI,UAAU,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QAE5C,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;YAClB,MAAM,CAAC,oBAAoB,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QAC7C,CAAC;QAGC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAC3B,CAAC,OAAO,CAAC,CAAC,KAAK,EAAE,EAAE;YAClB,MAAM,SAAS,GAAG,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;YACxC,0EAA0E;YAC1E,SAAU,CAAC,OAAO,CAAC,CAAC,QAAQ,EAAE,EAAE,CAC9B,MAAM,CAAC,EAAE,CACP,KAAK,EACL,QAGC,CACF,CACF,CAAC;QACJ,CAAC,CAAC,CAAC;QAEH,OAAO,MAAM,CAAC;IAChB,CAAC;CACF"}
|
package/dist/WorkflowExecutor.js
CHANGED
|
@@ -99,7 +99,8 @@ export class WorkflowExecutor {
|
|
|
99
99
|
}
|
|
100
100
|
const step = this.readyQueue.shift();
|
|
101
101
|
this.stateManager.markRunning(step);
|
|
102
|
-
const taskPromise = this.strategy
|
|
102
|
+
const taskPromise = this.strategy
|
|
103
|
+
.execute(step, this.context, signal)
|
|
103
104
|
.then((result) => {
|
|
104
105
|
this.stateManager.markCompleted(step, result);
|
|
105
106
|
})
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"WorkflowExecutor.js","sourceRoot":"","sources":["../src/WorkflowExecutor.ts"],"names":[],"mappings":"AAMA;;;GAGG;AACH,MAAM,OAAO,gBAAgB;IAWjB;IACA;IACA;IACA;IACA;IAdF,UAAU,GAAyB,EAAE,CAAC;IAE9C;;;;;;OAMG;IACH,YACU,OAAiB,EACjB,QAA4B,EAC5B,YAAwC,EACxC,QAAsC,EACtC,WAAoB;QAJpB,YAAO,GAAP,OAAO,CAAU;QACjB,aAAQ,GAAR,QAAQ,CAAoB;QAC5B,iBAAY,GAAZ,YAAY,CAA4B;QACxC,aAAQ,GAAR,QAAQ,CAA8B;QACtC,gBAAW,GAAX,WAAW,CAAS;IAC3B,CAAC;IAEJ;;;;;OAKG;IACH,KAAK,CAAC,OAAO,CACX,KAA2B,EAC3B,MAAoB;QAEpB,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,eAAe,EAAE,EAAE,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE,KAAK,EAAE,CAAC,CAAC;QACtE,IAAI,CAAC,YAAY,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC;QAEpC,2BAA2B;QAC3B,IAAI,MAAM,EAAE,OAAO,EAAE,CAAC;YACpB,IAAI,CAAC,YAAY,CAAC,gBAAgB,
|
|
1
|
+
{"version":3,"file":"WorkflowExecutor.js","sourceRoot":"","sources":["../src/WorkflowExecutor.ts"],"names":[],"mappings":"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"}
|
|
@@ -21,7 +21,9 @@ export class RetryingExecutionStrategy {
|
|
|
21
21
|
};
|
|
22
22
|
}
|
|
23
23
|
const result = await this.innerStrategy.execute(step, context, signal);
|
|
24
|
-
if (result.status === "success" ||
|
|
24
|
+
if (result.status === "success" ||
|
|
25
|
+
result.status === "cancelled" ||
|
|
26
|
+
result.status === "skipped") {
|
|
25
27
|
return result;
|
|
26
28
|
}
|
|
27
29
|
// Task failed, check if we should retry
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"RetryingExecutionStrategy.js","sourceRoot":"","sources":["../../src/strategies/RetryingExecutionStrategy.ts"],"names":[],"mappings":"AAIA;;GAEG;AACH,MAAM,OAAO,yBAAyB;
|
|
1
|
+
{"version":3,"file":"RetryingExecutionStrategy.js","sourceRoot":"","sources":["../../src/strategies/RetryingExecutionStrategy.ts"],"names":[],"mappings":"AAIA;;GAEG;AACH,MAAM,OAAO,yBAAyB;IAGhB;IAApB,YAAoB,aAA2C;QAA3C,kBAAa,GAAb,aAAa,CAA8B;IAAG,CAAC;IAEnE,KAAK,CAAC,OAAO,CACX,IAAwB,EACxB,OAAiB,EACjB,MAAoB;QAEpB,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC;QAC1B,IAAI,CAAC,MAAM,EAAE,CAAC;YACZ,OAAO,IAAI,CAAC,aAAa,CAAC,OAAO,CAAC,IAAI,EAAE,OAAO,EAAE,MAAM,CAAC,CAAC;QAC3D,CAAC;QAED,IAAI,OAAO,GAAG,CAAC,CAAC;QAChB,OAAO,IAAI,EAAE,CAAC;YACZ,0CAA0C;YAC1C,IAAI,MAAM,EAAE,OAAO,EAAE,CAAC;gBACpB,OAAO;oBACL,MAAM,EAAE,WAAW;oBACnB,OAAO,EAAE,iCAAiC;iBAC3C,CAAC;YACJ,CAAC;YAED,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,aAAa,CAAC,OAAO,CAAC,IAAI,EAAE,OAAO,EAAE,MAAM,CAAC,CAAC;YAEvE,IACE,MAAM,CAAC,MAAM,KAAK,SAAS;gBAC3B,MAAM,CAAC,MAAM,KAAK,WAAW;gBAC7B,MAAM,CAAC,MAAM,KAAK,SAAS,EAC3B,CAAC;gBACD,OAAO,MAAM,CAAC;YAChB,CAAC;YAED,wCAAwC;YACxC,IAAI,OAAO,IAAI,MAAM,CAAC,QAAQ,EAAE,CAAC;gBAC/B,OAAO,MAAM,CAAC,CAAC,uCAAuC;YACxD,CAAC;YAED,OAAO,EAAE,CAAC;YAEV,kBAAkB;YAClB,IAAI,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC;YACzB,IAAI,MAAM,CAAC,OAAO,KAAK,aAAa,EAAE,CAAC;gBACrC,KAAK,GAAG,MAAM,CAAC,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,OAAO,GAAG,CAAC,CAAC,CAAC;YAClD,CAAC;YAED,0CAA0C;YAC1C,IAAI,CAAC;gBACH,MAAM,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;YAClC,CAAC;YAAC,OAAO,CAAC,EAAE,CAAC;gBACX,IAAI,MAAM,EAAE,OAAO,EAAE,CAAC;oBACpB,OAAO;wBACL,MAAM,EAAE,WAAW;wBACnB,OAAO,EAAE,mCAAmC;qBAC7C,CAAC;gBACJ,CAAC;gBACD,MAAM,CAAC,CAAC;YACV,CAAC;QACH,CAAC;IACH,CAAC;IAEO,KAAK,CAAC,EAAU,EAAE,MAAoB;QAC5C,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;YACrC,IAAI,MAAM,EAAE,OAAO,EAAE,CAAC;gBACpB,MAAM,CAAC,IAAI,KAAK,CAAC,YAAY,CAAC,CAAC,CAAC;gBAChC,OAAO;YACT,CAAC;YAED,MAAM,KAAK,GAAG,UAAU,CAAC,GAAG,EAAE;gBAC5B,OAAO,EAAE,CAAC;gBACV,OAAO,EAAE,CAAC;YACZ,CAAC,EAAE,EAAE,CAAC,CAAC;YAEP,MAAM,OAAO,GAAG,GAAG,EAAE;gBACnB,YAAY,CAAC,KAAK,CAAC,CAAC;gBACpB,OAAO,EAAE,CAAC;gBACV,MAAM,CAAC,IAAI,KAAK,CAAC,YAAY,CAAC,CAAC,CAAC;YAClC,CAAC,CAAC;YAEF,MAAM,OAAO,GAAG,GAAG,EAAE;gBACnB,MAAM,EAAE,mBAAmB,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;YAChD,CAAC,CAAC;YAEF,MAAM,EAAE,gBAAgB,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;QAC7C,CAAC,CAAC,CAAC;IACL,CAAC;CACF"}
|
|
@@ -9,7 +9,7 @@ export class StandardExecutionStrategy {
|
|
|
9
9
|
catch (e) {
|
|
10
10
|
// Check if error is due to abort
|
|
11
11
|
if (signal?.aborted &&
|
|
12
|
-
(e instanceof Error && e.name === "AbortError" || signal.reason === e)) {
|
|
12
|
+
((e instanceof Error && e.name === "AbortError") || signal.reason === e)) {
|
|
13
13
|
return {
|
|
14
14
|
status: "cancelled",
|
|
15
15
|
message: "Task cancelled during execution",
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"StandardExecutionStrategy.js","sourceRoot":"","sources":["../../src/strategies/StandardExecutionStrategy.ts"],"names":[],"mappings":"AAIA;;GAEG;AACH,MAAM,OAAO,yBAAyB;IAGpC,KAAK,CAAC,OAAO,CACX,IAAwB,EACxB,OAAiB,EACjB,MAAoB;QAEpB,IAAI,CAAC;YACH,OAAO,MAAM,IAAI,CAAC,GAAG,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;QACzC,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YACX,iCAAiC;YACjC,IACE,MAAM,EAAE,OAAO;gBACf,CAAC,CAAC,YAAY,KAAK,IAAI,CAAC,CAAC,IAAI,KAAK,YAAY,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,CAAC,
|
|
1
|
+
{"version":3,"file":"StandardExecutionStrategy.js","sourceRoot":"","sources":["../../src/strategies/StandardExecutionStrategy.ts"],"names":[],"mappings":"AAIA;;GAEG;AACH,MAAM,OAAO,yBAAyB;IAGpC,KAAK,CAAC,OAAO,CACX,IAAwB,EACxB,OAAiB,EACjB,MAAoB;QAEpB,IAAI,CAAC;YACH,OAAO,MAAM,IAAI,CAAC,GAAG,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;QACzC,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YACX,iCAAiC;YACjC,IACE,MAAM,EAAE,OAAO;gBACf,CAAC,CAAC,CAAC,YAAY,KAAK,IAAI,CAAC,CAAC,IAAI,KAAK,YAAY,CAAC,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,CAAC,EACxE,CAAC;gBACD,OAAO;oBACL,MAAM,EAAE,WAAW;oBACnB,OAAO,EAAE,iCAAiC;iBAC3C,CAAC;YACJ,CAAC;YACD,OAAO;gBACL,MAAM,EAAE,SAAS;gBACjB,KAAK,EAAE,CAAC,YAAY,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC;aAClD,CAAC;QACJ,CAAC;IACH,CAAC;CACF"}
|
package/openspec/AGENTS.md
CHANGED
|
@@ -15,14 +15,17 @@ Instructions for AI coding assistants using OpenSpec for spec-driven development
|
|
|
15
15
|
## Three-Stage Workflow
|
|
16
16
|
|
|
17
17
|
### Stage 1: Creating Changes
|
|
18
|
+
|
|
18
19
|
Create proposal when you need to:
|
|
20
|
+
|
|
19
21
|
- Add features or functionality
|
|
20
22
|
- Make breaking changes (API, schema)
|
|
21
|
-
- Change architecture or patterns
|
|
23
|
+
- Change architecture or patterns
|
|
22
24
|
- Optimize performance (changes behavior)
|
|
23
25
|
- Update security patterns
|
|
24
26
|
|
|
25
27
|
Triggers (examples):
|
|
28
|
+
|
|
26
29
|
- "Help me create a change proposal"
|
|
27
30
|
- "Help me plan a change"
|
|
28
31
|
- "Help me create a proposal"
|
|
@@ -30,10 +33,12 @@ Triggers (examples):
|
|
|
30
33
|
- "I want to create a spec"
|
|
31
34
|
|
|
32
35
|
Loose matching guidance:
|
|
36
|
+
|
|
33
37
|
- Contains one of: `proposal`, `change`, `spec`
|
|
34
38
|
- With one of: `create`, `plan`, `make`, `start`, `help`
|
|
35
39
|
|
|
36
40
|
Skip proposal for:
|
|
41
|
+
|
|
37
42
|
- Bug fixes (restore intended behavior)
|
|
38
43
|
- Typos, formatting, comments
|
|
39
44
|
- Dependency updates (non-breaking)
|
|
@@ -41,13 +46,16 @@ Skip proposal for:
|
|
|
41
46
|
- Tests for existing behavior
|
|
42
47
|
|
|
43
48
|
**Workflow**
|
|
49
|
+
|
|
44
50
|
1. Review `openspec/project.md`, `openspec list`, and `openspec list --specs` to understand current context.
|
|
45
51
|
2. Choose a unique verb-led `change-id` and scaffold `proposal.md`, `tasks.md`, optional `design.md`, and spec deltas under `openspec/changes/<id>/`.
|
|
46
52
|
3. Draft spec deltas using `## ADDED|MODIFIED|REMOVED Requirements` with at least one `#### Scenario:` per requirement.
|
|
47
53
|
4. Run `openspec validate <id> --strict --no-interactive` and resolve any issues before sharing the proposal.
|
|
48
54
|
|
|
49
55
|
### Stage 2: Implementing Changes
|
|
56
|
+
|
|
50
57
|
Track these steps as TODOs and complete them one by one.
|
|
58
|
+
|
|
51
59
|
1. **Read proposal.md** - Understand what's being built
|
|
52
60
|
2. **Read design.md** (if exists) - Review technical decisions
|
|
53
61
|
3. **Read tasks.md** - Get implementation checklist
|
|
@@ -57,7 +65,9 @@ Track these steps as TODOs and complete them one by one.
|
|
|
57
65
|
7. **Approval gate** - Do not start implementation until the proposal is reviewed and approved
|
|
58
66
|
|
|
59
67
|
### Stage 3: Archiving Changes
|
|
68
|
+
|
|
60
69
|
After deployment, create separate PR to:
|
|
70
|
+
|
|
61
71
|
- Move `changes/[name]/` → `changes/archive/YYYY-MM-DD-[name]/`
|
|
62
72
|
- Update `specs/` if capabilities changed
|
|
63
73
|
- Use `openspec archive <change-id> --skip-specs --yes` for tooling-only changes (always pass the change ID explicitly)
|
|
@@ -66,6 +76,7 @@ After deployment, create separate PR to:
|
|
|
66
76
|
## Before Any Task
|
|
67
77
|
|
|
68
78
|
**Context Checklist:**
|
|
79
|
+
|
|
69
80
|
- [ ] Read relevant specs in `specs/[capability]/spec.md`
|
|
70
81
|
- [ ] Check pending changes in `changes/` for conflicts
|
|
71
82
|
- [ ] Read `openspec/project.md` for conventions
|
|
@@ -73,12 +84,14 @@ After deployment, create separate PR to:
|
|
|
73
84
|
- [ ] Run `openspec list --specs` to see existing capabilities
|
|
74
85
|
|
|
75
86
|
**Before Creating Specs:**
|
|
87
|
+
|
|
76
88
|
- Always check if capability already exists
|
|
77
89
|
- Prefer modifying existing specs over creating duplicates
|
|
78
90
|
- Use `openspec show [spec]` to review current state
|
|
79
91
|
- If request is ambiguous, ask 1–2 clarifying questions before scaffolding
|
|
80
92
|
|
|
81
93
|
### Search Guidance
|
|
94
|
+
|
|
82
95
|
- Enumerate specs: `openspec spec list --long` (or `--json` for scripts)
|
|
83
96
|
- Enumerate changes: `openspec list` (or `openspec change list --json` - deprecated but available)
|
|
84
97
|
- Show details:
|
|
@@ -147,7 +160,7 @@ openspec/
|
|
|
147
160
|
```
|
|
148
161
|
New request?
|
|
149
162
|
├─ Bug fix restoring spec behavior? → Fix directly
|
|
150
|
-
├─ Typo/format/comment? → Fix directly
|
|
163
|
+
├─ Typo/format/comment? → Fix directly
|
|
151
164
|
├─ New feature/capability? → Create proposal
|
|
152
165
|
├─ Breaking change? → Create proposal
|
|
153
166
|
├─ Architecture change? → Create proposal
|
|
@@ -159,45 +172,60 @@ New request?
|
|
|
159
172
|
1. **Create directory:** `changes/[change-id]/` (kebab-case, verb-led, unique)
|
|
160
173
|
|
|
161
174
|
2. **Write proposal.md:**
|
|
175
|
+
|
|
162
176
|
```markdown
|
|
163
177
|
# Change: [Brief description of change]
|
|
164
178
|
|
|
165
179
|
## Why
|
|
180
|
+
|
|
166
181
|
[1-2 sentences on problem/opportunity]
|
|
167
182
|
|
|
168
183
|
## What Changes
|
|
184
|
+
|
|
169
185
|
- [Bullet list of changes]
|
|
170
186
|
- [Mark breaking changes with **BREAKING**]
|
|
171
187
|
|
|
172
188
|
## Impact
|
|
189
|
+
|
|
173
190
|
- Affected specs: [list capabilities]
|
|
174
191
|
- Affected code: [key files/systems]
|
|
175
192
|
```
|
|
176
193
|
|
|
177
194
|
3. **Create spec deltas:** `specs/[capability]/spec.md`
|
|
195
|
+
|
|
178
196
|
```markdown
|
|
179
197
|
## ADDED Requirements
|
|
198
|
+
|
|
180
199
|
### Requirement: New Feature
|
|
200
|
+
|
|
181
201
|
The system SHALL provide...
|
|
182
202
|
|
|
183
203
|
#### Scenario: Success case
|
|
204
|
+
|
|
184
205
|
- **WHEN** user performs action
|
|
185
206
|
- **THEN** expected result
|
|
186
207
|
|
|
187
208
|
## MODIFIED Requirements
|
|
209
|
+
|
|
188
210
|
### Requirement: Existing Feature
|
|
211
|
+
|
|
189
212
|
[Complete modified requirement]
|
|
190
213
|
|
|
191
214
|
## REMOVED Requirements
|
|
215
|
+
|
|
192
216
|
### Requirement: Old Feature
|
|
217
|
+
|
|
193
218
|
**Reason**: [Why removing]
|
|
194
219
|
**Migration**: [How to handle]
|
|
195
220
|
```
|
|
221
|
+
|
|
196
222
|
If multiple capabilities are affected, create multiple delta files under `changes/[change-id]/specs/<capability>/spec.md`—one per capability.
|
|
197
223
|
|
|
198
224
|
4. **Create tasks.md:**
|
|
225
|
+
|
|
199
226
|
```markdown
|
|
200
227
|
## 1. Implementation
|
|
228
|
+
|
|
201
229
|
- [ ] 1.1 Create database schema
|
|
202
230
|
- [ ] 1.2 Implement API endpoint
|
|
203
231
|
- [ ] 1.3 Add frontend component
|
|
@@ -205,32 +233,40 @@ If multiple capabilities are affected, create multiple delta files under `change
|
|
|
205
233
|
```
|
|
206
234
|
|
|
207
235
|
5. **Create design.md when needed:**
|
|
208
|
-
Create `design.md` if any of the following apply; otherwise omit it:
|
|
236
|
+
Create `design.md` if any of the following apply; otherwise omit it:
|
|
237
|
+
|
|
209
238
|
- Cross-cutting change (multiple services/modules) or a new architectural pattern
|
|
210
239
|
- New external dependency or significant data model changes
|
|
211
240
|
- Security, performance, or migration complexity
|
|
212
241
|
- Ambiguity that benefits from technical decisions before coding
|
|
213
242
|
|
|
214
243
|
Minimal `design.md` skeleton:
|
|
244
|
+
|
|
215
245
|
```markdown
|
|
216
246
|
## Context
|
|
247
|
+
|
|
217
248
|
[Background, constraints, stakeholders]
|
|
218
249
|
|
|
219
250
|
## Goals / Non-Goals
|
|
251
|
+
|
|
220
252
|
- Goals: [...]
|
|
221
253
|
- Non-Goals: [...]
|
|
222
254
|
|
|
223
255
|
## Decisions
|
|
256
|
+
|
|
224
257
|
- Decision: [What and why]
|
|
225
258
|
- Alternatives considered: [Options + rationale]
|
|
226
259
|
|
|
227
260
|
## Risks / Trade-offs
|
|
261
|
+
|
|
228
262
|
- [Risk] → Mitigation
|
|
229
263
|
|
|
230
264
|
## Migration Plan
|
|
265
|
+
|
|
231
266
|
[Steps, rollback]
|
|
232
267
|
|
|
233
268
|
## Open Questions
|
|
269
|
+
|
|
234
270
|
- [...]
|
|
235
271
|
```
|
|
236
272
|
|
|
@@ -239,22 +275,27 @@ Minimal `design.md` skeleton:
|
|
|
239
275
|
### Critical: Scenario Formatting
|
|
240
276
|
|
|
241
277
|
**CORRECT** (use #### headers):
|
|
278
|
+
|
|
242
279
|
```markdown
|
|
243
280
|
#### Scenario: User login success
|
|
281
|
+
|
|
244
282
|
- **WHEN** valid credentials provided
|
|
245
283
|
- **THEN** return JWT token
|
|
246
284
|
```
|
|
247
285
|
|
|
248
286
|
**WRONG** (don't use bullets or bold):
|
|
287
|
+
|
|
249
288
|
```markdown
|
|
250
|
-
- **Scenario: User login**
|
|
251
|
-
**Scenario**: User login
|
|
252
|
-
|
|
289
|
+
- **Scenario: User login** ❌
|
|
290
|
+
**Scenario**: User login ❌
|
|
291
|
+
|
|
292
|
+
### Scenario: User login ❌
|
|
253
293
|
```
|
|
254
294
|
|
|
255
295
|
Every requirement MUST have at least one scenario.
|
|
256
296
|
|
|
257
297
|
### Requirement Wording
|
|
298
|
+
|
|
258
299
|
- Use SHALL/MUST for normative requirements (avoid should/may unless intentionally non-normative)
|
|
259
300
|
|
|
260
301
|
### Delta Operations
|
|
@@ -267,6 +308,7 @@ Every requirement MUST have at least one scenario.
|
|
|
267
308
|
Headers matched with `trim(header)` - whitespace ignored.
|
|
268
309
|
|
|
269
310
|
#### When to use ADDED vs MODIFIED
|
|
311
|
+
|
|
270
312
|
- ADDED: Introduces a new capability or sub-capability that can stand alone as a requirement. Prefer ADDED when the change is orthogonal (e.g., adding "Slash Command Configuration") rather than altering the semantics of an existing requirement.
|
|
271
313
|
- MODIFIED: Changes the behavior, scope, or acceptance criteria of an existing requirement. Always paste the full, updated requirement content (header + all scenarios). The archiver will replace the entire requirement with what you provide here; partial deltas will drop previous details.
|
|
272
314
|
- RENAMED: Use when only the name changes. If you also change behavior, use RENAMED (name) plus MODIFIED (content) referencing the new name.
|
|
@@ -274,14 +316,17 @@ Headers matched with `trim(header)` - whitespace ignored.
|
|
|
274
316
|
Common pitfall: Using MODIFIED to add a new concern without including the previous text. This causes loss of detail at archive time. If you aren’t explicitly changing the existing requirement, add a new requirement under ADDED instead.
|
|
275
317
|
|
|
276
318
|
Authoring a MODIFIED requirement correctly:
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
|
|
319
|
+
|
|
320
|
+
1. Locate the existing requirement in `openspec/specs/<capability>/spec.md`.
|
|
321
|
+
2. Copy the entire requirement block (from `### Requirement: ...` through its scenarios).
|
|
322
|
+
3. Paste it under `## MODIFIED Requirements` and edit to reflect the new behavior.
|
|
323
|
+
4. Ensure the header text matches exactly (whitespace-insensitive) and keep at least one `#### Scenario:`.
|
|
281
324
|
|
|
282
325
|
Example for RENAMED:
|
|
326
|
+
|
|
283
327
|
```markdown
|
|
284
328
|
## RENAMED Requirements
|
|
329
|
+
|
|
285
330
|
- FROM: `### Requirement: Login`
|
|
286
331
|
- TO: `### Requirement: User Authentication`
|
|
287
332
|
```
|
|
@@ -291,14 +336,17 @@ Example for RENAMED:
|
|
|
291
336
|
### Common Errors
|
|
292
337
|
|
|
293
338
|
**"Change must have at least one delta"**
|
|
339
|
+
|
|
294
340
|
- Check `changes/[name]/specs/` exists with .md files
|
|
295
341
|
- Verify files have operation prefixes (## ADDED Requirements)
|
|
296
342
|
|
|
297
343
|
**"Requirement must have at least one scenario"**
|
|
344
|
+
|
|
298
345
|
- Check scenarios use `#### Scenario:` format (4 hashtags)
|
|
299
346
|
- Don't use bullet points or bold for scenario headers
|
|
300
347
|
|
|
301
348
|
**Silent scenario parsing failures**
|
|
349
|
+
|
|
302
350
|
- Exact format required: `#### Scenario: Name`
|
|
303
351
|
- Debug with: `openspec show [change] --json --deltas-only`
|
|
304
352
|
|
|
@@ -360,73 +408,88 @@ openspec/changes/add-2fa-notify/
|
|
|
360
408
|
```
|
|
361
409
|
|
|
362
410
|
auth/spec.md
|
|
411
|
+
|
|
363
412
|
```markdown
|
|
364
413
|
## ADDED Requirements
|
|
414
|
+
|
|
365
415
|
### Requirement: Two-Factor Authentication
|
|
416
|
+
|
|
366
417
|
...
|
|
367
418
|
```
|
|
368
419
|
|
|
369
420
|
notifications/spec.md
|
|
421
|
+
|
|
370
422
|
```markdown
|
|
371
423
|
## ADDED Requirements
|
|
424
|
+
|
|
372
425
|
### Requirement: OTP Email Notification
|
|
426
|
+
|
|
373
427
|
...
|
|
374
428
|
```
|
|
375
429
|
|
|
376
430
|
## Best Practices
|
|
377
431
|
|
|
378
432
|
### Simplicity First
|
|
433
|
+
|
|
379
434
|
- Default to <100 lines of new code
|
|
380
435
|
- Single-file implementations until proven insufficient
|
|
381
436
|
- Avoid frameworks without clear justification
|
|
382
437
|
- Choose boring, proven patterns
|
|
383
438
|
|
|
384
439
|
### Complexity Triggers
|
|
440
|
+
|
|
385
441
|
Only add complexity with:
|
|
442
|
+
|
|
386
443
|
- Performance data showing current solution too slow
|
|
387
444
|
- Concrete scale requirements (>1000 users, >100MB data)
|
|
388
445
|
- Multiple proven use cases requiring abstraction
|
|
389
446
|
|
|
390
447
|
### Clear References
|
|
448
|
+
|
|
391
449
|
- Use `file.ts:42` format for code locations
|
|
392
450
|
- Reference specs as `specs/auth/spec.md`
|
|
393
451
|
- Link related changes and PRs
|
|
394
452
|
|
|
395
453
|
### Capability Naming
|
|
454
|
+
|
|
396
455
|
- Use verb-noun: `user-auth`, `payment-capture`
|
|
397
456
|
- Single purpose per capability
|
|
398
457
|
- 10-minute understandability rule
|
|
399
458
|
- Split if description needs "AND"
|
|
400
459
|
|
|
401
460
|
### Change ID Naming
|
|
461
|
+
|
|
402
462
|
- Use kebab-case, short and descriptive: `add-two-factor-auth`
|
|
403
463
|
- Prefer verb-led prefixes: `add-`, `update-`, `remove-`, `refactor-`
|
|
404
464
|
- Ensure uniqueness; if taken, append `-2`, `-3`, etc.
|
|
405
465
|
|
|
406
466
|
## Tool Selection Guide
|
|
407
467
|
|
|
408
|
-
| Task
|
|
409
|
-
|
|
410
|
-
| Find files by pattern | Glob | Fast pattern matching
|
|
411
|
-
| Search code content
|
|
412
|
-
| Read specific files
|
|
468
|
+
| Task | Tool | Why |
|
|
469
|
+
| --------------------- | ---- | ------------------------ |
|
|
470
|
+
| Find files by pattern | Glob | Fast pattern matching |
|
|
471
|
+
| Search code content | Grep | Optimized regex search |
|
|
472
|
+
| Read specific files | Read | Direct file access |
|
|
413
473
|
| Explore unknown scope | Task | Multi-step investigation |
|
|
414
474
|
|
|
415
475
|
## Error Recovery
|
|
416
476
|
|
|
417
477
|
### Change Conflicts
|
|
478
|
+
|
|
418
479
|
1. Run `openspec list` to see active changes
|
|
419
480
|
2. Check for overlapping specs
|
|
420
481
|
3. Coordinate with change owners
|
|
421
482
|
4. Consider combining proposals
|
|
422
483
|
|
|
423
484
|
### Validation Failures
|
|
485
|
+
|
|
424
486
|
1. Run with `--strict` flag
|
|
425
487
|
2. Check JSON output for details
|
|
426
488
|
3. Verify spec file format
|
|
427
489
|
4. Ensure scenarios properly formatted
|
|
428
490
|
|
|
429
491
|
### Missing Context
|
|
492
|
+
|
|
430
493
|
1. Read project.md first
|
|
431
494
|
2. Check related specs
|
|
432
495
|
3. Review recent archives
|
|
@@ -435,17 +498,20 @@ Only add complexity with:
|
|
|
435
498
|
## Quick Reference
|
|
436
499
|
|
|
437
500
|
### Stage Indicators
|
|
501
|
+
|
|
438
502
|
- `changes/` - Proposed, not yet built
|
|
439
503
|
- `specs/` - Built and deployed
|
|
440
504
|
- `archive/` - Completed changes
|
|
441
505
|
|
|
442
506
|
### File Purposes
|
|
507
|
+
|
|
443
508
|
- `proposal.md` - Why and what
|
|
444
509
|
- `tasks.md` - Implementation steps
|
|
445
510
|
- `design.md` - Technical decisions
|
|
446
511
|
- `spec.md` - Requirements and behavior
|
|
447
512
|
|
|
448
513
|
### CLI Essentials
|
|
514
|
+
|
|
449
515
|
```bash
|
|
450
516
|
openspec list # What's in progress?
|
|
451
517
|
openspec show [item] # View details
|
|
@@ -1,14 +1,17 @@
|
|
|
1
1
|
# Change: Add Concurrency Control
|
|
2
2
|
|
|
3
3
|
## Why
|
|
4
|
-
|
|
4
|
+
|
|
5
|
+
The current implementation executes _all_ independent tasks in parallel. In large graphs with many independent nodes, this could overwhelm system resources (CPU, memory) or trigger external API rate limits.
|
|
5
6
|
|
|
6
7
|
## What Changes
|
|
8
|
+
|
|
7
9
|
- Add `concurrency: number` optional property to `WorkflowExecutor`.
|
|
8
10
|
- Modify `WorkflowExecutor.processLoop` to respect the concurrency limit.
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
11
|
+
- Track the active promise count.
|
|
12
|
+
- Only start new tasks from the ready queue if `active < concurrency`.
|
|
13
|
+
- Continue to defer ready tasks until slots open up.
|
|
12
14
|
|
|
13
15
|
## Impact
|
|
16
|
+
|
|
14
17
|
- **Affected Components**: `WorkflowExecutor`
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
## Implementation
|
|
2
|
+
|
|
2
3
|
- [x] 1.1 Update `TaskRunnerExecutionConfig` to include an optional `concurrency` property.
|
|
3
4
|
- [x] 1.2 Update `WorkflowExecutor` to accept the `concurrency` limit.
|
|
4
5
|
- [x] 1.3 Implement a task queueing mechanism in `WorkflowExecutor` to manage pending tasks.
|
|
@@ -1,14 +1,17 @@
|
|
|
1
1
|
# Change: Add External Task Cancellation
|
|
2
2
|
|
|
3
3
|
## Why
|
|
4
|
+
|
|
4
5
|
Once `TaskRunner.execute()` is called, there is no way to cancel the operation externally. If a task hangs or if the user wants to abort the workflow (e.g., in a CLI or UI context), the runner continues until completion or failure. This limits the responsiveness and control users have over long-running operations.
|
|
5
6
|
|
|
6
7
|
## What Changes
|
|
8
|
+
|
|
7
9
|
- The `TaskRunner.execute()` method will be updated to accept an optional configuration object.
|
|
8
10
|
- This configuration object will support an `AbortSignal` for external cancellation.
|
|
9
11
|
- The configuration object will also support a global timeout for the entire workflow.
|
|
10
12
|
- Tasks will be able to respond to cancellation signals and report their status accordingly.
|
|
11
13
|
|
|
12
14
|
## Impact
|
|
15
|
+
|
|
13
16
|
- Affected specs: `001-generic-task-runner` (specifically the `TaskRunner`'s `execute` method behavior)
|
|
14
|
-
- Affected code: `src/TaskRunner.ts`, `src/contracts/RunnerEvents.ts` (for cancellation events), potentially `src/TaskStep.ts` (to propagate `AbortSignal` to individual steps).
|
|
17
|
+
- Affected code: `src/TaskRunner.ts`, `src/contracts/RunnerEvents.ts` (for cancellation events), potentially `src/TaskStep.ts` (to propagate `AbortSignal` to individual steps).
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
## Implementation
|
|
2
|
+
|
|
2
3
|
- [x] 1.1 Update `TaskRunner.execute` signature to accept an optional config object.
|
|
3
4
|
- [x] 1.2 Implement logic within `TaskRunner` to listen for `AbortSignal` and initiate cancellation.
|
|
4
5
|
- [x] 1.3 Implement global timeout mechanism using `AbortController` and `setTimeout`.
|
|
@@ -7,4 +8,4 @@
|
|
|
7
8
|
- [x] 1.6 Update `TaskResult` and `RunnerEvents` to reflect cancellation status.
|
|
8
9
|
- [x] 1.7 Add unit tests for `AbortSignal` cancellation scenarios.
|
|
9
10
|
- [x] 1.8 Add unit tests for global timeout scenarios.
|
|
10
|
-
- [x] 1.9 Add integration tests covering both `AbortSignal` and timeout interactions.
|
|
11
|
+
- [x] 1.9 Add integration tests covering both `AbortSignal` and timeout interactions.
|