@wenathlan/cobaia 2.0.155 → 2.0.158

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/cobaia.csproj ADDED
@@ -0,0 +1,22 @@
1
+ <Project Sdk="Microsoft.NET.Sdk">
2
+ <PropertyGroup>
3
+ <TargetFrameworks>netstandard2.0;netstandard2.1</TargetFrameworks>
4
+ <AssemblyName>cobaia</AssemblyName>
5
+ <RootNamespace>cobaia</RootNamespace>
6
+ <PackageId>cobaia</PackageId>
7
+ <Version>2.0.158</Version>
8
+ <Authors>wenathlan</Authors>
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
+ <PackageLicenseExpression>GPL-3.0-only</PackageLicenseExpression>
11
+ <PackageProjectUrl>https://github.com/wenathlan/devthink</PackageProjectUrl>
12
+ <RepositoryUrl>https://github.com/wenathlan/devthink</RepositoryUrl>
13
+ <PackageReadmeFile>README.md</PackageReadmeFile>
14
+ <PackageRequireLicenseAcceptance>false</PackageRequireLicenseAcceptance>
15
+ <EnableDefaultCompileItems>false</EnableDefaultCompileItems>
16
+ </PropertyGroup>
17
+ <ItemGroup>
18
+ <None Include="README.md" Pack="true" PackagePath="/" />
19
+ <None Include="docs/**/*" Pack="true" PackagePath="contentFiles/any/any/docs/" />
20
+ <None Include="tests/**/*" Pack="true" PackagePath="contentFiles/any/any/tests/" />
21
+ </ItemGroup>
22
+ </Project>
package/cobaia.gemspec ADDED
@@ -0,0 +1,14 @@
1
+ Gem::Specification.new do |spec|
2
+ spec.name = "cobaia"
3
+ spec.version = ENV.fetch("COBAIA_VERSION", "2.0.158")
4
+ spec.authors = ["wenathlan"]
5
+ spec.email = ["support@users.noreply.github.com"]
6
+ spec.summary = "The cobaia documentation and tests envelope (the monetization surface — the plans, the support rails and the honest advertisement slots)."
7
+ spec.description = "Distributes the cobaia documentation set and the tests directory as one Ruby gem. cobaia is the monetization surface — the plans, the support rails and the honest advertisement slots."
8
+ spec.homepage = "https://github.com/wenathlan/devthink"
9
+ spec.license = "GPL-3.0-only"
10
+ spec.required_ruby_version = ">= 3.1"
11
+ spec.files = Dir["README.md", "docs/**/*", "tests/**/*"]
12
+ spec.metadata["source_code_uri"] = "https://github.com/wenathlan/devthink"
13
+ spec.metadata["homepage_uri"] = spec.homepage
14
+ end
package/cobaia.java ADDED
@@ -0,0 +1,16 @@
1
+ package io.github.wenathlan.cobaia;
2
+
3
+ /**
4
+ * The cobaia version envelope carrier.
5
+ *
6
+ * <p>The carrier answers the lowercase file name doctrine (the technical name {@code cobaia}
7
+ * while the class keeps the presentation name {@code Cobaia}); the class drops the public
8
+ * modifier so the java file name rule holds — the envelope carries the version constant the
9
+ * metadata lockstep stamps, the registry lanes never compile it.
10
+ */
11
+ final class Cobaia {
12
+ /** The version of the cobaia envelope (the six-distribution completeness wave). */
13
+ public static final String VERSION = "2.0.158";
14
+ private Cobaia() {
15
+ }
16
+ }
package/content.ts CHANGED
@@ -116,7 +116,7 @@ export const seedPosts: readonly blogpost[] = [
116
116
  "The whole family fits the static hosting free tiers — the only fixed cost is the domains. How ten deployable sites stay on a US$15 a month floor.",
117
117
  body: [
118
118
  "Every application in the DevThink family builds down to the same shape: one html file, one stylesheet and a handful of hashed bundles at the app root. There is no server to keep warm, no container to babysit and no database bill attached to the public surface. The whole family fits the free tiers of the usual static hosts, so the only fixed cost of the operation is the domains — about US$15 a month.",
119
- "That number is the budget the family was designed against. The applications share one engine: the sandbox runner and the storage layer live as library-grade modules and get assembled per deploy, so a fix made once lands on every site that imports it. Nothing is provisioned per site beyond the deploy itself. A new application is a folder in the monorepo with the same skeleton as its siblings — config files at the root, the theme in Sol/, pure logic modules beside them and tests in the tests folder.",
119
+ "That number is the budget the family was designed against. The applications share one engine: the sandbox runner and the storage layer live as library-grade modules and get assembled per deploy, so a fix made once lands on every site that imports it. Nothing is provisioned per site beyond the deploy itself. A new application is a folder in the monorepo with the same skeleton as its siblings — config files at the root, the theme in sol/, pure logic modules beside them and tests in the tests folder.",
120
120
  "The trade-offs are real. Static sites cannot hold state, so the public surface of every app stores nothing on the visitor machine: no cookies, no accounts, no tracking. The pieces that genuinely need a backend — the AI gateway, the storage clones — run as separate deploy units on their own free tiers, and the sites talk to them over plain https with no credentials embedded anywhere.",
121
121
  "The accounting stays honest. US$15 a month is the floor, not the ceiling: a gateway that outgrows its free tier, or a storage clone that needs a persistent disk, moves the number. But the design keeps the moving parts few and every cost on a line item you can read. Ten working tools for the price of two coffees, and the bill never surprises anyone.",
122
122
  ],
@@ -129,7 +129,7 @@ export const seedPosts: readonly blogpost[] = [
129
129
  excerpt:
130
130
  "A page is a folder, an anchor and one stylesheet. The token set and the flat tree that keep ten sites feeling like one family.",
131
131
  body: [
132
- "Every site in the family carries the same skeleton. A page is a folder directly under Sol/, named after the page, with an anchor file of the same name inside it. Components sit loose beside the anchor, infrastructure lives in a single shell folder and the whole theme styles from one stylesheet. There are no deeper folders. The rule sounds rigid until you maintain ten sites with it — then it is the only reason they stay consistent.",
132
+ "Every site in the family carries the same skeleton. A page is a folder directly under sol/, named after the page, with an anchor file of the same name inside it. Components sit loose beside the anchor, infrastructure lives in a single shell folder and the whole theme styles from one stylesheet. There are no deeper folders. The rule sounds rigid until you maintain ten sites with it — then it is the only reason they stay consistent.",
133
133
  "The theme runs on a fixed token set tuned against the trylle ruler: a near-black canvas, ink at #fafafa, eight surface steps from #171717 to #484848 and exactly one accent per application. Hairlines are the ink color mixed down to five and ten percent. Shadows are rings — a one-pixel outline plus doubling blur layers — instead of diffuse glows. Motion is capped at 150 milliseconds for micro-interactions on one shared cubic-bezier curve, and only transform and opacity ever animate.",
134
134
  "Each application keeps its own signal color: the sandbox engine wears tan, the gateway violet, the game platform coral, the video studio rose. The site you are reading uses the amber sun the whole family shares. One accent per screen, spent on actions and state, never on decoration — the ninety-ten rule. Everything else stays gray on gray: the hierarchy comes from the surface ladder and the typography, not from color.",
135
135
  "The constraints do the work. Because every token, radius, easing and spacing step is shared, a component copied between applications lands looking correct. Because the tree is flat, an audit is a directory listing. And because the stylesheet is one file, the entire design system of a site can be reviewed in a single pass. Ten sites feel like one family because, structurally, they are one.",
package/db.ts CHANGED
@@ -8,7 +8,7 @@
8
8
  * tables over HTTPS (GET/POST /api/v1/onboarding); no server route lives
9
9
  * here.
10
10
  */
11
- import { openStorageLane } from "@wenathlan/vault/storagelane";
11
+ import { openStorageLane } from "@wenathlan/vault/storage";
12
12
  import { LABEL_MANIFEST, LABEL_REVISION } from "./labels";
13
13
 
14
14
  /** the correlated tables the runtime keeps (the family sync contract names). */
@@ -24,7 +24,7 @@ export const db = lane.db;
24
24
  export const { execute, queryAll, queryOne } = lane;
25
25
 
26
26
  /** the parameter types the helpers bind (re-exported seat of the lane). */
27
- export type { SqlParam } from "@wenathlan/vault/storagelane";
27
+ export type { SqlParam } from "@wenathlan/vault/storage";
28
28
 
29
29
  const SCHEMA = `
30
30
  CREATE TABLE IF NOT EXISTS onboarding_states (
@@ -0,0 +1,58 @@
1
+ # cobaia features
2
+
3
+ the real feature list of the cobaia content site, extracted from the code: every item below exists in the app root logics or the Sol theme.
4
+
5
+ ## plans
6
+
7
+ - three mrr plans: free at us$0, pro at us$5 and studio at us$19 per month, placeholder prices until the billing platform decision lands (stripe payment links or paddle)
8
+ - honest checkout state: a configured plan href renders a live anchor, an empty one renders the disabled button with the note checkout not configured yet
9
+ - plan lookup: planbyid answers one plan of the table by its stable id (free, pro, studio)
10
+ - plan prose in the label store: every plan sentence (name, billing period, blurb, features) answers from labels.ts; only the billing values ride checkoutlinks.ts
11
+ - intro plans zone: the intro page renders the same offer from the one checkoutlinks table, the studio plan leading raised
12
+ - what the money covers: the pricing section states the us$15 a month floor of domains and free static hosting and that the applications stay ad free
13
+ - billing webhook walk lane: the plan-checkout workload lane is declared in sandboxmodality.ts for the billing webhook work when it lands, secrets server side
14
+
15
+ ## ads
16
+
17
+ - reserved slot registry: one slot per content page, home display at 728/90, apps in-feed at 3/1, blog in-article at 3/1, keyed by page folder name
18
+ - honest ad container: a fixed aspect-ratio box on a hairline well, visibly labeled advertisement, rendering the empty note ad slot not configured yet while no slot id is set, so the page never shifts when a real unit arrives
19
+ - script rule: no ad network script lives in the repository; the adsense or equivalent loader is injected after network approval through the deploy environment only
20
+ - slot liveness check: adsslotlive answers whether a reserved slot carries a real network id
21
+ - ad free surfaces: the pricing, support and legal pages carry no ad slot; nothing that asks for money or discloses policy sits beside an advertisement
22
+ - ads slot lane: the ads-slot workload lane is declared for the reserved slots and the rotation decision the deploy answers before the render
23
+
24
+ ## content
25
+
26
+ - content lane: the pages read the live rows the platform gateway serves over GET /api/v1/ui/content and fall back to the manifest seed in content.ts, so the interface never blanks
27
+ - content kinds: the lane serves posts, roster, plans, supportlinks, ads.slots, ads.label and ads.empty, each row an ordinal and a json payload
28
+ - live load discipline: one fetch per session against the configured base (VITE_CATALOG_URL) with a 4 second abort window; any failure keeps the seed answering
29
+ - useContent mount hook: a store-riding page loads the live rows once per mount and re-renders when they land, with no first-paint flash
30
+ - update blog: three seed posts with full bodies (ten sites one engine, one css one tree, no backend no tracking), the index sorted newest first and each post carrying date, tags, excerpt, body and the honest word count
31
+ - app directory: the ten deploy units of the family, each card carrying the one-line role declared in its own devthink.toml and its spec accent
32
+ - label store: every interface string rides the label manifest at revision 4, read through the typed accessors label and labelfill, seeded into the store with translated rows protected from overwrite
33
+ - label seed lane: the label-seed workload lane is declared for the manifest walk the sqlite vault carries
34
+
35
+ ## support
36
+
37
+ - two support channels: github sponsors and ko-fi, both presented as zero platform fee, read from the supportlinks record
38
+ - honest channel state: an unconfigured channel renders the disabled button with the note link not configured yet, never a fake link
39
+ - other ways to help: the section lists the public issue tracker, writing about the tools and linking the directory
40
+ - invalid traffic policy: the site states no ad clicking, no traffic exchange, no bots, because automated traffic against an ad surface kills the ad account and the domain reputation
41
+ - support strip on home: the landing carries the support call before the reserved ad slot
42
+
43
+ ## ui
44
+
45
+ - one shared shell: the sticky acrylic nav with the active section indicator and the worked footer carrying the family row, the same surface at the direct url and inside the os power clip
46
+ - routes: home on the bare root, apps, pricing, support, blog, legal inside the shell, the bare intro at /intro and the catch-all 404
47
+ - intro splash: the akash opening with the mark spring, name rise and role fade, skippable by click, tap or key, honoring reduced motion and writing nothing to the visitor machine
48
+ - brand mark: the drawn beaker svg in the dark amber gradient, the only seat of the identity accent, with a gentle hover tilt
49
+ - home landing: left-aligned hero, the three steps (engine, static, honest), the four-card featured directory preview and the support strip
50
+ - legal page: the privacy policy and terms with clause leads, disclosing the advertising plan and the analytics rule
51
+ - notfound page: the 404 answer inside the site chrome with the way out to home and the directory
52
+ - window captions: the shell carries the minimize, maximize and close caption labels for the os window seat
53
+ - wouter routing on the declared vite base: deep links resolve against the pages subpath the build declaration owns
54
+ - static deploys: netlify, vercel and cloudflare workers configs at the app root, plus robots.txt and sitemap.xml for the crawlers
55
+
56
+ ## Dependencies
57
+
58
+ - synchronized dependency union — the eleven family apps share one dependency tree: identical `dependencies`, `devDependencies` and `peerDependencies` (same keys, same versions, nothing removed, highest semver wins on conflicts) and one `engines` catalog with node as maestro and the V 0.5.2 seat as catalog annotation (@family wave/depssync).
@@ -0,0 +1,61 @@
1
+ # cobaia monetization surface
2
+
3
+ cobaia is the public monetization surface of the devthink family: the content site that carries the mrr plan table, the support channels and the honest advertisement slots while the ten family applications stay clean.
4
+
5
+ ## overview
6
+
7
+ - a plain content site with no entry gate and no onboarding flow: every page is public and the home renders directly on the bare root
8
+ - one window shell (header, footer) wraps every content route; the intro page mounts bare at /intro outside the chrome
9
+ - every plan href and support href ships empty until the owner configures billing; the interface renders honest empty states instead of dead links
10
+ - no ad network script is committed: the loader enters only after network approval, injected through the deploy environment
11
+ - zero tracking: no cookies, no local storage, no analytics beacons, no keys committed
12
+ - build tooling: vite static build, wouter router on the declared vite base, vitest suites, biome formatting
13
+
14
+ ## module inventory
15
+
16
+ the pure logics at the app root, each one a typed accessor over the content lane:
17
+
18
+ - adsconfig.ts: the honest ad slot registry. exports the adsslot type (slotid, format, ratio), the fixed label advertisement, the empty note ad slot not configured yet, the reserved slots per page (home display 728/90, apps in-feed 3/1, blog in-article 3/1) and the readers adsslotfor and adsslotlive
19
+ - checkoutlinks.ts: the typed billing accessor. checkoutlinks answers the plan table, supportlinks the support channel record, isconfigured tests an href, planbyid finds one plan by id (free, pro, studio). only billing values ride here; the plan prose answers from the label store
20
+ - content.ts: the content law. section 1 holds the manifest seed (seedPosts, seedRoster, seedPlans, seedSupportLinks, seedAdsSlots, seedAdsLabel, seedAdsEmpty); section 2 holds the live loader (loadcontent over GET /api/v1/ui/content), the accessors contenttable and contentvalue (live rows first, seed fallback) and the useContent mount hook
21
+ - posts.ts: the blog accessor. posts answers the post table, postindex sorts it newest first, postwords counts the honest word total of one body
22
+ - roster.ts: the family directory accessor. roster answers the ten deploy units with slug, accent and one-line role, in rail order with the os first
23
+ - db.ts: the self-hosted sqlite runtime (better-sqlite3 through the vault storagelane). keeps the onboarding_states and labels tables with prepared, parameterized statements only
24
+ - familyurl.ts: the family address book. familyurl resolves one sibling deploy unit to the relative url ../slug/ with the trailing slash, so the family links both ways
25
+ - labels.ts: the copy law. the english manifest (LABEL_MANIFEST, revision 4) carries every interface string keyed by page.widget.key; label and labelfill read it; seedLabels mirrors the rows into the browser label store
26
+ - sandboxmodality.ts: the workload lane declaration. mirrors the three lanes cobaia owns in the family catalog (plan-checkout, ads-slot, label-seed) and reads the COBAIA_SANDBOX_LANE seat (local, join, or a pinned modality id)
27
+ - capacitor.config.ts, vite.config.ts, vitest.config.ts: the mobile conversion config, the static build and the test runner configs at the app root
28
+
29
+ ## data layer
30
+
31
+ - the sqlite runtime opens one storage lane on the app-owned file cobaia.db (wal, foreign keys, patient locks) through openStorageLane of @wenathlan/vault
32
+ - every statement is prepared and bound; no sql is assembled by string concatenation
33
+ - the boot ddl is idempotent and mirrors schema.prisma, the documentation of record: the tables exist after the first open
34
+ - onboarding_states holds the entry-flow flags per visitor (introseen, onboardingseen) with a seen-wins upsert; the platform gateway serves the same flags over /api/v1/onboarding
35
+ - labels holds the interface copy store: id, text, revision, translated. the boot seed ingests the english manifest and never overwrites a translated row
36
+ - the content rows (posts, roster, plans, supportlinks, ads.slots, ads.label, ads.empty) live in the site store and answer over the platform gateway at GET /api/v1/ui/content; the manifest seed in content.ts is the fallback the offline static build reads
37
+ - the browser never imports db.ts: better-sqlite3 cannot ride the static bundle, so the browser pulls the live rows over the internal api (base from VITE_CATALOG_URL, 4 second abort window, one load per session)
38
+ - the vitest suites (adsconfig, checkoutlinks, familyurl, posts, sandboxmodality) pin the module contracts: the slot registry, the placeholder prices, the empty hrefs and the plan prose keys
39
+
40
+ ## sol subapps
41
+
42
+ the theme surface, one folder per page, mounted by the theme anchor sol/Sol.tsx on wouter:
43
+
44
+ - home: the landing. left-aligned hero, the three steps (engine, static, honest), a four-card directory preview reading the one roster table (devthink, saddle, vault, cadria), the support strip and the reserved ad slot at the end of the content
45
+ - apps: the directory. one card per deploy unit with the honest role and the deep link through familyurl, closed by the in-feed ad slot
46
+ - pricing: the plan table. three honest plans (free, pro, studio), a configured href renders a live anchor, an empty one the disabled button plus the note checkout not configured yet, and the money section explains the us$15 a month floor. no ad slot on this page
47
+ - support: the support channels. github sponsors and ko-fi cards with the same configured-or-honest rule, the other ways to help section and the invalid traffic line. no ad slot on this page
48
+ - blog: the update blog. the sorted index and the full bodies of the posts as real articles with date, word count and tags in the meta line, closed by the in-article ad slot
49
+ - legal: the privacy policy and the terms. discloses the advertising plan (labeled reserved slots, third-party cookies only once a network is live) and the analytics rule (none by default). no ad slot on this page
50
+ - intro: the bare presentation page. the akash splash (plays per visit, writes nothing, skips on click, tap or key), the plans zone reading the one checkoutlinks table, the door panes and the footer doors
51
+ - notfound: the 404 answer inside the site chrome
52
+ - shell: the one chrome. the sticky acrylic nav with the active section indicator, the footer carrying the family row through familyurl, and the embedded contract that renders the same surface inside the devthink os power clip
53
+ - wingets: the shared components (IntroSplash, IntroPlans, IntroFooter, ShellAdsslot, ShellBrand) re-exported through one index surface
54
+
55
+ ## family integration
56
+
57
+ - the roster mirrors the ten deploy units: devthink the os, saddle the sandbox, forge the execution clone, foundry the complete clone, vault the storage clone, getry the ai workspace, cadria the video and image studio, debonair the audio daw, stealthhead the fps game platform, argan the dns toolkit, each with its spec section 12 accent
58
+ - familyurl resolves every sibling one level above this deploy unit, so the directory links out and every sibling footer links back
59
+ - the label store rides the shared vault labelstore; the sqlite lane rides the shared vault storagelane, the same mechanism the storage clone keeps
60
+ - the deploy targets are static: netlify, vercel and cloudflare workers configs sit at the app root beside robots.txt and sitemap.xml; the capacitor mobile lane renders the same web bundle
61
+ - the package identity is @wenathlan/cobaia inside the devthink monorepo; the devthink.toml declares the app role and the seven pages (home, pricing, support, apps, legal, blog, notfound)
package/index.html CHANGED
@@ -3,7 +3,7 @@
3
3
  <html lang="en">
4
4
  <head>
5
5
  <meta charset="utf-8" />
6
- <meta name="viewport" content="width=device-width, initial-scale=1.0, minimum-scale=1.0, maximum-scale=1.0, user-scalable=no, viewport-fit=cover" />
6
+ <meta content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no" name="viewport" />
7
7
  <meta
8
8
  name="description"
9
9
  content="cobaia is the front door of the DevThink family: the pricing, the support page, the app directory and the update blog for ten deployable web applications."
package/package.json CHANGED
@@ -1,8 +1,11 @@
1
1
  {
2
2
  "name": "@wenathlan/cobaia",
3
3
  "packageManager": "pnpm@12.3.4",
4
- "version": "2.0.155",
4
+ "version": "2.0.158",
5
5
  "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",
6
+ "bin": {
7
+ "cobaia": "./cli.ts"
8
+ },
6
9
  "type": "module",
7
10
  "repository": {
8
11
  "type": "git",
@@ -26,22 +29,23 @@
26
29
  "@fontsource-variable/inter": "^5.3.0",
27
30
  "@fontsource-variable/jetbrains-mono": "^5.3.0",
28
31
  "@fontsource-variable/outfit": "^5.3.0",
29
- "@hono/node-server": "^2.1.5",
32
+ "@hono/node-server": "^2.1.6",
30
33
  "@libsql/client": "^0.18.0",
31
34
  "@prisma/adapter-libsql": "^7.10.1",
32
35
  "@prisma/client": "^7.10.1",
33
- "@wenathlan/cadria": "^2.0.154",
34
- "@wenathlan/debonair": "^2.0.154",
35
- "@wenathlan/devthink": "^2.0.154",
36
- "@wenathlan/getry": "^2.0.154",
37
- "@wenathlan/saddle": "^2.0.154",
38
- "@wenathlan/vault": "^2.0.154",
36
+ "@wenathlan/cadria": "~2.0.155",
37
+ "@wenathlan/debonair": "~2.0.155",
38
+ "@wenathlan/devthink": "~2.0.154",
39
+ "@wenathlan/getry": "~2.0.155",
40
+ "@wenathlan/saddle": "~2.0.155",
41
+ "@wenathlan/argan": "~2.0.155",
42
+ "@wenathlan/vault": "~2.0.155",
39
43
  "better-sqlite3": "^13.0.3",
40
44
  "drizzle-orm": "^0.45.4",
41
- "gsap": "^3.15.0",
45
+ "gsap": "^3.15.1",
42
46
  "hono": "^4.13.16",
43
47
  "ink": "^7.1.1",
44
- "lucide-react": "^1.67.0",
48
+ "lucide-react": "^1.68.0",
45
49
  "motion": "^12.43.0",
46
50
  "react": "^19.3.1",
47
51
  "react-devtools-core": "^8.0.0",
@@ -51,7 +55,7 @@
51
55
  "z-ai-web-dev-sdk": "^0.0.18"
52
56
  },
53
57
  "devDependencies": {
54
- "@biomejs/biome": "^2.6.4",
58
+ "@biomejs/biome": "^2.6.5",
55
59
  "@capacitor/android": "^8.6.0",
56
60
  "@capacitor/cli": "^8.6.0",
57
61
  "@capacitor/core": "^8.6.0",
@@ -120,7 +124,7 @@
120
124
  "hono": "^4.13.16",
121
125
  "input-otp": "^1.5.0",
122
126
  "jsdom": "26.1.0",
123
- "lucide-react": "^1.67.0",
127
+ "lucide-react": "^1.68.0",
124
128
  "mysql2": "^3.24.6",
125
129
  "nanoid": "^6.0.2",
126
130
  "next-themes": "^0.4.6",
@@ -158,7 +162,7 @@
158
162
  },
159
163
  "engines": {
160
164
  "bare": "^1.18.0",
161
- "bun": "^1.4.2",
165
+ "bun": "^1.4.4",
162
166
  "cargo": ">=1.85.0",
163
167
  "chrome": "^16.0.912",
164
168
  "cnpm": "^9.4.0",
@@ -171,7 +175,7 @@
171
175
  "iojs": "^1.0.0",
172
176
  "java": ">=17",
173
177
  "node": ">=26.13.0 <27",
174
- "npm": "^12.1.0",
178
+ "npm": "^12.2.1",
175
179
  "pnpm": "^12.6.0",
176
180
  "python": ">=3.11.0",
177
181
  "rust": ">=1.85.0",
@@ -181,6 +185,9 @@
181
185
  "vscode": "^1.118.0",
182
186
  "yarn": "^4.17.1"
183
187
  },
188
+ "peerDependencies": {
189
+ "playwright": "^1.63.0"
190
+ },
184
191
  "overrides": {
185
192
  "body-parser": "^2.4.0",
186
193
  "fast-uri": "^3.1.9",
@@ -12,26 +12,34 @@ overrides:
12
12
  esbuild: ^0.28.2
13
13
  deepmerge-ts: ^8.0.0
14
14
  mysql2: ^3.23.1
15
+ postcss-selector-parser: ^7.1.6
15
16
 
16
17
  # the freshly published security fixes install before they age: pnpm 12
17
18
  # verifies the supply-chain age by default and these four corrections ride
18
19
  # the exclusion so the family heals now, not after the waiting window.
20
+ # the native build law (the node 26 v8 gate): ssh2's optional c++ binding
21
+ # speaks the removed v8 context api (GetIsolate), so the gyp lottery dies
22
+ # here in the seat pnpm 12 reads - the pure-js engine answers the lanes
23
+ # and no install ever compiles the broken binding.
24
+ neverBuiltDependencies:
25
+ - ssh2
26
+
19
27
  minimumReleaseAgeExclude:
20
28
  - body-parser@2.4.0
21
29
  - fast-uri@3.1.9
22
30
  - follow-redirects@1.16.1
23
31
  - zod@4.6.6
24
- - '@biomejs/biome@2.6.3 || 2.6.4'
25
- - '@biomejs/cli-android-arm64@2.6.3 || 2.6.4'
26
- - '@biomejs/cli-android-x64@2.6.3 || 2.6.4'
27
- - '@biomejs/cli-darwin-arm64@2.6.3 || 2.6.4'
28
- - '@biomejs/cli-darwin-x64@2.6.3 || 2.6.4'
29
- - '@biomejs/cli-linux-arm64-musl@2.6.3 || 2.6.4'
30
- - '@biomejs/cli-linux-arm64@2.6.3 || 2.6.4'
31
- - '@biomejs/cli-linux-x64-musl@2.6.3 || 2.6.4'
32
- - '@biomejs/cli-linux-x64@2.6.3 || 2.6.4'
33
- - '@biomejs/cli-win32-arm64@2.6.3 || 2.6.4'
34
- - '@biomejs/cli-win32-x64@2.6.3 || 2.6.4'
32
+ - '@biomejs/biome@2.6.3 || 2.6.4 || 2.6.5'
33
+ - '@biomejs/cli-android-arm64@2.6.3 || 2.6.4 || 2.6.5'
34
+ - '@biomejs/cli-android-x64@2.6.3 || 2.6.4 || 2.6.5'
35
+ - '@biomejs/cli-darwin-arm64@2.6.3 || 2.6.4 || 2.6.5'
36
+ - '@biomejs/cli-darwin-x64@2.6.3 || 2.6.4 || 2.6.5'
37
+ - '@biomejs/cli-linux-arm64-musl@2.6.3 || 2.6.4 || 2.6.5'
38
+ - '@biomejs/cli-linux-arm64@2.6.3 || 2.6.4 || 2.6.5'
39
+ - '@biomejs/cli-linux-x64-musl@2.6.3 || 2.6.4 || 2.6.5'
40
+ - '@biomejs/cli-linux-x64@2.6.3 || 2.6.4 || 2.6.5'
41
+ - '@biomejs/cli-win32-arm64@2.6.3 || 2.6.4 || 2.6.5'
42
+ - '@biomejs/cli-win32-x64@2.6.3 || 2.6.4 || 2.6.5'
35
43
  - '@types/node@26.6.6'
36
44
  - '@capacitor/android@8.6.0'
37
45
  - '@capacitor/cli@8.6.0'
@@ -40,13 +48,13 @@ minimumReleaseAgeExclude:
40
48
  - '@opencode-ai/sdk@1.19.5'
41
49
  - react-resizable-panels@4.15.1 || 4.15.2 || 4.15.3 || 4.16.0 || 4.16.1 || 4.17.0 || 4.18.0
42
50
  - '@types/google.maps@3.66.9'
43
- - lucide-react@1.64.0 || 1.65.0 || 1.66.0 || 1.67.0
51
+ - lucide-react@1.64.0 || 1.65.0 || 1.66.0 || 1.67.0 || 1.68.0
44
52
  - '@fluentui/react-icons@2.0.345'
45
- - '@wenathlan/vault@2.0.152 || 2.0.153 || 2.0.154 || 2.0.155 || 2.1.8'
53
+ - '@wenathlan/vault@2.0.152 || 2.0.153 || 2.0.154 || 2.0.155 || 2.0.156 || 2.1.8'
46
54
  - hono@4.13.16
47
- - '@wenathlan/cadria@2.0.154 || 2.0.155 || 2.1.8'
48
- - '@wenathlan/debonair@2.0.154 || 2.0.155 || 2.1.8'
49
- - '@wenathlan/getry@2.0.154 || 2.0.155'
55
+ - '@wenathlan/cadria@2.0.154 || 2.0.155 || 2.0.156 || 2.1.8'
56
+ - '@wenathlan/debonair@2.0.154 || 2.0.155 || 2.0.156 || 2.1.8'
57
+ - '@wenathlan/getry@2.0.154 || 2.0.155 || 2.0.156'
50
58
  - '@tailwindcss/node@4.3.4'
51
59
  - '@tailwindcss/oxide-android-arm64@4.3.4'
52
60
  - '@tailwindcss/oxide-darwin-arm64@4.3.4'
@@ -68,15 +76,26 @@ minimumReleaseAgeExclude:
68
76
  - '@vitest/spy@5.1.0'
69
77
  - tailwindcss@4.3.4
70
78
  - vitest@5.1.0
71
- - '@wenathlan/saddle@2.0.154 || 2.0.155 || 2.1.8'
72
- - '@wenathlan/devthink@2.0.154 || 2.0.155'
79
+ - '@wenathlan/saddle@2.0.154 || 2.0.155 || 2.0.156 || 2.1.8'
80
+ - '@wenathlan/devthink@2.0.154 || 2.0.155 || 2.0.156 || 2.1.7'
73
81
  # the pnpm settings live here since pnpm 12 (the package.json pnpm field is
74
82
  # no longer read, and onlyBuiltDependencies died in pnpm 11 — the map below
75
- # is allowBuilds). the honest-site surface builds exactly the engines its db
76
- # layer and toolchain ride on; nothing else is granted a build script.
83
+ # is allowBuilds). THE 2.0.155 BUILDS GATE HEAL: the four-entry map froze
84
+ # the container install (ERR_PNPM_IGNORED_BUILDS on cpu-features, pnpm,
85
+ # protobufjs and ssh2 — every build-carrying package the tree holds must
86
+ # answer the map, true or false, or the frozen install refuses), so the
87
+ # map rides the complete forge form: ssh2 answers false on purpose (the
88
+ # native accelerator refuses the runner node, the pure js fallback carries
89
+ # the line) and pnpm answers false the same way; everything else builds.
77
90
  allowBuilds:
78
91
  '@prisma/engines': true
92
+ '@tailwindcss/oxide': true
79
93
  better-sqlite3: true
94
+ cpu-features: true
80
95
  esbuild: true
96
+ pnpm: false
81
97
  prisma: true
98
+ protobufjs: true
99
+ ssh2: false
100
+ workerd: true
82
101
  dangerouslyAllowAllBuilds: false
@@ -0,0 +1,157 @@
1
+ {
2
+ "name": "pnpmboot",
3
+ "version": "0.0.0",
4
+ "lockfileVersion": 3,
5
+ "requires": true,
6
+ "packages": {
7
+ "": {
8
+ "name": "pnpmboot",
9
+ "version": "0.0.0",
10
+ "dependencies": {
11
+ "pnpm": "12.3.4"
12
+ }
13
+ },
14
+ "node_modules/@pnpm/exe.darwin-arm64": {
15
+ "version": "12.3.4",
16
+ "resolved": "https://registry.npmjs.org/@pnpm/exe.darwin-arm64/-/exe.darwin-arm64-12.3.4.tgz",
17
+ "integrity": "sha512-PAyUol8T1+/+ViOiXAt51ECA+QnfXCqz6foL4bW+LsoX0NcVd5XVEM2mRQu+LV4oc7uRz9zf9U0P+XFfuQeDAw==",
18
+ "cpu": [
19
+ "arm64"
20
+ ],
21
+ "license": "MIT",
22
+ "optional": true,
23
+ "os": [
24
+ "darwin"
25
+ ]
26
+ },
27
+ "node_modules/@pnpm/exe.darwin-x64": {
28
+ "version": "12.3.4",
29
+ "resolved": "https://registry.npmjs.org/@pnpm/exe.darwin-x64/-/exe.darwin-x64-12.3.4.tgz",
30
+ "integrity": "sha512-fxP9JCk0Cdye+ePuj+GJJLMUMTqHGWRdb1dtv4How876uQ2ehxvenpgiYAir/ceO9PsYUZkFTtyZdx+rRu5QOA==",
31
+ "cpu": [
32
+ "x64"
33
+ ],
34
+ "license": "MIT",
35
+ "optional": true,
36
+ "os": [
37
+ "darwin"
38
+ ]
39
+ },
40
+ "node_modules/@pnpm/exe.linux-arm64": {
41
+ "version": "12.3.4",
42
+ "resolved": "https://registry.npmjs.org/@pnpm/exe.linux-arm64/-/exe.linux-arm64-12.3.4.tgz",
43
+ "integrity": "sha512-t71AVA7LRqiKTyZ5xMYaZc2n5DfdpMbfokZuiIOXHBOM03ECnF0t4iYwaBDqJgVjlKYUOwaF/bRQajGNA4cJ4w==",
44
+ "cpu": [
45
+ "arm64"
46
+ ],
47
+ "libc": [
48
+ "glibc"
49
+ ],
50
+ "license": "MIT",
51
+ "optional": true,
52
+ "os": [
53
+ "linux"
54
+ ]
55
+ },
56
+ "node_modules/@pnpm/exe.linux-arm64-musl": {
57
+ "version": "12.3.4",
58
+ "resolved": "https://registry.npmjs.org/@pnpm/exe.linux-arm64-musl/-/exe.linux-arm64-musl-12.3.4.tgz",
59
+ "integrity": "sha512-FBOt0/7ye6O6q4AllVV5QMviB6qE6fqkeczV/+MDWQsmo+QJrlfsh6X7CpH/tClVpBZEyIbjpUoT8bNhCYBxEg==",
60
+ "cpu": [
61
+ "arm64"
62
+ ],
63
+ "libc": [
64
+ "musl"
65
+ ],
66
+ "license": "MIT",
67
+ "optional": true,
68
+ "os": [
69
+ "linux"
70
+ ]
71
+ },
72
+ "node_modules/@pnpm/exe.linux-x64": {
73
+ "version": "12.3.4",
74
+ "resolved": "https://registry.npmjs.org/@pnpm/exe.linux-x64/-/exe.linux-x64-12.3.4.tgz",
75
+ "integrity": "sha512-2ZqOlSPkfwX1h5cR+FPiWf8+F+2hZT/3TvhUK5sigHqwaQCIiq8R7CGxhndKs63JtcLi2a1Qpo+wX/EoyfjyJQ==",
76
+ "cpu": [
77
+ "x64"
78
+ ],
79
+ "libc": [
80
+ "glibc"
81
+ ],
82
+ "license": "MIT",
83
+ "optional": true,
84
+ "os": [
85
+ "linux"
86
+ ]
87
+ },
88
+ "node_modules/@pnpm/exe.linux-x64-musl": {
89
+ "version": "12.3.4",
90
+ "resolved": "https://registry.npmjs.org/@pnpm/exe.linux-x64-musl/-/exe.linux-x64-musl-12.3.4.tgz",
91
+ "integrity": "sha512-RPmk7Jb/aYaFvL2iyDN/AtMY+hUEsue732WmXpcuQ9tBpMnGyA5py7Z3+e+qmQaJ0zY/4ni9jJiyPBQHujmv6w==",
92
+ "cpu": [
93
+ "x64"
94
+ ],
95
+ "libc": [
96
+ "musl"
97
+ ],
98
+ "license": "MIT",
99
+ "optional": true,
100
+ "os": [
101
+ "linux"
102
+ ]
103
+ },
104
+ "node_modules/@pnpm/exe.win32-arm64": {
105
+ "version": "12.3.4",
106
+ "resolved": "https://registry.npmjs.org/@pnpm/exe.win32-arm64/-/exe.win32-arm64-12.3.4.tgz",
107
+ "integrity": "sha512-ANyrHqyqco6SXBysUTRF74itDyyraea7IbFsKFdNXTjcFnfycTDx37EwuhdpPYFNSIh2JhUG4fByclsRfiHX7w==",
108
+ "cpu": [
109
+ "arm64"
110
+ ],
111
+ "license": "MIT",
112
+ "optional": true,
113
+ "os": [
114
+ "win32"
115
+ ]
116
+ },
117
+ "node_modules/@pnpm/exe.win32-x64": {
118
+ "version": "12.3.4",
119
+ "resolved": "https://registry.npmjs.org/@pnpm/exe.win32-x64/-/exe.win32-x64-12.3.4.tgz",
120
+ "integrity": "sha512-WH/KqBPY/hq2Tb7SgQltEZytimcjgKRaCRL/aM9CI0c67iKc5TVmHUhIiL3Ux9FB4bWn36i6XewUcScQI+zG8w==",
121
+ "cpu": [
122
+ "x64"
123
+ ],
124
+ "license": "MIT",
125
+ "optional": true,
126
+ "os": [
127
+ "win32"
128
+ ]
129
+ },
130
+ "node_modules/pnpm": {
131
+ "version": "12.3.4",
132
+ "resolved": "https://registry.npmjs.org/pnpm/-/pnpm-12.3.4.tgz",
133
+ "integrity": "sha512-lhqkH7B32joEpEHZ+OFevAyW2o73ELLrZ7+e58sGEOq9SPH9hfUc/+c4RnhfoPh8VqOocqHYk/hEZ0G1zORUVw==",
134
+ "hasInstallScript": true,
135
+ "license": "MIT",
136
+ "bin": {
137
+ "pn": "pn",
138
+ "pnpm": "pnpm",
139
+ "pnpx": "pnpx",
140
+ "pnx": "pnx"
141
+ },
142
+ "engines": {
143
+ "node": ">=18.*"
144
+ },
145
+ "optionalDependencies": {
146
+ "@pnpm/exe.darwin-arm64": "12.3.4",
147
+ "@pnpm/exe.darwin-x64": "12.3.4",
148
+ "@pnpm/exe.linux-arm64": "12.3.4",
149
+ "@pnpm/exe.linux-arm64-musl": "12.3.4",
150
+ "@pnpm/exe.linux-x64": "12.3.4",
151
+ "@pnpm/exe.linux-x64-musl": "12.3.4",
152
+ "@pnpm/exe.win32-arm64": "12.3.4",
153
+ "@pnpm/exe.win32-x64": "12.3.4"
154
+ }
155
+ }
156
+ }
157
+ }
@@ -0,0 +1,6 @@
1
+ {
2
+ "name": "pnpmboot",
3
+ "version": "0.0.0",
4
+ "private": true,
5
+ "dependencies": { "pnpm": "12.3.4" }
6
+ }
package/pom.xml ADDED
@@ -0,0 +1,29 @@
1
+ <?xml version="1.0" encoding="UTF-8"?>
2
+ <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
3
+ <modelVersion>4.0.0</modelVersion>
4
+ <groupId>io.github.wenathlan</groupId>
5
+ <artifactId>cobaia</artifactId>
6
+ <version>${revision}</version>
7
+ <packaging>jar</packaging>
8
+ <name>cobaia single distribution</name>
9
+ <description>The single cobaia maven distribution: the documentation set and the tests directory embedded as jar resources in the one io.github.wenathlan.cobaia artifact. cobaia is the monetization surface — the plans, the support rails and the honest advertisement slots.</description>
10
+ <url>https://github.com/wenathlan/devthink</url>
11
+ <licenses><license><name>GPL-3.0-only</name><url>https://www.gnu.org/licenses/gpl-3.0.html</url></license></licenses>
12
+ <scm><url>https://github.com/wenathlan/devthink</url><connection>scm:git:https://github.com/wenathlan/devthink.git</connection></scm>
13
+ <distributionManagement><repository><id>github</id><name>GitHub Packages</name><url>https://maven.pkg.github.com/wenathlan/devthink</url></repository></distributionManagement>
14
+ <properties>
15
+ <revision>2.0.158</revision>
16
+ </properties>
17
+ <build>
18
+ <resources>
19
+ <resource>
20
+ <directory>.</directory>
21
+ <includes>
22
+ <include>README.md</include>
23
+ <include>docs/**</include>
24
+ <include>tests/**</include>
25
+ </includes>
26
+ </resource>
27
+ </resources>
28
+ </build>
29
+ </project>
@@ -1,7 +1,7 @@
1
1
  /**
2
2
  * Sol theme anchor — layer 2 of the anchor architecture.
3
- * The file carrying the theme folder's own name (Sol/Sol.tsx, beside
4
- * Sol/sol.css) is the path manager of the pages: it imports one anchor per
3
+ * The file carrying the theme folder's own name (sol/Sol.tsx, beside
4
+ * sol/sol.css) is the path manager of the pages: it imports one anchor per
5
5
  * page folder (`folder/folder.tsx`, each beside the loose components its
6
6
  * folder keeps) and mounts every route of the theme. App.tsx consumes only
7
7
  * this file and the theme stylesheet; no page component is ever imported
@@ -3,7 +3,7 @@
3
3
  * The file carrying the folder's own name is the path manager of the page:
4
4
  * it imports the loose components beside it (the roster data), mounts the
5
5
  * page and re-exports the public component surface. Only the theme anchor
6
- * (Sol/Sol.tsx) consumes this file.
6
+ * (sol/Sol.tsx) consumes this file.
7
7
  *
8
8
  * The app directory of the cobaia content site: the ten deploy units of the
9
9
  * family, each card carrying the honest one-line role and the deep link