agileflow 2.42.0 → 2.44.0

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 (75) hide show
  1. package/package.json +2 -1
  2. package/scripts/generate-all.sh +77 -0
  3. package/scripts/generators/agent-registry.js +167 -0
  4. package/scripts/generators/command-registry.js +135 -0
  5. package/scripts/generators/index.js +87 -0
  6. package/scripts/generators/inject-babysit.js +167 -0
  7. package/scripts/generators/inject-help.js +109 -0
  8. package/scripts/generators/inject-readme.js +156 -0
  9. package/scripts/generators/skill-registry.js +144 -0
  10. package/src/core/agents/accessibility.md +8 -0
  11. package/src/core/agents/adr-writer.md +8 -0
  12. package/src/core/agents/analytics.md +8 -0
  13. package/src/core/agents/api.md +8 -2
  14. package/src/core/agents/ci.md +8 -0
  15. package/src/core/agents/compliance.md +8 -0
  16. package/src/core/agents/configuration/archival.md +23 -1
  17. package/src/core/agents/configuration/attribution.md +22 -1
  18. package/src/core/agents/configuration/ci.md +23 -1
  19. package/src/core/agents/configuration/git-config.md +23 -1
  20. package/src/core/agents/configuration/hooks.md +22 -1
  21. package/src/core/agents/configuration/precompact.md +8 -0
  22. package/src/core/agents/configuration/status-line.md +93 -13
  23. package/src/core/agents/configuration/verify.md +23 -1
  24. package/src/core/agents/database.md +8 -2
  25. package/src/core/agents/datamigration.md +8 -0
  26. package/src/core/agents/design.md +8 -0
  27. package/src/core/agents/devops.md +8 -2
  28. package/src/core/agents/documentation.md +8 -0
  29. package/src/core/agents/epic-planner.md +8 -0
  30. package/src/core/agents/integrations.md +8 -0
  31. package/src/core/agents/mentor.md +8 -3
  32. package/src/core/agents/mobile.md +8 -0
  33. package/src/core/agents/monitoring.md +8 -0
  34. package/src/core/agents/multi-expert.md +8 -0
  35. package/src/core/agents/performance.md +8 -2
  36. package/src/core/agents/product.md +8 -0
  37. package/src/core/agents/qa.md +8 -0
  38. package/src/core/agents/readme-updater.md +8 -0
  39. package/src/core/agents/refactor.md +8 -2
  40. package/src/core/agents/research.md +8 -0
  41. package/src/core/agents/security.md +8 -2
  42. package/src/core/agents/testing.md +8 -0
  43. package/src/core/agents/ui.md +8 -2
  44. package/src/core/commands/adr.md +2 -13
  45. package/src/core/commands/agent.md +2 -13
  46. package/src/core/commands/assign.md +2 -13
  47. package/src/core/commands/auto.md +2 -13
  48. package/src/core/commands/babysit.md +94 -88
  49. package/src/core/commands/baseline.md +2 -13
  50. package/src/core/commands/blockers.md +4 -13
  51. package/src/core/commands/board.md +4 -13
  52. package/src/core/commands/context.md +141 -5
  53. package/src/core/commands/deps.md +4 -15
  54. package/src/core/commands/docs.md +2 -15
  55. package/src/core/commands/epic.md +4 -15
  56. package/src/core/commands/help.md +3 -14
  57. package/src/core/commands/metrics.md +4 -15
  58. package/src/core/commands/packages.md +3 -14
  59. package/src/core/commands/pr.md +4 -13
  60. package/src/core/commands/readme-sync.md +7 -24
  61. package/src/core/commands/research.md +3 -14
  62. package/src/core/commands/retro.md +4 -15
  63. package/src/core/commands/sprint.md +8 -0
  64. package/src/core/commands/status.md +5 -14
  65. package/src/core/commands/story-validate.md +3 -14
  66. package/src/core/commands/story.md +17 -17
  67. package/src/core/commands/template.md +2 -15
  68. package/src/core/commands/tests.md +2 -15
  69. package/src/core/commands/update.md +2 -15
  70. package/src/core/commands/validate-expertise.md +2 -15
  71. package/src/core/commands/velocity.md +4 -15
  72. package/src/core/commands/verify.md +4 -15
  73. package/src/core/templates/agileflow-configure.js +123 -2
  74. package/src/core/templates/agileflow-metadata.json +12 -0
  75. package/src/core/templates/agileflow-statusline.sh +238 -44
@@ -0,0 +1,109 @@
1
+ #!/usr/bin/env node
2
+
3
+ /**
4
+ * Help Command Content Injector
5
+ *
6
+ * Injects command list into /agileflow:help command file.
7
+ * Finds AUTOGEN markers and replaces content with generated command directory.
8
+ */
9
+
10
+ const fs = require('fs');
11
+ const path = require('path');
12
+ const { scanCommands } = require('./command-registry');
13
+
14
+ /**
15
+ * Generate command list content grouped by category
16
+ * @param {Array} commands - Array of command metadata
17
+ * @returns {string} Formatted command list
18
+ */
19
+ function generateCommandList(commands) {
20
+ const lines = [];
21
+
22
+ // Group commands by category
23
+ const categories = {};
24
+ for (const cmd of commands) {
25
+ if (!categories[cmd.category]) {
26
+ categories[cmd.category] = [];
27
+ }
28
+ categories[cmd.category].push(cmd);
29
+ }
30
+
31
+ // Generate markdown for each category
32
+ for (const [category, cmds] of Object.entries(categories)) {
33
+ lines.push(`**${category}:**`);
34
+ for (const cmd of cmds) {
35
+ const hint = cmd.argumentHint ? ` ${cmd.argumentHint}` : '';
36
+ lines.push(`- \`/agileflow:${cmd.name}${hint}\` - ${cmd.description}`);
37
+ }
38
+ lines.push(''); // Blank line between categories
39
+ }
40
+
41
+ return lines.join('\n');
42
+ }
43
+
44
+ /**
45
+ * Inject content between AUTOGEN markers
46
+ * @param {string} content - Original file content
47
+ * @param {string} generated - Generated content to inject
48
+ * @returns {string} Updated file content
49
+ */
50
+ function injectContent(content, generated) {
51
+ const startMarker = '<!-- AUTOGEN:COMMAND_LIST:START -->';
52
+ const endMarker = '<!-- AUTOGEN:COMMAND_LIST:END -->';
53
+
54
+ const startIdx = content.indexOf(startMarker);
55
+ const endIdx = content.indexOf(endMarker);
56
+
57
+ if (startIdx === -1 || endIdx === -1) {
58
+ console.error('AUTOGEN markers not found in file');
59
+ return content;
60
+ }
61
+
62
+ const timestamp = new Date().toISOString().split('T')[0];
63
+ const injectedContent = `${startMarker}\n<!-- Auto-generated on ${timestamp}. Do not edit manually. -->\n\n${generated}\n${endMarker}`;
64
+
65
+ return content.substring(0, startIdx) + injectedContent + content.substring(endIdx + endMarker.length);
66
+ }
67
+
68
+ /**
69
+ * Main function
70
+ */
71
+ function main() {
72
+ const rootDir = path.resolve(__dirname, '../..');
73
+ const helpFile = path.join(rootDir, 'src/core/commands/help.md');
74
+ const commandsDir = path.join(rootDir, 'src/core/commands');
75
+
76
+ // Check if help file exists
77
+ if (!fs.existsSync(helpFile)) {
78
+ console.error(`Help file not found: ${helpFile}`);
79
+ process.exit(1);
80
+ }
81
+
82
+ // Scan commands
83
+ console.log('Scanning commands...');
84
+ const commands = scanCommands(commandsDir);
85
+ console.log(`Found ${commands.length} commands`);
86
+
87
+ // Generate command list
88
+ console.log('Generating command list...');
89
+ const commandList = generateCommandList(commands);
90
+
91
+ // Read help file
92
+ const helpContent = fs.readFileSync(helpFile, 'utf-8');
93
+
94
+ // Inject content
95
+ console.log('Injecting content into help.md...');
96
+ const updatedContent = injectContent(helpContent, commandList);
97
+
98
+ // Write back
99
+ fs.writeFileSync(helpFile, updatedContent, 'utf-8');
100
+ console.log('✅ Successfully updated help.md');
101
+ }
102
+
103
+ // Export for use in orchestrator
104
+ module.exports = { generateCommandList, injectContent };
105
+
106
+ // Run if called directly
107
+ if (require.main === module) {
108
+ main();
109
+ }
@@ -0,0 +1,156 @@
1
+ #!/usr/bin/env node
2
+
3
+ /**
4
+ * README Content Injector
5
+ *
6
+ * Injects stats, agent tables, and skill lists into README.md.
7
+ * Handles multiple AUTOGEN sections for different content types.
8
+ */
9
+
10
+ const fs = require('fs');
11
+ const path = require('path');
12
+ const { scanAgents } = require('./agent-registry');
13
+ const { scanCommands } = require('./command-registry');
14
+ const { scanSkills } = require('./skill-registry');
15
+
16
+ /**
17
+ * Generate stats content (command/agent/skill counts)
18
+ * @param {Object} counts - {commands, agents, skills}
19
+ * @returns {string} Formatted stats
20
+ */
21
+ function generateStats(counts) {
22
+ return `- **${counts.commands}** slash commands\n- **${counts.agents}** specialized agents\n- **${counts.skills}** code generation skills`;
23
+ }
24
+
25
+ /**
26
+ * Generate agent table (markdown table format)
27
+ * @param {Array} agents - Array of agent metadata
28
+ * @returns {string} Formatted table
29
+ */
30
+ function generateAgentTable(agents) {
31
+ const lines = [];
32
+
33
+ lines.push('| Agent | Description | Model | Category |');
34
+ lines.push('|-------|-------------|-------|----------|');
35
+
36
+ for (const agent of agents) {
37
+ const tools = agent.tools.slice(0, 3).join(', ') + (agent.tools.length > 3 ? '...' : '');
38
+ lines.push(`| ${agent.name} | ${agent.description} | ${agent.model} | ${agent.category} |`);
39
+ }
40
+
41
+ return lines.join('\n');
42
+ }
43
+
44
+ /**
45
+ * Generate skill list (bulleted list grouped by category)
46
+ * @param {Array} skills - Array of skill metadata
47
+ * @returns {string} Formatted list
48
+ */
49
+ function generateSkillList(skills) {
50
+ const lines = [];
51
+
52
+ // Group by category
53
+ const categories = {};
54
+ for (const skill of skills) {
55
+ if (!categories[skill.category]) {
56
+ categories[skill.category] = [];
57
+ }
58
+ categories[skill.category].push(skill);
59
+ }
60
+
61
+ for (const [category, categorySkills] of Object.entries(categories)) {
62
+ lines.push(`**${category}:**`);
63
+ for (const skill of categorySkills) {
64
+ lines.push(`- **${skill.name}**: ${skill.description}`);
65
+ }
66
+ lines.push('');
67
+ }
68
+
69
+ return lines.join('\n');
70
+ }
71
+
72
+ /**
73
+ * Inject content between specified AUTOGEN markers
74
+ * @param {string} content - Original file content
75
+ * @param {string} markerName - Name of the marker (e.g., STATS, AGENT_TABLE)
76
+ * @param {string} generated - Generated content to inject
77
+ * @returns {string} Updated file content
78
+ */
79
+ function injectContentByMarker(content, markerName, generated) {
80
+ const startMarker = `<!-- AUTOGEN:${markerName}:START -->`;
81
+ const endMarker = `<!-- AUTOGEN:${markerName}:END -->`;
82
+
83
+ const startIdx = content.indexOf(startMarker);
84
+ const endIdx = content.indexOf(endMarker);
85
+
86
+ if (startIdx === -1 || endIdx === -1) {
87
+ console.warn(`AUTOGEN:${markerName} markers not found - skipping`);
88
+ return content;
89
+ }
90
+
91
+ const timestamp = new Date().toISOString().split('T')[0];
92
+ const injectedContent = `${startMarker}\n<!-- Auto-generated on ${timestamp}. Do not edit manually. -->\n\n${generated}\n${endMarker}`;
93
+
94
+ return content.substring(0, startIdx) + injectedContent + content.substring(endIdx + endMarker.length);
95
+ }
96
+
97
+ /**
98
+ * Main function
99
+ */
100
+ function main() {
101
+ const cliDir = path.resolve(__dirname, '../..');
102
+ const rootDir = path.resolve(cliDir, '../..');
103
+ const readmeFile = path.join(rootDir, 'README.md');
104
+ const agentsDir = path.join(cliDir, 'src/core/agents');
105
+ const commandsDir = path.join(cliDir, 'src/core/commands');
106
+ const skillsDir = path.join(cliDir, 'src/core/skills');
107
+
108
+ // Check if README exists
109
+ if (!fs.existsSync(readmeFile)) {
110
+ console.error(`README not found: ${readmeFile}`);
111
+ process.exit(1);
112
+ }
113
+
114
+ // Scan all registries
115
+ console.log('Scanning commands, agents, and skills...');
116
+ const commands = scanCommands(commandsDir);
117
+ const agents = scanAgents(agentsDir);
118
+ const skills = scanSkills(skillsDir);
119
+
120
+ console.log(`Found: ${commands.length} commands, ${agents.length} agents, ${skills.length} skills`);
121
+
122
+ // Read README
123
+ let readmeContent = fs.readFileSync(readmeFile, 'utf-8');
124
+
125
+ // Generate content
126
+ console.log('Generating stats...');
127
+ const stats = generateStats({
128
+ commands: commands.length,
129
+ agents: agents.length,
130
+ skills: skills.length
131
+ });
132
+
133
+ console.log('Generating agent table...');
134
+ const agentTable = generateAgentTable(agents);
135
+
136
+ console.log('Generating skill list...');
137
+ const skillList = generateSkillList(skills);
138
+
139
+ // Inject content
140
+ console.log('Injecting content into README.md...');
141
+ readmeContent = injectContentByMarker(readmeContent, 'STATS', stats);
142
+ readmeContent = injectContentByMarker(readmeContent, 'AGENT_TABLE', agentTable);
143
+ readmeContent = injectContentByMarker(readmeContent, 'SKILL_LIST', skillList);
144
+
145
+ // Write back
146
+ fs.writeFileSync(readmeFile, readmeContent, 'utf-8');
147
+ console.log('✅ Successfully updated README.md');
148
+ }
149
+
150
+ // Export for use in orchestrator
151
+ module.exports = { generateStats, generateAgentTable, generateSkillList, injectContentByMarker };
152
+
153
+ // Run if called directly
154
+ if (require.main === module) {
155
+ main();
156
+ }
@@ -0,0 +1,144 @@
1
+ #!/usr/bin/env node
2
+
3
+ /**
4
+ * Skill Registry Scanner
5
+ *
6
+ * Scans skills/ directory and extracts metadata from SKILL.md frontmatter.
7
+ * Returns structured skill registry for use in generators.
8
+ */
9
+
10
+ const fs = require('fs');
11
+ const path = require('path');
12
+
13
+ /**
14
+ * Extract YAML frontmatter from markdown file
15
+ * @param {string} filePath - Path to markdown file
16
+ * @returns {object} Frontmatter object
17
+ */
18
+ function extractFrontmatter(filePath) {
19
+ const content = fs.readFileSync(filePath, 'utf-8');
20
+ const frontmatterMatch = content.match(/^---\n([\s\S]*?)\n---/);
21
+
22
+ if (!frontmatterMatch) {
23
+ return {};
24
+ }
25
+
26
+ const frontmatter = {};
27
+ const lines = frontmatterMatch[1].split('\n');
28
+
29
+ for (const line of lines) {
30
+ const match = line.match(/^(\w+):\s*(.+)$/);
31
+ if (match) {
32
+ const [, key, value] = match;
33
+ // Remove quotes if present
34
+ frontmatter[key] = value.replace(/^["']|["']$/g, '');
35
+ }
36
+ }
37
+
38
+ return frontmatter;
39
+ }
40
+
41
+ /**
42
+ * Categorize skill based on its name/description
43
+ * @param {string} name - Skill name
44
+ * @param {string} description - Skill description
45
+ * @returns {string} Category name
46
+ */
47
+ function categorizeSkill(name, description) {
48
+ const categories = {
49
+ 'Story & Planning': ['story', 'epic', 'sprint', 'acceptance-criteria'],
50
+ 'Code Generation': ['type-definitions', 'validation-schema', 'error-handler'],
51
+ 'Testing': ['test-case'],
52
+ 'Documentation': ['adr', 'api-documentation', 'changelog', 'pr-description'],
53
+ 'Architecture': ['sql-schema', 'diagram'],
54
+ 'Deployment': ['deployment-guide', 'migration-checklist']
55
+ };
56
+
57
+ const lowerName = name.toLowerCase();
58
+ const lowerDesc = description.toLowerCase();
59
+
60
+ for (const [category, keywords] of Object.entries(categories)) {
61
+ if (keywords.some(kw => lowerName.includes(kw) || lowerDesc.includes(kw))) {
62
+ return category;
63
+ }
64
+ }
65
+
66
+ return 'Other';
67
+ }
68
+
69
+ /**
70
+ * Scan skills directory and build registry
71
+ * @param {string} skillsDir - Path to skills directory
72
+ * @returns {Array} Array of skill metadata objects
73
+ */
74
+ function scanSkills(skillsDir) {
75
+ const skills = [];
76
+
77
+ // Each skill is in its own directory with a SKILL.md file
78
+ const skillDirs = fs.readdirSync(skillsDir);
79
+
80
+ for (const skillDir of skillDirs) {
81
+ const skillPath = path.join(skillsDir, skillDir);
82
+
83
+ // Skip if not a directory
84
+ if (!fs.statSync(skillPath).isDirectory()) continue;
85
+
86
+ const skillFile = path.join(skillPath, 'SKILL.md');
87
+
88
+ // Skip if SKILL.md doesn't exist
89
+ if (!fs.existsSync(skillFile)) continue;
90
+
91
+ const frontmatter = extractFrontmatter(skillFile);
92
+ const name = frontmatter.name || skillDir;
93
+ const description = frontmatter.description || '';
94
+
95
+ skills.push({
96
+ name,
97
+ directory: skillDir,
98
+ file: 'SKILL.md',
99
+ path: skillFile,
100
+ description,
101
+ category: categorizeSkill(name, description)
102
+ });
103
+ }
104
+
105
+ // Sort by category, then by name
106
+ skills.sort((a, b) => {
107
+ if (a.category !== b.category) {
108
+ return a.category.localeCompare(b.category);
109
+ }
110
+ return a.name.localeCompare(b.name);
111
+ });
112
+
113
+ return skills;
114
+ }
115
+
116
+ /**
117
+ * Main function
118
+ */
119
+ function main() {
120
+ const rootDir = path.resolve(__dirname, '../..');
121
+ const skillsDir = path.join(rootDir, 'src/core/skills');
122
+
123
+ if (!fs.existsSync(skillsDir)) {
124
+ console.error(`Skills directory not found: ${skillsDir}`);
125
+ process.exit(1);
126
+ }
127
+
128
+ const skills = scanSkills(skillsDir);
129
+
130
+ // If called directly, output JSON
131
+ if (require.main === module) {
132
+ console.log(JSON.stringify(skills, null, 2));
133
+ }
134
+
135
+ return skills;
136
+ }
137
+
138
+ // Export for use in other scripts
139
+ module.exports = { scanSkills, extractFrontmatter, categorizeSkill };
140
+
141
+ // Run if called directly
142
+ if (require.main === module) {
143
+ main();
144
+ }
@@ -5,6 +5,14 @@ tools: Read, Write, Edit, Bash, Glob, Grep
5
5
  model: haiku
6
6
  ---
7
7
 
8
+ ## STEP 0: Gather Context
9
+
10
+ ```bash
11
+ node scripts/obtain-context.js accessibility
12
+ ```
13
+
14
+ ---
15
+
8
16
  <!-- COMPACT_SUMMARY_START -->
9
17
  # AG-ACCESSIBILITY Quick Reference
10
18
 
@@ -5,6 +5,14 @@ tools: Read, Write, Edit, Glob, Grep
5
5
  model: haiku
6
6
  ---
7
7
 
8
+ ## STEP 0: Gather Context
9
+
10
+ ```bash
11
+ node scripts/obtain-context.js adr-writer
12
+ ```
13
+
14
+ ---
15
+
8
16
  <!-- COMPACT_SUMMARY_START -->
9
17
  # ADR-WRITER Quick Reference
10
18
 
@@ -5,6 +5,14 @@ tools: Read, Write, Edit, Bash, Glob, Grep
5
5
  model: haiku
6
6
  ---
7
7
 
8
+ ## STEP 0: Gather Context
9
+
10
+ ```bash
11
+ node scripts/obtain-context.js analytics
12
+ ```
13
+
14
+ ---
15
+
8
16
  <!-- COMPACT_SUMMARY_START -->
9
17
  # AG-ANALYTICS Quick Reference
10
18
 
@@ -5,6 +5,14 @@ tools: Read, Write, Edit, Bash, Glob, Grep
5
5
  model: haiku
6
6
  ---
7
7
 
8
+ ## STEP 0: Gather Context
9
+
10
+ ```bash
11
+ node scripts/obtain-context.js api
12
+ ```
13
+
14
+ ---
15
+
8
16
  **⚡ Execution Policy**: Slash commands are autonomous (run without asking), file operations require diff + YES/NO confirmation. See CLAUDE.md Command Safety Policy for full details.
9
17
 
10
18
  <!-- COMPACT_SUMMARY_START -->
@@ -433,8 +441,6 @@ RESEARCH INTEGRATION
433
441
 
434
442
  PLAN MODE FOR COMPLEX API WORK
435
443
 
436
- **Reference**: `@docs/02-practices/plan-mode.md`
437
-
438
444
  Before implementing, evaluate complexity:
439
445
 
440
446
  | Situation | Action |
@@ -5,6 +5,14 @@ tools: Read, Write, Edit, Bash, Glob, Grep
5
5
  model: haiku
6
6
  ---
7
7
 
8
+ ## STEP 0: Gather Context
9
+
10
+ ```bash
11
+ node scripts/obtain-context.js ci
12
+ ```
13
+
14
+ ---
15
+
8
16
  <!-- COMPACT_SUMMARY_START -->
9
17
  # AG-CI Quick Reference
10
18
 
@@ -5,6 +5,14 @@ tools: Read, Write, Edit, Bash, Glob, Grep
5
5
  model: haiku
6
6
  ---
7
7
 
8
+ ## STEP 0: Gather Context
9
+
10
+ ```bash
11
+ node scripts/obtain-context.js compliance
12
+ ```
13
+
14
+ ---
15
+
8
16
  <!-- COMPACT_SUMMARY_START -->
9
17
  # AG-COMPLIANCE Quick Reference
10
18
 
@@ -12,6 +12,14 @@ tools:
12
12
  model: haiku
13
13
  ---
14
14
 
15
+ ## STEP 0: Gather Context
16
+
17
+ ```bash
18
+ node scripts/obtain-context.js configuration-archival
19
+ ```
20
+
21
+ ---
22
+
15
23
  # Configuration Agent: Auto-Archival System
16
24
 
17
25
  Configure auto-archival system to manage status.json file size.
@@ -20,7 +28,21 @@ Configure auto-archival system to manage status.json file size.
20
28
 
21
29
  ROLE: Auto-Archival Configurator
22
30
 
23
- 🔴 **AskUserQuestion Format**: NEVER ask users to "type" anything. Use proper options with XML invoke format. See `docs/02-practices/ask-user-question.md`.
31
+ 🔴 **AskUserQuestion Format**: NEVER ask users to "type" anything. Use proper options:
32
+ ```xml
33
+ <invoke name="AskUserQuestion">
34
+ <parameter name="questions">[{
35
+ "question": "How many days before archiving completed stories?",
36
+ "header": "Threshold",
37
+ "multiSelect": false,
38
+ "options": [
39
+ {"label": "7 days (Recommended)", "description": "Archive after 1 week"},
40
+ {"label": "14 days", "description": "Archive after 2 weeks"},
41
+ {"label": "30 days", "description": "Archive after 1 month"}
42
+ ]
43
+ }]</parameter>
44
+ </invoke>
45
+ ```
24
46
 
25
47
  OBJECTIVE
26
48
  Configure the auto-archival system that prevents `docs/09-agents/status.json` from exceeding Claude Code's token limit by automatically moving old completed stories to an archive.
@@ -12,6 +12,14 @@ tools:
12
12
  model: haiku
13
13
  ---
14
14
 
15
+ ## STEP 0: Gather Context
16
+
17
+ ```bash
18
+ node scripts/obtain-context.js configuration-attribution
19
+ ```
20
+
21
+ ---
22
+
15
23
  # Configuration Agent: Attribution Settings
16
24
 
17
25
  Configure CLAUDE.md file with git attribution preferences.
@@ -20,7 +28,20 @@ Configure CLAUDE.md file with git attribution preferences.
20
28
 
21
29
  ROLE: Attribution Configurator
22
30
 
23
- 🔴 **AskUserQuestion Format**: NEVER ask users to "type" anything. Use proper options with XML invoke format. See `docs/02-practices/ask-user-question.md`.
31
+ 🔴 **AskUserQuestion Format**: NEVER ask users to "type" anything. Use proper options:
32
+ ```xml
33
+ <invoke name="AskUserQuestion">
34
+ <parameter name="questions">[{
35
+ "question": "How should git commits be attributed?",
36
+ "header": "Attribution",
37
+ "multiSelect": false,
38
+ "options": [
39
+ {"label": "No AI attribution (Recommended)", "description": "Clean commits, no AI footers"},
40
+ {"label": "Add Co-Authored-By", "description": "Include AI co-author in commits"}
41
+ ]
42
+ }]</parameter>
43
+ </invoke>
44
+ ```
24
45
 
25
46
  OBJECTIVE
26
47
  Create or update CLAUDE.md with user's git attribution preferences. CLAUDE.md is the AI assistant's primary configuration file and controls whether Claude Code adds attribution to git commits.
@@ -12,6 +12,14 @@ tools:
12
12
  model: haiku
13
13
  ---
14
14
 
15
+ ## STEP 0: Gather Context
16
+
17
+ ```bash
18
+ node scripts/obtain-context.js configuration-ci
19
+ ```
20
+
21
+ ---
22
+
15
23
  # Configuration Agent: CI/CD Workflow
16
24
 
17
25
  Configure automated CI/CD workflow for testing, linting, and quality checks.
@@ -20,7 +28,21 @@ Configure automated CI/CD workflow for testing, linting, and quality checks.
20
28
 
21
29
  ROLE: CI/CD Configurator
22
30
 
23
- 🔴 **AskUserQuestion Format**: NEVER ask users to "type" anything. Use proper options with XML invoke format. See `docs/02-practices/ask-user-question.md`.
31
+ 🔴 **AskUserQuestion Format**: NEVER ask users to "type" anything. Use proper options:
32
+ ```xml
33
+ <invoke name="AskUserQuestion">
34
+ <parameter name="questions">[{
35
+ "question": "Which CI checks do you want to enable?",
36
+ "header": "CI Checks",
37
+ "multiSelect": true,
38
+ "options": [
39
+ {"label": "Lint", "description": "Run ESLint/Prettier checks"},
40
+ {"label": "Type check", "description": "Run TypeScript compiler"},
41
+ {"label": "Tests", "description": "Run test suite"}
42
+ ]
43
+ }]</parameter>
44
+ </invoke>
45
+ ```
24
46
 
25
47
  OBJECTIVE
26
48
  Set up continuous integration and deployment workflows to automate testing, linting, type checking, and build verification on every commit/PR.
@@ -12,6 +12,14 @@ tools:
12
12
  model: haiku
13
13
  ---
14
14
 
15
+ ## STEP 0: Gather Context
16
+
17
+ ```bash
18
+ node scripts/obtain-context.js configuration-git-config
19
+ ```
20
+
21
+ ---
22
+
15
23
  # Configuration Agent: Git Repository Setup
16
24
 
17
25
  Configure git initialization and remote repository connection.
@@ -20,7 +28,21 @@ Configure git initialization and remote repository connection.
20
28
 
21
29
  ROLE: Git Configuration Specialist
22
30
 
23
- 🔴 **AskUserQuestion Format**: NEVER ask users to "type" anything. Use proper options with XML invoke format. See `docs/02-practices/ask-user-question.md`.
31
+ 🔴 **AskUserQuestion Format**: NEVER ask users to "type" anything. Use proper options:
32
+ ```xml
33
+ <invoke name="AskUserQuestion">
34
+ <parameter name="questions">[{
35
+ "question": "Which git hosting platform?",
36
+ "header": "Platform",
37
+ "multiSelect": false,
38
+ "options": [
39
+ {"label": "GitHub", "description": "github.com repository"},
40
+ {"label": "GitLab", "description": "gitlab.com repository"},
41
+ {"label": "Other", "description": "Custom git remote"}
42
+ ]
43
+ }]</parameter>
44
+ </invoke>
45
+ ```
24
46
 
25
47
  OBJECTIVE
26
48
  Set up git repository with remote connection to enable version control, team collaboration, and backup for the AgileFlow project.