Repository navigation
docs: CONTRIBUTING §Publishing describes what this repo actually does - #1780
Merged
huangyiirene merged 1 commit intoSep 8, 2026
Merged
Conversation
…#1741) The section handed a maintainer `pnpm release` — no such key exists in `package.json` `scripts` — and described it as running `pnpm build && changeset publish` to "publish each non-private package". Both halves were false. `hotcrm` is the only package Changesets sees and it is `private: true`, so `getUnpublishedPackages`' `!pkg.packageJson.private` filter leaves an empty set, and `privatePackages.tag` is `false`, so the tag-only leg is empty too: `changeset publish` names nothing here. The correct answer was already in the section's own closing note, three lines below the wrong command. It is now the body: nothing goes to an npm registry, the app ships to the ObjectStack marketplace, and `docs/RELEASE_STRATEGY.md` is linked as the single source of truth for the release sequence instead of having its checklist restated. Removed with it, as the same retired multi-package shape archived under `docs/archive/`: the paragraph claiming `.ts` sources are never published and the `files` field it cited (this `package.json` has none — its `exports` in fact point at `objectstack.config.ts`), and the claim that packages go to a private GitHub Packages registry, a host with zero occurrences anywhere else in the tree. No `release` script was added: the command it would alias already exists and is already the right answer, and writing the documented semantics into code would have turned a wrong sentence into a wrong script. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01PpRjGNnwyo2J1rrmekxB1W
|
The latest updates on your projects. Learn more about Vercel for GitHub. |
huangyiirene
marked this pull request as ready for review
September 8, 2026 11:17
This was referenced Sep 8, 2026
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Fixes #1741
CONTRIBUTING.md§Publishing only. Refs #1503 (where it was found) and #1600 / PR #1736 (which rewrote the page this now links to) — neither is addressed here and both remain open or closed on their own terms.What was wrong
The section handed a maintainer
pnpm releaseand described it as runningpnpm build && changeset publishto "publish each non-private package". Re-derived on this branch, ⛔ inheriting nothing from the card:changeset publishreally does name an empty set — verified, not taken on the card's wordAgainst the installed pin
@changesets/cli@3.0.2, side-effect-free (⛔ no publish was attempted):@manypkg/get-packageson this root reportstool: root, one package —hotcrm,private: true.dist/getPublishPlan.mjsgetUnpublishedPackagesfilterspackages.packages.filter((pkg) => !pkg.packageJson.private && !shouldSkipPackage(pkg, options))⇒[].config.privatePackages.tag ? getUntaggedPrivatePackages(…) : [], and.changeset/config.jsonsetsprivatePackages: { version: true, tag: false }⇒[].if (releases.length === 0 && tagReleases.length === 0) return [];So the card's second finding holds, and the section can state it as fact rather than hedge.
What it says now
Nothing here is published to an npm registry; the app ships to the ObjectStack marketplace;
pnpm publish:marketplace:dry-run/pnpm publish:marketplaceare handed over directly. The correct answer was already in this section's own>note three lines below the wrong command — this promotes it to the body rather than inventing content.Cross-link, not merge — the grading's Zone 3 lean, confirmed after reading both documents.
docs/RELEASE_STRATEGY.mdis now 110 lines and already carries the whole runbook: version sources, the five-step checklist throughpnpm changeset:version/pnpm build/pnpm publish:marketplace, theobjectstack.config.tsmanifest versionchangeset versiondoes not touch, and §Source Availability, which is a correct current-shape replacement for the very paragraph deleted below. Restating any of that inCONTRIBUTING.mdwould rebuild the second copy that drifted into this card. The section therefore links it as the single source of truth and stops.⛔ Deliberately not copied across:
docs/RELEASE_STRATEGY.md§Marketplace Publish's "Authenticate once:objectstack cloud login". See 验收备注 — that line looks wrong, and propagating it would repeat exactly the failure this card is about.The retired multi-package shape, handled in the same pass
Three claims went, all measured false against this tree, not merely stale-looking:
dist/folder is included … (controlled by thefilesfield in eachpackage.json)"package.jsonhas nofileskey.tsfiles) is never published"mainandexportsboth point at./objectstack.config.ts— a.tsfile is the package entryhttps://npm.pkg.github.com) withrestrictedaccess"publishConfig, and.npmrcnames no registry. The real path isscripts/publish-marketplace.mjs, which POSTsdist/objectstack.jsonto the cloud control planeThe third was not named in the card's scope list. It is the same defect class as the two that were, it sits inside the block being rewritten, and it is the plural-"Packages" voice of the same retired shape — so leaving it behind would have been leaving the section false.
⛔ No guard added
Per the standing ruling:
AGENTS.mdScope rule 3 routes drift-class gates upstream, and #1755 just proved an existing guard here sat vacuous for months. ⛔package.jsonwas not touched, and noreleasescript was added.Gates
pnpm verify— exit 0, captured before any pipe (pnpm verify > log 2>&1; EXIT=$?).line_budget: NOT APPLICABLE, cited from the gate's own output line rather than asserted:This diff touches 0
.tsfiles, so it is outside that surface entirely; all three ceilings are byte-identical to base.Two greens here are genuinely informative rather than vacuous:
control bytes : those 398, plus 544 under content, .changeset, docs, .github, .claude and 15 root file(s).CONTRIBUTING.mdis one of those 15 (ROOT_TEXT_FILESinscripts/lib/source-hygiene-surface.mjs) and the new changeset is among the 544, so✓ no raw control bytes in first-party filesactually covers both files this PR touches. Independently self-scanned:grep -naP '[\x00-\x08\x0b\x0c\x0e-\x1f\x7f]'on both, no hits..mdexact withcheck-modified-files-only: yes, so unlike an.mdxdiff it will really openCONTRIBUTING.md. The one link added —[docs/RELEASE_STRATEGY.md](docs/RELEASE_STRATEGY.md), replacing bare backticks — is therefore genuinely checked.Changeset form
Empty-frontmatter changeset, not the
skip-changesetlabel. Both are accepted, and.github/workflows/changeset-check.ymldocuments the empty form as "the sanctioned 'this PR releases nothing' declaration, on par with theskip-changesetlabel" — but they are not equivalent in what they leave behind:if:-skip, sochangeset statusnever runs;#1600 / PR #1736 — same class, internal release docs, ships nothing — landed with exactly this form. AGENTS.md's "do not reach for the label to get a red check green" points the same way. This PR ships nothing to HotCRM users: contributor-facing prose, no
src/metadata, and the root package carries nofileslist that could ship it.验收备注
Observations from this card's own file surface, ⛔ none filed and ⛔ none fixed here.
docs/RELEASE_STRATEGY.md§Marketplace Publish looks copy-and-it-fails. It says "Authenticate once:objectstack cloud login" and then "Then publish:pnpm publish:marketplace". Butscripts/publish-marketplace.mjstakes credentials only fromOS_CLOUD_URL/OS_CLOUD_API_KEYin the environment anddie()s without them (OS_CLOUD_URL is required); it reads no credential file and never mentions a login session. A maintainer following those two lines in order gets a hard failure. That is a class-(a) defect in a file this card holds read-only, so it is reported, not fixed. ⛔ Not filed as a card, and the reason is a real limitation rather than a judgement call: issue text search is dead in this container.repo:objectstack-ai/hotcrm is:issue is:open CONTRIBUTINGreturned 0 — a control that must match this very card, whose title contains the word — whilerepo:objectstack-ai/hotcrm state:openreturned 75. So the channel works and term matching does not, and I cannot run the dedupe search a new card requires. ⇒ handed to the PM to file. (REST was tried first and is blocked in this container; the MCP switch is declared.).changeset/config.jsonstill sets"access": "restricted", an npm-publish setting that is now inert, since nothing in this repo publishes through changesets. Cosmetic, no reader is misled, ⛔ not worth a card.承接者:无.维护者速读
⛔ Not required —
CONTRIBUTING.mdis not in this repo's governed set (docs/adr/**,.claude/**,skills/**,AGENTS.md,CLAUDE.md), so this takes the normal landing path.🤖 Generated with Claude Code
https://claude.ai/code/session_01PpRjGNnwyo2J1rrmekxB1W
Generated by Claude Code