Initial commit
This commit is contained in:
433
commands/_shared-next-actions.md
Normal file
433
commands/_shared-next-actions.md
Normal file
@@ -0,0 +1,433 @@
|
||||
# Shared Smart Next-Action Suggestions
|
||||
|
||||
This file provides smart next-action suggestion logic used by the new natural workflow commands.
|
||||
|
||||
## Purpose
|
||||
|
||||
Automatically suggest the most appropriate next action based on:
|
||||
- Current workflow stage
|
||||
- Task status and progress
|
||||
- Time since last action
|
||||
- Blockers or dependencies
|
||||
|
||||
## Next Action Functions
|
||||
|
||||
### 1. Determine Next Action After Planning
|
||||
|
||||
```javascript
|
||||
async function suggestAfterPlan(issueId) {
|
||||
const issue = await linear_get_issue(issueId)
|
||||
const status = issue.status
|
||||
const progress = calculateProgress(issue.description)
|
||||
|
||||
// Just created/planned - ready to start
|
||||
return {
|
||||
primary: {
|
||||
action: 'work',
|
||||
command: `/ccpm:work ${issueId}`,
|
||||
label: 'Start Implementation',
|
||||
description: 'Begin working on this task',
|
||||
icon: '🚀'
|
||||
},
|
||||
alternatives: [
|
||||
{
|
||||
action: 'insights',
|
||||
command: `/ccpm:utils:insights ${issueId}`,
|
||||
label: 'Get AI Insights',
|
||||
description: 'Analyze complexity and risks'
|
||||
},
|
||||
{
|
||||
action: 'status',
|
||||
command: `/ccpm:utils:status ${issueId}`,
|
||||
label: 'Review Status',
|
||||
description: 'Check planning details'
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
### 2. Determine Next Action After Work
|
||||
|
||||
```javascript
|
||||
async function suggestAfterWork(issueId) {
|
||||
const issue = await linear_get_issue(issueId)
|
||||
const progress = calculateProgress(issue.description)
|
||||
const uncommitted = detectUncommittedChanges()
|
||||
|
||||
// Has uncommitted changes - should commit or sync
|
||||
if (uncommitted.hasChanges) {
|
||||
return {
|
||||
primary: {
|
||||
action: 'commit',
|
||||
command: `/ccpm:commit ${issueId}`,
|
||||
label: 'Commit Changes',
|
||||
description: `Commit ${uncommitted.summary}`,
|
||||
icon: '💾'
|
||||
},
|
||||
alternatives: [
|
||||
{
|
||||
action: 'sync',
|
||||
command: `/ccpm:sync ${issueId}`,
|
||||
label: 'Sync Progress',
|
||||
description: 'Save progress to Linear without committing'
|
||||
},
|
||||
{
|
||||
action: 'work',
|
||||
command: `/ccpm:work ${issueId}`,
|
||||
label: 'Continue Working',
|
||||
description: 'Keep working on subtasks'
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
|
||||
// No uncommitted changes, check if complete
|
||||
if (progress.isComplete) {
|
||||
return {
|
||||
primary: {
|
||||
action: 'verify',
|
||||
command: `/ccpm:verify ${issueId}`,
|
||||
label: 'Run Verification',
|
||||
description: 'All tasks complete, run quality checks',
|
||||
icon: '✅'
|
||||
},
|
||||
alternatives: [
|
||||
{
|
||||
action: 'work',
|
||||
command: `/ccpm:work ${issueId}`,
|
||||
label: 'Continue Working',
|
||||
description: 'Make more changes'
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
|
||||
// In progress, not complete - continue working
|
||||
return {
|
||||
primary: {
|
||||
action: 'work',
|
||||
command: `/ccpm:work ${issueId}`,
|
||||
label: 'Continue Working',
|
||||
description: `${progress.remaining} tasks remaining`,
|
||||
icon: '⚡'
|
||||
},
|
||||
alternatives: [
|
||||
{
|
||||
action: 'sync',
|
||||
command: `/ccpm:sync ${issueId}`,
|
||||
label: 'Sync Progress',
|
||||
description: 'Save current progress'
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
### 3. Determine Next Action After Sync
|
||||
|
||||
```javascript
|
||||
async function suggestAfterSync(issueId) {
|
||||
const issue = await linear_get_issue(issueId)
|
||||
const progress = calculateProgress(issue.description)
|
||||
const uncommitted = detectUncommittedChanges()
|
||||
|
||||
// Has uncommitted changes - should commit
|
||||
if (uncommitted.hasChanges) {
|
||||
return {
|
||||
primary: {
|
||||
action: 'commit',
|
||||
command: `/ccpm:commit ${issueId}`,
|
||||
label: 'Commit Changes',
|
||||
description: 'Commit your work to git',
|
||||
icon: '💾'
|
||||
},
|
||||
alternatives: [
|
||||
{
|
||||
action: 'work',
|
||||
command: `/ccpm:work ${issueId}`,
|
||||
label: 'Continue Working',
|
||||
description: 'Keep making changes'
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
|
||||
// All committed, check if complete
|
||||
if (progress.isComplete) {
|
||||
return {
|
||||
primary: {
|
||||
action: 'verify',
|
||||
command: `/ccpm:verify ${issueId}`,
|
||||
label: 'Run Verification',
|
||||
description: 'All tasks complete, verify quality',
|
||||
icon: '✅'
|
||||
},
|
||||
alternatives: []
|
||||
}
|
||||
}
|
||||
|
||||
// Not complete - continue working
|
||||
return {
|
||||
primary: {
|
||||
action: 'work',
|
||||
command: `/ccpm:work ${issueId}`,
|
||||
label: 'Continue Working',
|
||||
description: `${progress.remaining} tasks remaining`,
|
||||
icon: '⚡'
|
||||
},
|
||||
alternatives: []
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
### 4. Determine Next Action After Commit
|
||||
|
||||
```javascript
|
||||
async function suggestAfterCommit(issueId) {
|
||||
const issue = await linear_get_issue(issueId)
|
||||
const progress = calculateProgress(issue.description)
|
||||
const pushed = isBranchPushed()
|
||||
|
||||
// Not pushed - should sync and maybe push
|
||||
if (!pushed.isPushed) {
|
||||
return {
|
||||
primary: {
|
||||
action: 'sync',
|
||||
command: `/ccpm:sync ${issueId}`,
|
||||
label: 'Sync to Linear',
|
||||
description: 'Update Linear with progress',
|
||||
icon: '🔄'
|
||||
},
|
||||
alternatives: [
|
||||
{
|
||||
action: 'push',
|
||||
command: `git push -u origin ${pushed.branch}`,
|
||||
label: 'Push to Remote',
|
||||
description: 'Push commits to GitHub'
|
||||
},
|
||||
{
|
||||
action: 'work',
|
||||
command: `/ccpm:work ${issueId}`,
|
||||
label: 'Continue Working',
|
||||
description: 'Keep making changes'
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
|
||||
// Pushed, check if complete
|
||||
if (progress.isComplete) {
|
||||
return {
|
||||
primary: {
|
||||
action: 'verify',
|
||||
command: `/ccpm:verify ${issueId}`,
|
||||
label: 'Run Verification',
|
||||
description: 'All done, verify quality',
|
||||
icon: '✅'
|
||||
},
|
||||
alternatives: []
|
||||
}
|
||||
}
|
||||
|
||||
// Not complete - work or sync
|
||||
return {
|
||||
primary: {
|
||||
action: 'work',
|
||||
command: `/ccpm:work ${issueId}`,
|
||||
label: 'Continue Working',
|
||||
description: `${progress.remaining} tasks remaining`,
|
||||
icon: '⚡'
|
||||
},
|
||||
alternatives: [
|
||||
{
|
||||
action: 'sync',
|
||||
command: `/ccpm:sync ${issueId}`,
|
||||
label: 'Sync Progress',
|
||||
description: 'Update Linear'
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
### 5. Determine Next Action After Verify
|
||||
|
||||
```javascript
|
||||
async function suggestAfterVerify(issueId, verificationPassed) {
|
||||
if (!verificationPassed) {
|
||||
// Verification failed - fix issues
|
||||
return {
|
||||
primary: {
|
||||
action: 'fix',
|
||||
command: `/ccpm:verification:fix ${issueId}`,
|
||||
label: 'Fix Issues',
|
||||
description: 'Debug and fix verification failures',
|
||||
icon: '🔧'
|
||||
},
|
||||
alternatives: [
|
||||
{
|
||||
action: 'work',
|
||||
command: `/ccpm:work ${issueId}`,
|
||||
label: 'Make Changes',
|
||||
description: 'Continue implementation'
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
|
||||
// Verification passed - ready to finalize
|
||||
return {
|
||||
primary: {
|
||||
action: 'done',
|
||||
command: `/ccpm:done ${issueId}`,
|
||||
label: 'Finalize Task',
|
||||
description: 'Create PR and mark complete',
|
||||
icon: '🎉'
|
||||
},
|
||||
alternatives: [
|
||||
{
|
||||
action: 'work',
|
||||
command: `/ccpm:work ${issueId}`,
|
||||
label: 'Make More Changes',
|
||||
description: 'Continue working'
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
## Display Template
|
||||
|
||||
### Standard Next Action Prompt
|
||||
|
||||
```markdown
|
||||
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
||||
💡 What's Next?
|
||||
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
||||
|
||||
⭐ Recommended: ${primary.label}
|
||||
${primary.description}
|
||||
|
||||
${primary.command}
|
||||
|
||||
${alternatives.length > 0 ? `
|
||||
Or:
|
||||
${alternatives.map((alt, i) => `
|
||||
${i+1}. ${alt.label}
|
||||
${alt.description}
|
||||
${alt.command}
|
||||
`).join('\n')}
|
||||
` : ''}
|
||||
|
||||
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
||||
```
|
||||
|
||||
### Interactive Prompt with AskUserQuestion
|
||||
|
||||
```javascript
|
||||
function createNextActionQuestion(suggestions) {
|
||||
const options = [
|
||||
{
|
||||
label: suggestions.primary.label,
|
||||
description: suggestions.primary.description
|
||||
}
|
||||
]
|
||||
|
||||
suggestions.alternatives.forEach(alt => {
|
||||
options.push({
|
||||
label: alt.label,
|
||||
description: alt.description
|
||||
})
|
||||
})
|
||||
|
||||
return {
|
||||
questions: [{
|
||||
question: "What would you like to do next?",
|
||||
header: "Next Step",
|
||||
multiSelect: false,
|
||||
options
|
||||
}]
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
## Context-Aware Suggestions
|
||||
|
||||
### Time-Based Suggestions
|
||||
|
||||
```javascript
|
||||
function adjustForTime(suggestions, hoursSinceLastAction) {
|
||||
// If been >4 hours, suggest sync first
|
||||
if (hoursSinceLastAction > 4) {
|
||||
return {
|
||||
primary: {
|
||||
action: 'sync',
|
||||
command: `/ccpm:sync ${issueId}`,
|
||||
label: 'Sync Progress',
|
||||
description: 'It\'s been a while, sync your progress first',
|
||||
icon: '🔄'
|
||||
},
|
||||
alternatives: [suggestions.primary, ...suggestions.alternatives]
|
||||
}
|
||||
}
|
||||
|
||||
return suggestions
|
||||
}
|
||||
```
|
||||
|
||||
### Status-Based Suggestions
|
||||
|
||||
```javascript
|
||||
function adjustForStatus(suggestions, status) {
|
||||
// If status is "Blocked", prioritize fixing
|
||||
if (status === 'Blocked') {
|
||||
return {
|
||||
primary: {
|
||||
action: 'fix',
|
||||
command: `/ccpm:verification:fix ${issueId}`,
|
||||
label: 'Fix Blockers',
|
||||
description: 'Task is blocked, resolve issues first',
|
||||
icon: '🔧'
|
||||
},
|
||||
alternatives: [suggestions.primary, ...suggestions.alternatives]
|
||||
}
|
||||
}
|
||||
|
||||
return suggestions
|
||||
}
|
||||
```
|
||||
|
||||
## Usage in Commands
|
||||
|
||||
Each command should call the appropriate suggestion function at the end:
|
||||
|
||||
```javascript
|
||||
// In /ccpm:plan
|
||||
const suggestions = await suggestAfterPlan(issueId)
|
||||
displayNextActions(suggestions)
|
||||
|
||||
// In /ccpm:work
|
||||
const suggestions = await suggestAfterWork(issueId)
|
||||
displayNextActions(suggestions)
|
||||
|
||||
// In /ccpm:sync
|
||||
const suggestions = await suggestAfterSync(issueId)
|
||||
displayNextActions(suggestions)
|
||||
|
||||
// In /ccpm:commit
|
||||
const suggestions = await suggestAfterCommit(issueId)
|
||||
displayNextActions(suggestions)
|
||||
|
||||
// In /ccpm:verify
|
||||
const suggestions = await suggestAfterVerify(issueId, verificationPassed)
|
||||
displayNextActions(suggestions)
|
||||
```
|
||||
|
||||
## Benefits
|
||||
|
||||
✅ **Context-Aware**: Different suggestions based on workflow stage
|
||||
✅ **Time-Sensitive**: Adjusts based on time since last action
|
||||
✅ **Status-Aware**: Considers blockers and task status
|
||||
✅ **Progressive**: Guides users through complete workflow
|
||||
✅ **Flexible**: Users can choose alternatives if primary doesn't fit
|
||||
Reference in New Issue
Block a user