@wenathlan/cobaia 2.0.163 → 2.0.165

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md CHANGED
@@ -1,5 +1,17 @@
1
1
  # Cobaia release notes
2
2
 
3
+ ## 2.0.162 — the depsunion rung (the eleven manifests answer one dependency union)
4
+
5
+ ### Changed
6
+
7
+ | Area | Change |
8
+ | --- | --- |
9
+ | The dependency union | Cobaia carries the synchronized family manifest: the eleven official apps and the root envelope answer the identical union — 30 dependencies and 94 devDependencies — and no seat loses a row; the internal family pins ride the ~2.0.155 tilde floor everywhere (the devthink drift of ~2.0.159/~2.0.160 returns to the family number). |
10
+ | The engine catalog | The engines block answers 25 rows: Babel (^7.28.0) joins Bun, Cargo, CorePack, Deno and PNPM beside the V 0.5.2 catalog entry (catalog only, the PR4 law), Node stays the maestro orchestrating the engine ladder with priority for its natives, and Python / Go / Rust / Cargo / PNPM / V stay allowed. |
11
+ | The overrides union | The overrides block syncs to the family's 18 rows — the saddle xcode uuid pin and the @grpc/grpc-js 1.14.5 floor reach every manifest beside the root envelope. |
12
+ | The lockfile law | The per-app lockfiles stay as tracked (bun.lock, pnpm-lock.yaml, package-lock.json where present); the sync creates no new lockfile and pnpm-lock.yaml keeps the single-lockfile example seat. |
13
+ | The storage layer | better-sqlite3 (^13.0.3) stays in the checklist as the storage layer for the database and cache seats. |
14
+
3
15
  ## 2.0.158 — the docstd rung (the document family answers one template)
4
16
 
5
17
  ### Changed
package/Dockerfile CHANGED
@@ -1,4 +1,4 @@
1
- # cobaia 2.0.134 — THE SITE CONTAINER FILE
1
+ # cobaia 2.0.165 — THE SITE CONTAINER FILE
2
2
  #
3
3
  # The family container doctrine in the sol shape: one versioned static
4
4
  # container per site. The sol theme builds inside the container — stage one
@@ -10,7 +10,7 @@
10
10
 
11
11
  FROM node:26-alpine@sha256:40cd011b55415bc894e45b02fdd5a5dfde056921b7d23a64c74f80497af48797 AS solbuild
12
12
 
13
- ARG COBAIA_VERSION=2.0.134
13
+ ARG COBAIA_VERSION=2.0.165
14
14
 
15
15
  # The family context fix (the staged shape the site containers read): the
16
16
  # application rides the context nested under app/ with the sibling sources
@@ -30,7 +30,7 @@ RUN pnpm build
30
30
 
31
31
  FROM nginxinc/nginx-unprivileged:1.29-alpine@sha256:0c79d56aee561a1d81c63f00eee5fb5fe29279560cdc55e91425133104c7fbe6
32
32
 
33
- ARG COBAIA_VERSION=2.0.134
33
+ ARG COBAIA_VERSION=2.0.165
34
34
 
35
35
  LABEL org.opencontainers.image.title="cobaia" \
36
36
  org.opencontainers.image.description="cobaia — the monetization surface: the ads, the plans and the conversion, kept apart from the main sites." \
package/bun.lock CHANGED
@@ -138,6 +138,7 @@
138
138
  },
139
139
  },
140
140
  "overrides": {
141
+ "@grpc/grpc-js": "1.14.5",
141
142
  "body-parser": "^2.4.0",
142
143
  "deepmerge-ts": "^8.0.0",
143
144
  "esbuild": "^0.28.2",
@@ -304,7 +305,7 @@
304
305
 
305
306
  "@griffel/style-types": ["@griffel/style-types@1.4.3", "", { "dependencies": { "csstype": "^3.2.3" } }, "sha512-sFxMK19oFUPQSmyCKT1Pvj5Nu/ODvhMczqhGjVAoksDTXUj1za40WA0CXqV3o+xxKWPec+K/rbS78jJLmomsQA=="],
306
307
 
307
- "@grpc/grpc-js": ["@grpc/grpc-js@1.14.6", "", { "dependencies": { "@grpc/proto-loader": "^0.8.0", "@js-sdsl/ordered-map": "^4.4.2" } }, "sha512-SgC/B3/VZ8lTyOZ4Cwk6f1skWhmkNAaVfiX90qd5u1rRXGKk1//8FTUEN9GvOUq7rfWIqAYkA3CoyumYVpOS6g=="],
308
+ "@grpc/grpc-js": ["@grpc/grpc-js@1.14.5", "", { "dependencies": { "@grpc/proto-loader": "^0.8.0", "@js-sdsl/ordered-map": "^4.4.2" } }, "sha512-7VZM+SVdEcUUqSQeNI3zM8Qs/BhQKZndPo2h5VkYkAM8Iz0wJIa8mKV5ekQGqG8UUsnkQ0NMxIxwkIHYvj0qOw=="],
308
309
 
309
310
  "@grpc/proto-loader": ["@grpc/proto-loader@0.7.15", "", { "dependencies": { "lodash.camelcase": "^4.3.0", "long": "^5.0.0", "protobufjs": "^7.2.5", "yargs": "^17.7.2" }, "bin": { "proto-loader-gen-types": "build/bin/proto-loader-gen-types.js" } }, "sha512-tMXdRCfYVixjuFK+Hk0Q1s38gV9zDiDJfWL3h1rv4Qc39oILCu1TRTDt7+fGUI8K4G1Fj125Hx/ru3azECWTyQ=="],
310
311
 
package/cli.ts CHANGED
@@ -8,7 +8,10 @@
8
8
  * @module cobaia/cli
9
9
  * @family wave/clibin
10
10
  * @law same design as web / desktop, difference only responsiveness / DPI
11
- * @seat 2026 · rung 2.0.157 · hierarchical JSDoc, tokens/flags, no hardcoded
11
+ * @dpi native detection, never XDPI — the 1x / 1.5x / 2x / 3x scale ladder
12
+ * folds the chrome to the terminal cell grid (windows terminal, conpty
13
+ * and every linux pty), the <APP>_DPI environment override wins first.
14
+ * @seat 2026 · rung 2.0.163 · hierarchical JSDoc, tokens/flags, no hardcoded
12
15
  * data — the version is read from package.json at runtime and the engine
13
16
  * one-liner is quoted from the app docs.
14
17
  * @runtime node strips the types; the shebang hands the file to the runtime
@@ -43,16 +46,56 @@ const APP = "cobaia" as const;
43
46
  const ENGINE =
44
47
  "owns no engine file — the content site is the monetization surface: static plans, support rails and honest ad slots, no backend no tracking (docs/features.md)" as const;
45
48
 
46
- /** the titlebar bar: the app name on the left rail, the window controls on the right — the windows 11 chrome inside the terminal. */
49
+ /** the titlebar bar: the app name on the left rail, the window controls on the right — the windows 11 chrome inside the terminal, the rail folded through the dpi frame. */
47
50
  function titlebar(): string {
48
- return `${ACCENT}┌ ${APP} ─ cli${RESET} ${INK}${BAR.repeat(24)} ─ ❐ ✕${RESET}`;
51
+ return `${ACCENT}┌ ${APP} ─ cli${RESET} ${INK}${BAR.repeat(FRAME.rail)} ─ ❐ ✕${RESET}`;
49
52
  }
50
53
 
51
- /** the top rule: the 28px divider of the web surface folded to one terminal line. */
54
+ /** the top rule: the 28px divider of the web surface folded to one terminal line, scaled by the dpi seat. */
52
55
  function toprule(): string {
53
- return `${FOCUS}${BAR.repeat(3)} ${APP} ${BAR.repeat(3)}${RESET}`;
56
+ const rail = Math.max(3, Math.round(3 * FRAME.scale));
57
+ return `${FOCUS}${BAR.repeat(rail)} ${APP} ${BAR.repeat(rail)}${RESET}`;
54
58
  }
55
59
 
60
+ /* ════════════════════════════════════════════════════════════════════ */
61
+ /* Section 1b: the dpi conversion — native detection, the 1x / 1.5x / 2x / 3x scale ladder and the terminal clamp (the pr13 law: DPI never XDPI — the same design as the web / desktop surface, only the responsiveness folds to the cell grid of the terminal, inside windows terminal and every linux pty). */
62
+ /* ════════════════════════════════════════════════════════════════════ */
63
+
64
+ /** the scale ladder the native detection resolves (the automatic scaling law). */
65
+ const SCALESTEPS = [1, 1.5, 2, 3] as const;
66
+
67
+ /** the dpi frame the chrome renders inside: the resolved scale seat, the terminal columns and the rail length the titlebar draws. */
68
+ interface dpiframe {
69
+ /** the scale seat of the ladder (1, 1.5, 2 or 3). */
70
+ scale: number;
71
+ /** the columns the terminal answers (windows terminal, conpty, xterm, tmux — every pty reports them). */
72
+ columns: number;
73
+ /** the titlebar rail length in cells (the pixel rail folded to the grid and clamped so the line never wraps). */
74
+ rail: number;
75
+ }
76
+
77
+ /** resolves the dpi frame natively, zero dependencies: the columns come from stdout (every windows and linux terminal answers them), the scale seat from the column ladder — the explicit <APP>_DPI environment override wins first (the native scaling knob) — and the rail clamps inside the frame so the chrome never wraps a narrow console. */
78
+ function detectdpiframe(): dpiframe {
79
+ const columns = Number.isFinite(stdout.columns) && Number(stdout.columns) > 0 ? Number(stdout.columns) : 80;
80
+ const override = Number(process.env[`${APP.toUpperCase()}_DPI`] ?? "");
81
+ const scale =
82
+ Number.isFinite(override) && override > 0 && SCALESTEPS.includes(override as (typeof SCALESTEPS)[number])
83
+ ? override
84
+ : columns >= 200
85
+ ? 3
86
+ : columns >= 160
87
+ ? 2
88
+ : columns >= 120
89
+ ? 1.5
90
+ : 1;
91
+ /* the rail folds the 24-cell rail of the 1x seat through the scale seat and clamps inside the frame with room for the name, the controls and the reset runs (the escapes are zero-width). */
92
+ const rail = Math.max(4, Math.min(Math.round(24 * scale), columns - APP.length - 16));
93
+ return { scale, columns, rail };
94
+ }
95
+
96
+ /** the dpi frame the console booted with (resolved once, before any chrome prints — a piped stdin answers the deterministic 80-column seat). */
97
+ const FRAME = detectdpiframe();
98
+
56
99
  /* ════════════════════════════════════════════════════════════════════ */
57
100
  /* Section 2: the runtime reads — no hardcoded data; the version comes from package.json at runtime. */
58
101
  /* ════════════════════════════════════════════════════════════════════ */
@@ -77,6 +120,7 @@ function help(): string[] {
77
120
  `${INK}commands${RESET}`,
78
121
  ` help ${INK}this list${RESET}`,
79
122
  ` version ${INK}the package version, read from package.json at runtime${RESET}`,
123
+ ` dpi ${INK}the resolved dpi seat of this terminal (scale, columns, rail)${RESET}`,
80
124
  ` engine ${INK}the engine ownership one-liner of the app${RESET}`,
81
125
  ` exit ${INK}close the console${RESET}`,
82
126
  ];
@@ -101,6 +145,7 @@ export async function main(): Promise<void> {
101
145
  if (command === "exit") rl.close();
102
146
  else if (command === "help") for (const row of help()) console.log(row);
103
147
  else if (command === "version") console.log(`${ACCENT}${APP}${RESET} ${version}`);
148
+ else if (command === "dpi") console.log(`${ACCENT}${APP}${RESET} ${INK}dpi seat ${FRAME.scale}x on ${FRAME.columns} columns — rail ${FRAME.rail} cells, ladder 1x / 1.5x / 2x / 3x${RESET}`);
104
149
  else if (command === "engine") console.log(`${INK}${ENGINE}${RESET}`);
105
150
  else if (command.length > 0) console.log(`${HOVER}✕${RESET} ${INK}unknown command: ${command} — type help${RESET}`);
106
151
  if (command === "exit") break;
package/cobaia.csproj CHANGED
@@ -4,7 +4,7 @@
4
4
  <AssemblyName>cobaia</AssemblyName>
5
5
  <RootNamespace>cobaia</RootNamespace>
6
6
  <PackageId>cobaia</PackageId>
7
- <Version>2.0.163</Version>
7
+ <Version>2.0.165</Version>
8
8
  <Authors>wenathlan</Authors>
9
9
  <Description>Distribution package containing the cobaia documentation set and the tests directory. cobaia is the monetization surface — the plans, the support rails and the honest advertisement slots.</Description>
10
10
  <PackageLicenseExpression>GPL-3.0-only</PackageLicenseExpression>
package/cobaia.gemspec CHANGED
@@ -1,6 +1,6 @@
1
1
  Gem::Specification.new do |spec|
2
2
  spec.name = "cobaia"
3
- spec.version = ENV.fetch("COBAIA_VERSION", "2.0.163")
3
+ spec.version = ENV.fetch("COBAIA_VERSION", "2.0.165")
4
4
  spec.authors = ["wenathlan"]
5
5
  spec.email = ["support@users.noreply.github.com"]
6
6
  spec.summary = "The cobaia documentation and tests envelope (the monetization surface — the plans, the support rails and the honest advertisement slots)."
package/cobaia.java CHANGED
@@ -10,7 +10,7 @@ package io.github.wenathlan.cobaia;
10
10
  */
11
11
  final class Cobaia {
12
12
  /** The version of the cobaia envelope (the six-distribution completeness wave). */
13
- public static final String VERSION = "2.0.163";
13
+ public static final String VERSION = "2.0.165";
14
14
  private Cobaia() {
15
15
  }
16
16
  }
package/doc.go ADDED
@@ -0,0 +1,23 @@
1
+ // Package cobaia carries the go module identity of the cobaia envelope —
2
+ // the monetization surface of the wenathlan family: the plans, the
3
+ // support rails and the honest advertisement slots while the family
4
+ // apps stay clean.
5
+ //
6
+ // The goget wave seats the go module rung beside the maven, nuget,
7
+ // rubygems and gradle rungs: the module resolves at
8
+ // github.com/wenathlan/devthink/cobaia/v2 through the
9
+ // proxy.golang.org chain, and the version answers the per-application
10
+ // tag (cobaia/vX.Y.Z on the release commit) the publish lane syncs —
11
+ // the package carries no version constant the metadata lockstep would
12
+ // have to stamp, the same way the gradle marker reads the envelope
13
+ // package.json at build time.
14
+ package cobaia
15
+
16
+ // ModulePath is the go module path the go get consumer resolves.
17
+ const ModulePath = "github.com/wenathlan/devthink/cobaia/v2"
18
+
19
+ // Family is the distribution family every envelope of the monorepo answers.
20
+ const Family = "wenathlan"
21
+
22
+ // Description is the envelope summary the registry metadata carries.
23
+ const Description = "The cobaia documentation and tests envelope (the monetization surface)."
@@ -0,0 +1,19 @@
1
+ # Distribution lanes
2
+
3
+ The eleven distribution lanes of the PR14 law and the honest status each lane answers for cobaia at the 2.0.163 family rung. A lane never ships metadata its real surface cannot back: a lane without a real carrier stays a documented stub until the surface lands, and no version ever bumps to fake a lane.
4
+
5
+ | Lane | Carrier | Status | Note |
6
+ | --- | --- | --- | --- |
7
+ | npmjs | package.json — @wenathlan/cobaia | live | the family-npmjs lane publishes the envelope every release rung |
8
+ | GitHub Packages npm | package.json — @wenathlan/cobaia | live | the family-githubnpm lane publishes the same envelope idempotently |
9
+ | Maven | pom.xml — io.github.wenathlan:cobaia | live | the family-maven lane deploys the jar |
10
+ | NuGet | cobaia.csproj | live | the family-nuget lane packs the envelope |
11
+ | Gradle | build.gradle.kts — com.wenathlan:cobaia | live | the family-gradle lane publishes the module |
12
+ | Ruby Gems | cobaia.gemspec | live | the family-rubygems lane pushes the gem |
13
+ | Docker Container | Dockerfile | live | the family-ghcr lane pushes ghcr.io/wenathlan/cobaia and the family-container lane attaches the release archive |
14
+ | Go Get | go.mod | stub | no Go source surface ships yet — the lane lands when a real Go adapter exists, never as an empty module |
15
+ | Cargo Crates | Cargo.toml | stub | no Rust source surface ships yet — the lane lands with a real crate, never as an empty manifest |
16
+ | PyPi | pyproject.toml | stub | no Python package surface ships yet — the lane lands with a real wheel, never as an empty project table |
17
+ | Homebrew | Formula | stub | no tap repository ships yet — the formula lands pointing at the real release binaries with real checksums, never at a placeholder |
18
+
19
+ The engines block of package.json keeps Go, Rust and Python as declared toolchain floors — a catalog row is not a distribution lane. The dual npm law answers through the npmjs and GitHub Packages rows; the release binaries (the desktop bundles, the mobile artifacts, the container archive) ride the family-desktop, family-mobile and family-container lanes every release rung.
package/go.mod ADDED
@@ -0,0 +1,13 @@
1
+ // The cobaia go module marker (the goget wave): the
2
+ // documentation envelope rides the go get rung the way it rides the
3
+ // maven, nuget, rubygems and gradle rungs — the module path answers the
4
+ // github.com/wenathlan/devthink monorepo with the per-application
5
+ // subdirectory and the major version suffix the go semver law demands
6
+ // at the v2 line, and the version answers the per-application tag
7
+ // (cobaia/vX.Y.Z on the release commit) the publish lane syncs — the go
8
+ // module registry carries no version literal the rung ladder would have
9
+ // to stamp, the same way the gradle marker reads the envelope
10
+ // package.json at build time.
11
+ module github.com/wenathlan/devthink/cobaia/v2
12
+
13
+ go 1.27
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@wenathlan/cobaia",
3
- "version": "2.0.163",
3
+ "version": "2.0.165",
4
4
  "description": "cobaia is the monetization surface of the wenathlan family: the content site that carries the plans, the support rails and the honest advertisement slots while the family apps stay clean; the name is provisional until the owner picks the official one",
5
5
  "repository": {
6
6
  "type": "git",
@@ -13,6 +13,7 @@
13
13
  "cobaia": "./cli.ts"
14
14
  },
15
15
  "engines": {
16
+ "babel": "^7.28.0",
16
17
  "bare": "^1.18.0",
17
18
  "bun": "^1.4.4",
18
19
  "cargo": ">=1.85.0",
@@ -35,6 +36,7 @@
35
36
  "typescript": "^5.8.0",
36
37
  "v": "^0.5.2",
37
38
  "vscode": "^1.118.0",
39
+ "yaml": "^2.9.1",
38
40
  "yarn": "^4.17.1"
39
41
  },
40
42
  "peerDependencies": {
@@ -60,12 +62,12 @@
60
62
  "@libsql/client": "^0.18.0",
61
63
  "@prisma/adapter-libsql": "^7.10.1",
62
64
  "@prisma/client": "^7.10.1",
65
+ "@wenathlan/argan": "~2.0.155",
63
66
  "@wenathlan/cadria": "~2.0.155",
64
67
  "@wenathlan/debonair": "~2.0.155",
65
68
  "@wenathlan/devthink": "~2.0.154",
66
69
  "@wenathlan/getry": "~2.0.155",
67
70
  "@wenathlan/saddle": "~2.0.155",
68
- "@wenathlan/argan": "~2.0.155",
69
71
  "@wenathlan/vault": "~2.0.155",
70
72
  "better-sqlite3": "^13.0.3",
71
73
  "drizzle-orm": "^0.45.4",
@@ -178,22 +180,26 @@
178
180
  "zod": "^4.6.7"
179
181
  },
180
182
  "overrides": {
181
- "body-parser": "^2.4.0",
182
- "fast-uri": "^3.1.9",
183
+ "uuid": "^11.1.1",
184
+ "deepmerge-ts": "^8.0.0",
185
+ "esbuild": "^0.28.2",
183
186
  "follow-redirects": "^1.16.2",
184
187
  "minimatch": "^11.0.3",
185
188
  "glob": "^14.0.3",
189
+ "mysql2": "^3.24.6",
190
+ "postcss-selector-parser": "^7.1.6",
191
+ "source-map-js": "1.2.2",
192
+ "proxy-addr": "2.0.8",
193
+ "body-parser": "^2.4.0",
194
+ "fast-uri": "^3.1.9",
186
195
  "zod": "^4.6.7",
187
- "esbuild": "^0.28.2",
188
196
  "undici": "^7.30.1",
189
- "uuid": "^11.1.1",
190
- "postcss-selector-parser": "^7.1.6",
191
- "deepmerge-ts": "^8.0.0",
192
197
  "katex": "^0.18.2",
193
- "mysql2": "^3.24.6",
194
- "proxy-addr": "2.0.8",
195
198
  "shell-quote": "^1.11.0",
196
- "source-map-js": "1.2.2"
199
+ "xcode": {
200
+ "uuid": "11.1.1"
201
+ },
202
+ "@grpc/grpc-js": "1.14.5"
197
203
  },
198
204
  "packageManager": "pnpm@12.3.4"
199
205
  }
package/pom.xml CHANGED
@@ -12,7 +12,7 @@
12
12
  <scm><url>https://github.com/wenathlan/devthink</url><connection>scm:git:https://github.com/wenathlan/devthink.git</connection></scm>
13
13
  <distributionManagement><repository><id>github</id><name>GitHub Packages</name><url>https://maven.pkg.github.com/wenathlan/devthink</url></repository></distributionManagement>
14
14
  <properties>
15
- <revision>2.0.163</revision>
15
+ <revision>2.0.165</revision>
16
16
  </properties>
17
17
  <build>
18
18
  <resources>
package/tauri.conf.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "$schema": "https://schema.tauri.app/config/2",
3
3
  "productName": "Cobaia",
4
- "version": "2.0.162",
4
+ "version": "2.0.165",
5
5
  "identifier": "com.wenathlan.cobaia",
6
6
  "build": {
7
7
  "beforeDevCommand": "pnpm dev",