procedure-cli 0.1.12 → 0.1.14
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/README.md +15 -3
- package/dist/steps/build-test.js +32 -3
- package/dist/steps/build-test.js.map +1 -1
- package/dist/steps/powerline.js +11 -3
- package/dist/steps/powerline.js.map +1 -1
- package/dist/steps/product-context.js +54 -19
- package/dist/steps/product-context.js.map +1 -1
- package/dist/steps/project-info.js +30 -3
- package/dist/steps/project-info.js.map +1 -1
- package/package.json +5 -1
- package/.claude/settings.local.json +0 -26
- package/.env.example +0 -2
- package/AGENTS.md +0 -113
- package/CLAUDE.md +0 -138
- package/CODE-FIXED.md +0 -197
- package/CODE-REVIEW.md +0 -431
- package/config/defaults.json +0 -8
- package/config/powerline-config.json +0 -52
- package/config/stacks/typescript-node.json +0 -15
- package/docs/GIAI-THICH-CLAUDE-MD.md +0 -206
- package/docs/PRD.md +0 -140
- package/docs/USER-STORIES.md +0 -264
- package/src/app.tsx +0 -213
- package/src/cli.tsx +0 -19
- package/src/components/banner.tsx +0 -23
- package/src/components/gutter-line.tsx +0 -16
- package/src/components/guttered-select.tsx +0 -231
- package/src/components/step-indicator.tsx +0 -32
- package/src/components/timeline.tsx +0 -57
- package/src/lib/fs.ts +0 -23
- package/src/lib/git.ts +0 -41
- package/src/lib/powerline.ts +0 -48
- package/src/lib/template.ts +0 -161
- package/src/lib/types.ts +0 -70
- package/src/providers/openai.ts +0 -5
- package/src/providers/zai.ts +0 -7
- package/src/steps/architecture.tsx +0 -72
- package/src/steps/build-test.tsx +0 -79
- package/src/steps/generation.tsx +0 -176
- package/src/steps/powerline.tsx +0 -238
- package/src/steps/product-context.tsx +0 -208
- package/src/steps/project-info.tsx +0 -136
- package/src/steps/stack-style.tsx +0 -304
- package/src/theme.ts +0 -15
- package/tsconfig.json +0 -17
package/README.md
CHANGED
|
@@ -2,15 +2,15 @@
|
|
|
2
2
|
|
|
3
3
|
Interactive CLI wizard that scaffolds new projects with a battle-tested `CLAUDE.md`, PRD, user stories, and optional tooling setup. Inspired by [Skills.sh](https://skills.sh) visual style.
|
|
4
4
|
|
|
5
|
-
##
|
|
6
|
-
|
|
7
|
-
Must be run in an **empty directory**. If the directory has existing files, the CLI exits with a helpful message.
|
|
5
|
+
## Getting Started
|
|
8
6
|
|
|
9
7
|
```bash
|
|
10
8
|
mkdir my-project && cd my-project
|
|
11
9
|
npx @b3awesome/procedure
|
|
12
10
|
```
|
|
13
11
|
|
|
12
|
+
If the directory already has files, the CLI prints a warning and continues. Existing files that would be overwritten are listed explicitly in Step 6 (Generation) before you confirm.
|
|
13
|
+
|
|
14
14
|
## What It Generates
|
|
15
15
|
|
|
16
16
|
| File | Purpose |
|
|
@@ -63,6 +63,18 @@ CLAUDE.md, PRD, user stories, and powerline.
|
|
|
63
63
|
| `○` (dim) | Pending |
|
|
64
64
|
| `┌` / `└` | Open/close corners wrapping the full wizard flow |
|
|
65
65
|
|
|
66
|
+
## In-Step Navigation
|
|
67
|
+
|
|
68
|
+
Within any active step, you can navigate between its input fields without restarting the step:
|
|
69
|
+
|
|
70
|
+
| Key | Action |
|
|
71
|
+
|-----|--------|
|
|
72
|
+
| `Tab` | Go to the **next** field (saves current value) |
|
|
73
|
+
| `Shift+Tab` | Go to the **previous** field (restores saved value) |
|
|
74
|
+
| `Enter` | Confirm current field and advance |
|
|
75
|
+
|
|
76
|
+
`↑`/`↓` retain their original role: navigating **options within** a select or multi-select. They are never used for field-to-field navigation.
|
|
77
|
+
|
|
66
78
|
## The 7 Wizard Steps
|
|
67
79
|
|
|
68
80
|
### 1. Project Info
|
package/dist/steps/build-test.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { jsxs as _jsxs, jsx as _jsx, Fragment as _Fragment } from "react/jsx-runtime";
|
|
2
|
-
import { useState } from "react";
|
|
3
|
-
import { Text } from "ink";
|
|
2
|
+
import { useState, useEffect } from "react";
|
|
3
|
+
import { Text, useInput } from "ink";
|
|
4
4
|
import { TextInput } from "@inkjs/ui";
|
|
5
5
|
import { GutterLine } from "../components/gutter-line.js";
|
|
6
6
|
import { C } from "../theme.js";
|
|
@@ -15,9 +15,36 @@ export default function BuildTest({ initialValues, onComplete }) {
|
|
|
15
15
|
const [fieldIndex, setFieldIndex] = useState(0);
|
|
16
16
|
const [answers, setAnswers] = useState({});
|
|
17
17
|
const [error, setError] = useState("");
|
|
18
|
+
const [liveInput, setLiveInput] = useState("");
|
|
18
19
|
const current = FIELDS[fieldIndex];
|
|
19
20
|
const preset = initialValues?.[current.key];
|
|
20
21
|
const defaultVal = preset || current.fallback;
|
|
22
|
+
// Reset live input when navigating to a different field
|
|
23
|
+
useEffect(() => {
|
|
24
|
+
setLiveInput("");
|
|
25
|
+
}, [fieldIndex]);
|
|
26
|
+
useInput((input, key) => {
|
|
27
|
+
if (key.shift && key.tab && fieldIndex > 0) {
|
|
28
|
+
setFieldIndex((f) => f - 1);
|
|
29
|
+
setError("");
|
|
30
|
+
}
|
|
31
|
+
else if (key.tab && !key.shift) {
|
|
32
|
+
const val = liveInput.trim() || answers[current.key] || defaultVal;
|
|
33
|
+
if (current.required && !val.trim()) {
|
|
34
|
+
setError(`${current.label} is required`);
|
|
35
|
+
return;
|
|
36
|
+
}
|
|
37
|
+
setError("");
|
|
38
|
+
const next = { ...answers, [current.key]: val };
|
|
39
|
+
setAnswers(next);
|
|
40
|
+
if (fieldIndex < FIELDS.length - 1) {
|
|
41
|
+
setFieldIndex((f) => f + 1);
|
|
42
|
+
}
|
|
43
|
+
else {
|
|
44
|
+
onComplete(next);
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
});
|
|
21
48
|
function handleSubmit(value) {
|
|
22
49
|
const val = value.trim() || defaultVal;
|
|
23
50
|
if (current.required && !val) {
|
|
@@ -34,6 +61,8 @@ export default function BuildTest({ initialValues, onComplete }) {
|
|
|
34
61
|
onComplete(next);
|
|
35
62
|
}
|
|
36
63
|
}
|
|
37
|
-
|
|
64
|
+
const isFirst = fieldIndex === 0;
|
|
65
|
+
const isLast = fieldIndex === FIELDS.length - 1;
|
|
66
|
+
return (_jsxs(_Fragment, { children: [FIELDS.slice(0, fieldIndex).map((f) => (_jsx(GutterLine, { children: _jsxs(Text, { color: C.overlay1, children: [f.label, ": ", answers[f.key]] }) }, f.key))), _jsxs(GutterLine, { children: [_jsx(Text, { bold: true, children: current.label }), _jsxs(Text, { color: C.overlay1, children: [" (", defaultVal, ")"] }), _jsx(Text, { bold: true, children: ": " }), _jsx(TextInput, { defaultValue: answers[current.key] || "", placeholder: defaultVal, onChange: setLiveInput, onSubmit: handleSubmit }, current.key)] }), error && (_jsx(GutterLine, { children: _jsx(Text, { color: C.red, children: error }) })), _jsx(GutterLine, { children: _jsxs(Text, { color: C.overlay1, children: [!isFirst ? "Shift+Tab prev " : "", isLast ? "Tab / Enter confirm" : "Tab next Enter confirm"] }) })] }));
|
|
38
67
|
}
|
|
39
68
|
//# sourceMappingURL=build-test.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"build-test.js","sourceRoot":"","sources":["../../src/steps/build-test.tsx"],"names":[],"mappings":";AAAA,OAAc,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;
|
|
1
|
+
{"version":3,"file":"build-test.js","sourceRoot":"","sources":["../../src/steps/build-test.tsx"],"names":[],"mappings":"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"}
|
package/dist/steps/powerline.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
|
|
2
2
|
import { useState } from "react";
|
|
3
|
-
import { Text } from "ink";
|
|
3
|
+
import { Text, useInput } from "ink";
|
|
4
4
|
import { ConfirmInput, Spinner } from "@inkjs/ui";
|
|
5
5
|
import { GutterLine } from "../components/gutter-line.js";
|
|
6
6
|
import { setupPowerline } from "../lib/powerline.js";
|
|
@@ -14,6 +14,14 @@ export default function Powerline({ answers, onComplete }) {
|
|
|
14
14
|
const [wantRelease, setWantRelease] = useState(false);
|
|
15
15
|
const [errorMsg, setErrorMsg] = useState("");
|
|
16
16
|
const [setupResult, setSetupResult] = useState({});
|
|
17
|
+
useInput((input, key) => {
|
|
18
|
+
if (key.shift && key.tab) {
|
|
19
|
+
if (phase === "ask-git")
|
|
20
|
+
setPhase("ask-powerline");
|
|
21
|
+
else if (phase === "ask-release")
|
|
22
|
+
setPhase("ask-git");
|
|
23
|
+
}
|
|
24
|
+
}, { isActive: phase === "ask-git" || phase === "ask-release" });
|
|
17
25
|
function runSetup(powerline, git, release) {
|
|
18
26
|
setPhase("running");
|
|
19
27
|
try {
|
|
@@ -50,12 +58,12 @@ export default function Powerline({ answers, onComplete }) {
|
|
|
50
58
|
}
|
|
51
59
|
// ── Ask: Git ────────────────────────────────────────────────────────────────
|
|
52
60
|
if (phase === "ask-git") {
|
|
53
|
-
return (_jsxs(_Fragment, { children: [wantPowerline && (_jsx(GutterLine, { children: _jsx(Text, { color: C.overlay1, children: "Powerline: yes" }) })), _jsx(GutterLine, { children: _jsx(Text, { bold: true, children: "Git repository" }) }), _jsx(GutterLine, { children: _jsx(Text, { color: C.overlay1, children: "Runs git init and makes an initial commit with the generated" }) }), _jsx(GutterLine, { children: _jsx(Text, { color: C.overlay1, children: "files \u2014 clean starting point for your project history." }) }), _jsx(GutterLine, { children: _jsx(Text, { children: " " }) }), _jsxs(GutterLine, { children: [_jsx(Text, { bold: true, children: "Initialize git repo? " }), _jsx(ConfirmInput, { onConfirm: () => { setWantGit(true); setPhase("ask-release"); }, onCancel: () => { setWantGit(false); setPhase("ask-release"); } })] })] }));
|
|
61
|
+
return (_jsxs(_Fragment, { children: [wantPowerline && (_jsx(GutterLine, { children: _jsx(Text, { color: C.overlay1, children: "Powerline: yes" }) })), _jsx(GutterLine, { children: _jsx(Text, { bold: true, children: "Git repository" }) }), _jsx(GutterLine, { children: _jsx(Text, { color: C.overlay1, children: "Runs git init and makes an initial commit with the generated" }) }), _jsx(GutterLine, { children: _jsx(Text, { color: C.overlay1, children: "files \u2014 clean starting point for your project history." }) }), _jsx(GutterLine, { children: _jsx(Text, { children: " " }) }), _jsxs(GutterLine, { children: [_jsx(Text, { bold: true, children: "Initialize git repo? " }), _jsx(ConfirmInput, { onConfirm: () => { setWantGit(true); setPhase("ask-release"); }, onCancel: () => { setWantGit(false); setPhase("ask-release"); } })] }), _jsx(GutterLine, { children: _jsx(Text, { color: C.overlay1, children: "Shift+Tab prev y/n answer" }) })] }));
|
|
54
62
|
}
|
|
55
63
|
// ── Ask: Release scripts ────────────────────────────────────────────────────
|
|
56
64
|
if (phase === "ask-release") {
|
|
57
65
|
const projectName = answers.projectName || "untitled";
|
|
58
|
-
return (_jsxs(_Fragment, { children: [wantPowerline && (_jsx(GutterLine, { children: _jsx(Text, { color: C.overlay1, children: "Powerline: yes" }) })), wantGit && (_jsx(GutterLine, { children: _jsx(Text, { color: C.overlay1, children: "Git: yes" }) })), _jsx(GutterLine, { children: _jsx(Text, { bold: true, children: "npm release scripts" }) }), _jsx(GutterLine, { children: _jsxs(Text, { color: C.overlay1, children: ["Creates ~/bin/", projectName, "-release and adds release:patch /"] }) }), _jsx(GutterLine, { children: _jsx(Text, { color: C.overlay1, children: "minor / major scripts to package.json. One command to build," }) }), _jsx(GutterLine, { children: _jsx(Text, { color: C.overlay1, children: "version-bump, push tags, and publish to npm." }) }), _jsx(GutterLine, { children: _jsx(Text, { color: C.overlay1, children: "Requires: npm login. Best for packages published to npm." }) }), _jsx(GutterLine, { children: _jsx(Text, { children: " " }) }), _jsxs(GutterLine, { children: [_jsx(Text, { bold: true, children: "Set up release scripts? " }), _jsx(ConfirmInput, { onConfirm: () => { setWantRelease(true); runSetup(wantPowerline, wantGit, true); }, onCancel: () => { setWantRelease(false); runSetup(wantPowerline, wantGit, false); } })] })] }));
|
|
66
|
+
return (_jsxs(_Fragment, { children: [wantPowerline && (_jsx(GutterLine, { children: _jsx(Text, { color: C.overlay1, children: "Powerline: yes" }) })), wantGit && (_jsx(GutterLine, { children: _jsx(Text, { color: C.overlay1, children: "Git: yes" }) })), _jsx(GutterLine, { children: _jsx(Text, { bold: true, children: "npm release scripts" }) }), _jsx(GutterLine, { children: _jsxs(Text, { color: C.overlay1, children: ["Creates ~/bin/", projectName, "-release and adds release:patch /"] }) }), _jsx(GutterLine, { children: _jsx(Text, { color: C.overlay1, children: "minor / major scripts to package.json. One command to build," }) }), _jsx(GutterLine, { children: _jsx(Text, { color: C.overlay1, children: "version-bump, push tags, and publish to npm." }) }), _jsx(GutterLine, { children: _jsx(Text, { color: C.overlay1, children: "Requires: npm login. Best for packages published to npm." }) }), _jsx(GutterLine, { children: _jsx(Text, { children: " " }) }), _jsxs(GutterLine, { children: [_jsx(Text, { bold: true, children: "Set up release scripts? " }), _jsx(ConfirmInput, { onConfirm: () => { setWantRelease(true); runSetup(wantPowerline, wantGit, true); }, onCancel: () => { setWantRelease(false); runSetup(wantPowerline, wantGit, false); } })] }), _jsx(GutterLine, { children: _jsx(Text, { color: C.overlay1, children: "Shift+Tab prev y/n answer" }) })] }));
|
|
59
67
|
}
|
|
60
68
|
// ── Running ─────────────────────────────────────────────────────────────────
|
|
61
69
|
if (phase === "running") {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"powerline.js","sourceRoot":"","sources":["../../src/steps/powerline.tsx"],"names":[],"mappings":";AAAA,OAAc,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AACxC,OAAO,EAAE,IAAI,EAAE,MAAM,KAAK,CAAC;
|
|
1
|
+
{"version":3,"file":"powerline.js","sourceRoot":"","sources":["../../src/steps/powerline.tsx"],"names":[],"mappings":";AAAA,OAAc,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AACxC,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,KAAK,CAAC;AACrC,OAAO,EAAE,YAAY,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAClD,OAAO,EAAE,UAAU,EAAE,MAAM,8BAA8B,CAAC;AAC1D,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AACrD,OAAO,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;AACxC,OAAO,EAAE,eAAe,EAAE,+BAA+B,EAAE,MAAM,oBAAoB,CAAC;AAEtF,OAAO,EAAE,CAAC,EAAE,MAAM,aAAa,CAAC;AAwBhC,MAAM,CAAC,OAAO,UAAU,SAAS,CAAC,EAAE,OAAO,EAAE,UAAU,EAAS;IAC9D,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,GAAG,QAAQ,CAAQ,eAAe,CAAC,CAAC;IAC3D,MAAM,CAAC,aAAa,EAAE,gBAAgB,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC;IAC1D,MAAM,CAAC,OAAO,EAAE,UAAU,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC;IAC9C,MAAM,CAAC,WAAW,EAAE,cAAc,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC;IACtD,MAAM,CAAC,QAAQ,EAAE,WAAW,CAAC,GAAG,QAAQ,CAAC,EAAE,CAAC,CAAC;IAC7C,MAAM,CAAC,WAAW,EAAE,cAAc,CAAC,GAAG,QAAQ,CAAc,EAAE,CAAC,CAAC;IAEhE,QAAQ,CACN,CAAC,KAAK,EAAE,GAAG,EAAE,EAAE;QACb,IAAI,GAAG,CAAC,KAAK,IAAI,GAAG,CAAC,GAAG,EAAE,CAAC;YACzB,IAAI,KAAK,KAAK,SAAS;gBAAE,QAAQ,CAAC,eAAe,CAAC,CAAC;iBAC9C,IAAI,KAAK,KAAK,aAAa;gBAAE,QAAQ,CAAC,SAAS,CAAC,CAAC;QACxD,CAAC;IACH,CAAC,EACD,EAAE,QAAQ,EAAE,KAAK,KAAK,SAAS,IAAI,KAAK,KAAK,aAAa,EAAE,CAC7D,CAAC;IAEF,SAAS,QAAQ,CAAC,SAAkB,EAAE,GAAY,EAAE,OAAgB;QAClE,QAAQ,CAAC,SAAS,CAAC,CAAC;QACpB,IAAI,CAAC;YACH,MAAM,SAAS,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC;YAChC,MAAM,WAAW,GAAG,OAAO,CAAC,WAAW,IAAI,UAAU,CAAC;YACtD,MAAM,MAAM,GAAgB,EAAE,CAAC;YAE/B,IAAI,SAAS;gBAAE,cAAc,CAAC,SAAS,CAAC,CAAC;YAEzC,IAAI,GAAG,EAAE,CAAC;gBACR,MAAM,SAAS,GAAG,OAAO,CAAC,SAAS,CAAC,CAAC;gBACrC,MAAM,CAAC,YAAY,GAAG,SAAS,CAAC,SAAS,CAAC;gBAC1C,MAAM,CAAC,UAAU,GAAG,SAAS,CAAC,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,MAAM,CAAC;YACzE,CAAC;YAED,IAAI,OAAO,EAAE,CAAC;gBACZ,MAAM,UAAU,GAAG,eAAe,CAAC,WAAW,EAAE,OAAO,CAAC,CAAC;gBACzD,MAAM,MAAM,GAAG,+BAA+B,CAAC,SAAS,EAAE,WAAW,CAAC,CAAC;gBACvE,MAAM,CAAC,cAAc,GAAG,CAAC,UAAU,CAAC,OAAO,CAAC;gBAC5C,MAAM,CAAC,cAAc,GAAG,UAAU,CAAC,OAAO,CAAC;gBAC3C,MAAM,CAAC,WAAW,GAAG,MAAM,CAAC,QAAQ,CAAC;gBACrC,MAAM,CAAC,UAAU,GAAG,MAAM,CAAC,OAAO,CAAC;YACrC,CAAC;YAED,cAAc,CAAC,MAAM,CAAC,CAAC;YACvB,QAAQ,CAAC,MAAM,CAAC,CAAC;YACjB,UAAU,CAAC,GAAG,EAAE,CAAC,UAAU,CAAC,EAAE,cAAc,EAAE,SAAS,EAAE,QAAQ,EAAE,GAAG,EAAE,YAAY,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,CAAC,CAAC;QAC1G,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,QAAQ,CAAC,OAAO,CAAC,CAAC;YAClB,WAAW,CAAC,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC;QAChE,CAAC;IACH,CAAC;IAED,+EAA+E;IAC/E,IAAI,KAAK,KAAK,eAAe,EAAE,CAAC;QAC9B,OAAO,CACL,8BACE,KAAC,UAAU,cACT,KAAC,IAAI,IAAC,IAAI,uCAAwB,GACvB,EACb,KAAC,UAAU,cACT,KAAC,IAAI,IAAC,KAAK,EAAE,CAAC,CAAC,QAAQ,2EAAmE,GAC/E,EACb,KAAC,UAAU,cACT,KAAC,IAAI,IAAC,KAAK,EAAE,CAAC,CAAC,QAAQ,iEAAyD,GACrE,EACb,KAAC,UAAU,cACT,KAAC,IAAI,IAAC,KAAK,EAAE,CAAC,CAAC,QAAQ,8EAAiE,GAC7E,EACb,KAAC,UAAU,cACT,KAAC,IAAI,oBAAS,GACH,EACb,MAAC,UAAU,eACT,KAAC,IAAI,IAAC,IAAI,yCAA0B,EACpC,KAAC,YAAY,IACX,SAAS,EAAE,GAAG,EAAE,GAAG,gBAAgB,CAAC,IAAI,CAAC,CAAC,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,EACjE,QAAQ,EAAE,GAAG,EAAE,GAAG,gBAAgB,CAAC,KAAK,CAAC,CAAC,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,GACjE,IACS,IACZ,CACJ,CAAC;IACJ,CAAC;IAED,+EAA+E;IAC/E,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;QACxB,OAAO,CACL,8BACG,aAAa,IAAI,CAChB,KAAC,UAAU,cACT,KAAC,IAAI,IAAC,KAAK,EAAE,CAAC,CAAC,QAAQ,+BAAuB,GACnC,CACd,EACD,KAAC,UAAU,cACT,KAAC,IAAI,IAAC,IAAI,qCAAsB,GACrB,EACb,KAAC,UAAU,cACT,KAAC,IAAI,IAAC,KAAK,EAAE,CAAC,CAAC,QAAQ,6EAAqE,GACjF,EACb,KAAC,UAAU,cACT,KAAC,IAAI,IAAC,KAAK,EAAE,CAAC,CAAC,QAAQ,4EAA+D,GAC3E,EACb,KAAC,UAAU,cACT,KAAC,IAAI,oBAAS,GACH,EACb,MAAC,UAAU,eACT,KAAC,IAAI,IAAC,IAAI,4CAA6B,EACvC,KAAC,YAAY,IACX,SAAS,EAAE,GAAG,EAAE,GAAG,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,QAAQ,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,EAC/D,QAAQ,EAAE,GAAG,EAAE,GAAG,UAAU,CAAC,KAAK,CAAC,CAAC,CAAC,QAAQ,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,GAC/D,IACS,EACb,KAAC,UAAU,cACT,KAAC,IAAI,IAAC,KAAK,EAAE,CAAC,CAAC,QAAQ,YAAG,4BAA4B,GAAQ,GACnD,IACZ,CACJ,CAAC;IACJ,CAAC;IAED,+EAA+E;IAC/E,IAAI,KAAK,KAAK,aAAa,EAAE,CAAC;QAC5B,MAAM,WAAW,GAAG,OAAO,CAAC,WAAW,IAAI,UAAU,CAAC;QACtD,OAAO,CACL,8BACG,aAAa,IAAI,CAChB,KAAC,UAAU,cACT,KAAC,IAAI,IAAC,KAAK,EAAE,CAAC,CAAC,QAAQ,+BAAuB,GACnC,CACd,EACA,OAAO,IAAI,CACV,KAAC,UAAU,cACT,KAAC,IAAI,IAAC,KAAK,EAAE,CAAC,CAAC,QAAQ,yBAAiB,GAC7B,CACd,EACD,KAAC,UAAU,cACT,KAAC,IAAI,IAAC,IAAI,0CAA2B,GAC1B,EACb,KAAC,UAAU,cACT,MAAC,IAAI,IAAC,KAAK,EAAE,CAAC,CAAC,QAAQ,+BAAiB,WAAW,yCAAyC,GACjF,EACb,KAAC,UAAU,cACT,KAAC,IAAI,IAAC,KAAK,EAAE,CAAC,CAAC,QAAQ,6EAAqE,GACjF,EACb,KAAC,UAAU,cACT,KAAC,IAAI,IAAC,KAAK,EAAE,CAAC,CAAC,QAAQ,6DAAqD,GACjE,EACb,KAAC,UAAU,cACT,KAAC,IAAI,IAAC,KAAK,EAAE,CAAC,CAAC,QAAQ,yEAAiE,GAC7E,EACb,KAAC,UAAU,cACT,KAAC,IAAI,oBAAS,GACH,EACb,MAAC,UAAU,eACT,KAAC,IAAI,IAAC,IAAI,+CAAgC,EAC1C,KAAC,YAAY,IACX,SAAS,EAAE,GAAG,EAAE,GAAG,cAAc,CAAC,IAAI,CAAC,CAAC,CAAC,QAAQ,CAAC,aAAa,EAAE,OAAO,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC,EAClF,QAAQ,EAAE,GAAG,EAAE,GAAG,cAAc,CAAC,KAAK,CAAC,CAAC,CAAC,QAAQ,CAAC,aAAa,EAAE,OAAO,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,GACnF,IACS,EACb,KAAC,UAAU,cACT,KAAC,IAAI,IAAC,KAAK,EAAE,CAAC,CAAC,QAAQ,YAAG,4BAA4B,GAAQ,GACnD,IACZ,CACJ,CAAC;IACJ,CAAC;IAED,+EAA+E;IAC/E,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;QACxB,OAAO,CACL,KAAC,UAAU,cACT,KAAC,OAAO,IAAC,KAAK,EAAC,wBAAwB,GAAG,GAC/B,CACd,CAAC;IACJ,CAAC;IAED,+EAA+E;IAC/E,IAAI,KAAK,KAAK,OAAO,EAAE,CAAC;QACtB,OAAO,CACL,KAAC,UAAU,cACT,MAAC,IAAI,IAAC,KAAK,EAAE,CAAC,CAAC,GAAG,8BAAgB,QAAQ,IAAQ,GACvC,CACd,CAAC;IACJ,CAAC;IAED,+EAA+E;IAC/E,OAAO,CACL,8BACG,aAAa,IAAI,CAChB,KAAC,UAAU,cACT,KAAC,IAAI,IAAC,KAAK,EAAE,CAAC,CAAC,KAAK,sCAA8B,GACvC,CACd,EACA,OAAO,IAAI,WAAW,CAAC,YAAY,IAAI,CACtC,KAAC,UAAU,cACT,KAAC,IAAI,IAAC,KAAK,EAAE,CAAC,CAAC,KAAK,4CAAoC,GAC7C,CACd,EACA,OAAO,IAAI,CAAC,WAAW,CAAC,YAAY,IAAI,WAAW,CAAC,UAAU,IAAI,CACjE,KAAC,UAAU,cACT,MAAC,IAAI,IAAC,KAAK,EAAE,CAAC,CAAC,KAAK,aAAG,SAAS,EAAE,WAAW,CAAC,UAAU,IAAQ,GACrD,CACd,EACA,WAAW,IAAI,WAAW,CAAC,cAAc,IAAI,CAC5C,KAAC,UAAU,cACT,MAAC,IAAI,IAAC,KAAK,EAAE,CAAC,CAAC,KAAK,wCACM,WAAW,CAAC,WAAW,CAAC,CAAC,CAAC,wBAAwB,CAAC,CAAC,CAAC,WAAW,CAAC,UAAU,CAAC,CAAC,CAAC,wBAAwB,CAAC,CAAC,CAAC,EAAE,IAC9H,GACI,CACd,EACA,WAAW,IAAI,WAAW,CAAC,cAAc,IAAI,CAC5C,KAAC,UAAU,cACT,KAAC,IAAI,IAAC,KAAK,EAAE,CAAC,CAAC,QAAQ,8DAAiD,GAC7D,CACd,EACA,CAAC,aAAa,IAAI,CAAC,OAAO,IAAI,CAAC,WAAW,IAAI,CAC7C,KAAC,UAAU,cACT,KAAC,IAAI,IAAC,KAAK,EAAE,CAAC,CAAC,QAAQ,sCAA8B,GAC1C,CACd,EACD,KAAC,UAAU,cACT,KAAC,IAAI,IAAC,KAAK,EAAE,CAAC,CAAC,KAAK,EAAE,IAAI,sCAAuB,GACtC,IACZ,CACJ,CAAC;AACJ,CAAC"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { jsxs as _jsxs, jsx as _jsx, Fragment as _Fragment } from "react/jsx-runtime";
|
|
2
|
-
import { useState } from "react";
|
|
3
|
-
import { Text } from "ink";
|
|
2
|
+
import { useState, useEffect } from "react";
|
|
3
|
+
import { Text, useInput } from "ink";
|
|
4
4
|
import { TextInput } from "@inkjs/ui";
|
|
5
5
|
import { GutterLine } from "../components/gutter-line.js";
|
|
6
6
|
import { GutteredMultiSelect } from "../components/guttered-select.js";
|
|
@@ -46,6 +46,7 @@ export default function ProductContext({ initialValues, onComplete }) {
|
|
|
46
46
|
const [phaseIndex, setPhaseIndex] = useState(0);
|
|
47
47
|
const [answers, setAnswers] = useState({});
|
|
48
48
|
const [error, setError] = useState("");
|
|
49
|
+
const [liveInput, setLiveInput] = useState("");
|
|
49
50
|
// Prefill tech stack from Stack & Style selections (language + framework)
|
|
50
51
|
const prefillTechStack = [];
|
|
51
52
|
if (initialValues?.language) {
|
|
@@ -59,6 +60,54 @@ export default function ProductContext({ initialValues, onComplete }) {
|
|
|
59
60
|
prefillTechStack.push(match.value);
|
|
60
61
|
}
|
|
61
62
|
const currentPhase = PHASE_ORDER[phaseIndex];
|
|
63
|
+
const isFirst = phaseIndex === 0;
|
|
64
|
+
const isLast = phaseIndex === PHASE_ORDER.length - 1;
|
|
65
|
+
// Reset live input when navigating to a different field
|
|
66
|
+
useEffect(() => {
|
|
67
|
+
setLiveInput("");
|
|
68
|
+
}, [phaseIndex]);
|
|
69
|
+
const isMultiSelectPhase = currentPhase === "techStack" || currentPhase === "coreFeatures";
|
|
70
|
+
useInput((input, key) => {
|
|
71
|
+
if (key.shift && key.tab && phaseIndex > 0) {
|
|
72
|
+
setPhaseIndex((i) => i - 1);
|
|
73
|
+
setError("");
|
|
74
|
+
}
|
|
75
|
+
else if (key.tab && !key.shift && !isMultiSelectPhase) {
|
|
76
|
+
// Tab only advances text phases — multi-select phases use Enter to confirm
|
|
77
|
+
const required = currentPhase === "problem" || currentPhase === "users";
|
|
78
|
+
const val = liveInput.trim() || answers[currentPhase] || "";
|
|
79
|
+
if (required && !val) {
|
|
80
|
+
setError("This field is required");
|
|
81
|
+
return;
|
|
82
|
+
}
|
|
83
|
+
setError("");
|
|
84
|
+
const next = { ...answers, [currentPhase]: val };
|
|
85
|
+
setAnswers(next);
|
|
86
|
+
if (phaseIndex < PHASE_ORDER.length - 1) {
|
|
87
|
+
setPhaseIndex((i) => i + 1);
|
|
88
|
+
}
|
|
89
|
+
else {
|
|
90
|
+
finalize(next);
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
});
|
|
94
|
+
function finalize(data) {
|
|
95
|
+
onComplete({
|
|
96
|
+
problem: data.problem,
|
|
97
|
+
users: data.users,
|
|
98
|
+
techStack: data.techStack,
|
|
99
|
+
coreFeatures: (data.coreFeatures || "")
|
|
100
|
+
.split(",")
|
|
101
|
+
.map((s) => s.trim())
|
|
102
|
+
.filter(Boolean),
|
|
103
|
+
nonGoals: (data.nonGoals || "")
|
|
104
|
+
.split(",")
|
|
105
|
+
.map((s) => s.trim())
|
|
106
|
+
.filter(Boolean),
|
|
107
|
+
userStories: [],
|
|
108
|
+
envVars: [],
|
|
109
|
+
});
|
|
110
|
+
}
|
|
62
111
|
function advanceToNext(key, value) {
|
|
63
112
|
const next = { ...answers, [key]: value };
|
|
64
113
|
setAnswers(next);
|
|
@@ -67,28 +116,14 @@ export default function ProductContext({ initialValues, onComplete }) {
|
|
|
67
116
|
setPhaseIndex(phaseIndex + 1);
|
|
68
117
|
}
|
|
69
118
|
else {
|
|
70
|
-
|
|
71
|
-
problem: next.problem,
|
|
72
|
-
users: next.users,
|
|
73
|
-
techStack: next.techStack,
|
|
74
|
-
coreFeatures: (next.coreFeatures || "")
|
|
75
|
-
.split(",")
|
|
76
|
-
.map((s) => s.trim())
|
|
77
|
-
.filter(Boolean),
|
|
78
|
-
nonGoals: (next.nonGoals || "")
|
|
79
|
-
.split(",")
|
|
80
|
-
.map((s) => s.trim())
|
|
81
|
-
.filter(Boolean),
|
|
82
|
-
userStories: [],
|
|
83
|
-
envVars: [],
|
|
84
|
-
});
|
|
119
|
+
finalize(next);
|
|
85
120
|
}
|
|
86
121
|
}
|
|
87
122
|
function handleTextSubmit(key, required) {
|
|
88
123
|
return (value) => {
|
|
89
124
|
const val = value.trim();
|
|
90
125
|
if (required && !val) {
|
|
91
|
-
setError(
|
|
126
|
+
setError("This field is required");
|
|
92
127
|
return;
|
|
93
128
|
}
|
|
94
129
|
advanceToNext(key, val);
|
|
@@ -105,6 +140,6 @@ export default function ProductContext({ initialValues, onComplete }) {
|
|
|
105
140
|
const usersPlaceholder = answers["problem"]
|
|
106
141
|
? `People affected by: ${answers["problem"]}`
|
|
107
142
|
: "e.g. Developers, PMs, designers...";
|
|
108
|
-
return (_jsxs(_Fragment, { children: [completedFields, currentPhase === "problem" && (_jsxs(GutterLine, { children: [_jsx(Text, { bold: true, children: "What problem does this solve? " }), _jsx(TextInput, { placeholder: "Describe the core problem...", onSubmit: handleTextSubmit("problem", true) })] })), currentPhase === "users" && (_jsxs(GutterLine, { children: [_jsx(Text, { bold: true, children: "Who are the users? " }), _jsx(TextInput, { placeholder: usersPlaceholder, onSubmit: handleTextSubmit("users", true) })] })), currentPhase === "techStack" && (_jsxs(_Fragment, { children: [_jsx(GutterLine, { children: _jsx(Text, { bold: true, children: "Tech stack:" }) }), _jsx(GutteredMultiSelect, { options: TECH_STACK_OPTIONS, initialSelected: prefillTechStack, onSubmit: handleTechStackSubmit })] })), currentPhase === "coreFeatures" && (_jsxs(_Fragment, { children: [_jsx(GutterLine, { children: _jsx(Text, { bold: true, children: "Core features:" }) }), _jsx(GutteredMultiSelect, { options: CORE_FEATURE_OPTIONS, onSubmit: handleCoreFeaturesSubmit, allowCustom: true, customPlaceholder: "e.g. Export PDF, Onboarding flow..." })] })), currentPhase === "nonGoals" && (_jsxs(GutterLine, { children: [_jsx(Text, { bold: true, children: "Non-goals (comma-separated): " }), _jsx(TextInput, { placeholder: "e.g. Mobile app, Real-time sync...", onSubmit: handleTextSubmit("nonGoals", false) })] })), error && (_jsx(GutterLine, { children: _jsx(Text, { color: C.red, children: error }) }))] }));
|
|
143
|
+
return (_jsxs(_Fragment, { children: [completedFields, currentPhase === "problem" && (_jsxs(_Fragment, { children: [_jsxs(GutterLine, { children: [_jsx(Text, { bold: true, children: "What problem does this solve? " }), _jsx(TextInput, { defaultValue: answers["problem"] || "", placeholder: "Describe the core problem...", onChange: setLiveInput, onSubmit: handleTextSubmit("problem", true) })] }), _jsx(GutterLine, { children: _jsx(Text, { color: C.overlay1, children: "Tab next Enter confirm" }) })] })), currentPhase === "users" && (_jsxs(_Fragment, { children: [_jsxs(GutterLine, { children: [_jsx(Text, { bold: true, children: "Who are the users? " }), _jsx(TextInput, { defaultValue: answers["users"] || "", placeholder: usersPlaceholder, onChange: setLiveInput, onSubmit: handleTextSubmit("users", true) })] }), _jsx(GutterLine, { children: _jsx(Text, { color: C.overlay1, children: "Shift+Tab prev Tab next Enter confirm" }) })] })), currentPhase === "techStack" && (_jsxs(_Fragment, { children: [_jsx(GutterLine, { children: _jsx(Text, { bold: true, children: "Tech stack:" }) }), _jsx(GutteredMultiSelect, { options: TECH_STACK_OPTIONS, initialSelected: prefillTechStack, onSubmit: handleTechStackSubmit }), _jsx(GutterLine, { children: _jsx(Text, { color: C.overlay1, children: "Shift+Tab prev ↑↓ move Space toggle Enter confirm" }) })] })), currentPhase === "coreFeatures" && (_jsxs(_Fragment, { children: [_jsx(GutterLine, { children: _jsx(Text, { bold: true, children: "Core features:" }) }), _jsx(GutteredMultiSelect, { options: CORE_FEATURE_OPTIONS, onSubmit: handleCoreFeaturesSubmit, allowCustom: true, customPlaceholder: "e.g. Export PDF, Onboarding flow..." }), _jsx(GutterLine, { children: _jsx(Text, { color: C.overlay1, children: "Shift+Tab prev ↑↓ move Space toggle Enter confirm" }) })] })), currentPhase === "nonGoals" && (_jsxs(_Fragment, { children: [_jsxs(GutterLine, { children: [_jsx(Text, { bold: true, children: "Non-goals (comma-separated): " }), _jsx(TextInput, { defaultValue: answers["nonGoals"] || "", placeholder: "e.g. Mobile app, Real-time sync...", onChange: setLiveInput, onSubmit: handleTextSubmit("nonGoals", false) })] }), _jsx(GutterLine, { children: _jsx(Text, { color: C.overlay1, children: "Shift+Tab prev Tab / Enter confirm" }) })] })), error && (_jsx(GutterLine, { children: _jsx(Text, { color: C.red, children: error }) }))] }));
|
|
109
144
|
}
|
|
110
145
|
//# sourceMappingURL=product-context.js.map
|
|
@@ -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;
|
|
1
|
+
{"version":3,"file":"product-context.js","sourceRoot":"","sources":["../../src/steps/product-context.tsx"],"names":[],"mappings":"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"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { jsxs as _jsxs, jsx as _jsx, Fragment as _Fragment } from "react/jsx-runtime";
|
|
2
|
-
import { useState } from "react";
|
|
3
|
-
import { Text } from "ink";
|
|
2
|
+
import { useState, useEffect } from "react";
|
|
3
|
+
import { Text, useInput } 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";
|
|
@@ -28,7 +28,34 @@ export default function ProjectInfo({ onComplete }) {
|
|
|
28
28
|
const [stepIndex, setStepIndex] = useState(0);
|
|
29
29
|
const [answers, setAnswers] = useState({});
|
|
30
30
|
const [error, setError] = useState("");
|
|
31
|
+
const [liveInput, setLiveInput] = useState("");
|
|
31
32
|
const currentStep = STEP_ORDER[stepIndex];
|
|
33
|
+
const isFirst = stepIndex === 0;
|
|
34
|
+
// Reset live input when navigating to a different field
|
|
35
|
+
useEffect(() => {
|
|
36
|
+
setLiveInput("");
|
|
37
|
+
}, [stepIndex]);
|
|
38
|
+
const isSelectStep = currentStep === "packageManager" || currentStep === "license";
|
|
39
|
+
useInput((input, key) => {
|
|
40
|
+
if (key.shift && key.tab && stepIndex > 0) {
|
|
41
|
+
setStepIndex((i) => i - 1);
|
|
42
|
+
setError("");
|
|
43
|
+
}
|
|
44
|
+
else if (key.tab && !key.shift && !isSelectStep) {
|
|
45
|
+
// Tab only advances text steps — select steps require an explicit Enter selection
|
|
46
|
+
const val = liveInput.trim() || answers[currentStep] || "";
|
|
47
|
+
if (!val) {
|
|
48
|
+
setError(currentStep === "projectName"
|
|
49
|
+
? "Project name is required"
|
|
50
|
+
: "Description is required");
|
|
51
|
+
return;
|
|
52
|
+
}
|
|
53
|
+
setError("");
|
|
54
|
+
const next = { ...answers, [currentStep]: val };
|
|
55
|
+
setAnswers(next);
|
|
56
|
+
setStepIndex((i) => i + 1);
|
|
57
|
+
}
|
|
58
|
+
});
|
|
32
59
|
function advance(key, value) {
|
|
33
60
|
const next = { ...answers, [key]: value };
|
|
34
61
|
setAnswers(next);
|
|
@@ -57,6 +84,6 @@ export default function ProjectInfo({ onComplete }) {
|
|
|
57
84
|
}
|
|
58
85
|
// Render completed fields
|
|
59
86
|
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 }) }))] }));
|
|
87
|
+
return (_jsxs(_Fragment, { children: [completed, currentStep === "projectName" && (_jsxs(_Fragment, { children: [_jsxs(GutterLine, { children: [_jsx(Text, { bold: true, children: "Project name: " }), _jsx(TextInput, { defaultValue: answers["projectName"] || "", placeholder: "...", onChange: setLiveInput, onSubmit: handleTextSubmit })] }), _jsx(GutterLine, { children: _jsx(Text, { color: C.overlay1, children: "Tab next Enter confirm" }) })] })), currentStep === "description" && (_jsxs(_Fragment, { children: [_jsxs(GutterLine, { children: [_jsx(Text, { bold: true, children: "One-line description: " }), _jsx(TextInput, { defaultValue: answers["description"] || "", placeholder: "...", onChange: setLiveInput, onSubmit: handleTextSubmit })] }), _jsx(GutterLine, { children: _jsx(Text, { color: C.overlay1, children: "Shift+Tab prev Tab next Enter confirm" }) })] })), currentStep === "packageManager" && (_jsxs(_Fragment, { children: [_jsx(GutterLine, { children: _jsx(Text, { bold: true, children: "Package manager:" }) }), _jsx(GutteredSelect, { options: PACKAGE_MANAGER_OPTIONS, onChange: handleSelectChange("packageManager") }), _jsx(GutterLine, { children: _jsx(Text, { color: C.overlay1, children: "Shift+Tab prev ↑↓ move Enter select" }) })] })), currentStep === "license" && (_jsxs(_Fragment, { children: [_jsx(GutterLine, { children: _jsx(Text, { bold: true, children: "License:" }) }), _jsx(GutteredSelect, { options: LICENSE_OPTIONS, onChange: handleSelectChange("license") }), _jsx(GutterLine, { children: _jsx(Text, { color: C.overlay1, children: "Shift+Tab prev ↑↓ move Enter select" }) })] })), error && (_jsx(GutterLine, { children: _jsx(Text, { color: C.red, children: error }) }))] }));
|
|
61
88
|
}
|
|
62
89
|
//# 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;
|
|
1
|
+
{"version":3,"file":"project-info.js","sourceRoot":"","sources":["../../src/steps/project-info.tsx"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,8 +1,12 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "procedure-cli",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.14",
|
|
4
4
|
"description": "CLI-based AI Agent powered by AI SDK 6, Z.ai, and OpenAI",
|
|
5
5
|
"type": "module",
|
|
6
|
+
"files": [
|
|
7
|
+
"dist",
|
|
8
|
+
"templates"
|
|
9
|
+
],
|
|
6
10
|
"bin": {
|
|
7
11
|
"procedure": "./dist/cli.js"
|
|
8
12
|
},
|
|
@@ -1,26 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"permissions": {
|
|
3
|
-
"allow": [
|
|
4
|
-
"WebFetch(domain:z.ai)",
|
|
5
|
-
"mcp__plugin_context7_context7__resolve-library-id",
|
|
6
|
-
"mcp__plugin_context7_context7__query-docs",
|
|
7
|
-
"Bash(npm init:*)",
|
|
8
|
-
"Bash(npm install:*)",
|
|
9
|
-
"Bash(npx tsc:*)",
|
|
10
|
-
"Bash(npx tsx:*)",
|
|
11
|
-
"WebFetch(domain:skills.sh)",
|
|
12
|
-
"WebFetch(domain:openclaw.com)",
|
|
13
|
-
"WebSearch",
|
|
14
|
-
"Bash(npm run typecheck:*)",
|
|
15
|
-
"Bash(npm run build:*)",
|
|
16
|
-
"Bash(pnpm install:*)",
|
|
17
|
-
"Bash(node -e:*)",
|
|
18
|
-
"Bash(git add:*)",
|
|
19
|
-
"Bash(git commit:*)",
|
|
20
|
-
"Bash(git push:*)",
|
|
21
|
-
"Bash(find:*)",
|
|
22
|
-
"WebFetch(domain:github.com)",
|
|
23
|
-
"WebFetch(domain:raw.githubusercontent.com)"
|
|
24
|
-
]
|
|
25
|
-
}
|
|
26
|
-
}
|
package/.env.example
DELETED
package/AGENTS.md
DELETED
|
@@ -1,113 +0,0 @@
|
|
|
1
|
-
# Repository Guidelines
|
|
2
|
-
|
|
3
|
-
This file provides guidance to coding agents (including Codex) working in this repository.
|
|
4
|
-
|
|
5
|
-
See `docs/PRD.md` for product requirements and `docs/USER-STORIES.md` for acceptance criteria.
|
|
6
|
-
|
|
7
|
-
## Build & Test
|
|
8
|
-
|
|
9
|
-
```bash
|
|
10
|
-
npm run dev # Run CLI directly (tsx, no build step)
|
|
11
|
-
npm run typecheck # Typecheck (fast — run first)
|
|
12
|
-
npm run lint # Alias of typecheck
|
|
13
|
-
npm run build # Compile to dist/
|
|
14
|
-
npx tsx src/cli.tsx # Run entry point directly
|
|
15
|
-
```
|
|
16
|
-
|
|
17
|
-
Important safety note: never run `npm run dev` from this repo root when validating scaffolding behavior. Generation writes to `process.cwd()`. Use a temp directory.
|
|
18
|
-
|
|
19
|
-
## Code Style
|
|
20
|
-
|
|
21
|
-
- TypeScript strict mode, ESM (`"type": "module"` in `package.json`).
|
|
22
|
-
- JSX runtime: `react-jsx`.
|
|
23
|
-
- Ink UI components use `.tsx`; pure logic modules use `.ts`.
|
|
24
|
-
- Handlebars templates use `.hbs` in `templates/`.
|
|
25
|
-
- Providers live in `src/providers/`, one provider per file.
|
|
26
|
-
- Never hardcode API keys; use `ZAI_API_KEY` and `OPENAI_API_KEY`.
|
|
27
|
-
|
|
28
|
-
## Architecture
|
|
29
|
-
|
|
30
|
-
- Entry point: `src/cli.tsx`
|
|
31
|
-
- UI root / wizard controller: `src/app.tsx`
|
|
32
|
-
- Step implementations: `src/steps/`
|
|
33
|
-
- Reusable UI components: `src/components/`
|
|
34
|
-
- Core logic: `src/lib/`
|
|
35
|
-
- `template.ts`: Handlebars rendering + file scaffolding
|
|
36
|
-
- `powerline.ts`: Claude powerline setup
|
|
37
|
-
- `git.ts`: git init + initial commit flow
|
|
38
|
-
- `fs.ts`: filesystem helpers
|
|
39
|
-
- `types.ts`: shared type definitions
|
|
40
|
-
- Templates: `templates/`
|
|
41
|
-
- Config: `config/`
|
|
42
|
-
- Docs: `docs/`
|
|
43
|
-
|
|
44
|
-
## Workflow
|
|
45
|
-
|
|
46
|
-
### Planning
|
|
47
|
-
- Use planning for non-trivial changes (3+ steps or architecture-impacting work).
|
|
48
|
-
- If execution deviates materially, stop and re-plan.
|
|
49
|
-
|
|
50
|
-
### Verification
|
|
51
|
-
- Do not mark work complete without evidence.
|
|
52
|
-
- Minimum verification: `npm run typecheck` and `npm run build`.
|
|
53
|
-
|
|
54
|
-
### Bug Fixing
|
|
55
|
-
- Resolve root cause; avoid temporary patches.
|
|
56
|
-
- Ground fixes in reproducible evidence (logs, failing behavior, code path).
|
|
57
|
-
|
|
58
|
-
### Elegance
|
|
59
|
-
- For non-trivial changes, prefer clean, maintainable solutions over tactical hacks.
|
|
60
|
-
- Avoid over-engineering simple fixes.
|
|
61
|
-
|
|
62
|
-
## Task Management
|
|
63
|
-
|
|
64
|
-
### Solo Work
|
|
65
|
-
1. Plan the approach.
|
|
66
|
-
2. Implement in small, coherent changes.
|
|
67
|
-
3. Verify before claiming completion.
|
|
68
|
-
4. Update procedural docs when corrected by the user.
|
|
69
|
-
|
|
70
|
-
### Agent Teams
|
|
71
|
-
1. Plan before delegation.
|
|
72
|
-
2. Assign clear deliverables per task.
|
|
73
|
-
3. Keep file ownership non-overlapping across agents.
|
|
74
|
-
4. Include file paths and constraints in handoffs.
|
|
75
|
-
|
|
76
|
-
## Code Review & Fix Logging
|
|
77
|
-
|
|
78
|
-
Two append-only logs live at repo root: `CODE-REVIEW.md` and `CODE-FIXED.md`.
|
|
79
|
-
|
|
80
|
-
### CODE-REVIEW.md
|
|
81
|
-
- For review findings only.
|
|
82
|
-
- Entry ID format: `CR-YYYYMMDD-###`.
|
|
83
|
-
- Findings ordered by severity (`High`, `Medium`, `Low`).
|
|
84
|
-
- Each finding must include: `file:line` evidence, recommendation, and status (`New`, `Still Open`, `Fixed`, `Regressed`, `Not Reproducible`).
|
|
85
|
-
- Scope boundary: when reviewing, write only to `CODE-REVIEW.md`.
|
|
86
|
-
|
|
87
|
-
### CODE-FIXED.md
|
|
88
|
-
- For fixes applied to review findings.
|
|
89
|
-
- Entry ID format: `CF-YYYYMMDD-###`.
|
|
90
|
-
- Each entry references source `CR-` entry ID.
|
|
91
|
-
- Log only actions taken, changed files/lines, deferred rationale, and verification results.
|
|
92
|
-
- Scope boundary: when fixing, write only to `CODE-FIXED.md`.
|
|
93
|
-
|
|
94
|
-
### Procedure
|
|
95
|
-
1. Reviewing: read latest `CODE-REVIEW.md` and latest `CODE-FIXED.md` first; append a new `CR-` entry to `CODE-REVIEW.md`.
|
|
96
|
-
2. Fixing: read review + fix logs; fix unresolved findings; append a new `CF-` entry to `CODE-FIXED.md`.
|
|
97
|
-
3. Re-reviewing: append a new `CR-` entry with validation matrix and status updates.
|
|
98
|
-
|
|
99
|
-
## Core Principles
|
|
100
|
-
|
|
101
|
-
- Simplicity first.
|
|
102
|
-
- Root-cause rigor over temporary fixes.
|
|
103
|
-
- Minimal necessary code impact.
|
|
104
|
-
|
|
105
|
-
## Lessons (Project-Specific)
|
|
106
|
-
|
|
107
|
-
- Keep timeline `│` lines vertically aligned.
|
|
108
|
-
- Validate required wizard inputs.
|
|
109
|
-
- Use select menus for known-option fields (package manager, license, architecture).
|
|
110
|
-
- Keep errors visually distinct and below inputs.
|
|
111
|
-
- Keep generation confirmation explicit before file writes.
|
|
112
|
-
- Tech stack multi-select should prefill from Stack & Style selections.
|
|
113
|
-
- If generation is skipped, end-state messaging must not imply files were scaffolded.
|