Skip to content

build(deps): consolidate the Dependabot backlog into one bump (ENG-1157) - #282

Open
k-taro56 wants to merge 10 commits into
mainfrom
eng-1157
Open

k-taro56 wants to merge 10 commits into
mainfrom
eng-1157

Conversation

@k-taro56

@k-taro56 k-taro56 commented Sep 11, 2026

Copy link
Copy Markdown
Contributor

Consolidates the open Dependabot backlog into one change: 43 of the 47 PRs, with 3 held back and 1 made moot upstream. Raising the PR limit in #236 released a queue that had been stuck at 5, and merging it one PR at a time would be both 47 full CI runs and, more importantly, wrong: several of these bumps are only correct in pairs.

Main is merged in, which brings ENG-1158 (the Mintlify removal).

Why one PR rather than 47

Each of these pairs is red on main as separate Dependabot PRs, and green here purely because they move together:

Pair Symptom when split Dependabot PRs
vitest + @vitest/coverage-v8 -> 5.0.0 Vitest rejects a mixed-major core/provider pair during coverage init #260, #242
vite 8 + @vitejs/plugin-react 6.1.1 plugin-react 6 declares vite: ^8; 4.7.0 supports only Vite 4-7 (310 checks red on #273) #256, #273
react + react-dom 19.3.0 "Incompatible React versions" aborts the Studio bootstrap, 7 tests down (74 checks red on each) #246, #239
tailwindcss + @tailwindcss/vite -> 4.3.3 Studio only reaches Tailwind through the Vite plugin, so bumping the CSS package alone left the 4.2.4 compiler in place #277, #270
codeql-action/init + /analyze -> v4.38.0 Loaded a configuration file for version '4.37.0', but running version '4.38.0' #238, #241

What is in

GitHub Actions (3d3c42e checkout v7.0.1, 1e69f48 attest v4.2.2, d8e3291 upload-code-coverage v1.4.2, b96794f codeql-action v4.38.0, ea17c68 pnpm/action-setup v6.1.0). Every new SHA was checked against the GitHub API to confirm it is the commit the version tag points at, dereferencing the annotated tags where applicable.

Catalog (pnpm-workspace.yaml): the four pairs above plus @fontsource-variable/geist{,-mono} 5.3.0, @playwright/test 1.63.0, @testing-library/{jest-dom 7.0.1, react 16.3.3, user-event 14.6.7}, @vitest/eslint-plugin 1.6.27, c8 12.0.0, eslint-import-resolver-typescript 4.4.5, eslint-plugin-import-x 4.17.1, eslint-plugin-n 18.3.0, eslint-plugin-regexp 3.3.0, eventsource-parser 4.1.0, globals 17.12.0, oxfmt 0.67.0, oxlint 1.82.0, tsdown 0.23.0, turbo 2.10.12, typescript-eslint 8.70.0.

Published runtime deps keep literal semver per the carve-out documented in pnpm-workspace.yaml: @clack/prompts ^1.8.0, @hono/node-server ^2.1.1, commander ^15.0.0, esbuild ^0.28.2, hono ^4.13.7, open ^11.0.2, posthog-node ^5.51.8, zod ^4.6.1.

Source changes are limited to following two API breaks the bumps introduced:

  • @clack/prompts 1.x types cancellation as value is typeof CANCEL_SYMBOL, one unique symbol. Excluding that in the negative branch of isCancel does not remove the wider symbol a prompt's return type carries, so create-arkor's inline if (isCancel(x)) process.exit(1) left x as T | symbol and failed to compile at four sites. unwrapPrompt centralises the narrowing, mirroring assertValue in the arkor package (which already compiled, because it casts). 1.x also widened Validate<T> to pass T | undefined; promptText adapts at the boundary so its own signature keeps taking a plain string.
  • typescript-eslint 8.70 adds no-meaningless-void-operator, which flags void CloudApiClient; in whoami.ts. That line existed only to keep an otherwise-unused import alive, so it and the import are both gone rather than disabled in place.

Held back, with the reason inline in pnpm-workspace.yaml

  • build(deps): bump typescript from 5.9.3 to 7.0.2 #272 typescript 7.0.2 — 368 checks red. Outside the peer range of tsdown / rolldown-plugin-dts (^5.0.0 || ^6.0.0) and of typescript-eslint; the declaration build stops emitting dist/bin.mjs and the E2E suites fail wholesale.
  • build(deps): bump jsdom from 29.1.1 to 30.0.1 #264 jsdom 30.0.1engines is ^22.22.2 || ^24.15.0 || >=26.0.0, which excludes the published floor (Node 22.22.0) and most Node 24 entries the matrix deliberately covers. It fails for real on ubuntu-latest / node >=24.10.0 <24.12.0. Taking it means raising engines.node and trimming the matrix, i.e. changing the supported range of the published packages.
  • build(deps): bump eslint-plugin-unicorn from 64.0.0 to 74.0.0 #274 eslint-plugin-unicorn 74 — ten majors of new recommended rules. On this codebase they fire 648 times across 100 files: no-global-object-property-assignment (206) on the tests' globalThis stubs, consistent-boolean-name (109) on every boolean not prefixed is/has/can, no-top-level-assignment-in-function (46) on the vitest beforeEach fixture pattern, prefer-await (39), and import-style (47) telling us to invert the node:path convention AGENTS.md documents. Deciding which of those the repo adopts is a lint-policy change, and AGENTS.md's standing guidance is to take rules one at a time rather than by category. Worth its own PR.
  • build(deps): bump mint from 4.2.577 to 4.2.881 #268 mint is moot rather than held: ENG-1158 deleted the dependency, so there is nothing left to bump.

Review findings addressed

There were no human reviews on the 47 source PRs. CodeRabbit skipped every one (Bot user detected); socket-security, codecov and github-code-quality post informational output. The substantive reviews were 82 threads from Codex and the license bot, plus greptile and cubic on this PR.

  • The four npm pairs Codex flagged are fixed by consolidating, as above. The fifth row of that table, the codeql init/analyze split, surfaced from CI rather than from a review thread.

  • "Keep Mint's React and React DOM on the same major" was Codex's most repeated finding, on roughly 25 of the PRs, and greptile (P1) and cubic (P2) raised it again here. Regenerating the lockfile made pnpm auto-install a second react-dom@18.3.1 to satisfy @mintlify/mdx's stale ^18.3.1 peer and pair it with React 19. This branch first worked around it with overrides; those are now gone, because ENG-1158 removed Mintlify and took the cause with it. With the studio app as the only React consumer left, the tree resolves to a single matched pair, react-dom@19.3.0(react@19.3.0), with no override at all. Verified by grepping every react/react-dom entry in the regenerated lockfile. pnpm peers check reports no React complaints; the one remaining entry is the pre-existing eslint-plugin-jsx-a11y-wants-eslint-9 warning main already carries.

  • tsdown 0.23 engines vs the Node 24.0-24.10 matrix entries (P1) and eslint-plugin-regexp pulling jsdoc-type-pratt-parser@9.2.1 (P2): accepted. pnpm does not enforce engines, both PRs were green, and pnpm build / pnpm lint pass here. Flagging rather than hiding: if those Node entries ever start failing on tsdown, this is the cause.

  • TypeScript 7 peer range and jsdom engines: resolved by holding those two back.

  • cubic P3, docstring placement: valid, fixed. unwrapPrompt had been inserted between decideGitInit's JSDoc and the function itself.

  • greptile P2, "Prompt Changes Lack Tests": valid against AGENTS.md's standing rule, and now covered. prompts.test.ts pins the validate adapter (clack gets a callback that forwards "" for the pre-keystroke undefined, and a caller supplying no validator still hands clack undefined rather than a pass-everything wrapper). bin.test.ts pins unwrapPrompt: cancelling either the name or the template prompt calls clack.cancel, exits non-zero, and leaves scaffold() untouched. Each case was mutation-checked against the pre-fix code rather than assumed load-bearing; details in the commit message. The validate case there deliberately drives a real directory collision first, because the coalescing only matters once retryInitial is armed.

  • sentry MEDIUM, commander 15 negatable options: does not reproduce, no change. The claim was that v14+ requires an explicit .default() for an option declared with both polarities, so opts.agentsMd would no longer be undefined when neither flag is passed. Probed the installed commander 15 directly: with the positive flag declared first (which is how both CLIs declare it), no flag still yields undefined, and --agents-md / --no-agents-md yield true / false. Declaring --no-x alone is the case that defaults to true, and neither CLI does that. The 11 e2e/cli cases that exercise the flag pass against the built binaries on commander 15, covering all three states: no flag, --agents-md, --no-agents-md, plus the both-flags rejection. The four code comments that documented this were phrased as "Commander v13 leaves this undefined"; they now name the verified version and the reason, so the next reviewer does not re-derive it.

  • cubic P2, "reads the first lifetime clack.text call": does not reproduce, but changed anyway. Measured the call count inside the test: it is 1, because vitest 5 ships clearMocks: true in its own defaults (read from the installed package) and none of this repo's five vitest configs override it. The tests were passing and reading the right call. The recommendation still stands, since that rests on a framework default the file never asked for, so a lastTextOptions() helper reads the tail instead. Proved the difference: with clearMocks forced to false and an extra clack.text test inserted above, the helper passes and the old calls[0] form fails.

  • sentry MEDIUM, "clack 1.x dropped defaultValue": does not reproduce. clack 1.8.0's TextOptions still declares defaultValue?: string, documented as "A fallback value returned when the user provides nothing (empty input)". Probing it did surface a real gap, though: run() spreads that option in conditionally, and TypeScript does not excess-property-check spread members (verified by injecting a bogus property inside the spread and watching tsc pass), so the call site would not have caught an upstream removal. Added both a compile-time canary indexing clack's own option type and a test pinning that the first-pass prompt carries the derived name in placeholder and defaultValue with initialValue unset.

  • license-compliance alerts cannot be fixed in the repo, and are worth reading before treating them as new risk. Every flagged package already exists on main at an older version, so this PR adds no new license exposure; the alerts re-fire because the versions moved. MPL-2.0 is lightningcss (Vite's CSS transformer, on main at 1.32.0) plus axe-core and ico-endec; OFL-1.1 is the two Geist fonts, which the repo bundles deliberately (AGENTS.md keeps them in dependencies so they reach the release SBOM); CC-BY-4.0 is caniuse-lite; BlueOak-1.0.0 is the glob/tar family under c8 12. Everything except the fonts is build-time tooling. Clearing these needs a decision on the org's license allow-list, not a code change.

Self-review found a real miss

esbuild, hono, open, posthog-node and zod were still at the versions main had, so PRs #247, #278, #263, #254 and #279 were not folded in, even though an earlier revision of this description claimed they were.

The cause was a wrong assumption about pnpm: these five declare caret ranges, and "the range already covers the new release" is not the same as "install moves onto it". pnpm install keeps any lockfile entry that still satisfies the range; only pnpm update advances it. The react family had moved earlier only because that one did go through pnpm update.

Fixed, and then audited rather than spot-checked: every one of the 35 kept Dependabot targets is now met by the resolved version in the lockfile, not merely by the declared range, which is what hid the problem. The three held-back packages are confirmed still at typescript 5.9.3, jsdom 29.1.1 and eslint-plugin-unicorn 64.0.0.

Verification

All run on the merged branch:

Step Result
pnpm install --frozen-lockfile clean, so CI's install path is in sync with the manifests
pnpm build 3/3, dist/bin.mjs emitted by tsdown 0.23
pnpm typecheck 10/10
pnpm lint 7/7, Found 0 warnings and 0 errors per package
pnpm format:check 194 files, clean under oxfmt 0.67
pnpm test 9/9 tasks, 56 test files
pnpm --filter @arkor/e2e-studio test 9/9 in Chromium
node scripts/check-no-em-dash.mts clean

Two things the suites cannot reach were checked by hand, both on the @hono/node-server 1.x -> 2.x major:

  • Studio auth contract. The E2E run covers the per-launch meta token, the /api/* token check including both 403 cases, and the non-loopback Host rejection, i.e. the CSRF/DNS-rebinding contract AGENTS.md requires be preserved.
  • The EADDRINUSE path, which dev.test.ts cannot cover because it mocks @hono/node-server outright. Ran two arkor dev instances on the same explicit port against an isolated HOME: the second exits 1 with Port 41877 is already in use. Another 'arkor dev' may be running..., the first stays alive, and its ~/.arkor/studio-token is left intact. That last part is the one that matters, since the code comments call out a failed second launch deleting a healthy instance's token as the hazard.

e2e/cli was run with SKIP_E2E_INSTALL=1 (106 passed). The real-<pm>-install cases need to download package trees per fixture, which this connection cannot do in reasonable time; CI's install matrix covers them.

Notes

  • Tests: added for the clack 1.x boundaries (see the greptile item above). The rest of the change is version bumps with no new behaviour to cover; the migration is additionally exercised by the existing e2e/cli prompt suites (arkor init, create-arkor, and the CLAUDECODE=1 strict-mode cases).
  • No docs pair to update. No user-facing docs name any of these versions. AGENTS.md gets one edit and has no JA mirror.
  • AGENTS.md honesty fix: the ENG-788 bullet claims oxlint/ESLint rule parity "as of oxlint 1.66". This moves the pin to 1.82 without repeating that audit, so the bullet now says so rather than silently reading as though the claim still holds.
  • Merge conflicts were pnpm-workspace.yaml (kept this branch's catalog bumps, dropped the mint entry main deleted) and pnpm-lock.yaml (regenerated from main's side rather than hand-merged, since main removed 709 packages with Mintlify).

Folds in the five open github-actions Dependabot PRs:

  actions/checkout             v7.0.0 -> v7.0.1  (#209)
  actions/attest               v4.2.0 -> v4.2.2  (#218)
  actions/upload-code-coverage v1.3.0 -> v1.4.2  (#237)
  github/codeql-action         v4.37.0 -> v4.38.0 (#238, #241)
  pnpm/action-setup            v6.0.9 -> v6.1.0  (#243)

codeql-action/init and codeql-action/analyze move together on purpose.
Dependabot raised them as two PRs, and each one alone fails the Analyze
jobs with "Loaded a configuration file for version '4.37.0', but running
version '4.38.0'" because the init step writes the config that analyze
then reads. Bumping both in one commit is what makes them green.

Every new SHA was checked against the GitHub API to confirm it is the
commit the version tag points at (dereferencing the annotated tags for
codeql-action, pnpm/action-setup and upload-code-coverage).
Folds in 40 of the open npm Dependabot PRs. The point of doing them as
one change is that several are only correct together: each of these
pairs fails CI when Dependabot raises it alone.

  vitest + @vitest/coverage-v8   4.1.5  -> 5.0.0   (#260, #242)
  vite + @vitejs/plugin-react    6.4.2  -> 8.2.2 / 4.7.0 -> 6.1.1 (#256, #273)
  tailwindcss + @tailwindcss/vite       -> 4.3.3   (#277, #270)
  react + react-dom              19.2.5 -> 19.3.0  (#246, #239)

Vitest rejects a mixed-major core/provider pair during coverage init;
plugin-react 6 declares `vite: ^8`; React DOM refuses to load against a
React of a different version; and Tailwind is only reached through its
Vite plugin, so bumping the CSS package alone left the old compiler in
place.

Also in the catalog: @fontsource-variable/geist{,-mono} 5.3.0,
@playwright/test 1.63.0, @testing-library/{jest-dom 7.0.1, react 16.3.3,
user-event 14.6.7}, @vitest/eslint-plugin 1.6.27, c8 12.0.0,
eslint-import-resolver-typescript 4.4.5, eslint-plugin-import-x 4.17.1,
eslint-plugin-n 18.3.0, eslint-plugin-regexp 3.3.0, eventsource-parser
4.1.0, globals 17.12.0, oxfmt 0.67.0, oxlint 1.82.0, tsdown 0.23.0,
turbo 2.10.12, typescript-eslint 8.70.0.

Published runtime deps keep literal semver per the carve-out in
pnpm-workspace.yaml: @clack/prompts ^1.8.0, @hono/node-server ^2.1.1 and
commander ^15.0.0 on the two published packages; esbuild, hono, open,
posthog-node and zod already had ranges covering their new releases, so
only the lockfile moves for those.

Four bumps are deliberately held back, each with the reason inline in
pnpm-workspace.yaml: typescript (#272), jsdom (#264),
eslint-plugin-unicorn (#274) and mint (#268).

The `overrides` entry for @mintlify/mdx is new. Regenerating the
lockfile at all makes pnpm auto-install a second react-dom@18.3.1 to
satisfy that package's stale `^18.3.1` peer and pair it with react 19,
which is the cross-major mismatch Codex flagged on roughly 25 of these
PRs. peerDependencyRules only silences the warning; the override is what
moves the resolution back onto one major.
…70 APIs

Two type-level breaks came with the bumps in the previous commit.

@clack/prompts 1.x types cancellation as "value is typeof CANCEL_SYMBOL",
i.e. one *unique* symbol. Excluding that in the negative branch of
isCancel does not remove the wider "symbol" a prompt's return type
carries, so the existing inline "if (isCancel(x)) process.exit(1)" in
create-arkor left x as "T | symbol" afterwards and failed to compile at
four call sites. unwrapPrompt funnels that narrowing through one place,
mirroring assertValue in the arkor package, which already worked because
it casts.

1.x also widened Validate<T> to hand the callback "T | undefined" (an
untouched field reads as undefined, not ""). promptText adapts at the
boundary so its own signature keeps taking a plain string, which is what
every caller is written against; create-arkor's inline validator
coalesces the same way. Behaviour is unchanged: an empty field still
produces the "cannot be empty" message on the retry pass.

typescript-eslint 8.70 adds no-meaningless-void-operator, which flags
"void CloudApiClient;" in whoami. That line existed only to keep an
otherwise unused import alive, so both it and the import are gone rather
than papering over it with a disable. ../../core/client has no top-level
side effects, so dropping the import changes nothing at runtime.
Comment thread pnpm-lock.yaml
Comment thread pnpm-lock.yaml
Comment thread pnpm-lock.yaml Fixed
Comment thread pnpm-lock.yaml
Comment thread pnpm-lock.yaml
Comment thread pnpm-lock.yaml Fixed
Comment thread pnpm-lock.yaml
Comment thread pnpm-lock.yaml
Comment thread pnpm-lock.yaml
Comment thread pnpm-lock.yaml
@chatgpt-codex-connector

chatgpt-codex-connector Bot commented Sep 11, 2026

Copy link
Copy Markdown

Codex Review Summary

This comment shows the latest Codex review activity on this pull request.

Review Status Commit Review trigger
📝 Code Review Completed 2026-09-12T06:35:32.005001Z 0b4fbe0 New commits
🔒 Security Review Completed 2026-09-12T06:35:15.466786Z 0b4fbe0 New commits
ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review" or "@codex security review".

Codex reacts with 👀 while any review is running, comments if it has suggestions, and reacts with 👍 once all reviews finish with no findings.

@socket-security

socket-security Bot commented Sep 11, 2026

Copy link
Copy Markdown

Review the following changes in direct dependencies. Learn more about Socket for GitHub.

Diff Package Supply Chain
Security
Vulnerability Quality Maintenance License
Updatedesbuild@​0.28.0 ⏵ 0.28.292 +1100 +173 +188100
Updatedtypescript-eslint@​8.59.4 ⏵ 8.70.010010074 +196 -1100
Updated@​types/​react-dom@​19.2.3 ⏵ 19.3.0100 +110075 +193100
Updatedposthog-node@​5.30.6 ⏵ 5.51.891 -410079 +2100 +1100
Updated@​types/​react@​19.2.14 ⏵ 19.3.01001007994100
Updated@​vitest/​coverage-v8@​4.1.5 ⏵ 5.0.09910079 +199100
Updatedvitest@​4.1.5 ⏵ 5.0.098 +1100 +279 +199 +1100
Updatedvite@​6.4.2 ⏵ 8.3.098 +8100 +188297100
Updated@​fontsource-variable/​geist@​5.2.8 ⏵ 5.3.010010082 +28690
Updated@​fontsource-variable/​geist-mono@​5.2.7 ⏵ 5.3.0100 +410083 +285 +190
Updatedtailwindcss@​4.2.4 ⏵ 4.3.31001008498100
Updatedreact@​19.2.5 ⏵ 19.3.0100 +110084 +197100
Updatedcommander@​13.1.0 ⏵ 15.0.0100 +1100100 +185100
Updatedturbo@​2.9.14 ⏵ 2.10.12100 +11008597 +1100
Updatedc8@​10.1.3 ⏵ 12.0.09910010085100
Updatedglobals@​17.6.0 ⏵ 17.12.0100 +110086 +196100
Updatedoxfmt@​0.52.0 ⏵ 0.67.086 +11008896100
Updatedeslint-plugin-import-x@​4.16.2 ⏵ 4.17.19910010087 -2100
Updatedeslint-import-resolver-typescript@​4.4.4 ⏵ 4.4.5100 +1100100 +188 +4100
Updatedopen@​11.0.0 ⏵ 11.0.2100 +1100100 +188100
Updatedtsdown@​0.21.10 ⏵ 0.23.09810088 +198 +2100
Updated@​tailwindcss/​vite@​4.2.4 ⏵ 4.3.3100 +11008998100
Addedeventsource-parser@​4.1.010010010090100
Updatedoxlint@​1.66.0 ⏵ 1.82.0991009196100
Updated@​testing-library/​react@​16.3.2 ⏵ 16.3.3100 +110010091100
Updatedeslint-plugin-regexp@​3.1.0 ⏵ 3.3.09910010092 +2100
Updatedreact-dom@​19.2.5 ⏵ 19.3.010010092 +198100
Updated@​hono/​node-server@​1.19.14 ⏵ 2.1.1100 +1100 +210094100
Updated@​vitejs/​plugin-react@​4.7.0 ⏵ 6.1.1100 +110010094100
Updatedeslint-plugin-n@​18.0.1 ⏵ 18.3.09810010095100
Updated@​testing-library/​jest-dom@​6.9.1 ⏵ 7.0.110010010095 +2100
Updatedhono@​4.12.23 ⏵ 4.13.7100 +1100 +5097 +195 -1100
Updated@​testing-library/​user-event@​14.6.1 ⏵ 14.6.710010010095100
See 4 more rows in the dashboard

View full report

@coderabbitai

coderabbitai Bot commented Sep 11, 2026

Copy link
Copy Markdown

Review Change StackReview Change Stack

No actionable comments were generated in the recent review. 🎉

ℹ️ Recent review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: ASSERTIVE

Plan: Advanced

Run ID: 9258e30d-fbed-49b1-b18f-cd4da7035fc7

📥 Commits

Reviewing files that changed from the base of the PR and between 4b5c51b and 560d586.

⛔ Files ignored due to path filters (1)
  • pnpm-lock.yaml is excluded by !**/pnpm-lock.yaml
📒 Files selected for processing (7)
  • AGENTS.md
  • packages/arkor/package.json
  • packages/arkor/src/cli/main.ts
  • packages/arkor/src/cli/prompts.test.ts
  • packages/create-arkor/src/bin.test.ts
  • packages/create-arkor/src/bin.ts
  • pnpm-workspace.yaml

Included review availability: Your plan provides up to 2 included reviews per hour; 0 remain after this review.

📜 Recent review details
⏰ Context from checks skipped due to timeout. (114)
  • GitHub Check: cubic · AI code reviewer
  • GitHub Check: install · pnpm-9 · macos-latest · node >=26.0.0 <27
  • GitHub Check: install · yarn-berry · macos-latest · node >=26.0.0 <27
  • GitHub Check: install · pnpm-10 · macos-latest · node >=26.0.0 <27
  • GitHub Check: install · bun · macos-latest · node >=26.0.0 <27
  • GitHub Check: install · bun · macos-latest · node >=24.12.0 <25
  • GitHub Check: install · yarn · macos-latest · node >=26.0.0 <27
  • GitHub Check: install · npm · macos-latest · node 26.0.0
  • GitHub Check: install · pnpm-11 · macos-latest · node 26.0.0
  • GitHub Check: install · npm · macos-latest · node >=26.0.0 <27
  • GitHub Check: install · pnpm-10 · macos-latest · node 26.0.0
  • GitHub Check: install · pnpm-11 · macos-latest · node >=24.12.0 <25
  • GitHub Check: install · pnpm-11 · macos-latest · node >=26.0.0 <27
  • GitHub Check: install · bun · macos-latest · node 26.0.0
  • GitHub Check: install · yarn · macos-latest · node >=24.12.0 <25
  • GitHub Check: install · npm · macos-latest · node >=24.12.0 <25
  • GitHub Check: install · yarn-berry · macos-latest · node 26.0.0
  • GitHub Check: install · yarn · macos-latest · node 26.0.0
  • GitHub Check: install · yarn-berry · macos-latest · node >=24.12.0 <25
  • GitHub Check: install · pnpm-9 · macos-latest · node 26.0.0
  • GitHub Check: install · bun · macos-latest · node 22.22.0
  • GitHub Check: install · npm · windows-latest · node 24.0.0
  • GitHub Check: install · yarn · macos-latest · node >=22.22.0 <23
  • GitHub Check: install · pnpm-11 · macos-latest · node 24.12.0
  • GitHub Check: install · bun · macos-latest · node >=22.22.0 <23
  • GitHub Check: install · yarn-berry · macos-latest · node 24.12.0
  • GitHub Check: install · pnpm-11 · macos-latest · node 24.0.0
  • GitHub Check: install · pnpm-10 · macos-latest · node 24.0.0
  • GitHub Check: install · pnpm-9 · macos-latest · node 24.12.0
  • GitHub Check: install · yarn · macos-latest · node 24.0.0
  • GitHub Check: install · npm · macos-latest · node 24.12.0
  • GitHub Check: install · pnpm-9 · macos-latest · node 24.0.0
  • GitHub Check: install · yarn-berry · macos-latest · node >=22.22.0 <23
  • GitHub Check: install · pnpm-10 · macos-latest · node >=24.12.0 <25
  • GitHub Check: install · yarn-berry · macos-latest · node 22.22.0
  • GitHub Check: install · bun · macos-latest · node 24.0.0
  • GitHub Check: install · bun · macos-latest · node 24.12.0
  • GitHub Check: install · yarn · macos-latest · node 22.22.0
  • GitHub Check: install · pnpm-9 · macos-latest · node >=24.12.0 <25
  • GitHub Check: install · npm · macos-latest · node 24.0.0
  • GitHub Check: install · pnpm-10 · macos-latest · node 24.12.0
  • GitHub Check: install · npm · macos-latest · node 22.22.0
  • GitHub Check: install · pnpm-11 · macos-latest · node 22.22.0
  • GitHub Check: install · pnpm-10 · macos-latest · node >=22.22.0 <23
  • GitHub Check: install · npm · macos-latest · node >=22.22.0 <23
  • GitHub Check: install · pnpm-9 · macos-latest · node >=22.22.0 <23
  • GitHub Check: install · pnpm-9 · macos-latest · node 22.22.0
  • GitHub Check: install · npm · windows-latest · node 26.0.0
  • GitHub Check: install · yarn · windows-latest · node >=26.0.0 <27
  • GitHub Check: install · npm · windows-latest · node >=26.0.0 <27
  • GitHub Check: install · npm · windows-latest · node >=24.12.0 <25
  • GitHub Check: install · pnpm-10 · windows-latest · node 26.0.0
  • GitHub Check: install · npm · windows-latest · node 24.12.0
  • GitHub Check: install · pnpm-10 · windows-latest · node 24.0.0
  • GitHub Check: install · yarn-berry · windows-latest · node 22.22.0
  • GitHub Check: install · npm · windows-latest · node 22.22.0
  • GitHub Check: install · yarn · windows-latest · node >=22.22.0 <23
  • GitHub Check: install · npm · windows-latest · node >=22.22.0 <23
  • GitHub Check: install · pnpm-10 · windows-latest · node >=22.22.0 <23
  • GitHub Check: install · yarn · macos-latest · node 26.0.0
  • GitHub Check: install · yarn-berry · macos-latest · node >=26.0.0 <27
  • GitHub Check: install · npm · macos-latest · node >=26.0.0 <27
  • GitHub Check: install · bun · macos-latest · node >=26.0.0 <27
  • GitHub Check: install · npm · macos-latest · node 26.0.0
  • GitHub Check: install · pnpm-11 · macos-latest · node 26.0.0
  • GitHub Check: install · bun · macos-latest · node >=24.12.0 <25
  • GitHub Check: install · yarn-berry · macos-latest · node 26.0.0
  • GitHub Check: install · pnpm-10 · macos-latest · node >=26.0.0 <27
  • GitHub Check: install · yarn · macos-latest · node >=26.0.0 <27
  • GitHub Check: install · pnpm-11 · macos-latest · node >=26.0.0 <27
  • GitHub Check: install · bun · macos-latest · node 26.0.0
  • GitHub Check: install · pnpm-10 · macos-latest · node 26.0.0
  • GitHub Check: install · yarn-berry · macos-latest · node >=24.12.0 <25
  • GitHub Check: install · npm · macos-latest · node >=24.12.0 <25
  • GitHub Check: install · yarn · macos-latest · node >=24.12.0 <25
  • GitHub Check: install · npm · macos-latest · node 24.12.0
  • GitHub Check: install · yarn-berry · windows-latest · node 24.12.0
  • GitHub Check: install · bun · windows-latest · node >=24.12.0 <25
  • GitHub Check: install · npm · windows-latest · node 26.0.0
  • GitHub Check: install · npm · windows-latest · node >=24.12.0 <25
  • GitHub Check: install · pnpm-9 · windows-latest · node 24.12.0
  • GitHub Check: install · npm · windows-latest · node 24.12.0
  • GitHub Check: Seer Code Review
  • GitHub Check: install · npm · windows-latest · node 22.22.0
  • GitHub Check: install · yarn-berry · windows-latest · node >=22.22.0 <23
  • GitHub Check: install · pnpm-9 · windows-latest · node >=22.22.0 <23
  • GitHub Check: install · yarn-berry · windows-latest · node 22.22.0
  • GitHub Check: install · npm · windows-latest · node >=22.22.0 <23
  • GitHub Check: typecheck · lint · test · build · windows-latest · node >=24.5.0 <24.8.0
  • GitHub Check: typecheck · lint · test · build · windows-latest · node >=24.10.0 <24.12.0
  • GitHub Check: typecheck · lint · test · build · windows-latest · node >=24.12.0 <25
  • GitHub Check: typecheck · lint · test · build · windows-latest · node >=26.0.0 <27
  • GitHub Check: typecheck · lint · test · build · windows-latest · node >=24.1.0 <24.3.0
  • GitHub Check: typecheck · lint · test · build · windows-latest · node 24.12.0
  • GitHub Check: typecheck · lint · test · build · windows-latest · node 26.0.0
  • GitHub Check: typecheck · lint · test · build · windows-latest · node >=24.8.0 <24.10.0
  • GitHub Check: typecheck · lint · test · build · windows-latest · node 22.22.0
  • GitHub Check: typecheck · lint · test · build · windows-latest · node >=24.3.0 <24.5.0
  • GitHub Check: typecheck · lint · test · build · windows-latest · node >=24.0.0 <24.1.0
  • GitHub Check: typecheck · lint · test · build · windows-latest · node >=22.22.0 <23
  • GitHub Check: coverage · upload to Codecov
  • GitHub Check: typecheck · lint · test · build · windows-latest · node 26.0.0
  • GitHub Check: typecheck · lint · test · build · windows-latest · node >=24.5.0 <24.8.0
  • GitHub Check: typecheck · lint · test · build · windows-latest · node 24.12.0
  • GitHub Check: typecheck · lint · test · build · windows-latest · node >=22.22.0 <23
  • GitHub Check: typecheck · lint · test · build · windows-latest · node >=24.1.0 <24.3.0
  • GitHub Check: typecheck · lint · test · build · windows-latest · node >=24.0.0 <24.1.0
  • GitHub Check: typecheck · lint · test · build · windows-latest · node >=26.0.0 <27
  • GitHub Check: typecheck · lint · test · build · windows-latest · node 22.22.0
  • GitHub Check: typecheck · lint · test · build · windows-latest · node >=24.10.0 <24.12.0
  • GitHub Check: typecheck · lint · test · build · windows-latest · node >=24.8.0 <24.10.0
  • GitHub Check: typecheck · lint · test · build · windows-latest · node >=24.3.0 <24.5.0
  • GitHub Check: typecheck · lint · test · build · windows-latest · node >=24.12.0 <25
  • GitHub Check: coverage · upload to Codecov
🧰 Additional context used
📓 Path-based instructions (8)
Do not paper over this by adding an explicit `@oxlint/binding-` devDependency

📄 CodeRabbit inference engine (AGENTS.md)

Files:

  • packages/arkor/package.json
Add vitest cases under `packages/*/src/**/*.test.ts` for SDK/CLI/scaffold logic changes.

📄 CodeRabbit inference engine (AGENTS.md)

Files:

  • packages/arkor/src/cli/prompts.test.ts
  • packages/create-arkor/src/bin.test.ts
Do not use the em dash character (U+2014) or its HTML entity in repository files outside the lint targets.

📄 CodeRabbit inference engine (CONTRIBUTING.md)

Files:

  • packages/arkor/package.json
  • AGENTS.md
  • pnpm-workspace.yaml
TypeScript/TSX のコード、コメント、文字列、テンプレートリテラルではエムダッシュ (U+2014) またはその HTML エンティティを使用しない。

📄 CodeRabbit inference engine (CONTRIBUTING.ja.md)

Files:

  • packages/arkor/src/cli/main.ts
  • packages/arkor/src/cli/prompts.test.ts
  • packages/create-arkor/src/bin.test.ts
  • packages/create-arkor/src/bin.ts
Do not use the em dash character (U+2014) in code comments, string literals, or template literals, including CLI messages, generated template bodies, and test names.

📄 CodeRabbit inference engine (CONTRIBUTING.md)

Files:

  • packages/arkor/src/cli/main.ts
  • packages/arkor/src/cli/prompts.test.ts
  • packages/create-arkor/src/bin.test.ts
  • packages/create-arkor/src/bin.ts
SDK、CLI、スキャフォルダーのロジックには Vitest のテストを追加し、Studio コンポーネントには jsdom と Testing Library ベースのテストを使用する。ただしテスト追加自体は PR の必須条件ではない。

📄 CodeRabbit inference engine (CONTRIBUTING.ja.md)

Files:

  • packages/arkor/src/cli/main.ts
  • packages/arkor/src/cli/prompts.test.ts
  • packages/create-arkor/src/bin.test.ts
  • packages/create-arkor/src/bin.ts
リポジトリ内の追跡対象ファイルでは、エムダッシュまたはその HTML エンティティを使用しない。Markdown、YAML、JSON、HTML、設定ファイル、生成テンプレートも含む。

📄 CodeRabbit inference engine (CONTRIBUTING.ja.md)

Files:

  • packages/arkor/src/cli/main.ts
  • packages/arkor/src/cli/prompts.test.ts
  • packages/arkor/package.json
  • AGENTS.md
  • packages/create-arkor/src/bin.test.ts
  • pnpm-workspace.yaml
  • packages/create-arkor/src/bin.ts
Maintain AGENTS.md as a living document with current agent status and architectural decisions

📄 CodeRabbit inference engine (CLAUDE.md)

Files:

  • AGENTS.md
🪛 LanguageTool
AGENTS.md

[uncategorized] ~114-~114: The official name of this software platform is spelled with a capital “H”.
Context: ...to pnpm publish: the release workflow used to publish v...

(GITHUB)


[style] ~114-~114: Try using a descriptive adverb here.
Context: ...The runtime deps are still kept literal on purpose, so the published manifest mirrors sour...

(ON_PURPOSE_DELIBERATELY)


[uncategorized] ~115-~115: The official name of this software platform is spelled with a capital “H”.
Context: ...TOCOL`. - Release SBOMs (build.yaml): each release sh...

(GITHUB)


[uncategorized] ~115-~115: The official name of this software platform is spelled with a capital “H”.
Context: ...ifact, and postflight in release.yaml attaches them t...

(GITHUB)


[uncategorized] ~115-~115: The official name of this software platform is spelled with a capital “H”.
Context: ...npm emits 2.3), so release-dry-run.yaml regener...

(GITHUB)


[style] ~117-~117: The word ‘caveat’ is a legal term. To make your text as clear as possible to all readers, do not use this foreign term unless it is used with its legal meaning. Possible alternatives are “caution” or “warning”.
Context: ...s import-x/order. Same native-binding caveat as oxlint above: when bumping the catal...

(CAVEAT)

🔇 Additional comments (7)
pnpm-workspace.yaml (1)

140-146: LGTM!

packages/arkor/package.json (1)

58-62: LGTM!

AGENTS.md (1)

7-7: LGTM!

Also applies to: 18-18, 113-113, 117-117, 119-119

packages/create-arkor/src/bin.ts (1)

360-360: LGTM!

Also applies to: 442-449, 469-469, 873-878, 967-970

packages/arkor/src/cli/main.ts (1)

74-80: LGTM!

Also applies to: 164-164

packages/arkor/src/cli/prompts.test.ts (1)

265-298: LGTM!

packages/create-arkor/src/bin.test.ts (1)

39-42: LGTM!

Also applies to: 805-920


Walkthrough

The pull request updates workspace and package dependencies, adapts CLI code for newer APIs, adds prompt boundary tests, and refreshes pinned GitHub Actions across build, CI, security, and release workflows.

Changes

Dependency and CLI refresh

Layer / File(s) Summary
Workspace dependency alignment
pnpm-workspace.yaml, packages/arkor/package.json, packages/create-arkor/package.json, AGENTS.md
Catalog and package dependency versions are updated. Held dependency versions and oxlint parity notes are documented.
CLI compatibility updates
packages/create-arkor/src/bin.ts, packages/create-arkor/src/bin.test.ts, packages/arkor/src/cli/prompts.ts, packages/arkor/src/cli/prompts.test.ts, packages/arkor/src/cli/commands/whoami.ts, packages/arkor/src/cli/main.ts
Prompt cancellation and validation handling are adapted for clack 1.x. whoami uses the typed RPC client factory. Tests cover cancellation and validation boundaries. Commander references are updated.

Workflow action refresh

Layer / File(s) Summary
Pinned workflow action updates
.github/workflows/*.yaml
Pinned versions of checkout, pnpm setup, attestation, coverage upload, and CodeQL actions are updated. Workflow logic remains unchanged.

Priority: ⬇️ Low

Estimated code review effort: 3 (Moderate) | ~20 minutes

Change: Other

Merge Risk: ⚪ Minimal · up to 560d5

The dependency refresh includes compatibility updates and focused cancellation and validation coverage, with no remaining actionable merge risk identified.

🚥 Pre-merge checks | ✅ 4 | ❌ 1

❌ Failed checks (1 warning)

Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 50.00% which is insufficient. The required threshold is 100.00%. Docstring coverage is scoped to functions touched by this diff. Analyzed 8 functions across 5 files. (3 skipped: … Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (4 passed)
Check name Status Explanation
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.
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed The title clearly identifies the main change: consolidating the Dependabot dependency updates into one build dependency bump. It is specific, concise, and includes the tracking issue.
Full details: Docstring Coverage

Explanation

Docstring coverage is 50.00% which is insufficient. The required threshold is 100.00%. Docstring coverage is scoped to functions touched by this diff. Analyzed 8 functions across 5 files. (3 skipped: 3 unsupported.)

  • Fix all pre-merge checks with AI
✨ Finishing Touches 💡 1
📝 Generate docstrings 💡
  • Create stacked PR
  • Commit on current branch
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch eng-1157
✨ Simplify code
  • Create PR with simplified code
  • Commit simplified code in branch eng-1157

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

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

@github-code-quality

github-code-quality Bot commented Sep 11, 2026

Copy link
Copy Markdown

Code Coverage Overview

Languages: TypeScript

TypeScript / code-coverage/arkor

The overall line coverage in commit 0b4fbe0 in the eng-1157 branch remains at 98%, unchanged from commit 03548ea in the main branch.

TypeScript / code-coverage/create-arkor

The overall line coverage in commit 0b4fbe0 in the eng-1157 branch is 74%. The line coverage in commit 03548ea in the main branch is 60%.

Show a line coverage summary of the most impacted files.
File main 03548ea eng-1157 0b4fbe0 +/-
src/bin.ts 60% 74% +14%

TypeScript / code-coverage/cli-internal

The overall line coverage in commit 0b4fbe0 in the eng-1157 branch remains at 97%, unchanged from commit 03548ea in the main branch.

TypeScript / code-coverage/studio-app

The overall line coverage in commit 0b4fbe0 in the eng-1157 branch remains at 53%, unchanged from commit 03548ea in the main branch.


Updated September 12, 2026 06:31 UTC

@drift-check

drift-check Bot commented Sep 11, 2026

Copy link
Copy Markdown

Code Review Bot

No reviewable code changes were analyzed. ⚠️ The documentation drift check could not be evaluated. Reviewed 0 file(s); skipped 16.

@codecov

codecov Bot commented Sep 11, 2026

Copy link
Copy Markdown

Codecov Report

✅ All modified and coverable lines are covered by tests.
✅ All tests successful. No failed tests found.

📢 Thoughts on this report? Let us know!

@greptile-apps

greptile-apps Bot commented Sep 11, 2026

Copy link
Copy Markdown
Contributor

RetriggerConfidence Score: 5/5

The PR appears safe to merge; the previous prompt-testing requirement is now fully addressed and no new actionable issue was identified.

Fix All in Claude CodeFindings

  1. P2 Prompt Changes Lack Tests
Fix with agent prompt
### Issue 1
packages/create-arkor/src/bin.ts:307-324
This migration changes prompt cancellation, value unwrapping, and pre-input validation behavior without adding the Vitest coverage required by the repository guide for CLI and scaffolding logic changes. The related validation wrapper also converts an undefined prompt value to an empty string. Existing broad end-to-end runs do not add focused regression cases for these boundaries, so this repository requirement must be satisfied before merging by covering cancellation and validation before input.

Note: If this suggestion doesn't match your team's coding style, reply to this and let me know. I'll remember it for next time!

---

For each issue above, determine whether it is valid and should be fixed. If so, fix it directly.

Summary

  • Updates shared build, test, lint, formatting, frontend, and GitHub Actions dependencies.
  • Advances runtime dependencies for the two published packages while retaining their intentional literal semver ranges.
  • Preserves prompt cancellation and validation behavior across the @clack/prompts migration.
  • Adds tests for cancellation, pre-input validation, derived-name defaults, and process-state cleanup.
  • Removes an obsolete type-only import from the whoami command.
  • Keeps deliberately incompatible TypeScript, jsdom, and eslint-plugin-unicorn upgrades held back.

Reviews (6) · Last reviewed commit: "test(create-arkor): keep the buildCdLine..."

Comment thread pnpm-workspace.yaml Outdated

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

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

All reported issues were addressed across 13 files

Tip: cubic can generate docs of your entire codebase and keep them up to date. Try it here.

Re-trigger cubic

Comment thread pnpm-workspace.yaml Outdated
Comment thread packages/create-arkor/src/bin.ts
…ocstring

Review follow-up on #282.

greptile (P1) and cubic (P2) both landed on the same real problem: the
scoped "@mintlify/mdx>react" override was half a fix. It moved React DOM
off the auto-installed 18.3.1, but left React itself on the 19.2.3 the
tree already had, so the docs graph still carried two different React
versions. React DOM refuses to load against a React whose version
differs from its own, so that is a runtime error waiting for the first
render, and it is the same class of defect this PR set out to fix for
the Studio app.

Overriding react and react-dom outright collapses the whole install to
one matched pair: the lockfile now holds exactly one react (19.3.0) and
one react-dom, resolved as react-dom@19.3.0(react@19.3.0). "pnpm peers
check" reports no React complaints; the one remaining entry is the
pre-existing eslint-plugin-jsx-a11y-wants-eslint-9 warning that main
already carries.

cubic also noticed the comment read as stale against the lockfile: the
committed "@mintlify/mdx" block shows peers of ^19.3.0, not the ^18.3.1
the comment cites. That is the override rewriting the recorded peer
range, not upstream having widened it. The comment now says so, so the
next reader does not draw the same inference.

Separately (cubic P3): unwrapPrompt had been inserted between
decideGitInit's docstring and decideGitInit itself, leaving that JSDoc
attached to the wrong function. Moved above it.

Re-verified after the change: build 3/3, typecheck 10/10, lint 7/7,
format:check clean on 196 files, test 9/9 tasks, Studio E2E 9/9,
mint validate passing.
Comment on lines +307 to +324
/**
* Narrow a clack prompt result to its value, exiting on cancellation.
*
* `isCancel` is typed `value is typeof CANCEL_SYMBOL`, i.e. it narrows to one
* *unique* symbol. Excluding that in the negative branch does not remove the
* wider `symbol` member a prompt's return type carries, so an inline
* `if (isCancel(x)) process.exit(1)` leaves `x` as `T | symbol` afterwards.
* Funnel the narrowing through here instead of casting at each call site.
* Mirrors `assertValue` in `packages/arkor/src/cli/prompts.ts`.
*/
function unwrapPrompt<T>(value: T | symbol): T {
if (clack.isCancel(value)) {
clack.cancel("Cancelled.");
process.exit(1);
}
return value as T;
}

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 Prompt Changes Lack Tests

This migration changes prompt cancellation, value unwrapping, and pre-input validation behavior without adding the Vitest coverage required by the repository guide for CLI and scaffolding logic changes. The related validation wrapper also converts an undefined prompt value to an empty string. Existing broad end-to-end runs do not add focused regression cases for these boundaries, so this repository requirement must be satisfied before merging by covering cancellation and validation before input.

Context Used: CLAUDE.md (source)

Knowledge Base Used: CLI project scaffolding

Prompt To Fix With AI
This is a comment left during a code review.
Path: packages/create-arkor/src/bin.ts
Line: 307-324

Comment:
**Prompt Changes Lack Tests**

This migration changes prompt cancellation, value unwrapping, and pre-input validation behavior without adding the Vitest coverage required by the repository guide for CLI and scaffolding logic changes. The related validation wrapper also converts an undefined prompt value to an empty string. Existing broad end-to-end runs do not add focused regression cases for these boundaries, so this repository requirement must be satisfied before merging by covering cancellation and validation before input.

**Context Used:** CLAUDE.md ([source](https://github.com/arkorlab/arkor/blob/main/CLAUDE.md))

**Knowledge Base Used:** [CLI project scaffolding](https://app.greptile.com/arkor/-/custom-context/knowledge-base/arkorlab/arkor/-/docs/cli-project-scaffolding.md)

---

For each issue above, determine whether it is valid and should be fixed. If so, fix it directly.

Note: If this suggestion doesn't match your team's coding style, reply to this and let me know. I'll remember it for next time!

Fix in Claude Code

Brings in ENG-1158, which removes the Mintlify toolchain.

Two conflicts, both in files this branch rewrites heavily:

pnpm-workspace.yaml: kept this branch's catalog bumps and dropped the
"mint" entry, which main deleted along with the docs workspace.

pnpm-lock.yaml: regenerated from main's side rather than hand-merged.
Main removed 709 packages with Mintlify, so a textual resolution would
have been guesswork; "pnpm install" against the merged catalog is the
only trustworthy way to produce it.

The merge also retires this branch's react/react-dom overrides, exactly
as their own comment anticipated. They existed solely because
@mintlify/mdx declared a stale "react-dom: ^18.3.1" peer, which made
pnpm auto-install a second React DOM on a different major from React.
With Mintlify gone the studio app is the only React consumer left, and
the tree resolves to one matched pair, react-dom@19.3.0(react@19.3.0),
with no override at all. Verified by grepping the regenerated lockfile
for every react/react-dom entry. A global override is a blunt instrument
to leave lying around once the thing it was aimed at is gone.

Re-verified on the merge result: build 3/3, typecheck 10/10, lint 7/7,
format:check clean on 194 files, test 9/9 tasks, Studio E2E 9/9.
"pnpm peers check" reports only the pre-existing
eslint-plugin-jsx-a11y-wants-eslint-9 warning that main already carries.
Self-review caught this: esbuild, hono, open, posthog-node and zod were
all still sitting at the versions main already had. Their Dependabot PRs
(#247, #278, #263, #254, #279) were therefore not folded in at all,
even though the PR description claimed they were.

The cause is a wrong assumption about pnpm. These five declare caret
ranges in the published packages' dependencies, and the earlier
reasoning was that a range already covering the new release means
"pnpm install regenerates the lockfile onto it". It does not: install
keeps any existing lockfile entry that still satisfies the range, so a
dep only moves when its range stops matching or when pnpm update is run
explicitly. The react family moved earlier only because that one did go
through pnpm update.

pnpm update rewrites the declared range to match what it installed, so
packages/arkor/package.json picks up the new floors alongside the
lockfile. zod lands on 4.6.1 and posthog-node on 5.51.8, both at or
past what Dependabot asked for.

Audited the whole set afterwards rather than spot-checking: every one of
the 35 kept Dependabot targets is now met by the resolved version in the
lockfile (not merely by the declared range, which is what hid this), and
the three held-back packages are still exactly at typescript 5.9.3,
jsdom 29.1.1 and eslint-plugin-unicorn 64.0.0.

Re-verified with all five moved: build 3/3, typecheck 10/10, lint 7/7,
format:check clean on 194 files, test 9/9 tasks, Studio E2E 9/9. The
Studio suite matters most here since hono crossed a minor under the
node-server 2.x adapter.
Comment thread packages/arkor/package.json
Review follow-up on #282.

greptile (P2) is right that the clack migration changed CLI behaviour
without the vitest coverage AGENTS.md asks for, and the two boundaries
it names are the ones worth pinning:

packages/arkor/src/cli/prompts.test.ts covers the validate adapter. It
asserts the callback clack receives forwards "" for the undefined that
1.x passes before the first keystroke, and that a caller supplying no
validator still gets undefined handed to clack rather than a wrapper
that always passes.

packages/create-arkor/src/bin.test.ts covers unwrapPrompt: cancelling
either the name or the template prompt must call clack.cancel, exit
non-zero, and leave scaffold() untouched. The validate case there drives
a real directory collision first, because the coalescing only carries
weight once retryInitial is armed; on the first pass the
retryInitial !== null guard short-circuits before the value is read, so
a test that skipped the collision would have passed either way.

Each new case was mutation-checked against the pre-fix code rather than
assumed to be load-bearing. Reverting the arkor adapter fails with
"Cannot read properties of undefined (reading 'trim')"; dropping
unwrapPrompt fails the cancellation case; reverting only the create-arkor
coalescing fails the retry case with the same TypeError.

The @arkor/cli-internal mock gains isClaudeCode. Every pre-existing test
in that file passes yes: true and so never reaches the interactive
branch, which is why the export was not needed until now.

Also retires the "Commander v13" phrasing on the four comments that
document why opts.agentsMd is undefined when neither --agents-md nor
--no-agents-md is passed. Sentry flagged commander 15 as breaking that
(MEDIUM), on the theory that v14's negatable-option change now requires
an explicit .default(). Probed the installed commander 15 directly: with
the positive flag declared first, no flag still yields undefined, and
--agents-md / --no-agents-md yield true / false. Declaring --no-x alone
is the case that defaults to true, and this code does not do that. So
the finding does not reproduce and no behaviour changes here; the
comments now name the verified version and the reason, so the next
reviewer does not have to re-derive it.
Comment thread packages/create-arkor/src/bin.test.ts

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

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

All reported issues were addressed across 4 files (changes from recent commits).

Tip: Review your code locally with the cubic CLI to iterate faster.

Re-trigger cubic

Comment thread packages/arkor/src/cli/prompts.test.ts Outdated
Comment thread packages/create-arkor/src/bin.test.ts
…e block

Self-review of the previous commit. The clack 1.x boundary tests fake a
TTY and clear CLAUDECODE so run() takes the interactive branch, but only
restored the process.exit spy afterwards. The file's outer hooks cover
CI and the cwd, not those two, so every test declared after that block
ran against a fake TTY and a missing CLAUDECODE.

Nothing is failing today, because what follows is buildCdLine's pure
string cases. It is still a trap for the next test added below it, and
packages/arkor/src/cli/prompts.test.ts already had the right pattern
(ORIG_TTY captured and put back), so this now matches it.

Confirmed the leak was real rather than theoretical: a temporary canary
appended after the block asserting the original values fails without
this restore and passes with it.
Comment thread packages/create-arkor/src/bin.ts
Review follow-up on #282. Two bot findings, neither reproducing as
described, but both pointing at something worth changing anyway.

cubic (P2, confidence 10) said the validate tests read the first lifetime
clack.text call, so `passed` is undefined and the test fails. It does
not: measured the call count inside the test and it is 1, because vitest
5 ships clearMocks: true in its own shipped defaults (read from the
installed package) and none of the five vitest configs in this repo
override it. The tests pass, and the earlier mutation checks already
confirmed they read the call under test.

The recommendation still stands on its own, because that behaviour rests
on a framework default this file never asked for. `lastTextOptions` reads
the tail instead. Proved the difference rather than assuming it: with
clearMocks forced to false and an extra clack.text test inserted above,
the new helper passes and the old calls[0] form fails.

sentry (MEDIUM) said clack 1.x dropped `defaultValue` from text(), so
Enter-on-empty would return "" and sanitise() would collapse the derived
project name to the generic arkor-project fallback. It did not drop it:
clack 1.8.0's TextOptions still declares `defaultValue?: string`,
documented as "A fallback value returned when the user provides nothing
(empty input)", which is exactly what this code wants.

What that probing did turn up is that nothing here would have caught it
if clack ever does drop it. `run()` spreads the option in conditionally,
and TypeScript does not excess-property-check spread members: injecting a
bogus property inside that spread compiles clean, so the call site is not
the guard it looks like. Hence two additions rather than one:

  - `_DefaultValueStillSupported` indexes clack's own option type, so
    removal upstream fails the build. Verified by pointing it at a
    nonexistent key and watching tsc reject it.
  - A test asserting the first-pass prompt carries the derived name in
    both `placeholder` and `defaultValue`, with `initialValue` unset.
    That covers our side: a refactor dropping the option from this call.
    Mutation-checked by deleting `defaultValue`, i.e. reproducing the
    exact state sentry believed we were already in.
…ribe

Self-review of the commit before this one, which also turned up a defect
in 3e8b37b: inserting the clack 1.x describe block landed it between the
"Round 40 follow-up" comment and describe("buildCdLine"), so that comment
was left documenting whatever happened to follow it.

Exactly the defect cubic flagged on this PR for unwrapPrompt and
decideGitInit's docstring, reproduced in a different file and missed by
me and by the bots the second time around. The new block and its type
canary now sit above that comment, which is glued back to its describe.

Move only: no test bodies or assertions changed. 51 passing in
create-arkor either way.
Nicolas0315 added a commit to Nicolas0315/arkor that referenced this pull request Sep 19, 2026
The header claimed the "only members with an update available" rule as
a property of the SECURITY lane. It is not: a grouped version-update
PR carries only the members that have a release available too, so a
publish that reaches one half of a pair before the other still lands
one-sided. The note now covers both lanes and says what a group
actually buys, which is the case where both halves are available and
would otherwise arrive as two separately-red PRs (every row of arkorlab#282's
table).

It also names the residual honestly rather than leaving it implied:
the window is narrow for these families, since each is published from
one repository at one version and the shared cooldown delays both
halves equally, but closing it needs an invariant CI can enforce
rather than a Dependabot setting.

Reported by CodeRabbit. The CI invariant it suggests is deliberately
NOT in this PR: a new gate is its own change and CONTRIBUTING asks for
an issue before one.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>

This branch has not been deployed

No deployments
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