Repository navigation
ci(release): post to Slack when a released host needs an upload by hand - #7
Conversation
platforms/<host>/scripts/ is now reserved like skills/: render never copies it into dist/. npm run validate runs platforms/<host>/scripts/validate.mjs on dist/<host> when it exists, and npm run package -- <host> runs its package.sh.
shared/text/<name>.md holds one fact in plain text. A skill inlines it with
{{< name}}; code uses {{text:name}}, a quoted string literal. using-zenrows
and extract-structured-data now take AUTH004, AUTH014, AUTH006 and REQS007's
page_not_recognised from there; every plugin renders byte-identically.
Validate fails on a snippet with markdown, more than one line, or no user.
kind: code in vars.yaml makes a host whose output isn't a plugin (code for
another project, or a marketplace listing): it ships only its own files, with
{{...}} filled in .ts/.js too, no skills, LICENSE, assets or plugin.json, keeps
its README out of dist, needs no release-please entry yet, and may keep a
scripts/check.sh.
Per-host scripts (validate.mjs, package.sh, npm run package) are only used by
the OpenAI plugin, and check.sh and the AUTH/REQS007 snippets only by the
Activepieces piece: they stay with those hosts. What's left is what any code
host needs: kind: code, and shared/text with {{< name}} and {{text:name}}.
Comments and CONTRIBUTING describe any code host, a piece or a listing.
| // Every host says whether its releases are uploaded somewhere by hand, so the | ||
| // release workflow knows whether to post a reminder. | ||
| const upload = values.upload; | ||
| if (upload === undefined) { |
There was a problem hiding this comment.
I trial-merged this branch with build/render-host-kinds (#9). They merge textually clean, but this rule then applies to code hosts:
❌ piece: vars.yaml has no upload: (false, or to: and url:; see CONTRIBUTING.md)
A kind: code host with no release-please entry never gets a tag and never appears in detect’s packages, so upload-reminder can never fire for it. Validate still demands an answer, and would accept an upload: {to, url} that is structrally unhonourable. #9 says it merges first, so this lands here. Worth deciding explicitly: exempt code hosts, exempt only unreleased ones, or accept that they must all write upload: false.
There was a problem hiding this comment.
Decided by release rather than by kind: a host with a release-please entry must say upload:, and one without can leave it out or write false. Setting to:/url: on a host that never releases fails with "has no release, so an upload reminder can never fire". While I was there I also made validate reject a link Slack would cut short (a space, <, > or |). Fixed in c455731, with npm test cases. #7 now has #9 merged in, so it's tested against code hosts directly.
| HOST: ${{ inputs.host }} | ||
| TAG: ${{ inputs.tag }} | ||
| # workflow_call has no dry_run input, so a release always posts. | ||
| DRY_RUN: ${{ inputs.dry_run == true }} |
There was a problem hiding this comment.
non-blocker
This diverges from mirror.yml for no gain. mirror.yml declares dry_run in its workflow_call inputs with default: false and writes DRY_RUN: ${{ inputs.dry_run }}. Here the input is omitted and the expression leans on null == true coercing to false, which is why line 46 needs a comment to be readable.
Both behave correctly, I confirmed the semantics but two sibling reusable workflows now answer the same question two ways. Suggest matching mirror.yml.
Fail the render on any {{…}} left in a rendered text file, and on a skills/ folder in a code host. Validate requires a code host README without {{…}}, matches {{< name}} the way the render does, and only treats backticks, *, links and headings as markdown in a snippet.
… with every tracked file
…s and vars.yaml
Other tools' {{…}} (JSX, Make, n8n) ships as written. Snippets are trimmed and can't contain {{…}}, and a malformed vars.yaml or kind names the file.
… or vars.yaml as used
…ks Slack can't show
# Conflicts: # scripts/lib.mjs # scripts/test.mjs
Summary
Some hosts take a release only as an upload done by hand, for example a marketplace that reviews every version (Cursor Marketplace, the OpenAI portal). Nothing told anyone a release was waiting, so now each host says whether it needs one and the release posts a reminder to #proj-integrations.
upload:in every host'svars.yaml. It's required: eitherfalse(installs read this repo or its mirror), orto:(where) andurl:(anhttps://link to the upload page). Copilot isfalse.npm run new-hostwrites aTODO(new-host)for it.npm run validatefails ifupload:is missing, or isn'tfalseor a validto:/url:..github/workflows/upload-reminder.yml, called byrelease.ymlfor each released host like the mirror job, or run by hand from Actions (a dry run unless unticked):SLACK_WEBHOOK_INTEGRATIONSsecret of thereleaseenvironment;The message tags @ZenGrow and reads: ":package: cursor-v0.2.3 is released and needs an upload to Cursor Marketplace." It's followed by links to
dist/cursorat the tag, the upload page and the GitHub release.CONTRIBUTING.md: an "Uploads by hand" section, and
upload:in what a new host has to decide.Not in this PR
upload:when it's rebased onto main.How to check it
npm run validatepasses. Withupload:removed orurl:nothttps://, it fails and names the problem.actionlintis clean on all workflows.host=copilotandtag=copilot-v0.1.1. It should be a no-op, since Copilot isupload: false.