@aigne/cli 1.42.0 → 1.42.2

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 CHANGED
@@ -1,5 +1,28 @@
1
1
  # Changelog
2
2
 
3
+ ## [1.42.2](https://github.com/AIGNE-io/aigne-framework/compare/cli-v1.42.1...cli-v1.42.2) (2025-08-29)
4
+
5
+
6
+ ### Dependencies
7
+
8
+ * The following workspace dependencies were updated
9
+ * dependencies
10
+ * @aigne/agent-library bumped to 1.21.32
11
+ * @aigne/agentic-memory bumped to 1.0.32
12
+ * @aigne/aigne-hub bumped to 0.8.2
13
+ * @aigne/core bumped to 1.57.1
14
+ * @aigne/default-memory bumped to 1.1.14
15
+ * @aigne/openai bumped to 0.13.3
16
+ * devDependencies
17
+ * @aigne/test-utils bumped to 0.5.39
18
+
19
+ ## [1.42.1](https://github.com/AIGNE-io/aigne-framework/compare/cli-v1.42.0...cli-v1.42.1) (2025-08-29)
20
+
21
+
22
+ ### Bug Fixes
23
+
24
+ * resolve checkbox multi-select issues and add comprehensive test ([#430](https://github.com/AIGNE-io/aigne-framework/issues/430)) ([a81be74](https://github.com/AIGNE-io/aigne-framework/commit/a81be74253923a1a2981f0780a15f175fd439210))
25
+
3
26
  ## [1.42.0](https://github.com/AIGNE-io/aigne-framework/compare/cli-v1.41.3...cli-v1.42.0) (2025-08-28)
4
27
 
5
28
 
@@ -19,9 +19,6 @@ const checkboxTheme = {
19
19
  function isSelectable(item) {
20
20
  return !Separator.isSeparator(item) && !item.disabled;
21
21
  }
22
- function isChecked(item) {
23
- return isSelectable(item) && item.checked;
24
- }
25
22
  function toggle(item) {
26
23
  return isSelectable(item) ? { ...item, checked: !item.checked } : item;
27
24
  }
@@ -65,10 +62,10 @@ export default createPrompt((config, done) => {
65
62
  const [searchTerm, setSearchTerm] = useState("");
66
63
  const [searchError, setSearchError] = useState();
67
64
  const initialItems = config.choices ? normalizeChoices(config.choices) : [];
68
- const initialSelectedValues = new Set(initialItems
65
+ const initialSelectedChoices = new Map(initialItems
69
66
  .filter((item) => !Separator.isSeparator(item) && item.checked)
70
- .map((item) => item.value));
71
- const [selectedValues, setSelectedValues] = useState(initialSelectedValues);
67
+ .map((item) => [item.value, item]));
68
+ const [selectedChoices, setSelectedChoices] = useState(initialSelectedChoices);
72
69
  const [items, setItems] = useState(initialItems);
73
70
  useEffect(() => {
74
71
  const { source } = config;
@@ -84,12 +81,12 @@ export default createPrompt((config, done) => {
84
81
  });
85
82
  if (!controller.signal.aborted) {
86
83
  const normalizedResults = normalizeChoices(results);
87
- // Preserve selected state from selectedValues
84
+ // Preserve selected state from selectedChoices
88
85
  const itemsWithSelection = normalizedResults.map((item) => {
89
86
  if (!Separator.isSeparator(item)) {
90
87
  return {
91
88
  ...item,
92
- checked: selectedValues.has(item.value),
89
+ checked: selectedChoices.has(item.value),
93
90
  };
94
91
  }
95
92
  return item;
@@ -114,7 +111,7 @@ export default createPrompt((config, done) => {
114
111
  return () => {
115
112
  controller.abort();
116
113
  };
117
- }, [searchTerm, config.source]);
114
+ }, [searchTerm, config.source, selectedChoices]);
118
115
  const bounds = useMemo(() => {
119
116
  const first = items.findIndex(isSelectable);
120
117
  const last = items.findLastIndex(isSelectable);
@@ -128,14 +125,14 @@ export default createPrompt((config, done) => {
128
125
  const [errorMsg, setError] = useState();
129
126
  useKeypress(async (key, rl) => {
130
127
  if (isEnterKey(key)) {
131
- const selection = items.filter(isChecked);
132
- const isValid = await validate([...selection]);
133
- if (required && !items.some(isChecked)) {
128
+ const selectionChoices = Array.from(selectedChoices.values());
129
+ const isValid = await validate(selectionChoices);
130
+ if (required && selectedChoices.size === 0) {
134
131
  setError("At least one choice must be selected");
135
132
  }
136
133
  else if (isValid === true) {
137
134
  setStatus("done");
138
- done(selection.map((choice) => choice.value));
135
+ done(selectionChoices.map((choice) => choice.value));
139
136
  }
140
137
  else {
141
138
  setError(isValid || "You must select a valid value");
@@ -164,40 +161,40 @@ export default createPrompt((config, done) => {
164
161
  }
165
162
  const activeItem = items[active];
166
163
  if (activeItem && isSelectable(activeItem)) {
167
- const newSelectedValues = new Set(selectedValues);
168
- if (selectedValues.has(activeItem.value)) {
169
- newSelectedValues.delete(activeItem.value);
164
+ const newSelectedChoices = new Map(selectedChoices);
165
+ if (selectedChoices.has(activeItem.value)) {
166
+ newSelectedChoices.delete(activeItem.value);
170
167
  }
171
168
  else {
172
- newSelectedValues.add(activeItem.value);
169
+ newSelectedChoices.set(activeItem.value, activeItem);
173
170
  }
174
- setSelectedValues(newSelectedValues);
171
+ setSelectedChoices(newSelectedChoices);
172
+ setItems(items.map((choice, i) => (i === active ? toggle(choice) : choice)));
175
173
  }
176
- setItems(items.map((choice, i) => (i === active ? toggle(choice) : choice)));
177
174
  }
178
175
  else if (key.name === shortcuts.all && !config.source) {
179
176
  const selectAll = items.some((choice) => isSelectable(choice) && !choice.checked);
180
- const newSelectedValues = new Set();
177
+ const newSelectedChoices = new Map();
181
178
  if (selectAll) {
182
179
  items.forEach((item) => {
183
180
  if (isSelectable(item)) {
184
- newSelectedValues.add(item.value);
181
+ newSelectedChoices.set(item.value, item);
185
182
  }
186
183
  });
187
184
  }
188
- setSelectedValues(newSelectedValues);
185
+ setSelectedChoices(newSelectedChoices);
189
186
  setItems(items.map(check(selectAll)));
190
187
  }
191
188
  else if (key.name === shortcuts.invert && !config.source) {
192
- const newSelectedValues = new Set();
189
+ const newSelectedChoices = new Map();
193
190
  items.forEach((item) => {
194
191
  if (isSelectable(item)) {
195
- if (!selectedValues.has(item.value)) {
196
- newSelectedValues.add(item.value);
192
+ if (!selectedChoices.has(item.value)) {
193
+ newSelectedChoices.set(item.value, item);
197
194
  }
198
195
  }
199
196
  });
200
- setSelectedValues(newSelectedValues);
197
+ setSelectedChoices(newSelectedChoices);
201
198
  setItems(items.map(toggle));
202
199
  }
203
200
  else if (isNumberKey(key) && !config.source) {
@@ -213,14 +210,14 @@ export default createPrompt((config, done) => {
213
210
  const selectedItem = items[position];
214
211
  if (selectedItem && isSelectable(selectedItem)) {
215
212
  setActive(position);
216
- const newSelectedValues = new Set(selectedValues);
217
- if (selectedValues.has(selectedItem.value)) {
218
- newSelectedValues.delete(selectedItem.value);
213
+ const newSelectedChoices = new Map(selectedChoices);
214
+ if (selectedChoices.has(selectedItem.value)) {
215
+ newSelectedChoices.delete(selectedItem.value);
219
216
  }
220
217
  else {
221
- newSelectedValues.add(selectedItem.value);
218
+ newSelectedChoices.set(selectedItem.value, selectedItem);
222
219
  }
223
- setSelectedValues(newSelectedValues);
220
+ setSelectedChoices(newSelectedChoices);
224
221
  setItems(items.map((choice, i) => (i === position ? toggle(choice) : choice)));
225
222
  }
226
223
  }
@@ -253,7 +250,7 @@ export default createPrompt((config, done) => {
253
250
  loop,
254
251
  });
255
252
  if (status === "done") {
256
- const selection = items.filter(isChecked);
253
+ const selection = Array.from(selectedChoices.values());
257
254
  const answer = theme.style.answer(theme.style.renderSelectedChoices(selection, items));
258
255
  return `${prefix} ${message} ${answer}`;
259
256
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@aigne/cli",
3
- "version": "1.42.0",
3
+ "version": "1.42.2",
4
4
  "description": "Your command center for agent development",
5
5
  "publishConfig": {
6
6
  "access": "public"
@@ -79,15 +79,16 @@
79
79
  "yargs": "^18.0.0",
80
80
  "yoctocolors-cjs": "^2.1.3",
81
81
  "zod": "^3.25.67",
82
- "@aigne/agentic-memory": "^1.0.31",
83
- "@aigne/aigne-hub": "^0.8.1",
84
- "@aigne/agent-library": "^1.21.31",
85
- "@aigne/core": "^1.57.0",
86
- "@aigne/default-memory": "^1.1.13",
82
+ "@aigne/agent-library": "^1.21.32",
83
+ "@aigne/agentic-memory": "^1.0.32",
84
+ "@aigne/aigne-hub": "^0.8.2",
85
+ "@aigne/core": "^1.57.1",
86
+ "@aigne/default-memory": "^1.1.14",
87
87
  "@aigne/observability-api": "^0.10.1",
88
- "@aigne/openai": "^0.13.2"
88
+ "@aigne/openai": "^0.13.3"
89
89
  },
90
90
  "devDependencies": {
91
+ "@inquirer/testing": "^2.1.49",
91
92
  "@types/archiver": "^6.0.3",
92
93
  "@types/bun": "^1.2.18",
93
94
  "@types/express": "^5.0.3",
@@ -101,7 +102,7 @@
101
102
  "rimraf": "^6.0.1",
102
103
  "typescript": "^5.8.3",
103
104
  "ufo": "^1.6.1",
104
- "@aigne/test-utils": "^0.5.38"
105
+ "@aigne/test-utils": "^0.5.39"
105
106
  },
106
107
  "scripts": {
107
108
  "lint": "tsc --noEmit",