Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
30 commits
Select commit Hold shift + click to select a range
23f07d1
docs(163): plan GAMEPAD implementation across repositories
dskvr Oct 12, 2026
ae7ecb2
feat(gamepad): add cached NAP binding and SDK exports
dskvr Oct 12, 2026
f67bdc6
docs(163): record portable GAMEPAD checkpoint
dskvr Oct 12, 2026
6bd6ff3
feat(conformance): validate GAMEPAD envelopes and inject cached API
dskvr Oct 12, 2026
3e2f61b
feat(gamepad): integrate tooling and prepare coordinated releases
dskvr Oct 12, 2026
09f2916
fix(screenshot): accept the GAMEPAD-capable Paja release
dskvr Oct 12, 2026
aa9aff8
docs(163): record verified coverage and release ordering
dskvr Oct 12, 2026
cf9d3b8
fix(release): separate CLI runner pins from their first publication
dskvr Oct 12, 2026
e7a5565
fix(cli): select GAMEPAD runners after their coordinated publication
dskvr Oct 12, 2026
428fa3f
chore(release): consume the CLI follow-up changeset
dskvr Oct 12, 2026
69230d1
docs(163): track coordinated PRs and the release-gated CLI follow-up
dskvr Oct 12, 2026
0774ac2
Merge branch 'feat/nap-gamepad' into feat/nap-gamepad-cli-runners
dskvr Oct 12, 2026
b6bbd74
docs(release): explain the split publication order
dskvr Oct 12, 2026
2e7632a
Merge branch 'feat/nap-gamepad' into feat/nap-gamepad-cli-runners
dskvr Oct 12, 2026
42167e1
fix(nap): isolate throwing gamepad onChange listeners
hzrd149 Oct 12, 2026
0a9cd58
fix(conformance): inject gamepad state tools as literal source
hzrd149 Oct 12, 2026
0fdd281
fix(conformance): limit harness iframe policy to the GAMEPAD guidance
hzrd149 Oct 12, 2026
7539027
fix(gamepad): subscribe on first use instead of at install
hzrd149 Oct 12, 2026
7bee825
refactor(conformance): carry forbidden-field reasons on envelope specs
hzrd149 Oct 12, 2026
787ae14
docs(gamepad): stop closing the example listener immediately
hzrd149 Oct 12, 2026
44d663a
docs(changelog): restore unwrapped history and clean new entries
hzrd149 Oct 12, 2026
6ee3931
Merge reviewed GAMEPAD fixes into CLI runner follow-up
dskvr Oct 14, 2026
7371838
docs(cli): clarify runner publication prerequisite
dskvr Oct 14, 2026
3c3f1a6
fix(conformance-cli): require compatible published Paja peers
dskvr Oct 14, 2026
5e11d4c
docs(debug): record Paja peer compatibility resolution
dskvr Oct 14, 2026
4a6f135
Merge main into GAMEPAD release prerequisite
dskvr Oct 14, 2026
24f8be4
docs(debug): resume CLI runner release verification
dskvr Oct 14, 2026
fdf8cfd
Merge compatible Paja dependencies into CLI runner follow-up
dskvr Oct 14, 2026
cbe0101
Merge GAMEPAD release from main into CLI runner follow-up
dskvr Oct 14, 2026
3732571
docs(debug): record published runner smoke verification
dskvr Oct 14, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
37 changes: 37 additions & 0 deletions .planning/debug/pr243-unpublished-runner.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
---
status: resolved
trigger: "PR #243 tests are red across the board"
created: 2026-10-13
updated: 2026-10-14
---

# PR #243 runner publication dependency

## Symptoms

- Expected: the standalone CLI provisions its pinned tools from npm with an empty PATH and a fresh cache on all five platforms.
- Actual: every job in run 38299057704 fails during the first screenshot command.
- Error: `No matching version found for @napplet/conformance-cli@0.3.4.`
- Original reproduction: installing that exact package version from npm failed because only 0.3.3 was published.

## Current Focus

- Cause: the documented release dependency. All five jobs in run 38520521467 failed with npm ETARGET for conformance CLI 0.3.4.
- Current state: PR #242 merged after nine fresh checks passed. Its npm and JSR publication workflows succeeded, the four required npm tarballs return HTTP 200, and this branch includes the released main commit.
- Next action: retarget #243 to main and verify all five platforms on the updated PR head.

## Evidence

- [Failed standalone run](https://github.com/napplet/web/actions/runs/38299057704): Linux x64/ARM64, macOS x64/ARM64, and Windows all fail on the same missing package.
- [PR #242](https://github.com/napplet/web/pull/242), head `44d663a14af0f91a3797614c76e5c3d684cec52e`: CI, conformance, links, slop, and all five standalone jobs passed. Release versions are already applied and no unconsumed changeset remains.
- Initial npm registry check: conformance CLI 0.3.4 absent; Kehto CLI 0.5.5 and Paja 0.21.0 present.
- [PR #242](https://github.com/napplet/web/pull/242) merged as `839000563f6b92293a1e94ae0cd3a63011139448` on October 14 after its updated head passed all nine checks. [npm publication](https://github.com/napplet/web/actions/runs/38598414641) and [JSR publication](https://github.com/napplet/web/actions/runs/38598414611) succeeded.
- Direct npm download checks returned HTTP 200 for core 0.34.0, nap 0.34.0, conformance 0.20.0, and conformance CLI 0.3.4. Published conformance CLI metadata requires Paja `>=0.21.0 <0.22.0` and core/nap 0.34.0, matching the reviewed peer compatibility fix.
- The compiled macOS ARM64 binary passed `standalone_integration_test.ts` against real npm packages with an empty PATH and a fresh cache: 1 passed, 0 failed, 1m20s. This covered screenshot generation, deployment dry-run, conformance, Paja startup, and cache reuse with network access disabled by invalid proxies.
- The pinned package installation is the behavior under test. Skipping the check, substituting a local package, or downgrading to the old runner would conceal or remove the intended release behavior.

## Resolution

Root cause confirmed. Updated the stacked branch with #242's latest reviewed fixes and restored the CLI changelog's existing unwrapped history, leaving one focused 0.9.1 entry. Local verification passed: build (12 tasks), type-check (18 tasks), recursive unit tests, and diff whitespace checks. The final full AI-slop scan passed at 95/100 with zero errors; warnings concern existing function length, nesting, and the `fflate` dependency advisory in files unchanged by this PR.

The release blocker is resolved: required packages are published and downloadable, the branch includes released main, and the local compiled binary passed fresh-cache verification. Remote platform results are tracked in #243's checks. No dependency downgrade, local-package substitution, or test bypass was added.
6 changes: 6 additions & 0 deletions packages/cli/CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,11 @@
# @napplet/cli

## 0.9.1

### Patch Changes

- Select the GAMEPAD-capable conformance CLI 0.3.4 and Kehto CLI 0.5.5 in the private runner cache. These package versions must be published before this CLI release.

## 0.9.0

### Minor Changes
Expand Down
2 changes: 1 addition & 1 deletion packages/cli/deno.json
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
{
"extends": "../../deno.json",
"name": "@napplet/cli",
"version": "0.9.0",
"version": "0.9.1",
"description": "Standalone CLI for creating, configuring, testing, and deploying napplets",
"license": "MIT",
"exports": {
Expand Down
2 changes: 1 addition & 1 deletion packages/cli/package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "@napplet/cli",
"version": "0.9.0",
"version": "0.9.1",
"description": "Standalone CLI for creating, configuring, testing, and deploying napplets",
"type": "module",
"files": [
Expand Down
2 changes: 1 addition & 1 deletion packages/cli/src/cli.ts
Original file line number Diff line number Diff line change
Expand Up @@ -403,7 +403,7 @@ async function commandPaja(argv: string[]): Promise<number> {
const config = await loadConfig(flags);
const configured = config.paja?.command?.trim();
const base: ResolvedCommand = !configured || configured === "kehto"
? await managedPackageCommand("@kehto/cli@0.5.4", "dist/index.js")
? await managedPackageCommand("@kehto/cli@0.5.5", "dist/index.js")
: splitCommand(configured);
const child = new Deno.Command(base.command, {
args: [...base.args, "paja", ...resolvePajaArgs(flags.afterDoubleDash)],
Expand Down
2 changes: 1 addition & 1 deletion packages/cli/src/managed-node.ts
Original file line number Diff line number Diff line change
Expand Up @@ -90,7 +90,7 @@ export async function ensureManagedNode(): Promise<ManagedNode> {
* @param spec Exact package version.
* @param entry Package-relative CLI script.
* @returns Absolute executable/script and environment, independent of project dependencies.
* @example await managedPackageCommand('@napplet/conformance-cli@0.3.3', 'dist/cli.js')
* @example await managedPackageCommand('@napplet/conformance-cli@0.3.4', 'dist/cli.js')
*/
export async function managedPackageCommand(spec: string, entry: string): Promise<ResolvedCommand> {
const node = await ensureManagedNode();
Expand Down
2 changes: 1 addition & 1 deletion packages/cli/src/package-runner.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
import { type CommandRunner, runCommand, splitCommand } from "./process.ts";
import { managedPackageCommand } from "./managed-node.ts";

const CONFORMANCE_PACKAGE = "@napplet/conformance-cli@0.3.3";
const CONFORMANCE_PACKAGE = "@napplet/conformance-cli@0.3.4";

/** Process and output adapters used to invoke a maintained package CLI. */
export interface PackageCliRunOptions {
Expand Down
2 changes: 1 addition & 1 deletion packages/cli/tests/cli_test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -258,7 +258,7 @@ Deno.test("resolveConformanceCommand uses private tooling for either platform",
command: "/private/node", args: ["/private/conformance.js"],
});
}
assertEquals(calls, ["@napplet/conformance-cli@0.3.3:dist/cli.js", "@napplet/conformance-cli@0.3.3:dist/cli.js"]);
assertEquals(calls, ["@napplet/conformance-cli@0.3.4:dist/cli.js", "@napplet/conformance-cli@0.3.4:dist/cli.js"]);
});

Deno.test("resolveConformanceCommand preserves an explicit custom runner", async () => {
Expand Down
2 changes: 1 addition & 1 deletion packages/cli/tests/zapstore_test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -277,7 +277,7 @@ Deno.test("screenshot runner pins a compatible version and preserves literal arg
},
os: "windows",
resolvePackage: async (spec, entry) => {
assertEquals(spec, "@napplet/conformance-cli@0.3.3");
assertEquals(spec, "@napplet/conformance-cli@0.3.4");
assertEquals(entry, "dist/cli.js");
return { command: "C:/private/node.exe", args: ["C:/private/screenshot.js"] };
},
Expand Down
Loading