gitstow 0.1.0__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (67) hide show
  1. gitstow-0.1.0/.github/ISSUE_TEMPLATE/bug_report.yml +67 -0
  2. gitstow-0.1.0/.github/ISSUE_TEMPLATE/feature_request.yml +42 -0
  3. gitstow-0.1.0/.github/PULL_REQUEST_TEMPLATE.md +15 -0
  4. gitstow-0.1.0/.github/workflows/ci.yml +31 -0
  5. gitstow-0.1.0/.github/workflows/release.yml +45 -0
  6. gitstow-0.1.0/.gitignore +33 -0
  7. gitstow-0.1.0/BACKLOG.md +16 -0
  8. gitstow-0.1.0/CHANGELOG.md +27 -0
  9. gitstow-0.1.0/CLAUDE.md +129 -0
  10. gitstow-0.1.0/CODE_OF_CONDUCT.md +13 -0
  11. gitstow-0.1.0/CONTRIBUTING.md +82 -0
  12. gitstow-0.1.0/LICENSE +21 -0
  13. gitstow-0.1.0/PKG-INFO +306 -0
  14. gitstow-0.1.0/README.md +266 -0
  15. gitstow-0.1.0/SECURITY.md +23 -0
  16. gitstow-0.1.0/demo.tape +43 -0
  17. gitstow-0.1.0/docs/building/implementation-plan.md +720 -0
  18. gitstow-0.1.0/docs/user/commands.md +688 -0
  19. gitstow-0.1.0/docs/user/concepts.md +217 -0
  20. gitstow-0.1.0/docs/user/configuration.md +194 -0
  21. gitstow-0.1.0/docs/user/getting-started.md +183 -0
  22. gitstow-0.1.0/pyproject.toml +70 -0
  23. gitstow-0.1.0/src/gitstow/__init__.py +3 -0
  24. gitstow-0.1.0/src/gitstow/__main__.py +11 -0
  25. gitstow-0.1.0/src/gitstow/cli/__init__.py +1 -0
  26. gitstow-0.1.0/src/gitstow/cli/add.py +262 -0
  27. gitstow-0.1.0/src/gitstow/cli/config_cmd.py +235 -0
  28. gitstow-0.1.0/src/gitstow/cli/doctor.py +163 -0
  29. gitstow-0.1.0/src/gitstow/cli/exec_cmd.py +159 -0
  30. gitstow-0.1.0/src/gitstow/cli/export_cmd.py +293 -0
  31. gitstow-0.1.0/src/gitstow/cli/helpers.py +113 -0
  32. gitstow-0.1.0/src/gitstow/cli/list_cmd.py +213 -0
  33. gitstow-0.1.0/src/gitstow/cli/main.py +129 -0
  34. gitstow-0.1.0/src/gitstow/cli/manage.py +283 -0
  35. gitstow-0.1.0/src/gitstow/cli/migrate.py +142 -0
  36. gitstow-0.1.0/src/gitstow/cli/onboard.py +234 -0
  37. gitstow-0.1.0/src/gitstow/cli/open_cmd.py +144 -0
  38. gitstow-0.1.0/src/gitstow/cli/pull.py +265 -0
  39. gitstow-0.1.0/src/gitstow/cli/remove.py +88 -0
  40. gitstow-0.1.0/src/gitstow/cli/search.py +199 -0
  41. gitstow-0.1.0/src/gitstow/cli/setup_ai.py +247 -0
  42. gitstow-0.1.0/src/gitstow/cli/shell.py +317 -0
  43. gitstow-0.1.0/src/gitstow/cli/skill_cmd.py +63 -0
  44. gitstow-0.1.0/src/gitstow/cli/stats.py +126 -0
  45. gitstow-0.1.0/src/gitstow/cli/status.py +213 -0
  46. gitstow-0.1.0/src/gitstow/cli/tui.py +27 -0
  47. gitstow-0.1.0/src/gitstow/cli/workspace_cmd.py +202 -0
  48. gitstow-0.1.0/src/gitstow/core/__init__.py +1 -0
  49. gitstow-0.1.0/src/gitstow/core/config.py +130 -0
  50. gitstow-0.1.0/src/gitstow/core/discovery.py +116 -0
  51. gitstow-0.1.0/src/gitstow/core/git.py +261 -0
  52. gitstow-0.1.0/src/gitstow/core/parallel.py +85 -0
  53. gitstow-0.1.0/src/gitstow/core/paths.py +51 -0
  54. gitstow-0.1.0/src/gitstow/core/repo.py +300 -0
  55. gitstow-0.1.0/src/gitstow/core/url_parser.py +159 -0
  56. gitstow-0.1.0/src/gitstow/mcp/__init__.py +1 -0
  57. gitstow-0.1.0/src/gitstow/mcp/server.py +704 -0
  58. gitstow-0.1.0/src/gitstow/skill/SKILL.md +210 -0
  59. gitstow-0.1.0/src/gitstow/tui/__init__.py +1 -0
  60. gitstow-0.1.0/src/gitstow/tui/app.py +384 -0
  61. gitstow-0.1.0/tests/__init__.py +1 -0
  62. gitstow-0.1.0/tests/conftest.py +58 -0
  63. gitstow-0.1.0/tests/test_cli.py +62 -0
  64. gitstow-0.1.0/tests/test_config.py +129 -0
  65. gitstow-0.1.0/tests/test_git.py +201 -0
  66. gitstow-0.1.0/tests/test_repo.py +163 -0
  67. gitstow-0.1.0/tests/test_url_parser.py +166 -0
@@ -0,0 +1,67 @@
1
+ name: Bug Report
2
+ description: Report a bug in gitstow
3
+ labels: ["bug"]
4
+ body:
5
+ - type: input
6
+ id: version
7
+ attributes:
8
+ label: gitstow version
9
+ description: "Run `gitstow --version` to find this."
10
+ placeholder: "0.1.0"
11
+ validations:
12
+ required: true
13
+
14
+ - type: dropdown
15
+ id: os
16
+ attributes:
17
+ label: Operating System
18
+ options:
19
+ - macOS
20
+ - Linux
21
+ - Windows
22
+ - Other
23
+ validations:
24
+ required: true
25
+
26
+ - type: input
27
+ id: python-version
28
+ attributes:
29
+ label: Python version
30
+ placeholder: "3.12"
31
+ validations:
32
+ required: true
33
+
34
+ - type: textarea
35
+ id: description
36
+ attributes:
37
+ label: What happened?
38
+ description: A clear description of the bug.
39
+ validations:
40
+ required: true
41
+
42
+ - type: textarea
43
+ id: steps
44
+ attributes:
45
+ label: Steps to reproduce
46
+ description: Commands or steps to reproduce the behavior.
47
+ placeholder: |
48
+ 1. Run `gitstow add ...`
49
+ 2. Run `gitstow pull`
50
+ 3. See error
51
+ validations:
52
+ required: true
53
+
54
+ - type: textarea
55
+ id: expected
56
+ attributes:
57
+ label: Expected behavior
58
+ description: What did you expect to happen?
59
+ validations:
60
+ required: true
61
+
62
+ - type: textarea
63
+ id: logs
64
+ attributes:
65
+ label: Relevant output
66
+ description: Paste any error messages or terminal output.
67
+ render: shell
@@ -0,0 +1,42 @@
1
+ name: Feature Request
2
+ description: Suggest a new feature or improvement
3
+ labels: ["enhancement"]
4
+ body:
5
+ - type: textarea
6
+ id: problem
7
+ attributes:
8
+ label: What problem does this solve?
9
+ description: Describe the use case or frustration that motivates this request.
10
+ validations:
11
+ required: true
12
+
13
+ - type: textarea
14
+ id: solution
15
+ attributes:
16
+ label: Proposed solution
17
+ description: How do you think this should work? Include example commands if applicable.
18
+ placeholder: |
19
+ gitstow add --recursive owner/repo
20
+ # This would also initialize git submodules during clone
21
+ validations:
22
+ required: true
23
+
24
+ - type: textarea
25
+ id: alternatives
26
+ attributes:
27
+ label: Alternatives considered
28
+ description: Any other approaches you've thought about or workarounds you're using.
29
+
30
+ - type: dropdown
31
+ id: scope
32
+ attributes:
33
+ label: Which area does this affect?
34
+ options:
35
+ - Core commands (add, pull, list, status)
36
+ - Workspace management
37
+ - Repo management (freeze, tags)
38
+ - Shell integration
39
+ - TUI dashboard
40
+ - Export/import
41
+ - AI integration (skill, MCP)
42
+ - Other
@@ -0,0 +1,15 @@
1
+ ## Summary
2
+
3
+ <!-- What does this PR do and why? -->
4
+
5
+ ## Test Plan
6
+
7
+ <!-- How did you verify this works? -->
8
+
9
+ - [ ] `pytest` passes
10
+ - [ ] `ruff check src/` passes
11
+ - [ ] Tested manually with `gitstow <command>`
12
+
13
+ ## Related Issues
14
+
15
+ <!-- Link any related issues: Fixes #123, Relates to #456 -->
@@ -0,0 +1,31 @@
1
+ name: CI
2
+
3
+ on:
4
+ push:
5
+ branches: [main]
6
+ pull_request:
7
+ branches: [main]
8
+
9
+ jobs:
10
+ test:
11
+ runs-on: ubuntu-latest
12
+ strategy:
13
+ matrix:
14
+ python-version: ["3.10", "3.11", "3.12", "3.13"]
15
+
16
+ steps:
17
+ - uses: actions/checkout@v4
18
+
19
+ - name: Set up Python ${{ matrix.python-version }}
20
+ uses: actions/setup-python@v5
21
+ with:
22
+ python-version: ${{ matrix.python-version }}
23
+
24
+ - name: Install dependencies
25
+ run: pip install -e ".[dev]"
26
+
27
+ - name: Lint
28
+ run: ruff check src/
29
+
30
+ - name: Test
31
+ run: pytest --tb=short
@@ -0,0 +1,45 @@
1
+ name: Release to PyPI
2
+
3
+ on:
4
+ release:
5
+ types: [published]
6
+
7
+ permissions:
8
+ id-token: write
9
+
10
+ jobs:
11
+ build:
12
+ runs-on: ubuntu-latest
13
+ steps:
14
+ - uses: actions/checkout@v4
15
+
16
+ - name: Set up Python
17
+ uses: actions/setup-python@v5
18
+ with:
19
+ python-version: "3.12"
20
+
21
+ - name: Install build tools
22
+ run: pip install build
23
+
24
+ - name: Build package
25
+ run: python -m build
26
+
27
+ - name: Upload artifacts
28
+ uses: actions/upload-artifact@v4
29
+ with:
30
+ name: dist
31
+ path: dist/
32
+
33
+ publish:
34
+ needs: build
35
+ runs-on: ubuntu-latest
36
+ environment: pypi
37
+ steps:
38
+ - name: Download artifacts
39
+ uses: actions/download-artifact@v4
40
+ with:
41
+ name: dist
42
+ path: dist/
43
+
44
+ - name: Publish to PyPI
45
+ uses: pypa/gh-action-pypi-publish@release/v1
@@ -0,0 +1,33 @@
1
+ # Python
2
+ __pycache__/
3
+ *.py[cod]
4
+ *$py.class
5
+ *.egg-info/
6
+ dist/
7
+ build/
8
+ *.egg
9
+
10
+ # Virtual environments
11
+ .venv/
12
+ venv/
13
+ env/
14
+
15
+ # IDE
16
+ .idea/
17
+ .vscode/
18
+ *.swp
19
+ *.swo
20
+
21
+ # Claude Code (local settings only — .claude/settings.json is meant to be shared)
22
+ .claude/settings.local.json
23
+
24
+ # macOS
25
+ .DS_Store
26
+
27
+ # Testing
28
+ .pytest_cache/
29
+ .coverage
30
+ htmlcov/
31
+
32
+ # Ruff
33
+ .ruff_cache/
@@ -0,0 +1,16 @@
1
+ # Backlog
2
+
3
+ Post-v0.1.0 improvements tracked here. See [GitHub Issues](https://github.com/rishmadaan/gitstow/issues) for discussion.
4
+
5
+ ## Enhancements
6
+
7
+ - [x] **TUI: expand beyond read-only dashboard** (#1) — Added pull selected (P), workspace cycling (w), tag cycling (t)
8
+ - [x] **Shell completion for repo names** (#2) — `gitstow shell completions` for bash/zsh/fish; `--quiet` on list/tags/workspace list
9
+ - [x] **Network retry/resume for batch operations** (#3) — `--retry N` flag on add and pull; cleans up partial clones before retry
10
+ - [x] **Export format versioning and checksums** (#4) — Added `version: 1` to YAML/JSON exports; validates on import; backward-compatible with unversioned files
11
+ - [x] **Progress indication during long clones** (#5) — `git clone --progress`; pull shows live counter `[5/47]`
12
+ - [x] **Publish to PyPI** (#6) — Release workflow created (`.github/workflows/release.yml`); publish on GitHub release
13
+
14
+ ## Documentation
15
+
16
+ - [ ] **Record demo GIF for README** (#7) — VHS tape script created (`demo.tape`); run `vhs demo.tape` to record
@@ -0,0 +1,27 @@
1
+ # Changelog
2
+
3
+ All notable changes to gitstow will be documented in this file.
4
+
5
+ The format is based on [Keep a Changelog](https://keepachangelog.com/), and this project adheres to [Semantic Versioning](https://semver.org/).
6
+
7
+ ## [0.1.0] - 2026-04-10
8
+
9
+ Initial release.
10
+
11
+ ### Added
12
+
13
+ - **Core commands:** `add`, `pull`, `list`, `status`, `remove`, `migrate`
14
+ - **Workspace system:** Multiple workspaces with structured (`owner/repo`) and flat (`repo`) layouts
15
+ - **Workspace commands:** `workspace list`, `workspace add`, `workspace remove`, `workspace scan`
16
+ - **Repo management:** `repo freeze`, `repo unfreeze`, `repo tag`, `repo untag`, `repo tags`, `repo info`
17
+ - **Bulk operations:** Parallel pull/status with configurable concurrency (default 6)
18
+ - **Power commands:** `exec` (run commands across repos), `search` (grep across repos via ripgrep), `open` (editor/browser/finder), `stats`
19
+ - **Collection sharing:** `collection export` (YAML/JSON/URLs) and `collection import`
20
+ - **Shell integration:** `shell pick` (fzf picker), `shell init` (aliases), `shell setup`
21
+ - **Interactive TUI:** `tui` command with Textual-based dashboard (filter, pull, freeze toggle)
22
+ - **URL parsing:** GitHub, GitLab, Bitbucket, Codeberg, Azure DevOps, custom hosts; HTTPS, SSH, and shorthand formats
23
+ - **AI integration:** Claude Code skill (auto-installed via `onboard` or `install-skill`) and optional MCP server
24
+ - **Setup:** `onboard` wizard, `doctor` health check, `config show/set`
25
+ - **Output modes:** `--json` and `--quiet` flags on all main commands
26
+ - **Global workspace filter:** `-w/--workspace` flag on all commands
27
+ - **Error isolation:** One failing repo never blocks operations on others
@@ -0,0 +1,129 @@
1
+ # gitstow — AI Developer Guide
2
+
3
+ ## What is this?
4
+
5
+ A CLI tool that manages collections of git repositories across multiple workspaces. Think "package manager for repos" — whether they're open-source projects you learn from or active projects you work on.
6
+
7
+ ## Key Concept: Workspaces
8
+
9
+ Repos are organized into **workspaces** — directories with a label and layout mode:
10
+ - **structured** layout: `workspace/owner/repo/` (open-source collections)
11
+ - **flat** layout: `workspace/repo/` (active projects, no owner subdirectory)
12
+
13
+ Each workspace can have auto-tags applied to all repos it discovers.
14
+
15
+ ## Architecture
16
+
17
+ ```
18
+ src/gitstow/
19
+ ├── cli/ # Typer commands (thin — delegates to core)
20
+ │ ├── main.py # App entry, command registration, global --workspace flag
21
+ │ ├── helpers.py # Shared workspace resolution, repo lookup, iteration
22
+ │ ├── add.py, pull.py, list_cmd.py, status.py, remove.py # Core commands
23
+ │ ├── workspace_cmd.py # workspace list/add/remove/scan subcommands
24
+ │ ├── manage.py # freeze/unfreeze/tag/untag/info subcommands
25
+ │ ├── exec_cmd.py, search.py, open_cmd.py, stats.py # Power commands
26
+ │ ├── export_cmd.py # export/import collection
27
+ │ ├── shell.py # Shell integration (fzf, aliases)
28
+ │ ├── tui.py # TUI launcher
29
+ │ ├── migrate.py, config_cmd.py, onboard.py, doctor.py, skill_cmd.py
30
+ │ └── __init__.py
31
+ ├── core/ # Business logic (git ops, URL parsing, state)
32
+ │ ├── paths.py # Path constants, central repos.yaml resolution
33
+ │ ├── config.py # Workspace + Settings dataclasses, load/save
34
+ │ ├── repo.py # Repo dataclass + RepoStore (nested YAML CRUD)
35
+ │ ├── url_parser.py # URL → (host, owner, repo) extraction
36
+ │ ├── git.py # All git subprocess calls
37
+ │ ├── discovery.py # Walk directory tree (structured + flat), reconcile
38
+ │ ├── parallel.py # Async execution with semaphore
39
+ │ └── __init__.py
40
+ ├── tui/ # Textual interactive dashboard
41
+ │ ├── app.py # Main TUI application
42
+ │ └── __init__.py
43
+ └── skill/ # Claude Code skill (SKILL.md)
44
+ └── SKILL.md
45
+ ```
46
+
47
+ **Key rules:**
48
+ 1. CLI never touches git directly — it calls `core/git.py`
49
+ 2. `core/repo.py` (RepoStore) is the only module that reads/writes `repos.yaml`
50
+ 3. `core/config.py` defines Workspace dataclass — all workspace logic flows from here
51
+ 4. `cli/helpers.py` provides `resolve_workspaces()`, `resolve_repo()`, `iter_repos_with_workspace()`
52
+
53
+ ## Key Files
54
+
55
+ - `core/config.py` — Workspace + Settings dataclasses. `get_workspaces()` with legacy migration shim.
56
+ - `core/repo.py` — Repo with workspace field, RepoStore with nested YAML format, legacy auto-migration.
57
+ - `core/discovery.py` — `discover_repos(root, layout)` supports structured and flat layouts.
58
+ - `core/url_parser.py` — URL parsing (the hardest part). Test changes here thoroughly.
59
+ - `core/git.py` — All git subprocess calls. Uses `git status --porcelain=v2 --branch` for single-call efficiency.
60
+ - `core/parallel.py` — Async execution with semaphore (max 6 concurrent).
61
+ - `cli/helpers.py` — Shared workspace resolution used by all CLI commands.
62
+ - `cli/workspace_cmd.py` — workspace list/add/remove/scan subcommands.
63
+ - `cli/main.py` — Typer app, global `-w/--workspace` option, command registration.
64
+ - `tui/app.py` — Textual dashboard with DataTable, filter, pull, freeze toggle.
65
+
66
+ ## Data Files
67
+
68
+ - `~/.gitstow/config.yaml` — Settings (workspaces list, default host, SSH pref).
69
+ - `~/.gitstow/repos.yaml` — Repo metadata nested by workspace label. Central location.
70
+
71
+ ### repos.yaml format
72
+ ```yaml
73
+ oss:
74
+ anthropic/claude-code:
75
+ remote_url: https://github.com/anthropic/claude-code.git
76
+ tags: [ai]
77
+ active:
78
+ gitstow:
79
+ remote_url: https://github.com/rishmadaan/gitstow.git
80
+ tags: [active]
81
+ ```
82
+
83
+ ## All Commands (26)
84
+
85
+ **Core:** `add`, `pull`, `list`, `status`, `remove`, `migrate`
86
+ **Workspace:** `workspace list`, `workspace add`, `workspace remove`, `workspace scan`
87
+ **Repo management:** `repo freeze`, `repo unfreeze`, `repo tag`, `repo untag`, `repo tags`, `repo info`
88
+ **Power:** `exec`, `search`, `open`, `stats`
89
+ **Sharing:** `collection export`, `collection import`
90
+ **Shell:** `shell pick`, `shell init`, `shell setup`, `tui`
91
+ **Setup:** `onboard`, `config show/set/path/migrate-root`, `doctor`, `install-skill`
92
+
93
+ ## Development
94
+
95
+ ```bash
96
+ cd ~/labs/projects/gitstow
97
+ pip install -e ".[dev]"
98
+ pytest # 44 tests
99
+ ruff check src/
100
+ pip install -e ".[tui]" # For TUI development
101
+ ```
102
+
103
+ ## Patterns
104
+
105
+ - `--json -j` and `--quiet -q` on all main commands
106
+ - Global `-w/--workspace` flag filters all commands to a single workspace
107
+ - `cli/helpers.py` for workspace resolution (don't repeat in each command)
108
+ - Rich console for stdout, err_console for stderr
109
+ - Typer with `rich_markup_mode="rich"`, `typer.Context` for global options
110
+ - YAML for persistence (not JSON, not SQLite)
111
+ - asyncio with semaphore for parallel git ops
112
+ - `git status --porcelain=v2 --branch` for single-call status (vs gita's 4-5 calls)
113
+ - Repo.global_key (`workspace:key`) for unique identification across workspaces
114
+ - Legacy format auto-migration (flat repos.yaml → nested, root_path → workspaces)
115
+
116
+ ## AI Integration
117
+
118
+ **Primary: Claude Code skill** (`src/gitstow/skill/SKILL.md`)
119
+ - Installed to `~/.claude/skills/gitstow/` via `gitstow install-skill` or `gitstow onboard`
120
+ - Auto-updates on version bumps (checks `.version` marker on every CLI invocation)
121
+ - Zero context cost when inactive — only loaded when task matches the skill description
122
+ - Claude runs gitstow CLI commands via Bash — full access to all commands
123
+
124
+ **Optional: MCP server** (`src/gitstow/mcp/server.py`)
125
+ - For non-Claude-Code AI tools (Claude Desktop, Cursor, Windsurf)
126
+ - Install: `pip install gitstow[mcp]`, entry point: `gitstow-mcp`
127
+ - 13 tools + 3 resources, wraps same `core/` modules as CLI
128
+ - **Tradeoff:** MCP tools are always loaded into context (costs tokens even when idle).
129
+ The skill has no such cost. Only use MCP for dedicated repo-management setups.
@@ -0,0 +1,13 @@
1
+ # Code of Conduct
2
+
3
+ This project follows the [Contributor Covenant v2.1](https://www.contributor-covenant.org/version/2/1/code_of_conduct/).
4
+
5
+ By participating, you agree to uphold a welcoming, inclusive, and respectful environment for everyone.
6
+
7
+ ## Reporting
8
+
9
+ If you experience or witness unacceptable behavior, please report it by opening a GitHub issue or contacting the maintainer directly.
10
+
11
+ ## Enforcement
12
+
13
+ Project maintainers will review and address reports promptly and fairly.
@@ -0,0 +1,82 @@
1
+ # Contributing to gitstow
2
+
3
+ Thanks for your interest in contributing! This guide will help you get started.
4
+
5
+ ## Development Setup
6
+
7
+ ```bash
8
+ git clone https://github.com/rishmadaan/gitstow
9
+ cd gitstow
10
+ pip install -e ".[dev]"
11
+ ```
12
+
13
+ For TUI development:
14
+ ```bash
15
+ pip install -e ".[tui]"
16
+ ```
17
+
18
+ ## Running Tests
19
+
20
+ ```bash
21
+ pytest # Run all tests
22
+ pytest -x # Stop on first failure
23
+ ruff check src/ # Lint
24
+ ```
25
+
26
+ Both must pass before submitting a PR. CI runs these automatically.
27
+
28
+ ## Code Style
29
+
30
+ - **Linter:** ruff (config in `pyproject.toml`)
31
+ - **Line length:** 100 characters
32
+ - **Python:** 3.10+ (use modern syntax — `list[str]` not `List[str]`)
33
+ - **Formatting:** Follow existing patterns in the codebase
34
+
35
+ ## Architecture
36
+
37
+ The codebase has a strict layered architecture:
38
+
39
+ ```
40
+ cli/ → Thin command layer (Typer). Delegates to core/.
41
+ core/ → Business logic. Git ops, config, repo store, URL parsing.
42
+ tui/ → Textual interactive dashboard.
43
+ skill/ → Claude Code skill (SKILL.md).
44
+ mcp/ → MCP server for non-Claude-Code AI tools.
45
+ ```
46
+
47
+ **Key rules:**
48
+ 1. CLI never touches git directly — it calls `core/git.py`
49
+ 2. `core/repo.py` (RepoStore) is the only module that reads/writes `repos.yaml`
50
+ 3. `core/config.py` owns all config loading/saving
51
+ 4. `cli/helpers.py` provides shared workspace resolution — don't duplicate it
52
+
53
+ See `CLAUDE.md` for a detailed architecture guide.
54
+
55
+ ## Making Changes
56
+
57
+ 1. **Fork** the repo and create a branch from `main`
58
+ 2. **Make your changes** — keep commits focused
59
+ 3. **Add tests** if you're changing behavior
60
+ 4. **Run `pytest` and `ruff check src/`** — both must pass
61
+ 5. **Submit a PR** with a clear description of what and why
62
+
63
+ ## Versioning
64
+
65
+ - Version lives in `pyproject.toml` (`version = "X.Y.Z"`)
66
+ - Mirrored in `src/gitstow/__init__.py`
67
+ - The Claude Code skill auto-updates when the version changes (checked on every CLI invocation)
68
+ - Follow [Semantic Versioning](https://semver.org/): breaking.feature.fix
69
+
70
+ ## What to Work On
71
+
72
+ - Check [open issues](https://github.com/rishmadaan/gitstow/issues) for things to pick up
73
+ - Bug fixes and test coverage improvements are always welcome
74
+ - For larger features, open an issue first to discuss the approach
75
+
76
+ ## Reporting Bugs
77
+
78
+ Use the [bug report template](https://github.com/rishmadaan/gitstow/issues/new?template=bug_report.yml) and include:
79
+ - gitstow version (`gitstow --version`)
80
+ - OS and Python version
81
+ - Steps to reproduce
82
+ - Expected vs actual behavior
gitstow-0.1.0/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 Rish Madaan
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.