Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
56 commits
Select commit Hold shift + click to select a range
0a0501a
docs: fix broken relative link in codec-support reference
jvgomg May 14, 2026
dbe6e7a
m-19 Phase 3: Linux VM test harness scaffold (TASK-322)
jvgomg May 14, 2026
a2c1816
fix(build): isolate Linux binary build to a VM-local source tree
jvgomg May 14, 2026
5b0279c
m-19 TASK-333: doctor --scope <system|device|all>
jvgomg May 14, 2026
ed5cd0e
m-19 TASK-322.02.01: keep apply-state.sh on Apple Silicon vz
jvgomg May 14, 2026
f6c4c6b
m-19 TASK-322.05.01: FunctionFS descriptor handshake (Tier-3 enumerat…
jvgomg May 14, 2026
fd6c3a2
m-19 Phase 4: Tier-3 safety follow-ups + USB scan + doctor polish
jvgomg May 14, 2026
be4f774
m-19 Phase 5: doctor + readiness coverage matrices
jvgomg May 15, 2026
98e500b
m-19 Phase 5d+5e: device-scope check matrices + synthesised personas
jvgomg May 15, 2026
5390544
m-19 cleanups: udev-rule detection + JSON shape symmetry + readiness …
jvgomg May 15, 2026
f609fc9
m-19 polish: persona raw fixtures via Bun asset imports + doctor summ…
jvgomg May 16, 2026
6dcd44e
update backlog
jvgomg May 16, 2026
4ee5e2b
m-18 TASK-317.12: refuse HFS+ iPods on Linux at device add; warn at d…
jvgomg May 16, 2026
01728b3
m-18 follow-up: type ReadinessResult.unsupported as discriminated union
jvgomg May 16, 2026
f5d0082
m-18 TASK-317.11: reconcile USB-inquiry + block-device discovery in d…
jvgomg May 16, 2026
a78e5fe
m-18 TASK-317.02: doctor repair correctness — force-rewrite, db-gate,…
jvgomg May 16, 2026
4a1d58d
m-18 TASK-317.02 Bug 3: route doctor failure-explanation text by chec…
jvgomg May 16, 2026
b572b9e
m-18 central docs URL builder + migrate all CLI/core docs links
jvgomg May 16, 2026
eed4126
m-18 TASK-317.14: orchestrator error message names all transports + r…
jvgomg May 16, 2026
cdebfb3
m-18 TASK-317.13: udev rule covers USB subsystem too, not just SCSI
jvgomg May 16, 2026
8910025
backlog: TASK-317.14 status + ACs
jvgomg May 16, 2026
6db8fb0
m-18 TASK-317.15: refuse device add when volumeUuid is missing or unr…
jvgomg May 16, 2026
63a69d1
m-18 TASK-317.04: detect SysInfo ModelNumStr vs firmware serial mismatch
jvgomg May 16, 2026
ec8dc85
m-18 TASK-317.03: unify unsupported-device UX across all device commands
jvgomg May 16, 2026
78b0c71
m-18 TASK-317.08: doctor renders consistent sections across device types
jvgomg May 16, 2026
863d106
backlog: mark wave 2/3 tasks Done (.03, .04, .08, .13)
jvgomg May 16, 2026
667d66b
m-18 follow-up: collapse diagnostic scope + category into 3-way union
jvgomg May 16, 2026
1d210a8
demo: stub mock-core exports for new core surface (reason builders, r…
jvgomg May 16, 2026
679bec8
m-18 follow-up: consolidate unsupported-reason into resolveIpodModel
jvgomg May 16, 2026
7d7a429
m-18 follow-up: enrich DeviceConfig.unsupported shape
jvgomg May 16, 2026
8a85651
backlog: close stale .285/.287/.288 + add TASK-341 / 342 / 343 follow…
jvgomg May 16, 2026
3a332be
m-18 follow-up: test-only synthetic volumeUuid hatch for e2e dummy ta…
jvgomg May 16, 2026
9947f2c
backlog: add TASK-344 — design `device add --no-scan` for headless/te…
jvgomg May 17, 2026
b468db7
m-18 fix: skip firmware inquiry when persisting unsupported device
jvgomg May 17, 2026
c63ffe2
lint: clear 4 pre-existing warnings
jvgomg May 17, 2026
6b04833
backlog: TASK-343 item 8 closed (lint warnings)
jvgomg May 17, 2026
49f21a1
TASK-343 item 5: enforce trailing slash on DOCS_URLS
jvgomg May 17, 2026
14458fd
TASK-343 item 1: consolidate notSupportedReason → ReadinessUnsupporte…
jvgomg May 17, 2026
4e4f55f
TASK-343 item 3 (part 1): codify DI-over-mock.module test policy
jvgomg May 17, 2026
f15f361
TASK-343 item 3 (part 2): migrate 5 mock.module callers to DI
jvgomg May 17, 2026
98a9d02
TASK-343 item 3 (stretch): canonical persona-fake builder
jvgomg May 17, 2026
7db7cf8
backlog: TASK-343 closed (session 2026-05-17)
jvgomg May 17, 2026
ddf8d47
m-19 VM Testing: SCSI synthesis + schema v2 + doctor/discovery coverage
jvgomg May 23, 2026
cd6825e
m-19 VM Testing: initialContent seeding + per-persona FFS mount + des…
jvgomg May 24, 2026
32e1ec3
Lima VMs: namespace under podkit-* + clarify purpose
jvgomg May 24, 2026
e72724c
tweak vm resource configs
jvgomg May 25, 2026
8bbfc8f
m-19 VM Testing: Phase 1 — drop tier vocab, gate VM tests via script,…
jvgomg May 25, 2026
a764afb
m-19 VM Testing: Phase 2 — split test infra into test-packages/
jvgomg May 25, 2026
d9799c3
m-19 VM Testing: Phase 3 — DevicePersona schema v3, lift expectations
jvgomg May 25, 2026
d0697ec
m-19 VM Testing: fix three path resolutions broken by Phase 2 move
jvgomg May 25, 2026
86c2902
fix: scope root tsconfig to a base config only (files: [])
jvgomg May 25, 2026
d89e0c4
fix: pin types:["bun"] on test-package tsconfigs that import bun:test
jvgomg May 25, 2026
c9cec50
fix: pin types: ["bun"] on every workspace tsconfig that imports bun:…
jvgomg May 25, 2026
1407246
fix: drop device-testing-daemon ambient bun:test shim
jvgomg May 25, 2026
7eb3d68
fix: pin bun-types as a direct devDep alongside @types/bun
jvgomg May 25, 2026
b49066d
m-19 VM Testing: fail-fast preflight, kill describe.skipIf, fix dist-…
jvgomg May 25, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
2 changes: 1 addition & 1 deletion .changeset/cli-error-shape-unified.md
Original file line number Diff line number Diff line change
Expand Up @@ -67,7 +67,7 @@ Update parsers to:

## New ergonomics

`packages/podkit-cli/src/test-utils/cli-error.ts` and `packages/e2e-tests/src/helpers/cli-error.ts` export `expectCliError` for asserting on the canonical shape in one call.
`packages/podkit-cli/src/test-utils/cli-error.ts` and `test-packages/e2e-host-tests/src/helpers/cli-error.ts` export `expectCliError` for asserting on the canonical shape in one call.

`OutputContext` now takes an optional `ExitCodeSink` (default: writes `process.exitCode`; tests use `BufferExitCodeSink` to avoid process-global mutation).

Expand Down
2 changes: 1 addition & 1 deletion .changeset/config.json
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,6 @@
"access": "public",
"baseBranch": "main",
"updateInternalDependencies": "patch",
"ignore": ["@podkit/gpod-testing", "@podkit/e2e-tests"],
"ignore": ["@podkit/gpod-testing", "@podkit/e2e-host-tests"],
"privatePackages": { "version": true, "tag": false }
}
8 changes: 8 additions & 0 deletions .changeset/consolidate-unsupported-reason.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
---
"podkit": minor
"@podkit/core": minor
"@podkit/devices-ipod": minor
"@podkit/device-types": minor
---

Consolidate the two ways podkit expressed "this device is unsupported" into one canonical shape. `ReadinessUnsupportedReason` moves to `@podkit/device-types` (its natural home), and `resolveIpodModel(bag)` now returns it directly on `IpodModel.unsupportedReason` instead of the bare-string `notSupportedReason`. The bridge functions in `@podkit/core` (`makeUnsupportedReasonFromModel`, `makeUnsupportedReasonFromAssessment`) are removed — consumers read `model.unsupportedReason` directly. Internal refactor; user-facing CLI behaviour is unchanged.
5 changes: 5 additions & 0 deletions .changeset/device-add-volume-uuid-required.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
"podkit": patch
---

`podkit device add` now refuses cleanly when an iPod's volume UUID can't be read, with a clear message + structured error code (`VOLUME_UUID_REQUIRED`). Previously a synthetic `manual-...` UUID could be persisted in config, which then broke replug detection and `podkit doctor -d <name>` lookups. Most-common cause (HFS+ on Linux) was already addressed in TASK-317.12; this is the defensive catch-all for any remaining edge cases (corrupt partition tables, unusual layouts).
5 changes: 5 additions & 0 deletions .changeset/device-config-unsupported-rich-shape.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
"podkit": minor
---

`DeviceConfig.unsupported` (the marker for devices the user added via the warn-allow flow in TASK-317.03) is now a structured object (`{ kind, confirmedAt }`) instead of a bare boolean. The `kind` captures which unsupported-reason class triggered the prompt (iOS device, hashAB nano, mass-storage with no preset, etc.) so a future reader can tell why the device was confirmed. The `confirmedAt` ISO timestamp records when. Legacy `unsupported = true` config entries are silently coerced to the new shape on load.
29 changes: 29 additions & 0 deletions .changeset/device-scan-unsupported-reason.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
---
"podkit": minor
---

`podkit device scan --format json`: rename `notSupportedReason: string` to `unsupportedReason: ReadinessUnsupportedReason` on USB-only device entries

The JSON envelope for `device scan` previously carried unsupported-device
diagnostics as a bare `notSupportedReason` string. It now matches the structured
`ReadinessUnsupportedReason` shape already used by the readiness pipeline and
`IpodModel.unsupportedReason`:

```json
{
"unsupportedReason": {
"kind": "ios-device",
"headline": "iPod Touch is not supported by podkit.",
"docsUrl": "https://jvgomg.github.io/podkit/devices/supported-devices/"
}
}
```

Consumers reading `device.notSupportedReason` should read
`device.unsupportedReason.headline` instead — the same string, just nested
under the typed payload. The change applies to both USB-only iPod entries
(touch, iPhone, iPad, nano 6G/7G, shuffle 3G/4G) and to vendor-recognised
mass-storage devices with no matching preset.

The same rename also lands on the internal `IpodIdentity` and
`IpodClassification` shapes, but those are not part of the public CLI surface.
6 changes: 6 additions & 0 deletions .changeset/diagnostic-scope-three-way.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
---
"podkit": minor
"@podkit/core": minor
---

Refactor the diagnostic-check scope model from a 2-field shape (`scope: 'system' | 'device'` + `category?: 'readiness' | 'database'`) to a single required 3-way union (`scope: 'system' | 'device-readiness' | 'database-health'`). Compile-time enforcement that every check declares which section it renders into; no more silent fallback when `category` is missing. The user-facing CLI `--scope` flag values are unchanged.
6 changes: 6 additions & 0 deletions .changeset/doctor-consistent-sections.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
---
"podkit": minor
"@podkit/core": minor
---

`podkit doctor` now renders a consistent `System` / `Device Readiness` / `Database Health` section structure across all device types. Previously, mass-storage devices (Echo Mini) collapsed everything into a single `Device Health` bucket and mis-categorised three system-scope checks. The fix audits every check's `scope` tag, adds a `category?: 'readiness' | 'database'` discriminator so device-scope checks can be routed to the right subsection, and skips `iPod Firmware Inquiry Methods` on non-iPod devices.
11 changes: 11 additions & 0 deletions .changeset/doctor-repair-correctness.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
---
"podkit": patch
"@podkit/core": patch
"@podkit/ipod-firmware": patch
---

Fix three `podkit doctor` repair correctness bugs:

- `--repair sysinfo-consistency` now overwrites a stale on-disk SysInfoExtended (previously short-circuited on file existence, reporting success without rewriting).
- `--repair sysinfo-extended` no longer requires an existing iTunesDB — repairs without a `database` requirement skip the DB open so identity-populating repairs work on freshly formatted iPods. New `'database'` value on `RepairRequirement`.
- The readiness `SysInfoExtended:` status line distinguishes a missing file from a present-but-unparseable one.
9 changes: 9 additions & 0 deletions .changeset/doctor-scope-system.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
---
"podkit": minor
---

Add `podkit doctor --scope <system|device|all>` for running host-environment checks without a registered device.

`--scope system` skips device resolution entirely and runs only the system-scope checks (FFmpeg, codec encoders, video encoder, libgpod runtime, SCSI inquiry, udev rule on Linux). Useful before plugging an iPod in for the first time, and required by the m-19 Tier-3 test harness to assert host-state against a captured `SystemState` fixture.

`--scope device` requires `-d/--device` and runs only device-scope checks. `--scope all` (default) preserves the existing combined output byte-for-byte; the legacy `--no-system` flag still applies in that mode. JSON output under `--scope system` uses a discriminator field (`scope: "system"`) so consumers can distinguish the two envelopes.
6 changes: 6 additions & 0 deletions .changeset/inquiry-orchestrator-error-detail.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
---
"podkit": patch
"@podkit/ipod-firmware": patch
---

Improve the firmware-inquiry orchestrator's failure message so users can see what went wrong without `-vv`. The default error now names every transport attempted (USB, SCSI) with each one's failure reason on its own line and includes a remediation hint (e.g. `podkit doctor --repair udev-rule` for EACCES on `/dev/sg*` or `/dev/bus/usb/...`). The orchestrator also no longer short-circuits a planned SCSI fallback when USB hits a permission wall — both transports run if the plan calls for it.
6 changes: 6 additions & 0 deletions .changeset/reconcile-discovery.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
---
"podkit": minor
"@podkit/core": minor
---

Reconcile USB-inquiry and block-device discovery so each connected iPod renders once in `podkit device scan`. Previously, `device scan` could surface the same physical iPod twice on Linux when both pipelines independently identified it. The orphan entry also surfaced a destructive remediation (`Needs partitioning — see: podkit device init`) on a healthy device. Both issues fixed: a new reconciliation primitive matches USB and block-device records by serial number (or disk identifier as fallback), and the readiness-failure copy now points at docs instead of suggesting an inappropriate command.
12 changes: 12 additions & 0 deletions .changeset/refuse-hfsplus-on-linux.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
---
"podkit": minor
"@podkit/core": minor
---

Refuse HFS+ iPods on Linux at `device add`; warn at `device scan`

iPods formatted as HFS+ are now refused on Linux at `podkit device add` time, with a clear message pointing at docs explaining how to reformat to FAT32. `podkit device scan` surfaces the same iPods with a `Filesystem not supported on Linux` warning instead of running readiness stages or suggesting destructive remediation. macOS HFS+ behaviour is unchanged.

Why: the Linux kernel hfsplus driver refuses RW on journaled HFS+ (the iPod default), udev/blkid don't surface a filesystem UUID for HFS+ on Linux (breaking podkit's identity model), and udisksctl mount paths fall back to a generic name with no label. Each friction point has a partial fix; together they mean Linux + HFS+ is a second-class experience no matter how much we patch. Refusing cleanly with a docs link sharpens podkit's Linux story to "FAT32 iPods, supported well."

Structured `--json` output preserves a stable error code (`UNSUPPORTED_FILESYSTEM_ON_LINUX`) so scripted callers can handle the refusal.
6 changes: 6 additions & 0 deletions .changeset/sysinfo-modelnum-mismatch-check.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
---
"podkit": patch
"@podkit/core": patch
---

New `podkit doctor` check `sysinfo-modelnum-mismatch` detects when the on-disk classic SysInfo file's `ModelNumStr` disagrees with the firmware-derived identity (e.g. SysInfo manually edited, or files copied from another iPod). Offers `--repair sysinfo-modelnum-mismatch` to overwrite the on-disk file with firmware-derived data. Identified during the TERAPOD (iPod 5G with iFlash mod) inventory pass — the SysInfo claimed `MA147` (5G) while the serial said `V9M`/`A446` (5.5G).
6 changes: 6 additions & 0 deletions .changeset/udev-rule-usb-subsystem.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
---
"podkit": patch
"@podkit/core": patch
---

Extend the podkit udev rule to grant Apple-vendor USB device access (`/dev/bus/usb/<bus>/<dev>`) in addition to the existing SCSI generic (`/dev/sg*`) coverage. Linux libusb-based firmware inquiry now works without sudo from SSH sessions, headless boxes, Docker containers, and CI — the SSH-session permission gap previously closed only the SCSI half. `podkit doctor --repair udev-rule` installs the extended rule and cleans up any legacy filename from previous installs.
17 changes: 17 additions & 0 deletions .changeset/unsupported-device-cascade.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
---
"podkit": minor
"@podkit/core": minor
---

Unify the unsupported-device UX across `podkit device add`, `device scan`, `device info`, `sync`, and `doctor`. Every command now composes identity via the same cascade primitive (`resolveIpodModel(bag)`) — no command re-implements the check, no command leaks `libgpod` into user-facing copy.

Key behaviour changes:
- `device add` on an unsupported device (hashAB nano, etc.) now asks "Add anyway? [y/N]" rather than hard-refusing. Confirmed devices are recorded with `unsupported: true` in config; `--yes` flips the default to accept.
- `device add` against an iOS device (iPod touch) now surfaces the canonical unsupported message instead of the generic "No iPod devices found".
- `device scan` headers show the resolved model name (e.g. "iPod touch 5th generation") instead of "Unknown iPod (USB only)".
- `sync --dry-run` refuses cleanly on unsupported devices with the canonical message — no track plan generated.
- `sync` on a supported device with SysInfoExtended present resolves identity via the cascade; the legacy "Could not identify iPod model" warning is gone for that case.
- `device info` renders the cascade `displayName` instead of the libgpod-derived `info.device.modelName`.
- `doctor` on an unsupported device suppresses repair suggestions that would mutate device state and surfaces the canonical unsupported message instead.

Wording is centralised in `@podkit/core` (`makeUnsupportedReasonFromAssessment` / `makeUnsupportedReasonFromModel`) — every consumer imports.
8 changes: 7 additions & 1 deletion .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -50,4 +50,10 @@ test/manual-collection/
SCRATCH.md

.claude/worktrees
branding/
branding/

# Bun --compile temp files (occasionally orphaned with 000 perms after kill -9)
*.bun-build

# Locally-built native bindings (published via prebuild.yml CI, never committed)
packages/libgpod-node/prebuilds/
32 changes: 23 additions & 9 deletions AGENTS.md
Original file line number Diff line number Diff line change
Expand Up @@ -10,24 +10,33 @@ Instructions for AI agents (Claude Code, Cursor, etc.) working in this repositor

**Monorepo structure:**
```
packages/
packages/ # Published / published-adjacent packages
├── compatibility/ # Cross-version compatibility helpers
├── demo/ # Animated GIF demo (VHS + mocked CLI build)
├── device-types/ # Shared TypeScript types for device capabilities, identity, firmware
├── devices-ipod/ # Pure TypeScript iPod generation tables + capability synthesis (no libgpod)
├── devices-mass-storage/ # User-extensible mass-storage preset framework (Echo Mini, Rockbox, generic)
├── e2e-tests/ # End-to-end CLI tests (dummy + real iPod)
├── gpod-testing/ # Test utilities for iPod environments (no hardware needed)
├── docs-site/ # Documentation site (Starlight/Astro)
├── ipod-avatar/ # iPod avatar image assets
├── ipod-db/ # Pure TypeScript iTunesDB/ArtworkDB parser (browser-compatible)
├── ipod-firmware/ # iPod firmware inquiry — SCSI via koffi (SG_IO/IOKit), USB via the `usb` npm package
├── ipod-web/ # Virtual iPod UI — React + Jotai web component
├── libgpod-node/ # Native Node.js bindings for libgpod (database operations only; no USB/libusb)
├── podkit-core/ # Core sync logic, adapters, transcoding
├── podkit-cli/ # Command-line interface
├── podkit-docker/ # Docker image (Dockerfile, entrypoint, compose files)
├── test-fixtures/ # Test fixture generator (FLAC files with controllable metadata/artwork)
├── podkit-daemon/ # Background sync daemon
├── virtual-ipod-app/ # Tauri macOS app — frameless iPod-shaped window
└── virtual-ipod-server/ # Lima VM backend — USB gadget + REST/WebSocket API

test-packages/ # Testing infrastructure (private, not published)
├── device-testing/ # VM test harness — DevicePersona + SystemState registries, TestRuntime, Lima yamls, apply-state.sh
├── device-testing-daemon/ # FunctionFS userspace daemon — synthesises iPod USB gadget on dummy_hcd
├── e2e-host-tests/ # End-to-end CLI tests on the host (dummy + real iPod)
├── e2e-vm-tests/ # End-to-end podkit feature tests inside the Lima VM
├── gpod-testing/ # Test utilities for iPod environments (no hardware needed)
└── test-fixtures/ # Test fixture generator (FLAC files with controllable metadata/artwork)

tools/
├── demo/ # Live demo documentation for the virtual iPod system
├── gpod-tool/ # C CLI for iPod database operations
Expand Down Expand Up @@ -199,7 +208,7 @@ The virtual iPod system creates a synthetic iPod for demonstrating podkit. It co
- `@podkit/virtual-ipod-server` — Runs inside a Lima VM. Manages USB gadget via configfs + dummy_hcd (Apple vendor/product IDs). Serves iPod filesystem over REST + WebSocket. podkit sees the virtual device as a real iPod with zero code changes.
- `@podkit/virtual-ipod-app` — Tauri v2 macOS app. Frameless transparent window shaped like an iPod. Manages Lima VM lifecycle.

**Lima VM (`tools/lima/virtual-ipod.yaml`):**
**Lima VM (`tools/lima/podkit-virtual-ipod.yaml`):**
- Debian 12 with dummy_hcd + configfs USB gadget support
- `mise run vipod:install` rsyncs source to `/opt/podkit/` (VM-local, won't touch macOS node_modules), builds, and installs podkit binary to `/usr/local/bin`
- `mise run vipod:shell` drops into an isolated `james@lima-virtual-ipod:~$` with podkit in PATH and tab completion
Expand Down Expand Up @@ -241,12 +250,17 @@ Key files to understand:
| CLI entry | `packages/podkit-cli/src/main.ts` |
| Core library | `packages/podkit-core/src/index.ts` |
| libgpod bindings | `packages/libgpod-node/src/index.ts` |
| Test utilities | `packages/gpod-testing/src/index.ts` |
| E2E test helpers | `packages/e2e-tests/src/helpers/index.ts` |
| Test utilities | `test-packages/gpod-testing/src/index.ts` |
| E2E test helpers | `test-packages/e2e-host-tests/src/helpers/index.ts` |
| VM test harness | `test-packages/device-testing/src/index.ts` |
| VM test entry | `test-packages/e2e-vm-tests/src/` |
| FunctionFS daemon | `test-packages/device-testing-daemon/src/main.ts` |
| VM test Lima configs | `test-packages/device-testing/lima/` |
| apply-state.sh | `test-packages/device-testing/scripts/apply-state.sh` |
| gpod-tool CLI | `tools/gpod-tool/gpod-tool.c` |
| Demo build | `packages/demo/build.ts` |
| Demo tape | `packages/demo/demo.tape` |
| Test fixture generator | `packages/test-fixtures/src/index.ts` |
| Test fixture generator | `test-packages/test-fixtures/src/index.ts` |
| Docker entrypoint | `packages/podkit-docker/entrypoint.sh` |
| Dockerfile | `packages/podkit-docker/Dockerfile` |
| Linux device manager | `packages/podkit-core/src/device/platforms/linux.ts` |
Expand All @@ -261,7 +275,7 @@ Key files to understand:
| Virtual iPod server | `packages/virtual-ipod-server/src/main.ts` |
| Virtual iPod USB gadget | `packages/virtual-ipod-server/src/gadget.ts` |
| Virtual iPod Tauri app | `packages/virtual-ipod-app/src/App.tsx` |
| Virtual iPod Lima config | `tools/lima/virtual-ipod.yaml` |
| Virtual iPod Lima config | `tools/lima/podkit-virtual-ipod.yaml` |
| Live demo guide | `tools/demo/README.md` |
| Device-types entry | `packages/device-types/src/index.ts` |
| iPod identity | `packages/devices-ipod/src/identity.ts` |
Expand Down
Loading
Loading