Repository navigation
feat(skills): publish the skills catalog as @objectstack/skills in the fixed group - #22691
Merged
Merged
Conversation
…e fixed group The repository's skills/** ships as a versioned package: a new publishable package whose build copies the catalog into dist/skills/** byte for byte (scripts/sync-catalog.mjs, self-tested, --check at prepack) and whose files lists only that tree. The package joins the changeset fixed group, so its version is always the version of the @objectstack/* packages it teaches. Declared paths for the no-JS shape: the type-check coverage EXEMPT ledger, a turbo build override declaring $TURBO_ROOT$/skills/** as the build's input, the ci.yml core filter carrying that input (check-ci-filter-parity), and the parity self-test's live-tree pin moved with it. check-lockstep-package-count --fix moved the three prose restatements of the group's size to 70. Claude-Session: https://claude.ai/code/session_01RdnZdPZH9ByduzPRWuH9tN Co-authored-by: Claude <noreply@anthropic.com>
…/skills in scope check:llms-txt reconciles the package-ecosystem heading against the real non-private @objectstack/* workspace; the new package moves it 68 -> 69. The changeset carries the patch line for the published file. Claude-Session: https://claude.ai/code/session_01RdnZdPZH9ByduzPRWuH9tN Co-authored-by: Claude <noreply@anthropic.com>
Contributor
📓 Docs Drift Check
What this run could not see
Coarse fallback — 139 page(s) merely mention a changed package (the pre-#9192 predicate, kept for the deliberately-wide backstop): |
This was referenced Oct 10, 2026
…ADME's unlanded claim pnpm pack --json prints its lifecycle banner on stdout ahead of the JSON, and scripts/publish-smoke-pack.mjs parses that stdout, so a prepack on any publishable package reds both smokes at their pack step (reproduced: `pnpm pack --json returned non-JSON for @objectstack/skills`). The check moves to prepublishOnly, the @objectstack/console shape: pnpm publish still refuses a stale or absent tree; pnpm pack runs no lifecycle script. The README no longer says the scaffolder and the docs read the catalog from this package: neither has landed, and a published README states only what the platform does. Claude-Session: https://claude.ai/code/session_01RdnZdPZH9ByduzPRWuH9tN Co-authored-by: Claude <noreply@anthropic.com>
This was referenced Oct 10, 2026
This was referenced Oct 10, 2026
This was referenced Oct 10, 2026
…ills-package # Conflicts: # turbo.json
This was referenced Oct 11, 2026
This was referenced Oct 11, 2026
os-zhuang
approved these changes
Oct 11, 2026
This was referenced Oct 11, 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.
Part of #22658
Clause-②: no
Ruling A on #22649 (record 6096124407, maintainer 「22649 同意 A」): the published skills catalog ships as a versioned package in the changeset
fixedgroup. This is PR 1 of the two the card allows — the package. PR 2 (claude/issue-22658-compat-line-derived, Tier H) derives the frontmatter lines; the cli and devx halves (#22659, #22668) remain open and consume what this PR publishes.What this adds
packages/skills/— a new publishable package@objectstack/skills(version 17.7.0, the fixed group's;publishConfig.access: public;files: dist, README.md, CHANGELOG.md;exportsnames only./package.json, the@objectstack/consoleshape for a package with no JS entry). No second copy of a skill is committed and nothing is symlinked:dist/is gitignored and produced by the build.packages/skills/scripts/sync-catalog.mjs— the build: wipedist/, copy the repository root'sskills/**intodist/skills/**, read the copy back and refuse to finish unless the two trees are equal file for file and byte for byte;--checkruns that same comparison and is the package'sprepack, sopnpm pack/pnpm publishrefuse a stale or absent tree;--self-test(nine batteries over temp fixtures: byte equality, idempotence, a deleted source file not surviving a rebuild, byte change / extra file / missing file / absent tree each red, an empty catalog refused, a symlink refused rather than followed) runs as the first leg of the package'sbuild, the--self-test && runidiom everycheck:*alias uses, so it is never dormant and needs no new gate..changeset/config.json—@objectstack/skillsjoins thefixedgroup (70 members);.changeset/22658-skills-package.md—minorfor the new package, plus apatchline for@objectstack/specbecausepackages/spec/llms.txt(a published file) counts the scoped packages andcheck:llms-txtmoved it 68 → 69.pnpm-lock.yaml— the new importer (packages/skills: {}), aspnpm installwrites it;pnpm-workspace.yamlis untouched (packages/*already covers it).Why
dist/skills/, measuredskills@1.7.2'sexperimental_syncdiscovers a dependency's skills at exactly two places, read from itsdiscoverPackageSkills:PKG/skills/NAME/SKILL.mdandPKG/dist/skills/NAME/SKILL.md. Of the two,dist/is the one this repository already treats as a build output everywhere: canonical infilesforcheck:published-files(no EXTRA_ENTRIES row), gitignored repo-wide, turbo's defaultoutputs, and skipped by the directory walk ofcheck:published-readme-exports/check:published-readme-links— a copy atPKG/skills/would have put all 53 catalog markdown files into those two gates' published-markdown population whenever a build had run, so their verdict would have depended on local build state. The sibling cards wrotenode_modules/@objectstack/skills/skills/*before this measurement; the path they consume isnode_modules/@objectstack/skills/dist/skills/NAME/.Tarball and consumer measurement (the card's Done-when)
pnpm packfrompackages/skillson the built tree:prepackran--check(65 files byte-identical), tarballobjectstack-skills-17.7.0.tgz, 68 entries — 65 underpackage/dist/skills/(10SKILL.md, 21 references, 18 rules, 15 evals, the catalog README) pluspackage.json,README.md,LICENSE. Installed in a throwaway project outside the repository (npm install --save-dev FILE.tgz), thennpx -y skills@latest experimental_sync --yes --agent claude-code:Found 10 skills in node_modules, each listed asNAME from @objectstack/skills;.agents/skills/NAMEas a symlink to../../node_modules/@objectstack/skills/dist/skills/NAMEand.claude/skills/NAMEas a symlink to../../.agents/skills/NAME; 64 files reachable through.claude/skills(65 minus the catalog README, which is not a skill);diff -rof.agents/skills/objectstack-dataagainst the package copy: identical;skills-lock.jsonrecords each skill withsource: @objectstack/skills,sourceType: node_modules,skillPath: dist/skills/NAME/SKILL.md,version: 17.7.0.So the sync fits the layout;
--copycopies instead of linking. The cli card can use the sync as is.Every gate that must learn a no-JS package, through its declared path
check:type-check-coverage— an EXEMPT ledger row beside@objectstack/console(no TypeScript sources, no tsconfig).check:dts-closure,check:dual-build-cjs-loads,check:sourcemap-no-sources-content,check:lean-entry-closure— nothing declared: the populations are derived (a built package whose manifest declares no declaration path owes none; norequireentry, no.map, no lean entry). Measured on the fully built tree:check-dts-closure: 1 built package(s) declare no declaration entry point and owe noneon the package alone, and all four green over the 73-task build.check:published-files—dist+ README + CHANGELOG are canonical;exportspresent (70 publishable packages, census floor 50).check-published-list-mirrorsdoes not fit (it mirrors a constant into AGENTS.md), so byte equality is proven by the copy step's self-test, as the card allows.turbo.json—@objectstack/skills#builddeclares$TURBO_ROOT$/skills/**as an input (otherwise an edit underskills/**is a cache hit replaying a stale copy, remote cache included). Probe on this tree: one byte appended toskills/objectstack-data/SKILL.md→cache miss, executing aca937c23b400d14; restored to HEAD (blob equal,git diff HEADempty) →cache hit, replaying logs 47fea834c3a0ce5a..github/workflows/ci.yml— thecore:filter gainsskills/**, becausecheck-ci-filter-parityrequires every$TURBO_ROOT$build input to be covered there (OK: all 21 build input(s) … covered by core). Its self-test pins the livecrosspkgrollback count over the LIVE table on purpose; withcorenow covering the skills root the rollback uncovers 19 instead of 22, and the pin moved with the tree (the two by-name assertions now assert coverage throughcore), recorded in its comment.check:lockstep-package-count --fix— the three prose restatements of the group's size (two incontent/docs/protocol/backward-compatibility.mdx, one inscripts/publish-smoke-pack.mjs's header) 69 → 70;check:llms-txt—packages/spec/llms.txt68 → 69 (the gate's own remedy: the number and the prose).pnpm changeset status:@objectstack/skillsis listed among the 70 fixed-group packages to be bumped, at the group's pending level (major, from the v18 stock already onmain).Gates run (exit codes captured before any pipe)
Derived with
node scripts/pm/dispatch-gates.mjs --commands --repo objectstack-ai/objectstackon the changed set and reconciled with--ran: 140 derived, 140 run, 0 UNRUN. All exit 0 except two prerequisite refusals (exit 3, NOT MEASURED, neither reads this diff's surface):check-plugin-teardown-shape --self-test(needs an unshallow clone) and, before the build,check:docs-transcript-drift(needs@objectstack/lintbuilt — green after the build). Highlights:check:published-files,check:type-check-coverage,check:type-check-debt,check:ci-filter-parity(+ self-test, 131 assertions),check:changeset-fixed(70 public packages in sync),check:lockstep-package-count,check:llms-txt,check:published-readme-links(102 published markdown files),check:published-readme-exports,check:dts-closure,check:dual-build-cjs-loads,check:sourcemap-no-sources-content,check:lean-entry-closure,check:skill-compatibility,check:skill-identifier-liveness,check:doc-authoring,check:nul-bytes,check:pm-governed-prose,check:merge-driver, the three changeset gates againstorigin/main, speccheck:docs/check:skill-examples(262 prose examples type-check),check:pm-dispatch-gates(fast tier: 1825 cases pass; 6 slow sections deferred to CI). Full workspace build under the verify lock: 73 tasks successful,VERDICT command-exit 0, held 350s.Lint, narrowed and measured at
3372d78b1: eslint over the four JavaScript files this PR touches (packages/skills/scripts/sync-catalog.mjs,scripts/check-ci-filter-parity.mjs,scripts/check-type-check-coverage.mjs,scripts/publish-smoke-pack.mjs) —--format json: 4 files, 0 errors, 0 warnings. Population:eslint.config.mjsjudges.; invariance: the config enables no type-aware linting (its own note: noparserOptions.project, no typed rules), so this diff cannot move the verdict of any untouched file; the repo-wide run is CI's.Acceptance notes
npm create objectstackand the docs read the catalog from this package describes the ruling's end state; [Ruling A on #22649] create-objectstack installs the skills catalog from the installed @objectstack/skills package, not from GitHub main; the scaffolded project depends on it at the spec's version #22659 and [Ruling A on #22649] docs: the skills install command reads the catalog from the installed @objectstack/skills package; the GitHub path is documented as the next (unreleased main) channel only #22668 are the halves that make it true and are not addressed here.metadata.versionand thecompatibility:majors are untouched here; PR 2 derives them.scripts/publish-smoke-pack.mjs's header digit moved, which schedules the advisoryOS Create Smokeworkflow on this PR.@objectstack/consoleis the nearest shape and was copied for the manifest.维护者速读(草稿)
@objectstack/skills,构建时把仓库根目录的skills/**原样复制进dist/skills/,进 changesetfixed组,版本号恒等于@objectstack/spec。skills/**本身不动、不搬、不做符号链接。main取技能,拿到的是在教 v18 写法的文本;发成包以后,装哪个版本就拿哪个版本的技能(已用打包 +npx skills experimental_sync实测:10 个技能全部从node_modules装入)。fixed组从 69 变 70,三处文案计数与llms.txt的计数随之改动。回滚 = 从fixed组移除并删掉目录,其余文件不受影响。Generated by Claude Code