@langadventurellc/task-trellis-mcp 0.1.0-rc.3
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/LICENSE +674 -0
- package/README.md +81 -0
- package/dist/configuration/ServerConfig.d.ts +8 -0
- package/dist/configuration/ServerConfig.d.ts.map +1 -0
- package/dist/configuration/ServerConfig.js +3 -0
- package/dist/configuration/ServerConfig.js.map +1 -0
- package/dist/configuration/index.d.ts +2 -0
- package/dist/configuration/index.d.ts.map +1 -0
- package/dist/configuration/index.js +18 -0
- package/dist/configuration/index.js.map +1 -0
- package/dist/models/TrellisObject.d.ts +18 -0
- package/dist/models/TrellisObject.d.ts.map +1 -0
- package/dist/models/TrellisObject.js +3 -0
- package/dist/models/TrellisObject.js.map +1 -0
- package/dist/models/TrellisObjectPriority.d.ts +6 -0
- package/dist/models/TrellisObjectPriority.d.ts.map +1 -0
- package/dist/models/TrellisObjectPriority.js +10 -0
- package/dist/models/TrellisObjectPriority.js.map +1 -0
- package/dist/models/TrellisObjectStatus.d.ts +8 -0
- package/dist/models/TrellisObjectStatus.d.ts.map +1 -0
- package/dist/models/TrellisObjectStatus.js +12 -0
- package/dist/models/TrellisObjectStatus.js.map +1 -0
- package/dist/models/TrellisObjectType.d.ts +7 -0
- package/dist/models/TrellisObjectType.d.ts.map +1 -0
- package/dist/models/TrellisObjectType.js +11 -0
- package/dist/models/TrellisObjectType.js.map +1 -0
- package/dist/models/__tests__/isClaimable.test.d.ts +2 -0
- package/dist/models/__tests__/isClaimable.test.d.ts.map +1 -0
- package/dist/models/__tests__/isClaimable.test.js +101 -0
- package/dist/models/__tests__/isClaimable.test.js.map +1 -0
- package/dist/models/__tests__/isClosed.test.d.ts +2 -0
- package/dist/models/__tests__/isClosed.test.d.ts.map +1 -0
- package/dist/models/__tests__/isClosed.test.js +84 -0
- package/dist/models/__tests__/isClosed.test.js.map +1 -0
- package/dist/models/__tests__/isOpen.test.d.ts +2 -0
- package/dist/models/__tests__/isOpen.test.d.ts.map +1 -0
- package/dist/models/__tests__/isOpen.test.js +84 -0
- package/dist/models/__tests__/isOpen.test.js.map +1 -0
- package/dist/models/index.d.ts +8 -0
- package/dist/models/index.d.ts.map +1 -0
- package/dist/models/index.js +16 -0
- package/dist/models/index.js.map +1 -0
- package/dist/models/isClaimable.d.ts +10 -0
- package/dist/models/isClaimable.d.ts.map +1 -0
- package/dist/models/isClaimable.js +16 -0
- package/dist/models/isClaimable.js.map +1 -0
- package/dist/models/isClosed.d.ts +10 -0
- package/dist/models/isClosed.d.ts.map +1 -0
- package/dist/models/isClosed.js +16 -0
- package/dist/models/isClosed.js.map +1 -0
- package/dist/models/isOpen.d.ts +10 -0
- package/dist/models/isOpen.d.ts.map +1 -0
- package/dist/models/isOpen.js +16 -0
- package/dist/models/isOpen.js.map +1 -0
- package/dist/repositories/Repository.d.ts +8 -0
- package/dist/repositories/Repository.d.ts.map +1 -0
- package/dist/repositories/Repository.js +3 -0
- package/dist/repositories/Repository.js.map +1 -0
- package/dist/repositories/index.d.ts +3 -0
- package/dist/repositories/index.d.ts.map +1 -0
- package/dist/repositories/index.js +19 -0
- package/dist/repositories/index.js.map +1 -0
- package/dist/repositories/local/LocalRepository.d.ts +21 -0
- package/dist/repositories/local/LocalRepository.d.ts.map +1 -0
- package/dist/repositories/local/LocalRepository.js +75 -0
- package/dist/repositories/local/LocalRepository.js.map +1 -0
- package/dist/repositories/local/__tests__/deleteObjectById.test.d.ts +2 -0
- package/dist/repositories/local/__tests__/deleteObjectById.test.d.ts.map +1 -0
- package/dist/repositories/local/__tests__/deleteObjectById.test.js +228 -0
- package/dist/repositories/local/__tests__/deleteObjectById.test.js.map +1 -0
- package/dist/repositories/local/__tests__/extractMarkdownIds.test.d.ts +2 -0
- package/dist/repositories/local/__tests__/extractMarkdownIds.test.d.ts.map +1 -0
- package/dist/repositories/local/__tests__/extractMarkdownIds.test.js +135 -0
- package/dist/repositories/local/__tests__/extractMarkdownIds.test.js.map +1 -0
- package/dist/repositories/local/__tests__/findMarkdownFiles.test.d.ts +2 -0
- package/dist/repositories/local/__tests__/findMarkdownFiles.test.d.ts.map +1 -0
- package/dist/repositories/local/__tests__/findMarkdownFiles.test.js +236 -0
- package/dist/repositories/local/__tests__/findMarkdownFiles.test.js.map +1 -0
- package/dist/repositories/local/__tests__/getObjectByFilePath.test.d.ts +2 -0
- package/dist/repositories/local/__tests__/getObjectByFilePath.test.d.ts.map +1 -0
- package/dist/repositories/local/__tests__/getObjectByFilePath.test.js +96 -0
- package/dist/repositories/local/__tests__/getObjectByFilePath.test.js.map +1 -0
- package/dist/repositories/local/__tests__/getObjectById.test.d.ts +2 -0
- package/dist/repositories/local/__tests__/getObjectById.test.d.ts.map +1 -0
- package/dist/repositories/local/__tests__/getObjectById.test.js +46 -0
- package/dist/repositories/local/__tests__/getObjectById.test.js.map +1 -0
- package/dist/repositories/local/__tests__/getObjectFilePath.test.d.ts +2 -0
- package/dist/repositories/local/__tests__/getObjectFilePath.test.d.ts.map +1 -0
- package/dist/repositories/local/__tests__/getObjectFilePath.test.js +172 -0
- package/dist/repositories/local/__tests__/getObjectFilePath.test.js.map +1 -0
- package/dist/repositories/local/__tests__/getObjects.test.d.ts +2 -0
- package/dist/repositories/local/__tests__/getObjects.test.d.ts.map +1 -0
- package/dist/repositories/local/__tests__/getObjects.test.js +351 -0
- package/dist/repositories/local/__tests__/getObjects.test.js.map +1 -0
- package/dist/repositories/local/__tests__/scopeFilter.test.d.ts +2 -0
- package/dist/repositories/local/__tests__/scopeFilter.test.d.ts.map +1 -0
- package/dist/repositories/local/__tests__/scopeFilter.test.js +109 -0
- package/dist/repositories/local/__tests__/scopeFilter.test.js.map +1 -0
- package/dist/repositories/local/deleteObjectById.d.ts +16 -0
- package/dist/repositories/local/deleteObjectById.d.ts.map +1 -0
- package/dist/repositories/local/deleteObjectById.js +108 -0
- package/dist/repositories/local/deleteObjectById.js.map +1 -0
- package/dist/repositories/local/extractMarkdownIds.d.ts +17 -0
- package/dist/repositories/local/extractMarkdownIds.d.ts.map +1 -0
- package/dist/repositories/local/extractMarkdownIds.js +34 -0
- package/dist/repositories/local/extractMarkdownIds.js.map +1 -0
- package/dist/repositories/local/filterByScope.d.ts +8 -0
- package/dist/repositories/local/filterByScope.d.ts.map +1 -0
- package/dist/repositories/local/filterByScope.js +17 -0
- package/dist/repositories/local/filterByScope.js.map +1 -0
- package/dist/repositories/local/findMarkdownFiles.d.ts +9 -0
- package/dist/repositories/local/findMarkdownFiles.d.ts.map +1 -0
- package/dist/repositories/local/findMarkdownFiles.js +47 -0
- package/dist/repositories/local/findMarkdownFiles.js.map +1 -0
- package/dist/repositories/local/getObjectByFilePath.d.ts +9 -0
- package/dist/repositories/local/getObjectByFilePath.d.ts.map +1 -0
- package/dist/repositories/local/getObjectByFilePath.js +16 -0
- package/dist/repositories/local/getObjectByFilePath.js.map +1 -0
- package/dist/repositories/local/getObjectById.d.ts +10 -0
- package/dist/repositories/local/getObjectById.d.ts.map +1 -0
- package/dist/repositories/local/getObjectById.js +36 -0
- package/dist/repositories/local/getObjectById.js.map +1 -0
- package/dist/repositories/local/getObjectFilePath.d.ts +7 -0
- package/dist/repositories/local/getObjectFilePath.d.ts.map +1 -0
- package/dist/repositories/local/getObjectFilePath.js +90 -0
- package/dist/repositories/local/getObjectFilePath.js.map +1 -0
- package/dist/repositories/local/getObjects.d.ts +3 -0
- package/dist/repositories/local/getObjects.d.ts.map +1 -0
- package/dist/repositories/local/getObjects.js +64 -0
- package/dist/repositories/local/getObjects.js.map +1 -0
- package/dist/repositories/local/index.d.ts +8 -0
- package/dist/repositories/local/index.d.ts.map +1 -0
- package/dist/repositories/local/index.js +24 -0
- package/dist/repositories/local/index.js.map +1 -0
- package/dist/repositories/local/saveObject.d.ts +12 -0
- package/dist/repositories/local/saveObject.d.ts.map +1 -0
- package/dist/repositories/local/saveObject.js +27 -0
- package/dist/repositories/local/saveObject.js.map +1 -0
- package/dist/repositories/local/scopeFilter.d.ts +12 -0
- package/dist/repositories/local/scopeFilter.d.ts.map +1 -0
- package/dist/repositories/local/scopeFilter.js +21 -0
- package/dist/repositories/local/scopeFilter.js.map +1 -0
- package/dist/server.d.ts +3 -0
- package/dist/server.d.ts.map +1 -0
- package/dist/server.js +138 -0
- package/dist/server.js.map +1 -0
- package/dist/tools/__tests__/appendObjectLogTool.test.d.ts +2 -0
- package/dist/tools/__tests__/appendObjectLogTool.test.d.ts.map +1 -0
- package/dist/tools/__tests__/appendObjectLogTool.test.js +125 -0
- package/dist/tools/__tests__/appendObjectLogTool.test.js.map +1 -0
- package/dist/tools/__tests__/claimTaskTool.test.d.ts +2 -0
- package/dist/tools/__tests__/claimTaskTool.test.d.ts.map +1 -0
- package/dist/tools/__tests__/claimTaskTool.test.js +348 -0
- package/dist/tools/__tests__/claimTaskTool.test.js.map +1 -0
- package/dist/tools/__tests__/completeTaskTool.test.d.ts +2 -0
- package/dist/tools/__tests__/completeTaskTool.test.d.ts.map +1 -0
- package/dist/tools/__tests__/completeTaskTool.test.js +221 -0
- package/dist/tools/__tests__/completeTaskTool.test.js.map +1 -0
- package/dist/tools/__tests__/createObjectTool.test.d.ts +2 -0
- package/dist/tools/__tests__/createObjectTool.test.d.ts.map +1 -0
- package/dist/tools/__tests__/createObjectTool.test.js +387 -0
- package/dist/tools/__tests__/createObjectTool.test.js.map +1 -0
- package/dist/tools/__tests__/deleteObjectTool.test.d.ts +2 -0
- package/dist/tools/__tests__/deleteObjectTool.test.d.ts.map +1 -0
- package/dist/tools/__tests__/deleteObjectTool.test.js +169 -0
- package/dist/tools/__tests__/deleteObjectTool.test.js.map +1 -0
- package/dist/tools/__tests__/getObjectTool.test.d.ts +2 -0
- package/dist/tools/__tests__/getObjectTool.test.d.ts.map +1 -0
- package/dist/tools/__tests__/getObjectTool.test.js +124 -0
- package/dist/tools/__tests__/getObjectTool.test.js.map +1 -0
- package/dist/tools/__tests__/listObjectsTool.test.d.ts +2 -0
- package/dist/tools/__tests__/listObjectsTool.test.d.ts.map +1 -0
- package/dist/tools/__tests__/listObjectsTool.test.js +266 -0
- package/dist/tools/__tests__/listObjectsTool.test.js.map +1 -0
- package/dist/tools/__tests__/updateObjectTool.test.d.ts +2 -0
- package/dist/tools/__tests__/updateObjectTool.test.d.ts.map +1 -0
- package/dist/tools/__tests__/updateObjectTool.test.js +208 -0
- package/dist/tools/__tests__/updateObjectTool.test.js.map +1 -0
- package/dist/tools/activateTool.d.ts +38 -0
- package/dist/tools/activateTool.d.ts.map +1 -0
- package/dist/tools/activateTool.js +48 -0
- package/dist/tools/activateTool.js.map +1 -0
- package/dist/tools/appendObjectLogTool.d.ts +26 -0
- package/dist/tools/appendObjectLogTool.d.ts.map +1 -0
- package/dist/tools/appendObjectLogTool.js +65 -0
- package/dist/tools/appendObjectLogTool.js.map +1 -0
- package/dist/tools/claimTaskTool.d.ts +30 -0
- package/dist/tools/claimTaskTool.d.ts.map +1 -0
- package/dist/tools/claimTaskTool.js +109 -0
- package/dist/tools/claimTaskTool.js.map +1 -0
- package/dist/tools/completeTaskTool.d.ts +33 -0
- package/dist/tools/completeTaskTool.d.ts.map +1 -0
- package/dist/tools/completeTaskTool.js +61 -0
- package/dist/tools/completeTaskTool.js.map +1 -0
- package/dist/tools/createObjectTool.d.ts +52 -0
- package/dist/tools/createObjectTool.d.ts.map +1 -0
- package/dist/tools/createObjectTool.js +87 -0
- package/dist/tools/createObjectTool.js.map +1 -0
- package/dist/tools/deleteObjectTool.d.ts +27 -0
- package/dist/tools/deleteObjectTool.d.ts.map +1 -0
- package/dist/tools/deleteObjectTool.js +48 -0
- package/dist/tools/deleteObjectTool.js.map +1 -0
- package/dist/tools/getObjectTool.d.ts +22 -0
- package/dist/tools/getObjectTool.d.ts.map +1 -0
- package/dist/tools/getObjectTool.js +53 -0
- package/dist/tools/getObjectTool.js.map +1 -0
- package/dist/tools/index.d.ts +11 -0
- package/dist/tools/index.d.ts.map +1 -0
- package/dist/tools/index.js +34 -0
- package/dist/tools/index.js.map +1 -0
- package/dist/tools/listObjectsTool.d.ts +39 -0
- package/dist/tools/listObjectsTool.d.ts.map +1 -0
- package/dist/tools/listObjectsTool.js +87 -0
- package/dist/tools/listObjectsTool.js.map +1 -0
- package/dist/tools/pruneClosedTool.d.ts +26 -0
- package/dist/tools/pruneClosedTool.d.ts.map +1 -0
- package/dist/tools/pruneClosedTool.js +35 -0
- package/dist/tools/pruneClosedTool.js.map +1 -0
- package/dist/tools/updateObjectTool.d.ts +46 -0
- package/dist/tools/updateObjectTool.d.ts.map +1 -0
- package/dist/tools/updateObjectTool.js +93 -0
- package/dist/tools/updateObjectTool.js.map +1 -0
- package/dist/utils/__tests__/checkPrerequisitesComplete.test.d.ts +2 -0
- package/dist/utils/__tests__/checkPrerequisitesComplete.test.d.ts.map +1 -0
- package/dist/utils/__tests__/checkPrerequisitesComplete.test.js +200 -0
- package/dist/utils/__tests__/checkPrerequisitesComplete.test.js.map +1 -0
- package/dist/utils/__tests__/deserializeTrellisObject.test.d.ts +2 -0
- package/dist/utils/__tests__/deserializeTrellisObject.test.d.ts.map +1 -0
- package/dist/utils/__tests__/deserializeTrellisObject.test.js +329 -0
- package/dist/utils/__tests__/deserializeTrellisObject.test.js.map +1 -0
- package/dist/utils/__tests__/filterUnavailableObjects.test.d.ts +2 -0
- package/dist/utils/__tests__/filterUnavailableObjects.test.d.ts.map +1 -0
- package/dist/utils/__tests__/filterUnavailableObjects.test.js +172 -0
- package/dist/utils/__tests__/filterUnavailableObjects.test.js.map +1 -0
- package/dist/utils/__tests__/generateUniqueId.test.d.ts +2 -0
- package/dist/utils/__tests__/generateUniqueId.test.d.ts.map +1 -0
- package/dist/utils/__tests__/generateUniqueId.test.js +186 -0
- package/dist/utils/__tests__/generateUniqueId.test.js.map +1 -0
- package/dist/utils/__tests__/inferObjectType.test.d.ts +2 -0
- package/dist/utils/__tests__/inferObjectType.test.d.ts.map +1 -0
- package/dist/utils/__tests__/inferObjectType.test.js +43 -0
- package/dist/utils/__tests__/inferObjectType.test.js.map +1 -0
- package/dist/utils/__tests__/isRequiredForOtherObjects.test.d.ts +2 -0
- package/dist/utils/__tests__/isRequiredForOtherObjects.test.d.ts.map +1 -0
- package/dist/utils/__tests__/isRequiredForOtherObjects.test.js +229 -0
- package/dist/utils/__tests__/isRequiredForOtherObjects.test.js.map +1 -0
- package/dist/utils/__tests__/serializationRoundTrip.test.d.ts +2 -0
- package/dist/utils/__tests__/serializationRoundTrip.test.d.ts.map +1 -0
- package/dist/utils/__tests__/serializationRoundTrip.test.js +389 -0
- package/dist/utils/__tests__/serializationRoundTrip.test.js.map +1 -0
- package/dist/utils/__tests__/serializeTrellisObject.test.d.ts +2 -0
- package/dist/utils/__tests__/serializeTrellisObject.test.d.ts.map +1 -0
- package/dist/utils/__tests__/serializeTrellisObject.test.js +192 -0
- package/dist/utils/__tests__/serializeTrellisObject.test.js.map +1 -0
- package/dist/utils/__tests__/sortTrellisObjects.test.d.ts +2 -0
- package/dist/utils/__tests__/sortTrellisObjects.test.d.ts.map +1 -0
- package/dist/utils/__tests__/sortTrellisObjects.test.js +114 -0
- package/dist/utils/__tests__/sortTrellisObjects.test.js.map +1 -0
- package/dist/utils/checkPrerequisitesComplete.d.ts +12 -0
- package/dist/utils/checkPrerequisitesComplete.d.ts.map +1 -0
- package/dist/utils/checkPrerequisitesComplete.js +38 -0
- package/dist/utils/checkPrerequisitesComplete.js.map +1 -0
- package/dist/utils/deserializeTrellisObject.d.ts +9 -0
- package/dist/utils/deserializeTrellisObject.d.ts.map +1 -0
- package/dist/utils/deserializeTrellisObject.js +134 -0
- package/dist/utils/deserializeTrellisObject.js.map +1 -0
- package/dist/utils/filterUnavailableObjects.d.ts +13 -0
- package/dist/utils/filterUnavailableObjects.d.ts.map +1 -0
- package/dist/utils/filterUnavailableObjects.js +40 -0
- package/dist/utils/filterUnavailableObjects.js.map +1 -0
- package/dist/utils/generateUniqueId.d.ts +10 -0
- package/dist/utils/generateUniqueId.d.ts.map +1 -0
- package/dist/utils/generateUniqueId.js +67 -0
- package/dist/utils/generateUniqueId.js.map +1 -0
- package/dist/utils/index.d.ts +9 -0
- package/dist/utils/index.d.ts.map +1 -0
- package/dist/utils/index.js +20 -0
- package/dist/utils/index.js.map +1 -0
- package/dist/utils/inferObjectType.d.ts +3 -0
- package/dist/utils/inferObjectType.d.ts.map +1 -0
- package/dist/utils/inferObjectType.js +26 -0
- package/dist/utils/inferObjectType.js.map +1 -0
- package/dist/utils/isRequiredForOtherObjects.d.ts +12 -0
- package/dist/utils/isRequiredForOtherObjects.d.ts.map +1 -0
- package/dist/utils/isRequiredForOtherObjects.js +33 -0
- package/dist/utils/isRequiredForOtherObjects.js.map +1 -0
- package/dist/utils/serializeTrellisObject.d.ts +8 -0
- package/dist/utils/serializeTrellisObject.d.ts.map +1 -0
- package/dist/utils/serializeTrellisObject.js +35 -0
- package/dist/utils/serializeTrellisObject.js.map +1 -0
- package/dist/utils/sortTrellisObjects.d.ts +8 -0
- package/dist/utils/sortTrellisObjects.d.ts.map +1 -0
- package/dist/utils/sortTrellisObjects.js +20 -0
- package/dist/utils/sortTrellisObjects.js.map +1 -0
- package/dist/validation/ValidationError.d.ts +9 -0
- package/dist/validation/ValidationError.d.ts.map +1 -0
- package/dist/validation/ValidationError.js +18 -0
- package/dist/validation/ValidationError.js.map +1 -0
- package/dist/validation/ValidationErrorCode.d.ts +3 -0
- package/dist/validation/ValidationErrorCode.d.ts.map +1 -0
- package/dist/validation/ValidationErrorCode.js +3 -0
- package/dist/validation/ValidationErrorCode.js.map +1 -0
- package/dist/validation/ValidationErrorCodes.d.ts +8 -0
- package/dist/validation/ValidationErrorCodes.d.ts.map +1 -0
- package/dist/validation/ValidationErrorCodes.js +11 -0
- package/dist/validation/ValidationErrorCodes.js.map +1 -0
- package/dist/validation/__tests__/ValidationError.test.d.ts +2 -0
- package/dist/validation/__tests__/ValidationError.test.d.ts.map +1 -0
- package/dist/validation/__tests__/ValidationError.test.js +32 -0
- package/dist/validation/__tests__/ValidationError.test.js.map +1 -0
- package/dist/validation/__tests__/validateObjectCreation.test.d.ts +2 -0
- package/dist/validation/__tests__/validateObjectCreation.test.d.ts.map +1 -0
- package/dist/validation/__tests__/validateObjectCreation.test.js +93 -0
- package/dist/validation/__tests__/validateObjectCreation.test.js.map +1 -0
- package/dist/validation/__tests__/validateParentExists.test.d.ts +2 -0
- package/dist/validation/__tests__/validateParentExists.test.d.ts.map +1 -0
- package/dist/validation/__tests__/validateParentExists.test.js +62 -0
- package/dist/validation/__tests__/validateParentExists.test.js.map +1 -0
- package/dist/validation/__tests__/validateParentType.test.d.ts +2 -0
- package/dist/validation/__tests__/validateParentType.test.d.ts.map +1 -0
- package/dist/validation/__tests__/validateParentType.test.js +125 -0
- package/dist/validation/__tests__/validateParentType.test.js.map +1 -0
- package/dist/validation/__tests__/validateStatusTransition.test.d.ts +2 -0
- package/dist/validation/__tests__/validateStatusTransition.test.d.ts.map +1 -0
- package/dist/validation/__tests__/validateStatusTransition.test.js +103 -0
- package/dist/validation/__tests__/validateStatusTransition.test.js.map +1 -0
- package/dist/validation/validateObjectCreation.d.ts +12 -0
- package/dist/validation/validateObjectCreation.d.ts.map +1 -0
- package/dist/validation/validateObjectCreation.js +24 -0
- package/dist/validation/validateObjectCreation.js.map +1 -0
- package/dist/validation/validateParentExists.d.ts +10 -0
- package/dist/validation/validateParentExists.d.ts.map +1 -0
- package/dist/validation/validateParentExists.js +23 -0
- package/dist/validation/validateParentExists.js.map +1 -0
- package/dist/validation/validateParentType.d.ts +16 -0
- package/dist/validation/validateParentType.d.ts.map +1 -0
- package/dist/validation/validateParentType.js +48 -0
- package/dist/validation/validateParentType.js.map +1 -0
- package/dist/validation/validateStatusTransition.d.ts +12 -0
- package/dist/validation/validateStatusTransition.d.ts.map +1 -0
- package/dist/validation/validateStatusTransition.js +29 -0
- package/dist/validation/validateStatusTransition.js.map +1 -0
- package/package.json +78 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validateParentExists.test.js","sourceRoot":"","sources":["../../../src/validation/__tests__/validateParentExists.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validateParentType.test.d.ts","sourceRoot":"","sources":["../../../src/validation/__tests__/validateParentType.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,125 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
const TrellisObjectType_1 = require("../../models/TrellisObjectType");
|
|
4
|
+
const validateParentType_1 = require("../validateParentType");
|
|
5
|
+
describe("validateParentType", () => {
|
|
6
|
+
describe("Projects", () => {
|
|
7
|
+
it("should allow projects with no parent", () => {
|
|
8
|
+
expect(() => {
|
|
9
|
+
(0, validateParentType_1.validateParentType)(TrellisObjectType_1.TrellisObjectType.PROJECT, null);
|
|
10
|
+
}).not.toThrow();
|
|
11
|
+
expect(() => {
|
|
12
|
+
(0, validateParentType_1.validateParentType)(TrellisObjectType_1.TrellisObjectType.PROJECT, undefined);
|
|
13
|
+
}).not.toThrow();
|
|
14
|
+
});
|
|
15
|
+
it("should reject projects with any parent", () => {
|
|
16
|
+
expect(() => {
|
|
17
|
+
(0, validateParentType_1.validateParentType)(TrellisObjectType_1.TrellisObjectType.PROJECT, "P-parent");
|
|
18
|
+
}).toThrow("Projects cannot have parents");
|
|
19
|
+
expect(() => {
|
|
20
|
+
(0, validateParentType_1.validateParentType)(TrellisObjectType_1.TrellisObjectType.PROJECT, "E-parent");
|
|
21
|
+
}).toThrow("Projects cannot have parents");
|
|
22
|
+
expect(() => {
|
|
23
|
+
(0, validateParentType_1.validateParentType)(TrellisObjectType_1.TrellisObjectType.PROJECT, "F-parent");
|
|
24
|
+
}).toThrow("Projects cannot have parents");
|
|
25
|
+
expect(() => {
|
|
26
|
+
(0, validateParentType_1.validateParentType)(TrellisObjectType_1.TrellisObjectType.PROJECT, "T-parent");
|
|
27
|
+
}).toThrow("Projects cannot have parents");
|
|
28
|
+
});
|
|
29
|
+
});
|
|
30
|
+
describe("Epics", () => {
|
|
31
|
+
it("should require epics to have a project parent", () => {
|
|
32
|
+
expect(() => {
|
|
33
|
+
(0, validateParentType_1.validateParentType)(TrellisObjectType_1.TrellisObjectType.EPIC, "P-project");
|
|
34
|
+
}).not.toThrow();
|
|
35
|
+
});
|
|
36
|
+
it("should reject epics with no parent", () => {
|
|
37
|
+
expect(() => {
|
|
38
|
+
(0, validateParentType_1.validateParentType)(TrellisObjectType_1.TrellisObjectType.EPIC, null);
|
|
39
|
+
}).toThrow("Epics must have a project as a parent");
|
|
40
|
+
expect(() => {
|
|
41
|
+
(0, validateParentType_1.validateParentType)(TrellisObjectType_1.TrellisObjectType.EPIC, undefined);
|
|
42
|
+
}).toThrow("Epics must have a project as a parent");
|
|
43
|
+
});
|
|
44
|
+
it("should reject epics with non-project parents", () => {
|
|
45
|
+
expect(() => {
|
|
46
|
+
(0, validateParentType_1.validateParentType)(TrellisObjectType_1.TrellisObjectType.EPIC, "E-epic");
|
|
47
|
+
}).toThrow("Epics must have a project as a parent");
|
|
48
|
+
expect(() => {
|
|
49
|
+
(0, validateParentType_1.validateParentType)(TrellisObjectType_1.TrellisObjectType.EPIC, "F-feature");
|
|
50
|
+
}).toThrow("Epics must have a project as a parent");
|
|
51
|
+
expect(() => {
|
|
52
|
+
(0, validateParentType_1.validateParentType)(TrellisObjectType_1.TrellisObjectType.EPIC, "T-task");
|
|
53
|
+
}).toThrow("Epics must have a project as a parent");
|
|
54
|
+
});
|
|
55
|
+
});
|
|
56
|
+
describe("Features", () => {
|
|
57
|
+
it("should allow features with epic parent", () => {
|
|
58
|
+
expect(() => {
|
|
59
|
+
(0, validateParentType_1.validateParentType)(TrellisObjectType_1.TrellisObjectType.FEATURE, "E-epic");
|
|
60
|
+
}).not.toThrow();
|
|
61
|
+
});
|
|
62
|
+
it("should allow features with no parent", () => {
|
|
63
|
+
expect(() => {
|
|
64
|
+
(0, validateParentType_1.validateParentType)(TrellisObjectType_1.TrellisObjectType.FEATURE, null);
|
|
65
|
+
}).not.toThrow();
|
|
66
|
+
expect(() => {
|
|
67
|
+
(0, validateParentType_1.validateParentType)(TrellisObjectType_1.TrellisObjectType.FEATURE, undefined);
|
|
68
|
+
}).not.toThrow();
|
|
69
|
+
});
|
|
70
|
+
it("should reject features with non-epic parents", () => {
|
|
71
|
+
expect(() => {
|
|
72
|
+
(0, validateParentType_1.validateParentType)(TrellisObjectType_1.TrellisObjectType.FEATURE, "P-project");
|
|
73
|
+
}).toThrow("Features can only have an epic as a parent");
|
|
74
|
+
expect(() => {
|
|
75
|
+
(0, validateParentType_1.validateParentType)(TrellisObjectType_1.TrellisObjectType.FEATURE, "F-feature");
|
|
76
|
+
}).toThrow("Features can only have an epic as a parent");
|
|
77
|
+
expect(() => {
|
|
78
|
+
(0, validateParentType_1.validateParentType)(TrellisObjectType_1.TrellisObjectType.FEATURE, "T-task");
|
|
79
|
+
}).toThrow("Features can only have an epic as a parent");
|
|
80
|
+
});
|
|
81
|
+
});
|
|
82
|
+
describe("Tasks", () => {
|
|
83
|
+
it("should allow tasks with feature parent", () => {
|
|
84
|
+
expect(() => {
|
|
85
|
+
(0, validateParentType_1.validateParentType)(TrellisObjectType_1.TrellisObjectType.TASK, "F-feature");
|
|
86
|
+
}).not.toThrow();
|
|
87
|
+
});
|
|
88
|
+
it("should allow tasks with no parent", () => {
|
|
89
|
+
expect(() => {
|
|
90
|
+
(0, validateParentType_1.validateParentType)(TrellisObjectType_1.TrellisObjectType.TASK, null);
|
|
91
|
+
}).not.toThrow();
|
|
92
|
+
expect(() => {
|
|
93
|
+
(0, validateParentType_1.validateParentType)(TrellisObjectType_1.TrellisObjectType.TASK, undefined);
|
|
94
|
+
}).not.toThrow();
|
|
95
|
+
});
|
|
96
|
+
it("should reject tasks with non-feature parents", () => {
|
|
97
|
+
expect(() => {
|
|
98
|
+
(0, validateParentType_1.validateParentType)(TrellisObjectType_1.TrellisObjectType.TASK, "P-project");
|
|
99
|
+
}).toThrow("Tasks can only have a feature as a parent");
|
|
100
|
+
expect(() => {
|
|
101
|
+
(0, validateParentType_1.validateParentType)(TrellisObjectType_1.TrellisObjectType.TASK, "E-epic");
|
|
102
|
+
}).toThrow("Tasks can only have a feature as a parent");
|
|
103
|
+
expect(() => {
|
|
104
|
+
(0, validateParentType_1.validateParentType)(TrellisObjectType_1.TrellisObjectType.TASK, "T-task");
|
|
105
|
+
}).toThrow("Tasks can only have a feature as a parent");
|
|
106
|
+
});
|
|
107
|
+
});
|
|
108
|
+
describe("Edge cases", () => {
|
|
109
|
+
it("should handle empty string as no parent", () => {
|
|
110
|
+
expect(() => {
|
|
111
|
+
(0, validateParentType_1.validateParentType)(TrellisObjectType_1.TrellisObjectType.PROJECT, "");
|
|
112
|
+
}).not.toThrow();
|
|
113
|
+
expect(() => {
|
|
114
|
+
(0, validateParentType_1.validateParentType)(TrellisObjectType_1.TrellisObjectType.FEATURE, "");
|
|
115
|
+
}).not.toThrow();
|
|
116
|
+
expect(() => {
|
|
117
|
+
(0, validateParentType_1.validateParentType)(TrellisObjectType_1.TrellisObjectType.TASK, "");
|
|
118
|
+
}).not.toThrow();
|
|
119
|
+
expect(() => {
|
|
120
|
+
(0, validateParentType_1.validateParentType)(TrellisObjectType_1.TrellisObjectType.EPIC, "");
|
|
121
|
+
}).toThrow("Epics must have a project as a parent");
|
|
122
|
+
});
|
|
123
|
+
});
|
|
124
|
+
});
|
|
125
|
+
//# sourceMappingURL=validateParentType.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validateParentType.test.js","sourceRoot":"","sources":["../../../src/validation/__tests__/validateParentType.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validateStatusTransition.test.d.ts","sourceRoot":"","sources":["../../../src/validation/__tests__/validateStatusTransition.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,103 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
const models_1 = require("../../models");
|
|
4
|
+
const validateStatusTransition_1 = require("../validateStatusTransition");
|
|
5
|
+
// Mock the checkPrerequisitesComplete function
|
|
6
|
+
jest.mock("../../utils/checkPrerequisitesComplete", () => ({
|
|
7
|
+
checkPrerequisitesComplete: jest.fn(),
|
|
8
|
+
}));
|
|
9
|
+
const checkPrerequisitesComplete_1 = require("../../utils/checkPrerequisitesComplete");
|
|
10
|
+
const mockCheckPrerequisitesComplete = checkPrerequisitesComplete_1.checkPrerequisitesComplete;
|
|
11
|
+
describe("validateStatusTransition", () => {
|
|
12
|
+
let mockRepository;
|
|
13
|
+
beforeEach(() => {
|
|
14
|
+
mockRepository = {
|
|
15
|
+
getObjectById: jest.fn(),
|
|
16
|
+
getObjects: jest.fn(),
|
|
17
|
+
saveObject: jest.fn(),
|
|
18
|
+
deleteObject: jest.fn(),
|
|
19
|
+
};
|
|
20
|
+
jest.clearAllMocks();
|
|
21
|
+
});
|
|
22
|
+
const createMockObject = (id, status, prerequisites = []) => ({
|
|
23
|
+
id,
|
|
24
|
+
type: models_1.TrellisObjectType.TASK,
|
|
25
|
+
title: "Test Task",
|
|
26
|
+
status,
|
|
27
|
+
priority: models_1.TrellisObjectPriority.MEDIUM,
|
|
28
|
+
parent: "F-test-feature",
|
|
29
|
+
prerequisites,
|
|
30
|
+
affectedFiles: new Map(),
|
|
31
|
+
log: [],
|
|
32
|
+
schema: "1.0",
|
|
33
|
+
childrenIds: [],
|
|
34
|
+
body: "Test body",
|
|
35
|
+
});
|
|
36
|
+
describe("Status transition validation", () => {
|
|
37
|
+
it("should allow transition to IN_PROGRESS when prerequisites are complete", async () => {
|
|
38
|
+
const object = createMockObject("T-test", models_1.TrellisObjectStatus.IN_PROGRESS);
|
|
39
|
+
mockCheckPrerequisitesComplete.mockResolvedValue(true);
|
|
40
|
+
await expect((0, validateStatusTransition_1.validateStatusTransition)(object, mockRepository)).resolves.not.toThrow();
|
|
41
|
+
expect(mockCheckPrerequisitesComplete).toHaveBeenCalledWith(object, mockRepository);
|
|
42
|
+
});
|
|
43
|
+
it("should allow transition to DONE when prerequisites are complete", async () => {
|
|
44
|
+
const object = createMockObject("T-test", models_1.TrellisObjectStatus.DONE);
|
|
45
|
+
mockCheckPrerequisitesComplete.mockResolvedValue(true);
|
|
46
|
+
await expect((0, validateStatusTransition_1.validateStatusTransition)(object, mockRepository)).resolves.not.toThrow();
|
|
47
|
+
expect(mockCheckPrerequisitesComplete).toHaveBeenCalledWith(object, mockRepository);
|
|
48
|
+
});
|
|
49
|
+
it("should reject transition to IN_PROGRESS when prerequisites are not complete", async () => {
|
|
50
|
+
const object = createMockObject("T-test", models_1.TrellisObjectStatus.IN_PROGRESS);
|
|
51
|
+
mockCheckPrerequisitesComplete.mockResolvedValue(false);
|
|
52
|
+
await expect((0, validateStatusTransition_1.validateStatusTransition)(object, mockRepository)).rejects.toThrow("Cannot update status to 'in-progress' - prerequisites are not complete. Use force=true to override.");
|
|
53
|
+
expect(mockCheckPrerequisitesComplete).toHaveBeenCalledWith(object, mockRepository);
|
|
54
|
+
});
|
|
55
|
+
it("should reject transition to DONE when prerequisites are not complete", async () => {
|
|
56
|
+
const object = createMockObject("T-test", models_1.TrellisObjectStatus.DONE);
|
|
57
|
+
mockCheckPrerequisitesComplete.mockResolvedValue(false);
|
|
58
|
+
await expect((0, validateStatusTransition_1.validateStatusTransition)(object, mockRepository)).rejects.toThrow("Cannot update status to 'done' - prerequisites are not complete. Use force=true to override.");
|
|
59
|
+
expect(mockCheckPrerequisitesComplete).toHaveBeenCalledWith(object, mockRepository);
|
|
60
|
+
});
|
|
61
|
+
it("should not validate prerequisites for DRAFT status", async () => {
|
|
62
|
+
const object = createMockObject("T-test", models_1.TrellisObjectStatus.DRAFT);
|
|
63
|
+
await expect((0, validateStatusTransition_1.validateStatusTransition)(object, mockRepository)).resolves.not.toThrow();
|
|
64
|
+
expect(mockCheckPrerequisitesComplete).not.toHaveBeenCalled();
|
|
65
|
+
});
|
|
66
|
+
it("should not validate prerequisites for OPEN status", async () => {
|
|
67
|
+
const object = createMockObject("T-test", models_1.TrellisObjectStatus.OPEN);
|
|
68
|
+
await expect((0, validateStatusTransition_1.validateStatusTransition)(object, mockRepository)).resolves.not.toThrow();
|
|
69
|
+
expect(mockCheckPrerequisitesComplete).not.toHaveBeenCalled();
|
|
70
|
+
});
|
|
71
|
+
it("should not validate prerequisites for WONT_DO status", async () => {
|
|
72
|
+
const object = createMockObject("T-test", models_1.TrellisObjectStatus.WONT_DO);
|
|
73
|
+
await expect((0, validateStatusTransition_1.validateStatusTransition)(object, mockRepository)).resolves.not.toThrow();
|
|
74
|
+
expect(mockCheckPrerequisitesComplete).not.toHaveBeenCalled();
|
|
75
|
+
});
|
|
76
|
+
});
|
|
77
|
+
describe("Error handling", () => {
|
|
78
|
+
it("should propagate errors from checkPrerequisitesComplete", async () => {
|
|
79
|
+
const object = createMockObject("T-test", models_1.TrellisObjectStatus.IN_PROGRESS);
|
|
80
|
+
const checkError = new Error("Repository error");
|
|
81
|
+
mockCheckPrerequisitesComplete.mockRejectedValue(checkError);
|
|
82
|
+
await expect((0, validateStatusTransition_1.validateStatusTransition)(object, mockRepository)).rejects.toThrow("Repository error");
|
|
83
|
+
});
|
|
84
|
+
});
|
|
85
|
+
describe("Complex scenarios", () => {
|
|
86
|
+
it("should validate objects with prerequisites when transitioning to IN_PROGRESS", async () => {
|
|
87
|
+
const object = createMockObject("T-test", models_1.TrellisObjectStatus.IN_PROGRESS, ["T-prereq-1", "T-prereq-2"]);
|
|
88
|
+
mockCheckPrerequisitesComplete.mockResolvedValue(true);
|
|
89
|
+
await expect((0, validateStatusTransition_1.validateStatusTransition)(object, mockRepository)).resolves.not.toThrow();
|
|
90
|
+
expect(mockCheckPrerequisitesComplete).toHaveBeenCalledWith(object, mockRepository);
|
|
91
|
+
});
|
|
92
|
+
it("should reject objects with incomplete prerequisites when transitioning to DONE", async () => {
|
|
93
|
+
const object = createMockObject("T-test", models_1.TrellisObjectStatus.DONE, [
|
|
94
|
+
"T-prereq-1",
|
|
95
|
+
"T-prereq-2",
|
|
96
|
+
"T-prereq-3",
|
|
97
|
+
]);
|
|
98
|
+
mockCheckPrerequisitesComplete.mockResolvedValue(false);
|
|
99
|
+
await expect((0, validateStatusTransition_1.validateStatusTransition)(object, mockRepository)).rejects.toThrow("Cannot update status to 'done' - prerequisites are not complete. Use force=true to override.");
|
|
100
|
+
});
|
|
101
|
+
});
|
|
102
|
+
});
|
|
103
|
+
//# sourceMappingURL=validateStatusTransition.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validateStatusTransition.test.js","sourceRoot":"","sources":["../../../src/validation/__tests__/validateStatusTransition.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import type { TrellisObject } from "../models/TrellisObject.js";
|
|
2
|
+
import type { Repository } from "../repositories/Repository.js";
|
|
3
|
+
/**
|
|
4
|
+
* Validates a TrellisObject before creation.
|
|
5
|
+
* Orchestrates all validation rules for object creation.
|
|
6
|
+
*
|
|
7
|
+
* @param trellisObject - The object to validate
|
|
8
|
+
* @param repository - Repository instance for data access during validation
|
|
9
|
+
* @throws {ValidationError} When any validation rule fails
|
|
10
|
+
*/
|
|
11
|
+
export declare function validateObjectCreation(trellisObject: TrellisObject, repository: Repository): Promise<void>;
|
|
12
|
+
//# sourceMappingURL=validateObjectCreation.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validateObjectCreation.d.ts","sourceRoot":"","sources":["../../src/validation/validateObjectCreation.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,4BAA4B,CAAC;AAChE,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,+BAA+B,CAAC;AAKhE;;;;;;;GAOG;AACH,wBAAsB,sBAAsB,CAC1C,aAAa,EAAE,aAAa,EAC5B,UAAU,EAAE,UAAU,GACrB,OAAO,CAAC,IAAI,CAAC,CAUf"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.validateObjectCreation = validateObjectCreation;
|
|
4
|
+
const inferObjectType_js_1 = require("../utils/inferObjectType.js");
|
|
5
|
+
const validateParentExists_js_1 = require("./validateParentExists.js");
|
|
6
|
+
const validateParentType_js_1 = require("./validateParentType.js");
|
|
7
|
+
/**
|
|
8
|
+
* Validates a TrellisObject before creation.
|
|
9
|
+
* Orchestrates all validation rules for object creation.
|
|
10
|
+
*
|
|
11
|
+
* @param trellisObject - The object to validate
|
|
12
|
+
* @param repository - Repository instance for data access during validation
|
|
13
|
+
* @throws {ValidationError} When any validation rule fails
|
|
14
|
+
*/
|
|
15
|
+
async function validateObjectCreation(trellisObject, repository) {
|
|
16
|
+
// Validate parent type compatibility
|
|
17
|
+
const objectType = (0, inferObjectType_js_1.inferObjectType)(trellisObject.id);
|
|
18
|
+
(0, validateParentType_js_1.validateParentType)(objectType, trellisObject.parent);
|
|
19
|
+
// Validate parent existence
|
|
20
|
+
await (0, validateParentExists_js_1.validateParentExists)(trellisObject.parent, repository);
|
|
21
|
+
// Future validation rules can be added here
|
|
22
|
+
// e.g., validatePrerequisites, validateObjectType, etc.
|
|
23
|
+
}
|
|
24
|
+
//# sourceMappingURL=validateObjectCreation.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validateObjectCreation.js","sourceRoot":"","sources":["../../src/validation/validateObjectCreation.ts"],"names":[],"mappings":";;AAcA,wDAaC;AAzBD,oEAA8D;AAC9D,uEAAiE;AACjE,mEAA6D;AAE7D;;;;;;;GAOG;AACI,KAAK,UAAU,sBAAsB,CAC1C,aAA4B,EAC5B,UAAsB;IAEtB,qCAAqC;IACrC,MAAM,UAAU,GAAG,IAAA,oCAAe,EAAC,aAAa,CAAC,EAAE,CAAC,CAAC;IACrD,IAAA,0CAAkB,EAAC,UAAU,EAAE,aAAa,CAAC,MAAM,CAAC,CAAC;IAErD,4BAA4B;IAC5B,MAAM,IAAA,8CAAoB,EAAC,aAAa,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC;IAE7D,4CAA4C;IAC5C,wDAAwD;AAC1D,CAAC"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import type { Repository } from "../repositories/Repository.js";
|
|
2
|
+
/**
|
|
3
|
+
* Validates that a parent object exists in the repository.
|
|
4
|
+
*
|
|
5
|
+
* @param parentId - The ID of the parent object to validate
|
|
6
|
+
* @param repository - Repository instance to check for parent existence
|
|
7
|
+
* @throws {ValidationError} When parent ID is provided but parent doesn't exist
|
|
8
|
+
*/
|
|
9
|
+
export declare function validateParentExists(parentId: string | undefined, repository: Repository): Promise<void>;
|
|
10
|
+
//# sourceMappingURL=validateParentExists.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validateParentExists.d.ts","sourceRoot":"","sources":["../../src/validation/validateParentExists.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,+BAA+B,CAAC;AAIhE;;;;;;GAMG;AACH,wBAAsB,oBAAoB,CACxC,QAAQ,EAAE,MAAM,GAAG,SAAS,EAC5B,UAAU,EAAE,UAAU,GACrB,OAAO,CAAC,IAAI,CAAC,CAef"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.validateParentExists = validateParentExists;
|
|
4
|
+
const ValidationError_js_1 = require("./ValidationError.js");
|
|
5
|
+
const ValidationErrorCodes_js_1 = require("./ValidationErrorCodes.js");
|
|
6
|
+
/**
|
|
7
|
+
* Validates that a parent object exists in the repository.
|
|
8
|
+
*
|
|
9
|
+
* @param parentId - The ID of the parent object to validate
|
|
10
|
+
* @param repository - Repository instance to check for parent existence
|
|
11
|
+
* @throws {ValidationError} When parent ID is provided but parent doesn't exist
|
|
12
|
+
*/
|
|
13
|
+
async function validateParentExists(parentId, repository) {
|
|
14
|
+
// If no parent is specified, validation passes
|
|
15
|
+
if (!parentId) {
|
|
16
|
+
return;
|
|
17
|
+
}
|
|
18
|
+
const parentObject = await repository.getObjectById(parentId);
|
|
19
|
+
if (!parentObject) {
|
|
20
|
+
throw new ValidationError_js_1.ValidationError(`Parent object with ID '${parentId}' does not exist`, ValidationErrorCodes_js_1.ValidationErrorCodes.PARENT_NOT_FOUND, "parent");
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
//# sourceMappingURL=validateParentExists.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validateParentExists.js","sourceRoot":"","sources":["../../src/validation/validateParentExists.ts"],"names":[],"mappings":";;AAWA,oDAkBC;AA5BD,6DAAuD;AACvD,uEAAiE;AAEjE;;;;;;GAMG;AACI,KAAK,UAAU,oBAAoB,CACxC,QAA4B,EAC5B,UAAsB;IAEtB,+CAA+C;IAC/C,IAAI,CAAC,QAAQ,EAAE,CAAC;QACd,OAAO;IACT,CAAC;IAED,MAAM,YAAY,GAAG,MAAM,UAAU,CAAC,aAAa,CAAC,QAAQ,CAAC,CAAC;IAE9D,IAAI,CAAC,YAAY,EAAE,CAAC;QAClB,MAAM,IAAI,oCAAe,CACvB,0BAA0B,QAAQ,kBAAkB,EACpD,8CAAoB,CAAC,gBAAgB,EACrC,QAAQ,CACT,CAAC;IACJ,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { TrellisObjectType } from "../models/TrellisObjectType.js";
|
|
2
|
+
/**
|
|
3
|
+
* Validates that the parent type is appropriate for the object type being created.
|
|
4
|
+
*
|
|
5
|
+
* Business rules:
|
|
6
|
+
* - Projects cannot have parents
|
|
7
|
+
* - Epics must have a project as a parent
|
|
8
|
+
* - Features can either have an epic as a parent or have no parent
|
|
9
|
+
* - Tasks can have a feature as a parent or have no parent
|
|
10
|
+
*
|
|
11
|
+
* @param objectType - The type of object being created
|
|
12
|
+
* @param parentId - The parent ID (can be null/undefined for objects without parents)
|
|
13
|
+
* @throws {Error} When parent type is invalid for the object type
|
|
14
|
+
*/
|
|
15
|
+
export declare function validateParentType(objectType: TrellisObjectType, parentId: string | null | undefined): void;
|
|
16
|
+
//# sourceMappingURL=validateParentType.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validateParentType.d.ts","sourceRoot":"","sources":["../../src/validation/validateParentType.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,gCAAgC,CAAC;AAGnE;;;;;;;;;;;;GAYG;AACH,wBAAgB,kBAAkB,CAChC,UAAU,EAAE,iBAAiB,EAC7B,QAAQ,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,GAClC,IAAI,CAiCN"}
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.validateParentType = validateParentType;
|
|
4
|
+
const TrellisObjectType_js_1 = require("../models/TrellisObjectType.js");
|
|
5
|
+
const inferObjectType_js_1 = require("../utils/inferObjectType.js");
|
|
6
|
+
/**
|
|
7
|
+
* Validates that the parent type is appropriate for the object type being created.
|
|
8
|
+
*
|
|
9
|
+
* Business rules:
|
|
10
|
+
* - Projects cannot have parents
|
|
11
|
+
* - Epics must have a project as a parent
|
|
12
|
+
* - Features can either have an epic as a parent or have no parent
|
|
13
|
+
* - Tasks can have a feature as a parent or have no parent
|
|
14
|
+
*
|
|
15
|
+
* @param objectType - The type of object being created
|
|
16
|
+
* @param parentId - The parent ID (can be null/undefined for objects without parents)
|
|
17
|
+
* @throws {Error} When parent type is invalid for the object type
|
|
18
|
+
*/
|
|
19
|
+
function validateParentType(objectType, parentId) {
|
|
20
|
+
if (!parentId) {
|
|
21
|
+
// No parent - only allowed for projects, features, and tasks
|
|
22
|
+
if (objectType === TrellisObjectType_js_1.TrellisObjectType.EPIC) {
|
|
23
|
+
throw new Error("Epics must have a project as a parent");
|
|
24
|
+
}
|
|
25
|
+
return;
|
|
26
|
+
}
|
|
27
|
+
const parentType = (0, inferObjectType_js_1.inferObjectType)(parentId);
|
|
28
|
+
switch (objectType) {
|
|
29
|
+
case TrellisObjectType_js_1.TrellisObjectType.PROJECT:
|
|
30
|
+
throw new Error("Projects cannot have parents");
|
|
31
|
+
case TrellisObjectType_js_1.TrellisObjectType.EPIC:
|
|
32
|
+
if (parentType !== TrellisObjectType_js_1.TrellisObjectType.PROJECT) {
|
|
33
|
+
throw new Error("Epics must have a project as a parent");
|
|
34
|
+
}
|
|
35
|
+
break;
|
|
36
|
+
case TrellisObjectType_js_1.TrellisObjectType.FEATURE:
|
|
37
|
+
if (parentType !== TrellisObjectType_js_1.TrellisObjectType.EPIC) {
|
|
38
|
+
throw new Error("Features can only have an epic as a parent");
|
|
39
|
+
}
|
|
40
|
+
break;
|
|
41
|
+
case TrellisObjectType_js_1.TrellisObjectType.TASK:
|
|
42
|
+
if (parentType !== TrellisObjectType_js_1.TrellisObjectType.FEATURE) {
|
|
43
|
+
throw new Error("Tasks can only have a feature as a parent");
|
|
44
|
+
}
|
|
45
|
+
break;
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
//# sourceMappingURL=validateParentType.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validateParentType.js","sourceRoot":"","sources":["../../src/validation/validateParentType.ts"],"names":[],"mappings":";;AAgBA,gDAoCC;AApDD,yEAAmE;AACnE,oEAA8D;AAE9D;;;;;;;;;;;;GAYG;AACH,SAAgB,kBAAkB,CAChC,UAA6B,EAC7B,QAAmC;IAEnC,IAAI,CAAC,QAAQ,EAAE,CAAC;QACd,6DAA6D;QAC7D,IAAI,UAAU,KAAK,wCAAiB,CAAC,IAAI,EAAE,CAAC;YAC1C,MAAM,IAAI,KAAK,CAAC,uCAAuC,CAAC,CAAC;QAC3D,CAAC;QACD,OAAO;IACT,CAAC;IAED,MAAM,UAAU,GAAG,IAAA,oCAAe,EAAC,QAAQ,CAAC,CAAC;IAE7C,QAAQ,UAAU,EAAE,CAAC;QACnB,KAAK,wCAAiB,CAAC,OAAO;YAC5B,MAAM,IAAI,KAAK,CAAC,8BAA8B,CAAC,CAAC;QAElD,KAAK,wCAAiB,CAAC,IAAI;YACzB,IAAI,UAAU,KAAK,wCAAiB,CAAC,OAAO,EAAE,CAAC;gBAC7C,MAAM,IAAI,KAAK,CAAC,uCAAuC,CAAC,CAAC;YAC3D,CAAC;YACD,MAAM;QAER,KAAK,wCAAiB,CAAC,OAAO;YAC5B,IAAI,UAAU,KAAK,wCAAiB,CAAC,IAAI,EAAE,CAAC;gBAC1C,MAAM,IAAI,KAAK,CAAC,4CAA4C,CAAC,CAAC;YAChE,CAAC;YACD,MAAM;QAER,KAAK,wCAAiB,CAAC,IAAI;YACzB,IAAI,UAAU,KAAK,wCAAiB,CAAC,OAAO,EAAE,CAAC;gBAC7C,MAAM,IAAI,KAAK,CAAC,2CAA2C,CAAC,CAAC;YAC/D,CAAC;YACD,MAAM;IACV,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import type { TrellisObject } from "../models/TrellisObject.js";
|
|
2
|
+
import type { Repository } from "../repositories/Repository.js";
|
|
3
|
+
/**
|
|
4
|
+
* Validates that a status transition is allowed based on prerequisite completion.
|
|
5
|
+
* Only validates transitions to IN_PROGRESS and DONE statuses unless force is true.
|
|
6
|
+
*
|
|
7
|
+
* @param trellisObject - The object with the new status to validate
|
|
8
|
+
* @param repository - Repository for checking prerequisite objects
|
|
9
|
+
* @throws Error if status transition is not allowed due to incomplete prerequisites
|
|
10
|
+
*/
|
|
11
|
+
export declare function validateStatusTransition(trellisObject: TrellisObject, repository: Repository): Promise<void>;
|
|
12
|
+
//# sourceMappingURL=validateStatusTransition.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validateStatusTransition.d.ts","sourceRoot":"","sources":["../../src/validation/validateStatusTransition.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,4BAA4B,CAAC;AAEhE,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,+BAA+B,CAAC;AAGhE;;;;;;;GAOG;AACH,wBAAsB,wBAAwB,CAC5C,aAAa,EAAE,aAAa,EAC5B,UAAU,EAAE,UAAU,GACrB,OAAO,CAAC,IAAI,CAAC,CAyBf"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.validateStatusTransition = validateStatusTransition;
|
|
4
|
+
const TrellisObjectStatus_js_1 = require("../models/TrellisObjectStatus.js");
|
|
5
|
+
const checkPrerequisitesComplete_js_1 = require("../utils/checkPrerequisitesComplete.js");
|
|
6
|
+
/**
|
|
7
|
+
* Validates that a status transition is allowed based on prerequisite completion.
|
|
8
|
+
* Only validates transitions to IN_PROGRESS and DONE statuses unless force is true.
|
|
9
|
+
*
|
|
10
|
+
* @param trellisObject - The object with the new status to validate
|
|
11
|
+
* @param repository - Repository for checking prerequisite objects
|
|
12
|
+
* @throws Error if status transition is not allowed due to incomplete prerequisites
|
|
13
|
+
*/
|
|
14
|
+
async function validateStatusTransition(trellisObject, repository) {
|
|
15
|
+
// Only validate transitions to IN_PROGRESS and DONE
|
|
16
|
+
const requiresPrerequisiteValidation = trellisObject.status === TrellisObjectStatus_js_1.TrellisObjectStatus.IN_PROGRESS ||
|
|
17
|
+
trellisObject.status === TrellisObjectStatus_js_1.TrellisObjectStatus.DONE;
|
|
18
|
+
if (!requiresPrerequisiteValidation) {
|
|
19
|
+
return;
|
|
20
|
+
}
|
|
21
|
+
const prerequisitesComplete = await (0, checkPrerequisitesComplete_js_1.checkPrerequisitesComplete)(trellisObject, repository);
|
|
22
|
+
if (!prerequisitesComplete) {
|
|
23
|
+
const statusName = trellisObject.status === TrellisObjectStatus_js_1.TrellisObjectStatus.IN_PROGRESS
|
|
24
|
+
? "in-progress"
|
|
25
|
+
: "done";
|
|
26
|
+
throw new Error(`Cannot update status to '${statusName}' - prerequisites are not complete. Use force=true to override.`);
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
//# sourceMappingURL=validateStatusTransition.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validateStatusTransition.js","sourceRoot":"","sources":["../../src/validation/validateStatusTransition.ts"],"names":[],"mappings":";;AAaA,4DA4BC;AAxCD,6EAAuE;AAEvE,0FAAoF;AAEpF;;;;;;;GAOG;AACI,KAAK,UAAU,wBAAwB,CAC5C,aAA4B,EAC5B,UAAsB;IAEtB,oDAAoD;IACpD,MAAM,8BAA8B,GAClC,aAAa,CAAC,MAAM,KAAK,4CAAmB,CAAC,WAAW;QACxD,aAAa,CAAC,MAAM,KAAK,4CAAmB,CAAC,IAAI,CAAC;IAEpD,IAAI,CAAC,8BAA8B,EAAE,CAAC;QACpC,OAAO;IACT,CAAC;IAED,MAAM,qBAAqB,GAAG,MAAM,IAAA,0DAA0B,EAC5D,aAAa,EACb,UAAU,CACX,CAAC;IAEF,IAAI,CAAC,qBAAqB,EAAE,CAAC;QAC3B,MAAM,UAAU,GACd,aAAa,CAAC,MAAM,KAAK,4CAAmB,CAAC,WAAW;YACtD,CAAC,CAAC,aAAa;YACf,CAAC,CAAC,MAAM,CAAC;QAEb,MAAM,IAAI,KAAK,CACb,4BAA4B,UAAU,iEAAiE,CACxG,CAAC;IACJ,CAAC;AACH,CAAC"}
|
package/package.json
ADDED
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@langadventurellc/task-trellis-mcp",
|
|
3
|
+
"version": "0.1.0-rc.3",
|
|
4
|
+
"description": "An MCP server that helps AI coding agents break down projects into tasks and track their progress.",
|
|
5
|
+
"homepage": "https://github.com/langadventurellc/task-trellis-mcp#readme",
|
|
6
|
+
"bugs": {
|
|
7
|
+
"url": "https://github.com/langadventurellc/task-trellis-mcp/issues"
|
|
8
|
+
},
|
|
9
|
+
"repository": {
|
|
10
|
+
"type": "git",
|
|
11
|
+
"url": "git+https://github.com/langadventurellc/task-trellis-mcp.git"
|
|
12
|
+
},
|
|
13
|
+
"license": "GPL-3.0-only",
|
|
14
|
+
"author": "LangAdventure LLC",
|
|
15
|
+
"engines": {
|
|
16
|
+
"node": ">=18.0.0"
|
|
17
|
+
},
|
|
18
|
+
"main": "dist/server.js",
|
|
19
|
+
"files": [
|
|
20
|
+
"dist/",
|
|
21
|
+
"README.md",
|
|
22
|
+
"LICENSE"
|
|
23
|
+
],
|
|
24
|
+
"bin": {
|
|
25
|
+
"task-trellis-mcp": "dist/server.js"
|
|
26
|
+
},
|
|
27
|
+
"publishConfig": {
|
|
28
|
+
"registry": "https://registry.npmjs.org/",
|
|
29
|
+
"access": "public"
|
|
30
|
+
},
|
|
31
|
+
"scripts": {
|
|
32
|
+
"build": "tsc",
|
|
33
|
+
"dev": "tsc --watch",
|
|
34
|
+
"start": "node dist/server.js",
|
|
35
|
+
"serve": "npm run build && npm run start",
|
|
36
|
+
"test": "jest",
|
|
37
|
+
"test:watch": "jest --watch",
|
|
38
|
+
"type-check": "tsc --noEmit",
|
|
39
|
+
"lint": "eslint . --ext .ts,.tsx,.js,.jsx --fix",
|
|
40
|
+
"format": "prettier --write \"**/*.{js,jsx,ts,tsx,md,json}\" --log-level silent",
|
|
41
|
+
"quality": "npm run lint && npm run format && npm run type-check",
|
|
42
|
+
"inspector": "npx @modelcontextprotocol/inspector npm run serve",
|
|
43
|
+
"prepare": "husky"
|
|
44
|
+
},
|
|
45
|
+
"dependencies": {
|
|
46
|
+
"@modelcontextprotocol/sdk": "^1.17.1",
|
|
47
|
+
"commander": "^14.0.0",
|
|
48
|
+
"yaml": "^2.8.0"
|
|
49
|
+
},
|
|
50
|
+
"devDependencies": {
|
|
51
|
+
"@langadventurellc/tsla-linter": "^2.1.2",
|
|
52
|
+
"@types/commander": "^2.12.0",
|
|
53
|
+
"@types/jest": "^30.0.0",
|
|
54
|
+
"@types/node": "^24.0.15",
|
|
55
|
+
"@typescript-eslint/eslint-plugin": "^8.38.0",
|
|
56
|
+
"eslint": "^9.31.0",
|
|
57
|
+
"eslint-config-prettier": "^10.1.8",
|
|
58
|
+
"eslint-plugin-sonarjs": "^3.0.4",
|
|
59
|
+
"husky": "^9.1.7",
|
|
60
|
+
"jest": "^30.0.5",
|
|
61
|
+
"lint-staged": "^16.1.2",
|
|
62
|
+
"prettier": "^3.6.2",
|
|
63
|
+
"ts-jest": "^29.4.1",
|
|
64
|
+
"typescript": "^5.8.3",
|
|
65
|
+
"typescript-eslint": "^8.38.0"
|
|
66
|
+
},
|
|
67
|
+
"lint-staged": {
|
|
68
|
+
"*.{ts,tsx,js,jsx}": [
|
|
69
|
+
"prettier --write"
|
|
70
|
+
],
|
|
71
|
+
"*.{md,json,yml,yaml}": [
|
|
72
|
+
"prettier --write"
|
|
73
|
+
],
|
|
74
|
+
"*.{css,scss}": [
|
|
75
|
+
"prettier --write"
|
|
76
|
+
]
|
|
77
|
+
}
|
|
78
|
+
}
|