@critical-path/core 0.27.0 → 0.28.0
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/CHANGELOG.md +22 -0
- package/README.md +2 -0
- package/dist/domain/custom-fields.d.ts +7 -2
- package/dist/domain/custom-fields.d.ts.map +1 -1
- package/dist/domain/custom-fields.js +23 -1
- package/dist/domain/custom-fields.js.map +1 -1
- package/dist/engine/index.d.ts +1 -0
- package/dist/engine/index.d.ts.map +1 -1
- package/dist/engine/index.js +31 -21
- package/dist/engine/index.js.map +1 -1
- package/dist/plugins/index.d.ts +13 -3
- package/dist/plugins/index.d.ts.map +1 -1
- package/dist/plugins/index.js +44 -15
- package/dist/plugins/index.js.map +1 -1
- package/dist/plugins/plugins.test.d.ts +2 -0
- package/dist/plugins/plugins.test.d.ts.map +1 -0
- package/dist/plugins/plugins.test.js +137 -0
- package/dist/plugins/plugins.test.js.map +1 -0
- package/dist/schemas/index.d.ts +94 -91
- package/dist/schemas/index.d.ts.map +1 -1
- package/dist/schemas/index.js +2 -1
- package/dist/schemas/index.js.map +1 -1
- package/dist/types/index.d.ts +51 -5
- package/dist/types/index.d.ts.map +1 -1
- package/package.json +1 -1
- package/src/domain/custom-fields.ts +43 -2
- package/src/engine/index.ts +46 -25
- package/src/plugins/index.ts +51 -16
- package/src/plugins/plugins.test.ts +161 -0
- package/src/schemas/index.ts +2 -1
- package/src/types/index.ts +57 -5
- package/tsconfig.tsbuildinfo +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,27 @@
|
|
|
1
1
|
# @critical-path/core
|
|
2
2
|
|
|
3
|
+
## 0.28.0
|
|
4
|
+
|
|
5
|
+
### Minor Changes
|
|
6
|
+
|
|
7
|
+
- 4fbbc40: Complete the plugin system.
|
|
8
|
+
|
|
9
|
+
**@critical-path/core**
|
|
10
|
+
- `plugin.init(engine)` now runs at startup. `engine.ready` resolves after seeding and every plugin's `init`; init failures reject `ready`.
|
|
11
|
+
- **BREAKING:** `customFieldTypes` is now `CustomFieldType[]` (`{ type, label?, validate(value, definition) }`), not unused definitions. Projects may use registered types in `customFieldDefinitions`; unknown types are rejected on project create and update. New `validateCustomFieldDefinitions`, and `validateCustomFieldValues` accepts the registered types.
|
|
12
|
+
- **BREAKING:** before-hook output is now validated (workflow transitions, custom fields) like caller input. Hooks cannot change a task's `projectId` (rejected on create, ignored on update), `id` or `createdAt`.
|
|
13
|
+
- After-hook errors are logged with the plugin id instead of failing an already-stored write.
|
|
14
|
+
- **BREAKING:** `beforeTaskDelete` and `afterTaskDelete` receive the task as a second argument.
|
|
15
|
+
- **BREAKING:** required custom fields are enforced even when `customFields` is omitted.
|
|
16
|
+
- New plugin `routes` and `middleware` types (`PluginRoute`, `PluginMiddleware`, `PluginRequestContext`).
|
|
17
|
+
|
|
18
|
+
**@critical-path/server**
|
|
19
|
+
- Serves plugin `routes` (with `:param` patterns) before built-in routes, and runs plugin `middleware` around every routed request after authentication. Handlers receive the caller's `withActor` engine.
|
|
20
|
+
- Awaits `engine.ready` before handling requests.
|
|
21
|
+
|
|
22
|
+
**@critical-path/mcp**
|
|
23
|
+
- Awaits `engine.ready` before running tools.
|
|
24
|
+
|
|
3
25
|
## 0.27.0
|
|
4
26
|
|
|
5
27
|
### Minor Changes
|
package/README.md
CHANGED
|
@@ -354,3 +354,5 @@ export const auditPlugin: CriticalPathPlugin = {
|
|
|
354
354
|
}
|
|
355
355
|
};
|
|
356
356
|
```
|
|
357
|
+
|
|
358
|
+
Plugins can also contribute `init(engine)` (awaited via `engine.ready`), `customFieldTypes` (validated custom field types for project `customFieldDefinitions`), and HTTP `routes` / `middleware` served by `@critical-path/server`. Before-hook output is validated like caller input, and after-hook errors are logged instead of failing the write.
|
|
@@ -1,9 +1,14 @@
|
|
|
1
|
-
import type { CustomFieldDefinition } from '../types/index.js';
|
|
1
|
+
import type { CustomFieldDefinition, CustomFieldType } from '../types/index.js';
|
|
2
2
|
export declare class CustomFieldValidationError extends Error {
|
|
3
3
|
readonly fieldKey: string;
|
|
4
4
|
readonly expectedType?: string;
|
|
5
5
|
readonly receivedValue?: unknown;
|
|
6
6
|
constructor(message: string, fieldKey: string, expectedType?: string, receivedValue?: unknown);
|
|
7
7
|
}
|
|
8
|
-
export declare function validateCustomFieldValues(definitions: CustomFieldDefinition[] | undefined, values: Record<string, unknown> | undefined): void;
|
|
8
|
+
export declare function validateCustomFieldValues(definitions: CustomFieldDefinition[] | undefined, values: Record<string, unknown> | undefined, customTypes?: ReadonlyMap<string, CustomFieldType>): void;
|
|
9
|
+
/**
|
|
10
|
+
* Checks that every definition uses a built-in type or one registered by a plugin, so projects
|
|
11
|
+
* cannot be configured with fields that would reject every value.
|
|
12
|
+
*/
|
|
13
|
+
export declare function validateCustomFieldDefinitions(definitions: CustomFieldDefinition[] | undefined, customTypes?: ReadonlyMap<string, CustomFieldType>): void;
|
|
9
14
|
//# sourceMappingURL=custom-fields.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"custom-fields.d.ts","sourceRoot":"","sources":["../../src/domain/custom-fields.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,mBAAmB,CAAC;
|
|
1
|
+
{"version":3,"file":"custom-fields.d.ts","sourceRoot":"","sources":["../../src/domain/custom-fields.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,qBAAqB,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AAGhF,qBAAa,0BAA2B,SAAQ,KAAK;IACnD,SAAgB,QAAQ,EAAE,MAAM,CAAC;IACjC,SAAgB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtC,SAAgB,aAAa,CAAC,EAAE,OAAO,CAAC;gBAE5B,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,YAAY,CAAC,EAAE,MAAM,EAAE,aAAa,CAAC,EAAE,OAAO;CAO9F;AAED,wBAAgB,yBAAyB,CACvC,WAAW,EAAE,qBAAqB,EAAE,GAAG,SAAS,EAChD,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,SAAS,EAC3C,WAAW,CAAC,EAAE,WAAW,CAAC,MAAM,EAAE,eAAe,CAAC,GACjD,IAAI,CAmIN;AAED;;;GAGG;AACH,wBAAgB,8BAA8B,CAC5C,WAAW,EAAE,qBAAqB,EAAE,GAAG,SAAS,EAChD,WAAW,CAAC,EAAE,WAAW,CAAC,MAAM,EAAE,eAAe,CAAC,GACjD,IAAI,CAUN"}
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { BUILT_IN_CUSTOM_FIELD_TYPES } from '../plugins/index.js';
|
|
1
2
|
export class CustomFieldValidationError extends Error {
|
|
2
3
|
fieldKey;
|
|
3
4
|
expectedType;
|
|
@@ -10,7 +11,7 @@ export class CustomFieldValidationError extends Error {
|
|
|
10
11
|
this.receivedValue = receivedValue;
|
|
11
12
|
}
|
|
12
13
|
}
|
|
13
|
-
export function validateCustomFieldValues(definitions, values) {
|
|
14
|
+
export function validateCustomFieldValues(definitions, values, customTypes) {
|
|
14
15
|
if (!definitions || definitions.length === 0)
|
|
15
16
|
return;
|
|
16
17
|
const customValues = values || {};
|
|
@@ -66,6 +67,27 @@ export function validateCustomFieldValues(definitions, values) {
|
|
|
66
67
|
}
|
|
67
68
|
}
|
|
68
69
|
break;
|
|
70
|
+
default: {
|
|
71
|
+
const custom = customTypes?.get(def.type);
|
|
72
|
+
if (!custom) {
|
|
73
|
+
throw new CustomFieldValidationError(`Custom field "${def.label || def.key}" has unknown type "${def.type}". Register it with a plugin's customFieldTypes.`, def.key, def.type, value);
|
|
74
|
+
}
|
|
75
|
+
const problem = custom.validate(value, def);
|
|
76
|
+
if (problem) {
|
|
77
|
+
throw new CustomFieldValidationError(`Custom field "${def.label || def.key}" ${problem}`, def.key, def.type, value);
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
/**
|
|
84
|
+
* Checks that every definition uses a built-in type or one registered by a plugin, so projects
|
|
85
|
+
* cannot be configured with fields that would reject every value.
|
|
86
|
+
*/
|
|
87
|
+
export function validateCustomFieldDefinitions(definitions, customTypes) {
|
|
88
|
+
for (const def of definitions ?? []) {
|
|
89
|
+
if (!BUILT_IN_CUSTOM_FIELD_TYPES.includes(def.type) && !customTypes?.has(def.type)) {
|
|
90
|
+
throw new CustomFieldValidationError(`Custom field "${def.label || def.key}" has unknown type "${def.type}". Register it with a plugin's customFieldTypes.`, def.key, def.type);
|
|
69
91
|
}
|
|
70
92
|
}
|
|
71
93
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"custom-fields.js","sourceRoot":"","sources":["../../src/domain/custom-fields.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"custom-fields.js","sourceRoot":"","sources":["../../src/domain/custom-fields.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,2BAA2B,EAAE,MAAM,qBAAqB,CAAC;AAElE,MAAM,OAAO,0BAA2B,SAAQ,KAAK;IACnC,QAAQ,CAAS;IACjB,YAAY,CAAU;IACtB,aAAa,CAAW;IAExC,YAAY,OAAe,EAAE,QAAgB,EAAE,YAAqB,EAAE,aAAuB;QAC3F,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,4BAA4B,CAAC;QACzC,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAC;QACzB,IAAI,CAAC,YAAY,GAAG,YAAY,CAAC;QACjC,IAAI,CAAC,aAAa,GAAG,aAAa,CAAC;IACrC,CAAC;CACF;AAED,MAAM,UAAU,yBAAyB,CACvC,WAAgD,EAChD,MAA2C,EAC3C,WAAkD;IAElD,IAAI,CAAC,WAAW,IAAI,WAAW,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO;IACrD,MAAM,YAAY,GAAG,MAAM,IAAI,EAAE,CAAC;IAElC,KAAK,MAAM,GAAG,IAAI,WAAW,EAAE,CAAC;QAC9B,MAAM,KAAK,GAAG,YAAY,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QAEpC,2BAA2B;QAC3B,IAAI,GAAG,CAAC,QAAQ,IAAI,CAAC,KAAK,KAAK,SAAS,IAAI,KAAK,KAAK,IAAI,IAAI,KAAK,KAAK,EAAE,CAAC,EAAE,CAAC;YAC5E,MAAM,IAAI,0BAA0B,CAClC,iBAAiB,GAAG,CAAC,KAAK,IAAI,GAAG,CAAC,GAAG,MAAM,GAAG,CAAC,GAAG,gBAAgB,EAClE,GAAG,CAAC,GAAG,EACP,GAAG,CAAC,IAAI,EACR,KAAK,CACN,CAAC;QACJ,CAAC;QAED,IAAI,KAAK,KAAK,SAAS,IAAI,KAAK,KAAK,IAAI,EAAE,CAAC;YAC1C,SAAS;QACX,CAAC;QAED,6BAA6B;QAC7B,QAAQ,GAAG,CAAC,IAAI,EAAE,CAAC;YACjB,KAAK,QAAQ;gBACX,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,CAAC,KAAK,CAAC,EAAE,CAAC;oBAC9C,MAAM,IAAI,0BAA0B,CAClC,iBAAiB,GAAG,CAAC,KAAK,IAAI,GAAG,CAAC,GAAG,uCAAuC,OAAO,KAAK,EAAE,EAC1F,GAAG,CAAC,GAAG,EACP,QAAQ,EACR,KAAK,CACN,CAAC;gBACJ,CAAC;gBACD,MAAM;YAER,KAAK,MAAM,CAAC;YACZ,KAAK,MAAM;gBACT,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;oBAC9B,MAAM,IAAI,0BAA0B,CAClC,iBAAiB,GAAG,CAAC,KAAK,IAAI,GAAG,CAAC,GAAG,iCAAiC,OAAO,KAAK,EAAE,EACpF,GAAG,CAAC,GAAG,EACP,GAAG,CAAC,IAAI,EACR,KAAK,CACN,CAAC;gBACJ,CAAC;gBACD,MAAM;YAER,KAAK,SAAS;gBACZ,IAAI,OAAO,KAAK,KAAK,SAAS,EAAE,CAAC;oBAC/B,MAAM,IAAI,0BAA0B,CAClC,iBAAiB,GAAG,CAAC,KAAK,IAAI,GAAG,CAAC,GAAG,kCAAkC,OAAO,KAAK,EAAE,EACrF,GAAG,CAAC,GAAG,EACP,SAAS,EACT,KAAK,CACN,CAAC;gBACJ,CAAC;gBACD,MAAM;YAER,KAAK,MAAM;gBACT,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,CAAC,IAAI,IAAI,CAAC,KAAK,CAAC,CAAC,OAAO,EAAE,CAAC,EAAE,CAAC;oBAClE,MAAM,IAAI,0BAA0B,CAClC,iBAAiB,GAAG,CAAC,KAAK,IAAI,GAAG,CAAC,GAAG,gDAAgD,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,EAAE,EAC5G,GAAG,CAAC,GAAG,EACP,MAAM,EACN,KAAK,CACN,CAAC;gBACJ,CAAC;gBACD,MAAM;YAER,KAAK,eAAe;gBAClB,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;oBAC9B,MAAM,IAAI,0BAA0B,CAClC,iBAAiB,GAAG,CAAC,KAAK,IAAI,GAAG,CAAC,GAAG,wCAAwC,OAAO,KAAK,EAAE,EAC3F,GAAG,CAAC,GAAG,EACP,eAAe,EACf,KAAK,CACN,CAAC;gBACJ,CAAC;gBACD,IAAI,GAAG,CAAC,OAAO,IAAI,GAAG,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;oBAC1E,MAAM,IAAI,0BAA0B,CAClC,iBAAiB,GAAG,CAAC,KAAK,IAAI,GAAG,CAAC,GAAG,YAAY,KAAK,+BAA+B,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,EAC/G,GAAG,CAAC,GAAG,EACP,eAAe,EACf,KAAK,CACN,CAAC;gBACJ,CAAC;gBACD,MAAM;YAER,KAAK,cAAc;gBACjB,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;oBAC1B,MAAM,IAAI,0BAA0B,CAClC,iBAAiB,GAAG,CAAC,KAAK,IAAI,GAAG,CAAC,GAAG,mDAAmD,OAAO,KAAK,EAAE,EACtG,GAAG,CAAC,GAAG,EACP,cAAc,EACd,KAAK,CACN,CAAC;gBACJ,CAAC;gBACD,IAAI,GAAG,CAAC,OAAO,IAAI,GAAG,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;oBAC1C,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;wBACzB,IAAI,OAAO,IAAI,KAAK,QAAQ,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;4BAC5D,MAAM,IAAI,0BAA0B,CAClC,iBAAiB,GAAG,CAAC,KAAK,IAAI,GAAG,CAAC,GAAG,aAAa,IAAI,wBAAwB,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,EACxG,GAAG,CAAC,GAAG,EACP,cAAc,EACd,IAAI,CACL,CAAC;wBACJ,CAAC;oBACH,CAAC;gBACH,CAAC;gBACD,MAAM;YACR,OAAO,CAAC,CAAC,CAAC;gBACR,MAAM,MAAM,GAAG,WAAW,EAAE,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;gBAC1C,IAAI,CAAC,MAAM,EAAE,CAAC;oBACZ,MAAM,IAAI,0BAA0B,CAClC,iBAAiB,GAAG,CAAC,KAAK,IAAI,GAAG,CAAC,GAAG,uBAAuB,GAAG,CAAC,IAAI,kDAAkD,EACtH,GAAG,CAAC,GAAG,EACP,GAAG,CAAC,IAAI,EACR,KAAK,CACN,CAAC;gBACJ,CAAC;gBACD,MAAM,OAAO,GAAG,MAAM,CAAC,QAAQ,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;gBAC5C,IAAI,OAAO,EAAE,CAAC;oBACZ,MAAM,IAAI,0BAA0B,CAClC,iBAAiB,GAAG,CAAC,KAAK,IAAI,GAAG,CAAC,GAAG,KAAK,OAAO,EAAE,EACnD,GAAG,CAAC,GAAG,EACP,GAAG,CAAC,IAAI,EACR,KAAK,CACN,CAAC;gBACJ,CAAC;YACH,CAAC;QACH,CAAC;IACH,CAAC;AACH,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,8BAA8B,CAC5C,WAAgD,EAChD,WAAkD;IAElD,KAAK,MAAM,GAAG,IAAI,WAAW,IAAI,EAAE,EAAE,CAAC;QACpC,IAAI,CAAE,2BAAiD,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC;YAC1G,MAAM,IAAI,0BAA0B,CAClC,iBAAiB,GAAG,CAAC,KAAK,IAAI,GAAG,CAAC,GAAG,uBAAuB,GAAG,CAAC,IAAI,kDAAkD,EACtH,GAAG,CAAC,GAAG,EACP,GAAG,CAAC,IAAI,CACT,CAAC;QACJ,CAAC;IACH,CAAC;AACH,CAAC"}
|
package/dist/engine/index.d.ts
CHANGED
|
@@ -53,6 +53,7 @@ export declare class CriticalPathEngine {
|
|
|
53
53
|
private projectIdOfAttachment;
|
|
54
54
|
/** Strips fields only the engine may set (tenancy) from updates made through a view. */
|
|
55
55
|
private withoutTenant;
|
|
56
|
+
private initialize;
|
|
56
57
|
private seedInitialData;
|
|
57
58
|
getWorkflows(): Promise<Workflow[]>;
|
|
58
59
|
getWorkflow(id: string): Promise<Workflow | null>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/engine/index.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/engine/index.ts"],"names":[],"mappings":"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"}
|
package/dist/engine/index.js
CHANGED
|
@@ -5,7 +5,7 @@ import { validateTransition, getAllowedNextStatuses, getAllowedPreviousStatuses,
|
|
|
5
5
|
import { extractMentions } from '../utils/mentions.js';
|
|
6
6
|
import { DomainEventBus } from '../domain/events.js';
|
|
7
7
|
import { validateAttachmentUrl } from '../domain/entities.js';
|
|
8
|
-
import { validateCustomFieldValues } from '../domain/custom-fields.js';
|
|
8
|
+
import { validateCustomFieldValues, validateCustomFieldDefinitions } from '../domain/custom-fields.js';
|
|
9
9
|
import { detectDependencyCycle, CircularDependencyError } from '../domain/graph.js';
|
|
10
10
|
import { ValidationError, NotFoundError, ForbiddenError } from '../domain/errors.js';
|
|
11
11
|
import { WebhookDispatcher, assertWebhookUrl } from '../webhooks/dispatcher.js';
|
|
@@ -45,9 +45,9 @@ export class CriticalPathEngine {
|
|
|
45
45
|
this.plugins.register(plugin);
|
|
46
46
|
}
|
|
47
47
|
}
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
}
|
|
48
|
+
this.ready = this.initialize(config);
|
|
49
|
+
// Callers that never await `ready` should not crash on an unhandled rejection; awaiting it still throws.
|
|
50
|
+
this.ready.catch(() => { });
|
|
51
51
|
}
|
|
52
52
|
/**
|
|
53
53
|
* Returns a view of this engine that attributes every mutation to `actor`: activity log
|
|
@@ -160,6 +160,14 @@ export class CriticalPathEngine {
|
|
|
160
160
|
const { tenantId: _ignored, ...rest } = updates;
|
|
161
161
|
return rest;
|
|
162
162
|
}
|
|
163
|
+
async initialize(config) {
|
|
164
|
+
if (config.initialData) {
|
|
165
|
+
await this.seedInitialData(config.initialData);
|
|
166
|
+
}
|
|
167
|
+
for (const plugin of this.plugins.getPlugins()) {
|
|
168
|
+
await plugin.init?.(this);
|
|
169
|
+
}
|
|
170
|
+
}
|
|
163
171
|
async seedInitialData(data) {
|
|
164
172
|
if (data.workflows) {
|
|
165
173
|
for (const wf of data.workflows) {
|
|
@@ -328,6 +336,7 @@ export class CriticalPathEngine {
|
|
|
328
336
|
}
|
|
329
337
|
async createProject(project) {
|
|
330
338
|
await this.requireWorkspaceAccess('project.create');
|
|
339
|
+
validateCustomFieldDefinitions(project.customFieldDefinitions, this.plugins.getCustomFieldTypes());
|
|
331
340
|
// Views always use the actor's tenant (possibly none); only trusted base-engine calls may set it.
|
|
332
341
|
const input = { ...project, tenantId: this.actor ? this.actor.tenantId : project.tenantId };
|
|
333
342
|
// The creator administers the project they create.
|
|
@@ -360,6 +369,7 @@ export class CriticalPathEngine {
|
|
|
360
369
|
await this.requireProjectAccess('project.update', id);
|
|
361
370
|
if ('members' in updates)
|
|
362
371
|
await this.requireProjectAccess('project.manage_members', id);
|
|
372
|
+
validateCustomFieldDefinitions(updates.customFieldDefinitions, this.plugins.getCustomFieldTypes());
|
|
363
373
|
updates = this.withoutTenant(updates);
|
|
364
374
|
const updated = await this.store.updateProject(id, updates);
|
|
365
375
|
if (updated) {
|
|
@@ -440,13 +450,14 @@ export class CriticalPathEngine {
|
|
|
440
450
|
taskInput = { ...taskInput, reporterId: this.actor.userId };
|
|
441
451
|
}
|
|
442
452
|
const processedInput = await this.plugins.runBeforeTaskCreate(taskInput);
|
|
443
|
-
|
|
453
|
+
if (processedInput.projectId && processedInput.projectId !== taskInput.projectId) {
|
|
454
|
+
throw new ValidationError('Plugins cannot move a task to another project in beforeTaskCreate.');
|
|
455
|
+
}
|
|
456
|
+
const projectId = taskInput.projectId;
|
|
444
457
|
const project = await this.store.getProject(projectId);
|
|
445
458
|
const workflow = await this.resolveProjectWorkflow(projectId);
|
|
446
|
-
// Validate custom
|
|
447
|
-
|
|
448
|
-
validateCustomFieldValues(project.customFieldDefinitions, processedInput.customFields || taskInput.customFields);
|
|
449
|
-
}
|
|
459
|
+
// Validate custom fields on the final (post-plugin) input, including required fields when none are given
|
|
460
|
+
validateCustomFieldValues(project?.customFieldDefinitions, processedInput.customFields ?? taskInput.customFields, this.plugins.getCustomFieldTypes());
|
|
450
461
|
const defaultStatus = workflow?.defaultStatusKey || 'todo';
|
|
451
462
|
const initialStatus = processedInput.status || taskInput.status || defaultStatus;
|
|
452
463
|
const now = new Date().toISOString();
|
|
@@ -533,21 +544,20 @@ export class CriticalPathEngine {
|
|
|
533
544
|
const taskUpdates = updates;
|
|
534
545
|
const project = await this.store.getProject(existing.projectId);
|
|
535
546
|
const workflow = await this.resolveProjectWorkflow(existing.projectId);
|
|
547
|
+
// Plugins run first; their output is then validated like caller input. Identity and
|
|
548
|
+
// ownership fields are never changed by hooks.
|
|
549
|
+
const { id: _id, projectId: _projectId, createdAt: _createdAt, ...processedUpdates } = await this.plugins.runBeforeTaskUpdate(id, taskUpdates);
|
|
536
550
|
// Validate workflow transition invariant
|
|
537
|
-
if (
|
|
538
|
-
const isValid = validateTransition(workflow || undefined, existing.status,
|
|
551
|
+
if (processedUpdates.status && processedUpdates.status !== existing.status) {
|
|
552
|
+
const isValid = validateTransition(workflow || undefined, existing.status, processedUpdates.status);
|
|
539
553
|
if (!isValid) {
|
|
540
|
-
throw new WorkflowValidationError(existing.status,
|
|
554
|
+
throw new WorkflowValidationError(existing.status, processedUpdates.status, workflow?.id);
|
|
541
555
|
}
|
|
542
556
|
}
|
|
543
557
|
// Validate custom field invariants
|
|
544
|
-
if (
|
|
545
|
-
validateCustomFieldValues(project
|
|
546
|
-
...existing.customFields,
|
|
547
|
-
...taskUpdates.customFields
|
|
548
|
-
});
|
|
558
|
+
if (processedUpdates.customFields) {
|
|
559
|
+
validateCustomFieldValues(project?.customFieldDefinitions, { ...existing.customFields, ...processedUpdates.customFields }, this.plugins.getCustomFieldTypes());
|
|
549
560
|
}
|
|
550
|
-
const processedUpdates = await this.plugins.runBeforeTaskUpdate(id, taskUpdates);
|
|
551
561
|
const now = new Date().toISOString();
|
|
552
562
|
const existingStatusDef = resolveStatusDefinition(existing.status, project?.statusDefinitions || workflow?.statuses);
|
|
553
563
|
const newStatusDef = processedUpdates.status
|
|
@@ -869,10 +879,10 @@ export class CriticalPathEngine {
|
|
|
869
879
|
if (!existing)
|
|
870
880
|
return false;
|
|
871
881
|
await this.requireProjectAccess('task.delete', existing.projectId);
|
|
872
|
-
await this.plugins.runBeforeTaskDelete(id);
|
|
882
|
+
await this.plugins.runBeforeTaskDelete(id, existing);
|
|
873
883
|
const deleted = await this.store.deleteTask(id);
|
|
874
884
|
if (deleted) {
|
|
875
|
-
await this.plugins.runAfterTaskDelete(id);
|
|
885
|
+
await this.plugins.runAfterTaskDelete(id, existing);
|
|
876
886
|
const now = new Date().toISOString();
|
|
877
887
|
const event = {
|
|
878
888
|
id: `evt_${Math.random().toString(36).substring(2, 9)}`,
|
|
@@ -1442,7 +1452,7 @@ export class CriticalPathEngine {
|
|
|
1442
1452
|
await this.requireProjectAccess('plan.manage', input.projectId);
|
|
1443
1453
|
const project = await this.store.getProject(input.projectId);
|
|
1444
1454
|
if (project?.customFieldDefinitions && input.customFields) {
|
|
1445
|
-
validateCustomFieldValues(project.customFieldDefinitions, input.customFields);
|
|
1455
|
+
validateCustomFieldValues(project.customFieldDefinitions, input.customFields, this.plugins.getCustomFieldTypes());
|
|
1446
1456
|
}
|
|
1447
1457
|
const created = await this.store.createDeliverable({
|
|
1448
1458
|
...input,
|