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.
@@ -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.2",
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.2",
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.2",
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.2",
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.2",
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.2",
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.2",
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.2",
58
+ "version": "3.1.0",
59
59
  "category": "development"
60
60
  }
61
61
  ],
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "awesome-slash",
3
- "version": "3.0.2",
3
+ "version": "3.1.0",
4
4
  "description": "Professional-grade slash commands for Claude Code with cross-platform support",
5
5
  "keywords": [
6
6
  "workflow",
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 Without Limits
75
+ ### 2. Review Loops With Safeguards
76
76
 
77
- The review-orchestrator agent doesn't have a max iteration count. It keeps running code-reviewer, silent-failure-hunter, and test-analyzer until there are zero critical or high-severity issues. Then it runs deslop-work on its own fixes to catch any AI artifacts it introduced.
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 8 specialized role-based agents run based on your project:
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 | If tests exist | Coverage, edge cases, mocking |
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). Critical and high issues get fixed automatically. The loop repeats until no critical or high issues remain.
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
  ```
@@ -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 8 specialized agents
75
+ - Deploys 10 specialized agents
75
76
  - Adapts to your tech stack
76
77
  - Finds bugs, security issues, performance problems
77
- - Iterates until zero critical issues
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 8 specialized agents
75
+ - Deploys 10 specialized agents
75
76
  - Adapts to your tech stack
76
77
  - Finds bugs, security issues, performance problems
77
- - Iterates until zero critical issues
78
+ - Iterates until no open issues remain
78
79
 
79
80
  ---
80
81
 
@@ -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: 'Path to custom task file (required when source is "custom"). Parses markdown checkboxes.'
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: 'Files to review (defaults to git diff)'
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: 'Directory or file to scan (default: current directory)'
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
- // Validate file path - prevent path traversal
496
- const normalizedPath = path.normalize(customFile);
497
- // Note: absolute paths and '..' are allowed but monitored via file access
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(customFile, 'utf-8');
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: customFile
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
- const result = runPipeline(process.cwd(), {
602
- thoroughness: thoroughness || THOROUGHNESS.NORMAL,
603
- targetFiles: filesToReview,
604
- mode: 'report'
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 targetPath = scanPath || process.cwd();
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(targetPath);
739
+ await fs.access(resolvedTargetPath);
634
740
  } catch (e) {
635
- return crossPlatform.errorResponse(`Path not found: ${targetPath}`);
741
+ return crossPlatform.errorResponse(`Path not found: ${resolvedTargetPath}`);
636
742
  }
637
743
 
638
744
  // Run the 3-phase pipeline
639
- const result = runPipeline(targetPath, {
640
- thoroughness: thoroughness || THOROUGHNESS.NORMAL,
641
- mode: mode || 'report'
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: targetPath,
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.2',
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.2",
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"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "audit-project",
3
- "version": "3.0.2",
3
+ "version": "3.1.0",
4
4
  "description": "Multi-agent iterative code review until zero issues remain",
5
5
  "author": {
6
6
  "name": "Avi Fenesh",