mapify-cli 3.35.1__py3-none-any.whl → 3.35.2__py3-none-any.whl

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.
mapify_cli/__init__.py CHANGED
@@ -23,7 +23,7 @@ Or install globally:
23
23
  mapify check
24
24
  """
25
25
 
26
- __version__ = "3.35.1"
26
+ __version__ = "3.35.2"
27
27
 
28
28
  # MUST stay the first import: it turns "this interpreter is older than 3.11" into
29
29
  # a message that says so, instead of the ImportError raised by `from datetime
@@ -72,7 +72,7 @@ python3 .map/scripts/map_step_runner.py record_auto_phase "<phase>" "<status>" \
72
72
  --reason "<why this status>"
73
73
  ```
74
74
 
75
- `<phase>` is the workflow name being entered/exited (`map-plan`, `map-efficient`, `map-check`, or `map-review`). `<status>` follows the phase's own vocabulary -- use `completed` on a clean phase close and `aborted`/`failed` on a phase you cannot recover; anything else leaves the chain `in_progress`. Pass every hold id that `auto_decide_holds` auto-approved for this phase in `--evidence-refs`, so the approval is recorded twice: once in the hold's own audit note, once in the phase ledger.
75
+ `<phase>` is the workflow name being entered/exited (`map-plan`, `map-efficient`, `map-check`, or `map-review`). `<status>` follows the phase's own vocabulary -- use `completed` on a clean phase close and `aborted`/`failed` on a phase you cannot recover; anything else leaves the chain `in_progress`. Phase completion and route completion are separate: a `completed` phase closes the chain only when it is the last phase of the selected route -- `map-review` for the multi-phase `map-plan` and `map-efficient` routes, or the route's only phase for the single-phase `map-resume`, `map-check`, and `map-fast` routes. Any earlier `completed` leaves the chain `in_progress` so the next phase is accepted. Pass every hold id that `auto_decide_holds` auto-approved for this phase in `--evidence-refs`, so the approval is recorded twice: once in the hold's own audit note, once in the phase ledger.
76
76
 
77
77
  **At most one re-entry per phase (HC-2):** `record_auto_phase` mechanically enforces this -- the first record of a phase name is `attempt: 1`, a re-entry is `attempt: 2`, and a third call for the SAME phase name is refused and force-aborts the chain (`chain_status: "aborted"`). Before spending the single permitted re-entry, inspect ground truth -- `git status`/`git diff` and the phase's own `step_state.json` (or equivalent phase artifacts, test output, Monitor verdict) -- to confirm the phase genuinely needs a fresh attempt rather than a partial success being misread as a failure. A second failure of the same phase means STOP and hand off to `$map-resume` -- never attempt a third call for that phase. A chain already `chain_status: "aborted"` or `"blocked"` refuses every further `record_auto_phase` call regardless of phase name; a new `route_task` call is the ONLY legitimate way to continue.
78
78
 
@@ -84,8 +84,8 @@ Once routed, drive the selected chain by invoking the existing slash workflows e
84
84
  route_task -> [map-plan] -> [map-efficient] -> [map-check] -> [map-review]
85
85
  ```
86
86
 
87
- - `map-resume`, `map-check`, and `map-fast` routes are single-phase: run the one workflow, record its result with `record_auto_phase`, and finish.
88
- - `map-plan` and `map-efficient` routes continue the chain: `map-plan` produces the task plan that `map-efficient` consumes, `map-efficient` implements it, and the chain then continues to `map-check` and `map-review` to close the loop.
87
+ - `map-resume`, `map-check`, and `map-fast` routes are single-phase: run the one workflow, record its result with `record_auto_phase`, and finish -- the route's only phase closes the chain.
88
+ - `map-plan` and `map-efficient` routes continue the chain: `map-plan` produces the task plan that `map-efficient` consumes, `map-efficient` implements it, and the chain then continues to `map-check` and `map-review` to close the loop. The route stays `chain_status: in_progress` after each intermediate phase completes and closes only when `map-review` completes.
89
89
  - Invoke each phase by reading and following its own `SKILL.md` in full, exactly as if the user had typed the corresponding slash command -- do not summarize, skip, or reimplement its internal steps. `$map-auto` never shells out to a separate Claude process, a new Python execution engine, or any other new phase-driving mechanism to do this -- phases are driven ONLY by invoking the existing slash workflows above and the three runner subcommands from Steps 1-3.
90
90
  - A `valid=false` Monitor verdict INSIDE a phase is that phase's own hard stop: its owning workflow's existing retry/escalation rules apply unchanged. `$map-auto` never overrides, suppresses, or re-runs past a Monitor rejection on the phase's behalf -- a phase that cannot get past Monitor is a failed phase for the purposes of Step 3's re-entry bound.
91
91
  - The autopilot run ends at a committed feature branch. `$map-auto` never opens a pull request, never merges, and never polls CI -- report the committed branch, the phases recorded, and stop.
@@ -15,7 +15,7 @@ python3 .map/scripts/map_step_runner.py record_auto_phase <phase> <status> [--br
15
15
 
16
16
  - `route_task <task>` -- `<task>` is the free-text task description (quote it). `--branch` defaults to the current branch. `--dry-run` recommends a route without marking the chain `in_progress` (see Dry-run usage below).
17
17
  - `auto_decide_holds` -- no positional arguments; only `--branch` (defaults to current branch).
18
- - `record_auto_phase <phase> <status>` -- `<phase>` is the workflow name (`map-plan`, `map-efficient`, `map-check`, `map-review`); `<status>` is the phase's own outcome word (`completed`, `failed`, `aborted`, or any other phase-specific status, which leaves `chain_status` at `in_progress`). `--evidence-refs` takes a comma-separated list of ids (auto-approved hold ids from the surrounding `auto_decide_holds` calls); `--reason` is a free-text note stored on the ledger entry.
18
+ - `record_auto_phase <phase> <status>` -- `<phase>` is the workflow name (`map-plan`, `map-efficient`, `map-check`, `map-review`); `<status>` is the phase's own outcome word (`completed`, `failed`, `aborted`, or any other phase-specific status, which leaves `chain_status` at `in_progress`). A `completed` status closes the chain (`chain_status: "completed"`) only on the LAST phase of the selected route -- `map-review` for multi-phase `map-plan`/`map-efficient` routes, or the single phase of `map-resume`/`map-check`/`map-fast`; a `completed` intermediate phase keeps the chain `in_progress`. `--evidence-refs` takes a comma-separated list of ids (auto-approved hold ids from the surrounding `auto_decide_holds` calls); `--reason` is a free-text note stored on the ledger entry.
19
19
 
20
20
  ## Chain Walkthrough Example
21
21
 
@@ -35,10 +35,12 @@ $ python3 .map/scripts/map_step_runner.py auto_decide_holds
35
35
 
36
36
  $ python3 .map/scripts/map_step_runner.py record_auto_phase "map-efficient" "completed" \
37
37
  --evidence-refs "hold-1" --reason "all subtasks closed, make check green"
38
- {"status": "success", "chain_status": "completed", "phase": "map-efficient", "attempt": 1, ...}
38
+ {"status": "success", "chain_status": "in_progress", "phase": "map-efficient", "attempt": 1, ...}
39
39
 
40
- # -- chain then continues to map-check, then map-review, each following the same
41
- # poll -> drive -> poll -> record loop, until the last phase records "completed" --
40
+ # -- map-efficient is not the last phase of this route: the chain stays
41
+ # in_progress and continues to map-check, then map-review, each following the
42
+ # same poll -> drive -> poll -> record loop. Only map-review completing closes
43
+ # the route (chain_status: "completed") --
42
44
  ```
43
45
 
44
46
  The run ends there: a committed feature branch, `phases[]` in `auto-route.json` holding one entry per phase attempt, and no PR/merge/CI step of any kind.
@@ -71,7 +71,7 @@ Execute all 12 gates. Read the full gate scripts in [release-reference.md § Pha
71
71
  **Gate summary (full commands in reference):**
72
72
  - **Gates 1–4:** `make check` — tests, ruff, mypy, pyright, rendered-template parity
73
73
  - **Gates 5–6:** Build + twine check
74
- - **Gate 7:** Security audit (`pip-audit`)
74
+ - **Gate 7:** Security audit of the project's resolved requirements (`uv export` + `pip-audit -r`)
75
75
  - **Gates 8–10:** Git state — main branch, clean working directory, up-to-date with origin
76
76
  - **Gate 11:** CI run for `git merge-base HEAD origin/main` must have `conclusion: "success"`; unpushed commits may touch only release metadata
77
77
  - **Gate 12:** CHANGELOG.md completeness (Unreleased section exists and has content; commit/entry gap check)
@@ -35,11 +35,20 @@ uv run --with twine twine check dist/*
35
35
  ### Gate 7: Security Audit
36
36
 
37
37
  ```bash
38
- pip install pip-audit
39
- pip-audit
38
+ set -euo pipefail
39
+ # Audit the project's resolved dependency set, not the runner interpreter.
40
+ REQS_FILE=$(mktemp "${TMPDIR:-/tmp}/mapify-release-reqs.XXXXXX")
41
+ trap 'rm -f "$REQS_FILE"' EXIT
42
+ uv export --all-extras --all-groups --no-hashes --no-emit-project \
43
+ --format requirements-txt > "$REQS_FILE"
44
+ # --no-deps audits exactly the exported pins; --disable-pip stops pip from
45
+ # resolving or mutating the runner environment.
46
+ uvx pip-audit -r "$REQS_FILE" --disable-pip --no-deps
40
47
  ```
41
48
 
42
49
  **Expected Results:**
50
+ - ✅ `uv export` resolves the project's dependencies (all extras and groups)
51
+ - ✅ `pip-audit` audits the exported pinned requirements, not the runner environment
43
52
  - ✅ No known security vulnerabilities in dependencies
44
53
 
45
54
  **If vulnerabilities found:** Assess severity; update dependencies if critical.
@@ -20216,20 +20216,51 @@ _AUTO_ROUTE_NEXT_COMMAND: dict[str, str] = {
20216
20216
 
20217
20217
  # /map-auto phase ledger (issue #414): closed status vocabulary for
20218
20218
  # record_auto_phase's chain_status transitions. A phase status in
20219
- # AUTO_PHASE_TERMINAL_SUCCESS_STATUSES completes the chain; a status in
20220
- # AUTO_PHASE_ABORT_STATUSES aborts it; any other status leaves the chain
20221
- # in_progress. These two sets are intentionally NOT required to partition
20222
- # every possible status string -- callers may pass phase-specific statuses
20223
- # (e.g. "monitor_rejected") that fall through to in_progress.
20219
+ # AUTO_PHASE_TERMINAL_SUCCESS_STATUSES completes the ROUTE only when that
20220
+ # phase is the last phase of the routed chain (see AUTO_ROUTE_PHASE_CHAINS); a
20221
+ # status in AUTO_PHASE_ABORT_STATUSES aborts the chain; any other status
20222
+ # leaves the chain in_progress. These two sets are intentionally NOT required
20223
+ # to partition every possible status string -- callers may pass phase-specific
20224
+ # statuses (e.g. "monitor_rejected") that fall through to in_progress.
20224
20225
  AUTO_PHASE_TERMINAL_SUCCESS_STATUSES = frozenset({"completed"})
20225
20226
  AUTO_PHASE_ABORT_STATUSES = frozenset({"aborted", "failed"})
20226
20227
 
20228
+ # /map-auto routed phase chains (issue #621): phase completion and route
20229
+ # completion are separate. A route reaches chain_status="completed" only when
20230
+ # the completed phase is the LAST phase of the chain its selected_route drives.
20231
+ # map-resume, map-check and map-fast are single-phase routes; map-plan and
20232
+ # map-efficient are multi-phase routes that continue through map-check and
20233
+ # close on map-review. Keeping the table beside the terminal-status vocabulary
20234
+ # makes the route/phase split explicit instead of inferring "completed" from
20235
+ # the phase status alone (the #446 regression).
20236
+ AUTO_ROUTE_PHASE_CHAINS: dict[str, tuple[str, ...]] = {
20237
+ "map-resume": ("map-resume",),
20238
+ "map-check": ("map-check",),
20239
+ "map-fast": ("map-fast",),
20240
+ "map-plan": ("map-plan", "map-efficient", "map-check", "map-review"),
20241
+ "map-efficient": ("map-efficient", "map-check", "map-review"),
20242
+ }
20243
+
20227
20244
  # Chain-level retry bound: at most ONE re-entry per phase -- attempt 1
20228
20245
  # (first record) plus attempt 2 (the single permitted re-entry) are allowed;
20229
20246
  # a 3rd record of the same phase name is refused by record_auto_phase.
20230
20247
  AUTO_PHASE_MAX_ATTEMPTS = 2
20231
20248
 
20232
20249
 
20250
+ def _auto_route_final_phase(route: object) -> str | None:
20251
+ """Return the last phase of `route`'s chain, or None for an unknown route.
20252
+
20253
+ record_auto_phase uses this to keep "this phase completed" and "the whole
20254
+ route completed" separate (issue #621). A missing or unrecognized route
20255
+ fails closed (returns None), so an unknown route can never be treated as
20256
+ completed by a phase record.
20257
+ """
20258
+ if not isinstance(route, str):
20259
+ return None
20260
+ chain = AUTO_ROUTE_PHASE_CHAINS.get(route)
20261
+ return chain[-1] if chain else None
20262
+
20263
+
20233
20264
  def auto_route_artifact_path(branch: str | None = None) -> Path:
20234
20265
  """Return the branch-scoped /map-auto routing decision artifact path."""
20235
20266
  return get_branch_dir(branch) / "auto-route.json"
@@ -20447,11 +20478,16 @@ def record_auto_phase(
20447
20478
 
20448
20479
  On every non-refused call, chain_status transitions from the recorded
20449
20480
  `status` using a closed vocabulary (AUTO_PHASE_TERMINAL_SUCCESS_STATUSES
20450
- -> "completed", AUTO_PHASE_ABORT_STATUSES -> "aborted", otherwise
20451
- "in_progress") and the `abort_reason` field is set/cleared to match. The
20452
- `auto_route` manifest stage is refreshed on every call (refused or not)
20453
- so progress is observable outside the artifact, with its status
20454
- mirroring the resulting chain_status.
20481
+ -> "completed" when the phase is the LAST phase of the route's chain,
20482
+ AUTO_PHASE_ABORT_STATUSES -> "aborted", otherwise "in_progress") and the
20483
+ `abort_reason` field is set/cleared to match. Phase completion and route
20484
+ completion are separate: a multi-phase route (map-plan, map-efficient)
20485
+ stays "in_progress" after map-plan/map-efficient/map-check completes and
20486
+ closes only on map-review; a single-phase route (map-resume, map-check,
20487
+ map-fast) closes on its only phase. AUTO_ROUTE_PHASE_CHAINS is the single
20488
+ source for each route's ordered chain. The `auto_route` manifest stage is
20489
+ refreshed on every call (refused or not) so progress is observable outside
20490
+ the artifact, with its status mirroring the resulting chain_status.
20455
20491
 
20456
20492
  `evidence_refs` persists caller-supplied ids (e.g. hold ids
20457
20493
  auto-approved by `auto_decide_holds`) in the phase entry, giving every
@@ -20562,7 +20598,14 @@ def record_auto_phase(
20562
20598
  artifact["phases"] = phases
20563
20599
 
20564
20600
  if status in AUTO_PHASE_TERMINAL_SUCCESS_STATUSES:
20565
- chain_status = "completed"
20601
+ # Issue #621: a phase completing is not the route completing. Only the
20602
+ # LAST phase of the routed chain closes chain_status; earlier completed
20603
+ # phases keep the chain in_progress so the next phase is accepted
20604
+ # instead of being refused by the terminal-chain guard below.
20605
+ if phase == _auto_route_final_phase(artifact.get("selected_route")):
20606
+ chain_status = "completed"
20607
+ else:
20608
+ chain_status = "in_progress"
20566
20609
  elif status in AUTO_PHASE_ABORT_STATUSES:
20567
20610
  chain_status = "aborted"
20568
20611
  else:
@@ -74,7 +74,7 @@ python3 .map/scripts/map_step_runner.py record_auto_phase "<phase>" "<status>" \
74
74
  --reason "<why this status>"
75
75
  ```
76
76
 
77
- `<phase>` is the workflow name being entered/exited (`map-plan`, `map-efficient`, `map-check`, or `map-review`). `<status>` follows the phase's own vocabulary -- use `completed` on a clean phase close and `aborted`/`failed` on a phase you cannot recover; anything else leaves the chain `in_progress`. Pass every hold id that `auto_decide_holds` auto-approved for this phase in `--evidence-refs`, so the approval is recorded twice: once in the hold's own audit note, once in the phase ledger.
77
+ `<phase>` is the workflow name being entered/exited (`map-plan`, `map-efficient`, `map-check`, or `map-review`). `<status>` follows the phase's own vocabulary -- use `completed` on a clean phase close and `aborted`/`failed` on a phase you cannot recover; anything else leaves the chain `in_progress`. Phase completion and route completion are separate: a `completed` phase closes the chain only when it is the last phase of the selected route -- `map-review` for the multi-phase `map-plan` and `map-efficient` routes, or the route's only phase for the single-phase `map-resume`, `map-check`, and `map-fast` routes. Any earlier `completed` leaves the chain `in_progress` so the next phase is accepted. Pass every hold id that `auto_decide_holds` auto-approved for this phase in `--evidence-refs`, so the approval is recorded twice: once in the hold's own audit note, once in the phase ledger.
78
78
 
79
79
  **At most one re-entry per phase (HC-2):** `record_auto_phase` mechanically enforces this -- the first record of a phase name is `attempt: 1`, a re-entry is `attempt: 2`, and a third call for the SAME phase name is refused and force-aborts the chain (`chain_status: "aborted"`). Before spending the single permitted re-entry, inspect ground truth -- `git status`/`git diff` and the phase's own `step_state.json` (or equivalent phase artifacts, test output, Monitor verdict) -- to confirm the phase genuinely needs a fresh attempt rather than a partial success being misread as a failure. A second failure of the same phase means STOP and hand off to `/map-resume` -- never attempt a third call for that phase. A chain already `chain_status: "aborted"` or `"blocked"` refuses every further `record_auto_phase` call regardless of phase name; a new `route_task` call is the ONLY legitimate way to continue.
80
80
 
@@ -86,8 +86,8 @@ Once routed, drive the selected chain by invoking the existing slash workflows e
86
86
  route_task -> [map-plan] -> [map-efficient] -> [map-check] -> [map-review]
87
87
  ```
88
88
 
89
- - `map-resume`, `map-check`, and `map-fast` routes are single-phase: run the one workflow, record its result with `record_auto_phase`, and finish.
90
- - `map-plan` and `map-efficient` routes continue the chain: `map-plan` produces the task plan that `map-efficient` consumes, `map-efficient` implements it, and the chain then continues to `map-check` and `map-review` to close the loop.
89
+ - `map-resume`, `map-check`, and `map-fast` routes are single-phase: run the one workflow, record its result with `record_auto_phase`, and finish -- the route's only phase closes the chain.
90
+ - `map-plan` and `map-efficient` routes continue the chain: `map-plan` produces the task plan that `map-efficient` consumes, `map-efficient` implements it, and the chain then continues to `map-check` and `map-review` to close the loop. The route stays `chain_status: in_progress` after each intermediate phase completes and closes only when `map-review` completes.
91
91
  - Invoke each phase by reading and following its own `SKILL.md` in full, exactly as if the user had typed the corresponding slash command -- do not summarize, skip, or reimplement its internal steps. `/map-auto` never shells out to a separate Claude process, a new Python execution engine, or any other new phase-driving mechanism to do this -- phases are driven ONLY by invoking the existing slash workflows above and the three runner subcommands from Steps 1-3.
92
92
  - A `valid=false` Monitor verdict INSIDE a phase is that phase's own hard stop: its owning workflow's existing retry/escalation rules apply unchanged. `/map-auto` never overrides, suppresses, or re-runs past a Monitor rejection on the phase's behalf -- a phase that cannot get past Monitor is a failed phase for the purposes of Step 3's re-entry bound.
93
93
  - The autopilot run ends at a committed feature branch. `/map-auto` never opens a pull request, never merges, and never polls CI -- report the committed branch, the phases recorded, and stop.
@@ -15,7 +15,7 @@ python3 .map/scripts/map_step_runner.py record_auto_phase <phase> <status> [--br
15
15
 
16
16
  - `route_task <task>` -- `<task>` is the free-text task description (quote it). `--branch` defaults to the current branch. `--dry-run` recommends a route without marking the chain `in_progress` (see Dry-run usage below).
17
17
  - `auto_decide_holds` -- no positional arguments; only `--branch` (defaults to current branch).
18
- - `record_auto_phase <phase> <status>` -- `<phase>` is the workflow name (`map-plan`, `map-efficient`, `map-check`, `map-review`); `<status>` is the phase's own outcome word (`completed`, `failed`, `aborted`, or any other phase-specific status, which leaves `chain_status` at `in_progress`). `--evidence-refs` takes a comma-separated list of ids (auto-approved hold ids from the surrounding `auto_decide_holds` calls); `--reason` is a free-text note stored on the ledger entry.
18
+ - `record_auto_phase <phase> <status>` -- `<phase>` is the workflow name (`map-plan`, `map-efficient`, `map-check`, `map-review`); `<status>` is the phase's own outcome word (`completed`, `failed`, `aborted`, or any other phase-specific status, which leaves `chain_status` at `in_progress`). A `completed` status closes the chain (`chain_status: "completed"`) only on the LAST phase of the selected route -- `map-review` for multi-phase `map-plan`/`map-efficient` routes, or the single phase of `map-resume`/`map-check`/`map-fast`; a `completed` intermediate phase keeps the chain `in_progress`. `--evidence-refs` takes a comma-separated list of ids (auto-approved hold ids from the surrounding `auto_decide_holds` calls); `--reason` is a free-text note stored on the ledger entry.
19
19
 
20
20
  ## Chain Walkthrough Example
21
21
 
@@ -35,10 +35,12 @@ $ python3 .map/scripts/map_step_runner.py auto_decide_holds
35
35
 
36
36
  $ python3 .map/scripts/map_step_runner.py record_auto_phase "map-efficient" "completed" \
37
37
  --evidence-refs "hold-1" --reason "all subtasks closed, make check green"
38
- {"status": "success", "chain_status": "completed", "phase": "map-efficient", "attempt": 1, ...}
38
+ {"status": "success", "chain_status": "in_progress", "phase": "map-efficient", "attempt": 1, ...}
39
39
 
40
- # -- chain then continues to map-check, then map-review, each following the same
41
- # poll -> drive -> poll -> record loop, until the last phase records "completed" --
40
+ # -- map-efficient is not the last phase of this route: the chain stays
41
+ # in_progress and continues to map-check, then map-review, each following the
42
+ # same poll -> drive -> poll -> record loop. Only map-review completing closes
43
+ # the route (chain_status: "completed") --
42
44
  ```
43
45
 
44
46
  The run ends there: a committed feature branch, `phases[]` in `auto-route.json` holding one entry per phase attempt, and no PR/merge/CI step of any kind.
@@ -74,7 +74,7 @@ Execute all 12 gates. Read the full gate scripts in [release-reference.md § Pha
74
74
  **Gate summary (full commands in reference):**
75
75
  - **Gates 1–4:** `make check` — tests, ruff, mypy, pyright, rendered-template parity
76
76
  - **Gates 5–6:** Build + twine check
77
- - **Gate 7:** Security audit (`pip-audit`)
77
+ - **Gate 7:** Security audit of the project's resolved requirements (`uv export` + `pip-audit -r`)
78
78
  - **Gates 8–10:** Git state — main branch, clean working directory, up-to-date with origin
79
79
  - **Gate 11:** CI run for `git merge-base HEAD origin/main` must have `conclusion: "success"`; unpushed commits may touch only release metadata
80
80
  - **Gate 12:** CHANGELOG.md completeness (Unreleased section exists and has content; commit/entry gap check)
@@ -35,11 +35,20 @@ uv run --with twine twine check dist/*
35
35
  ### Gate 7: Security Audit
36
36
 
37
37
  ```bash
38
- pip install pip-audit
39
- pip-audit
38
+ set -euo pipefail
39
+ # Audit the project's resolved dependency set, not the runner interpreter.
40
+ REQS_FILE=$(mktemp "${TMPDIR:-/tmp}/mapify-release-reqs.XXXXXX")
41
+ trap 'rm -f "$REQS_FILE"' EXIT
42
+ uv export --all-extras --all-groups --no-hashes --no-emit-project \
43
+ --format requirements-txt > "$REQS_FILE"
44
+ # --no-deps audits exactly the exported pins; --disable-pip stops pip from
45
+ # resolving or mutating the runner environment.
46
+ uvx pip-audit -r "$REQS_FILE" --disable-pip --no-deps
40
47
  ```
41
48
 
42
49
  **Expected Results:**
50
+ - ✅ `uv export` resolves the project's dependencies (all extras and groups)
51
+ - ✅ `pip-audit` audits the exported pinned requirements, not the runner environment
43
52
  - ✅ No known security vulnerabilities in dependencies
44
53
 
45
54
  **If vulnerabilities found:** Assess severity; update dependencies if critical.
@@ -19586,20 +19586,51 @@ _AUTO_ROUTE_NEXT_COMMAND: dict[str, str] = {
19586
19586
 
19587
19587
  # /map-auto phase ledger (issue #414): closed status vocabulary for
19588
19588
  # record_auto_phase's chain_status transitions. A phase status in
19589
- # AUTO_PHASE_TERMINAL_SUCCESS_STATUSES completes the chain; a status in
19590
- # AUTO_PHASE_ABORT_STATUSES aborts it; any other status leaves the chain
19591
- # in_progress. These two sets are intentionally NOT required to partition
19592
- # every possible status string -- callers may pass phase-specific statuses
19593
- # (e.g. "monitor_rejected") that fall through to in_progress.
19589
+ # AUTO_PHASE_TERMINAL_SUCCESS_STATUSES completes the ROUTE only when that
19590
+ # phase is the last phase of the routed chain (see AUTO_ROUTE_PHASE_CHAINS); a
19591
+ # status in AUTO_PHASE_ABORT_STATUSES aborts the chain; any other status
19592
+ # leaves the chain in_progress. These two sets are intentionally NOT required
19593
+ # to partition every possible status string -- callers may pass phase-specific
19594
+ # statuses (e.g. "monitor_rejected") that fall through to in_progress.
19594
19595
  AUTO_PHASE_TERMINAL_SUCCESS_STATUSES = frozenset({"completed"})
19595
19596
  AUTO_PHASE_ABORT_STATUSES = frozenset({"aborted", "failed"})
19596
19597
 
19598
+ # /map-auto routed phase chains (issue #621): phase completion and route
19599
+ # completion are separate. A route reaches chain_status="completed" only when
19600
+ # the completed phase is the LAST phase of the chain its selected_route drives.
19601
+ # map-resume, map-check and map-fast are single-phase routes; map-plan and
19602
+ # map-efficient are multi-phase routes that continue through map-check and
19603
+ # close on map-review. Keeping the table beside the terminal-status vocabulary
19604
+ # makes the route/phase split explicit instead of inferring "completed" from
19605
+ # the phase status alone (the #446 regression).
19606
+ AUTO_ROUTE_PHASE_CHAINS: dict[str, tuple[str, ...]] = {
19607
+ "map-resume": ("map-resume",),
19608
+ "map-check": ("map-check",),
19609
+ "map-fast": ("map-fast",),
19610
+ "map-plan": ("map-plan", "map-efficient", "map-check", "map-review"),
19611
+ "map-efficient": ("map-efficient", "map-check", "map-review"),
19612
+ }
19613
+
19597
19614
  # Chain-level retry bound: at most ONE re-entry per phase -- attempt 1
19598
19615
  # (first record) plus attempt 2 (the single permitted re-entry) are allowed;
19599
19616
  # a 3rd record of the same phase name is refused by record_auto_phase.
19600
19617
  AUTO_PHASE_MAX_ATTEMPTS = 2
19601
19618
 
19602
19619
 
19620
+ def _auto_route_final_phase(route: object) -> str | None:
19621
+ """Return the last phase of `route`'s chain, or None for an unknown route.
19622
+
19623
+ record_auto_phase uses this to keep "this phase completed" and "the whole
19624
+ route completed" separate (issue #621). A missing or unrecognized route
19625
+ fails closed (returns None), so an unknown route can never be treated as
19626
+ completed by a phase record.
19627
+ """
19628
+ if not isinstance(route, str):
19629
+ return None
19630
+ chain = AUTO_ROUTE_PHASE_CHAINS.get(route)
19631
+ return chain[-1] if chain else None
19632
+
19633
+
19603
19634
  def auto_route_artifact_path(branch: str | None = None) -> Path:
19604
19635
  """Return the branch-scoped /map-auto routing decision artifact path."""
19605
19636
  return get_branch_dir(branch) / "auto-route.json"
@@ -19817,11 +19848,16 @@ def record_auto_phase(
19817
19848
 
19818
19849
  On every non-refused call, chain_status transitions from the recorded
19819
19850
  `status` using a closed vocabulary (AUTO_PHASE_TERMINAL_SUCCESS_STATUSES
19820
- -> "completed", AUTO_PHASE_ABORT_STATUSES -> "aborted", otherwise
19821
- "in_progress") and the `abort_reason` field is set/cleared to match. The
19822
- `auto_route` manifest stage is refreshed on every call (refused or not)
19823
- so progress is observable outside the artifact, with its status
19824
- mirroring the resulting chain_status.
19851
+ -> "completed" when the phase is the LAST phase of the route's chain,
19852
+ AUTO_PHASE_ABORT_STATUSES -> "aborted", otherwise "in_progress") and the
19853
+ `abort_reason` field is set/cleared to match. Phase completion and route
19854
+ completion are separate: a multi-phase route (map-plan, map-efficient)
19855
+ stays "in_progress" after map-plan/map-efficient/map-check completes and
19856
+ closes only on map-review; a single-phase route (map-resume, map-check,
19857
+ map-fast) closes on its only phase. AUTO_ROUTE_PHASE_CHAINS is the single
19858
+ source for each route's ordered chain. The `auto_route` manifest stage is
19859
+ refreshed on every call (refused or not) so progress is observable outside
19860
+ the artifact, with its status mirroring the resulting chain_status.
19825
19861
 
19826
19862
  `evidence_refs` persists caller-supplied ids (e.g. hold ids
19827
19863
  auto-approved by `auto_decide_holds`) in the phase entry, giving every
@@ -19932,7 +19968,14 @@ def record_auto_phase(
19932
19968
  artifact["phases"] = phases
19933
19969
 
19934
19970
  if status in AUTO_PHASE_TERMINAL_SUCCESS_STATUSES:
19935
- chain_status = "completed"
19971
+ # Issue #621: a phase completing is not the route completing. Only the
19972
+ # LAST phase of the routed chain closes chain_status; earlier completed
19973
+ # phases keep the chain in_progress so the next phase is accepted
19974
+ # instead of being refused by the terminal-chain guard below.
19975
+ if phase == _auto_route_final_phase(artifact.get("selected_route")):
19976
+ chain_status = "completed"
19977
+ else:
19978
+ chain_status = "in_progress"
19936
19979
  elif status in AUTO_PHASE_ABORT_STATUSES:
19937
19980
  chain_status = "aborted"
19938
19981
  else:
@@ -72,7 +72,7 @@ python3 .map/scripts/map_step_runner.py record_auto_phase "<phase>" "<status>" \
72
72
  --reason "<why this status>"
73
73
  ```
74
74
 
75
- `<phase>` is the workflow name being entered/exited (`map-plan`, `map-efficient`, `map-check`, or `map-review`). `<status>` follows the phase's own vocabulary -- use `completed` on a clean phase close and `aborted`/`failed` on a phase you cannot recover; anything else leaves the chain `in_progress`. Pass every hold id that `auto_decide_holds` auto-approved for this phase in `--evidence-refs`, so the approval is recorded twice: once in the hold's own audit note, once in the phase ledger.
75
+ `<phase>` is the workflow name being entered/exited (`map-plan`, `map-efficient`, `map-check`, or `map-review`). `<status>` follows the phase's own vocabulary -- use `completed` on a clean phase close and `aborted`/`failed` on a phase you cannot recover; anything else leaves the chain `in_progress`. Phase completion and route completion are separate: a `completed` phase closes the chain only when it is the last phase of the selected route -- `map-review` for the multi-phase `map-plan` and `map-efficient` routes, or the route's only phase for the single-phase `map-resume`, `map-check`, and `map-fast` routes. Any earlier `completed` leaves the chain `in_progress` so the next phase is accepted. Pass every hold id that `auto_decide_holds` auto-approved for this phase in `--evidence-refs`, so the approval is recorded twice: once in the hold's own audit note, once in the phase ledger.
76
76
 
77
77
  **At most one re-entry per phase (HC-2):** `record_auto_phase` mechanically enforces this -- the first record of a phase name is `attempt: 1`, a re-entry is `attempt: 2`, and a third call for the SAME phase name is refused and force-aborts the chain (`chain_status: "aborted"`). Before spending the single permitted re-entry, inspect ground truth -- `git status`/`git diff` and the phase's own `step_state.json` (or equivalent phase artifacts, test output, Monitor verdict) -- to confirm the phase genuinely needs a fresh attempt rather than a partial success being misread as a failure. A second failure of the same phase means STOP and hand off to `<% cmd %>map-resume` -- never attempt a third call for that phase. A chain already `chain_status: "aborted"` or `"blocked"` refuses every further `record_auto_phase` call regardless of phase name; a new `route_task` call is the ONLY legitimate way to continue.
78
78
 
@@ -84,8 +84,8 @@ Once routed, drive the selected chain by invoking the existing slash workflows e
84
84
  route_task -> [map-plan] -> [map-efficient] -> [map-check] -> [map-review]
85
85
  ```
86
86
 
87
- - `map-resume`, `map-check`, and `map-fast` routes are single-phase: run the one workflow, record its result with `record_auto_phase`, and finish.
88
- - `map-plan` and `map-efficient` routes continue the chain: `map-plan` produces the task plan that `map-efficient` consumes, `map-efficient` implements it, and the chain then continues to `map-check` and `map-review` to close the loop.
87
+ - `map-resume`, `map-check`, and `map-fast` routes are single-phase: run the one workflow, record its result with `record_auto_phase`, and finish -- the route's only phase closes the chain.
88
+ - `map-plan` and `map-efficient` routes continue the chain: `map-plan` produces the task plan that `map-efficient` consumes, `map-efficient` implements it, and the chain then continues to `map-check` and `map-review` to close the loop. The route stays `chain_status: in_progress` after each intermediate phase completes and closes only when `map-review` completes.
89
89
  - Invoke each phase by reading and following its own `SKILL.md` in full, exactly as if the user had typed the corresponding slash command -- do not summarize, skip, or reimplement its internal steps. `<% cmd %>map-auto` never shells out to a separate Claude process, a new Python execution engine, or any other new phase-driving mechanism to do this -- phases are driven ONLY by invoking the existing slash workflows above and the three runner subcommands from Steps 1-3.
90
90
  - A `valid=false` Monitor verdict INSIDE a phase is that phase's own hard stop: its owning workflow's existing retry/escalation rules apply unchanged. `<% cmd %>map-auto` never overrides, suppresses, or re-runs past a Monitor rejection on the phase's behalf -- a phase that cannot get past Monitor is a failed phase for the purposes of Step 3's re-entry bound.
91
91
  - The autopilot run ends at a committed feature branch. `<% cmd %>map-auto` never opens a pull request, never merges, and never polls CI -- report the committed branch, the phases recorded, and stop.
@@ -16,7 +16,7 @@ python3 .map/scripts/map_step_runner.py record_auto_phase <phase> <status> [--br
16
16
 
17
17
  - `route_task <task>` -- `<task>` is the free-text task description (quote it). `--branch` defaults to the current branch. `--dry-run` recommends a route without marking the chain `in_progress` (see Dry-run usage below).
18
18
  - `auto_decide_holds` -- no positional arguments; only `--branch` (defaults to current branch).
19
- - `record_auto_phase <phase> <status>` -- `<phase>` is the workflow name (`map-plan`, `map-efficient`, `map-check`, `map-review`); `<status>` is the phase's own outcome word (`completed`, `failed`, `aborted`, or any other phase-specific status, which leaves `chain_status` at `in_progress`). `--evidence-refs` takes a comma-separated list of ids (auto-approved hold ids from the surrounding `auto_decide_holds` calls); `--reason` is a free-text note stored on the ledger entry.
19
+ - `record_auto_phase <phase> <status>` -- `<phase>` is the workflow name (`map-plan`, `map-efficient`, `map-check`, `map-review`); `<status>` is the phase's own outcome word (`completed`, `failed`, `aborted`, or any other phase-specific status, which leaves `chain_status` at `in_progress`). A `completed` status closes the chain (`chain_status: "completed"`) only on the LAST phase of the selected route -- `map-review` for multi-phase `map-plan`/`map-efficient` routes, or the single phase of `map-resume`/`map-check`/`map-fast`; a `completed` intermediate phase keeps the chain `in_progress`. `--evidence-refs` takes a comma-separated list of ids (auto-approved hold ids from the surrounding `auto_decide_holds` calls); `--reason` is a free-text note stored on the ledger entry.
20
20
 
21
21
  ## Chain Walkthrough Example
22
22
 
@@ -36,10 +36,12 @@ $ python3 .map/scripts/map_step_runner.py auto_decide_holds
36
36
 
37
37
  $ python3 .map/scripts/map_step_runner.py record_auto_phase "map-efficient" "completed" \
38
38
  --evidence-refs "hold-1" --reason "all subtasks closed, make check green"
39
- {"status": "success", "chain_status": "completed", "phase": "map-efficient", "attempt": 1, ...}
39
+ {"status": "success", "chain_status": "in_progress", "phase": "map-efficient", "attempt": 1, ...}
40
40
 
41
- # -- chain then continues to map-check, then map-review, each following the same
42
- # poll -> drive -> poll -> record loop, until the last phase records "completed" --
41
+ # -- map-efficient is not the last phase of this route: the chain stays
42
+ # in_progress and continues to map-check, then map-review, each following the
43
+ # same poll -> drive -> poll -> record loop. Only map-review completing closes
44
+ # the route (chain_status: "completed") --
43
45
  ```
44
46
 
45
47
  The run ends there: a committed feature branch, `phases[]` in `auto-route.json` holding one entry per phase attempt, and no PR/merge/CI step of any kind.
@@ -72,7 +72,7 @@ Execute all 12 gates. Read the full gate scripts in [release-reference.md § Pha
72
72
  **Gate summary (full commands in reference):**
73
73
  - **Gates 1–4:** `make check` — tests, ruff, mypy, pyright, rendered-template parity
74
74
  - **Gates 5–6:** Build + twine check
75
- - **Gate 7:** Security audit (`pip-audit`)
75
+ - **Gate 7:** Security audit of the project's resolved requirements (`uv export` + `pip-audit -r`)
76
76
  - **Gates 8–10:** Git state — main branch, clean working directory, up-to-date with origin
77
77
  - **Gate 11:** CI run for `git merge-base HEAD origin/main` must have `conclusion: "success"`; unpushed commits may touch only release metadata
78
78
  - **Gate 12:** CHANGELOG.md completeness (Unreleased section exists and has content; commit/entry gap check)
@@ -36,11 +36,20 @@ uv run --with twine twine check dist/*
36
36
  ### Gate 7: Security Audit
37
37
 
38
38
  ```bash
39
- pip install pip-audit
40
- pip-audit
39
+ set -euo pipefail
40
+ # Audit the project's resolved dependency set, not the runner interpreter.
41
+ REQS_FILE=$(mktemp "${TMPDIR:-/tmp}/mapify-release-reqs.XXXXXX")
42
+ trap 'rm -f "$REQS_FILE"' EXIT
43
+ uv export --all-extras --all-groups --no-hashes --no-emit-project \
44
+ --format requirements-txt > "$REQS_FILE"
45
+ # --no-deps audits exactly the exported pins; --disable-pip stops pip from
46
+ # resolving or mutating the runner environment.
47
+ uvx pip-audit -r "$REQS_FILE" --disable-pip --no-deps
41
48
  ```
42
49
 
43
50
  **Expected Results:**
51
+ - ✅ `uv export` resolves the project's dependencies (all extras and groups)
52
+ - ✅ `pip-audit` audits the exported pinned requirements, not the runner environment
44
53
  - ✅ No known security vulnerabilities in dependencies
45
54
 
46
55
  **If vulnerabilities found:** Assess severity; update dependencies if critical.
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.5
2
2
  Name: mapify-cli
3
- Version: 3.35.1
3
+ Version: 3.35.2
4
4
  Summary: MAP Framework installer - Modular Agentic Planner for Claude Code
5
5
  Project-URL: Homepage, https://github.com/azalio/map-framework
6
6
  Project-URL: Repository, https://github.com/azalio/map-framework.git
@@ -26,6 +26,7 @@ Requires-Dist: pytest-asyncio>=0.26.0; extra == 'dev'
26
26
  Requires-Dist: pytest-cov>=4.0.0; extra == 'dev'
27
27
  Requires-Dist: pytest-mock>=3.10.0; extra == 'dev'
28
28
  Requires-Dist: pytest-timeout>=2.1.0; extra == 'dev'
29
+ Requires-Dist: pytest-xdist>=3.5.0; extra == 'dev'
29
30
  Requires-Dist: pytest>=7.0.0; extra == 'dev'
30
31
  Requires-Dist: pyyaml>=6.0.0; extra == 'dev'
31
32
  Requires-Dist: ruff>=0.1.0; extra == 'dev'
@@ -39,6 +40,7 @@ Requires-Dist: pytest-asyncio>=0.26.0; extra == 'test'
39
40
  Requires-Dist: pytest-cov>=4.0.0; extra == 'test'
40
41
  Requires-Dist: pytest-mock>=3.10.0; extra == 'test'
41
42
  Requires-Dist: pytest-timeout>=2.1.0; extra == 'test'
43
+ Requires-Dist: pytest-xdist>=3.5.0; extra == 'test'
42
44
  Requires-Dist: pytest>=7.0.0; extra == 'test'
43
45
  Requires-Dist: pyyaml>=6.0.0; extra == 'test'
44
46
  Description-Content-Type: text/markdown
@@ -1,4 +1,4 @@
1
- mapify_cli/__init__.py,sha256=uJ9ks_0495dm52OSh7dHU3-XEgbNk968JAIdNq9ERFw,163259
1
+ mapify_cli/__init__.py,sha256=5mY9nwQuv0Onh_R9-y5HepVOsc8bh9pYKFXT8C0KWCM,163259
2
2
  mapify_cli/__main__.py,sha256=IIXpP40mLOpNxERf-dvaD886d4KZzk72soLFskgZdT8,150
3
3
  mapify_cli/_locking.py,sha256=ppkacPTTkmaJdWyYiRqA_2O53MWwKnZba3xaX913GmM,10864
4
4
  mapify_cli/_python_guard.py,sha256=dLAWWs-KelHGz3U_bjRvdqWz5C4zQEO5pPsTLvgyYUs,1595
@@ -124,8 +124,8 @@ mapify_cli/templates/codex/references/map-json-output-contracts.md,sha256=Gip3CT
124
124
  mapify_cli/templates/codex/references/map-output-examples.md,sha256=Y1AVMSO37-DrRitM7c_eYyMdFKrLkNrqogAG2RnzSbY,2075
125
125
  mapify_cli/templates/codex/references/map-xml-prompt-envelopes.md,sha256=6E5S8a356xVYGLAT0qUlaQYoNKUCLZdYS54mSchPgjI,2296
126
126
  mapify_cli/templates/codex/skills/map-architecture/SKILL.md,sha256=nmco7d1R_IqEYP38sZnPKVwOD7B0RhB8yI_B3N22s4k,8745
127
- mapify_cli/templates/codex/skills/map-auto/SKILL.md,sha256=tdd_q2xtCQiHnL3pv19UAo91fZdpfZ1l-lo49GQ9Qik,11051
128
- mapify_cli/templates/codex/skills/map-auto/auto-reference.md,sha256=kb8MzVNnRVAxinNJb3DGA66oTIAzEOAVTw2xVKShmHo,6846
127
+ mapify_cli/templates/codex/skills/map-auto/SKILL.md,sha256=nj0cgmojNOEmUDjqzbRqUN2Y7rDX4qpqj6lYsxxzQZs,11623
128
+ mapify_cli/templates/codex/skills/map-auto/auto-reference.md,sha256=nnUX7g9tHYzUb1EiHbpXgVzQISJzKXt6nig3Vk9CjLQ,7265
129
129
  mapify_cli/templates/codex/skills/map-check/SKILL.md,sha256=maW5i-cr6riIqIGNF15cdaddFi1PNqWu9j9p41oP1Iw,12066
130
130
  mapify_cli/templates/codex/skills/map-check/check-reference.md,sha256=vR5RYPHhqyjndI7xugDShqZH9v1d926unIMCG2g3D_w,1910
131
131
  mapify_cli/templates/codex/skills/map-debug/SKILL.md,sha256=pBgVAPCYw4_UHNU7-eSpKve5SI9LSWOXuizhxJZ3XTk,18643
@@ -141,8 +141,8 @@ mapify_cli/templates/codex/skills/map-memory-now/SKILL.md,sha256=J2eN0HH8sitsL0C
141
141
  mapify_cli/templates/codex/skills/map-plan/SKILL.md,sha256=ntK-M_bX3xOACLP7QoGcon8lDWNRqRIC9dokKSlDlZw,40189
142
142
  mapify_cli/templates/codex/skills/map-plan/plan-reference.md,sha256=SG5LjSRlob8ZZ-tQOVbarK92D4xHOjK21Y1Trj9WD10,17975
143
143
  mapify_cli/templates/codex/skills/map-prd-review/SKILL.md,sha256=ef5vykGqT9FyOlUsOu7hos8lvPUo5sHQhKpT9VhzXlI,11620
144
- mapify_cli/templates/codex/skills/map-release/SKILL.md,sha256=EEkZC6CbL1p50qoH-Wh9ltA_UmzdYfMZ9_TBSciR_7g,9255
145
- mapify_cli/templates/codex/skills/map-release/release-reference.md,sha256=B20v7kxwhlS0F5E5jT3tRLpACFK1g8Nim_QGkLxUSpE,25798
144
+ mapify_cli/templates/codex/skills/map-release/SKILL.md,sha256=oSFuW3k-z5XAWdd_ADdDs8F9AXQiNKBfNFPTPEW8GxM,9311
145
+ mapify_cli/templates/codex/skills/map-release/release-reference.md,sha256=DmGYohVyIn0ZlLwrJyGaIQVuHjPhtb-OswtUANFeM-o,26407
146
146
  mapify_cli/templates/codex/skills/map-resume/SKILL.md,sha256=wyi_y-oI7cr_7whbaTWpgtQWvgW8c58yCpVZNSnxW2A,11218
147
147
  mapify_cli/templates/codex/skills/map-resume/resume-reference.md,sha256=SYPJjuCAnRlx3kz5m09-Wv4P8d-aItYwjewQUgsrGz0,11778
148
148
  mapify_cli/templates/codex/skills/map-review/SKILL.md,sha256=GFCN7YMCzGRJq24kUY3Sp7UHaUNi7Dvx9sdlAkrRPcY,38685
@@ -191,7 +191,7 @@ mapify_cli/templates/map/scripts/codex_review_runner.py,sha256=5qAp9pAAU2wumXSMT
191
191
  mapify_cli/templates/map/scripts/diagnostics.py,sha256=jwihmF0DEIo2q6JAQ8FgLJ5H0Sun0RZ4uguWZ4pCEyw,11721
192
192
  mapify_cli/templates/map/scripts/map_interruption.py,sha256=_4vJwVyC9ke9iKse4T_JIjed0CxntiY-CIluH5g1s7c,54975
193
193
  mapify_cli/templates/map/scripts/map_orchestrator.py,sha256=ykL_UD59IdabHr_joyMIjgW4Sam0MVR7LchHAH4t25E,249890
194
- mapify_cli/templates/map/scripts/map_step_runner.py,sha256=1GCRyBZhg3ed3tatgF0dKG96bBCKlEjKQyPaJYYEoBo,1297766
194
+ mapify_cli/templates/map/scripts/map_step_runner.py,sha256=KA79lBijjm_GLRLb00eLj-L1s7JUnawIdOeo8AJI84w,1300171
195
195
  mapify_cli/templates/map/scripts/map_utils.py,sha256=A0iVRLYtOz8rWQFRT2Ybk94qNkAPb8YU9r5CXiHIlTU,7919
196
196
  mapify_cli/templates/map/scripts/review_check_supervisor.py,sha256=sHV3UC0DWkMJnjnVwjSh9jHvlV25gOLCw25icbGHNJU,5186
197
197
  mapify_cli/templates/map/scripts/scrub_internal_ids.py,sha256=nS1BnCcr_Jhgj-rzP8pcX40TbHbLDgA6KL65qYt1y44,24727
@@ -219,8 +219,8 @@ mapify_cli/templates/rules/learned/README.md,sha256=gYzWuUZyt8kyLt2tU9PNqune63GV
219
219
  mapify_cli/templates/skills/README.md,sha256=W7ZIhPi2Kk9OkuS82y9FSqEM4obSoEGUKoJgtwKzt6k,5035
220
220
  mapify_cli/templates/skills/skill-rules.json,sha256=EqFqrZKpWJiSFXdZo-G-8MgqFArP_wQtzPKGt0DpI9A,15429
221
221
  mapify_cli/templates/skills/map-architecture/SKILL.md,sha256=wZwLmUscDQyB4fcRfUer1abs_xi6pTdz7VPKcux7krs,8807
222
- mapify_cli/templates/skills/map-auto/SKILL.md,sha256=UNpZ6QWcCRGVOH8foYWasfTevX2lLPzcFcg68Ahl2GE,11100
223
- mapify_cli/templates/skills/map-auto/auto-reference.md,sha256=DK6r4vD_-G4twLLoXwjuf9fWmCOlGEDQ3PwJW7e-MEA,6846
222
+ mapify_cli/templates/skills/map-auto/SKILL.md,sha256=1cOGdNePLvquxj1hZtGG5rNoil06-GLvO6kfBWa4L4s,11672
223
+ mapify_cli/templates/skills/map-auto/auto-reference.md,sha256=0Du6ugMAVLYEEFvNdnWSZ0CoC0mYo92ROgN9hQoqWW4,7265
224
224
  mapify_cli/templates/skills/map-check/SKILL.md,sha256=uKsAMTVDM3q8LfU2Ub7Yx2p2g4s8iPggy1qzKKeZ7KM,12105
225
225
  mapify_cli/templates/skills/map-check/check-reference.md,sha256=9Kw5LiemzHI8WPHii1ItueDFLt3IxhbdpH-_nOAHlU4,1910
226
226
  mapify_cli/templates/skills/map-debug/SKILL.md,sha256=a_wnGcvhBoLIQE2jA0Rv34Q8Kr9yzzjI0EPPpe8Xu9Q,18431
@@ -236,8 +236,8 @@ mapify_cli/templates/skills/map-memory-now/SKILL.md,sha256=Xs-U4_f_8PC03VjWrhUG0
236
236
  mapify_cli/templates/skills/map-plan/SKILL.md,sha256=dQ29v11Sc3ud-s_7QXfnPgcAT1qmMJ4-_8YaIzf8gUE,37491
237
237
  mapify_cli/templates/skills/map-plan/plan-reference.md,sha256=0uZmmv6ReL-xyZKy2ACScoD20KKO54Zi_LcTuBVFwag,17975
238
238
  mapify_cli/templates/skills/map-prd-review/SKILL.md,sha256=W6-8CNCyF1D2s-jdpuUKd2Iw8mcBYRQdD00ZIaYrS4Q,12499
239
- mapify_cli/templates/skills/map-release/SKILL.md,sha256=0aen7ppFhKU4j90H4ooOiQNac-kz1BtG3ucKuG2ttI8,9259
240
- mapify_cli/templates/skills/map-release/release-reference.md,sha256=uqZZ-6a4-hWKyNV2gWuFkZ86eVR8a0hlat9emiUYh-I,26630
239
+ mapify_cli/templates/skills/map-release/SKILL.md,sha256=Xy-pOZ6ZiWXwT3AmuxR1mGvp45zvn9MD1TgUCaBB7MU,9315
240
+ mapify_cli/templates/skills/map-release/release-reference.md,sha256=fw2Zp5YCH9A5BBBzjwqMY1qCd4nKMWO-DmmYeXZwG8E,27239
241
241
  mapify_cli/templates/skills/map-resume/SKILL.md,sha256=Oz5WjsFaIMAPN2t-to1DPYQWQEWSUd3xblbFj5YWSgg,11501
242
242
  mapify_cli/templates/skills/map-resume/resume-reference.md,sha256=bQubgJ2-jcG8eyDyDoAiD9jw9sk5uba4x1UDhp2OI7E,11783
243
243
  mapify_cli/templates/skills/map-review/SKILL.md,sha256=BEmVbeuIHuVJ95vlzulRUr24hE-udgi6YhteUy2Q6Lo,45812
@@ -388,7 +388,7 @@ mapify_cli/templates_src/map/scripts/codex_review_runner.py.jinja,sha256=PsdHqHg
388
388
  mapify_cli/templates_src/map/scripts/diagnostics.py.jinja,sha256=jwihmF0DEIo2q6JAQ8FgLJ5H0Sun0RZ4uguWZ4pCEyw,11721
389
389
  mapify_cli/templates_src/map/scripts/map_interruption.py.jinja,sha256=_4vJwVyC9ke9iKse4T_JIjed0CxntiY-CIluH5g1s7c,54975
390
390
  mapify_cli/templates_src/map/scripts/map_orchestrator.py.jinja,sha256=Afzo0jM6BZ1rcBA_n3Mjt5UqKTxkSnrQxzT0V824csw,248549
391
- mapify_cli/templates_src/map/scripts/map_step_runner.py.jinja,sha256=CvvTmrtfA3b8L5HyxaSEp2isd4a6VLn4ZO9Mnnedjrc,1259689
391
+ mapify_cli/templates_src/map/scripts/map_step_runner.py.jinja,sha256=OMmobKKEXuHwJCaYa1dlX4o8_Hz7Uqq0uSVW9om9ZOY,1262094
392
392
  mapify_cli/templates_src/map/scripts/map_utils.py.jinja,sha256=A0iVRLYtOz8rWQFRT2Ybk94qNkAPb8YU9r5CXiHIlTU,7919
393
393
  mapify_cli/templates_src/map/scripts/review_check_supervisor.py.jinja,sha256=sHV3UC0DWkMJnjnVwjSh9jHvlV25gOLCw25icbGHNJU,5186
394
394
  mapify_cli/templates_src/map/scripts/scrub_internal_ids.py.jinja,sha256=nS1BnCcr_Jhgj-rzP8pcX40TbHbLDgA6KL65qYt1y44,24727
@@ -416,8 +416,8 @@ mapify_cli/templates_src/rules/learned/README.md.jinja,sha256=gYzWuUZyt8kyLt2tU9
416
416
  mapify_cli/templates_src/skills/README.md.jinja,sha256=W7ZIhPi2Kk9OkuS82y9FSqEM4obSoEGUKoJgtwKzt6k,5035
417
417
  mapify_cli/templates_src/skills/skill-rules.json.jinja,sha256=EqFqrZKpWJiSFXdZo-G-8MgqFArP_wQtzPKGt0DpI9A,15429
418
418
  mapify_cli/templates_src/skills/map-architecture/SKILL.md.jinja,sha256=UD9XTpGI0T1GLTGyrNE_dHxba1Ir_E3_gS2iskwtA68,8053
419
- mapify_cli/templates_src/skills/map-auto/SKILL.md.jinja,sha256=Y626QZSAzbZlD0ZnsMwhO-w-Gm3HC8G1FTyLCr6IG1s,10378
420
- mapify_cli/templates_src/skills/map-auto/auto-reference.md.jinja,sha256=O0f5b8mqMeRXx-qmOAougXR-pRcOpGBSkIJJl_s-DIA,6980
419
+ mapify_cli/templates_src/skills/map-auto/SKILL.md.jinja,sha256=Uli3fVqJfj0n6lDZhVe26KBW7eldDBBld3bGSUAaVsQ,10950
420
+ mapify_cli/templates_src/skills/map-auto/auto-reference.md.jinja,sha256=HwytZmF8F7UufitP-mNA2tEj1R25pmRB-zwApcgN15E,7399
421
421
  mapify_cli/templates_src/skills/map-check/SKILL.md.jinja,sha256=OR1nIliohJz3xI5aN4eaVYyn0wqznSmRcNRPQIjTpog,11479
422
422
  mapify_cli/templates_src/skills/map-check/check-reference.md.jinja,sha256=n9WNFiFpgjToAvs2miRhFL2kYoNxkJm4muwKtQb-sa4,2020
423
423
  mapify_cli/templates_src/skills/map-debug/SKILL.md.jinja,sha256=xXEirwlNLiNQ5jaNgGsPgT9sVMOxDcJwJqpWzs7ed7E,20875
@@ -433,8 +433,8 @@ mapify_cli/templates_src/skills/map-memory-now/SKILL.md.jinja,sha256=tBUw3UzXv9P
433
433
  mapify_cli/templates_src/skills/map-plan/SKILL.md.jinja,sha256=gpD1Uga1lbcsLStMO35WKY1h4t9o4S4R-nlqWyzaeG4,80191
434
434
  mapify_cli/templates_src/skills/map-plan/plan-reference.md.jinja,sha256=aLLV5yCyWKADY0t4WHndfwP7VbKQLv7VPXS9RCIhOF0,18061
435
435
  mapify_cli/templates_src/skills/map-prd-review/SKILL.md.jinja,sha256=ZJLLYjLNXosuXZdPeb1PVLS-rcWwJEE1VWt5s8gcUPM,15945
436
- mapify_cli/templates_src/skills/map-release/SKILL.md.jinja,sha256=IYAn51sPCp7NA1a3cQECW_a3iWqQS4uKl42jtoccDIg,8650
437
- mapify_cli/templates_src/skills/map-release/release-reference.md.jinja,sha256=WLVggRftYm0S05pia8zdkdvD2p0MauuSf6Ur1TT8tkc,27472
436
+ mapify_cli/templates_src/skills/map-release/SKILL.md.jinja,sha256=SzN8_Opi7WlE9bjgQT9QMTxf79oY2URS2eHpAbTk48U,8706
437
+ mapify_cli/templates_src/skills/map-release/release-reference.md.jinja,sha256=45vlzYdSjKblmGcuMLOT1ksIJLZ1hD10qAOw9mbrPFg,28081
438
438
  mapify_cli/templates_src/skills/map-resume/SKILL.md.jinja,sha256=Fb1MEYqVohwWSy_UtEWpAZK811RsI8fy8YExL9k9vq0,11032
439
439
  mapify_cli/templates_src/skills/map-resume/resume-reference.md.jinja,sha256=on05KJYaMLfe-P_UBESt73RR7V02XWTcAgEvuODCOoc,7228
440
440
  mapify_cli/templates_src/skills/map-review/SKILL.md.jinja,sha256=U9p97ALlDllT9S5f2TWqlny1xi9VeJ3y1AqMTGeyuQo,51139
@@ -461,8 +461,8 @@ mapify_cli/templates_src/skills/map-wayfind/SKILL.md.jinja,sha256=nR_VzzoGRIHquF
461
461
  mapify_cli/templates_src/skills/map-wayfind/wayfind-reference.md.jinja,sha256=q9ZJqSyg6lMKcf981RmLnTKqc_-skDAP6ziyG9aFIAg,25132
462
462
  mapify_cli/tools/__init__.py,sha256=8ko7XmScc6yzxrK5qGjCMJ0ZyI6mCtDJf1-TJalW61U,502
463
463
  mapify_cli/tools/validate_dependencies.py,sha256=sgioc4oLL6OQoJ2bbG36NmfxJAf98b_Ai5ZLlgg-y0A,27543
464
- mapify_cli-3.35.1.dist-info/METADATA,sha256=7bQQk6--0Lk8ti95XffDI1wMiww8ylKwtpBATleyxi8,28607
465
- mapify_cli-3.35.1.dist-info/WHEEL,sha256=2iZrJkDIkeDh0k9SikKMqFuRP-ua6mb4Ir1AsER4BEw,87
466
- mapify_cli-3.35.1.dist-info/entry_points.txt,sha256=JEbE3NIipHUFQOjczbX0IuqMLxfPHUQgTKWk2q4ihBw,43
467
- mapify_cli-3.35.1.dist-info/licenses/LICENSE,sha256=5ZKn8kvEcarPDioO59QFIzvmk9sWhFJbKg40849y7xo,1083
468
- mapify_cli-3.35.1.dist-info/RECORD,,
464
+ mapify_cli-3.35.2.dist-info/METADATA,sha256=oGF-jYUZTD6tpRYgYWXa54Iit6TfxP2NiiA3FWBxQvQ,28710
465
+ mapify_cli-3.35.2.dist-info/WHEEL,sha256=2iZrJkDIkeDh0k9SikKMqFuRP-ua6mb4Ir1AsER4BEw,87
466
+ mapify_cli-3.35.2.dist-info/entry_points.txt,sha256=JEbE3NIipHUFQOjczbX0IuqMLxfPHUQgTKWk2q4ihBw,43
467
+ mapify_cli-3.35.2.dist-info/licenses/LICENSE,sha256=5ZKn8kvEcarPDioO59QFIzvmk9sWhFJbKg40849y7xo,1083
468
+ mapify_cli-3.35.2.dist-info/RECORD,,