@wipcomputer/wip-ai-devops-toolbox 1.9.29 → 1.9.31
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 +64 -0
- package/SKILL.md +1 -1
- package/_trash/RELEASE-NOTES-v1-9-31.md +26 -0
- 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/guard.mjs +2 -2
- package/tools/wip-branch-guard/package.json +1 -1
- package/tools/wip-file-guard/package.json +1 -1
- 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 +40 -0
- 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,70 @@
|
|
|
31
31
|
|
|
32
32
|
|
|
33
33
|
|
|
34
|
+
|
|
35
|
+
## 1.9.31 (2026-03-15)
|
|
36
|
+
|
|
37
|
+
# Release Notes: wip-ai-devops-toolbox v1.9.31
|
|
38
|
+
|
|
39
|
+
Branch guard no longer blocks global npm operations on main.
|
|
40
|
+
|
|
41
|
+
## What changed
|
|
42
|
+
|
|
43
|
+
Moved `npm install -g` and `npm link` from BLOCKED_BASH_PATTERNS to ALLOWED_BASH_PATTERNS in `wip-branch-guard/guard.mjs`. Global npm operations modify `/opt/homebrew/`, not the repo. Local `npm install` (no -g flag) remains blocked.
|
|
44
|
+
|
|
45
|
+
## Why
|
|
46
|
+
|
|
47
|
+
During LDM OS v0.4.0 dogfood, a CC session couldn't run `npm install -g @wipcomputer/wip-ldm-os@0.4.0` even after Parker explicitly said "install." The guard was too aggressive. Original intent (issue #137) was to block repo writes on main, not system-level package installs.
|
|
48
|
+
|
|
49
|
+
## Issues closed
|
|
50
|
+
|
|
51
|
+
- Closes #188 (branch guard blocks npm install -g)
|
|
52
|
+
- Cross-ref: wipcomputer/wip-ldm-os#44
|
|
53
|
+
|
|
54
|
+
## How to verify
|
|
55
|
+
|
|
56
|
+
```bash
|
|
57
|
+
# On main branch, these should now succeed:
|
|
58
|
+
npm install -g @wipcomputer/wip-ldm-os@0.4.0
|
|
59
|
+
npm link
|
|
60
|
+
# This should still be blocked on main:
|
|
61
|
+
npm install
|
|
62
|
+
```
|
|
63
|
+
|
|
64
|
+
## 1.9.30 (2026-03-15)
|
|
65
|
+
|
|
66
|
+
# Release notes must be a file on disk
|
|
67
|
+
|
|
68
|
+
**Date:** 2026-03-15
|
|
69
|
+
|
|
70
|
+
## What changed
|
|
71
|
+
|
|
72
|
+
wip-release no longer accepts the `--notes` flag. Release notes MUST come from a file on disk:
|
|
73
|
+
|
|
74
|
+
1. `RELEASE-NOTES-v{version}.md` in repo root (auto-detected)
|
|
75
|
+
2. `ai/dev-updates/YYYY-MM-DD--description.md` (auto-detected)
|
|
76
|
+
3. `--notes-file=path` (explicit file path)
|
|
77
|
+
|
|
78
|
+
If no file exists, the release is blocked. The gate scaffolds a template (`RELEASE-NOTES-v{version}.md`) so the agent has something to fill in.
|
|
79
|
+
|
|
80
|
+
## Why
|
|
81
|
+
|
|
82
|
+
The `--notes` flag was the root cause of every bad release note. Agents passed one-liners like `--notes="fix bug"` and the gate let them through. Even after we added length checks and changelog detection, agents found ways around it. The flag was an escape hatch that undermined the entire system.
|
|
83
|
+
|
|
84
|
+
The file-on-disk requirement solves three problems:
|
|
85
|
+
1. **Reviewability.** The file is on the branch. It shows up in the PR diff. Parker can read and approve the release notes before merge.
|
|
86
|
+
2. **Quality.** Writing a file forces the agent to think about what changed and why. A flag encourages one-liners.
|
|
87
|
+
3. **History.** The file is committed to git. The release notes are part of the repo history, not a transient CLI argument.
|
|
88
|
+
|
|
89
|
+
## What agents need to do
|
|
90
|
+
|
|
91
|
+
Before running `wip-release`:
|
|
92
|
+
1. Write `RELEASE-NOTES-v{version}.md` or `ai/dev-updates/YYYY-MM-DD--description.md`
|
|
93
|
+
2. Commit it on the branch
|
|
94
|
+
3. The file shows up in the PR for review
|
|
95
|
+
4. After merge to main, `wip-release` auto-detects it
|
|
96
|
+
|
|
97
|
+
If the agent forgets, `wip-release` blocks and scaffolds a template.
|
|
34
98
|
|
|
35
99
|
## 1.9.29 (2026-03-15)
|
|
36
100
|
|
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.31"
|
|
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,26 @@
|
|
|
1
|
+
# Release Notes: wip-ai-devops-toolbox v1.9.31
|
|
2
|
+
|
|
3
|
+
Branch guard no longer blocks global npm operations on main.
|
|
4
|
+
|
|
5
|
+
## What changed
|
|
6
|
+
|
|
7
|
+
Moved `npm install -g` and `npm link` from BLOCKED_BASH_PATTERNS to ALLOWED_BASH_PATTERNS in `wip-branch-guard/guard.mjs`. Global npm operations modify `/opt/homebrew/`, not the repo. Local `npm install` (no -g flag) remains blocked.
|
|
8
|
+
|
|
9
|
+
## Why
|
|
10
|
+
|
|
11
|
+
During LDM OS v0.4.0 dogfood, a CC session couldn't run `npm install -g @wipcomputer/wip-ldm-os@0.4.0` even after Parker explicitly said "install." The guard was too aggressive. Original intent (issue #137) was to block repo writes on main, not system-level package installs.
|
|
12
|
+
|
|
13
|
+
## Issues closed
|
|
14
|
+
|
|
15
|
+
- Closes #188 (branch guard blocks npm install -g)
|
|
16
|
+
- Cross-ref: wipcomputer/wip-ldm-os#44
|
|
17
|
+
|
|
18
|
+
## How to verify
|
|
19
|
+
|
|
20
|
+
```bash
|
|
21
|
+
# On main branch, these should now succeed:
|
|
22
|
+
npm install -g @wipcomputer/wip-ldm-os@0.4.0
|
|
23
|
+
npm link
|
|
24
|
+
# This should still be blocked on main:
|
|
25
|
+
npm install
|
|
26
|
+
```
|
package/package.json
CHANGED
|
@@ -49,8 +49,6 @@ const BLOCKED_BASH_PATTERNS = [
|
|
|
49
49
|
/\brm\s+/,
|
|
50
50
|
/\bmkdir\s+/,
|
|
51
51
|
/\btouch\s+/,
|
|
52
|
-
/\bnpm\s+link\b/,
|
|
53
|
-
/\bnpm\s+install\s+-g\b/,
|
|
54
52
|
/>\s/, // redirects
|
|
55
53
|
/\btee\s+/,
|
|
56
54
|
/\bsed\s+-i/,
|
|
@@ -77,6 +75,8 @@ const ALLOWED_BASH_PATTERNS = [
|
|
|
77
75
|
/--dry-run/,
|
|
78
76
|
/--help/,
|
|
79
77
|
/\bwip-release\b.*--dry-run/,
|
|
78
|
+
/\bnpm\s+install\s+-g\b/, // global installs modify /opt/homebrew/, not the repo
|
|
79
|
+
/\bnpm\s+link\b/, // global operation, not repo-local
|
|
80
80
|
];
|
|
81
81
|
|
|
82
82
|
function deny(reason) {
|
|
@@ -253,6 +253,12 @@ function checkReleaseNotes(notes, notesSource, level) {
|
|
|
253
253
|
issues.push('Notes look like a changelog entry, not a narrative. Explain the impact.');
|
|
254
254
|
}
|
|
255
255
|
|
|
256
|
+
// Release notes should reference at least one issue
|
|
257
|
+
const hasIssueRef = /#\d+/.test(notes);
|
|
258
|
+
if (!hasIssueRef) {
|
|
259
|
+
issues.push('No issue reference found (#XX). Every release should close or reference an issue.');
|
|
260
|
+
}
|
|
261
|
+
|
|
256
262
|
return { ok: issues.length === 0, issues, block: issues.length > 0 };
|
|
257
263
|
}
|
|
258
264
|
|
|
@@ -268,6 +274,19 @@ export function scaffoldReleaseNotes(repoPath, version) {
|
|
|
268
274
|
const pkg = JSON.parse(readFileSync(join(repoPath, 'package.json'), 'utf8'));
|
|
269
275
|
const name = pkg.name?.replace(/^@[^/]+\//, '') || basename(repoPath);
|
|
270
276
|
|
|
277
|
+
// Auto-detect issue references from commits since last tag
|
|
278
|
+
let issueRefs = '';
|
|
279
|
+
try {
|
|
280
|
+
const lastTag = execFileSync('git', ['describe', '--tags', '--abbrev=0'],
|
|
281
|
+
{ cwd: repoPath, encoding: 'utf8' }).trim();
|
|
282
|
+
const log = execFileSync('git', ['log', `${lastTag}..HEAD`, '--oneline'],
|
|
283
|
+
{ cwd: repoPath, encoding: 'utf8' });
|
|
284
|
+
const issues = [...new Set(log.match(/#\d+/g) || [])];
|
|
285
|
+
if (issues.length > 0) {
|
|
286
|
+
issueRefs = issues.map(i => `- ${i}`).join('\n');
|
|
287
|
+
}
|
|
288
|
+
} catch {}
|
|
289
|
+
|
|
271
290
|
const template = `# Release Notes: ${name} v${version}
|
|
272
291
|
|
|
273
292
|
**One-line summary of what this release does**
|
|
@@ -283,6 +302,10 @@ Describe the changes. Not a commit list. Explain:
|
|
|
283
302
|
|
|
284
303
|
What problem does this solve? What was broken or missing?
|
|
285
304
|
|
|
305
|
+
## Issues closed
|
|
306
|
+
|
|
307
|
+
${issueRefs || '- #XX (replace with actual issue numbers)'}
|
|
308
|
+
|
|
286
309
|
## How to verify
|
|
287
310
|
|
|
288
311
|
\`\`\`bash
|
|
@@ -499,6 +522,23 @@ export function createGitHubRelease(repoPath, newVersion, notes, currentVersion)
|
|
|
499
522
|
console.warn(` ! GitHub release body is only ${bodyLen} chars. Notes may be truncated.`);
|
|
500
523
|
}
|
|
501
524
|
} catch {}
|
|
525
|
+
|
|
526
|
+
// Auto-close referenced issues
|
|
527
|
+
const issueNums = [...new Set((body.match(/#(\d+)/g) || []).map(m => m.slice(1)))];
|
|
528
|
+
for (const num of issueNums) {
|
|
529
|
+
try {
|
|
530
|
+
// Only close if issue exists and is open on the public repo
|
|
531
|
+
const publicSlug = repoSlug.replace(/-private$/, '');
|
|
532
|
+
execFileSync('gh', [
|
|
533
|
+
'issue', 'close', num,
|
|
534
|
+
'--repo', publicSlug,
|
|
535
|
+
'--comment', `Closed by v${newVersion}. See release notes.`
|
|
536
|
+
], { cwd: repoPath, stdio: 'pipe' });
|
|
537
|
+
console.log(` ✓ Closed #${num} on ${publicSlug}`);
|
|
538
|
+
} catch {
|
|
539
|
+
// Issue doesn't exist on public repo or already closed. Fine.
|
|
540
|
+
}
|
|
541
|
+
}
|
|
502
542
|
} finally {
|
|
503
543
|
try { execFileSync('rm', ['-f', tmpFile]); } catch {}
|
|
504
544
|
}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@wipcomputer/universal-installer",
|
|
3
|
-
"version": "1.9.
|
|
3
|
+
"version": "1.9.31",
|
|
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",
|