awesome-slash 3.0.2 → 3.1.0
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 +8 -8
- package/.claude-plugin/plugin.json +1 -1
- package/CHANGELOG.md +26 -1
- package/README.md +8 -5
- package/adapters/codex/README.md +3 -2
- package/adapters/opencode/README.md +3 -2
- package/mcp-server/index.js +137 -22
- package/package.json +3 -2
- package/plugins/audit-project/.claude-plugin/plugin.json +1 -1
- package/plugins/audit-project/commands/audit-project-agents.md +244 -82
- package/plugins/audit-project/commands/audit-project.md +70 -10
- package/plugins/deslop/.claude-plugin/plugin.json +1 -1
- package/plugins/drift-detect/.claude-plugin/plugin.json +1 -1
- package/plugins/enhance/.claude-plugin/plugin.json +1 -1
- package/plugins/next-task/.claude-plugin/plugin.json +1 -1
- package/plugins/next-task/agents/delivery-validator.md +22 -13
- package/plugins/next-task/agents/review-orchestrator.md +560 -175
- package/plugins/next-task/commands/next-task.md +44 -4
- package/plugins/ship/.claude-plugin/plugin.json +1 -1
- package/plugins/ship/commands/ship.md +15 -10
- package/plugins/sync-docs/.claude-plugin/plugin.json +1 -1
- package/plugins/sync-docs/lib/patterns/cli-enhancers.js +8 -4
- package/plugins/sync-docs/lib/patterns/pipeline.js +58 -29
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "awesome-slash",
|
|
3
3
|
"description": "7 specialized plugins for AI workflow automation - task orchestration, PR workflow, slop detection, code review, drift detection, enhancement analysis, and documentation sync",
|
|
4
|
-
"version": "3.0
|
|
4
|
+
"version": "3.1.0",
|
|
5
5
|
"owner": {
|
|
6
6
|
"name": "Avi Fenesh",
|
|
7
7
|
"url": "https://github.com/avifenesh"
|
|
@@ -13,49 +13,49 @@
|
|
|
13
13
|
"name": "next-task",
|
|
14
14
|
"source": "./plugins/next-task",
|
|
15
15
|
"description": "Master workflow orchestrator: autonomous workflow with model optimization (opus/sonnet/haiku), two-file state management, workflow enforcement gates, 14 specialist agents",
|
|
16
|
-
"version": "3.0
|
|
16
|
+
"version": "3.1.0",
|
|
17
17
|
"category": "productivity"
|
|
18
18
|
},
|
|
19
19
|
{
|
|
20
20
|
"name": "ship",
|
|
21
21
|
"source": "./plugins/ship",
|
|
22
22
|
"description": "Complete PR workflow: commit to production, skips review when called from next-task, removes task from registry on cleanup, automatic rollback",
|
|
23
|
-
"version": "3.0
|
|
23
|
+
"version": "3.1.0",
|
|
24
24
|
"category": "deployment"
|
|
25
25
|
},
|
|
26
26
|
{
|
|
27
27
|
"name": "deslop",
|
|
28
28
|
"source": "./plugins/deslop",
|
|
29
29
|
"description": "3-phase AI slop detection: regex patterns (HIGH), multi-pass analyzers (MEDIUM), CLI tools (LOW)",
|
|
30
|
-
"version": "3.0
|
|
30
|
+
"version": "3.1.0",
|
|
31
31
|
"category": "development"
|
|
32
32
|
},
|
|
33
33
|
{
|
|
34
34
|
"name": "audit-project",
|
|
35
35
|
"source": "./plugins/audit-project",
|
|
36
36
|
"description": "Multi-agent iterative code review until zero issues remain",
|
|
37
|
-
"version": "3.0
|
|
37
|
+
"version": "3.1.0",
|
|
38
38
|
"category": "development"
|
|
39
39
|
},
|
|
40
40
|
{
|
|
41
41
|
"name": "drift-detect",
|
|
42
42
|
"source": "./plugins/drift-detect",
|
|
43
43
|
"description": "Deep repository analysis to realign project plans with code reality - detects drift, gaps, and creates prioritized reconstruction plans",
|
|
44
|
-
"version": "3.0
|
|
44
|
+
"version": "3.1.0",
|
|
45
45
|
"category": "productivity"
|
|
46
46
|
},
|
|
47
47
|
{
|
|
48
48
|
"name": "enhance",
|
|
49
49
|
"source": "./plugins/enhance",
|
|
50
50
|
"description": "Master enhancement orchestrator: parallel analyzer execution for plugins, agents, docs, CLAUDE.md, and prompts with unified reporting",
|
|
51
|
-
"version": "3.0
|
|
51
|
+
"version": "3.1.0",
|
|
52
52
|
"category": "development"
|
|
53
53
|
},
|
|
54
54
|
{
|
|
55
55
|
"name": "sync-docs",
|
|
56
56
|
"source": "./plugins/sync-docs",
|
|
57
57
|
"description": "Standalone documentation sync: find outdated refs, update CHANGELOG, flag stale examples based on code changes",
|
|
58
|
-
"version": "3.0
|
|
58
|
+
"version": "3.1.0",
|
|
59
59
|
"category": "development"
|
|
60
60
|
}
|
|
61
61
|
],
|
package/CHANGELOG.md
CHANGED
|
@@ -7,6 +7,32 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
|
|
|
7
7
|
|
|
8
8
|
## [Unreleased]
|
|
9
9
|
|
|
10
|
+
## [3.1.0] - 2026-01-26
|
|
11
|
+
|
|
12
|
+
### Added
|
|
13
|
+
- **Queue-Based Review Loop** - Multi-pass review with resume support, stall detection, and decision-gate overrides
|
|
14
|
+
- **CI Consistency Validation** - Repository validator for version/mapping/agent-count alignment (`npm run validate`)
|
|
15
|
+
- **Pre-Release Channels** - `rc`/`beta` tag support for npm dist-tags and GitHub prereleases
|
|
16
|
+
|
|
17
|
+
### Fixed
|
|
18
|
+
- **MCP Path Scoping** - MCP tools now reject paths outside the repo (custom tasks, review_code, slop_detect)
|
|
19
|
+
- **MCP Responsiveness** - Review and slop pipelines run in a worker thread with sync fallback
|
|
20
|
+
- **Slop Pipeline IO** - Cached file reads reduce repeated disk access
|
|
21
|
+
|
|
22
|
+
### Changed
|
|
23
|
+
- **Complexity Analysis** - Caps escomplex runs to reduce process spawn overhead
|
|
24
|
+
- **GitHub Actions** - Actions pinned to commit SHAs for supply-chain hardening
|
|
25
|
+
|
|
26
|
+
## [3.0.3-rc.1] - 2026-01-26
|
|
27
|
+
|
|
28
|
+
### Added
|
|
29
|
+
- **Queue-Based Review Loop** - Multi-pass review with resume support, stall detection, and decision gate overrides in /next-task and /audit-project
|
|
30
|
+
- **CI Consistency Validation** - New repository validator for version/mapping/agent-count alignment in `npm run validate`
|
|
31
|
+
- **Pre-Release Channels** - `rc`/`beta` tag support for npm dist-tags and GitHub prereleases
|
|
32
|
+
|
|
33
|
+
### Changed
|
|
34
|
+
- **Review Passes** - Integrated security/performance/test coverage passes and conditional specialists for audit/review workflows
|
|
35
|
+
|
|
10
36
|
## [3.0.2] - 2025-01-24
|
|
11
37
|
|
|
12
38
|
### Fixed
|
|
@@ -1021,4 +1047,3 @@ Initial release with full feature set.
|
|
|
1021
1047
|
- MIT License
|
|
1022
1048
|
- Security policy
|
|
1023
1049
|
- Contributing guidelines
|
|
1024
|
-
|
package/README.md
CHANGED
|
@@ -72,9 +72,9 @@ Every finding is tagged with a certainty level:
|
|
|
72
72
|
|
|
73
73
|
This means you can run `/deslop apply` and trust that it won't break things.
|
|
74
74
|
|
|
75
|
-
### 2. Review Loops
|
|
75
|
+
### 2. Review Loops With Safeguards
|
|
76
76
|
|
|
77
|
-
The review-orchestrator agent
|
|
77
|
+
The review-orchestrator agent runs core review passes (code quality, security, performance, test coverage) plus conditional specialists until there are no open issues. Then it runs deslop-work on its own fixes to catch any AI artifacts it introduced.
|
|
78
78
|
|
|
79
79
|
### 3. Workflow Enforcement
|
|
80
80
|
|
|
@@ -358,26 +358,29 @@ Three phases run in sequence:
|
|
|
358
358
|
|
|
359
359
|
**What happens when you run it:**
|
|
360
360
|
|
|
361
|
-
Up to
|
|
361
|
+
Up to 10 specialized role-based agents run based on your project: <!-- AGENT_COUNT_ROLE_BASED: 10 -->
|
|
362
362
|
|
|
363
363
|
| Agent | When Active | Focus Area |
|
|
364
364
|
|-------|-------------|------------|
|
|
365
|
+
| code-quality-reviewer | Always | Code quality, error handling |
|
|
365
366
|
| security-expert | Always | Vulnerabilities, auth, secrets |
|
|
366
367
|
| performance-engineer | Always | N+1 queries, memory, blocking ops |
|
|
367
|
-
| test-quality-guardian |
|
|
368
|
+
| test-quality-guardian | Always | Coverage, edge cases, mocking |
|
|
368
369
|
| architecture-reviewer | If 50+ files | Modularity, patterns, SOLID |
|
|
369
370
|
| database-specialist | If DB detected | Queries, indexes, transactions |
|
|
370
371
|
| api-designer | If API detected | REST, errors, pagination |
|
|
371
372
|
| frontend-specialist | If frontend detected | Components, state, UX |
|
|
373
|
+
| backend-specialist | If backend detected | Services, domain logic |
|
|
372
374
|
| devops-reviewer | If CI/CD detected | Pipelines, configs, secrets |
|
|
373
375
|
|
|
374
|
-
Findings are collected and categorized by severity (critical/high/medium/low).
|
|
376
|
+
Findings are collected and categorized by severity (critical/high/medium/low). All non-false-positive issues get fixed automatically. The loop repeats until no open issues remain.
|
|
375
377
|
|
|
376
378
|
**Usage:**
|
|
377
379
|
|
|
378
380
|
```bash
|
|
379
381
|
/audit-project # Full review
|
|
380
382
|
/audit-project --quick # Single pass
|
|
383
|
+
/audit-project --resume # Resume from queue file
|
|
381
384
|
/audit-project --domain security # Security focus only
|
|
382
385
|
/audit-project --recent # Only recent changes
|
|
383
386
|
```
|
package/adapters/codex/README.md
CHANGED
|
@@ -68,13 +68,14 @@ codex
|
|
|
68
68
|
> /audit-project
|
|
69
69
|
> /audit-project --recent
|
|
70
70
|
> /audit-project --domain security
|
|
71
|
+
> /audit-project --resume
|
|
71
72
|
```
|
|
72
73
|
|
|
73
74
|
**What it does:**
|
|
74
|
-
- Deploys
|
|
75
|
+
- Deploys 10 specialized agents
|
|
75
76
|
- Adapts to your tech stack
|
|
76
77
|
- Finds bugs, security issues, performance problems
|
|
77
|
-
- Iterates until
|
|
78
|
+
- Iterates until no open issues remain
|
|
78
79
|
|
|
79
80
|
---
|
|
80
81
|
|
|
@@ -68,13 +68,14 @@ opencode
|
|
|
68
68
|
> /audit-project
|
|
69
69
|
> /audit-project --recent
|
|
70
70
|
> /audit-project --domain security
|
|
71
|
+
> /audit-project --resume
|
|
71
72
|
```
|
|
72
73
|
|
|
73
74
|
**What it does:**
|
|
74
|
-
- Deploys
|
|
75
|
+
- Deploys 10 specialized agents
|
|
75
76
|
- Adapts to your tech stack
|
|
76
77
|
- Finds bugs, security issues, performance problems
|
|
77
|
-
- Iterates until
|
|
78
|
+
- Iterates until no open issues remain
|
|
78
79
|
|
|
79
80
|
---
|
|
80
81
|
|
package/mcp-server/index.js
CHANGED
|
@@ -22,6 +22,7 @@ const fs = require('fs').promises;
|
|
|
22
22
|
const fsSync = require('fs');
|
|
23
23
|
const { promisify } = require('util');
|
|
24
24
|
const { exec } = require('child_process');
|
|
25
|
+
const { Worker } = require('worker_threads');
|
|
25
26
|
const execAsync = promisify(exec);
|
|
26
27
|
const workflowState = require('../lib/state/workflow-state.js');
|
|
27
28
|
const { runPipeline, formatHandoffPrompt, CERTAINTY, THOROUGHNESS } = require('../lib/patterns/pipeline.js');
|
|
@@ -30,6 +31,77 @@ const enhance = require('../lib/enhance/index.js');
|
|
|
30
31
|
|
|
31
32
|
// Plugin root for relative paths
|
|
32
33
|
const PLUGIN_ROOT = process.env.PLUGIN_ROOT || path.join(__dirname, '..');
|
|
34
|
+
const REPO_ROOT = process.cwd();
|
|
35
|
+
|
|
36
|
+
function resolveRepoPath(inputPath) {
|
|
37
|
+
if (!inputPath) return null;
|
|
38
|
+
const resolved = path.resolve(REPO_ROOT, inputPath);
|
|
39
|
+
const withinRepo = resolved === REPO_ROOT || resolved.startsWith(REPO_ROOT + path.sep);
|
|
40
|
+
return withinRepo ? resolved : null;
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
function toRepoRelative(resolvedPath) {
|
|
44
|
+
const relative = path.relative(REPO_ROOT, resolvedPath);
|
|
45
|
+
if (!relative) return '.';
|
|
46
|
+
return relative.split(path.sep).join('/');
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
function filterRepoFiles(files) {
|
|
50
|
+
const allowed = [];
|
|
51
|
+
const rejected = [];
|
|
52
|
+
|
|
53
|
+
for (const file of files) {
|
|
54
|
+
if (!file) continue;
|
|
55
|
+
const resolved = resolveRepoPath(file);
|
|
56
|
+
if (!resolved) {
|
|
57
|
+
rejected.push(file);
|
|
58
|
+
continue;
|
|
59
|
+
}
|
|
60
|
+
allowed.push(toRepoRelative(resolved));
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
return { allowed, rejected };
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
function runPipelineAsync(repoPath, options) {
|
|
67
|
+
const pipelinePath = path.join(PLUGIN_ROOT, 'lib', 'patterns', 'pipeline.js');
|
|
68
|
+
return new Promise((resolve, reject) => {
|
|
69
|
+
const worker = new Worker(
|
|
70
|
+
`const { parentPort, workerData } = require('worker_threads');
|
|
71
|
+
try {
|
|
72
|
+
const { runPipeline } = require(workerData.pipelinePath);
|
|
73
|
+
const result = runPipeline(workerData.repoPath, workerData.options);
|
|
74
|
+
parentPort.postMessage({ ok: true, result });
|
|
75
|
+
} catch (error) {
|
|
76
|
+
parentPort.postMessage({ ok: false, error: { message: error.message, stack: error.stack } });
|
|
77
|
+
}`,
|
|
78
|
+
{
|
|
79
|
+
eval: true,
|
|
80
|
+
workerData: {
|
|
81
|
+
repoPath,
|
|
82
|
+
options,
|
|
83
|
+
pipelinePath
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
);
|
|
87
|
+
|
|
88
|
+
worker.once('message', (message) => {
|
|
89
|
+
worker.terminate();
|
|
90
|
+
if (message.ok) {
|
|
91
|
+
resolve(message.result);
|
|
92
|
+
} else {
|
|
93
|
+
const err = new Error(message.error?.message || 'Pipeline worker failed');
|
|
94
|
+
err.stack = message.error?.stack;
|
|
95
|
+
reject(err);
|
|
96
|
+
}
|
|
97
|
+
});
|
|
98
|
+
|
|
99
|
+
worker.once('error', (error) => {
|
|
100
|
+
worker.terminate();
|
|
101
|
+
reject(error);
|
|
102
|
+
});
|
|
103
|
+
});
|
|
104
|
+
}
|
|
33
105
|
|
|
34
106
|
// MCP_TOOLS_ARRAY - Define available tools
|
|
35
107
|
const TOOLS = [
|
|
@@ -106,7 +178,7 @@ const TOOLS = [
|
|
|
106
178
|
},
|
|
107
179
|
customFile: {
|
|
108
180
|
type: 'string',
|
|
109
|
-
description: '
|
|
181
|
+
description: 'Repo-relative path to custom task file (required when source is "custom"). Parses markdown checkboxes.'
|
|
110
182
|
}
|
|
111
183
|
},
|
|
112
184
|
required: []
|
|
@@ -121,7 +193,7 @@ const TOOLS = [
|
|
|
121
193
|
files: {
|
|
122
194
|
type: 'array',
|
|
123
195
|
items: { type: 'string' },
|
|
124
|
-
description: '
|
|
196
|
+
description: 'Repo-relative files to review (defaults to git diff)'
|
|
125
197
|
},
|
|
126
198
|
thoroughness: {
|
|
127
199
|
type: 'string',
|
|
@@ -144,7 +216,7 @@ const TOOLS = [
|
|
|
144
216
|
properties: {
|
|
145
217
|
path: {
|
|
146
218
|
type: 'string',
|
|
147
|
-
description: '
|
|
219
|
+
description: 'Repo-relative directory or file to scan (default: repo root)'
|
|
148
220
|
},
|
|
149
221
|
mode: {
|
|
150
222
|
type: 'string',
|
|
@@ -492,12 +564,19 @@ const toolHandlers = {
|
|
|
492
564
|
};
|
|
493
565
|
}
|
|
494
566
|
|
|
495
|
-
|
|
496
|
-
|
|
497
|
-
|
|
567
|
+
const resolvedCustomFile = resolveRepoPath(customFile);
|
|
568
|
+
if (!resolvedCustomFile) {
|
|
569
|
+
return {
|
|
570
|
+
content: [{
|
|
571
|
+
type: 'text',
|
|
572
|
+
text: `Error: customFile must be within the repository. Received "${customFile}".`
|
|
573
|
+
}],
|
|
574
|
+
isError: true
|
|
575
|
+
};
|
|
576
|
+
}
|
|
498
577
|
|
|
499
578
|
try {
|
|
500
|
-
const content = await fs.readFile(
|
|
579
|
+
const content = await fs.readFile(resolvedCustomFile, 'utf-8');
|
|
501
580
|
const lines = content.split('\n');
|
|
502
581
|
const taskLines = lines.filter(line => /^[-*]\s+\[\s*\]\s+/.test(line));
|
|
503
582
|
|
|
@@ -512,7 +591,7 @@ const toolHandlers = {
|
|
|
512
591
|
title: text,
|
|
513
592
|
type: isSecurity ? 'security' : isBug ? 'bug' : isFeature ? 'feature' : 'task',
|
|
514
593
|
labels: [],
|
|
515
|
-
source:
|
|
594
|
+
source: toRepoRelative(resolvedCustomFile)
|
|
516
595
|
};
|
|
517
596
|
});
|
|
518
597
|
|
|
@@ -597,12 +676,34 @@ const toolHandlers = {
|
|
|
597
676
|
return crossPlatform.successResponse('No files to review. No changes detected.');
|
|
598
677
|
}
|
|
599
678
|
|
|
679
|
+
const { allowed, rejected } = filterRepoFiles(filesToReview);
|
|
680
|
+
if (rejected.length > 0) {
|
|
681
|
+
return crossPlatform.errorResponse(
|
|
682
|
+
`Invalid file path(s) outside the repository: ${rejected.join(', ')}`
|
|
683
|
+
);
|
|
684
|
+
}
|
|
685
|
+
filesToReview = allowed;
|
|
686
|
+
|
|
687
|
+
if (!filesToReview.length) {
|
|
688
|
+
return crossPlatform.errorResponse('No valid files to review after path validation.');
|
|
689
|
+
}
|
|
690
|
+
|
|
600
691
|
// Use the full pipeline for detection
|
|
601
|
-
|
|
602
|
-
|
|
603
|
-
|
|
604
|
-
|
|
605
|
-
|
|
692
|
+
let result;
|
|
693
|
+
try {
|
|
694
|
+
result = await runPipelineAsync(process.cwd(), {
|
|
695
|
+
thoroughness: thoroughness || THOROUGHNESS.NORMAL,
|
|
696
|
+
targetFiles: filesToReview,
|
|
697
|
+
mode: 'report'
|
|
698
|
+
});
|
|
699
|
+
} catch (error) {
|
|
700
|
+
console.warn(`Pipeline worker failed, falling back to sync run: ${error.message}`);
|
|
701
|
+
result = runPipeline(process.cwd(), {
|
|
702
|
+
thoroughness: thoroughness || THOROUGHNESS.NORMAL,
|
|
703
|
+
targetFiles: filesToReview,
|
|
704
|
+
mode: 'report'
|
|
705
|
+
});
|
|
706
|
+
}
|
|
606
707
|
|
|
607
708
|
// Use compact format by default for MCP (token efficiency)
|
|
608
709
|
const useCompact = compact !== false;
|
|
@@ -626,20 +727,34 @@ const toolHandlers = {
|
|
|
626
727
|
|
|
627
728
|
async slop_detect({ path: scanPath, mode, thoroughness, compact }) {
|
|
628
729
|
try {
|
|
629
|
-
const
|
|
730
|
+
const resolvedTargetPath = resolveRepoPath(scanPath || REPO_ROOT);
|
|
731
|
+
if (!resolvedTargetPath) {
|
|
732
|
+
return crossPlatform.errorResponse(
|
|
733
|
+
`Invalid path outside repository: ${scanPath}`
|
|
734
|
+
);
|
|
735
|
+
}
|
|
630
736
|
|
|
631
737
|
// Validate path exists
|
|
632
738
|
try {
|
|
633
|
-
await fs.access(
|
|
739
|
+
await fs.access(resolvedTargetPath);
|
|
634
740
|
} catch (e) {
|
|
635
|
-
return crossPlatform.errorResponse(`Path not found: ${
|
|
741
|
+
return crossPlatform.errorResponse(`Path not found: ${resolvedTargetPath}`);
|
|
636
742
|
}
|
|
637
743
|
|
|
638
744
|
// Run the 3-phase pipeline
|
|
639
|
-
|
|
640
|
-
|
|
641
|
-
|
|
642
|
-
|
|
745
|
+
let result;
|
|
746
|
+
try {
|
|
747
|
+
result = await runPipelineAsync(resolvedTargetPath, {
|
|
748
|
+
thoroughness: thoroughness || THOROUGHNESS.NORMAL,
|
|
749
|
+
mode: mode || 'report'
|
|
750
|
+
});
|
|
751
|
+
} catch (error) {
|
|
752
|
+
console.warn(`Pipeline worker failed, falling back to sync run: ${error.message}`);
|
|
753
|
+
result = runPipeline(resolvedTargetPath, {
|
|
754
|
+
thoroughness: thoroughness || THOROUGHNESS.NORMAL,
|
|
755
|
+
mode: mode || 'report'
|
|
756
|
+
});
|
|
757
|
+
}
|
|
643
758
|
|
|
644
759
|
// Use compact format by default for MCP (60% fewer tokens)
|
|
645
760
|
const useCompact = compact !== false;
|
|
@@ -650,7 +765,7 @@ const toolHandlers = {
|
|
|
650
765
|
|
|
651
766
|
// Return structured result
|
|
652
767
|
return crossPlatform.successResponse({
|
|
653
|
-
path:
|
|
768
|
+
path: toRepoRelative(resolvedTargetPath),
|
|
654
769
|
mode: mode || 'report',
|
|
655
770
|
thoroughness: thoroughness || 'normal',
|
|
656
771
|
filesAnalyzed: result.metadata.filesAnalyzed,
|
|
@@ -816,7 +931,7 @@ async function main() {
|
|
|
816
931
|
const server = new Server(
|
|
817
932
|
{
|
|
818
933
|
name: 'awesome-slash',
|
|
819
|
-
version: '3.0
|
|
934
|
+
version: '3.1.0',
|
|
820
935
|
},
|
|
821
936
|
{
|
|
822
937
|
capabilities: {
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "awesome-slash",
|
|
3
|
-
"version": "3.0
|
|
3
|
+
"version": "3.1.0",
|
|
4
4
|
"description": "6 specialized plugins for AI workflow automation - works with Claude Code, OpenCode, and Codex CLI",
|
|
5
5
|
"main": "lib/platform/detect-platform.js",
|
|
6
6
|
"type": "commonjs",
|
|
@@ -26,9 +26,10 @@
|
|
|
26
26
|
"test": "jest",
|
|
27
27
|
"test:watch": "jest --watch",
|
|
28
28
|
"test:coverage": "jest --coverage",
|
|
29
|
-
"validate": "npm run validate:plugins && npm run validate:cross-platform",
|
|
29
|
+
"validate": "npm run validate:plugins && npm run validate:cross-platform && npm run validate:consistency",
|
|
30
30
|
"validate:plugins": "node scripts/validate-plugins.js",
|
|
31
31
|
"validate:cross-platform": "node scripts/validate-cross-platform.js",
|
|
32
|
+
"validate:consistency": "node scripts/validate-repo-consistency.js",
|
|
32
33
|
"detect": "node lib/platform/detect-platform.js",
|
|
33
34
|
"verify": "node lib/platform/verify-tools.js",
|
|
34
35
|
"prepare": "node scripts/setup-hooks.js"
|