awesome-slash 2.4.2
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/.claude-plugin/marketplace.json +54 -0
- package/.claude-plugin/plugin.json +11 -0
- package/.mcp.json +8 -0
- package/CHANGELOG.md +261 -0
- package/LICENSE +21 -0
- package/README.md +363 -0
- package/SECURITY.md +101 -0
- package/adapters/README.md +256 -0
- package/adapters/codex/README.md +272 -0
- package/adapters/codex/install.sh +179 -0
- package/adapters/opencode/README.md +301 -0
- package/adapters/opencode/install.sh +223 -0
- package/lib/patterns/review-patterns.js +511 -0
- package/lib/patterns/slop-patterns.js +647 -0
- package/lib/platform/detect-platform.js +535 -0
- package/lib/platform/verify-tools.js +235 -0
- package/lib/state/workflow-state.js +635 -0
- package/lib/state/workflow-state.schema.json +282 -0
- package/lib/utils/context-optimizer.js +227 -0
- package/mcp-server/index.js +303 -0
- package/mcp-server/package.json +23 -0
- package/package.json +63 -0
- package/plugins/deslop-around/.claude-plugin/plugin.json +20 -0
- package/plugins/deslop-around/commands/deslop-around.md +220 -0
- package/plugins/deslop-around/lib/patterns/review-patterns.js +511 -0
- package/plugins/deslop-around/lib/patterns/slop-patterns.js +641 -0
- package/plugins/deslop-around/lib/platform/detect-platform.js +514 -0
- package/plugins/deslop-around/lib/platform/verify-tools.js +235 -0
- package/plugins/deslop-around/lib/state/workflow-state.js +635 -0
- package/plugins/deslop-around/lib/state/workflow-state.schema.json +282 -0
- package/plugins/deslop-around/lib/utils/context-optimizer.js +222 -0
- package/plugins/next-task/.claude-plugin/plugin.json +24 -0
- package/plugins/next-task/agents/ci-fixer.md +236 -0
- package/plugins/next-task/agents/ci-monitor.md +291 -0
- package/plugins/next-task/agents/delivery-validator.md +451 -0
- package/plugins/next-task/agents/deslop-work.md +272 -0
- package/plugins/next-task/agents/docs-updater.md +506 -0
- package/plugins/next-task/agents/exploration-agent.md +277 -0
- package/plugins/next-task/agents/implementation-agent.md +427 -0
- package/plugins/next-task/agents/planning-agent.md +236 -0
- package/plugins/next-task/agents/policy-selector.md +248 -0
- package/plugins/next-task/agents/review-orchestrator.md +521 -0
- package/plugins/next-task/agents/simple-fixer.md +136 -0
- package/plugins/next-task/agents/task-discoverer.md +357 -0
- package/plugins/next-task/agents/test-coverage-checker.md +447 -0
- package/plugins/next-task/agents/worktree-manager.md +419 -0
- package/plugins/next-task/commands/delivery-approval.md +331 -0
- package/plugins/next-task/commands/next-task.md +627 -0
- package/plugins/next-task/commands/update-docs-around.md +418 -0
- package/plugins/next-task/hooks/hooks.json +14 -0
- package/plugins/next-task/lib/patterns/review-patterns.js +511 -0
- package/plugins/next-task/lib/patterns/slop-patterns.js +641 -0
- package/plugins/next-task/lib/platform/detect-platform.js +514 -0
- package/plugins/next-task/lib/platform/verify-tools.js +235 -0
- package/plugins/next-task/lib/state/tasks-registry.schema.json +85 -0
- package/plugins/next-task/lib/state/workflow-state.js +635 -0
- package/plugins/next-task/lib/state/workflow-state.schema.json +282 -0
- package/plugins/next-task/lib/state/worktree-status.schema.json +219 -0
- package/plugins/next-task/lib/utils/context-optimizer.js +222 -0
- package/plugins/project-review/.claude-plugin/plugin.json +20 -0
- package/plugins/project-review/commands/project-review-agents.md +286 -0
- package/plugins/project-review/commands/project-review-github.md +142 -0
- package/plugins/project-review/commands/project-review.md +273 -0
- package/plugins/project-review/lib/patterns/review-patterns.js +511 -0
- package/plugins/project-review/lib/patterns/slop-patterns.js +641 -0
- package/plugins/project-review/lib/platform/detect-platform.js +514 -0
- package/plugins/project-review/lib/platform/verify-tools.js +235 -0
- package/plugins/project-review/lib/state/workflow-state.js +635 -0
- package/plugins/project-review/lib/state/workflow-state.schema.json +282 -0
- package/plugins/project-review/lib/utils/context-optimizer.js +222 -0
- package/plugins/reality-check/.claude-plugin/plugin.json +23 -0
- package/plugins/reality-check/README.md +156 -0
- package/plugins/reality-check/agents/code-explorer.md +353 -0
- package/plugins/reality-check/agents/doc-analyzer.md +337 -0
- package/plugins/reality-check/agents/issue-scanner.md +231 -0
- package/plugins/reality-check/agents/plan-synthesizer.md +479 -0
- package/plugins/reality-check/commands/scan.md +242 -0
- package/plugins/reality-check/commands/set.md +203 -0
- package/plugins/reality-check/lib/state/reality-check-state.js +509 -0
- package/plugins/reality-check/skills/reality-analysis/SKILL.md +317 -0
- package/plugins/ship/.claude-plugin/plugin.json +21 -0
- package/plugins/ship/commands/ship-ci-review-loop.md +443 -0
- package/plugins/ship/commands/ship-deployment.md +330 -0
- package/plugins/ship/commands/ship-error-handling.md +254 -0
- package/plugins/ship/commands/ship.md +370 -0
- package/plugins/ship/lib/patterns/review-patterns.js +511 -0
- package/plugins/ship/lib/patterns/slop-patterns.js +641 -0
- package/plugins/ship/lib/platform/detect-platform.js +514 -0
- package/plugins/ship/lib/platform/verify-tools.js +235 -0
- package/plugins/ship/lib/state/workflow-state.js +635 -0
- package/plugins/ship/lib/state/workflow-state.schema.json +282 -0
- package/plugins/ship/lib/utils/context-optimizer.js +222 -0
- package/scripts/install/claude.sh +50 -0
- package/scripts/install/codex.sh +181 -0
- package/scripts/install/opencode.sh +211 -0
|
@@ -0,0 +1,235 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
/**
|
|
3
|
+
* Tool Verification System
|
|
4
|
+
* Checks availability and versions of development tools for graceful degradation
|
|
5
|
+
*
|
|
6
|
+
* Usage: node lib/platform/verify-tools.js
|
|
7
|
+
* Output: JSON with tool availability and versions
|
|
8
|
+
*
|
|
9
|
+
* @author Avi Fenesh
|
|
10
|
+
* @license MIT
|
|
11
|
+
*/
|
|
12
|
+
|
|
13
|
+
const { execFileSync, spawnSync, spawn } = require('child_process');
|
|
14
|
+
|
|
15
|
+
// Detect Windows platform
|
|
16
|
+
const isWindows = process.platform === 'win32';
|
|
17
|
+
|
|
18
|
+
/**
|
|
19
|
+
* Checks if a tool is available and returns its version (sync)
|
|
20
|
+
* Uses safe execution methods to avoid shell injection vulnerabilities
|
|
21
|
+
* @param {string} command - Command to check (e.g., 'git', 'node')
|
|
22
|
+
* @param {string} versionFlag - Flag to get version (default: '--version')
|
|
23
|
+
* @returns {Object} { available: boolean, version: string|null }
|
|
24
|
+
*/
|
|
25
|
+
function checkTool(command, versionFlag = '--version') {
|
|
26
|
+
// Validate command contains only safe characters (alphanumeric, underscore, hyphen)
|
|
27
|
+
if (!/^[a-zA-Z0-9_-]+$/.test(command)) {
|
|
28
|
+
return { available: false, version: null };
|
|
29
|
+
}
|
|
30
|
+
// Validate versionFlag contains only safe characters
|
|
31
|
+
if (!/^[a-zA-Z0-9_-]+$/.test(versionFlag)) {
|
|
32
|
+
return { available: false, version: null };
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
try {
|
|
36
|
+
let output;
|
|
37
|
+
|
|
38
|
+
if (isWindows) {
|
|
39
|
+
// On Windows, use spawnSync with shell to handle .cmd/.bat scripts
|
|
40
|
+
// Input is validated above so this is safe
|
|
41
|
+
const result = spawnSync(command, [versionFlag], {
|
|
42
|
+
encoding: 'utf8',
|
|
43
|
+
stdio: ['pipe', 'pipe', 'ignore'],
|
|
44
|
+
timeout: 5000,
|
|
45
|
+
windowsHide: true,
|
|
46
|
+
shell: true
|
|
47
|
+
});
|
|
48
|
+
if (result.error || result.status !== 0) {
|
|
49
|
+
return { available: false, version: null };
|
|
50
|
+
}
|
|
51
|
+
output = (result.stdout || '').trim();
|
|
52
|
+
} else {
|
|
53
|
+
// On Unix, use execFileSync (more secure, no shell)
|
|
54
|
+
output = execFileSync(command, [versionFlag], {
|
|
55
|
+
encoding: 'utf8',
|
|
56
|
+
stdio: ['pipe', 'pipe', 'ignore'],
|
|
57
|
+
timeout: 5000
|
|
58
|
+
}).trim();
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
// Extract version from first line
|
|
62
|
+
const version = output.split('\n')[0];
|
|
63
|
+
return { available: true, version };
|
|
64
|
+
} catch {
|
|
65
|
+
return { available: false, version: null };
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
/**
|
|
70
|
+
* Checks if a tool is available and returns its version (async)
|
|
71
|
+
* Uses safe execution methods to avoid shell injection vulnerabilities
|
|
72
|
+
* @param {string} command - Command to check (e.g., 'git', 'node')
|
|
73
|
+
* @param {string} versionFlag - Flag to get version (default: '--version')
|
|
74
|
+
* @returns {Promise<Object>} { available: boolean, version: string|null }
|
|
75
|
+
*/
|
|
76
|
+
function checkToolAsync(command, versionFlag = '--version') {
|
|
77
|
+
return new Promise((resolve) => {
|
|
78
|
+
// Validate command contains only safe characters (alphanumeric, underscore, hyphen)
|
|
79
|
+
if (!/^[a-zA-Z0-9_-]+$/.test(command)) {
|
|
80
|
+
return resolve({ available: false, version: null });
|
|
81
|
+
}
|
|
82
|
+
// Validate versionFlag contains only safe characters
|
|
83
|
+
if (!/^[a-zA-Z0-9_-]+$/.test(versionFlag)) {
|
|
84
|
+
return resolve({ available: false, version: null });
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
let child;
|
|
88
|
+
|
|
89
|
+
if (isWindows) {
|
|
90
|
+
// On Windows, spawn shell directly with command as single argument to avoid deprecation warning
|
|
91
|
+
// Input is validated above so this is safe
|
|
92
|
+
child = spawn('cmd.exe', ['/c', command, versionFlag], {
|
|
93
|
+
stdio: ['pipe', 'pipe', 'ignore'],
|
|
94
|
+
windowsHide: true
|
|
95
|
+
});
|
|
96
|
+
} else {
|
|
97
|
+
// On Unix, spawn directly without shell
|
|
98
|
+
child = spawn(command, [versionFlag], {
|
|
99
|
+
stdio: ['pipe', 'pipe', 'ignore']
|
|
100
|
+
});
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
let stdout = '';
|
|
104
|
+
|
|
105
|
+
// Set timeout
|
|
106
|
+
const timeout = setTimeout(() => {
|
|
107
|
+
child.kill();
|
|
108
|
+
resolve({ available: false, version: null });
|
|
109
|
+
}, 5000);
|
|
110
|
+
|
|
111
|
+
child.stdout.on('data', (data) => {
|
|
112
|
+
stdout += data.toString();
|
|
113
|
+
});
|
|
114
|
+
|
|
115
|
+
child.on('error', () => {
|
|
116
|
+
clearTimeout(timeout);
|
|
117
|
+
resolve({ available: false, version: null });
|
|
118
|
+
});
|
|
119
|
+
|
|
120
|
+
child.on('close', (code) => {
|
|
121
|
+
clearTimeout(timeout);
|
|
122
|
+
if (code !== 0) {
|
|
123
|
+
return resolve({ available: false, version: null });
|
|
124
|
+
}
|
|
125
|
+
const version = stdout.trim().split('\n')[0];
|
|
126
|
+
resolve({ available: true, version });
|
|
127
|
+
});
|
|
128
|
+
});
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
/**
|
|
132
|
+
* Tool definitions with their version flags
|
|
133
|
+
*/
|
|
134
|
+
const TOOL_DEFINITIONS = [
|
|
135
|
+
// Version control
|
|
136
|
+
{ name: 'git', flag: '--version' },
|
|
137
|
+
{ name: 'gh', flag: '--version' },
|
|
138
|
+
|
|
139
|
+
// Node.js ecosystem
|
|
140
|
+
{ name: 'node', flag: '--version' },
|
|
141
|
+
{ name: 'npm', flag: '--version' },
|
|
142
|
+
{ name: 'pnpm', flag: '--version' },
|
|
143
|
+
{ name: 'yarn', flag: '--version' },
|
|
144
|
+
{ name: 'bun', flag: '--version' },
|
|
145
|
+
|
|
146
|
+
// Python ecosystem
|
|
147
|
+
{ name: 'python', flag: '--version' },
|
|
148
|
+
{ name: 'python3', flag: '--version' },
|
|
149
|
+
{ name: 'pip', flag: '--version' },
|
|
150
|
+
{ name: 'pip3', flag: '--version' },
|
|
151
|
+
{ name: 'poetry', flag: '--version' },
|
|
152
|
+
|
|
153
|
+
// Rust ecosystem
|
|
154
|
+
{ name: 'cargo', flag: '--version' },
|
|
155
|
+
{ name: 'rustc', flag: '--version' },
|
|
156
|
+
{ name: 'rustup', flag: '--version' },
|
|
157
|
+
|
|
158
|
+
// Go ecosystem
|
|
159
|
+
{ name: 'go', flag: 'version' },
|
|
160
|
+
|
|
161
|
+
// Java ecosystem
|
|
162
|
+
{ name: 'java', flag: '--version' },
|
|
163
|
+
{ name: 'javac', flag: '--version' },
|
|
164
|
+
{ name: 'mvn', flag: '--version' },
|
|
165
|
+
{ name: 'gradle', flag: '--version' },
|
|
166
|
+
|
|
167
|
+
// Containerization
|
|
168
|
+
{ name: 'docker', flag: '--version' },
|
|
169
|
+
|
|
170
|
+
// Deployment platforms
|
|
171
|
+
{ name: 'railway', flag: '--version' },
|
|
172
|
+
{ name: 'vercel', flag: '--version' },
|
|
173
|
+
{ name: 'netlify', flag: '--version' },
|
|
174
|
+
{ name: 'flyctl', flag: 'version' },
|
|
175
|
+
|
|
176
|
+
// CI/CD tools
|
|
177
|
+
{ name: 'circleci', flag: 'version' }
|
|
178
|
+
];
|
|
179
|
+
|
|
180
|
+
/**
|
|
181
|
+
* Verifies all development tools (sync)
|
|
182
|
+
* @returns {Object} Tool availability map
|
|
183
|
+
*/
|
|
184
|
+
function verifyTools() {
|
|
185
|
+
const result = {};
|
|
186
|
+
for (const tool of TOOL_DEFINITIONS) {
|
|
187
|
+
result[tool.name] = checkTool(tool.name, tool.flag);
|
|
188
|
+
}
|
|
189
|
+
return result;
|
|
190
|
+
}
|
|
191
|
+
|
|
192
|
+
/**
|
|
193
|
+
* Verifies all development tools (async, parallel)
|
|
194
|
+
* Runs all tool checks in parallel for ~10x faster execution
|
|
195
|
+
* @returns {Promise<Object>} Tool availability map
|
|
196
|
+
*/
|
|
197
|
+
async function verifyToolsAsync() {
|
|
198
|
+
// Run all checks in parallel
|
|
199
|
+
const results = await Promise.all(
|
|
200
|
+
TOOL_DEFINITIONS.map(tool => checkToolAsync(tool.name, tool.flag))
|
|
201
|
+
);
|
|
202
|
+
|
|
203
|
+
// Build result object
|
|
204
|
+
const toolMap = {};
|
|
205
|
+
TOOL_DEFINITIONS.forEach((tool, index) => {
|
|
206
|
+
toolMap[tool.name] = results[index];
|
|
207
|
+
});
|
|
208
|
+
|
|
209
|
+
return toolMap;
|
|
210
|
+
}
|
|
211
|
+
|
|
212
|
+
// When run directly, output JSON (uses async for better performance)
|
|
213
|
+
if (require.main === module) {
|
|
214
|
+
(async () => {
|
|
215
|
+
try {
|
|
216
|
+
const result = await verifyToolsAsync();
|
|
217
|
+
console.log(JSON.stringify(result, null, 2));
|
|
218
|
+
} catch (error) {
|
|
219
|
+
console.error(JSON.stringify({
|
|
220
|
+
error: error.message,
|
|
221
|
+
timestamp: new Date().toISOString()
|
|
222
|
+
}, null, 2));
|
|
223
|
+
process.exit(1);
|
|
224
|
+
}
|
|
225
|
+
})();
|
|
226
|
+
}
|
|
227
|
+
|
|
228
|
+
// Export for use as module
|
|
229
|
+
module.exports = {
|
|
230
|
+
verifyTools,
|
|
231
|
+
verifyToolsAsync,
|
|
232
|
+
checkTool,
|
|
233
|
+
checkToolAsync,
|
|
234
|
+
TOOL_DEFINITIONS
|
|
235
|
+
};
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
{
|
|
2
|
+
"$schema": "https://json-schema.org/draft/2020-12/schema",
|
|
3
|
+
"$id": "tasks-registry.schema.json",
|
|
4
|
+
"title": "Tasks Registry",
|
|
5
|
+
"description": "Registry of claimed/in-progress tasks in the main repo. Used to prevent task collisions across parallel workflows.",
|
|
6
|
+
"type": "object",
|
|
7
|
+
"required": ["version", "tasks"],
|
|
8
|
+
"properties": {
|
|
9
|
+
"version": {
|
|
10
|
+
"type": "string",
|
|
11
|
+
"pattern": "^\\d+\\.\\d+\\.\\d+$",
|
|
12
|
+
"description": "Schema version",
|
|
13
|
+
"default": "1.0.0"
|
|
14
|
+
},
|
|
15
|
+
"tasks": {
|
|
16
|
+
"type": "array",
|
|
17
|
+
"description": "List of claimed tasks",
|
|
18
|
+
"items": {
|
|
19
|
+
"type": "object",
|
|
20
|
+
"required": ["id", "source", "branch", "worktreePath", "claimedAt"],
|
|
21
|
+
"properties": {
|
|
22
|
+
"id": {
|
|
23
|
+
"type": "string",
|
|
24
|
+
"description": "Task identifier (issue number, Linear ID, etc.)"
|
|
25
|
+
},
|
|
26
|
+
"source": {
|
|
27
|
+
"type": "string",
|
|
28
|
+
"enum": ["github", "linear", "tasks-md", "manual"],
|
|
29
|
+
"description": "Where the task came from"
|
|
30
|
+
},
|
|
31
|
+
"title": {
|
|
32
|
+
"type": "string",
|
|
33
|
+
"description": "Task title for display"
|
|
34
|
+
},
|
|
35
|
+
"branch": {
|
|
36
|
+
"type": "string",
|
|
37
|
+
"description": "Git branch name for this task"
|
|
38
|
+
},
|
|
39
|
+
"worktreePath": {
|
|
40
|
+
"type": "string",
|
|
41
|
+
"description": "Absolute path to the worktree"
|
|
42
|
+
},
|
|
43
|
+
"claimedAt": {
|
|
44
|
+
"type": "string",
|
|
45
|
+
"format": "date-time",
|
|
46
|
+
"description": "When the task was claimed"
|
|
47
|
+
},
|
|
48
|
+
"claimedBy": {
|
|
49
|
+
"type": "string",
|
|
50
|
+
"description": "Session/workflow ID that claimed this task"
|
|
51
|
+
},
|
|
52
|
+
"status": {
|
|
53
|
+
"type": "string",
|
|
54
|
+
"enum": ["claimed", "in-progress", "review", "shipping", "done"],
|
|
55
|
+
"default": "claimed",
|
|
56
|
+
"description": "High-level task status"
|
|
57
|
+
},
|
|
58
|
+
"lastActivityAt": {
|
|
59
|
+
"type": "string",
|
|
60
|
+
"format": "date-time",
|
|
61
|
+
"description": "Last activity timestamp for stale detection"
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
},
|
|
67
|
+
"examples": [
|
|
68
|
+
{
|
|
69
|
+
"version": "1.0.0",
|
|
70
|
+
"tasks": [
|
|
71
|
+
{
|
|
72
|
+
"id": "123",
|
|
73
|
+
"source": "github",
|
|
74
|
+
"title": "Add user authentication",
|
|
75
|
+
"branch": "feature/add-user-authentication-123",
|
|
76
|
+
"worktreePath": "/path/to/repo/../worktrees/add-user-authentication-123",
|
|
77
|
+
"claimedAt": "2024-01-15T10:30:00Z",
|
|
78
|
+
"claimedBy": "workflow-20240115-103000-abc123",
|
|
79
|
+
"status": "in-progress",
|
|
80
|
+
"lastActivityAt": "2024-01-15T11:45:00Z"
|
|
81
|
+
}
|
|
82
|
+
]
|
|
83
|
+
}
|
|
84
|
+
]
|
|
85
|
+
}
|