Every template now carries .github/workflows/release.yml, a matching ci.yml,
.sdk-scope.json, scripts/switch-sdk-scope.mjs, and a typecheck script.
initPlugin applies the scope config on scaffold so @drop-oss specifiers and
workspace:* deps are rewritten to the concrete @droposs versions, letting a
freshly scaffolded repo install, typecheck, build, and release without manual
edits. Release/CI install steps fall back to npm install when no lockfile is
present.
Adds the host-populated settings snapshot to PluginContext (loaded before
init), raises PLUGIN_API_VERSION to 3 and SUPPORTED_API_VERSIONS to
[1, 2, 3], and mirrors the change through the JSON schema, mock harness,
tests, and docs. Bumps both packages to 0.7.0.
README, getting-started, manifest-reference, and the contributor guide now
cover the template matrix, drop-plugin dev, the settingsSchema contract, and
the new auth:provider / storage:depot / game:runner capabilities.
Specialized starters behind drop-plugin init --template so authors begin from
the right SPI shape: Vue SFC client UI, metadata provider, store scanner,
compatibility runner, and a full-stack server+settings+Vue template. Each
ships a .gitignore; tests import the compiled dist entry and run via node
--test against the workspace SDK.
Bundle .vue Single File Components with unplugin-vue, extract scoped CSS
to dist/client.css (updating manifest.client.css), and shim globalThis.Vue
so plugin SFCs run against Drop Desktop's Vue runtime. Adds
drop-plugin dev: an incremental watch build served over a CORS-enabled
local HTTP server for live Drop Desktop loading, and a --template option on
init. Covered by new end-to-end CLI feature tests.
Adds the v2 client and server contracts needed to cover the plugin roadmap:
- RunnerProvider (game:runner) for emulation/compatibility runners
- AuthProvider (auth:provider) for LDAP/SSO connectors
- DepotStorageProvider (storage:depot) for remote depot streaming
- declarative PluginSettingsSchema on PluginMetadata
- RouteHandlerContext.body/readJson, scheduleTask, and expanded
ClientPluginContext (launchGame, library, ui, events)
readJson stays optional so existing plugin test context literals keep
compiling. Mocks, schema, and unit tests are updated to match.
The plugin-cli publish step runs in a separate script invocation that wipes
the staging root first, so the smoke test could not resolve the runtime
@droposs/plugin-sdk dependency. Stage the sibling sdk on demand. Also adds
the pre-launch:network-post launch stage to the sdk types.
- Remove unused statSync import in starter switch-sdk-scope.mjs (fixes CI lint failure)
- Enforce sidecar verification in packPlugin and add integrity tests
- Implement fail-closed capability proxies in MockClientPluginContext
- Clean up any types, unused arguments, and @ts-ignore warnings across SDK/CLI/templates
- Add pre-publish staging smoke tests and provenance flag in publish-legacy-scope.mjs
- Pin GitHub Actions to commit SHAs in release workflows and bump doc/scope versions
- Add client.sidecars schema (SidecarTarget: os/arch/path/sha256) to drop-plugin.json
- Add Sidecar/SidecarTarget TypeScript contracts to plugin-sdk types
- drop-plugin build/sign/verify validates each target: path containment,
sha256 match, name must be allowlisted in client.commands, unique os+arch
- Accept sidecars without an additionalProperties restriction so bundles
stay forward-compatible
- Replace template-string examples with render() functions and warn that
production Vue builds ship no runtime template compiler
- Document the well-known-directory fallback of ctx.system.run per platform
and the Windows batch-wrapper caveat in manifests
- Export the conformance module as an SDK subpath export
- MockClientServerRequest falls back to base-path matching for query strings
- Update the starter template slot to a render function
Extract writeManifest/serverManifest helpers so the verification tests no
longer repeat identical manifest literals. Clears the remaining SonarCloud
new-code duplication.
Share the in-memory key/value backing between the server and client mocks,
and reuse a manifest/bundle helper across the basic signer tests. Clears
the SonarCloud new-code duplication gate.
- Rename the packages to @drop-oss/plugin-sdk and @drop-oss/plugin-cli
(0.6.0), update the template dependency, publish workflow filters, and
README table.
- Add engines.node >=22 to both packages and a typecheck script running
tsc --noEmit over src and test; wire it into CI.
- Publishing is not performed here: the @drop-oss scope has no published
packages yet and requires npm org access. A compatibility notice/alias
for @droposs/* users is recommended before the first release.
- getting-started: use the real route key ("GET /status"),
registeredSlots/playActionProviders, and describe build outputs from
server.entry/client.entry.
- testing-plugins: storage gating now uses await assert.rejects (the
guarded storage rejects rather than throwing synchronously).
- manifest-reference: document per-target capability resolution (server
reads top-level only; client reads client.capabilities with top-level
fallback) and mark apiVersion required.
- Rename package references in guides to the @drop-oss scope.
- drop-plugin.json declares server/client blocks with client.entry
(Drop Desktop never reads the legacy clientEntry alias), server
capabilities at the top level, and no checked-in checksum/files map.
- Remove stray tracked compiled test artifacts (index.test.js/.d.ts).
- Point template dependencies and imports at @drop-oss/* and add the
Node >=22 engine plus a typecheck script.
- verifyPlugin no longer reports a checksum mismatch for every on-disk
file of a legacy single-file bundle; it verifies the entry checksum
only, refuses multi-file bundles without a files map, requires every
code file to be covered by the files map, and validates declared paths
for traversal, matching Drop core's verification.ts.
- listFiles ignores only the root drop-plugin.json (state.json and
schema.json are covered), with a regression test.
- Load the JSON schema from @drop-oss/plugin-sdk first with @droposs
fallback; re-export SIGNATURE_VERSION from the SDK as the single source
of truth.
- Keep @drop-oss, @droposs, and @drop/plugin-sdk as builder externals.
- Add SIGNATURE_VERSION and SUPPORTED_API_VERSIONS ([1, 2]) exports.
- Make apiVersion required in PluginMetadata and the JSON schema
(Drop rejects manifests that omit it).
- Add clientEntry, signatureVersion, server.source, and client.source to
PluginManifest; document that Drop Desktop reads client.entry only.
- Fail closed on MockPluginContext.storage when the storage capability is
not declared, mirroring core guardStorage.
- Implement real .drop-backup semantics in MockScopedGameFs (backupFile
returns the backup relative path; restoreFile consumes the backup).
- Accept readonly literal manifests in the conformance helpers and
document the exported ManifestCapabilityScope interface.
Extracts writeFixtureBundle so the sign --out-manifest and pack tests no
longer duplicate the manifest/file preamble (SonarCloud new-code
duplication). Tests: CLI 12/12, SDK 8/8, starter 2/2.
- extract resolveSignedPayload from verifyPlugin and runVerify from the CLI
entrypoint to clear the SonarCloud cognitive-complexity gate
- sort canonical manifest keys with an explicit locale comparator
(cherry picked from commit 0b29642769)
- extract resolveSignedPayload from verifyPlugin and runVerify from the CLI
entrypoint to clear the SonarCloud cognitive-complexity gate
- sort canonical manifest keys with an explicit locale comparator
- sign/build accept --out-manifest <path> and write the derived manifest
(checksum, files, signature) there instead of rewriting drop-plugin.json
- pack now derives the signed manifest in memory and embeds it in the archive,
so packing no longer dirties the working tree (F-25)
- tests: source manifest untouched after sign --out-manifest and pack
- add SIGNATURE_VERSION 2: the HMAC now covers the file aggregate plus the
canonical manifest (excluding signature), so id/version/capabilities are
tamper-evident
- keep legacy verification working and make verify fail on unsigned bundles
unless --allow-unsigned is passed
- add signatureVersion to the schema; bump plugin-sdk/plugin-cli to 0.6.0
- tests: CLI rejects unsigned by default, accepts legacy files-only
signatures, and asserts the cross-repo fixture vector shared with drop
Add eslint.config.mjs (eslint:recommended + typescript-eslint recommended,
type-unaware) with a `lint` script and a CI step. Relax unused-vars to warn in
tests/templates, and replace the empty `GenericPlugin` interface with a type
alias.
Refs (audit finding F-23).
Pin actions/checkout, setup-node, upload-artifact, setup-dotnet, and
github-script to immutable commit SHAs (version kept in a trailing comment) so
a moved tag cannot change the code executed in CI.
Refs Heretek-Games/drop#69 (audit finding F-23).