@nexusbloom/cli 0.9.2 → 0.9.3

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 (3) hide show
  1. package/README.md +0 -11
  2. package/package.json +1 -1
  3. package/src/wizard.js +10 -5
package/README.md CHANGED
@@ -323,17 +323,6 @@ removed rather than resolved. Relative imports like `import { helper } from
323
323
  `export const coreLogic = async () => {}` and plain `function coreLogic` are all
324
324
  supported.
325
325
 
326
- ## Development
327
-
328
- ```bash
329
- npm test # 500+ tests, no network required
330
- npm run test:coverage # with a coverage report
331
- npm run test:watch # re-run on change
332
- ```
333
-
334
- The suite runs fully offline and is isolated from your real config, API key and
335
- network — both properties are enforced by guard tests, not assumed.
336
-
337
326
  ## Security Notes
338
327
 
339
328
  - No API keys or Supabase keys are shipped inside the package.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@nexusbloom/cli",
3
- "version": "0.9.2",
3
+ "version": "0.9.3",
4
4
  "description": "NexusBloom CLI — run tools and workflows from your terminal",
5
5
  "type": "module",
6
6
  "bin": {
package/src/wizard.js CHANGED
@@ -97,8 +97,16 @@ function renderObservedOutput(fields) {
97
97
 
98
98
  // ─── Prompts ─────────────────────────────────────────────────────────────────
99
99
 
100
+ /**
101
+ * Ask for a tool to add as the next step.
102
+ *
103
+ * A tool may be chosen more than once: the pipeline engine addresses steps
104
+ * positionally, so `base64-tool … | base64-tool text=$result action=decode`
105
+ * is a legal round-trip. (It was verified working before this restriction was
106
+ * lifted.) `exclude` remains for callers that genuinely need a subset.
107
+ */
100
108
  async function pickTool(tools, exclude = [], P = defaultPrompts) {
101
- const pool = tools.filter((t) => !exclude.includes(t.slug));
109
+ const pool = exclude.length ? tools.filter((t) => !exclude.includes(t.slug)) : tools;
102
110
  const source = async (term) => {
103
111
  const hits = term ? rankTools(pool, term) : pool;
104
112
  return hits.slice(0, 50).map((t) => ({
@@ -246,7 +254,6 @@ export async function buildWizard(opts = {}) {
246
254
 
247
255
  const steps = [];
248
256
  const outputs = [];
249
- const usedSlugs = [];
250
257
 
251
258
  for (;;) {
252
259
  renderHeader(
@@ -254,7 +261,7 @@ export async function buildWizard(opts = {}) {
254
261
  { subtitle: steps.length ? "Pick the next tool to feed" : "Start with any tool" }
255
262
  );
256
263
 
257
- const tool = await pickTool(tools, usedSlugs, P);
264
+ const tool = await pickTool(tools, [], P);
258
265
  if (!tool) break;
259
266
 
260
267
  const info = await getTool(tool.slug);
@@ -280,7 +287,6 @@ export async function buildWizard(opts = {}) {
280
287
 
281
288
  const spec = `${tool.slug} ${assignments.map((a) => a.text).join(" ")}`.trim();
282
289
  steps.push({ slug: tool.slug, spec, assignments });
283
- usedSlugs.push(tool.slug);
284
290
 
285
291
  console.log(chalk.gray(`\n Running ${spec}\n`));
286
292
  const started = Date.now();
@@ -294,7 +300,6 @@ export async function buildWizard(opts = {}) {
294
300
  // Drop the step either way: only steps that actually ran belong in the
295
301
  // replay command we hand back.
296
302
  steps.pop();
297
- usedSlugs.pop();
298
303
  const again = await P.confirm({ message: "Change the inputs and retry?", default: true });
299
304
  if (again) continue;
300
305
  break;