diff --git a/.circleci/config.yml b/.circleci/config.yml deleted file mode 100644 index 94ff5ff680..0000000000 --- a/.circleci/config.yml +++ /dev/null @@ -1,88 +0,0 @@ -# See: https://circleci.com/docs/reference/configuration-reference/ -# Note: CircleCI config v2.1 treats the double left-angle merge marker as a -# special tag — never use shell heredocs in run steps. -version: 2.1 - -jobs: - verify: - docker: - # Node >=24.11.0 is required by current lockfile packages (e.g. @babel/parser - # engines "^22.18.0 || >=24.11.0") under .npmrc engine-strict=true. - # cimg/node:24.9 fails npm ci immediately; 24.18 matches .nvmrc major and - # the Cloud Agent runtime. Prefer the floating patch tag: digest pin plus - # resource_class: small failed this project's executor before steps ran. - - image: cimg/node:24.18 - steps: - - checkout - - run: - name: Skip verification on docs-only changes - command: | - # CircleCI checkouts often restrict the origin fetch refspec to the - # branch under test, so force main into the remote-tracking ref. - if ! git fetch --depth 100 origin "main:refs/remotes/origin/main"; then - echo "Could not fetch origin/main; running full verification." - exit 0 - fi - BASE_SHA="$(git rev-parse origin/main)" - HEAD_SHA="$(git rev-parse HEAD)" - # Reuse scripts/ci-change-scope.mjs so policy-bearing Markdown - # (AGENTS.md, .github/pull_request_template.md, docs/codex-review-protocol.md, …) - # is not false-greened as docs-only. - node scripts/ci-change-scope.mjs --base "$BASE_SHA" --head "$HEAD_SHA" | tee /tmp/ci-change-scope.txt - if grep -qx 'docs_only=true' /tmp/ci-change-scope.txt; then - echo "Docs-only change (ci-change-scope); skipping install and verification." - circleci-agent step halt - else - echo "Non-docs changes detected; running verification." - fi - - run: - name: Assert node/npm engine majors - # Image-bundled npm 11.x satisfies package.json engines; avoid non-root - # global reinstalls (cimg installs Node under /usr/local). - command: | - node --version - npm --version - node -e 'const major=Number(process.version.slice(1).split(".")[0]); if(major!==24){console.error("expected node 24.x, got",process.version); process.exit(1)}' - node -e 'const {execSync}=require("node:child_process"); const v=execSync("npm --version",{encoding:"utf8"}).trim(); if(!/^11\./.test(v)){console.error("expected npm 11.x, got",v); process.exit(1)}' - node -e 'const [maj,min]=process.versions.node.split(".").map(Number); if(maj===24 && min<11){console.error("lockfile requires Node >=24.11.0 under engine-strict; got",process.versions.node); process.exit(1)}' - - restore_cache: - keys: - - npm-deps-v2-{{ checksum "package-lock.json" }} - - run: - name: Install dependencies - no_output_timeout: 15m - command: npm ci - - save_cache: - key: npm-deps-v2-{{ checksum "package-lock.json" }} - paths: - - ~/.npm - - run: - name: Format check - command: npm run format:check - - run: - name: Lint - command: npm run lint - - run: - name: Typecheck - command: npm run typecheck - - run: - name: Install deterministic Python PDF test prerequisite - # Same PyMuPDF pin as .github/workflows/ci.yml. cimg/base only ships - # python-is-python3 (no pip), and Ubuntu 24.04 blocks system pip installs - # (PEP 668), so bootstrap a venv and point PYTHON_BIN at it for tests. - command: | - sudo apt-get update - sudo apt-get install -y --no-install-recommends python3-pip python3-venv - python3 -m venv /tmp/ci-pdf-venv - /tmp/ci-pdf-venv/bin/pip install --disable-pip-version-check "PyMuPDF==1.28.0" - /tmp/ci-pdf-venv/bin/python -c "import fitz; print('PyMuPDF', fitz.version)" - - run: - name: Unit tests - environment: - PYTHON_BIN: /tmp/ci-pdf-venv/bin/python - command: npm run test - -workflows: - verify: - jobs: - - verify diff --git a/docs/branch-review-ledger.md b/docs/branch-review-ledger.md index 5828e8627c..e63b94fe4b 100644 --- a/docs/branch-review-ledger.md +++ b/docs/branch-review-ledger.md @@ -1323,6 +1323,7 @@ Records before 2026-07-28 were written by hand and had drifted: 146 lines carrie | 2026-07-30 | origin/cursor/page-anchored-search-composer-30ee | 7ff134ca7f614db527b8d142676640305533669d | branch-cleanup | safe to delete — tip tree identical to merge-base tree (79d1c879), so the branch nets zero content change vs main; --cherry-pick shows 6 commits, a squash-merge false positive | git diff --name-only merge-base..tip = 0 files; tree(tip)==tree(merge-base); git ls-remote confirms live HEAD | | 2026-07-30 | origin/cursor/pr-1379-babysit-ledger-9365 | be2de03f855cb7fdfccea4bb74d05eb4c9bf6c61 | branch-cleanup | safe to delete — tip tree identical to merge-base tree (b2740480), so the branch nets zero content change vs main; --cherry-pick shows 4 commits, a squash-merge false positive | git diff --name-only merge-base..tip = 0 files; tree(tip)==tree(merge-base); git ls-remote confirms live HEAD | | 2026-07-30 | claude/white-element-positioning-t607pk | b82ff088436cd936d219a4eb54a54d09a88fbd7c | pr-babysit | Product tip sound; no code fix. Hosted CI fully green once at e7a27bbf (Production UI+PR required). Recurring blocker: repeated Merge main into PR cancels Production UI mid-run so PR required fails with production-ui=cancelled. merge-tree clean / MERGEABLE when left alone. No review threads. Bugbot: no cursor[bot] findings; suite stays queued. Local A/B: 3 Playwright fails identical on --surface/--background. | verify:cheap:pass; hosted:e7a27bbf:PR-required+Production-UI:pass; A/B-playwright:env-flake; bugbot:no-findings; churn:main-merges-cancel-ui | +| 2026-07-30 | claude/remove-circleci | 21e7a4a8f84975295649589356cc63288e2bcb86 | Remove CircleCI (persistent non-required red check) | Opened PR #1412. Diagnosed ci/circleci:verify red on both PR #1401 and main's own tip; proved via faithful shallow-clone repro that the docs-only classifier (ci-change-scope.mjs) is not the cause; stopped local repro test run per explicit user request; user chose to remove CircleCI outright rather than keep debugging | format:check PASS, lint PASS, typecheck PASS (all against main tip in a fresh worktree); npm test not run (stopped early); grepped repo for other CircleCI references - none found; no provider-backed checks | | 2026-07-30 | origin/codex/document-reader-condensed-view | b5cdbf301d517239ffe9ed941b9ebe809aea0bfd | branch-cleanup (supersedes 2026-07-30) | safe to delete — merge-base 855aa291 is an ANCESTOR of main and tree(tip)==tree(855aa291), so every byte at the tip exists in main's history; the 13 --cherry-pick commits are merges of main plus work already squash-merged, not uncancelled work | git merge-base --is-ancestor 855aa291 origin/main = YES; tree(tip)==tree(855aa291); feature blobs present and byte-identical on origin/main; supersedes the earlier row, which omitted the ancestor step (Codex P2, PR #1398/#1403) | | 2026-07-30 | origin/cursor/page-anchored-search-composer-30ee | 7ff134ca7f614db527b8d142676640305533669d | branch-cleanup (supersedes 2026-07-30) | safe to delete — merge-base 79d1c879 is an ANCESTOR of main and tree(tip)==tree(79d1c879), so every byte at the tip exists in main's history; the 6 --cherry-pick commits are merges of main plus work already squash-merged, not uncancelled work | git merge-base --is-ancestor 79d1c879 origin/main = YES; tree(tip)==tree(79d1c879); feature blobs present and byte-identical on origin/main; supersedes the earlier row, which omitted the ancestor step (Codex P2, PR #1398/#1403) | | 2026-07-30 | origin/cursor/pr-1379-babysit-ledger-9365 | be2de03f855cb7fdfccea4bb74d05eb4c9bf6c61 | branch-cleanup (supersedes 2026-07-30) | safe to delete — merge-base b2740480 is an ANCESTOR of main and tree(tip)==tree(b2740480), so every byte at the tip exists in main's history; the 4 --cherry-pick commits are merges of main plus work already squash-merged, not uncancelled work | git merge-base --is-ancestor b2740480 origin/main = YES; tree(tip)==tree(b2740480); feature blobs present and byte-identical on origin/main; supersedes the earlier row, which omitted the ancestor step (Codex P2, PR #1398/#1403) | diff --git a/tests/circleci-config-contract.test.ts b/tests/circleci-config-contract.test.ts deleted file mode 100644 index 7df6d2c6d0..0000000000 --- a/tests/circleci-config-contract.test.ts +++ /dev/null @@ -1,60 +0,0 @@ -import { readFileSync } from "node:fs"; - -import { describe, expect, it } from "vitest"; - -const read = (path: string) => readFileSync(new URL(`../${path}`, import.meta.url), "utf8"); - -describe("CircleCI config contract", () => { - const config = read(".circleci/config.yml"); - const engines = JSON.parse(read("package.json")).engines as { node: string; npm: string }; - const expectedNodeMajor = engines.node.match(/^(\d+)/)?.[1]; - const expectedNpmMajor = engines.npm.match(/^(\d+)/)?.[1]; - - it("pins the executor image to a Node 24.11+ cimg tag (lockfile engine-strict)", () => { - const image = config.match(/image:\s*cimg\/node:(\d+)\.(\d+)/); - expect(image, "expected a cimg/node:. docker image").not.toBeNull(); - expect(image?.[1]).toBe(expectedNodeMajor); - expect(Number(image?.[2]), "Node minor must be >= 11 for @babel/parser engines").toBeGreaterThanOrEqual(11); - }); - - it("asserts npm matches the package.json npm engine major (no broken global reinstall)", () => { - expect(config).not.toMatch(/npm install -g npm@/); - expect(config).toContain(`expected npm ${expectedNpmMajor}.x`); - expect(config).toContain("Node >=24.11.0"); - // CircleCI config v2.1 rejects unescaped shell heredocs. - expect(config).not.toMatch(/(? { - expect(config).not.toContain("say-hello"); - expect(config).not.toContain("Hello, World!"); - expect(config).not.toContain("cimg/base:"); - - for (const command of ["npm ci", "npm run format:check", "npm run lint", "npm run typecheck", "npm run test"]) { - expect(config, `missing step: ${command}`).toContain(command); - } - }); - - it("reuses scripts/ci-change-scope.mjs for the docs-only skip (no naive md regex)", () => { - expect(config).toContain("scripts/ci-change-scope.mjs"); - expect(config).toContain("docs_only=true"); - expect(config).toContain("main:refs/remotes/origin/main"); - expect(config).not.toMatch(/\^\(docs\/\|\.\*\\?\.md\$\)/); - }); - - it("bootstraps a venv + pinned PyMuPDF and exports PYTHON_BIN for tests", () => { - expect(config).toContain("python3-venv"); - expect(config).toContain("PyMuPDF==1.28.0"); - expect(config).toContain("PYTHON_BIN: /tmp/ci-pdf-venv/bin/python"); - const actions = read(".github/workflows/ci.yml"); - const actionsPin = actions.match(/PyMuPDF==[\d.]+/)?.[0]; - const circlePin = config.match(/PyMuPDF==[\d.]+/)?.[0]; - expect(circlePin).toBe(actionsPin); - expect(config.indexOf("PyMuPDF==1.28.0")).toBeLessThan(config.indexOf("npm run test")); - }); - - it("avoids the executor knobs that failed before any step ran on this project", () => { - expect(config).not.toMatch(/^\s*resource_class:\s*small\s*$/m); - expect(config).not.toMatch(/^\s*-\s*image:\s*cimg\/node:[^\n]*@sha256:/m); - }); -});