agents-inc 0.168.0 → 0.170.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/CHANGELOG.md +21 -0
- package/README.md +18 -15
- package/dist/{chunk-JIBCVXXL.js → chunk-3G7X2WKI.js} +4 -4
- package/dist/{chunk-JOEA52NR.js → chunk-44TE3RKH.js} +46 -2
- package/dist/chunk-44TE3RKH.js.map +1 -0
- package/dist/{chunk-NU2K5G54.js → chunk-52HDHJ7I.js} +11 -19
- package/dist/chunk-52HDHJ7I.js.map +1 -0
- package/dist/{chunk-EH2PGPLP.js → chunk-6HNXYYVF.js} +39 -22
- package/dist/chunk-6HNXYYVF.js.map +1 -0
- package/dist/{chunk-4UKMQUAU.js → chunk-6ZRH5RHC.js} +10 -11
- package/dist/chunk-6ZRH5RHC.js.map +1 -0
- package/dist/{chunk-5JUQKGCP.js → chunk-7RDMTR64.js} +14 -34
- package/dist/chunk-7RDMTR64.js.map +1 -0
- package/dist/{chunk-3LZNY46H.js → chunk-BMRUNMPV.js} +4 -4
- package/dist/{chunk-VVRI35SK.js → chunk-CLPUWOSA.js} +4 -4
- package/dist/{chunk-VVRI35SK.js.map → chunk-CLPUWOSA.js.map} +1 -1
- package/dist/{chunk-TW35AEB4.js → chunk-F2BHT5C4.js} +9 -7
- package/dist/chunk-F2BHT5C4.js.map +1 -0
- package/dist/{chunk-27AVGFXH.js → chunk-F5EBEATU.js} +2 -2
- package/dist/{chunk-GE7NUPMI.js → chunk-HED2DAXZ.js} +3 -3
- package/dist/{chunk-7PYXS2QU.js → chunk-KOLDW6SF.js} +3 -3
- package/dist/{chunk-7PYXS2QU.js.map → chunk-KOLDW6SF.js.map} +1 -1
- package/dist/{chunk-C2UISKIM.js → chunk-MQ6CGZNJ.js} +109 -422
- package/dist/chunk-MQ6CGZNJ.js.map +1 -0
- package/dist/{chunk-P6I72PR3.js → chunk-NCWDK6L7.js} +115 -196
- package/dist/chunk-NCWDK6L7.js.map +1 -0
- package/dist/{chunk-VRXX4D6K.js → chunk-NEZ4OAOL.js} +1 -1
- package/dist/chunk-NEZ4OAOL.js.map +1 -0
- package/dist/chunk-NIHUOWE4.js +106 -0
- package/dist/chunk-NIHUOWE4.js.map +1 -0
- package/dist/{chunk-OI2H6M5I.js → chunk-NQW25DCF.js} +2 -2
- package/dist/chunk-NQW25DCF.js.map +1 -0
- package/dist/{chunk-ZUGH4MQG.js → chunk-OYJQUA3D.js} +3 -3
- package/dist/{chunk-ZUGH4MQG.js.map → chunk-OYJQUA3D.js.map} +1 -1
- package/dist/{chunk-AG3ZVM3B.js → chunk-PJWGTNOX.js} +186 -210
- package/dist/chunk-PJWGTNOX.js.map +1 -0
- package/dist/{chunk-HR7TK2XW.js → chunk-RIPSGNLU.js} +3 -3
- package/dist/chunk-RIPSGNLU.js.map +1 -0
- package/dist/{chunk-4DRFEYCE.js → chunk-SZYQISA2.js} +7 -7
- package/dist/chunk-SZYQISA2.js.map +1 -0
- package/dist/{chunk-W6GO2CYX.js → chunk-USVBYQSQ.js} +2 -2
- package/dist/{chunk-H4ZKGGTE.js → chunk-V3KTSP3Q.js} +50 -42
- package/dist/chunk-V3KTSP3Q.js.map +1 -0
- package/dist/{chunk-KTLKR4YY.js → chunk-WTWMGH2C.js} +2 -2
- package/dist/commands/build/marketplace.js +23 -22
- package/dist/commands/build/marketplace.js.map +1 -1
- package/dist/commands/build/plugins.js +8 -9
- package/dist/commands/build/plugins.js.map +1 -1
- package/dist/commands/compile.js +19 -20
- package/dist/commands/compile.js.map +1 -1
- package/dist/commands/doctor.js +17 -18
- package/dist/commands/doctor.js.map +1 -1
- package/dist/commands/edit.js +118 -297
- package/dist/commands/edit.js.map +1 -1
- package/dist/commands/eject.js +21 -33
- package/dist/commands/eject.js.map +1 -1
- package/dist/commands/init.js +17 -45
- package/dist/commands/list.js +19 -17
- package/dist/commands/list.js.map +1 -1
- package/dist/commands/new/marketplace.js +11 -11
- package/dist/commands/new/marketplace.js.map +1 -1
- package/dist/commands/search.js +12 -13
- package/dist/commands/search.js.map +1 -1
- package/dist/commands/share.js +11 -12
- package/dist/commands/share.js.map +1 -1
- package/dist/commands/uninstall.js +18 -20
- package/dist/commands/uninstall.js.map +1 -1
- package/dist/commands/update.js +8 -9
- package/dist/commands/update.js.map +1 -1
- package/dist/components/common/removal-plan-confirm.js +2 -2
- package/dist/components/common/scroll-affordance.js +9 -0
- package/dist/components/common/select-list.js +2 -3
- package/dist/components/common/skill-agent-summary.js +11 -0
- package/dist/components/common/spinner.js +1 -1
- package/dist/{chunk-QWFG7Y3R.js → components/common/summary-panel.js} +57 -31
- package/dist/components/common/summary-panel.js.map +1 -0
- package/dist/config-exports.js +1 -1
- package/dist/hooks/init.js +18 -46
- package/dist/hooks/init.js.map +1 -1
- package/dist/load-agent-defs-YMDWBFDP.js +14 -0
- package/dist/recompile-project-agents-SZ76WNTW.js +18 -0
- package/dist/{source-loader-FRJTCSDL.js → source-loader-C5SQXZXI.js} +5 -5
- package/dist/src/agents/meta/codex-keeper/playbook.md +2 -3
- package/package.json +2 -3
- package/src/agents/meta/codex-keeper/playbook.md +2 -3
- package/src/schemas/project-config.schema.json +1 -1
- package/assets/demo.tape +0 -266
- package/dist/chunk-23DNVNFP.js +0 -292
- package/dist/chunk-23DNVNFP.js.map +0 -1
- package/dist/chunk-3DIDV6H3.js +0 -268
- package/dist/chunk-3DIDV6H3.js.map +0 -1
- package/dist/chunk-4DRFEYCE.js.map +0 -1
- package/dist/chunk-4HWOYYY7.js +0 -92
- package/dist/chunk-4HWOYYY7.js.map +0 -1
- package/dist/chunk-4UKMQUAU.js.map +0 -1
- package/dist/chunk-5JUQKGCP.js.map +0 -1
- package/dist/chunk-6WGXTB2L.js +0 -28
- package/dist/chunk-6WGXTB2L.js.map +0 -1
- package/dist/chunk-AG3ZVM3B.js.map +0 -1
- package/dist/chunk-C2UISKIM.js.map +0 -1
- package/dist/chunk-CMJBKQUH.js +0 -23
- package/dist/chunk-CMJBKQUH.js.map +0 -1
- package/dist/chunk-DJEO3F2H.js +0 -230
- package/dist/chunk-DJEO3F2H.js.map +0 -1
- package/dist/chunk-EH2PGPLP.js.map +0 -1
- package/dist/chunk-GRL73YPF.js +0 -197
- package/dist/chunk-GRL73YPF.js.map +0 -1
- package/dist/chunk-H4ZKGGTE.js.map +0 -1
- package/dist/chunk-HI6YB7XP.js +0 -59
- package/dist/chunk-HI6YB7XP.js.map +0 -1
- package/dist/chunk-HL3GYRMR.js +0 -17
- package/dist/chunk-HL3GYRMR.js.map +0 -1
- package/dist/chunk-HR7TK2XW.js.map +0 -1
- package/dist/chunk-JOEA52NR.js.map +0 -1
- package/dist/chunk-JPMV4E4E.js +0 -118
- package/dist/chunk-JPMV4E4E.js.map +0 -1
- package/dist/chunk-JVUN6AOO.js +0 -237
- package/dist/chunk-JVUN6AOO.js.map +0 -1
- package/dist/chunk-KQ3PDARZ.js +0 -25
- package/dist/chunk-KQ3PDARZ.js.map +0 -1
- package/dist/chunk-L3W2JWBA.js +0 -168
- package/dist/chunk-L3W2JWBA.js.map +0 -1
- package/dist/chunk-LFUJCRCT.js +0 -27
- package/dist/chunk-LFUJCRCT.js.map +0 -1
- package/dist/chunk-NU2K5G54.js.map +0 -1
- package/dist/chunk-OI2H6M5I.js.map +0 -1
- package/dist/chunk-P6I72PR3.js.map +0 -1
- package/dist/chunk-PCFUXQJA.js +0 -317
- package/dist/chunk-PCFUXQJA.js.map +0 -1
- package/dist/chunk-PLX2FLEQ.js +0 -48
- package/dist/chunk-PLX2FLEQ.js.map +0 -1
- package/dist/chunk-QWFG7Y3R.js.map +0 -1
- package/dist/chunk-SLBL3WIP.js +0 -121
- package/dist/chunk-SLBL3WIP.js.map +0 -1
- package/dist/chunk-TSIU7DME.js +0 -43
- package/dist/chunk-TSIU7DME.js.map +0 -1
- package/dist/chunk-TW35AEB4.js.map +0 -1
- package/dist/chunk-VRXX4D6K.js.map +0 -1
- package/dist/chunk-W5KEYSOL.js +0 -51
- package/dist/chunk-W5KEYSOL.js.map +0 -1
- package/dist/chunk-WNLF5EDZ.js +0 -1170
- package/dist/chunk-WNLF5EDZ.js.map +0 -1
- package/dist/chunk-WTJ3AY33.js +0 -31
- package/dist/chunk-WTJ3AY33.js.map +0 -1
- package/dist/chunk-X6ZZEYO3.js +0 -53
- package/dist/chunk-X6ZZEYO3.js.map +0 -1
- package/dist/chunk-XQHZPINL.js +0 -89
- package/dist/chunk-XQHZPINL.js.map +0 -1
- package/dist/chunk-YN3SWF53.js +0 -35
- package/dist/chunk-YN3SWF53.js.map +0 -1
- package/dist/components/wizard/category-grid.js +0 -13
- package/dist/components/wizard/checkbox-grid.js +0 -12
- package/dist/components/wizard/domain-selection.js +0 -18
- package/dist/components/wizard/run-wizard-session.js +0 -40
- package/dist/components/wizard/run-wizard-session.js.map +0 -1
- package/dist/components/wizard/scroll-affordance.js +0 -9
- package/dist/components/wizard/skill-agent-summary.js +0 -13
- package/dist/components/wizard/source-grid.js +0 -16
- package/dist/components/wizard/source-grid.js.map +0 -1
- package/dist/components/wizard/stack-selection.js +0 -17
- package/dist/components/wizard/stack-selection.js.map +0 -1
- package/dist/components/wizard/step-agents.js +0 -18
- package/dist/components/wizard/step-agents.js.map +0 -1
- package/dist/components/wizard/step-build.js +0 -18
- package/dist/components/wizard/step-build.js.map +0 -1
- package/dist/components/wizard/step-confirm.js +0 -18
- package/dist/components/wizard/step-confirm.js.map +0 -1
- package/dist/components/wizard/step-sources.js +0 -19
- package/dist/components/wizard/step-sources.js.map +0 -1
- package/dist/components/wizard/step-stack.js +0 -18
- package/dist/components/wizard/step-stack.js.map +0 -1
- package/dist/components/wizard/summary-panel.js +0 -17
- package/dist/components/wizard/summary-panel.js.map +0 -1
- package/dist/components/wizard/toast.js +0 -9
- package/dist/components/wizard/toast.js.map +0 -1
- package/dist/components/wizard/wizard-layout.js +0 -22
- package/dist/components/wizard/wizard-layout.js.map +0 -1
- package/dist/components/wizard/wizard-tabs.js +0 -11
- package/dist/components/wizard/wizard-tabs.js.map +0 -1
- package/dist/components/wizard/wizard.js +0 -39
- package/dist/components/wizard/wizard.js.map +0 -1
- package/dist/load-agent-defs-5XMVB3MU.js +0 -14
- package/dist/load-agent-defs-5XMVB3MU.js.map +0 -1
- package/dist/recompile-project-agents-7PQWYQ6B.js +0 -18
- package/dist/recompile-project-agents-7PQWYQ6B.js.map +0 -1
- package/dist/source-loader-FRJTCSDL.js.map +0 -1
- package/dist/stores/wizard-store.js +0 -24
- package/dist/stores/wizard-store.js.map +0 -1
- /package/assets/{demo.gif → legacy-wizard.gif} +0 -0
- /package/dist/{chunk-JIBCVXXL.js.map → chunk-3G7X2WKI.js.map} +0 -0
- /package/dist/{chunk-3LZNY46H.js.map → chunk-BMRUNMPV.js.map} +0 -0
- /package/dist/{chunk-27AVGFXH.js.map → chunk-F5EBEATU.js.map} +0 -0
- /package/dist/{chunk-GE7NUPMI.js.map → chunk-HED2DAXZ.js.map} +0 -0
- /package/dist/{chunk-W6GO2CYX.js.map → chunk-USVBYQSQ.js.map} +0 -0
- /package/dist/{chunk-KTLKR4YY.js.map → chunk-WTWMGH2C.js.map} +0 -0
- /package/dist/components/{wizard → common}/scroll-affordance.js.map +0 -0
- /package/dist/components/{wizard → common}/skill-agent-summary.js.map +0 -0
- /package/dist/{components/wizard/category-grid.js.map → load-agent-defs-YMDWBFDP.js.map} +0 -0
- /package/dist/{components/wizard/checkbox-grid.js.map → recompile-project-agents-SZ76WNTW.js.map} +0 -0
- /package/dist/{components/wizard/domain-selection.js.map → source-loader-C5SQXZXI.js.map} +0 -0
package/dist/chunk-JVUN6AOO.js
DELETED
|
@@ -1,237 +0,0 @@
|
|
|
1
|
-
#!/usr/bin/env node
|
|
2
|
-
import {
|
|
3
|
-
SummaryPanel
|
|
4
|
-
} from "./chunk-QWFG7Y3R.js";
|
|
5
|
-
import {
|
|
6
|
-
Toast
|
|
7
|
-
} from "./chunk-6WGXTB2L.js";
|
|
8
|
-
import {
|
|
9
|
-
WizardTabs,
|
|
10
|
-
wizardTabsFor
|
|
11
|
-
} from "./chunk-L3W2JWBA.js";
|
|
12
|
-
import {
|
|
13
|
-
getDomainDisplayName,
|
|
14
|
-
getStackName
|
|
15
|
-
} from "./chunk-YN3SWF53.js";
|
|
16
|
-
import {
|
|
17
|
-
HOTKEY_INFO,
|
|
18
|
-
HOTKEY_SCOPE,
|
|
19
|
-
HOTKEY_TOGGLE_LABELS,
|
|
20
|
-
KEY_LABEL_ENTER,
|
|
21
|
-
KEY_LABEL_ESC,
|
|
22
|
-
KEY_LABEL_SPACE,
|
|
23
|
-
isInfoPanelAvailable
|
|
24
|
-
} from "./chunk-WTJ3AY33.js";
|
|
25
|
-
import {
|
|
26
|
-
getActiveStepFlow,
|
|
27
|
-
useWizardStore
|
|
28
|
-
} from "./chunk-WNLF5EDZ.js";
|
|
29
|
-
import {
|
|
30
|
-
formatTerminalTooSmallMessage,
|
|
31
|
-
isTerminalLargeEnough
|
|
32
|
-
} from "./chunk-CMJBKQUH.js";
|
|
33
|
-
import {
|
|
34
|
-
CLI_COLORS,
|
|
35
|
-
FALLBACK_DOMAIN,
|
|
36
|
-
LOGO_MIN_TERMINAL_ROWS,
|
|
37
|
-
orderDomains
|
|
38
|
-
} from "./chunk-AG3ZVM3B.js";
|
|
39
|
-
|
|
40
|
-
// src/cli/components/wizard/wizard-layout.tsx
|
|
41
|
-
import { Box, Text } from "ink";
|
|
42
|
-
import { Fragment } from "react";
|
|
43
|
-
|
|
44
|
-
// src/cli/components/hooks/use-terminal-dimensions.ts
|
|
45
|
-
import { useState, useEffect } from "react";
|
|
46
|
-
import { useStdout } from "ink";
|
|
47
|
-
var DEFAULT_COLUMNS = 80;
|
|
48
|
-
var DEFAULT_ROWS = 24;
|
|
49
|
-
function useTerminalDimensions() {
|
|
50
|
-
const { stdout } = useStdout();
|
|
51
|
-
const [dimensions, setDimensions] = useState(() => ({
|
|
52
|
-
columns: stdout.columns || DEFAULT_COLUMNS,
|
|
53
|
-
rows: stdout.rows || DEFAULT_ROWS
|
|
54
|
-
}));
|
|
55
|
-
useEffect(() => {
|
|
56
|
-
const handleResize = () => {
|
|
57
|
-
setDimensions({
|
|
58
|
-
columns: stdout.columns || DEFAULT_COLUMNS,
|
|
59
|
-
rows: stdout.rows || DEFAULT_ROWS
|
|
60
|
-
});
|
|
61
|
-
};
|
|
62
|
-
stdout.on("resize", handleResize);
|
|
63
|
-
return () => {
|
|
64
|
-
stdout.off("resize", handleResize);
|
|
65
|
-
};
|
|
66
|
-
}, [stdout]);
|
|
67
|
-
return dimensions;
|
|
68
|
-
}
|
|
69
|
-
|
|
70
|
-
// src/cli/components/wizard/wizard-layout.tsx
|
|
71
|
-
import { Fragment as Fragment2, jsx, jsxs } from "react/jsx-runtime";
|
|
72
|
-
import { createElement } from "react";
|
|
73
|
-
var DefinitionItem = ({ isVisible = true, label, values }) => {
|
|
74
|
-
if (!isVisible) {
|
|
75
|
-
return null;
|
|
76
|
-
}
|
|
77
|
-
return /* @__PURE__ */ jsxs(Text, { children: [
|
|
78
|
-
values.map((value) => /* @__PURE__ */ jsxs(Fragment, { children: [
|
|
79
|
-
/* @__PURE__ */ jsxs(Text, { backgroundColor: CLI_COLORS.LABEL_BG, color: CLI_COLORS.UNFOCUSED, children: [
|
|
80
|
-
" ",
|
|
81
|
-
value,
|
|
82
|
-
" "
|
|
83
|
-
] }),
|
|
84
|
-
" "
|
|
85
|
-
] }, value)),
|
|
86
|
-
/* @__PURE__ */ jsx(Text, { children: label })
|
|
87
|
-
] });
|
|
88
|
-
};
|
|
89
|
-
var HOT_KEYS = [
|
|
90
|
-
{ label: "select", values: [KEY_LABEL_SPACE] },
|
|
91
|
-
{ label: "continue", values: [KEY_LABEL_ENTER] },
|
|
92
|
-
{ label: "back", values: [KEY_LABEL_ESC] }
|
|
93
|
-
];
|
|
94
|
-
var WizardFooter = () => {
|
|
95
|
-
return /* @__PURE__ */ jsx(
|
|
96
|
-
Box,
|
|
97
|
-
{
|
|
98
|
-
columnGap: 2,
|
|
99
|
-
borderTop: true,
|
|
100
|
-
borderRight: false,
|
|
101
|
-
borderBottom: true,
|
|
102
|
-
borderLeft: false,
|
|
103
|
-
borderColor: "blackBright",
|
|
104
|
-
borderStyle: "single",
|
|
105
|
-
paddingLeft: 1,
|
|
106
|
-
paddingRight: 1,
|
|
107
|
-
children: HOT_KEYS.map((hotkey) => /* @__PURE__ */ createElement(DefinitionItem, { ...hotkey, key: hotkey.label }))
|
|
108
|
-
}
|
|
109
|
-
);
|
|
110
|
-
};
|
|
111
|
-
var MAX_PAINTED_STARTUP_MESSAGES = 3;
|
|
112
|
-
var MAX_PAINTED_STARTUP_MESSAGES_CRAMPED = 1;
|
|
113
|
-
function paintedStartupMessageCount(terminalHeight) {
|
|
114
|
-
return terminalHeight >= LOGO_MIN_TERMINAL_ROWS ? MAX_PAINTED_STARTUP_MESSAGES : MAX_PAINTED_STARTUP_MESSAGES_CRAMPED;
|
|
115
|
-
}
|
|
116
|
-
var STARTUP_MESSAGE_COLOR = {
|
|
117
|
-
info: CLI_COLORS.NEUTRAL,
|
|
118
|
-
warn: CLI_COLORS.WARNING,
|
|
119
|
-
error: CLI_COLORS.ERROR
|
|
120
|
-
};
|
|
121
|
-
var STARTUP_MESSAGE_RANK = {
|
|
122
|
-
error: 0,
|
|
123
|
-
warn: 0,
|
|
124
|
-
info: 1
|
|
125
|
-
};
|
|
126
|
-
function warningsBeforeInfo(messages) {
|
|
127
|
-
return [...messages].sort(
|
|
128
|
-
(a, b) => STARTUP_MESSAGE_RANK[a.level] - STARTUP_MESSAGE_RANK[b.level]
|
|
129
|
-
);
|
|
130
|
-
}
|
|
131
|
-
function startupBand(messages, budget) {
|
|
132
|
-
const painted = warningsBeforeInfo(messages).slice(0, budget);
|
|
133
|
-
return { painted, counted: messages.length - painted.length };
|
|
134
|
-
}
|
|
135
|
-
var StartupMessages = ({
|
|
136
|
-
messages,
|
|
137
|
-
terminalHeight
|
|
138
|
-
}) => {
|
|
139
|
-
if (messages.length === 0) return null;
|
|
140
|
-
const { painted, counted } = startupBand(messages, paintedStartupMessageCount(terminalHeight));
|
|
141
|
-
return /* @__PURE__ */ jsxs(Box, { flexDirection: "column", flexShrink: 0, paddingX: 1, children: [
|
|
142
|
-
painted.map((message, index) => /* @__PURE__ */ jsx(Text, { color: STARTUP_MESSAGE_COLOR[message.level], children: message.text }, index)),
|
|
143
|
-
counted > 0 && /* @__PURE__ */ jsx(Text, { color: CLI_COLORS.NEUTRAL, children: `... and ${counted} more` })
|
|
144
|
-
] });
|
|
145
|
-
};
|
|
146
|
-
var STEP_DROPDOWN_LABEL = {
|
|
147
|
-
stack: "Choose a stack",
|
|
148
|
-
domains: "Select domains",
|
|
149
|
-
sources: "Customize skill sources",
|
|
150
|
-
agents: "Select agents"
|
|
151
|
-
};
|
|
152
|
-
var TerminalTooSmall = ({ columns }) => /* @__PURE__ */ jsx(Box, { paddingX: 1, paddingY: 1, children: /* @__PURE__ */ jsx(Text, { color: CLI_COLORS.WARNING, children: formatTerminalTooSmallMessage(columns) }) });
|
|
153
|
-
function resolveDropdownLabel(step, selectedStackId) {
|
|
154
|
-
if (step === "confirm") {
|
|
155
|
-
const stackName = getStackName(selectedStackId);
|
|
156
|
-
return stackName ? `Ready to install ${stackName}` : "Ready to install your custom stack";
|
|
157
|
-
}
|
|
158
|
-
return STEP_DROPDOWN_LABEL[step];
|
|
159
|
-
}
|
|
160
|
-
var WizardLayout = ({
|
|
161
|
-
version,
|
|
162
|
-
logo,
|
|
163
|
-
startupMessages = [],
|
|
164
|
-
children
|
|
165
|
-
}) => {
|
|
166
|
-
const store = useWizardStore();
|
|
167
|
-
const { columns: terminalWidth, rows: terminalHeight } = useTerminalDimensions();
|
|
168
|
-
if (!isTerminalLargeEnough(terminalWidth, terminalHeight)) {
|
|
169
|
-
return /* @__PURE__ */ jsx(TerminalTooSmall, { columns: terminalWidth });
|
|
170
|
-
}
|
|
171
|
-
const { completedSteps, skippedSteps } = store.getStepProgress();
|
|
172
|
-
const domainNav = store.step === "build" && store.selectedDomains.length > 0 ? {
|
|
173
|
-
domains: orderDomains(store.selectedDomains),
|
|
174
|
-
activeDomain: store.getCurrentDomain() || store.selectedDomains[0] || FALLBACK_DOMAIN,
|
|
175
|
-
getDomainLabel: getDomainDisplayName
|
|
176
|
-
} : void 0;
|
|
177
|
-
const terminalHasRoomForLogo = terminalHeight >= LOGO_MIN_TERMINAL_ROWS;
|
|
178
|
-
const shouldRenderLogo = !!logo && store.step === "stack" && terminalHasRoomForLogo;
|
|
179
|
-
const dropdownLabel = resolveDropdownLabel(store.step, store.selectedStackId);
|
|
180
|
-
const dropdowns = dropdownLabel ? { [store.step]: { items: [{ id: dropdownLabel, label: dropdownLabel }] } } : {};
|
|
181
|
-
return /* @__PURE__ */ jsxs(Box, { flexDirection: "column", paddingX: 1, height: terminalHeight, children: [
|
|
182
|
-
shouldRenderLogo && /* @__PURE__ */ jsx(Box, { flexDirection: "row", marginTop: 1, columnGap: 1, children: /* @__PURE__ */ jsx(Text, { children: logo }) }),
|
|
183
|
-
/* @__PURE__ */ jsx(
|
|
184
|
-
WizardTabs,
|
|
185
|
-
{
|
|
186
|
-
steps: wizardTabsFor(getActiveStepFlow()),
|
|
187
|
-
currentStep: store.step,
|
|
188
|
-
completedSteps,
|
|
189
|
-
skippedSteps,
|
|
190
|
-
version,
|
|
191
|
-
domainNav,
|
|
192
|
-
dropdowns
|
|
193
|
-
}
|
|
194
|
-
),
|
|
195
|
-
/* @__PURE__ */ jsx(StartupMessages, { messages: startupMessages, terminalHeight }),
|
|
196
|
-
store.showInfo ? /* @__PURE__ */ jsxs(Fragment2, { children: [
|
|
197
|
-
/* @__PURE__ */ jsx(Box, { flexDirection: "column", flexGrow: 1, flexBasis: 0, marginTop: 1, children: /* @__PURE__ */ jsx(SummaryPanel, {}) }),
|
|
198
|
-
/* @__PURE__ */ jsx(WizardFooter, {})
|
|
199
|
-
] }) : /* @__PURE__ */ jsxs(Fragment2, { children: [
|
|
200
|
-
/* @__PURE__ */ jsx(Box, { flexDirection: "column", flexGrow: 1, flexBasis: 0, marginTop: 1, children }),
|
|
201
|
-
/* @__PURE__ */ jsxs(Box, { paddingX: 1, columnGap: 2, marginTop: 2, children: [
|
|
202
|
-
/* @__PURE__ */ jsx(
|
|
203
|
-
DefinitionItem,
|
|
204
|
-
{
|
|
205
|
-
label: "Labels",
|
|
206
|
-
values: [HOTKEY_TOGGLE_LABELS.label],
|
|
207
|
-
isVisible: store.step === "build"
|
|
208
|
-
}
|
|
209
|
-
),
|
|
210
|
-
/* @__PURE__ */ jsx(
|
|
211
|
-
DefinitionItem,
|
|
212
|
-
{
|
|
213
|
-
label: "Scope",
|
|
214
|
-
values: [HOTKEY_SCOPE.label],
|
|
215
|
-
isVisible: (store.step === "build" || store.step === "agents") && !store.isEditingFromGlobalScope
|
|
216
|
-
}
|
|
217
|
-
),
|
|
218
|
-
/* @__PURE__ */ jsx(
|
|
219
|
-
DefinitionItem,
|
|
220
|
-
{
|
|
221
|
-
label: "Info",
|
|
222
|
-
values: [HOTKEY_INFO.label],
|
|
223
|
-
isVisible: isInfoPanelAvailable(store.step)
|
|
224
|
-
}
|
|
225
|
-
)
|
|
226
|
-
] }),
|
|
227
|
-
/* @__PURE__ */ jsx(WizardFooter, {}),
|
|
228
|
-
store.toastMessage && /* @__PURE__ */ jsx(Box, { position: "absolute", marginTop: terminalHeight - 4, children: /* @__PURE__ */ jsx(Toast, { children: store.toastMessage }) })
|
|
229
|
-
] })
|
|
230
|
-
] });
|
|
231
|
-
};
|
|
232
|
-
|
|
233
|
-
export {
|
|
234
|
-
useTerminalDimensions,
|
|
235
|
-
WizardLayout
|
|
236
|
-
};
|
|
237
|
-
//# sourceMappingURL=chunk-JVUN6AOO.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/cli/components/wizard/wizard-layout.tsx","../src/cli/components/hooks/use-terminal-dimensions.ts"],"sourcesContent":["import { Box, Text } from \"ink\";\nimport React, { Fragment } from \"react\";\nimport { CLI_COLORS, FALLBACK_DOMAIN, LOGO_MIN_TERMINAL_ROWS } from \"../../consts.js\";\nimport type { StartupMessage } from \"../../utils/logger.js\";\nimport { formatTerminalTooSmallMessage, isTerminalLargeEnough } from \"../../utils/terminal.js\";\nimport { getActiveStepFlow, useWizardStore, type WizardStep } from \"../../stores/wizard-store.js\";\nimport { useTerminalDimensions } from \"../hooks/use-terminal-dimensions.js\";\nimport { SummaryPanel } from \"./summary-panel.js\";\nimport { Toast } from \"./toast.js\";\nimport {\n HOTKEY_INFO,\n HOTKEY_SCOPE,\n HOTKEY_TOGGLE_LABELS,\n KEY_LABEL_ENTER,\n KEY_LABEL_ESC,\n KEY_LABEL_SPACE,\n isInfoPanelAvailable,\n} from \"./hotkeys.js\";\nimport {\n WizardTabs,\n wizardTabsFor,\n type DomainNavProps,\n type TabDropdownProps,\n} from \"./wizard-tabs.js\";\nimport { getDomainDisplayName, getStackName, orderDomains } from \"./utils.js\";\n\ntype KeyHintProps = {\n isVisible?: boolean;\n label: string;\n values: readonly string[];\n};\n\nconst DefinitionItem: React.FC<KeyHintProps> = ({ isVisible = true, label, values }) => {\n if (!isVisible) {\n return null;\n }\n\n return (\n <Text>\n {values.map((value) => (\n <Fragment key={value}>\n <Text backgroundColor={CLI_COLORS.LABEL_BG} color={CLI_COLORS.UNFOCUSED}>\n {\" \"}\n {value}{\" \"}\n </Text>{\" \"}\n </Fragment>\n ))}\n <Text>{label}</Text>\n </Text>\n );\n};\n\nconst HOT_KEYS = [\n { label: \"select\", values: [KEY_LABEL_SPACE] },\n { label: \"continue\", values: [KEY_LABEL_ENTER] },\n { label: \"back\", values: [KEY_LABEL_ESC] },\n] as const satisfies readonly { label: string; values: readonly string[] }[];\n\nconst WizardFooter = () => {\n return (\n <Box\n columnGap={2}\n borderTop\n borderRight={false}\n borderBottom\n borderLeft={false}\n borderColor=\"blackBright\"\n borderStyle=\"single\"\n paddingLeft={1}\n paddingRight={1}\n >\n {HOT_KEYS.map((hotkey) => (\n <DefinitionItem {...hotkey} key={hotkey.label} />\n ))}\n </Box>\n );\n};\n\ntype WizardLayoutProps = {\n version?: string | undefined;\n logo?: string | undefined;\n startupMessages?: StartupMessage[] | undefined;\n children: React.ReactNode;\n};\n\n/**\n * How many buffered messages the band paints before it counts the rest instead.\n * A source that cannot resolve its own relationships warns once per unresolved\n * name — thousands, for a source with a broken `skill-rules.ts` — and every line\n * is a row taken from the step below it.\n *\n * Two budgets, because a row is worth more at some heights than others: a\n * terminal short enough that the logo is already dropped for starving the\n * content cannot spare four rows for news either, and there it paints the first\n * message and counts the rest. The first is the one that matters — the fetch\n * speaks before anything is parsed, so an unreachable source is message one.\n */\nconst MAX_PAINTED_STARTUP_MESSAGES = 3;\nconst MAX_PAINTED_STARTUP_MESSAGES_CRAMPED = 1;\n\nfunction paintedStartupMessageCount(terminalHeight: number): number {\n return terminalHeight >= LOGO_MIN_TERMINAL_ROWS\n ? MAX_PAINTED_STARTUP_MESSAGES\n : MAX_PAINTED_STARTUP_MESSAGES_CRAMPED;\n}\n\nconst STARTUP_MESSAGE_COLOR = {\n info: CLI_COLORS.NEUTRAL,\n warn: CLI_COLORS.WARNING,\n error: CLI_COLORS.ERROR,\n} as const satisfies Record<StartupMessage[\"level\"], string>;\n\n/**\n * Which messages claim the band's rows first. A warning is news the user may have to act on;\n * an info line is a count they can live without, and `edit` buffers two of those before\n * anything else can speak — so in arrival order the whole cramped budget went to \"Loaded N\n * skills\" and no warning was legible at all.\n *\n * Warnings and errors share a rank so that their own order survives: the sort below is stable,\n * and the sequence a load raised them in is the only thing that says which came first.\n */\nconst STARTUP_MESSAGE_RANK = {\n error: 0,\n warn: 0,\n info: 1,\n} as const satisfies Record<StartupMessage[\"level\"], number>;\n\nfunction warningsBeforeInfo(messages: StartupMessage[]): StartupMessage[] {\n return [...messages].sort(\n (a, b) => STARTUP_MESSAGE_RANK[a.level] - STARTUP_MESSAGE_RANK[b.level],\n );\n}\n\ntype StartupBand = {\n painted: StartupMessage[];\n counted: number;\n};\n\n/**\n * The band's whole decision: which rows are painted, and how many messages the counter stands\n * for. Warnings and errors claim rows first, info fills whatever is left, and anything past the\n * budget is counted rather than dropped — so the counter is exact for every input, including the\n * one where the warnings alone overrun the budget and collapse last.\n */\nfunction startupBand(messages: StartupMessage[], budget: number): StartupBand {\n const painted = warningsBeforeInfo(messages).slice(0, budget);\n return { painted, counted: messages.length - painted.length };\n}\n\n/**\n * What the load said before Ink took the terminal.\n *\n * `warn()` writes to stderr, which the wizard's own `clearTerminal` would wipe,\n * so a load that opens a wizard buffers instead (`lib/operations/source/load-source.ts`)\n * and hands the buffer here. This band is the only place those lines are ever\n * seen — the source-unreachable warning among them.\n *\n * It sits above the step rather than over it, and does not shrink: a warning\n * compressed by Yoga overprints into an unreadable row, which is worse than the\n * row it would have cost the step.\n *\n * Nor does it GROW. A warning must be legible, but the budget it is legible\n * within is fixed, so the space is made by evicting the info lines rather than\n * by taking rows from the step: this band is `flexShrink={0}` inside a root box\n * sized to the terminal, so a band that grew with the warning count would push\n * the frame past the bottom of the screen and its own header off the top —\n * which is the defect `assertWizardScreenIsWhollyVisible` in\n * `e2e/pages/base-step.ts` exists to fail on. Where the warnings alone overrun\n * the budget they collapse too, last, and the counter still accounts for every\n * message that was not painted.\n */\nconst StartupMessages: React.FC<{ messages: StartupMessage[]; terminalHeight: number }> = ({\n messages,\n terminalHeight,\n}) => {\n if (messages.length === 0) return null;\n\n const { painted, counted } = startupBand(messages, paintedStartupMessageCount(terminalHeight));\n\n return (\n <Box flexDirection=\"column\" flexShrink={0} paddingX={1}>\n {painted.map((message, index) => (\n <Text key={index} color={STARTUP_MESSAGE_COLOR[message.level]}>\n {message.text}\n </Text>\n ))}\n {counted > 0 && <Text color={CLI_COLORS.NEUTRAL}>{`... and ${counted} more`}</Text>}\n </Box>\n );\n};\n\n/**\n * The subtitle each step is headed with. Every entry is A SCREEN SENTINEL:\n * `e2e/pages/constants.ts` `STEP_TEXT` duplicates each one exactly and every E2E step\n * page object waits on it, so a subtitle that moves without it hangs each wizard spec for\n * the full wizard-load budget instead of failing. `wizard-layout.test.tsx` catches a\n * PRODUCT-side move in under a second and cannot see a mirror-side one;\n * `scripts/check-screen-sentinels.ts` compares the two literals directly, which is the\n * half that was missing. Its wording mirrors the step's tab in `wizard-tabs.tsx`.\n */\nconst STEP_DROPDOWN_LABEL: Partial<Record<WizardStep, string>> = {\n stack: \"Choose a stack\",\n domains: \"Select domains\",\n sources: \"Customize skill sources\",\n agents: \"Select agents\",\n};\n\n/**\n * What the wizard paints instead of itself while the terminal is below\n * `MIN_TERMINAL_SIZE` (consts.ts). It REPLACES the wizard tree rather than\n * covering it: Ink lays a still-mounted tree out at the small size regardless of\n * what is drawn on top, so an overlay leaves the squeezed content bleeding\n * underneath.\n */\nconst TerminalTooSmall: React.FC<{ columns: number }> = ({ columns }) => (\n <Box paddingX={1} paddingY={1}>\n <Text color={CLI_COLORS.WARNING}>{formatTerminalTooSmallMessage(columns)}</Text>\n </Box>\n);\n\nfunction resolveDropdownLabel(\n step: WizardStep,\n selectedStackId: string | null,\n): string | undefined {\n if (step === \"confirm\") {\n const stackName = getStackName(selectedStackId);\n return stackName ? `Ready to install ${stackName}` : \"Ready to install your custom stack\";\n }\n return STEP_DROPDOWN_LABEL[step];\n}\n\nexport const WizardLayout: React.FC<WizardLayoutProps> = ({\n version,\n logo,\n startupMessages = [],\n children,\n}) => {\n const store = useWizardStore();\n const { columns: terminalWidth, rows: terminalHeight } = useTerminalDimensions();\n\n // The startup gate cannot catch a terminal that shrinks after launch, and\n // `useTerminalDimensions` already re-renders on resize — so the same check\n // lives here, on the value that hook returns.\n if (!isTerminalLargeEnough(terminalWidth, terminalHeight)) {\n return <TerminalTooSmall columns={terminalWidth} />;\n }\n\n const { completedSteps, skippedSteps } = store.getStepProgress();\n\n const domainNav: DomainNavProps | undefined =\n store.step === \"build\" && store.selectedDomains.length > 0\n ? {\n domains: orderDomains(store.selectedDomains),\n activeDomain: store.getCurrentDomain() || store.selectedDomains[0] || FALLBACK_DOMAIN,\n getDomainLabel: getDomainDisplayName,\n }\n : undefined;\n\n // The logo is decoration; the stack list is the content. Below the threshold\n // its six rows starve that list's viewport until the shared scroll gate stops\n // clipping and the rows bleed over the footer.\n const terminalHasRoomForLogo = terminalHeight >= LOGO_MIN_TERMINAL_ROWS;\n const shouldRenderLogo = !!logo && store.step === \"stack\" && terminalHasRoomForLogo;\n\n const dropdownLabel = resolveDropdownLabel(store.step, store.selectedStackId);\n const dropdowns: Partial<Record<WizardStep, TabDropdownProps>> = dropdownLabel\n ? { [store.step]: { items: [{ id: dropdownLabel, label: dropdownLabel }] } }\n : {};\n\n return (\n <Box flexDirection=\"column\" paddingX={1} height={terminalHeight}>\n {shouldRenderLogo && (\n <Box flexDirection=\"row\" marginTop={1} columnGap={1}>\n <Text>{logo}</Text>\n </Box>\n )}\n <WizardTabs\n steps={wizardTabsFor(getActiveStepFlow())}\n currentStep={store.step}\n completedSteps={completedSteps}\n skippedSteps={skippedSteps}\n version={version}\n domainNav={domainNav}\n dropdowns={dropdowns}\n />\n <StartupMessages messages={startupMessages} terminalHeight={terminalHeight} />\n {store.showInfo ? (\n <>\n <Box flexDirection=\"column\" flexGrow={1} flexBasis={0} marginTop={1}>\n <SummaryPanel />\n </Box>\n <WizardFooter />\n </>\n ) : (\n <>\n <Box flexDirection=\"column\" flexGrow={1} flexBasis={0} marginTop={1}>\n {children}\n </Box>\n <Box paddingX={1} columnGap={2} marginTop={2}>\n <DefinitionItem\n label=\"Labels\"\n values={[HOTKEY_TOGGLE_LABELS.label]}\n isVisible={store.step === \"build\"}\n />\n <DefinitionItem\n label=\"Scope\"\n values={[HOTKEY_SCOPE.label]}\n isVisible={\n (store.step === \"build\" || store.step === \"agents\") &&\n !store.isEditingFromGlobalScope\n }\n />\n <DefinitionItem\n label=\"Info\"\n values={[HOTKEY_INFO.label]}\n isVisible={isInfoPanelAvailable(store.step)}\n />\n </Box>\n <WizardFooter />\n {store.toastMessage && (\n <Box position=\"absolute\" marginTop={terminalHeight - 4}>\n <Toast>{store.toastMessage}</Toast>\n </Box>\n )}\n </>\n )}\n </Box>\n );\n};\n","import { useState, useEffect } from \"react\";\nimport { useStdout } from \"ink\";\n\nconst DEFAULT_COLUMNS = 80;\nconst DEFAULT_ROWS = 24;\n\nexport type TerminalDimensions = {\n /** Terminal width in columns */\n columns: number;\n /** Terminal height in rows */\n rows: number;\n};\n\n/**\n * Tracks terminal dimensions reactively. Re-renders on resize.\n *\n * Falls back to DEFAULT_COLUMNS x DEFAULT_ROWS when stdout is not a TTY\n * (e.g., piped output, CI environments, tests).\n */\nexport function useTerminalDimensions(): TerminalDimensions {\n const { stdout } = useStdout();\n\n const [dimensions, setDimensions] = useState<TerminalDimensions>(() => ({\n columns: stdout.columns || DEFAULT_COLUMNS,\n rows: stdout.rows || DEFAULT_ROWS,\n }));\n\n useEffect(() => {\n const handleResize = () => {\n setDimensions({\n columns: stdout.columns || DEFAULT_COLUMNS,\n rows: stdout.rows || DEFAULT_ROWS,\n });\n };\n\n stdout.on(\"resize\", handleResize);\n return () => {\n stdout.off(\"resize\", handleResize);\n };\n }, [stdout]);\n\n return dimensions;\n}\n"],"mappings":"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","names":["Fragment"]}
|
package/dist/chunk-KQ3PDARZ.js
DELETED
|
@@ -1,25 +0,0 @@
|
|
|
1
|
-
#!/usr/bin/env node
|
|
2
|
-
import {
|
|
3
|
-
SummaryPanel
|
|
4
|
-
} from "./chunk-QWFG7Y3R.js";
|
|
5
|
-
|
|
6
|
-
// src/cli/components/wizard/step-confirm.tsx
|
|
7
|
-
import { useInput } from "ink";
|
|
8
|
-
import "react";
|
|
9
|
-
import { jsx } from "react/jsx-runtime";
|
|
10
|
-
var StepConfirm = ({ onComplete, onBack }) => {
|
|
11
|
-
useInput((_input, key) => {
|
|
12
|
-
if (key.return) {
|
|
13
|
-
onComplete();
|
|
14
|
-
}
|
|
15
|
-
if (key.escape) {
|
|
16
|
-
onBack();
|
|
17
|
-
}
|
|
18
|
-
});
|
|
19
|
-
return /* @__PURE__ */ jsx(SummaryPanel, {});
|
|
20
|
-
};
|
|
21
|
-
|
|
22
|
-
export {
|
|
23
|
-
StepConfirm
|
|
24
|
-
};
|
|
25
|
-
//# sourceMappingURL=chunk-KQ3PDARZ.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/cli/components/wizard/step-confirm.tsx"],"sourcesContent":["import { useInput } from \"ink\";\nimport React from \"react\";\nimport { SummaryPanel } from \"./summary-panel.js\";\n\ntype StepConfirmProps = {\n onComplete: () => void;\n onBack: () => void;\n};\n\n/**\n * Final step: the shared `SummaryPanel`, which owns the scroll and the `↑`/`↓`\n * keys. This claims only the two keys that leave the step, so both `useInput`\n * hooks stay on disjoint keys.\n */\nexport const StepConfirm: React.FC<StepConfirmProps> = ({ onComplete, onBack }) => {\n useInput((_input, key) => {\n if (key.return) {\n onComplete();\n }\n if (key.escape) {\n onBack();\n }\n });\n\n return <SummaryPanel />;\n};\n"],"mappings":";;;;;;AAAA,SAAS,gBAAgB;AACzB,OAAkB;AAuBT;AAVF,IAAM,cAA0C,CAAC,EAAE,YAAY,OAAO,MAAM;AACjF,WAAS,CAAC,QAAQ,QAAQ;AACxB,QAAI,IAAI,QAAQ;AACd,iBAAW;AAAA,IACb;AACA,QAAI,IAAI,QAAQ;AACd,aAAO;AAAA,IACT;AAAA,EACF,CAAC;AAED,SAAO,oBAAC,gBAAa;AACvB;","names":[]}
|
package/dist/chunk-L3W2JWBA.js
DELETED
|
@@ -1,168 +0,0 @@
|
|
|
1
|
-
#!/usr/bin/env node
|
|
2
|
-
import {
|
|
3
|
-
CLI_COLORS
|
|
4
|
-
} from "./chunk-AG3ZVM3B.js";
|
|
5
|
-
|
|
6
|
-
// src/cli/components/wizard/wizard-tabs.tsx
|
|
7
|
-
import { Box, Text } from "ink";
|
|
8
|
-
import "react";
|
|
9
|
-
import { Fragment, jsx, jsxs } from "react/jsx-runtime";
|
|
10
|
-
var WIZARD_STEP_LABELS = {
|
|
11
|
-
stack: "Stack",
|
|
12
|
-
domains: "Domains",
|
|
13
|
-
build: "Skills",
|
|
14
|
-
sources: "Sources",
|
|
15
|
-
agents: "Agents",
|
|
16
|
-
confirm: "Confirm"
|
|
17
|
-
};
|
|
18
|
-
function wizardTabsFor(flow) {
|
|
19
|
-
return flow.map((id) => ({ id, label: WIZARD_STEP_LABELS[id] }));
|
|
20
|
-
}
|
|
21
|
-
var getStepState = (stepId, currentStep, completedSteps, skippedSteps) => {
|
|
22
|
-
if (completedSteps.includes(stepId)) return "completed";
|
|
23
|
-
if (stepId === currentStep) return "current";
|
|
24
|
-
if (skippedSteps.includes(stepId)) return "skipped";
|
|
25
|
-
return "pending";
|
|
26
|
-
};
|
|
27
|
-
var Tab = ({ step, state }) => {
|
|
28
|
-
const label = step.label;
|
|
29
|
-
switch (state) {
|
|
30
|
-
case "current":
|
|
31
|
-
return /* @__PURE__ */ jsxs(Text, { color: CLI_COLORS.BLACK, backgroundColor: CLI_COLORS.WARNING, bold: true, children: [
|
|
32
|
-
" ",
|
|
33
|
-
label,
|
|
34
|
-
" "
|
|
35
|
-
] });
|
|
36
|
-
case "completed":
|
|
37
|
-
return /* @__PURE__ */ jsx(Text, { children: label });
|
|
38
|
-
case "skipped":
|
|
39
|
-
return /* @__PURE__ */ jsx(Text, { dimColor: true, children: label });
|
|
40
|
-
case "pending":
|
|
41
|
-
return /* @__PURE__ */ jsx(Text, { color: CLI_COLORS.UNFOCUSED, children: label });
|
|
42
|
-
default: {
|
|
43
|
-
const _exhaustive = state;
|
|
44
|
-
return _exhaustive;
|
|
45
|
-
}
|
|
46
|
-
}
|
|
47
|
-
};
|
|
48
|
-
var TabDropdown = ({ items, activeId, isSubNav = false, inline }) => /* @__PURE__ */ jsx(
|
|
49
|
-
Box,
|
|
50
|
-
{
|
|
51
|
-
...inline ? {} : { position: "absolute", marginTop: 2 },
|
|
52
|
-
flexDirection: "row",
|
|
53
|
-
columnGap: 0,
|
|
54
|
-
paddingLeft: 1,
|
|
55
|
-
paddingRight: 1,
|
|
56
|
-
borderStyle: "single",
|
|
57
|
-
borderColor: "blackBright",
|
|
58
|
-
flexWrap: "wrap",
|
|
59
|
-
children: items.map((item) => {
|
|
60
|
-
const isActive = item.id === activeId;
|
|
61
|
-
return /* @__PURE__ */ jsxs(
|
|
62
|
-
Text,
|
|
63
|
-
{
|
|
64
|
-
dimColor: !isSubNav,
|
|
65
|
-
bold: isSubNav && isActive,
|
|
66
|
-
color: isActive ? CLI_COLORS.WARNING : CLI_COLORS.UNFOCUSED,
|
|
67
|
-
children: [
|
|
68
|
-
" ",
|
|
69
|
-
item.label,
|
|
70
|
-
" "
|
|
71
|
-
]
|
|
72
|
-
},
|
|
73
|
-
item.id
|
|
74
|
-
);
|
|
75
|
-
})
|
|
76
|
-
}
|
|
77
|
-
);
|
|
78
|
-
var DomainNav = ({
|
|
79
|
-
domains,
|
|
80
|
-
activeDomain,
|
|
81
|
-
getDomainLabel,
|
|
82
|
-
inline
|
|
83
|
-
}) => /* @__PURE__ */ jsx(
|
|
84
|
-
TabDropdown,
|
|
85
|
-
{
|
|
86
|
-
items: domains.map((d) => ({ id: d, label: getDomainLabel(d) })),
|
|
87
|
-
activeId: activeDomain,
|
|
88
|
-
isSubNav: true,
|
|
89
|
-
inline
|
|
90
|
-
}
|
|
91
|
-
);
|
|
92
|
-
var DOMAIN_NAV_CHAR_THRESHOLD = 25;
|
|
93
|
-
var getStepJustifyContent = (stepId) => {
|
|
94
|
-
if (stepId === "stack") return "flex-start";
|
|
95
|
-
if (stepId === "confirm") return "flex-end";
|
|
96
|
-
return "center";
|
|
97
|
-
};
|
|
98
|
-
var isDomainNavOverThreshold = (domainNav) => domainNav.domains.reduce((sum, d) => sum + domainNav.getDomainLabel(d).length, 0) > DOMAIN_NAV_CHAR_THRESHOLD;
|
|
99
|
-
var WizardTabs = ({
|
|
100
|
-
steps,
|
|
101
|
-
currentStep,
|
|
102
|
-
completedSteps,
|
|
103
|
-
skippedSteps = [],
|
|
104
|
-
version,
|
|
105
|
-
domainNav,
|
|
106
|
-
dropdowns
|
|
107
|
-
}) => {
|
|
108
|
-
const shouldHoistDomainNav = domainNav ? isDomainNavOverThreshold(domainNav) : false;
|
|
109
|
-
return /* @__PURE__ */ jsxs(Fragment, { children: [
|
|
110
|
-
/* @__PURE__ */ jsxs(
|
|
111
|
-
Box,
|
|
112
|
-
{
|
|
113
|
-
flexDirection: "row",
|
|
114
|
-
columnGap: 2,
|
|
115
|
-
borderColor: "blackBright",
|
|
116
|
-
borderStyle: "single",
|
|
117
|
-
paddingX: 1,
|
|
118
|
-
alignItems: "center",
|
|
119
|
-
marginBottom: shouldHoistDomainNav ? 0 : 3,
|
|
120
|
-
children: [
|
|
121
|
-
steps.map((step) => {
|
|
122
|
-
const state = getStepState(step.id, currentStep, completedSteps, skippedSteps);
|
|
123
|
-
if (step.id === "build" && domainNav && !shouldHoistDomainNav) {
|
|
124
|
-
return /* @__PURE__ */ jsxs(
|
|
125
|
-
Box,
|
|
126
|
-
{
|
|
127
|
-
position: "relative",
|
|
128
|
-
display: "flex",
|
|
129
|
-
justifyContent: getStepJustifyContent(step.id),
|
|
130
|
-
children: [
|
|
131
|
-
/* @__PURE__ */ jsx(Tab, { step, state }),
|
|
132
|
-
/* @__PURE__ */ jsx(DomainNav, { ...domainNav })
|
|
133
|
-
]
|
|
134
|
-
},
|
|
135
|
-
step.id
|
|
136
|
-
);
|
|
137
|
-
}
|
|
138
|
-
const dropdown = dropdowns?.[step.id];
|
|
139
|
-
if (dropdown) {
|
|
140
|
-
return /* @__PURE__ */ jsxs(
|
|
141
|
-
Box,
|
|
142
|
-
{
|
|
143
|
-
position: "relative",
|
|
144
|
-
display: "flex",
|
|
145
|
-
justifyContent: getStepJustifyContent(step.id),
|
|
146
|
-
children: [
|
|
147
|
-
/* @__PURE__ */ jsx(Tab, { step, state }),
|
|
148
|
-
/* @__PURE__ */ jsx(TabDropdown, { ...dropdown })
|
|
149
|
-
]
|
|
150
|
-
},
|
|
151
|
-
step.id
|
|
152
|
-
);
|
|
153
|
-
}
|
|
154
|
-
return /* @__PURE__ */ jsx(Tab, { step, state }, step.id);
|
|
155
|
-
}),
|
|
156
|
-
/* @__PURE__ */ jsx(Box, { flexGrow: 1, justifyContent: "flex-end", children: /* @__PURE__ */ jsx(Text, { dimColor: true, children: `v${version}` }) })
|
|
157
|
-
]
|
|
158
|
-
}
|
|
159
|
-
),
|
|
160
|
-
domainNav && shouldHoistDomainNav && /* @__PURE__ */ jsx(Box, { children: /* @__PURE__ */ jsx(DomainNav, { ...domainNav, inline: true }) })
|
|
161
|
-
] });
|
|
162
|
-
};
|
|
163
|
-
|
|
164
|
-
export {
|
|
165
|
-
wizardTabsFor,
|
|
166
|
-
WizardTabs
|
|
167
|
-
};
|
|
168
|
-
//# sourceMappingURL=chunk-L3W2JWBA.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/cli/components/wizard/wizard-tabs.tsx"],"sourcesContent":["import { Box, Text } from \"ink\";\nimport React from \"react\";\nimport { CLI_COLORS } from \"../../consts.js\";\nimport type { WizardStep } from \"../../stores/wizard-store.js\";\nimport type { Domain } from \"../../types/index.js\";\n\ntype WizardTabStep = {\n id: WizardStep;\n label: string;\n};\n\nexport type TabDropdownItem = {\n id: string;\n label: string;\n};\n\nexport type TabDropdownProps = {\n items: TabDropdownItem[];\n activeId?: string | undefined;\n isSubNav?: boolean | undefined;\n inline?: boolean | undefined;\n};\n\nexport type DomainNavProps = {\n domains: Domain[];\n activeDomain: Domain;\n getDomainLabel: (domain: Domain) => string;\n};\n\nexport type WizardTabsProps = {\n steps: WizardTabStep[];\n currentStep: WizardStep;\n completedSteps: WizardStep[];\n skippedSteps?: WizardStep[] | undefined;\n version?: string | undefined;\n domainNav?: DomainNavProps | undefined;\n dropdowns?: Partial<Record<WizardStep, TabDropdownProps>>;\n};\n\n/**\n * Display label per wizard step. Step ORDER has a single source: WIZARD_STEP_ORDER.\n *\n * The `sources` step is where a user picks where each skill comes from, so that is what\n * its tab is called. `e2e/pages/constants.ts` `WIZARD_TAB_LABELS` mirrors the whole set,\n * so a label moves in both places or in neither.\n */\nconst WIZARD_STEP_LABELS = {\n stack: \"Stack\",\n domains: \"Domains\",\n build: \"Skills\",\n sources: \"Sources\",\n agents: \"Agents\",\n confirm: \"Confirm\",\n} as const satisfies Record<WizardStep, string>;\n\n/**\n * The tabs for a step flow — one per step that flow runs, in its order.\n *\n * A function of the flow rather than a constant over `WIZARD_STEP_ORDER`: a\n * source that ships no stacks gives the wizard no stack step (see\n * `getActiveStepFlow`), and a bar drawn from every step the wizard HAS would\n * paint a Stack tab for a step this run never opens.\n */\nexport function wizardTabsFor(flow: WizardStep[]): WizardTabStep[] {\n return flow.map((id) => ({ id, label: WIZARD_STEP_LABELS[id] }));\n}\n\ntype StepState = \"completed\" | \"current\" | \"pending\" | \"skipped\";\n\nconst getStepState = (\n stepId: WizardStep,\n currentStep: WizardStep,\n completedSteps: WizardStep[],\n skippedSteps: WizardStep[],\n): StepState => {\n if (completedSteps.includes(stepId)) return \"completed\";\n if (stepId === currentStep) return \"current\";\n if (skippedSteps.includes(stepId)) return \"skipped\";\n return \"pending\";\n};\n\ntype TabProps = {\n step: WizardTabStep;\n state: StepState;\n};\n\nconst Tab: React.FC<TabProps> = ({ step, state }) => {\n const label = step.label;\n\n switch (state) {\n case \"current\":\n return (\n <Text color={CLI_COLORS.BLACK} backgroundColor={CLI_COLORS.WARNING} bold>\n {\" \"}\n {label}{\" \"}\n </Text>\n );\n case \"completed\":\n return <Text>{label}</Text>;\n case \"skipped\":\n return <Text dimColor>{label}</Text>;\n case \"pending\":\n return <Text color={CLI_COLORS.UNFOCUSED}>{label}</Text>;\n default: {\n const _exhaustive: never = state;\n return _exhaustive;\n }\n }\n};\n\nconst TabDropdown: React.FC<TabDropdownProps> = ({ items, activeId, isSubNav = false, inline }) => (\n <Box\n {...(inline ? {} : { position: \"absolute\" as const, marginTop: 2 })}\n flexDirection=\"row\"\n columnGap={0}\n paddingLeft={1}\n paddingRight={1}\n borderStyle=\"single\"\n borderColor=\"blackBright\"\n flexWrap=\"wrap\"\n >\n {items.map((item) => {\n const isActive = item.id === activeId;\n return (\n <Text\n key={item.id}\n dimColor={!isSubNav}\n bold={isSubNav && isActive}\n color={isActive ? CLI_COLORS.WARNING : CLI_COLORS.UNFOCUSED}\n >\n {\" \"}\n {item.label}{\" \"}\n </Text>\n );\n })}\n </Box>\n);\n\nconst DomainNav: React.FC<DomainNavProps & { inline?: boolean }> = ({\n domains,\n activeDomain,\n getDomainLabel,\n inline,\n}) => (\n <TabDropdown\n items={domains.map((d) => ({ id: d, label: getDomainLabel(d) }))}\n activeId={activeDomain}\n isSubNav\n inline={inline}\n />\n);\n\nconst DOMAIN_NAV_CHAR_THRESHOLD = 25;\n\nconst getStepJustifyContent = (stepId: WizardStep): \"flex-start\" | \"flex-end\" | \"center\" => {\n if (stepId === \"stack\") return \"flex-start\";\n if (stepId === \"confirm\") return \"flex-end\";\n return \"center\";\n};\n\nconst isDomainNavOverThreshold = (domainNav: DomainNavProps): boolean =>\n domainNav.domains.reduce((sum, d) => sum + domainNav.getDomainLabel(d).length, 0) >\n DOMAIN_NAV_CHAR_THRESHOLD;\n\nexport const WizardTabs: React.FC<WizardTabsProps> = ({\n steps,\n currentStep,\n completedSteps,\n skippedSteps = [],\n version,\n domainNav,\n dropdowns,\n}) => {\n const shouldHoistDomainNav = domainNav ? isDomainNavOverThreshold(domainNav) : false;\n\n return (\n <>\n <Box\n flexDirection=\"row\"\n columnGap={2}\n borderColor=\"blackBright\"\n borderStyle=\"single\"\n paddingX={1}\n alignItems=\"center\"\n marginBottom={shouldHoistDomainNav ? 0 : 3}\n >\n {steps.map((step) => {\n const state = getStepState(step.id, currentStep, completedSteps, skippedSteps);\n\n if (step.id === \"build\" && domainNav && !shouldHoistDomainNav) {\n return (\n <Box\n key={step.id}\n position=\"relative\"\n display=\"flex\"\n justifyContent={getStepJustifyContent(step.id)}\n >\n <Tab step={step} state={state} />\n <DomainNav {...domainNav} />\n </Box>\n );\n }\n\n // Generic dropdown for any step\n const dropdown = dropdowns?.[step.id];\n if (dropdown) {\n return (\n <Box\n key={step.id}\n position=\"relative\"\n display=\"flex\"\n justifyContent={getStepJustifyContent(step.id)}\n >\n <Tab step={step} state={state} />\n <TabDropdown {...dropdown} />\n </Box>\n );\n }\n\n return <Tab key={step.id} step={step} state={state} />;\n })}\n <Box flexGrow={1} justifyContent=\"flex-end\">\n <Text dimColor>{`v${version}`}</Text>\n </Box>\n </Box>\n {domainNav && shouldHoistDomainNav && (\n <Box>\n <DomainNav {...domainNav} inline />\n </Box>\n )}\n </>\n );\n};\n"],"mappings":"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","names":[]}
|
package/dist/chunk-LFUJCRCT.js
DELETED
|
@@ -1,27 +0,0 @@
|
|
|
1
|
-
#!/usr/bin/env node
|
|
2
|
-
import {
|
|
3
|
-
computeRowScrollTop
|
|
4
|
-
} from "./chunk-SLBL3WIP.js";
|
|
5
|
-
import {
|
|
6
|
-
SCROLL_VIEWPORT
|
|
7
|
-
} from "./chunk-AG3ZVM3B.js";
|
|
8
|
-
|
|
9
|
-
// src/cli/components/hooks/use-row-scroll.ts
|
|
10
|
-
import { useRef } from "react";
|
|
11
|
-
function useRowScroll({
|
|
12
|
-
focusedIndex,
|
|
13
|
-
itemCount,
|
|
14
|
-
availableHeight
|
|
15
|
-
}) {
|
|
16
|
-
const scrollTopRef = useRef(0);
|
|
17
|
-
const scrollEnabled = availableHeight > 0 && availableHeight >= SCROLL_VIEWPORT.MIN_VIEWPORT_ROWS && itemCount > availableHeight;
|
|
18
|
-
if (scrollEnabled) {
|
|
19
|
-
scrollTopRef.current = computeRowScrollTop(focusedIndex, scrollTopRef.current, availableHeight);
|
|
20
|
-
}
|
|
21
|
-
return { scrollEnabled, scrollTop: scrollTopRef.current };
|
|
22
|
-
}
|
|
23
|
-
|
|
24
|
-
export {
|
|
25
|
-
useRowScroll
|
|
26
|
-
};
|
|
27
|
-
//# sourceMappingURL=chunk-LFUJCRCT.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/cli/components/hooks/use-row-scroll.ts"],"sourcesContent":["import { useRef } from \"react\";\nimport { SCROLL_VIEWPORT } from \"../../consts.js\";\nimport { computeRowScrollTop } from \"./use-section-scroll.js\";\n\nexport type UseRowScrollOptions = {\n focusedIndex: number;\n itemCount: number;\n availableHeight: number;\n};\n\nexport type UseRowScrollResult = {\n scrollEnabled: boolean;\n scrollTop: number;\n};\n\n/**\n * Row-based scroll hook for views with uniform 1-line rows.\n *\n * Manages a scroll offset (in rows) to keep the focused row visible within\n * a constrained viewport. Extracted from the identical scroll plumbing in\n * checkbox-grid.tsx, step-agents.tsx, and stack-selection.tsx.\n *\n * Deliberately exposes NO hidden-line counts — unlike `useSectionScroll`, which\n * computes them for the `ScrollAffordance` the Sources grid renders. Every\n * consumer here (Domains, Agents, Stack) clips silently by owner decision: a\n * half-cut row is self-evident, and a counted hint would cost the viewport a row\n * to say the same thing. Adding the counts is a product change, not a gap.\n */\nexport function useRowScroll({\n focusedIndex,\n itemCount,\n availableHeight,\n}: UseRowScrollOptions): UseRowScrollResult {\n const scrollTopRef = useRef(0);\n\n const scrollEnabled =\n availableHeight > 0 &&\n availableHeight >= SCROLL_VIEWPORT.MIN_VIEWPORT_ROWS &&\n itemCount > availableHeight;\n\n if (scrollEnabled) {\n scrollTopRef.current = computeRowScrollTop(focusedIndex, scrollTopRef.current, availableHeight);\n }\n\n return { scrollEnabled, scrollTop: scrollTopRef.current };\n}\n"],"mappings":";;;;;;;;;AAAA,SAAS,cAAc;AA4BhB,SAAS,aAAa;AAAA,EAC3B;AAAA,EACA;AAAA,EACA;AACF,GAA4C;AAC1C,QAAM,eAAe,OAAO,CAAC;AAE7B,QAAM,gBACJ,kBAAkB,KAClB,mBAAmB,gBAAgB,qBACnC,YAAY;AAEd,MAAI,eAAe;AACjB,iBAAa,UAAU,oBAAoB,cAAc,aAAa,SAAS,eAAe;AAAA,EAChG;AAEA,SAAO,EAAE,eAAe,WAAW,aAAa,QAAQ;AAC1D;","names":[]}
|