Skip to content

Commit de03bef

Browse files
feat: align OpenCode plugin with Cursor model (vendored skills, thin config-hook, CI hardening) (#16)
* feat(skills): vendor jfrog-skills@v0.11.0 + add sync-skills script Add build-time vendoring of the official skills from jfrog/jfrog-skills (pinned v0.11.0) into a flat, committed skills/ tree so they ship with the package. Introduces sync-skills-vendor.json (pin config) and scripts/sync-skills.mjs (downloads + extracts + copies skills/ to repo root). Co-authored-by: Cursor <cursoragent@cursor.com> * build(skills): ship vendored skills/ in the npm package (files + sync-skills script) Add skills/ and sync-skills-vendor.json to the package files allowlist so the vendored skills tree ships at the package root next to dist/, enabling runtime resolution via ../skills after install. Also add a sync-skills npm script and the skills keyword. Co-authored-by: Cursor <cursoragent@cursor.com> * build: drop stale src/version.ts from files src/version.ts does not exist and nothing generates or imports it: the build task only runs bun build, the version/publish tasks only bump package.json, and release-please-config.json defines no extra-files. Remove the phantom entry from the package files allowlist. Co-authored-by: Cursor <cursoragent@cursor.com> * feat(skills): thin plugin - register vendored skills via config.skills.paths; drop runtime pull + setupPackageManagers Replace the imperative plugin (runtime download/unzip/prune + session.created package-manager setup) with a thin plugin whose only job is to register the bundled skills/ via the config hook (object form config.skills.paths), fail loud if the bundled dir is missing/empty, emit a one-line jf-setup nudge, and run a conservative one-time migration that removes only legacy version-nested managed skills (never flat/user skills). Removes pullSkills, fetchAndSaveFile, extractZip, pruneNonManifestSkillVersions, setupPackageManagers, the registry URL constants, the event hook, and the instructions-file injection. Tests trimmed to the thin behavior; comprehensive matrix lands in Phase 4. Co-authored-by: Cursor <cursoragent@cursor.com> * build: use mise task for sync-skills (drop package.json scripts) The repo forbids a scripts property in package.json (.mise/tasks/pkgjsonlint). Move the sync-skills entrypoint to a .mise task instead, matching repo conventions. Co-authored-by: Cursor <cursoragent@cursor.com> * chore: remove internal registry (ctoa/carmit) refs; resolve from public npm This is a public repo and must not embed internal JFrog infrastructure. - bun.lock: repoint all 281 tarball URLs from the private ctoa/carmit virtual registry to https://registry.npmjs.org (integrity hashes unchanged; the virtual repo mirrors npmjs byte-for-byte, so the lock stays reproducible). - pr.yml / publish-as-is.yml: drop the "Setup JFrog CLI" + "setup jfrog npm repo" steps, JF_URL/JF_PROJECT env, and the ctoa bunfig; resolve deps from public npm. Publish continues to target public npmjs. Note: dependency resolution now uses public npm (no JFrog curation/security gating), and npmjs publish requires an npm auth method configured by the maintainer. Co-authored-by: Cursor <cursoragent@cursor.com> * fix(skills): fire-and-forget tui toasts in config hook await client.tui.showToast never resolves in headless sessions (no TUI to ack), which hung the config hook on every opencode run/debug skill/CI load. Surface toasts fire-and-forget via a helper; durable signals still go through log(). Headless debug skill now returns and registers skills as expected. Co-authored-by: Cursor <cursoragent@cursor.com> * test(skills): add migration-safety (V5) and vendored-content (V9) tests V5: drive migrateLegacyManagedSkills via a temp HOME and assert it removes only version-nested managed skills while keeping flat (possibly user-owned), unrelated, and unknown-shape dirs; plus a no-throw case when the skills root is absent. V9: assert the vendored skills/ tree is exactly {jfrog, jfrog-package-safety-and-download}, flat, each SKILL.md having frontmatter name/description with name == dir. Tests only; no behavior change. Co-authored-by: Cursor <cursoragent@cursor.com> * docs: rewrite README for thin/vendored skills model; add VENDOR.md; document breaking changes Rewrite README to describe the thin plugin that ships two vendored, pinned skills (jfrog, jfrog-package-safety-and-download) and registers them via config.skills.paths at load. Remove stale runtime-download/package-managers.json/instructions-injection content. Add VENDOR.md documenting sync-skills-vendor.json and the pin-bump workflow (mise run sync-skills) that requires a plugin release. Fix AGENTS.md test framework (bun:test, not vitest). Surface open questions (min OpenCode version, publish auth). BREAKING CHANGE: skill catalog reduced from 7 Artifactory skills (skill-install, skill-publish, jfrog-cli, opencode-jfrog-mcp, jfrog-setup-package-managers, jfrog-curation, jfrog-packages) to 2 canonical skills (jfrog, jfrog-package-safety-and-download); the removed skill names no longer exist and fold into the jfrog skill. Package-manager auto-setup on session start is removed (interim jf setup nudge; durable recovery upstream). Old version-nested skills under ~/.config/opencode/skills are auto-cleaned by a one-time migration. The instructions file and package-managers.json are no longer written, and there is no runtime skills download. Dependencies/CI now resolve from public npm. Co-authored-by: Cursor <cursoragent@cursor.com> * docs: use @<version> placeholder in README install example Co-authored-by: Cursor <cursoragent@cursor.com> * fix(deps): move @opencode-ai/plugin to devDependencies It's a type-only import (erased at build); dist/index.js needs only fs/path/url. Declaring it as a runtime dependency made OpenCode's post-install bun install try to fetch it, which 403s on the Artifactory- pinned npm registries common to this plugin's customer base (NpmInstallFailedError). The published package now has no runtime dependencies. Co-authored-by: Cursor <cursoragent@cursor.com> * feat(skills): bump vendored jfrog-skills pin v0.11.0 -> v0.14.0 Co-authored-by: Cursor <cursoragent@cursor.com> * feat(mcp): inject JFrog Platform remote MCP server via the config hook In the same config hook that registers the vendored skills, also register the JFrog Platform remote MCP server into config.mcp. Resolve the platform URL from JFROG_URL (fallback JFROG_PLATFORM_URL), normalize to https://<host>/mcp, and set cfg.mcp.jfrog only when absent (non-destructive). Skip with a log line when no URL is set. OpenCode handles OAuth lazily, so no auth config and no network on load. Co-authored-by: Cursor <cursoragent@cursor.com> * feat(mcp): token-based Agent Guard (Claude model); drop OAuth direct MCP Pivot the MCP step from Cursor's OAuth direct-MCP model to the Claude Code plugin's token-based, headless Agent Guard model. - Revert the OAuth direct config.mcp.jfrog injection (commit 23cac6c). Platform ops stay on the jfrog skill (token-based CLI). The plugin no longer writes any config.mcp entry. - Gate on the account setting mcp_gateway_plugin_enabled via a Bearer-token GET (JFROG_URL/JF_URL + JFROG_ACCESS_TOKEN/JF_ACCESS_TOKEN), bounded by a 5s AbortController and FAIL-CLOSED so load never hangs. Honor _JF_AGENT_GUARD_FORCE_DISABLE / JF_AGENT_GUARD_FORCE_ENABLE. - When enabled, inject the bundled templates/jfrog-mcp-management.md into config.instructions (absolute path, deduped). The agent then installs catalog MCPs via npx @jfrog/agent-guard as OpenCode local MCP entries. - Add the OpenCode-adapted template (opencode.json mcp, type "local" command array, environment {env:VAR}, opencode mcp auth/list, JFROG_AGENT_GUARD_REPO). - Ship templates/ via package.json files; add AbortController/setTimeout/ clearTimeout to eslint globals. Co-authored-by: Cursor <cursoragent@cursor.com> * revert(mcp): drop MCP / Agent Guard injection; return to skills-only plugin Reverts the token-based Agent Guard template injection (632025f) and the direct MCP injection (23cac6c). The plugin again only registers the vendored skills via the config hook. MCP support is deferred to a later phase. Co-authored-by: Cursor <cursoragent@cursor.com> * ci: add vendored-skills drift guard, typecheck/pkgjsonlint, and tarball-contents check Add two mise.toml tasks: 'sync-skills:check' re-runs the vendoring and fails on any skills/ drift from the pin; 'pack:check' asserts the npm tarball includes dist/index.js + both vendored SKILL.md files and excludes *-TEST-PLAN.md / *-TEST-RESULTS.md / .opencode scratch files. Wire the full gate sequence into pr.yml: setup -> sync-skills:check -> lint -> typecheck -> test -> build -> pkgjsonlint -> pack:check. Co-authored-by: Cursor <cursoragent@cursor.com> * docs: document npm + ecosystem distribution; mark plugin self-contained Resolve the "assumes published / open questions" hedges: the package is published to public npm and listed on the OpenCode ecosystem page. Give a concrete install snippet, note org-wide rollout via remote config, and state the plugin is self-contained (skills shipped in the tarball; no runtime downloads, no releases.jfrog.io dependency). Point VENDOR.md at the sync-skills:check drift guard. Co-authored-by: Cursor <cursoragent@cursor.com> * chore: repo hygiene — drop scratch docs, ignore .opencode, remove templates leftover Move the planning/test scratch docs (E2E-TEST-PLAN.md, SKILLS-AGENTIC-TEST-PLAN.md, SKILLS-AGENTIC-TEST-RESULTS.md) out of the public plugin repo into the external planning workspace, and gitignore the runtime .opencode/ debug-log directory. The templates/ leftover from the reverted MCP work is already gone. Co-authored-by: Cursor <cursoragent@cursor.com> * docs: tidy repo root — move RELEASE/VENDOR to docs/, CONTRIBUTING to .github/ Declutters the project root to the conventional essentials (README, LICENSE, NOTICE, CHANGELOG, AGENTS). Updates all internal links accordingly. No code or package contents change (docs/ and .github/ are not in the npm `files` set). Co-authored-by: Cursor <cursoragent@cursor.com> * chore: remove AGENTS.md (bun-template boilerplate, not in peer plugins) The cursor and claude JFrog plugins don't carry an AGENTS.md, and ours was generic template content (referenced a nonexistent test, .memory/, etc.). Code-style guidance is already covered by ESLint/Prettier + CONTRIBUTING.md. Co-authored-by: Cursor <cursoragent@cursor.com> * chore: align repo layout with cursor/claude plugins Flatten CONTRIBUTING.md and VENDOR.md back to the root (matching the cursor and claude JFrog plugins), drop the docs/ folder, and remove NOTICE (neither peer ships one and the MIT devDeps are not redistributed). CHANGELOG.md and RELEASE.md stay, as they are required by this repo's npm/release-please flow. Co-authored-by: Cursor <cursoragent@cursor.com> * feat!: remove legacy-skill migration from the plugin Drops the one-time cleanup of old version-nested managed skills (and its helpers/tests). The pre-0.0.3 skills are obsolete and no longer auto-removed; the plugin now only registers the bundled skills. Upgrade note updated to point users to remove any stale ~/.config/opencode/skills dirs manually. Co-authored-by: Cursor <cursoragent@cursor.com> * fix(review): dedupe jf-setup nudge; deterministic tarball top-dir Addresses PR review: - config hook can run multiple times per session -> show the `jf setup` nudge once via a closure flag (adds a regression test). - sync-skills: select the extracted tarball's top-level dir deterministically (filter to directories + sort) instead of relying on readdir order. Co-authored-by: Cursor <cursoragent@cursor.com> --------- Co-authored-by: Cursor <cursoragent@cursor.com>
1 parent 2146d7f commit de03bef

46 files changed

Lines changed: 7576 additions & 998 deletions

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

.github/workflows/pr.yml

Lines changed: 4 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,6 @@ concurrency:
1111
permissions:
1212
actions: read
1313
contents: read
14-
id-token: write # for creating OIDC tokens for signing.
1514

1615
jobs:
1716
Check:
@@ -21,28 +20,6 @@ jobs:
2120
uses: actions/checkout@v4
2221
with:
2322
ref: ${{ github.event.pull_request.head.sha || github.ref }}
24-
25-
- name: Setup JFrog CLI
26-
id: setup-cli
27-
uses: jfrog/setup-jfrog-cli@v4.9.1
28-
env:
29-
JF_URL: https://${{ vars.JF_URL }}/
30-
JF_PROJECT: carmit
31-
with:
32-
oidc-provider-name: github-oidc
33-
34-
- name: setup jfrog npm repo
35-
run: |
36-
echo "Setting up jfrog npm repo"
37-
# create bunfig.toml file with the following content:
38-
echo "[install]" > bunfig.toml
39-
echo "registry = { token = \"${{ steps.setup-cli.outputs.oidc-token }}\", url = \"https://ctoa.jfrog.io/artifactory/api/npm/carmit-carmit-npm-virtual/\" }" >> bunfig.toml
40-
# add always-auth
41-
echo "always-auth = true" >> bunfig.toml
42-
cat bunfig.toml
43-
44-
# configure jfrog npm repo
45-
jf npm-config --repo-resolve=carmit-carmit-npm-virtual --global
4623

4724
- name: Setup Tooling
4825
uses: jdx/mise-action@d6e32c1796099e0f1f3ac741c220a8b7eae9e5dd
@@ -54,6 +31,10 @@ jobs:
5431
- name: Run Checks
5532
run: |
5633
mise run setup
34+
mise run sync-skills:check
5735
mise run lint
36+
mise run typecheck
5837
mise run test
5938
mise run build
39+
mise run pkgjsonlint
40+
mise run pack:check

.github/workflows/publish-as-is.yml

Lines changed: 0 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -17,28 +17,6 @@ jobs:
1717
with:
1818
fetch-depth: 0
1919
fetch-tags: true
20-
- name: Setup JFrog CLI
21-
id: setup-cli
22-
uses: jfrog/setup-jfrog-cli@v4.9.1
23-
env:
24-
JF_URL: https://${{ vars.JF_URL }}/
25-
JF_PROJECT: carmit
26-
with:
27-
oidc-provider-name: github-oidc
28-
29-
- name: setup jfrog npm repo
30-
run: |
31-
echo "Setting up jfrog npm repo"
32-
# create bunfig.toml file with the following content:
33-
echo "[install]" > bunfig.toml
34-
echo "registry = { token = \"${{ steps.setup-cli.outputs.oidc-token }}\", url = \"https://ctoa.jfrog.io/artifactory/api/npm/carmit-carmit-npm-virtual/\" }" >> bunfig.toml
35-
# add always-auth
36-
echo "always-auth = true" >> bunfig.toml
37-
cat bunfig.toml
38-
39-
# configure jfrog npm repo
40-
jf npm-config --repo-resolve=carmit-carmit-npm-virtual --global
41-
4220

4321
- uses: jdx/mise-action@d6e32c1796099e0f1f3ac741c220a8b7eae9e5dd
4422
with:

.gitignore

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,4 +10,5 @@ coverage/
1010
.bun/
1111
.bun.lockb
1212
.memory/
13-
.npmrc
13+
.npmrc
14+
.opencode/

.mise/tasks/sync-skills

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
#!/usr/bin/env bash
2+
#MISE description="Vendor JFrog skills from jfrog/jfrog-skills (see sync-skills-vendor.json)"
3+
node scripts/sync-skills.mjs

AGENTS.md

Lines changed: 0 additions & 65 deletions
This file was deleted.

CONTRIBUTING.md

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -37,5 +37,4 @@ Thank you for your interest in contributing!
3737
## Code Style
3838

3939
This project uses ESLint and Prettier. Run `mise run lint:fix` to auto-fix issues.
40-
41-
See [AGENTS.md](./AGENTS.md) for detailed code style guidelines.
40+
See the [Development](./README.md#development) section in the README for the available tasks.

NOTICE

Lines changed: 0 additions & 45 deletions
This file was deleted.

README.md

Lines changed: 105 additions & 51 deletions
Original file line numberDiff line numberDiff line change
@@ -1,82 +1,136 @@
11
# opencode-jfrog-plugin
22

3-
JFrog Plugin for seamless integration to Opencode
4-
This plugin is intended for use by JFrog Customers also using Opencode.
3+
JFrog integration for [OpenCode](https://opencode.ai/). The plugin ships the official JFrog
4+
[Agent Skills](https://opencode.ai/docs/skills/) with the package and registers them with OpenCode at
5+
load time, so JFrog capabilities are available to the agent out of the box.
56

6-
## Prerequisites
7-
### General:
8-
- [JFrog Platform](https://jfrog.com) installed
9-
- [Opencode](https://opencode.ai/) installed
7+
## What's included
8+
9+
The plugin bundles two canonical skills, vendored (pinned) from
10+
[`jfrog/jfrog-skills`](https://github.com/jfrog/jfrog-skills) and committed under `skills/`:
1011

11-
### MCP Registry:
12-
- Access to the corporate JFrog Platform with the AI Catalog enabled.
13-
- A project with at least one allowed MCP server.
12+
- **`jfrog`** — interact with the JFrog Platform via the JFrog CLI, MCP server, and REST/GraphQL APIs
13+
(Artifactory, Xray, builds, permissions, projects, release lifecycle, advanced security, and more).
14+
- **`jfrog-package-safety-and-download`** — check package safety/curation status and download packages
15+
through JFrog.
1416

15-
### Curation:
16-
- JFrog Enterprise+ or a Unified Security Bundle
17-
- Xray deployment
18-
- Curation configuration on the used remote repositories
17+
The skills ship **with the plugin** (vendored and pinned). They are **not** downloaded at runtime, so
18+
the plugin works offline and the skill set is reproducible for a given plugin version.
1919

20+
The plugin is **self-contained**: everything it needs is in the published npm tarball (`dist/` + the
21+
vendored `skills/`). There are no runtime downloads and no dependency on `releases.jfrog.io` or any other
22+
external artifact host.
23+
24+
## Prerequisites
2025

21-
> This is a Bun module created from the [bun-module](https://github.com/zenobi-us/bun-module) template
26+
- A [JFrog Platform](https://jfrog.com) instance you can authenticate against.
27+
- [OpenCode](https://opencode.ai/) installed (verified against OpenCode **1.17.7** and newer, which
28+
honors `config.skills.paths` in object form).
29+
- For running the skills at runtime, the following must be on your `PATH`:
30+
- [`jf`](https://jfrog.com/getting-started-with-jfrog-cli/) (JFrog CLI), `jq`, and `curl`.
31+
- A configured JFrog CLI server (e.g. via `jf login` / `jf config add`).
2232

2333
## Installation
24-
Add the opencode-jfrog-plugin into your opencode config.
25-
Preferably set the plugin globally for all their developers using the Opencode remote configuration, visit [opencode remote configuration](https://opencode.ai/docs/config/#remote) for more details.
2634

27-
The plugin configuration looks like this:
28-
```
29-
"plugin": [
30-
"@jfrog/opencode-jfrog-plugin@0.0.3"
31-
],
35+
The plugin is published to public npm as
36+
[`@jfrog/opencode-jfrog-plugin`](https://www.npmjs.com/package/@jfrog/opencode-jfrog-plugin) and is
37+
listed on the [OpenCode ecosystem page](https://opencode.ai/docs/ecosystem). OpenCode has no plugin
38+
marketplace — you install by referencing the npm package in your OpenCode config.
39+
40+
Add the plugin to your OpenCode config (`opencode.json`):
41+
42+
```json
43+
{
44+
"plugin": ["@jfrog/opencode-jfrog-plugin"]
45+
}
3246
```
3347

34-
## How this works
35-
Once opencode starts it runs the plugin. The plugin then:
36-
1. Pulls a few base skills that allow the integration from the developer opencode instance into JFrog (can be found under `~/.config/opencode/skills`)
37-
2. Pulls integration instructions adding LLM hints on how to integrate with JFrog (can be found under `<project-root>/.jfrog/instructions`)
38-
3. Appends integration instructions into the runtime opencode config
48+
OpenCode resolves the package from npm and loads it. To pin a specific version, use
49+
`"@jfrog/opencode-jfrog-plugin@<version>"`; omitting the version tracks the latest release.
50+
51+
For an organization-wide rollout, set the plugin in OpenCode's
52+
[remote configuration](https://opencode.ai/docs/config/#remote) so every developer gets it
53+
automatically.
3954

40-
Once the skills and instructions are set, every relevant task (package management, skills and MCP handling) is integrated into JFrog.
41-
Once the user tries to resolve dependencies, handle packages, install MCP servers, and pull a skill, the system will verify integration prerequisites (JFrog CLI is installed and configured and `<project-root>/.jfrog/local/package-managers.json` is available) and will perform the task using JFrog capabilities.
55+
## How it works
4256

43-
While the skills run, they make sure that JFrog CLI is installed and configured, and that package managers are configured against the JFrog platform.
57+
The plugin is intentionally **thin**. On load it:
4458

45-
## Usage
46-
Developers who get the plugin through their corporate opencode configuration, or add it manually into their device configuration will automatically get the JFrog integration up and are expected to be asked for completion of package management setup when needed.
59+
1. Resolves its bundled `skills/` directory (shipped inside the package).
60+
2. Registers that directory with OpenCode through the `config` hook by adding it to
61+
`config.skills.paths`.
4762

48-
This can be handled manually or when a task requires it.
49-
### Manually
50-
Within opencode, type `/skills` and select the `jfrog-setup-package-managers` skill to complete package management and project setup.
51-
### Automatically
52-
Within opencode, when tasks require a JFrog skill, the triggered skill will guide the user through the needed setup.
63+
OpenCode then discovers the skills the same way it discovers any skill — they appear via the `skill`
64+
tool and `/skills`, and the agent invokes them when relevant. There is no runtime download, unzip, or
65+
network call on load.
5366

54-
### Integration setup artifacts
55-
LLM instructions are automatically created at `<project-root>/.jfrog/instructions`
56-
Package management mappings are created at `<project-root>/.jfrog/local/package-managers.json`
57-
Skills are created under `~/.config/opencode/skills`
67+
## Updating the bundled skills
68+
69+
The skills are vendored at a pinned version. Updating them is a build-time step and **requires a new
70+
plugin release** (there are no runtime skill updates). See [VENDOR.md](./VENDOR.md) for the pin-bump
71+
workflow (`mise run sync-skills`).
5872

5973
## Troubleshooting
60-
The JFrog plugin pulls a minimal set of JFrog integration skills and LLM instructions that allow for the integration. It also adds the instructions file into the opencode project configuration file.
61-
The plugin does not log by default, but allows debug logs for troubleshooting the JFrog setup process.
62-
To enable opencode-jfrog-plugin debug logging, run `export JFROG_DEBUG_LOGS=true` before running opencode.
74+
75+
The plugin does not log by default. To enable debug logging:
76+
77+
```bash
78+
export JFROG_DEBUG_LOGS=true
79+
```
80+
81+
Logs are written to `<project-root>/.opencode/event-log.txt`.
82+
83+
If you see a **"bundled skills not found"** error (a toast in the TUI and/or an `ERROR` line in the log),
84+
the installed package is incomplete or corrupted — reinstall `@jfrog/opencode-jfrog-plugin`.
85+
86+
## Upgrading from < 0.0.3
87+
88+
This release changes behavior in ways that are **not** backward compatible:
89+
90+
- **Skill catalog changed (7 → 2).** The previous Artifactory skills — `skill-install`,
91+
`skill-publish`, `jfrog-cli`, `opencode-jfrog-mcp`, `jfrog-setup-package-managers`, `jfrog-curation`,
92+
`jfrog-packages` — are replaced by the two canonical skills above. Invocations of the removed skill
93+
names no longer exist; that functionality now folds into the `jfrog` skill.
94+
- **Package-manager auto-setup was removed.** Earlier versions ran `jf setup <pm>` automatically on
95+
session start. That is gone; the plugin now emits an interim one-line nudge to run
96+
`jf setup <pm>` yourself. Durable package-manager setup is being recovered upstream in
97+
`jfrog/jfrog-skills`.
98+
- **Old skills are not auto-cleaned.** The plugin no longer touches `~/.config/opencode/skills`. If you
99+
used a version < 0.0.3, remove the old managed skill directories yourself (e.g. `skill-install`,
100+
`skill-publish`, `jfrog-cli`, `opencode-jfrog-mcp`, `jfrog-setup-package-managers`, `jfrog-curation`,
101+
`jfrog-packages`) under `~/.config/opencode/skills`.
102+
- **No more runtime artifacts.** The plugin no longer injects an instructions file
103+
(`.jfrog/instructions/...`) or writes `.jfrog/local/package-managers.json`, and it no longer
104+
downloads skills at runtime.
105+
- **Dependencies resolve from public npm.** Internal registry references were removed; the build and CI
106+
now resolve from public npm.
63107

64108
## Development
65109

66-
- `mise run build` - Build the module
67-
- `mise run test` - Run tests
68-
- `mise run lint` - Lint code
69-
- `mise run lint:fix` - Fix linting issues
70-
- `mise run format` - Format code with Prettier
110+
Tasks are run with [mise](https://mise.jdx.dev/):
111+
112+
- `mise run build` — build the module
113+
- `mise run test` — run tests (`bun test`)
114+
- `mise run typecheck` — type-check with `tsc --noEmit`
115+
- `mise run lint` — lint with ESLint
116+
- `mise run lint:fix` — auto-fix lint issues
117+
- `mise run format` — format with Prettier
118+
- `mise run sync-skills` — re-vendor the bundled skills (see [VENDOR.md](./VENDOR.md))
71119

72120
## Release
73121

74-
See the [RELEASE.md](RELEASE.md) file for instructions on how to release a new version of the module.
122+
See [RELEASE.md](./RELEASE.md) for how to release a new version.
75123

76124
## Contributing
77125

78-
Contributions are welcome! Please file issues or submit pull requests on the GitHub repository.
126+
Contributions are welcome! See [CONTRIBUTING.md](./CONTRIBUTING.md). Please file issues or open pull
127+
requests on the GitHub repository.
79128

80129
## License
81130

82-
See the [LICENSE](LICENSE) file for details.
131+
See the [LICENSE](./LICENSE) file for details.
132+
133+
## Compatibility
134+
135+
Verified against OpenCode **1.17.7** and newer (the first version confirmed to honor
136+
`config.skills.paths` in object form). Older versions are not supported.

0 commit comments

Comments
 (0)