74 Commits
Author SHA1 Message Date
BillyOutlast ea460bc622 Merge pull request #25 from Heretek-Games/feat/sdk-0.7.0-templates
feat(sdk): v0.7.0 settings contract + complete template release pipeline (#24)
2026-09-18 12:09:21 -04:00
BillyOutlast 3c0edd7823 fix(scaffolder): reduce cognitive complexity, use Set for SDK_SCOPES, and exclude templates in sonar 2026-09-18 12:08:14 -04:00
BillyOutlast 32627ab06a chore(templates): use execFileSync in switch-sdk-scope and exclude templates from sonar duplication 2026-09-18 12:05:26 -04:00
BillyOutlast dfeb00b326 feat(templates): ship release/CI pipeline and scope switch in every scaffold
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.
v0.7.0
2026-09-17 23:12:33 -04:00
BillyOutlast adb96c6b33 feat(sdk): expose PluginContext.settings and bump API version to 3
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.
2026-09-17 23:12:26 -04:00
BillyOutlast 00411d4539 docs: document templates, dev server, and v2 SPI capabilities
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.
2026-09-17 22:43:35 -04:00
BillyOutlast 6fb5693a64 feat(templates): add client-ui, metadata, store, runner, and fullstack scaffolds
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.
2026-09-17 22:43:32 -04:00
BillyOutlast 5266b3ba36 feat(cli): compile Vue SFCs and add a watch-mode dev server
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.
2026-09-17 22:43:28 -04:00
BillyOutlast c5d2251546 feat(sdk): add runner, auth, and depot provider SPIs and settings schema
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.
2026-09-17 22:43:25 -04:00
BillyOutlast db1f96adf3 fix(publish): stage sibling sdk for plugin-cli smoke test and bump to 0.6.3
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.
v0.6.3
2026-09-17 21:44:14 -04:00
BillyOutlast f6ae0849b9 feat(sdk): add pre-launch:network-post launch stage after pre-launch:network v0.6.2 2026-09-17 21:39:12 -04:00
BillyOutlast a9a24ffad5 fix(ci): resolve starter linter error, enforce sidecar pack check, and harden 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
2026-09-17 21:34:27 -04:00
BillyOutlast ecb3c92478 fix(signer): wire sidecar verification, scope targets, guard nulls, and bump to 0.6.2
Closes #21, closes #22, closes #23
2026-09-17 20:54:05 -04:00
BillyOutlast 781ef1a330 feat(sdk): declarative client sidecars in the plugin bundle manifest
- 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
2026-09-17 17:55:06 -04:00
BillyOutlast 63696acafc feat(sdk): document render-function slots and system.run path resolution
- 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
2026-09-17 16:23:51 -04:00
BillyOutlast 90850e17fd feat(sdk): add launch pipeline simulation and align ScannedGame types 2026-09-17 15:56:36 -04:00
BillyOutlast 77fac109fa fix(publish): rewrite cross-scope import specifiers in staged artifacts; bump to 0.6.1 v0.6.1 2026-09-17 15:30:01 -04:00
BillyOutlast df7169ef0e chore: starter template follows the accessible @droposs scope onto 0.6.x mirror 2026-09-17 15:23:45 -04:00
BillyOutlast 3a6821d741 fix(publish): drop pnpm-only --no-git-checks flag from npm publish paths v0.6.0 2026-09-17 15:10:41 -04:00
BillyOutlast 711de45ee0 fix(ci): publish to the accessible @droposs scope by default; gate @drop-oss publishes behind a dispatch flag 2026-09-17 15:07:48 -04:00
BillyOutlast 78977539f2 fix(ci): publish packages via npm CLI for OIDC trusted publishing (pnpm publish lacks trusted-publisher support) 2026-09-17 14:57:55 -04:00
BillyOutlast ad6d15afe1 chore: publish @droposs legacy-scope mirrors and ship configurable scope cutover tooling 2026-09-17 14:49:09 -04:00
BillyOutlast a9621db5da Merge pull request #18 from Heretek-Games/dependabot/npm_and_yarn/types/node-26.5.1
chore(deps-dev): bump @types/node from 22.20.2 to 26.5.1
2026-09-15 09:35:42 -04:00
BillyOutlast 8fedc2e61b Merge pull request #15 from Heretek-Games/dependabot/github_actions/pnpm/action-setup-6.1.0
chore(deps): bump pnpm/action-setup from 4.3.0 to 6.1.0
2026-09-15 09:34:30 -04:00
BillyOutlast 63b90748eb Merge pull request #16 from Heretek-Games/dependabot/github_actions/actions/setup-node-7.0.0
chore(deps): bump actions/setup-node from 4.4.0 to 7.0.0
2026-09-15 09:34:27 -04:00
BillyOutlast 65d946d8b0 Merge pull request #17 from Heretek-Games/dependabot/github_actions/actions/checkout-7.0.1
chore(deps): bump actions/checkout from 4.4.0 to 7.0.1
2026-09-15 09:33:15 -04:00
dependabot[bot] a9543d7553 chore(deps-dev): bump @types/node from 22.20.2 to 26.5.1
Bumps [@types/node](https://github.com/DefinitelyTyped/DefinitelyTyped/tree/HEAD/types/node) from 22.20.2 to 26.5.1.
- [Release notes](https://github.com/DefinitelyTyped/DefinitelyTyped/releases)
- [Commits](https://github.com/DefinitelyTyped/DefinitelyTyped/commits/HEAD/types/node)

---
updated-dependencies:
- dependency-name: "@types/node"
  dependency-version: 26.5.1
  dependency-type: direct:development
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <[email protected]>
2026-09-15 13:32:17 +00:00
dependabot[bot] 7f54e93b25 chore(deps): bump actions/checkout from 4.4.0 to 7.0.1
Bumps [actions/checkout](https://github.com/actions/checkout) from 4.4.0 to 7.0.1.
- [Release notes](https://github.com/actions/checkout/releases)
- [Changelog](https://github.com/actions/checkout/blob/main/CHANGELOG.md)
- [Commits](https://github.com/actions/checkout/compare/11d5960a326750d5838078e36cf38b85af677262...3d3c42e5aac5ba805825da76410c181273ba90b1)

---
updated-dependencies:
- dependency-name: actions/checkout
  dependency-version: 7.0.1
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <[email protected]>
2026-09-15 13:31:46 +00:00
dependabot[bot] f7b21d37a2 chore(deps): bump actions/setup-node from 4.4.0 to 7.0.0
Bumps [actions/setup-node](https://github.com/actions/setup-node) from 4.4.0 to 7.0.0.
- [Release notes](https://github.com/actions/setup-node/releases)
- [Commits](https://github.com/actions/setup-node/compare/49933ea5288caeca8642d1e84afbd3f7d6820020...820762786026740c76f36085b0efc47a31fe5020)

---
updated-dependencies:
- dependency-name: actions/setup-node
  dependency-version: 7.0.0
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <[email protected]>
2026-09-15 13:31:45 +00:00
dependabot[bot] 11433ebf78 chore(deps): bump pnpm/action-setup from 4.3.0 to 6.1.0
Bumps [pnpm/action-setup](https://github.com/pnpm/action-setup) from 4.3.0 to 6.1.0.
- [Release notes](https://github.com/pnpm/action-setup/releases)
- [Commits](https://github.com/pnpm/action-setup/compare/b906affcce14559ad1aafd4ab0e942779e9f58b1...ea17c68df8912ef543352723c149a84f56e3d413)

---
updated-dependencies:
- dependency-name: pnpm/action-setup
  dependency-version: 6.1.0
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <[email protected]>
2026-09-15 13:31:38 +00:00
BillyOutlast 61b0549533 Merge pull request #20 from Heretek-Games/feat/v0.6.0-reconciliation
chore(release): v0.6.0 — reconciled CLI, conformance helpers, and @drop-oss scope prep
2026-09-15 09:30:50 -04:00
BillyOutlast c724835d2a refactor(cli): share server manifest fixture across signer tests
Extract writeManifest/serverManifest helpers so the verification tests no
longer repeat identical manifest literals. Clears the remaining SonarCloud
new-code duplication.
2026-09-14 23:37:02 -04:00
BillyOutlast 4486f36cc2 refactor(sdk): deduplicate mock storage and signer fixtures
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.
2026-09-14 23:34:31 -04:00
BillyOutlast e45aa66fa0 chore(release)!: adopt @drop-oss scope and add typecheck 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.
2026-09-14 23:11:54 -04:00
BillyOutlast 86001c4bff docs: correct mock examples, capability scoping, and scope references
- 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.
2026-09-14 23:11:50 -04:00
BillyOutlast 9042a30bce fix(template): rewrite starter manifest to the v2 shape
- 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.
2026-09-14 23:11:45 -04:00
BillyOutlast f06d8456a9 fix(cli): verify legacy entry-only bundles and align ignored files
- 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.
2026-09-14 23:11:03 -04:00
BillyOutlast 113e7bbc4a fix(sdk): align manifest contract and mocks with Drop core
- 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.
2026-09-14 23:10:59 -04:00
BillyOutlast 819a865b48 Merge remote-tracking branch 'origin/feat/out-manifest' into feat/v0.6.0-reconciliation 2026-09-14 22:59:27 -04:00
BillyOutlast 5da889d9ae Merge pull request #13 from Heretek-Games/chore/security-policy-and-dependabot
[audit] Add SECURITY.md and Dependabot config
2026-09-14 22:05:38 -04:00
BillyOutlast 877a066588 Merge pull request #12 from Heretek-Games/fix/sign-manifest-and-verify
[audit] Sign the manifest, add verify command, align capability schema
2026-09-14 22:05:24 -04:00
BillyOutlast a53a5b42fe Merge pull request #11 from Heretek-Games/chore/conformance-helpers
feat(sdk): plugin manifest capability conformance helpers
2026-09-14 22:05:21 -04:00
BillyOutlast 292cc14b41 test(cli): share fixture-bundle setup in the out-manifest tests
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.
2026-09-14 21:48:31 -04:00
BillyOutlast 954fe0aef4 fix(cli): reduce verifier complexity and sort keys deterministically
- 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)
2026-09-14 21:44:50 -04:00
BillyOutlast 0b29642769 fix(cli): reduce verifier complexity and sort keys deterministically
- 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
2026-09-14 21:22:49 -04:00
BillyOutlast 4976216ac3 feat(cli): add --out-manifest so derived fields stay out of the source tree
- 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
2026-09-14 21:20:56 -04:00
BillyOutlast 3bb9e1cbc3 fix(cli): version the signature payload and cover the canonical manifest
- 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
2026-09-14 21:19:31 -04:00
BillyOutlast b42f489b73 fix(sdk): match conformance helpers to Drop capability resolution 2026-09-14 21:04:18 -04:00
BillyOutlast 1c4a6f2e31 ci: add a shared ESLint lint gate
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).
2026-09-14 20:01:04 -04:00
BillyOutlast a0dde145d6 ci: pin GitHub Actions to commit SHAs
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).
2026-09-14 19:40:57 -04:00