Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
20 commits
Select commit Hold shift + click to select a range
2ccd23c
Add prototype `shopify store report` command
amcaplan Jul 20, 2026
d073e5c
Replace store report NL engine with an in-CLI agent loop
amcaplan Jul 21, 2026
3fce1f3
Drop the store report --api flag
amcaplan Jul 21, 2026
476f2f6
Re-authenticate store report queries on access denied
amcaplan Jul 21, 2026
5146a83
Render `shopify store report` output as a generative terminal UI
amcaplan Jul 21, 2026
3126744
Answer compound store report questions with multiple queries
amcaplan Jul 21, 2026
f4a5b2f
Silence dev-mcp child process logs in store report
amcaplan Jul 21, 2026
96813aa
Restyle store report output with cli-kit-styled renderers
amcaplan Jul 22, 2026
bf853b5
Harden store report agent prompt to run queries itself
amcaplan Jul 22, 2026
30fc7b1
Retry report dashboard generation with validation feedback
amcaplan Jul 22, 2026
4f10af9
Show one phase-titled progress bar during store report generation
amcaplan Jul 22, 2026
6ecb808
Print the report summary in the store report text fallback
amcaplan Jul 22, 2026
bccfd83
Add renderMultiSelectPrompt to cli-kit
amcaplan Jul 22, 2026
95aa539
Add interactive `shopify wizard` command
amcaplan Jul 22, 2026
f96aa2a
Add opt-in description panel to cli-kit SelectInput
amcaplan Jul 22, 2026
435d626
Apply description panel to cli-kit MultiSelectInput
amcaplan Jul 22, 2026
aaf2e05
Show wizard command descriptions in the cli-kit panel
amcaplan Jul 22, 2026
fb5d546
Keep the cli-kit SelectInput panel within the viewport
amcaplan Jul 22, 2026
456f3b4
Keep the cli-kit MultiSelectInput panel within the viewport
amcaplan Jul 22, 2026
bc4262d
Fix cli-kit SelectInput/MultiSelectInput viewport and state management
amcaplan Jul 22, 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
13 changes: 13 additions & 0 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -98,7 +98,20 @@
"printWidth": 120
},
"version": "0.0.0",
"packageExtensionsNotes": {
"@json-render/ink@0.19.0": "The published manifest omits its zod runtime dependency; pinning zod 4 prevents Ink from resolving zod 3 while core uses zod 4."
},
"pnpm": {
"overrides": {
"@types/react": "18.3.12"
},
Comment on lines +105 to +107
"packageExtensions": {
"@json-render/ink@0.19.0": {
"dependencies": {
"zod": "^4.3.6"
}
}
},
"peerDependencyRules": {
"allowedVersions": {
"@shopify/cli-hydrogen>@graphql-codegen/cli": "6.0.1",
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,46 @@
import React from 'react'
import {Box, Text} from 'ink'

// Minimum readable width (in columns) for the description panel when placed beside the list.
// Below this the panel is stacked under the list instead. Shared by SelectInput and
// MultiSelectInput so both make the same responsive decision.
export const MIN_SIDE_PANEL_WIDTH = 24

export interface DescriptionPanelProps {
/**
* Optional bold heading shown above the description (typically the highlighted item's label).
*/
title?: string
/**
* The description text to show. Wrapped within the panel width and clipped to `maxLines`.
*/
description?: string
/**
* Width of the panel in columns. Includes the panel's left padding.
*/
width: number
/**
* Maximum number of physical lines the panel may occupy. The panel always reserves this
* height so the surrounding layout stays stable while the highlighted item changes, and any
* overflow is clipped to keep the total render height within the viewport.
*/
maxLines: number
}

/**
* A responsive, height-bounded panel that shows the description of the currently highlighted
* item beside or below a `SelectInput`/`MultiSelectInput` list. Kept intentionally small and
* self-contained so both selection components can share it.
*/
export function DescriptionPanel({title, description, width, maxLines}: DescriptionPanelProps): React.ReactElement {
return (
<Box flexDirection="column" width={width} height={maxLines} overflowY="hidden" paddingLeft={2}>
{title ? (
<Text bold wrap="truncate-end">
{title}
</Text>
) : null}
{description ? <Text wrap="wrap">{description}</Text> : null}
</Box>
)
}
Loading
Loading