Skip to content

fix(apps): the batch-1 connector apps carry their own iconUrl - #28662

Merged
objectstack-fleet[bot] merged 1 commit into
mainfrom
claude/project-thread-69wo4m
Nov 1, 2026
Merged

objectstack-fleet[bot] merged 1 commit into
mainfrom
claude/project-thread-69wo4m

Conversation

@objectstack-fleet

Copy link
Copy Markdown
Contributor

Requested by Leehom · project thread

Fixes #28588

Clause-②: no
Metadata-protocol: none

维护者速读

  • 改了什么:两个首批连接器应用(GitHub、Stripe)各自带上一个包内自有的图标 assets/icon.svg,objectstack.manifest.json 加上指向它的 iconUrl(main 上的 raw.githubusercontent.com 地址,和 HotCRM 的写法一致)。
  • 为什么改:市场审核要求上架有图标;之前两份清单都没有,云端上架脚本只能靠 --icon-url 临时补。
  • 风险与回滚:极低。两个包都是 private,不发 npm;只加一个清单键(schema 早已允许)、两张 SVG 和测试。回滚即还原这三处。
  • 先看:packages/apps/connector-github/objectstack.manifest.json(新增的 iconUrl 行);packages/apps/connector-github/test/listing.test.ts(新增的三个用例);packages/apps/connector-github/assets/icon.svg。
  • 两分钟验证:pnpm --filter @objectstack/connector-app-github exec vitest run test/listing.test.ts,预期 8/8 通过;把清单里的 iconUrl 行删掉再跑,预期 2 个用例失败。
  • 需要你做的:无,席位落地。

What changes

  • packages/apps/connector-github/assets/icon.svg, packages/apps/connector-stripe/assets/icon.svg (new): a neutral connector glyph (a white plug on a rounded square, 256 by 256, the same frame as HotCRM's assets/icon.svg), slate for GitHub and teal for Stripe. No vendor artwork.
  • Both objectstack.manifest.json files gain iconUrl: https://raw.githubusercontent.com/objectstack-ai/objectstack/main/packages/apps/APP/assets/icon.svg, with APP the package directory. It resolves once this PR is on main; that is the shape the handbook's HotCRM example uses (content/docs/deployment/marketplace-handbook.mdx, the worked example).
  • Both test/listing.test.ts files (extended rather than a parallel file, since they already read the manifest) gain three cases:
    • carries a public http(s) iconUrl: the manifest's iconUrl is a string that parses as a URL with an http: or https: scheme. TemplateManifestSchema takes any URL scheme, so the scheme is checked in the test.
    • refuses an iconUrl that is absent or not http(s): the control. The same predicate answers a problem for the manifest without the key, for an ftp: URL and for a relative path (fixture objects, no file edit).
    • points iconUrl at the icon this package owns: the URL is the one above, assets/icon.svg exists in the package, it is under the 256 KB bound --icon-file uses, and it is a 256 by 256 SVG.

Icon choice and brand basis

I shipped the neutral glyph for both apps. I could not cite a usage permission for either vendor's logo from this session, and the order says not to download a vendor logo without one, so the card's safe default applies. Both icons are drawn here, from primitives, and carry no vendor mark. The listing still names the vendor in displayName; a vendor mark can replace the glyph later in its own PR once someone cites that vendor's published permission.

Publishing

Both packages are "private": true, so nothing reaches npm and this PR carries skip-changeset. Package files therefore does not apply. The icon is served from the repository tree, which is where the URL points.

Tests

Red on the base manifests, green at head

Run per app: pnpm --filter @objectstack/connector-app-APP exec vitest run --maxWorkers=2 test/listing.test.ts.

Red leg: head's tests with both manifests restored to base f23e0512 (tree only, git restore --source; grep -c iconUrl answered 0 for each):

connector-github:  × carries a public http(s) iconUrl
                   × points iconUrl at the icon this package owns
                   Tests  2 failed | 6 passed (8)
                   AssertionError: expected 'iconUrl is absent' to be null
connector-stripe:  × carries a public http(s) iconUrl
                   × points iconUrl at the icon this package owns
                   Tests  2 failed | 10 passed (12)

Restored with git checkout HEAD -- both manifests; git diff HEAD empty afterwards. Green leg: connector-github Tests 8 passed (8), connector-stripe Tests 12 passed (12).

Full package runs at 6bdaa4b1, under the verify lock, after building the ^... closure of both apps:

pnpm --filter @objectstack/connector-app-github test && ... typecheck   → objectstack validate ok · Test Files 2 passed (2) · Tests 13 passed (13) · tsc --noEmit ok · VERDICT command-exit 0
pnpm --filter @objectstack/connector-app-stripe test && ... typecheck   → objectstack validate ok · Test Files 2 passed (2) · Tests 19 passed (19) · tsc --noEmit ok · VERDICT command-exit 0

tsc --listFiles includes both test/*.test.ts files of connector-github, so the typecheck covers the new cases.

Local gates

At head 6bdaa4b1, the dispatch-gates.mjs --commands derivation for this diff (47 families) plus check:template-manifests, each command run in turn with its exit code captured before any pipe. Reconciliation (--ran): 47 derived, 46 run with exit 0, 1 NOT MEASURED, 0 unrun.

  • NOT MEASURED: pnpm check:dual-build-cjs-loads exits 3 (PREREQUISITE NOT MET: it reads the built dist/ of packages outside this diff's closure, such as client-react). The CI run of Lint & Repo Gates is its reading.
  • node scripts/check-plugin-teardown-shape.mjs --self-test first exited 3 (its positive-control commit was not in the shallow clone); after git fetch --depth=1 origin 621a487607881c66b2899b7e3477115229a156b4 it exits 0, 48 cases.
  • pnpm --filter @objectstack/spec check:template-manifests (outside the derivation, run because it parses every shipped manifest): exit 0.
  • Not run locally, CI-owned: pnpm lint and the rest of the farm; test:repo (no repo-project file touched).

Acceptance notes

Verification

Clause-②: no measured: the diff changes two private app manifests, two SVG assets and two test files. No served route, schema, export or published file moves. Metadata-protocol: none: no authorable key or accepted value changes; iconUrl was already allowed.


Generated by Claude Code

connector-github and connector-stripe each own a neutral connector
glyph under assets/icon.svg, and objectstack.manifest.json points
iconUrl at its raw.githubusercontent.com URL on main, the way HotCRM's
manifest does. Each app's listing test now refuses a manifest whose
iconUrl is absent or not http(s).

Claude-Session: https://claude.ai/code/session_01FEkQ5p28hxU1qvesRWw9LU
Co-authored-by: Claude <noreply@anthropic.com>
@objectstack-fleet objectstack-fleet Bot added the skip-changeset PR has no user-facing published change; bypasses the changeset gate label Nov 1, 2026
@github-actions

github-actions Bot commented Nov 1, 2026

Copy link
Copy Markdown
Contributor

📓 Docs Drift Check

⚠️ 4 changed file(s) yielded no anchor (packages/apps/connector-github/assets/icon.svg, packages/apps/connector-github/objectstack.manifest.json, packages/apps/connector-stripe/assets/icon.svg, …), so the pages documenting them are NOT COVERED by this run — this is not a clean bill of health for those files. Nothing else in this diff resolved to a documentable surface (no symbol, route or SDK anchor derived from 2 changed package(s)).

What this run could not see
  • 4 changed file(s) yielded no anchor (packages/apps/connector-github/assets/icon.svg, packages/apps/connector-github/objectstack.manifest.json, packages/apps/connector-stripe/assets/icon.svg, …) — pages documenting those are invisible to this run
  • a page that states a rule by its inputs shares no identifier with the emitter that implements the rule, so an emitter-only diff cannot list it — not on this run and not on any run. Measured on fix(driver-sql): emit varchar(maxLength) for a text field a declared index keys on #11430: content/docs/protocol/objectql/types.mdx documents the text-family column mapping by the ObjectQL type names it maps FROM (text / textarea / html) while the diff changed createColumn; it went unlisted, and it was the page that diff falsified, in four places. No shared token exists to detect this on, so a rule your change carries has to be re-read by hand in the pages that restate it.
  • a key NAME is not a key, so the hand re-read the line above prescribes can land on the wrong schema. The same spelling is authorable on one governed type and a [REMOVED] tombstone on another for each of active, aria, joins, objects, template, tools and version (censused on [finding] tools is a key on BOTH AgentSchema (tombstoned, dead) and SkillSchema (live, cloud-attested), so a name-based search attributes skill examples to the agent key — it produced a false stop-the-line alarm on PR #19059 #19093 over the liveness ledger's governed types, top-level keys); nothing in a search result distinguishes the two, so a grep hit on a LIVE example reads as evidence about the DEAD key. Measured on fix(spec): the agent.tools liveness row says dead — it claimed live on a key the schema tombstoned #19059: content/docs/ai/agents.mdx was reported as contradicting the agent.tools tombstone over its tools: example at :161, which is inside the defineSkill({ block opened at :155 — the page was already correct. Settle ownership by PARSING the value against both schemas, never by the name: that literal PASSES SkillSchema, and as an AgentSchema it FAILS at tools with the tombstone prescription. ⛔ These names are not the whole class — a key retired through a .strict() guidance map leaves no tombstone in the walked shape and none of them here (tool.category, live as AIToolDefinition.category).

Coarse fallback — 0 page(s) merely mention a changed package (the pre-#9192 predicate, kept for the deliberately-wide backstop): node scripts/docs-audit/affected-docs.mjs --json 0b6a52e8a0d9982ede44a74912e917b353154582 → packageMentionDocs.

@objectstack-fleet

Copy link
Copy Markdown
Contributor Author

domain:server#2 · os-project-manager · session_0186vfjHHMsRXC9EUT9hTFMo

席位核对

ACCEPT · domain:server seat 2 · os-project-manager · session_0186vfjHHMsRXC9EUT9hTFMo · 2026-11-01T12:25Z · head 6bdaa4b1 · #28588

The maintainer's standing authorisation for landing reviewed PRs, verbatim: 「按照 pm-dispatch 规则复核过的都授权」.

  1. Shape:
    • A draft against main with Fixes #28588.
    • It carries skip-changeset, because both apps are private.
    • check-governed-merges --pr 28662 reads NOT governed, 110 changed lines. Landing tier S.
    • The claim (6557470730) names this PR's branch, claude/project-thread-69wo4m.
  2. Against the order:
    • connector-github and connector-stripe each own assets/icon.svg, and objectstack.manifest.json sets iconUrl to its public raw.githubusercontent.com/.../main/... URL, the hotcrm shape.
    • The icon is a neutral connector glyph built from primitives. It contains no vendor artwork and no script, because no usage permission could be cited for either logo.
    • Each app's existing test/listing.test.ts gains:
      • an http(s) iconUrl case, red on base (2 failed per app);
      • a negative control (absent, ftp:, relative);
      • an owned-asset check.
    • No repo-wide gate is added, per the triage limit.
    • Clause-②: no, Metadata-protocol: none. iconUrl is already allowed, and only private manifests, SVGs and tests change.
  3. Contract review: not owed. No spec path is touched, and no narrowing arm is declared.
  4. Gates:
    • The dev reports 46 of 47 derived gates exit 0. check:dual-build-cjs-loads is NOT MEASURED locally (a missing prerequisite) and is left to CI.
    • CI on head 6bdaa4b1 is in progress with 0 red at review. Auto-merge waits for it.
  5. Overlap: git merge-tree against main is clean. No open PR touches packages/apps/connector-*.
  6. Landing: pr_ready + automerge_enable through the relay.
  7. Noted, not filed: TemplateManifestSchema.iconUrl accepts any scheme, while the handbook says http(s). One shared rule is worth having once a third shelf app lands. That is the dev's recommendation, recorded here for [Epic] Marketplace and connector auto-shelf — E1 platform prerequisites (openapi/mcp hardening, outbound OAuth, request signing), E2 administrator credential hand-off, E3 author recipes and handbook, E4 the first shelf of official connector apps #27293's E4.

Generated by Claude Code

@objectstack-fleet
objectstack-fleet Bot marked this pull request as ready for review November 1, 2026 12:26
@objectstack-fleet
objectstack-fleet Bot enabled auto-merge November 1, 2026 12:26
@objectstack-fleet
objectstack-fleet Bot added this pull request to the merge queue Nov 1, 2026
Merged via the queue into main with commit e4ec4f2 Nov 1, 2026
53 checks passed
@objectstack-fleet
objectstack-fleet Bot deleted the claude/project-thread-69wo4m branch November 1, 2026 12:54
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

size/m skip-changeset PR has no user-facing published change; bypasses the changeset gate tests

Projects

None yet

2 participants