run typecheck in ci
Some checks are pending
CI / Validate (push) Waiting to run

This commit is contained in:
dirtydishes 2026-05-29 02:29:45 -04:00
parent e9e2723c28
commit 739a534ac2
5 changed files with 243 additions and 0 deletions

View file

@ -24,6 +24,7 @@
{"_type":"issue","id":"islandflow-ayo","title":"Drop stale backlog events from live fanout","description":"Follow-up to live freshness rollout: /ws/live was still fanning out stale backlog events for freshness-gated channels, which kept tape panes in Live feed behind despite active synthetic ingest. Gate fanout and cache ingest by freshness for options/nbbo/equities/flow.","status":"closed","priority":1,"issue_type":"bug","assignee":"dirtydishes","owner":"dishes@dpdrm.com","created_at":"2026-04-28T21:26:39Z","created_by":"dirtydishes","updated_at":"2026-04-28T21:26:44Z","started_at":"2026-04-28T21:26:44Z","closed_at":"2026-04-28T21:26:44Z","close_reason":"Completed","dependency_count":0,"dependent_count":0,"comment_count":0}
{"_type":"issue","id":"islandflow-0v6","title":"Fix tape freshness, NBBO coverage, pause controls, and filter popup","description":"Implement the tape fixes requested for synthetic options notional sizing, strict live freshness, live-mode pause/resume behavior, stronger NBBO snapshot coverage, and moving flow filters behind a popup. Includes server-side live cache changes, web terminal state/UI changes, and tests for synthetic pricing, live snapshot freshness/NBBO retention, and live pause/filter interactions.","status":"closed","priority":1,"issue_type":"task","assignee":"dirtydishes","owner":"dishes@dpdrm.com","created_at":"2026-04-28T21:02:52Z","created_by":"dirtydishes","updated_at":"2026-04-28T21:13:38Z","started_at":"2026-04-28T21:02:57Z","closed_at":"2026-04-28T21:13:38Z","close_reason":"Completed","dependency_count":0,"dependent_count":0,"comment_count":0}
{"_type":"issue","id":"islandflow-e4r","title":"Implement smart-money flow filtering and synthetic firehose modes","description":"Implement the approved multi-surface plan for named synthetic market profiles, options raw-vs-signal filtering, live/API filter contracts, Tape page client-side flow filters, firehose-readiness improvements, tests, and README updates.","status":"closed","priority":1,"issue_type":"feature","assignee":"dirtydishes","owner":"dishes@dpdrm.com","created_at":"2026-04-28T20:10:49Z","created_by":"dirtydishes","updated_at":"2026-04-28T20:29:29Z","started_at":"2026-04-28T20:10:53Z","closed_at":"2026-04-28T20:29:29Z","close_reason":"Implemented synthetic market profiles, options signal-path filtering, signal-aware API/replay contracts, Tape page filters, tests, and README updates. Follow-up tracked in islandflow-biq.","dependency_count":0,"dependent_count":0,"comment_count":0}
{"_type":"issue","id":"islandflow-444","title":"Add typecheck to Forgejo CI","description":"Forgejo CI already validates PRs and pushes to main, but it does not run the new repository-wide typecheck gate. Add bun run typecheck before tests so type drift fails early in CI.","status":"closed","priority":2,"issue_type":"task","assignee":"dirtydishes","owner":"dishes@dpdrm.com","created_at":"2026-05-29T06:27:47Z","created_by":"dirtydishes","updated_at":"2026-05-29T06:29:33Z","started_at":"2026-05-29T06:27:49Z","closed_at":"2026-05-29T06:29:33Z","close_reason":"Added repository typecheck to the Forgejo PR/main CI workflow.","dependency_count":0,"dependent_count":0,"comment_count":0}
{"_type":"issue","id":"islandflow-wvz","title":"Add repository typecheck command","description":"The repository has TypeScript tsconfig files across apps, services, and packages, but no root command that runs typechecking consistently. Add a Bun-first typecheck entry point and validate it.","status":"closed","priority":2,"issue_type":"task","assignee":"dirtydishes","owner":"dishes@dpdrm.com","created_at":"2026-05-29T06:11:57Z","created_by":"dirtydishes","updated_at":"2026-05-29T06:19:09Z","started_at":"2026-05-29T06:12:02Z","closed_at":"2026-05-29T06:19:09Z","close_reason":"Added and validated a repository-wide Bun typecheck command.","dependency_count":0,"dependent_count":0,"comment_count":0}
{"_type":"issue","id":"islandflow-ddm","title":"Redesign home as command deck","description":"Implement the mock1-inspired production command deck on / while preserving focused /options and /news workspaces plus existing legacy redirects. Scope includes apps/web terminal layout, production command-deck CSS, validation, turn documentation, and Forgejo publish.","notes":"Scope: redesign / as a mock1-inspired production command deck using live useTerminal state and existing panes; preserve /options, /news, /mock1, and current legacy redirects. Leave unrelated apps/web/next-env.d.ts and piolium/ changes untouched.","status":"closed","priority":2,"issue_type":"feature","assignee":"dirtydishes","owner":"dishes@dpdrm.com","created_at":"2026-05-28T08:59:14Z","created_by":"dirtydishes","updated_at":"2026-05-28T09:09:43Z","started_at":"2026-05-28T08:59:29Z","closed_at":"2026-05-28T09:09:43Z","close_reason":"Implemented / as a mock1-inspired production command deck using live terminal state, preserved focused /options and /news routes plus legacy redirects, validated tests/build/screenshots, and documented the turn.","dependency_count":0,"dependent_count":0,"comment_count":0}
{"_type":"issue","id":"islandflow-4xb","title":"Create dashboard structure mock routes","description":"Prototype four alternate islandflow dashboard structures at /mock1 through /mock4 based on the supplied reference so the main dashboard direction can be evaluated live.","status":"closed","priority":2,"issue_type":"feature","assignee":"dirtydishes","owner":"dishes@dpdrm.com","created_at":"2026-05-28T08:30:33Z","created_by":"dirtydishes","updated_at":"2026-05-28T08:38:35Z","started_at":"2026-05-28T08:30:39Z","closed_at":"2026-05-28T08:38:35Z","close_reason":"Added four dashboard mock routes, documented the implementation, and validated build/tests plus route responses.","dependency_count":0,"dependent_count":0,"comment_count":0}

View file

@ -35,6 +35,9 @@ jobs:
- name: Install dependencies
run: ~/.bun/bin/bun install --frozen-lockfile
- name: Run typecheck
run: ~/.bun/bin/bun run typecheck
- name: Run tests
run: ~/.bun/bin/bun test

View file

@ -8,6 +8,9 @@
"@pierre/diffs": "^1.2.2",
},
"devDependencies": {
"@types/bun": "^1.3.3",
"@types/ws": "^8.18.1",
"typescript": "^5.9.3",
"typescript-language-server": "^5.1.3",
},
},
@ -426,6 +429,8 @@
"@tootallnate/once": ["@tootallnate/once@2.0.1", "", {}, "sha512-HqmEUIGRJ5fSXchkVgR5F7qn48bDBzv0kWj/Kfu5e6uci4UlEeng4331LnBkWffb++Ei3FOVLxo8JJWMFBDMeQ=="],
"@types/bun": ["@types/bun@1.3.14", "", { "dependencies": { "bun-types": "1.3.14" } }, "sha512-h1hFqFVcvAvD9j9K7ZW7vd82aSA+rTdznZa+5bwvCwqSB1jmmfLcbIWhOLx1/+boy/xmjgCs/OMUL8hRJSmnPw=="],
"@types/cacheable-request": ["@types/cacheable-request@6.0.3", "", { "dependencies": { "@types/http-cache-semantics": "*", "@types/keyv": "^3.1.4", "@types/node": "*", "@types/responselike": "^1.0.0" } }, "sha512-IQ3EbTzGxIigb1I3qPZc1rWJnH0BmSKv5QYTalEwweFvyBDLSAe24zP0le/hyi7ecGfZVlIVAg4BZqb8WBwKqw=="],
"@types/eslint": ["@types/eslint@9.6.1", "", { "dependencies": { "@types/estree": "*", "@types/json-schema": "*" } }, "sha512-FXx2pKgId/WyYo2jXw63kk7/+TY7u7AziEJxJAnSFzHlqTAS3Ync6SvgYAN/k4/PQpnnVuzoMuVnByKK2qp0ag=="],
@ -458,6 +463,8 @@
"@types/wrap-ansi": ["@types/wrap-ansi@3.0.0", "", {}, "sha512-ltIpx+kM7g/MLRZfkbL7EsCEjfzCcScLpkg37eXEtx5kmrAKBkTJwd1GIAjDSL8wTpM6Hzn5YO4pSb91BEwu1g=="],
"@types/ws": ["@types/ws@8.18.1", "", { "dependencies": { "@types/node": "*" } }, "sha512-ThVF6DCVhA8kUGy+aazFQ4kXQ7E1Ty7A3ypFOe0IcJV8O/M511G99AW24irKrW56Wt44yG9+ij8FaqoBGkuBXg=="],
"@types/yauzl": ["@types/yauzl@2.10.3", "", { "dependencies": { "@types/node": "*" } }, "sha512-oJoftv0LSuaDZE3Le4DbKX+KS9G36NzOeSap90UIK0yMA/NhKJhqlSGtNDORNRaIbQfzjXDrQa0ytJ6mNRGz/Q=="],
"@ungap/structured-clone": ["@ungap/structured-clone@1.3.1", "", {}, "sha512-mUFwbeTqrVgDQxFveS+df2yfap6iuP20NAKAsBt5jDEoOTDew+zwLAOilHCeQJOVSvmgCX4ogqIrA0mnyr08yQ=="],
@ -552,6 +559,8 @@
"buffer-from": ["buffer-from@1.1.2", "", {}, "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ=="],
"bun-types": ["bun-types@1.3.14", "", { "dependencies": { "@types/node": "*" } }, "sha512-4N0ig0fEomHt5R0KCFWjovxow98rIoRwKolrYdCcknNwMekCXRnWEUvgu5soYV8QXtVsrUD8B95MBOZGPvr6KQ=="],
"cacache": ["cacache@16.1.3", "", { "dependencies": { "@npmcli/fs": "^2.1.0", "@npmcli/move-file": "^2.0.0", "chownr": "^2.0.0", "fs-minipass": "^2.1.0", "glob": "^8.0.1", "infer-owner": "^1.0.4", "lru-cache": "^7.7.1", "minipass": "^3.1.6", "minipass-collect": "^1.0.2", "minipass-flush": "^1.0.5", "minipass-pipeline": "^1.2.4", "mkdirp": "^1.0.4", "p-map": "^4.0.0", "promise-inflight": "^1.0.1", "rimraf": "^3.0.2", "ssri": "^9.0.0", "tar": "^6.1.11", "unique-filename": "^2.0.0" } }, "sha512-/+Emcj9DAXxX4cwlLmRI9c166RuL3w30zp4R7Joiv2cQTtTtA+jeuCAjH3ZlGnYS3tKENSrKhAzVVP9GVyzeYQ=="],
"cacheable-lookup": ["cacheable-lookup@5.0.4", "", {}, "sha512-2/kNscPhpcxrOigMZzbiWF7dz8ilhb/nIHU3EyZiXWXpeq/au8qJ8VhdftMkty3n7Gj6HIGalQG8oiBNB3AJgA=="],

View file

@ -20,11 +20,15 @@
"deploy": "bun run scripts/deploy.ts",
"deploy:main": "./deploy main",
"deploy:current-branch": "./deploy current-branch",
"typecheck": "bun run scripts/typecheck.ts",
"check:public-api-routes": "bun run scripts/check-public-api-routes.ts",
"sync:docker-workspace": "bun run scripts/sync-docker-workspace.ts",
"check:docker-workspace": "bun run scripts/check-docker-workspace.ts"
},
"devDependencies": {
"@types/bun": "^1.3.3",
"@types/ws": "^8.18.1",
"typescript": "^5.9.3",
"typescript-language-server": "^5.1.3"
},
"overrides": {

View file

@ -0,0 +1,226 @@
<!doctype html>
<html lang="en">
<head>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1" />
<title>Add typecheck to CI</title>
<style>
:root {
color-scheme: light;
--bg: oklch(0.984 0.006 230);
--ink: oklch(0.22 0.018 240);
--muted: oklch(0.46 0.018 240);
--line: oklch(0.88 0.012 240);
--panel: oklch(0.998 0.003 240);
--accent: oklch(0.5 0.115 230);
--accent-soft: oklch(0.93 0.034 230);
}
* {
box-sizing: border-box;
}
body {
margin: 0;
background: var(--bg);
color: var(--ink);
font-family:
Inter, ui-sans-serif, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", sans-serif;
line-height: 1.58;
}
main {
width: min(1040px, calc(100% - 40px));
margin: 0 auto;
padding: 56px 0 72px;
}
header {
border-bottom: 1px solid var(--line);
margin-bottom: 34px;
padding-bottom: 28px;
}
.eyebrow {
color: var(--accent);
font-size: 0.78rem;
font-weight: 700;
letter-spacing: 0.08em;
text-transform: uppercase;
}
h1 {
font-size: clamp(2rem, 5vw, 4rem);
line-height: 1;
margin: 10px 0 18px;
max-width: 900px;
}
h2 {
border-top: 1px solid var(--line);
font-size: 1.15rem;
margin: 34px 0 10px;
padding-top: 22px;
}
p,
li {
color: var(--muted);
max-width: 76ch;
}
strong {
color: var(--ink);
}
code {
color: oklch(0.25 0.025 240);
font-family: "SFMono-Regular", Consolas, "Liberation Mono", monospace;
font-size: 0.92em;
}
pre {
background: var(--panel);
border: 1px solid var(--line);
border-radius: 8px;
overflow-x: auto;
padding: 16px;
}
.summary {
background: var(--accent-soft);
border: 1px solid oklch(0.83 0.04 230);
border-radius: 8px;
padding: 18px 20px;
}
.meta {
display: flex;
flex-wrap: wrap;
gap: 10px;
margin-top: 20px;
}
.pill {
background: var(--panel);
border: 1px solid var(--line);
border-radius: 999px;
color: var(--muted);
font-size: 0.85rem;
padding: 6px 10px;
}
</style>
</head>
<body>
<main>
<header>
<div class="eyebrow">Turn document</div>
<h1>Add typecheck to Forgejo CI</h1>
<p class="summary">
Updated the Forgejo CI workflow so PRs and pushes to <code>main</code> install dependencies, run the
repository-wide typecheck, run tests, verify the Docker workspace snapshot, and build the production web app.
</p>
<div class="meta">
<span class="pill">Created: 2026-05-29 02:28 EDT</span>
<span class="pill">Beads: islandflow-444</span>
<span class="pill">Validation: full CI-equivalent gates passed locally</span>
</div>
</header>
<section>
<h2>Summary</h2>
<p>
The existing Forgejo CI workflow already ran on pull requests and pushes to <code>main</code>. This change adds
the new <code>bun run typecheck</code> command before tests so TypeScript drift fails early.
</p>
</section>
<section>
<h2>Changes Made</h2>
<ul>
<li>Added a <code>Run typecheck</code> step to <code>.forgejo/workflows/ci.yml</code>.</li>
<li>Kept the existing CI order otherwise: dependency install, tests, Docker workspace snapshot check, web production build.</li>
<li>Synced <code>deployment/docker/workspace-root</code> so the Docker snapshot check includes the new typecheck script and dev dependencies from the root workspace.</li>
</ul>
</section>
<section>
<h2>Context</h2>
<p>
The repo now has a root typecheck command. CI needed to run that command automatically for PRs and pushes to
<code>main</code>, matching the validation sequence discussed for normal development and release readiness.
</p>
</section>
<section>
<h2>Important Implementation Details</h2>
<p>
Typecheck runs immediately after <code>bun install --frozen-lockfile</code>. That placement keeps failures
clear and quick: dependency resolution is proven first, then TypeScript correctness, then behavior tests and
production web build validation.
</p>
</section>
<section>
<h2>Relevant Diff Snippets</h2>
<p>
Attempted to use <code>@pierre/diffs</code> previously, but the installed package exposes library exports and
no executable CLI. These snippets use the plain diff fallback.
</p>
<pre><code>diff --git a/.forgejo/workflows/ci.yml b/.forgejo/workflows/ci.yml
@@
- name: Install dependencies
run: ~/.bun/bin/bun install --frozen-lockfile
+ - name: Run typecheck
+ run: ~/.bun/bin/bun run typecheck
+
- name: Run tests
run: ~/.bun/bin/bun test</code></pre>
<pre><code>diff --git a/deployment/docker/workspace-root/package.json b/deployment/docker/workspace-root/package.json
@@
+ "typecheck": "bun run scripts/typecheck.ts",
@@
+ "@types/bun": "^1.3.3",
+ "@types/ws": "^8.18.1",
+ "typescript": "^5.9.3",</code></pre>
</section>
<section>
<h2>Expected Impact for End-Users</h2>
<p>
Contributors get faster feedback when a PR or <code>main</code> push breaks TypeScript. Production web build
validation remains part of the same workflow, so UI deploy readiness is still checked before the workflow
succeeds.
</p>
</section>
<section>
<h2>Validation</h2>
<ul>
<li><code>bun run typecheck</code> passed.</li>
<li><code>bun test</code> passed: 250 tests, 0 failures.</li>
<li><code>bun run check:docker-workspace</code> passed after syncing the snapshot.</li>
<li><code>bun --cwd=apps/web run build</code> passed.</li>
</ul>
</section>
<section>
<h2>Issues, Limitations, and Mitigations</h2>
<p>
This is still a single validation job rather than multiple independent jobs. That keeps the workflow simple and
preserves ordering, but it means later checks wait for earlier checks to finish. Parallelization can be added
later if runtime becomes a problem.
</p>
</section>
<section>
<h2>Follow-up Work</h2>
<p>
No required follow-up remains for this task. Existing issue <code>islandflow-3ys</code> still tracks broader CI
expansion such as Docker image builds and service-container integration tests.
</p>
</section>
</main>
</body>
</html>