procedure-cli 0.1.4 → 0.1.6
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/CLAUDE.md +2 -0
- package/CODE-FIXED.md +22 -0
- package/CODE-REVIEW.md +34 -0
- package/dist/app.js +2 -1
- package/dist/app.js.map +1 -1
- package/dist/components/banner.js +2 -1
- package/dist/components/banner.js.map +1 -1
- package/dist/components/gutter-line.js +3 -2
- package/dist/components/gutter-line.js.map +1 -1
- package/dist/components/guttered-select.js +5 -4
- package/dist/components/guttered-select.js.map +1 -1
- package/dist/components/step-indicator.js +4 -3
- package/dist/components/step-indicator.js.map +1 -1
- package/dist/components/timeline.js +10 -6
- package/dist/components/timeline.js.map +1 -1
- package/dist/steps/architecture.js +2 -1
- package/dist/steps/architecture.js.map +1 -1
- package/dist/steps/build-test.js +2 -1
- package/dist/steps/build-test.js.map +1 -1
- package/dist/steps/generation.js +4 -3
- package/dist/steps/generation.js.map +1 -1
- package/dist/steps/powerline.js +4 -3
- package/dist/steps/powerline.js.map +1 -1
- package/dist/steps/product-context.js +3 -2
- package/dist/steps/product-context.js.map +1 -1
- package/dist/steps/project-info.js +3 -2
- package/dist/steps/project-info.js.map +1 -1
- package/dist/steps/stack-style.js +3 -2
- package/dist/steps/stack-style.js.map +1 -1
- package/dist/theme.d.ts +15 -0
- package/dist/theme.js +16 -0
- package/dist/theme.js.map +1 -0
- package/package.json +1 -1
- package/src/app.tsx +6 -5
- package/src/components/banner.tsx +4 -4
- package/src/components/gutter-line.tsx +3 -2
- package/src/components/guttered-select.tsx +20 -19
- package/src/components/step-indicator.tsx +4 -3
- package/src/components/timeline.tsx +12 -8
- package/src/steps/architecture.tsx +3 -2
- package/src/steps/build-test.tsx +4 -3
- package/src/steps/generation.tsx +12 -11
- package/src/steps/powerline.tsx +8 -7
- package/src/steps/product-context.tsx +3 -2
- package/src/steps/project-info.tsx +3 -2
- package/src/steps/stack-style.tsx +4 -3
- package/src/theme.ts +15 -0
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"product-context.js","sourceRoot":"","sources":["../../src/steps/product-context.tsx"],"names":[],"mappings":";AAAA,OAAc,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AACxC,OAAO,EAAE,IAAI,EAAE,MAAM,KAAK,CAAC;AAC3B,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AACtC,OAAO,EAAE,UAAU,EAAE,MAAM,8BAA8B,CAAC;AAC1D,OAAO,EAAE,mBAAmB,EAAE,MAAM,kCAAkC,CAAC;
|
|
1
|
+
{"version":3,"file":"product-context.js","sourceRoot":"","sources":["../../src/steps/product-context.tsx"],"names":[],"mappings":"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"}
|
|
@@ -4,6 +4,7 @@ import { Text } from "ink";
|
|
|
4
4
|
import { TextInput } from "@inkjs/ui";
|
|
5
5
|
import { GutterLine } from "../components/gutter-line.js";
|
|
6
6
|
import { GutteredSelect } from "../components/guttered-select.js";
|
|
7
|
+
import { C } from "../theme.js";
|
|
7
8
|
const STEP_ORDER = [
|
|
8
9
|
"projectName",
|
|
9
10
|
"description",
|
|
@@ -55,7 +56,7 @@ export default function ProjectInfo({ onComplete }) {
|
|
|
55
56
|
};
|
|
56
57
|
}
|
|
57
58
|
// Render completed fields
|
|
58
|
-
const completed = STEP_ORDER.slice(0, stepIndex).map((key) => (_jsx(GutterLine, { children: _jsxs(Text, {
|
|
59
|
-
return (_jsxs(_Fragment, { children: [completed, currentStep === "projectName" && (_jsxs(GutterLine, { children: [_jsx(Text, { bold: true, children: "Project name: " }), _jsx(TextInput, { placeholder: "...", onSubmit: handleTextSubmit })] })), currentStep === "description" && (_jsxs(GutterLine, { children: [_jsx(Text, { bold: true, children: "One-line description: " }), _jsx(TextInput, { placeholder: "...", onSubmit: handleTextSubmit })] })), currentStep === "packageManager" && (_jsxs(_Fragment, { children: [_jsx(GutterLine, { children: _jsx(Text, { bold: true, children: "Package manager:" }) }), _jsx(GutteredSelect, { options: PACKAGE_MANAGER_OPTIONS, onChange: handleSelectChange("packageManager") })] })), currentStep === "license" && (_jsxs(_Fragment, { children: [_jsx(GutterLine, { children: _jsx(Text, { bold: true, children: "License:" }) }), _jsx(GutteredSelect, { options: LICENSE_OPTIONS, onChange: handleSelectChange("license") })] })), error && (_jsx(GutterLine, { children: _jsx(Text, { color:
|
|
59
|
+
const completed = STEP_ORDER.slice(0, stepIndex).map((key) => (_jsx(GutterLine, { children: _jsxs(Text, { color: C.overlay1, children: [key === "projectName" && `Project name: ${answers[key]}`, key === "description" && `Description: ${answers[key]}`, key === "packageManager" && `Package manager: ${answers[key]}`, key === "license" && `License: ${answers[key]}`] }) }, key)));
|
|
60
|
+
return (_jsxs(_Fragment, { children: [completed, currentStep === "projectName" && (_jsxs(GutterLine, { children: [_jsx(Text, { bold: true, children: "Project name: " }), _jsx(TextInput, { placeholder: "...", onSubmit: handleTextSubmit })] })), currentStep === "description" && (_jsxs(GutterLine, { children: [_jsx(Text, { bold: true, children: "One-line description: " }), _jsx(TextInput, { placeholder: "...", onSubmit: handleTextSubmit })] })), currentStep === "packageManager" && (_jsxs(_Fragment, { children: [_jsx(GutterLine, { children: _jsx(Text, { bold: true, children: "Package manager:" }) }), _jsx(GutteredSelect, { options: PACKAGE_MANAGER_OPTIONS, onChange: handleSelectChange("packageManager") })] })), currentStep === "license" && (_jsxs(_Fragment, { children: [_jsx(GutterLine, { children: _jsx(Text, { bold: true, children: "License:" }) }), _jsx(GutteredSelect, { options: LICENSE_OPTIONS, onChange: handleSelectChange("license") })] })), error && (_jsx(GutterLine, { children: _jsx(Text, { color: C.red, children: error }) }))] }));
|
|
60
61
|
}
|
|
61
62
|
//# sourceMappingURL=project-info.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"project-info.js","sourceRoot":"","sources":["../../src/steps/project-info.tsx"],"names":[],"mappings":";AAAA,OAAc,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AACxC,OAAO,EAAE,IAAI,EAAE,MAAM,KAAK,CAAC;AAC3B,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AACtC,OAAO,EAAE,UAAU,EAAE,MAAM,8BAA8B,CAAC;AAC1D,OAAO,EAAE,cAAc,EAAE,MAAM,kCAAkC,CAAC;
|
|
1
|
+
{"version":3,"file":"project-info.js","sourceRoot":"","sources":["../../src/steps/project-info.tsx"],"names":[],"mappings":"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"}
|
|
@@ -3,6 +3,7 @@ import { useState } from "react";
|
|
|
3
3
|
import { Text } from "ink";
|
|
4
4
|
import { GutterLine } from "../components/gutter-line.js";
|
|
5
5
|
import { GutteredSelect, GutteredMultiSelect } from "../components/guttered-select.js";
|
|
6
|
+
import { C } from "../theme.js";
|
|
6
7
|
const PRESET_OPTIONS = [
|
|
7
8
|
{ label: "TypeScript + Node.js", value: "typescript-node" },
|
|
8
9
|
];
|
|
@@ -99,13 +100,13 @@ export default function StackStyle({ onComplete }) {
|
|
|
99
100
|
} })] }));
|
|
100
101
|
}
|
|
101
102
|
if (advStep === "framework") {
|
|
102
|
-
return (_jsxs(_Fragment, { children: [_jsx(GutterLine, { children: _jsxs(Text, {
|
|
103
|
+
return (_jsxs(_Fragment, { children: [_jsx(GutterLine, { children: _jsxs(Text, { color: C.overlay1, children: ["Languages: ", selectedLanguages.join(", ")] }) }), _jsx(GutterLine, { children: _jsx(Text, { bold: true, children: "Frameworks:" }) }), _jsx(GutteredMultiSelect, { options: FRAMEWORK_OPTIONS, initialSelected: getFrameworkPreselect(selectedLanguages), allowCustom: true, customPlaceholder: "e.g. Hono, Remix, Astro", onSubmit: (values) => {
|
|
103
104
|
setSelectedFrameworks(values);
|
|
104
105
|
setAdvancedStep("codeStyle");
|
|
105
106
|
} })] }));
|
|
106
107
|
}
|
|
107
108
|
// codeStyle step
|
|
108
|
-
return (_jsxs(_Fragment, { children: [_jsx(GutterLine, { children: _jsxs(Text, {
|
|
109
|
+
return (_jsxs(_Fragment, { children: [_jsx(GutterLine, { children: _jsxs(Text, { color: C.overlay1, children: ["Languages: ", selectedLanguages.join(", ")] }) }), _jsx(GutterLine, { children: _jsxs(Text, { color: C.overlay1, children: ["Frameworks: ", selectedFrameworks.join(", ")] }) }), _jsx(GutterLine, { children: _jsx(Text, { bold: true, children: "Code style conventions:" }) }), _jsx(GutteredMultiSelect, { options: CODE_STYLE_OPTIONS, allowCustom: true, customPlaceholder: "e.g. tabs over spaces, max 80 chars", onSubmit: (values) => {
|
|
109
110
|
onComplete({
|
|
110
111
|
language: selectedLanguages.join(", "),
|
|
111
112
|
framework: selectedFrameworks.join(", "),
|
|
@@ -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;
|
|
1
|
+
{"version":3,"file":"stack-style.js","sourceRoot":"","sources":["../../src/steps/stack-style.tsx"],"names":[],"mappings":"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"}
|
package/dist/theme.d.ts
ADDED
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Catppuccin Mocha palette — https://catppuccin.com/palette
|
|
3
|
+
* Use these constants for all terminal colors. Never use named terminal
|
|
4
|
+
* colors (cyan, green, red…) — hex values render consistently across terminals.
|
|
5
|
+
*/
|
|
6
|
+
export declare const C: {
|
|
7
|
+
readonly mauve: "#cba6f7";
|
|
8
|
+
readonly green: "#a6e3a1";
|
|
9
|
+
readonly sapphire: "#74c7ec";
|
|
10
|
+
readonly teal: "#94e2d5";
|
|
11
|
+
readonly red: "#f38ba8";
|
|
12
|
+
readonly peach: "#fab387";
|
|
13
|
+
readonly overlay1: "#7f849c";
|
|
14
|
+
readonly overlay0: "#6c7086";
|
|
15
|
+
};
|
package/dist/theme.js
ADDED
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Catppuccin Mocha palette — https://catppuccin.com/palette
|
|
3
|
+
* Use these constants for all terminal colors. Never use named terminal
|
|
4
|
+
* colors (cyan, green, red…) — hex values render consistently across terminals.
|
|
5
|
+
*/
|
|
6
|
+
export const C = {
|
|
7
|
+
mauve: '#cba6f7', // active step, current focus
|
|
8
|
+
green: '#a6e3a1', // completed steps, success
|
|
9
|
+
sapphire: '#74c7ec', // section headers, accent
|
|
10
|
+
teal: '#94e2d5', // secondary accent (custom option)
|
|
11
|
+
red: '#f38ba8', // errors
|
|
12
|
+
peach: '#fab387', // warnings
|
|
13
|
+
overlay1: '#7f849c', // gutter lines, dim text, hints
|
|
14
|
+
overlay0: '#6c7086', // pending steps, very dim
|
|
15
|
+
};
|
|
16
|
+
//# sourceMappingURL=theme.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"theme.js","sourceRoot":"","sources":["../src/theme.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,MAAM,CAAC,MAAM,CAAC,GAAG;IACf,KAAK,EAAK,SAAS,EAAG,6BAA6B;IACnD,KAAK,EAAK,SAAS,EAAG,2BAA2B;IACjD,QAAQ,EAAE,SAAS,EAAG,0BAA0B;IAChD,IAAI,EAAM,SAAS,EAAG,mCAAmC;IACzD,GAAG,EAAO,SAAS,EAAG,SAAS;IAC/B,KAAK,EAAK,SAAS,EAAG,WAAW;IACjC,QAAQ,EAAE,SAAS,EAAG,gCAAgC;IACtD,QAAQ,EAAE,SAAS,EAAG,0BAA0B;CACxC,CAAC"}
|
package/package.json
CHANGED
package/src/app.tsx
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import React, { useState } from "react";
|
|
2
2
|
import { Box, Text, useInput } from "ink";
|
|
3
|
+
import { C } from "./theme.js";
|
|
3
4
|
import type { WizardAnswers } from "./lib/types.js";
|
|
4
5
|
import type { TimelineStep } from "./components/timeline.js";
|
|
5
6
|
|
|
@@ -133,24 +134,24 @@ export default function App() {
|
|
|
133
134
|
<Box />
|
|
134
135
|
</Timeline>
|
|
135
136
|
<Box marginTop={1} flexDirection="column">
|
|
136
|
-
<Text bold color=
|
|
137
|
+
<Text bold color={C.green}>
|
|
137
138
|
{"✔"} Procedure CLI setup complete!
|
|
138
139
|
</Text>
|
|
139
140
|
<Text> </Text>
|
|
140
141
|
{answers.generationSkipped ? (
|
|
141
|
-
<Text
|
|
142
|
+
<Text color={C.overlay1}>Generation was skipped — no files were written.</Text>
|
|
142
143
|
) : (
|
|
143
144
|
<>
|
|
144
145
|
<Text>
|
|
145
|
-
Project <Text bold color=
|
|
146
|
+
Project <Text bold color={C.sapphire}>"{answers.projectName}"</Text> has been scaffolded.
|
|
146
147
|
</Text>
|
|
147
|
-
<Text
|
|
148
|
+
<Text color={C.overlay1}>
|
|
148
149
|
Check the generated CLAUDE.md, PRD.md, and USER-STORIES.md.
|
|
149
150
|
</Text>
|
|
150
151
|
</>
|
|
151
152
|
)}
|
|
152
153
|
<Text> </Text>
|
|
153
|
-
<Text
|
|
154
|
+
<Text color={C.overlay1}>Press Enter to exit.</Text>
|
|
154
155
|
</Box>
|
|
155
156
|
</Box>
|
|
156
157
|
);
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import React from "react";
|
|
2
2
|
import { Box, Text } from "ink";
|
|
3
|
+
import { C } from "../theme.js";
|
|
3
4
|
|
|
4
5
|
const BANNER_LINES = [
|
|
5
6
|
"█▀█ █▀█ █▀█ █▀▀ █▀▀ █▀▄ █ █ █▀█ █▀▀",
|
|
@@ -11,13 +12,12 @@ export default function Banner() {
|
|
|
11
12
|
return (
|
|
12
13
|
<Box flexDirection="column" marginBottom={0}>
|
|
13
14
|
{BANNER_LINES.map((line, i) => (
|
|
14
|
-
<Text key={i} color=
|
|
15
|
+
<Text key={i} color={C.mauve}>
|
|
15
16
|
{line}
|
|
16
17
|
</Text>
|
|
17
18
|
))}
|
|
18
|
-
<Text>
|
|
19
|
-
<Text>
|
|
20
|
-
<Text dimColor>{"─".repeat(43)}</Text>
|
|
19
|
+
<Text>Bootsrap any project with a battle-tested Claude.md</Text>
|
|
20
|
+
<Text color={C.overlay1}>{"─".repeat(43)}</Text>
|
|
21
21
|
</Box>
|
|
22
22
|
);
|
|
23
23
|
}
|
|
@@ -1,10 +1,11 @@
|
|
|
1
1
|
import React from "react";
|
|
2
2
|
import { Text } from "ink";
|
|
3
|
+
import { C } from "../theme.js";
|
|
3
4
|
|
|
4
5
|
export function GutterLine({ children }: { children?: React.ReactNode }) {
|
|
5
|
-
return <Text><Text
|
|
6
|
+
return <Text><Text color={C.overlay1}>{"│ "}</Text>{children}</Text>;
|
|
6
7
|
}
|
|
7
8
|
|
|
8
9
|
export function EmptyGutter() {
|
|
9
|
-
return <Text
|
|
10
|
+
return <Text color={C.overlay1}>{"│"}</Text>;
|
|
10
11
|
}
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import React, { useState } from "react";
|
|
2
2
|
import { Box, Text, useInput } from "ink";
|
|
3
3
|
import { TextInput } from "@inkjs/ui";
|
|
4
|
+
import { C } from "../theme.js";
|
|
4
5
|
// Note: Box flexDirection="column" kept here for multi-option rendering
|
|
5
6
|
|
|
6
7
|
interface Option {
|
|
@@ -42,15 +43,15 @@ export function GutteredSelect({ options, onChange }: GutteredSelectProps) {
|
|
|
42
43
|
const isActive = index === activeIndex;
|
|
43
44
|
return (
|
|
44
45
|
<Text key={option.value}>
|
|
45
|
-
<Text
|
|
46
|
+
<Text color={C.overlay1}>{"│ "}</Text>
|
|
46
47
|
{isActive ? (
|
|
47
|
-
<Text color=
|
|
48
|
+
<Text color={C.mauve} bold>{"❯ "}</Text>
|
|
48
49
|
) : (
|
|
49
50
|
<Text>{" "}</Text>
|
|
50
51
|
)}
|
|
51
52
|
<Text bold={isActive}>{option.label}</Text>
|
|
52
53
|
{option.description && (
|
|
53
|
-
<Text
|
|
54
|
+
<Text color={C.overlay1}>{" " + option.description}</Text>
|
|
54
55
|
)}
|
|
55
56
|
</Text>
|
|
56
57
|
);
|
|
@@ -133,17 +134,17 @@ export function GutteredMultiSelect({
|
|
|
133
134
|
<Box flexDirection="column">
|
|
134
135
|
{currentSelections.length > 0 && (
|
|
135
136
|
<Text>
|
|
136
|
-
<Text
|
|
137
|
-
<Text color=
|
|
137
|
+
<Text color={C.overlay1}>{"│ "}</Text>
|
|
138
|
+
<Text color={C.green}>{"Selected: "}</Text>
|
|
138
139
|
<Text>{currentSelections.join(", ")}</Text>
|
|
139
140
|
</Text>
|
|
140
141
|
)}
|
|
141
142
|
<Text>
|
|
142
|
-
<Text
|
|
143
|
+
<Text color={C.overlay1}>{"│ "}</Text>
|
|
143
144
|
<Text bold>{"Add custom (comma-separated):"}</Text>
|
|
144
145
|
</Text>
|
|
145
146
|
<Text>
|
|
146
|
-
<Text
|
|
147
|
+
<Text color={C.overlay1}>{"│ "}</Text>
|
|
147
148
|
<TextInput
|
|
148
149
|
placeholder={customPlaceholder ?? "Type here, press enter to confirm"}
|
|
149
150
|
onSubmit={(value) => {
|
|
@@ -164,39 +165,39 @@ export function GutteredMultiSelect({
|
|
|
164
165
|
const isCustomOption = option.value === CUSTOM_SENTINEL;
|
|
165
166
|
return (
|
|
166
167
|
<Text key={option.value}>
|
|
167
|
-
<Text
|
|
168
|
+
<Text color={C.overlay1}>{"│ "}</Text>
|
|
168
169
|
{isActive ? (
|
|
169
|
-
<Text color=
|
|
170
|
+
<Text color={C.mauve} bold>{"❯ "}</Text>
|
|
170
171
|
) : (
|
|
171
172
|
<Text>{" "}</Text>
|
|
172
173
|
)}
|
|
173
174
|
{isSelected ? (
|
|
174
|
-
<Text color={isCustomOption ?
|
|
175
|
+
<Text color={isCustomOption ? C.teal : C.green}>{"● "}</Text>
|
|
175
176
|
) : (
|
|
176
|
-
<Text
|
|
177
|
+
<Text color={C.overlay0}>{"○ "}</Text>
|
|
177
178
|
)}
|
|
178
179
|
<Text bold={isActive}>{isCustomOption ? `✎ ${option.label}` : option.label}</Text>
|
|
179
180
|
{option.description && (
|
|
180
|
-
<Text
|
|
181
|
+
<Text color={C.overlay1}>{" — " + option.description}</Text>
|
|
181
182
|
)}
|
|
182
183
|
</Text>
|
|
183
184
|
);
|
|
184
185
|
})}
|
|
185
|
-
<Text
|
|
186
|
+
<Text color={C.overlay1}>{"│ "}{" ↑↓ move, space toggle, enter confirm"}</Text>
|
|
186
187
|
{selected.size > 0 && !selected.has(CUSTOM_SENTINEL) && (
|
|
187
188
|
<Text>
|
|
188
|
-
<Text
|
|
189
|
-
<Text color=
|
|
189
|
+
<Text color={C.overlay1}>{"│ "}</Text>
|
|
190
|
+
<Text color={C.green}>{"Selected: "}</Text>
|
|
190
191
|
<Text>{Array.from(selected).join(", ")}</Text>
|
|
191
192
|
</Text>
|
|
192
193
|
)}
|
|
193
194
|
{selected.size > 0 && selected.has(CUSTOM_SENTINEL) && (
|
|
194
195
|
<Text>
|
|
195
|
-
<Text
|
|
196
|
-
<Text color=
|
|
196
|
+
<Text color={C.overlay1}>{"│ "}</Text>
|
|
197
|
+
<Text color={C.green}>{"Selected: "}</Text>
|
|
197
198
|
<Text>{Array.from(selected).filter((v) => v !== CUSTOM_SENTINEL).join(", ")}</Text>
|
|
198
|
-
{selected.size > 1 && <Text
|
|
199
|
-
{selected.size === 1 && <Text
|
|
199
|
+
{selected.size > 1 && <Text color={C.overlay1}>{" + custom"}</Text>}
|
|
200
|
+
{selected.size === 1 && <Text color={C.overlay1}>{"custom (on confirm)"}</Text>}
|
|
200
201
|
</Text>
|
|
201
202
|
)}
|
|
202
203
|
</Box>
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import React, { useEffect, useState } from "react";
|
|
2
2
|
import { Text } from "ink";
|
|
3
|
+
import { C } from "../theme.js";
|
|
3
4
|
|
|
4
5
|
export type StepStatus = "completed" | "active" | "pending";
|
|
5
6
|
|
|
@@ -22,10 +23,10 @@ export default function StepIndicator({ status, label }: Props) {
|
|
|
22
23
|
}, [status]);
|
|
23
24
|
|
|
24
25
|
if (status === "completed") {
|
|
25
|
-
return <Text><Text color=
|
|
26
|
+
return <Text><Text color={C.green}>{"◇"}</Text>{" "}<Text color={C.green}>{label}</Text></Text>;
|
|
26
27
|
}
|
|
27
28
|
if (status === "active") {
|
|
28
|
-
return <Text><Text color=
|
|
29
|
+
return <Text><Text color={C.mauve} bold>{ACTIVE_FRAMES[frame]}</Text>{" "}<Text bold color={C.mauve}>{label}</Text></Text>;
|
|
29
30
|
}
|
|
30
|
-
return <Text><Text
|
|
31
|
+
return <Text><Text color={C.overlay0}>{"○"}</Text>{" "}<Text color={C.overlay0}>{label}</Text></Text>;
|
|
31
32
|
}
|
|
@@ -2,6 +2,7 @@ import React from "react";
|
|
|
2
2
|
import { Box, Text } from "ink";
|
|
3
3
|
import StepIndicator from "./step-indicator.js";
|
|
4
4
|
import type { StepStatus } from "./step-indicator.js";
|
|
5
|
+
import { C } from "../theme.js";
|
|
5
6
|
|
|
6
7
|
export interface TimelineStep {
|
|
7
8
|
name: string;
|
|
@@ -17,6 +18,9 @@ interface Props {
|
|
|
17
18
|
export default function Timeline({ steps, children }: Props) {
|
|
18
19
|
const elements: React.ReactNode[] = [];
|
|
19
20
|
|
|
21
|
+
// Opening corner
|
|
22
|
+
elements.push(<Text key="top" color={C.overlay1}>{"┌"}</Text>);
|
|
23
|
+
|
|
20
24
|
steps.forEach((step, i) => {
|
|
21
25
|
const isLast = i === steps.length - 1;
|
|
22
26
|
const isActive = step.status === "active";
|
|
@@ -29,25 +33,25 @@ export default function Timeline({ steps, children }: Props) {
|
|
|
29
33
|
// Completed step: show summary on SEPARATE line with gutter
|
|
30
34
|
if (step.status === "completed" && step.summary) {
|
|
31
35
|
elements.push(
|
|
32
|
-
<Text key={`sum-${i}`}
|
|
36
|
+
<Text key={`sum-${i}`} color={C.overlay1}>{"│ "}{step.summary}</Text>
|
|
33
37
|
);
|
|
34
38
|
}
|
|
35
39
|
|
|
36
|
-
// Active step: render children
|
|
40
|
+
// Active step: render children (they handle their own GutterLine)
|
|
37
41
|
if (isActive) {
|
|
38
42
|
elements.push(
|
|
39
43
|
<React.Fragment key={`content-${i}`}>{children}</React.Fragment>
|
|
40
44
|
);
|
|
41
|
-
elements.push(
|
|
42
|
-
<Text key={`close-${i}`} dimColor>{"└"}</Text>
|
|
43
|
-
);
|
|
44
45
|
}
|
|
45
46
|
|
|
46
|
-
// Gutter spacer between steps
|
|
47
|
-
if (!isLast
|
|
48
|
-
elements.push(<Text key={`bar-${i}`}
|
|
47
|
+
// Gutter spacer between steps
|
|
48
|
+
if (!isLast) {
|
|
49
|
+
elements.push(<Text key={`bar-${i}`} color={C.overlay1}>{"│"}</Text>);
|
|
49
50
|
}
|
|
50
51
|
});
|
|
51
52
|
|
|
53
|
+
// Closing corner
|
|
54
|
+
elements.push(<Text key="bottom" color={C.overlay1}>{"└"}</Text>);
|
|
55
|
+
|
|
52
56
|
return <Box flexDirection="column">{elements}</Box>;
|
|
53
57
|
}
|
|
@@ -3,6 +3,7 @@ import { Text } from "ink";
|
|
|
3
3
|
import { GutterLine } from "../components/gutter-line.js";
|
|
4
4
|
import { GutteredSelect } from "../components/guttered-select.js";
|
|
5
5
|
import type { WizardAnswers } from "../lib/types.js";
|
|
6
|
+
import { C } from "../theme.js";
|
|
6
7
|
|
|
7
8
|
interface Props {
|
|
8
9
|
onComplete: (answers: Partial<WizardAnswers>) => void;
|
|
@@ -51,10 +52,10 @@ export default function Architecture({ onComplete }: Props) {
|
|
|
51
52
|
return (
|
|
52
53
|
<>
|
|
53
54
|
<GutterLine>
|
|
54
|
-
<Text
|
|
55
|
+
<Text color={C.overlay1}>Architecture: {selected}</Text>
|
|
55
56
|
</GutterLine>
|
|
56
57
|
<GutterLine>
|
|
57
|
-
<Text
|
|
58
|
+
<Text color={C.overlay1}>Notes: {ARCHITECTURE_NOTES[selected]}</Text>
|
|
58
59
|
</GutterLine>
|
|
59
60
|
</>
|
|
60
61
|
);
|
package/src/steps/build-test.tsx
CHANGED
|
@@ -3,6 +3,7 @@ import { Text } from "ink";
|
|
|
3
3
|
import { TextInput } from "@inkjs/ui";
|
|
4
4
|
import { GutterLine } from "../components/gutter-line.js";
|
|
5
5
|
import type { WizardAnswers } from "../lib/types.js";
|
|
6
|
+
import { C } from "../theme.js";
|
|
6
7
|
|
|
7
8
|
interface Props {
|
|
8
9
|
initialValues?: Partial<WizardAnswers>;
|
|
@@ -56,7 +57,7 @@ export default function BuildTest({ initialValues, onComplete }: Props) {
|
|
|
56
57
|
<>
|
|
57
58
|
{FIELDS.slice(0, fieldIndex).map((f) => (
|
|
58
59
|
<GutterLine key={f.key}>
|
|
59
|
-
<Text
|
|
60
|
+
<Text color={C.overlay1}>
|
|
60
61
|
{f.label}: {answers[f.key]}
|
|
61
62
|
</Text>
|
|
62
63
|
</GutterLine>
|
|
@@ -64,13 +65,13 @@ export default function BuildTest({ initialValues, onComplete }: Props) {
|
|
|
64
65
|
|
|
65
66
|
<GutterLine>
|
|
66
67
|
<Text bold>{current.label}</Text>
|
|
67
|
-
<Text
|
|
68
|
+
<Text color={C.overlay1}> ({defaultVal})</Text>
|
|
68
69
|
<Text bold>: </Text>
|
|
69
70
|
<TextInput placeholder={defaultVal} onSubmit={handleSubmit} />
|
|
70
71
|
</GutterLine>
|
|
71
72
|
{error && (
|
|
72
73
|
<GutterLine>
|
|
73
|
-
<Text color=
|
|
74
|
+
<Text color={C.red}>{error}</Text>
|
|
74
75
|
</GutterLine>
|
|
75
76
|
)}
|
|
76
77
|
</>
|
package/src/steps/generation.tsx
CHANGED
|
@@ -11,6 +11,7 @@ import {
|
|
|
11
11
|
} from "../lib/template.js";
|
|
12
12
|
import { homeBinPath } from "../lib/fs.js";
|
|
13
13
|
import type { WizardAnswers } from "../lib/types.js";
|
|
14
|
+
import { C } from "../theme.js";
|
|
14
15
|
|
|
15
16
|
interface Props {
|
|
16
17
|
answers: WizardAnswers;
|
|
@@ -110,7 +111,7 @@ export default function Generation({ answers, onComplete }: Props) {
|
|
|
110
111
|
<>
|
|
111
112
|
{/* ── Project Info ── */}
|
|
112
113
|
<GutterLine>
|
|
113
|
-
<Text bold color=
|
|
114
|
+
<Text bold color={C.sapphire}>Project Info</Text>
|
|
114
115
|
</GutterLine>
|
|
115
116
|
<GutterLine>
|
|
116
117
|
<Text>
|
|
@@ -129,7 +130,7 @@ export default function Generation({ answers, onComplete }: Props) {
|
|
|
129
130
|
<Text> </Text>
|
|
130
131
|
</GutterLine>
|
|
131
132
|
<GutterLine>
|
|
132
|
-
<Text bold color=
|
|
133
|
+
<Text bold color={C.sapphire}>Stack & Style</Text>
|
|
133
134
|
</GutterLine>
|
|
134
135
|
<GutterLine>
|
|
135
136
|
<Text> Language: {answers.language || "N/A"} | Framework: {answers.framework || "N/A"}</Text>
|
|
@@ -143,7 +144,7 @@ export default function Generation({ answers, onComplete }: Props) {
|
|
|
143
144
|
<Text> </Text>
|
|
144
145
|
</GutterLine>
|
|
145
146
|
<GutterLine>
|
|
146
|
-
<Text bold color=
|
|
147
|
+
<Text bold color={C.sapphire}>Build & Test</Text>
|
|
147
148
|
</GutterLine>
|
|
148
149
|
<GutterLine>
|
|
149
150
|
<Text> Build: {answers.buildCommand || "N/A"} | Test: {answers.testCommand || "N/A"}</Text>
|
|
@@ -166,7 +167,7 @@ export default function Generation({ answers, onComplete }: Props) {
|
|
|
166
167
|
<Text> </Text>
|
|
167
168
|
</GutterLine>
|
|
168
169
|
<GutterLine>
|
|
169
|
-
<Text bold color=
|
|
170
|
+
<Text bold color={C.sapphire}>Architecture</Text>
|
|
170
171
|
</GutterLine>
|
|
171
172
|
<GutterLine>
|
|
172
173
|
<Text> {answers.architecture || "N/A"}</Text>
|
|
@@ -177,7 +178,7 @@ export default function Generation({ answers, onComplete }: Props) {
|
|
|
177
178
|
<Text> </Text>
|
|
178
179
|
</GutterLine>
|
|
179
180
|
<GutterLine>
|
|
180
|
-
<Text bold color=
|
|
181
|
+
<Text bold color={C.sapphire}>Product Context</Text>
|
|
181
182
|
</GutterLine>
|
|
182
183
|
<GutterLine>
|
|
183
184
|
<Text> Problem: {answers.problem || "N/A"}</Text>
|
|
@@ -204,14 +205,14 @@ export default function Generation({ answers, onComplete }: Props) {
|
|
|
204
205
|
<Text> </Text>
|
|
205
206
|
</GutterLine>
|
|
206
207
|
<GutterLine>
|
|
207
|
-
<Text bold color=
|
|
208
|
+
<Text bold color={C.sapphire}>Files to generate</Text>
|
|
208
209
|
</GutterLine>
|
|
209
210
|
<GutterLine>
|
|
210
211
|
<Text> {FILES_TO_GENERATE.join(", ")}</Text>
|
|
211
212
|
</GutterLine>
|
|
212
213
|
{conflicts.length > 0 && (
|
|
213
214
|
<GutterLine>
|
|
214
|
-
<Text color=
|
|
215
|
+
<Text color={C.peach}>
|
|
215
216
|
{" ⚠ Will overwrite: "}{conflicts.join(", ")}
|
|
216
217
|
</Text>
|
|
217
218
|
</GutterLine>
|
|
@@ -222,7 +223,7 @@ export default function Generation({ answers, onComplete }: Props) {
|
|
|
222
223
|
<Text> </Text>
|
|
223
224
|
</GutterLine>
|
|
224
225
|
<GutterLine>
|
|
225
|
-
<Text bold color=
|
|
226
|
+
<Text bold color={C.sapphire}>Release setup</Text>
|
|
226
227
|
</GutterLine>
|
|
227
228
|
<GutterLine>
|
|
228
229
|
<Text> {scriptDisplay} → {scriptStatus}</Text>
|
|
@@ -254,7 +255,7 @@ export default function Generation({ answers, onComplete }: Props) {
|
|
|
254
255
|
if (phase === "error") {
|
|
255
256
|
return (
|
|
256
257
|
<GutterLine>
|
|
257
|
-
<Text color=
|
|
258
|
+
<Text color={C.red}>Error generating files: {errorMsg}</Text>
|
|
258
259
|
</GutterLine>
|
|
259
260
|
);
|
|
260
261
|
}
|
|
@@ -262,11 +263,11 @@ export default function Generation({ answers, onComplete }: Props) {
|
|
|
262
263
|
return (
|
|
263
264
|
<>
|
|
264
265
|
<GutterLine>
|
|
265
|
-
<Text color=
|
|
266
|
+
<Text color={C.green}>All project files generated successfully.</Text>
|
|
266
267
|
</GutterLine>
|
|
267
268
|
{releaseResult && (
|
|
268
269
|
<GutterLine>
|
|
269
|
-
<Text color=
|
|
270
|
+
<Text color={C.green}>Release: {releaseResult}</Text>
|
|
270
271
|
</GutterLine>
|
|
271
272
|
)}
|
|
272
273
|
</>
|