Skip to main content

Create isolated feature worktrees with allocated runtime environments.

Project description

new-feature

new-feature aims to eliminate friction for creating new features. In a single command, it creates isolated git worktrees, allocates conflict-free runtime values, runs project-defined setup and teardown commands (such as creating and deleting a feature database), and launches the configured coding agent in the new worktree.

Install

uv tool install new-feature
new-feature setup

new-feature setup launches the configured coding agent (Codex by default) in the current repository. The agent inspects the project, proposes a repository-specific configuration, asks about unresolved choices such as the optional Codex hook, and waits for approval before editing. Run it again to review and improve an existing integration.

Releases

Changing [project].version in pyproject.toml and merging that change to main publishes the distributions to PyPI, tags the merged commit as v<VERSION>, and creates a GitHub Release. Keep the project version in uv.lock synchronized with pyproject.toml. The release workflow can also be run manually to recover from a partial release.

Usage

# Ask an agent to configure or improve new-feature for this repository.
new-feature setup
# Create a feature worktree and launch the configured agent.
uvx new-feature my-feature
# Create a feature worktree without launching another agent.
uvx new-feature my-feature --no-agent
# Merges the worktree into the main branch
uvx new-feature merge my-feature
# Run configured teardown and remove the feature worktree.
uvx new-feature teardown my-feature
# Teardown a worktree even if it has uncommitted work.
uvx new-feature teardown my-feature --force
# Inspect managed features and diagnose stale state.
uvx new-feature list
uvx new-feature doctor
uvx new-feature doctor --repair

Codex hook

Install the Codex hook in the current repository:

new-feature install-codex-hook

This writes .codex/hooks.json; Codex loads the guard only for this trusted repository.

Project Config

Add config to the target repo's pyproject.toml:

[tool.new-feature]
target_branch = "main"
branch_prefix = "feature/"
agent = ["codex"]
push = false
setup = ["uv sync"]
pre_merge = ["uv run pytest"]
post_merge = ["uv run pytest"]
teardown = []

[tool.new-feature.env]
WEB_PORT = { allocate = "port", min = 3000, max = 3999 }
API_PORT = { allocate = "port", min = 4000, max = 4999 }
DATABASE_NAME = { allocate = "name", prefix = "myapp", max_length = 63 }
CACHE_DIR = { allocate = "path", base = ".new-feature/cache" }

agent is the command and arguments used to launch the coding agent. new-feature appends its generated feature prompt as the final argument, so agents that require a prompt flag can be configured directly:

[tool.new-feature]
agent = ["copilot", "--prompt"]

setup runs after worktree creation; teardown runs before worktree removal.

Supported env entries:

  • { value = "literal" }
  • { allocate = "port", min = 3000, max = 3999 }
  • { allocate = "integer", min = 1, max = 15 }
  • { allocate = "name", prefix = "myapp", max_length = 63 }
  • { allocate = "slug", prefix = "myapp" }
  • { allocate = "path", base = ".new-feature/cache" }

Lifecycle

new-feature my-feature creates .worktrees/my-feature, reserves env values in .new-feature/manifest.toml, runs setup, and launches the configured agent in the worktree. It automatically adds .new-feature/ and .worktrees/ to .gitignore. If setup fails, it runs a forced teardown so the partial worktree, branch, and manifest entry do not linger.

new-feature list shows each managed feature and its current Git/worktree state. new-feature doctor reports stale manifest entries, dirty worktrees, unmerged branches, and configuration drift. doctor --repair removes only manifest entries whose worktree and branch are both already gone.

new-feature merge my-feature runs pre-merge checks in the feature worktree, starts a no-commit merge into the target branch, runs post-merge checks on the merged target checkout, commits the merge only if those checks pass, and pushes only when push = true.

new-feature teardown my-feature runs the configured teardown commands before removing the worktree, deleting the branch, and removing the manifest entry. If the worktree has uncommitted changes or the branch has commits that are not in the target branch, pass --force to abandon them deliberately.

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

new_feature-0.6.0.tar.gz (19.0 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

new_feature-0.6.0-py3-none-any.whl (24.4 kB view details)

Uploaded Python 3

File details

Details for the file new_feature-0.6.0.tar.gz.

File metadata

  • Download URL: new_feature-0.6.0.tar.gz
  • Upload date:
  • Size: 19.0 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for new_feature-0.6.0.tar.gz
Algorithm Hash digest
SHA256 a56ae9148fac22bd7595438012f3c9209732a70e16c1e3ecf58b0ab94e01889c
MD5 10ae512db6cd7de904e5b80cfb03c3f2
BLAKE2b-256 1e37c655925f3d76b791e2bb49d86eeda23d1db961cee5bcb9f2534d7697a505

See more details on using hashes here.

Provenance

The following attestation bundles were made for new_feature-0.6.0.tar.gz:

Publisher: publish.yml on crypdick/new-feature

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file new_feature-0.6.0-py3-none-any.whl.

File metadata

  • Download URL: new_feature-0.6.0-py3-none-any.whl
  • Upload date:
  • Size: 24.4 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for new_feature-0.6.0-py3-none-any.whl
Algorithm Hash digest
SHA256 1fbc291fd47f8d05134b217d4d813fce6010649b7839da3b3da35b4c65005ff6
MD5 6acbb50862aa435397a4f768c82196e4
BLAKE2b-256 26980fb34e531ed5207e6f85f0d60d65420eb09101fd5f1dde01c9f89a2603ba

See more details on using hashes here.

Provenance

The following attestation bundles were made for new_feature-0.6.0-py3-none-any.whl:

Publisher: publish.yml on crypdick/new-feature

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page