@wipcomputer/wip-ai-devops-toolbox 1.9.20

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 (146) hide show
  1. package/.license-guard.json +7 -0
  2. package/.publish-skill.json +4 -0
  3. package/CHANGELOG.md +1120 -0
  4. package/CLA.md +19 -0
  5. package/DEV-GUIDE-GENERAL-PUBLIC.md +882 -0
  6. package/LICENSE +52 -0
  7. package/README.md +238 -0
  8. package/SKILL.md +728 -0
  9. package/TECHNICAL.md +282 -0
  10. package/UNIVERSAL-INTERFACE.md +180 -0
  11. package/_trash/RELEASE-NOTES-v1-8-0.md +29 -0
  12. package/_trash/RELEASE-NOTES-v1-8-1.md +7 -0
  13. package/_trash/RELEASE-NOTES-v1-8-2.md +7 -0
  14. package/_trash/RELEASE-NOTES-v1-9-0.md +37 -0
  15. package/_trash/RELEASE-NOTES-v1-9-1.md +38 -0
  16. package/_trash/RELEASE-NOTES-v1-9-10.md +40 -0
  17. package/_trash/RELEASE-NOTES-v1-9-2.md +40 -0
  18. package/_trash/RELEASE-NOTES-v1-9-6.md +72 -0
  19. package/_trash/RELEASE-NOTES-v1-9-7.md +23 -0
  20. package/_trash/RELEASE-NOTES-v1-9-9.md +75 -0
  21. package/_trash/guide 2/DEV-GUIDE.md +487 -0
  22. package/_trash/guide 2/scripts/deploy-public.sh +152 -0
  23. package/package.json +27 -0
  24. package/scripts/SKILL-deploy-public.md +61 -0
  25. package/scripts/SKILL-post-merge-rename.md +47 -0
  26. package/scripts/deploy-public.sh +264 -0
  27. package/scripts/post-merge-rename.sh +205 -0
  28. package/scripts/publish-skill.sh +134 -0
  29. package/tools/deploy-public/LICENSE +52 -0
  30. package/tools/deploy-public/README.md +31 -0
  31. package/tools/deploy-public/SKILL.md +71 -0
  32. package/tools/deploy-public/deploy-public.sh +264 -0
  33. package/tools/deploy-public/package.json +9 -0
  34. package/tools/ldm-jobs/LICENSE +52 -0
  35. package/tools/ldm-jobs/README.md +46 -0
  36. package/tools/ldm-jobs/backup.sh +16 -0
  37. package/tools/ldm-jobs/branch-protect.sh +39 -0
  38. package/tools/ldm-jobs/crystal-capture.sh +19 -0
  39. package/tools/ldm-jobs/setup-shell.sh +27 -0
  40. package/tools/ldm-jobs/visibility-audit.sh +27 -0
  41. package/tools/post-merge-rename/LICENSE +52 -0
  42. package/tools/post-merge-rename/README.md +29 -0
  43. package/tools/post-merge-rename/SKILL.md +57 -0
  44. package/tools/post-merge-rename/package.json +9 -0
  45. package/tools/post-merge-rename/post-merge-rename.sh +122 -0
  46. package/tools/wip-branch-guard/INSTALL.md +41 -0
  47. package/tools/wip-branch-guard/guard.mjs +259 -0
  48. package/tools/wip-branch-guard/package.json +11 -0
  49. package/tools/wip-file-guard/CHANGELOG.md +6 -0
  50. package/tools/wip-file-guard/LICENSE +52 -0
  51. package/tools/wip-file-guard/README.md +113 -0
  52. package/tools/wip-file-guard/REFERENCE.md +86 -0
  53. package/tools/wip-file-guard/SKILL.md +105 -0
  54. package/tools/wip-file-guard/guard.mjs +128 -0
  55. package/tools/wip-file-guard/openclaw.plugin.json +8 -0
  56. package/tools/wip-file-guard/package.json +27 -0
  57. package/tools/wip-file-guard/test.sh +119 -0
  58. package/tools/wip-license-guard/LICENSE +52 -0
  59. package/tools/wip-license-guard/README.md +32 -0
  60. package/tools/wip-license-guard/SKILL.md +65 -0
  61. package/tools/wip-license-guard/cli.mjs +464 -0
  62. package/tools/wip-license-guard/core.mjs +310 -0
  63. package/tools/wip-license-guard/hook.mjs +146 -0
  64. package/tools/wip-license-guard/package.json +15 -0
  65. package/tools/wip-license-hook/CHANGELOG.md +17 -0
  66. package/tools/wip-license-hook/LICENSE +52 -0
  67. package/tools/wip-license-hook/README.md +200 -0
  68. package/tools/wip-license-hook/SKILL.md +111 -0
  69. package/tools/wip-license-hook/dist/cli/index.d.ts +15 -0
  70. package/tools/wip-license-hook/dist/cli/index.js +170 -0
  71. package/tools/wip-license-hook/dist/cli/index.js.map +1 -0
  72. package/tools/wip-license-hook/dist/core/detector.d.ts +12 -0
  73. package/tools/wip-license-hook/dist/core/detector.js +104 -0
  74. package/tools/wip-license-hook/dist/core/detector.js.map +1 -0
  75. package/tools/wip-license-hook/dist/core/index.d.ts +4 -0
  76. package/tools/wip-license-hook/dist/core/index.js +5 -0
  77. package/tools/wip-license-hook/dist/core/index.js.map +1 -0
  78. package/tools/wip-license-hook/dist/core/ledger.d.ts +49 -0
  79. package/tools/wip-license-hook/dist/core/ledger.js +72 -0
  80. package/tools/wip-license-hook/dist/core/ledger.js.map +1 -0
  81. package/tools/wip-license-hook/dist/core/reporter.d.ts +14 -0
  82. package/tools/wip-license-hook/dist/core/reporter.js +227 -0
  83. package/tools/wip-license-hook/dist/core/reporter.js.map +1 -0
  84. package/tools/wip-license-hook/dist/core/scanner.d.ts +39 -0
  85. package/tools/wip-license-hook/dist/core/scanner.js +325 -0
  86. package/tools/wip-license-hook/dist/core/scanner.js.map +1 -0
  87. package/tools/wip-license-hook/hooks/pre-pull.sh +55 -0
  88. package/tools/wip-license-hook/hooks/pre-push.sh +51 -0
  89. package/tools/wip-license-hook/mcp-server.mjs +119 -0
  90. package/tools/wip-license-hook/package-lock.json +54 -0
  91. package/tools/wip-license-hook/package.json +43 -0
  92. package/tools/wip-license-hook/src/cli/index.ts +189 -0
  93. package/tools/wip-license-hook/src/core/detector.ts +130 -0
  94. package/tools/wip-license-hook/src/core/index.ts +4 -0
  95. package/tools/wip-license-hook/src/core/ledger.ts +116 -0
  96. package/tools/wip-license-hook/src/core/reporter.ts +255 -0
  97. package/tools/wip-license-hook/src/core/scanner.ts +367 -0
  98. package/tools/wip-license-hook/tsconfig.json +16 -0
  99. package/tools/wip-readme-format/README.md +49 -0
  100. package/tools/wip-readme-format/SKILL.md +84 -0
  101. package/tools/wip-readme-format/format.mjs +570 -0
  102. package/tools/wip-readme-format/package.json +15 -0
  103. package/tools/wip-release/CHANGELOG.md +42 -0
  104. package/tools/wip-release/LICENSE +52 -0
  105. package/tools/wip-release/README.md +45 -0
  106. package/tools/wip-release/REFERENCE.md +100 -0
  107. package/tools/wip-release/SKILL.md +139 -0
  108. package/tools/wip-release/cli.js +161 -0
  109. package/tools/wip-release/core.mjs +1174 -0
  110. package/tools/wip-release/mcp-server.mjs +109 -0
  111. package/tools/wip-release/package.json +36 -0
  112. package/tools/wip-repo-init/README.md +38 -0
  113. package/tools/wip-repo-init/SKILL.md +77 -0
  114. package/tools/wip-repo-init/init.mjs +142 -0
  115. package/tools/wip-repo-init/package.json +11 -0
  116. package/tools/wip-repo-permissions-hook/LICENSE +52 -0
  117. package/tools/wip-repo-permissions-hook/README.md +86 -0
  118. package/tools/wip-repo-permissions-hook/SKILL.md +73 -0
  119. package/tools/wip-repo-permissions-hook/cli.js +83 -0
  120. package/tools/wip-repo-permissions-hook/core.mjs +122 -0
  121. package/tools/wip-repo-permissions-hook/guard.mjs +64 -0
  122. package/tools/wip-repo-permissions-hook/mcp-server.mjs +92 -0
  123. package/tools/wip-repo-permissions-hook/openclaw.plugin.json +8 -0
  124. package/tools/wip-repo-permissions-hook/package.json +31 -0
  125. package/tools/wip-repos/LICENSE +52 -0
  126. package/tools/wip-repos/README.md +77 -0
  127. package/tools/wip-repos/SKILL.md +80 -0
  128. package/tools/wip-repos/cli.mjs +176 -0
  129. package/tools/wip-repos/core.mjs +290 -0
  130. package/tools/wip-repos/mcp-server.mjs +157 -0
  131. package/tools/wip-repos/package.json +34 -0
  132. package/tools/wip-universal-installer/CHANGELOG.md +57 -0
  133. package/tools/wip-universal-installer/LICENSE +52 -0
  134. package/tools/wip-universal-installer/README.md +81 -0
  135. package/tools/wip-universal-installer/REFERENCE.md +122 -0
  136. package/tools/wip-universal-installer/SKILL.md +87 -0
  137. package/tools/wip-universal-installer/SPEC.md +180 -0
  138. package/tools/wip-universal-installer/detect.mjs +130 -0
  139. package/tools/wip-universal-installer/examples/minimal/README.md +20 -0
  140. package/tools/wip-universal-installer/examples/minimal/SKILL.md +28 -0
  141. package/tools/wip-universal-installer/examples/minimal/cli.mjs +4 -0
  142. package/tools/wip-universal-installer/examples/minimal/core.mjs +8 -0
  143. package/tools/wip-universal-installer/examples/minimal/mcp-server.mjs +27 -0
  144. package/tools/wip-universal-installer/examples/minimal/package.json +12 -0
  145. package/tools/wip-universal-installer/install.js +930 -0
  146. package/tools/wip-universal-installer/package.json +36 -0
@@ -0,0 +1,130 @@
1
+ /**
2
+ * wip-universal-installer/detect.mjs
3
+ * Interface detection logic. Scans a repo and reports which interfaces it exposes.
4
+ * Importable by other tools. Zero dependencies.
5
+ */
6
+
7
+ import { existsSync, readFileSync, readdirSync } from 'node:fs';
8
+ import { join, basename } from 'node:path';
9
+
10
+ function readJSON(path) {
11
+ try {
12
+ return JSON.parse(readFileSync(path, 'utf8'));
13
+ } catch {
14
+ return null;
15
+ }
16
+ }
17
+
18
+ /**
19
+ * Detect all interfaces in a repo.
20
+ * Returns { interfaces, pkg } where interfaces is an object keyed by interface type.
21
+ */
22
+ export function detectInterfaces(repoPath) {
23
+ const interfaces = {};
24
+ const pkg = readJSON(join(repoPath, 'package.json'));
25
+
26
+ // 1. CLI: package.json has bin entry
27
+ if (pkg?.bin) {
28
+ interfaces.cli = { bin: pkg.bin, name: pkg.name };
29
+ }
30
+
31
+ // 2. Module: package.json has main or exports
32
+ if (pkg?.main || pkg?.exports) {
33
+ interfaces.module = { main: pkg.main || pkg.exports };
34
+ }
35
+
36
+ // 3. MCP Server: mcp-server.mjs/js/ts or dist/mcp-server.js
37
+ const mcpFiles = ['mcp-server.mjs', 'mcp-server.js', 'mcp-server.ts', 'dist/mcp-server.js'];
38
+ for (const f of mcpFiles) {
39
+ if (existsSync(join(repoPath, f))) {
40
+ interfaces.mcp = { file: f, name: pkg?.name || basename(repoPath) };
41
+ break;
42
+ }
43
+ }
44
+
45
+ // 4. OpenClaw Plugin: openclaw.plugin.json exists
46
+ const ocPlugin = join(repoPath, 'openclaw.plugin.json');
47
+ if (existsSync(ocPlugin)) {
48
+ interfaces.openclaw = { config: readJSON(ocPlugin), path: ocPlugin };
49
+ }
50
+
51
+ // 5. Skill: SKILL.md exists
52
+ if (existsSync(join(repoPath, 'SKILL.md'))) {
53
+ interfaces.skill = { path: join(repoPath, 'SKILL.md') };
54
+ }
55
+
56
+ // 6. Claude Code Hook: guard.mjs or claudeCode.hook in package.json
57
+ if (pkg?.claudeCode?.hook) {
58
+ interfaces.claudeCodeHook = pkg.claudeCode.hook;
59
+ } else if (existsSync(join(repoPath, 'guard.mjs'))) {
60
+ interfaces.claudeCodeHook = {
61
+ event: 'PreToolUse',
62
+ matcher: 'Edit|Write',
63
+ command: `node "${join(repoPath, 'guard.mjs')}"`,
64
+ timeout: 5
65
+ };
66
+ }
67
+
68
+ return { interfaces, pkg };
69
+ }
70
+
71
+ /**
72
+ * Describe detected interfaces as a human-readable summary.
73
+ */
74
+ export function describeInterfaces(interfaces) {
75
+ const lines = [];
76
+ const names = Object.keys(interfaces);
77
+
78
+ if (names.length === 0) {
79
+ return 'No interfaces detected.';
80
+ }
81
+
82
+ if (interfaces.cli) {
83
+ const bins = typeof interfaces.cli.bin === 'string' ? [interfaces.cli.name] : Object.keys(interfaces.cli.bin);
84
+ lines.push(`CLI: ${bins.join(', ')}`);
85
+ }
86
+ if (interfaces.module) lines.push(`Module: ${JSON.stringify(interfaces.module.main)}`);
87
+ if (interfaces.mcp) lines.push(`MCP Server: ${interfaces.mcp.file}`);
88
+ if (interfaces.openclaw) lines.push(`OpenClaw Plugin: ${interfaces.openclaw.config?.name || 'detected'}`);
89
+ if (interfaces.skill) lines.push(`Skill: SKILL.md`);
90
+ if (interfaces.claudeCodeHook) lines.push(`Claude Code Hook: ${interfaces.claudeCodeHook.event || 'PreToolUse'}`);
91
+
92
+ return `${names.length} interface(s): ${names.join(', ')}\n${lines.map(l => ` ${l}`).join('\n')}`;
93
+ }
94
+
95
+ /**
96
+ * Detect if a repo is a toolbox (has tools/ subdirectories with package.json).
97
+ * Returns array of { name, path } for each sub-tool, or empty array if not a toolbox.
98
+ */
99
+ export function detectToolbox(repoPath) {
100
+ const toolsDir = join(repoPath, 'tools');
101
+ if (!existsSync(toolsDir)) return [];
102
+
103
+ try {
104
+ const entries = readdirSync(toolsDir, { withFileTypes: true });
105
+ return entries
106
+ .filter(e => e.isDirectory() && existsSync(join(toolsDir, e.name, 'package.json')))
107
+ .map(e => ({ name: e.name, path: join(toolsDir, e.name) }));
108
+ } catch {
109
+ return [];
110
+ }
111
+ }
112
+
113
+ /**
114
+ * Detect interfaces and return a structured JSON-serializable result.
115
+ */
116
+ export function detectInterfacesJSON(repoPath) {
117
+ const { interfaces, pkg } = detectInterfaces(repoPath);
118
+ return {
119
+ repo: basename(repoPath),
120
+ package: pkg?.name || null,
121
+ version: pkg?.version || null,
122
+ interfaces: Object.fromEntries(
123
+ Object.entries(interfaces).map(([type, info]) => [type, {
124
+ detected: true,
125
+ ...info,
126
+ }])
127
+ ),
128
+ interfaceCount: Object.keys(interfaces).length,
129
+ };
130
+ }
@@ -0,0 +1,20 @@
1
+ # Minimal Universal Interface Template
2
+
3
+ The smallest possible agent-native tool. Four files, four interfaces.
4
+
5
+ ```
6
+ core.mjs ← your logic
7
+ cli.mjs ← thin CLI wrapper
8
+ mcp-server.mjs ← MCP server
9
+ SKILL.md ← agent instructions
10
+ package.json ← name, bin, exports
11
+ ```
12
+
13
+ Copy this folder, rename everything, replace `hello()` with your functions.
14
+
15
+ ## Test it
16
+
17
+ ```bash
18
+ node cli.mjs world # Hello, world!
19
+ wip-install --dry-run . # Detected 4 interface(s): cli, module, mcp, skill
20
+ ```
@@ -0,0 +1,28 @@
1
+ ---
2
+ name: my-tool
3
+ version: 1.0.0
4
+ description: A minimal example tool.
5
+ metadata:
6
+ category: example
7
+ capabilities:
8
+ - hello
9
+ author:
10
+ name: Your Name
11
+ ---
12
+
13
+ # my-tool
14
+
15
+ A minimal example of the six-door pattern.
16
+
17
+ ## When to Use This Skill
18
+
19
+ Use `hello` when you need to greet someone.
20
+
21
+ ## API Reference
22
+
23
+ ### hello(options)
24
+
25
+ ```javascript
26
+ import { hello } from './core.mjs';
27
+ hello({ name: 'world' }); // "Hello, world!"
28
+ ```
@@ -0,0 +1,4 @@
1
+ #!/usr/bin/env node
2
+ import { hello } from './core.mjs';
3
+ const name = process.argv[2];
4
+ console.log(hello({ name }));
@@ -0,0 +1,8 @@
1
+ /**
2
+ * Minimal six-door tool template.
3
+ * Replace this with your actual logic.
4
+ */
5
+
6
+ export function hello({ name = 'world' } = {}) {
7
+ return `Hello, ${name}!`;
8
+ }
@@ -0,0 +1,27 @@
1
+ #!/usr/bin/env node
2
+ import { Server } from '@modelcontextprotocol/sdk/server/index.js';
3
+ import { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';
4
+ import { hello } from './core.mjs';
5
+
6
+ const server = new Server(
7
+ { name: 'my-tool', version: '1.0.0' },
8
+ { capabilities: { tools: {} } }
9
+ );
10
+
11
+ server.setRequestHandler({ method: 'tools/list' }, async () => ({
12
+ tools: [{
13
+ name: 'hello',
14
+ description: 'Say hello',
15
+ inputSchema: {
16
+ type: 'object',
17
+ properties: { name: { type: 'string' } },
18
+ },
19
+ }],
20
+ }));
21
+
22
+ server.setRequestHandler({ method: 'tools/call' }, async (req) => ({
23
+ content: [{ type: 'text', text: hello(req.params.arguments) }],
24
+ }));
25
+
26
+ const transport = new StdioServerTransport();
27
+ await server.connect(transport);
@@ -0,0 +1,12 @@
1
+ {
2
+ "name": "my-tool",
3
+ "version": "1.0.0",
4
+ "type": "module",
5
+ "main": "core.mjs",
6
+ "bin": {
7
+ "my-tool": "./cli.mjs"
8
+ },
9
+ "exports": {
10
+ ".": "./core.mjs"
11
+ }
12
+ }