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.
- gitstow-0.1.0/.github/ISSUE_TEMPLATE/bug_report.yml +67 -0
- gitstow-0.1.0/.github/ISSUE_TEMPLATE/feature_request.yml +42 -0
- gitstow-0.1.0/.github/PULL_REQUEST_TEMPLATE.md +15 -0
- gitstow-0.1.0/.github/workflows/ci.yml +31 -0
- gitstow-0.1.0/.github/workflows/release.yml +45 -0
- gitstow-0.1.0/.gitignore +33 -0
- gitstow-0.1.0/BACKLOG.md +16 -0
- gitstow-0.1.0/CHANGELOG.md +27 -0
- gitstow-0.1.0/CLAUDE.md +129 -0
- gitstow-0.1.0/CODE_OF_CONDUCT.md +13 -0
- gitstow-0.1.0/CONTRIBUTING.md +82 -0
- gitstow-0.1.0/LICENSE +21 -0
- gitstow-0.1.0/PKG-INFO +306 -0
- gitstow-0.1.0/README.md +266 -0
- gitstow-0.1.0/SECURITY.md +23 -0
- gitstow-0.1.0/demo.tape +43 -0
- gitstow-0.1.0/docs/building/implementation-plan.md +720 -0
- gitstow-0.1.0/docs/user/commands.md +688 -0
- gitstow-0.1.0/docs/user/concepts.md +217 -0
- gitstow-0.1.0/docs/user/configuration.md +194 -0
- gitstow-0.1.0/docs/user/getting-started.md +183 -0
- gitstow-0.1.0/pyproject.toml +70 -0
- gitstow-0.1.0/src/gitstow/__init__.py +3 -0
- gitstow-0.1.0/src/gitstow/__main__.py +11 -0
- gitstow-0.1.0/src/gitstow/cli/__init__.py +1 -0
- gitstow-0.1.0/src/gitstow/cli/add.py +262 -0
- gitstow-0.1.0/src/gitstow/cli/config_cmd.py +235 -0
- gitstow-0.1.0/src/gitstow/cli/doctor.py +163 -0
- gitstow-0.1.0/src/gitstow/cli/exec_cmd.py +159 -0
- gitstow-0.1.0/src/gitstow/cli/export_cmd.py +293 -0
- gitstow-0.1.0/src/gitstow/cli/helpers.py +113 -0
- gitstow-0.1.0/src/gitstow/cli/list_cmd.py +213 -0
- gitstow-0.1.0/src/gitstow/cli/main.py +129 -0
- gitstow-0.1.0/src/gitstow/cli/manage.py +283 -0
- gitstow-0.1.0/src/gitstow/cli/migrate.py +142 -0
- gitstow-0.1.0/src/gitstow/cli/onboard.py +234 -0
- gitstow-0.1.0/src/gitstow/cli/open_cmd.py +144 -0
- gitstow-0.1.0/src/gitstow/cli/pull.py +265 -0
- gitstow-0.1.0/src/gitstow/cli/remove.py +88 -0
- gitstow-0.1.0/src/gitstow/cli/search.py +199 -0
- gitstow-0.1.0/src/gitstow/cli/setup_ai.py +247 -0
- gitstow-0.1.0/src/gitstow/cli/shell.py +317 -0
- gitstow-0.1.0/src/gitstow/cli/skill_cmd.py +63 -0
- gitstow-0.1.0/src/gitstow/cli/stats.py +126 -0
- gitstow-0.1.0/src/gitstow/cli/status.py +213 -0
- gitstow-0.1.0/src/gitstow/cli/tui.py +27 -0
- gitstow-0.1.0/src/gitstow/cli/workspace_cmd.py +202 -0
- gitstow-0.1.0/src/gitstow/core/__init__.py +1 -0
- gitstow-0.1.0/src/gitstow/core/config.py +130 -0
- gitstow-0.1.0/src/gitstow/core/discovery.py +116 -0
- gitstow-0.1.0/src/gitstow/core/git.py +261 -0
- gitstow-0.1.0/src/gitstow/core/parallel.py +85 -0
- gitstow-0.1.0/src/gitstow/core/paths.py +51 -0
- gitstow-0.1.0/src/gitstow/core/repo.py +300 -0
- gitstow-0.1.0/src/gitstow/core/url_parser.py +159 -0
- gitstow-0.1.0/src/gitstow/mcp/__init__.py +1 -0
- gitstow-0.1.0/src/gitstow/mcp/server.py +704 -0
- gitstow-0.1.0/src/gitstow/skill/SKILL.md +210 -0
- gitstow-0.1.0/src/gitstow/tui/__init__.py +1 -0
- gitstow-0.1.0/src/gitstow/tui/app.py +384 -0
- gitstow-0.1.0/tests/__init__.py +1 -0
- gitstow-0.1.0/tests/conftest.py +58 -0
- gitstow-0.1.0/tests/test_cli.py +62 -0
- gitstow-0.1.0/tests/test_config.py +129 -0
- gitstow-0.1.0/tests/test_git.py +201 -0
- gitstow-0.1.0/tests/test_repo.py +163 -0
- 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
|
gitstow-0.1.0/.gitignore
ADDED
|
@@ -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/
|
gitstow-0.1.0/BACKLOG.md
ADDED
|
@@ -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
|
gitstow-0.1.0/CLAUDE.md
ADDED
|
@@ -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.
|