@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 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.63"
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
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@wipcomputer/wip-ai-devops-toolbox",
3
- "version": "1.9.63",
3
+ "version": "1.9.65",
4
4
  "type": "module",
5
5
  "description": "The complete AI DevOps toolkit for AI-assisted development teams.",
6
6
  "license": "MIT",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@wipcomputer/deploy-public",
3
- "version": "1.9.63",
3
+ "version": "1.9.65",
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.63",
3
+ "version": "1.9.65",
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"
@@ -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.63",
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"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@wipcomputer/wip-file-guard",
3
- "version": "1.9.63",
3
+ "version": "1.9.65",
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",
@@ -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
- check "Block Edit replacing 8 lines with 8 different lines in SHARED-CONTEXT.md" \
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
- "block"
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"}}' \
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@wipcomputer/wip-license-guard",
3
- "version": "1.9.63",
3
+ "version": "1.9.65",
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.63",
3
+ "version": "1.9.65",
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.63",
3
+ "version": "1.9.65",
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": {
@@ -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
- // Scaffold a template so the agent has something to fill in
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/wip-release",
3
- "version": "1.9.63",
3
+ "version": "1.9.65",
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.63",
3
+ "version": "1.9.65",
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.63",
3
+ "version": "1.9.65",
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.63",
3
+ "version": "1.9.65",
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.63",
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",