methodology-framework 0.1.1__tar.gz → 0.2.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.
- {methodology_framework-0.1.1/src/methodology_framework.egg-info → methodology_framework-0.2.0}/PKG-INFO +134 -24
- {methodology_framework-0.1.1 → methodology_framework-0.2.0}/README.md +130 -23
- {methodology_framework-0.1.1 → methodology_framework-0.2.0}/pyproject.toml +4 -1
- methodology_framework-0.2.0/src/methodology_framework/bootstrap_jira.py +702 -0
- {methodology_framework-0.1.1 → methodology_framework-0.2.0}/src/methodology_framework/jira_shapes/custom_fields.yaml +4 -3
- {methodology_framework-0.1.1 → methodology_framework-0.2.0}/src/methodology_framework/jira_shapes/workflow.yaml +8 -0
- {methodology_framework-0.1.1 → methodology_framework-0.2.0/src/methodology_framework.egg-info}/PKG-INFO +134 -24
- {methodology_framework-0.1.1 → methodology_framework-0.2.0}/src/methodology_framework.egg-info/requires.txt +3 -0
- methodology_framework-0.2.0/tests/test_bootstrap_jira.py +719 -0
- methodology_framework-0.1.1/src/methodology_framework/bootstrap_jira.py +0 -446
- methodology_framework-0.1.1/tests/test_bootstrap_jira.py +0 -380
- {methodology_framework-0.1.1 → methodology_framework-0.2.0}/LICENSE +0 -0
- {methodology_framework-0.1.1 → methodology_framework-0.2.0}/setup.cfg +0 -0
- {methodology_framework-0.1.1 → methodology_framework-0.2.0}/src/methodology_framework/__init__.py +0 -0
- {methodology_framework-0.1.1 → methodology_framework-0.2.0}/src/methodology_framework/__main__.py +0 -0
- {methodology_framework-0.1.1 → methodology_framework-0.2.0}/src/methodology_framework/build_playbook.py +0 -0
- {methodology_framework-0.1.1 → methodology_framework-0.2.0}/src/methodology_framework/jira_shapes/__init__.py +0 -0
- {methodology_framework-0.1.1 → methodology_framework-0.2.0}/src/methodology_framework/jira_shapes/automation_rules.yaml +0 -0
- {methodology_framework-0.1.1 → methodology_framework-0.2.0}/src/methodology_framework/playbooks/scrum-router.body.md +0 -0
- {methodology_framework-0.1.1 → methodology_framework-0.2.0}/src/methodology_framework/populate_acus.py +0 -0
- {methodology_framework-0.1.1 → methodology_framework-0.2.0}/src/methodology_framework/register_playbook_with_devin.py +0 -0
- {methodology_framework-0.1.1 → methodology_framework-0.2.0}/src/methodology_framework/specs/devin-story-format.md +0 -0
- {methodology_framework-0.1.1 → methodology_framework-0.2.0}/src/methodology_framework/sync_stories_to_jira.py +0 -0
- {methodology_framework-0.1.1 → methodology_framework-0.2.0}/src/methodology_framework/templates/github_workflows/populate-story-acus-caller.yml +0 -0
- {methodology_framework-0.1.1 → methodology_framework-0.2.0}/src/methodology_framework/templates/story.md +0 -0
- {methodology_framework-0.1.1 → methodology_framework-0.2.0}/src/methodology_framework.egg-info/SOURCES.txt +0 -0
- {methodology_framework-0.1.1 → methodology_framework-0.2.0}/src/methodology_framework.egg-info/dependency_links.txt +0 -0
- {methodology_framework-0.1.1 → methodology_framework-0.2.0}/src/methodology_framework.egg-info/top_level.txt +0 -0
- {methodology_framework-0.1.1 → methodology_framework-0.2.0}/tests/test_build_playbook.py +0 -0
- {methodology_framework-0.1.1 → methodology_framework-0.2.0}/tests/test_populate_acus.py +0 -0
- {methodology_framework-0.1.1 → methodology_framework-0.2.0}/tests/test_register_playbook_with_devin.py +0 -0
- {methodology_framework-0.1.1 → methodology_framework-0.2.0}/tests/test_sync_stories_to_jira.py +0 -0
- {methodology_framework-0.1.1 → methodology_framework-0.2.0}/tests/test_workflows.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: methodology-framework
|
|
3
|
-
Version: 0.
|
|
3
|
+
Version: 0.2.0
|
|
4
4
|
Summary: Portable process tooling for agent-driven delivery — scripts, playbooks, templates, and specs.
|
|
5
5
|
Author: whiteout59
|
|
6
6
|
License-Expression: Apache-2.0
|
|
@@ -10,6 +10,7 @@ License-File: LICENSE
|
|
|
10
10
|
Requires-Dist: requests<3,>=2.31
|
|
11
11
|
Requires-Dist: python-frontmatter<2,>=1.1
|
|
12
12
|
Requires-Dist: pyyaml<7,>=6.0
|
|
13
|
+
Requires-Dist: colorama<1,>=0.4
|
|
13
14
|
Provides-Extra: dev
|
|
14
15
|
Requires-Dist: pytest<9,>=8.0; extra == "dev"
|
|
15
16
|
Requires-Dist: requests-mock<2,>=1.12; extra == "dev"
|
|
@@ -17,6 +18,8 @@ Requires-Dist: ruff==0.15.14; extra == "dev"
|
|
|
17
18
|
Requires-Dist: mypy<2,>=1.10; extra == "dev"
|
|
18
19
|
Requires-Dist: types-requests<3,>=2.31; extra == "dev"
|
|
19
20
|
Requires-Dist: types-PyYAML<7,>=6.0; extra == "dev"
|
|
21
|
+
Requires-Dist: types-colorama<1,>=0.4; extra == "dev"
|
|
22
|
+
Requires-Dist: vcrpy<9,>=7.0; extra == "dev"
|
|
20
23
|
Dynamic: license-file
|
|
21
24
|
|
|
22
25
|
# methodology-framework
|
|
@@ -37,69 +40,101 @@ pip install -e .
|
|
|
37
40
|
- `methodology_framework/playbooks/` -- parameterized playbook bodies (package data)
|
|
38
41
|
- `methodology_framework/templates/` -- story and process templates (package data)
|
|
39
42
|
- `methodology_framework/specs/` -- format specs (package data)
|
|
40
|
-
- `methodology_framework.bootstrap_jira` --
|
|
43
|
+
- `methodology_framework.bootstrap_jira` -- verify a Jira project matches the canonical shape (read-only spec-compliance checker)
|
|
41
44
|
- `methodology_framework/jira_shapes/` -- canonical Jira shape definitions (YAML, package data)
|
|
42
45
|
|
|
43
|
-
## Jira Bootstrap
|
|
46
|
+
## Jira Bootstrap (Verify Mode)
|
|
44
47
|
|
|
45
|
-
|
|
46
|
-
|
|
48
|
+
The CLI checks whether a Jira project matches the methodology-framework's
|
|
49
|
+
canonical shape and reports gaps. It does **not** provision — operators apply
|
|
50
|
+
gaps via the Jira UI. This read-only design lets the tool run in CI as a gate.
|
|
51
|
+
|
|
52
|
+
> **v0.2.0 breaking change:** `--apply` and `--dry-run` were removed.
|
|
53
|
+
> The CLI is now a spec-compliance verifier. See `operator-verify-runbook.md`
|
|
54
|
+
> for the operator workflow.
|
|
47
55
|
|
|
48
56
|
### Prerequisites
|
|
49
57
|
|
|
50
58
|
- Python 3.12+
|
|
51
59
|
- `pip install methodology-framework` (or `pip install -e .` from source)
|
|
52
|
-
- For `--
|
|
53
|
-
|
|
54
|
-
|
|
60
|
+
- For `--verify` mode: `JIRA_ADMIN_TOKEN` environment variable set to a Jira
|
|
61
|
+
API token (admin scope is **not** required; a regular user token with read
|
|
62
|
+
access is sufficient), and `JIRA_USER_EMAIL` set to the email of the
|
|
63
|
+
Atlassian account that owns the token
|
|
55
64
|
|
|
56
65
|
### Usage
|
|
57
66
|
|
|
58
67
|
```bash
|
|
59
|
-
#
|
|
68
|
+
# Verify — query Jira and report spec-compliance gaps (read-only)
|
|
69
|
+
export JIRA_ADMIN_TOKEN="<your-token>"
|
|
70
|
+
export JIRA_USER_EMAIL="<your-email>"
|
|
60
71
|
python -m methodology_framework bootstrap-jira \
|
|
61
72
|
--project-key=MYPROJ \
|
|
62
73
|
--jira-host=myorg.atlassian.net \
|
|
63
|
-
--
|
|
74
|
+
--verify
|
|
64
75
|
|
|
65
|
-
#
|
|
76
|
+
# JSON output (stable schema — safe for CI parsing)
|
|
66
77
|
python -m methodology_framework bootstrap-jira \
|
|
67
78
|
--project-key=MYPROJ \
|
|
68
79
|
--jira-host=myorg.atlassian.net \
|
|
69
|
-
--
|
|
80
|
+
--verify --output=json
|
|
70
81
|
|
|
71
|
-
#
|
|
72
|
-
export JIRA_ADMIN_TOKEN="<your-token>"
|
|
73
|
-
export JIRA_USER_EMAIL="<your-email>"
|
|
82
|
+
# Markdown output
|
|
74
83
|
python -m methodology_framework bootstrap-jira \
|
|
75
84
|
--project-key=MYPROJ \
|
|
76
85
|
--jira-host=myorg.atlassian.net \
|
|
77
|
-
--
|
|
86
|
+
--verify --output=markdown
|
|
78
87
|
|
|
79
|
-
#
|
|
88
|
+
# Export — emit an importable config bundle (YAML); no API calls
|
|
80
89
|
python -m methodology_framework bootstrap-jira \
|
|
81
90
|
--project-key=MYPROJ \
|
|
82
91
|
--jira-host=myorg.atlassian.net \
|
|
83
|
-
--
|
|
92
|
+
--export /tmp/jira-bundle.yaml
|
|
84
93
|
```
|
|
85
94
|
|
|
95
|
+
### Exit codes
|
|
96
|
+
|
|
97
|
+
| Code | Meaning |
|
|
98
|
+
|------|---------|
|
|
99
|
+
| `0` | All spec items verified OK |
|
|
100
|
+
| `1` | One or more items missing (gaps found) |
|
|
101
|
+
| `2` | One or more items unverifiable (API limitation; operator must inspect manually) |
|
|
102
|
+
| `3` | Error (connectivity, auth, or runtime failure) |
|
|
103
|
+
|
|
86
104
|
### Flags
|
|
87
105
|
|
|
88
106
|
| Flag | Required | Description |
|
|
89
107
|
|------|----------|-------------|
|
|
90
108
|
| `--project-key` | Yes | Jira project key (e.g. `SCRUM`). Substituted for `{{PROJECT_KEY}}` in shape defs. |
|
|
91
109
|
| `--jira-host` | Yes | Jira Cloud host (e.g. `myorg.atlassian.net`). No `https://` prefix. |
|
|
92
|
-
| `--
|
|
93
|
-
| `--
|
|
94
|
-
| `--
|
|
95
|
-
| `--force` | No | Skip confirmation prompts during `--apply`. |
|
|
110
|
+
| `--verify` | No | Query Jira and report spec-compliance gaps (read-only). |
|
|
111
|
+
| `--export <path>` | No | Emit importable config bundle at `<path>`. No API calls. |
|
|
112
|
+
| `--output` | No | Output format for `--verify`: `text` (default), `json`, `markdown`. |
|
|
96
113
|
|
|
97
114
|
### Environment variables
|
|
98
115
|
|
|
99
116
|
| Variable | When needed | Description |
|
|
100
117
|
|----------|-------------|-------------|
|
|
101
|
-
| `JIRA_ADMIN_TOKEN` | `--
|
|
102
|
-
| `JIRA_USER_EMAIL` | `--
|
|
118
|
+
| `JIRA_ADMIN_TOKEN` | `--verify` mode | Jira API token. Admin scope is **not** required; a regular user token with read access is sufficient. **Never** accepted as a CLI flag. |
|
|
119
|
+
| `JIRA_USER_EMAIL` | `--verify` mode | Email of the Atlassian account that owns the API token. Used with the token for HTTP Basic auth. **Never** accepted as a CLI flag. |
|
|
120
|
+
|
|
121
|
+
### JSON output schema (v0.2.0)
|
|
122
|
+
|
|
123
|
+
```json
|
|
124
|
+
{
|
|
125
|
+
"spec_version": "0.2.0",
|
|
126
|
+
"project_key": "METH",
|
|
127
|
+
"verified_at": "2025-05-31T00:00:00Z",
|
|
128
|
+
"items": [
|
|
129
|
+
{"resource_type": "status", "name": "To Do", "result": "ok", "details": null},
|
|
130
|
+
{"resource_type": "custom_field", "name": "Story File", "result": "missing", "details": "Operator must create via Settings → Custom fields → Create"}
|
|
131
|
+
],
|
|
132
|
+
"summary": {"total": 14, "ok": 12, "missing": 1, "unverifiable": 1},
|
|
133
|
+
"exit_code": 1
|
|
134
|
+
}
|
|
135
|
+
```
|
|
136
|
+
|
|
137
|
+
Any breaking change to this schema requires a MAJOR version bump.
|
|
103
138
|
|
|
104
139
|
### Shape definitions
|
|
105
140
|
|
|
@@ -228,6 +263,45 @@ to the GitHub repo `whiteout59/methodology-framework`, workflow
|
|
|
228
263
|
`pypi-release.yml`, environment `pypi` at
|
|
229
264
|
[PyPI Trusted Publishers](https://pypi.org/manage/account/publishing/).
|
|
230
265
|
|
|
266
|
+
## Release lifecycle
|
|
267
|
+
|
|
268
|
+
Version bumps in `pyproject.toml` drive the entire release cycle
|
|
269
|
+
automatically. The operator's only decision surface is PR review.
|
|
270
|
+
|
|
271
|
+
### Normal flow
|
|
272
|
+
|
|
273
|
+
1. A PR bumps the `version` field in `pyproject.toml` (e.g. `"0.1.1"` → `"0.1.2"`).
|
|
274
|
+
2. Reviewer approves and merges the PR to `main`.
|
|
275
|
+
3. The `auto-tag.yml` workflow detects the `pyproject.toml` change, extracts the
|
|
276
|
+
version, validates it as stable SemVer (`^[0-9]+\.[0-9]+\.[0-9]+$`), and
|
|
277
|
+
creates an annotated tag `v0.1.2`.
|
|
278
|
+
4. The `pypi-release.yml` workflow fires on the new tag and publishes the
|
|
279
|
+
package to PyPI via OIDC Trusted Publishers.
|
|
280
|
+
|
|
281
|
+
**Operator surface = PR review only.** No manual `git tag` step required.
|
|
282
|
+
|
|
283
|
+
### Manual fallback
|
|
284
|
+
|
|
285
|
+
If `auto-tag.yml` doesn't fire (workflow disabled, branch protection
|
|
286
|
+
blocking the tag push, GitHub Actions outage, etc.), the manual fallback
|
|
287
|
+
still works:
|
|
288
|
+
|
|
289
|
+
```bash
|
|
290
|
+
git tag -a v0.1.2 -m "Release v0.1.2"
|
|
291
|
+
git push origin v0.1.2
|
|
292
|
+
```
|
|
293
|
+
|
|
294
|
+
`pypi-release.yml` doesn't care how the tag arrived — it fires on any
|
|
295
|
+
tag matching `v[0-9]+.[0-9]+.[0-9]+`.
|
|
296
|
+
|
|
297
|
+
### Pre-release versions
|
|
298
|
+
|
|
299
|
+
The `auto-tag.yml` workflow only tags **stable** SemVer versions. Versions
|
|
300
|
+
containing `-rc`, `-beta`, `-alpha`, `.dev`, or `.pre` suffixes (or any
|
|
301
|
+
string not matching `^[0-9]+\.[0-9]+\.[0-9]+$`) are logged and skipped.
|
|
302
|
+
Pre-release publishing is out of scope; if needed, a separate workflow
|
|
303
|
+
would handle pre-release tag patterns.
|
|
304
|
+
|
|
231
305
|
## Cost tracking via `agent_acus`
|
|
232
306
|
|
|
233
307
|
The methodology's post-execution notes include an `agent_acus` field that
|
|
@@ -262,6 +336,42 @@ ruff format --check src/methodology_framework
|
|
|
262
336
|
mypy --strict src/methodology_framework
|
|
263
337
|
```
|
|
264
338
|
|
|
339
|
+
### Shape-def expansion (v0.1.2+)
|
|
340
|
+
|
|
341
|
+
`workflow.yaml` now includes a `statusCategory` field on each status
|
|
342
|
+
(`TODO`, `IN_PROGRESS`, or `DONE`). The `--apply` handler validates
|
|
343
|
+
this field at load time and exits with a clear error if any status is
|
|
344
|
+
missing it.
|
|
345
|
+
|
|
346
|
+
`custom_fields.yaml` uses canonical shorthand types (`text`, `string`,
|
|
347
|
+
`multi-value`, `numeric`) that are mapped to fully-qualified Jira
|
|
348
|
+
identifiers at apply time. Fields may also specify a fully-qualified
|
|
349
|
+
type directly (any value containing `:` is passed through unchanged).
|
|
350
|
+
|
|
351
|
+
### Recording new VCR cassettes
|
|
352
|
+
|
|
353
|
+
Integration tests under `tests/integration/` replay pre-recorded VCR
|
|
354
|
+
cassettes in CI (no network access required). To record fresh cassettes
|
|
355
|
+
against a real Jira instance:
|
|
356
|
+
|
|
357
|
+
```bash
|
|
358
|
+
export JIRA_USER_EMAIL="<your-email>"
|
|
359
|
+
export JIRA_ADMIN_TOKEN="<your-api-token>"
|
|
360
|
+
PYTEST_VCR_MODE=record pytest tests/integration/ -v
|
|
361
|
+
```
|
|
362
|
+
|
|
363
|
+
Cassettes are stored at `tests/fixtures/vcr/*.yaml`. The VCR config in
|
|
364
|
+
`tests/integration/conftest.py` automatically strips `Authorization`
|
|
365
|
+
headers from recorded interactions. **Never commit a cassette with a
|
|
366
|
+
real token in any header.**
|
|
367
|
+
|
|
368
|
+
After recording, verify no credentials leaked:
|
|
369
|
+
|
|
370
|
+
```bash
|
|
371
|
+
grep -i 'authorization' tests/fixtures/vcr/*.yaml
|
|
372
|
+
# Expected: no output
|
|
373
|
+
```
|
|
374
|
+
|
|
265
375
|
## License
|
|
266
376
|
|
|
267
377
|
Apache-2.0
|
|
@@ -16,69 +16,101 @@ pip install -e .
|
|
|
16
16
|
- `methodology_framework/playbooks/` -- parameterized playbook bodies (package data)
|
|
17
17
|
- `methodology_framework/templates/` -- story and process templates (package data)
|
|
18
18
|
- `methodology_framework/specs/` -- format specs (package data)
|
|
19
|
-
- `methodology_framework.bootstrap_jira` --
|
|
19
|
+
- `methodology_framework.bootstrap_jira` -- verify a Jira project matches the canonical shape (read-only spec-compliance checker)
|
|
20
20
|
- `methodology_framework/jira_shapes/` -- canonical Jira shape definitions (YAML, package data)
|
|
21
21
|
|
|
22
|
-
## Jira Bootstrap
|
|
22
|
+
## Jira Bootstrap (Verify Mode)
|
|
23
23
|
|
|
24
|
-
|
|
25
|
-
|
|
24
|
+
The CLI checks whether a Jira project matches the methodology-framework's
|
|
25
|
+
canonical shape and reports gaps. It does **not** provision — operators apply
|
|
26
|
+
gaps via the Jira UI. This read-only design lets the tool run in CI as a gate.
|
|
27
|
+
|
|
28
|
+
> **v0.2.0 breaking change:** `--apply` and `--dry-run` were removed.
|
|
29
|
+
> The CLI is now a spec-compliance verifier. See `operator-verify-runbook.md`
|
|
30
|
+
> for the operator workflow.
|
|
26
31
|
|
|
27
32
|
### Prerequisites
|
|
28
33
|
|
|
29
34
|
- Python 3.12+
|
|
30
35
|
- `pip install methodology-framework` (or `pip install -e .` from source)
|
|
31
|
-
- For `--
|
|
32
|
-
|
|
33
|
-
|
|
36
|
+
- For `--verify` mode: `JIRA_ADMIN_TOKEN` environment variable set to a Jira
|
|
37
|
+
API token (admin scope is **not** required; a regular user token with read
|
|
38
|
+
access is sufficient), and `JIRA_USER_EMAIL` set to the email of the
|
|
39
|
+
Atlassian account that owns the token
|
|
34
40
|
|
|
35
41
|
### Usage
|
|
36
42
|
|
|
37
43
|
```bash
|
|
38
|
-
#
|
|
44
|
+
# Verify — query Jira and report spec-compliance gaps (read-only)
|
|
45
|
+
export JIRA_ADMIN_TOKEN="<your-token>"
|
|
46
|
+
export JIRA_USER_EMAIL="<your-email>"
|
|
39
47
|
python -m methodology_framework bootstrap-jira \
|
|
40
48
|
--project-key=MYPROJ \
|
|
41
49
|
--jira-host=myorg.atlassian.net \
|
|
42
|
-
--
|
|
50
|
+
--verify
|
|
43
51
|
|
|
44
|
-
#
|
|
52
|
+
# JSON output (stable schema — safe for CI parsing)
|
|
45
53
|
python -m methodology_framework bootstrap-jira \
|
|
46
54
|
--project-key=MYPROJ \
|
|
47
55
|
--jira-host=myorg.atlassian.net \
|
|
48
|
-
--
|
|
56
|
+
--verify --output=json
|
|
49
57
|
|
|
50
|
-
#
|
|
51
|
-
export JIRA_ADMIN_TOKEN="<your-token>"
|
|
52
|
-
export JIRA_USER_EMAIL="<your-email>"
|
|
58
|
+
# Markdown output
|
|
53
59
|
python -m methodology_framework bootstrap-jira \
|
|
54
60
|
--project-key=MYPROJ \
|
|
55
61
|
--jira-host=myorg.atlassian.net \
|
|
56
|
-
--
|
|
62
|
+
--verify --output=markdown
|
|
57
63
|
|
|
58
|
-
#
|
|
64
|
+
# Export — emit an importable config bundle (YAML); no API calls
|
|
59
65
|
python -m methodology_framework bootstrap-jira \
|
|
60
66
|
--project-key=MYPROJ \
|
|
61
67
|
--jira-host=myorg.atlassian.net \
|
|
62
|
-
--
|
|
68
|
+
--export /tmp/jira-bundle.yaml
|
|
63
69
|
```
|
|
64
70
|
|
|
71
|
+
### Exit codes
|
|
72
|
+
|
|
73
|
+
| Code | Meaning |
|
|
74
|
+
|------|---------|
|
|
75
|
+
| `0` | All spec items verified OK |
|
|
76
|
+
| `1` | One or more items missing (gaps found) |
|
|
77
|
+
| `2` | One or more items unverifiable (API limitation; operator must inspect manually) |
|
|
78
|
+
| `3` | Error (connectivity, auth, or runtime failure) |
|
|
79
|
+
|
|
65
80
|
### Flags
|
|
66
81
|
|
|
67
82
|
| Flag | Required | Description |
|
|
68
83
|
|------|----------|-------------|
|
|
69
84
|
| `--project-key` | Yes | Jira project key (e.g. `SCRUM`). Substituted for `{{PROJECT_KEY}}` in shape defs. |
|
|
70
85
|
| `--jira-host` | Yes | Jira Cloud host (e.g. `myorg.atlassian.net`). No `https://` prefix. |
|
|
71
|
-
| `--
|
|
72
|
-
| `--
|
|
73
|
-
| `--
|
|
74
|
-
| `--force` | No | Skip confirmation prompts during `--apply`. |
|
|
86
|
+
| `--verify` | No | Query Jira and report spec-compliance gaps (read-only). |
|
|
87
|
+
| `--export <path>` | No | Emit importable config bundle at `<path>`. No API calls. |
|
|
88
|
+
| `--output` | No | Output format for `--verify`: `text` (default), `json`, `markdown`. |
|
|
75
89
|
|
|
76
90
|
### Environment variables
|
|
77
91
|
|
|
78
92
|
| Variable | When needed | Description |
|
|
79
93
|
|----------|-------------|-------------|
|
|
80
|
-
| `JIRA_ADMIN_TOKEN` | `--
|
|
81
|
-
| `JIRA_USER_EMAIL` | `--
|
|
94
|
+
| `JIRA_ADMIN_TOKEN` | `--verify` mode | Jira API token. Admin scope is **not** required; a regular user token with read access is sufficient. **Never** accepted as a CLI flag. |
|
|
95
|
+
| `JIRA_USER_EMAIL` | `--verify` mode | Email of the Atlassian account that owns the API token. Used with the token for HTTP Basic auth. **Never** accepted as a CLI flag. |
|
|
96
|
+
|
|
97
|
+
### JSON output schema (v0.2.0)
|
|
98
|
+
|
|
99
|
+
```json
|
|
100
|
+
{
|
|
101
|
+
"spec_version": "0.2.0",
|
|
102
|
+
"project_key": "METH",
|
|
103
|
+
"verified_at": "2025-05-31T00:00:00Z",
|
|
104
|
+
"items": [
|
|
105
|
+
{"resource_type": "status", "name": "To Do", "result": "ok", "details": null},
|
|
106
|
+
{"resource_type": "custom_field", "name": "Story File", "result": "missing", "details": "Operator must create via Settings → Custom fields → Create"}
|
|
107
|
+
],
|
|
108
|
+
"summary": {"total": 14, "ok": 12, "missing": 1, "unverifiable": 1},
|
|
109
|
+
"exit_code": 1
|
|
110
|
+
}
|
|
111
|
+
```
|
|
112
|
+
|
|
113
|
+
Any breaking change to this schema requires a MAJOR version bump.
|
|
82
114
|
|
|
83
115
|
### Shape definitions
|
|
84
116
|
|
|
@@ -207,6 +239,45 @@ to the GitHub repo `whiteout59/methodology-framework`, workflow
|
|
|
207
239
|
`pypi-release.yml`, environment `pypi` at
|
|
208
240
|
[PyPI Trusted Publishers](https://pypi.org/manage/account/publishing/).
|
|
209
241
|
|
|
242
|
+
## Release lifecycle
|
|
243
|
+
|
|
244
|
+
Version bumps in `pyproject.toml` drive the entire release cycle
|
|
245
|
+
automatically. The operator's only decision surface is PR review.
|
|
246
|
+
|
|
247
|
+
### Normal flow
|
|
248
|
+
|
|
249
|
+
1. A PR bumps the `version` field in `pyproject.toml` (e.g. `"0.1.1"` → `"0.1.2"`).
|
|
250
|
+
2. Reviewer approves and merges the PR to `main`.
|
|
251
|
+
3. The `auto-tag.yml` workflow detects the `pyproject.toml` change, extracts the
|
|
252
|
+
version, validates it as stable SemVer (`^[0-9]+\.[0-9]+\.[0-9]+$`), and
|
|
253
|
+
creates an annotated tag `v0.1.2`.
|
|
254
|
+
4. The `pypi-release.yml` workflow fires on the new tag and publishes the
|
|
255
|
+
package to PyPI via OIDC Trusted Publishers.
|
|
256
|
+
|
|
257
|
+
**Operator surface = PR review only.** No manual `git tag` step required.
|
|
258
|
+
|
|
259
|
+
### Manual fallback
|
|
260
|
+
|
|
261
|
+
If `auto-tag.yml` doesn't fire (workflow disabled, branch protection
|
|
262
|
+
blocking the tag push, GitHub Actions outage, etc.), the manual fallback
|
|
263
|
+
still works:
|
|
264
|
+
|
|
265
|
+
```bash
|
|
266
|
+
git tag -a v0.1.2 -m "Release v0.1.2"
|
|
267
|
+
git push origin v0.1.2
|
|
268
|
+
```
|
|
269
|
+
|
|
270
|
+
`pypi-release.yml` doesn't care how the tag arrived — it fires on any
|
|
271
|
+
tag matching `v[0-9]+.[0-9]+.[0-9]+`.
|
|
272
|
+
|
|
273
|
+
### Pre-release versions
|
|
274
|
+
|
|
275
|
+
The `auto-tag.yml` workflow only tags **stable** SemVer versions. Versions
|
|
276
|
+
containing `-rc`, `-beta`, `-alpha`, `.dev`, or `.pre` suffixes (or any
|
|
277
|
+
string not matching `^[0-9]+\.[0-9]+\.[0-9]+$`) are logged and skipped.
|
|
278
|
+
Pre-release publishing is out of scope; if needed, a separate workflow
|
|
279
|
+
would handle pre-release tag patterns.
|
|
280
|
+
|
|
210
281
|
## Cost tracking via `agent_acus`
|
|
211
282
|
|
|
212
283
|
The methodology's post-execution notes include an `agent_acus` field that
|
|
@@ -241,6 +312,42 @@ ruff format --check src/methodology_framework
|
|
|
241
312
|
mypy --strict src/methodology_framework
|
|
242
313
|
```
|
|
243
314
|
|
|
315
|
+
### Shape-def expansion (v0.1.2+)
|
|
316
|
+
|
|
317
|
+
`workflow.yaml` now includes a `statusCategory` field on each status
|
|
318
|
+
(`TODO`, `IN_PROGRESS`, or `DONE`). The `--apply` handler validates
|
|
319
|
+
this field at load time and exits with a clear error if any status is
|
|
320
|
+
missing it.
|
|
321
|
+
|
|
322
|
+
`custom_fields.yaml` uses canonical shorthand types (`text`, `string`,
|
|
323
|
+
`multi-value`, `numeric`) that are mapped to fully-qualified Jira
|
|
324
|
+
identifiers at apply time. Fields may also specify a fully-qualified
|
|
325
|
+
type directly (any value containing `:` is passed through unchanged).
|
|
326
|
+
|
|
327
|
+
### Recording new VCR cassettes
|
|
328
|
+
|
|
329
|
+
Integration tests under `tests/integration/` replay pre-recorded VCR
|
|
330
|
+
cassettes in CI (no network access required). To record fresh cassettes
|
|
331
|
+
against a real Jira instance:
|
|
332
|
+
|
|
333
|
+
```bash
|
|
334
|
+
export JIRA_USER_EMAIL="<your-email>"
|
|
335
|
+
export JIRA_ADMIN_TOKEN="<your-api-token>"
|
|
336
|
+
PYTEST_VCR_MODE=record pytest tests/integration/ -v
|
|
337
|
+
```
|
|
338
|
+
|
|
339
|
+
Cassettes are stored at `tests/fixtures/vcr/*.yaml`. The VCR config in
|
|
340
|
+
`tests/integration/conftest.py` automatically strips `Authorization`
|
|
341
|
+
headers from recorded interactions. **Never commit a cassette with a
|
|
342
|
+
real token in any header.**
|
|
343
|
+
|
|
344
|
+
After recording, verify no credentials leaked:
|
|
345
|
+
|
|
346
|
+
```bash
|
|
347
|
+
grep -i 'authorization' tests/fixtures/vcr/*.yaml
|
|
348
|
+
# Expected: no output
|
|
349
|
+
```
|
|
350
|
+
|
|
244
351
|
## License
|
|
245
352
|
|
|
246
353
|
Apache-2.0
|
|
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
|
|
|
4
4
|
|
|
5
5
|
[project]
|
|
6
6
|
name = "methodology-framework"
|
|
7
|
-
version = "0.
|
|
7
|
+
version = "0.2.0"
|
|
8
8
|
description = "Portable process tooling for agent-driven delivery — scripts, playbooks, templates, and specs."
|
|
9
9
|
readme = "README.md"
|
|
10
10
|
license = "Apache-2.0"
|
|
@@ -16,6 +16,7 @@ dependencies = [
|
|
|
16
16
|
"requests>=2.31,<3",
|
|
17
17
|
"python-frontmatter>=1.1,<2",
|
|
18
18
|
"pyyaml>=6.0,<7",
|
|
19
|
+
"colorama>=0.4,<1",
|
|
19
20
|
]
|
|
20
21
|
|
|
21
22
|
[project.optional-dependencies]
|
|
@@ -26,6 +27,8 @@ dev = [
|
|
|
26
27
|
"mypy>=1.10,<2",
|
|
27
28
|
"types-requests>=2.31,<3",
|
|
28
29
|
"types-PyYAML>=6.0,<7",
|
|
30
|
+
"types-colorama>=0.4,<1",
|
|
31
|
+
"vcrpy>=7.0,<9",
|
|
29
32
|
]
|
|
30
33
|
|
|
31
34
|
[tool.setuptools.packages.find]
|