agileflow 2.31.0 → 2.32.1
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/package.json +1 -1
- package/src/core/commands/babysit.md +35 -1097
- package/src/core/commands/help.md +1 -67
- package/tools/cli/installers/ide/_base-ide.js +14 -0
- package/tools/cli/installers/ide/claude-code.js +4 -1
- package/tools/cli/installers/ide/cursor.js +4 -1
- package/tools/cli/installers/ide/windsurf.js +4 -1
- package/tools/cli/lib/content-injector.js +139 -0
- package/tools/cli/lib/docs-setup.js +1 -1
- package/tools/cli/lib/ui.js +8 -8
|
@@ -19,72 +19,6 @@ Print a concise, one-screen overview:
|
|
|
19
19
|
- WIP limit: max 2 stories/agent
|
|
20
20
|
- List ALL available commands with one-line examples
|
|
21
21
|
|
|
22
|
-
<!--
|
|
23
|
-
<!-- Auto-generated on 2025-12-12. Do not edit manually. -->
|
|
24
|
-
|
|
25
|
-
**Collaboration:**
|
|
26
|
-
- `/AgileFlow:feedback` - Collect and process agent feedback
|
|
27
|
-
- `/AgileFlow:handoff` - Document work handoff between agents
|
|
28
|
-
- `/AgileFlow:retro` - Generate retrospective with Start/Stop/Continue format
|
|
29
|
-
- `/AgileFlow:update` - Generate stakeholder progress report
|
|
30
|
-
|
|
31
|
-
**Deployment & Operations:**
|
|
32
|
-
- `/AgileFlow:deploy` - Set up automated deployment pipeline
|
|
33
|
-
- `/AgileFlow:packages` - Manage dependencies with updates and security audits
|
|
34
|
-
|
|
35
|
-
**Development:**
|
|
36
|
-
- `/AgileFlow:babysit` - Interactive mentor for end-to-end feature implementation
|
|
37
|
-
- `/AgileFlow:baseline` - Mark current state as verified baseline
|
|
38
|
-
- `/AgileFlow:resume` - Resume work with verification and context loading
|
|
39
|
-
- `/AgileFlow:session-init` - Initialize session harness with test verification
|
|
40
|
-
- `/AgileFlow:verify` - Run project tests and update story test status
|
|
41
|
-
|
|
42
|
-
**Documentation:**
|
|
43
|
-
- `/AgileFlow:adr` - Create an Architecture Decision Record
|
|
44
|
-
- `/AgileFlow:docs` - Synchronize documentation with code changes
|
|
45
|
-
- `/AgileFlow:readme-sync` - Synchronize a folder's README.md with its current contents
|
|
46
|
-
|
|
47
|
-
**Maintenance:**
|
|
48
|
-
- `/AgileFlow:compress` - Compress status.json by removing verbose fields and keeping only tracking metadata
|
|
49
|
-
- `/AgileFlow:debt` - Track and prioritize technical debt items
|
|
50
|
-
- `/AgileFlow:template` - Create and manage custom document templates
|
|
51
|
-
|
|
52
|
-
**Other:**
|
|
53
|
-
- `/AgileFlow:blockers` - Track and resolve blockers with actionable suggestions
|
|
54
|
-
- `/AgileFlow:changelog` - Auto-generate changelog from commit history
|
|
55
|
-
- `/AgileFlow:context` - Generate context export for web AI tools
|
|
56
|
-
- `/AgileFlow:impact` - Analyze change impact across codebase
|
|
57
|
-
- `/AgileFlow:pr` - Generate pull request description from story
|
|
58
|
-
|
|
59
|
-
**Planning & Metrics:**
|
|
60
|
-
- `/AgileFlow:board` - Display visual kanban board with WIP limits
|
|
61
|
-
- `/AgileFlow:deps` - Visualize dependency graph with critical path detection
|
|
62
|
-
- `/AgileFlow:metrics` - Analytics dashboard with cycle time and throughput
|
|
63
|
-
- `/AgileFlow:sprint` - Data-driven sprint planning with velocity forecasting
|
|
64
|
-
|
|
65
|
-
**Quality & Testing:**
|
|
66
|
-
- `/AgileFlow:ci` - Bootstrap CI/CD workflow with testing and quality checks
|
|
67
|
-
- `/AgileFlow:review` - AI-powered code review with quality suggestions
|
|
68
|
-
- `/AgileFlow:tests` - Set up automated testing infrastructure
|
|
69
|
-
- `/AgileFlow:velocity` - Track velocity and forecast sprint capacity
|
|
70
|
-
|
|
71
|
-
**Research & Strategy:**
|
|
72
|
-
- `/AgileFlow:research` - Initialize research note with structured template
|
|
73
|
-
|
|
74
|
-
**Story Management:**
|
|
75
|
-
- `/AgileFlow:assign` - Assign or reassign a story to an owner
|
|
76
|
-
- `/AgileFlow:epic` - Create a new epic with stories
|
|
77
|
-
- `/AgileFlow:status` - Update story status and progress
|
|
78
|
-
- `/AgileFlow:story` - Create a user story with acceptance criteria
|
|
79
|
-
- `/AgileFlow:story-validate` - Validate story completeness before development
|
|
80
|
-
|
|
81
|
-
**System:**
|
|
82
|
-
- `/AgileFlow:agent` - Onboard a new agent with profile and contract
|
|
83
|
-
- `/AgileFlow:auto` - Auto-generate stories from PRDs, mockups, or specs
|
|
84
|
-
- `/AgileFlow:diagnose` - System health diagnostics
|
|
85
|
-
- `/AgileFlow:help` - Display AgileFlow system overview and commands
|
|
86
|
-
- `/AgileFlow:setup` - Bootstrap entire AgileFlow system in current project
|
|
87
|
-
|
|
88
|
-
<!-- AUTOGEN:COMMAND_LIST:END -->
|
|
22
|
+
<!-- {{COMMAND_LIST}} -->
|
|
89
23
|
|
|
90
24
|
OUTPUT: plain markdown only (no file writes)
|
|
@@ -59,6 +59,20 @@ class BaseIdeSetup {
|
|
|
59
59
|
.replace(/\bdocs\b(?!\.)/g, this.docsFolder); // Replace standalone "docs" word
|
|
60
60
|
}
|
|
61
61
|
|
|
62
|
+
/**
|
|
63
|
+
* Inject dynamic content into template (agent lists, command lists)
|
|
64
|
+
* @param {string} content - Template file content
|
|
65
|
+
* @param {string} agileflowDir - AgileFlow installation directory
|
|
66
|
+
* @returns {string} Content with placeholders replaced
|
|
67
|
+
*/
|
|
68
|
+
injectDynamicContent(content, agileflowDir) {
|
|
69
|
+
const { injectContent } = require('../lib/content-injector');
|
|
70
|
+
const agentsDir = path.join(agileflowDir, 'src', 'core', 'agents');
|
|
71
|
+
const commandsDir = path.join(agileflowDir, 'src', 'core', 'commands');
|
|
72
|
+
|
|
73
|
+
return injectContent(content, agentsDir, commandsDir);
|
|
74
|
+
}
|
|
75
|
+
|
|
62
76
|
/**
|
|
63
77
|
* Main setup method - must be implemented by subclasses
|
|
64
78
|
* @param {string} projectDir - Project directory
|
|
@@ -26,7 +26,7 @@ class ClaudeCodeSetup extends BaseIdeSetup {
|
|
|
26
26
|
* @param {Object} options - Setup options
|
|
27
27
|
*/
|
|
28
28
|
async setup(projectDir, agileflowDir, options = {}) {
|
|
29
|
-
console.log(chalk.
|
|
29
|
+
console.log(chalk.hex('#C15F3C')(` Setting up ${this.displayName}...`));
|
|
30
30
|
|
|
31
31
|
// Clean up old installation first
|
|
32
32
|
await this.cleanup(projectDir);
|
|
@@ -49,6 +49,9 @@ class ClaudeCodeSetup extends BaseIdeSetup {
|
|
|
49
49
|
// Read the original command content
|
|
50
50
|
let content = await this.readFile(command.path);
|
|
51
51
|
|
|
52
|
+
// Inject dynamic content (agent lists, command lists)
|
|
53
|
+
content = this.injectDynamicContent(content, agileflowDir);
|
|
54
|
+
|
|
52
55
|
// Replace docs/ references with custom folder name
|
|
53
56
|
content = this.replaceDocsReferences(content);
|
|
54
57
|
|
|
@@ -27,7 +27,7 @@ class CursorSetup extends BaseIdeSetup {
|
|
|
27
27
|
* @param {Object} options - Setup options
|
|
28
28
|
*/
|
|
29
29
|
async setup(projectDir, agileflowDir, options = {}) {
|
|
30
|
-
console.log(chalk.
|
|
30
|
+
console.log(chalk.hex('#C15F3C')(` Setting up ${this.displayName}...`));
|
|
31
31
|
|
|
32
32
|
// Clean up old installation first
|
|
33
33
|
await this.cleanup(projectDir);
|
|
@@ -50,6 +50,9 @@ class CursorSetup extends BaseIdeSetup {
|
|
|
50
50
|
// Read the original command content
|
|
51
51
|
let content = await this.readFile(command.path);
|
|
52
52
|
|
|
53
|
+
// Inject dynamic content (agent lists, command lists)
|
|
54
|
+
content = this.injectDynamicContent(content, agileflowDir);
|
|
55
|
+
|
|
53
56
|
// Replace docs/ references with custom folder name
|
|
54
57
|
content = this.replaceDocsReferences(content);
|
|
55
58
|
|
|
@@ -27,7 +27,7 @@ class WindsurfSetup extends BaseIdeSetup {
|
|
|
27
27
|
* @param {Object} options - Setup options
|
|
28
28
|
*/
|
|
29
29
|
async setup(projectDir, agileflowDir, options = {}) {
|
|
30
|
-
console.log(chalk.
|
|
30
|
+
console.log(chalk.hex('#C15F3C')(` Setting up ${this.displayName}...`));
|
|
31
31
|
|
|
32
32
|
// Clean up old installation first
|
|
33
33
|
await this.cleanup(projectDir);
|
|
@@ -50,6 +50,9 @@ class WindsurfSetup extends BaseIdeSetup {
|
|
|
50
50
|
// Read the original command content
|
|
51
51
|
let content = await this.readFile(command.path);
|
|
52
52
|
|
|
53
|
+
// Inject dynamic content (agent lists, command lists)
|
|
54
|
+
content = this.injectDynamicContent(content, agileflowDir);
|
|
55
|
+
|
|
53
56
|
// Replace docs/ references with custom folder name
|
|
54
57
|
content = this.replaceDocsReferences(content);
|
|
55
58
|
|
|
@@ -0,0 +1,139 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Content Injector - Dynamic content injection for command files
|
|
3
|
+
*
|
|
4
|
+
* Generates agent lists and command lists from source directories
|
|
5
|
+
* and injects them into command files during installation.
|
|
6
|
+
*/
|
|
7
|
+
|
|
8
|
+
const fs = require('fs');
|
|
9
|
+
const path = require('path');
|
|
10
|
+
const yaml = require('js-yaml');
|
|
11
|
+
|
|
12
|
+
/**
|
|
13
|
+
* Scan agents directory and generate formatted agent list
|
|
14
|
+
* @param {string} agentsDir - Path to agents directory
|
|
15
|
+
* @returns {string} Formatted agent list
|
|
16
|
+
*/
|
|
17
|
+
function generateAgentList(agentsDir) {
|
|
18
|
+
const files = fs.readdirSync(agentsDir).filter(f => f.endsWith('.md'));
|
|
19
|
+
const agents = [];
|
|
20
|
+
|
|
21
|
+
for (const file of files) {
|
|
22
|
+
const filePath = path.join(agentsDir, file);
|
|
23
|
+
const content = fs.readFileSync(filePath, 'utf8');
|
|
24
|
+
|
|
25
|
+
// Extract YAML frontmatter
|
|
26
|
+
const match = content.match(/^---\n([\s\S]*?)\n---/);
|
|
27
|
+
if (!match) continue;
|
|
28
|
+
|
|
29
|
+
try {
|
|
30
|
+
const frontmatter = yaml.load(match[1]);
|
|
31
|
+
|
|
32
|
+
// Handle tools field - can be array or string
|
|
33
|
+
let tools = frontmatter.tools || [];
|
|
34
|
+
if (typeof tools === 'string') {
|
|
35
|
+
tools = tools.split(',').map(t => t.trim());
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
agents.push({
|
|
39
|
+
name: frontmatter.name || path.basename(file, '.md'),
|
|
40
|
+
description: frontmatter.description || '',
|
|
41
|
+
tools: tools,
|
|
42
|
+
model: frontmatter.model || 'haiku'
|
|
43
|
+
});
|
|
44
|
+
} catch (err) {
|
|
45
|
+
console.warn(`Warning: Could not parse frontmatter in ${file}`);
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
// Sort alphabetically by name
|
|
50
|
+
agents.sort((a, b) => a.name.localeCompare(b.name));
|
|
51
|
+
|
|
52
|
+
// Generate formatted output
|
|
53
|
+
let output = `**AVAILABLE AGENTS (${agents.length} total)**:\n\n`;
|
|
54
|
+
|
|
55
|
+
agents.forEach((agent, index) => {
|
|
56
|
+
output += `${index + 1}. **${agent.name}** (model: ${agent.model})\n`;
|
|
57
|
+
output += ` - **Purpose**: ${agent.description}\n`;
|
|
58
|
+
output += ` - **Tools**: ${agent.tools.join(', ')}\n`;
|
|
59
|
+
output += ` - **Usage**: \`subagent_type: "AgileFlow:${agent.name}"\`\n`;
|
|
60
|
+
output += `\n`;
|
|
61
|
+
});
|
|
62
|
+
|
|
63
|
+
return output;
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
/**
|
|
67
|
+
* Scan commands directory and generate formatted command list
|
|
68
|
+
* @param {string} commandsDir - Path to commands directory
|
|
69
|
+
* @returns {string} Formatted command list
|
|
70
|
+
*/
|
|
71
|
+
function generateCommandList(commandsDir) {
|
|
72
|
+
const files = fs.readdirSync(commandsDir).filter(f => f.endsWith('.md'));
|
|
73
|
+
const commands = [];
|
|
74
|
+
|
|
75
|
+
for (const file of files) {
|
|
76
|
+
const filePath = path.join(commandsDir, file);
|
|
77
|
+
const content = fs.readFileSync(filePath, 'utf8');
|
|
78
|
+
|
|
79
|
+
// Extract YAML frontmatter
|
|
80
|
+
const match = content.match(/^---\n([\s\S]*?)\n---/);
|
|
81
|
+
if (!match) continue;
|
|
82
|
+
|
|
83
|
+
try {
|
|
84
|
+
const frontmatter = yaml.load(match[1]);
|
|
85
|
+
const cmdName = path.basename(file, '.md');
|
|
86
|
+
commands.push({
|
|
87
|
+
name: cmdName,
|
|
88
|
+
description: frontmatter.description || '',
|
|
89
|
+
argumentHint: frontmatter['argument-hint'] || ''
|
|
90
|
+
});
|
|
91
|
+
} catch (err) {
|
|
92
|
+
console.warn(`Warning: Could not parse frontmatter in ${file}`);
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
// Sort alphabetically by name
|
|
97
|
+
commands.sort((a, b) => a.name.localeCompare(b.name));
|
|
98
|
+
|
|
99
|
+
// Generate formatted output
|
|
100
|
+
let output = `Available commands (${commands.length} total):\n`;
|
|
101
|
+
|
|
102
|
+
commands.forEach(cmd => {
|
|
103
|
+
const argHint = cmd.argumentHint ? ` ${cmd.argumentHint}` : '';
|
|
104
|
+
output += `- \`/AgileFlow:${cmd.name}${argHint}\` - ${cmd.description}\n`;
|
|
105
|
+
});
|
|
106
|
+
|
|
107
|
+
return output;
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
/**
|
|
111
|
+
* Inject dynamic content into a template file
|
|
112
|
+
* @param {string} templateContent - Template file content with placeholders
|
|
113
|
+
* @param {string} agentsDir - Path to agents directory
|
|
114
|
+
* @param {string} commandsDir - Path to commands directory
|
|
115
|
+
* @returns {string} Content with placeholders replaced
|
|
116
|
+
*/
|
|
117
|
+
function injectContent(templateContent, agentsDir, commandsDir) {
|
|
118
|
+
let result = templateContent;
|
|
119
|
+
|
|
120
|
+
// Replace {{AGENT_LIST}} placeholder
|
|
121
|
+
if (result.includes('{{AGENT_LIST}}')) {
|
|
122
|
+
const agentList = generateAgentList(agentsDir);
|
|
123
|
+
result = result.replace(/<!-- {{AGENT_LIST}} -->/g, agentList);
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
// Replace {{COMMAND_LIST}} placeholder
|
|
127
|
+
if (result.includes('{{COMMAND_LIST}}')) {
|
|
128
|
+
const commandList = generateCommandList(commandsDir);
|
|
129
|
+
result = result.replace(/<!-- {{COMMAND_LIST}} -->/g, commandList);
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
return result;
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
module.exports = {
|
|
136
|
+
generateAgentList,
|
|
137
|
+
generateCommandList,
|
|
138
|
+
injectContent
|
|
139
|
+
};
|
|
@@ -240,7 +240,7 @@ async function createDocsStructure(targetDir, docsFolder = 'docs') {
|
|
|
240
240
|
};
|
|
241
241
|
|
|
242
242
|
try {
|
|
243
|
-
console.log(chalk.
|
|
243
|
+
console.log(chalk.hex('#C15F3C')(`\nCreating ${docsFolder}/ structure...`));
|
|
244
244
|
|
|
245
245
|
// Create directories
|
|
246
246
|
const directories = getDirectoryStructure(docsFolder);
|
package/tools/cli/lib/ui.js
CHANGED
|
@@ -18,13 +18,13 @@ const packageJson = require(packageJsonPath);
|
|
|
18
18
|
*/
|
|
19
19
|
function displayLogo() {
|
|
20
20
|
const logo = `
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
console.log(chalk.
|
|
21
|
+
█████╗ ██████╗ ██╗██╗ ███████╗███████╗██╗ ██████╗ ██╗ ██╗
|
|
22
|
+
██╔══██╗██╔════╝ ██║██║ ██╔════╝██╔════╝██║ ██╔═══██╗██║ ██║
|
|
23
|
+
███████║██║ ███╗██║██║ █████╗ █████╗ ██║ ██║ ██║██║ █╗ ██║
|
|
24
|
+
██╔══██║██║ ██║██║██║ ██╔══╝ ██╔══╝ ██║ ██║ ██║██║███╗██║
|
|
25
|
+
██║ ██║╚██████╔╝██║███████╗███████╗██║ ███████╗╚██████╔╝╚███╔███╔╝
|
|
26
|
+
╚═╝ ╚═╝ ╚═════╝ ╚═╝╚══════╝╚══════╝╚═╝ ╚══════╝ ╚═════╝ ╚══╝╚══╝ `;
|
|
27
|
+
console.log(chalk.hex('#C15F3C')(logo));
|
|
28
28
|
console.log(chalk.dim(` AgileFlow v${packageJson.version} - AI-Driven Agile Development\n`));
|
|
29
29
|
}
|
|
30
30
|
|
|
@@ -34,7 +34,7 @@ function displayLogo() {
|
|
|
34
34
|
* @param {string} subtitle - Optional subtitle
|
|
35
35
|
*/
|
|
36
36
|
function displaySection(title, subtitle = null) {
|
|
37
|
-
console.log(chalk.bold.
|
|
37
|
+
console.log(chalk.bold.hex('#C15F3C')(`\n${title}`));
|
|
38
38
|
if (subtitle) {
|
|
39
39
|
console.log(chalk.dim(subtitle));
|
|
40
40
|
}
|