@praxis-framework/cli 0.1.0
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 +51 -0
- package/dist/app.js +122 -0
- package/dist/app.js.map +1 -0
- package/dist/commands/init-config.js +85 -0
- package/dist/commands/init-config.js.map +1 -0
- package/dist/commands/init.js +59 -0
- package/dist/commands/init.js.map +1 -0
- package/dist/commands/log.js +171 -0
- package/dist/commands/log.js.map +1 -0
- package/dist/flows/capabilities.js +14 -0
- package/dist/flows/capabilities.js.map +1 -0
- package/dist/flows/inhibitions.js +14 -0
- package/dist/flows/inhibitions.js.map +1 -0
- package/dist/flows/initial-verbs.js +82 -0
- package/dist/flows/initial-verbs.js.map +1 -0
- package/dist/flows/organisation.js +112 -0
- package/dist/flows/organisation.js.map +1 -0
- package/dist/flows/path-choice.js +22 -0
- package/dist/flows/path-choice.js.map +1 -0
- package/dist/flows/review.js +31 -0
- package/dist/flows/review.js.map +1 -0
- package/dist/flows/role-definition.js +77 -0
- package/dist/flows/role-definition.js.map +1 -0
- package/dist/flows/tools.js +63 -0
- package/dist/flows/tools.js.map +1 -0
- package/dist/flows/voice.js +146 -0
- package/dist/flows/voice.js.map +1 -0
- package/dist/flows/welcome.js +17 -0
- package/dist/flows/welcome.js.map +1 -0
- package/dist/flows/wrote.js +51 -0
- package/dist/flows/wrote.js.map +1 -0
- package/dist/index.js +57 -0
- package/dist/index.js.map +1 -0
- package/dist/lib/catalog.js +190 -0
- package/dist/lib/catalog.js.map +1 -0
- package/dist/lib/seed-adapter.js +28 -0
- package/dist/lib/seed-adapter.js.map +1 -0
- package/dist/lib/traits.js +13 -0
- package/dist/lib/traits.js.map +1 -0
- package/dist/state/form.js +63 -0
- package/dist/state/form.js.map +1 -0
- package/dist/state/steps.js +28 -0
- package/dist/state/steps.js.map +1 -0
- package/dist/ui/header.js +14 -0
- package/dist/ui/header.js.map +1 -0
- package/dist/ui/list-builder-state.js +179 -0
- package/dist/ui/list-builder-state.js.map +1 -0
- package/dist/ui/list-builder.js +144 -0
- package/dist/ui/list-builder.js.map +1 -0
- package/dist/ui/theme.js +8 -0
- package/dist/ui/theme.js.map +1 -0
- package/examples/sample-role.json +24 -0
- package/package.json +66 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"initial-verbs.js","sourceRoot":"","sources":["../../src/flows/initial-verbs.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,112 @@
|
|
|
1
|
+
import { jsxs as _jsxs, jsx as _jsx } from "react/jsx-runtime";
|
|
2
|
+
import { useState } from 'react';
|
|
3
|
+
import { Box, Text, useInput } from 'ink';
|
|
4
|
+
import TextInput from 'ink-text-input';
|
|
5
|
+
import SelectInput from 'ink-select-input';
|
|
6
|
+
import { accent, muted, ok } from '../ui/theme.js';
|
|
7
|
+
const ORDER = [
|
|
8
|
+
'name',
|
|
9
|
+
'website',
|
|
10
|
+
'sector',
|
|
11
|
+
'size',
|
|
12
|
+
'description',
|
|
13
|
+
'moats',
|
|
14
|
+
'customer_profile',
|
|
15
|
+
];
|
|
16
|
+
const PROMPTS = {
|
|
17
|
+
name: {
|
|
18
|
+
label: 'Organisation name',
|
|
19
|
+
hint: 'The legal or trading name of the business',
|
|
20
|
+
required: true,
|
|
21
|
+
},
|
|
22
|
+
website: {
|
|
23
|
+
label: 'Website',
|
|
24
|
+
hint: 'optional — e.g. https://acme.com',
|
|
25
|
+
required: false,
|
|
26
|
+
},
|
|
27
|
+
sector: {
|
|
28
|
+
label: 'Sector',
|
|
29
|
+
hint: 'optional — e.g. SaaS, healthcare, government',
|
|
30
|
+
required: false,
|
|
31
|
+
},
|
|
32
|
+
size: {
|
|
33
|
+
label: 'Size',
|
|
34
|
+
hint: 'pick one',
|
|
35
|
+
required: false,
|
|
36
|
+
},
|
|
37
|
+
description: {
|
|
38
|
+
label: 'Brief description',
|
|
39
|
+
hint: 'optional — one or two sentences about what you do',
|
|
40
|
+
required: false,
|
|
41
|
+
},
|
|
42
|
+
moats: {
|
|
43
|
+
label: 'Moats / differentiators',
|
|
44
|
+
hint: 'optional — what sets you apart',
|
|
45
|
+
required: false,
|
|
46
|
+
},
|
|
47
|
+
customer_profile: {
|
|
48
|
+
label: 'Customer profile',
|
|
49
|
+
hint: 'optional — who buys from you',
|
|
50
|
+
required: false,
|
|
51
|
+
},
|
|
52
|
+
};
|
|
53
|
+
const SIZE_ITEMS = [
|
|
54
|
+
{ label: 'solo (just me)', value: 'solo' },
|
|
55
|
+
{ label: 'small (2–10)', value: 'small' },
|
|
56
|
+
{ label: 'mid (11–100)', value: 'mid' },
|
|
57
|
+
{ label: 'large (101–1000)', value: 'large' },
|
|
58
|
+
{ label: 'enterprise (1000+)', value: 'enterprise' },
|
|
59
|
+
];
|
|
60
|
+
export const OrganisationFlow = ({ initial, onNext, onCancel }) => {
|
|
61
|
+
const [draft, setDraft] = useState({ ...initial });
|
|
62
|
+
const [fieldIdx, setFieldIdx] = useState(0);
|
|
63
|
+
const [textValue, setTextValue] = useState('');
|
|
64
|
+
const [error, setError] = useState(null);
|
|
65
|
+
const field = ORDER[fieldIdx];
|
|
66
|
+
// Allow Esc to cancel even while a TextInput has focus.
|
|
67
|
+
useInput((_input, key) => {
|
|
68
|
+
if (key.escape)
|
|
69
|
+
onCancel();
|
|
70
|
+
});
|
|
71
|
+
if (!field) {
|
|
72
|
+
return null;
|
|
73
|
+
}
|
|
74
|
+
const prompt = PROMPTS[field];
|
|
75
|
+
const advance = (nextDraft) => {
|
|
76
|
+
setDraft(nextDraft);
|
|
77
|
+
setError(null);
|
|
78
|
+
setTextValue('');
|
|
79
|
+
if (fieldIdx === ORDER.length - 1) {
|
|
80
|
+
onNext(nextDraft);
|
|
81
|
+
}
|
|
82
|
+
else {
|
|
83
|
+
setFieldIdx(fieldIdx + 1);
|
|
84
|
+
}
|
|
85
|
+
};
|
|
86
|
+
const handleTextSubmit = (value) => {
|
|
87
|
+
const trimmed = value.trim();
|
|
88
|
+
if (prompt.required && trimmed.length === 0) {
|
|
89
|
+
setError('This field is required.');
|
|
90
|
+
return;
|
|
91
|
+
}
|
|
92
|
+
const nextDraft = { ...draft };
|
|
93
|
+
if (trimmed.length === 0) {
|
|
94
|
+
delete nextDraft[field];
|
|
95
|
+
}
|
|
96
|
+
else if (field !== 'size') {
|
|
97
|
+
nextDraft[field] = trimmed;
|
|
98
|
+
}
|
|
99
|
+
advance(nextDraft);
|
|
100
|
+
};
|
|
101
|
+
const handleSizeSelect = (item) => {
|
|
102
|
+
const nextDraft = { ...draft, size: item.value };
|
|
103
|
+
advance(nextDraft);
|
|
104
|
+
};
|
|
105
|
+
return (_jsxs(Box, { flexDirection: "column", children: [_jsx(Box, { marginBottom: 1, children: _jsxs(Text, { children: [accent('Step 1 of 3'), " \u2014 Tell me about your organisation"] }) }), ORDER.slice(0, fieldIdx).map((f) => {
|
|
106
|
+
const v = draft[f];
|
|
107
|
+
if (v === undefined || v === '')
|
|
108
|
+
return null;
|
|
109
|
+
return (_jsx(Box, { children: _jsxs(Text, { children: [ok('✓'), " ", muted(PROMPTS[f].label), ": ", _jsx(Text, { children: String(v) })] }) }, f));
|
|
110
|
+
}), _jsxs(Box, { marginTop: 1, flexDirection: "column", children: [_jsxs(Text, { children: [_jsx(Text, { color: "cyan", children: "?" }), " ", prompt.label, ' ', _jsxs(Text, { dimColor: true, children: ["(", prompt.hint, ")"] })] }), _jsx(Box, { marginTop: 0, children: field === 'size' ? (_jsx(SelectInput, { items: SIZE_ITEMS, onSelect: handleSizeSelect })) : (_jsxs(Box, { children: [_jsx(Text, { children: muted('› ') }), _jsx(TextInput, { value: textValue, onChange: setTextValue, onSubmit: handleTextSubmit, placeholder: prompt.required ? '' : '(leave blank to skip)' })] })) }), error ? (_jsx(Box, { marginTop: 1, children: _jsx(Text, { color: "red", children: error }) })) : null] }), _jsx(Box, { marginTop: 1, children: _jsx(Text, { dimColor: true, children: "Esc to cancel" }) })] }));
|
|
111
|
+
};
|
|
112
|
+
//# sourceMappingURL=organisation.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"organisation.js","sourceRoot":"","sources":["../../src/flows/organisation.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import { jsxs as _jsxs, jsx as _jsx } from "react/jsx-runtime";
|
|
2
|
+
import { Box, Text, useInput } from 'ink';
|
|
3
|
+
import SelectInput from 'ink-select-input';
|
|
4
|
+
import { accent, muted } from '../ui/theme.js';
|
|
5
|
+
const ITEMS = [
|
|
6
|
+
{
|
|
7
|
+
label: 'Research and design it for me — hand off to Claude Code',
|
|
8
|
+
value: 'research',
|
|
9
|
+
},
|
|
10
|
+
{
|
|
11
|
+
label: 'Define it yourself — walk through voice, capabilities, inhibitions',
|
|
12
|
+
value: 'manual',
|
|
13
|
+
},
|
|
14
|
+
];
|
|
15
|
+
export const PathChoiceFlow = ({ onNext, onCancel }) => {
|
|
16
|
+
useInput((_input, key) => {
|
|
17
|
+
if (key.escape)
|
|
18
|
+
onCancel();
|
|
19
|
+
});
|
|
20
|
+
return (_jsxs(Box, { flexDirection: "column", children: [_jsx(Box, { marginBottom: 1, children: _jsxs(Text, { children: [accent('Step 3 of 3'), " \u2014 How should the role be designed?"] }) }), _jsx(Box, { marginBottom: 1, children: _jsx(Text, { children: muted('Pick how much of the design work you want to do yourself versus offload.') }) }), _jsx(SelectInput, { items: ITEMS, onSelect: (item) => onNext(item.value) }), _jsx(Box, { marginTop: 1, children: _jsx(Text, { dimColor: true, children: "\u2191/\u2193 to choose \u00B7 enter to confirm \u00B7 esc to cancel" }) })] }));
|
|
21
|
+
};
|
|
22
|
+
//# sourceMappingURL=path-choice.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"path-choice.js","sourceRoot":"","sources":["../../src/flows/path-choice.tsx"],"names":[],"mappings":";AACA,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,KAAK,CAAC;AAC1C,OAAO,WAAW,MAAM,kBAAkB,CAAC;AAC3C,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,gBAAgB,CAAC;AAS/C,MAAM,KAAK,GAAG;IACZ;QACE,KAAK,EAAE,yDAAyD;QAChE,KAAK,EAAE,UAAmB;KAC3B;IACD;QACE,KAAK,EAAE,oEAAoE;QAC3E,KAAK,EAAE,QAAiB;KACzB;CACF,CAAC;AAEF,MAAM,CAAC,MAAM,cAAc,GAAG,CAAC,EAAE,MAAM,EAAE,QAAQ,EAAS,EAAE,EAAE;IAC5D,QAAQ,CAAC,CAAC,MAAM,EAAE,GAAG,EAAE,EAAE;QACvB,IAAI,GAAG,CAAC,MAAM;YAAE,QAAQ,EAAE,CAAC;IAC7B,CAAC,CAAC,CAAC;IAEH,OAAO,CACL,MAAC,GAAG,IAAC,aAAa,EAAC,QAAQ,aACzB,KAAC,GAAG,IAAC,YAAY,EAAE,CAAC,YAClB,MAAC,IAAI,eAAE,MAAM,CAAC,aAAa,CAAC,gDAA2C,GACnE,EAEN,KAAC,GAAG,IAAC,YAAY,EAAE,CAAC,YAClB,KAAC,IAAI,cACF,KAAK,CACJ,0EAA0E,CAC3E,GACI,GACH,EAEN,KAAC,WAAW,IAAC,KAAK,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,GAAI,EAErE,KAAC,GAAG,IAAC,SAAS,EAAE,CAAC,YACf,KAAC,IAAI,IAAC,QAAQ,2FAAwD,GAClE,IACF,CACP,CAAC;AACJ,CAAC,CAAC"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { Box, Text, useInput } from 'ink';
|
|
3
|
+
import { accent, danger, muted, warn } from '../ui/theme.js';
|
|
4
|
+
import { adaptFormToSeedInput } from '../lib/seed-adapter.js';
|
|
5
|
+
/**
|
|
6
|
+
* Pre-write summary screen. Shows the form state, validates it against the
|
|
7
|
+
* seed package's schema, and waits for the operator to either confirm
|
|
8
|
+
* (enter) or cancel (esc / q). Keeping confirm in its own step means the
|
|
9
|
+
* actual write happens deterministically without a flicker of the form
|
|
10
|
+
* dump while the seeder runs.
|
|
11
|
+
*/
|
|
12
|
+
export const Review = ({ form, scaffoldPath, onConfirm, onCancel }) => {
|
|
13
|
+
const validation = adaptFormToSeedInput(form);
|
|
14
|
+
useInput((input, key) => {
|
|
15
|
+
if (key.return && validation.ok) {
|
|
16
|
+
onConfirm();
|
|
17
|
+
return;
|
|
18
|
+
}
|
|
19
|
+
if (input === 'q' || key.escape) {
|
|
20
|
+
onCancel();
|
|
21
|
+
}
|
|
22
|
+
});
|
|
23
|
+
return (_jsxs(Box, { flexDirection: "column", children: [_jsx(Box, { marginBottom: 1, children: _jsx(Text, { children: accent('Review') }) }), _jsx(Box, { marginBottom: 1, children: _jsxs(Text, { children: [muted('Target path:'), " ", accent(scaffoldPath)] }) }), _jsxs(Box, { marginBottom: 1, flexDirection: "column", children: [_jsx(Text, { children: muted('Captured form:') }), _jsxs(Box, { marginLeft: 2, flexDirection: "column", children: [_jsxs(Text, { children: [muted('organisation:'), ' ', Object.keys(form.organisation).length === 0
|
|
24
|
+
? muted('(empty)')
|
|
25
|
+
: JSON.stringify(form.organisation)] }), _jsxs(Text, { children: [muted('role_definition:'), ' ', Object.keys(form.role_definition).length === 0
|
|
26
|
+
? muted('(empty)')
|
|
27
|
+
: JSON.stringify(form.role_definition)] }), _jsxs(Text, { children: [muted('path:'), " ", form.path] }), _jsxs(Text, { children: [muted('tools:'), ' ', form.tools.length === 0 ? muted('(none)') : JSON.stringify(form.tools)] }), _jsxs(Text, { children: [muted('voice_traits:'), ' ', form.voice_traits.length === 0 ? muted('(none)') : JSON.stringify(form.voice_traits)] }), _jsxs(Text, { children: [muted('capabilities:'), ' ', form.capabilities.length === 0 ? muted('(none)') : JSON.stringify(form.capabilities)] }), _jsxs(Text, { children: [muted('inhibitions:'), ' ', form.inhibitions.length === 0 ? muted('(none)') : JSON.stringify(form.inhibitions)] }), _jsxs(Text, { children: [muted('initial_verbs:'), ' ', form.initial_verbs.length === 0
|
|
28
|
+
? muted('(none)')
|
|
29
|
+
: JSON.stringify(form.initial_verbs)] })] })] }), !validation.ok ? (_jsxs(Box, { marginBottom: 1, flexDirection: "column", children: [_jsx(Text, { children: warn('Cannot write — form has validation issues:') }), _jsx(Box, { marginLeft: 2, flexDirection: "column", children: validation.issues.map((issue) => (_jsxs(Text, { children: [danger(issue.path), " ", muted('—'), " ", issue.message] }, `${issue.path}:${issue.message}`))) })] })) : null, _jsx(Box, { marginTop: 1, children: validation.ok ? (_jsx(Text, { dimColor: true, children: "Press enter to write \u00B7 esc to cancel" })) : (_jsx(Text, { dimColor: true, children: "Press esc to cancel" })) })] }));
|
|
30
|
+
};
|
|
31
|
+
//# sourceMappingURL=review.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"review.js","sourceRoot":"","sources":["../../src/flows/review.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
import { jsxs as _jsxs, jsx as _jsx } from "react/jsx-runtime";
|
|
2
|
+
import { useState } from 'react';
|
|
3
|
+
import { Box, Text, useInput } from 'ink';
|
|
4
|
+
import TextInput from 'ink-text-input';
|
|
5
|
+
import { accent, muted, ok } from '../ui/theme.js';
|
|
6
|
+
const ORDER = [
|
|
7
|
+
'role_name',
|
|
8
|
+
'working_title',
|
|
9
|
+
'one_sentence_purpose',
|
|
10
|
+
'day_to_day',
|
|
11
|
+
];
|
|
12
|
+
const PROMPTS = {
|
|
13
|
+
role_name: {
|
|
14
|
+
label: 'Role name',
|
|
15
|
+
hint: 'a short identifier — e.g. bd, support, account-curator',
|
|
16
|
+
required: true,
|
|
17
|
+
},
|
|
18
|
+
working_title: {
|
|
19
|
+
label: 'Working title',
|
|
20
|
+
hint: 'optional — e.g. "BD Lead", "Customer Success"',
|
|
21
|
+
required: false,
|
|
22
|
+
},
|
|
23
|
+
one_sentence_purpose: {
|
|
24
|
+
label: 'One-sentence purpose',
|
|
25
|
+
hint: 'what this role exists to do',
|
|
26
|
+
required: true,
|
|
27
|
+
},
|
|
28
|
+
day_to_day: {
|
|
29
|
+
label: 'Day-to-day work',
|
|
30
|
+
hint: 'optional — what an average day looks like',
|
|
31
|
+
required: false,
|
|
32
|
+
},
|
|
33
|
+
};
|
|
34
|
+
export const RoleDefinitionFlow = ({ initial, onNext, onCancel }) => {
|
|
35
|
+
const [draft, setDraft] = useState({ ...initial });
|
|
36
|
+
const [fieldIdx, setFieldIdx] = useState(0);
|
|
37
|
+
const [textValue, setTextValue] = useState('');
|
|
38
|
+
const [error, setError] = useState(null);
|
|
39
|
+
useInput((_input, key) => {
|
|
40
|
+
if (key.escape)
|
|
41
|
+
onCancel();
|
|
42
|
+
});
|
|
43
|
+
const field = ORDER[fieldIdx];
|
|
44
|
+
if (!field)
|
|
45
|
+
return null;
|
|
46
|
+
const prompt = PROMPTS[field];
|
|
47
|
+
const handleSubmit = (value) => {
|
|
48
|
+
const trimmed = value.trim();
|
|
49
|
+
if (prompt.required && trimmed.length === 0) {
|
|
50
|
+
setError('This field is required.');
|
|
51
|
+
return;
|
|
52
|
+
}
|
|
53
|
+
const nextDraft = { ...draft };
|
|
54
|
+
if (trimmed.length === 0) {
|
|
55
|
+
delete nextDraft[field];
|
|
56
|
+
}
|
|
57
|
+
else {
|
|
58
|
+
nextDraft[field] = trimmed;
|
|
59
|
+
}
|
|
60
|
+
setDraft(nextDraft);
|
|
61
|
+
setError(null);
|
|
62
|
+
setTextValue('');
|
|
63
|
+
if (fieldIdx === ORDER.length - 1) {
|
|
64
|
+
onNext(nextDraft);
|
|
65
|
+
}
|
|
66
|
+
else {
|
|
67
|
+
setFieldIdx(fieldIdx + 1);
|
|
68
|
+
}
|
|
69
|
+
};
|
|
70
|
+
return (_jsxs(Box, { flexDirection: "column", children: [_jsx(Box, { marginBottom: 1, children: _jsxs(Text, { children: [accent('Step 2 of 3'), " \u2014 Define the role"] }) }), ORDER.slice(0, fieldIdx).map((f) => {
|
|
71
|
+
const v = draft[f];
|
|
72
|
+
if (v === undefined || v === '')
|
|
73
|
+
return null;
|
|
74
|
+
return (_jsx(Box, { children: _jsxs(Text, { children: [ok('✓'), " ", muted(PROMPTS[f].label), ": ", _jsx(Text, { children: String(v) })] }) }, f));
|
|
75
|
+
}), _jsxs(Box, { marginTop: 1, flexDirection: "column", children: [_jsxs(Text, { children: [_jsx(Text, { color: "cyan", children: "?" }), " ", prompt.label, ' ', _jsxs(Text, { dimColor: true, children: ["(", prompt.hint, ")"] })] }), _jsxs(Box, { children: [_jsx(Text, { children: muted('› ') }), _jsx(TextInput, { value: textValue, onChange: setTextValue, onSubmit: handleSubmit, placeholder: prompt.required ? '' : '(leave blank to skip)' })] }), error ? (_jsx(Box, { marginTop: 1, children: _jsx(Text, { color: "red", children: error }) })) : null] }), _jsx(Box, { marginTop: 1, children: _jsx(Text, { dimColor: true, children: "Esc to cancel" }) })] }));
|
|
76
|
+
};
|
|
77
|
+
//# sourceMappingURL=role-definition.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"role-definition.js","sourceRoot":"","sources":["../../src/flows/role-definition.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { useMemo, useState } from 'react';
|
|
3
|
+
import { Box, Text, useInput } from 'ink';
|
|
4
|
+
import { accent, muted, ok } from '../ui/theme.js';
|
|
5
|
+
export const ToolSelection = ({ catalog, initial, onNext, onCancel }) => {
|
|
6
|
+
const optional = useMemo(() => catalog.optional(), [catalog]);
|
|
7
|
+
const builtins = useMemo(() => catalog.builtins(), [catalog]);
|
|
8
|
+
const [cursor, setCursor] = useState(0);
|
|
9
|
+
const [selected, setSelected] = useState(() => {
|
|
10
|
+
// Pre-check anything in `initial` that's actually in the catalog —
|
|
11
|
+
// silently drop names that aren't (e.g. removed from a future catalog).
|
|
12
|
+
const optionalNames = new Set(optional.map((c) => c.name));
|
|
13
|
+
return new Set(initial.filter((n) => optionalNames.has(n)));
|
|
14
|
+
});
|
|
15
|
+
useInput((input, key) => {
|
|
16
|
+
if (key.escape) {
|
|
17
|
+
onCancel();
|
|
18
|
+
return;
|
|
19
|
+
}
|
|
20
|
+
if (key.return) {
|
|
21
|
+
onNext([...selected]);
|
|
22
|
+
return;
|
|
23
|
+
}
|
|
24
|
+
if (key.upArrow || input === 'k') {
|
|
25
|
+
if (optional.length === 0)
|
|
26
|
+
return;
|
|
27
|
+
setCursor((c) => (c - 1 + optional.length) % optional.length);
|
|
28
|
+
return;
|
|
29
|
+
}
|
|
30
|
+
if (key.downArrow || input === 'j') {
|
|
31
|
+
if (optional.length === 0)
|
|
32
|
+
return;
|
|
33
|
+
setCursor((c) => (c + 1) % optional.length);
|
|
34
|
+
return;
|
|
35
|
+
}
|
|
36
|
+
if (input === ' ') {
|
|
37
|
+
const item = optional[cursor];
|
|
38
|
+
if (!item)
|
|
39
|
+
return;
|
|
40
|
+
setSelected((prev) => {
|
|
41
|
+
const next = new Set(prev);
|
|
42
|
+
if (next.has(item.name)) {
|
|
43
|
+
next.delete(item.name);
|
|
44
|
+
}
|
|
45
|
+
else {
|
|
46
|
+
next.add(item.name);
|
|
47
|
+
}
|
|
48
|
+
return next;
|
|
49
|
+
});
|
|
50
|
+
}
|
|
51
|
+
});
|
|
52
|
+
// Pad the capability name column so the description aligns. Use the
|
|
53
|
+
// longest optional name as the basis — clamps small layouts gracefully.
|
|
54
|
+
const nameWidth = optional.reduce((max, c) => Math.max(max, c.name.length), 0);
|
|
55
|
+
return (_jsxs(Box, { flexDirection: "column", children: [_jsx(Box, { marginBottom: 1, children: _jsx(Text, { children: accent('Tool capabilities') }) }), _jsx(Box, { marginBottom: 1, children: _jsx(Text, { children: muted('Capabilities available to this role.') }) }), builtins.length > 0 ? (_jsx(Box, { marginBottom: 1, children: _jsxs(Text, { children: [muted('Always present:'), ' ', _jsx(Text, { children: builtins.map((c) => c.name).join(', ') })] }) })) : null, optional.length === 0 ? (_jsx(Box, { marginBottom: 1, children: _jsx(Text, { children: muted('No optional capabilities in the catalog.') }) })) : (_jsx(Box, { flexDirection: "column", children: optional.map((cap, idx) => (_jsx(Row, { cap: cap, checked: selected.has(cap.name), focused: idx === cursor, nameWidth: nameWidth }, cap.name))) })), _jsx(Box, { marginTop: 1, children: _jsx(Text, { dimColor: true, children: "\u2191/\u2193 to move \u00B7 space to toggle \u00B7 enter to confirm \u00B7 esc to cancel" }) })] }));
|
|
56
|
+
};
|
|
57
|
+
const Row = ({ cap, checked, focused, nameWidth }) => {
|
|
58
|
+
const cursor = focused ? accent('›') : ' ';
|
|
59
|
+
const box = checked ? ok('[x]') : '[ ]';
|
|
60
|
+
const namePadded = cap.name.padEnd(nameWidth, ' ');
|
|
61
|
+
return (_jsx(Box, { children: _jsxs(Text, { children: [cursor, " ", box, " ", _jsx(Text, { children: namePadded }), ' ', muted('· ' + cap.description)] }) }));
|
|
62
|
+
};
|
|
63
|
+
//# sourceMappingURL=tools.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tools.js","sourceRoot":"","sources":["../../src/flows/tools.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,146 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { useState } from 'react';
|
|
3
|
+
import { Box, Text, useInput } from 'ink';
|
|
4
|
+
import { TRAIT_LIBRARY, findTrait } from '../lib/traits.js';
|
|
5
|
+
import { ListBuilder } from '../ui/list-builder.js';
|
|
6
|
+
import { accent, danger, muted, ok } from '../ui/theme.js';
|
|
7
|
+
const MIN_TRAITS = 1;
|
|
8
|
+
const MAX_TRAITS = 8;
|
|
9
|
+
const MAX_QUALIFIERS_PER_TRAIT = 5;
|
|
10
|
+
export const VoiceFlow = ({ initial, onNext, onCancel }) => {
|
|
11
|
+
// Seed the cloud's selection from any prior wizard pass — the previously
|
|
12
|
+
// chosen canonical names map straight to the library, and the per-trait
|
|
13
|
+
// qualifiers ride along under the same `traitsByName` map for stage 2.
|
|
14
|
+
const initialSelected = initial
|
|
15
|
+
.map((t) => t.trait)
|
|
16
|
+
.filter((name) => TRAIT_LIBRARY.some((entry) => entry.name === name));
|
|
17
|
+
const [stage, setStage] = useState({
|
|
18
|
+
kind: 'select',
|
|
19
|
+
selected: initialSelected,
|
|
20
|
+
});
|
|
21
|
+
// Authored qualifiers, keyed by trait name. Survives moving between
|
|
22
|
+
// stage 1 and stage 2 (in case the operator backs out of qualifying to
|
|
23
|
+
// adjust the trait set) without losing the work in progress.
|
|
24
|
+
const [qualifiers, setQualifiers] = useState(() => {
|
|
25
|
+
const out = {};
|
|
26
|
+
for (const entry of initial) {
|
|
27
|
+
out[entry.trait] = [...entry.qualifiers];
|
|
28
|
+
}
|
|
29
|
+
return out;
|
|
30
|
+
});
|
|
31
|
+
if (stage.kind === 'select') {
|
|
32
|
+
return (_jsx(TraitCloud, { initialSelected: stage.selected, onCancel: onCancel, onNext: (selected) => {
|
|
33
|
+
// Drop qualifier entries for traits that were unchecked, but keep
|
|
34
|
+
// any work-in-progress qualifiers for still-selected traits.
|
|
35
|
+
setQualifiers((prev) => {
|
|
36
|
+
const next = {};
|
|
37
|
+
for (const name of selected) {
|
|
38
|
+
next[name] = prev[name] ?? [];
|
|
39
|
+
}
|
|
40
|
+
return next;
|
|
41
|
+
});
|
|
42
|
+
setStage({ kind: 'qualify', selected, cursor: 0 });
|
|
43
|
+
} }));
|
|
44
|
+
}
|
|
45
|
+
// Qualifying stage — one trait at a time. The cursor is always derived
|
|
46
|
+
// from a `selected` array we just built, so an out-of-range cursor would
|
|
47
|
+
// be a bug rather than a user-reachable state; render an error rather
|
|
48
|
+
// than side-effect during render.
|
|
49
|
+
const traitName = stage.selected[stage.cursor];
|
|
50
|
+
if (!traitName) {
|
|
51
|
+
return (_jsx(Box, { children: _jsx(Text, { children: danger('Internal: trait cursor out of range — please cancel and retry.') }) }));
|
|
52
|
+
}
|
|
53
|
+
const traitEntry = findTrait(traitName);
|
|
54
|
+
return (_jsx(QualifyTrait, { traitName: traitName, traitEntry: traitEntry, position: stage.cursor + 1, total: stage.selected.length, initial: qualifiers[traitName] ?? [], onCancel: () => setStage({ kind: 'select', selected: stage.selected }), onNext: (next) => {
|
|
55
|
+
setQualifiers((prev) => ({ ...prev, [traitName]: next }));
|
|
56
|
+
if (stage.cursor === stage.selected.length - 1) {
|
|
57
|
+
finalise(stage.selected, { ...qualifiers, [traitName]: next }, onNext);
|
|
58
|
+
return;
|
|
59
|
+
}
|
|
60
|
+
setStage({ ...stage, cursor: stage.cursor + 1 });
|
|
61
|
+
} }));
|
|
62
|
+
};
|
|
63
|
+
function finalise(selected, qualifiers, onNext) {
|
|
64
|
+
const out = selected.map((name) => ({
|
|
65
|
+
trait: name,
|
|
66
|
+
qualifiers: (qualifiers[name] ?? []).map((q) => q.trim()).filter((q) => q.length > 0),
|
|
67
|
+
}));
|
|
68
|
+
onNext(out);
|
|
69
|
+
}
|
|
70
|
+
const TraitCloud = ({ initialSelected, onNext, onCancel }) => {
|
|
71
|
+
const [cursor, setCursor] = useState(0);
|
|
72
|
+
const [selected, setSelected] = useState(() => new Set(initialSelected));
|
|
73
|
+
const [error, setError] = useState(null);
|
|
74
|
+
useInput((input, key) => {
|
|
75
|
+
if (key.escape) {
|
|
76
|
+
onCancel();
|
|
77
|
+
return;
|
|
78
|
+
}
|
|
79
|
+
if (key.return) {
|
|
80
|
+
if (selected.size < MIN_TRAITS) {
|
|
81
|
+
setError(`Pick at least ${MIN_TRAITS} trait.`);
|
|
82
|
+
return;
|
|
83
|
+
}
|
|
84
|
+
// Preserve the canonical library order — the operator's selection set
|
|
85
|
+
// is unordered, but the persona reads better with a predictable order.
|
|
86
|
+
const ordered = TRAIT_LIBRARY.filter((t) => selected.has(t.name)).map((t) => t.name);
|
|
87
|
+
onNext(ordered);
|
|
88
|
+
return;
|
|
89
|
+
}
|
|
90
|
+
if (key.upArrow) {
|
|
91
|
+
if (TRAIT_LIBRARY.length === 0)
|
|
92
|
+
return;
|
|
93
|
+
setCursor((c) => (c - 1 + TRAIT_LIBRARY.length) % TRAIT_LIBRARY.length);
|
|
94
|
+
return;
|
|
95
|
+
}
|
|
96
|
+
if (key.downArrow) {
|
|
97
|
+
if (TRAIT_LIBRARY.length === 0)
|
|
98
|
+
return;
|
|
99
|
+
setCursor((c) => (c + 1) % TRAIT_LIBRARY.length);
|
|
100
|
+
return;
|
|
101
|
+
}
|
|
102
|
+
if (input === ' ') {
|
|
103
|
+
const entry = TRAIT_LIBRARY[cursor];
|
|
104
|
+
if (!entry)
|
|
105
|
+
return;
|
|
106
|
+
setSelected((prev) => {
|
|
107
|
+
const next = new Set(prev);
|
|
108
|
+
if (next.has(entry.name)) {
|
|
109
|
+
next.delete(entry.name);
|
|
110
|
+
}
|
|
111
|
+
else if (next.size >= MAX_TRAITS) {
|
|
112
|
+
setError(`At most ${MAX_TRAITS} traits.`);
|
|
113
|
+
return prev;
|
|
114
|
+
}
|
|
115
|
+
else {
|
|
116
|
+
next.add(entry.name);
|
|
117
|
+
}
|
|
118
|
+
setError(null);
|
|
119
|
+
return next;
|
|
120
|
+
});
|
|
121
|
+
}
|
|
122
|
+
});
|
|
123
|
+
const nameWidth = TRAIT_LIBRARY.reduce((max, t) => Math.max(max, t.name.length), 0);
|
|
124
|
+
return (_jsxs(Box, { flexDirection: "column", children: [_jsx(Box, { marginBottom: 1, children: _jsx(Text, { children: accent('Voice & personality — pick traits') }) }), _jsx(Box, { marginBottom: 1, children: _jsx(Text, { children: muted(`Pick ${MIN_TRAITS}-${MAX_TRAITS} traits that describe how this role should sound. You'll qualify each one in the next step.`) }) }), _jsx(Box, { flexDirection: "column", children: TRAIT_LIBRARY.map((entry, idx) => (_jsx(CloudRow, { entry: entry, checked: selected.has(entry.name), focused: idx === cursor, nameWidth: nameWidth }, entry.name))) }), error ? (_jsx(Box, { marginTop: 1, children: _jsx(Text, { children: danger(error) }) })) : null, _jsx(Box, { marginTop: 1, children: _jsx(Text, { dimColor: true, children: `↑/↓ to move · space to toggle · enter to continue · esc to cancel · ${selected.size}/${MAX_TRAITS} selected` }) })] }));
|
|
125
|
+
};
|
|
126
|
+
const CloudRow = ({ entry, checked, focused, nameWidth }) => {
|
|
127
|
+
const cursor = focused ? accent('›') : ' ';
|
|
128
|
+
const box = checked ? ok('[x]') : '[ ]';
|
|
129
|
+
const namePadded = entry.name.padEnd(nameWidth, ' ');
|
|
130
|
+
return (_jsx(Box, { children: _jsxs(Text, { children: [cursor, " ", box, " ", _jsx(Text, { children: namePadded }), ' ', muted('· ' + entry.description)] }) }));
|
|
131
|
+
};
|
|
132
|
+
const QUALIFIER_FIELDS = [
|
|
133
|
+
{
|
|
134
|
+
key: 'text',
|
|
135
|
+
label: 'qualifier',
|
|
136
|
+
placeholder: 'how this trait shows up in practice (or leave blank to skip)',
|
|
137
|
+
extract: (r) => r.text,
|
|
138
|
+
apply: (r, v) => ({ ...r, text: v }),
|
|
139
|
+
},
|
|
140
|
+
];
|
|
141
|
+
const QualifyTrait = ({ traitName, traitEntry, position, total, initial, onNext, onCancel, }) => {
|
|
142
|
+
const initialRows = initial.map((text) => ({ text }));
|
|
143
|
+
const description = traitEntry?.description ?? null;
|
|
144
|
+
return (_jsxs(Box, { flexDirection: "column", children: [_jsx(Box, { children: _jsx(Text, { children: muted(`trait ${position} of ${total}`) }) }), _jsx(Box, { children: _jsxs(Text, { children: [accent('→ '), accent(traitName)] }) }), description ? (_jsx(Box, { marginBottom: 1, children: _jsx(Text, { children: muted(description) }) })) : (_jsx(Box, { marginBottom: 1 })), _jsx(Box, { marginBottom: 1, children: _jsx(Text, { children: muted('Author 0-5 qualifiers describing how this trait should manifest. Leave blank to ride out with the description above.') }) }), _jsx(ListBuilder, { title: "", helper: "", initial: initialRows, fields: QUALIFIER_FIELDS, empty: () => ({ text: '' }), validate: (r) => (r.text.trim().length === 0 ? 'qualifier text is required' : null), min: 0, max: MAX_QUALIFIERS_PER_TRAIT, onNext: (rows) => onNext(rows.map((r) => r.text.trim()).filter((t) => t.length > 0)), onCancel: onCancel }, traitName), _jsx(Box, { marginTop: 1, children: _jsx(Text, { dimColor: true, children: "Tip: enter on the last (or empty) row advances to the next trait. Esc returns to the trait cloud." }) })] }));
|
|
145
|
+
};
|
|
146
|
+
//# sourceMappingURL=voice.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"voice.js","sourceRoot":"","sources":["../../src/flows/voice.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { jsxs as _jsxs, jsx as _jsx } from "react/jsx-runtime";
|
|
2
|
+
import { Box, Text, useInput } from 'ink';
|
|
3
|
+
import { muted, accent } from '../ui/theme.js';
|
|
4
|
+
/** Welcome step. Header is rendered by App so it persists across the wizard. */
|
|
5
|
+
export const Welcome = ({ onNext, onCancel }) => {
|
|
6
|
+
useInput((input, key) => {
|
|
7
|
+
if (key.return) {
|
|
8
|
+
onNext();
|
|
9
|
+
return;
|
|
10
|
+
}
|
|
11
|
+
if (input === 'q' || key.escape) {
|
|
12
|
+
onCancel();
|
|
13
|
+
}
|
|
14
|
+
});
|
|
15
|
+
return (_jsxs(Box, { flexDirection: "column", children: [_jsx(Box, { children: _jsxs(Text, { children: [accent('Welcome.'), " This wizard sets up a new role for your business."] }) }), _jsx(Box, { marginTop: 1, children: _jsxs(Text, { children: ["You", "'", "ll describe your organisation, the role you want to fill, and how you", "'", "d like the role designed."] }) }), _jsx(Box, { marginTop: 2, children: _jsx(Text, { children: muted('Press enter to begin · q to quit') }) })] }));
|
|
16
|
+
};
|
|
17
|
+
//# sourceMappingURL=welcome.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"welcome.js","sourceRoot":"","sources":["../../src/flows/welcome.tsx"],"names":[],"mappings":";AACA,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,KAAK,CAAC;AAC1C,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,gBAAgB,CAAC;AAO/C,gFAAgF;AAChF,MAAM,CAAC,MAAM,OAAO,GAAG,CAAC,EAAE,MAAM,EAAE,QAAQ,EAAS,EAAE,EAAE;IACrD,QAAQ,CAAC,CAAC,KAAK,EAAE,GAAG,EAAE,EAAE;QACtB,IAAI,GAAG,CAAC,MAAM,EAAE,CAAC;YACf,MAAM,EAAE,CAAC;YACT,OAAO;QACT,CAAC;QACD,IAAI,KAAK,KAAK,GAAG,IAAI,GAAG,CAAC,MAAM,EAAE,CAAC;YAChC,QAAQ,EAAE,CAAC;QACb,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,OAAO,CACL,MAAC,GAAG,IAAC,aAAa,EAAC,QAAQ,aACzB,KAAC,GAAG,cACF,MAAC,IAAI,eACF,MAAM,CAAC,UAAU,CAAC,0DACd,GACH,EACN,KAAC,GAAG,IAAC,SAAS,EAAE,CAAC,YACf,MAAC,IAAI,sBACC,GAAG,2EACC,GAAG,iCACN,GACH,EACN,KAAC,GAAG,IAAC,SAAS,EAAE,CAAC,YACf,KAAC,IAAI,cAAE,KAAK,CAAC,kCAAkC,CAAC,GAAQ,GACpD,IACF,CACP,CAAC;AACJ,CAAC,CAAC"}
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { useEffect, useState } from 'react';
|
|
3
|
+
import { Box, Text, useInput } from 'ink';
|
|
4
|
+
import Spinner from 'ink-spinner';
|
|
5
|
+
import { SeedError, seedRole } from '@praxis-framework/seed';
|
|
6
|
+
import { accent, danger, muted, ok, warn } from '../ui/theme.js';
|
|
7
|
+
/**
|
|
8
|
+
* Runs `seedRole` against the operator-confirmed input, then renders the
|
|
9
|
+
* result. The wizard's terminal step — there's nowhere to go after this
|
|
10
|
+
* but exit. Any keypress closes the app once the seed has resolved.
|
|
11
|
+
*/
|
|
12
|
+
export const Wrote = ({ input, scaffoldPath, onExit }) => {
|
|
13
|
+
const [state, setState] = useState({ kind: 'writing' });
|
|
14
|
+
useEffect(() => {
|
|
15
|
+
let cancelled = false;
|
|
16
|
+
seedRole(input, scaffoldPath)
|
|
17
|
+
.then((result) => {
|
|
18
|
+
if (!cancelled)
|
|
19
|
+
setState({ kind: 'success', result });
|
|
20
|
+
})
|
|
21
|
+
.catch((err) => {
|
|
22
|
+
if (cancelled)
|
|
23
|
+
return;
|
|
24
|
+
const message = err instanceof SeedError
|
|
25
|
+
? `${err.code}: ${err.message}`
|
|
26
|
+
: err instanceof Error
|
|
27
|
+
? err.message
|
|
28
|
+
: String(err);
|
|
29
|
+
setState({ kind: 'error', message });
|
|
30
|
+
});
|
|
31
|
+
return () => {
|
|
32
|
+
cancelled = true;
|
|
33
|
+
};
|
|
34
|
+
}, [input, scaffoldPath]);
|
|
35
|
+
useInput((_input, key) => {
|
|
36
|
+
if (state.kind === 'writing')
|
|
37
|
+
return;
|
|
38
|
+
if (key.return || key.escape || _input === 'q')
|
|
39
|
+
onExit();
|
|
40
|
+
});
|
|
41
|
+
if (state.kind === 'writing') {
|
|
42
|
+
return (_jsx(Box, { flexDirection: "column", children: _jsxs(Box, { children: [_jsx(Text, { color: "cyan", children: _jsx(Spinner, { type: "dots" }) }), _jsxs(Text, { children: [" ", muted('Writing role files...')] })] }) }));
|
|
43
|
+
}
|
|
44
|
+
if (state.kind === 'error') {
|
|
45
|
+
return (_jsxs(Box, { flexDirection: "column", children: [_jsx(Box, { marginBottom: 1, children: _jsx(Text, { children: danger('Seed failed.') }) }), _jsx(Box, { marginBottom: 1, children: _jsx(Text, { children: warn(state.message) }) }), _jsx(Box, { marginBottom: 1, children: _jsxs(Text, { children: [muted('Target path:'), " ", accent(scaffoldPath)] }) }), _jsx(Box, { marginTop: 1, children: _jsx(Text, { dimColor: true, children: "Press any key to exit" }) })] }));
|
|
46
|
+
}
|
|
47
|
+
// success
|
|
48
|
+
const { result } = state;
|
|
49
|
+
return (_jsxs(Box, { flexDirection: "column", children: [_jsx(Box, { marginBottom: 1, children: _jsxs(Text, { children: [ok(`Wrote ${result.filesWritten.length} files`), " ", muted('to'), " ", accent(result.targetPath)] }) }), _jsx(Box, { flexDirection: "column", marginLeft: 2, children: result.filesWritten.map((rel) => (_jsxs(Text, { children: [muted('+'), " ", rel] }, rel))) }), result.filesSkipped.length > 0 ? (_jsxs(Box, { flexDirection: "column", marginTop: 1, children: [_jsx(Text, { children: warn(`Skipped ${result.filesSkipped.length} pre-existing files:`) }), _jsx(Box, { flexDirection: "column", marginLeft: 2, children: result.filesSkipped.map((rel) => (_jsxs(Text, { children: [muted('·'), " ", rel] }, rel))) })] })) : null, _jsx(Box, { marginTop: 1, children: _jsx(Text, { dimColor: true, children: "Press enter to exit" }) })] }));
|
|
50
|
+
};
|
|
51
|
+
//# sourceMappingURL=wrote.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"wrote.js","sourceRoot":"","sources":["../../src/flows/wrote.tsx"],"names":[],"mappings":"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"}
|