devrites 7.3.0 → 7.3.2

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 (153) hide show
  1. package/CHANGELOG.md +32 -0
  2. package/README.md +19 -3
  3. package/bin/devrites.mjs +31 -5
  4. package/docs/engine/commands.md +41 -3
  5. package/docs/release.md +5 -2
  6. package/engine/Makefile +2 -2
  7. package/engine/internal/acceptance/newfinal_origins.go +39 -0
  8. package/engine/internal/acceptance/preconditions.go +17 -11
  9. package/engine/internal/acceptance/transcript.go +23 -4
  10. package/engine/internal/gate/gate.go +8 -6
  11. package/engine/internal/gate/readiness_binding.go +54 -24
  12. package/engine/internal/install/apply.go +36 -21
  13. package/engine/internal/install/binary.go +67 -9
  14. package/engine/internal/install/install.go +63 -21
  15. package/engine/internal/install/manifest.go +4 -5
  16. package/engine/internal/install/merge.go +89 -33
  17. package/engine/internal/install/preflight.go +60 -19
  18. package/engine/internal/install/uninstall.go +19 -9
  19. package/engine/internal/install/update.go +0 -4
  20. package/engine/internal/lib/claims.go +170 -4
  21. package/engine/internal/lib/claims_holder.go +13 -16
  22. package/engine/internal/lib/closeout.go +52 -28
  23. package/engine/internal/lib/context_io.go +88 -4
  24. package/engine/internal/lib/continuation.go +111 -24
  25. package/engine/internal/lib/dispatch.go +157 -24
  26. package/engine/internal/lib/final_prerequisites.go +137 -0
  27. package/engine/internal/lib/manifest_union.go +62 -25
  28. package/engine/internal/lib/next.go +10 -10
  29. package/engine/internal/lib/packet.go +32 -8
  30. package/engine/internal/lib/packet_integrity.go +194 -2
  31. package/engine/internal/lib/resolve.go +128 -142
  32. package/engine/internal/lib/treebaseline.go +0 -1
  33. package/engine/internal/markdowntext/markdowntext.go +110 -31
  34. package/engine/internal/overhaul/records/check.go +45 -5
  35. package/engine/internal/overhaul/records/consistency.go +34 -8
  36. package/engine/internal/overhaul/records/run.go +55 -11
  37. package/engine/internal/parallel/landing.go +17 -0
  38. package/engine/internal/state/acceptance.go +35 -5
  39. package/engine/internal/state/feature.go +3 -2
  40. package/engine/internal/state/observation.go +50 -3
  41. package/engine/internal/state/write.go +20 -44
  42. package/engine/internal/workflow/commands.go +25 -3
  43. package/engine/main.go +19 -0
  44. package/pack/.claude/skills/devrites-lib/reference/parallel-dispatch.md +41 -39
  45. package/pack/.claude/skills/devrites-lib/reference/parallel-workspaces.md +46 -12
  46. package/pack/.claude/skills/overhaul/SKILL.md +8 -4
  47. package/pack/.claude/skills/overhaul/references/lifecycle.md +13 -6
  48. package/pack/.claude/skills/overhaul/references/orchestration.md +32 -21
  49. package/pack/.claude/skills/overhaul/references/records.md +23 -8
  50. package/pack/.claude/skills/overhaul/references/scope-and-safety.md +7 -2
  51. package/pack/.claude/skills/overhaul/references/scoring.md +7 -0
  52. package/pack/.claude/skills/rite-autocomplete/SKILL.md +9 -10
  53. package/pack/.claude/skills/rite-autocomplete/reference/loop.md +8 -1
  54. package/pack/.claude/skills/rite-build/reference/wright-dispatch.md +17 -17
  55. package/pack/.claude/skills/rite-clarify/SKILL.md +25 -25
  56. package/pack/.claude/skills/rite-prove/SKILL.md +15 -7
  57. package/pack/.claude/skills/rite-review/SKILL.md +7 -0
  58. package/pack/.claude/skills/rite-vet/SKILL.md +10 -1
  59. package/pack/generated/claude/skills/devrites-lib/reference/parallel-dispatch.md +41 -39
  60. package/pack/generated/claude/skills/devrites-lib/reference/parallel-workspaces.md +46 -12
  61. package/pack/generated/claude/skills/overhaul/SKILL.md +8 -4
  62. package/pack/generated/claude/skills/overhaul/references/lifecycle.md +13 -6
  63. package/pack/generated/claude/skills/overhaul/references/orchestration.md +32 -21
  64. package/pack/generated/claude/skills/overhaul/references/records.md +23 -8
  65. package/pack/generated/claude/skills/overhaul/references/scope-and-safety.md +7 -2
  66. package/pack/generated/claude/skills/overhaul/references/scoring.md +7 -0
  67. package/pack/generated/claude/skills/rite-autocomplete/SKILL.md +9 -10
  68. package/pack/generated/claude/skills/rite-autocomplete/reference/loop.md +8 -1
  69. package/pack/generated/claude/skills/rite-build/reference/wright-dispatch.md +17 -17
  70. package/pack/generated/claude/skills/rite-clarify/SKILL.md +25 -25
  71. package/pack/generated/claude/skills/rite-prove/SKILL.md +15 -7
  72. package/pack/generated/claude/skills/rite-review/SKILL.md +7 -0
  73. package/pack/generated/claude/skills/rite-vet/SKILL.md +10 -1
  74. package/pack/generated/codex/skills/devrites-lib/reference/parallel-dispatch.md +41 -39
  75. package/pack/generated/codex/skills/devrites-lib/reference/parallel-workspaces.md +46 -12
  76. package/pack/generated/codex/skills/overhaul/SKILL.md +8 -4
  77. package/pack/generated/codex/skills/overhaul/references/lifecycle.md +13 -6
  78. package/pack/generated/codex/skills/overhaul/references/orchestration.md +32 -21
  79. package/pack/generated/codex/skills/overhaul/references/records.md +23 -8
  80. package/pack/generated/codex/skills/overhaul/references/scope-and-safety.md +7 -2
  81. package/pack/generated/codex/skills/overhaul/references/scoring.md +7 -0
  82. package/pack/generated/codex/skills/rite-autocomplete/SKILL.md +9 -10
  83. package/pack/generated/codex/skills/rite-autocomplete/reference/loop.md +8 -1
  84. package/pack/generated/codex/skills/rite-build/reference/wright-dispatch.md +17 -17
  85. package/pack/generated/codex/skills/rite-clarify/SKILL.md +25 -25
  86. package/pack/generated/codex/skills/rite-prove/SKILL.md +15 -7
  87. package/pack/generated/codex/skills/rite-review/SKILL.md +7 -0
  88. package/pack/generated/codex/skills/rite-vet/SKILL.md +10 -1
  89. package/pack/generated/devin/skills/devrites-lib/reference/parallel-dispatch.md +41 -39
  90. package/pack/generated/devin/skills/devrites-lib/reference/parallel-workspaces.md +46 -12
  91. package/pack/generated/devin/skills/overhaul/SKILL.md +8 -4
  92. package/pack/generated/devin/skills/overhaul/references/lifecycle.md +13 -6
  93. package/pack/generated/devin/skills/overhaul/references/orchestration.md +32 -21
  94. package/pack/generated/devin/skills/overhaul/references/records.md +23 -8
  95. package/pack/generated/devin/skills/overhaul/references/scope-and-safety.md +7 -2
  96. package/pack/generated/devin/skills/overhaul/references/scoring.md +7 -0
  97. package/pack/generated/devin/skills/rite-autocomplete/SKILL.md +9 -10
  98. package/pack/generated/devin/skills/rite-autocomplete/reference/loop.md +8 -1
  99. package/pack/generated/devin/skills/rite-build/reference/wright-dispatch.md +17 -17
  100. package/pack/generated/devin/skills/rite-clarify/SKILL.md +25 -25
  101. package/pack/generated/devin/skills/rite-prove/SKILL.md +15 -7
  102. package/pack/generated/devin/skills/rite-review/SKILL.md +7 -0
  103. package/pack/generated/devin/skills/rite-vet/SKILL.md +10 -1
  104. package/pack/generated/dsh/runtime/cordis.patch.yml +28 -14
  105. package/pack/generated/dsh/skills/devrites-lib/reference/parallel-dispatch.md +41 -39
  106. package/pack/generated/dsh/skills/devrites-lib/reference/parallel-workspaces.md +46 -12
  107. package/pack/generated/dsh/skills/overhaul/SKILL.md +8 -4
  108. package/pack/generated/dsh/skills/overhaul/references/lifecycle.md +13 -6
  109. package/pack/generated/dsh/skills/overhaul/references/orchestration.md +32 -21
  110. package/pack/generated/dsh/skills/overhaul/references/records.md +23 -8
  111. package/pack/generated/dsh/skills/overhaul/references/scope-and-safety.md +7 -2
  112. package/pack/generated/dsh/skills/overhaul/references/scoring.md +6 -0
  113. package/pack/generated/dsh/skills/rite-autocomplete/SKILL.md +9 -10
  114. package/pack/generated/dsh/skills/rite-autocomplete/reference/loop.md +8 -1
  115. package/pack/generated/dsh/skills/rite-build/reference/wright-dispatch.md +17 -17
  116. package/pack/generated/dsh/skills/rite-clarify/SKILL.md +25 -25
  117. package/pack/generated/dsh/skills/rite-prove/SKILL.md +15 -7
  118. package/pack/generated/dsh/skills/rite-review/SKILL.md +7 -0
  119. package/pack/generated/dsh/skills/rite-vet/SKILL.md +10 -1
  120. package/pack/generated/omp/skills/devrites-lib/reference/parallel-dispatch.md +41 -39
  121. package/pack/generated/omp/skills/devrites-lib/reference/parallel-workspaces.md +46 -12
  122. package/pack/generated/omp/skills/overhaul/SKILL.md +8 -4
  123. package/pack/generated/omp/skills/overhaul/references/lifecycle.md +13 -6
  124. package/pack/generated/omp/skills/overhaul/references/orchestration.md +32 -21
  125. package/pack/generated/omp/skills/overhaul/references/records.md +23 -8
  126. package/pack/generated/omp/skills/overhaul/references/scope-and-safety.md +7 -2
  127. package/pack/generated/omp/skills/overhaul/references/scoring.md +7 -0
  128. package/pack/generated/omp/skills/rite-autocomplete/SKILL.md +9 -10
  129. package/pack/generated/omp/skills/rite-autocomplete/reference/loop.md +8 -1
  130. package/pack/generated/omp/skills/rite-build/reference/wright-dispatch.md +17 -17
  131. package/pack/generated/omp/skills/rite-clarify/SKILL.md +25 -25
  132. package/pack/generated/omp/skills/rite-prove/SKILL.md +15 -7
  133. package/pack/generated/omp/skills/rite-review/SKILL.md +7 -0
  134. package/pack/generated/omp/skills/rite-vet/SKILL.md +10 -1
  135. package/pack/generated/pi/skills/devrites-lib/reference/parallel-dispatch.md +41 -39
  136. package/pack/generated/pi/skills/devrites-lib/reference/parallel-workspaces.md +46 -12
  137. package/pack/generated/pi/skills/overhaul/SKILL.md +8 -4
  138. package/pack/generated/pi/skills/overhaul/references/lifecycle.md +13 -6
  139. package/pack/generated/pi/skills/overhaul/references/orchestration.md +32 -21
  140. package/pack/generated/pi/skills/overhaul/references/records.md +23 -8
  141. package/pack/generated/pi/skills/overhaul/references/scope-and-safety.md +7 -2
  142. package/pack/generated/pi/skills/overhaul/references/scoring.md +7 -0
  143. package/pack/generated/pi/skills/rite-autocomplete/SKILL.md +9 -10
  144. package/pack/generated/pi/skills/rite-autocomplete/reference/loop.md +8 -1
  145. package/pack/generated/pi/skills/rite-build/reference/wright-dispatch.md +17 -17
  146. package/pack/generated/pi/skills/rite-clarify/SKILL.md +25 -25
  147. package/pack/generated/pi/skills/rite-prove/SKILL.md +15 -7
  148. package/pack/generated/pi/skills/rite-review/SKILL.md +7 -0
  149. package/pack/generated/pi/skills/rite-vet/SKILL.md +10 -1
  150. package/package.json +1 -1
  151. package/scripts/dsh-generate.py +1 -1
  152. package/scripts/install-lib.sh +29 -0
  153. package/uninstall.sh +1 -0
@@ -59,34 +59,34 @@ dispatch uses
59
59
  remains.
60
60
  5. **Write the verdict.** Write `Decision coverage: CLEAR` only after re-reading all inputs and confirming
61
61
  every material row has current evidence and an owner. Normal flow sets `phase=clarify` and
62
- `next_action=/rite-temper`. A low-stakes spec — the significance trigger temper itself
63
- skips (rite-temper step 1) — sets `next_action=/rite-define` instead. A contract-neutral later-phase return uses
64
- the native restore below; changed behavior or acceptance routes to
65
- `/rite-plan repair` instead. Stop without starting the next phase.
62
+ `next_action=/rite-temper`, or `/rite-define` for low-stakes specs temper skips.
63
+ Later-phase entries follow the ownership protocol below. Return inline verdicts
64
+ to the controlling caller; otherwise stop before starting the next phase.
66
65
 
67
66
  ## Native clarify cursor protocol
68
67
 
69
- The controlling root edits only cursor rows in `state.md`; it must preserve unrelated Markdown and the file's existing table/bullet presentation.
70
-
71
- - **Normal entry from Spec:** set `phase=clarify`, `status=running`, and
72
- `next_action=/rite-clarify <slug>`; omit both return fields.
73
- - **Already in Clarify:** no-op. Do not overwrite an existing valid return
74
- cursor.
75
- - **Later-phase entry:** only `temper`, `define`, `plan`, `vet`, `build`,
76
- `converge`, `prove`, `polish`, `review`, `seal`, or `ship` may return. First
77
- copy the current `phase` and non-empty `next_action` to `return_phase` and
78
- `return_next_action`; then set `phase=clarify`, `status=running`, and
79
- `next_action=/rite-clarify <slug>`. Missing/unknown cursor values fail closed
80
- before any write.
81
- - **Contract-neutral restore:** after a fresh `Decision coverage: CLEAR`, require
82
- `phase=clarify`, both return fields, a recognized later `return_phase`, and a
83
- non-empty `return_next_action`. Restore those values to `phase` and
84
- `next_action`, set `status=running`, and remove both return fields in the same
85
- rewrite. Re-read the cursor and confirm the return rows are absent.
86
- - **Contract changed:** do not restore the saved cursor. Record drift and route
87
- through `/rite-plan repair`, which owns the changed plan and next action.
88
-
89
- Never normalize or rewrite the rest of `state.md` while applying this protocol.
68
+ Edit only cursor rows; preserve unrelated Markdown and table/bullet presentation.
69
+
70
+ - **Validate before writes:** require no return fields or a complete pair:
71
+ recognized later `return_phase`, non-empty `return_next_action`. Invalid/half
72
+ pairs fail closed. Later phases: `temper`, `define`, `plan`, `vet`, `build`,
73
+ `converge`, `prove`, `polish`, `review`, `seal`, `ship`.
74
+ - **Spec entry:** set `phase=clarify`, `status=running`,
75
+ `next_action=/rite-clarify <slug>`; omit return fields.
76
+ - **Caller-owned pair:** pair with `phase!=clarify` requires a native
77
+ controlling caller; otherwise stop for ownership recovery. Run bounded Clarify
78
+ inline, preserve all cursor rows, and return its verdict to caller.
79
+ Contract changes require Plan repair and Vet before outer resume.
80
+ - **Clarify-owned pair:** standalone later-phase entry without a pair saves current
81
+ phase/non-empty next action as the pair, then sets `phase=clarify`,
82
+ `status=running`, `next_action=/rite-clarify <slug>`. Missing/unknown values
83
+ fail closed. `phase=clarify` resumes without writes; its pair belongs to
84
+ standalone Clarify, not a nested caller.
85
+ - **Restore:** after fresh `CLEAR`, only the owner restores its pair.
86
+ Contract-neutral standalone Clarify restores phase/next action, sets
87
+ `status=running`, atomically unsets both return fields, and re-reads to verify.
88
+ Contract changes retain the pair through Plan repair and Vet; only its owner
89
+ consumes it after readiness. Preserve caller pairs.
90
90
 
91
91
  ## Output
92
92
 
@@ -35,8 +35,9 @@ TTHW, and exact signal-bearing errors; never assert DX (trigger `devex`).
35
35
  grammar/hashing. Spec Drift Guard owns revealed contract drift.
36
36
  - Root runs vetted gates/browser and records immutable evidence; proof runner
37
37
  validates it. Only the bounded wright fixes product source/tests.
38
- - **Prove remains the controlling caller** during technical backtracking. Save
39
- its cursor; run Plan repair, Recovery Vet, remediation, and re-proof inline;
38
+ - **Prove remains the source-local controlling caller** during technical backtracking;
39
+ under Autocomplete, repository scheduling stays with Autocomplete. Save
40
+ Prove's cursor; run Plan repair, Recovery Vet, remediation, and re-proof inline;
40
41
  consume nested boundaries; resume the failed rung. A strategy is spent after
41
42
  three no-progress attempts on the exact same fingerprint; escalate it per the
42
43
  [retry contract](../devrites-lib/reference/standards/afk-hitl.md#retry-cap-no-progress-loops-and-self-resolve)
@@ -60,12 +61,15 @@ test changes.
60
61
  ## Workflow
61
62
 
62
63
  1. **Orient.** Read core, resolve source per [phase target binding](../devrites-lib/reference/parallel-workspaces.md#phase-target-binding), require `state.md`, and read its
63
- cursor. On blocked Prove cold resume, reconcile retained consumptive evidence
64
- and no-progress corrections before accepting terminal none; a distinct
65
- fingerprint below cap resumes offline triage without another real action.
64
+ cursor. Under Autocomplete, return scheduling for its
65
+ [global frontier pass](../devrites-lib/reference/parallel-workspaces.md#continuous-global-frontier)
66
+ before cold/local recovery; preserve Prove's source-local return cursor.
67
+ On blocked Prove cold resume, reconcile retained consumptive evidence and
68
+ no-progress corrections before accepting terminal none; a distinct fingerprint
69
+ below cap resumes offline triage without another real action.
66
70
  2. **Freeze scope.** Read spec, tasks, state, test plan, and full diff. Require
67
- every slice built except a [deferred slice](../rite-plan/reference/slicing.md#deferred-slice). Missing `test-plan.md` returns to Vet inline (Prove stays the controlling
68
- caller) and resumes here; it never authorizes ad hoc proof.
71
+ every slice built except a [deferred slice](../rite-plan/reference/slicing.md#deferred-slice). Missing `test-plan.md` returns to Vet inline (Prove stays the source-local
72
+ controlling caller) and resumes here; it never authorizes ad hoc proof.
69
73
  3. **Approve commands.** If absent, use
70
74
  [test-command-discovery](reference/test-command-discovery.md) over repository
71
75
  manifests/CI. Discovery is evidence only: `test-plan.md` is the sole approved runtime
@@ -119,6 +123,10 @@ test changes.
119
123
  7. **Independent validation.** Fresh read-only `devrites-proof-runner` and
120
124
  `devrites-spec-reviewer`, in one parallel wave, judge the same candidate/commands/evidence/acceptance map.
121
125
  Neither runs commands; reject missing/stale, invented-ID, label-only or self-attested reports.
126
+ Under Autocomplete, before native wait return scheduling to its global frontier
127
+ pass, retaining both validator handles. Standalone Prove stays source-local.
128
+ Apply the shared protected validation window and recheck identities before
129
+ admitting accounts.
122
130
  8. **Map proof.** Reconcile verdicts under [acceptance-proof.md](reference/acceptance-proof.md).
123
131
  Every criterion/scenario/interaction/key link needs discriminating evidence or a
124
132
  blocker, including critical-path, observability, developer and wiring branches.
@@ -62,6 +62,9 @@ Pull these via `Read` when the diff demands them:
62
62
  0. Read `.pi/skills/devrites-lib/reference/standards/core.md` first (the always-on operating rules); pull the
63
63
  on-demand rules above as the diff demands them.
64
64
  Resolve source per [phase target binding](../devrites-lib/reference/parallel-workspaces.md#phase-target-binding) before loading workspace artifacts.
65
+ Under Autocomplete, return scheduling for its
66
+ [global frontier pass](../devrites-lib/reference/parallel-workspaces.md#continuous-global-frontier)
67
+ before cold/local recovery, preserving Review's source-local return cursor.
65
68
  1. Read `spec.md`, `tasks.md`, `state.md`, `decisions.md`,
66
69
  `touched-files.md`, `.devrites/principles.md` (if present: the binding invariants to score
67
70
  the diff against), and the `git diff`. For "what would this change break"
@@ -127,6 +130,10 @@ Pull these via `Read` when the diff demands them:
127
130
  [[`agents.md`](../devrites-lib/reference/standards/agents.md) § Result admission](../devrites-lib/reference/standards/agents.md#result-admission).
128
131
  Either `Outcome: gap` stops Review; silence, failure, or malformed output never
129
132
  becomes an empty findings list.
133
+ Under Autocomplete, before native wait return scheduling to its global frontier
134
+ pass with cohort handles retained; standalone Review stays source-local. Apply
135
+ the shared protected validation window and identity recheck before account
136
+ admission.
130
137
  4. **Reconcile, don't re-review.** With the two parallel reports in hand, the inline
131
138
  lead reconciles. It does **not** re-run the code-review axes over correctness /
132
139
  readability / architecture / maintainability that `devrites-code-reviewer` already
@@ -78,6 +78,9 @@ plan declares a root-authored executable workflow file, read
78
78
  assumptions, and state. Require approved Plan and `Decision coverage: CLEAR`;
79
79
  otherwise stop for Define or Clarify. Check placement (`get_architecture`),
80
80
  blast radius (`trace_path`), and reuse (`search_graph`) per [`code-navigation.md`](../devrites-lib/reference/standards/code-navigation.md).
81
+ Under Autocomplete, return scheduling for its
82
+ [global frontier pass](../devrites-lib/reference/parallel-workspaces.md#continuous-global-frontier)
83
+ before cold/local recovery; preserve Vet's source-local return cursor.
81
84
  1. **Select depth.** Apply `reference/depth.md` exactly; never skip. Initial passes
82
85
  record engineering verdict and test-plan coverage. Valid Recovery rechecks
83
86
  retain prior depth; enter 1b.
@@ -87,12 +90,18 @@ plan declares a root-authored executable workflow file, read
87
90
  parallel under `../devrites-lib/reference/parallel-dispatch.md`: independent
88
91
  read-only passes on one frozen candidate. Missing required account blocks.
89
92
  Meanwhile run root steps 2–4, including step 3 preflight commands, on that
90
- candidate; reconcile returned accounts.
93
+ candidate. Under Autocomplete, before native wait return scheduling to its
94
+ global frontier pass with reviewer handles retained; standalone Vet stays
95
+ source-local. Apply the shared protected validation window and identity
96
+ recheck before reconciling returned accounts.
91
97
  1b. **Recovery recheck.** Require valid return cursor, accepted prior finding,
92
98
  exact fingerprint/reproduction, repaired candidate identity, changed
93
99
  paths/criteria, affected drift/evidence, and the recorded delta self-check.
94
100
  Freeze that packet and dispatch each exact owning reviewer once,
95
101
  fresh/read-only, limited to it — all its open fingerprints in that dispatch.
102
+ Under Autocomplete, before native wait use the same controller pass and retained
103
+ handles as step 1a; standalone Vet stays source-local. Apply the same
104
+ protected-window account admission.
96
105
  Do not rerun broad inventory or unaffected reviewers. Close the prior
97
106
  fingerprint only with discriminating evidence plus an explicit
98
107
  correction-created regression verdict on the touched invariants (acyclic
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "devrites",
3
- "version": "7.3.0",
3
+ "version": "7.3.2",
4
4
  "description": "DevRites: a disciplined senior-engineer workflow pack for Claude Code, Codex, omp, pi, and Devin CLI",
5
5
  "license": "SEE LICENSE IN LICENSE",
6
6
  "homepage": "https://github.com/ViktorsBaikers/DevRites#readme",
@@ -127,7 +127,7 @@ def generate(source, target):
127
127
  text = rewrite(path.read_text())
128
128
  fields, body = frontmatter(text)
129
129
  role = fields["name"]
130
- permission = "workspace-write" if fields.get("permissionMode") == "acceptEdits" else "read-only"
130
+ permission = "workspace-write" if fields.get("permissionMode") == "acceptEdits" or role.startswith("overhaul-") else "read-only"
131
131
  raw = fields.get("tools", "Read, Grep, Glob, Bash, Skill" + (", Edit, Write" if permission == "workspace-write" else ""))
132
132
  tools = mapped_tools(raw)
133
133
  if permission == "read-only":
@@ -215,6 +215,35 @@ dr_acquire_engine() {
215
215
  return 1
216
216
  }
217
217
 
218
+ # Stage only external Windows uninstall engines; the launcher removes the copy
219
+ # after exit, leaving the configured global image unloaded and removable.
220
+ dr_stage_uninstall_engine() {
221
+ case "$(uname -s 2>/dev/null)" in
222
+ MINGW*|MSYS*|CYGWIN*) : ;;
223
+ *) return 0 ;;
224
+ esac
225
+ if [ -n "${DR_ENGINE_TMP:-}" ] && [ "$DR_ENGINE_PATH" = "$DR_ENGINE_TMP/devrites-engine" ]; then
226
+ return 0
227
+ fi
228
+ if [ -z "${DR_ENGINE_TMP:-}" ]; then
229
+ _dr_old_umask="$(umask)"
230
+ umask 077
231
+ DR_ENGINE_TMP="$(mktemp -d "${TMPDIR:-/tmp}/devrites-engine-bootstrap.XXXXXX" 2>/dev/null)" || {
232
+ umask "$_dr_old_umask"
233
+ DR_ENGINE_TMP=""
234
+ DR_ACQUIRE_FAILURE="could not stage devrites-engine for Windows uninstall: temporary directory creation failed"
235
+ return 1
236
+ }
237
+ umask "$_dr_old_umask"
238
+ fi
239
+ _dr_uninstall_engine="$DR_ENGINE_TMP/devrites-engine-uninstall.exe"
240
+ if ! cp -- "$DR_ENGINE_PATH" "$_dr_uninstall_engine" || ! chmod +x "$_dr_uninstall_engine"; then
241
+ DR_ACQUIRE_FAILURE="could not stage devrites-engine for Windows uninstall: executable copy failed"
242
+ return 1
243
+ fi
244
+ DR_ENGINE_PATH="$_dr_uninstall_engine"
245
+ }
246
+
218
247
  # True when $1 holds every file the engine requires from a host payload: the
219
248
  # union of hostpack.RequiredPayload for all hosts plus each host's standards.
220
249
  dr_payload_complete() {
package/uninstall.sh CHANGED
@@ -31,6 +31,7 @@ DR_ENGINE_PATH=""; DR_ENGINE_TMP=""
31
31
  trap dr_cleanup_engine EXIT
32
32
  trap 'exit 1' HUP INT TERM
33
33
  dr_acquire_engine "$SELF_DIR" uninstall "$DEVRITES_REPO" || { echo "error: could not acquire devrites-engine${DR_ACQUIRE_FAILURE:+ ($DR_ACQUIRE_FAILURE)}." >&2; exit 1; }
34
+ dr_stage_uninstall_engine || { echo "error: ${DR_ACQUIRE_FAILURE:-could not stage devrites-engine for Windows uninstall}." >&2; exit 1; }
34
35
  ENGINE="$DR_ENGINE_PATH"
35
36
  export DEVRITES_ENGINE_CLI="$ENGINE"
36
37
  "$ENGINE" uninstall --source-dir "$SELF_DIR" "$@"