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 +5 -0
- package/lib/ui.js +30 -9
- package/package.json +1 -1
- package/runtime/codex/manifest.json +1 -3
- package/runtime/codex/.codex/skills/infra/SKILL.md +0 -41
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 -
|
|
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 +
|
|
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 =
|
|
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 =
|
|
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)
|
|
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)
|
|
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,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":
|
|
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.
|