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.
- package/package.json +2 -1
- package/scripts/generate-all.sh +77 -0
- package/scripts/generators/agent-registry.js +167 -0
- package/scripts/generators/command-registry.js +135 -0
- package/scripts/generators/index.js +87 -0
- package/scripts/generators/inject-babysit.js +167 -0
- package/scripts/generators/inject-help.js +109 -0
- package/scripts/generators/inject-readme.js +156 -0
- package/scripts/generators/skill-registry.js +144 -0
- package/src/core/agents/accessibility.md +8 -0
- package/src/core/agents/adr-writer.md +8 -0
- package/src/core/agents/analytics.md +8 -0
- package/src/core/agents/api.md +8 -2
- package/src/core/agents/ci.md +8 -0
- package/src/core/agents/compliance.md +8 -0
- package/src/core/agents/configuration/archival.md +23 -1
- package/src/core/agents/configuration/attribution.md +22 -1
- package/src/core/agents/configuration/ci.md +23 -1
- package/src/core/agents/configuration/git-config.md +23 -1
- package/src/core/agents/configuration/hooks.md +22 -1
- package/src/core/agents/configuration/precompact.md +8 -0
- package/src/core/agents/configuration/status-line.md +93 -13
- package/src/core/agents/configuration/verify.md +23 -1
- package/src/core/agents/database.md +8 -2
- package/src/core/agents/datamigration.md +8 -0
- package/src/core/agents/design.md +8 -0
- package/src/core/agents/devops.md +8 -2
- package/src/core/agents/documentation.md +8 -0
- package/src/core/agents/epic-planner.md +8 -0
- package/src/core/agents/integrations.md +8 -0
- package/src/core/agents/mentor.md +8 -3
- package/src/core/agents/mobile.md +8 -0
- package/src/core/agents/monitoring.md +8 -0
- package/src/core/agents/multi-expert.md +8 -0
- package/src/core/agents/performance.md +8 -2
- package/src/core/agents/product.md +8 -0
- package/src/core/agents/qa.md +8 -0
- package/src/core/agents/readme-updater.md +8 -0
- package/src/core/agents/refactor.md +8 -2
- package/src/core/agents/research.md +8 -0
- package/src/core/agents/security.md +8 -2
- package/src/core/agents/testing.md +8 -0
- package/src/core/agents/ui.md +8 -2
- package/src/core/commands/adr.md +2 -13
- package/src/core/commands/agent.md +2 -13
- package/src/core/commands/assign.md +2 -13
- package/src/core/commands/auto.md +2 -13
- package/src/core/commands/babysit.md +94 -88
- package/src/core/commands/baseline.md +2 -13
- package/src/core/commands/blockers.md +4 -13
- package/src/core/commands/board.md +4 -13
- package/src/core/commands/context.md +141 -5
- package/src/core/commands/deps.md +4 -15
- package/src/core/commands/docs.md +2 -15
- package/src/core/commands/epic.md +4 -15
- package/src/core/commands/help.md +3 -14
- package/src/core/commands/metrics.md +4 -15
- package/src/core/commands/packages.md +3 -14
- package/src/core/commands/pr.md +4 -13
- package/src/core/commands/readme-sync.md +7 -24
- package/src/core/commands/research.md +3 -14
- package/src/core/commands/retro.md +4 -15
- package/src/core/commands/sprint.md +8 -0
- package/src/core/commands/status.md +5 -14
- package/src/core/commands/story-validate.md +3 -14
- package/src/core/commands/story.md +17 -17
- package/src/core/commands/template.md +2 -15
- package/src/core/commands/tests.md +2 -15
- package/src/core/commands/update.md +2 -15
- package/src/core/commands/validate-expertise.md +2 -15
- package/src/core/commands/velocity.md +4 -15
- package/src/core/commands/verify.md +4 -15
- package/src/core/templates/agileflow-configure.js +123 -2
- package/src/core/templates/agileflow-metadata.json +12 -0
- 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
|
+
}
|
package/src/core/agents/api.md
CHANGED
|
@@ -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 |
|
package/src/core/agents/ci.md
CHANGED
|
@@ -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
|
|
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
|
|
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
|
|
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
|
|
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.
|