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.
Files changed (118) hide show
  1. {phabfive-0.7.0 → phabfive-0.8.0}/.github/workflows/release.yml +9 -1
  2. {phabfive-0.7.0 → phabfive-0.8.0}/.github/workflows/tox.yml +3 -1
  3. phabfive-0.8.0/.pre-commit-config.yaml +101 -0
  4. {phabfive-0.7.0 → phabfive-0.8.0}/AGENTS.md +41 -9
  5. {phabfive-0.7.0 → phabfive-0.8.0}/CHANGELOG.md +58 -0
  6. {phabfive-0.7.0 → phabfive-0.8.0}/LICENSE +1 -12
  7. {phabfive-0.7.0 → phabfive-0.8.0}/PKG-INFO +39 -28
  8. {phabfive-0.7.0 → phabfive-0.8.0}/README.md +32 -24
  9. phabfive-0.8.0/phabfive/cli/__init__.py +217 -0
  10. phabfive-0.8.0/phabfive/cli/completers.py +150 -0
  11. phabfive-0.8.0/phabfive/cli/diffusion.py +194 -0
  12. phabfive-0.8.0/phabfive/cli/maniphest.py +472 -0
  13. phabfive-0.8.0/phabfive/cli/passphrase.py +44 -0
  14. phabfive-0.8.0/phabfive/cli/paste.py +78 -0
  15. phabfive-0.8.0/phabfive/cli/repl.py +26 -0
  16. phabfive-0.8.0/phabfive/cli/user.py +37 -0
  17. phabfive-0.8.0/phabfive/constants.py +103 -0
  18. {phabfive-0.7.0 → phabfive-0.8.0}/phabfive/core.py +131 -20
  19. {phabfive-0.7.0 → phabfive-0.8.0}/phabfive/diffusion/core.py +13 -3
  20. phabfive-0.8.0/phabfive/display.py +577 -0
  21. {phabfive-0.7.0 → phabfive-0.8.0}/phabfive/maniphest/core.py +190 -15
  22. {phabfive-0.7.0 → phabfive-0.8.0}/phabfive/maniphest/fetchers.py +87 -0
  23. {phabfive-0.7.0 → phabfive-0.8.0}/phabfive/maniphest/formatters.py +22 -0
  24. {phabfive-0.7.0 → phabfive-0.8.0}/phabfive/maniphest/resolvers.py +3 -1
  25. phabfive-0.8.0/phabfive/passphrase.py +137 -0
  26. phabfive-0.8.0/phabfive/passphrase_display.py +198 -0
  27. phabfive-0.8.0/phabfive/repl.py +44 -0
  28. {phabfive-0.7.0 → phabfive-0.8.0}/phabfive/setup.py +127 -97
  29. {phabfive-0.7.0 → phabfive-0.8.0}/phabfive/transitions/base.py +4 -4
  30. phabfive-0.8.0/pyproject.toml +60 -0
  31. phabfive-0.8.0/tests/test_arcconfig.py +171 -0
  32. {phabfive-0.7.0 → phabfive-0.8.0}/tests/test_arcrc.py +152 -4
  33. {phabfive-0.7.0 → phabfive-0.8.0}/tests/test_maniphest.py +124 -37
  34. {phabfive-0.7.0 → phabfive-0.8.0}/tests/test_phabfive.py +2 -2
  35. {phabfive-0.7.0 → phabfive-0.8.0}/tests/test_setup.py +187 -28
  36. phabfive-0.8.0/uv.lock +1182 -0
  37. phabfive-0.7.0/.pre-commit-config.yaml +0 -90
  38. phabfive-0.7.0/MANIFEST.in +0 -3
  39. phabfive-0.7.0/phabfive/cli.py +0 -1314
  40. phabfive-0.7.0/phabfive/constants.py +0 -56
  41. phabfive-0.7.0/phabfive/passphrase.py +0 -69
  42. phabfive-0.7.0/phabfive/repl.py +0 -29
  43. phabfive-0.7.0/pyproject.toml +0 -71
  44. phabfive-0.7.0/uv.lock +0 -1068
  45. {phabfive-0.7.0 → phabfive-0.8.0}/.editorconfig +0 -0
  46. {phabfive-0.7.0 → phabfive-0.8.0}/.flake8 +0 -0
  47. {phabfive-0.7.0 → phabfive-0.8.0}/.github/ISSUE_TEMPLATE/bug_report.md +0 -0
  48. {phabfive-0.7.0 → phabfive-0.8.0}/.github/ISSUE_TEMPLATE/documentation_change.md +0 -0
  49. {phabfive-0.7.0 → phabfive-0.8.0}/.github/ISSUE_TEMPLATE/feature_request.md +0 -0
  50. {phabfive-0.7.0 → phabfive-0.8.0}/.github/PULL_REQUEST_TEMPLATE.md +0 -0
  51. {phabfive-0.7.0 → phabfive-0.8.0}/.github/dependabot.yml +0 -0
  52. {phabfive-0.7.0 → phabfive-0.8.0}/.github/workflows/gitleaks.yml +0 -0
  53. {phabfive-0.7.0 → phabfive-0.8.0}/.gitignore +0 -0
  54. {phabfive-0.7.0 → phabfive-0.8.0}/.gitleaksignore +0 -0
  55. {phabfive-0.7.0 → phabfive-0.8.0}/.mailmap +0 -0
  56. {phabfive-0.7.0 → phabfive-0.8.0}/.readthedocs.yaml +0 -0
  57. {phabfive-0.7.0 → phabfive-0.8.0}/.travis.yml +0 -0
  58. {phabfive-0.7.0 → phabfive-0.8.0}/.vscode/settings.json +0 -0
  59. {phabfive-0.7.0 → phabfive-0.8.0}/.yamllint.yml +0 -0
  60. {phabfive-0.7.0 → phabfive-0.8.0}/CLAUDE.md +0 -0
  61. {phabfive-0.7.0 → phabfive-0.8.0}/Dockerfile +0 -0
  62. {phabfive-0.7.0 → phabfive-0.8.0}/Dockerfile.phorge +0 -0
  63. {phabfive-0.7.0 → phabfive-0.8.0}/Makefile +0 -0
  64. {phabfive-0.7.0 → phabfive-0.8.0}/compose.yml +0 -0
  65. {phabfive-0.7.0 → phabfive-0.8.0}/docs/create-templates.md +0 -0
  66. {phabfive-0.7.0 → phabfive-0.8.0}/docs/development.md +0 -0
  67. {phabfive-0.7.0 → phabfive-0.8.0}/docs/index.md +0 -0
  68. {phabfive-0.7.0 → phabfive-0.8.0}/docs/maniphest-cli.md +0 -0
  69. {phabfive-0.7.0 → phabfive-0.8.0}/docs/maniphest-show.png +0 -0
  70. {phabfive-0.7.0 → phabfive-0.8.0}/docs/phorge-setup.md +0 -0
  71. {phabfive-0.7.0 → phabfive-0.8.0}/docs/releasing.md +0 -0
  72. {phabfive-0.7.0 → phabfive-0.8.0}/docs/search-templates.md +0 -0
  73. {phabfive-0.7.0 → phabfive-0.8.0}/mkdocs.yml +0 -0
  74. {phabfive-0.7.0 → phabfive-0.8.0}/phabfive/__init__.py +0 -0
  75. {phabfive-0.7.0 → phabfive-0.8.0}/phabfive/diffusion/__init__.py +0 -0
  76. {phabfive-0.7.0 → phabfive-0.8.0}/phabfive/diffusion/fetchers.py +0 -0
  77. {phabfive-0.7.0 → phabfive-0.8.0}/phabfive/diffusion/formatters.py +0 -0
  78. {phabfive-0.7.0 → phabfive-0.8.0}/phabfive/diffusion/resolvers.py +0 -0
  79. {phabfive-0.7.0 → phabfive-0.8.0}/phabfive/diffusion/validators.py +0 -0
  80. {phabfive-0.7.0 → phabfive-0.8.0}/phabfive/exceptions.py +0 -0
  81. {phabfive-0.7.0 → phabfive-0.8.0}/phabfive/maniphest/__init__.py +0 -0
  82. {phabfive-0.7.0 → phabfive-0.8.0}/phabfive/maniphest/filters.py +0 -0
  83. {phabfive-0.7.0 → phabfive-0.8.0}/phabfive/maniphest/utils.py +0 -0
  84. {phabfive-0.7.0 → phabfive-0.8.0}/phabfive/maniphest/validators.py +0 -0
  85. {phabfive-0.7.0 → phabfive-0.8.0}/phabfive/paste.py +0 -0
  86. {phabfive-0.7.0 → phabfive-0.8.0}/phabfive/project_filters.py +0 -0
  87. {phabfive-0.7.0 → phabfive-0.8.0}/phabfive/transitions/__init__.py +0 -0
  88. {phabfive-0.7.0 → phabfive-0.8.0}/phabfive/transitions/column.py +0 -0
  89. {phabfive-0.7.0 → phabfive-0.8.0}/phabfive/transitions/priority.py +0 -0
  90. {phabfive-0.7.0 → phabfive-0.8.0}/phabfive/transitions/status.py +0 -0
  91. {phabfive-0.7.0 → phabfive-0.8.0}/phabfive/user.py +0 -0
  92. {phabfive-0.7.0 → phabfive-0.8.0}/phorge/entrypoint.sh +0 -0
  93. {phabfive-0.7.0 → phabfive-0.8.0}/phorge/init-phorge.sh +0 -0
  94. {phabfive-0.7.0 → phabfive-0.8.0}/phorge/lib/common.sh +0 -0
  95. {phabfive-0.7.0 → phabfive-0.8.0}/phorge/lib/setup-auth.sh +0 -0
  96. {phabfive-0.7.0 → phabfive-0.8.0}/phorge/lib/setup-projects.sh +0 -0
  97. {phabfive-0.7.0 → phabfive-0.8.0}/phorge/lib/setup-tokens.sh +0 -0
  98. {phabfive-0.7.0 → phabfive-0.8.0}/phorge/lib/setup-users.sh +0 -0
  99. {phabfive-0.7.0 → phabfive-0.8.0}/phorge/phabfive +0 -0
  100. {phabfive-0.7.0 → phabfive-0.8.0}/phorge/phorge.conf +0 -0
  101. {phabfive-0.7.0 → phabfive-0.8.0}/phorge/phorge.ini +0 -0
  102. {phabfive-0.7.0 → phabfive-0.8.0}/templates/task-create/mega-2024-simulation.yml +0 -0
  103. {phabfive-0.7.0 → phabfive-0.8.0}/templates/task-create/test-template-v2.yml +0 -0
  104. {phabfive-0.7.0 → phabfive-0.8.0}/templates/task-create/test-template.yaml +0 -0
  105. {phabfive-0.7.0 → phabfive-0.8.0}/templates/task-search/blocked-tasks.yaml +0 -0
  106. {phabfive-0.7.0 → phabfive-0.8.0}/templates/task-search/development-workflow-audit.yaml +0 -0
  107. {phabfive-0.7.0 → phabfive-0.8.0}/templates/task-search/escalated-priorities.yaml +0 -0
  108. {phabfive-0.7.0 → phabfive-0.8.0}/templates/task-search/high-priority-stale-tasks.yaml +0 -0
  109. {phabfive-0.7.0 → phabfive-0.8.0}/templates/task-search/project-status-overview.yaml +0 -0
  110. {phabfive-0.7.0 → phabfive-0.8.0}/templates/task-search/recently-moved-to-review.yaml +0 -0
  111. {phabfive-0.7.0 → phabfive-0.8.0}/templates/task-search/tasks-resolved-but-not-in-done.yaml +0 -0
  112. {phabfive-0.7.0 → phabfive-0.8.0}/templates/task-search/team-productivity-report.yaml +0 -0
  113. {phabfive-0.7.0 → phabfive-0.8.0}/tests/__init__.py +0 -0
  114. {phabfive-0.7.0 → phabfive-0.8.0}/tests/test_constants.py +0 -0
  115. {phabfive-0.7.0 → phabfive-0.8.0}/tests/test_priority_transitions.py +0 -0
  116. {phabfive-0.7.0 → phabfive-0.8.0}/tests/test_project_filters.py +0 -0
  117. {phabfive-0.7.0 → phabfive-0.8.0}/tests/test_status_transitions.py +0 -0
  118. {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
- pyinstaller --onefile --name phabfive phabfive/cli.py \
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
@@ -42,4 +42,6 @@ jobs:
42
42
 
43
43
  - name: Run linting (Python 3.13 only)
44
44
  if: matrix.python-version == '3.13' && matrix.os == 'ubuntu-latest'
45
- run: uv run flake8 phabfive/ tests/
45
+ run: |
46
+ uv run ruff check phabfive/ tests/
47
+ uv run ruff format --check phabfive/ tests/
@@ -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 flake8 phabfive/ tests/
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.py`)
38
- - Uses `docopt-ng` for argument parsing with docstring-based CLI definitions
39
- - Monogram shortcuts allow direct access: `phabfive T123` expands to `phabfive maniphest show T123`
40
- - Entry point: `cli_entrypoint()` → `parse_cli()`
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 environment variables or `~/.config/phabfive.yaml`
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
- Required: `PHAB_TOKEN` and `PHAB_URL` (via environment or config file)
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
- APPENDIX: How to apply the Apache License to your work.
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.7.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 License 2.0
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: docopt-ng
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
- ### 1. Get an API token
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
- Grab a Phabricator/Phorge token at `https://<yourserver.com>/settings/panel/apitokens/`
105
+ ## Shell Completion
90
106
 
91
- ### 2. Configure credentials
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 use a configuration file:**
127
+ **Or configuration file** at `~/.config/phabfive.yaml`:
101
128
 
102
- ```bash
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
- **Note:** On macOS, you can use `~/.config` by setting `export XDG_CONFIG_HOME=~/.config`
134
+ Other config file locations: `~/Library/Application Support/phabfive.yaml` (macOS) or `%LOCALAPPDATA%\phabfive\phabfive.yaml` (Windows).
119
135
 
120
- ### 3. Use phabfive
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
- ```bash
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
- ### 1. Get an API token
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
- Grab a Phabricator/Phorge token at `https://<yourserver.com>/settings/panel/apitokens/`
61
+ ## Shell Completion
49
62
 
50
- ### 2. Configure credentials
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 use a configuration file:**
83
+ **Or configuration file** at `~/.config/phabfive.yaml`:
60
84
 
61
- ```bash
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
- **Note:** On macOS, you can use `~/.config` by setting `export XDG_CONFIG_HOME=~/.config`
90
+ Other config file locations: `~/Library/Application Support/phabfive.yaml` (macOS) or `%LOCALAPPDATA%\phabfive\phabfive.yaml` (Windows).
78
91
 
79
- ### 3. Use phabfive
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
- ```bash
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