Skip to content

feat(cli): OpenSkills fallback when no Tier-1 client detected#116

Merged
naorsabag merged 1 commit into
masterfrom
feat/init-openskills-fallback
May 10, 2026
Merged

feat(cli): OpenSkills fallback when no Tier-1 client detected#116
naorsabag merged 1 commit into
masterfrom
feat/init-openskills-fallback

Conversation

@naorsabag
Copy link
Copy Markdown
Owner

@naorsabag naorsabag commented May 10, 2026

Summary

  • openhop init now prints a stderr line pointing the user at npx openskills install naorsabag/openhop when no Tier-1 client received the skill.
  • Closes the audit's S7 part-2 / checklist item 30 from READINESS-AUDIT.md.
  • Suppressed under --json so machine consumers keep clean stdout; exit-code policy unchanged.

Why

init covers Claude Code / Cursor / Windsurf / Cline / Continue. Everything else (Codex CLI, Gemini CLI, Junie, Copilot, OpenCode, Goose, Antigravity, …) routes through OpenSkills per the launch plan — but a user running init on a machine without any Tier-1 client got no signal that OpenSkills was the next step. Same trigger fires when only an advisory client like Continue.dev was detected (no real skill placement).

Test plan

  • npm test in packages/cli — 83/83 pass (init suite is 20/20).
  • Smoke: HOME=$(mktemp -d) node packages/cli/dist/index.js init → fallback line on stderr, exit 4 (EXIT_NOT_FOUND).
  • Smoke: HOME=$(mktemp -d) node packages/cli/dist/index.js init --json → clean JSON on stdout, no stderr line.
  • CI on this PR is green.

🤖 Generated with Claude Code

Summary by CodeRabbit

  • Bug Fixes
    • Improved error messaging in the openhop init command to provide clearer feedback when a skill is not installed to any client, including a suggested command for installation.

Review Change Stack

…kill

`openhop init` covers Claude Code / Cursor / Windsurf / Cline / Continue.
For everything else (Codex, Gemini, Junie, Copilot, OpenCode, Goose,
Antigravity, ...) the launch plan delegates to OpenSkills, but a user
running `init` against a setup that has none of the Tier-1 clients was
left with no signal that OpenSkills exists.

Print a stderr fallback when no Tier-1 client placed (or would-place)
the skill — this also catches advisory-only detections like Continue.dev
that don't actually have a skills surface. Suppressed under --json so
machine consumers keep clean stdout; exit-code policy is unchanged.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
@coderabbitai
Copy link
Copy Markdown

coderabbitai Bot commented May 10, 2026

No actionable comments were generated in the recent review. 🎉

ℹ️ Recent review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Pro Plus

Run ID: a25bb4d0-10fe-4464-a99e-9b4a21bd7f5c

📥 Commits

Reviewing files that changed from the base of the PR and between c502a9e and 0225a39.

📒 Files selected for processing (1)
  • packages/cli/src/init.ts

Walkthrough

The init command now emits a stderr message when openhop init does not install the skill into any Tier-1 client, guiding users to run npx openskills install naorsabag/openhop as a fallback. The message is suppressed for JSON-mode runs and does not affect exit-code behavior.

Changes

CLI User Messaging for Uninstalled Skills

Layer / File(s) Summary
User-Facing Messaging
packages/cli/src/init.ts
A conditional stderr message advises users to manually install the skill when installed.length === 0 and wouldInstall.length === 0, suppressed in --json mode.

Estimated code review effort

🎯 1 (Trivial) | ⏱️ ~3 minutes

🚥 Pre-merge checks | ✅ 4 | ❌ 1

❌ Failed checks (1 warning)

Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 0.00% which is insufficient. The required threshold is 80.00%. Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (4 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed The title clearly and specifically summarizes the main change: adding an OpenSkills fallback message when no Tier-1 client is detected during openhop init.
Linked Issues check ✅ Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check ✅ Passed Check skipped because no linked issues were found for this pull request.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.

✨ Finishing Touches
📝 Generate docstrings
  • Create stacked PR
  • Commit on current branch
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch feat/init-openskills-fallback

Comment @coderabbitai help to get the list of available commands and usage tips.

@naorsabag naorsabag merged commit f12e7d9 into master May 10, 2026
8 checks passed
naorsabag added a commit that referenced this pull request May 10, 2026
…ill (#118)

The fallback hint introduced in #116 fired whenever no install happened
in this run, including the re-run case where a Tier-1 client was
detected and already had the skill. That produced a self-contradicting
output: "claude-code  skipped  already installed" followed by "No Tier-1
client received the skill."

Extract the gate into a pure `shouldPrintOpenSkillsFallback(results)`
predicate that returns true only when no Tier-1 client has the skill —
i.e., every non-advisory result is `skipped: not detected`. Treat
`skipped: already installed`, fresh installs, and would-install
(`--dry-run`) as "Tier-1 received the skill" so the hint stays quiet on
re-runs.

Test the predicate directly against InstallResult vectors. Cover: no
detection, advisory-only, already-installed re-run, fresh install,
dry-run.

Closes the CodeRabbit feedback on #116.

Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
naorsabag added a commit that referenced this pull request May 10, 2026
…test

- @openhop/server: 0.1.0-beta.2 → 0.1.0
- @openhop/web:    0.1.0-beta.4 → 0.1.0
- openhop CLI:     0.1.0-beta.6 → 0.1.0
  + bump pinned @openhop/server, @openhop/web deps + hardcoded --version

publish.yml: drop `--tag beta` from all three publish steps. With no
--tag, `npm publish` sets the `latest` dist-tag — so npmjs.com pages
and `npm install <pkg>` (no @beta suffix) automatically reflect the
new version on every successful publish. No more manual
`npm dist-tag add latest` step.

Bundles 13 PRs since v0.1.0-beta.6:

Web (heavy):
- #106 sprite URLs use Vite BASE_URL (Pages 404 fix)
- #107 example flow cards on empty state
- #108 sidebar + carrot-click highlight for string-data steps
- #109 all 5 examples grouped under examples/ + first-visit autoload
- #112 per-step auto-zoom + playback speed button
- #113 collapse FLOWS / INSPECT by default on mobile
- #114 lazy editor + vendor-split chunks + meta description
- #115 filter codemirror from <modulepreload>
- #117 memo FlowNode + GPU-layer sprites for smoother pan/zoom

CLI:
- #116 OpenSkills fallback hint when no Tier-1 client gets the skill
- #118 suppress the hint when Tier-1 already has the skill

Server: untouched code; bumped to keep the 0.1.0 set consistent.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
naorsabag added a commit that referenced this pull request May 11, 2026
…test (#119)

- @openhop/server: 0.1.0-beta.2 → 0.1.0
- @openhop/web:    0.1.0-beta.4 → 0.1.0
- openhop CLI:     0.1.0-beta.6 → 0.1.0
  + bump pinned @openhop/server, @openhop/web deps + hardcoded --version

publish.yml: drop `--tag beta` from all three publish steps. With no
--tag, `npm publish` sets the `latest` dist-tag — so npmjs.com pages
and `npm install <pkg>` (no @beta suffix) automatically reflect the
new version on every successful publish. No more manual
`npm dist-tag add latest` step.

Bundles 13 PRs since v0.1.0-beta.6:

Web (heavy):
- #106 sprite URLs use Vite BASE_URL (Pages 404 fix)
- #107 example flow cards on empty state
- #108 sidebar + carrot-click highlight for string-data steps
- #109 all 5 examples grouped under examples/ + first-visit autoload
- #112 per-step auto-zoom + playback speed button
- #113 collapse FLOWS / INSPECT by default on mobile
- #114 lazy editor + vendor-split chunks + meta description
- #115 filter codemirror from <modulepreload>
- #117 memo FlowNode + GPU-layer sprites for smoother pan/zoom

CLI:
- #116 OpenSkills fallback hint when no Tier-1 client gets the skill
- #118 suppress the hint when Tier-1 already has the skill

Server: untouched code; bumped to keep the 0.1.0 set consistent.

Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
@naorsabag naorsabag deleted the feat/init-openskills-fallback branch May 15, 2026 16:00
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant