awesome-slash 3.3.0 → 3.3.3

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 (31) hide show
  1. package/.claude-plugin/marketplace.json +9 -9
  2. package/.claude-plugin/plugin.json +1 -1
  3. package/CHANGELOG.md +17 -0
  4. package/mcp-server/index.js +1 -1
  5. package/package.json +1 -1
  6. package/plugins/audit-project/.claude-plugin/plugin.json +1 -1
  7. package/plugins/audit-project/commands/audit-project-agents.md +3 -1
  8. package/plugins/audit-project/commands/audit-project.md +4 -2
  9. package/plugins/deslop/.claude-plugin/plugin.json +1 -1
  10. package/plugins/deslop/commands/deslop.md +9 -3
  11. package/plugins/drift-detect/.claude-plugin/plugin.json +1 -1
  12. package/plugins/drift-detect/commands/drift-detect.md +6 -2
  13. package/plugins/enhance/.claude-plugin/plugin.json +1 -1
  14. package/plugins/enhance/agents/claudemd-enhancer.md +3 -1
  15. package/plugins/enhance/commands/enhance.md +15 -5
  16. package/plugins/next-task/.claude-plugin/plugin.json +1 -1
  17. package/plugins/next-task/agents/ci-monitor.md +3 -1
  18. package/plugins/next-task/agents/delivery-validator.md +3 -1
  19. package/plugins/next-task/agents/docs-updater.md +3 -1
  20. package/plugins/next-task/agents/exploration-agent.md +6 -2
  21. package/plugins/next-task/agents/implementation-agent.md +6 -2
  22. package/plugins/next-task/agents/planning-agent.md +6 -2
  23. package/plugins/next-task/agents/task-discoverer.md +6 -2
  24. package/plugins/next-task/agents/worktree-manager.md +3 -1
  25. package/plugins/next-task/commands/delivery-approval.md +3 -1
  26. package/plugins/next-task/commands/next-task.md +6 -2
  27. package/plugins/repo-map/.claude-plugin/plugin.json +1 -1
  28. package/plugins/repo-map/commands/repo-map.md +2 -1
  29. package/plugins/ship/.claude-plugin/plugin.json +1 -1
  30. package/plugins/ship/commands/ship.md +21 -4
  31. package/plugins/sync-docs/.claude-plugin/plugin.json +16 -2
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "awesome-slash",
3
3
  "description": "8 specialized plugins for AI workflow automation - task orchestration, PR workflow, slop detection, code review, drift detection, enhancement analysis, documentation sync, and repo mapping",
4
- "version": "3.3.0",
4
+ "version": "3.3.3",
5
5
  "owner": {
6
6
  "name": "Avi Fenesh",
7
7
  "url": "https://github.com/avifenesh"
@@ -13,56 +13,56 @@
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.3.0",
16
+ "version": "3.3.3",
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.3.0",
23
+ "version": "3.3.3",
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.3.0",
30
+ "version": "3.3.3",
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.3.0",
37
+ "version": "3.3.3",
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.3.0",
44
+ "version": "3.3.3",
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.3.0",
51
+ "version": "3.3.3",
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.3.0",
58
+ "version": "3.3.3",
59
59
  "category": "development"
60
60
  },
61
61
  {
62
62
  "name": "repo-map",
63
63
  "source": "./plugins/repo-map",
64
64
  "description": "AST-based repository map generation using ast-grep with incremental updates for faster drift analysis",
65
- "version": "3.3.0",
65
+ "version": "3.3.3",
66
66
  "category": "development"
67
67
  }
68
68
  ],
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "awesome-slash",
3
- "version": "3.3.0",
3
+ "version": "3.3.3",
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,23 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
7
7
 
8
8
  ## [Unreleased]
9
9
 
10
+ ## [3.3.3] - 2026-01-29
11
+
12
+ ### Fixed
13
+ - **Windows Path Template Substitution** - Fixed plugin path template substitution across 18 command/agent files
14
+ - Replaced `'${CLAUDE_PLUGIN_ROOT}'.replace()` with runtime `process.env` access
15
+ - Pattern: `(process.env.CLAUDE_PLUGIN_ROOT || process.env.PLUGIN_ROOT || '').replace(/\/g, '/')`
16
+ - Supports both CLAUDE_PLUGIN_ROOT and PLUGIN_ROOT for cross-platform compatibility
17
+ - Added validation for missing environment variables in bash sections
18
+ - Bash pattern: `${CLAUDE_PLUGIN_ROOT:-$PLUGIN_ROOT}` with explicit error handling
19
+ - Fixes: Template strings in require() paths were not being substituted at runtime on Windows
20
+
21
+ ## [3.3.2] - 2026-01-29
22
+
23
+ ### Fixed
24
+ - **sync-docs Plugin Manifest** - Removed invalid `commands` field that caused "Invalid input" validation error during plugin installation
25
+ - **/ship Hook Response** - Added JSON response at workflow completion for SubagentStop hook compatibility
26
+
10
27
  ## [3.3.0] - 2026-01-28
11
28
 
12
29
  ### Changed
@@ -1018,7 +1018,7 @@ async function main() {
1018
1018
  const server = new Server(
1019
1019
  {
1020
1020
  name: 'awesome-slash',
1021
- version: '3.3.0',
1021
+ version: '3.3.3',
1022
1022
  },
1023
1023
  {
1024
1024
  capabilities: {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "awesome-slash",
3
- "version": "3.3.0",
3
+ "version": "3.3.3",
4
4
  "description": "8 specialized plugins for AI workflow automation (drift detection + AST repo maps) - works with Claude Code, OpenCode, and Codex CLI",
5
5
  "main": "lib/platform/detect-platform.js",
6
6
  "type": "commonjs",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "audit-project",
3
- "version": "3.3.0",
3
+ "version": "3.3.3",
4
4
  "description": "Multi-agent iterative code review until zero issues remain",
5
5
  "author": {
6
6
  "name": "Avi Fenesh",
@@ -32,7 +32,9 @@ Create a temporary review queue file in the platform state dir. Review passes ap
32
32
  ```javascript
33
33
  const path = require('path');
34
34
  const fs = require('fs');
35
- const { getStateDirPath } = require('${CLAUDE_PLUGIN_ROOT}'.replace(/\\/g, '/') + '/lib/platform/state-dir.js');
35
+ const pluginPath = (process.env.CLAUDE_PLUGIN_ROOT || process.env.PLUGIN_ROOT || '').replace(/\/g, '/');
36
+ if (!pluginPath) { console.error('Error: CLAUDE_PLUGIN_ROOT or PLUGIN_ROOT not set'); process.exit(1); }
37
+ const { getStateDirPath } = require(`${pluginPath}/lib/platform/state-dir.js`);
36
38
 
37
39
  const stateDirPath = getStateDirPath(process.cwd());
38
40
  if (!fs.existsSync(stateDirPath)) {
@@ -38,8 +38,10 @@ Otherwise create a new queue file. See `audit-project-agents.md` for queue handl
38
38
  ### Platform Detection
39
39
 
40
40
  ```bash
41
- PLATFORM=$(node ${CLAUDE_PLUGIN_ROOT}/lib/platform/detect-platform.js)
42
- TOOLS=$(node ${CLAUDE_PLUGIN_ROOT}/lib/platform/verify-tools.js)
41
+ PLUGIN_PATH="${CLAUDE_PLUGIN_ROOT:-$PLUGIN_ROOT}"
42
+ if [ -z "$PLUGIN_PATH" ]; then echo "Error: CLAUDE_PLUGIN_ROOT or PLUGIN_ROOT not set"; exit 1; fi
43
+ PLATFORM=$(node "$PLUGIN_PATH/lib/platform/detect-platform.js")
44
+ TOOLS=$(node "$PLUGIN_PATH/lib/platform/verify-tools.js")
43
45
 
44
46
  PROJECT_TYPE=$(echo $PLATFORM | jq -r '.projectType')
45
47
  PACKAGE_MGR=$(echo $PLATFORM | jq -r '.packageManager')
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "deslop",
3
- "version": "3.3.0",
3
+ "version": "3.3.3",
4
4
  "description": "AI slop cleanup with minimal diffs and behavior preservation",
5
5
  "author": {
6
6
  "name": "Avi Fenesh",
@@ -81,13 +81,17 @@ For **diff-based cleanup** of new work only, use the `deslop-work` agent via `/n
81
81
  Run the detection script to scan for slop patterns:
82
82
 
83
83
  ```bash
84
- node "${CLAUDE_PLUGIN_ROOT}/scripts/detect.js" <scope> --compact
84
+ PLUGIN_PATH="${CLAUDE_PLUGIN_ROOT:-$PLUGIN_ROOT}"
85
+ if [ -z "$PLUGIN_PATH" ]; then echo "Error: CLAUDE_PLUGIN_ROOT or PLUGIN_ROOT not set"; exit 1; fi
86
+ node "$PLUGIN_PATH/scripts/detect.js" <scope> --compact
85
87
  ```
86
88
 
87
89
  For deep analysis with all multi-pass analyzers:
88
90
 
89
91
  ```bash
90
- node "${CLAUDE_PLUGIN_ROOT}/scripts/detect.js" <scope> --deep --compact
92
+ PLUGIN_PATH="${CLAUDE_PLUGIN_ROOT:-$PLUGIN_ROOT}"
93
+ if [ -z "$PLUGIN_PATH" ]; then echo "Error: CLAUDE_PLUGIN_ROOT or PLUGIN_ROOT not set"; exit 1; fi
94
+ node "$PLUGIN_PATH/scripts/detect.js" <scope> --deep --compact
91
95
  ```
92
96
 
93
97
  Parse the output to identify top 10 hotspots, sorted by:
@@ -109,7 +113,9 @@ Present findings as a prioritized cleanup plan:
109
113
  Run detection with apply flag for auto-fixable patterns:
110
114
 
111
115
  ```bash
112
- node "${CLAUDE_PLUGIN_ROOT}/scripts/detect.js" <scope> --apply --max <max-changes> --compact
116
+ PLUGIN_PATH="${CLAUDE_PLUGIN_ROOT:-$PLUGIN_ROOT}"
117
+ if [ -z "$PLUGIN_PATH" ]; then echo "Error: CLAUDE_PLUGIN_ROOT or PLUGIN_ROOT not set"; exit 1; fi
118
+ node "$PLUGIN_PATH/scripts/detect.js" <scope> --apply --max <max-changes> --compact
113
119
  ```
114
120
 
115
121
  Then implement remaining manual fixes one changeset at a time:
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "drift-detect",
3
- "version": "3.3.0",
3
+ "version": "3.3.3",
4
4
  "description": "Deep repository analysis to realign project plans with actual code reality - discovers drift, gaps, and produces prioritized reconstruction plans",
5
5
  "author": {
6
6
  "name": "Avi Fenesh",
@@ -33,7 +33,11 @@ Example: `/drift-detect --sources github,docs --depth quick --output file`
33
33
 
34
34
  ```javascript
35
35
  // Normalize path for Windows (backslashes break in require strings)
36
- const pluginPath = '${CLAUDE_PLUGIN_ROOT}'.replace(/\\/g, '/');
36
+ const pluginPath = (process.env.CLAUDE_PLUGIN_ROOT || process.env.PLUGIN_ROOT || '').replace(/\\/g, '/');
37
+ if (!pluginPath) {
38
+ console.error('Error: CLAUDE_PLUGIN_ROOT or PLUGIN_ROOT environment variable not set');
39
+ process.exit(1);
40
+ }
37
41
  const collectors = require(`${pluginPath}/lib/drift-detect/collectors.js`);
38
42
  const repoMap = require(`${pluginPath}/lib/repo-map`);
39
43
 
@@ -116,7 +120,7 @@ console.log(`
116
120
 
117
121
  ${collectedData.github?.available ? `- **GitHub**: ${collectedData.github.issues.length} issues, ${collectedData.github.prs.length} PRs` : '- **GitHub**: Not available'}
118
122
  ${collectedData.docs ? `- **Documentation**: ${Object.keys(collectedData.docs.files).length} files analyzed` : '- **Documentation**: Skipped'}
119
- ${collectedData.code ? `- **Code**: ${Object.keys(collectedData.code.structure).length} directories scanned` : '- **Code**: Skipped'}
123
+ ${collectedData.code?.summary?.totalDirs ? `- **Code**: ${collectedData.code.summary.totalDirs} directories scanned` : '- **Code**: Skipped'}
120
124
 
121
125
  → Sending to semantic analyzer...
122
126
  `);
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "enhance",
3
- "version": "3.3.0",
3
+ "version": "3.3.3",
4
4
  "description": "Plugin structure and tool use analyzer - validates plugin.json, MCP tools, and security patterns",
5
5
  "author": {
6
6
  "name": "Avi Fenesh",
@@ -195,7 +195,9 @@ Generate a structured markdown report:
195
195
  ## Implementation
196
196
 
197
197
  ```javascript
198
- const { projectmemoryAnalyzer } = require('${CLAUDE_PLUGIN_ROOT}'.replace(/\\/g, '/') + '/lib/enhance');
198
+ const pluginPath = (process.env.CLAUDE_PLUGIN_ROOT || process.env.PLUGIN_ROOT || '').replace(/\/g, '/');
199
+ if (!pluginPath) { console.error('Error: CLAUDE_PLUGIN_ROOT or PLUGIN_ROOT not set'); process.exit(1); }
200
+ const { projectmemoryAnalyzer } = require(`${pluginPath}/lib/enhance`);
199
201
 
200
202
  // Find and analyze project memory
201
203
  const results = await projectmemoryAnalyzer.analyze(projectPath, {
@@ -181,7 +181,9 @@ Parse from $ARGUMENTS:
181
181
  ## Implementation
182
182
 
183
183
  ```javascript
184
- const { pluginAnalyzer } = require('${CLAUDE_PLUGIN_ROOT}'.replace(/\\/g, '/') + '/lib/enhance');
184
+ const pluginPath = (process.env.CLAUDE_PLUGIN_ROOT || process.env.PLUGIN_ROOT || '').replace(/\/g, '/');
185
+ if (!pluginPath) { console.error('Error: CLAUDE_PLUGIN_ROOT or PLUGIN_ROOT not set'); process.exit(1); }
186
+ const { pluginAnalyzer } = require(`${pluginPath}/lib/enhance`);
185
187
 
186
188
  // Parse arguments
187
189
  const args = '$ARGUMENTS'.split(' ').filter(Boolean);
@@ -319,7 +321,9 @@ Parse from $ARGUMENTS:
319
321
  ## Implementation
320
322
 
321
323
  ```javascript
322
- const { agentAnalyzer } = require('${CLAUDE_PLUGIN_ROOT}'.replace(/\\/g, '/') + '/lib/enhance');
324
+ const pluginPath = (process.env.CLAUDE_PLUGIN_ROOT || process.env.PLUGIN_ROOT || '').replace(/\/g, '/');
325
+ if (!pluginPath) { console.error('Error: CLAUDE_PLUGIN_ROOT or PLUGIN_ROOT not set'); process.exit(1); }
326
+ const { agentAnalyzer } = require(`${pluginPath}/lib/enhance`);
323
327
 
324
328
  // Parse arguments
325
329
  const args = '$ARGUMENTS'.split(' ').filter(Boolean);
@@ -500,7 +504,9 @@ For user-facing documentation:
500
504
  ## Implementation
501
505
 
502
506
  ```javascript
503
- const { docsAnalyzer } = require('${CLAUDE_PLUGIN_ROOT}'.replace(/\\/g, '/') + '/lib/enhance');
507
+ const pluginPath = (process.env.CLAUDE_PLUGIN_ROOT || process.env.PLUGIN_ROOT || '').replace(/\/g, '/');
508
+ if (!pluginPath) { console.error('Error: CLAUDE_PLUGIN_ROOT or PLUGIN_ROOT not set'); process.exit(1); }
509
+ const { docsAnalyzer } = require(`${pluginPath}/lib/enhance`);
504
510
 
505
511
  // Parse arguments
506
512
  const args = '$ARGUMENTS'.split(' ').filter(Boolean);
@@ -695,7 +701,9 @@ Note: Reference validation (file paths, npm commands) is always enabled.
695
701
  ## Implementation
696
702
 
697
703
  ```javascript
698
- const { projectmemoryAnalyzer } = require('${CLAUDE_PLUGIN_ROOT}'.replace(/\\/g, '/') + '/lib/enhance');
704
+ const pluginPath = (process.env.CLAUDE_PLUGIN_ROOT || process.env.PLUGIN_ROOT || '').replace(/\/g, '/');
705
+ if (!pluginPath) { console.error('Error: CLAUDE_PLUGIN_ROOT or PLUGIN_ROOT not set'); process.exit(1); }
706
+ const { projectmemoryAnalyzer } = require(`${pluginPath}/lib/enhance`);
699
707
 
700
708
  // Parse arguments
701
709
  const args = '$ARGUMENTS'.split(' ').filter(Boolean);
@@ -871,7 +879,9 @@ Parse from $ARGUMENTS:
871
879
  ## Implementation
872
880
 
873
881
  ```javascript
874
- const { promptAnalyzer } = require('${CLAUDE_PLUGIN_ROOT}'.replace(/\\/g, '/') + '/lib/enhance');
882
+ const pluginPath = (process.env.CLAUDE_PLUGIN_ROOT || process.env.PLUGIN_ROOT || '').replace(/\/g, '/');
883
+ if (!pluginPath) { console.error('Error: CLAUDE_PLUGIN_ROOT or PLUGIN_ROOT not set'); process.exit(1); }
884
+ const { promptAnalyzer } = require(`${pluginPath}/lib/enhance`);
875
885
 
876
886
  // Parse arguments
877
887
  const args = '$ARGUMENTS'.split(' ').filter(Boolean);
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "next-task",
3
- "version": "3.3.0",
3
+ "version": "3.3.3",
4
4
  "description": "Master workflow orchestrator with autonomous task-to-production automation, quality gates, and multi-agent review",
5
5
  "author": {
6
6
  "name": "Avi Fenesh",
@@ -42,7 +42,9 @@ const SUBSEQUENT_WAIT = 120000; // 2 min between checks
42
42
  const MAX_WAIT_TIME = 1800000; // 30 min max
43
43
  const MAX_FIX_ITERATIONS = 5;
44
44
 
45
- const workflowState = require('${CLAUDE_PLUGIN_ROOT}'.replace(/\\/g, '/') + '/lib/state/workflow-state.js');
45
+ const pluginPath = (process.env.CLAUDE_PLUGIN_ROOT || process.env.PLUGIN_ROOT || '').replace(/\\/g, '/');
46
+ if (!pluginPath) { console.error('Error: CLAUDE_PLUGIN_ROOT or PLUGIN_ROOT not set'); process.exit(1); }
47
+ const workflowState = require(`${pluginPath}/lib/state/workflow-state.js`);
46
48
  const PR_NUMBER = workflowState.readState().pr.number;
47
49
  ```
48
50
 
@@ -41,7 +41,9 @@ NO human in the loop - either pass validation or fail and return to implementati
41
41
  ## Phase 1: Get Task Context
42
42
 
43
43
  ```javascript
44
- const workflowState = require('${CLAUDE_PLUGIN_ROOT}'.replace(/\\/g, '/') + '/lib/state/workflow-state.js');
44
+ const pluginPath = (process.env.CLAUDE_PLUGIN_ROOT || process.env.PLUGIN_ROOT || '').replace(/\\/g, '/');
45
+ if (!pluginPath) { console.error('Error: CLAUDE_PLUGIN_ROOT or PLUGIN_ROOT not set'); process.exit(1); }
46
+ const workflowState = require(`${pluginPath}/lib/state/workflow-state.js`);
45
47
 
46
48
  const state = workflowState.readFlow();
47
49
  const task = state.task;
@@ -25,7 +25,9 @@ on documentation related to the files modified in the current workflow.
25
25
  ## Phase 1: Get Context
26
26
 
27
27
  ```javascript
28
- const workflowState = require('${CLAUDE_PLUGIN_ROOT}'.replace(/\\/g, '/') + '/lib/state/workflow-state.js');
28
+ const pluginPath = (process.env.CLAUDE_PLUGIN_ROOT || process.env.PLUGIN_ROOT || '').replace(/\\/g, '/');
29
+ if (!pluginPath) { console.error('Error: CLAUDE_PLUGIN_ROOT or PLUGIN_ROOT not set'); process.exit(1); }
30
+ const workflowState = require(`${pluginPath}/lib/state/workflow-state.js`);
29
31
 
30
32
  const state = workflowState.readState();
31
33
  const task = state.task;
@@ -13,7 +13,9 @@ This requires careful investigation and connecting disparate pieces of informati
13
13
  ## Phase 1: Load Task Context
14
14
 
15
15
  ```javascript
16
- const workflowState = require('${CLAUDE_PLUGIN_ROOT}'.replace(/\\/g, '/') + '/lib/state/workflow-state.js');
16
+ const pluginPath = (process.env.CLAUDE_PLUGIN_ROOT || process.env.PLUGIN_ROOT || '').replace(/\\/g, '/');
17
+ if (!pluginPath) { console.error('Error: CLAUDE_PLUGIN_ROOT or PLUGIN_ROOT not set'); process.exit(1); }
18
+ const workflowState = require(`${pluginPath}/lib/state/workflow-state.js`);
17
19
  const state = workflowState.readState();
18
20
 
19
21
  const task = state.task;
@@ -26,7 +28,9 @@ console.log(`Description: ${task.description}`);
26
28
  Use the cached repo-map for faster symbol discovery and dependency hints:
27
29
 
28
30
  ```javascript
29
- const repoMap = require('${CLAUDE_PLUGIN_ROOT}'.replace(/\\/g, '/') + '/lib/repo-map');
31
+ const pluginPath = (process.env.CLAUDE_PLUGIN_ROOT || process.env.PLUGIN_ROOT || '').replace(/\\/g, '/');
32
+ if (!pluginPath) { console.error('Error: CLAUDE_PLUGIN_ROOT or PLUGIN_ROOT not set'); process.exit(1); }
33
+ const repoMap = require(`${pluginPath}/lib/repo-map`);
30
34
  const map = repoMap.load(process.cwd());
31
35
 
32
36
  if (!map) {
@@ -44,7 +44,9 @@ Before implementation:
44
44
  ## Phase 1: Load Approved Plan
45
45
 
46
46
  ```javascript
47
- const workflowState = require('${CLAUDE_PLUGIN_ROOT}'.replace(/\\/g, '/') + '/lib/state/workflow-state.js');
47
+ const pluginPath = (process.env.CLAUDE_PLUGIN_ROOT || process.env.PLUGIN_ROOT || '').replace(/\/g, '/');
48
+ if (!pluginPath) { console.error('Error: CLAUDE_PLUGIN_ROOT or PLUGIN_ROOT not set'); process.exit(1); }
49
+ const workflowState = require(`${pluginPath}/lib/state/workflow-state.js`);
48
50
  const state = workflowState.readFlow();
49
51
 
50
52
  if (!state.plan?.approved) {
@@ -59,7 +61,9 @@ console.log(`Steps: ${plan.steps.length}`);
59
61
  ## Phase 1.5: Use Repo Map for Symbol Locations (If Available)
60
62
 
61
63
  ```javascript
62
- const repoMap = require('${CLAUDE_PLUGIN_ROOT}'.replace(/\\/g, '/') + '/lib/repo-map');
64
+ const pluginPath = (process.env.CLAUDE_PLUGIN_ROOT || process.env.PLUGIN_ROOT || '').replace(/\/g, '/');
65
+ if (!pluginPath) { console.error('Error: CLAUDE_PLUGIN_ROOT or PLUGIN_ROOT not set'); process.exit(1); }
66
+ const repoMap = require(`${pluginPath}/lib/repo-map`);
63
67
  const map = repoMap.load(process.cwd());
64
68
 
65
69
  if (map) {
@@ -34,7 +34,9 @@ Before planning, you should have:
34
34
  ## Phase 1: Load Context
35
35
 
36
36
  ```javascript
37
- const workflowState = require('${CLAUDE_PLUGIN_ROOT}'.replace(/\\/g, '/') + '/lib/state/workflow-state.js');
37
+ const pluginPath = (process.env.CLAUDE_PLUGIN_ROOT || process.env.PLUGIN_ROOT || '').replace(/\/g, '/');
38
+ if (!pluginPath) { console.error('Error: CLAUDE_PLUGIN_ROOT or PLUGIN_ROOT not set'); process.exit(1); }
39
+ const workflowState = require(`${pluginPath}/lib/state/workflow-state.js`);
38
40
  const state = workflowState.readFlow();
39
41
 
40
42
  const task = state.task;
@@ -49,7 +51,9 @@ console.log(`Key files identified: ${explorationResults?.keyFiles?.join(', ')}`)
49
51
  Use repo-map to identify dependencies and exports before writing the plan:
50
52
 
51
53
  ```javascript
52
- const repoMap = require('${CLAUDE_PLUGIN_ROOT}'.replace(/\\/g, '/') + '/lib/repo-map');
54
+ const pluginPath = (process.env.CLAUDE_PLUGIN_ROOT || process.env.PLUGIN_ROOT || '').replace(/\/g, '/');
55
+ if (!pluginPath) { console.error('Error: CLAUDE_PLUGIN_ROOT or PLUGIN_ROOT not set'); process.exit(1); }
56
+ const repoMap = require(`${pluginPath}/lib/repo-map`);
53
57
  const map = repoMap.load(process.cwd());
54
58
 
55
59
  if (!map) {
@@ -15,7 +15,9 @@ and present prioritized recommendations to the user.
15
15
  ## Phase 1: Load Policy from State
16
16
 
17
17
  ```javascript
18
- const workflowState = require('${CLAUDE_PLUGIN_ROOT}'.replace(/\\/g, '/') + '/lib/state/workflow-state.js');
18
+ const pluginPath = (process.env.CLAUDE_PLUGIN_ROOT || process.env.PLUGIN_ROOT || '').replace(/\/g, '/');
19
+ if (!pluginPath) { console.error('Error: CLAUDE_PLUGIN_ROOT or PLUGIN_ROOT not set'); process.exit(1); }
20
+ const workflowState = require(`${pluginPath}/lib/state/workflow-state.js`);
19
21
  const state = workflowState.readState();
20
22
  const policy = state.policy;
21
23
 
@@ -63,7 +65,9 @@ The source configuration comes from policy. It can be:
63
65
  ### Parse Source Configuration
64
66
 
65
67
  ```javascript
66
- const { sources } = require('${CLAUDE_PLUGIN_ROOT}'.replace(/\\/g, '/') + '/lib');
68
+ const pluginPath = (process.env.CLAUDE_PLUGIN_ROOT || process.env.PLUGIN_ROOT || '').replace(/\/g, '/');
69
+ if (!pluginPath) { console.error('Error: CLAUDE_PLUGIN_ROOT or PLUGIN_ROOT not set'); process.exit(1); }
70
+ const { sources } = require(`${pluginPath}/lib`);
67
71
 
68
72
  // Source can be string or object
69
73
  const sourceConfig = typeof policy.taskSource === 'string'
@@ -271,7 +271,9 @@ createWorktreeStatus(state.task, state.workflow, BRANCH_NAME, MAIN_REPO_PATH);
271
271
  Update the workflow state with git information:
272
272
 
273
273
  ```javascript
274
- const workflowState = require('${CLAUDE_PLUGIN_ROOT}'.replace(/\\/g, '/') + '/lib/state/workflow-state.js');
274
+ const pluginPath = (process.env.CLAUDE_PLUGIN_ROOT || process.env.PLUGIN_ROOT || '').replace(/\/g, '/');
275
+ if (!pluginPath) { console.error('Error: CLAUDE_PLUGIN_ROOT or PLUGIN_ROOT not set'); process.exit(1); }
276
+ const workflowState = require(`${pluginPath}/lib/state/workflow-state.js`);
275
277
 
276
278
  workflowState.updateState({
277
279
  git: {
@@ -27,7 +27,9 @@ const taskId = taskIdArg ? args[args.indexOf(taskIdArg) + 1] : null;
27
27
  ## Phase 1: Get Context
28
28
 
29
29
  ```javascript
30
- const workflowState = require('${CLAUDE_PLUGIN_ROOT}'.replace(/\\/g, '/') + '/lib/state/workflow-state.js');
30
+ const pluginPath = (process.env.CLAUDE_PLUGIN_ROOT || process.env.PLUGIN_ROOT || '').replace(/\/g, '/');
31
+ if (!pluginPath) { console.error('Error: CLAUDE_PLUGIN_ROOT or PLUGIN_ROOT not set'); process.exit(1); }
32
+ const workflowState = require(`${pluginPath}/lib/state/workflow-state.js`);
31
33
 
32
34
  let task;
33
35
  let changedFiles;
@@ -311,7 +311,9 @@ Parse from $ARGUMENTS:
311
311
  ## Pre-flight: Handle Arguments
312
312
 
313
313
  ```javascript
314
- const workflowState = require('${CLAUDE_PLUGIN_ROOT}'.replace(/\\/g, '/') + '/lib/state/workflow-state.js');
314
+ const pluginPath = (process.env.CLAUDE_PLUGIN_ROOT || process.env.PLUGIN_ROOT || '').replace(/\/g, '/');
315
+ if (!pluginPath) { console.error('Error: CLAUDE_PLUGIN_ROOT or PLUGIN_ROOT not set'); process.exit(1); }
316
+ const workflowState = require(`${pluginPath}/lib/state/workflow-state.js`);
315
317
  const args = '$ARGUMENTS'.split(' ').filter(Boolean);
316
318
 
317
319
  // ⛔ CRITICAL CHECK: If no flags provided, DO NOT check for existing tasks here
@@ -425,7 +427,9 @@ function mapStepToPhase(step) {
425
427
  No agent needed - call `sources.getPolicyQuestions()` and use AskUserQuestion.
426
428
 
427
429
  ```javascript
428
- const { sources } = require('${CLAUDE_PLUGIN_ROOT}'.replace(/\\/g, '/') + '/lib');
430
+ const pluginPath = (process.env.CLAUDE_PLUGIN_ROOT || process.env.PLUGIN_ROOT || '').replace(/\/g, '/');
431
+ if (!pluginPath) { console.error('Error: CLAUDE_PLUGIN_ROOT or PLUGIN_ROOT not set'); process.exit(1); }
432
+ const { sources } = require(`${pluginPath}/lib`);
429
433
 
430
434
  // Get questions with cache-aware options (cached preference shown first if exists)
431
435
  const { questions, cachedPreference } = sources.getPolicyQuestions();
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "repo-map",
3
- "version": "3.3.0",
3
+ "version": "3.3.3",
4
4
  "description": "AST-based repository map generator using ast-grep for symbol and import extraction with incremental updates",
5
5
  "author": {
6
6
  "name": "Avi Fenesh",
@@ -29,7 +29,8 @@ Examples:
29
29
  ### 1) Load Repo Map Module
30
30
 
31
31
  ```javascript
32
- const pluginPath = '${CLAUDE_PLUGIN_ROOT}'.replace(/\\/g, '/');
32
+ const pluginPath = (process.env.CLAUDE_PLUGIN_ROOT || process.env.PLUGIN_ROOT || '').replace(/\\/g, '/');
33
+ if (!pluginPath) { console.error('Error: CLAUDE_PLUGIN_ROOT or PLUGIN_ROOT not set'); process.exit(1); }
33
34
  const repoMap = require(`${pluginPath}/lib/repo-map`);
34
35
  ```
35
36
 
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "ship",
3
- "version": "3.3.0",
3
+ "version": "3.3.3",
4
4
  "description": "Complete PR workflow from commit to production with validation",
5
5
  "author": {
6
6
  "name": "Avi Fenesh",
@@ -46,7 +46,12 @@ Parse from $ARGUMENTS:
46
46
  ```javascript
47
47
  const args = '$ARGUMENTS'.split(' ');
48
48
  const stateIdx = args.indexOf('--state-file');
49
- const workflowState = stateIdx >= 0 ? require('${CLAUDE_PLUGIN_ROOT}'.replace(/\\/g, '/') + '/lib/state/workflow-state.js') : null;
49
+ let workflowState = null;
50
+ if (stateIdx >= 0) {
51
+ const pluginPath = (process.env.CLAUDE_PLUGIN_ROOT || process.env.PLUGIN_ROOT || '').replace(/\\/g, '/');
52
+ if (!pluginPath) { console.error('Error: CLAUDE_PLUGIN_ROOT or PLUGIN_ROOT not set'); process.exit(1); }
53
+ workflowState = require(`${pluginPath}/lib/state/workflow-state.js`);
54
+ }
50
55
 
51
56
  function updatePhase(phase, result) {
52
57
  if (!workflowState) return;
@@ -59,8 +64,10 @@ function updatePhase(phase, result) {
59
64
 
60
65
  ```bash
61
66
  # Detect platform and project configuration
62
- PLATFORM=$(node ${CLAUDE_PLUGIN_ROOT}/lib/platform/detect-platform.js)
63
- TOOLS=$(node ${CLAUDE_PLUGIN_ROOT}/lib/platform/verify-tools.js)
67
+ PLUGIN_PATH="${CLAUDE_PLUGIN_ROOT:-$PLUGIN_ROOT}"
68
+ if [ -z "$PLUGIN_PATH" ]; then echo "Error: CLAUDE_PLUGIN_ROOT or PLUGIN_ROOT not set"; exit 1; fi
69
+ PLATFORM=$(node "$PLUGIN_PATH/lib/platform/detect-platform.js")
70
+ TOOLS=$(node "$PLUGIN_PATH/lib/platform/verify-tools.js")
64
71
 
65
72
  # Extract critical info
66
73
  CI_PLATFORM=$(echo $PLATFORM | jq -r '.ci')
@@ -287,7 +294,7 @@ git checkout $MAIN_BRANCH
287
294
  git pull origin $MAIN_BRANCH
288
295
 
289
296
  # Update repo-map if it exists (non-blocking)
290
- node -e "const pluginPath = '${CLAUDE_PLUGIN_ROOT}'.replace(/\\\\/g, '/'); const repoMap = require(`${pluginPath}/lib/repo-map`); if (repoMap.exists(process.cwd())) { repoMap.update(process.cwd(), {}).then(() => console.log('✓ Repo-map updated')).catch((e) => console.log('⚠️ Repo-map update failed: ' + e.message)); } else { console.log('Repo-map not found, skipping'); }" || true
297
+ node -e "const pluginPath = (process.env.CLAUDE_PLUGIN_ROOT || process.env.PLUGIN_ROOT || '').replace(/\\\\/g, '/'); const repoMap = require(\`\${pluginPath}/lib/repo-map\`); if (repoMap.exists(process.cwd())) { repoMap.update(process.cwd(), {}).then(() => console.log('✓ Repo-map updated')).catch((e) => console.log('⚠️ Repo-map update failed: ' + e.message)); } else { console.log('Repo-map not found, skipping'); }" || true
291
298
  MERGE_SHA=$(git rev-parse HEAD)
292
299
  echo "✓ Merged PR #$PR_NUMBER at $MERGE_SHA"
293
300
  ```
@@ -391,6 +398,16 @@ ${WORKFLOW === 'dev-prod' ?
391
398
  ✓ Successfully shipped!
392
399
  ```
393
400
 
401
+ ### Workflow Hook Response
402
+
403
+ After displaying the completion report, output JSON for the SubagentStop hook:
404
+
405
+ ```json
406
+ {"ok": true, "nextPhase": "completed", "status": "shipped"}
407
+ ```
408
+
409
+ This allows the `/next-task` workflow to detect that `/ship` completed successfully.
410
+
394
411
  ## Error Handling
395
412
 
396
413
  See `ship-error-handling.md` for detailed error handling:
@@ -1,6 +1,20 @@
1
1
  {
2
2
  "name": "sync-docs",
3
- "version": "3.3.0",
3
+ "version": "3.3.3",
4
4
  "description": "Sync documentation with code changes. Find outdated refs, update CHANGELOG, flag stale examples.",
5
- "commands": ["commands/sync-docs.md"]
5
+ "author": {
6
+ "name": "Avi Fenesh",
7
+ "email": "[email protected]",
8
+ "url": "https://github.com/avifenesh"
9
+ },
10
+ "homepage": "https://github.com/avifenesh/awesome-slash#sync-docs",
11
+ "repository": "https://github.com/avifenesh/awesome-slash",
12
+ "license": "MIT",
13
+ "keywords": [
14
+ "documentation",
15
+ "changelog",
16
+ "sync",
17
+ "maintenance",
18
+ "code-docs"
19
+ ]
6
20
  }