Skip to content

feat(portable): record Swival, Junie, and Cascade as skill readers - #727

Merged
ScriptedAlchemy merged 4 commits into
mainfrom
portable-client-records-instruction
Sep 7, 2026
Merged

feat(portable): record Swival, Junie, and Cascade as skill readers#727
ScriptedAlchemy merged 4 commits into
mainfrom
portable-client-records-instruction

Conversation

@ScriptedAlchemy

@ScriptedAlchemy ScriptedAlchemy commented Sep 7, 2026

Copy link
Copy Markdown
Owner

Records the three instruction-and-skill hosts in the same pinned clients block
and validator as #721 and #723, and fixes nine records the wave before this one
wrote twice. No adapter, projection, or compiler output changes.

Client Issue Tier Anchor action Evidence
Swival #703 skills registerswival --skills-dir <dir>/skills "<task>" swival.dev/pages/{skills,mcp}.html, retrieved 2026-09-06
JetBrains Junie #710 skills registerjunie --skill-location <dir>/skills junie.jetbrains.com/docs/agent-skills.html (dated 01 September 2026) and the CLI MCP page
Cascade (Devin Desktop) #704 skills install — copy into .agents/skills/<skill> docs.devin.ai/desktop/cascade/{skills,mcp,memories}, retrieved 2026-09-06
  • Swival publishes its discovery order verbatim (.swival/skills/,
    .agents/skills/, --skills-dir paths, then the global roots) and reads an
    extra parent directory in place, so the emitted skills/ tree needs no copy.
    The row is degraded for the same reason Junie's is: the emitted root is not
    a default location, and "If the same skill name exists in multiple locations,
    the first one in the precedence order wins" puts .swival/skills/ and
    .agents/skills/ ahead of it. Its mcp row is unavailable — the emitted
    document is a shape Swival reads, but --mcp-config "replaces the default
    .swival/mcp.json lookup" and only an invocation that passes it reads this
    file, which the recorded registration does not — so mcp.json is not listed
    as a path this client reads.
  • Junie reads .junie/skills/, ~/.junie/skills/, and .agents/skills/ by
    default and any folder given with --skill-location or skill-locations. Its
    MCP row is unavailable: the documented locations are .junie/mcp/mcp.json
    and ~/.junie/mcp/mcp.json, and no page states which file name
    --mcp-location looks for inside an added folder.
  • Cascade's discovery roots are .windsurf/skills/,
    ~/.codeium/windsurf/skills/, and the cross-agent .agents/skills/, so a
    skill directory is copied in. Its MCP configuration lives in
    ~/.codeium/windsurf/mcp_config.json with ${env:…} / ${file:…}
    interpolation, and its own page says the Devin Local agent uses the Devin CLI
    config instead — the profile already recorded as devin-cli (Host support: Devin CLI — native plugin manifest, portable compatibility, and versioned MCP/hook profiles #701).

Every manifest, placeholder, and hook row these hosts do not read carries a
dated reason naming what would be needed instead.

Duplicate records on main

portable-1.0.0.json on main carried qoder-cli, codewhale,
copilot-cli, gemini-cli, cline, hermes-agent, opencode,
kiro-powers, and pi twice. JSON.parse keeps only the last copy, so eight
of them were byte-identical dead text and the ninth was a live defect: pi
published the stale "no installable release exists" record at tier none
while the live-probed record (@mariozechner/pi-coding-agent 0.73.1, skills
tier, pi --skill <dir>/skills) was the copy the parser dropped. This PR
deletes the dead run, keeps the evidenced record for each client, and adds
portable-adapter.test.ts :: records every client once, since JSON keeps only the last of a repeated key, which reads the authored keys out of the file and
holds them to the validated set — a repeated key is not a duplicate a reader
can see.

Gate

Run on portable-client-records-instruction, which contains current
origin/main (4dc11a4a06):

  • pnpm build — pass
  • pnpm typecheck — pass
  • pnpm lint — pass
  • pnpm test:unit — 0 failed, 4434 passed, 6 skipped
  • pnpm docs:site:build — pass (locale parity and link checks clean)
  • packages/agent-bundle/tests/{install-surface,portable-adapter}.test.ts — 0
    failed

Deslop

Deslop: claude-opus-5-thinking-high, 3 edits (dropped a per-inventory
conditional the renderer did not need, removed a duplicated expectation string,
trimmed a comment that restated the assertion below it).

Self-review

Reviewer: claude-fable-5-1-thinking-high, against the diff vs origin/main.

  1. Swival's mcp reason contradicted its own page — the reason claimed no
    page documents the spec's type discriminator or a streamable-http server,
    but swival.dev/pages/mcp.html documents http, sse, and stdio. Fixed:
    the row is unavailable for the reason that actually holds — the file is
    read only by an invocation that passes --mcp-config, which replaces the
    default lookup, and TOML servers win by name.
  2. The register command did not name mcp.json while the record required
    reading it
    , so INSTALL.md claimed a path the command never hands over.
    Fixed: mcp.json is out of discovery.required and the mcp row is
    unavailable, matching how Junie's unreachable MCP location is recorded.
  3. Swival skills was supported while Junie's identical arrangement was
    degraded.
    Fixed: Swival is degraded, with its published precedence
    order and the external read-only rule as the reason.
  4. No test covered the Register: branch or the inventory cases for the new
    records.
    Fixed: the four-inventory matrix now asserts Swival's rendered
    line for every inventory (nothing-to-install, Register: with the
    Not loaded: tail) and that the Partial \skills`bullet appears only when the build wroteskills`.
  5. Nine client records were written twice on main. Fixed above, with a
    test that fails if one returns.

@changeset-bot

changeset-bot Bot commented Sep 7, 2026

Copy link
Copy Markdown

🦋 Changeset detected

Latest commit: 2f45c84

The changes in this PR will be included in the next version bump.

This PR includes changesets to release 1 package
Name Type
agent-bundle Patch

Not sure what this means? Click here to learn what changesets are.

Click here if you're a maintainer who wants to add another changeset to this PR

@chatgpt-codex-connector

chatgpt-codex-connector Bot commented Sep 7, 2026

Copy link
Copy Markdown

Codex Review Summary

This comment shows the latest Codex review activity on this pull request.

Review Status Commit Review trigger
📝 Code Review Completed 2026-09-07T01:32:21.990798Z 4c00270 PR opened
ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review" or "@codex security review".

Codex reacts with 👀 while any review is running, comments if it has suggestions, and reacts with 👍 once all reviews finish with no findings.

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: 4c00270e50

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

"actions": [
{
"role": "install",
"command": "cp -R skills/<skill> .agents/skills/<skill>"

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2 Badge Make the Cascade copy command create its destination

When .agents/skills/ does not already exist, as on a clean project, this generated install command fails because cp cannot create missing parent directories. It also mishandles repeat installs: if .agents/skills/<skill> already exists, GNU cp --help documents the applicable SOURCE... DIRECTORY form, so the result is <skill>/<skill>/SKILL.md, which Cascade will not discover. Create the parent and copy into .agents/skills/, or explicitly replace the target, so the command works for both first-time and repeat installs.

AGENTS.md reference: AGENTS.md:L139-L146

Useful? React with 👍 / 👎.

…ient records

Nine client records were written twice in the pinned portable table, and JSON
parsing keeps only the last copy: Pi shipped as a client that reads nothing
while its live-probed skills-tier record sat unread. Delete the dead run, keep
the record each client's evidence supports, and hold the table to one record
per client in the suite, since a repeated key is not a duplicate a reader can
see.

Swival's own rows now say what its pages say. Its skill tree loads only once
registered with --skills-dir and loses by name to .swival/skills/ and
.agents/skills/, so the row is degraded like Junie's. Its mcp row is
unavailable: the emitted document is a shape Swival reads, but only an
invocation passing --mcp-config reads this one, and the recorded registration
does not, so mcp.json is no longer claimed as a path this client reads.
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