create-egregore 0.18.1 → 0.18.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/bin/cli.js CHANGED
@@ -146,6 +146,11 @@ async function chooseRuntime(args) {
146
146
  };
147
147
  })
148
148
  .sort((a, b) => Number(b.installed) - Number(a.installed));
149
+ // Coming-soon harnesses — shown for visibility, not yet selectable.
150
+ choices.push(
151
+ { label: "Hermes (coming soon)", description: "Not yet available — pick Claude Code or Codex for now", runtime: "hermes", disabled: true },
152
+ { label: "Pi (coming soon)", description: "Not yet available — pick Claude Code or Codex for now", runtime: "pi", disabled: true },
153
+ );
149
154
  const choice = await ui.choose("Which assistant do you want to use?", choices);
150
155
  return choice.runtime;
151
156
  }
package/lib/ui.js CHANGED
@@ -308,10 +308,22 @@ async function choose(question, options, hint) {
308
308
 
309
309
  async function interactiveChoose(question, options, hint) {
310
310
  return new Promise((resolve) => {
311
- let cursor = 0;
312
311
  let filterText = "";
313
312
  let visible = filterOptions(options, filterText, (o) => `${o.label} ${o.description || ""}`);
314
313
  let lastLineCount = 0;
314
+ // Disabled options (e.g. coming-soon harnesses) are shown but not
315
+ // selectable — the cursor skips them and Enter ignores them.
316
+ const firstEnabled = () => { const i = visible.findIndex((e) => !e.opt.disabled); return i < 0 ? 0 : i; };
317
+ const stepEnabled = (from, dir) => {
318
+ if (visible.length === 0) return 0;
319
+ let i = from;
320
+ for (let n = 0; n < visible.length; n++) {
321
+ i = (i + dir + visible.length) % visible.length;
322
+ if (!visible[i].opt.disabled) return i;
323
+ }
324
+ return from;
325
+ };
326
+ let cursor = firstEnabled();
315
327
 
316
328
  const labelWidth = Math.min(
317
329
  40,
@@ -321,10 +333,13 @@ async function interactiveChoose(question, options, hint) {
321
333
  const render = (first = false) => {
322
334
  const lines = visible.map((entry, i) => {
323
335
  const { opt } = entry;
336
+ const desc = opt.description ? ` ${DIM}${opt.description}${RESET}` : "";
337
+ if (opt.disabled) {
338
+ return ` ${DIM}· ${pad(opt.label, labelWidth)}${RESET}${desc}`;
339
+ }
324
340
  const selected = i === cursor;
325
341
  const marker = selected ? `${CYAN}❯${RESET}` : " ";
326
342
  const labelPart = selected ? `${BOLD}${CYAN}${pad(opt.label, labelWidth)}${RESET}` : pad(opt.label, labelWidth);
327
- const desc = opt.description ? ` ${DIM}${opt.description}${RESET}` : "";
328
343
  return ` ${marker} ${labelPart}${desc}`;
329
344
  });
330
345
  if (visible.length === 0) {
@@ -360,23 +375,23 @@ async function interactiveChoose(question, options, hint) {
360
375
  process.exit(130);
361
376
  }
362
377
  if (key.name === "return") {
363
- if (visible.length > 0) finish(visible[cursor].opt);
378
+ if (visible.length > 0 && !visible[cursor].opt.disabled) finish(visible[cursor].opt);
364
379
  return;
365
380
  }
366
381
  if (key.name === "up" || (key.ctrl && key.name === "p")) {
367
- cursor = (cursor - 1 + visible.length) % Math.max(1, visible.length);
382
+ cursor = stepEnabled(cursor, -1);
368
383
  render();
369
384
  return;
370
385
  }
371
386
  if (key.name === "down" || (key.ctrl && key.name === "n")) {
372
- cursor = (cursor + 1) % Math.max(1, visible.length);
387
+ cursor = stepEnabled(cursor, +1);
373
388
  render();
374
389
  return;
375
390
  }
376
391
  if (key.name === "backspace") {
377
392
  filterText = filterText.slice(0, -1);
378
393
  visible = filterOptions(options, filterText, (o) => `${o.label} ${o.description || ""}`);
379
- cursor = 0;
394
+ cursor = firstEnabled();
380
395
  render();
381
396
  return;
382
397
  }
@@ -384,7 +399,7 @@ async function interactiveChoose(question, options, hint) {
384
399
  if (_str && _str.length === 1 && !key.ctrl && !key.meta && _str.charCodeAt(0) >= 32) {
385
400
  filterText += _str;
386
401
  visible = filterOptions(options, filterText, (o) => `${o.label} ${o.description || ""}`);
387
- cursor = 0;
402
+ cursor = firstEnabled();
388
403
  render();
389
404
  }
390
405
  };
@@ -412,9 +427,15 @@ async function legacyChoose(question, options, hint) {
412
427
  const answer = await prompt(`pick ${DIM}[1-${options.length}]${RESET}:`);
413
428
  if (!answer) { warn(`Enter a number between 1 and ${options.length}.`); continue; }
414
429
  const n = parseInt(answer, 10);
415
- if (n >= 1 && n <= options.length) return options[n - 1];
430
+ if (n >= 1 && n <= options.length) {
431
+ if (options[n - 1].disabled) { warn(`${options[n - 1].label} isn't available yet.`); continue; }
432
+ return options[n - 1];
433
+ }
416
434
  const labelMatch = options.find((o) => o.label.toLowerCase() === answer.toLowerCase());
417
- if (labelMatch) return labelMatch;
435
+ if (labelMatch) {
436
+ if (labelMatch.disabled) { warn(`${labelMatch.label} isn't available yet.`); continue; }
437
+ return labelMatch;
438
+ }
418
439
  warn(`Not a valid option. Enter 1-${options.length} or a label.`);
419
440
  }
420
441
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "create-egregore",
3
- "version": "0.18.1",
3
+ "version": "0.18.2",
4
4
  "description": "Set up Egregore for your team in one command — installs the egregore launcher and your choice of Claude Code or Codex.",
5
5
  "license": "MIT",
6
6
  "bin": {
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "source": "egregore-runtime",
3
3
  "policy": "public-safe subset derived from .syncignore; built by scripts/build-runtime-bundle.mjs",
4
- "skillCount": 52,
4
+ "skillCount": 51,
5
5
  "skills": [
6
6
  "activity",
7
7
  "add",
@@ -22,7 +22,6 @@
22
22
  "env",
23
23
  "handoff",
24
24
  "harvest",
25
- "infra",
26
25
  "ingest",
27
26
  "ingest-google",
28
27
  "ingest-user-interview",
@@ -80,7 +79,6 @@
80
79
  ".codex/skills/env/SKILL.md",
81
80
  ".codex/skills/handoff/SKILL.md",
82
81
  ".codex/skills/harvest/SKILL.md",
83
- ".codex/skills/infra/SKILL.md",
84
82
  ".codex/skills/ingest-google/SKILL.md",
85
83
  ".codex/skills/ingest-user-interview/SKILL.md",
86
84
  ".codex/skills/ingest/SKILL.md",
@@ -1,41 +0,0 @@
1
- ---
2
- name: infra
3
- description: 'Fallback Codex adapter for the Egregore infra workflow.'
4
- ---
5
-
6
- <!-- generated-by: bin/codex-sync-skills.sh -->
7
-
8
- # Egregore infra Adapter
9
-
10
- This is fallback coverage for a long-tail Egregore workflow that has not been
11
- ported to a hand-written Codex-native skill yet.
12
-
13
- Use the project shell and filesystem directly. Do not invoke Claude Code
14
- commands. Translate interactive choices to structured Codex question tooling
15
- when it is available; otherwise render compact numbered choices with an
16
- `Other:` option and wait for the user.
17
-
18
- ## Structured UX parity
19
-
20
- This workflow has a Claude skill with user-visible structured output. After
21
- reading `.claude/skills/infra/SKILL.md`, reproduce the same visible UX in Codex:
22
-
23
- - Preserve TUI boxes, markdown tables, rich cards, browser artifact rendering,
24
- exact confirmation blocks, and "no preamble" rules from the source skill.
25
- - Use the source skill's frame width, section order, labels, status footer,
26
- and examples as the contract for the final response.
27
- - Never replace a required box/table/card/artifact view with a prose summary
28
- unless the user explicitly asks for a summary.
29
- - When the source says to output a TUI box directly, paste that box as the
30
- visible response, preferably in a `text` fenced block.
31
- - Never show raw JSON, raw command output, or unformatted script output when
32
- the source skill requires formatted status or rendered output.
33
-
34
- 1. Read `.claude/skills/infra/SKILL.md` for the workflow details.
35
- 2. Run the referenced `bin/` scripts directly from Codex.
36
- 3. Treat graph, publish, and notify steps as best-effort unless that workflow
37
- explicitly says they are required.
38
- 4. Keep local-mode behavior filesystem-first and avoid graph or notification
39
- calls when `egregore.json` declares `"mode": "local"`.
40
- 5. Never call the deprecated `egregore-handoff` CLI for Egregore project
41
- handoffs.