Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
18 commits
Select commit Hold shift + click to select a range
5a3b321
docs(specs): analyze inventory feature management requirements
arielshad Apr 14, 2026
08e437b
docs(specs): define requirements for inventory feature management
arielshad Apr 14, 2026
b111047
docs(specs): analyze technical decisions for inventory feature manage…
arielshad Apr 14, 2026
521c684
docs(specs): add plan and task breakdown for inventory feature mgmt
arielshad Apr 14, 2026
17cacfb
feat(web): extend inventory data layer with node state and action met…
arielshad Apr 14, 2026
aa54552
feat(web): add action config and feature row actions component for in…
arielshad Apr 14, 2026
5c44c2a
feat(web): add frozen actions column to inventory feature tree table
arielshad Apr 14, 2026
d4a05ea
feat(web): add portal lifecycle manager for inventory row actions
arielshad Apr 14, 2026
5ca63a1
feat(web): wire server actions and confirmation dialogs for inventory…
arielshad Apr 14, 2026
177141d
test(web): add integration tests for inventory row actions
arielshad Apr 14, 2026
702de6d
chore(specs): capture evidence for inventory feature management
arielshad Apr 14, 2026
9794547
chore(specs): capture evidence for inventory feature management
arielshad Apr 14, 2026
ab7dd70
chore(specs): add feature yaml and update next-env types path
arielshad Apr 14, 2026
b3a39cd
feat(web): add create actions fab and drawers to inventory page
arielshad Apr 14, 2026
caa9e88
feat(web): add collapsed tree, repo create btn, and action toolbar
arielshad Apr 14, 2026
91622a9
feat(web): merge main into inventory feature management branch
arielshad Apr 14, 2026
f318ac6
feat(web): fix inventory page crash and add repository actions to gro…
arielshad Apr 16, 2026
65c86ee
fix(web): fix inventory actions disappearing on tree expand and collapse
arielshad Apr 19, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -324,6 +324,9 @@ export function registerUseCases(container: DependencyContainer): void {
container.register('StreamAgentEventsUseCase', {
useFactory: (c) => c.resolve(StreamAgentEventsUseCase),
});
container.register('ListAgentRunsUseCase', {
useFactory: (c) => c.resolve(ListAgentRunsUseCase),
});

container.registerSingleton(ImportWorkItemsCsvUseCase);
container.register('ImportWorkItemsCsvUseCase', { useToken: ImportWorkItemsCsvUseCase });
Expand Down
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.

Large diffs are not rendered by default.

Large diffs are not rendered by default.

Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@

RUN v4.0.18 /Users/arielshadkhan/.shep/repos/fbfd7efb528913ed/wt/feat-inventory-feature-management

✓ web tests/unit/presentation/web/components/features/feature-tree-table/feature-tree-table.test.tsx > FeatureTreeTable > renders the container element with data-testid 17ms
✓ web tests/unit/presentation/web/components/features/feature-tree-table/feature-tree-table.test.tsx > FeatureTreeTable > applies custom className 3ms
✓ web tests/unit/presentation/web/components/features/feature-tree-table/feature-tree-table.test.tsx > FeatureTreeTable > renders without errors when data is empty 3ms
✓ web tests/unit/presentation/web/components/features/feature-tree-table/feature-tree-table.test.tsx > FeatureTreeTable > renders with extended FeatureTreeRow fields (nodeState, hasChildren, hasOpenPr) 1ms

Test Files 1 passed (1)
Tests 4 passed (4)
Start at 12:30:26
Duration 984ms (transform 111ms, setup 222ms, import 208ms, tests 25ms, environment 381ms)

Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@

RUN v4.0.18 /Users/arielshadkhan/.shep/repos/fbfd7efb528913ed/wt/feat-inventory-feature-management

✓ web tests/unit/presentation/web/app/features/inventory-filters.test.ts > isArchived > returns true for Archived lifecycle 0ms
✓ web tests/unit/presentation/web/app/features/inventory-filters.test.ts > isArchived > returns false for Maintain lifecycle 0ms
✓ web tests/unit/presentation/web/app/features/inventory-filters.test.ts > isArchived > returns false for active lifecycles 0ms
✓ web tests/unit/presentation/web/app/features/inventory-filters.test.ts > getItemSortOptions > returns all options when no groupBy 0ms
✓ web tests/unit/presentation/web/app/features/inventory-filters.test.ts > getItemSortOptions > excludes repositoryName when grouped by repositoryName 0ms
✓ web tests/unit/presentation/web/app/features/inventory-filters.test.ts > getItemSortOptions > excludes status when grouped by status 0ms
✓ web tests/unit/presentation/web/app/features/inventory-filters.test.ts > getItemSortOptions > excludes lifecycle when grouped by lifecycle 0ms
✓ web tests/unit/presentation/web/app/features/inventory-filters.test.ts > filtering logic > archive filter > filters out archived features in active mode 0ms
✓ web tests/unit/presentation/web/app/features/inventory-filters.test.ts > filtering logic > archive filter > shows only archived features in archived mode 0ms
✓ web tests/unit/presentation/web/app/features/inventory-filters.test.ts > filtering logic > archive filter > shows all features in all mode 0ms
✓ web tests/unit/presentation/web/app/features/inventory-filters.test.ts > filtering logic > status filter > filters by specific status 0ms
✓ web tests/unit/presentation/web/app/features/inventory-filters.test.ts > filtering logic > status filter > shows all when status filter is null 0ms
✓ web tests/unit/presentation/web/app/features/inventory-filters.test.ts > filtering logic > status filter > returns empty when no features match status 0ms
✓ web tests/unit/presentation/web/app/features/inventory-filters.test.ts > filtering logic > repository filter > filters by specific repository 0ms
✓ web tests/unit/presentation/web/app/features/inventory-filters.test.ts > filtering logic > repository filter > shows all when repo filter is null 0ms
✓ web tests/unit/presentation/web/app/features/inventory-filters.test.ts > filtering logic > search > matches by feature name 0ms
✓ web tests/unit/presentation/web/app/features/inventory-filters.test.ts > filtering logic > search > matches by branch name 0ms
✓ web tests/unit/presentation/web/app/features/inventory-filters.test.ts > filtering logic > search > matches by repository name 0ms
✓ web tests/unit/presentation/web/app/features/inventory-filters.test.ts > filtering logic > search > is case insensitive 0ms
✓ web tests/unit/presentation/web/app/features/inventory-filters.test.ts > filtering logic > search > returns empty when nothing matches 0ms
✓ web tests/unit/presentation/web/app/features/inventory-filters.test.ts > filtering logic > combined filters > applies archive + status filters together 0ms
✓ web tests/unit/presentation/web/app/features/inventory-filters.test.ts > filtering logic > combined filters > applies archive + repo + search together 0ms
✓ web tests/unit/presentation/web/app/features/inventory-filters.test.ts > filtering logic > combined filters > applies all filters together 0ms
✓ web tests/unit/presentation/web/app/features/inventory-filters.test.ts > filtering logic > combined filters > returns empty when combined filters exclude everything 0ms

Test Files 1 passed (1)
Tests 24 passed (24)
Start at 12:31:13
Duration 586ms (transform 113ms, setup 116ms, import 211ms, tests 4ms, environment 201ms)

Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
Full Test Suite Results - End-to-End Integration Verification (task-11)
======================================================================

Command: pnpm test:unit (all 467 test files)

Inventory Feature Management - Specific Test Files:
✓ feature-tree-table.test.tsx (4 tests) — PASSED
✓ feature-row-actions.test.tsx (14 tests) — PASSED
✓ feature-row-actions-manager.test.tsx (9 tests) — PASSED
✓ feature-row-actions-config.test.ts (14 tests) — PASSED
✓ actions-column.test.ts (8 tests) — PASSED
✓ build-grouped-tree.test.ts (18 tests) — PASSED
✓ build-tree-data.test.ts (8 tests) — PASSED
✓ get-feature-tree-data.test.ts (11 tests) — PASSED
✓ feature-tree-page-client.test.tsx (5 tests) — PASSED
✓ inventory-filters.test.ts (24 tests) — PASSED

Summary:
Test Files 467 passed (467)
Tests 6350 passed (6350)
Duration ~30s

All tests pass. No failures, no skipped tests.
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@

RUN v4.0.18 /Users/arielshadkhan/.shep/repos/fbfd7efb528913ed/wt/feat-inventory-feature-management

✓ web tests/unit/presentation/web/app/features/get-feature-tree-data.test.ts > getFeatureTreeData > returns nodeState derived from lifecycle and agent run 1ms
✓ web tests/unit/presentation/web/app/features/get-feature-tree-data.test.ts > getFeatureTreeData > returns nodeState "archived" for a feature with Archived lifecycle 0ms
✓ web tests/unit/presentation/web/app/features/get-feature-tree-data.test.ts > getFeatureTreeData > returns nodeState "deleting" for a feature with Deleting lifecycle 0ms
✓ web tests/unit/presentation/web/app/features/get-feature-tree-data.test.ts > getFeatureTreeData > returns nodeState "error" when latest agent run has failed status 0ms
✓ web tests/unit/presentation/web/app/features/get-feature-tree-data.test.ts > getFeatureTreeData > returns nodeState "pending" for a feature with Pending lifecycle 0ms
✓ web tests/unit/presentation/web/app/features/get-feature-tree-data.test.ts > getFeatureTreeData > returns hasChildren true when a feature has child features 0ms
✓ web tests/unit/presentation/web/app/features/get-feature-tree-data.test.ts > getFeatureTreeData > returns hasOpenPr true for a feature with an open PR 0ms
✓ web tests/unit/presentation/web/app/features/get-feature-tree-data.test.ts > getFeatureTreeData > returns hasOpenPr false for a feature with a merged PR 0ms
✓ web tests/unit/presentation/web/app/features/get-feature-tree-data.test.ts > getFeatureTreeData > returns hasOpenPr false for a feature without a PR 0ms
✓ web tests/unit/presentation/web/app/features/get-feature-tree-data.test.ts > getFeatureTreeData > uses the latest agent run when multiple runs exist for a feature 0ms
✓ web tests/unit/presentation/web/app/features/get-feature-tree-data.test.ts > getFeatureTreeData > preserves existing fields (id, name, status, lifecycle, branch, repositoryName) 0ms

Test Files 1 passed (1)
Tests 11 passed (11)
Start at 12:30:33
Duration 232ms (transform 75ms, setup 133ms, import 39ms, tests 3ms, environment 0ms)

Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@

RUN v4.0.18 /Users/arielshadkhan/.shep/repos/fbfd7efb528913ed/wt/feat-inventory-feature-management

✓ web tests/unit/presentation/web/components/features/feature-tree-table/feature-row-actions-config.test.ts > FEATURE_ROW_ACTIONS_CONFIG > has entries for all 9 FeatureNodeState values 1ms
✓ web tests/unit/presentation/web/components/features/feature-tree-table/feature-row-actions-config.test.ts > FEATURE_ROW_ACTIONS_CONFIG > maps pending to [start, archive, delete] 0ms
✓ web tests/unit/presentation/web/components/features/feature-tree-table/feature-row-actions-config.test.ts > FEATURE_ROW_ACTIONS_CONFIG > maps running to [stop, archive, delete] 0ms
✓ web tests/unit/presentation/web/components/features/feature-tree-table/feature-row-actions-config.test.ts > FEATURE_ROW_ACTIONS_CONFIG > maps error to [retry, archive, delete] 0ms
✓ web tests/unit/presentation/web/components/features/feature-tree-table/feature-row-actions-config.test.ts > FEATURE_ROW_ACTIONS_CONFIG > maps action-required to [review, archive, delete] 0ms
✓ web tests/unit/presentation/web/components/features/feature-tree-table/feature-row-actions-config.test.ts > FEATURE_ROW_ACTIONS_CONFIG > maps done to [archive, delete] 0ms
✓ web tests/unit/presentation/web/components/features/feature-tree-table/feature-row-actions-config.test.ts > FEATURE_ROW_ACTIONS_CONFIG > maps blocked to [archive, delete] 0ms
✓ web tests/unit/presentation/web/components/features/feature-tree-table/feature-row-actions-config.test.ts > FEATURE_ROW_ACTIONS_CONFIG > maps archived to [unarchive, delete] 0ms
✓ web tests/unit/presentation/web/components/features/feature-tree-table/feature-row-actions-config.test.ts > FEATURE_ROW_ACTIONS_CONFIG > maps creating to empty array 0ms
✓ web tests/unit/presentation/web/components/features/feature-tree-table/feature-row-actions-config.test.ts > FEATURE_ROW_ACTIONS_CONFIG > maps deleting to empty array 0ms
✓ web tests/unit/presentation/web/components/features/feature-tree-table/feature-row-actions-config.test.ts > FEATURE_ROW_ACTIONS_CONFIG > marks delete and archive as requiresConfirmation: true 0ms
✓ web tests/unit/presentation/web/components/features/feature-tree-table/feature-row-actions-config.test.ts > FEATURE_ROW_ACTIONS_CONFIG > marks start, stop, retry, unarchive, review as requiresConfirmation: false 0ms
✓ web tests/unit/presentation/web/components/features/feature-tree-table/feature-row-actions-config.test.ts > FEATURE_ROW_ACTIONS_CONFIG > every action has a non-empty label 0ms
✓ web tests/unit/presentation/web/components/features/feature-tree-table/feature-row-actions-config.test.ts > FEATURE_ROW_ACTIONS_CONFIG > every action has an icon component 0ms

Test Files 1 passed (1)
Tests 14 passed (14)
Start at 12:30:39
Duration 451ms (transform 56ms, setup 130ms, import 46ms, tests 3ms, environment 213ms)

Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@

RUN v4.0.18 /Users/arielshadkhan/.shep/repos/fbfd7efb528913ed/wt/feat-inventory-feature-management

✓ web tests/unit/presentation/web/components/features/feature-tree-table/feature-row-actions.test.tsx > FeatureRowActions > renders a three-dot button for pending state 60ms
✓ web tests/unit/presentation/web/components/features/feature-tree-table/feature-row-actions.test.tsx > FeatureRowActions > does not render anything for creating state 1ms
✓ web tests/unit/presentation/web/components/features/feature-tree-table/feature-row-actions.test.tsx > FeatureRowActions > does not render anything for deleting state 0ms
✓ web tests/unit/presentation/web/components/features/feature-tree-table/feature-row-actions.test.tsx > FeatureRowActions > calls onStart with featureId when Start menu item is clicked 67ms
✓ web tests/unit/presentation/web/components/features/feature-tree-table/feature-row-actions.test.tsx > FeatureRowActions > calls onStop with featureId when Stop menu item is clicked 41ms
✓ web tests/unit/presentation/web/components/features/feature-tree-table/feature-row-actions.test.tsx > FeatureRowActions > calls onRetry with featureId when Retry menu item is clicked 38ms
✓ web tests/unit/presentation/web/components/features/feature-tree-table/feature-row-actions.test.tsx > FeatureRowActions > calls onReview with featureId when Review menu item is clicked 34ms
✓ web tests/unit/presentation/web/components/features/feature-tree-table/feature-row-actions.test.tsx > FeatureRowActions > calls onUnarchive with featureId when Unarchive menu item is clicked 33ms
✓ web tests/unit/presentation/web/components/features/feature-tree-table/feature-row-actions.test.tsx > FeatureRowActions > calls onDelete with featureId when Delete menu item is clicked 34ms
✓ web tests/unit/presentation/web/components/features/feature-tree-table/feature-row-actions.test.tsx > FeatureRowActions > calls onArchive with featureId when Archive menu item is clicked 33ms
✓ web tests/unit/presentation/web/components/features/feature-tree-table/feature-row-actions.test.tsx > FeatureRowActions > shows a spinner when isLoading is true 3ms
✓ web tests/unit/presentation/web/components/features/feature-tree-table/feature-row-actions.test.tsx > FeatureRowActions > disables the button when isLoading is true 2ms
✓ web tests/unit/presentation/web/components/features/feature-tree-table/feature-row-actions.test.tsx > FeatureRowActions > shows correct menu items for each state 22ms
✓ web tests/unit/presentation/web/components/features/feature-tree-table/feature-row-actions.test.tsx > FeatureRowActions > shows correct menu items for archived state 21ms

Test Files 1 passed (1)
Tests 14 passed (14)
Start at 12:30:45
Duration 916ms (transform 71ms, setup 118ms, import 148ms, tests 390ms, environment 203ms)

Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@

RUN v4.0.18 /Users/arielshadkhan/.shep/repos/fbfd7efb528913ed/wt/feat-inventory-feature-management

✓ web tests/unit/presentation/web/components/features/feature-tree-table/actions-column.test.ts > buildColumns > includes an actions column as the last column 1ms
✓ web tests/unit/presentation/web/components/features/feature-tree-table/actions-column.test.ts > buildColumns > actions column is frozen with fixed width and no header sort 0ms
✓ web tests/unit/presentation/web/components/features/feature-tree-table/actions-column.test.ts > buildColumns > actions column is present regardless of groupBy mode 0ms
✓ web tests/unit/presentation/web/components/features/feature-tree-table/actions-column.test.ts > buildColumns > actions column is always the last column 0ms
✓ web tests/unit/presentation/web/components/features/feature-tree-table/actions-column.test.ts > actionsColumnFormatter > creates a div with data-feature-id for regular data rows 4ms
✓ web tests/unit/presentation/web/components/features/feature-tree-table/actions-column.test.ts > actionsColumnFormatter > returns empty string for group header rows 0ms
✓ web tests/unit/presentation/web/components/features/feature-tree-table/actions-column.test.ts > actionsColumnFormatter > returns empty string for repo group rows 0ms
✓ web tests/unit/presentation/web/components/features/feature-tree-table/actions-column.test.ts > actionsColumnFormatter > container div has flex centering styles 0ms

Test Files 1 passed (1)
Tests 8 passed (8)
Start at 12:30:52
Duration 406ms (transform 55ms, setup 114ms, import 25ms, tests 6ms, environment 205ms)

Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@

RUN v4.0.18 /Users/arielshadkhan/.shep/repos/fbfd7efb528913ed/wt/feat-inventory-feature-management

✓ web tests/unit/presentation/web/components/features/feature-tree-table/feature-row-actions-manager.test.tsx > FeatureRowActionsManager > renders FeatureRowActions portals for discovered containers 67ms
✓ web tests/unit/presentation/web/components/features/feature-tree-table/feature-row-actions-manager.test.tsx > FeatureRowActionsManager > does not render portals when tableContainer is null 1ms
✓ web tests/unit/presentation/web/components/features/feature-tree-table/feature-row-actions-manager.test.tsx > FeatureRowActionsManager > does not render portals for features without nodeState 1ms
✓ web tests/unit/presentation/web/components/features/feature-tree-table/feature-row-actions-manager.test.tsx > FeatureRowActionsManager > finds features nested in _children for grouped data 7ms
✓ web tests/unit/presentation/web/components/features/feature-tree-table/feature-row-actions-manager.test.tsx > FeatureRowActionsManager > cleans up portals when component unmounts 6ms
✓ web tests/unit/presentation/web/components/features/feature-tree-table/feature-row-actions-manager.test.tsx > FeatureRowActionsManager > renders action buttons for mixed-state features (all actionable states) 13ms
✓ web tests/unit/presentation/web/components/features/feature-tree-table/feature-row-actions-manager.test.tsx > FeatureRowActionsManager > does not render actions for creating/deleting features even with portal targets 1ms
✓ web tests/unit/presentation/web/components/features/feature-tree-table/feature-row-actions-manager.test.tsx > FeatureRowActionsManager > only disables the in-flight row, not other rows 6ms
✓ web tests/unit/presentation/web/components/features/feature-tree-table/feature-row-actions-manager.test.tsx > FeatureRowActionsManager > handles features in both flat and nested _children 5ms

Test Files 1 passed (1)
Tests 9 passed (9)
Start at 12:30:59
Duration 605ms (transform 70ms, setup 117ms, import 122ms, tests 108ms, environment 203ms)

Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@

RUN v4.0.18 /Users/arielshadkhan/.shep/repos/fbfd7efb528913ed/wt/feat-inventory-feature-management

✓ web tests/unit/presentation/web/app/features/feature-tree-page-client.test.tsx > FeatureTreePageClient — Action Wiring > renders the page with feature data 54ms
✓ web tests/unit/presentation/web/app/features/feature-tree-page-client.test.tsx > FeatureTreePageClient — Action Wiring > handleStartFeature calls startFeature server action and shows success toast 16ms
✓ web tests/unit/presentation/web/app/features/feature-tree-page-client.test.tsx > FeatureTreePageClient — Action Wiring > handleReview navigates to feature overview page 13ms
✓ web tests/unit/presentation/web/app/features/feature-tree-page-client.test.tsx > FeatureTreePageClient — Delete Dialog Integration > renders DeleteFeatureDialog in closed state initially 14ms
✓ web tests/unit/presentation/web/app/features/feature-tree-page-client.test.tsx > FeatureTreePageClient — Archive Dialog Integration > renders archive AlertDialog in closed state initially 16ms

Test Files 1 passed (1)
Tests 5 passed (5)
Start at 12:31:05
Duration 745ms (transform 131ms, setup 117ms, import 206ms, tests 114ms, environment 248ms)

Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@

> @shepai/cli@1.183.0 typecheck /Users/arielshadkhan/.shep/repos/fbfd7efb528913ed/wt/feat-inventory-feature-management
> tsc --noEmit

Loading
Loading