Skip to content

feat(ecc2): finalize rc1 release surface#1607

Merged
affaan-m merged 5 commits into
mainfrom
feat/ecc2-rc1-preview-surface
Apr 29, 2026
Merged

feat(ecc2): finalize rc1 release surface#1607
affaan-m merged 5 commits into
mainfrom
feat/ecc2-rc1-preview-surface

Conversation

@affaan-m

@affaan-m affaan-m commented Apr 29, 2026

Copy link
Copy Markdown
Owner

Summary

  • Bump the public ECC surfaces to 2.0.0-rc.1 across manifests, package metadata, READMEs, AGENTS docs, OpenCode metadata, and changelog.
  • Add the ECC 2.0 RC release pack, cross-harness architecture doc, and hermes-imports skill with public/private boundary rules.
  • Harden release automation for prerelease tags: RC semver validation, GitHub prerelease/latest behavior, next npm dist-tag, reusable checkout at inputs.tag, and CI on release branches/tags.

Validation

  • git diff --cached --check
  • node tests/scripts/release.test.js
  • node tests/docs/ecc2-release-surface.test.js
  • npx markdownlint CHANGELOG.md README.md README.zh-CN.md docs/HERMES-SETUP.md docs/pt-BR/README.md docs/tr/README.md docs/zh-CN/README.md docs/releases/2.0.0-rc.1/*.md docs/architecture/cross-harness.md skills/hermes-imports/SKILL.md
  • node tests/plugin-manifest.test.js
  • node tests/scripts/release-publish.test.js
  • node tests/scripts/build-opencode.test.js
  • node tests/scripts/npm-publish-surface.test.js

Coordination

  • Do not merge until TEST-WRITER and RELEASE-ENG sign off.
  • External contributor PRs were not touched.
  • Unrelated local worktree changes were excluded from this PR.

Summary by cubic

Finalizes the ECC v2.0.0-rc.1 public surface, ships the Hermes operator release pack and cross-harness architecture, and hardens prerelease workflows that publish to the next dist‑tag and mark GitHub prereleases correctly.

  • New Features

    • Bumped public plugin and package versions to 2.0.0-rc.1 across manifests, READMEs (EN + zh‑CN + tr + pt‑BR), AGENTS docs, marketplace entries, OpenCode metadata, VERSION, and CHANGELOG.md.
    • Added the Hermes release pack under docs/releases/2.0.0-rc.1/ and linked from README, plus a cross-harness architecture doc and the skills/hermes-imports skill with sanitization rules.
    • Synced surface counts (48 agents, 184 skills, 79 shims) and added .opencode/.npmignore to trim packaging.
  • Refactors

    • Prerelease-aware pipelines: workflows accept hyphenated semver, compute latest/next, mark hyphenated tags as GitHub prereleases without “latest”, and publish to npm after Release creation; CI now runs on release/** branches and v* tags; reusable release checks out inputs.tag before validation.
    • Release script updates localized “What’s New” headings and version rows and validates/selects prerelease semver.
    • Modularized scripts/ci/catalog.js (exported helpers, root-aware scanning) and added tests: catalog write/sync, rc.1 surface boundary checks (links, no private paths/placeholders), and release workflow ordering/prerelease behavior.

Written for commit c7c7d37. Summary will update on new commits. Review in cubic

Summary by CodeRabbit

  • New Features

    • Released v2.0.0-rc.1 (release candidate) reframing ECC as a cross-harness operating system and adding Hermes operator integration.
  • Documentation

    • Added cross-harness architecture, Hermes setup/import guidance, and a full rc.1 release bundle (notes, launch checklist, demo/marketing drafts).
  • Chores

    • Updated public version references and documented component counts to 2.0.0-rc.1; release workflows now support prerelease tagging.

@ecc-tools

ecc-tools Bot commented Apr 29, 2026

Copy link
Copy Markdown
Contributor

ECC bundle files are already tracked in this repository. Skipping generation of another bundle PR.

@coderabbitai

coderabbitai Bot commented Apr 29, 2026

Copy link
Copy Markdown
Contributor

Caution

Review failed

The pull request is closed.

ℹ️ Recent review info
⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro

Run ID: fe716559-605a-4fd2-aafa-0bb8be8293e1

📥 Commits

Reviewing files that changed from the base of the PR and between 0a87323 and c7c7d37.

📒 Files selected for processing (3)
  • README.md
  • scripts/ci/catalog.js
  • tests/ci/catalog.test.js

📝 Walkthrough

Walkthrough

Project-wide version bump to 2.0.0-rc.1 across manifests and docs; release workflows and scripts updated to support prerelease tags and computed npm dist-tags; extensive rc.1 release documentation and cross-harness architecture added; catalog/CI tooling refactored and tests expanded to validate release and catalog surfaces.

Changes

Cohort / File(s) Summary
Version / Manifests
package.json, VERSION, agent.yaml, .opencode/package.json, .claude-plugin/plugin.json, .codex-plugin/plugin.json, .agents/plugins/marketplace.json, .claude-plugin/marketplace.json
Bumped release/version strings to 2.0.0-rc.1; Claude manifest descriptions updated with new counts.
Release Workflows & CI
.github/workflows/ci.yml, .github/workflows/release.yml, .github/workflows/reusable-release.yml
CI triggers expanded (release/**, v* tags); workflows accept prerelease tags, compute npm dist-tag (next for prerelease), mark prerelease GitHub Releases, and publish npm with explicit tag.
Release Script & Packaging
scripts/release.sh, .opencode/.npmignore, .opencode/plugins/ecc-hooks.ts
Release script regexes/validation extended for prerelease semver and README heading sync helper added; npmignore updated; hook banner version text changed.
Docs — Release & Launch Materials
CHANGELOG.md, docs/releases/2.0.0-rc.1/*
Added rc.1 release notes, launch checklist, social drafts, demo prompts, changelog entry, and related release collateral.
Docs — Architecture & Guides
docs/architecture/cross-harness.md, docs/HERMES-SETUP.md, docs/SELECTIVE-INSTALL-ARCHITECTURE.md
New cross-harness architecture doc added; Hermes setup wording and example repoVersion updated to rc.1.
New Skill & Documentation
skills/hermes-imports/SKILL.md
New skill doc describing how to sanitize/convert Hermes operator workflows into ECC-safe skills.
README & Localizations
README.md, README.zh-CN.md, AGENTS.md, docs/pt-BR/README.md, docs/tr/AGENTS.md, docs/tr/README.md, docs/zh-CN/AGENTS.md, docs/zh-CN/README.md
Version bump to rc.1 and skill count increment (183 → 184) applied across root and localized docs.
Catalog & CI Script Refactor
scripts/ci/catalog.js
Refactored to accept a configurable repo root, added factory helpers, exported functions, and returned richer results for programmatic use.
Tests — Release & Catalog Validation
tests/docs/ecc2-release-surface.test.js, tests/plugin-manifest.test.js, tests/scripts/release.test.js, tests/scripts/release-publish.test.js, tests/ci/catalog.test.js
Added and updated tests to validate rc.1 docs surface, prerelease semver acceptance, workflow ordering (GitHub Release before npm publish), and catalog counting/sync behavior.

Sequence Diagram(s)

sequenceDiagram
  participant Dev as Developer (tag push)
  participant GH as GitHub Actions
  participant Repo as Repository (checkout/ref)
  participant Validator as Tag Validator
  participant DistTag as Dist-Tag Computer
  participant Release as GitHub Release
  participant Npm as npm Registry

  Dev->>GH: push tag (vX.Y.Z or vX.Y.Z-prerelease)
  GH->>Repo: checkout refs/tags/<tag>
  GH->>Validator: validate tag (allow prerelease)
  Validator-->>GH: valid
  GH->>DistTag: read package.json → compute dist-tag (next|latest)
  DistTag-->>GH: dist-tag
  GH->>Release: create GitHub Release (prerelease if tag contains "-")
  Release-->>GH: release created
  GH->>Npm: npm publish --tag <computed-dist-tag>
  Npm-->>GH: publish result
Loading

Estimated code review effort

🎯 3 (Moderate) | ⏱️ ~25 minutes

Possibly related issues

Possibly related PRs

Poem

🐰 Hop-hop, the versions take flight,
From one-ten to rc.1 tonight.
Docs and tests in tidy rows,
Hermes and ECC in graceful prose.
Tiny paws drum — the release glows.

🚥 Pre-merge checks | ✅ 4 | ❌ 1

❌ Failed checks (1 warning)

Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 0.00% which is insufficient. The required threshold is 80.00%. Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (4 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed The title 'feat(ecc2): finalize rc1 release surface' directly reflects the main change: bumping ECC to version 2.0.0-rc.1 and finalizing the release candidate surface with architecture docs, release notes, and automation hardening.
Linked Issues check ✅ Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check ✅ Passed Check skipped because no linked issues were found for this pull request.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.

✨ Finishing Touches
📝 Generate docstrings
  • Create stacked PR
  • Commit on current branch
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch feat/ecc2-rc1-preview-surface

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share
Review rate limit: 3/8 reviews remaining, refill in 34 minutes and 19 seconds.

Comment @coderabbitai help to get the list of available commands and usage tips.

@ecc-tools

ecc-tools Bot commented Apr 29, 2026

Copy link
Copy Markdown
Contributor

ECC bundle files are already tracked in this repository. Skipping generation of another bundle PR.

@cubic-dev-ai cubic-dev-ai Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

2 issues found across 40 files

Prompt for AI agents (unresolved issues)

Check if these issues are valid — if so, understand the root cause of each and fix them. If appropriate, use sub-agents to investigate and fix each issue separately.


<file name="scripts/release.sh">

<violation number="1" location="scripts/release.sh:43">
P2: The semver gate accepts invalid prerelease identifiers (for example `rc..1` or numeric identifiers with leading zeroes), so malformed release versions can pass validation.</violation>
</file>

<file name=".github/workflows/release.yml">

<violation number="1" location=".github/workflows/release.yml:36">
P2: The prerelease tag regex is too permissive and accepts invalid SemVer prerelease strings.</violation>
</file>

Reply with feedback, questions, or to request a fix. Tag @cubic-dev-ai to re-run a review.

Comment thread scripts/release.sh
if ! [[ "$VERSION" =~ ^[0-9]+\.[0-9]+\.[0-9]+$ ]]; then
echo "Error: VERSION must be in semver format (e.g., 1.5.0)"
# Validate VERSION is semver format (X.Y.Z or X.Y.Z-prerelease)
if ! [[ "$VERSION" =~ ^[0-9]+\.[0-9]+\.[0-9]+(-[0-9A-Za-z.-]+)?$ ]]; then

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2: The semver gate accepts invalid prerelease identifiers (for example rc..1 or numeric identifiers with leading zeroes), so malformed release versions can pass validation.

Prompt for AI agents
Check if this issue is valid — if so, understand the root cause and fix it. At scripts/release.sh, line 43:

<comment>The semver gate accepts invalid prerelease identifiers (for example `rc..1` or numeric identifiers with leading zeroes), so malformed release versions can pass validation.</comment>

<file context>
@@ -36,9 +39,9 @@ if [[ -z "$VERSION" ]]; then
-if ! [[ "$VERSION" =~ ^[0-9]+\.[0-9]+\.[0-9]+$ ]]; then
-  echo "Error: VERSION must be in semver format (e.g., 1.5.0)"
+# Validate VERSION is semver format (X.Y.Z or X.Y.Z-prerelease)
+if ! [[ "$VERSION" =~ ^[0-9]+\.[0-9]+\.[0-9]+(-[0-9A-Za-z.-]+)?$ ]]; then
+  echo "Error: VERSION must be in semver format (e.g., 1.5.0 or 2.0.0-rc.1)"
   exit 1
</file context>
Suggested change
if ! [[ "$VERSION" =~ ^[0-9]+\.[0-9]+\.[0-9]+(-[0-9A-Za-z.-]+)?$ ]]; then
if ! [[ "$VERSION" =~ ^(0|[1-9][0-9]*)\.(0|[1-9][0-9]*)\.(0|[1-9][0-9]*)(-((0|[1-9][0-9]*|[0-9]*[A-Za-z-][0-9A-Za-z-]*)(\.(0|[1-9][0-9]*|[0-9]*[A-Za-z-][0-9A-Za-z-]*))*))?$ ]]; then

run: |
if ! [[ "${REF_NAME}" =~ ^v[0-9]+\.[0-9]+\.[0-9]+$ ]]; then
echo "Invalid version tag format. Expected vX.Y.Z"
if ! [[ "${REF_NAME}" =~ ^v[0-9]+\.[0-9]+\.[0-9]+(-[0-9A-Za-z.-]+)?$ ]]; then

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2: The prerelease tag regex is too permissive and accepts invalid SemVer prerelease strings.

Prompt for AI agents
Check if this issue is valid — if so, understand the root cause and fix it. At .github/workflows/release.yml, line 36:

<comment>The prerelease tag regex is too permissive and accepts invalid SemVer prerelease strings.</comment>

<file context>
@@ -33,8 +33,8 @@ jobs:
         run: |
-          if ! [[ "${REF_NAME}" =~ ^v[0-9]+\.[0-9]+\.[0-9]+$ ]]; then
-            echo "Invalid version tag format. Expected vX.Y.Z"
+          if ! [[ "${REF_NAME}" =~ ^v[0-9]+\.[0-9]+\.[0-9]+(-[0-9A-Za-z.-]+)?$ ]]; then
+            echo "Invalid version tag format. Expected vX.Y.Z or vX.Y.Z-prerelease"
             exit 1
</file context>

@ecc-tools

ecc-tools Bot commented Apr 29, 2026

Copy link
Copy Markdown
Contributor

ECC bundle files are already tracked in this repository. Skipping generation of another bundle PR.

@affaan-m affaan-m merged commit c7c7d37 into main Apr 29, 2026
3 checks passed
@greptile-apps

greptile-apps Bot commented Apr 29, 2026

Copy link
Copy Markdown
Contributor

Greptile Summary

This PR finalizes the ECC 2.0.0-rc.1 public release surface: bumps all version manifests, adds the Hermes release pack and cross-harness architecture doc, introduces the hermes-imports skill with sanitization rules, and hardens release automation for prerelease tags (RC semver validation, next npm dist-tag, GitHub prerelease/make_latest flags, reusable-release now checks out inputs.tag, CI on release/** branches and v* tags). Two minor observations on the test suite and release script are noted inline.

Confidence Score: 4/5

Safe to merge; only P2 findings present.

All findings are P2: one misleading test name and one potential heading-sync omission for docs/zh-CN/README.md. No logic errors, security issues, or breaking changes in the release automation.

scripts/release.sh (update_latest_release_heading call coverage) and tests/scripts/release.test.js (test name vs. actual ordering guarantee).

Important Files Changed

Filename Overview
scripts/release.sh Adds prerelease semver support, update_latest_release_heading for four localized READMEs (zh-CN/docs not included), and broader version regex patterns; logic is sound with one minor omission.
.github/workflows/release.yml Correctly moves npm publish after GitHub Release creation, adds prerelease/make_latest flags, and routes hyphenated versions to the next dist-tag; no blocking issues.
.github/workflows/reusable-release.yml Adds ref: inputs.tag to checkout (ensuring the workflow validates the exact tagged state), mirrors release.yml's prerelease/dist-tag logic; changes are correct.
.github/workflows/ci.yml Adds release/** branch and v* tag triggers so CI runs on release branches and tag pushes; runs in parallel with release.yml on tags with no ordering enforcement.
scripts/ci/catalog.js Clean modularization: buildCatalog, runCatalogCheck, and createDocumentSpecsForRoot now accept a root parameter and are exported for testability; existing behavior preserved.
tests/ci/catalog.test.js Well-structured tests for buildCatalog, runCatalogCheck (mismatch detection, write mode with plus-suffix preservation, missing-file error); covers the new exported API adequately.
tests/scripts/release.test.js Adds coverage for prerelease semver, workflow prerelease flags, inputs.tag checkout, and CI triggers; one test name overpromises an ordering guarantee that is not enforced.
tests/docs/ecc2-release-surface.test.js Enforces presence of all rc.1 release pack files, README links, cross-harness doc content, Hermes boundary wording, and absence of private paths/placeholders.
skills/hermes-imports/SKILL.md New skill with clear public/private sanitization rules, conversion pattern, and output contract; well-structured.
docs/architecture/cross-harness.md New architecture doc covering harness portability, Hermes boundary, and today-vs-later surface status; informative and clearly scoped.

Sequence Diagram

sequenceDiagram
    participant Dev as Developer
    participant CI as ci.yml
    participant Rel as release.yml
    participant RR as reusable-release.yml
    participant GH as GitHub Releases
    participant NPM as npm registry

    Dev->>Dev: ./scripts/release.sh 2.0.0-rc.1
    Note over Dev: validates semver (RC suffix OK)<br/>bumps manifests & headings<br/>runs test suite locally<br/>git commit + tag v2.0.0-rc.1 + push

    par CI triggers on v* tag
        Dev-->>CI: push tag v2.0.0-rc.1
        CI->>CI: run full test suite
    and Release triggers on v* tag
        Dev-->>Rel: push tag v2.0.0-rc.1
        Rel->>Rel: checkout HEAD (tagged commit)
        Rel->>Rel: validate semver + version match
        Rel->>Rel: check npm publish state, dist_tag=next
        Rel->>GH: Create GitHub Release (prerelease=true, make_latest=false)
        Rel->>NPM: npm publish --tag next
    end

    Note over Dev: Manual republish path
    Dev->>RR: workflow_dispatch(tag=v2.0.0-rc.1)
    RR->>RR: checkout ref=inputs.tag
    RR->>RR: validate semver + version match
    RR->>GH: Create GitHub Release (prerelease=true, make_latest=false)
    RR->>NPM: npm publish --tag next
Loading

Reviews (1): Last reviewed commit: "Merge remote-tracking branch 'origin/mai..." | Re-trigger Greptile

Comment on lines +120 to 146
assert.ok(refIndex >= 0, 'reusable-release.yml checkout should use inputs.tag as ref');
assert.ok(validateIndex >= 0, 'reusable-release.yml should validate requested tag');
assert.ok(
checkoutIndex < refIndex && refIndex < validateIndex,
'reusable release should check out inputs.tag before tag validation and publish steps'
);
})) passed++; else failed++;

if (test('CI runs for release branches and version tags before release workflows execute', () => {
const pushBlockMatch = ciWorkflowSource.match(/on:\n\s+push:\n([\s\S]*?)\n\s+pull_request:/);
const pushBlock = pushBlockMatch ? pushBlockMatch[1] : '';

assert.ok(pushBlock, 'ci.yml should define a push trigger block');
assert.match(
pushBlock,
/branches:\s*\[[^\]]*main[^\]]*['"]release\/\*\*['"][^\]]*\]/,
'ci.yml push branches should include release/**'
);
assert.match(
pushBlock,
/tags:\s*\[[^\]]*['"]v\*['"][^\]]*\]/,
'ci.yml push tags should include v*'
);
})) passed++; else failed++;

console.log(`\nResults: Passed: ${passed}, Failed: ${failed}`);
process.exit(failed > 0 ? 1 : 0);

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2 Misleading test name: no ordering guarantee between CI and release

The test is named 'CI runs for release branches and version tags before release workflows execute', but it only asserts that the trigger configuration is present — it does not (and cannot) enforce sequencing. When a v* tag is pushed, both ci.yml and release.yml are triggered in parallel. If CI catches a regression on the tagged commit, softprops/action-gh-release and npm publish may have already completed.

The test name should reflect what is actually checked (trigger presence), or the workflow should add a dependency (e.g., needs: ci) to enforce ordering.

Comment thread scripts/release.sh
Comment on lines 275 to +278
update_opencode_hook_banner_version
update_readme_version_row "$README_FILE" "Version" "Plugin" "Plugin" "Reference config"
update_readme_version_row "$ZH_CN_README_FILE" "版本" "插件" "插件" "参考配置"
update_latest_release_heading "$README_FILE"

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2 docs/zh-CN/README.md heading not updated by update_latest_release_heading

The new update_latest_release_heading helper is called for README.md, README.zh-CN.md, docs/tr/README.md, and docs/pt-BR/README.md, but not for docs/zh-CN/README.md ($ZH_CN_README_FILE). If the zh-CN docs readme contains a ### v<version> heading in the same format (the regex /^### v[0-9]+\.[0-9]+\.[0-9]+(?:-[0-9A-Za-z.-]+)?( .*)$/m), it will be skipped silently and left at the old version after a bump.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant