@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.
Files changed (53) hide show
  1. package/README.md +51 -0
  2. package/dist/app.js +122 -0
  3. package/dist/app.js.map +1 -0
  4. package/dist/commands/init-config.js +85 -0
  5. package/dist/commands/init-config.js.map +1 -0
  6. package/dist/commands/init.js +59 -0
  7. package/dist/commands/init.js.map +1 -0
  8. package/dist/commands/log.js +171 -0
  9. package/dist/commands/log.js.map +1 -0
  10. package/dist/flows/capabilities.js +14 -0
  11. package/dist/flows/capabilities.js.map +1 -0
  12. package/dist/flows/inhibitions.js +14 -0
  13. package/dist/flows/inhibitions.js.map +1 -0
  14. package/dist/flows/initial-verbs.js +82 -0
  15. package/dist/flows/initial-verbs.js.map +1 -0
  16. package/dist/flows/organisation.js +112 -0
  17. package/dist/flows/organisation.js.map +1 -0
  18. package/dist/flows/path-choice.js +22 -0
  19. package/dist/flows/path-choice.js.map +1 -0
  20. package/dist/flows/review.js +31 -0
  21. package/dist/flows/review.js.map +1 -0
  22. package/dist/flows/role-definition.js +77 -0
  23. package/dist/flows/role-definition.js.map +1 -0
  24. package/dist/flows/tools.js +63 -0
  25. package/dist/flows/tools.js.map +1 -0
  26. package/dist/flows/voice.js +146 -0
  27. package/dist/flows/voice.js.map +1 -0
  28. package/dist/flows/welcome.js +17 -0
  29. package/dist/flows/welcome.js.map +1 -0
  30. package/dist/flows/wrote.js +51 -0
  31. package/dist/flows/wrote.js.map +1 -0
  32. package/dist/index.js +57 -0
  33. package/dist/index.js.map +1 -0
  34. package/dist/lib/catalog.js +190 -0
  35. package/dist/lib/catalog.js.map +1 -0
  36. package/dist/lib/seed-adapter.js +28 -0
  37. package/dist/lib/seed-adapter.js.map +1 -0
  38. package/dist/lib/traits.js +13 -0
  39. package/dist/lib/traits.js.map +1 -0
  40. package/dist/state/form.js +63 -0
  41. package/dist/state/form.js.map +1 -0
  42. package/dist/state/steps.js +28 -0
  43. package/dist/state/steps.js.map +1 -0
  44. package/dist/ui/header.js +14 -0
  45. package/dist/ui/header.js.map +1 -0
  46. package/dist/ui/list-builder-state.js +179 -0
  47. package/dist/ui/list-builder-state.js.map +1 -0
  48. package/dist/ui/list-builder.js +144 -0
  49. package/dist/ui/list-builder.js.map +1 -0
  50. package/dist/ui/theme.js +8 -0
  51. package/dist/ui/theme.js.map +1 -0
  52. package/examples/sample-role.json +24 -0
  53. 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":";AAAA,OAAc,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AACjD,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,KAAK,CAAC;AAE1C,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,EAAE,EAAE,MAAM,gBAAgB,CAAC;AAenD,MAAM,CAAC,MAAM,aAAa,GAAG,CAAC,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAS,EAAE,EAAE;IAC7E,MAAM,QAAQ,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC,OAAO,CAAC,QAAQ,EAAE,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC;IAC9D,MAAM,QAAQ,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC,OAAO,CAAC,QAAQ,EAAE,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC;IAE9D,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAC;IACxC,MAAM,CAAC,QAAQ,EAAE,WAAW,CAAC,GAAG,QAAQ,CAAc,GAAG,EAAE;QACzD,mEAAmE;QACnE,wEAAwE;QACxE,MAAM,aAAa,GAAG,IAAI,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;QAC3D,OAAO,IAAI,GAAG,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAC9D,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,CAAC,KAAK,EAAE,GAAG,EAAE,EAAE;QACtB,IAAI,GAAG,CAAC,MAAM,EAAE,CAAC;YACf,QAAQ,EAAE,CAAC;YACX,OAAO;QACT,CAAC;QACD,IAAI,GAAG,CAAC,MAAM,EAAE,CAAC;YACf,MAAM,CAAC,CAAC,GAAG,QAAQ,CAAC,CAAC,CAAC;YACtB,OAAO;QACT,CAAC;QACD,IAAI,GAAG,CAAC,OAAO,IAAI,KAAK,KAAK,GAAG,EAAE,CAAC;YACjC,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC;gBAAE,OAAO;YAClC,SAAS,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,QAAQ,CAAC,MAAM,CAAC,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC;YAC9D,OAAO;QACT,CAAC;QACD,IAAI,GAAG,CAAC,SAAS,IAAI,KAAK,KAAK,GAAG,EAAE,CAAC;YACnC,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC;gBAAE,OAAO;YAClC,SAAS,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC;YAC5C,OAAO;QACT,CAAC;QACD,IAAI,KAAK,KAAK,GAAG,EAAE,CAAC;YAClB,MAAM,IAAI,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC;YAC9B,IAAI,CAAC,IAAI;gBAAE,OAAO;YAClB,WAAW,CAAC,CAAC,IAAI,EAAE,EAAE;gBACnB,MAAM,IAAI,GAAG,IAAI,GAAG,CAAC,IAAI,CAAC,CAAC;gBAC3B,IAAI,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;oBACxB,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;gBACzB,CAAC;qBAAM,CAAC;oBACN,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;gBACtB,CAAC;gBACD,OAAO,IAAI,CAAC;YACd,CAAC,CAAC,CAAC;QACL,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,oEAAoE;IACpE,wEAAwE;IACxE,MAAM,SAAS,GAAG,QAAQ,CAAC,MAAM,CAC/B,CAAC,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,EACxC,CAAC,CACF,CAAC;IAEF,OAAO,CACL,MAAC,GAAG,IAAC,aAAa,EAAC,QAAQ,aACzB,KAAC,GAAG,IAAC,YAAY,EAAE,CAAC,YAClB,KAAC,IAAI,cAAE,MAAM,CAAC,mBAAmB,CAAC,GAAQ,GACtC,EAEN,KAAC,GAAG,IAAC,YAAY,EAAE,CAAC,YAClB,KAAC,IAAI,cAAE,KAAK,CAAC,sCAAsC,CAAC,GAAQ,GACxD,EAEL,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,CACrB,KAAC,GAAG,IAAC,YAAY,EAAE,CAAC,YAClB,MAAC,IAAI,eACF,KAAK,CAAC,iBAAiB,CAAC,EAAE,GAAG,EAC9B,KAAC,IAAI,cAAE,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,GAAQ,IAChD,GACH,CACP,CAAC,CAAC,CAAC,IAAI,EAEP,QAAQ,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,CACvB,KAAC,GAAG,IAAC,YAAY,EAAE,CAAC,YAClB,KAAC,IAAI,cAAE,KAAK,CAAC,0CAA0C,CAAC,GAAQ,GAC5D,CACP,CAAC,CAAC,CAAC,CACF,KAAC,GAAG,IAAC,aAAa,EAAC,QAAQ,YACxB,QAAQ,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE,CAAC,CAC1B,KAAC,GAAG,IAEF,GAAG,EAAE,GAAG,EACR,OAAO,EAAE,QAAQ,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,EAC/B,OAAO,EAAE,GAAG,KAAK,MAAM,EACvB,SAAS,EAAE,SAAS,IAJf,GAAG,CAAC,IAAI,CAKb,CACH,CAAC,GACE,CACP,EAED,KAAC,GAAG,IAAC,SAAS,EAAE,CAAC,YACf,KAAC,IAAI,IAAC,QAAQ,gHAAwE,GAClF,IACF,CACP,CAAC;AACJ,CAAC,CAAC;AASF,MAAM,GAAG,GAAG,CAAC,EAAE,GAAG,EAAE,OAAO,EAAE,OAAO,EAAE,SAAS,EAAY,EAAE,EAAE;IAC7D,MAAM,MAAM,GAAG,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC;IAC3C,MAAM,GAAG,GAAG,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC;IACxC,MAAM,UAAU,GAAG,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,SAAS,EAAE,GAAG,CAAC,CAAC;IACnD,OAAO,CACL,KAAC,GAAG,cACF,MAAC,IAAI,eACF,MAAM,OAAG,GAAG,OAAE,KAAC,IAAI,cAAE,UAAU,GAAQ,EACvC,IAAI,EACJ,KAAK,CAAC,IAAI,GAAG,GAAG,CAAC,WAAW,CAAC,IACzB,GACH,CACP,CAAC;AACJ,CAAC,CAAC"}
@@ -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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"}