ObjectivePlugin (https://github.com/fuseraft/fuseraft-cli/blob/main/src/Infrastructure/Plugins/ObjectivePlugin.cs) has no test file — there is no ObjectivePluginTests.cs under tests/FuseraftCli.Tests/.
It's a thin agent-facing wrapper around ObjectiveManager (https://github.com/fuseraft/fuseraft-cli/blob/main/src/Infrastructure/Objectives/ObjectiveManager.cs) that exposes long-horizon objective tracking: CreateAsync, ReadAsync, UpdateAsync, ListAsync, LinkTaskAsync. Same shape as TodoPlugin (which already has TodoPluginTests.cs), so that file is a solid template to copy the setup pattern from.
Good first areas to cover:
CreateAsync rejects an empty title (PluginResult.Error)
CreateAsync with a comma-separated tasks string populates remaining tasks
ReadAsync on an unknown ID returns PluginResult.NotFound
UpdateAsync only changes the fields passed (title/description/status), leaving others intact
ListAsync with a status filter only returns matching objectives, and returns NotFound when nothing matches
LinkTaskAsync with completed: true moves a task into CompletedTasks and recomputes PercentComplete; with completed: false it's a no-op add to RemainingTasks
ObjectiveManager takes an ObjectiveStore — check how TodoPluginTests.cs constructs its manager/store for the pattern to follow (likely a temp-directory-backed store).
ObjectivePlugin(https://github.com/fuseraft/fuseraft-cli/blob/main/src/Infrastructure/Plugins/ObjectivePlugin.cs) has no test file — there is noObjectivePluginTests.csundertests/FuseraftCli.Tests/.It's a thin agent-facing wrapper around
ObjectiveManager(https://github.com/fuseraft/fuseraft-cli/blob/main/src/Infrastructure/Objectives/ObjectiveManager.cs) that exposes long-horizon objective tracking:CreateAsync,ReadAsync,UpdateAsync,ListAsync,LinkTaskAsync. Same shape asTodoPlugin(which already hasTodoPluginTests.cs), so that file is a solid template to copy the setup pattern from.Good first areas to cover:
CreateAsyncrejects an empty title (PluginResult.Error)CreateAsyncwith a comma-separatedtasksstring populates remaining tasksReadAsyncon an unknown ID returnsPluginResult.NotFoundUpdateAsynconly changes the fields passed (title/description/status), leaving others intactListAsyncwith astatusfilter only returns matching objectives, and returnsNotFoundwhen nothing matchesLinkTaskAsyncwithcompleted: truemoves a task intoCompletedTasksand recomputesPercentComplete; withcompleted: falseit's a no-op add toRemainingTasksObjectiveManagertakes anObjectiveStore— check howTodoPluginTests.csconstructs its manager/store for the pattern to follow (likely a temp-directory-backed store).