@wipcomputer/wip-ai-devops-toolbox 1.9.38 → 1.9.40
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 +50 -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/package.json +1 -1
- package/tools/wip-file-guard/package.json +1 -1
- package/tools/wip-license-guard/package.json +8 -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 +71 -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/tools/wip-license-guard/{hook.mjs → guard.mjs} +0 -0
package/CHANGELOG.md
CHANGED
|
@@ -31,6 +31,56 @@
|
|
|
31
31
|
|
|
32
32
|
|
|
33
33
|
|
|
34
|
+
|
|
35
|
+
## 1.9.40 (2026-03-16)
|
|
36
|
+
|
|
37
|
+
# Auto-sync product docs version/date on release
|
|
38
|
+
|
|
39
|
+
**Date:** 2026-03-16
|
|
40
|
+
**Closes:** #202
|
|
41
|
+
|
|
42
|
+
## What changed
|
|
43
|
+
|
|
44
|
+
wip-release now auto-updates version and date lines in product docs before the release commit. No more stale "Current version: v1.9.1" when you're shipping v1.9.39.
|
|
45
|
+
|
|
46
|
+
Files updated automatically:
|
|
47
|
+
- `ai/product/plans-prds/roadmap.md`: "Current version" and "Last updated"
|
|
48
|
+
- `ai/product/readme-first-product.md`: "Last updated" and "What's Built (as of vX.Y.Z)"
|
|
49
|
+
|
|
50
|
+
Runs between changelog update and git commit (step 3.75). Only touches files that exist. Only updates lines that match the expected patterns.
|
|
51
|
+
|
|
52
|
+
## Why
|
|
53
|
+
|
|
54
|
+
These files were stale from v1.9.1 through v1.9.39 (8 days, 38 releases). Nobody remembered to update them. The existing product docs gate warned about it but couldn't fix it. Now it fixes itself.
|
|
55
|
+
|
|
56
|
+
## 1.9.39 (2026-03-16)
|
|
57
|
+
|
|
58
|
+
# Wire license-guard as Claude Code PreToolUse hook
|
|
59
|
+
|
|
60
|
+
**Date:** 2026-03-16
|
|
61
|
+
**Closes:** #130
|
|
62
|
+
|
|
63
|
+
## What changed
|
|
64
|
+
|
|
65
|
+
license-guard now registers as a Claude Code PreToolUse hook on install. Previously the hook code existed (hook.mjs) but was never wired into the deploy system. Now:
|
|
66
|
+
|
|
67
|
+
- Renamed hook.mjs to guard.mjs (matches file-guard/branch-guard convention that LDM OS deploy.mjs expects)
|
|
68
|
+
- Added `claudeCode.hook` config to package.json (event: PreToolUse, matcher: Bash, timeout: 5)
|
|
69
|
+
- On next `ldm install`, the hook auto-registers in ~/.claude/settings.json
|
|
70
|
+
|
|
71
|
+
The hook blocks git commit and git push when license compliance fails:
|
|
72
|
+
- LICENSE file missing
|
|
73
|
+
- Copyright doesn't match .license-guard.json config
|
|
74
|
+
- CLA.md missing
|
|
75
|
+
- README.md missing ## License section
|
|
76
|
+
- MIT+AGPL config but LICENSE or README only mentions MIT
|
|
77
|
+
|
|
78
|
+
Repos without .license-guard.json are not affected (the hook silently passes).
|
|
79
|
+
|
|
80
|
+
## Also done
|
|
81
|
+
|
|
82
|
+
- Updated plan statuses: license guard Phase 1 complete, bootstrap LDM OS complete
|
|
83
|
+
- Bootstrap LDM OS was already shipped in install.js (lines 740-812)
|
|
34
84
|
|
|
35
85
|
## 1.9.38 (2026-03-16)
|
|
36
86
|
|
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.40"
|
|
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,11 +1,18 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@wipcomputer/wip-license-guard",
|
|
3
|
-
"version": "1.9.
|
|
3
|
+
"version": "1.9.40",
|
|
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": {
|
|
7
7
|
"wip-license-guard": "./cli.mjs"
|
|
8
8
|
},
|
|
9
|
+
"claudeCode": {
|
|
10
|
+
"hook": {
|
|
11
|
+
"event": "PreToolUse",
|
|
12
|
+
"matcher": "Bash",
|
|
13
|
+
"timeout": 5
|
|
14
|
+
}
|
|
15
|
+
},
|
|
9
16
|
"license": "MIT AND AGPL-3.0-or-later",
|
|
10
17
|
"repository": {
|
|
11
18
|
"type": "git",
|
|
@@ -383,6 +383,71 @@ function checkProductDocs(repoPath) {
|
|
|
383
383
|
return { missing, ok: missing.length === 0, skipped: false };
|
|
384
384
|
}
|
|
385
385
|
|
|
386
|
+
/**
|
|
387
|
+
* Auto-update version/date lines in product docs before the release commit.
|
|
388
|
+
* Updates roadmap.md "Current version" and "Last updated",
|
|
389
|
+
* and readme-first-product.md "Last updated" and "What's Built (as of vX.Y.Z)".
|
|
390
|
+
* Returns number of files updated.
|
|
391
|
+
*/
|
|
392
|
+
function syncProductDocs(repoPath, newVersion) {
|
|
393
|
+
let updated = 0;
|
|
394
|
+
const today = new Date().toISOString().split('T')[0];
|
|
395
|
+
|
|
396
|
+
// 1. roadmap.md
|
|
397
|
+
const roadmapPath = join(repoPath, 'ai', 'product', 'plans-prds', 'roadmap.md');
|
|
398
|
+
if (existsSync(roadmapPath)) {
|
|
399
|
+
let content = readFileSync(roadmapPath, 'utf8');
|
|
400
|
+
let changed = false;
|
|
401
|
+
|
|
402
|
+
// Update "Current version: vX.Y.Z"
|
|
403
|
+
const versionRe = /(\*\*Current version:\*\*\s*)v[\d.]+/;
|
|
404
|
+
if (versionRe.test(content)) {
|
|
405
|
+
content = content.replace(versionRe, `$1v${newVersion}`);
|
|
406
|
+
changed = true;
|
|
407
|
+
}
|
|
408
|
+
|
|
409
|
+
// Update "Last updated: YYYY-MM-DD"
|
|
410
|
+
const dateRe = /(\*\*Last updated:\*\*\s*)[\d-]+/;
|
|
411
|
+
if (dateRe.test(content)) {
|
|
412
|
+
content = content.replace(dateRe, `$1${today}`);
|
|
413
|
+
changed = true;
|
|
414
|
+
}
|
|
415
|
+
|
|
416
|
+
if (changed) {
|
|
417
|
+
writeFileSync(roadmapPath, content);
|
|
418
|
+
updated++;
|
|
419
|
+
}
|
|
420
|
+
}
|
|
421
|
+
|
|
422
|
+
// 2. readme-first-product.md
|
|
423
|
+
const rfpPath = join(repoPath, 'ai', 'product', 'readme-first-product.md');
|
|
424
|
+
if (existsSync(rfpPath)) {
|
|
425
|
+
let content = readFileSync(rfpPath, 'utf8');
|
|
426
|
+
let changed = false;
|
|
427
|
+
|
|
428
|
+
// Update "Last updated: YYYY-MM-DD"
|
|
429
|
+
const dateRe = /(\*\*Last updated:\*\*\s*)[\d-]+/;
|
|
430
|
+
if (dateRe.test(content)) {
|
|
431
|
+
content = content.replace(dateRe, `$1${today}`);
|
|
432
|
+
changed = true;
|
|
433
|
+
}
|
|
434
|
+
|
|
435
|
+
// Update "What's Built (as of vX.Y.Z)"
|
|
436
|
+
const builtRe = /(What's Built \(as of\s*)v[\d.]+(\))/;
|
|
437
|
+
if (builtRe.test(content)) {
|
|
438
|
+
content = content.replace(builtRe, `$1v${newVersion}$2`);
|
|
439
|
+
changed = true;
|
|
440
|
+
}
|
|
441
|
+
|
|
442
|
+
if (changed) {
|
|
443
|
+
writeFileSync(rfpPath, content);
|
|
444
|
+
updated++;
|
|
445
|
+
}
|
|
446
|
+
}
|
|
447
|
+
|
|
448
|
+
return updated;
|
|
449
|
+
}
|
|
450
|
+
|
|
386
451
|
/**
|
|
387
452
|
* Build release notes with narrative first, commit details second.
|
|
388
453
|
*
|
|
@@ -1016,6 +1081,12 @@ export async function release({ repoPath, level, notes, notesSource, dryRun, noP
|
|
|
1016
1081
|
console.log(` ✓ Moved ${trashed} RELEASE-NOTES file(s) to _trash/`);
|
|
1017
1082
|
}
|
|
1018
1083
|
|
|
1084
|
+
// 3.75. Auto-update product docs version/date
|
|
1085
|
+
const docsUpdated = syncProductDocs(repoPath, newVersion);
|
|
1086
|
+
if (docsUpdated > 0) {
|
|
1087
|
+
console.log(` ✓ Product docs synced to v${newVersion} (${docsUpdated} file(s))`);
|
|
1088
|
+
}
|
|
1089
|
+
|
|
1019
1090
|
// 4. Git commit + tag
|
|
1020
1091
|
gitCommitAndTag(repoPath, newVersion, notes);
|
|
1021
1092
|
console.log(` ✓ Committed and tagged v${newVersion}`);
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@wipcomputer/universal-installer",
|
|
3
|
-
"version": "1.9.
|
|
3
|
+
"version": "1.9.40",
|
|
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",
|
|
File without changes
|