@wipcomputer/wip-ai-devops-toolbox 1.9.57 → 1.9.59

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 (195) hide show
  1. package/.worktrees/toolbox--guard-plan/.license-guard.json +7 -0
  2. package/.worktrees/toolbox--guard-plan/.publish-skill.json +4 -0
  3. package/.worktrees/toolbox--guard-plan/CHANGELOG.md +1965 -0
  4. package/.worktrees/toolbox--guard-plan/CLA.md +19 -0
  5. package/.worktrees/toolbox--guard-plan/DEV-GUIDE-GENERAL-PUBLIC.md +949 -0
  6. package/.worktrees/toolbox--guard-plan/LICENSE +52 -0
  7. package/.worktrees/toolbox--guard-plan/README.md +238 -0
  8. package/.worktrees/toolbox--guard-plan/RELEASE-NOTES-v1-9-59.md +28 -0
  9. package/.worktrees/toolbox--guard-plan/SKILL.md +821 -0
  10. package/.worktrees/toolbox--guard-plan/TECHNICAL.md +416 -0
  11. package/.worktrees/toolbox--guard-plan/UNIVERSAL-INTERFACE.md +180 -0
  12. package/.worktrees/toolbox--guard-plan/_trash/RELEASE-NOTES-v1-8-0.md +29 -0
  13. package/.worktrees/toolbox--guard-plan/_trash/RELEASE-NOTES-v1-8-1.md +7 -0
  14. package/.worktrees/toolbox--guard-plan/_trash/RELEASE-NOTES-v1-8-2.md +7 -0
  15. package/.worktrees/toolbox--guard-plan/_trash/RELEASE-NOTES-v1-9-0.md +37 -0
  16. package/.worktrees/toolbox--guard-plan/_trash/RELEASE-NOTES-v1-9-1.md +38 -0
  17. package/.worktrees/toolbox--guard-plan/_trash/RELEASE-NOTES-v1-9-10.md +40 -0
  18. package/.worktrees/toolbox--guard-plan/_trash/RELEASE-NOTES-v1-9-2.md +40 -0
  19. package/.worktrees/toolbox--guard-plan/_trash/RELEASE-NOTES-v1-9-31.md +26 -0
  20. package/.worktrees/toolbox--guard-plan/_trash/RELEASE-NOTES-v1-9-32.md +18 -0
  21. package/.worktrees/toolbox--guard-plan/_trash/RELEASE-NOTES-v1-9-41.md +28 -0
  22. package/.worktrees/toolbox--guard-plan/_trash/RELEASE-NOTES-v1-9-45.md +25 -0
  23. package/.worktrees/toolbox--guard-plan/_trash/RELEASE-NOTES-v1-9-46.md +38 -0
  24. package/.worktrees/toolbox--guard-plan/_trash/RELEASE-NOTES-v1-9-47.md +42 -0
  25. package/.worktrees/toolbox--guard-plan/_trash/RELEASE-NOTES-v1-9-48.md +22 -0
  26. package/.worktrees/toolbox--guard-plan/_trash/RELEASE-NOTES-v1-9-49.md +31 -0
  27. package/.worktrees/toolbox--guard-plan/_trash/RELEASE-NOTES-v1-9-50.md +24 -0
  28. package/.worktrees/toolbox--guard-plan/_trash/RELEASE-NOTES-v1-9-51.md +11 -0
  29. package/.worktrees/toolbox--guard-plan/_trash/RELEASE-NOTES-v1-9-52.md +25 -0
  30. package/.worktrees/toolbox--guard-plan/_trash/RELEASE-NOTES-v1-9-53.md +22 -0
  31. package/.worktrees/toolbox--guard-plan/_trash/RELEASE-NOTES-v1-9-54.md +13 -0
  32. package/.worktrees/toolbox--guard-plan/_trash/RELEASE-NOTES-v1-9-55.md +11 -0
  33. package/.worktrees/toolbox--guard-plan/_trash/RELEASE-NOTES-v1-9-56.md +42 -0
  34. package/.worktrees/toolbox--guard-plan/_trash/RELEASE-NOTES-v1-9-57.md +18 -0
  35. package/.worktrees/toolbox--guard-plan/_trash/RELEASE-NOTES-v1-9-58.md +21 -0
  36. package/.worktrees/toolbox--guard-plan/_trash/RELEASE-NOTES-v1-9-6.md +72 -0
  37. package/.worktrees/toolbox--guard-plan/_trash/RELEASE-NOTES-v1-9-7.md +23 -0
  38. package/.worktrees/toolbox--guard-plan/_trash/RELEASE-NOTES-v1-9-9.md +75 -0
  39. package/.worktrees/toolbox--guard-plan/_trash/guide 2/DEV-GUIDE.md +487 -0
  40. package/.worktrees/toolbox--guard-plan/_trash/guide 2/scripts/deploy-public.sh +152 -0
  41. package/.worktrees/toolbox--guard-plan/package.json +27 -0
  42. package/.worktrees/toolbox--guard-plan/scripts/SKILL-deploy-public.md +61 -0
  43. package/.worktrees/toolbox--guard-plan/scripts/SKILL-post-merge-rename.md +47 -0
  44. package/.worktrees/toolbox--guard-plan/scripts/deploy-public.sh +350 -0
  45. package/.worktrees/toolbox--guard-plan/scripts/post-merge-rename.sh +210 -0
  46. package/.worktrees/toolbox--guard-plan/scripts/publish-skill.sh +134 -0
  47. package/.worktrees/toolbox--guard-plan/templates/global-claude-md.md +73 -0
  48. package/.worktrees/toolbox--guard-plan/templates/repo-claude-md.template +24 -0
  49. package/.worktrees/toolbox--guard-plan/tools/deploy-public/LICENSE +52 -0
  50. package/.worktrees/toolbox--guard-plan/tools/deploy-public/README.md +31 -0
  51. package/.worktrees/toolbox--guard-plan/tools/deploy-public/SKILL.md +71 -0
  52. package/.worktrees/toolbox--guard-plan/tools/deploy-public/deploy-public.sh +264 -0
  53. package/.worktrees/toolbox--guard-plan/tools/deploy-public/package.json +9 -0
  54. package/.worktrees/toolbox--guard-plan/tools/ldm-jobs/LICENSE +52 -0
  55. package/.worktrees/toolbox--guard-plan/tools/ldm-jobs/README.md +46 -0
  56. package/.worktrees/toolbox--guard-plan/tools/ldm-jobs/backup.sh +16 -0
  57. package/.worktrees/toolbox--guard-plan/tools/ldm-jobs/branch-protect.sh +39 -0
  58. package/.worktrees/toolbox--guard-plan/tools/ldm-jobs/crystal-capture.sh +19 -0
  59. package/.worktrees/toolbox--guard-plan/tools/ldm-jobs/setup-shell.sh +27 -0
  60. package/.worktrees/toolbox--guard-plan/tools/ldm-jobs/visibility-audit.sh +27 -0
  61. package/.worktrees/toolbox--guard-plan/tools/post-merge-rename/LICENSE +52 -0
  62. package/.worktrees/toolbox--guard-plan/tools/post-merge-rename/README.md +29 -0
  63. package/.worktrees/toolbox--guard-plan/tools/post-merge-rename/SKILL.md +57 -0
  64. package/.worktrees/toolbox--guard-plan/tools/post-merge-rename/package.json +9 -0
  65. package/.worktrees/toolbox--guard-plan/tools/post-merge-rename/post-merge-rename.sh +122 -0
  66. package/.worktrees/toolbox--guard-plan/tools/wip-branch-guard/INSTALL.md +41 -0
  67. package/.worktrees/toolbox--guard-plan/tools/wip-branch-guard/guard.mjs +477 -0
  68. package/.worktrees/toolbox--guard-plan/tools/wip-branch-guard/package.json +18 -0
  69. package/.worktrees/toolbox--guard-plan/tools/wip-file-guard/CHANGELOG.md +6 -0
  70. package/.worktrees/toolbox--guard-plan/tools/wip-file-guard/LICENSE +52 -0
  71. package/.worktrees/toolbox--guard-plan/tools/wip-file-guard/README.md +113 -0
  72. package/.worktrees/toolbox--guard-plan/tools/wip-file-guard/REFERENCE.md +86 -0
  73. package/.worktrees/toolbox--guard-plan/tools/wip-file-guard/SKILL.md +105 -0
  74. package/.worktrees/toolbox--guard-plan/tools/wip-file-guard/guard.mjs +161 -0
  75. package/.worktrees/toolbox--guard-plan/tools/wip-file-guard/openclaw.plugin.json +8 -0
  76. package/.worktrees/toolbox--guard-plan/tools/wip-file-guard/package.json +27 -0
  77. package/.worktrees/toolbox--guard-plan/tools/wip-file-guard/test.sh +119 -0
  78. package/.worktrees/toolbox--guard-plan/tools/wip-license-guard/LICENSE +52 -0
  79. package/.worktrees/toolbox--guard-plan/tools/wip-license-guard/README.md +69 -0
  80. package/.worktrees/toolbox--guard-plan/tools/wip-license-guard/SKILL.md +65 -0
  81. package/.worktrees/toolbox--guard-plan/tools/wip-license-guard/cli.mjs +472 -0
  82. package/.worktrees/toolbox--guard-plan/tools/wip-license-guard/core.mjs +310 -0
  83. package/.worktrees/toolbox--guard-plan/tools/wip-license-guard/guard.mjs +146 -0
  84. package/.worktrees/toolbox--guard-plan/tools/wip-license-guard/package.json +22 -0
  85. package/.worktrees/toolbox--guard-plan/tools/wip-license-hook/CHANGELOG.md +17 -0
  86. package/.worktrees/toolbox--guard-plan/tools/wip-license-hook/LICENSE +52 -0
  87. package/.worktrees/toolbox--guard-plan/tools/wip-license-hook/README.md +200 -0
  88. package/.worktrees/toolbox--guard-plan/tools/wip-license-hook/SKILL.md +111 -0
  89. package/.worktrees/toolbox--guard-plan/tools/wip-license-hook/dist/cli/index.d.ts +15 -0
  90. package/.worktrees/toolbox--guard-plan/tools/wip-license-hook/dist/cli/index.js +170 -0
  91. package/.worktrees/toolbox--guard-plan/tools/wip-license-hook/dist/cli/index.js.map +1 -0
  92. package/.worktrees/toolbox--guard-plan/tools/wip-license-hook/dist/core/detector.d.ts +12 -0
  93. package/.worktrees/toolbox--guard-plan/tools/wip-license-hook/dist/core/detector.js +104 -0
  94. package/.worktrees/toolbox--guard-plan/tools/wip-license-hook/dist/core/detector.js.map +1 -0
  95. package/.worktrees/toolbox--guard-plan/tools/wip-license-hook/dist/core/index.d.ts +4 -0
  96. package/.worktrees/toolbox--guard-plan/tools/wip-license-hook/dist/core/index.js +5 -0
  97. package/.worktrees/toolbox--guard-plan/tools/wip-license-hook/dist/core/index.js.map +1 -0
  98. package/.worktrees/toolbox--guard-plan/tools/wip-license-hook/dist/core/ledger.d.ts +49 -0
  99. package/.worktrees/toolbox--guard-plan/tools/wip-license-hook/dist/core/ledger.js +72 -0
  100. package/.worktrees/toolbox--guard-plan/tools/wip-license-hook/dist/core/ledger.js.map +1 -0
  101. package/.worktrees/toolbox--guard-plan/tools/wip-license-hook/dist/core/reporter.d.ts +14 -0
  102. package/.worktrees/toolbox--guard-plan/tools/wip-license-hook/dist/core/reporter.js +227 -0
  103. package/.worktrees/toolbox--guard-plan/tools/wip-license-hook/dist/core/reporter.js.map +1 -0
  104. package/.worktrees/toolbox--guard-plan/tools/wip-license-hook/dist/core/scanner.d.ts +39 -0
  105. package/.worktrees/toolbox--guard-plan/tools/wip-license-hook/dist/core/scanner.js +325 -0
  106. package/.worktrees/toolbox--guard-plan/tools/wip-license-hook/dist/core/scanner.js.map +1 -0
  107. package/.worktrees/toolbox--guard-plan/tools/wip-license-hook/hooks/pre-pull.sh +55 -0
  108. package/.worktrees/toolbox--guard-plan/tools/wip-license-hook/hooks/pre-push.sh +51 -0
  109. package/.worktrees/toolbox--guard-plan/tools/wip-license-hook/mcp-server.mjs +119 -0
  110. package/.worktrees/toolbox--guard-plan/tools/wip-license-hook/package-lock.json +54 -0
  111. package/.worktrees/toolbox--guard-plan/tools/wip-license-hook/package.json +43 -0
  112. package/.worktrees/toolbox--guard-plan/tools/wip-license-hook/src/cli/index.ts +189 -0
  113. package/.worktrees/toolbox--guard-plan/tools/wip-license-hook/src/core/detector.ts +130 -0
  114. package/.worktrees/toolbox--guard-plan/tools/wip-license-hook/src/core/index.ts +4 -0
  115. package/.worktrees/toolbox--guard-plan/tools/wip-license-hook/src/core/ledger.ts +116 -0
  116. package/.worktrees/toolbox--guard-plan/tools/wip-license-hook/src/core/reporter.ts +255 -0
  117. package/.worktrees/toolbox--guard-plan/tools/wip-license-hook/src/core/scanner.ts +367 -0
  118. package/.worktrees/toolbox--guard-plan/tools/wip-license-hook/tsconfig.json +16 -0
  119. package/.worktrees/toolbox--guard-plan/tools/wip-readme-format/README.md +49 -0
  120. package/.worktrees/toolbox--guard-plan/tools/wip-readme-format/SKILL.md +84 -0
  121. package/.worktrees/toolbox--guard-plan/tools/wip-readme-format/format.mjs +597 -0
  122. package/.worktrees/toolbox--guard-plan/tools/wip-readme-format/package.json +15 -0
  123. package/.worktrees/toolbox--guard-plan/tools/wip-release/CHANGELOG.md +42 -0
  124. package/.worktrees/toolbox--guard-plan/tools/wip-release/LICENSE +52 -0
  125. package/.worktrees/toolbox--guard-plan/tools/wip-release/README.md +45 -0
  126. package/.worktrees/toolbox--guard-plan/tools/wip-release/REFERENCE.md +100 -0
  127. package/.worktrees/toolbox--guard-plan/tools/wip-release/SKILL.md +139 -0
  128. package/.worktrees/toolbox--guard-plan/tools/wip-release/cli.js +175 -0
  129. package/.worktrees/toolbox--guard-plan/tools/wip-release/core.mjs +1664 -0
  130. package/.worktrees/toolbox--guard-plan/tools/wip-release/mcp-server.mjs +113 -0
  131. package/.worktrees/toolbox--guard-plan/tools/wip-release/package.json +36 -0
  132. package/.worktrees/toolbox--guard-plan/tools/wip-repo-init/README.md +38 -0
  133. package/.worktrees/toolbox--guard-plan/tools/wip-repo-init/SKILL.md +77 -0
  134. package/.worktrees/toolbox--guard-plan/tools/wip-repo-init/init.mjs +148 -0
  135. package/.worktrees/toolbox--guard-plan/tools/wip-repo-init/package.json +11 -0
  136. package/.worktrees/toolbox--guard-plan/tools/wip-repo-init/templates/_sort/README.md +15 -0
  137. package/.worktrees/toolbox--guard-plan/tools/wip-repo-init/templates/_trash/README.md +16 -0
  138. package/.worktrees/toolbox--guard-plan/tools/wip-repo-init/templates/dev-updates/README.md +50 -0
  139. package/.worktrees/toolbox--guard-plan/tools/wip-repo-init/templates/product/notes/README.md +26 -0
  140. package/.worktrees/toolbox--guard-plan/tools/wip-repo-init/templates/product/plans-prds/roadmap.md +77 -0
  141. package/.worktrees/toolbox--guard-plan/tools/wip-repo-init/templates/product/plans-prds/todos/README.md +63 -0
  142. package/.worktrees/toolbox--guard-plan/tools/wip-repo-init/templates/product/product-ideas/README.md +24 -0
  143. package/.worktrees/toolbox--guard-plan/tools/wip-repo-init/templates/product/readme-first-product.md +128 -0
  144. package/.worktrees/toolbox--guard-plan/tools/wip-repo-init/templates/read-me-first.md +80 -0
  145. package/.worktrees/toolbox--guard-plan/tools/wip-repo-permissions-hook/LICENSE +52 -0
  146. package/.worktrees/toolbox--guard-plan/tools/wip-repo-permissions-hook/README.md +86 -0
  147. package/.worktrees/toolbox--guard-plan/tools/wip-repo-permissions-hook/SKILL.md +73 -0
  148. package/.worktrees/toolbox--guard-plan/tools/wip-repo-permissions-hook/cli.js +93 -0
  149. package/.worktrees/toolbox--guard-plan/tools/wip-repo-permissions-hook/core.mjs +122 -0
  150. package/.worktrees/toolbox--guard-plan/tools/wip-repo-permissions-hook/guard.mjs +64 -0
  151. package/.worktrees/toolbox--guard-plan/tools/wip-repo-permissions-hook/mcp-server.mjs +92 -0
  152. package/.worktrees/toolbox--guard-plan/tools/wip-repo-permissions-hook/openclaw.plugin.json +8 -0
  153. package/.worktrees/toolbox--guard-plan/tools/wip-repo-permissions-hook/package.json +31 -0
  154. package/.worktrees/toolbox--guard-plan/tools/wip-repos/LICENSE +52 -0
  155. package/.worktrees/toolbox--guard-plan/tools/wip-repos/README.md +77 -0
  156. package/.worktrees/toolbox--guard-plan/tools/wip-repos/SKILL.md +80 -0
  157. package/.worktrees/toolbox--guard-plan/tools/wip-repos/claude.mjs +248 -0
  158. package/.worktrees/toolbox--guard-plan/tools/wip-repos/cli.mjs +191 -0
  159. package/.worktrees/toolbox--guard-plan/tools/wip-repos/core.mjs +290 -0
  160. package/.worktrees/toolbox--guard-plan/tools/wip-repos/mcp-server.mjs +157 -0
  161. package/.worktrees/toolbox--guard-plan/tools/wip-repos/package.json +34 -0
  162. package/.worktrees/toolbox--guard-plan/tools/wip-universal-installer/CHANGELOG.md +57 -0
  163. package/.worktrees/toolbox--guard-plan/tools/wip-universal-installer/LICENSE +52 -0
  164. package/.worktrees/toolbox--guard-plan/tools/wip-universal-installer/README.md +81 -0
  165. package/.worktrees/toolbox--guard-plan/tools/wip-universal-installer/REFERENCE.md +122 -0
  166. package/.worktrees/toolbox--guard-plan/tools/wip-universal-installer/SKILL.md +87 -0
  167. package/.worktrees/toolbox--guard-plan/tools/wip-universal-installer/SPEC.md +206 -0
  168. package/.worktrees/toolbox--guard-plan/tools/wip-universal-installer/detect.mjs +130 -0
  169. package/.worktrees/toolbox--guard-plan/tools/wip-universal-installer/examples/minimal/README.md +20 -0
  170. package/.worktrees/toolbox--guard-plan/tools/wip-universal-installer/examples/minimal/SKILL.md +28 -0
  171. package/.worktrees/toolbox--guard-plan/tools/wip-universal-installer/examples/minimal/cli.mjs +4 -0
  172. package/.worktrees/toolbox--guard-plan/tools/wip-universal-installer/examples/minimal/core.mjs +8 -0
  173. package/.worktrees/toolbox--guard-plan/tools/wip-universal-installer/examples/minimal/mcp-server.mjs +27 -0
  174. package/.worktrees/toolbox--guard-plan/tools/wip-universal-installer/examples/minimal/package.json +12 -0
  175. package/.worktrees/toolbox--guard-plan/tools/wip-universal-installer/install.js +930 -0
  176. package/.worktrees/toolbox--guard-plan/tools/wip-universal-installer/package.json +32 -0
  177. package/CHANGELOG.md +55 -0
  178. package/SKILL.md +1 -1
  179. package/_trash/RELEASE-NOTES-v1-9-58.md +21 -0
  180. package/_trash/RELEASE-NOTES-v1-9-59.md +28 -0
  181. package/package.json +1 -1
  182. package/scripts/deploy-public.sh +3 -0
  183. package/tools/deploy-public/package.json +1 -1
  184. package/tools/post-merge-rename/package.json +1 -1
  185. package/tools/wip-branch-guard/guard.mjs +57 -39
  186. package/tools/wip-branch-guard/package.json +1 -1
  187. package/tools/wip-file-guard/package.json +1 -1
  188. package/tools/wip-license-guard/package.json +1 -1
  189. package/tools/wip-license-hook/package.json +1 -1
  190. package/tools/wip-readme-format/package.json +1 -1
  191. package/tools/wip-release/package.json +1 -1
  192. package/tools/wip-repo-init/package.json +1 -1
  193. package/tools/wip-repo-permissions-hook/package.json +1 -1
  194. package/tools/wip-repos/package.json +1 -1
  195. package/tools/wip-universal-installer/package.json +1 -1
@@ -0,0 +1,32 @@
1
+ {
2
+ "name": "@wipcomputer/universal-installer",
3
+ "version": "1.9.32",
4
+ "type": "module",
5
+ "description": "The Universal Interface specification for agent-native software. Teaches your AI how to build repos with every interface: CLI, Module, MCP Server, OpenClaw Plugin, Skill, Claude Code Hook.",
6
+ "main": "detect.mjs",
7
+ "exports": {
8
+ ".": "./detect.mjs",
9
+ "./detect": "./detect.mjs"
10
+ },
11
+ "scripts": {
12
+ "test": "node install.js --help"
13
+ },
14
+ "keywords": [
15
+ "installer",
16
+ "agent-native",
17
+ "sensor",
18
+ "actuator",
19
+ "universal-interface",
20
+ "claude-code",
21
+ "openclaw",
22
+ "mcp",
23
+ "cli"
24
+ ],
25
+ "author": "Parker Todd Brooks",
26
+ "license": "MIT",
27
+ "repository": {
28
+ "type": "git",
29
+ "url": "git+https://github.com/wipcomputer/wip-universal-installer.git"
30
+ },
31
+ "homepage": "https://github.com/wipcomputer/wip-universal-installer"
32
+ }
package/CHANGELOG.md CHANGED
@@ -31,6 +31,61 @@
31
31
 
32
32
 
33
33
 
34
+
35
+ ## 1.9.59 (2026-03-29)
36
+
37
+ # Release Notes: wip-ai-devops-toolbox v1.9.59
38
+
39
+ **Fix three bugs in branch guard destructive command handling.**
40
+
41
+ ## The story
42
+
43
+ v1.9.56 added destructive command blocking but introduced three bugs because the new code was written differently from the existing guard pattern. The existing guard checks allowed patterns before blocked patterns and works per-command. The new code skipped the allowed check and matched against the entire raw command string, causing false positives on quoted text (blocking `gh issue create` when the body mentioned git commands) and false negatives on compound commands (allowing `rm -f file ; echo done` because `echo` is in the allowed list).
44
+
45
+ Fix: two helper functions that strip quoted content before matching and check each command segment independently. Same pattern as the existing guard code. Also adds `~/.claude/plans/` to the shared state allowlist so plan files are editable.
46
+
47
+ ## Issues closed
48
+
49
+ - #232 (branch guard three bugs in v1.9.56)
50
+
51
+ ## How to verify
52
+
53
+ ```bash
54
+ # These should now be ALLOWED (were false-positive blocked):
55
+ # gh issue create --body "use git checkout -- to fix"
56
+ # echo "don't run git commit on main"
57
+
58
+ # These should now be DENIED (were false-negative allowed):
59
+ # rm -f file ; echo done (on main)
60
+
61
+ # These should still be DENIED:
62
+ # git checkout -- file.txt
63
+ # python3 -c "open('f').write('x')"
64
+ ```
65
+
66
+ ## 1.9.58 (2026-03-29)
67
+
68
+ # Release Notes: wip-ai-devops-toolbox v1.9.58
69
+
70
+ **Fix deploy-public.sh losing release notes when invoked with relative path.**
71
+
72
+ ## The story
73
+
74
+ When deploy-public.sh was called with `.` as the private repo path (e.g. `bash scripts/deploy-public.sh . wipcomputer/repo`), the script later cd'd into a temp directory. After that, `cd "."` no longer pointed to the private repo, so `gh release view` failed silently and release notes fell back to the empty "Release vX.Y.Z" default. This has been broken since at least v1.9.51.
75
+
76
+ Fix: resolve PRIVATE_REPO to an absolute path at startup before any cd happens.
77
+
78
+ ## Issues closed
79
+
80
+ - #228 (continued from v1.9.57)
81
+
82
+ ## How to verify
83
+
84
+ ```bash
85
+ # From a repo directory, run with "." and check public release has real notes:
86
+ cd /path/to/private-repo
87
+ bash scripts/deploy-public.sh . wipcomputer/public-repo --dry-run
88
+ ```
34
89
 
35
90
  ## 1.9.57 (2026-03-29)
36
91
 
package/SKILL.md CHANGED
@@ -5,7 +5,7 @@ license: MIT
5
5
  interface: [cli, module, mcp, skill, hook, plugin]
6
6
  metadata:
7
7
  display-name: "WIP AI DevOps Toolbox"
8
- version: "1.9.57"
8
+ version: "1.9.59"
9
9
  homepage: "https://github.com/wipcomputer/wip-ai-devops-toolbox"
10
10
  author: "Parker Todd Brooks"
11
11
  category: dev-tools
@@ -0,0 +1,21 @@
1
+ # Release Notes: wip-ai-devops-toolbox v1.9.58
2
+
3
+ **Fix deploy-public.sh losing release notes when invoked with relative path.**
4
+
5
+ ## The story
6
+
7
+ When deploy-public.sh was called with `.` as the private repo path (e.g. `bash scripts/deploy-public.sh . wipcomputer/repo`), the script later cd'd into a temp directory. After that, `cd "."` no longer pointed to the private repo, so `gh release view` failed silently and release notes fell back to the empty "Release vX.Y.Z" default. This has been broken since at least v1.9.51.
8
+
9
+ Fix: resolve PRIVATE_REPO to an absolute path at startup before any cd happens.
10
+
11
+ ## Issues closed
12
+
13
+ - #228 (continued from v1.9.57)
14
+
15
+ ## How to verify
16
+
17
+ ```bash
18
+ # From a repo directory, run with "." and check public release has real notes:
19
+ cd /path/to/private-repo
20
+ bash scripts/deploy-public.sh . wipcomputer/public-repo --dry-run
21
+ ```
@@ -0,0 +1,28 @@
1
+ # Release Notes: wip-ai-devops-toolbox v1.9.59
2
+
3
+ **Fix three bugs in branch guard destructive command handling.**
4
+
5
+ ## The story
6
+
7
+ v1.9.56 added destructive command blocking but introduced three bugs because the new code was written differently from the existing guard pattern. The existing guard checks allowed patterns before blocked patterns and works per-command. The new code skipped the allowed check and matched against the entire raw command string, causing false positives on quoted text (blocking `gh issue create` when the body mentioned git commands) and false negatives on compound commands (allowing `rm -f file ; echo done` because `echo` is in the allowed list).
8
+
9
+ Fix: two helper functions that strip quoted content before matching and check each command segment independently. Same pattern as the existing guard code. Also adds `~/.claude/plans/` to the shared state allowlist so plan files are editable.
10
+
11
+ ## Issues closed
12
+
13
+ - #232 (branch guard three bugs in v1.9.56)
14
+
15
+ ## How to verify
16
+
17
+ ```bash
18
+ # These should now be ALLOWED (were false-positive blocked):
19
+ # gh issue create --body "use git checkout -- to fix"
20
+ # echo "don't run git commit on main"
21
+
22
+ # These should now be DENIED (were false-negative allowed):
23
+ # rm -f file ; echo done (on main)
24
+
25
+ # These should still be DENIED:
26
+ # git checkout -- file.txt
27
+ # python3 -c "open('f').write('x')"
28
+ ```
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@wipcomputer/wip-ai-devops-toolbox",
3
- "version": "1.9.57",
3
+ "version": "1.9.59",
4
4
  "type": "module",
5
5
  "description": "The complete AI DevOps toolkit for AI-assisted development teams.",
6
6
  "license": "MIT",
@@ -44,6 +44,9 @@ if [[ -z "$PRIVATE_REPO" || -z "$PUBLIC_REPO" ]]; then
44
44
  exit 1
45
45
  fi
46
46
 
47
+ # Resolve to absolute path so later cd's don't break when cwd changes
48
+ PRIVATE_REPO="$(cd "$PRIVATE_REPO" && pwd)"
49
+
47
50
  if [[ ! -d "$PRIVATE_REPO/.git" ]]; then
48
51
  echo "Error: $PRIVATE_REPO is not a git repository"
49
52
  exit 1
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@wipcomputer/deploy-public",
3
- "version": "1.9.57",
3
+ "version": "1.9.59",
4
4
  "description": "Private-to-public repo sync. Excludes ai/ folder, creates PR, merges, cleans up branches.",
5
5
  "bin": {
6
6
  "deploy-public": "./deploy-public.sh"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@wipcomputer/post-merge-rename",
3
- "version": "1.9.57",
3
+ "version": "1.9.59",
4
4
  "description": "Post-merge branch renaming. Appends --merged-YYYY-MM-DD to preserve history.",
5
5
  "bin": {
6
6
  "post-merge-rename": "./post-merge-rename.sh"
@@ -32,20 +32,49 @@ const BLOCKED_GIT_PATTERNS = [
32
32
  /\bgit\s+restore\b/,
33
33
  ];
34
34
 
35
- // Destructive commands blocked on ANY branch, not just main.
35
+ // Destructive git commands blocked on ANY branch, not just main.
36
36
  // These destroy work that may belong to other agents or the user.
37
+ // Checked against STRIPPED command (quoted content removed) to avoid false positives (#232).
37
38
  const DESTRUCTIVE_PATTERNS = [
38
39
  /\bgit\s+clean\s+-[a-zA-Z]*f/, // git clean -f, -fd, -fdx (deletes untracked files)
39
40
  /\bgit\s+checkout\s+--\s/, // git checkout -- <path> (reverts files)
40
41
  /\bgit\s+checkout\s+\.\s*$/, // git checkout . (reverts everything)
41
42
  /\bgit\s+stash\s+drop\b/, // git stash drop (permanently deletes stashed work)
42
43
  /\bgit\s+stash\s+pop\b/, // git stash pop (overwrites working tree, drops on success)
44
+ /\bgit\s+stash\s+clear\b/, // git stash clear (drops all stashes)
43
45
  /\bgit\s+reset\s+--hard\b/, // git reset --hard (nukes all uncommitted changes)
44
46
  /\bgit\s+restore\s+(?!--staged)/, // git restore <path> (reverts files, but --staged is safe)
47
+ ];
48
+
49
+ // Code execution bypass patterns. Checked against ORIGINAL command because
50
+ // the attack IS inside quotes (e.g. python -c "open('f').write('x')").
51
+ const DESTRUCTIVE_CODE_PATTERNS = [
45
52
  /\bpython3?\s+-c\s+.*\bopen\s*\(/, // python -c "open().write()" bypass (#241)
46
53
  /\bnode\s+-e\s+.*\bfs\.\w*[Ww]rite/, // node -e "fs.writeFile()" bypass
47
54
  ];
48
55
 
56
+ // Strip quoted string contents to prevent regex matching inside data.
57
+ // "gh issue create --body 'use git checkout -- to fix'" becomes
58
+ // "gh issue create --body ''" so git checkout -- doesn't false-positive.
59
+ function stripQuotedContent(cmd) {
60
+ return cmd.replace(/"(?:[^"\\]|\\.)*"|'(?:[^'\\]|\\.)*'/g, '""');
61
+ }
62
+
63
+ // Check each segment of a compound command independently.
64
+ // "rm -f file ; echo done" splits into ["rm -f file", "echo done"].
65
+ // Each segment checked against blocked, then allowed. An allowed match
66
+ // on one segment can't excuse a blocked match on a different segment (#232).
67
+ function isBlockedCompoundCommand(cmd, blockedPatterns, allowedPatterns) {
68
+ const stripped = stripQuotedContent(cmd);
69
+ const segments = stripped.split(/\s*(?:&&|\|\||[;|])\s*/).filter(Boolean);
70
+ for (const segment of segments) {
71
+ if (blockedPatterns.some(p => p.test(segment))) {
72
+ if (!allowedPatterns.some(p => p.test(segment))) return true;
73
+ }
74
+ }
75
+ return false;
76
+ }
77
+
49
78
  // Git commands that are ALLOWED on main (read-only or safe operations)
50
79
  const ALLOWED_GIT_PATTERNS = [
51
80
  /\bgit\s+merge\b/,
@@ -239,11 +268,13 @@ async function main() {
239
268
 
240
269
  // Block destructive commands on ANY branch.
241
270
  // These destroy work that may belong to other agents or the user.
242
- // The agent should NEVER reach for these. If something is stuck, tell the user.
243
271
  if (toolName === BASH_TOOL) {
244
272
  const cmd = (toolInput.command || '');
273
+ const strippedCmd = stripQuotedContent(cmd);
274
+
275
+ // Git destructive patterns: check against stripped command (no quoted content)
245
276
  for (const pattern of DESTRUCTIVE_PATTERNS) {
246
- if (pattern.test(cmd)) {
277
+ if (pattern.test(strippedCmd)) {
247
278
  deny(`BLOCKED: Destructive command detected.
248
279
 
249
280
  "${cmd.substring(0, 80)}" can permanently destroy uncommitted work (yours, the user's, or another agent's).
@@ -260,6 +291,17 @@ These commands have destroyed work belonging to the user and other agents multip
260
291
  process.exit(0);
261
292
  }
262
293
  }
294
+ // Code execution bypasses: check against original command (the attack IS inside quotes)
295
+ for (const pattern of DESTRUCTIVE_CODE_PATTERNS) {
296
+ if (pattern.test(cmd)) {
297
+ deny(`BLOCKED: Code execution bypass detected.
298
+
299
+ "${cmd.substring(0, 80)}" writes files through a scripting language, bypassing git protections.
300
+
301
+ Use the proper workflow: edit files in a worktree, commit, push, PR.`);
302
+ process.exit(0);
303
+ }
304
+ }
263
305
  }
264
306
 
265
307
  // Block dangerous flags on ANY branch (these bypass safety checks)
@@ -375,8 +417,7 @@ This is a warning, not a block. If you need to create it here, retry.`);
375
417
  // On a branch but NOT in a worktree. Block writes.
376
418
  const isWriteOp = WRITE_TOOLS.has(toolName) ||
377
419
  (toolName === BASH_TOOL && command &&
378
- BLOCKED_BASH_PATTERNS.some(p => p.test(command)) &&
379
- !ALLOWED_BASH_PATTERNS.some(p => p.test(command)));
420
+ isBlockedCompoundCommand(command, BLOCKED_BASH_PATTERNS, ALLOWED_BASH_PATTERNS));
380
421
  if (isWriteOp) {
381
422
  deny(`BLOCKED: On branch "${branch}" but not in a worktree.\n\n${WORKFLOW_NOT_WORKTREE}`);
382
423
  process.exit(0);
@@ -400,6 +441,7 @@ This is a warning, not a block. If you need to create it here, retry.`);
400
441
  /\.ldm\/memory\/shared-log\.jsonl$/,
401
442
  /\.ldm\/memory\/daily\/.*\.md$/,
402
443
  /\.ldm\/logs\//,
444
+ /\.claude\/plans\//, // Claude Code plan files (plan mode)
403
445
  ];
404
446
 
405
447
  if (filePath && SHARED_STATE_PATTERNS.some(p => p.test(filePath))) {
@@ -412,43 +454,19 @@ This is a warning, not a block. If you need to create it here, retry.`);
412
454
  process.exit(0);
413
455
  }
414
456
 
415
- // For Bash, check the command
457
+ // For Bash, check each command segment independently (#232).
458
+ // No fast-path: an allowed pattern on one segment can't excuse a blocked pattern on another.
416
459
  if (toolName === BASH_TOOL && command) {
417
- // First check if it's explicitly allowed (read-only)
418
- for (const pattern of ALLOWED_BASH_PATTERNS) {
419
- if (pattern.test(command)) {
420
- process.exit(0);
421
- }
422
- }
423
-
424
- // Check for blocked git commands
425
- for (const pattern of BLOCKED_GIT_PATTERNS) {
426
- if (pattern.test(command)) {
427
- // Make sure it's not an allowed git operation
428
- let isAllowed = false;
429
- for (const ap of ALLOWED_GIT_PATTERNS) {
430
- if (ap.test(command)) { isAllowed = true; break; }
431
- }
432
- if (!isAllowed) {
433
- deny(`BLOCKED: Cannot run "${command.substring(0, 60)}..." on main branch.\n\n${WORKFLOW_ON_MAIN}`);
434
- process.exit(0);
435
- }
436
- }
460
+ // Check for blocked git commands (per-segment, quote-stripped)
461
+ if (isBlockedCompoundCommand(command, BLOCKED_GIT_PATTERNS, ALLOWED_GIT_PATTERNS)) {
462
+ deny(`BLOCKED: Cannot run "${command.substring(0, 60)}..." on main branch.\n\n${WORKFLOW_ON_MAIN}`);
463
+ process.exit(0);
437
464
  }
438
465
 
439
- // Check for file-writing bash commands
440
- for (const pattern of BLOCKED_BASH_PATTERNS) {
441
- if (pattern.test(command)) {
442
- // Check it's not a read-only context
443
- let isAllowed = false;
444
- for (const ap of ALLOWED_BASH_PATTERNS) {
445
- if (ap.test(command)) { isAllowed = true; break; }
446
- }
447
- if (!isAllowed) {
448
- deny(`BLOCKED: Cannot run file-modifying command on main branch.\n\n${WORKFLOW_ON_MAIN}`);
449
- process.exit(0);
450
- }
451
- }
466
+ // Check for file-writing bash commands (per-segment, quote-stripped)
467
+ if (isBlockedCompoundCommand(command, BLOCKED_BASH_PATTERNS, ALLOWED_BASH_PATTERNS)) {
468
+ deny(`BLOCKED: Cannot run file-modifying command on main branch.\n\n${WORKFLOW_ON_MAIN}`);
469
+ process.exit(0);
452
470
  }
453
471
  }
454
472
 
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@wipcomputer/wip-branch-guard",
3
- "version": "1.9.57",
3
+ "version": "1.9.59",
4
4
  "description": "PreToolUse hook that blocks all writes on main branch. Forces agents to work on branches or worktrees.",
5
5
  "type": "module",
6
6
  "main": "guard.mjs",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@wipcomputer/wip-file-guard",
3
- "version": "1.9.57",
3
+ "version": "1.9.59",
4
4
  "type": "module",
5
5
  "description": "Hook that blocks destructive edits to protected identity files. For Claude Code CLI and OpenClaw.",
6
6
  "main": "guard.mjs",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@wipcomputer/wip-license-guard",
3
- "version": "1.9.57",
3
+ "version": "1.9.59",
4
4
  "description": "License compliance for your own repos. Ensures correct copyright, dual-license blocks, and LICENSE files.",
5
5
  "type": "module",
6
6
  "bin": {
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@wipcomputer/wip-license-hook",
3
- "version": "1.9.57",
3
+ "version": "1.9.59",
4
4
  "description": "License rug-pull detection and dependency license compliance for open source projects",
5
5
  "type": "module",
6
6
  "main": "dist/cli/index.js",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@wipcomputer/wip-readme-format",
3
- "version": "1.9.57",
3
+ "version": "1.9.59",
4
4
  "description": "Reformat any repo's README to follow the WIP Computer standard. Agent-first, human-readable.",
5
5
  "type": "module",
6
6
  "bin": {
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@wipcomputer/wip-release",
3
- "version": "1.9.57",
3
+ "version": "1.9.59",
4
4
  "type": "module",
5
5
  "description": "One-command release pipeline. Bumps version, updates changelog + SKILL.md, publishes to npm + GitHub.",
6
6
  "main": "core.mjs",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@wipcomputer/wip-repo-init",
3
- "version": "1.9.57",
3
+ "version": "1.9.59",
4
4
  "description": "Scaffold the standard ai/ directory structure in any repo",
5
5
  "type": "module",
6
6
  "bin": {
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@wipcomputer/wip-repo-permissions-hook",
3
- "version": "1.9.57",
3
+ "version": "1.9.59",
4
4
  "type": "module",
5
5
  "description": "Repo visibility guard. Blocks repos from going public without a -private counterpart.",
6
6
  "main": "core.mjs",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@wipcomputer/wip-repos",
3
- "version": "1.9.57",
3
+ "version": "1.9.59",
4
4
  "type": "module",
5
5
  "description": "Repo manifest reconciler. Single source of truth for repo organization. Like prettier for folder structure.",
6
6
  "main": "core.mjs",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@wipcomputer/universal-installer",
3
- "version": "1.9.57",
3
+ "version": "1.9.59",
4
4
  "type": "module",
5
5
  "description": "The Universal Interface specification for agent-native software. Teaches your AI how to build repos with every interface: CLI, Module, MCP Server, OpenClaw Plugin, Skill, Claude Code Hook.",
6
6
  "main": "detect.mjs",