Repository navigation
chore(packages): publishing metadata for the 73 published packages — per-format types, sideEffects, publishConfig, and 18 missing READMEs - #26198
Conversation
…ENSE for the 14 without one Each new README is one paragraph (what the package is), the one import a reader writes first, and a link to its docs page. The LICENSE files are byte copies of the root LICENSE, the same file the other 60 published packages carry: npm packs a package's own LICENSE regardless of `files`, and no release script copies the root one in. Claude-Session: https://claude.ai/code/session_01UH1DPuU5rAKoNbDzEyoEw6 Co-authored-by: Claude <noreply@anthropic.com>
…fests without one 56 of the 73 published root packages already declare it; the changesets config sets access public globally, so this changes no publish outcome and makes the manifests say the same thing a direct `npm publish` would need. Claude-Session: https://claude.ai/code/session_01UH1DPuU5rAKoNbDzEyoEw6 Co-authored-by: Claude <noreply@anthropic.com>
…thout it
Read per package, not a blanket value. An AST pass over every published
package's src listed the top-level statements that run on import (bare
imports, expression statements, top-level control flow); two packages do
work on import that a consumer relies on by importing alone:
- service-cluster-redis registers its `redis` cluster driver at module
load ("importing this package is enough"), so its two entry files are
declared side-effectful;
- create-objectstack's bin reaches the program through a bare
`import '../dist/index.js'`, which parses argv at module load.
Everything else is `false`: the remaining hits register into a registry in
the same module that exports its readers (formula's dialect engines,
objectql's ajv formats), build a process-wide store inside that module's
own initialiser (observability), assert a constant at load (types), or
only act when the file is the process entry (cli).
Claude-Session: https://claude.ai/code/session_01UH1DPuU5rAKoNbDzEyoEw6
Co-authored-by: Claude <noreply@anthropic.com>
…sitory fields publint asks for
attw read one `types` entry for both module formats on 39 manifests, so a
TypeScript consumer importing the ESM build was handed the CJS
declarations ("masquerading as CJS" — 38 FalseCJS, plus FalseESM on
@objectstack/core, whose two entries had it the other way round). Each
`{types, import, require}` entry becomes `{import: {types, default},
require: {types, default}}`, pointing at the declaration file the same
tsup run already emits for that format. No subpath is added or removed and
no JavaScript target changes.
Alongside, three things publint reported:
- `"type"` on the 39 manifests that shipped `.js` without declaring a
format. Every `.js` under their `dist/` was read first and is CommonJS,
which is what the absent field already meant. `@objectstack/console` and
`@objectstack/skills` ship no JavaScript at all, so they stay unset.
- `engines.node >= 22.0.0` on the 22 that had no `engines`, the value the
other 51 already declare.
- `repository.url` as the full `git+https://` git URL on 71 of them; two
manifests already spelled it that way.
Claude-Session: https://claude.ai/code/session_01UH1DPuU5rAKoNbDzEyoEw6
Co-authored-by: Claude <noreply@anthropic.com>
The LICENSE group is 2,828 of this branch's 4,012 changed lines (each file is a 202-line byte copy of the root LICENSE), which puts the PR over the 3,000-line human-merge threshold on its own. It lands as a second PR off this branch once this one is merged; the manifests and the new READMEs are unaffected by the split. Claude-Session: https://claude.ai/code/session_01UH1DPuU5rAKoNbDzEyoEw6 Co-authored-by: Claude <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01UH1DPuU5rAKoNbDzEyoEw6 Co-authored-by: Claude <noreply@anthropic.com>
…s declaration build
`@objectstack/core` emits `dist/index.d.ts` and `dist/index.d.cts` as two
separate declarations of the same classes, `ObjectKernel`'s private
`plugins` among them. Serving them per condition hands a consumer that
reaches core through BOTH resolution modes two incompatible types, which
is what `@objectstack/plugin-dev` does: its `await
import('@objectstack/objectql')` resolves with `resolution-mode: import`
inside a CommonJS declaration build while its static core import resolves
`require`. Measured: `pnpm --filter @objectstack/plugin-dev build` fails
with TS2345 on dev-plugin.ts:523 ("Types have separate declarations of a
private property 'plugins'") with the split in place, and passes without
it.
So core's two entries keep the single `types` they had, and the two attw
`FalseESM` problems they carry stay open — the fix is core's dual build,
not its export map, which is a card of its own. The other 38 manifests
keep the split: their declaration pairs are tsup's `.d.ts`/`.d.mts`
emission of one source and carry no private-member identity.
Claude-Session: https://claude.ai/code/session_01UH1DPuU5rAKoNbDzEyoEw6
Co-authored-by: Claude <noreply@anthropic.com>
📓 Docs Drift Check
What this run could not see
Coarse fallback — 175 page(s) merely mention a changed package (the pre-#9192 predicate, kept for the deliberately-wide backstop): |
席位核对 · ACCEPT · devx seat 2 · 2026-10-26T15:22ZSeat
Generated by Claude Code |
… shape
Both pins asserted the old `{types, import, require}` entry verbatim, so
the per-format split this branch makes reds them on purpose (Test Core
6/8). They now pin the new shape: `import` typed by tsup's `.d.mts`,
`require` by its `.d.ts`, `types` first inside each condition. What each
pin exists for — the subpath is published and `dist` is whitelisted — is
unchanged.
Claude-Session: https://claude.ai/code/session_01UH1DPuU5rAKoNbDzEyoEw6
Co-authored-by: Claude <noreply@anthropic.com>
席位核对 · ACCEPT · devx seat 2 · 2026-10-26T15:56ZSeat
Generated by Claude Code |
⛔ merge queue 构建失败 — 先分诊,再决定要不要重排队列构建 40358686385 红了。队列跑的是全量套件(PR 侧 CI 只跑 affected 子集), 分类: 失败的 job(日志抽取,best effort):
跨 PR 相同签名(24h,按失败测试文件聚合):
历史信号:
分诊清单:
Generated by Claude Code · merge-queue-triage workflow (#4859) |
Resolves packages/sdui-parser/package.json: main's publishing metadata (#26198, engines) and this branch's LICENSE-MIT `files` entry both kept. Co-Authored-By: Claude <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01A6SEitNngAMugGbuJHWsDS
Requested by Steve · project thread
Part of #26095
Clause-②: no
Metadata-protocol: none
#26095 asks for two things in order: one reading of publint and @arethetypeswrong over the 73 published packages outside
ui/, then the repairs that reading names. This PR carries the reading, the manifest repairs and the 18 missing READMEs. The 14 LICENSE copies the card also asks for are 2,828 lines of byte-identical text on their own, which puts the two halves together over the 3,000-line threshold, so they land as a second PR off this branch once this one merges (that is why this body saysPart of, notFixes).The reading
publint 0.3.25 and @arethetypeswrong/cli 0.18.5, over all 73 non-private manifests under
packages/**(none underui/), each staged asnpm packwould ship it — the manifest, thefileswhitelist,README/LICENSE/CHANGELOGand eachbintarget — on a freshorigin/main(d1ea2363f) build of every one of them. No gate is added for either tool; this is the one-time reading the card asks for.Per package, every row that carried an attw problem before or still carries one:
@objectstack/spec@objectstack/platform-objects@objectstack/cli@objectstack/metadata@objectstack/core@objectstack/lint@objectstack/metadata-core@objectstack/plugin-auth@objectstack/service-clustercreate-objectstack@objectstack/connector-imap@objectstack/driver-memory@objectstack/objectql@objectstack/plugin-webhooks@objectstack/service-datasource@objectstack/types@objectstack/account@objectstack/client@objectstack/client-react@objectstack/connector-mcp@objectstack/connector-openapi@objectstack/connector-rest@objectstack/connector-slack@objectstack/driver-mongodb@objectstack/driver-sql@objectstack/driver-sqlite-wasm@objectstack/driver-turso@objectstack/embedder-openai@objectstack/formula@objectstack/hono@objectstack/knowledge-memory@objectstack/knowledge-ragflow@objectstack/organizations@objectstack/plugin-approvals@objectstack/plugin-audit@objectstack/plugin-dev@objectstack/plugin-email@objectstack/plugin-hono-server@objectstack/plugin-pinyin-search@objectstack/plugin-security@objectstack/plugin-sharing@objectstack/sdui-parser@objectstack/service-sms@objectstack/setup@objectstack/studio@objectstack/trigger-api@objectstack/trigger-record-change@objectstack/trigger-scheduleWhat was repaired
typesentry served both formats, so a TypeScript consumer importing the ESM build was handed the CJS declarations — every one of attw's 38FalseCJS. Each{types, import, require}entry becomes{import: {types, default}, require: {types, default}}, pointing at the declaration file the same tsup run already emits for that format. No subpath is added or removed and no JavaScript target moves.sideEffectson the 72 manifests that declared none (only@objectstack/specdid), read per package rather than set in bulk, as the card requires. An AST pass over every published package'ssrclisted the top-level statements that run on import — bare imports, expression statements, top-level control flow — and two packages do work on import that a consumer gets by importing alone, so they declare their entry files side-effectful instead offalse:@objectstack/service-cluster-redisregisters itsrediscluster driver at module load ("importing this package is enough"), andcreate-objectstack's bin reaches its program through a bareimport '../dist/index.js'. Everything else isfalse: the remaining hits register into a registry in the same module that exports its readers (formula's dialect engines,objectql's ajv formats), build a process-wide store inside that module's own initialiser (observability), assert a constant at load (types), or act only when the file is the process entry (cli).publishConfig: { access: 'public' }on the 17 that had none, the value the other 56 declare.typeon the 39 that shipped.jswithout declaring a format. Every.jsunder theirdist/was read first and is CommonJS, which is what the absent field already meant.@objectstack/consoleand@objectstack/skillsship no JavaScript at all, so they stay unset and keep publint's suggestion.engines.node >= 22.0.0on the 22 that had noengines, andrepository.urlas the fullgit+https://git URL on 71 (two already spelled it that way).What is left, and why
@objectstack/corekeeps its singletypesentry, so its twoFalseESMstay open. Itsdist/index.d.tsanddist/index.d.ctsare two separate declarations of the same classes,ObjectKernel's privatepluginsamong them, so serving them per condition hands a consumer that reaches core through BOTH resolution modes two incompatible types.@objectstack/plugin-devis that consumer: itsawait import('@objectstack/objectql')resolves withresolution-mode: importinside a CommonJS declaration build while its static core import resolvesrequire. Measured with the split in place:pnpm --filter @objectstack/plugin-dev buildfailsTS2345atsrc/dev-plugin.ts:523with "Types have separate declarations of a private property 'plugins'"; without it, exit 0. The fix is core's dual build, not its export map.NoResolutionundernode10, on the 15 packages with subpath exports. TypeScript's legacynoderesolution predatesexportsand cannot read a subpath from it at all. Every package here declaresengines.node >= 22.0.0, and the alternative — atypesVersionsmap — is a second declaration of the same surface, drifting fromexportsthe day either is edited. Left declared rather than mirrored.CJSResolvesToESMon four subpaths (cli././console/./hook-body,create-objectstack/created-summary,metadata-core/testing,service-cluster/testing): these are ESM-only entries, so arequire()from CommonJS reaches ESM. Making them dual-format changes the export map's shape, which packages: 73 published root packages carry inconsistent publishing metadata — 18 without README, about 13 without LICENSE, about 33 with main on the ESM file and one types entry for both formats, 19 without publishConfig, sideEffects only in spec #26095 puts outside this card.FalseExportDefaulton@objectstack/driver-memory: itssrc/index.tsships anexport defaultobject whose CJS build lands as adefaultproperty. The repair is the package's own export surface, which this card does not touch.The three classes above are reported to the seat as out-of-scope findings for cards of their own.
Verification
turbo run build --forceover all 73 published packages at this head: 72 of 72 tasks successful (73 packages, one with no build task). Thetypeadditions are the risk this run exists to answer — tsup picks output extensions offtype— and the built file set is byte-for-byte the same list of names: 1,103distJS and declaration files before and after,diffclean.pnpm --filter @objectstack/plugin-dev build: exit 0 at this head.dispatch-gates --commandsderived 95 families for this diff; the run record reconciles with--ranat 95 accounted, 94 run, 0 unrun. Every one of the 94 exits 0. The one NOT MEASURED ischeck-plugin-teardown-shape.mjs --self-test, which refuses its own prerequisite on a shallow clone (exit 3, its reserved code) because its positive-control fixture is pinned to a commit this checkout cannot reach; its real scan,node scripts/check-plugin-teardown-shape.mjs, exits 0.check-engine-split-ratio.mjs --days 90refuses the same way for the same reason and was re-run as its--self-test, which passes. CI has the full history.check:published-files,check:published-readme-exports,check-published-readme-links.mjs,check:manifest-repository-directory,check:dts-closure,check:lean-entry-closure,check:dual-build-cjs-loads,check:lockstep-package-count,check-changeset-fixed.mjs,check-empty-changeset.mjs --base origin/main,check:sdui-manifest(the manifest re-records byte-identical).pnpm lintfirst among them) and the type-check lanes are CI's runs, not this branch's.Changeset
One
patchin.changeset/26095-publishing-metadata.md, naming all 73 packages: every one of them ships a changed manifest, and 18 also ship a new README.Generated by Claude Code