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.
- package/.claude-plugin/marketplace.json +9 -9
- package/.claude-plugin/plugin.json +1 -1
- package/CHANGELOG.md +17 -0
- package/mcp-server/index.js +1 -1
- package/package.json +1 -1
- package/plugins/audit-project/.claude-plugin/plugin.json +1 -1
- package/plugins/audit-project/commands/audit-project-agents.md +3 -1
- package/plugins/audit-project/commands/audit-project.md +4 -2
- package/plugins/deslop/.claude-plugin/plugin.json +1 -1
- package/plugins/deslop/commands/deslop.md +9 -3
- package/plugins/drift-detect/.claude-plugin/plugin.json +1 -1
- package/plugins/drift-detect/commands/drift-detect.md +6 -2
- package/plugins/enhance/.claude-plugin/plugin.json +1 -1
- package/plugins/enhance/agents/claudemd-enhancer.md +3 -1
- package/plugins/enhance/commands/enhance.md +15 -5
- package/plugins/next-task/.claude-plugin/plugin.json +1 -1
- package/plugins/next-task/agents/ci-monitor.md +3 -1
- package/plugins/next-task/agents/delivery-validator.md +3 -1
- package/plugins/next-task/agents/docs-updater.md +3 -1
- package/plugins/next-task/agents/exploration-agent.md +6 -2
- package/plugins/next-task/agents/implementation-agent.md +6 -2
- package/plugins/next-task/agents/planning-agent.md +6 -2
- package/plugins/next-task/agents/task-discoverer.md +6 -2
- package/plugins/next-task/agents/worktree-manager.md +3 -1
- package/plugins/next-task/commands/delivery-approval.md +3 -1
- package/plugins/next-task/commands/next-task.md +6 -2
- package/plugins/repo-map/.claude-plugin/plugin.json +1 -1
- package/plugins/repo-map/commands/repo-map.md +2 -1
- package/plugins/ship/.claude-plugin/plugin.json +1 -1
- package/plugins/ship/commands/ship.md +21 -4
- 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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
65
|
+
"version": "3.3.3",
|
|
66
66
|
"category": "development"
|
|
67
67
|
}
|
|
68
68
|
],
|
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
|
package/mcp-server/index.js
CHANGED
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "awesome-slash",
|
|
3
|
-
"version": "3.3.
|
|
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",
|
|
@@ -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
|
|
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
|
-
|
|
42
|
-
|
|
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')
|
|
@@ -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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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.
|
|
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 =
|
|
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**: ${
|
|
123
|
+
${collectedData.code?.summary?.totalDirs ? `- **Code**: ${collectedData.code.summary.totalDirs} directories scanned` : '- **Code**: Skipped'}
|
|
120
124
|
|
|
121
125
|
→ Sending to semantic analyzer...
|
|
122
126
|
`);
|
|
@@ -195,7 +195,9 @@ Generate a structured markdown report:
|
|
|
195
195
|
## Implementation
|
|
196
196
|
|
|
197
197
|
```javascript
|
|
198
|
-
const
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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);
|
|
@@ -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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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();
|
|
@@ -29,7 +29,8 @@ Examples:
|
|
|
29
29
|
### 1) Load Repo Map Module
|
|
30
30
|
|
|
31
31
|
```javascript
|
|
32
|
-
const pluginPath =
|
|
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
|
|
|
@@ -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
|
-
|
|
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
|
-
|
|
63
|
-
|
|
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 =
|
|
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.
|
|
3
|
+
"version": "3.3.3",
|
|
4
4
|
"description": "Sync documentation with code changes. Find outdated refs, update CHANGELOG, flag stale examples.",
|
|
5
|
-
"
|
|
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
|
}
|