Update the loop_api.test.js regex to tolerate JSDoc cast prefixes on
the slopsmith Object.assign line (needed when files opt into @ts-check
with \`/** @type */ (\\) casts). Adjust slopsmith.d.ts to remove
psarc from the format union (feedback repo is sloppak/loose-only).
The full JSDoc annotations for static/app.js and static/highway.js from
slopsmith/slopsmith#293 require adaptation to the feedback repo's
diverged codebase (v3 UI, capability pipelines, etc.). Files do not
carry \`// @ts-check\` yet, so typecheck passes trivially; the
annotations will be added incrementally in follow-up PRs.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
- Constitution II: permit `tsc --noEmit` with allowJs/checkJs as a
CI/dev-time check and encourage JSDoc + `// @ts-check`; emit-mode
TypeScript, .ts/.tsx source, JSX, frameworks, and bundlers stay
forbidden in core. Bump version 1.0.0 -> 1.1.0.
- Constitution IV: add static/slopsmith.d.ts to the stable-contract
surface -- breaking changes need a "Migration notes" CHANGELOG entry.
- CHANGELOG: note the typecheck step + ambient .d.ts under [Unreleased].
- CLAUDE.md: point the Frontend Conventions section at slopsmith.d.ts
as the typed plugin-contract source of truth.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Declares the plugin-facing JS surface as ambient types: window.slopsmith
(event bus + audio/diagnostics namespaces), window.highway (the full
createHighway() renderer API), the highway WebSocket message union
(discriminated on `type`, matching the switch in highway.js), the
setRenderer visualization contract + draw(bundle) shape, and the
keyboard-shortcut API.
Signatures verified against the live source: the `return api` object
at the tail of createHighway(), the `window.slopsmith = Object.assign`
block in app.js, audio-mixer.js, diagnostics.js, and the shortcut
registry in app.js.
Declarations only -- no file carries `// @ts-check` yet, so typecheck
stays trivially green. `tsc --noEmit --listFiles` confirms the .d.ts
is in the program and static/vendor/** is not.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Adopt JSDoc + // @ts-check + `tsc --noEmit` as a CI/dev-only type
check. No emit step, no runtime dependency: shipped .js files stay
byte-identical, typescript is a devDependency only.
- tsconfig.json: allowJs + checkJs:false so only files carrying an
explicit `// @ts-check` directive are checked; strict mode; DOM libs.
`include` matches static/**/*.d.ts so the upcoming ambient contract
is loaded into the program. moduleDetection is left at the default
`auto` on purpose -- app.js/highway.js carry no import/export and
must stay global scripts so cross-file globals resolve.
- package.json: typescript devDep + `npm run typecheck`.
- tests.yml: setup-node + `npm ci` + typecheck step before pytest.
This also gives the existing JS plugin-API test step an explicit
Node toolchain.
No file carries `// @ts-check` yet, so typecheck passes trivially.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
- diagnostics_redact: keep '.psarc' in the song-filename scrub regex.
The purge swapped it for '.archive' (not a real extension), which
would leak real .psarc filenames still on users' disks into
diagnostic bundles. This is a redaction allow-list, not brand text.
- sloppak: the legacy lyrics-source alias was a no-op
({"notechart": "notechart"}), so old manifests with
lyrics_source=="sng" fell back to "xml" instead of migrating.
Map {"sng": "notechart"} so the rename stays back-compatible.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>