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.
@@ -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
- <!-- AUTOGEN:COMMAND_LIST:START -->
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.cyan(` Setting up ${this.displayName}...`));
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.cyan(` Setting up ${this.displayName}...`));
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.cyan(` Setting up ${this.displayName}...`));
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.cyan(`\nCreating ${docsFolder}/ structure...`));
243
+ console.log(chalk.hex('#C15F3C')(`\nCreating ${docsFolder}/ structure...`));
244
244
 
245
245
  // Create directories
246
246
  const directories = getDirectoryStructure(docsFolder);
@@ -18,13 +18,13 @@ const packageJson = require(packageJsonPath);
18
18
  */
19
19
  function displayLogo() {
20
20
  const logo = `
21
- _ _ _ _____ _
22
- / \\ __ _(_) | ___| ___| | _____ __
23
- / _ \\ / _\` | | |/ _ \\ |_ | |/ _ \\ \\ /\\ / /
24
- / ___ \\ (_| | | | __/ _| | | (_) \\ V V /
25
- /_/ \\_\\__, |_|_|\\___|_| |_|\\___/ \\_/\\_/
26
- |___/ `;
27
- console.log(chalk.cyan(logo));
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.cyan(`\n${title}`));
37
+ console.log(chalk.bold.hex('#C15F3C')(`\n${title}`));
38
38
  if (subtitle) {
39
39
  console.log(chalk.dim(subtitle));
40
40
  }