@langadventurellc/task-trellis-mcp 1.1.0 → 1.2.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/README.md +37 -323
- package/dist/__tests__/e2e/autoPrune.e2e.test.d.ts +2 -0
- package/dist/__tests__/e2e/autoPrune.e2e.test.d.ts.map +1 -0
- package/dist/__tests__/e2e/autoPrune.e2e.test.js +533 -0
- package/dist/__tests__/e2e/autoPrune.e2e.test.js.map +1 -0
- package/dist/__tests__/e2e/configuration/activation.e2e.test.js +6 -6
- package/dist/__tests__/e2e/configuration/activation.e2e.test.js.map +1 -1
- package/dist/__tests__/e2e/configuration/commandLineArgs.e2e.test.js +55 -6
- package/dist/__tests__/e2e/configuration/commandLineArgs.e2e.test.js.map +1 -1
- package/dist/__tests__/e2e/configuration/directorySetup.e2e.test.js +19 -19
- package/dist/__tests__/e2e/configuration/directorySetup.e2e.test.js.map +1 -1
- package/dist/__tests__/e2e/configuration/invalidConfig.e2e.test.js +9 -9
- package/dist/__tests__/e2e/configuration/invalidConfig.e2e.test.js.map +1 -1
- package/dist/__tests__/e2e/configuration/preActivation.e2e.test.js +15 -15
- package/dist/__tests__/e2e/configuration/preActivation.e2e.test.js.map +1 -1
- package/dist/__tests__/e2e/crud/createObject.e2e.test.js +34 -34
- package/dist/__tests__/e2e/crud/createObject.e2e.test.js.map +1 -1
- package/dist/__tests__/e2e/crud/deleteObject.e2e.test.js +19 -19
- package/dist/__tests__/e2e/crud/deleteObject.e2e.test.js.map +1 -1
- package/dist/__tests__/e2e/crud/fileValidation.e2e.test.js +32 -32
- package/dist/__tests__/e2e/crud/fileValidation.e2e.test.js.map +1 -1
- package/dist/__tests__/e2e/crud/getObject.e2e.test.js +143 -22
- package/dist/__tests__/e2e/crud/getObject.e2e.test.js.map +1 -1
- package/dist/__tests__/e2e/crud/listObjects.e2e.test.js +561 -42
- package/dist/__tests__/e2e/crud/listObjects.e2e.test.js.map +1 -1
- package/dist/__tests__/e2e/crud/updateObject.e2e.test.js +497 -25
- package/dist/__tests__/e2e/crud/updateObject.e2e.test.js.map +1 -1
- package/dist/__tests__/e2e/hierarchicalPrerequisites.e2e.test.d.ts +2 -0
- package/dist/__tests__/e2e/hierarchicalPrerequisites.e2e.test.d.ts.map +1 -0
- package/dist/__tests__/e2e/hierarchicalPrerequisites.e2e.test.js +319 -0
- package/dist/__tests__/e2e/hierarchicalPrerequisites.e2e.test.js.map +1 -0
- package/dist/__tests__/e2e/infrastructure/client.e2e.test.js +4 -4
- package/dist/__tests__/e2e/infrastructure/client.e2e.test.js.map +1 -1
- package/dist/__tests__/e2e/infrastructure/server.e2e.test.js +6 -6
- package/dist/__tests__/e2e/infrastructure/server.e2e.test.js.map +1 -1
- package/dist/__tests__/e2e/utils/extractObjectIds.d.ts +1 -1
- package/dist/__tests__/e2e/utils/extractObjectIds.js +1 -1
- package/dist/__tests__/e2e/utils/mcpTestClient.d.ts.map +1 -1
- package/dist/__tests__/e2e/utils/mcpTestClient.js +3 -2
- package/dist/__tests__/e2e/utils/mcpTestClient.js.map +1 -1
- package/dist/__tests__/e2e/utils/parseListObjectsResponse.d.ts +1 -1
- package/dist/__tests__/e2e/utils/parseListObjectsResponse.js +1 -1
- package/dist/__tests__/e2e/utils/parseUpdateObjectResponse.d.ts +1 -1
- package/dist/__tests__/e2e/utils/parseUpdateObjectResponse.js +1 -1
- package/dist/__tests__/e2e/workflow/appendLog.e2e.test.js +4 -4
- package/dist/__tests__/e2e/workflow/appendLog.e2e.test.js.map +1 -1
- package/dist/__tests__/e2e/workflow/appendModifiedFiles.e2e.test.js +15 -15
- package/dist/__tests__/e2e/workflow/appendModifiedFiles.e2e.test.js.map +1 -1
- package/dist/__tests__/e2e/workflow/claimTask.e2e.test.js +44 -0
- package/dist/__tests__/e2e/workflow/claimTask.e2e.test.js.map +1 -1
- package/dist/__tests__/e2e/workflow/completeTask.e2e.test.js +4 -4
- package/dist/__tests__/e2e/workflow/completeTask.e2e.test.js.map +1 -1
- package/dist/__tests__/e2e/workflow/prerequisites.e2e.test.js +43 -43
- package/dist/__tests__/e2e/workflow/prerequisites.e2e.test.js.map +1 -1
- package/dist/__tests__/e2e/workflow/taskLifecycle.e2e.test.js +19 -19
- package/dist/__tests__/e2e/workflow/taskLifecycle.e2e.test.js.map +1 -1
- package/dist/__tests__/serverStartup.test.d.ts +2 -0
- package/dist/__tests__/serverStartup.test.d.ts.map +1 -0
- package/dist/__tests__/serverStartup.test.js +171 -0
- package/dist/__tests__/serverStartup.test.js.map +1 -0
- package/dist/configuration/ServerConfig.d.ts +2 -1
- package/dist/configuration/ServerConfig.d.ts.map +1 -1
- package/dist/repositories/Repository.d.ts +2 -1
- package/dist/repositories/Repository.d.ts.map +1 -1
- package/dist/repositories/local/LocalRepository.d.ts +2 -1
- package/dist/repositories/local/LocalRepository.d.ts.map +1 -1
- package/dist/repositories/local/LocalRepository.js +4 -0
- package/dist/repositories/local/LocalRepository.js.map +1 -1
- package/dist/repositories/local/__tests__/getChildrenOf.test.d.ts +2 -0
- package/dist/repositories/local/__tests__/getChildrenOf.test.d.ts.map +1 -0
- package/dist/repositories/local/__tests__/getChildrenOf.test.js +306 -0
- package/dist/repositories/local/__tests__/getChildrenOf.test.js.map +1 -0
- package/dist/repositories/local/__tests__/getObjects.test.js +309 -0
- package/dist/repositories/local/__tests__/getObjects.test.js.map +1 -1
- package/dist/repositories/local/deleteObjectById.d.ts.map +1 -1
- package/dist/repositories/local/deleteObjectById.js +2 -0
- package/dist/repositories/local/deleteObjectById.js.map +1 -1
- package/dist/repositories/local/getChildrenOf.d.ts +11 -0
- package/dist/repositories/local/getChildrenOf.d.ts.map +1 -0
- package/dist/repositories/local/getChildrenOf.js +73 -0
- package/dist/repositories/local/getChildrenOf.js.map +1 -0
- package/dist/repositories/local/getObjects.d.ts +1 -1
- package/dist/repositories/local/getObjects.d.ts.map +1 -1
- package/dist/repositories/local/getObjects.js +25 -6
- package/dist/repositories/local/getObjects.js.map +1 -1
- package/dist/server.js +39 -15
- package/dist/server.js.map +1 -1
- package/dist/services/TaskTrellisService.d.ts +4 -13
- package/dist/services/TaskTrellisService.d.ts.map +1 -1
- package/dist/services/local/LocalTaskTrellisService.d.ts +3 -9
- package/dist/services/local/LocalTaskTrellisService.d.ts.map +1 -1
- package/dist/services/local/LocalTaskTrellisService.js +4 -8
- package/dist/services/local/LocalTaskTrellisService.js.map +1 -1
- package/dist/services/local/__tests__/appendModifiedFiles.test.js +1 -0
- package/dist/services/local/__tests__/appendModifiedFiles.test.js.map +1 -1
- package/dist/services/local/__tests__/appendObjectLog.test.js +1 -0
- package/dist/services/local/__tests__/appendObjectLog.test.js.map +1 -1
- package/dist/services/local/__tests__/claimTask.test.js +127 -131
- package/dist/services/local/__tests__/claimTask.test.js.map +1 -1
- package/dist/services/local/__tests__/completeTask.test.js +30 -28
- package/dist/services/local/__tests__/completeTask.test.js.map +1 -1
- package/dist/services/local/__tests__/createObject.test.js +1 -0
- package/dist/services/local/__tests__/createObject.test.js.map +1 -1
- package/dist/services/local/__tests__/listObjects.test.js +135 -10
- package/dist/services/local/__tests__/listObjects.test.js.map +1 -1
- package/dist/services/local/__tests__/pruneClosed.test.js +446 -186
- package/dist/services/local/__tests__/pruneClosed.test.js.map +1 -1
- package/dist/services/local/__tests__/updateObject.test.js +234 -27
- package/dist/services/local/__tests__/updateObject.test.js.map +1 -1
- package/dist/services/local/claimTask.d.ts.map +1 -1
- package/dist/services/local/claimTask.js +25 -34
- package/dist/services/local/claimTask.js.map +1 -1
- package/dist/services/local/completeTask.d.ts +1 -1
- package/dist/services/local/completeTask.d.ts.map +1 -1
- package/dist/services/local/completeTask.js +4 -40
- package/dist/services/local/completeTask.js.map +1 -1
- package/dist/services/local/listObjects.d.ts +1 -1
- package/dist/services/local/listObjects.d.ts.map +1 -1
- package/dist/services/local/listObjects.js +10 -1
- package/dist/services/local/listObjects.js.map +1 -1
- package/dist/services/local/pruneClosed.d.ts.map +1 -1
- package/dist/services/local/pruneClosed.js +63 -6
- package/dist/services/local/pruneClosed.js.map +1 -1
- package/dist/services/local/updateObject.d.ts +2 -1
- package/dist/services/local/updateObject.d.ts.map +1 -1
- package/dist/services/local/updateObject.js +28 -1
- package/dist/services/local/updateObject.js.map +1 -1
- package/dist/tools/__tests__/appendModifiedFilesTool.test.js +1 -0
- package/dist/tools/__tests__/appendModifiedFilesTool.test.js.map +1 -1
- package/dist/tools/__tests__/appendObjectLogTool.test.js +1 -0
- package/dist/tools/__tests__/appendObjectLogTool.test.js.map +1 -1
- package/dist/tools/__tests__/claimTaskTool.test.js +1 -1
- package/dist/tools/__tests__/claimTaskTool.test.js.map +1 -1
- package/dist/tools/__tests__/completeTaskTool.test.js +23 -16
- package/dist/tools/__tests__/completeTaskTool.test.js.map +1 -1
- package/dist/tools/__tests__/createObjectTool.test.js +1 -0
- package/dist/tools/__tests__/createObjectTool.test.js.map +1 -1
- package/dist/tools/__tests__/deleteObjectTool.test.js +1 -0
- package/dist/tools/__tests__/deleteObjectTool.test.js.map +1 -1
- package/dist/tools/__tests__/getObjectTool.test.js +1 -0
- package/dist/tools/__tests__/getObjectTool.test.js.map +1 -1
- package/dist/tools/__tests__/listObjectsTool.test.js +160 -1
- package/dist/tools/__tests__/listObjectsTool.test.js.map +1 -1
- package/dist/tools/__tests__/updateObjectTool.test.js +39 -10
- package/dist/tools/__tests__/updateObjectTool.test.js.map +1 -1
- package/dist/tools/appendModifiedFilesTool.d.ts +2 -2
- package/dist/tools/appendModifiedFilesTool.js +4 -4
- package/dist/tools/appendModifiedFilesTool.js.map +1 -1
- package/dist/tools/appendObjectLogTool.d.ts +3 -3
- package/dist/tools/appendObjectLogTool.js +4 -4
- package/dist/tools/appendObjectLogTool.js.map +1 -1
- package/dist/tools/completeTaskTool.d.ts +1 -1
- package/dist/tools/completeTaskTool.d.ts.map +1 -1
- package/dist/tools/completeTaskTool.js +1 -1
- package/dist/tools/completeTaskTool.js.map +1 -1
- package/dist/tools/createObjectTool.d.ts +8 -8
- package/dist/tools/createObjectTool.js +13 -13
- package/dist/tools/createObjectTool.js.map +1 -1
- package/dist/tools/deleteObjectTool.d.ts +3 -3
- package/dist/tools/deleteObjectTool.js +12 -12
- package/dist/tools/deleteObjectTool.js.map +1 -1
- package/dist/tools/getObjectTool.d.ts +3 -3
- package/dist/tools/getObjectTool.d.ts.map +1 -1
- package/dist/tools/getObjectTool.js +12 -7
- package/dist/tools/getObjectTool.js.map +1 -1
- package/dist/tools/index.d.ts +7 -9
- package/dist/tools/index.d.ts.map +1 -1
- package/dist/tools/index.js +22 -28
- package/dist/tools/index.js.map +1 -1
- package/dist/tools/listObjectsTool.d.ts +20 -11
- package/dist/tools/listObjectsTool.d.ts.map +1 -1
- package/dist/tools/listObjectsTool.js +112 -40
- package/dist/tools/listObjectsTool.js.map +1 -1
- package/dist/tools/updateObjectTool.d.ts +12 -7
- package/dist/tools/updateObjectTool.d.ts.map +1 -1
- package/dist/tools/updateObjectTool.js +20 -14
- package/dist/tools/updateObjectTool.js.map +1 -1
- package/dist/utils/__tests__/checkHierarchicalPrerequisitesComplete.test.d.ts +2 -0
- package/dist/utils/__tests__/checkHierarchicalPrerequisitesComplete.test.d.ts.map +1 -0
- package/dist/utils/__tests__/checkHierarchicalPrerequisitesComplete.test.js +206 -0
- package/dist/utils/__tests__/checkHierarchicalPrerequisitesComplete.test.js.map +1 -0
- package/dist/utils/__tests__/checkPrerequisitesComplete.test.js +5 -0
- package/dist/utils/__tests__/checkPrerequisitesComplete.test.js.map +1 -1
- package/dist/utils/__tests__/filterUnavailableObjects.test.js +51 -25
- package/dist/utils/__tests__/filterUnavailableObjects.test.js.map +1 -1
- package/dist/utils/__tests__/isRequiredForOtherObjects.test.js +5 -0
- package/dist/utils/__tests__/isRequiredForOtherObjects.test.js.map +1 -1
- package/dist/utils/__tests__/updateParentHierarchy.test.d.ts +2 -0
- package/dist/utils/__tests__/updateParentHierarchy.test.d.ts.map +1 -0
- package/dist/utils/__tests__/updateParentHierarchy.test.js +137 -0
- package/dist/utils/__tests__/updateParentHierarchy.test.js.map +1 -0
- package/dist/utils/autoCompleteParentHierarchy.d.ts +11 -0
- package/dist/utils/autoCompleteParentHierarchy.d.ts.map +1 -0
- package/dist/utils/autoCompleteParentHierarchy.js +49 -0
- package/dist/utils/autoCompleteParentHierarchy.js.map +1 -0
- package/dist/utils/checkHierarchicalPrerequisitesComplete.d.ts +14 -0
- package/dist/utils/checkHierarchicalPrerequisitesComplete.d.ts.map +1 -0
- package/dist/utils/checkHierarchicalPrerequisitesComplete.js +47 -0
- package/dist/utils/checkHierarchicalPrerequisitesComplete.js.map +1 -0
- package/dist/utils/filterUnavailableObjects.d.ts +6 -4
- package/dist/utils/filterUnavailableObjects.d.ts.map +1 -1
- package/dist/utils/filterUnavailableObjects.js +16 -22
- package/dist/utils/filterUnavailableObjects.js.map +1 -1
- package/dist/utils/index.d.ts +3 -2
- package/dist/utils/index.d.ts.map +1 -1
- package/dist/utils/index.js +7 -3
- package/dist/utils/index.js.map +1 -1
- package/dist/utils/updateParentHierarchy.d.ts +11 -0
- package/dist/utils/updateParentHierarchy.d.ts.map +1 -0
- package/dist/utils/updateParentHierarchy.js +40 -0
- package/dist/utils/updateParentHierarchy.js.map +1 -0
- package/dist/validation/__tests__/validateObjectCreation.test.js +1 -0
- package/dist/validation/__tests__/validateObjectCreation.test.js.map +1 -1
- package/dist/validation/__tests__/validateParentExists.test.js +1 -0
- package/dist/validation/__tests__/validateParentExists.test.js.map +1 -1
- package/dist/validation/__tests__/validateStatusTransition.test.js +1 -0
- package/dist/validation/__tests__/validateStatusTransition.test.js.map +1 -1
- package/package.json +1 -1
- package/dist/__tests__/e2e/crud/replaceObjectBodyRegex.e2e.test.d.ts +0 -2
- package/dist/__tests__/e2e/crud/replaceObjectBodyRegex.e2e.test.d.ts.map +0 -1
- package/dist/__tests__/e2e/crud/replaceObjectBodyRegex.e2e.test.js +0 -693
- package/dist/__tests__/e2e/crud/replaceObjectBodyRegex.e2e.test.js.map +0 -1
- package/dist/__tests__/e2e/workflow/pruneClosed.e2e.test.d.ts +0 -2
- package/dist/__tests__/e2e/workflow/pruneClosed.e2e.test.d.ts.map +0 -1
- package/dist/__tests__/e2e/workflow/pruneClosed.e2e.test.js +0 -352
- package/dist/__tests__/e2e/workflow/pruneClosed.e2e.test.js.map +0 -1
- package/dist/services/local/__tests__/replaceObjectBodyRegex.test.d.ts +0 -2
- package/dist/services/local/__tests__/replaceObjectBodyRegex.test.d.ts.map +0 -1
- package/dist/services/local/__tests__/replaceObjectBodyRegex.test.js +0 -283
- package/dist/services/local/__tests__/replaceObjectBodyRegex.test.js.map +0 -1
- package/dist/services/local/replaceObjectBodyRegex.d.ts +0 -8
- package/dist/services/local/replaceObjectBodyRegex.d.ts.map +0 -1
- package/dist/services/local/replaceObjectBodyRegex.js +0 -85
- package/dist/services/local/replaceObjectBodyRegex.js.map +0 -1
- package/dist/tools/__tests__/pruneClosedTool.test.d.ts +0 -2
- package/dist/tools/__tests__/pruneClosedTool.test.d.ts.map +0 -1
- package/dist/tools/__tests__/pruneClosedTool.test.js +0 -112
- package/dist/tools/__tests__/pruneClosedTool.test.js.map +0 -1
- package/dist/tools/__tests__/replaceObjectBodyRegexTool.test.d.ts +0 -2
- package/dist/tools/__tests__/replaceObjectBodyRegexTool.test.d.ts.map +0 -1
- package/dist/tools/__tests__/replaceObjectBodyRegexTool.test.js +0 -89
- package/dist/tools/__tests__/replaceObjectBodyRegexTool.test.js.map +0 -1
- package/dist/tools/pruneClosedTool.d.ts +0 -27
- package/dist/tools/pruneClosedTool.d.ts.map +0 -1
- package/dist/tools/pruneClosedTool.js +0 -57
- package/dist/tools/pruneClosedTool.js.map +0 -1
- package/dist/tools/replaceObjectBodyRegexTool.d.ts +0 -36
- package/dist/tools/replaceObjectBodyRegexTool.d.ts.map +0 -1
- package/dist/tools/replaceObjectBodyRegexTool.js +0 -67
- package/dist/tools/replaceObjectBodyRegexTool.js.map +0 -1
- package/dist/utils/ReplaceStringOptions.d.ts +0 -12
- package/dist/utils/ReplaceStringOptions.d.ts.map +0 -1
- package/dist/utils/ReplaceStringOptions.js +0 -3
- package/dist/utils/ReplaceStringOptions.js.map +0 -1
- package/dist/utils/__tests__/replaceStringWithRegex.test.d.ts +0 -2
- package/dist/utils/__tests__/replaceStringWithRegex.test.d.ts.map +0 -1
- package/dist/utils/__tests__/replaceStringWithRegex.test.js +0 -281
- package/dist/utils/__tests__/replaceStringWithRegex.test.js.map +0 -1
- package/dist/utils/replaceStringWithRegex.d.ts +0 -45
- package/dist/utils/replaceStringWithRegex.d.ts.map +0 -1
- package/dist/utils/replaceStringWithRegex.js +0 -91
- package/dist/utils/replaceStringWithRegex.js.map +0 -1
|
@@ -0,0 +1,306 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
const path_1 = require("path");
|
|
4
|
+
const getChildrenOf_1 = require("../getChildrenOf");
|
|
5
|
+
const models_1 = require("../../../models");
|
|
6
|
+
describe("getChildrenOf", () => {
|
|
7
|
+
const testRoot = (0, path_1.join)(__dirname, "schema1_0");
|
|
8
|
+
describe("basic functionality", () => {
|
|
9
|
+
it("should return all children of a given parent", async () => {
|
|
10
|
+
// E-user-management should have F-user-registration as a child
|
|
11
|
+
const children = await (0, getChildrenOf_1.getChildrenOf)("E-user-management", testRoot);
|
|
12
|
+
expect(children.length).toBeGreaterThan(0);
|
|
13
|
+
// All returned objects should be valid TrellisObject instances
|
|
14
|
+
children.forEach((obj) => {
|
|
15
|
+
expect(obj).toHaveProperty("id");
|
|
16
|
+
expect(obj).toHaveProperty("type");
|
|
17
|
+
expect(obj).toHaveProperty("title");
|
|
18
|
+
expect(obj).toHaveProperty("status");
|
|
19
|
+
expect(obj).toHaveProperty("priority");
|
|
20
|
+
expect(obj).toHaveProperty("parent");
|
|
21
|
+
expect(obj).toHaveProperty("schema");
|
|
22
|
+
expect(obj.schema).toBe("v1.0");
|
|
23
|
+
});
|
|
24
|
+
// All returned objects should have the correct parent
|
|
25
|
+
children.forEach((obj) => {
|
|
26
|
+
expect(obj.parent).toBe("E-user-management");
|
|
27
|
+
});
|
|
28
|
+
});
|
|
29
|
+
it("should return children with correct types for epic parent", async () => {
|
|
30
|
+
const children = await (0, getChildrenOf_1.getChildrenOf)("E-user-management", testRoot, true);
|
|
31
|
+
expect(children.length).toBeGreaterThan(0);
|
|
32
|
+
// Epic children should be features
|
|
33
|
+
children.forEach((obj) => {
|
|
34
|
+
expect(obj.type).toBe(models_1.TrellisObjectType.FEATURE);
|
|
35
|
+
expect(obj.parent).toBe("E-user-management");
|
|
36
|
+
});
|
|
37
|
+
// Should include F-user-registration
|
|
38
|
+
expect(children.some((obj) => obj.id === "F-user-registration")).toBe(true);
|
|
39
|
+
});
|
|
40
|
+
it("should return children with correct types for feature parent", async () => {
|
|
41
|
+
const children = await (0, getChildrenOf_1.getChildrenOf)("F-user-registration", testRoot, true);
|
|
42
|
+
expect(children.length).toBeGreaterThan(0);
|
|
43
|
+
// Feature children should be tasks
|
|
44
|
+
children.forEach((obj) => {
|
|
45
|
+
expect(obj.type).toBe(models_1.TrellisObjectType.TASK);
|
|
46
|
+
expect(obj.parent).toBe("F-user-registration");
|
|
47
|
+
});
|
|
48
|
+
// Should include specific tasks
|
|
49
|
+
expect(children.some((obj) => obj.id === "T-setup-user-schema")).toBe(true);
|
|
50
|
+
expect(children.some((obj) => obj.id === "T-create-registration-form")).toBe(true);
|
|
51
|
+
});
|
|
52
|
+
it("should return children with correct types for project parent", async () => {
|
|
53
|
+
const children = await (0, getChildrenOf_1.getChildrenOf)("P-ecommerce-platform", testRoot, true);
|
|
54
|
+
expect(children.length).toBeGreaterThan(0);
|
|
55
|
+
// Project children should be epics
|
|
56
|
+
children.forEach((obj) => {
|
|
57
|
+
expect(obj.type).toBe(models_1.TrellisObjectType.EPIC);
|
|
58
|
+
expect(obj.parent).toBe("P-ecommerce-platform");
|
|
59
|
+
});
|
|
60
|
+
// Should include specific epics
|
|
61
|
+
expect(children.some((obj) => obj.id === "E-user-management")).toBe(true);
|
|
62
|
+
expect(children.some((obj) => obj.id === "E-product-catalog")).toBe(true);
|
|
63
|
+
});
|
|
64
|
+
it("should return empty array for parent with no children", async () => {
|
|
65
|
+
// Tasks should have no children
|
|
66
|
+
const children = await (0, getChildrenOf_1.getChildrenOf)("T-setup-database", testRoot);
|
|
67
|
+
expect(children).toEqual([]);
|
|
68
|
+
});
|
|
69
|
+
it("should return empty array for non-existent parent", async () => {
|
|
70
|
+
const children = await (0, getChildrenOf_1.getChildrenOf)("P-non-existent", testRoot);
|
|
71
|
+
expect(children).toEqual([]);
|
|
72
|
+
});
|
|
73
|
+
});
|
|
74
|
+
describe("includeClosed parameter", () => {
|
|
75
|
+
it("should exclude closed children by default", async () => {
|
|
76
|
+
const children = await (0, getChildrenOf_1.getChildrenOf)("F-user-registration", testRoot);
|
|
77
|
+
// Should not include any DONE or WONT_DO objects
|
|
78
|
+
const closedChildren = children.filter((obj) => obj.status === models_1.TrellisObjectStatus.DONE ||
|
|
79
|
+
obj.status === models_1.TrellisObjectStatus.WONT_DO);
|
|
80
|
+
expect(closedChildren.length).toBe(0);
|
|
81
|
+
// Should only include open children (not DONE or WONT_DO)
|
|
82
|
+
children.forEach((obj) => {
|
|
83
|
+
expect(obj.status).not.toBe(models_1.TrellisObjectStatus.DONE);
|
|
84
|
+
expect(obj.status).not.toBe(models_1.TrellisObjectStatus.WONT_DO);
|
|
85
|
+
});
|
|
86
|
+
});
|
|
87
|
+
it("should exclude closed children when includeClosed is false", async () => {
|
|
88
|
+
const children = await (0, getChildrenOf_1.getChildrenOf)("F-user-registration", testRoot, false);
|
|
89
|
+
// Should not include any DONE or WONT_DO objects
|
|
90
|
+
const closedChildren = children.filter((obj) => obj.status === models_1.TrellisObjectStatus.DONE ||
|
|
91
|
+
obj.status === models_1.TrellisObjectStatus.WONT_DO);
|
|
92
|
+
expect(closedChildren).toHaveLength(0);
|
|
93
|
+
// Should still include open children
|
|
94
|
+
const openChildren = children.filter((obj) => obj.status !== models_1.TrellisObjectStatus.DONE &&
|
|
95
|
+
obj.status !== models_1.TrellisObjectStatus.WONT_DO);
|
|
96
|
+
expect(openChildren.length).toBeGreaterThan(0);
|
|
97
|
+
expect(openChildren.length).toBe(children.length);
|
|
98
|
+
});
|
|
99
|
+
it("should include closed children when includeClosed is explicitly true", async () => {
|
|
100
|
+
const children = await (0, getChildrenOf_1.getChildrenOf)("F-user-registration", testRoot, true);
|
|
101
|
+
// Should include DONE objects if they exist
|
|
102
|
+
const doneChildren = children.filter((obj) => obj.status === models_1.TrellisObjectStatus.DONE);
|
|
103
|
+
// F-user-registration should have T-setup-user-schema as a DONE child
|
|
104
|
+
expect(doneChildren.length).toBeGreaterThan(0);
|
|
105
|
+
expect(doneChildren.some((obj) => obj.id === "T-setup-user-schema")).toBe(true);
|
|
106
|
+
// Should also include open children
|
|
107
|
+
const openChildren = children.filter((obj) => obj.status !== models_1.TrellisObjectStatus.DONE &&
|
|
108
|
+
obj.status !== models_1.TrellisObjectStatus.WONT_DO);
|
|
109
|
+
expect(openChildren.length).toBeGreaterThan(0);
|
|
110
|
+
});
|
|
111
|
+
it("should have more children when includeClosed is true", async () => {
|
|
112
|
+
const defaultChildren = await (0, getChildrenOf_1.getChildrenOf)("F-user-registration", testRoot); // excludes closed by default
|
|
113
|
+
const allChildren = await (0, getChildrenOf_1.getChildrenOf)("F-user-registration", testRoot, true); // includes closed
|
|
114
|
+
expect(allChildren.length).toBeGreaterThan(defaultChildren.length);
|
|
115
|
+
// The difference should be exactly the number of closed children
|
|
116
|
+
const closedChildren = allChildren.filter((obj) => obj.status === models_1.TrellisObjectStatus.DONE ||
|
|
117
|
+
obj.status === models_1.TrellisObjectStatus.WONT_DO);
|
|
118
|
+
expect(allChildren.length - defaultChildren.length).toBe(closedChildren.length);
|
|
119
|
+
expect(closedChildren.length).toBeGreaterThan(0); // Should have some closed children
|
|
120
|
+
});
|
|
121
|
+
it("should filter both DONE and WONT_DO children when includeClosed is false", async () => {
|
|
122
|
+
// First get all children to see what we have
|
|
123
|
+
const allChildren = await (0, getChildrenOf_1.getChildrenOf)("F-user-registration", testRoot, true);
|
|
124
|
+
const filteredChildren = await (0, getChildrenOf_1.getChildrenOf)("F-user-registration", testRoot, false);
|
|
125
|
+
// Count DONE and WONT_DO children in all children
|
|
126
|
+
const doneChildren = allChildren.filter((obj) => obj.status === models_1.TrellisObjectStatus.DONE);
|
|
127
|
+
const wontDoChildren = allChildren.filter((obj) => obj.status === models_1.TrellisObjectStatus.WONT_DO);
|
|
128
|
+
// Filtered children should not contain any DONE or WONT_DO children
|
|
129
|
+
const filteredDoneChildren = filteredChildren.filter((obj) => obj.status === models_1.TrellisObjectStatus.DONE);
|
|
130
|
+
const filteredWontDoChildren = filteredChildren.filter((obj) => obj.status === models_1.TrellisObjectStatus.WONT_DO);
|
|
131
|
+
expect(filteredDoneChildren.length).toBe(0);
|
|
132
|
+
expect(filteredWontDoChildren.length).toBe(0);
|
|
133
|
+
// The difference should be the sum of DONE and WONT_DO children
|
|
134
|
+
const expectedDifference = doneChildren.length + wontDoChildren.length;
|
|
135
|
+
expect(allChildren.length - filteredChildren.length).toBe(expectedDifference);
|
|
136
|
+
});
|
|
137
|
+
});
|
|
138
|
+
describe("hierarchical relationships", () => {
|
|
139
|
+
it("should find children for standalone features", async () => {
|
|
140
|
+
// F-user-authentication is a standalone feature (not part of a project hierarchy)
|
|
141
|
+
const children = await (0, getChildrenOf_1.getChildrenOf)("F-user-authentication", testRoot, true);
|
|
142
|
+
expect(children.length).toBeGreaterThan(0);
|
|
143
|
+
// All should be tasks with correct parent
|
|
144
|
+
children.forEach((obj) => {
|
|
145
|
+
expect(obj.type).toBe(models_1.TrellisObjectType.TASK);
|
|
146
|
+
expect(obj.parent).toBe("F-user-authentication");
|
|
147
|
+
});
|
|
148
|
+
// Should include specific tasks
|
|
149
|
+
expect(children.some((obj) => obj.id === "T-implement-login")).toBe(true);
|
|
150
|
+
expect(children.some((obj) => obj.id === "T-setup-auth-models")).toBe(true);
|
|
151
|
+
});
|
|
152
|
+
it("should find children for project hierarchy", async () => {
|
|
153
|
+
// Test the full project -> epic -> feature -> task hierarchy
|
|
154
|
+
// Project level
|
|
155
|
+
const projectChildren = await (0, getChildrenOf_1.getChildrenOf)("P-ecommerce-platform", testRoot, true);
|
|
156
|
+
expect(projectChildren.length).toBeGreaterThan(0);
|
|
157
|
+
expect(projectChildren.every((obj) => obj.type === models_1.TrellisObjectType.EPIC)).toBe(true);
|
|
158
|
+
// Epic level
|
|
159
|
+
const epicChildren = await (0, getChildrenOf_1.getChildrenOf)("E-user-management", testRoot, true);
|
|
160
|
+
expect(epicChildren.length).toBeGreaterThan(0);
|
|
161
|
+
expect(epicChildren.every((obj) => obj.type === models_1.TrellisObjectType.FEATURE)).toBe(true);
|
|
162
|
+
// Feature level
|
|
163
|
+
const featureChildren = await (0, getChildrenOf_1.getChildrenOf)("F-user-registration", testRoot, true);
|
|
164
|
+
expect(featureChildren.length).toBeGreaterThan(0);
|
|
165
|
+
expect(featureChildren.every((obj) => obj.type === models_1.TrellisObjectType.TASK)).toBe(true);
|
|
166
|
+
});
|
|
167
|
+
it("should not return indirect children (only direct children)", async () => {
|
|
168
|
+
// E-user-management should not return tasks directly, only its feature children
|
|
169
|
+
const children = await (0, getChildrenOf_1.getChildrenOf)("E-user-management", testRoot, true);
|
|
170
|
+
// Should only include features, not tasks
|
|
171
|
+
children.forEach((obj) => {
|
|
172
|
+
expect(obj.type).toBe(models_1.TrellisObjectType.FEATURE);
|
|
173
|
+
expect(obj.parent).toBe("E-user-management");
|
|
174
|
+
});
|
|
175
|
+
// Should NOT include tasks that are children of child features
|
|
176
|
+
expect(children.some((obj) => obj.id === "T-setup-user-schema")).toBe(false);
|
|
177
|
+
expect(children.some((obj) => obj.id === "T-create-registration-form")).toBe(false);
|
|
178
|
+
});
|
|
179
|
+
it("should handle multiple projects correctly", async () => {
|
|
180
|
+
// P-mobile-app should have different children than P-ecommerce-platform
|
|
181
|
+
const mobileChildren = await (0, getChildrenOf_1.getChildrenOf)("P-mobile-app", testRoot, true);
|
|
182
|
+
const ecommerceChildren = await (0, getChildrenOf_1.getChildrenOf)("P-ecommerce-platform", testRoot, true);
|
|
183
|
+
// Both should have children
|
|
184
|
+
expect(mobileChildren.length).toBeGreaterThan(0);
|
|
185
|
+
expect(ecommerceChildren.length).toBeGreaterThan(0);
|
|
186
|
+
// No overlap between the two sets of children
|
|
187
|
+
mobileChildren.forEach((mobileChild) => {
|
|
188
|
+
expect(ecommerceChildren.some((ecommerceChild) => ecommerceChild.id === mobileChild.id)).toBe(false);
|
|
189
|
+
});
|
|
190
|
+
// Mobile app should have E-offline-sync
|
|
191
|
+
expect(mobileChildren.some((obj) => obj.id === "E-offline-sync")).toBe(true);
|
|
192
|
+
// E-commerce should have E-user-management and E-product-catalog
|
|
193
|
+
expect(ecommerceChildren.some((obj) => obj.id === "E-user-management")).toBe(true);
|
|
194
|
+
expect(ecommerceChildren.some((obj) => obj.id === "E-product-catalog")).toBe(true);
|
|
195
|
+
});
|
|
196
|
+
});
|
|
197
|
+
describe("error handling", () => {
|
|
198
|
+
it("should handle non-existent directory gracefully", async () => {
|
|
199
|
+
const children = await (0, getChildrenOf_1.getChildrenOf)("P-test", "/non/existent/path");
|
|
200
|
+
expect(children).toEqual([]);
|
|
201
|
+
});
|
|
202
|
+
it("should skip invalid markdown files and continue processing", async () => {
|
|
203
|
+
// This test relies on the fact that getChildrenOf catches errors from
|
|
204
|
+
// getObjectByFilePath and continues processing other files
|
|
205
|
+
const children = await (0, getChildrenOf_1.getChildrenOf)("E-user-management", testRoot);
|
|
206
|
+
// Should still return valid children even if some files are invalid
|
|
207
|
+
expect(children.length).toBeGreaterThan(0);
|
|
208
|
+
// All returned children should be valid
|
|
209
|
+
children.forEach((obj) => {
|
|
210
|
+
expect(obj).toHaveProperty("id");
|
|
211
|
+
expect(obj).toHaveProperty("type");
|
|
212
|
+
expect(obj).toHaveProperty("title");
|
|
213
|
+
expect(obj).toHaveProperty("parent");
|
|
214
|
+
});
|
|
215
|
+
});
|
|
216
|
+
it("should handle empty directory gracefully", async () => {
|
|
217
|
+
// Create a path that exists but has no markdown files
|
|
218
|
+
const emptyDir = (0, path_1.join)(__dirname, "schema1_0", ".trellis", "empty");
|
|
219
|
+
const children = await (0, getChildrenOf_1.getChildrenOf)("P-test", emptyDir);
|
|
220
|
+
expect(children).toEqual([]);
|
|
221
|
+
});
|
|
222
|
+
it("should handle malformed parent IDs gracefully", async () => {
|
|
223
|
+
const children = await (0, getChildrenOf_1.getChildrenOf)("", testRoot);
|
|
224
|
+
expect(children).toEqual([]);
|
|
225
|
+
const children2 = await (0, getChildrenOf_1.getChildrenOf)("invalid-id-format", testRoot);
|
|
226
|
+
expect(children2).toEqual([]);
|
|
227
|
+
});
|
|
228
|
+
});
|
|
229
|
+
describe("edge cases", () => {
|
|
230
|
+
it("should handle parent IDs with special characters", async () => {
|
|
231
|
+
// Most IDs should be well-formed, but function should be robust
|
|
232
|
+
const children = await (0, getChildrenOf_1.getChildrenOf)("P-test-with-dashes", testRoot);
|
|
233
|
+
expect(children).toEqual([]);
|
|
234
|
+
});
|
|
235
|
+
it("should return consistent results on multiple calls", async () => {
|
|
236
|
+
const children1 = await (0, getChildrenOf_1.getChildrenOf)("F-user-registration", testRoot, true);
|
|
237
|
+
const children2 = await (0, getChildrenOf_1.getChildrenOf)("F-user-registration", testRoot, true);
|
|
238
|
+
// Should get the same results
|
|
239
|
+
expect(children1.length).toBe(children2.length);
|
|
240
|
+
// Sort by ID to ensure consistent comparison
|
|
241
|
+
const sorted1 = children1.sort((a, b) => a.id.localeCompare(b.id));
|
|
242
|
+
const sorted2 = children2.sort((a, b) => a.id.localeCompare(b.id));
|
|
243
|
+
expect(sorted1).toEqual(sorted2);
|
|
244
|
+
});
|
|
245
|
+
it("should handle various object statuses correctly", async () => {
|
|
246
|
+
// Test with a parent that has children in various statuses
|
|
247
|
+
const allChildren = await (0, getChildrenOf_1.getChildrenOf)("F-user-authentication", testRoot, true);
|
|
248
|
+
if (allChildren.length > 0) {
|
|
249
|
+
// Verify we can handle different statuses
|
|
250
|
+
const statusCount = new Map();
|
|
251
|
+
allChildren.forEach((obj) => {
|
|
252
|
+
statusCount.set(obj.status, (statusCount.get(obj.status) || 0) + 1);
|
|
253
|
+
});
|
|
254
|
+
// Should have at least one status represented
|
|
255
|
+
expect(statusCount.size).toBeGreaterThan(0);
|
|
256
|
+
}
|
|
257
|
+
});
|
|
258
|
+
});
|
|
259
|
+
describe("console warning behavior", () => {
|
|
260
|
+
it("should log warnings for files that cannot be deserialized", async () => {
|
|
261
|
+
// Mock console.error to capture warnings (getChildrenOf uses console.error)
|
|
262
|
+
const originalError = console.error;
|
|
263
|
+
const mockError = jest.fn();
|
|
264
|
+
console.error = mockError;
|
|
265
|
+
try {
|
|
266
|
+
// This should process normally but might encounter some files that can't be deserialized
|
|
267
|
+
await (0, getChildrenOf_1.getChildrenOf)("E-user-management", testRoot);
|
|
268
|
+
// If there were any deserialization errors, they should have been logged
|
|
269
|
+
// Note: In our test data, all files should be valid, so this mainly tests the mechanism
|
|
270
|
+
}
|
|
271
|
+
finally {
|
|
272
|
+
console.error = originalError;
|
|
273
|
+
}
|
|
274
|
+
});
|
|
275
|
+
});
|
|
276
|
+
describe("performance", () => {
|
|
277
|
+
it("should complete in reasonable time for typical data sets", async () => {
|
|
278
|
+
const startTime = Date.now();
|
|
279
|
+
// Test with a parent that likely has children
|
|
280
|
+
await (0, getChildrenOf_1.getChildrenOf)("E-user-management", testRoot, true);
|
|
281
|
+
const endTime = Date.now();
|
|
282
|
+
// Should complete quickly (under 1 second)
|
|
283
|
+
expect(endTime - startTime).toBeLessThan(1000);
|
|
284
|
+
});
|
|
285
|
+
it("should handle multiple concurrent calls efficiently", async () => {
|
|
286
|
+
const startTime = Date.now();
|
|
287
|
+
// Run multiple calls concurrently
|
|
288
|
+
const promises = [
|
|
289
|
+
(0, getChildrenOf_1.getChildrenOf)("P-ecommerce-platform", testRoot, true),
|
|
290
|
+
(0, getChildrenOf_1.getChildrenOf)("E-user-management", testRoot, true),
|
|
291
|
+
(0, getChildrenOf_1.getChildrenOf)("F-user-registration", testRoot, true),
|
|
292
|
+
(0, getChildrenOf_1.getChildrenOf)("F-user-authentication", testRoot, true),
|
|
293
|
+
];
|
|
294
|
+
const results = await Promise.all(promises);
|
|
295
|
+
const endTime = Date.now();
|
|
296
|
+
// All should return results
|
|
297
|
+
expect(results).toHaveLength(4);
|
|
298
|
+
results.forEach((result) => {
|
|
299
|
+
expect(Array.isArray(result)).toBe(true);
|
|
300
|
+
});
|
|
301
|
+
// Should complete in reasonable time even with concurrent calls
|
|
302
|
+
expect(endTime - startTime).toBeLessThan(2000);
|
|
303
|
+
});
|
|
304
|
+
});
|
|
305
|
+
});
|
|
306
|
+
//# sourceMappingURL=getChildrenOf.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"getChildrenOf.test.js","sourceRoot":"","sources":["../../../../src/repositories/local/__tests__/getChildrenOf.test.ts"],"names":[],"mappings":"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"}
|