-
Notifications
You must be signed in to change notification settings - Fork 302
feat: Add feature editing and deletion capabilities #29
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
base: master
Are you sure you want to change the base?
feat: Add feature editing and deletion capabilities #29
Conversation
Addresses leonvanzyl#25 - Edit Existing Features in The UI ## Backend - Add FeatureUpdate schema for partial updates (PATCH) - Add PATCH endpoint for updating features - Add feature_create, feature_update, feature_delete MCP tools - Enable feature management tools in assistant chat ## Frontend - Add Edit mode to FeatureModal with form for category, name, description, steps - Allow Edit/Delete on completed features (not just pending) - Add useUpdateFeature mutation hook - Add friendly tool descriptions in assistant chat ## Workflow - UI: Click feature → Edit/Delete buttons for all features - Assistant: Commands like "Update feature 25 description to..." or "Delete feature 123" - For completed features, deletion removes from tracking only; suggests creating a "removal" feature if code deletion is also needed Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
📝 WalkthroughWalkthroughAdds partial-update feature support end-to-end: new Changes
Sequence Diagram(s)sequenceDiagram
actor User
participant UI as FeatureModal (UI)
participant Hook as useUpdateFeature (Client Hook)
participant API as ui API (updateFeature)
participant Server as Backend Router
participant DB as Database
User->>UI: Open modal, edit fields
UI->>UI: Validate input
User->>UI: Click Save
UI->>Hook: mutate({ featureId, update })
Hook->>API: PATCH /projects/{projectName}/features/{featureId}
API->>Server: Forward FeatureUpdate payload
Server->>Server: Validate project & feature, filter provided fields
Server->>DB: Apply updates
DB-->>Server: Persist confirmation
Server-->>API: Return updated FeatureResponse
API-->>Hook: Resolve with updated feature
Hook->>Hook: Invalidate queries (features list)
Hook-->>UI: Return updated feature
UI->>User: Render updated feature
Estimated code review effort🎯 4 (Complex) | ⏱️ ~60 minutes Possibly related PRs
Poem
🚥 Pre-merge checks | ✅ 2 | ❌ 1❌ Failed checks (1 warning)
✅ Passed checks (2 passed)
✏️ Tip: You can configure your own custom pre-merge checks in the settings. ✨ Finishing touches
📜 Recent review detailsConfiguration used: defaults Review profile: CHILL Plan: Pro 📒 Files selected for processing (7)
🚧 Files skipped from review as they are similar to previous changes (1)
🧰 Additional context used📓 Path-based instructions (4)**/*.py📄 CodeRabbit inference engine (CLAUDE.md)
Files:
ui/src/**/*.{ts,tsx}📄 CodeRabbit inference engine (CLAUDE.md)
Files:
server/routers/**/*.py📄 CodeRabbit inference engine (CLAUDE.md)
Files:
mcp_server/**/*.py📄 CodeRabbit inference engine (CLAUDE.md)
Files:
🧠 Learnings (1)📚 Learning: 2026-01-10T08:23:04.012ZApplied to files:
🧬 Code graph analysis (3)server/routers/features.py (6)
ui/src/lib/types.ts (1)
mcp_server/feature_mcp.py (4)
🔇 Additional comments (18)
Comment |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Actionable comments posted: 1
🤖 Fix all issues with AI agents
In @ui/src/hooks/useAssistantChat.ts:
- Around line 263-287: The checkAndSend polling in the start callback can spin
forever while wsRef.current.readyState stays CONNECTING; add a retry limit or
overall timeout to stop polling and handle failure: in the start function
(inside useAssistantChat) augment checkAndSend to track attempts or a deadline
(e.g., maxRetries or startTime + timeoutMs), stop retrying when exceeded, clear
any pending timers, setIsLoading(false) and surface an error (or call an onError
handler) when the socket never opens; ensure you still handle the OPEN and
CONNECTING cases and that wsRef, connect, and setConversationId logic remain
unchanged.
📜 Review details
Configuration used: defaults
Review profile: CHILL
Plan: Pro
📒 Files selected for processing (9)
mcp_server/feature_mcp.pyserver/routers/features.pyserver/schemas.pyserver/services/assistant_chat_session.pyui/src/components/FeatureModal.tsxui/src/hooks/useAssistantChat.tsui/src/hooks/useProjects.tsui/src/lib/api.tsui/src/lib/types.ts
🧰 Additional context used
🧬 Code graph analysis (6)
ui/src/hooks/useProjects.ts (3)
server/schemas.py (3)
FeatureCreate(85-87)FeatureUpdate(90-95)SettingsUpdate(296-306)ui/src/lib/types.ts (4)
FeatureCreate(77-83)FeatureUpdate(85-90)Settings(326-329)SettingsUpdate(331-334)registry.py (1)
Settings(90-96)
ui/src/hooks/useAssistantChat.ts (1)
ui/src/lib/types.ts (2)
ChatMessage(236-244)AssistantChatServerMessage(304-310)
server/schemas.py (1)
ui/src/lib/types.ts (1)
FeatureUpdate(85-90)
server/routers/features.py (2)
server/schemas.py (2)
FeatureUpdate(90-95)FeatureResponse(98-106)api/database.py (1)
Feature(19-44)
ui/src/components/FeatureModal.tsx (3)
ui/src/lib/types.ts (1)
Feature(60-69)ui/src/lib/api.ts (3)
skipFeature(130-140)deleteFeature(118-128)updateFeature(142-154)ui/src/hooks/useProjects.ts (3)
useSkipFeature(101-110)useDeleteFeature(89-99)useUpdateFeature(112-127)
mcp_server/feature_mcp.py (2)
ui/src/lib/types.ts (1)
Feature(60-69)api/database.py (2)
Feature(19-44)to_dict(33-44)
🔇 Additional comments (17)
server/schemas.py (1)
90-96: LGTM!The
FeatureUpdateschema is well-designed for partial updates with appropriate validation constraints. The optional fields withmin_lengthvalidators ensure that when provided, values are non-empty, which aligns with the corresponding TypeScript interface inui/src/lib/types.ts.ui/src/lib/types.ts (1)
85-90: LGTM!The
FeatureUpdateinterface correctly defines optional fields for partial updates, maintaining consistency with the backendFeatureUpdateschema inserver/schemas.py.server/services/assistant_chat_session.py (2)
39-49: LGTM!The separation of feature management tools from read-only tools is clean, and combining them into
ASSISTANT_FEATURE_TOOLSprovides a clear, maintainable configuration for the assistant's capabilities.
75-167: Well-structured system prompt with clear capability boundaries.The updated system prompt clearly distinguishes between codebase analysis (read-only) and feature management (CRUD) capabilities. The example interactions for updating and deleting features provide good guidance for the assistant.
ui/src/hooks/useAssistantChat.ts (1)
30-66: LGTM!The
getToolDescriptionhelper provides user-friendly descriptions for tool calls, improving the UX by displaying meaningful messages instead of raw tool identifiers.server/routers/features.py (1)
301-345: LGTM!The
update_featureendpoint correctly implements partial updates usingmodel_dump(exclude_unset=True), which distinguishes between fields that were not provided vs. explicitly set toNone. The validation and error handling patterns are consistent with other endpoints in the file.mcp_server/feature_mcp.py (3)
418-466: LGTM!The
feature_createtool is well-implemented with proper priority calculation, input validation via PydanticFieldannotations, and consistent error handling with rollback on failure.
469-531: LGTM!The
feature_updatetool correctly handles partial updates by only applying provided fields. The validation for "no fields to update" case and the consistent response format with success/message/feature are well done.
534-580: LGTM!The
feature_deletetool includes a thoughtful UX detail: when deleting a completed feature, it adds a note explaining that the code remains and suggests creating a removal feature if needed. This aligns well with the PR objectives.ui/src/components/FeatureModal.tsx (3)
37-73: LGTM!The edit mode state management is well-structured. Using
useId()to generate stable step IDs is a good approach, and theuseEffectcleanup ensures the form resets properly when exiting edit mode or when the feature prop changes.
114-136: Verify: Clearing all steps is not possible with current logic.When
filteredStepsis empty (all steps removed or empty),stepsis set toundefinedwhich means "don't update". This prevents validation errors (backend requiresmin_length=1), but users cannot intentionally remove all steps from a feature.If this is the intended behavior, consider adding a hint in the UI when the user tries to remove the last step. If clearing steps should be supported, the backend validation would need adjustment.
396-446: LGTM!The action buttons correctly differentiate between completed features (Edit/Delete) and pending features (Edit/Skip/Delete). The conditional rendering and loading states are properly handled, and the delete confirmation flow includes a helpful note about code remaining for completed features.
ui/src/hooks/useProjects.ts (3)
5-13: LGTM! Import changes support new feature update capability.The addition of
FeatureUpdateto the type imports is necessary for the newuseUpdateFeaturehook and aligns with the backend schema.
112-127: LGTM! Well-structured hook following established patterns.The
useUpdateFeaturehook correctly:
- Accepts a properly typed
FeatureUpdatepayload- Calls the corresponding API function
- Invalidates the features query cache on success
- Follows the same pattern as other feature mutation hooks
34-51: All callers have been properly updated to use the new object syntax.The
mutationFnsignature change to destructured parameters has been correctly implemented. Both calls inNewProjectModal.tsx(lines 92 and 108) pass an object with the expected properties{name, path, specMethod}, which matches the hook's new signature.ui/src/lib/api.ts (2)
27-44: LGTM! Improved error handling prevents unhandled rejections.The addition of
.catch()when parsing error responses (line 37-39) provides a defensive fallback when the server returns a non-JSON error response, improving reliability.
142-154: LGTM! Correctly implements partial feature updates.The
updateFeaturefunction:
- Uses PATCH method appropriate for partial updates
- Accepts
FeatureUpdatewith optional fields- Returns the updated
Featureobject- Follows the same URL pattern as other feature endpoints
Addresses CodeRabbit AI feedback - the checkAndSend function could poll indefinitely if the WebSocket never opened. Added: - Maximum 50 retries (5 seconds max wait) - Proper error handling for timeout case - Error handling for closed/error WebSocket states - Added onError to useCallback dependency array Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Actionable comments posted: 4
🤖 Fix all issues with AI agents
In @ui/src/hooks/useAssistantChat.ts:
- Around line 100-152: Old WebSocket handlers can act on stale connections
because wsRef.current is overwritten; capture the newly created socket in a
local constant (the existing ws variable) and in each handler (ws.onopen,
ws.onclose, ws.onerror, ping interval logic) first verify that wsRef.current ===
ws before mutating shared refs (pingIntervalRef, reconnectTimeoutRef,
reconnectAttempts) or calling setConnectionStatus/onError; also ensure you clear
any previous ping interval before starting a new one and only schedule
reconnects from the handler when the closing socket is the current one (use
maxReconnectAttempts/reconnectAttempts as before).
- Around line 215-233: The response_done handler can leave an assistant message
stuck with isStreaming: true when the last message is a tool_call/system
message; update the setMessages logic in the "response_done" case to find the
most recent message with role === "assistant" and isStreaming === true (not just
prev[prev.length-1]) and set its isStreaming to false; modify the setMessages
callback used in the response_done case to locate that latest streaming
assistant message by scanning prev from the end and replace it with {
...message, isStreaming: false } while preserving other messages.
- Around line 335-347: The disconnect() function fails to clear a scheduled
reconnect, so a pending reconnectTimeoutRef.current may still fire and call
connect() after a user-initiated disconnect; update disconnect() to clear any
pending timeout by checking reconnectTimeoutRef.current, calling
clearTimeout(reconnectTimeoutRef.current), and setting
reconnectTimeoutRef.current = null in the same cleanup block that clears
pingIntervalRef and closes wsRef, while still setting reconnectAttempts.current
= maxReconnectAttempts and setConnectionStatus("disconnected").
- Around line 30-66: getToolDescription reads properties from input: name,
feature_id, features, file_path and pattern which are typed as unknown and can
be undefined, causing strict-TS errors and "#undefined" outputs; update each
switch case to safely narrow and guard those properties before interpolation
(e.g., use typeof input.name === "string" ? input.name : "new feature"; typeof
input.feature_id === "number" || typeof input.feature_id === "string" ?
input.feature_id : "unknown"; Array.isArray(input.features) ?
input.features.length : "multiple"; typeof input.file_path === "string" ?
input.file_path : "file"; typeof input.pattern === "string" ? input.pattern :
"pattern"), or use small local type-guard helpers, and keep the existing
Array.isArray check for features to avoid unsafe property access.
🧹 Nitpick comments (1)
ui/src/hooks/useAssistantChat.ts (1)
263-302: Tightenstart()polling + conversation id check.
if (existingConversationId)skips valid IDs like0; safer isexistingConversationId != null.- Consider storing/clearing the polling timeout to avoid multiple overlapping
start()calls.
- Add type-safe helpers (getStringValue, getFeatureId) for tool description to prevent "#undefined" outputs and strict-TS errors - Fix stale WebSocket handler issue: handlers now verify wsRef.current === ws before mutating shared refs; clear previous ping interval before starting new - Fix response_done to find most recent streaming assistant message by scanning from end (not just last message), prevents stuck isStreaming when tool_call follows assistant text - Fix disconnect() to clear pending reconnect timeout, preventing reconnect after user-initiated disconnect Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Actionable comments posted: 1
🤖 Fix all issues with AI agents
In @ui/src/hooks/useAssistantChat.ts:
- Around line 297-336: The polling in start (checkAndSend) uses setTimeout
recursively but never stores the timeout ID, so timeouts keep firing if the
component unmounts; fix by adding a ref (e.g., connectTimeoutRef) to store the
ID returned by setTimeout whenever you call setTimeout in checkAndSend/start,
clear that timeout in your component's cleanup effect (and when you hit the
maxRetries or succeed) and ensure you null out the ref after clearing so no
stale timers remain; update references to wsRef, start, and checkAndSend to use
this timeout-ref-based cancellation.
📜 Review details
Configuration used: defaults
Review profile: CHILL
Plan: Pro
📒 Files selected for processing (1)
ui/src/hooks/useAssistantChat.ts
🧰 Additional context used
🧬 Code graph analysis (1)
ui/src/hooks/useAssistantChat.ts (1)
ui/src/lib/types.ts (2)
ChatMessage(236-244)AssistantChatServerMessage(304-310)
🔇 Additional comments (13)
ui/src/hooks/useAssistantChat.ts (13)
1-24: LGTM: Clean type definitions and imports.The type definitions and imports are well-structured. The
ConnectionStatusunion type provides clear connection states, and the interface definitions are comprehensive.
26-45: Excellent type-safe helpers.The helper functions effectively prevent the "#undefined" issues mentioned in the commit messages. Good use of type guards to ensure type safety.
47-83: LGTM: Well-designed tool description mapping.The switch statement provides clear, user-friendly descriptions for all tool types. Good use of the type-safe helpers to avoid undefined values in descriptions.
85-100: LGTM: Proper state and ref management.The state and ref setup is appropriate for managing WebSocket connections and chat messages. Good separation of state (for UI updates) and refs (for connection management).
102-115: LGTM: Proper cleanup on unmount.The cleanup effect correctly clears all timers and closes the WebSocket connection to prevent memory leaks.
135-153: Excellent connection lifecycle management.The connection guards (
wsRef.current === ws) on lines 137, 149 effectively prevent stale handler issues. Clearing the previous ping interval before starting a new one (lines 142-145) prevents multiple timers, addressing the issue mentioned in the commit messages.
155-174: Solid reconnection logic with exponential backoff.The close handler correctly validates the current connection before acting (line 157) and implements proper exponential backoff. The backoff calculation (lines 168-171) correctly doubles the delay with each attempt, capped at 10 seconds.
189-220: Correct streaming message handling.The logic correctly handles streaming text by appending to the existing streaming message or creating a new one. The immutable update pattern is properly implemented.
223-239: Nice user experience improvement with friendly tool descriptions.The tool_call handler now shows user-friendly descriptions via
getToolDescriptioninstead of raw tool names. This is a good UX enhancement.
246-267: Smart backward search for streaming messages.The backward search (lines 253-263) correctly handles the case where tool_call or system messages may follow the streaming assistant message. This prevents the stuck
isStreamingstate mentioned in the commit messages.
338-367: LGTM: Standard message sending pattern.The sendMessage function correctly checks connection state, updates UI state, and sends the message. Good error handling for disconnected state.
369-391: Excellent disconnect implementation.The disconnect function properly prevents reconnection by setting
reconnectAttemptsto max and clearing the pending reconnect timeout (lines 373-376). This addresses the issue mentioned in the commit messages about preventing reconnect after user-initiated disconnect.
393-408: LGTM: Clean hook interface.The clearMessages function and return statement are straightforward and complete.
Added connectTimeoutRef to track the setTimeout IDs used in the start function's checkAndSend polling. The timeout is now: - Cleared on component unmount via cleanup effect - Cleared when connection succeeds or fails - Cleared when maxRetries is reached - Cleared on disconnect() - Cleared before starting a new connection attempt Prevents stale timeouts from firing after component unmounts. Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Actionable comments posted: 0
🧹 Nitpick comments (1)
ui/src/hooks/useAssistantChat.ts (1)
317-348: Consider using a Promise-based approach for WebSocket readiness.The polling mechanism (
checkAndSendwith 100ms intervals up to 5 seconds) works but is somewhat inelegant. Consider wrapping WebSocket connection in a Promise that resolves ononopenor rejects on timeout/error, which would eliminate polling and make the async flow more explicit.♻️ Example Promise-based approach
const waitForConnection = (ws: WebSocket, timeoutMs: number = 5000): Promise<void> => { return new Promise((resolve, reject) => { const timeout = setTimeout(() => { reject(new Error('Connection timeout')); }, timeoutMs); if (ws.readyState === WebSocket.OPEN) { clearTimeout(timeout); resolve(); return; } const handleOpen = () => { clearTimeout(timeout); ws.removeEventListener('open', handleOpen); ws.removeEventListener('error', handleError); resolve(); }; const handleError = () => { clearTimeout(timeout); ws.removeEventListener('open', handleOpen); ws.removeEventListener('error', handleError); reject(new Error('Connection failed')); }; ws.addEventListener('open', handleOpen, { once: true }); ws.addEventListener('error', handleError, { once: true }); }); };Then in
start():try { await waitForConnection(wsRef.current); // Send start message } catch (error) { onError?.(error.message); }
📜 Review details
Configuration used: defaults
Review profile: CHILL
Plan: Pro
📒 Files selected for processing (1)
ui/src/hooks/useAssistantChat.ts
🧰 Additional context used
🧬 Code graph analysis (1)
ui/src/hooks/useAssistantChat.ts (1)
ui/src/lib/types.ts (2)
ChatMessage(236-244)AssistantChatServerMessage(304-310)
🔇 Additional comments (2)
ui/src/hooks/useAssistantChat.ts (2)
30-83: LGTM! Type-safe helpers and user-friendly tool descriptions.The helper functions (
getStringValue,getFeatureId) provide safe type guards for extracting values from unknown inputs, andgetToolDescriptionmaps tool calls to clear, user-friendly messages. The tool name normalization (removing themcp__features__prefix) ensures consistent handling regardless of how tools are invoked.
104-120: LGTM! Comprehensive timeout cleanup prevents resource leaks.The timeout management is thorough:
connectTimeoutRefis cleared on unmount, at the start ofstart(), in all branches of the polling logic (success/timeout/error), and indisconnect()reconnectTimeoutRefandpingIntervalRefare similarly cleaned up across all relevant lifecycle hooksThis addresses the polling timeout leak mentioned in the commit message.
Also applies to: 302-351, 384-412
- Add Project Assistant to Web UI feature list - Document feature_create, feature_update, feature_delete MCP tools - Add Project Assistant section with capabilities and persistence info - Add assistant.db to generated project structure Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Actionable comments posted: 1
🤖 Fix all issues with AI agents
In @README.md:
- Line 59: Update the README to reflect that project paths are registry-driven
by registry.py and that assistant.db is created at the registered project path
(i.e., <registered_project_path>/assistant.db) rather than a fixed
generations/my_project/ location; remove or correct the claim about a "New Chat"
button in the Project Assistant section (lines referencing the AssistantChat
component) since AssistantChat opens one conversation per panel session and has
no UI control to start/reset a conversation; keep the notes that feature_create,
feature_update, and feature_delete are implemented and that conversation
persistence works as designed.
📜 Review details
Configuration used: defaults
Review profile: CHILL
Plan: Pro
📒 Files selected for processing (1)
README.md
🧰 Additional context used
🧠 Learnings (1)
📓 Common learnings
Learnt from: CR
Repo: leonvanzyl/autocoder PR: 0
File: CLAUDE.md:0-0
Timestamp: 2026-01-10T08:23:04.012Z
Learning: Applies to mcp_server/**/*.py : Use MCP (Model Context Protocol) servers for agent tools: feature_mcp.py for feature management, with tools: feature_get_stats, feature_get_next, feature_get_for_regression, feature_mark_passing, feature_skip, feature_create_bulk
…ence - Update Project Assistant section to note assistant.db is in registered path - Remove "New Chat" button reference (not present in AssistantChat) - Add registry.py to project structure - Rename "Generated Project Structure" to "Project Registry and Structure" - Explain registry-driven project paths (~/.autocoder/registry.db) - Update path examples to use <registered_project_path> instead of fixed path Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Actionable comments posted: 0
Caution
Some comments are outside the diff and can’t be posted inline due to platform limitations.
⚠️ Outside diff range comments (1)
README.md (1)
201-212: Specify language for code block to comply with markdown linting.The code block starting at line 201 should have a language identifier (e.g., ```) for consistency with markdown standards. This helps with syntax highlighting and linting compliance.
♻️ Proposed fix
-``` -<registered_project_path>/ +``` +<registered_project_path>/
🧹 Nitpick comments (1)
README.md (1)
193-212: Clarify registry reference in path examples.While the new "Project Registry and Structure" section clearly explains the registry concept, consider explicitly mentioning in the "Running the Generated Application" section (around line 221) that
<registered_project_path>refers to the project's registered path from the registry. This helps users understand the relationship between the registry and the project directory structure you've documented.
📜 Review details
Configuration used: defaults
Review profile: CHILL
Plan: Pro
📒 Files selected for processing (1)
README.md
🧰 Additional context used
🧠 Learnings (5)
📓 Common learnings
Learnt from: CR
Repo: leonvanzyl/autocoder PR: 0
File: CLAUDE.md:0-0
Timestamp: 2026-01-10T08:23:04.012Z
Learning: Applies to mcp_server/**/*.py : Use MCP (Model Context Protocol) servers for agent tools: feature_mcp.py for feature management, with tools: feature_get_stats, feature_get_next, feature_get_for_regression, feature_mark_passing, feature_skip, feature_create_bulk
📚 Learning: 2026-01-10T08:23:04.012Z
Learnt from: CR
Repo: leonvanzyl/autocoder PR: 0
File: CLAUDE.md:0-0
Timestamp: 2026-01-10T08:23:04.012Z
Learning: Two-agent pattern: Initializer Agent reads app spec and creates features in first session; Coding Agent implements features one by one in subsequent sessions
Applied to files:
README.md
📚 Learning: 2026-01-10T08:23:04.012Z
Learnt from: CR
Repo: leonvanzyl/autocoder PR: 0
File: CLAUDE.md:0-0
Timestamp: 2026-01-10T08:23:04.012Z
Learning: Applies to registry.py : Store project registry using SQLite with POSIX path format (forward slashes) for cross-platform compatibility
Applied to files:
README.md
📚 Learning: 2026-01-10T08:23:04.012Z
Learnt from: CR
Repo: leonvanzyl/autocoder PR: 0
File: CLAUDE.md:0-0
Timestamp: 2026-01-10T08:23:04.012Z
Learning: Applies to mcp_server/**/*.py : Use MCP (Model Context Protocol) servers for agent tools: feature_mcp.py for feature management, with tools: feature_get_stats, feature_get_next, feature_get_for_regression, feature_mark_passing, feature_skip, feature_create_bulk
Applied to files:
README.md
📚 Learning: 2026-01-10T08:23:04.012Z
Learnt from: CR
Repo: leonvanzyl/autocoder PR: 0
File: CLAUDE.md:0-0
Timestamp: 2026-01-10T08:23:04.012Z
Learning: Applies to autonomous_agent_demo.py : Use absolute paths or registered project names when running the agent via: python autonomous_agent_demo.py --project-dir <path_or_name>
Applied to files:
README.md
🪛 markdownlint-cli2 (0.18.1)
README.md
201-201: Fenced code blocks should have a language specified
(MD040, fenced-code-language)
🔇 Additional comments (1)
README.md (1)
107-123: Documentation updates integrate feature management capabilities well.The additions clearly document the new MCP tools (
feature_create,feature_update,feature_delete) and the Project Assistant functionality with conversation persistence. The explanation of how features can be managed via natural language in the assistant aligns well with the PR objectives. The note aboutassistant.dbstorage in the registered project directory provides useful operational context.
- Add 'text' language identifier to project structure code block - Clarify that path refers to registered project path in Running section Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Resolved conflicts: - mcp_server/feature_mcp.py: Combined feature_update/delete from HEAD with threading lock from master - server/routers/features.py: Combined update_feature endpoint from HEAD with create_features_bulk from master - server/services/assistant_chat_session.py: Combined feature management docs from HEAD with master changes - ui/src/hooks/useAssistantChat.ts: Kept HEAD's robust connection handling (guard checks, retry limits, getToolDescription helper) - ui/src/lib/api.ts: Combined FeatureUpdate import from HEAD with bulk create types from master Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Summary
Addresses #25 - Edit Existing Features in The UI
This PR adds the ability to edit and delete features through both the UI and assistant chat:
Changes
Backend
FeatureUpdateschema for partial updatesPATCH /features/{id}endpointfeature_create,feature_update,feature_deleteMCP toolsFrontend
FeatureModalwith form for category, name, description, stepsuseUpdateFeaturemutation hookTest plan
🤖 Generated with Claude Code
Summary by CodeRabbit
New Features
Bug Fixes
Documentation
✏️ Tip: You can customize this high-level summary in your review settings.