Skip to content

Commit a820afb

Browse files
[patch] chore: sync skills to v0.34.0 (#84)
Vendored from `v0.34.0` of jfrog/jfrog-skills. Co-authored-by: jfrog-agentic-release-bot[bot] <276080306+jfrog-agentic-release-bot[bot]@users.noreply.github.com>
1 parent b97e9f4 commit a820afb

18 files changed

Lines changed: 432 additions & 200 deletions

.cursor-plugin/marketplace.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
},
77
"metadata": {
88
"description": "JFrog Platform plugins for Cursor",
9-
"version": "0.6.1",
9+
"version": "0.6.2",
1010
"pluginRoot": "plugins"
1111
},
1212
"plugins": [

.github/scripts/sync-skills-vendor.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"repo": "jfrog/jfrog-skills",
3-
"pin": "v0.32.0",
3+
"pin": "v0.34.0",
44
"paths": [
55
"skills"
66
]

plugins/jfrog/.cursor-plugin/plugin.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
{
22
"name": "jfrog",
33
"displayName": "JFrog Platform",
4-
"version": "0.6.1",
4+
"version": "0.6.2",
55
"description": "JFrog Platform integration with MCP, security skills, Agent Package Resolution, supply-chain best practices, and JFrog Agent Guard governance for adding, removing, and listing MCP servers.",
66
"author": {
77
"name": "JFrog",

plugins/jfrog/skills/jfrog-init/SKILL.md

Lines changed: 21 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ description: Set up and verify the JFrog plugin. Run on first install, to comple
44
disable-model-invocation: true
55
compatibility: >-
66
Requires Node.js 18 or newer, and network access to the JFrog platform.
7-
allowed-tools: Bash(node --version) Bash(node "${CLAUDE_SKILL_DIR}/scripts/jfrog-detect-catalog-runtime.mjs"*) Bash(node "${CLAUDE_SKILL_DIR}/scripts/jfrog-detect-jf-cli.mjs"*) Bash(node "${CLAUDE_SKILL_DIR}/scripts/jfrog-detect-jf-config.mjs"*) Bash(node "${CLAUDE_SKILL_DIR}/scripts/jfrog-detect-jfrog-mcp.mjs"*) Bash(node "${CLAUDE_SKILL_DIR}/scripts/jfrog-detect-project.mjs"*) Bash(node "${CLAUDE_SKILL_DIR}/scripts/jfrog-detect-server-ping.mjs"*) Bash(node "${CLAUDE_SKILL_DIR}/scripts/jfrog-re*.mjs"*) Bash(node "${CLAUDE_SKILL_DIR}/scripts/jfrog-state-file.mjs" get*) Bash(node "${CLAUDE_SKILL_DIR}/scripts/jfrog-state-file.mjs" path*) Bash(node -e "import('${CLAUDE_SKILL_DIR}/scripts/jfrog-resolve-mcp-config.mjs').then(function(m){console.log(m.detectHarness())})") Bash(npx --version) Bash(uname:*) AskUserQuestion
7+
allowed-tools: Bash(node --version) Bash(node "${CLAUDE_SKILL_DIR}/scripts/jfrog-detect-catalog-runtime.mjs"*) Bash(node "${CLAUDE_SKILL_DIR}/scripts/jfrog-detect-jf-cli.mjs"*) Bash(node "${CLAUDE_SKILL_DIR}/scripts/jfrog-detect-jf-config.mjs"*) Bash(node "${CLAUDE_SKILL_DIR}/scripts/jfrog-detect-jfrog-mcp.mjs"*) Bash(node "${CLAUDE_SKILL_DIR}/scripts/jfrog-detect-project.mjs"*) Bash(node "${CLAUDE_SKILL_DIR}/scripts/jfrog-detect-server-ping.mjs"*) Bash(node "${CLAUDE_SKILL_DIR}/scripts/jfrog-reinstall-jfrog-plugin.mjs"*) Bash(node "${CLAUDE_SKILL_DIR}/scripts/jfrog-state-file.mjs" get*) Bash(node "${CLAUDE_SKILL_DIR}/scripts/jfrog-state-file.mjs" path*) Bash(node -e "import('${CLAUDE_SKILL_DIR}/scripts/jfrog-resolve-mcp-config.mjs').then(function(m){console.log(m.detectHarness())})") Bash(npx --version) Bash(uname:*) AskUserQuestion
88
metadata:
99
role: workflow
1010
---
@@ -72,8 +72,9 @@ absolute path of this file's directory yourself, same as before.
7272
Node (Step 1) or `jf` (Step 2); `AskUserQuestion` picker for
7373
web-login vs. token (Step 3/4); `AskUserQuestion` picker for project
7474
selection (Step 6). Everything else is read-only except Step 5's
75-
placeholder substitution, Step 8's `~/.netrc` write, and the Final
76-
summary's state write.
75+
placeholder substitution (plus, for kiro-cli, creating or merging the
76+
`jfrog` entry into `~/.kiro/settings/mcp.json`), Step 8's `~/.netrc`
77+
write, and the Final summary's state write.
7778
- **Never surface the checklist.** Run silently — no step narration, no
7879
raw JSON/exit codes, no branch-reasoning said out loud. See
7980
[Customer-facing output](#customer-facing-output).
@@ -139,6 +140,11 @@ user needs to know or act on:
139140
follow silently, not to summarize out loud — the field names in it are
140141
never user-facing. The only output the user sees at an ask point is
141142
the prompt itself.
143+
- **Do not** narrate whether the `AskUserQuestion` tool is available in
144+
the current harness before falling back to the plain-text prompt
145+
(e.g. "the AskUserQuestion tool isn't available here, I'll present
146+
this as a plain question instead"). If it isn't available, silently
147+
use the plain-text fallback already documented for that ask point.
142148
- **Do not** announce that you're about to run the checklist, or name
143149
which check comes first — not even generically ("I'll run the setup
144150
checklist silently, starting with the JFrog CLI check" is itself a
@@ -331,7 +337,14 @@ blocks) — required behavior, not optional background.
331337

332338
## Step 5: JFrog MCP plugin file has a jfrog entry?
333339

340+
If you are Kiro or Kiro CLI, prefix the command with
341+
`JFROG_INIT_HARNESS=kiro` or `JFROG_INIT_HARNESS=kiro-cli` on the
342+
same line — no other harness needs this. Silent, like every other
343+
setup command in this walk.
344+
334345
```bash
346+
JFROG_INIT_HARNESS=kiro node "${CLAUDE_SKILL_DIR}/scripts/jfrog-detect-jfrog-mcp.mjs" "[server-id]"; rc=$?; true
347+
JFROG_INIT_HARNESS=kiro-cli node "${CLAUDE_SKILL_DIR}/scripts/jfrog-detect-jfrog-mcp.mjs" "[server-id]"; rc=$?; true
335348
node "${CLAUDE_SKILL_DIR}/scripts/jfrog-detect-jfrog-mcp.mjs" "[server-id]"; rc=$?; true
336349
```
337350

@@ -342,7 +355,9 @@ it for the placeholder fix instead of re-resolving from scratch.
342355
**Read-only against the JFrog plugin's own `mcp.json` — with one
343356
exception: automatic placeholder substitution** of an unresolved
344357
`${JFROG_PLATFORM_URL}` / `${JFROG_URL}` with the real JPD URL from
345-
`jf config`.
358+
`jf config` (plus, for kiro-cli, adding the `jfrog` entry to
359+
`~/.kiro/settings/mcp.json` when no plugin has put one there — see
360+
`references/mcp-plugin-config.md`).
346361

347362
**Stop and read `references/mcp-plugin-config.md` in full** — exactly
348363
how the substitution works, the per-harness plugin-config paths, and
@@ -361,24 +376,8 @@ node "${CLAUDE_SKILL_DIR}/scripts/jfrog-detect-project.mjs" "[server-id]" "[proj
361376
the exact "reuse `<KEY>`?" `AskUserQuestion` and the jpdUrl-drift check
362377
this step requires, not optional background.
363378

364-
**Where the project list comes from.** `jfrog-detect-project.mjs` fetches
365-
`GET <JPD>/access/api/v1/projects` (the
366-
[GetProjectsList](https://docs.jfrog.com/projects/reference/getprojectslist)
367-
endpoint, authenticated with credentials from `jf config export`) once
368-
per walk and caches it in memory for a short TTL (`lib/project-cache.mjs`)
369-
— the interactive picker re-invokes this script once per user attempt,
370-
and re-enumerating on every typed guess would be wasted network traffic.
371-
This is the list every "enumerated project list" / `candidatesWithNames`
372-
reference below draws from.
373-
374-
**Name-or-key input.** The user answers with **either** the project's
375-
canonical key OR its display name — whichever is easier for them.
376-
`jfrog-detect-project.mjs` resolves it against the enumerated project
377-
list (exact key, exact name, then progressively fuzzier tiers — see
378-
`references/project-matching.md` for the exact algorithm), confirms
379-
existence, and emits the canonical key on green in the JSON
380-
`resolvedKey` field. An ambiguous input exits red with `candidates`
381-
listing the tied keys.
379+
Name-or-key input is resolved via exact match, then progressively
380+
fuzzier tiers — see `references/project-matching.md` for the algorithm.
382381

383382
**Picking a project, interactively.** Whenever the detector needs the
384383
user to choose — no input was passed, the typed input didn't match

plugins/jfrog/skills/jfrog-init/references/how-to-ask-user.md

Lines changed: 11 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -4,10 +4,11 @@ When the skill needs a Yes/No answer, a selection, or any other input
44
from the user, use the **native interactive prompt tool** built into
55
your harness so the user can click or select rather than type:
66

7-
| Harness | Preferred tool |
8-
|-------------|------------------------|
9-
| Claude Code | `AskUserQuestion` |
10-
| Codex | `request_user_input` |
7+
| Harness | Preferred tool |
8+
|-----------------|------------------------|
9+
| Claude Code | `AskUserQuestion` |
10+
| Codex | `request_user_input` |
11+
| Kiro / Kiro CLI | none — no native prompt tool exists; go straight to the plain-text fallback |
1112

1213
Each reference file specifies the question text and option labels; use
1314
your harness's native tool to present them. Native prompt tools already
@@ -17,3 +18,9 @@ add a duplicate "Other" option yourself.
1718
**Fallback**: if no native prompt tool is available, or the tool
1819
returns without a selection, surface the question as plain text in
1920
your reply — never silently stop without presenting it.
21+
22+
**Kiro / Kiro CLI**: check `$JFROG_INIT_HARNESS` (already exported by
23+
Step 5) before reaching for `AskUserQuestion` — if it's `kiro` or
24+
`kiro-cli`, skip the tool call entirely and use the plain-text fallback
25+
directly. Calling it anyway surfaces a "tool does not exist" error to
26+
the user before you fall back.

plugins/jfrog/skills/jfrog-init/references/mcp-plugin-config.md

Lines changed: 36 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -44,8 +44,10 @@ placeholder pattern anywhere in the file, it calls
4444
file is not preserved byte-for-byte.
4545
5. Is idempotent — subsequent runs find no placeholder and no-op.
4646

47-
This is the ONLY place `/jfrog-init` writes to the plugin-owned
48-
`mcp.json`. Everything else in Step 5 is read-only.
47+
This is the only place `/jfrog-init` writes to a harness's plugin-owned
48+
`mcp.json` — with one further exception for Kiro CLI: ensuring a `jfrog`
49+
entry exists in `~/.kiro/settings/mcp.json`, which no plugin ships (see
50+
below). Everything else in Step 5 is read-only.
4951

5052
**Per-harness plugin-owned config file:**
5153

@@ -55,11 +57,26 @@ This is the ONLY place `/jfrog-init` writes to the plugin-owned
5557
| VS Code | `~/.vscode/agent-plugins/github.com/jfrog/vscode-plugin/plugin/.mcp.json` |
5658
| Claude Code | `~/.claude/plugins/cache/<marketplace>/jfrog/<version>/.mcp.json` (glob) |
5759
| Codex | `$CODEX_HOME/plugins/cache/codex-plugin/jfrog/<version>/.mcp.json` (glob → newest; `$CODEX_HOME` defaults to `~/.codex`) |
60+
| Kiro (IDE) | `~/.kiro/powers/installed/jfrog-kiro-power/mcp.json` (stable path) |
61+
| Kiro CLI | `~/.kiro/settings/mcp.json` — Kiro's own global MCP config, not shipped by any plugin, so the `jfrog` entry is **created or merged in** with a placeholder url, then substituted like every other row above |
62+
63+
The Kiro CLI merge is additive and never destructive: the file normally
64+
holds the user's other MCP servers, so a `jfrog` entry that already has a
65+
url is left untouched (a placeholder in it is the substitution step's
66+
job), other servers and the file's mode are preserved, a symlinked config
67+
stays a symlink, and a file that isn't valid JSON is reported rather than
68+
rewritten.
5869

5970
Harness detection (in priority order): `CODEX_SANDBOX` / `CLAUDECODE` /
6071
`CURSOR_TRACE_ID` / `VSCODE_PID` / `TERM_PROGRAM`. Override with
61-
`JFROG_INIT_HARNESS=claude|cursor|vscode|codex` or a specific file via
62-
`JFROG_INIT_MCP_CONFIG=/abs/path`.
72+
`JFROG_INIT_HARNESS=claude|cursor|vscode|codex|kiro|kiro-cli` or a
73+
specific file via `JFROG_INIT_MCP_CONFIG=/abs/path`. Neither Kiro target
74+
has an auto-detect signal yet — both are reachable only via the
75+
`JFROG_INIT_HARNESS=kiro` / `kiro-cli` overrides.
76+
77+
`SKILL.md`'s Step 5 already has you export `JFROG_INIT_HARNESS=kiro` /
78+
`kiro-cli` up front when you're running as one of those two — before
79+
the detector ever runs, so Exit 3 below isn't the trigger for it.
6380

6481
**What the detector verifies** (three things):
6582

@@ -83,7 +100,7 @@ reachable.
83100
credentials, never through the JFrog MCP, so a broken or
84101
missing plugin `mcp.json` doesn't affect whether those checks are
85102
accurate — there's nothing to gain by stopping the walk over it.
86-
Tell the two red causes apart from the detector's `detail` for the
103+
Tell the red causes apart from the detector's `detail` for the
87104
Final Summary note:
88105
- Plugin file missing / empty / lacks a valid `jfrog` entry. Fix:
89106
**reinstall or update the JFrog plugin.** If the user asks why or
@@ -98,8 +115,22 @@ reachable.
98115
- Plugin file has a placeholder and automatic substitution failed
99116
with no url set for the resolved server-id. Fix: **resolve `jf
100117
config`**. Reinstalling the plugin does not fix this.
118+
- Kiro CLI only: it could not create or update its own
119+
`~/.kiro/settings/mcp.json` — no plugin ships this file, so there's
120+
nothing to reinstall. The detail names the actual cause (e.g. the
121+
parent path blocked by a non-directory, or a permissions error).
122+
Fix: **correct the file or parent-directory permissions/path**,
123+
then re-run.
101124
- (Exit 3 only) Harness could not be detected, or plugin file is
102125
invalid JSON / unreadable. Show the raw detector error in the note.
126+
**Do not react to this by guessing a harness or trying
127+
`JFROG_INIT_HARNESS` values to see what resolves it.** If this is
128+
Kiro or Kiro CLI, the override was already exported before the
129+
detector's first run (top of Step 5), so it should not reach Exit
130+
3 for that cause at all. Otherwise this is Exit 3, non-blocking
131+
like every other cause above: note it and move on to Step 6 in the
132+
same turn, with zero visible pause — do not stop to read this file
133+
or any other reference doc over it.
103134
- **Exit 2 (`ask`)** → the one outcome that still blocks: placeholder
104135
present, but the jf server-id is ambiguous — every step from here on
105136
needs a resolved server-id, so there's nothing to skip ahead to.

plugins/jfrog/skills/jfrog-init/references/project-picker.md

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -102,6 +102,16 @@ over the generic first-two when present:
102102
accepted input format (no *"(name or key)"*, no *"you can type a key
103103
or name"*, no *"either the display name or key works"*).
104104

105+
- **If `AskUserQuestion` is not available as a tool at all** (some
106+
harnesses don't expose it — check `$JFROG_INIT_HARNESS`: `kiro` /
107+
`kiro-cli` never have it, so skip the tool call and go straight to
108+
the fallback instead of calling it and surfacing its error), use the
109+
plain-text fallback line above —
110+
*"Which project do you want to use?"*, nothing else — regardless of
111+
how many entries `candidatesWithNames` has. Never explain that the
112+
tool is unavailable, never mention the candidate count or that a
113+
picker would otherwise have been used; the user only ever sees the
114+
one line.
105115
- **Never surface the full candidate list or a count** to the user in
106116
any case — the picker's two options (plus "Other") or the plain-text
107117
fallback are the entire user-facing surface.

plugins/jfrog/skills/jfrog-init/references/project-resolution-branches.md

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,13 @@
44
full whenever `jfrog-detect-project.mjs` returns anything other than a
55
clean exit 0.
66

7+
**Everything below — exit codes, `unresolved`, and which bullet you
8+
land on — is reasoning for you to follow silently, never to narrate.**
9+
Never repeat this table's own words back to the user (e.g. "Exit 2,
10+
no `unresolved`" or "this is an ask with no input"). The only output
11+
the user sees is the resulting prompt itself, the raw detector error
12+
where one is shown, or the Final Summary.
13+
714
- **Exit 2 (`ask`) with `"unresolved": "server"`** → not a project ask
815
— the server-id is ambiguous. Follow "Resolving `<server-id>` for
916
Steps 4-7" in `SKILL.md` (prompt for a server from `candidates`), then

plugins/jfrog/skills/jfrog-init/scripts/jfrog-detect-all.mjs

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,10 @@
11
#!/usr/bin/env node
22
// Runs the detectors in dependency order and reports one JSON summary line.
3-
// Idempotent, read-only, zero mutation (aside from the state-file hint on
4-
// green) — safe to run repeatedly.
3+
// Idempotent and safe to run repeatedly. Mostly read-only — with two
4+
// exceptions: (1) for the kiro-cli harness, Step 5 (detectJfrogMcp →
5+
// resolveMcpConfig) creates or merges ~/.kiro/settings/mcp.json when the
6+
// jfrog entry is absent, the same write that jfrog-detect-jfrog-mcp.mjs
7+
// performs; (2) on green, a state-file hint is written to ~/.jfrog/setup.json.
58
//
69
// Usage: node jfrog-detect-all.mjs [server-id] [project-input]
710
//

plugins/jfrog/skills/jfrog-init/scripts/jfrog-reinstall-jfrog-plugin.mjs

Lines changed: 25 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,10 +13,17 @@
1313
// Always exits 0 after printing.
1414

1515
import { existsSync } from "node:fs";
16+
import { homedir } from "node:os";
17+
import { join } from "node:path";
1618
import { detectHarness, resolveMcpConfig } from "./jfrog-resolve-mcp-config.mjs";
1719

18-
const resolved = resolveMcpConfig();
1920
const harness = detectHarness();
21+
// kiro-cli's resolveMcpConfig() writes to disk as a side effect (ensureKiroCliJfrogEntry),
22+
// which this diagnostic-only script must never do — derive the path directly instead.
23+
const resolved =
24+
harness === "kiro-cli"
25+
? { path: join(homedir(), ".kiro", "settings", "mcp.json") }
26+
: resolveMcpConfig();
2027

2128
console.log(`The JFrog MCP entry lives inside the JFrog plugin's own mcp.json file.
2229
This script never writes to it — it only diagnoses and prints the fix.
@@ -56,12 +63,27 @@ Restart VS Code, then re-run /jfrog-init.`);
5663
5764
Restart Codex, then re-run /jfrog-init.`);
5865
break;
66+
case "kiro":
67+
console.log(`Kiro IDE:
68+
Open the Powers panel → Add Custom Power → Import from GitHub →
69+
enter the JFrog Kiro Power repository URL.
70+
Restart Kiro, then re-run /jfrog-init.`);
71+
break;
72+
case "kiro-cli":
73+
console.log(`Kiro CLI:
74+
No plugin reinstall needed — the jfrog entry in ~/.kiro/settings/mcp.json
75+
is created automatically by /jfrog-init. Re-run /jfrog-init to recreate it.
76+
If /jfrog-init reports the file is invalid, open ~/.kiro/settings/mcp.json,
77+
fix the JSON (keep the other MCP server entries), then re-run /jfrog-init.`);
78+
break;
5979
default:
6080
console.log(`Reinstall the JFrog plugin in whichever IDE you're using:
6181
Cursor: Settings → Plugins → search "JFrog" → reinstall.
6282
VS Code: code --install-extension JFrog.jfrog-vscode-extension --force
6383
Claude Code: claude plugin install jfrog-beta/jfrog
6484
Codex: codex plugin marketplace add jfrog/codex-plugin && codex plugin add jfrog@codex-plugin
85+
Kiro: Powers panel → Add Custom Power → Import from GitHub.
86+
Kiro CLI: no reinstall needed — entry is created automatically by /jfrog-init.
6587
6688
Restart the IDE afterwards, then re-run /jfrog-init.`);
6789
}
@@ -74,6 +96,8 @@ Expected plugin-owned paths (for reference):
7496
Claude: ~/.claude/plugins/cache/<marketplace>/jfrog/<version>/.mcp.json
7597
Codex: $CODEX_HOME/plugins/cache/codex-plugin/jfrog/<version>/.mcp.json
7698
($CODEX_HOME defaults to ~/.codex)
99+
Kiro: ~/.kiro/powers/installed/jfrog-kiro-power/mcp.json
100+
Kiro CLI: ~/.kiro/settings/mcp.json (not plugin-owned; created by /jfrog-init)
77101
`);
78102

79103
if (resolved.path && existsSync(resolved.path)) {

0 commit comments

Comments
 (0)