Skip to content

refactor(claude-toolsets): move the Python and TypeScript packages into one product folder - #90

Draft
mislavivanda wants to merge 1 commit into
mainfrom
refactor/claude-toolsets-product-folder
Draft

mislavivanda wants to merge 1 commit into
mainfrom
refactor/claude-toolsets-product-folder

Conversation

@mislavivanda

@mislavivanda mislavivanda commented Oct 8, 2026 •

Copy link
Copy Markdown
Collaborator

Important

Merge order. release-please assigns commits to packages by path, so a commit that touched the old path but was never released drops out of every future changelog once this move lands. #88 (Python fixes) touches only packages/daytona-claude-toolsets/. Merge #88 → its release-please PR (daytona-claude-toolsets 0.1.1) → then rebase and merge this PR. #89 is a test: change (no release) and only needs a rebase.

The Claude toolset drivers shipped as two unrelated siblings in packages/: a Python port and a TypeScript port of the same product. They are one product with two language bindings — the TypeScript suite already reaches across into the Python sources to assert the shared _xtest.py and _page_js.py assets are byte-identical between the ports. This puts them under one product folder so that relationship is visible in the tree.

The move

Before After Published as release-please component Version
packages/daytona-claude-toolsets/ packages/claude-toolsets/python/ PyPI daytona-claude-toolsets daytona-claude-toolsets (unchanged) 0.1.0 (unchanged)
packages/claude-toolsets/ packages/claude-toolsets/typescript/ npm @daytona/claude-toolsets claude-toolsets (unchanged) 1.0.0 (unchanged)

Done with git mv, so history follows (80 files changed, 71 pure renames, 9 files with real content changes). No package names, code or APIs change.

Why releases and publishing are unaffected

Tags continue. release-please resolves a package's previous release from its component tag, not from its path key: with include-component-in-tag: true the tag is <component>-v<version>, and Manifest.backfillReleasesFromTags() builds that TagName from the configured component plus the manifest version (manifest-releaser.md, src/manifest.ts). Both components are untouched here, so the existing tags daytona-claude-toolsets-v0.1.0 and claude-toolsets-v1.0.0 stay the resume points — the next releases continue from 0.1.0 / 1.0.0 rather than restarting.

Trusted publishers are untouched. PyPI and npm Trusted Publishing bind to the repository + the workflow filename (release.yml) + the environment (pypi / npm). None of those change — only working-directory / packages-dir values inside the existing jobs. Job names (publish-daytona-claude-toolsets, publish-claude-toolsets) are also left as-is.

No path ambiguity from the nesting. release-please attributes a commit to a package by changed-file path prefix, requiring a / boundary and treating configured paths as unique and non-overlapping (src/util/commit-split.ts). packages/claude-toolsets/python and packages/claude-toolsets/typescript are siblings, and no package is registered at packages/claude-toolsets, so nothing is double-attributed. Verified programmatically: no configured package path is a parent directory of another.

This PR does not trigger a release. refactor is not a bumping type — only feat, fix and !/BREAKING CHANGE bump by default, and refactor is a hidden changelog section for the python strategy (src/strategies/python.ts).

Release-please risk found (assessed, low)

The one real hazard when moving a package path is unreleased commits still sitting under the old path: commit attribution is purely path-prefix based, so a commit that only touched packages/daytona-claude-toolsets/** and had not yet been released would stop being attributed to the package after the move and would fall out of the next changelog. There is no automatic old-path → new-path mapping in release-please.

That hazard does not apply here: both packages are fully released as of the base commit. d45a269 is chore(main): release claude-toolsets 1.0.0 (#87), and daytona-claude-toolsets-v0.1.0 was cut in #85 — there are zero unreleased commits under either old path to lose. No bootstrap-sha, last-release-sha or release-search-depth adjustment is needed.

Every reference updated

Release config (path keys only — components and versions preserved)

  • release-please-config.json: packages/claude-toolsets → packages/claude-toolsets/typescript, packages/daytona-claude-toolsets → packages/claude-toolsets/python
  • .release-please-manifest.json: same two keys rekeyed, 1.0.0 and 0.1.0 kept verbatim
  • Each package's CHANGELOG.md moved with it, so the default changelog-path still resolves

.github/workflows/release.yml

  • The four steps.release.outputs['packages/...--release_created' | '--tag_name'] keys — these are keyed by path, so they had to move with it
  • publish-daytona-claude-toolsets: working-directory and packages-dir: .../python/dist
  • publish-claude-toolsets: working-directory → .../typescript

.github/workflows/ci.yml

  • toolsets filter → packages/claude-toolsets/python/**; claude_toolsets filter → packages/claude-toolsets/typescript/**. Each is scoped to its own language subfolder, so the two still never overlap (deliberately not packages/claude-toolsets/**, which would have fired the TypeScript job on Python-only changes and vice versa). Verified no filter glob is a prefix of another.
  • test -f guards in both jobs (.../python/pyproject.toml, .../typescript/package.json)
  • All eight working-directory: lines
  • The stale cross-reference comments on both the filter and the job

Package metadata

  • typescript/package.json: repository.directory, homepage
  • python/pyproject.toml: Homepage, Documentation

Docs and cross-language tests

  • Root README.md: both package table rows
  • typescript/tests/helpers/extractPythonXtest.ts → ../../../python/daytona_claude_toolsets/_xtest.py
  • typescript/tests/pageJs.test.ts → ../../python/daytona_claude_toolsets/_page_js.py

CHANGELOG.md history is left untouched.

Verification

Check Result
npm ci && npm run typecheck (typescript) clean
npm run build (typescript) clean
npm test (typescript) 15 files, 299 tests passed
…including the cross-port asset-identity tests pageJs > matches the checked-out Python __dt bundle byte-for-byte ✓ and xtest > preserves the Python helper asset byte-for-byte ✓ — both resolve the Python sources at their new path
ruff check . (python) All checks passed
black --check . (python) 24 files unchanged
mypy daytona_claude_toolsets Success: no issues found in 12 source files
pytest (python) 211 passed
actionlint ci.yml release.yml clean
git grep "packages/daytona-claude-toolsets" no matches
git grep -E "packages/claude-toolsets([^/]|$)" no matches (every reference is now /python or /typescript)
release-please simulation config keys == manifest keys; all 9 steps.release.outputs[...] path keys resolve to a configured package; no configured path nests inside another; both new dirs and their CHANGELOG.md exist
cubic review --base origin/main 0 issues

Python verified in a fresh uv venv with uv pip install -e "packages/claude-toolsets/python[dev]", running the same commands as the ci.yml toolsets job.

Notes

Important

Draft: rebase after #88 (Python fixes) and #89 (TS offline tests) merge — both touch these packages and will conflict.

FYI @aprojic: release.yml publish jobs only change working directories.

One pre-existing behaviour is deliberately preserved rather than fixed here: a PR that touches only the Python asset sources does not run the TypeScript job, so the byte-identity tests would not catch cross-port drift on such a PR. That was already true when the packages were separate top-level folders; widening the filters is a behaviour change and belongs in its own PR.


Summary by cubic

Consolidates the Python and TypeScript Claude toolset drivers into a single packages/claude-toolsets/ product folder with python/ and typescript/ subdirectories. Done with git mv so history is preserved, and no package names, versions, code, or APIs change.

Releases and publishing are unaffected: release-please components and tags stay the same, and only path keys in release-please-config.json, .release-please-manifest.json, and the workflow output references are updated. CI path filters are now scoped to each language subfolder, so the Python and TypeScript jobs never overlap. All other path references (workflow working directories, package metadata, README, cross-language tests) are updated accordingly.

Written for commit 02bac4e. Summary will update on new commits.

View guided diff Turn on auto-fix

…to one product folder

The two ports of the Claude toolset drivers lived as unrelated siblings:
packages/daytona-claude-toolsets (PyPI) and packages/claude-toolsets (npm).
They are one product with two language bindings, and the TypeScript suite
already reaches into the Python sources to assert the shared _xtest.py and
_page_js.py assets are byte-identical across ports. Put them under one
product folder so that relationship is visible in the tree:

  packages/daytona-claude-toolsets -> packages/claude-toolsets/python
  packages/claude-toolsets         -> packages/claude-toolsets/typescript

Moved with git mv so history follows. No package name, code or API changes:
PyPI stays daytona-claude-toolsets, npm stays @daytona/claude-toolsets.

Publishing is unaffected. The release-please components are untouched
(daytona-claude-toolsets and claude-toolsets), and release-please resolves a
package's previous release by its component tag, not by its path key, so
daytona-claude-toolsets-v0.1.0 and claude-toolsets-v1.0.0 remain the
resume points and versions continue from 0.1.0 and 1.0.0. Only the path
keys in release-please-config.json and .release-please-manifest.json
change, along with the matching steps.release.outputs['<path>--...'] keys
in release.yml, which are keyed by path. The PyPI and npm trusted
publishers are bound to the repository, the release.yml filename and the
pypi/npm environments -- none of which change here.

Also updated: the ci.yml path filters (each now scoped to its own language
subfolder, so the Python and TypeScript jobs still never overlap), the
test -f guards and working-directory values in both workflows, the npm
repository.directory and homepage, the pyproject Homepage/Documentation
URLs, the root README package rows, and the two TypeScript tests that
resolve the Python sources for the cross-port asset-identity checks.
CHANGELOG history is left untouched.

Signed-off-by: Mislav Ivanda <mislavivanda454@gmail.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