phabfive 0.7.0__tar.gz → 0.8.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.
- {phabfive-0.7.0 → phabfive-0.8.0}/.github/workflows/release.yml +9 -1
- {phabfive-0.7.0 → phabfive-0.8.0}/.github/workflows/tox.yml +3 -1
- phabfive-0.8.0/.pre-commit-config.yaml +101 -0
- {phabfive-0.7.0 → phabfive-0.8.0}/AGENTS.md +41 -9
- {phabfive-0.7.0 → phabfive-0.8.0}/CHANGELOG.md +58 -0
- {phabfive-0.7.0 → phabfive-0.8.0}/LICENSE +1 -12
- {phabfive-0.7.0 → phabfive-0.8.0}/PKG-INFO +39 -28
- {phabfive-0.7.0 → phabfive-0.8.0}/README.md +32 -24
- phabfive-0.8.0/phabfive/cli/__init__.py +217 -0
- phabfive-0.8.0/phabfive/cli/completers.py +150 -0
- phabfive-0.8.0/phabfive/cli/diffusion.py +194 -0
- phabfive-0.8.0/phabfive/cli/maniphest.py +472 -0
- phabfive-0.8.0/phabfive/cli/passphrase.py +44 -0
- phabfive-0.8.0/phabfive/cli/paste.py +78 -0
- phabfive-0.8.0/phabfive/cli/repl.py +26 -0
- phabfive-0.8.0/phabfive/cli/user.py +37 -0
- phabfive-0.8.0/phabfive/constants.py +103 -0
- {phabfive-0.7.0 → phabfive-0.8.0}/phabfive/core.py +131 -20
- {phabfive-0.7.0 → phabfive-0.8.0}/phabfive/diffusion/core.py +13 -3
- phabfive-0.8.0/phabfive/display.py +577 -0
- {phabfive-0.7.0 → phabfive-0.8.0}/phabfive/maniphest/core.py +190 -15
- {phabfive-0.7.0 → phabfive-0.8.0}/phabfive/maniphest/fetchers.py +87 -0
- {phabfive-0.7.0 → phabfive-0.8.0}/phabfive/maniphest/formatters.py +22 -0
- {phabfive-0.7.0 → phabfive-0.8.0}/phabfive/maniphest/resolvers.py +3 -1
- phabfive-0.8.0/phabfive/passphrase.py +137 -0
- phabfive-0.8.0/phabfive/passphrase_display.py +198 -0
- phabfive-0.8.0/phabfive/repl.py +44 -0
- {phabfive-0.7.0 → phabfive-0.8.0}/phabfive/setup.py +127 -97
- {phabfive-0.7.0 → phabfive-0.8.0}/phabfive/transitions/base.py +4 -4
- phabfive-0.8.0/pyproject.toml +60 -0
- phabfive-0.8.0/tests/test_arcconfig.py +171 -0
- {phabfive-0.7.0 → phabfive-0.8.0}/tests/test_arcrc.py +152 -4
- {phabfive-0.7.0 → phabfive-0.8.0}/tests/test_maniphest.py +124 -37
- {phabfive-0.7.0 → phabfive-0.8.0}/tests/test_phabfive.py +2 -2
- {phabfive-0.7.0 → phabfive-0.8.0}/tests/test_setup.py +187 -28
- phabfive-0.8.0/uv.lock +1182 -0
- phabfive-0.7.0/.pre-commit-config.yaml +0 -90
- phabfive-0.7.0/MANIFEST.in +0 -3
- phabfive-0.7.0/phabfive/cli.py +0 -1314
- phabfive-0.7.0/phabfive/constants.py +0 -56
- phabfive-0.7.0/phabfive/passphrase.py +0 -69
- phabfive-0.7.0/phabfive/repl.py +0 -29
- phabfive-0.7.0/pyproject.toml +0 -71
- phabfive-0.7.0/uv.lock +0 -1068
- {phabfive-0.7.0 → phabfive-0.8.0}/.editorconfig +0 -0
- {phabfive-0.7.0 → phabfive-0.8.0}/.flake8 +0 -0
- {phabfive-0.7.0 → phabfive-0.8.0}/.github/ISSUE_TEMPLATE/bug_report.md +0 -0
- {phabfive-0.7.0 → phabfive-0.8.0}/.github/ISSUE_TEMPLATE/documentation_change.md +0 -0
- {phabfive-0.7.0 → phabfive-0.8.0}/.github/ISSUE_TEMPLATE/feature_request.md +0 -0
- {phabfive-0.7.0 → phabfive-0.8.0}/.github/PULL_REQUEST_TEMPLATE.md +0 -0
- {phabfive-0.7.0 → phabfive-0.8.0}/.github/dependabot.yml +0 -0
- {phabfive-0.7.0 → phabfive-0.8.0}/.github/workflows/gitleaks.yml +0 -0
- {phabfive-0.7.0 → phabfive-0.8.0}/.gitignore +0 -0
- {phabfive-0.7.0 → phabfive-0.8.0}/.gitleaksignore +0 -0
- {phabfive-0.7.0 → phabfive-0.8.0}/.mailmap +0 -0
- {phabfive-0.7.0 → phabfive-0.8.0}/.readthedocs.yaml +0 -0
- {phabfive-0.7.0 → phabfive-0.8.0}/.travis.yml +0 -0
- {phabfive-0.7.0 → phabfive-0.8.0}/.vscode/settings.json +0 -0
- {phabfive-0.7.0 → phabfive-0.8.0}/.yamllint.yml +0 -0
- {phabfive-0.7.0 → phabfive-0.8.0}/CLAUDE.md +0 -0
- {phabfive-0.7.0 → phabfive-0.8.0}/Dockerfile +0 -0
- {phabfive-0.7.0 → phabfive-0.8.0}/Dockerfile.phorge +0 -0
- {phabfive-0.7.0 → phabfive-0.8.0}/Makefile +0 -0
- {phabfive-0.7.0 → phabfive-0.8.0}/compose.yml +0 -0
- {phabfive-0.7.0 → phabfive-0.8.0}/docs/create-templates.md +0 -0
- {phabfive-0.7.0 → phabfive-0.8.0}/docs/development.md +0 -0
- {phabfive-0.7.0 → phabfive-0.8.0}/docs/index.md +0 -0
- {phabfive-0.7.0 → phabfive-0.8.0}/docs/maniphest-cli.md +0 -0
- {phabfive-0.7.0 → phabfive-0.8.0}/docs/maniphest-show.png +0 -0
- {phabfive-0.7.0 → phabfive-0.8.0}/docs/phorge-setup.md +0 -0
- {phabfive-0.7.0 → phabfive-0.8.0}/docs/releasing.md +0 -0
- {phabfive-0.7.0 → phabfive-0.8.0}/docs/search-templates.md +0 -0
- {phabfive-0.7.0 → phabfive-0.8.0}/mkdocs.yml +0 -0
- {phabfive-0.7.0 → phabfive-0.8.0}/phabfive/__init__.py +0 -0
- {phabfive-0.7.0 → phabfive-0.8.0}/phabfive/diffusion/__init__.py +0 -0
- {phabfive-0.7.0 → phabfive-0.8.0}/phabfive/diffusion/fetchers.py +0 -0
- {phabfive-0.7.0 → phabfive-0.8.0}/phabfive/diffusion/formatters.py +0 -0
- {phabfive-0.7.0 → phabfive-0.8.0}/phabfive/diffusion/resolvers.py +0 -0
- {phabfive-0.7.0 → phabfive-0.8.0}/phabfive/diffusion/validators.py +0 -0
- {phabfive-0.7.0 → phabfive-0.8.0}/phabfive/exceptions.py +0 -0
- {phabfive-0.7.0 → phabfive-0.8.0}/phabfive/maniphest/__init__.py +0 -0
- {phabfive-0.7.0 → phabfive-0.8.0}/phabfive/maniphest/filters.py +0 -0
- {phabfive-0.7.0 → phabfive-0.8.0}/phabfive/maniphest/utils.py +0 -0
- {phabfive-0.7.0 → phabfive-0.8.0}/phabfive/maniphest/validators.py +0 -0
- {phabfive-0.7.0 → phabfive-0.8.0}/phabfive/paste.py +0 -0
- {phabfive-0.7.0 → phabfive-0.8.0}/phabfive/project_filters.py +0 -0
- {phabfive-0.7.0 → phabfive-0.8.0}/phabfive/transitions/__init__.py +0 -0
- {phabfive-0.7.0 → phabfive-0.8.0}/phabfive/transitions/column.py +0 -0
- {phabfive-0.7.0 → phabfive-0.8.0}/phabfive/transitions/priority.py +0 -0
- {phabfive-0.7.0 → phabfive-0.8.0}/phabfive/transitions/status.py +0 -0
- {phabfive-0.7.0 → phabfive-0.8.0}/phabfive/user.py +0 -0
- {phabfive-0.7.0 → phabfive-0.8.0}/phorge/entrypoint.sh +0 -0
- {phabfive-0.7.0 → phabfive-0.8.0}/phorge/init-phorge.sh +0 -0
- {phabfive-0.7.0 → phabfive-0.8.0}/phorge/lib/common.sh +0 -0
- {phabfive-0.7.0 → phabfive-0.8.0}/phorge/lib/setup-auth.sh +0 -0
- {phabfive-0.7.0 → phabfive-0.8.0}/phorge/lib/setup-projects.sh +0 -0
- {phabfive-0.7.0 → phabfive-0.8.0}/phorge/lib/setup-tokens.sh +0 -0
- {phabfive-0.7.0 → phabfive-0.8.0}/phorge/lib/setup-users.sh +0 -0
- {phabfive-0.7.0 → phabfive-0.8.0}/phorge/phabfive +0 -0
- {phabfive-0.7.0 → phabfive-0.8.0}/phorge/phorge.conf +0 -0
- {phabfive-0.7.0 → phabfive-0.8.0}/phorge/phorge.ini +0 -0
- {phabfive-0.7.0 → phabfive-0.8.0}/templates/task-create/mega-2024-simulation.yml +0 -0
- {phabfive-0.7.0 → phabfive-0.8.0}/templates/task-create/test-template-v2.yml +0 -0
- {phabfive-0.7.0 → phabfive-0.8.0}/templates/task-create/test-template.yaml +0 -0
- {phabfive-0.7.0 → phabfive-0.8.0}/templates/task-search/blocked-tasks.yaml +0 -0
- {phabfive-0.7.0 → phabfive-0.8.0}/templates/task-search/development-workflow-audit.yaml +0 -0
- {phabfive-0.7.0 → phabfive-0.8.0}/templates/task-search/escalated-priorities.yaml +0 -0
- {phabfive-0.7.0 → phabfive-0.8.0}/templates/task-search/high-priority-stale-tasks.yaml +0 -0
- {phabfive-0.7.0 → phabfive-0.8.0}/templates/task-search/project-status-overview.yaml +0 -0
- {phabfive-0.7.0 → phabfive-0.8.0}/templates/task-search/recently-moved-to-review.yaml +0 -0
- {phabfive-0.7.0 → phabfive-0.8.0}/templates/task-search/tasks-resolved-but-not-in-done.yaml +0 -0
- {phabfive-0.7.0 → phabfive-0.8.0}/templates/task-search/team-productivity-report.yaml +0 -0
- {phabfive-0.7.0 → phabfive-0.8.0}/tests/__init__.py +0 -0
- {phabfive-0.7.0 → phabfive-0.8.0}/tests/test_constants.py +0 -0
- {phabfive-0.7.0 → phabfive-0.8.0}/tests/test_priority_transitions.py +0 -0
- {phabfive-0.7.0 → phabfive-0.8.0}/tests/test_project_filters.py +0 -0
- {phabfive-0.7.0 → phabfive-0.8.0}/tests/test_status_transitions.py +0 -0
- {phabfive-0.7.0 → phabfive-0.8.0}/tox.ini +0 -0
|
@@ -100,12 +100,20 @@ jobs:
|
|
|
100
100
|
- name: Build executable
|
|
101
101
|
shell: bash
|
|
102
102
|
run: |
|
|
103
|
-
|
|
103
|
+
echo "from phabfive.cli import cli_entrypoint; cli_entrypoint()" > _entry.py
|
|
104
|
+
pyinstaller --onefile --name phabfive _entry.py \
|
|
104
105
|
--collect-data rich \
|
|
105
106
|
--copy-metadata rich \
|
|
106
107
|
--collect-data phabricator \
|
|
107
108
|
--hidden-import phabricator \
|
|
108
109
|
--hidden-import anyconfig.backend.yaml \
|
|
110
|
+
--hidden-import phabfive.cli.maniphest \
|
|
111
|
+
--hidden-import phabfive.cli.diffusion \
|
|
112
|
+
--hidden-import phabfive.cli.passphrase \
|
|
113
|
+
--hidden-import phabfive.cli.paste \
|
|
114
|
+
--hidden-import phabfive.cli.user \
|
|
115
|
+
--hidden-import phabfive.cli.repl \
|
|
116
|
+
--hidden-import phabfive.cli.completers \
|
|
109
117
|
--exclude-module mkdocs
|
|
110
118
|
|
|
111
119
|
- name: Rename artifact
|
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
---
|
|
2
|
+
exclude: |
|
|
3
|
+
(?x)
|
|
4
|
+
# You don't usually want a bot to modify your legal texts
|
|
5
|
+
(LICENSE.*|COPYING.*)
|
|
6
|
+
|
|
7
|
+
repos:
|
|
8
|
+
- repo: https://github.com/pre-commit/pre-commit-hooks
|
|
9
|
+
rev: v6.0.0
|
|
10
|
+
hooks:
|
|
11
|
+
- id: check-added-large-files
|
|
12
|
+
exclude: uv.lock
|
|
13
|
+
- id: check-ast
|
|
14
|
+
- id: check-builtin-literals
|
|
15
|
+
- id: check-case-conflict
|
|
16
|
+
- id: check-docstring-first
|
|
17
|
+
- id: check-executables-have-shebangs
|
|
18
|
+
- id: check-illegal-windows-names
|
|
19
|
+
- id: check-json
|
|
20
|
+
- id: check-merge-conflict
|
|
21
|
+
- id: check-shebang-scripts-are-executable
|
|
22
|
+
- id: check-symlinks
|
|
23
|
+
- id: check-toml
|
|
24
|
+
- id: check-xml
|
|
25
|
+
- id: check-yaml
|
|
26
|
+
args: [--allow-multiple-documents]
|
|
27
|
+
- id: debug-statements
|
|
28
|
+
exclude: phabfive/repl.py
|
|
29
|
+
- id: destroyed-symlinks
|
|
30
|
+
- id: detect-aws-credentials
|
|
31
|
+
args: [--allow-missing-credentials]
|
|
32
|
+
- id: detect-private-key
|
|
33
|
+
- id: end-of-file-fixer
|
|
34
|
+
exclude: |
|
|
35
|
+
(?x)
|
|
36
|
+
.drawio.svg|
|
|
37
|
+
.excalidraw.svg|
|
|
38
|
+
WHEEL
|
|
39
|
+
# - id: fix-byte-order-marker
|
|
40
|
+
# - id: forbid-new-submodules
|
|
41
|
+
- id: mixed-line-ending
|
|
42
|
+
args: [--fix=no]
|
|
43
|
+
- id: requirements-txt-fixer
|
|
44
|
+
- id: trailing-whitespace
|
|
45
|
+
args: [--markdown-linebreak-ext=md]
|
|
46
|
+
exclude: .patch
|
|
47
|
+
|
|
48
|
+
- repo: https://github.com/astral-sh/uv-pre-commit
|
|
49
|
+
rev: 0.9.24
|
|
50
|
+
hooks:
|
|
51
|
+
- id: uv-lock
|
|
52
|
+
|
|
53
|
+
- repo: https://github.com/astral-sh/ruff-pre-commit
|
|
54
|
+
rev: v0.14.10
|
|
55
|
+
hooks:
|
|
56
|
+
- id: ruff-check
|
|
57
|
+
args: [--fix]
|
|
58
|
+
- id: ruff-format
|
|
59
|
+
|
|
60
|
+
- repo: https://github.com/ComPWA/taplo-pre-commit
|
|
61
|
+
rev: v0.9.3
|
|
62
|
+
hooks:
|
|
63
|
+
- id: taplo-lint
|
|
64
|
+
name: lint TOML (taplo)
|
|
65
|
+
- id: taplo-format
|
|
66
|
+
name: format TOML (taplo)
|
|
67
|
+
|
|
68
|
+
- repo: https://github.com/adrienverge/yamllint.git
|
|
69
|
+
rev: v1.37.1
|
|
70
|
+
hooks:
|
|
71
|
+
- id: yamllint
|
|
72
|
+
name: lint YAML
|
|
73
|
+
args: ["-d {rules: {line-length: disable}}", "-s"]
|
|
74
|
+
exclude: pnpm-lock.yaml
|
|
75
|
+
|
|
76
|
+
- repo: https://github.com/pre-commit/pygrep-hooks
|
|
77
|
+
rev: v1.10.0
|
|
78
|
+
hooks:
|
|
79
|
+
- id: python-check-blanket-noqa
|
|
80
|
+
- id: python-check-blanket-type-ignore
|
|
81
|
+
- id: python-use-type-annotations
|
|
82
|
+
- id: python-no-eval
|
|
83
|
+
# - id: text-unicode-replacement-char
|
|
84
|
+
|
|
85
|
+
- repo: https://github.com/pre-commit/mirrors-mypy
|
|
86
|
+
rev: v1.19.1
|
|
87
|
+
hooks:
|
|
88
|
+
- id: mypy
|
|
89
|
+
stages: [manual]
|
|
90
|
+
files: ^(app/|cli/|lib/).*\.py$
|
|
91
|
+
args: []
|
|
92
|
+
additional_dependencies:
|
|
93
|
+
- pytest
|
|
94
|
+
- types-boto3
|
|
95
|
+
- types-click
|
|
96
|
+
|
|
97
|
+
- repo: https://github.com/abravalheri/validate-pyproject
|
|
98
|
+
rev: v0.24.1
|
|
99
|
+
hooks:
|
|
100
|
+
- id: validate-pyproject
|
|
101
|
+
additional_dependencies: ["validate-pyproject-schema-store[all]"]
|
|
@@ -21,27 +21,30 @@ uv run pytest tests/test_foo.py # run single test file
|
|
|
21
21
|
uv run pytest -k test_name # run specific test
|
|
22
22
|
uv run tox # test all Python versions (3.10-3.14)
|
|
23
23
|
|
|
24
|
-
# Lint
|
|
25
|
-
uv run
|
|
24
|
+
# Lint and format
|
|
25
|
+
uv run ruff check phabfive/ tests/
|
|
26
|
+
uv run ruff format phabfive/ tests/
|
|
26
27
|
|
|
27
28
|
# Local Phorge instance for testing
|
|
28
29
|
make up # start local Phorge
|
|
29
30
|
make down # stop containers
|
|
30
31
|
|
|
31
32
|
# Merge PRs (rebase only - merge and squash are disabled)
|
|
32
|
-
gh pr merge --rebase
|
|
33
|
+
gh pr merge --rebase --delete-branch
|
|
33
34
|
```
|
|
34
35
|
|
|
35
36
|
## Architecture
|
|
36
37
|
|
|
37
|
-
### CLI Layer (`cli
|
|
38
|
-
- Uses `
|
|
39
|
-
-
|
|
40
|
-
-
|
|
38
|
+
### CLI Layer (`cli/`)
|
|
39
|
+
- Uses `typer` for argument parsing with built-in shell completion
|
|
40
|
+
- Modular structure: `__init__.py` (main app), `maniphest.py`, `diffusion.py`, `paste.py`, `user.py`, `passphrase.py`, `repl.py`
|
|
41
|
+
- Monogram shortcuts via `preprocess_monograms()`: `phabfive T123` expands to `phabfive maniphest show T123`
|
|
42
|
+
- Entry point: `cli_entrypoint()`
|
|
43
|
+
- Shell completion: `phabfive --install-completion bash|zsh|fish`
|
|
41
44
|
|
|
42
45
|
### Core Layer (`core.py`)
|
|
43
46
|
- `Phabfive` class: central configuration and API client management
|
|
44
|
-
- Loads config from
|
|
47
|
+
- Loads config from `.arcconfig`, `~/.arcrc`, `~/.config/phabfive.yaml`, and environment variables
|
|
45
48
|
- Uses the `phabricator` library for Conduit API calls
|
|
46
49
|
- Output formatting: supports `rich` (terminal), `yaml`, and `strict` (machine-readable) modes
|
|
47
50
|
|
|
@@ -59,7 +62,36 @@ Complex features use a consistent subpackage structure:
|
|
|
59
62
|
- `transitions/` - state machine for task status/priority/column changes
|
|
60
63
|
|
|
61
64
|
### Configuration
|
|
62
|
-
|
|
65
|
+
|
|
66
|
+
Required: `PHAB_TOKEN` and `PHAB_URL`
|
|
67
|
+
|
|
68
|
+
Config precedence (later overrides earlier):
|
|
69
|
+
1. Hard-coded defaults
|
|
70
|
+
2. `/etc/phabfive.yaml`
|
|
71
|
+
3. `/etc/phabfive.d/*.yaml`
|
|
72
|
+
4. `~/.config/phabfive.yaml` (PHAB_URL/PHAB_TOKEN deprecated here, use for PHAB_SPACE/PHAB_FALLBACK/PHABFIVE_DEBUG)
|
|
73
|
+
5. `~/.config/phabfive.d/*.yaml`
|
|
74
|
+
6. `.arcconfig` in git root (provides PHAB_URL from `phabricator.uri`)
|
|
75
|
+
7. `~/.arcrc` (provides PHAB_TOKEN for matched URL)
|
|
76
|
+
8. Environment variables
|
|
77
|
+
|
|
78
|
+
## AI Agent Usage
|
|
79
|
+
|
|
80
|
+
Use `--format=yaml` or `--format=json` for machine-readable output:
|
|
81
|
+
|
|
82
|
+
```bash
|
|
83
|
+
# Get task details as YAML
|
|
84
|
+
phabfive --format=yaml T123
|
|
85
|
+
|
|
86
|
+
# Get task details as JSON
|
|
87
|
+
phabfive --format=json T123
|
|
88
|
+
|
|
89
|
+
# Search tasks with structured output
|
|
90
|
+
phabfive --format=json maniphest search --tag=projectname
|
|
91
|
+
|
|
92
|
+
# Pipe JSON to jq
|
|
93
|
+
phabfive --format=json T123 | jq '.Task.Title'
|
|
94
|
+
```
|
|
63
95
|
|
|
64
96
|
## Version Management
|
|
65
97
|
|
|
@@ -1,3 +1,61 @@
|
|
|
1
|
+
# 0.8.0 (2026-03-30)
|
|
2
|
+
|
|
3
|
+
## Prelude
|
|
4
|
+
|
|
5
|
+
Major release featuring a migration from docopt-ng to Typer for the CLI framework, Arcanist-compatible configuration, and numerous new features including shell completion, JSON output, parent/subtask support, and search metadata embedding.
|
|
6
|
+
|
|
7
|
+
## Upgrade Notes
|
|
8
|
+
|
|
9
|
+
* **Breaking change:** Configuration now uses Arcanist-compatible `.arcrc` format. Existing `~/.config/phabfive.yaml` configurations need to be migrated. Run `phabfive user setup` for guided setup.
|
|
10
|
+
* **CLI framework migrated from docopt-ng to Typer** - Command syntax is unchanged, but help output and error messages may differ.
|
|
11
|
+
* **`--format=strict` renamed to `--format=yaml`** - The `strict` alias is still accepted for backwards compatibility.
|
|
12
|
+
|
|
13
|
+
## New Features
|
|
14
|
+
|
|
15
|
+
### CLI & Shell Completion
|
|
16
|
+
* **Typer-based CLI** - Migrated from docopt-ng to Typer for better argument parsing, type safety, and help output
|
|
17
|
+
* **Smart shell completion** - Tab completion for `--priority`, `--status`, `--column` values, and all other option values
|
|
18
|
+
* **JSON output format** - New `--format=json` option for machine-readable output
|
|
19
|
+
|
|
20
|
+
### Maniphest Enhancements
|
|
21
|
+
* **Multi-task show** - `maniphest show` now accepts multiple task IDs (e.g., `phabfive maniphest show T123 T456`)
|
|
22
|
+
* **Parents and subtasks** - New `maniphest parents` and `maniphest subtasks` commands, plus Parents/Subtasks fields in task output
|
|
23
|
+
* **Search metadata Query embedding** - `--show-metadata` now includes a `Query` section with original search parameters, enabling downstream tools to access search context without duplicate arguments
|
|
24
|
+
|
|
25
|
+
### Configuration
|
|
26
|
+
* **Arcanist-compatible configuration** - Reads credentials from `.arcrc` files, compatible with Arcanist/Phorge tooling
|
|
27
|
+
* **Interactive server selector** - When multiple hosts are configured in `.arcrc`, presents an interactive selection prompt
|
|
28
|
+
|
|
29
|
+
### Other
|
|
30
|
+
* **Passphrase structured output** - `passphrase show` now outputs structured data
|
|
31
|
+
* **Optional ptpython REPL** - Enhanced REPL experience when ptpython is installed
|
|
32
|
+
|
|
33
|
+
## Bug Fixes
|
|
34
|
+
|
|
35
|
+
* Fix JSON output producing invalid JSON array for multiple tasks
|
|
36
|
+
* Fix monogram shortcuts not working with global options
|
|
37
|
+
* Improve error handling and standardize error format
|
|
38
|
+
* Fix passphrase show subcommand for monogram shortcuts
|
|
39
|
+
* Fix PyInstaller entry point for Typer CLI package structure
|
|
40
|
+
* Fix insecure temp file reuse vulnerability in requests (upgrade to 2.33.0)
|
|
41
|
+
|
|
42
|
+
## Other Notes
|
|
43
|
+
|
|
44
|
+
* Replaced flake8 with ruff for linting
|
|
45
|
+
* Updated license to SPDX identifier format
|
|
46
|
+
* Removed unused MANIFEST.in
|
|
47
|
+
* Updated pre-commit hooks
|
|
48
|
+
* Cleaned up constants.py
|
|
49
|
+
* Added `exclude-newer` to `[tool.uv]` for supply chain protection
|
|
50
|
+
|
|
51
|
+
|
|
52
|
+
# 0.7.1 (2026-03-07)
|
|
53
|
+
|
|
54
|
+
## Bug Fixes
|
|
55
|
+
|
|
56
|
+
* Fix standalone executables exiting silently without output
|
|
57
|
+
|
|
58
|
+
|
|
1
59
|
# 0.7.0 (2026-03-07)
|
|
2
60
|
|
|
3
61
|
## Prelude
|
|
@@ -175,18 +175,7 @@
|
|
|
175
175
|
|
|
176
176
|
END OF TERMS AND CONDITIONS
|
|
177
177
|
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
To apply the Apache License to your work, attach the following
|
|
181
|
-
boilerplate notice, with the fields enclosed by brackets "[]"
|
|
182
|
-
replaced with your own identifying information. (Don't include
|
|
183
|
-
the brackets!) The text should be enclosed in the appropriate
|
|
184
|
-
comment syntax for the file format. We also recommend that a
|
|
185
|
-
file or class name and description of purpose be included on the
|
|
186
|
-
same "printed page" as the copyright notice for easier
|
|
187
|
-
identification within third-party archives.
|
|
188
|
-
|
|
189
|
-
Copyright [yyyy] [name of copyright owner]
|
|
178
|
+
Copyright 2026 Dynamist AB
|
|
190
179
|
|
|
191
180
|
Licensed under the Apache License, Version 2.0 (the "License");
|
|
192
181
|
you may not use this file except in compliance with the License.
|
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: phabfive
|
|
3
|
-
Version: 0.
|
|
3
|
+
Version: 0.8.0
|
|
4
4
|
Summary: CLI for Phabricator and Phorge - built for humans and AI agents
|
|
5
5
|
Project-URL: Homepage, https://github.com/dynamist/phabfive
|
|
6
6
|
Project-URL: Download, https://github.com/dynamist/phabfive/releases
|
|
7
7
|
Author-email: Rickard Eriksson <rickard@dynamist.se>
|
|
8
|
-
License: Apache
|
|
8
|
+
License: Apache-2.0
|
|
9
9
|
License-File: LICENSE
|
|
10
10
|
Classifier: Development Status :: 4 - Beta
|
|
11
11
|
Classifier: Environment :: Console
|
|
@@ -23,20 +23,23 @@ Classifier: Programming Language :: Python :: 3.14
|
|
|
23
23
|
Requires-Python: >=3.10
|
|
24
24
|
Requires-Dist: anyconfig>=0.10.0
|
|
25
25
|
Requires-Dist: appdirs
|
|
26
|
-
Requires-Dist:
|
|
26
|
+
Requires-Dist: inquirerpy>=0.3.4
|
|
27
27
|
Requires-Dist: jinja2
|
|
28
28
|
Requires-Dist: mkdocs>=1.6.1
|
|
29
29
|
Requires-Dist: phabricator
|
|
30
30
|
Requires-Dist: pyyaml
|
|
31
31
|
Requires-Dist: rich>=13.0.0
|
|
32
32
|
Requires-Dist: ruamel-yaml>=0.18.16
|
|
33
|
+
Requires-Dist: typer[all]>=0.12.0
|
|
33
34
|
Provides-Extra: docs
|
|
34
35
|
Requires-Dist: mkdocs; extra == 'docs'
|
|
36
|
+
Provides-Extra: repl
|
|
37
|
+
Requires-Dist: ptpython; extra == 'repl'
|
|
35
38
|
Provides-Extra: test
|
|
36
39
|
Requires-Dist: coverage; extra == 'test'
|
|
37
|
-
Requires-Dist: flake8; extra == 'test'
|
|
38
40
|
Requires-Dist: pytest; extra == 'test'
|
|
39
41
|
Requires-Dist: pytest-cov; extra == 'test'
|
|
42
|
+
Requires-Dist: ruff; extra == 'test'
|
|
40
43
|
Description-Content-Type: text/markdown
|
|
41
44
|
|
|
42
45
|
# phabfive
|
|
@@ -84,11 +87,35 @@ mise use --global --pin pipx:phabfive
|
|
|
84
87
|
|
|
85
88
|
## Quick Start
|
|
86
89
|
|
|
87
|
-
|
|
90
|
+
```bash
|
|
91
|
+
phabfive user setup
|
|
92
|
+
```
|
|
93
|
+
|
|
94
|
+
The interactive setup wizard will guide you through connecting to your Phabricator/Phorge instance.
|
|
95
|
+
|
|
96
|
+
Then start using phabfive:
|
|
97
|
+
|
|
98
|
+
```bash
|
|
99
|
+
phabfive passphrase K123
|
|
100
|
+
phabfive paste list
|
|
101
|
+
phabfive maniphest search "migration tasks" --tag myproject
|
|
102
|
+
phabfive maniphest search --tag myproject --updated-after=1w
|
|
103
|
+
```
|
|
88
104
|
|
|
89
|
-
|
|
105
|
+
## Shell Completion
|
|
90
106
|
|
|
91
|
-
|
|
107
|
+
Enable tab completion for bash, zsh, or fish:
|
|
108
|
+
|
|
109
|
+
```bash
|
|
110
|
+
phabfive --install-completion bash
|
|
111
|
+
phabfive --install-completion zsh
|
|
112
|
+
phabfive --install-completion fish
|
|
113
|
+
```
|
|
114
|
+
|
|
115
|
+
After installation, restart your shell or source your profile.
|
|
116
|
+
|
|
117
|
+
<details>
|
|
118
|
+
<summary>Manual configuration (advanced)</summary>
|
|
92
119
|
|
|
93
120
|
**Environment variables:**
|
|
94
121
|
|
|
@@ -97,34 +124,18 @@ export PHAB_TOKEN=cli-ABC123
|
|
|
97
124
|
export PHAB_URL=https://yourserver.com/api/
|
|
98
125
|
```
|
|
99
126
|
|
|
100
|
-
**Or
|
|
127
|
+
**Or configuration file** at `~/.config/phabfive.yaml`:
|
|
101
128
|
|
|
102
|
-
```
|
|
103
|
-
# Linux/XDG
|
|
104
|
-
cat << 'EOF' > ~/.config/phabfive.yaml
|
|
129
|
+
```yaml
|
|
105
130
|
PHAB_TOKEN: cli-ABC123
|
|
106
131
|
PHAB_URL: https://yourserver.com/api/
|
|
107
|
-
EOF
|
|
108
|
-
|
|
109
|
-
# macOS
|
|
110
|
-
cat << 'EOF' > ~/Library/Application\ Support/phabfive.yaml
|
|
111
|
-
PHAB_TOKEN: cli-ABC123
|
|
112
|
-
PHAB_URL: https://yourserver.com/api/
|
|
113
|
-
EOF
|
|
114
|
-
|
|
115
|
-
# Windows - create at: %LOCALAPPDATA%\phabfive\phabfive.yaml
|
|
116
132
|
```
|
|
117
133
|
|
|
118
|
-
|
|
134
|
+
Other config file locations: `~/Library/Application Support/phabfive.yaml` (macOS) or `%LOCALAPPDATA%\phabfive\phabfive.yaml` (Windows).
|
|
119
135
|
|
|
120
|
-
|
|
136
|
+
**Windows SSL certificates:** If you encounter certificate errors, install [pip-system-certs](https://pypi.org/project/pip-system-certs/) to use the Windows certificate store: `pip install pip-system-certs`
|
|
121
137
|
|
|
122
|
-
|
|
123
|
-
phabfive passphrase K123
|
|
124
|
-
phabfive paste list
|
|
125
|
-
phabfive maniphest search "migration tasks" --tag myproject
|
|
126
|
-
phabfive maniphest search --tag myproject --updated-after=1w
|
|
127
|
-
```
|
|
138
|
+
</details>
|
|
128
139
|
|
|
129
140
|
## Documentation
|
|
130
141
|
|
|
@@ -43,11 +43,35 @@ mise use --global --pin pipx:phabfive
|
|
|
43
43
|
|
|
44
44
|
## Quick Start
|
|
45
45
|
|
|
46
|
-
|
|
46
|
+
```bash
|
|
47
|
+
phabfive user setup
|
|
48
|
+
```
|
|
49
|
+
|
|
50
|
+
The interactive setup wizard will guide you through connecting to your Phabricator/Phorge instance.
|
|
51
|
+
|
|
52
|
+
Then start using phabfive:
|
|
53
|
+
|
|
54
|
+
```bash
|
|
55
|
+
phabfive passphrase K123
|
|
56
|
+
phabfive paste list
|
|
57
|
+
phabfive maniphest search "migration tasks" --tag myproject
|
|
58
|
+
phabfive maniphest search --tag myproject --updated-after=1w
|
|
59
|
+
```
|
|
47
60
|
|
|
48
|
-
|
|
61
|
+
## Shell Completion
|
|
49
62
|
|
|
50
|
-
|
|
63
|
+
Enable tab completion for bash, zsh, or fish:
|
|
64
|
+
|
|
65
|
+
```bash
|
|
66
|
+
phabfive --install-completion bash
|
|
67
|
+
phabfive --install-completion zsh
|
|
68
|
+
phabfive --install-completion fish
|
|
69
|
+
```
|
|
70
|
+
|
|
71
|
+
After installation, restart your shell or source your profile.
|
|
72
|
+
|
|
73
|
+
<details>
|
|
74
|
+
<summary>Manual configuration (advanced)</summary>
|
|
51
75
|
|
|
52
76
|
**Environment variables:**
|
|
53
77
|
|
|
@@ -56,34 +80,18 @@ export PHAB_TOKEN=cli-ABC123
|
|
|
56
80
|
export PHAB_URL=https://yourserver.com/api/
|
|
57
81
|
```
|
|
58
82
|
|
|
59
|
-
**Or
|
|
83
|
+
**Or configuration file** at `~/.config/phabfive.yaml`:
|
|
60
84
|
|
|
61
|
-
```
|
|
62
|
-
# Linux/XDG
|
|
63
|
-
cat << 'EOF' > ~/.config/phabfive.yaml
|
|
85
|
+
```yaml
|
|
64
86
|
PHAB_TOKEN: cli-ABC123
|
|
65
87
|
PHAB_URL: https://yourserver.com/api/
|
|
66
|
-
EOF
|
|
67
|
-
|
|
68
|
-
# macOS
|
|
69
|
-
cat << 'EOF' > ~/Library/Application\ Support/phabfive.yaml
|
|
70
|
-
PHAB_TOKEN: cli-ABC123
|
|
71
|
-
PHAB_URL: https://yourserver.com/api/
|
|
72
|
-
EOF
|
|
73
|
-
|
|
74
|
-
# Windows - create at: %LOCALAPPDATA%\phabfive\phabfive.yaml
|
|
75
88
|
```
|
|
76
89
|
|
|
77
|
-
|
|
90
|
+
Other config file locations: `~/Library/Application Support/phabfive.yaml` (macOS) or `%LOCALAPPDATA%\phabfive\phabfive.yaml` (Windows).
|
|
78
91
|
|
|
79
|
-
|
|
92
|
+
**Windows SSL certificates:** If you encounter certificate errors, install [pip-system-certs](https://pypi.org/project/pip-system-certs/) to use the Windows certificate store: `pip install pip-system-certs`
|
|
80
93
|
|
|
81
|
-
|
|
82
|
-
phabfive passphrase K123
|
|
83
|
-
phabfive paste list
|
|
84
|
-
phabfive maniphest search "migration tasks" --tag myproject
|
|
85
|
-
phabfive maniphest search --tag myproject --updated-after=1w
|
|
86
|
-
```
|
|
94
|
+
</details>
|
|
87
95
|
|
|
88
96
|
## Documentation
|
|
89
97
|
|