Public-release hygiene: LICENSE, community health files, CI - #10
Merged
Conversation
Prepares the repo for public release without touching any working code: - LICENSE (MIT) — matches the license already declared in README; npm force-packs it, so scripts/prepublish-check.mjs whitelist now allows it. - CHANGELOG.md — 0.1.1 → 0.1.8 history from the git log. - SECURITY.md — private vuln reporting (GitHub advisories + security@oriro.ai). - CONTRIBUTING.md — setup, the build/typecheck/unit/smoke gate, ATTRIBUTION rule. - CODE_OF_CONDUCT.md — Contributor Covenant 2.1. - .github/ — CI (typecheck→build→unit→smoke on Node 20/22) + issue/PR templates. - PUBLISHING.md — corrected the verify-step version (0.1.0 → 0.1.8). No changes to src/, dist/, package.json, or the shipped skill set. Build, smoke (21/21), and unit tests all green; tarball whitelist passes with LICENSE. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
…-styling) → 327 bundled Privacy-scrubbed batch fold from the local skill library; 25 candidates were already bundled (nested Step-5 pack) and 15 evaluated-private skills excluded. ATTRIBUTION.md records the full provenance. Smoke gate updated 323→327. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…shots, agentic The Head module was rich in source but only `inspect_site` (structural fetch) was reachable; tsup tree-shook the rest out of dist/cli.js. This wires all of it in: - New src/head/run.ts — shared orchestrator (inspect+visual HTML, url→code, url→spec, screenshots→flow HTML, video→code) used by BOTH the agent tools and the CLI. - src/head/pi-tool.ts — registers url_to_code, url_to_spec, capture_site, video_to_code alongside inspect_site, so the chat agent can do the whole Head on its own judgment. - New `oriro head` command (src/commands/head.ts) — <url> [competitors] with --code/--spec/--shots/--html/--video/--goal/--stack/--out; natural-language parse via detectInspectIntent; no-arg prints usage (exit 0). Registered in cli.ts. - src/head/model.ts — buildHeadWatchModel/headVideoModels for the (experimental) video path. - tsup: splitting:false so the lazy ./screenshot-flow inlines into the single shipped cli.js instead of a sibling chunk the files[] whitelist would never publish. - README: Head section reconciled to the shipped reality (removed the false "voice loop LIVE" claim; documented `oriro head` + the peer-gated code/spec/shots). - smoke: `oriro head` + `oriro head --help` assertions. All 14 previously-dropped Head symbols now ship in dist/cli.js. Playwright stays an external dynamic peer (graceful "install chromium" message when absent). typecheck clean, smoke 23/23, unit green, bundle clean (no spike/openclaw), single shebang. Verified live: structural read + gap analysis + visual HTML against example.com, NL parse, graceful --code. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
…voice STT Brings the CLI up to the ORIRO-CLI vision doc. All additive, graceful, single-file. MCP setup (#2) + Guardian vetting (#3): - `oriro connectors setup` — guided (interactive or flag-driven) custom MCP server setup, no JSON. Builds the ServerConfig, runs it through Guardian's vetMcpServer BEFORE saving: blocks a malicious launch (curl|sh, obfuscated loader, env→URL exfil), asks-to-trust a new clean server, allows an already-trusted one, and remembers trust so it never re-asks. SSRF guard on URL servers. New custom store (connectors/custom.ts) + `connectors custom` / `connectors forget`. - Wires the previously-built-but-unreachable guardian/mcp.ts::vetMcpServer. Thinking-cycle (#4): - Alt+Shift+T toggles a plan-first Thinking mode in the TUI (footer indicator + a reasoning primer prepended to the turn — a real behaviour change, not cosmetic). Voice STT (#1): - On-device Whisper speech-to-text via the @huggingface/transformers peer (mirrors the NLLB pattern), ffmpeg-decoded audio, translate→English path. `oriro voice [file]` transcribes an audio file or the mic; `/voice` speaks a turn in chat. Registers into the existing avatar voice seam (registerVoiceListen), completing the two-way loop structurally. Experimental + peer-gated: every path degrades gracefully (clear message, never breaks the CLI). README reconciled to the shipped reality (MCP setup, thinking-cycle, voice STT now documented as shipped; the fully-hands-free voice loop framed as the remaining polish). tsup stays single-file (splitting:false). typecheck clean, smoke 28/28 (incl. a Guardian-blocks-malicious-MCP assertion), unit green, bundle clean, single shebang. Verified live: MCP block/ask/trust/remember 5/5, voice graceful paths. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
…s, routers, Gauss/Avila V2.4 Fills the gaps between the intended onboarding spec and what shipped. All steps are skip-friendly and persist a settled marker; keyless-first, nothing forced, no breakage. - Localized "Welcome to ORIRO-CLI" in the chosen language (was hardcoded English) — steps.ts welcomeIn(). - Skills step: shows the bundled library (count + CORE/TAIL), Enter to keep; + /skill in chat. - Connectors step: add a slug or skip; + /connector in chat. - Router step now lists the free keyless pool that races by default (Pollinations hosted·active, Ollama on-device) before offering BYOK — validated live (pollinations responds). - ORIRO Gauss + Avila (V2.4) preview step: "completing training / coming soon" — will join the router race, run on-device, and learn nightly (opt-in). Honest placeholder while training finishes. - Scriber consent moved to after the models step, per the intended ordering. Order: banner → language → Guardian+Head → avatar → Welcome → Skills → Connectors → Routers/BYOK → Gauss+Avila V2.4 → Scriber → ready. typecheck/build/smoke green; verified end-to-end by a live first-run capture in a real pseudo-terminal. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
…er step HF Inference Router (https://router.huggingface.co/v1) is OpenAI-compatible; the user pastes their OWN free HF token (never ORIRO's) — it's live-validated and joins the pool. Placed in the first-8 offered set so it shows during router onboarding. Keyless floor (Pollinations + Ollama) stays the zero-config default; this is purely an added BYOK lane. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
…eering skill The skills/ folder ships to npm and is public on GitHub. Removed two lines that leaked ORIRO-internal detail: - eval pass thresholds "≥ 0.88 (Gauss) / ≥ 0.86 (Avila)" -> generic "≥ 0.85 (set per model and size)" - Modelfile SYSTEM "You are Gauss, ORIRO's technical AI model." -> generic assistant prompt Avila is pre-launch and the thresholds are internal QA numbers; neither should be public. Full audit of all 326 skills found no personal data (name/address/email/paths/credentials) and no other business leaks; TranzGuard/TRIRO/personal skills are not bundled at all. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Two bugs from a real keyless chat session:
1) Router ad leaked into output. Pollinations appends a "🌸 Ad 🌸 / Powered by
Pollinations.AI / Support our mission (kofi link)" footer to free responses — it
reached the user, breaking the invisible-router promise. Added stripProviderNoise()
(identity/filter.ts) + scrubOutput() = identity + ad strip, wired into the Mux final
message, both REPLs' final render, and the channels host. Neutral transparency is
unaffected; third-party ads/donation links are removed.
2) Phantom file creation. Weak keyless routers narrate tool use ("Website files have
been created ✅") without emitting a real write_file call, so nothing lands on disk.
New verify-actions.ts::phantomFileWarning() truth-checks creation claims against the
filesystem and appends an honest warning (pointing at BYOK) only when a claimed file
is genuinely absent — no false positives on real writes or mere suggestions.
typecheck/build/unit/smoke green. Ad strip + phantom guard verified against the exact
leaked chat text.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Skills count moved to 327; smoke hardcoded "326 loaded" and failed CI. Assert only that skills load (bundle path resolves) — the exact count is enforced by the prepublish gate. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Users can now add their OWN skills — no rebuild, no republish: - New ~/.oriro/skills user dir (ORIRO_USER_SKILLS_DIR) loaded ALONGSIDE the bundled library, for both the `oriro skills` view and the live agent session (assemble additionalSkillPaths). - `oriro skills add <folder-with-SKILL.md | SKILL.md>` copies a skill in; `oriro skills remove <name>` drops it; `skills list` shows the live (dynamic) total + where to add your own. Counts are dynamic end to end: - smoke asserts skills "loaded" (not a fixed number). - prepublish gate now compares on-disk skills to the COMMITTED git count (auto-adjusts as the curated library changes; still blocks untracked cruft / missing skills) — no magic number. Connectors (add/setup/custom/forget) and routers (add/--key BYOK/--url custom) were already dynamic. typecheck/build/smoke green; add/list/remove verified end to end. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
The bundled undici 8.5 (via @earendil-works/pi-coding-agent) calls markAsUncloneable, added in Node 20.18.1 / 22.12 — CI's generic '20'/'22' resolved older patches and crashed. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Bundles all of: LICENSE + community files, ORIRO Head (url->code/spec/screenshots), voice STT, MCP setup + Guardian vetting, thinking-cycle, full first-run onboarding (welcome/skills/connectors/routers/Gauss+Avila V2.4), HF BYOK router, user-extensible skills, chat fixes (router-ad strip + phantom-file guard), and the skill privacy scrub. Node engine raised to >=22: the bundled undici 8.5 needs markAsUncloneable (Node 22+). CI green on Node 22.12 and 24. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Prepares
oriro-ai/clifor public release. Additive and non-breaking — no changes tosrc/,dist/,package.json, or the shipped skill set.What's added
LICENSE, soscripts/prepublish-check.mjsnow whitelists it.typecheck → build → unit → smokegate, and the ATTRIBUTION provenance rule.What's fixed (docs only)
0.1.0→0.1.8).Verification
npm run build✅ ·npm run smoke✅ 21/21 ·npm run test:unit✅Not in this PR (flagged separately for your call)
PUBLISHING.mdreferences aprivate: truepublish gate that isn't inpackage.json.v2026.6.8-test.1(old pre-Pi pre-release).🤖 Generated with Claude Code
Need help on this PR? Tag
/codesmithwith what you need. Autofix is disabled.