agile-context-engineering 0.1.0 → 0.2.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/LICENSE +30 -0
- package/README.md +272 -78
- package/agents/ace-code-discovery-analyst.md +245 -0
- package/agents/ace-code-integration-analyst.md +248 -0
- package/agents/ace-code-reviewer.md +375 -0
- package/agents/ace-product-owner.md +361 -0
- package/agents/ace-project-researcher.md +606 -0
- package/agents/ace-research-synthesizer.md +228 -0
- package/agents/ace-technical-application-architect.md +287 -0
- package/agents/ace-wiki-mapper.md +334 -0
- package/agile-context-engineering/src/ace-tools.js +2881 -0
- package/agile-context-engineering/src/ace-tools.test.js +1089 -0
- package/agile-context-engineering/templates/_command.md +54 -0
- package/agile-context-engineering/templates/_workflow.xml +17 -0
- package/agile-context-engineering/templates/config.json +0 -0
- package/agile-context-engineering/templates/product/external-solution.xml +832 -0
- package/agile-context-engineering/templates/product/feature.xml +361 -0
- package/agile-context-engineering/templates/product/integration-solution.xml +0 -0
- package/agile-context-engineering/templates/product/product-backlog.xml +231 -0
- package/agile-context-engineering/templates/product/product-vision.xml +227 -0
- package/agile-context-engineering/templates/product/story-integration-solution.xml +1014 -0
- package/agile-context-engineering/templates/product/story-technical-solution.xml +1025 -0
- package/agile-context-engineering/templates/product/story-wiki.xml +190 -0
- package/agile-context-engineering/templates/product/story.xml +451 -0
- package/agile-context-engineering/templates/wiki/coding-standards.xml +493 -0
- package/agile-context-engineering/templates/wiki/decizions.xml +115 -0
- package/agile-context-engineering/templates/wiki/guide.xml +137 -0
- package/agile-context-engineering/templates/wiki/module-discovery.xml +174 -0
- package/agile-context-engineering/templates/wiki/pattern.xml +159 -0
- package/agile-context-engineering/templates/wiki/subsystem-architecture.xml +343 -0
- package/agile-context-engineering/templates/wiki/subsystem-structure.xml +235 -0
- package/agile-context-engineering/templates/wiki/system-architecture.xml +254 -0
- package/agile-context-engineering/templates/wiki/system-cross-cutting.xml +197 -0
- package/agile-context-engineering/templates/wiki/system-structure.xml +178 -0
- package/agile-context-engineering/templates/wiki/system.xml +381 -0
- package/agile-context-engineering/templates/wiki/tech-debt-index.xml +125 -0
- package/agile-context-engineering/templates/wiki/testing-framework.xml +283 -0
- package/agile-context-engineering/templates/wiki/wiki-readme.xml +276 -0
- package/agile-context-engineering/utils/questioning.xml +111 -0
- package/agile-context-engineering/utils/ui-formatting.md +300 -0
- package/agile-context-engineering/workflows/execute-story.xml +1145 -0
- package/agile-context-engineering/workflows/help.xml +540 -0
- package/agile-context-engineering/workflows/init-coding-standards.xml +386 -0
- package/agile-context-engineering/workflows/map-story.xml +797 -0
- package/agile-context-engineering/workflows/map-subsystem.xml +1177 -0
- package/agile-context-engineering/workflows/map-system.xml +672 -0
- package/agile-context-engineering/workflows/plan-backlog.xml +1356 -0
- package/agile-context-engineering/workflows/plan-feature.xml +1495 -0
- package/agile-context-engineering/workflows/plan-product-vision.xml +342 -0
- package/agile-context-engineering/workflows/plan-story.xml +909 -0
- package/agile-context-engineering/workflows/research-external-solution.xml +659 -0
- package/agile-context-engineering/workflows/research-integration-solution.xml +712 -0
- package/agile-context-engineering/workflows/research-story-wiki.xml +474 -0
- package/agile-context-engineering/workflows/research-technical-solution.xml +762 -0
- package/agile-context-engineering/workflows/review-story.xml +281 -0
- package/bin/install.js +102 -166
- package/commands/ace/execute-story.md +137 -0
- package/commands/ace/help.md +93 -0
- package/commands/ace/init-coding-standards.md +83 -0
- package/commands/ace/map-story.md +156 -0
- package/commands/ace/map-subsystem.md +138 -0
- package/commands/ace/map-system.md +92 -0
- package/commands/ace/plan-backlog.md +83 -0
- package/commands/ace/plan-feature.md +89 -0
- package/commands/ace/plan-product-vision.md +81 -0
- package/commands/ace/plan-story.md +145 -0
- package/commands/ace/research-external-solution.md +138 -0
- package/commands/ace/research-integration-solution.md +135 -0
- package/commands/ace/research-story-wiki.md +116 -0
- package/commands/ace/research-technical-solution.md +147 -0
- package/commands/ace/review-story.md +109 -0
- package/package.json +5 -8
- package/agents/executor.md +0 -88
- package/agents/planner.md +0 -78
- package/agents/researcher.md +0 -77
- package/agents/verifier.md +0 -116
- package/commands/ace-execute-story.md +0 -114
- package/commands/ace-init.md +0 -254
- package/commands/ace-plan-epic.md +0 -79
- package/commands/ace-plan-feature.md +0 -78
- package/commands/ace-plan-project.md +0 -205
- package/commands/ace-plan-story.md +0 -97
- package/commands/ace-refine-story.md +0 -90
- package/commands/ace-verify-story.md +0 -127
package/bin/install.js
CHANGED
|
@@ -30,30 +30,18 @@ const RUNTIMES = {
|
|
|
30
30
|
supportsLocal: true,
|
|
31
31
|
},
|
|
32
32
|
opencode: {
|
|
33
|
-
name: '
|
|
34
|
-
description: '
|
|
33
|
+
name: 'Crush',
|
|
34
|
+
description: 'Crush AI coding assistant (formerly OpenCode)',
|
|
35
35
|
globalDir: '.opencode',
|
|
36
36
|
commandsDir: 'commands',
|
|
37
37
|
agentsDir: 'agents',
|
|
38
38
|
supportsLocal: true,
|
|
39
39
|
},
|
|
40
|
-
gemini: {
|
|
41
|
-
name: 'Gemini CLI',
|
|
42
|
-
description: "Google's Gemini CLI",
|
|
43
|
-
globalDir: '.gemini',
|
|
44
|
-
commandsDir: 'commands',
|
|
45
|
-
agentsDir: 'agents',
|
|
46
|
-
supportsLocal: true,
|
|
47
|
-
},
|
|
48
|
-
codex: {
|
|
49
|
-
name: 'Codex CLI',
|
|
50
|
-
description: "OpenAI's Codex CLI",
|
|
51
|
-
globalDir: '.codex',
|
|
52
|
-
skillsDir: 'skills',
|
|
53
|
-
supportsLocal: false, // Codex only supports global installation
|
|
54
|
-
},
|
|
55
40
|
};
|
|
56
41
|
|
|
42
|
+
// The folder name installed inside the config directory (e.g. ~/.claude/agile-context-engineering/)
|
|
43
|
+
const ACE_DIR_NAME = 'agile-context-engineering';
|
|
44
|
+
|
|
57
45
|
function log(message, color = '') {
|
|
58
46
|
console.log(`${color}${message}${colors.reset}`);
|
|
59
47
|
}
|
|
@@ -76,8 +64,6 @@ function parseArgs() {
|
|
|
76
64
|
const flags = {
|
|
77
65
|
claude: args.includes('--claude'),
|
|
78
66
|
opencode: args.includes('--opencode'),
|
|
79
|
-
gemini: args.includes('--gemini'),
|
|
80
|
-
codex: args.includes('--codex'),
|
|
81
67
|
all: args.includes('--all'),
|
|
82
68
|
global: args.includes('--global'),
|
|
83
69
|
local: args.includes('--local'),
|
|
@@ -93,20 +79,18 @@ Usage: npx agile-context-engineering [options]
|
|
|
93
79
|
|
|
94
80
|
Options:
|
|
95
81
|
--claude Install for Claude Code only
|
|
96
|
-
--opencode Install for OpenCode
|
|
97
|
-
--gemini Install for Gemini CLI only
|
|
98
|
-
--codex Install for Codex CLI only (global only)
|
|
82
|
+
--opencode Install for Crush (formerly OpenCode)
|
|
99
83
|
--all Install for all supported runtimes
|
|
100
|
-
--global Install globally (~/.claude, ~/.
|
|
101
|
-
--local Install locally (.claude, .opencode
|
|
84
|
+
--global Install globally (~/.claude, ~/.opencode)
|
|
85
|
+
--local Install locally (.claude, .opencode)
|
|
102
86
|
-h, --help Show this help message
|
|
103
87
|
-v, --version Show version number
|
|
104
88
|
|
|
105
89
|
Examples:
|
|
106
90
|
npx agile-context-engineering # Interactive installation
|
|
107
91
|
npx agile-context-engineering --claude --local # Claude Code, local install
|
|
92
|
+
npx agile-context-engineering --opencode --global # Crush (formerly OpenCode), global install
|
|
108
93
|
npx agile-context-engineering --all --global # All runtimes, global install
|
|
109
|
-
npx agile-context-engineering --codex # Codex CLI (always global)
|
|
110
94
|
`);
|
|
111
95
|
}
|
|
112
96
|
|
|
@@ -148,7 +132,7 @@ async function askMultiple(rl, question, options) {
|
|
|
148
132
|
log(` ${opt.description}`, colors.dim);
|
|
149
133
|
}
|
|
150
134
|
});
|
|
151
|
-
log(`\n Enter numbers separated by commas (e.g., 1,2
|
|
135
|
+
log(`\n Enter numbers separated by commas (e.g., 1,2) or 'all'`, colors.dim);
|
|
152
136
|
rl.question(`\n${colors.yellow}Your choice: ${colors.reset}`, (answer) => {
|
|
153
137
|
if (answer.toLowerCase() === 'all') {
|
|
154
138
|
resolve(options.map(o => o.value));
|
|
@@ -174,18 +158,24 @@ function getBasePath(runtime, scope) {
|
|
|
174
158
|
const cwd = process.cwd();
|
|
175
159
|
const config = RUNTIMES[runtime];
|
|
176
160
|
|
|
177
|
-
if (scope === 'local' && !config.supportsLocal) {
|
|
178
|
-
// Fallback to global for runtimes that don't support local
|
|
179
|
-
return path.join(home, config.globalDir);
|
|
180
|
-
}
|
|
181
|
-
|
|
182
161
|
return scope === 'global'
|
|
183
162
|
? path.join(home, config.globalDir)
|
|
184
163
|
: path.join(cwd, config.globalDir);
|
|
185
164
|
}
|
|
186
165
|
|
|
187
|
-
//
|
|
188
|
-
|
|
166
|
+
// File extensions that contain path references needing runtime transformation
|
|
167
|
+
const TRANSFORMABLE_EXTENSIONS = new Set(['.md', '.xml']);
|
|
168
|
+
|
|
169
|
+
// Transform file content for a target runtime (replaces .claude/ paths with target runtime paths)
|
|
170
|
+
function transformForRuntime(content, runtime) {
|
|
171
|
+
if (runtime === 'claude') return content; // Source files already use .claude paths
|
|
172
|
+
const targetDir = RUNTIMES[runtime].globalDir; // e.g. '.opencode'
|
|
173
|
+
// Replace path references: ~/.claude/ → ~/.opencode/, .claude/settings → .opencode/settings, etc.
|
|
174
|
+
return content.replace(/\.claude\//g, `${targetDir}/`);
|
|
175
|
+
}
|
|
176
|
+
|
|
177
|
+
// Copy directory recursively, optionally transforming text file content for the target runtime
|
|
178
|
+
function copyDir(src, dest, runtime) {
|
|
189
179
|
if (!fs.existsSync(dest)) {
|
|
190
180
|
fs.mkdirSync(dest, { recursive: true });
|
|
191
181
|
}
|
|
@@ -197,148 +187,100 @@ function copyDir(src, dest) {
|
|
|
197
187
|
const destPath = path.join(dest, entry.name);
|
|
198
188
|
|
|
199
189
|
if (entry.isDirectory()) {
|
|
200
|
-
copyDir(srcPath, destPath);
|
|
190
|
+
copyDir(srcPath, destPath, runtime);
|
|
201
191
|
} else {
|
|
202
|
-
|
|
192
|
+
const ext = path.extname(entry.name).toLowerCase();
|
|
193
|
+
if (runtime !== 'claude' && TRANSFORMABLE_EXTENSIONS.has(ext)) {
|
|
194
|
+
// Transform path references for non-Claude runtimes
|
|
195
|
+
const content = fs.readFileSync(srcPath, 'utf-8');
|
|
196
|
+
fs.writeFileSync(destPath, transformForRuntime(content, runtime), 'utf-8');
|
|
197
|
+
} else {
|
|
198
|
+
fs.copyFileSync(srcPath, destPath);
|
|
199
|
+
}
|
|
203
200
|
}
|
|
204
201
|
}
|
|
205
202
|
}
|
|
206
203
|
|
|
207
|
-
// Install for Claude Code
|
|
208
|
-
function
|
|
204
|
+
// Install ACE for a runtime (Claude Code or Crush)
|
|
205
|
+
function installForRuntime(runtime, scope, packageDir) {
|
|
209
206
|
const config = RUNTIMES[runtime];
|
|
210
207
|
const basePath = getBasePath(runtime, scope);
|
|
211
208
|
const commandsPath = path.join(basePath, config.commandsDir);
|
|
212
209
|
const agentsPath = path.join(basePath, config.agentsDir);
|
|
210
|
+
const acePath = path.join(basePath, ACE_DIR_NAME);
|
|
213
211
|
|
|
214
212
|
// Source directories
|
|
215
213
|
const srcCommands = path.join(packageDir, 'commands');
|
|
216
214
|
const srcAgents = path.join(packageDir, 'agents');
|
|
215
|
+
const srcTemplates = path.join(packageDir, 'agile-context-engineering', 'templates');
|
|
216
|
+
const srcUtils = path.join(packageDir, 'agile-context-engineering', 'utils');
|
|
217
|
+
const srcWorkflows = path.join(packageDir, 'agile-context-engineering', 'workflows');
|
|
218
|
+
const srcTools = path.join(packageDir, 'agile-context-engineering', 'src');
|
|
217
219
|
|
|
218
220
|
log(`\nInstalling ACE for ${config.name}...`, colors.cyan);
|
|
219
221
|
log(` Target: ${basePath}`, colors.dim);
|
|
220
222
|
|
|
223
|
+
// Clean previous ACE installation to remove stale files from renamed/deleted commands
|
|
224
|
+
const aceCommandsPath = path.join(commandsPath, 'ace');
|
|
225
|
+
if (fs.existsSync(aceCommandsPath)) {
|
|
226
|
+
fs.rmSync(aceCommandsPath, { recursive: true });
|
|
227
|
+
}
|
|
228
|
+
if (fs.existsSync(agentsPath)) {
|
|
229
|
+
// Only remove ace-* agent files, preserve non-ACE agents
|
|
230
|
+
for (const f of fs.readdirSync(agentsPath)) {
|
|
231
|
+
if (f.startsWith('ace-')) {
|
|
232
|
+
fs.rmSync(path.join(agentsPath, f), { recursive: true });
|
|
233
|
+
}
|
|
234
|
+
}
|
|
235
|
+
}
|
|
236
|
+
if (fs.existsSync(acePath)) {
|
|
237
|
+
fs.rmSync(acePath, { recursive: true });
|
|
238
|
+
}
|
|
239
|
+
|
|
221
240
|
// Create directories
|
|
222
241
|
fs.mkdirSync(commandsPath, { recursive: true });
|
|
223
242
|
fs.mkdirSync(agentsPath, { recursive: true });
|
|
243
|
+
fs.mkdirSync(acePath, { recursive: true });
|
|
224
244
|
|
|
225
|
-
// Copy commands
|
|
245
|
+
// Copy commands (transform paths for target runtime)
|
|
226
246
|
if (fs.existsSync(srcCommands)) {
|
|
227
|
-
copyDir(srcCommands, commandsPath);
|
|
247
|
+
copyDir(srcCommands, commandsPath, runtime);
|
|
228
248
|
log(` ✓ Commands installed`, colors.green);
|
|
229
249
|
}
|
|
230
250
|
|
|
231
|
-
// Copy agents
|
|
251
|
+
// Copy agents (transform paths for target runtime)
|
|
232
252
|
if (fs.existsSync(srcAgents)) {
|
|
233
|
-
copyDir(srcAgents, agentsPath);
|
|
253
|
+
copyDir(srcAgents, agentsPath, runtime);
|
|
234
254
|
log(` ✓ Agents installed`, colors.green);
|
|
235
255
|
}
|
|
236
256
|
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
const config = RUNTIMES.codex;
|
|
243
|
-
const home = os.homedir();
|
|
244
|
-
const basePath = path.join(home, config.globalDir);
|
|
245
|
-
const skillsPath = path.join(basePath, config.skillsDir, 'ace');
|
|
246
|
-
|
|
247
|
-
// Source directories
|
|
248
|
-
const srcCommands = path.join(packageDir, 'commands');
|
|
249
|
-
const srcAgents = path.join(packageDir, 'agents');
|
|
250
|
-
|
|
251
|
-
log(`\nInstalling ACE for ${config.name}...`, colors.cyan);
|
|
252
|
-
log(` Target: ${skillsPath}`, colors.dim);
|
|
253
|
-
|
|
254
|
-
// Create ace skill directory
|
|
255
|
-
fs.mkdirSync(skillsPath, { recursive: true });
|
|
257
|
+
// Copy templates into agile-context-engineering/
|
|
258
|
+
if (fs.existsSync(srcTemplates)) {
|
|
259
|
+
copyDir(srcTemplates, path.join(acePath, 'templates'), runtime);
|
|
260
|
+
log(` ✓ Templates installed`, colors.green);
|
|
261
|
+
}
|
|
256
262
|
|
|
257
|
-
//
|
|
258
|
-
|
|
263
|
+
// Copy utils into agile-context-engineering/
|
|
264
|
+
if (fs.existsSync(srcUtils)) {
|
|
265
|
+
copyDir(srcUtils, path.join(acePath, 'utils'), runtime);
|
|
266
|
+
log(` ✓ Utils installed`, colors.green);
|
|
267
|
+
}
|
|
259
268
|
|
|
260
|
-
//
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
269
|
+
// Copy workflows into agile-context-engineering/
|
|
270
|
+
if (fs.existsSync(srcWorkflows)) {
|
|
271
|
+
copyDir(srcWorkflows, path.join(acePath, 'workflows'), runtime);
|
|
272
|
+
log(` ✓ Workflows installed`, colors.green);
|
|
273
|
+
}
|
|
264
274
|
|
|
265
|
-
//
|
|
266
|
-
if (fs.existsSync(
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
const cmdName = cmd.replace('.md', '').replace('ace-', '');
|
|
270
|
-
const cmdSkillPath = path.join(basePath, config.skillsDir, `ace-${cmdName}`);
|
|
271
|
-
fs.mkdirSync(cmdSkillPath, { recursive: true });
|
|
272
|
-
fs.copyFileSync(
|
|
273
|
-
path.join(srcCommands, cmd),
|
|
274
|
-
path.join(cmdSkillPath, 'SKILL.md')
|
|
275
|
-
);
|
|
276
|
-
}
|
|
277
|
-
log(` ✓ Command skills installed`, colors.green);
|
|
275
|
+
// Copy src (ace-tools) into agile-context-engineering/
|
|
276
|
+
if (fs.existsSync(srcTools)) {
|
|
277
|
+
copyDir(srcTools, path.join(acePath, 'src'), runtime);
|
|
278
|
+
log(` ✓ Tools installed`, colors.green);
|
|
278
279
|
}
|
|
279
280
|
|
|
280
281
|
return basePath;
|
|
281
282
|
}
|
|
282
283
|
|
|
283
|
-
// Generate a combined skill file for Codex
|
|
284
|
-
function generateCodexSkill(srcCommands, srcAgents) {
|
|
285
|
-
let content = `# ACE - Agile Context Engineering
|
|
286
|
-
|
|
287
|
-
A spec-driven development system with Agile workflows.
|
|
288
|
-
|
|
289
|
-
## Description
|
|
290
|
-
|
|
291
|
-
ACE (Agile Context Engineering) helps you plan and execute projects using Agile methodology with epics, features, stories, and tasks.
|
|
292
|
-
|
|
293
|
-
## Commands
|
|
294
|
-
|
|
295
|
-
The following ACE commands are available:
|
|
296
|
-
|
|
297
|
-
- \`/ace:init\` - Initialize ACE in your project
|
|
298
|
-
- \`/ace:plan-project\` - Plan your project with epics and features
|
|
299
|
-
- \`/ace:plan-epic\` - Break an epic into features
|
|
300
|
-
- \`/ace:plan-feature\` - Break a feature into stories
|
|
301
|
-
- \`/ace:plan-story\` - Create a new user story
|
|
302
|
-
- \`/ace:refine-story\` - Prepare a story for execution
|
|
303
|
-
- \`/ace:execute-story\` - Execute a story with atomic commits
|
|
304
|
-
- \`/ace:verify-story\` - Verify a completed story
|
|
305
|
-
|
|
306
|
-
## Workflow
|
|
307
|
-
|
|
308
|
-
\`\`\`
|
|
309
|
-
Epic → Feature → Story → Tasks
|
|
310
|
-
↓ ↓ ↓ ↓
|
|
311
|
-
Plan → Refine → Execute → Verify
|
|
312
|
-
\`\`\`
|
|
313
|
-
|
|
314
|
-
## Agile Hierarchy
|
|
315
|
-
|
|
316
|
-
- **Epic**: Large body of work (1-3 months)
|
|
317
|
-
- **Feature**: Deliverable functionality (1-2 sprints)
|
|
318
|
-
- **Story**: User-facing work item (1-3 days)
|
|
319
|
-
- **Task**: Atomic implementation step (30 min - 2 hours)
|
|
320
|
-
|
|
321
|
-
## Getting Started
|
|
322
|
-
|
|
323
|
-
1. Run \`/ace:init\` to initialize ACE in your project
|
|
324
|
-
2. Run \`/ace:plan-project\` to start planning
|
|
325
|
-
3. Break down work: epic → feature → story
|
|
326
|
-
4. Execute and verify stories
|
|
327
|
-
|
|
328
|
-
Each command has its own skill file with detailed instructions.
|
|
329
|
-
`;
|
|
330
|
-
|
|
331
|
-
return content;
|
|
332
|
-
}
|
|
333
|
-
|
|
334
|
-
// Install commands and agents for a specific runtime
|
|
335
|
-
function installForRuntime(runtime, scope, packageDir) {
|
|
336
|
-
if (runtime === 'codex') {
|
|
337
|
-
return installCodex(packageDir);
|
|
338
|
-
}
|
|
339
|
-
return installStandard(runtime, scope, packageDir);
|
|
340
|
-
}
|
|
341
|
-
|
|
342
284
|
// Main installation logic
|
|
343
285
|
async function main() {
|
|
344
286
|
const flags = parseArgs();
|
|
@@ -363,7 +305,7 @@ async function main() {
|
|
|
363
305
|
let scope = null;
|
|
364
306
|
|
|
365
307
|
// Check if non-interactive mode
|
|
366
|
-
const hasRuntimeFlag = flags.claude || flags.opencode || flags.
|
|
308
|
+
const hasRuntimeFlag = flags.claude || flags.opencode || flags.all;
|
|
367
309
|
const hasScopeFlag = flags.global || flags.local;
|
|
368
310
|
const isInteractive = !hasRuntimeFlag && !hasScopeFlag;
|
|
369
311
|
|
|
@@ -373,44 +315,27 @@ async function main() {
|
|
|
373
315
|
// Ask for runtime selection (multiple choice)
|
|
374
316
|
runtimes = await askMultiple(rl, '\nWhich runtime(s) do you want to install ACE for?', [
|
|
375
317
|
{ label: 'Claude Code', value: 'claude', description: "Anthropic's Claude Code CLI" },
|
|
376
|
-
{ label: '
|
|
377
|
-
{ label: 'Gemini CLI', value: 'gemini', description: "Google's Gemini CLI" },
|
|
378
|
-
{ label: 'Codex CLI', value: 'codex', description: "OpenAI's Codex CLI (global only)" },
|
|
318
|
+
{ label: 'Crush', value: 'opencode', description: 'Crush AI coding assistant (formerly OpenCode)' },
|
|
379
319
|
]);
|
|
380
320
|
|
|
381
|
-
//
|
|
382
|
-
|
|
383
|
-
|
|
384
|
-
|
|
385
|
-
|
|
386
|
-
scope = 'global';
|
|
387
|
-
log(`\nNote: Codex CLI only supports global installation.`, colors.yellow);
|
|
388
|
-
} else {
|
|
389
|
-
// Ask for scope
|
|
390
|
-
scope = await ask(rl, '\nWhere should ACE be installed?', [
|
|
391
|
-
{ label: 'Global', value: 'global', description: 'Install in home directory (~/.claude, ~/.gemini, etc.)' },
|
|
392
|
-
{ label: 'Local', value: 'local', description: 'Install in current project (.claude, .opencode, etc.)' },
|
|
393
|
-
]);
|
|
394
|
-
|
|
395
|
-
if (scope === 'local' && hasGlobalOnly) {
|
|
396
|
-
log(`\nNote: Codex CLI will be installed globally (doesn't support local).`, colors.yellow);
|
|
397
|
-
}
|
|
398
|
-
}
|
|
321
|
+
// Ask for scope
|
|
322
|
+
scope = await ask(rl, '\nWhere should ACE be installed?', [
|
|
323
|
+
{ label: 'Global', value: 'global', description: 'Install in home directory (~/.claude, ~/.opencode)' },
|
|
324
|
+
{ label: 'Local', value: 'local', description: 'Install in current project (.claude, .opencode)' },
|
|
325
|
+
]);
|
|
399
326
|
|
|
400
327
|
rl.close();
|
|
401
328
|
} else {
|
|
402
329
|
// Non-interactive mode
|
|
403
330
|
if (flags.all) {
|
|
404
|
-
runtimes = ['claude', 'opencode'
|
|
331
|
+
runtimes = ['claude', 'opencode'];
|
|
405
332
|
} else {
|
|
406
333
|
if (flags.claude) runtimes.push('claude');
|
|
407
334
|
if (flags.opencode) runtimes.push('opencode');
|
|
408
|
-
if (flags.gemini) runtimes.push('gemini');
|
|
409
|
-
if (flags.codex) runtimes.push('codex');
|
|
410
335
|
}
|
|
411
336
|
|
|
412
337
|
if (runtimes.length === 0) {
|
|
413
|
-
log('Error: No runtime specified. Use --claude, --opencode
|
|
338
|
+
log('Error: No runtime specified. Use --claude, --opencode (Crush), or --all', colors.red);
|
|
414
339
|
process.exit(1);
|
|
415
340
|
}
|
|
416
341
|
|
|
@@ -440,8 +365,19 @@ async function main() {
|
|
|
440
365
|
log(` ${name}: ${p}`, colors.dim);
|
|
441
366
|
}
|
|
442
367
|
|
|
368
|
+
log(`\nInstalled structure:`, colors.cyan);
|
|
369
|
+
for (const { name, path: p } of installedPaths) {
|
|
370
|
+
log(` ${p}/`, colors.dim);
|
|
371
|
+
log(` commands/ace/ Slash commands`, colors.dim);
|
|
372
|
+
log(` agents/ Agent definitions`, colors.dim);
|
|
373
|
+
log(` ${ACE_DIR_NAME}/`, colors.dim);
|
|
374
|
+
log(` templates/ Project & artifact templates`, colors.dim);
|
|
375
|
+
log(` utils/ Formatting & utility guides`, colors.dim);
|
|
376
|
+
log(` workflows/ Workflow definitions`, colors.dim);
|
|
377
|
+
}
|
|
378
|
+
|
|
443
379
|
log(`\nAvailable commands:`, colors.cyan);
|
|
444
|
-
log(` /ace:
|
|
380
|
+
log(` /ace:help Check project status and next steps`, colors.dim);
|
|
445
381
|
log(` /ace:plan-project Plan your project with epics and features`, colors.dim);
|
|
446
382
|
log(` /ace:plan-epic Plan an epic with features and stories`, colors.dim);
|
|
447
383
|
log(` /ace:plan-feature Plan a feature with stories`, colors.dim);
|
|
@@ -452,7 +388,7 @@ async function main() {
|
|
|
452
388
|
|
|
453
389
|
log(`\nGet started:`, colors.cyan);
|
|
454
390
|
log(` 1. Navigate to your project directory`, colors.dim);
|
|
455
|
-
log(` 2. Run /ace:
|
|
391
|
+
log(` 2. Run /ace:help to initialize ACE`, colors.dim);
|
|
456
392
|
log(` 3. Run /ace:plan-project to start planning\n`, colors.dim);
|
|
457
393
|
}
|
|
458
394
|
|
|
@@ -0,0 +1,137 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: ace:execute-story
|
|
3
|
+
description: Execute a fully-planned story — loads AC + Technical Solution, creates execution plan via Plan Mode, implements (solo or agent teams), runs code review, updates state, and triggers wiki mapping
|
|
4
|
+
argument-hint: "story=<file-path|github-url> [--agent-teams-off]"
|
|
5
|
+
allowed-tools:
|
|
6
|
+
- Read
|
|
7
|
+
- Bash
|
|
8
|
+
- Write
|
|
9
|
+
- Edit
|
|
10
|
+
- AskUserQuestion
|
|
11
|
+
- Glob
|
|
12
|
+
- Grep
|
|
13
|
+
- Agent
|
|
14
|
+
- EnterPlanMode
|
|
15
|
+
- ExitPlanMode
|
|
16
|
+
---
|
|
17
|
+
|
|
18
|
+
```xml
|
|
19
|
+
<command>
|
|
20
|
+
|
|
21
|
+
<execution-time>
|
|
22
|
+
<runs-after>
|
|
23
|
+
<trigger>After /ace:plan-story — once a story has AC + Technical Solution</trigger>
|
|
24
|
+
<trigger>Anytime — to execute a fully-planned story specification</trigger>
|
|
25
|
+
</runs-after>
|
|
26
|
+
<use-when>
|
|
27
|
+
<condition>A story has both Acceptance Criteria AND Technical Solution sections</condition>
|
|
28
|
+
<condition>Story status is "Refined" (ready for implementation)</condition>
|
|
29
|
+
</use-when>
|
|
30
|
+
</execution-time>
|
|
31
|
+
|
|
32
|
+
<input>
|
|
33
|
+
<flags>
|
|
34
|
+
<flag name="--agent-teams-off">
|
|
35
|
+
Force solo execution mode regardless of agent_teams setting.
|
|
36
|
+
Overrides the agent_teams flag in settings.json.
|
|
37
|
+
Use when you want single-context execution even if teams are enabled.
|
|
38
|
+
</flag>
|
|
39
|
+
</flags>
|
|
40
|
+
|
|
41
|
+
<parameters>
|
|
42
|
+
<required>
|
|
43
|
+
<param name="story" type="file | github-url">
|
|
44
|
+
Story source — can be either:
|
|
45
|
+
- **File path**: Path to a fully-planned story markdown file
|
|
46
|
+
(must have AC + Technical Solution sections)
|
|
47
|
+
- **GitHub URL or issue number**: GitHub story reference
|
|
48
|
+
Must be a valid, accessible file or GitHub issue.
|
|
49
|
+
The story MUST have been through /ace:plan-story (has AC + Technical Solution).
|
|
50
|
+
</param>
|
|
51
|
+
</required>
|
|
52
|
+
</parameters>
|
|
53
|
+
</input>
|
|
54
|
+
|
|
55
|
+
<execution-context>
|
|
56
|
+
<execute-story-workflow>@~/.claude/agile-context-engineering/workflows/execute-story.xml</execute-story-workflow>
|
|
57
|
+
<story-template>@~/.claude/agile-context-engineering/templates/product/story.xml</story-template>
|
|
58
|
+
<questioning>@~/.claude/agile-context-engineering/utils/questioning.xml</questioning>
|
|
59
|
+
<ui-formatting>@~/.claude/agile-context-engineering/utils/ui-formatting.md</ui-formatting>
|
|
60
|
+
</execution-context>
|
|
61
|
+
|
|
62
|
+
<output>
|
|
63
|
+
<objective>
|
|
64
|
+
Take a fully-planned story (with AC + Technical Solution) and:
|
|
65
|
+
1. Create an execution plan via Claude Code Plan Mode
|
|
66
|
+
2. Execute the plan — solo or with Agent Teams
|
|
67
|
+
3. Run code review (3-level verification, anti-pattern detection, coding standards)
|
|
68
|
+
4. Present results to user for verification/approval
|
|
69
|
+
5. Commit implementation (single commit after approval)
|
|
70
|
+
6. Update state: story file, feature file, product backlog, GitHub
|
|
71
|
+
7. Trigger wiki mapping (background) with tech debt integration
|
|
72
|
+
|
|
73
|
+
Two execution modes:
|
|
74
|
+
- **Solo Mode** (default or --agent-teams-off): Single context, plan mode → execute
|
|
75
|
+
- **Agent Teams Mode** (when enabled + plan recommends): Lead + teammates for parallel work
|
|
76
|
+
</objective>
|
|
77
|
+
|
|
78
|
+
<artifacts>
|
|
79
|
+
Story file updated with Summary & State section and Wiki Updates section.
|
|
80
|
+
Feature file updated with story status.
|
|
81
|
+
Product backlog updated with story (and possibly feature) status.
|
|
82
|
+
Wiki documents updated/created based on implementation changes.
|
|
83
|
+
</artifacts>
|
|
84
|
+
</output>
|
|
85
|
+
|
|
86
|
+
<process>
|
|
87
|
+
**STRICT WORKFLOW EXECUTION — Follow the execute-story workflow STEP BY STEP.
|
|
88
|
+
Do NOT skip steps. Do NOT improvise. Do NOT start reading code or planning
|
|
89
|
+
until step 1 (init & validate) is fully complete with the init command output parsed.**
|
|
90
|
+
|
|
91
|
+
Execute the execute-story workflow from
|
|
92
|
+
`@~/.claude/agile-context-engineering/workflows/execute-story.xml` end-to-end.
|
|
93
|
+
|
|
94
|
+
**MANDATORY FIRST ACTION: Run the init command (step 1.2) BEFORE doing anything else.
|
|
95
|
+
Do NOT read the story file manually. Do NOT explore the codebase. Do NOT start planning.
|
|
96
|
+
The init command validates the story and provides all paths and context needed.**
|
|
97
|
+
|
|
98
|
+
**CRITICAL REQUIREMENTS:**
|
|
99
|
+
- Story MUST have Acceptance Criteria — STOP if missing
|
|
100
|
+
- Story MUST have Technical Solution — STOP if missing
|
|
101
|
+
- NO intermediary commits during implementation
|
|
102
|
+
- ONE single commit per story after user approval (code + state + docs)
|
|
103
|
+
- Code review is MANDATORY — blockers must be fixed before approval
|
|
104
|
+
- Coding standards violations are BLOCKERS, not warnings
|
|
105
|
+
- Dead code and backwards-compatible shims must be DELETED
|
|
106
|
+
</process>
|
|
107
|
+
|
|
108
|
+
<example-usage>
|
|
109
|
+
```
|
|
110
|
+
# Execute a story from a file path
|
|
111
|
+
/ace:execute-story \
|
|
112
|
+
story=.ace/artifacts/product/e1-auth/f3-oauth/s1-buttons/s1-buttons.md
|
|
113
|
+
|
|
114
|
+
# Execute from a GitHub issue
|
|
115
|
+
/ace:execute-story \
|
|
116
|
+
story=https://github.com/owner/repo/issues/95
|
|
117
|
+
|
|
118
|
+
# Force solo mode (no agent teams)
|
|
119
|
+
/ace:execute-story \
|
|
120
|
+
story=.ace/artifacts/product/e1-auth/f3-oauth/s1-buttons/s1-buttons.md \
|
|
121
|
+
--agent-teams-off
|
|
122
|
+
|
|
123
|
+
# With just an issue number
|
|
124
|
+
/ace:execute-story story=#95
|
|
125
|
+
```
|
|
126
|
+
</example-usage>
|
|
127
|
+
|
|
128
|
+
<next-steps>
|
|
129
|
+
**After this command:**
|
|
130
|
+
- `/ace:execute-story story=...` — Execute the next story in the feature
|
|
131
|
+
- `/ace:review-story story=...` — Re-run code review (standalone)
|
|
132
|
+
- `/ace:plan-story story=...` — Plan the next story
|
|
133
|
+
- `/ace:help` — Check project status
|
|
134
|
+
</next-steps>
|
|
135
|
+
|
|
136
|
+
</command>
|
|
137
|
+
```
|
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: ace:help
|
|
3
|
+
description: Check project initialization status and suggest next steps
|
|
4
|
+
argument-hint: ""
|
|
5
|
+
allowed-tools:
|
|
6
|
+
- Read
|
|
7
|
+
- Bash
|
|
8
|
+
- Write
|
|
9
|
+
- AskUserQuestion
|
|
10
|
+
---
|
|
11
|
+
|
|
12
|
+
```xml
|
|
13
|
+
<command>
|
|
14
|
+
|
|
15
|
+
<execution-time>
|
|
16
|
+
<runs-after>
|
|
17
|
+
<trigger>At any time — to check which ACE documents exist and what to do next</trigger>
|
|
18
|
+
<trigger>At the start of a new project — to see the initialization checklist</trigger>
|
|
19
|
+
</runs-after>
|
|
20
|
+
<use-when>
|
|
21
|
+
<condition>Starting a new project and want to see what needs to be set up</condition>
|
|
22
|
+
<condition>Returning to a project and want to check initialization status</condition>
|
|
23
|
+
<condition>Unsure which ACE command to run next</condition>
|
|
24
|
+
</use-when>
|
|
25
|
+
</execution-time>
|
|
26
|
+
|
|
27
|
+
<input>
|
|
28
|
+
<flags>
|
|
29
|
+
</flags>
|
|
30
|
+
|
|
31
|
+
<parameters>
|
|
32
|
+
<required>
|
|
33
|
+
</required>
|
|
34
|
+
|
|
35
|
+
<optional>
|
|
36
|
+
</optional>
|
|
37
|
+
</parameters>
|
|
38
|
+
</input>
|
|
39
|
+
|
|
40
|
+
<execution-context>
|
|
41
|
+
<help-workflow>@~/.claude/agile-context-engineering/workflows/help.xml</help-workflow>
|
|
42
|
+
<questioning>@~/.claude/agile-context-engineering/utils/questioning.xml</questioning>
|
|
43
|
+
<ui-formatting>@~/.claude/agile-context-engineering/utils/ui-formatting.md</ui-formatting>
|
|
44
|
+
</execution-context>
|
|
45
|
+
|
|
46
|
+
<output>
|
|
47
|
+
<objective>
|
|
48
|
+
Detect which ACE documents exist (product vision, system architecture, system structure,
|
|
49
|
+
coding standards, testing framework). Display a status dashboard showing what's done
|
|
50
|
+
and what's missing. Suggest the next command to run based on gaps.
|
|
51
|
+
</objective>
|
|
52
|
+
|
|
53
|
+
<artifacts>
|
|
54
|
+
- .ace/settings.json (created on first run if missing)
|
|
55
|
+
</artifacts>
|
|
56
|
+
</output>
|
|
57
|
+
|
|
58
|
+
<process>
|
|
59
|
+
Execute the help workflow from
|
|
60
|
+
`@~/.claude/agile-context-engineering/workflows/help.xml` end-to-end.
|
|
61
|
+
This is a lightweight state-check and routing workflow.
|
|
62
|
+
|
|
63
|
+
CRITICAL MANDATORY STEP — DO NOT SKIP:
|
|
64
|
+
Before displaying the status dashboard, you MUST run:
|
|
65
|
+
```bash
|
|
66
|
+
node ~/.claude/agile-context-engineering/src/ace-tools.js sync-agent-teams --raw
|
|
67
|
+
```
|
|
68
|
+
Then you MUST use `AskUserQuestion` to ask the user whether they want to
|
|
69
|
+
enable or disable Claude Code Agent Teams (experimental feature).
|
|
70
|
+
This step is NOT optional. You MUST present this question every time.
|
|
71
|
+
|
|
72
|
+
When the user chooses to enable or disable Agent Teams, you MUST run the
|
|
73
|
+
bash command — NEVER directly edit .ace/settings.json or .claude/settings.json:
|
|
74
|
+
```bash
|
|
75
|
+
node ~/.claude/agile-context-engineering/src/ace-tools.js write-agent-teams true
|
|
76
|
+
```
|
|
77
|
+
or
|
|
78
|
+
```bash
|
|
79
|
+
node ~/.claude/agile-context-engineering/src/ace-tools.js write-agent-teams false
|
|
80
|
+
```
|
|
81
|
+
The write-agent-teams command updates BOTH .ace/settings.json AND .claude/settings.json.
|
|
82
|
+
Direct file edits will cause the two files to go out of sync.
|
|
83
|
+
</process>
|
|
84
|
+
|
|
85
|
+
<next-steps>
|
|
86
|
+
**Specialized commands for each document:**
|
|
87
|
+
- `/ace:plan-product-vision` — Create or update the product vision
|
|
88
|
+
- `/ace:map-system` — Map codebase structure, architecture, and testing framework
|
|
89
|
+
- `/ace:init-coding-standards` — Generate tailored coding standards
|
|
90
|
+
</next-steps>
|
|
91
|
+
|
|
92
|
+
</command>
|
|
93
|
+
```
|