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,331 @@
|
|
|
1
|
+
---
|
|
2
|
+
description: Validate task completion and approve for shipping. Can be used standalone or called by the workflow. Runs autonomous validation checks.
|
|
3
|
+
argument-hint: "[--task-id ID] [--verbose]"
|
|
4
|
+
allowed-tools: Bash(git:*), Bash(npm:*), Read, Grep, Glob
|
|
5
|
+
model: sonnet
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
# /delivery-approval - Delivery Validation
|
|
9
|
+
|
|
10
|
+
Validate that the current work is complete and ready to ship.
|
|
11
|
+
This command runs the same validation as the workflow's delivery-validator agent.
|
|
12
|
+
|
|
13
|
+
## Arguments
|
|
14
|
+
|
|
15
|
+
- `--task-id ID`: Specify task ID to validate against (default: from workflow state)
|
|
16
|
+
- `--verbose`: Show detailed output for each check
|
|
17
|
+
|
|
18
|
+
## Parse Arguments
|
|
19
|
+
|
|
20
|
+
```javascript
|
|
21
|
+
const args = $ARGUMENTS.split(' ').filter(Boolean);
|
|
22
|
+
const verbose = args.includes('--verbose');
|
|
23
|
+
const taskIdArg = args.find(a => a.startsWith('--task-id'));
|
|
24
|
+
const taskId = taskIdArg ? args[args.indexOf(taskIdArg) + 1] : null;
|
|
25
|
+
```
|
|
26
|
+
|
|
27
|
+
## Phase 1: Get Context
|
|
28
|
+
|
|
29
|
+
```javascript
|
|
30
|
+
const workflowState = require('${CLAUDE_PLUGIN_ROOT}/lib/state/workflow-state.js');
|
|
31
|
+
|
|
32
|
+
let task;
|
|
33
|
+
let changedFiles;
|
|
34
|
+
|
|
35
|
+
// Try to get from workflow state first
|
|
36
|
+
const state = workflowState.readState();
|
|
37
|
+
if (state?.task) {
|
|
38
|
+
task = state.task;
|
|
39
|
+
} else if (taskId) {
|
|
40
|
+
// Fetch task from GitHub
|
|
41
|
+
task = await fetchGitHubIssue(taskId);
|
|
42
|
+
} else {
|
|
43
|
+
// Get from recent commit message
|
|
44
|
+
task = await inferTaskFromCommits();
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
// Get changed files
|
|
48
|
+
changedFiles = (await exec('git diff --name-only origin/main..HEAD')).split('\n').filter(Boolean);
|
|
49
|
+
```
|
|
50
|
+
|
|
51
|
+
## Phase 2: Run Validation Checks
|
|
52
|
+
|
|
53
|
+
### Check 1: Git State
|
|
54
|
+
|
|
55
|
+
```bash
|
|
56
|
+
# Check for uncommitted changes
|
|
57
|
+
UNCOMMITTED=$(git status --porcelain)
|
|
58
|
+
if [ -n "$UNCOMMITTED" ]; then
|
|
59
|
+
echo "UNCOMMITTED_CHANGES=true"
|
|
60
|
+
echo "$UNCOMMITTED"
|
|
61
|
+
fi
|
|
62
|
+
|
|
63
|
+
# Check if ahead of remote
|
|
64
|
+
AHEAD=$(git rev-list --count origin/main..HEAD)
|
|
65
|
+
echo "COMMITS_AHEAD=$AHEAD"
|
|
66
|
+
|
|
67
|
+
# Check branch name
|
|
68
|
+
BRANCH=$(git branch --show-current)
|
|
69
|
+
echo "BRANCH=$BRANCH"
|
|
70
|
+
```
|
|
71
|
+
|
|
72
|
+
### Check 2: Tests Pass
|
|
73
|
+
|
|
74
|
+
```bash
|
|
75
|
+
# Detect and run tests
|
|
76
|
+
if [ -f "package.json" ]; then
|
|
77
|
+
if grep -q '"test"' package.json; then
|
|
78
|
+
echo "Running npm test..."
|
|
79
|
+
npm test 2>&1
|
|
80
|
+
TEST_RESULT=$?
|
|
81
|
+
echo "TEST_RESULT=$TEST_RESULT"
|
|
82
|
+
else
|
|
83
|
+
echo "NO_TEST_SCRIPT=true"
|
|
84
|
+
fi
|
|
85
|
+
elif [ -f "pytest.ini" ] || [ -f "pyproject.toml" ]; then
|
|
86
|
+
echo "Running pytest..."
|
|
87
|
+
pytest -v 2>&1
|
|
88
|
+
TEST_RESULT=$?
|
|
89
|
+
echo "TEST_RESULT=$TEST_RESULT"
|
|
90
|
+
elif [ -f "Cargo.toml" ]; then
|
|
91
|
+
echo "Running cargo test..."
|
|
92
|
+
cargo test 2>&1
|
|
93
|
+
TEST_RESULT=$?
|
|
94
|
+
echo "TEST_RESULT=$TEST_RESULT"
|
|
95
|
+
elif [ -f "go.mod" ]; then
|
|
96
|
+
echo "Running go test..."
|
|
97
|
+
go test ./... -v 2>&1
|
|
98
|
+
TEST_RESULT=$?
|
|
99
|
+
echo "TEST_RESULT=$TEST_RESULT"
|
|
100
|
+
fi
|
|
101
|
+
```
|
|
102
|
+
|
|
103
|
+
### Check 3: Build Passes
|
|
104
|
+
|
|
105
|
+
```bash
|
|
106
|
+
# Detect and run build
|
|
107
|
+
if [ -f "package.json" ] && grep -q '"build"' package.json; then
|
|
108
|
+
echo "Running npm run build..."
|
|
109
|
+
npm run build 2>&1
|
|
110
|
+
BUILD_RESULT=$?
|
|
111
|
+
echo "BUILD_RESULT=$BUILD_RESULT"
|
|
112
|
+
elif [ -f "Cargo.toml" ]; then
|
|
113
|
+
echo "Running cargo build..."
|
|
114
|
+
cargo build --release 2>&1
|
|
115
|
+
BUILD_RESULT=$?
|
|
116
|
+
echo "BUILD_RESULT=$BUILD_RESULT"
|
|
117
|
+
elif [ -f "go.mod" ]; then
|
|
118
|
+
echo "Running go build..."
|
|
119
|
+
go build ./... 2>&1
|
|
120
|
+
BUILD_RESULT=$?
|
|
121
|
+
echo "BUILD_RESULT=$BUILD_RESULT"
|
|
122
|
+
else
|
|
123
|
+
echo "NO_BUILD_SCRIPT=true"
|
|
124
|
+
BUILD_RESULT=0
|
|
125
|
+
fi
|
|
126
|
+
```
|
|
127
|
+
|
|
128
|
+
### Check 4: Lint Passes
|
|
129
|
+
|
|
130
|
+
```bash
|
|
131
|
+
# Run linter if available
|
|
132
|
+
if [ -f "package.json" ] && grep -q '"lint"' package.json; then
|
|
133
|
+
echo "Running npm run lint..."
|
|
134
|
+
npm run lint 2>&1
|
|
135
|
+
LINT_RESULT=$?
|
|
136
|
+
echo "LINT_RESULT=$LINT_RESULT"
|
|
137
|
+
elif [ -f ".eslintrc.js" ] || [ -f ".eslintrc.json" ]; then
|
|
138
|
+
echo "Running eslint..."
|
|
139
|
+
npx eslint . 2>&1
|
|
140
|
+
LINT_RESULT=$?
|
|
141
|
+
echo "LINT_RESULT=$LINT_RESULT"
|
|
142
|
+
else
|
|
143
|
+
echo "NO_LINTER=true"
|
|
144
|
+
LINT_RESULT=0
|
|
145
|
+
fi
|
|
146
|
+
```
|
|
147
|
+
|
|
148
|
+
### Check 5: Type Check (TypeScript)
|
|
149
|
+
|
|
150
|
+
```bash
|
|
151
|
+
if [ -f "tsconfig.json" ]; then
|
|
152
|
+
echo "Running tsc --noEmit..."
|
|
153
|
+
npx tsc --noEmit 2>&1
|
|
154
|
+
TYPE_RESULT=$?
|
|
155
|
+
echo "TYPE_RESULT=$TYPE_RESULT"
|
|
156
|
+
else
|
|
157
|
+
echo "NO_TYPESCRIPT=true"
|
|
158
|
+
TYPE_RESULT=0
|
|
159
|
+
fi
|
|
160
|
+
```
|
|
161
|
+
|
|
162
|
+
## Phase 3: Check Task Requirements
|
|
163
|
+
|
|
164
|
+
```javascript
|
|
165
|
+
async function checkRequirements(task, changedFiles) {
|
|
166
|
+
if (!task) {
|
|
167
|
+
return { passed: true, reason: 'No task specified, skipping requirements check' };
|
|
168
|
+
}
|
|
169
|
+
|
|
170
|
+
const requirements = extractRequirements(task.description || task.body || '');
|
|
171
|
+
|
|
172
|
+
if (requirements.length === 0) {
|
|
173
|
+
return { passed: true, reason: 'No specific requirements found in task' };
|
|
174
|
+
}
|
|
175
|
+
|
|
176
|
+
// Analyze changed files for each requirement
|
|
177
|
+
const results = [];
|
|
178
|
+
for (const req of requirements) {
|
|
179
|
+
const evidence = await findEvidence(req, changedFiles);
|
|
180
|
+
results.push({
|
|
181
|
+
requirement: req,
|
|
182
|
+
implemented: evidence.found,
|
|
183
|
+
evidence: evidence.details
|
|
184
|
+
});
|
|
185
|
+
}
|
|
186
|
+
|
|
187
|
+
const allMet = results.every(r => r.implemented);
|
|
188
|
+
return {
|
|
189
|
+
passed: allMet,
|
|
190
|
+
results,
|
|
191
|
+
reason: allMet ? 'All requirements met' : 'Some requirements not implemented'
|
|
192
|
+
};
|
|
193
|
+
}
|
|
194
|
+
```
|
|
195
|
+
|
|
196
|
+
## Phase 4: Aggregate Results
|
|
197
|
+
|
|
198
|
+
```javascript
|
|
199
|
+
const checks = {
|
|
200
|
+
gitState: {
|
|
201
|
+
passed: !UNCOMMITTED_CHANGES,
|
|
202
|
+
uncommitted: UNCOMMITTED_CHANGES,
|
|
203
|
+
commitsAhead: COMMITS_AHEAD,
|
|
204
|
+
branch: BRANCH
|
|
205
|
+
},
|
|
206
|
+
tests: {
|
|
207
|
+
passed: TEST_RESULT === 0,
|
|
208
|
+
exitCode: TEST_RESULT
|
|
209
|
+
},
|
|
210
|
+
build: {
|
|
211
|
+
passed: BUILD_RESULT === 0,
|
|
212
|
+
exitCode: BUILD_RESULT
|
|
213
|
+
},
|
|
214
|
+
lint: {
|
|
215
|
+
passed: LINT_RESULT === 0,
|
|
216
|
+
exitCode: LINT_RESULT
|
|
217
|
+
},
|
|
218
|
+
typeCheck: {
|
|
219
|
+
passed: TYPE_RESULT === 0,
|
|
220
|
+
exitCode: TYPE_RESULT
|
|
221
|
+
},
|
|
222
|
+
requirements: await checkRequirements(task, changedFiles)
|
|
223
|
+
};
|
|
224
|
+
|
|
225
|
+
const allPassed = Object.values(checks).every(c => c.passed);
|
|
226
|
+
const failedChecks = Object.entries(checks)
|
|
227
|
+
.filter(([_, v]) => !v.passed)
|
|
228
|
+
.map(([k, _]) => k);
|
|
229
|
+
```
|
|
230
|
+
|
|
231
|
+
## Phase 5: Output Results
|
|
232
|
+
|
|
233
|
+
### Summary Report
|
|
234
|
+
|
|
235
|
+
```markdown
|
|
236
|
+
## Delivery Validation Report
|
|
237
|
+
|
|
238
|
+
**Task**: ${task?.title || 'N/A'}
|
|
239
|
+
**Branch**: ${BRANCH}
|
|
240
|
+
**Commits ahead of main**: ${COMMITS_AHEAD}
|
|
241
|
+
|
|
242
|
+
### Validation Results
|
|
243
|
+
|
|
244
|
+
| Check | Status | Details |
|
|
245
|
+
|-------|--------|---------|
|
|
246
|
+
| Git State | ${checks.gitState.passed ? '✓' : '✗'} | ${checks.gitState.uncommitted ? 'Uncommitted changes' : 'Clean'} |
|
|
247
|
+
| Tests | ${checks.tests.passed ? '✓' : '✗'} | Exit code: ${checks.tests.exitCode} |
|
|
248
|
+
| Build | ${checks.build.passed ? '✓' : '✗'} | Exit code: ${checks.build.exitCode} |
|
|
249
|
+
| Lint | ${checks.lint.passed ? '✓' : '✗'} | Exit code: ${checks.lint.exitCode} |
|
|
250
|
+
| Type Check | ${checks.typeCheck.passed ? '✓' : '✗'} | Exit code: ${checks.typeCheck.exitCode} |
|
|
251
|
+
| Requirements | ${checks.requirements.passed ? '✓' : '✗'} | ${checks.requirements.reason} |
|
|
252
|
+
|
|
253
|
+
### Overall Status
|
|
254
|
+
|
|
255
|
+
${allPassed ?
|
|
256
|
+
'## ✓ APPROVED\nAll validation checks passed. Ready to ship!' :
|
|
257
|
+
`## ✗ NOT APPROVED\nFailed checks: ${failedChecks.join(', ')}`}
|
|
258
|
+
|
|
259
|
+
${!allPassed ? `
|
|
260
|
+
### Fix Required
|
|
261
|
+
|
|
262
|
+
${failedChecks.map(check => {
|
|
263
|
+
switch(check) {
|
|
264
|
+
case 'gitState': return '- Commit or stash uncommitted changes';
|
|
265
|
+
case 'tests': return '- Fix failing tests';
|
|
266
|
+
case 'build': return '- Fix build errors';
|
|
267
|
+
case 'lint': return '- Fix linting errors';
|
|
268
|
+
case 'typeCheck': return '- Fix TypeScript errors';
|
|
269
|
+
case 'requirements': return '- Implement missing requirements';
|
|
270
|
+
}
|
|
271
|
+
}).join('\n')}
|
|
272
|
+
` : ''}
|
|
273
|
+
```
|
|
274
|
+
|
|
275
|
+
### JSON Output (for scripting)
|
|
276
|
+
|
|
277
|
+
```json
|
|
278
|
+
{
|
|
279
|
+
"approved": ${allPassed},
|
|
280
|
+
"task": {
|
|
281
|
+
"id": "${task?.id || 'N/A'}",
|
|
282
|
+
"title": "${task?.title || 'N/A'}"
|
|
283
|
+
},
|
|
284
|
+
"checks": {
|
|
285
|
+
"gitState": ${JSON.stringify(checks.gitState)},
|
|
286
|
+
"tests": ${JSON.stringify(checks.tests)},
|
|
287
|
+
"build": ${JSON.stringify(checks.build)},
|
|
288
|
+
"lint": ${JSON.stringify(checks.lint)},
|
|
289
|
+
"typeCheck": ${JSON.stringify(checks.typeCheck)},
|
|
290
|
+
"requirements": ${JSON.stringify(checks.requirements)}
|
|
291
|
+
},
|
|
292
|
+
"failedChecks": ${JSON.stringify(failedChecks)},
|
|
293
|
+
"summary": "${allPassed ? 'All checks passed' : `Failed: ${failedChecks.join(', ')}`}"
|
|
294
|
+
}
|
|
295
|
+
```
|
|
296
|
+
|
|
297
|
+
## Examples
|
|
298
|
+
|
|
299
|
+
```bash
|
|
300
|
+
# Basic validation
|
|
301
|
+
/delivery-approval
|
|
302
|
+
|
|
303
|
+
# With verbose output
|
|
304
|
+
/delivery-approval --verbose
|
|
305
|
+
|
|
306
|
+
# For specific task
|
|
307
|
+
/delivery-approval --task-id 142
|
|
308
|
+
|
|
309
|
+
# Combined
|
|
310
|
+
/delivery-approval --task-id 142 --verbose
|
|
311
|
+
```
|
|
312
|
+
|
|
313
|
+
## Integration with Workflow
|
|
314
|
+
|
|
315
|
+
When called from the next-task workflow:
|
|
316
|
+
1. Task context is read from workflow state
|
|
317
|
+
2. Results are written back to workflow state
|
|
318
|
+
3. Workflow continues to ship phase if approved
|
|
319
|
+
|
|
320
|
+
When called standalone:
|
|
321
|
+
1. Attempts to infer task from commits
|
|
322
|
+
2. Runs all validation checks
|
|
323
|
+
3. Reports results but doesn't modify workflow state
|
|
324
|
+
|
|
325
|
+
## Success Criteria
|
|
326
|
+
|
|
327
|
+
- Runs all validation checks (tests, build, lint, types)
|
|
328
|
+
- Checks task requirements if available
|
|
329
|
+
- Provides clear pass/fail determination
|
|
330
|
+
- Shows actionable fixes for failures
|
|
331
|
+
- Works both standalone and in workflow context
|