@wipcomputer/wip-ai-devops-toolbox 1.9.63 → 1.9.65
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.
- package/CHANGELOG.md +48 -0
- package/SKILL.md +1 -1
- package/package.json +1 -1
- package/tools/deploy-public/package.json +1 -1
- package/tools/post-merge-rename/package.json +1 -1
- package/tools/wip-branch-guard/RELEASE-NOTES-v1-9-64.md +23 -0
- package/tools/wip-branch-guard/guard.mjs +1 -0
- package/tools/wip-branch-guard/package.json +4 -1
- package/tools/wip-file-guard/package.json +1 -1
- package/tools/wip-file-guard/test.sh +3 -2
- package/tools/wip-license-guard/package.json +1 -1
- package/tools/wip-license-hook/package.json +1 -1
- package/tools/wip-readme-format/package.json +1 -1
- package/tools/wip-release/core.mjs +19 -2
- package/tools/wip-release/package.json +1 -1
- package/tools/wip-repo-init/package.json +1 -1
- package/tools/wip-repo-permissions-hook/package.json +1 -1
- package/tools/wip-repos/package.json +1 -1
- package/tools/wip-universal-installer/package.json +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -31,6 +31,54 @@
|
|
|
31
31
|
|
|
32
32
|
|
|
33
33
|
|
|
34
|
+
|
|
35
|
+
## 1.9.65 (2026-03-29)
|
|
36
|
+
|
|
37
|
+
# Release Notes: wip-ai-devops-toolbox v1.9.65
|
|
38
|
+
|
|
39
|
+
**Fix release notes scaffold on protected branches**
|
|
40
|
+
|
|
41
|
+
When `wip-release patch` runs on main without a RELEASE-NOTES file, it used to scaffold a
|
|
42
|
+
template directly in the working tree. On repos with branch guards (pre-commit hooks that
|
|
43
|
+
block commits to main), this scaffolded file could not be removed or committed. It would
|
|
44
|
+
block `git pull` and leave the working tree dirty. This has happened multiple times across
|
|
45
|
+
different repos.
|
|
46
|
+
|
|
47
|
+
The fix adds a branch check before scaffolding. If the current branch is main or master,
|
|
48
|
+
wip-release now prints a clear error telling the user to write release notes on their
|
|
49
|
+
feature branch before merging, then exits non-zero without creating any files. The scaffold
|
|
50
|
+
behavior still works on feature branches, where it's actually useful.
|
|
51
|
+
|
|
52
|
+
## Issues closed
|
|
53
|
+
|
|
54
|
+
- Closes #223
|
|
55
|
+
|
|
56
|
+
## How to verify
|
|
57
|
+
|
|
58
|
+
```bash
|
|
59
|
+
# On main, without release notes: should error, NOT scaffold
|
|
60
|
+
cd any-repo && git checkout main
|
|
61
|
+
wip-release patch
|
|
62
|
+
# Expected: "Release notes missing. Write RELEASE-NOTES-v*.md on your feature branch before merging."
|
|
63
|
+
# Expected: no RELEASE-NOTES file created in working tree
|
|
64
|
+
|
|
65
|
+
# On a feature branch: should scaffold as before
|
|
66
|
+
git checkout -b test/scaffold-check
|
|
67
|
+
wip-release patch
|
|
68
|
+
# Expected: scaffolded template created
|
|
69
|
+
```
|
|
70
|
+
|
|
71
|
+
## 1.9.64 (2026-03-29)
|
|
72
|
+
|
|
73
|
+
# Release Notes: wip-ai-devops-toolbox v1.9.64
|
|
74
|
+
|
|
75
|
+
Closes #295
|
|
76
|
+
|
|
77
|
+
## Branch guard: allow extension cleanup
|
|
78
|
+
|
|
79
|
+
The branch guard blocked `rm` on deployed extension directories (`~/.openclaw/extensions/` and `~/.ldm/extensions/`) because those paths live inside git repos. But deployed extensions are managed by `ldm install`, not by hand. When a stale `-private` extension needed to be removed (e.g. `wip-xai-grok-private` replaced by the public `wip-xai-grok`), the agent couldn't clean it up without asking the user to run the command manually.
|
|
80
|
+
|
|
81
|
+
Added an allowlist pattern for `rm` targeting `.openclaw/extensions/` and `.ldm/extensions/` paths. Same approach as the existing `.ldm/state/` allowlist. The guard still blocks `rm` on actual repo source files.
|
|
34
82
|
|
|
35
83
|
## 1.9.63 (2026-03-29)
|
|
36
84
|
|
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.
|
|
8
|
+
version: "1.9.65"
|
|
9
9
|
homepage: "https://github.com/wipcomputer/wip-ai-devops-toolbox"
|
|
10
10
|
author: "Parker Todd Brooks"
|
|
11
11
|
category: dev-tools
|
package/package.json
CHANGED
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
# Release Notes: wip-branch-guard v1.9.64
|
|
2
|
+
|
|
3
|
+
**One-line summary of what this release does**
|
|
4
|
+
|
|
5
|
+
Tell the story. What was broken or missing? What did we build? Why does the user care?
|
|
6
|
+
Write at least one real paragraph of prose. Not just bullets. The release notes gate
|
|
7
|
+
will block if there is no narrative. Bullets are fine for details, but the story comes first.
|
|
8
|
+
|
|
9
|
+
## The story
|
|
10
|
+
|
|
11
|
+
(Write a paragraph here. What was the problem? What does this release fix? Why does it matter?
|
|
12
|
+
This is what users read. Make it worth reading.)
|
|
13
|
+
|
|
14
|
+
## Issues closed
|
|
15
|
+
|
|
16
|
+
- #296
|
|
17
|
+
- #295
|
|
18
|
+
|
|
19
|
+
## How to verify
|
|
20
|
+
|
|
21
|
+
```bash
|
|
22
|
+
# Commands to test the changes
|
|
23
|
+
```
|
|
@@ -133,6 +133,7 @@ const ALLOWED_BASH_PATTERNS = [
|
|
|
133
133
|
/\bnpm\s+link\b/, // global operation, not repo-local
|
|
134
134
|
/\bldm\s+(install|init|doctor|stack|updates)\b/, // LDM OS commands modify ~/.ldm/, not the repo
|
|
135
135
|
/\brm\s+.*\.ldm\/state\//, // cleaning LDM state files only, not repo files
|
|
136
|
+
/\brm\s+.*\.(openclaw|ldm)\/extensions\//, // cleaning deployed extensions (managed by ldm install, not source code)
|
|
136
137
|
/\bclaude\s+mcp\b/, // MCP registration, not repo files
|
|
137
138
|
/\bmkdir\s+.*\.worktrees\b/, // creating .worktrees/ directory is part of the process
|
|
138
139
|
];
|
|
@@ -1,8 +1,11 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@wipcomputer/wip-branch-guard",
|
|
3
|
-
"version": "1.9.
|
|
3
|
+
"version": "1.9.65",
|
|
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
|
+
"scripts": {
|
|
7
|
+
"test": "bash test.sh"
|
|
8
|
+
},
|
|
6
9
|
"main": "guard.mjs",
|
|
7
10
|
"bin": {
|
|
8
11
|
"wip-branch-guard": "guard.mjs"
|
|
@@ -83,9 +83,10 @@ check "Block Write to TOOLS.md" \
|
|
|
83
83
|
"block"
|
|
84
84
|
|
|
85
85
|
# Large replacement (same line count, different content)
|
|
86
|
-
|
|
86
|
+
# SHARED-CONTEXT.md is shared state (maxReplace=30), so 8 lines is allowed
|
|
87
|
+
check "Allow Edit replacing 8 lines with 8 different lines in SHARED-CONTEXT.md (shared state)" \
|
|
87
88
|
'{"tool_name":"Edit","tool_input":{"file_path":"/foo/SHARED-CONTEXT.md","old_string":"line1\nline2\nline3\nline4\nline5\nline6\nline7\nline8","new_string":"new1\nnew2\nnew3\nnew4\nnew5\nnew6\nnew7\nnew8"}}' \
|
|
88
|
-
"
|
|
89
|
+
"allow"
|
|
89
90
|
|
|
90
91
|
check "Allow Edit replacing 3 lines in CLAUDE.md" \
|
|
91
92
|
'{"tool_name":"Edit","tool_input":{"file_path":"/foo/CLAUDE.md","old_string":"a\nb\nc","new_string":"x\ny\nz"}}' \
|
|
@@ -7,7 +7,7 @@
|
|
|
7
7
|
|
|
8
8
|
import { execSync, execFileSync } from 'node:child_process';
|
|
9
9
|
import { readFileSync, writeFileSync, existsSync, readdirSync, mkdirSync, renameSync } from 'node:fs';
|
|
10
|
-
import { join, basename } from 'node:path';
|
|
10
|
+
import { join, basename, dirname } from 'node:path';
|
|
11
11
|
|
|
12
12
|
// ── Version ─────────────────────────────────────────────────────────
|
|
13
13
|
|
|
@@ -1184,7 +1184,24 @@ export async function release({ repoPath, level, notes, notesSource, dryRun, noP
|
|
|
1184
1184
|
console.log(` ✗ Release notes blocked:`);
|
|
1185
1185
|
for (const issue of notesCheck.issues) console.log(` - ${issue}`);
|
|
1186
1186
|
console.log('');
|
|
1187
|
-
//
|
|
1187
|
+
// Only scaffold on feature branches. On main, scaffolding leaves an
|
|
1188
|
+
// untracked file that branch guards prevent removing (#223).
|
|
1189
|
+
let currentBranch = '';
|
|
1190
|
+
try {
|
|
1191
|
+
currentBranch = execFileSync('git', ['branch', '--show-current'], {
|
|
1192
|
+
cwd: repoPath, encoding: 'utf8'
|
|
1193
|
+
}).trim();
|
|
1194
|
+
} catch {}
|
|
1195
|
+
|
|
1196
|
+
const isProtectedBranch = currentBranch === 'main' || currentBranch === 'master';
|
|
1197
|
+
|
|
1198
|
+
if (isProtectedBranch) {
|
|
1199
|
+
console.log(` Release notes missing. Write RELEASE-NOTES-v${newVersion.replace(/\./g, '-')}.md on your feature branch before merging.`);
|
|
1200
|
+
console.log('');
|
|
1201
|
+
return { currentVersion, newVersion, dryRun: false, failed: true };
|
|
1202
|
+
}
|
|
1203
|
+
|
|
1204
|
+
// Feature branch: scaffold a template so the agent has something to fill in
|
|
1188
1205
|
const templatePath = scaffoldReleaseNotes(repoPath, newVersion);
|
|
1189
1206
|
console.log(` Scaffolded template: ${basename(templatePath)}`);
|
|
1190
1207
|
console.log(' Fill it in, commit, then run wip-release again.');
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@wipcomputer/universal-installer",
|
|
3
|
-
"version": "1.9.
|
|
3
|
+
"version": "1.9.65",
|
|
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",
|