wip-cli 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.
- wip_cli-0.1.0/.github/ISSUE_TEMPLATE/bug_report.md +35 -0
- wip_cli-0.1.0/.github/ISSUE_TEMPLATE/feature_request.md +23 -0
- wip_cli-0.1.0/.github/pull_request_template.md +19 -0
- wip_cli-0.1.0/.gitignore +35 -0
- wip_cli-0.1.0/CHANGELOG.md +18 -0
- wip_cli-0.1.0/CODE_OF_CONDUCT.md +49 -0
- wip_cli-0.1.0/CONTRIBUTING.md +61 -0
- wip_cli-0.1.0/LICENSE +21 -0
- wip_cli-0.1.0/LLM_CONTEXT.md +74 -0
- wip_cli-0.1.0/PKG-INFO +258 -0
- wip_cli-0.1.0/README.md +227 -0
- wip_cli-0.1.0/SECURITY.md +40 -0
- wip_cli-0.1.0/docs/CONTEXT.md +635 -0
- wip_cli-0.1.0/pyproject.toml +45 -0
- wip_cli-0.1.0/src/wip/__init__.py +3 -0
- wip_cli-0.1.0/src/wip/cli.py +323 -0
- wip_cli-0.1.0/src/wip/config.py +136 -0
- wip_cli-0.1.0/src/wip/discovery.py +59 -0
- wip_cli-0.1.0/src/wip/display.py +245 -0
- wip_cli-0.1.0/src/wip/llm/__init__.py +8 -0
- wip_cli-0.1.0/src/wip/llm/anthropic.py +77 -0
- wip_cli-0.1.0/src/wip/llm/base.py +86 -0
- wip_cli-0.1.0/src/wip/llm/gemini.py +83 -0
- wip_cli-0.1.0/src/wip/llm/openai.py +84 -0
- wip_cli-0.1.0/src/wip/llm/prompts.py +183 -0
- wip_cli-0.1.0/src/wip/llm/registry.py +65 -0
- wip_cli-0.1.0/src/wip/scanner.py +433 -0
- wip_cli-0.1.0/src/wip/worklist.py +100 -0
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: Bug Report
|
|
3
|
+
about: Report a bug to help us improve wip
|
|
4
|
+
title: "[Bug] "
|
|
5
|
+
labels: bug
|
|
6
|
+
assignees: ""
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
## Description
|
|
10
|
+
|
|
11
|
+
A clear and concise description of the bug.
|
|
12
|
+
|
|
13
|
+
## Steps to Reproduce
|
|
14
|
+
|
|
15
|
+
1. Run `...`
|
|
16
|
+
2. See error
|
|
17
|
+
|
|
18
|
+
## Expected Behavior
|
|
19
|
+
|
|
20
|
+
What you expected to happen.
|
|
21
|
+
|
|
22
|
+
## Actual Behavior
|
|
23
|
+
|
|
24
|
+
What actually happened. Include any error messages or output.
|
|
25
|
+
|
|
26
|
+
## Environment
|
|
27
|
+
|
|
28
|
+
- **OS:** (e.g., macOS 15.2, Ubuntu 24.04)
|
|
29
|
+
- **Python version:** (e.g., 3.12.1)
|
|
30
|
+
- **wip version:** (output of `wip version`)
|
|
31
|
+
- **Installation method:** (pip install -e ., etc.)
|
|
32
|
+
|
|
33
|
+
## Additional Context
|
|
34
|
+
|
|
35
|
+
Any other context, screenshots, or log output.
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: Feature Request
|
|
3
|
+
about: Suggest a new feature or improvement for wip
|
|
4
|
+
title: "[Feature] "
|
|
5
|
+
labels: enhancement
|
|
6
|
+
assignees: ""
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
## Problem Description
|
|
10
|
+
|
|
11
|
+
A clear description of the problem or limitation you're experiencing.
|
|
12
|
+
|
|
13
|
+
## Proposed Solution
|
|
14
|
+
|
|
15
|
+
Describe the solution you'd like. How should it work?
|
|
16
|
+
|
|
17
|
+
## Alternatives Considered
|
|
18
|
+
|
|
19
|
+
Describe any alternative solutions or features you've considered.
|
|
20
|
+
|
|
21
|
+
## Additional Context
|
|
22
|
+
|
|
23
|
+
Any other context, mockups, or examples that help explain the request.
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
## Summary
|
|
2
|
+
|
|
3
|
+
Brief description of what this PR does and why.
|
|
4
|
+
|
|
5
|
+
## Changes
|
|
6
|
+
|
|
7
|
+
-
|
|
8
|
+
|
|
9
|
+
## Test Plan
|
|
10
|
+
|
|
11
|
+
- [ ] Tested manually with `wip` / `wip --verbose` / `wip --json`
|
|
12
|
+
- [ ] Verified no regressions in existing commands
|
|
13
|
+
|
|
14
|
+
## Checklist
|
|
15
|
+
|
|
16
|
+
- [ ] All new `.py` files include `from __future__ import annotations`
|
|
17
|
+
- [ ] No new dependencies added without justification
|
|
18
|
+
- [ ] Errors are handled gracefully (no unhandled exceptions)
|
|
19
|
+
- [ ] Docs updated if applicable (`README.md`, `docs/CONTEXT.md`)
|
wip_cli-0.1.0/.gitignore
ADDED
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
# Python
|
|
2
|
+
__pycache__/
|
|
3
|
+
*.py[cod]
|
|
4
|
+
*$py.class
|
|
5
|
+
*.egg-info/
|
|
6
|
+
dist/
|
|
7
|
+
build/
|
|
8
|
+
*.egg
|
|
9
|
+
|
|
10
|
+
# Virtual environment
|
|
11
|
+
.venv/
|
|
12
|
+
venv/
|
|
13
|
+
env/
|
|
14
|
+
|
|
15
|
+
# IDE
|
|
16
|
+
.vscode/
|
|
17
|
+
.idea/
|
|
18
|
+
*.swp
|
|
19
|
+
*.swo
|
|
20
|
+
|
|
21
|
+
# OS
|
|
22
|
+
.DS_Store
|
|
23
|
+
Thumbs.db
|
|
24
|
+
|
|
25
|
+
# Project
|
|
26
|
+
*.db
|
|
27
|
+
.wip/
|
|
28
|
+
|
|
29
|
+
# Testing / linting
|
|
30
|
+
.pytest_cache/
|
|
31
|
+
.mypy_cache/
|
|
32
|
+
.ruff_cache/
|
|
33
|
+
.coverage
|
|
34
|
+
.coverage.*
|
|
35
|
+
htmlcov/
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
# Changelog
|
|
2
|
+
|
|
3
|
+
All notable changes to this project will be documented in this file.
|
|
4
|
+
|
|
5
|
+
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/),
|
|
6
|
+
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
|
|
7
|
+
|
|
8
|
+
## [0.1.0] - 2025-02-12
|
|
9
|
+
|
|
10
|
+
### Added
|
|
11
|
+
|
|
12
|
+
- **Foundation & Scanner (Phase 0+1):** Config management (TOML read/write, interactive init), repo discovery, git status scanning (branch, dirty, stash, ahead/behind, recent branches/commits), Rich terminal display, CLI wiring (`wip`, `wip scan`, `wip config`, `--json`, `--verbose`)
|
|
13
|
+
- **Interactive Worklist (Phase 2):** `wip add/done/list` commands with repo linking, persistent JSON state, worklist shown in briefing and under linked repos
|
|
14
|
+
- **LLM Integration (Phase 4):** Provider abstraction (Anthropic implemented, OpenAI/Gemini stubs), `wip ai briefing`, `wip ai standup`, `wip ai ask` with streaming, prompt assembly from scan data, config-driven provider/model selection
|
|
15
|
+
- **Passive Agent Detection (Phase 5):** Detect coding agent activity from git signals (author names, branch patterns), agent sessions in terminal/JSON/AI output, configurable patterns with sensible defaults, status tracking (active/recent/stale)
|
|
16
|
+
- **Enriched File-Level Context (Phase 6):** Changed files with diff stats, stash descriptions, commit bodies and per-commit file lists in verbose output and LLM prompts
|
|
17
|
+
|
|
18
|
+
[0.1.0]: https://github.com/drmnaik/wip/releases/tag/v0.1.0
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
# Contributor Covenant Code of Conduct
|
|
2
|
+
|
|
3
|
+
## Our Pledge
|
|
4
|
+
|
|
5
|
+
We as members, contributors, and leaders pledge to make participation in our
|
|
6
|
+
community a friendly, safe, and welcoming experience for everyone.
|
|
7
|
+
|
|
8
|
+
## Our Standards
|
|
9
|
+
|
|
10
|
+
Examples of behavior that contributes to a positive environment:
|
|
11
|
+
|
|
12
|
+
- Being respectful and considerate
|
|
13
|
+
- Giving and gracefully accepting constructive feedback
|
|
14
|
+
- Focusing on what is best for the community
|
|
15
|
+
- Showing empathy towards other community members
|
|
16
|
+
|
|
17
|
+
Examples of unacceptable behavior:
|
|
18
|
+
|
|
19
|
+
- Trolling, insulting, or derogatory comments
|
|
20
|
+
- Personal or political attacks
|
|
21
|
+
- Public or private forms of intimidation
|
|
22
|
+
- Publishing others' private information without explicit permission
|
|
23
|
+
- Other conduct which could reasonably be considered inappropriate in a professional setting
|
|
24
|
+
|
|
25
|
+
## Enforcement Responsibilities
|
|
26
|
+
|
|
27
|
+
Project maintainers are responsible for clarifying and enforcing standards of
|
|
28
|
+
acceptable behavior and will take appropriate and fair corrective action in
|
|
29
|
+
response to any behavior that they deem inappropriate.
|
|
30
|
+
|
|
31
|
+
## Scope
|
|
32
|
+
|
|
33
|
+
This Code of Conduct applies within all project spaces, including issues,
|
|
34
|
+
pull requests, and discussions, as well as public spaces when an individual
|
|
35
|
+
is representing the project.
|
|
36
|
+
|
|
37
|
+
## Enforcement
|
|
38
|
+
|
|
39
|
+
Instances of unacceptable behavior may be reported to the project maintainer:
|
|
40
|
+
|
|
41
|
+
- **LinkedIn:** [Mahesh Naik](https://www.linkedin.com/in/kamaheshnaik/)
|
|
42
|
+
|
|
43
|
+
All reports will be reviewed and investigated promptly and fairly.
|
|
44
|
+
|
|
45
|
+
## Attribution
|
|
46
|
+
|
|
47
|
+
This Code of Conduct is adapted from the [Contributor Covenant](https://www.contributor-covenant.org/),
|
|
48
|
+
version 2.1, available at
|
|
49
|
+
[https://www.contributor-covenant.org/version/2/1/code_of_conduct.html](https://www.contributor-covenant.org/version/2/1/code_of_conduct.html).
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
# Contributing to wip
|
|
2
|
+
|
|
3
|
+
Thanks for your interest in contributing to **wip**! This guide will help you get started.
|
|
4
|
+
|
|
5
|
+
## Prerequisites
|
|
6
|
+
|
|
7
|
+
- Python 3.9+
|
|
8
|
+
- git
|
|
9
|
+
|
|
10
|
+
## Dev Setup
|
|
11
|
+
|
|
12
|
+
```bash
|
|
13
|
+
# Fork and clone
|
|
14
|
+
git clone git@github.com:<your-username>/wip.git
|
|
15
|
+
cd wip
|
|
16
|
+
|
|
17
|
+
# Create virtual environment
|
|
18
|
+
python3 -m venv .venv
|
|
19
|
+
source .venv/bin/activate
|
|
20
|
+
|
|
21
|
+
# Install in editable mode (includes all dependencies)
|
|
22
|
+
pip install -e .
|
|
23
|
+
```
|
|
24
|
+
|
|
25
|
+
## Code Conventions
|
|
26
|
+
|
|
27
|
+
Please read `docs/CONTEXT.md` — specifically **Section 5 (Code conventions)** and **Section 10 (Guidelines for contributors)** — for the full picture. Key rules:
|
|
28
|
+
|
|
29
|
+
- Every `.py` file **must** start with `from __future__ import annotations`
|
|
30
|
+
- Use **dataclasses** for data models, plain functions for logic
|
|
31
|
+
- No new dependencies without clear justification — prefer stdlib
|
|
32
|
+
- Handle errors gracefully — never crash the whole briefing because one repo is broken
|
|
33
|
+
- Follow existing import order: stdlib, third-party, local (`wip.*`)
|
|
34
|
+
- Keep CLI commands thin — delegate logic to modules
|
|
35
|
+
|
|
36
|
+
## Submitting a Pull Request
|
|
37
|
+
|
|
38
|
+
1. **Fork** the repo and create a feature branch from `main`:
|
|
39
|
+
```bash
|
|
40
|
+
git checkout -b feat/your-feature main
|
|
41
|
+
```
|
|
42
|
+
2. Make your changes following the code conventions above.
|
|
43
|
+
3. **Commit** with a short imperative subject line (e.g., "Add stale branch detection"). Body explains _why_, not _what_.
|
|
44
|
+
4. **Push** to your fork:
|
|
45
|
+
```bash
|
|
46
|
+
git push origin feat/your-feature
|
|
47
|
+
```
|
|
48
|
+
5. Open a **Pull Request** against `main` on GitHub.
|
|
49
|
+
|
|
50
|
+
## Good First Issues
|
|
51
|
+
|
|
52
|
+
Looking for a place to start? These are great entry points:
|
|
53
|
+
|
|
54
|
+
- **Implement the OpenAI provider** — `src/wip/llm/openai.py` is scaffolded as a stub
|
|
55
|
+
- **Implement the Gemini provider** — `src/wip/llm/gemini.py` is scaffolded as a stub
|
|
56
|
+
- **Add test coverage** — there are no tests yet; adding tests for any module is valuable
|
|
57
|
+
|
|
58
|
+
## Contact
|
|
59
|
+
|
|
60
|
+
- **LinkedIn:** [Mahesh Naik](https://www.linkedin.com/in/kamaheshnaik/)
|
|
61
|
+
- **Issues:** [GitHub Issues](https://github.com/drmnaik/wip/issues)
|
wip_cli-0.1.0/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2025 Mahesh Naik
|
|
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.
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
# LLM_CONTEXT.md — Context for coding agents and bots
|
|
2
|
+
|
|
3
|
+
> This file provides the context a coding agent or bot needs to understand and contribute to the `wip` project. For full architecture details, data models, and roadmap, see `docs/CONTEXT.md`.
|
|
4
|
+
|
|
5
|
+
## Quick reference
|
|
6
|
+
|
|
7
|
+
- **What:** CLI developer briefing tool — scans git repos, shows status, tracks work-in-progress items
|
|
8
|
+
- **Stack:** Python 3.9+, Typer (CLI), GitPython (git), Rich (display), TOML (config), JSON (worklist), Anthropic/OpenAI/Gemini SDK (LLM)
|
|
9
|
+
- **Build:** Hatchling, src-layout (`src/wip/`), entry point `wip = "wip.cli:app"`
|
|
10
|
+
- **Config:** `~/.wip/config.toml`
|
|
11
|
+
- **Worklist:** `~/.wip/worklist.json`
|
|
12
|
+
|
|
13
|
+
## Rules
|
|
14
|
+
|
|
15
|
+
1. Every `.py` file MUST start with `from __future__ import annotations`
|
|
16
|
+
2. Python 3.9 minimum — no match/case, no `TypeAlias`, no 3.10+ features
|
|
17
|
+
3. Use dataclasses for data models, plain functions for logic — no service classes
|
|
18
|
+
4. Prefix private helpers with `_` — public API is everything without underscore
|
|
19
|
+
5. Wrap all GitPython calls in try/except — never crash because one repo is broken
|
|
20
|
+
6. No new dependencies without clear justification — prefer stdlib
|
|
21
|
+
7. CLI commands go in `cli.py`, keep them thin, delegate to modules
|
|
22
|
+
8. Errors use `raise typer.Exit(1)`, user messages use `typer.echo()`
|
|
23
|
+
|
|
24
|
+
## Module map
|
|
25
|
+
|
|
26
|
+
| Module | Does what | Key exports |
|
|
27
|
+
|------------------|--------------------------------------|----------------------------------------------|
|
|
28
|
+
| `cli.py` | Commands, flags, orchestration | `app` |
|
|
29
|
+
| `config.py` | TOML config read/write | `WipConfig`, `AgentsConfig`, `load_config()`, `save_config()`|
|
|
30
|
+
| `discovery.py` | Find git repos on disk | `discover_repos()` |
|
|
31
|
+
| `scanner.py` | Collect git status + agent detection | `RepoStatus`, `AgentSession`, `FileChange`, `scan_repo()`, `scan_repos()` |
|
|
32
|
+
| `display.py` | Rich terminal output | `render_briefing()`, `render_json()`, `render_worklist()` |
|
|
33
|
+
| `worklist.py` | WIP task tracker, JSON persist | `WorkItem`, `add_item()`, `complete_item()`, `get_items()`, `detect_repo()` |
|
|
34
|
+
| `llm/base.py` | ABC, response type, errors | `LLMProvider`, `LLMResponse`, `LLMError` |
|
|
35
|
+
| `llm/registry.py`| Provider lookup, key resolution | `get_provider()`, `list_providers()` |
|
|
36
|
+
| `llm/prompts.py` | Prompt assembly from scan data | `build_briefing_prompt()`, `build_standup_prompt()`, `build_query_prompt()` |
|
|
37
|
+
| `llm/anthropic.py`| Anthropic Claude (implemented) | `AnthropicProvider` |
|
|
38
|
+
| `llm/openai.py` | OpenAI GPT (implemented) | `OpenAIProvider` |
|
|
39
|
+
| `llm/gemini.py` | Google Gemini (implemented) | `GeminiProvider` |
|
|
40
|
+
|
|
41
|
+
## How to extend
|
|
42
|
+
|
|
43
|
+
- **New scan data:** Add field to `RepoStatus` → populate in `scan_repo()` → render in `_render_repo()`
|
|
44
|
+
- **New config field:** Add to `WipConfig` with default → update `load_config()`/`save_config()` → optionally add prompt in `config_init()`
|
|
45
|
+
- **New CLI command:** Add `@app.command()` in `cli.py` → delegate to relevant module
|
|
46
|
+
|
|
47
|
+
### Worklist
|
|
48
|
+
|
|
49
|
+
- **New worklist field:** Add to `WorkItem` dataclass → update `add_item()` → render in `_render_work_item()`
|
|
50
|
+
- **New worklist command:** Add `@app.command()` in `cli.py` → delegate to `worklist.py`
|
|
51
|
+
|
|
52
|
+
### LLM
|
|
53
|
+
|
|
54
|
+
- **New provider:** Create `llm/<name>.py` extending `LLMProvider` → implement `complete()` + `stream()` → register in `llm/registry.py` PROVIDERS dict. Follow the pattern in `anthropic.py`, `openai.py`, or `gemini.py`: lazy `_get_client()`, error mapping to `LLMAuthError`/`LLMRateLimitError`/`LLMError`, import guard for the SDK package.
|
|
55
|
+
- **New AI command:** Add `@ai_app.command()` in `cli.py` → use `_get_llm_provider()` + `_scan_all()` + `_llm_call()`
|
|
56
|
+
- **New prompt type:** Add `build_*_prompt()` to `llm/prompts.py` returning `(system, user)` tuple
|
|
57
|
+
|
|
58
|
+
## Commands
|
|
59
|
+
|
|
60
|
+
```bash
|
|
61
|
+
pip install -e . # Install in dev mode (includes all deps)
|
|
62
|
+
wip # Run briefing
|
|
63
|
+
wip --json # JSON output
|
|
64
|
+
wip --verbose # Full detail
|
|
65
|
+
wip config init # Interactive setup
|
|
66
|
+
wip config show # Show config
|
|
67
|
+
wip add "description" # Add WIP item (auto-links to current repo)
|
|
68
|
+
wip done <id> # Mark item as done
|
|
69
|
+
wip list # Show open items
|
|
70
|
+
wip list --all # Include completed items
|
|
71
|
+
wip ai briefing # AI narrative briefing
|
|
72
|
+
wip ai standup # Generate standup update
|
|
73
|
+
wip ai ask "question" # Ask about your work
|
|
74
|
+
```
|
wip_cli-0.1.0/PKG-INFO
ADDED
|
@@ -0,0 +1,258 @@
|
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
|
+
Name: wip-cli
|
|
3
|
+
Version: 0.1.0
|
|
4
|
+
Summary: Where did I leave off? A developer briefing tool.
|
|
5
|
+
Project-URL: Homepage, https://github.com/drmnaik/wip
|
|
6
|
+
Project-URL: Repository, https://github.com/drmnaik/wip
|
|
7
|
+
Project-URL: Issues, https://github.com/drmnaik/wip/issues
|
|
8
|
+
Author: Mahesh Naik
|
|
9
|
+
License: MIT
|
|
10
|
+
License-File: LICENSE
|
|
11
|
+
Keywords: briefing,cli,developer-tools,git,llm
|
|
12
|
+
Classifier: Development Status :: 3 - Alpha
|
|
13
|
+
Classifier: Environment :: Console
|
|
14
|
+
Classifier: Intended Audience :: Developers
|
|
15
|
+
Classifier: License :: OSI Approved :: MIT License
|
|
16
|
+
Classifier: Programming Language :: Python :: 3
|
|
17
|
+
Classifier: Programming Language :: Python :: 3.9
|
|
18
|
+
Classifier: Programming Language :: Python :: 3.10
|
|
19
|
+
Classifier: Programming Language :: Python :: 3.11
|
|
20
|
+
Classifier: Programming Language :: Python :: 3.12
|
|
21
|
+
Classifier: Topic :: Software Development :: Version Control :: Git
|
|
22
|
+
Requires-Python: >=3.9
|
|
23
|
+
Requires-Dist: anthropic>=0.79.0
|
|
24
|
+
Requires-Dist: gitpython>=3.1.0
|
|
25
|
+
Requires-Dist: google-genai>=1.0.0
|
|
26
|
+
Requires-Dist: openai>=1.0.0
|
|
27
|
+
Requires-Dist: rich>=13.0.0
|
|
28
|
+
Requires-Dist: tomli>=1.0.0; python_version < '3.11'
|
|
29
|
+
Requires-Dist: typer>=0.9.0
|
|
30
|
+
Description-Content-Type: text/markdown
|
|
31
|
+
|
|
32
|
+
# wip — Where did I leave off?
|
|
33
|
+
|
|
34
|
+
A developer briefing tool. **wip** scans your git repositories and shows you what you were working on, what's dirty, what's stashed, and what needs your attention. With optional AI features, it turns raw git data into narrative briefings, standup drafts, and answers to natural language questions about your work.
|
|
35
|
+
|
|
36
|
+
## Features
|
|
37
|
+
|
|
38
|
+
- 🔍 **Auto-discover** git repos in configured directories
|
|
39
|
+
- 📊 **Status overview** — dirty files, stashes, ahead/behind tracking
|
|
40
|
+
- 🌿 **Recent branches** — see branches you've touched recently
|
|
41
|
+
- 💬 **Recent commits** — your commits from the last 24 hours
|
|
42
|
+
- 📝 **Work-in-progress tracker** — jot down tasks, link them to repos, see them in your briefing
|
|
43
|
+
- 🎨 **Rich terminal output** — color-coded status with icons
|
|
44
|
+
- 📦 **Multiple output modes** — human-friendly or JSON for scripting
|
|
45
|
+
- 🕵️ **Agent detection** — passively detect coding agent activity (Claude, Copilot, Cursor, Devin) from git signals
|
|
46
|
+
- 📂 **Enriched file-level context** — changed files with diff stats, stash descriptions, commit bodies and file lists in LLM prompts and verbose output
|
|
47
|
+
- 🤖 **AI-powered briefings** — narrative summaries, standup drafts, natural language queries
|
|
48
|
+
- 🧭 **Context-aware git help** — ask how to untangle branches, recover stashes, or fix mistakes — the AI sees your actual repo state
|
|
49
|
+
- 🔌 **Provider abstraction** — Anthropic and OpenAI implemented, Gemini — all implemented
|
|
50
|
+
|
|
51
|
+
## Installation
|
|
52
|
+
|
|
53
|
+
```bash
|
|
54
|
+
# Clone the repository
|
|
55
|
+
git clone git@github.com:drmnaik/wip.git
|
|
56
|
+
cd wip
|
|
57
|
+
|
|
58
|
+
# Install in editable mode (includes all dependencies)
|
|
59
|
+
pip install -e .
|
|
60
|
+
```
|
|
61
|
+
|
|
62
|
+
**Requirements:** Python 3.9+
|
|
63
|
+
|
|
64
|
+
## Quick Start
|
|
65
|
+
|
|
66
|
+
```bash
|
|
67
|
+
# First-time setup (interactive)
|
|
68
|
+
wip config init
|
|
69
|
+
|
|
70
|
+
# Show your briefing
|
|
71
|
+
wip
|
|
72
|
+
|
|
73
|
+
# Verbose mode with full details
|
|
74
|
+
wip --verbose
|
|
75
|
+
|
|
76
|
+
# JSON output for scripting
|
|
77
|
+
wip --json
|
|
78
|
+
```
|
|
79
|
+
|
|
80
|
+
## Configuration
|
|
81
|
+
|
|
82
|
+
Config is stored at `~/.wip/config.toml`:
|
|
83
|
+
|
|
84
|
+
```toml
|
|
85
|
+
directories = ["/Users/you/projects", "/Users/you/work"]
|
|
86
|
+
author = "Your Name"
|
|
87
|
+
scan_depth = 3
|
|
88
|
+
recent_days = 14
|
|
89
|
+
|
|
90
|
+
[llm]
|
|
91
|
+
provider = "anthropic"
|
|
92
|
+
model = "claude-haiku-4-5-20251001"
|
|
93
|
+
api_key_env = "ANTHROPIC_API_KEY"
|
|
94
|
+
|
|
95
|
+
# Optional: customize agent detection patterns
|
|
96
|
+
[agents]
|
|
97
|
+
authors = ["claude", "copilot", "cursor", "devin", "codex", "github-actions", "bot"]
|
|
98
|
+
branch_patterns = ["agent/", "claude/", "copilot/", "devin/", "cursor/"]
|
|
99
|
+
```
|
|
100
|
+
|
|
101
|
+
- **directories** — which directories to scan for git repos
|
|
102
|
+
- **author** — your git author name (filters commits to show only yours)
|
|
103
|
+
- **scan_depth** — how deep to search for repos (default: 3 levels)
|
|
104
|
+
- **recent_days** — how far back to look for recent branches (default: 14 days)
|
|
105
|
+
- **[llm]** — optional LLM configuration for AI features
|
|
106
|
+
- **provider** — `anthropic`, `openai`, or `gemini`
|
|
107
|
+
- **model** — model ID (leave empty for provider default)
|
|
108
|
+
- **api_key_env** — environment variable name holding your API key
|
|
109
|
+
- **[agents]** — optional overrides for agent detection (works out of the box with defaults)
|
|
110
|
+
- **authors** — substrings matched case-insensitively against commit author names
|
|
111
|
+
- **branch_patterns** — branch name prefixes that indicate agent activity
|
|
112
|
+
|
|
113
|
+
## Commands
|
|
114
|
+
|
|
115
|
+
### Core
|
|
116
|
+
|
|
117
|
+
```bash
|
|
118
|
+
wip # Show briefing (default command)
|
|
119
|
+
wip scan # Alias for wip
|
|
120
|
+
wip --json # Output as JSON
|
|
121
|
+
wip --verbose # Show full details
|
|
122
|
+
wip config init # Interactive setup
|
|
123
|
+
wip config show # Display current config
|
|
124
|
+
wip version # Show version
|
|
125
|
+
```
|
|
126
|
+
|
|
127
|
+
### Work-in-progress tracker
|
|
128
|
+
|
|
129
|
+
```bash
|
|
130
|
+
wip add "fix auth bug" # Add item (auto-links to current repo)
|
|
131
|
+
wip add "read docs" --repo /path/to/repo # Add item linked to specific repo
|
|
132
|
+
wip done 1 # Mark item #1 as done
|
|
133
|
+
wip list # Show open items
|
|
134
|
+
wip list --all # Show all items including completed
|
|
135
|
+
```
|
|
136
|
+
|
|
137
|
+
### AI-powered commands
|
|
138
|
+
|
|
139
|
+
Requires an LLM provider configured in `~/.wip/config.toml` and the corresponding API key set as an environment variable.
|
|
140
|
+
|
|
141
|
+
```bash
|
|
142
|
+
wip ai briefing # Narrative briefing
|
|
143
|
+
wip ai standup # Generate a standup update from git activity
|
|
144
|
+
wip ai ask "what was I working on yesterday?"
|
|
145
|
+
wip ai ask "anything I forgot to push?"
|
|
146
|
+
wip ai ask "summarize my week"
|
|
147
|
+
|
|
148
|
+
# Context-aware git help — the AI sees your actual branches, dirty files, and stashes
|
|
149
|
+
wip ai ask "I have diverged branches, how do I cleanly get back to main?"
|
|
150
|
+
wip ai ask "how do I recover what I stashed last week?"
|
|
151
|
+
wip ai ask "what git commands do I need to untangle this mess?"
|
|
152
|
+
```
|
|
153
|
+
|
|
154
|
+
## Example Output
|
|
155
|
+
|
|
156
|
+
### Standard briefing (`wip`)
|
|
157
|
+
|
|
158
|
+
```
|
|
159
|
+
wip — 3 repos scanned
|
|
160
|
+
|
|
161
|
+
work-in-progress — 2 items
|
|
162
|
+
|
|
163
|
+
#1 fix auth token refresh (auth-service) — 2h ago
|
|
164
|
+
#3 update API docs (api-gateway) — 1d ago
|
|
165
|
+
|
|
166
|
+
auth-service (fix/token-refresh) ⚠
|
|
167
|
+
3 dirty · 1 stash · last commit 14h ago
|
|
168
|
+
2 ahead, 0 behind origin
|
|
169
|
+
agents:
|
|
170
|
+
claude on agent/add-tests — 12 commits, 14 files (23m ago) ● active
|
|
171
|
+
copilot on copilot/logout — 4 commits, 3 files (7h ago) ○ stale
|
|
172
|
+
wip:
|
|
173
|
+
#1 fix auth token refresh (2h ago)
|
|
174
|
+
recent: main (3d), feat/oauth (5d)
|
|
175
|
+
commits today:
|
|
176
|
+
a1b2c3 fix retry logic for token refresh (2h ago)
|
|
177
|
+
|
|
178
|
+
frontend (main) ✓
|
|
179
|
+
clean · 2 stashes
|
|
180
|
+
0 ahead, 0 behind origin
|
|
181
|
+
|
|
182
|
+
api-gateway (main) ↓
|
|
183
|
+
clean · 3 behind origin
|
|
184
|
+
wip:
|
|
185
|
+
#3 update API docs (1d ago)
|
|
186
|
+
```
|
|
187
|
+
|
|
188
|
+
### AI briefing (`wip ai briefing`)
|
|
189
|
+
|
|
190
|
+
```
|
|
191
|
+
## Briefing
|
|
192
|
+
|
|
193
|
+
You were deep in a token refresh bug in auth-service yesterday evening.
|
|
194
|
+
You changed the retry logic in 3 files but stashed something — probably
|
|
195
|
+
an alternative approach. Your note says the issue is around line 340.
|
|
196
|
+
You might want to start by comparing your stash against your current changes.
|
|
197
|
+
|
|
198
|
+
The frontend is clean but you left a TODO about form validation on Tuesday.
|
|
199
|
+
api-gateway just needs a pull — 3 commits behind, low priority.
|
|
200
|
+
|
|
201
|
+
Suggested focus: finish auth-service first (uncommitted work at risk),
|
|
202
|
+
then circle back to the frontend TODO.
|
|
203
|
+
```
|
|
204
|
+
|
|
205
|
+
### Status Icons
|
|
206
|
+
|
|
207
|
+
- ✓ — Clean repo, up to date
|
|
208
|
+
- ⚠ — Dirty files (modified, staged, or untracked)
|
|
209
|
+
- ↓ — Behind remote (needs pull)
|
|
210
|
+
|
|
211
|
+
## Development
|
|
212
|
+
|
|
213
|
+
```bash
|
|
214
|
+
# Install dependencies
|
|
215
|
+
pip install -e .
|
|
216
|
+
|
|
217
|
+
# Run from source
|
|
218
|
+
python -m wip.cli
|
|
219
|
+
```
|
|
220
|
+
|
|
221
|
+
## Roadmap
|
|
222
|
+
|
|
223
|
+
**Phase 0+1: Foundation + Scanner** ✅
|
|
224
|
+
- Config management, repo discovery, git status scanning, terminal output
|
|
225
|
+
|
|
226
|
+
**Phase 2: Interactive Worklist** ✅
|
|
227
|
+
- `wip add/done/list` commands with repo linking and persistent state
|
|
228
|
+
|
|
229
|
+
**Phase 4: LLM Integration** ✅
|
|
230
|
+
- Provider abstraction (Anthropic, OpenAI, and Gemini all implemented)
|
|
231
|
+
- `wip ai briefing`, `wip ai standup`, `wip ai ask` with streaming
|
|
232
|
+
- Prompt assembly from scan data, config-driven provider/model selection
|
|
233
|
+
|
|
234
|
+
**Phase 5: Passive Agent Detection** ✅
|
|
235
|
+
- Detect coding agent activity from git signals (author names, branch patterns)
|
|
236
|
+
- Agent sessions surface in `wip`, `wip --json`, and all AI commands automatically
|
|
237
|
+
- Configurable author/branch patterns with sensible defaults (zero config required)
|
|
238
|
+
- Status tracking: active (<1h), recent (<24h), stale (>24h)
|
|
239
|
+
|
|
240
|
+
**Phase 6: Enriched File-Level Context** ✅
|
|
241
|
+
- Changed files with diff stats (insertions/deletions), color-coded by stage in verbose output
|
|
242
|
+
- Stash descriptions surfaced in verbose display and LLM prompts
|
|
243
|
+
- Commit bodies (capped at 3 lines) and per-commit file lists (capped at 10 paths) in LLM context
|
|
244
|
+
|
|
245
|
+
Ideas and contributions welcome — see `docs/CONTEXT.md` for architecture details.
|
|
246
|
+
|
|
247
|
+
## Contact
|
|
248
|
+
|
|
249
|
+
- **LinkedIn:** [Mahesh Naik](https://www.linkedin.com/in/kamaheshnaik/)
|
|
250
|
+
- **Issues:** [GitHub Issues](https://github.com/drmnaik/wip/issues)
|
|
251
|
+
|
|
252
|
+
## License
|
|
253
|
+
|
|
254
|
+
MIT
|
|
255
|
+
|
|
256
|
+
## Author
|
|
257
|
+
|
|
258
|
+
Built by Mahesh Naik with Claude
|