ASSEMBLY-STEP1 — UI Components Inventory Report
ASSEMBLY-STEP1: UI Components Inventory Report
Date: 2026-03-05 Mission: Investigate inventory of all UI components available and in-use
PART A — INSTALLED LIBRARIES
A1. Package Dependencies
UI Libraries:
| Package | Version | Purpose |
|---|---|---|
| @nuxt/ui | ^2.18.2 (resolved: 2.22.3) | Primary UI component library |
| @headlessui/vue | ^1.7.23 | Unstyled accessible components |
| @tailwindcss/forms | ^0.5.10 | Form element resets |
| @tailwindcss/typography | ^0.5.16 | Prose styling |
| @nuxt/icon | ^1.11.0 | Icon system |
| @nuxt/image | ^1.10.0 | Image optimization |
| @nuxtjs/color-mode | ^3.5.2 | Dark/light mode |
Directus:
| Package | Version | Purpose |
|---|---|---|
| @directus/sdk | ^19.1.0 | Directus REST/GraphQL client |
Utilities:
| Package | Version | Purpose |
|---|---|---|
| @vueuse/core | ^13.0.0 | Vue composition utilities |
| @vueuse/nuxt | ^13.0.0 | VueUse Nuxt integration |
| @vueuse/motion | ^3.0.3 | Animation/motion |
| @formkit/auto-animate | ^0.8.2 | Auto-animate transitions |
| diff | ^8.0.2 | Text diff library |
| uuid | ^11.1.0 | UUID generation |
| micromark | ^4.0.2 | Markdown parser |
| vue-dompurify-html | ^5.2.0 | HTML sanitization |
Platform:
| Package | Version | Purpose |
|---|---|---|
| nuxt | ^3.20.1 | Framework |
| firebase | ^12.6.0 | Auth + hosting |
| @sentry/nuxt | ^10.36.0 | Error tracking |
| @stripe/stripe-js | ^6.1.0 | Payments |
| @nuxtjs/i18n | ^10.2.1 | Internationalization |
| @nuxtjs/seo | ^3.0.1 | SEO meta/sitemap |
Agency OS: NOT a separate module or layer. Just the app brand name (fallback title in app.vue).
A2. Nuxt Config
Modules registered (8):
- @nuxt/image
- @nuxt/ui
- @nuxtjs/color-mode
- @nuxtjs/google-fonts
- @nuxtjs/seo
- @formkit/auto-animate/nuxt
- @vueuse/motion/nuxt
- @vueuse/nuxt
- @nuxt/icon
Layers (2):
./layers/proposals— Proposal/signature module (components prefixedProposals)./layers/portal— Client portal (components prefixedPortal, 15 components, Stripe integration)
Theme: Primary=violet, Gray=slate, BorderRadius=lg, Fonts: Inter, Poppins, Fira Code
A3. Nuxt UI Components — Usage Map
USED (23 components):
| Component | Count | Primary Locations |
|---|---|---|
| UButton | 48 | Throughout (portal, navigation, admin, blocks) |
| UIcon | 30 | Throughout |
| UCard | 13 | Portal tasks/files, admin, projects |
| UTable | 8 | Portal TaskList/Widget, MessageList, admin/users |
| UBadge | 7 | TaskList, MessageList, KnowledgeTree, projects |
| UInput | 6 | TaskList, LoginForm |
| UKbd | 5 | GlobalSearch, VGallery |
| UForm | 4 | Task.vue, blocks/Form, TheFooter |
| USelectMenu | 3 | Task.vue |
| UModal | 3 | FileUploadModal, GlobalSearch |
| UCommandPalette | 2 | PortalSearch, GlobalSearch |
| UFormGroup | 2 | LoginForm |
| UTooltip | 2 | FileCard |
| USlideover | 2 | TaskList, TaskWidget |
| UPagination | 2 | TaskWidget |
| UContainer | 2 | Task.vue |
| UDropdown | 2 | FileCard |
| UAvatar | 2 | UserBadge |
| UTextarea | 2 | Various forms |
| UAccordion | 1 | blocks/Faqs |
| UAlert | 1 | LoginForm |
| UNotifications | 1 | Auto-imported |
| USelect | 1 | Various |
NOT USED but AVAILABLE in Nuxt UI v2:
| Component | Purpose | Potential Use |
|---|---|---|
| UTimeline | Vertical timeline | Could replace StepsTimeline.vue |
| UStepper | Step-by-step progress | Could replace step status UI |
| UPopover | Positioned popover | Could replace custom column description popover |
| UProgress | Progress bars | Step completion visualization |
| USkeleton | Loading placeholders | Better loading states |
| UDivider | Section separator | Table/section dividers |
| URadio | Radio buttons | Form selections |
| UToggle | Toggle switches | Boolean settings |
| UChip | Small tags | Status indicators |
| UMeter | Meter/gauge | Progress metrics |
| URange | Slider input | Numeric inputs |
| UTabs | Tab navigation | Replace custom tab nav in workflow detail |
| UBreadcrumb | Breadcrumb nav | Replace custom breadcrumb in workflow detail |
| UNavigationMenu | Navigation | Side navigation |
A4. Agency OS
Finding: Agency OS is NOT a module, layer, or library. It's purely the app brand name used as fallback title in app.vue line 10: name: globals?.title ?? 'AgencyOS'. No separate components, composables, or configuration.
A5. Directus SDK & Composables
Version: @directus/sdk 19.1.0
17 Composables in web/composables/:
| Composable | Purpose |
|---|---|
| useAIDiscussions.ts | AI Discussion System (WEB-39) |
| useAgentData.ts | Agent Data search & logging |
| useAgentDataHealth.ts | Agent Data health check |
| useAgentViews.ts | Agent documentation views |
| useBlueprints.ts | Blueprint documents |
| useCheckpoints.ts | 3-tier task checkpoints (M-001) |
| useContentRequests.ts | Content approval desk (E1) |
| useDOTConsole.ts | DOT command interpreter (WEB-45) |
| useDirectusTable.ts | Schema-driven tables (S101) |
| useKnowledge.ts | Knowledge documents |
| useKnowledgeHistory.ts | Document version history |
| useKnowledgeTree.ts | Knowledge tree structure |
| useScroll.ts | Page scroll tracking |
| useStepCheckpoints.ts | Per-step checkpoints (M-002) |
| useTasks.ts | Task management |
| useTaxonomyTree.ts | Knowledge taxonomy |
| useWorkflows.ts | Workflow DSL (M-002) |
PART B — CUSTOM CODE NEEDING REPLACEMENT
B1. Custom Tables (6 files)
| File | Lines | Purpose | Replace with? |
|---|---|---|---|
components/shared/DirectusDataTable.vue |
639 | Generic schema-driven table | KEEP — this IS the standard component |
components/modules/.../WorkflowMatrixView.vue |
279 | Workflow steps matrix | Already replaced by DirectusDataTable (PR #440) |
components/modules/.../ProcessRegistryView.vue |
389 | Workflow registry with hierarchy | DirectusDataTable + custom slots |
pages/knowledge/current-tasks/index.vue |
217 | Task list table | DirectusDataTable |
pages/approval-desk/index.vue |
333 | Approval desk table | DirectusDataTable |
pages/knowledge/workflows/[id].vue (diagram tab compact table) |
~80 | Compact steps table in diagram | Keep as-is (special layout with checkboxes + status coloring) |
Estimate: 3 files need DirectusDataTable migration (ProcessRegistryView, current-tasks, approval-desk)
B2. Custom Timeline/Stepper (1 file)
| File | Lines | Purpose | Replace with? |
|---|---|---|---|
components/modules/.../StepsTimeline.vue |
317 | Vertical timeline with accordion | UTimeline could provide base; custom features (checkboxes, insert marks, accordion) would need slots/extensions |
Assessment: StepsTimeline is highly customized (3-state coloring, accordion expand, checkboxes, insert marks). UTimeline provides a simpler base. Partial migration possible but may not save LOC.
B3. Custom Form Elements (19 files)
Files with raw HTML form elements (not using Nuxt UI):
| Category | Files | Elements | Replace with? |
|---|---|---|---|
| Search inputs | DirectusDataTable, ProcessRegistryView | <input type="text"> |
UInput |
| Filter dropdowns | DirectusDataTable, ProcessRegistryView, approval-desk | <select> |
USelect / USelectMenu |
| Textareas | ProposalPopup, InlineWcrPopup, WcrIntakePanel, narrative editor | <textarea> |
UTextarea |
| Checkboxes | StepsTimeline, workflows/[id].vue | <input type="checkbox"> |
UCheckbox |
| Auth forms | login.vue, register.vue, forgot-password.vue | <input> |
Already partially using UFormGroup+UInput |
| Comment input | CommentInput.vue | <textarea> |
UTextarea |
| File upload | VUpload.vue | <input type="file"> |
Keep (specialized) |
| Admin forms | admin/users.vue | <input>, <select> |
UInput, USelect |
Estimate: ~15 files could benefit from Nuxt UI form components
B4. Custom Popups/Modals (8+ files)
| File | Type | Replace with? |
|---|---|---|
shared/ProposalPopup.vue |
Absolute popup | UPopover or UModal |
modules/.../InlineWcrPopup.vue |
Absolute popup | UPopover |
shared/DirectusDataTable.vue (column desc) |
Absolute popover | UPopover |
ai/DetailPanel.vue |
Side panel | USlideover |
ai/CreateDiscussionModal.vue |
Modal | UModal |
navigation/MobileMenu.vue |
Full overlay | Keep (already functional) |
base/VGallery.vue |
Lightbox | UModal |
knowledge-tree/index.vue |
Popup | UPopover |
Estimate: ~5 files could use UModal/UPopover/USlideover
PART C — GAP ANALYSIS
C1. Feature Comparison
| Feature | Nuxt UI | Used? | Custom Code? | Gap |
|---|---|---|---|---|
| Data table (sort/filter/page) | UTable | Yes (8x in portal) | Yes (DirectusDataTable, 3 custom tables) | Mixed — UTable used in portal, DirectusDataTable in knowledge. Need standardization. |
| Timeline vertical | UTimeline | No | Yes (StepsTimeline 317 lines) | GAP — available but unused |
| Stepper/Progress | UStepper | No | No (custom step status via classes) | GAP — available but unused |
| Checkbox | UCheckbox | No | Yes (raw HTML in 2 files) | GAP — easy swap |
| Accordion/Expand | UAccordion | Yes (1x Faqs) | Yes (custom in StepsTimeline) | Partial — used once, custom elsewhere |
| Tooltip | UTooltip | Yes (2x FileCard) | Yes (custom title attrs) | Partial — underused |
| Popover | UPopover | No | Yes (5+ custom implementations) | GAP — available but unused |
| Modal/Dialog | UModal | Yes (3x) | Yes (5+ custom popups) | Partial — UModal used, but many custom popups |
| Form validation | UForm | Yes (4x) | Yes (manual validation) | Partial — used in portal, not in knowledge |
| Editor/Rich text | N/A | N/A | Basic textarea only | External needed — Nuxt UI has no rich text editor |
| Badge/Tag | UBadge | Yes (7x) | Yes (custom span badges everywhere) | Partial — used in portal, custom in knowledge |
| Tabs | UTabs | No | Yes (custom NuxtLink tabs in workflow detail) | GAP — available but unused |
| Breadcrumb | UBreadcrumb | No (configured) | Yes (custom in workflow detail) | GAP — configured but unused |
| Pagination | UPagination | Yes (2x portal) | Yes (custom in DirectusDataTable) | Partial — used in portal, custom in knowledge |
| Toast/Notification | UNotifications | Yes (auto) | Plus custom alert() calls | Partial — need to replace alert() |
| Navigation menu | UNavigationMenu | No | Custom TheHeader/MobileMenu | GAP — available but unused |
| Slideover | USlideover | Yes (2x portal) | Custom side panels elsewhere | Partial |
| Skeleton loading | USkeleton | No | Custom animate-spin divs | GAP — available but unused |
| Progress | UProgress | No | No progress bars | GAP — could enhance UX |
| Command palette | UCommandPalette | Yes (2x) | N/A | Done |
| Dropdown | UDropdown | Yes (2x) | N/A | Done |
| Avatar | UAvatar | Yes (2x) | N/A | Done |
C2. Recommendations
No packages to install — Nuxt UI v2 already provides everything needed.
Upgrade consideration:
- Current: Nuxt UI 2.22.3 (via ^2.18.2)
- Nuxt UI v3 (Pro) is available but would require Tailwind v4 migration — NOT recommended now.
- Current v2 is sufficient for all assembly needs.
Missing capabilities (need external):
| Need | Options |
|---|---|
| Rich text editor | TipTap, Quill, or ProseMirror |
| Charting/graphs | Chart.js, ApexCharts, or D3 |
| Drag and drop | VueDraggable, @formkit/drag-and-drop |
| File upload progress | Custom or tus.io |
SUMMARY — Assembly Readiness
Files to Migrate (estimated)
| Priority | File | Migration | Effort |
|---|---|---|---|
| P1 | ProcessRegistryView.vue (389 lines) | -> DirectusDataTable | Medium |
| P1 | current-tasks/index.vue (217 lines) | -> DirectusDataTable | Low |
| P1 | approval-desk/index.vue (333 lines) | -> DirectusDataTable | Medium |
| P2 | ProposalPopup.vue (180 lines) | -> UPopover/UModal | Low |
| P2 | InlineWcrPopup.vue (100 lines) | -> UPopover | Low |
| P2 | Column description popover in DDT | -> UPopover | Low |
| P2 | Workflow tabs (custom NuxtLink) | -> UTabs | Low |
| P2 | Workflow breadcrumb (custom) | -> UBreadcrumb | Low |
| P3 | 15 files with raw form elements | -> UInput/USelect/UCheckbox/UTextarea | Low each |
| P3 | Custom loading spinners | -> USkeleton | Low each |
| P3 | Custom alert() calls | -> useToast() | Low each |
Totals
- P1 (Custom tables -> DirectusDataTable): 3 files, ~939 lines of custom code
- P2 (Custom popups/UI -> Nuxt UI): 5 files, ~400 lines
- P3 (Form elements + polish): ~15 files, incremental changes
- Total estimated files to touch: ~23 files
- Custom LOC to replace/simplify: ~1,500+ lines
Key Insight
The codebase has a two-world problem: Portal layer uses Nuxt UI extensively (UTable, UForm, USlideover, UPagination), while the Knowledge/Workflow modules use entirely custom HTML. Assembly means bringing Knowledge/Workflow modules up to the same Nuxt UI standard as the Portal layer.