procedure-cli 0.1.9 → 0.1.11
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/components/gutter-line.js +2 -2
- package/dist/components/gutter-line.js.map +1 -1
- package/dist/components/guttered-select.d.ts +3 -1
- package/dist/components/guttered-select.js +14 -6
- package/dist/components/guttered-select.js.map +1 -1
- package/dist/steps/stack-style.js +7 -7
- package/dist/steps/stack-style.js.map +1 -1
- package/package.json +1 -1
- package/src/components/gutter-line.tsx +7 -2
- package/src/components/guttered-select.tsx +35 -9
- package/src/steps/stack-style.tsx +7 -7
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
-
import { Text } from "ink";
|
|
2
|
+
import { Box, Text } from "ink";
|
|
3
3
|
import { C } from "../theme.js";
|
|
4
4
|
export function GutterLine({ children }) {
|
|
5
|
-
return _jsxs(
|
|
5
|
+
return (_jsxs(Box, { flexDirection: "row", children: [_jsx(Text, { color: C.overlay1, children: "│ " }), children] }));
|
|
6
6
|
}
|
|
7
7
|
export function EmptyGutter() {
|
|
8
8
|
return _jsx(Text, { color: C.overlay1, children: "│" });
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"gutter-line.js","sourceRoot":"","sources":["../../src/components/gutter-line.tsx"],"names":[],"mappings":";AACA,OAAO,EAAE,IAAI,EAAE,MAAM,KAAK,CAAC;
|
|
1
|
+
{"version":3,"file":"gutter-line.js","sourceRoot":"","sources":["../../src/components/gutter-line.tsx"],"names":[],"mappings":";AACA,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,KAAK,CAAC;AAChC,OAAO,EAAE,CAAC,EAAE,MAAM,aAAa,CAAC;AAEhC,MAAM,UAAU,UAAU,CAAC,EAAE,QAAQ,EAAkC;IACrE,OAAO,CACL,MAAC,GAAG,IAAC,aAAa,EAAC,KAAK,aACtB,KAAC,IAAI,IAAC,KAAK,EAAE,CAAC,CAAC,QAAQ,YAAG,KAAK,GAAQ,EACtC,QAAQ,IACL,CACP,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,WAAW;IACzB,OAAO,KAAC,IAAI,IAAC,KAAK,EAAE,CAAC,CAAC,QAAQ,YAAG,GAAG,GAAQ,CAAC;AAC/C,CAAC"}
|
|
@@ -6,12 +6,14 @@ interface Option {
|
|
|
6
6
|
interface GutteredSelectProps {
|
|
7
7
|
options: Option[];
|
|
8
8
|
onChange: (value: string) => void;
|
|
9
|
+
maxVisible?: number;
|
|
9
10
|
}
|
|
10
11
|
/**
|
|
11
12
|
* A custom Select component that renders each option with the vertical
|
|
12
13
|
* gutter prefix (│) so the timeline line stays continuous.
|
|
14
|
+
* Shows at most `maxVisible` options at a time with scroll indicators.
|
|
13
15
|
*/
|
|
14
|
-
export declare function GutteredSelect({ options, onChange }: GutteredSelectProps): import("react/jsx-runtime").JSX.Element;
|
|
16
|
+
export declare function GutteredSelect({ options, onChange, maxVisible }: GutteredSelectProps): import("react/jsx-runtime").JSX.Element;
|
|
15
17
|
interface GutteredMultiSelectProps {
|
|
16
18
|
options: Option[];
|
|
17
19
|
initialSelected?: string[];
|
|
@@ -6,8 +6,9 @@ import { C } from "../theme.js";
|
|
|
6
6
|
/**
|
|
7
7
|
* A custom Select component that renders each option with the vertical
|
|
8
8
|
* gutter prefix (│) so the timeline line stays continuous.
|
|
9
|
+
* Shows at most `maxVisible` options at a time with scroll indicators.
|
|
9
10
|
*/
|
|
10
|
-
export function GutteredSelect({ options, onChange }) {
|
|
11
|
+
export function GutteredSelect({ options, onChange, maxVisible = 5 }) {
|
|
11
12
|
const [activeIndex, setActiveIndex] = useState(0);
|
|
12
13
|
useInput((input, key) => {
|
|
13
14
|
if (key.upArrow) {
|
|
@@ -23,10 +24,17 @@ export function GutteredSelect({ options, onChange }) {
|
|
|
23
24
|
}
|
|
24
25
|
}
|
|
25
26
|
});
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
27
|
+
// Sliding window: keep active item visible
|
|
28
|
+
const windowSize = Math.min(maxVisible, options.length);
|
|
29
|
+
const scrollOffset = Math.min(Math.max(0, activeIndex - Math.floor(windowSize / 2)), Math.max(0, options.length - windowSize));
|
|
30
|
+
const visibleOptions = options.slice(scrollOffset, scrollOffset + windowSize);
|
|
31
|
+
const showScrollUp = scrollOffset > 0;
|
|
32
|
+
const showScrollDown = scrollOffset + windowSize < options.length;
|
|
33
|
+
return (_jsxs(Box, { flexDirection: "column", children: [showScrollUp && (_jsxs(Text, { children: [_jsx(Text, { color: C.overlay1, children: "│ " }), _jsx(Text, { color: C.overlay1, children: "↑ more" })] })), visibleOptions.map((option, visIndex) => {
|
|
34
|
+
const index = scrollOffset + visIndex;
|
|
35
|
+
const isActive = index === activeIndex;
|
|
36
|
+
return (_jsxs(Text, { children: [_jsx(Text, { color: C.overlay1, children: "│ " }), isActive ? (_jsx(Text, { color: C.mauve, bold: true, children: "❯ " })) : (_jsx(Text, { children: " " })), _jsx(Text, { bold: isActive, children: option.label }), option.description && (_jsx(Text, { color: C.overlay1, children: " — " + option.description }))] }, option.value));
|
|
37
|
+
}), showScrollDown && (_jsxs(Text, { children: [_jsx(Text, { color: C.overlay1, children: "│ " }), _jsx(Text, { color: C.overlay1, children: "↓ more" })] })), _jsxs(Text, { color: C.overlay1, children: ["│ ", " ↑↓ move, enter select"] })] }));
|
|
30
38
|
}
|
|
31
39
|
const CUSTOM_SENTINEL = "__custom__";
|
|
32
40
|
/**
|
|
@@ -79,7 +87,7 @@ export function GutteredMultiSelect({ options, initialSelected, onSubmit, allowC
|
|
|
79
87
|
}, { isActive: phase === "selecting" });
|
|
80
88
|
if (phase === "custom") {
|
|
81
89
|
const currentSelections = Array.from(selected);
|
|
82
|
-
return (_jsxs(Box, { flexDirection: "column", children: [currentSelections.length > 0 && (_jsxs(
|
|
90
|
+
return (_jsxs(Box, { flexDirection: "column", children: [currentSelections.length > 0 && (_jsxs(Box, { flexDirection: "row", children: [_jsx(Text, { color: C.overlay1, children: "│ " }), _jsx(Text, { color: C.green, children: "Selected: " }), _jsx(Text, { children: currentSelections.join(", ") })] })), _jsxs(Box, { flexDirection: "row", children: [_jsx(Text, { color: C.overlay1, children: "│ " }), _jsx(Text, { bold: true, children: "Add custom (comma-separated):" })] }), _jsxs(Box, { flexDirection: "row", children: [_jsx(Text, { color: C.overlay1, children: "│ " }), _jsx(TextInput, { placeholder: customPlaceholder ?? "Type here, press enter to confirm", onSubmit: (value) => {
|
|
83
91
|
const custom = value.split(",").map((s) => s.trim()).filter(Boolean);
|
|
84
92
|
onSubmit([...currentSelections, ...custom]);
|
|
85
93
|
} })] })] }));
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"guttered-select.js","sourceRoot":"","sources":["../../src/components/guttered-select.tsx"],"names":[],"mappings":";AAAA,OAAc,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AACxC,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,KAAK,CAAC;AAC1C,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AACtC,OAAO,EAAE,CAAC,EAAE,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"guttered-select.js","sourceRoot":"","sources":["../../src/components/guttered-select.tsx"],"names":[],"mappings":"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"}
|
|
@@ -7,7 +7,7 @@ import { C } from "../theme.js";
|
|
|
7
7
|
const PRESETS = {
|
|
8
8
|
"typescript-node": {
|
|
9
9
|
label: "TypeScript + Node.js",
|
|
10
|
-
description: "
|
|
10
|
+
description: "CLI tools, backend APIs, npm packages",
|
|
11
11
|
answers: {
|
|
12
12
|
language: "TypeScript",
|
|
13
13
|
framework: "Node.js",
|
|
@@ -26,7 +26,7 @@ const PRESETS = {
|
|
|
26
26
|
},
|
|
27
27
|
"nextjs-fullstack": {
|
|
28
28
|
label: "Next.js Full-Stack",
|
|
29
|
-
description: "
|
|
29
|
+
description: "SaaS apps, marketing sites, SSR/SSG",
|
|
30
30
|
answers: {
|
|
31
31
|
language: "TypeScript",
|
|
32
32
|
framework: "Next.js",
|
|
@@ -45,7 +45,7 @@ const PRESETS = {
|
|
|
45
45
|
},
|
|
46
46
|
"react-spa": {
|
|
47
47
|
label: "React SPA",
|
|
48
|
-
description: "
|
|
48
|
+
description: "Dashboards, admin panels, SPAs",
|
|
49
49
|
answers: {
|
|
50
50
|
language: "TypeScript",
|
|
51
51
|
framework: "React",
|
|
@@ -64,7 +64,7 @@ const PRESETS = {
|
|
|
64
64
|
},
|
|
65
65
|
"python-fastapi": {
|
|
66
66
|
label: "Python + FastAPI",
|
|
67
|
-
description: "
|
|
67
|
+
description: "AI/ML backends, REST APIs, data services",
|
|
68
68
|
answers: {
|
|
69
69
|
language: "Python",
|
|
70
70
|
framework: "FastAPI",
|
|
@@ -83,7 +83,7 @@ const PRESETS = {
|
|
|
83
83
|
},
|
|
84
84
|
"go-service": {
|
|
85
85
|
label: "Go HTTP Service",
|
|
86
|
-
description: "
|
|
86
|
+
description: "High-perf APIs, microservices",
|
|
87
87
|
answers: {
|
|
88
88
|
language: "Go",
|
|
89
89
|
framework: "net/http",
|
|
@@ -102,7 +102,7 @@ const PRESETS = {
|
|
|
102
102
|
},
|
|
103
103
|
"react-native-expo": {
|
|
104
104
|
label: "React Native + Expo",
|
|
105
|
-
description: "
|
|
105
|
+
description: "Cross-platform mobile apps (iOS + Android)",
|
|
106
106
|
answers: {
|
|
107
107
|
language: "TypeScript",
|
|
108
108
|
framework: "React Native",
|
|
@@ -129,7 +129,7 @@ const QUICKSTART_OPTIONS = [
|
|
|
129
129
|
{
|
|
130
130
|
label: "Configure manually →",
|
|
131
131
|
value: "advanced",
|
|
132
|
-
description: "Choose
|
|
132
|
+
description: "Choose language, framework, and code style",
|
|
133
133
|
},
|
|
134
134
|
];
|
|
135
135
|
// ─── Advanced options ────────────────────────────────────────────────────────
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"stack-style.js","sourceRoot":"","sources":["../../src/steps/stack-style.tsx"],"names":[],"mappings":";AAAA,OAAc,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AACxC,OAAO,EAAE,IAAI,EAAE,MAAM,KAAK,CAAC;AAC3B,OAAO,EAAE,UAAU,EAAE,MAAM,8BAA8B,CAAC;AAC1D,OAAO,EAAE,cAAc,EAAE,mBAAmB,EAAE,MAAM,kCAAkC,CAAC;AAEvF,OAAO,EAAE,CAAC,EAAE,MAAM,aAAa,CAAC;AAiBhC,MAAM,OAAO,GAA2B;IACtC,iBAAiB,EAAE;QACjB,KAAK,EAAE,sBAAsB;QAC7B,WAAW,EAAE,
|
|
1
|
+
{"version":3,"file":"stack-style.js","sourceRoot":"","sources":["../../src/steps/stack-style.tsx"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,9 +1,14 @@
|
|
|
1
1
|
import React from "react";
|
|
2
|
-
import { Text } from "ink";
|
|
2
|
+
import { Box, Text } from "ink";
|
|
3
3
|
import { C } from "../theme.js";
|
|
4
4
|
|
|
5
5
|
export function GutterLine({ children }: { children?: React.ReactNode }) {
|
|
6
|
-
return
|
|
6
|
+
return (
|
|
7
|
+
<Box flexDirection="row">
|
|
8
|
+
<Text color={C.overlay1}>{"│ "}</Text>
|
|
9
|
+
{children}
|
|
10
|
+
</Box>
|
|
11
|
+
);
|
|
7
12
|
}
|
|
8
13
|
|
|
9
14
|
export function EmptyGutter() {
|
|
@@ -13,13 +13,15 @@ interface Option {
|
|
|
13
13
|
interface GutteredSelectProps {
|
|
14
14
|
options: Option[];
|
|
15
15
|
onChange: (value: string) => void;
|
|
16
|
+
maxVisible?: number;
|
|
16
17
|
}
|
|
17
18
|
|
|
18
19
|
/**
|
|
19
20
|
* A custom Select component that renders each option with the vertical
|
|
20
21
|
* gutter prefix (│) so the timeline line stays continuous.
|
|
22
|
+
* Shows at most `maxVisible` options at a time with scroll indicators.
|
|
21
23
|
*/
|
|
22
|
-
export function GutteredSelect({ options, onChange }: GutteredSelectProps) {
|
|
24
|
+
export function GutteredSelect({ options, onChange, maxVisible = 5 }: GutteredSelectProps) {
|
|
23
25
|
const [activeIndex, setActiveIndex] = useState(0);
|
|
24
26
|
|
|
25
27
|
useInput((input, key) => {
|
|
@@ -37,9 +39,26 @@ export function GutteredSelect({ options, onChange }: GutteredSelectProps) {
|
|
|
37
39
|
}
|
|
38
40
|
});
|
|
39
41
|
|
|
42
|
+
// Sliding window: keep active item visible
|
|
43
|
+
const windowSize = Math.min(maxVisible, options.length);
|
|
44
|
+
const scrollOffset = Math.min(
|
|
45
|
+
Math.max(0, activeIndex - Math.floor(windowSize / 2)),
|
|
46
|
+
Math.max(0, options.length - windowSize)
|
|
47
|
+
);
|
|
48
|
+
const visibleOptions = options.slice(scrollOffset, scrollOffset + windowSize);
|
|
49
|
+
const showScrollUp = scrollOffset > 0;
|
|
50
|
+
const showScrollDown = scrollOffset + windowSize < options.length;
|
|
51
|
+
|
|
40
52
|
return (
|
|
41
53
|
<Box flexDirection="column">
|
|
42
|
-
{
|
|
54
|
+
{showScrollUp && (
|
|
55
|
+
<Text>
|
|
56
|
+
<Text color={C.overlay1}>{"│ "}</Text>
|
|
57
|
+
<Text color={C.overlay1}>{"↑ more"}</Text>
|
|
58
|
+
</Text>
|
|
59
|
+
)}
|
|
60
|
+
{visibleOptions.map((option, visIndex) => {
|
|
61
|
+
const index = scrollOffset + visIndex;
|
|
43
62
|
const isActive = index === activeIndex;
|
|
44
63
|
return (
|
|
45
64
|
<Text key={option.value}>
|
|
@@ -51,11 +70,18 @@ export function GutteredSelect({ options, onChange }: GutteredSelectProps) {
|
|
|
51
70
|
)}
|
|
52
71
|
<Text bold={isActive}>{option.label}</Text>
|
|
53
72
|
{option.description && (
|
|
54
|
-
<Text color={C.overlay1}>{" " + option.description}</Text>
|
|
73
|
+
<Text color={C.overlay1}>{" — " + option.description}</Text>
|
|
55
74
|
)}
|
|
56
75
|
</Text>
|
|
57
76
|
);
|
|
58
77
|
})}
|
|
78
|
+
{showScrollDown && (
|
|
79
|
+
<Text>
|
|
80
|
+
<Text color={C.overlay1}>{"│ "}</Text>
|
|
81
|
+
<Text color={C.overlay1}>{"↓ more"}</Text>
|
|
82
|
+
</Text>
|
|
83
|
+
)}
|
|
84
|
+
<Text color={C.overlay1}>{"│ "}{" ↑↓ move, enter select"}</Text>
|
|
59
85
|
</Box>
|
|
60
86
|
);
|
|
61
87
|
}
|
|
@@ -133,17 +159,17 @@ export function GutteredMultiSelect({
|
|
|
133
159
|
return (
|
|
134
160
|
<Box flexDirection="column">
|
|
135
161
|
{currentSelections.length > 0 && (
|
|
136
|
-
<
|
|
162
|
+
<Box flexDirection="row">
|
|
137
163
|
<Text color={C.overlay1}>{"│ "}</Text>
|
|
138
164
|
<Text color={C.green}>{"Selected: "}</Text>
|
|
139
165
|
<Text>{currentSelections.join(", ")}</Text>
|
|
140
|
-
</
|
|
166
|
+
</Box>
|
|
141
167
|
)}
|
|
142
|
-
<
|
|
168
|
+
<Box flexDirection="row">
|
|
143
169
|
<Text color={C.overlay1}>{"│ "}</Text>
|
|
144
170
|
<Text bold>{"Add custom (comma-separated):"}</Text>
|
|
145
|
-
</
|
|
146
|
-
<
|
|
171
|
+
</Box>
|
|
172
|
+
<Box flexDirection="row">
|
|
147
173
|
<Text color={C.overlay1}>{"│ "}</Text>
|
|
148
174
|
<TextInput
|
|
149
175
|
placeholder={customPlaceholder ?? "Type here, press enter to confirm"}
|
|
@@ -152,7 +178,7 @@ export function GutteredMultiSelect({
|
|
|
152
178
|
onSubmit([...currentSelections, ...custom]);
|
|
153
179
|
}}
|
|
154
180
|
/>
|
|
155
|
-
</
|
|
181
|
+
</Box>
|
|
156
182
|
</Box>
|
|
157
183
|
);
|
|
158
184
|
}
|
|
@@ -23,7 +23,7 @@ interface Preset {
|
|
|
23
23
|
const PRESETS: Record<string, Preset> = {
|
|
24
24
|
"typescript-node": {
|
|
25
25
|
label: "TypeScript + Node.js",
|
|
26
|
-
description: "
|
|
26
|
+
description: "CLI tools, backend APIs, npm packages",
|
|
27
27
|
answers: {
|
|
28
28
|
language: "TypeScript",
|
|
29
29
|
framework: "Node.js",
|
|
@@ -42,7 +42,7 @@ const PRESETS: Record<string, Preset> = {
|
|
|
42
42
|
},
|
|
43
43
|
"nextjs-fullstack": {
|
|
44
44
|
label: "Next.js Full-Stack",
|
|
45
|
-
description: "
|
|
45
|
+
description: "SaaS apps, marketing sites, SSR/SSG",
|
|
46
46
|
answers: {
|
|
47
47
|
language: "TypeScript",
|
|
48
48
|
framework: "Next.js",
|
|
@@ -61,7 +61,7 @@ const PRESETS: Record<string, Preset> = {
|
|
|
61
61
|
},
|
|
62
62
|
"react-spa": {
|
|
63
63
|
label: "React SPA",
|
|
64
|
-
description: "
|
|
64
|
+
description: "Dashboards, admin panels, SPAs",
|
|
65
65
|
answers: {
|
|
66
66
|
language: "TypeScript",
|
|
67
67
|
framework: "React",
|
|
@@ -80,7 +80,7 @@ const PRESETS: Record<string, Preset> = {
|
|
|
80
80
|
},
|
|
81
81
|
"python-fastapi": {
|
|
82
82
|
label: "Python + FastAPI",
|
|
83
|
-
description: "
|
|
83
|
+
description: "AI/ML backends, REST APIs, data services",
|
|
84
84
|
answers: {
|
|
85
85
|
language: "Python",
|
|
86
86
|
framework: "FastAPI",
|
|
@@ -99,7 +99,7 @@ const PRESETS: Record<string, Preset> = {
|
|
|
99
99
|
},
|
|
100
100
|
"go-service": {
|
|
101
101
|
label: "Go HTTP Service",
|
|
102
|
-
description: "
|
|
102
|
+
description: "High-perf APIs, microservices",
|
|
103
103
|
answers: {
|
|
104
104
|
language: "Go",
|
|
105
105
|
framework: "net/http",
|
|
@@ -118,7 +118,7 @@ const PRESETS: Record<string, Preset> = {
|
|
|
118
118
|
},
|
|
119
119
|
"react-native-expo": {
|
|
120
120
|
label: "React Native + Expo",
|
|
121
|
-
description: "
|
|
121
|
+
description: "Cross-platform mobile apps (iOS + Android)",
|
|
122
122
|
answers: {
|
|
123
123
|
language: "TypeScript",
|
|
124
124
|
framework: "React Native",
|
|
@@ -146,7 +146,7 @@ const QUICKSTART_OPTIONS = [
|
|
|
146
146
|
{
|
|
147
147
|
label: "Configure manually →",
|
|
148
148
|
value: "advanced",
|
|
149
|
-
description: "Choose
|
|
149
|
+
description: "Choose language, framework, and code style",
|
|
150
150
|
},
|
|
151
151
|
];
|
|
152
152
|
|