@oriro/orirocli 0.1.1 → 0.1.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.
Files changed (3) hide show
  1. package/README.md +4 -4
  2. package/dist/cli.js +77 -0
  3. package/package.json +1 -1
package/README.md CHANGED
@@ -2,20 +2,20 @@
2
2
 
3
3
  # ORIRO‑Terminal - **“Head | Memory | Eyeball for AI”**
4
4
 
5
- # **FREE TIER | BYOK** | **Works in 99 Languages | Live Security Gaurdian-V3 (MCP Watch)**
5
+ # **FREE TIER | BYOK** | **Works in 100 Languages | Live Security Gaurdian-V3 (MCP Watch)**
6
6
 
7
- A terminal coder that **sees the web**, **speaks and listens in 99 languages**, **guards itself**, and can wear a **floating avatar that talks back in its own voice** — all on‑device.
7
+ A terminal coder that **sees the web**, **speaks and listens in 100 languages**, **guards itself**, and can wear a **floating avatar that talks back in its own voice** — all on‑device.
8
8
 
9
9
  A free, on-device-friendly terminal AI agent — built on the Pi agent harness (used as a library).
10
10
  Your language, your machine, no paid keys required.
11
11
 
12
12
  ## What's inside
13
13
  - **Keyless free-router Mux** — best-router selection + invisible failover across free providers, with an on-device floor. Never a paid key.
14
- - **99 languages** — type in your language; the model reasons in English; replies come back translated (on-device NLLB).
14
+ - **100 languages** — type in your language; the model reasons in English; replies come back translated (on-device NLLB).
15
15
  - **Guardian V3** — a security gate on every tool call, default-on, fail-closed.
16
16
  - **Head** — goes out, inspects a live site, and reverse-engineers it to code.
17
17
  - **Scriber** — a consent-gated, self-healing local work journal (never leaves your machine).
18
- - **322 skills**, **multi-agent orchestration** on the free pool, and **MCP connectors**.
18
+ - **323 skills**, **multi-agent orchestration** on the free pool, and **MCP connectors**.
19
19
  - **Channels** — drive ORIRO from Telegram/Discord/WhatsApp with your own bot.
20
20
 
21
21
  ## Install
package/dist/cli.js CHANGED
@@ -854,6 +854,10 @@ function avatarsInCategory(category) {
854
854
  const c = category.toLowerCase();
855
855
  return AVATARS.filter((a) => a.category.toLowerCase() === c);
856
856
  }
857
+ function avatarBySlug(slug) {
858
+ const s = (slug || "").toLowerCase();
859
+ return AVATARS.find((a) => a.slug.toLowerCase() === s);
860
+ }
857
861
  function avatarImageUrl(a) {
858
862
  return a.image_url.startsWith("http") ? a.image_url : `${AVATAR_ORIGIN}${a.image_url}`;
859
863
  }
@@ -877,6 +881,10 @@ function writeAvatarConfig(cfg) {
877
881
  function isAvatarConfigured() {
878
882
  return readAvatarConfig() !== null;
879
883
  }
884
+ function getSelectedAvatar() {
885
+ const cfg = readAvatarConfig();
886
+ return cfg && avatarBySlug(cfg.slug) || null;
887
+ }
880
888
  function setSelectedAvatar(avatar, opts) {
881
889
  const cfg = {
882
890
  slug: avatar.slug,
@@ -4543,6 +4551,73 @@ function registerSkillsCommand(program2) {
4543
4551
  });
4544
4552
  }
4545
4553
 
4554
+ // src/commands/language.ts
4555
+ import { stdin as stdin5 } from "process";
4556
+ function registerLanguageCommand(program2) {
4557
+ program2.command("language").description("show or change your terminal language").argument("[code]", "switch directly to this language (ISO code or name, e.g. es)").option("-a, --all", "list every available language").action(async (code, opts) => {
4558
+ if (opts.all) {
4559
+ heading(`Languages (${LANGUAGES.length})`);
4560
+ for (const l of LANGUAGES) {
4561
+ const star = l.neuralVoice ? accent("\u2605") : " ";
4562
+ process.stdout.write(` ${star} ${l.name} ${dim(`(${l.code})`)}
4563
+ `);
4564
+ }
4565
+ return;
4566
+ }
4567
+ if (code) {
4568
+ const lang = languageByCode(code);
4569
+ if (!lang) die(`unknown language '${code}' \u2014 run \`oriro language --all\` to see the list`);
4570
+ setTerminalLanguage(lang);
4571
+ ok(`${accent(lang.name)} is now your terminal language.`);
4572
+ return;
4573
+ }
4574
+ if (stdin5.isTTY) {
4575
+ const lang = await selectLanguageInteractive();
4576
+ setTerminalLanguage(lang);
4577
+ ok(`${accent(lang.name)} is now your terminal language.`);
4578
+ } else {
4579
+ const cur = getTerminalLanguage();
4580
+ info(`terminal language: ${accent(cur.name)} ${dim(`(${cur.code})`)}`);
4581
+ info(dim("change it with `oriro language <code>` (e.g. `oriro language es`) or `oriro language --all`"));
4582
+ }
4583
+ });
4584
+ }
4585
+
4586
+ // src/commands/avatar.ts
4587
+ import { stdin as stdin6 } from "process";
4588
+ function registerAvatarCommand(program2) {
4589
+ program2.command("avatar").description("show or change your terminal avatar").argument("[slug]", "set directly to this avatar slug").option("-l, --list", "list every avatar by category").action(async (slug, opts) => {
4590
+ if (opts.list) {
4591
+ for (const cat of avatarCategories()) {
4592
+ heading(cat);
4593
+ for (const a of avatarsInCategory(cat)) process.stdout.write(` ${accent(a.slug)}
4594
+ `);
4595
+ }
4596
+ return;
4597
+ }
4598
+ if (slug) {
4599
+ const avatar = avatarBySlug(slug);
4600
+ if (!avatar) die(`unknown avatar '${slug}' \u2014 run \`oriro avatar --list\` to see the faces`);
4601
+ setSelectedAvatar(avatar, { speak: true });
4602
+ ok(`${accent(avatar.slug)} is now your terminal face.`);
4603
+ return;
4604
+ }
4605
+ if (stdin6.isTTY) {
4606
+ const chosen = await selectAvatarInteractive();
4607
+ if (!chosen) {
4608
+ info("no change.");
4609
+ return;
4610
+ }
4611
+ setSelectedAvatar(chosen, { speak: true });
4612
+ await previewAvatar(chosen);
4613
+ } else {
4614
+ const cur = getSelectedAvatar();
4615
+ info(cur ? `terminal face: ${accent(cur.slug)}` : "no avatar set yet");
4616
+ info(dim("change it with `oriro avatar <slug>` or `oriro avatar --list`"));
4617
+ }
4618
+ });
4619
+ }
4620
+
4546
4621
  // src/cli.ts
4547
4622
  var version = createRequire(import.meta.url)("../package.json").version;
4548
4623
  var program = new Command();
@@ -4561,6 +4636,8 @@ registerScribeCommand(program);
4561
4636
  registerConnectorsCommand(program);
4562
4637
  registerChannelsCommand(program);
4563
4638
  registerSkillsCommand(program);
4639
+ registerLanguageCommand(program);
4640
+ registerAvatarCommand(program);
4564
4641
  program.parseAsync().catch((e) => {
4565
4642
  process.stderr.write(`
4566
4643
  ORIRO error: ${e instanceof Error ? e.stack ?? e.message : String(e)}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@oriro/orirocli",
3
- "version": "0.1.1",
3
+ "version": "0.1.2",
4
4
  "description": "ORIRO — a free, on-device-friendly terminal AI agent. Built on the Pi agent harness (used as a library).",
5
5
  "type": "module",
6
6
  "bin": {