Skip to content

feat: add three viewing modes for app specification#566

Merged
stefandevo merged 5 commits intoAutoMaker-Org:v0.13.0rcfrom
stefandevo:feature/specification-visualiser
Jan 18, 2026
Merged

feat: add three viewing modes for app specification#566
stefandevo merged 5 commits intoAutoMaker-Org:v0.13.0rcfrom
stefandevo:feature/specification-visualiser

Conversation

@stefandevo
Copy link
Copy Markdown
Collaborator

@stefandevo stefandevo commented Jan 18, 2026

Summary

Enhances the /spec page with three distinct viewing modes for a better user experience:

  • View Mode (default): A clean, read-only display using cards, badges, and collapsible accordions - much nicer than raw XML
  • Edit Mode: A structured form-based editor with proper inputs for all spec fields - easier editing without dealing with XML syntax
  • Source Mode: Raw XML editor preserved for advanced users who need direct access

New Shared Package

Adds @automaker/spec-parser library for XML parsing that can be shared between server and client:

  • xmlToSpec() - Parse XML to SpecOutput object
  • specToXml() - Convert SpecOutput back to XML
  • Validation utilities

Test plan

  • Open spec page - should default to View mode with rendered cards/badges
  • Switch to Edit mode - form should populate with current spec values
  • Edit fields in Edit mode and save - XML should update correctly
  • Switch to Source mode - should show raw XML
  • Toggle between light/dark themes - editor should display correctly
  • Introduce invalid XML in Source mode - should show error and disable View/Edit tabs

Summary by CodeRabbit

  • New Features

    • Added View mode to display specifications in a read-only format.
    • Added Edit mode with structured forms to manage project info, tech stack, capabilities, features, requirements, guidelines, and roadmap sections.
    • Added Source mode for raw XML editing.
    • Introduced mode tabs for switching between View, Edit, and Source modes.
    • Added validation indicators and parse error messages to guide users.
  • Improvements

    • Simplified XML editor styling and layout.
    • Save button now hides in View mode.

✏️ Tip: You can customize this high-level summary in your review settings.

Introduces View, Edit, and Source modes for the spec page:

- View: Clean read-only display with cards, badges, and accordions
- Edit: Structured form-based editor for all spec fields
- Source: Raw XML editor for advanced users

Also adds @automaker/spec-parser shared package for XML parsing
between server and client.
- Replace array index keys with stable UUIDs in array-field-editor,
  features-section, and roadmap-section components
- Replace regex-based XML parsing with fast-xml-parser for robustness
- Simplify renderContent logic in spec-view by removing dead code paths
@coderabbitai
Copy link
Copy Markdown
Contributor

coderabbitai Bot commented Jan 18, 2026

Warning

Rate limit exceeded

@stefandevo has exceeded the limit for the number of commits that can be reviewed per hour. Please wait 4 minutes and 32 seconds before requesting another review.

⌛ How to resolve this issue?

After the wait time has elapsed, a review can be triggered using the @coderabbitai review command as a PR comment. Alternatively, push new commits to this PR.

We recommend that you space out your commits to avoid hitting the rate limit.

🚦 How do rate limits work?

CodeRabbit enforces hourly rate limits for each developer per organization.

Our paid plans have higher rate limits than the trial, open-source and free plans. In all cases, we re-allow further reviews after a brief timeout.

Please see our FAQ for further information.

📥 Commits

Reviewing files that changed from the base of the PR and between e9bffb9 and 3714cad.

📒 Files selected for processing (3)
  • apps/ui/src/components/views/spec-view.tsx
  • apps/ui/src/components/views/spec-view/components/edit-mode/roadmap-section.tsx
  • libs/spec-parser/src/xml-utils.ts

Note

Other AI code review bot(s) detected

CodeRabbit has detected other AI code review bot(s) in this pull request and will avoid duplicating their findings in the review comments. This may lead to a less comprehensive review.

📝 Walkthrough

Walkthrough

This PR introduces a new XML spec parser library (@automaker/spec-parser) with utilities for converting between structured SpecOutput objects and XML representations, coupled with comprehensive React UI components enabling view/edit/source modes for specification management with real-time XML parsing and validation.

Changes

Cohort / File(s) Summary
Spec Parser Library
libs/spec-parser/package.json, libs/spec-parser/src/index.ts, libs/spec-parser/src/xml-utils.ts, libs/spec-parser/src/xml-to-spec.ts, libs/spec-parser/src/spec-to-xml.ts, libs/spec-parser/src/validate.ts, libs/spec-parser/tsconfig.json
Introduces new @automaker/spec-parser package with XML parsing/conversion utilities, including escapeXml/unescapeXml helpers, xmlToSpec parser with error accumulation, specToXml converter, and validation functions. Package configured with TypeScript build and test workflows.
UI - Parser Hook
apps/ui/src/components/views/spec-view/hooks/use-spec-parser.ts, apps/ui/src/components/views/spec-view/hooks/index.ts
Adds useSpecParser hook that wraps spec-parser library, validating XML structure and converting to SpecOutput with memoized results and error propagation.
UI - Edit Mode Components
apps/ui/src/components/views/spec-view/components/edit-mode/array-field-editor.tsx, .../{project-info,tech-stack,capabilities,features,roadmap}-section.tsx, apps/ui/src/components/views/spec-view/components/edit-mode/{optional-sections,index}.ts
Implements modular edit UI sections with dynamic list management (ArrayFieldEditor), form state handling, internal ID generation for stable rendering, and onChange callbacks converting to XML via specToXml.
UI - View & Mode Components
apps/ui/src/components/views/spec-view/components/spec-view-mode.tsx, spec-mode-tabs.tsx, spec-edit-mode.tsx
Introduces SpecViewMode (read-only spec display with sections and badges), SpecModeTabs (three-tab mode switcher with parse validation gating), and SpecEditMode (form-driven editing with field composition).
UI - Core Integration & Types
apps/ui/src/components/views/spec-view.tsx, apps/ui/src/components/views/spec-view/components/{spec-editor,spec-header,index}.ts, apps/ui/src/components/views/spec-view/types.ts
Extends main SpecView with mode state management, useSpecParser integration, conditional rendering via renderContent, parse error display, mode tabs UI, and SpecHeader.showSaveButton prop. Simplifies xml-syntax-editor styling. Adds SpecViewMode type union.
Package Management
apps/ui/package.json, package.json
Adds @automaker/spec-parser@1.0.0 dependency to UI; updates root build:packages script to include spec-parser build.

Sequence Diagram(s)

sequenceDiagram
    participant User
    participant SpecView
    participant Parser as useSpecParser
    participant Renderer as renderContent
    participant ViewMode as SpecViewMode
    participant EditMode as SpecEditMode
    participant Tabs as SpecModeTabs

    User->>SpecView: Load spec (XML content)
    SpecView->>Parser: Parse XML via useSpecParser
    Parser-->>SpecView: isParseValid, parsedSpec, errors
    
    alt Parse Invalid
        SpecView->>Tabs: Show error state
        Tabs-->>User: Display error banner + disabled View/Edit tabs
        User->>Tabs: Click source tab
        Tabs->>SpecView: onModeChange('source')
        SpecView->>Renderer: renderContent with source mode
        Renderer->>User: Show XML editor
    else Parse Valid
        SpecView->>Tabs: Enable all tabs
        Tabs-->>User: Show View/Edit/Source tabs
        User->>Tabs: Click Edit tab
        Tabs->>SpecView: onModeChange('edit')
        SpecView->>Renderer: renderContent with edit mode
        Renderer->>EditMode: Pass parsed spec
        EditMode->>User: Render form sections
        User->>EditMode: Edit field (e.g., project name)
        EditMode->>EditMode: Update formData, convert to XML via specToXml
        EditMode->>SpecView: onChange(newXML)
        SpecView->>Parser: Re-parse updated XML
        Parser-->>SpecView: Return validation result
    end
Loading

Estimated code review effort

🎯 4 (Complex) | ⏱️ ~60 minutes

Suggested labels

Enhancement, Testers-Requested, Do Not Merge

Poem

🐰 A parsing leap, from XML's maze,
To structured specs in editing phase,
View, edit, source—three modes to explore,
With validation watching at the door!
SpecParser hops, and components align,
A feature-rich feast, so divine!

🚥 Pre-merge checks | ✅ 2 | ❌ 1
❌ Failed checks (1 warning)
Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 35.00% which is insufficient. The required threshold is 80.00%. Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (2 passed)
Check name Status Explanation
Title check ✅ Passed The PR title clearly and directly summarizes the main change: adding three viewing modes (View, Edit, Source) for the app specification, which is the core feature of this changeset across all modified files.
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.


Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands and usage tips.

@gemini-code-assist
Copy link
Copy Markdown
Contributor

Summary of Changes

Hello @stefandevo, I'm Gemini Code Assist1! I'm currently reviewing this pull request and will post my feedback shortly. In the meantime, here's a summary to help you and other reviewers quickly get up to speed!

This pull request significantly enhances the user experience of the application specification page by introducing multiple viewing and editing modes. It abstracts the complexity of raw XML, offering user-friendly interfaces for both consumption and modification of project specifications. The changes are underpinned by a new, robust XML parsing and generation library, ensuring data consistency and validation across different representations of the specification.

Highlights

  • Three Viewing Modes for App Specification: The /spec page now offers three distinct modes: 'View' for a clean, read-only display with cards and accordions; 'Edit' for a structured form-based editor; and 'Source' for direct raw XML editing.
  • New Shared XML Spec Parser Library: A new shared library, @automaker/spec-parser, has been introduced. It provides functionalities to parse XML into a structured SpecOutput object, convert SpecOutput back to XML, and validate spec data, enabling consistent parsing logic across the application.
  • Dynamic Mode Switching and Validation: The UI dynamically switches between viewing modes. If the underlying XML is invalid, the 'View' and 'Edit' modes are disabled, and the user is prompted to fix errors in 'Source' mode, ensuring data integrity.
  • Enhanced Spec Editing Experience: The new 'Edit' mode provides dedicated form sections for project information, technology stack, core capabilities, implemented features, roadmap, requirements, and guidelines, making it easier to manage spec details without direct XML manipulation.

🧠 New Feature in Public Preview: You can now enable Memory to help Gemini Code Assist learn from your team's feedback. This makes future code reviews more consistent and personalized to your project's style. Click here to enable Memory in your admin console.

Using Gemini Code Assist

The full guide for Gemini Code Assist can be found on our documentation page, here are some quick tips.

Invoking Gemini

You can request assistance from Gemini at any point by creating a comment using either /gemini <command> or @gemini-code-assist <command>. Below is a summary of the supported commands on the current page.

Feature Command Description
Code Review /gemini review Performs a code review for the current pull request in its current state.
Pull Request Summary /gemini summary Provides a summary of the current pull request in its current state.
Comment @gemini-code-assist Responds in comments when explicitly tagged, both in pull request comments and review comments.
Help /gemini help Displays a list of available commands.

Customization

To customize Gemini Code Assist for GitHub experience, repository maintainers can create a configuration file and/or provide a custom code review style guide (such as PEP-8 for Python) by creating and adding files to a .gemini/ folder in the base of the repository. Detailed instructions can be found here.

Limitations & Feedback

Gemini Code Assist may make mistakes. Please leave feedback on any instances where its feedback is incorrect or counter productive. You can react with 👍 and 👎 on @gemini-code-assist comments. If you're interested in giving your feedback about your experience with Gemini Code Assist for Github and other Google products, sign up here.

You can also get AI-powered code generation, chat, as well as code reviews directly in the IDE at no cost with the Gemini Code Assist IDE Extension.

Footnotes

  1. Review the Privacy Notices, Generative AI Prohibited Use Policy, Terms of Service, and learn how to configure Gemini Code Assist in GitHub here. Gemini can make mistakes, so double check it and use code with caution.

Copy link
Copy Markdown
Contributor

@gemini-code-assist gemini-code-assist Bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Code Review

This pull request introduces a significant enhancement to the app specification page by adding three viewing modes: a read-only 'View' mode, a form-based 'Edit' mode, and the raw 'Source' XML editor. This greatly improves the user experience for both viewing and editing the specification. The introduction of the new @automaker/spec-parser shared package is a great architectural improvement that centralizes XML parsing and generation logic. The new components for the edit mode are well-structured and make editing the spec much more intuitive.

My review includes a few suggestions to improve the user experience and code robustness, such as adjusting the visibility of the save button based on the current mode and making the data handling in the view rendering more defensive. Overall, this is a solid feature implementation.

Comment thread apps/ui/src/components/views/spec-view.tsx
Comment thread apps/ui/src/components/views/spec-view.tsx Outdated
Copy link
Copy Markdown
Contributor

@coderabbitai coderabbitai Bot left a 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 `@apps/ui/src/components/views/spec-view.tsx`:
- Line 2: Remove the unused RefreshCw import from the top-level import statement
in spec-view.tsx: locate the import "import { RefreshCw } from 'lucide-react';"
(or a combined import that includes RefreshCw) and delete the RefreshCw
identifier (or the entire import line if it contains only RefreshCw) so there
are no unused icon imports remaining.

In
`@apps/ui/src/components/views/spec-view/components/edit-mode/roadmap-section.tsx`:
- Around line 1-16: The file imports the Lucide icon named Map which shadows the
global Map and triggers noShadowRestrictedNames; update the import to alias the
icon (e.g., import { Map as MapIcon } from 'lucide-react') and then replace all
occurrences of the Map identifier in this module with the aliased name
(MapIcon); also update any other import sites in this file that import Map (the
other Map import occurrences) to use the alias to avoid the shadowing.

In `@apps/ui/src/components/views/spec-view/components/spec-view-mode.tsx`:
- Line 20: The import "Map" in spec-view-mode.tsx shadows the global Map
constructor; change the import to an alias (e.g., import { Map as MapIcon }) and
update all JSX usages (for example the component rendered around line with the
Map usage) to use <MapIcon ... /> instead of <Map ... />; ensure any props
passed to the original Map component remain unchanged and update any other
references in this file to the new alias.

In `@libs/spec-parser/src/xml-utils.ts`:
- Around line 41-44: The regex built in extractXmlSection interpolates raw
tagName into new RegExp which allows regex metacharacters to break or alter the
pattern; fix by escaping tagName before constructing the RegExp (e.g. add a
small utility like escapeRegex or use tagName.replace(/[-\/\\^$*+?.()|[\]{}]/g,
'\\$&') and then use the escaped value in new RegExp), and apply the same escape
to the other similar function in the block around lines 54-61 so both places use
the escaped tagName when building their RegExp.
🧹 Nitpick comments (10)
apps/ui/src/components/layout/project-switcher/components/project-switcher-item.tsx (1)

40-47: Harden test-id slugging to avoid selector escapes and collisions.

Whitespace-only replacement leaves special characters intact and can produce duplicate IDs for same-named projects. Consider a stricter slug and a fallback to project.id when empty/duplicated.

♻️ Suggested slugging refinement
-  // Create a sanitized project name for test ID (lowercase, hyphens instead of spaces)
-  const sanitizedName = project.name.toLowerCase().replace(/\s+/g, '-');
+  // Create a sanitized project name for test ID (lowercase, URL-safe slug)
+  const sanitizedName =
+    project.name
+      .toLowerCase()
+      .trim()
+      .replace(/[^a-z0-9]+/g, '-')
+      .replace(/^-+|-+$/g, '') || `project-${project.id}`;
apps/ui/src/components/views/spec-view/types.ts (1)

1-2: Consider renaming to avoid collision with the SpecViewMode component.

The type SpecViewMode shares a name with the SpecViewMode component exported from ./spec-view-mode.tsx. While TypeScript distinguishes between type and value imports, this can cause confusion when importing both:

import { SpecViewMode } from './spec-view-mode'; // component
import type { SpecViewMode } from '../types';    // type - collision

Consider renaming the type to SpecViewModeType or ViewMode to improve clarity.

apps/ui/src/components/views/spec-view/components/spec-mode-tabs.tsx (2)

29-44: Consider adding accessible labels for icon-only tabs on mobile.

On small screens (sm:hidden text), tabs display only icons. Screen reader users may not understand what each tab represents. Consider adding aria-label attributes to the triggers.

♿ Suggested improvement for accessibility
         <TabsTrigger
           value="view"
           disabled={disabled || !isParseValid}
           title={!isParseValid ? 'Fix XML errors to enable View mode' : 'View formatted spec'}
+          aria-label="View"
         >
           <Eye className="w-4 h-4" />
           <span className="hidden sm:inline">View</span>
         </TabsTrigger>
         <TabsTrigger
           value="edit"
           disabled={disabled || !isParseValid}
           title={!isParseValid ? 'Fix XML errors to enable Edit mode' : 'Edit spec with form'}
+          aria-label="Edit"
         >
           <Edit3 className="w-4 h-4" />
           <span className="hidden sm:inline">Edit</span>
         </TabsTrigger>
-        <TabsTrigger value="source" disabled={disabled} title="Edit raw XML source">
+        <TabsTrigger value="source" disabled={disabled} title="Edit raw XML source" aria-label="Source">
           <Code className="w-4 h-4" />
           <span className="hidden sm:inline">Source</span>
         </TabsTrigger>

18-20: Type assertion is acceptable but could be more defensive.

The cast value as SpecViewMode is safe given the hardcoded tab values, but for robustness you could validate before casting. This is optional given the controlled context.

apps/ui/src/components/views/spec-view/components/edit-mode/features-section.tsx (2)

156-178: Fallback key pattern may cause reconciliation issues.

The fallback fallback-${idx} at line 158 could cause React reconciliation issues if _locationIds becomes out of sync with file_locations. Since featureToInternal always generates _locationIds, this fallback should rarely trigger, but consider logging a warning in development if it does to catch bugs early.


97-98: Consider future drag-and-drop implementation.

The GripVertical icon suggests drag-and-drop reordering capability. If this is planned for later, consider adding a comment or tracking it as a TODO.

apps/ui/src/components/views/spec-view/components/spec-edit-mode.tsx (1)

24-46: JSON.stringify comparison has key ordering limitations.

Using JSON.stringify for deep comparison (lines 25, 32, 42) works for most cases but is sensitive to key ordering. If the spec object's keys could be reordered between renders (e.g., from different serialization sources), this could cause unnecessary resets. In practice this is usually fine for structured data like SpecOutput, but worth noting.

libs/spec-parser/src/validate.ts (1)

130-143: Consider adding closing tag check for consistency.

The root element check only verifies the opening tag while other element checks use regex that implicitly require both tags. For a more robust quick check, consider also verifying the closing tag exists:

💡 Optional improvement
   // Check for essential elements
-  const hasRoot = xmlContent.includes('<project_specification>');
+  const hasRoot =
+    xmlContent.includes('<project_specification>') &&
+    xmlContent.includes('</project_specification>');
apps/ui/src/components/views/spec-view/hooks/use-spec-parser.ts (1)

41-49: Consider whether pre-check masks detailed errors.

The isValidSpecXml pre-check returns a generic "Invalid XML structure - missing required elements" error. When this fails, the more detailed errors from xmlToSpec are bypassed. If users would benefit from specific field-level error messages, consider letting xmlToSpec handle all validation, or include which elements are missing in the quick-check error.

This is a trade-off between performance (fast-fail) and error specificity. The current approach is reasonable for obviously malformed input.

apps/ui/src/components/views/spec-view/components/edit-mode/array-field-editor.tsx (1)

40-48: External sync regenerates all IDs, causing full remount.

When values changes externally, all items receive new UUIDs (Line 47), causing React to remount every item. This works correctly but may cause minor UX issues if the parent inadvertently changes the values array reference with identical content.

Consider a shallow comparison to avoid unnecessary ID regeneration:

💡 Optional: Avoid remount when content hasn't changed
   useEffect(() => {
     if (isInternalChange.current) {
       isInternalChange.current = false;
       return;
     }
 
-    // External change - rebuild items with new IDs
-    setItems(values.map((value) => ({ id: generateId(), value })));
+    // External change - only rebuild if content actually changed
+    const currentValues = items.map((item) => item.value);
+    const valuesMatch =
+      values.length === currentValues.length &&
+      values.every((v, i) => v === currentValues[i]);
+    if (!valuesMatch) {
+      setItems(values.map((value) => ({ id: generateId(), value })));
+    }
   }, [values]);

Comment thread apps/ui/src/components/views/spec-view.tsx Outdated
Comment thread apps/ui/src/components/views/spec-view/components/edit-mode/roadmap-section.tsx Outdated
Comment thread apps/ui/src/components/views/spec-view/components/spec-view-mode.tsx Outdated
Comment thread libs/spec-parser/src/xml-utils.ts
- Remove unused RefreshCw import from spec-view.tsx
- Add explicit parsedSpec check in renderContent for robustness
- Hide save button in view mode since it's read-only
- Remove GripVertical drag handles since drag-and-drop is not implemented
- Rename Map imports to MapIcon to avoid shadowing global Map
- Escape tagName in xml-utils.ts RegExp functions for safety
- Add aria-label attributes for accessibility on mode tabs
@stefandevo stefandevo force-pushed the feature/specification-visualiser branch from 00e9868 to e9bffb9 Compare January 18, 2026 14:07
Copy link
Copy Markdown
Contributor

@coderabbitai coderabbitai Bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 3

🤖 Fix all issues with AI agents
In
`@apps/ui/src/components/views/spec-view/components/edit-mode/roadmap-section.tsx`:
- Around line 92-97: The Textarea is receiving phase.description which is
optional on RoadmapPhase, causing controlled/uncontrolled warnings; update the
value prop in the edit-mode component (where Textarea is used) to pass a safe
default like an empty string (e.g., use phase.description ?? "" or
String(phase.description || "")) so the Textarea remains controlled, and ensure
handleDescriptionChange still updates the phase model (referencing Textarea,
phase.description, and handleDescriptionChange).
- Around line 122-129: The current useEffect syncing external phases recreates
internal items by calling phaseToInternal for every phase, causing new _id
values and unmounting PhaseCard components; instead, update the effect to
preserve existing item IDs by reconciling phases with current items: iterate
phases and for each phase try to find a matching existing item in items (by
original phase id, by content equality, or at least by index) and reuse its _id
when building the new internal item before calling setItems; keep
isInternalChange logic intact and only regenerate ids for truly new phases that
have no match.

In `@libs/spec-parser/src/xml-utils.ts`:
- Around line 37-69: The extractXmlSection and extractXmlElements functions
currently use regexes that only match bare tags (they build regex from
escapeRegExp(tagName) as `<${safeTag}>…</${safeTag}>`) and therefore do not
support tags with attributes; update the JSDoc for both extractXmlSection and
extractXmlElements to explicitly state this limitation (that tags with
attributes like `<tag id="1">` are not supported), referencing the regex usage
so future maintainers know why, or, if attribute tolerance is required later,
adjust the regexes used in those functions to allow optional attributes after
the opening tag name.
🧹 Nitpick comments (3)
apps/ui/src/components/views/spec-view/components/edit-mode/features-section.tsx (1)

156-157: Fallback key using index may cause instability.

The fallback-${idx} key is used when _locationIds is undefined or shorter than file_locations. Since featureToInternal always generates _locationIds from the locations array, this fallback should rarely trigger. However, if synchronization ever fails (e.g., edge case in external data), the index-based fallback can cause React reconciliation issues when locations are added/removed.

Consider making this more defensive by ensuring _locationIds is always in sync, or logging a warning when the fallback is used to catch potential bugs early.

apps/ui/src/components/views/spec-view.tsx (1)

198-216: The disabled={isProcessing} prop on line 207 is effectively unused.

The parent conditional on line 201 (!isProcessing &&) ensures the SpecModeTabs component only renders when isProcessing is false, so disabled={isProcessing} will always evaluate to false.

Consider removing the redundant prop or, if the intent is to show disabled tabs during processing, render the tabs unconditionally and rely solely on the disabled prop.

Option 1: Remove the redundant prop
             <SpecModeTabs
               mode={mode}
               onModeChange={handleModeChange}
               isParseValid={isParseValid}
-              disabled={isProcessing}
             />
Option 2: Show disabled tabs during processing (if intended)
-        {!isProcessing && (
           <div className="flex items-center justify-center px-4 py-2 border-b border-border bg-muted/30 relative">
             <SpecModeTabs
               mode={mode}
               onModeChange={handleModeChange}
               isParseValid={isParseValid}
               disabled={isProcessing}
             />
             ...
           </div>
-        )}
apps/ui/src/components/views/spec-view/components/edit-mode/roadmap-section.tsx (1)

1-16: Imports look good; Map shadowing issue resolved.

The Map icon is correctly aliased to MapIcon (line 15) addressing the previous review concern. The @automaker/spec-parser import follows the coding guidelines.

Minor nit: the two lucide-react imports (lines 1 and 15) could be consolidated into one.

Comment thread libs/spec-parser/src/xml-utils.ts
- Fix Textarea controlled/uncontrolled warning with default value
- Preserve IDs in useEffect sync to avoid unnecessary remounts
- Consolidate lucide-react imports
- Add JSDoc note about tag attributes limitation in xml-utils.ts
- Remove redundant disabled prop from SpecModeTabs
@stefandevo stefandevo merged commit c465219 into AutoMaker-Org:v0.13.0rc Jan 18, 2026
6 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant