1) To bulkify your trigger, you need to gather all used projects in one Map to have an immediate access to it inside the for-loop on child object.
2) To process isUpdate trigger, you need to reduce current project value by the amount of budject hours on task from Trigger.oldMap, so that new value will be added clearly.
Here is the code:
trigger budgetHoursCompleted on Krow__Task__c (after insert, after update, after delete) {
Set<Id> projectsIds = new Set<Id>();
List<Krow__Task__c> tasksToRun = (Trigger.isDelete ? Trigger.OLD : Trigger.NEW);
for (Krow__Task__c task_i : tasksToRun) {
projectsIds.add(task_i.Krow__Project__c);
}
Map<Id, Krow__Project__c> projectsToUpdate = new Map<Id, Krow__Project__c>([
SELECT Id, Budget_Completed__c
FROM Krow__Project__c
WHERE Id IN :projectsIds
]);
for (Krow__Task__c task_i : tasksToRun) {
Krow__Project__c tmp = projectsToUpdate.get(task_i.Krow__Project__c);
if (Trigger.isUpdate || Trigger.isDelete) {
tmp.Budget_Completed__c = tmp.Budget_Completed__c - Trigger.oldMap.get(task_i.Id).Budget_Hours_Completed__c;
}
if (Trigger.isUpdate || Trigger.isInsert) {
tmp.Budget_Completed__c = tmp.Budget_Completed__c + task_i.Budget_Hours_Completed__c;
}
}
update projectsToUpdate.values();
}