agile-context-engineering 0.5.0 → 0.5.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/.claude-plugin/marketplace.json +18 -0
- package/.claude-plugin/plugin.json +1 -1
- package/CHANGELOG.md +7 -1
- package/README.md +16 -12
- package/agents/ace-code-discovery-analyst.md +245 -245
- package/agents/ace-code-integration-analyst.md +248 -248
- package/agents/ace-code-reviewer.md +375 -375
- package/agents/ace-product-owner.md +365 -361
- package/agents/ace-project-researcher.md +606 -606
- package/agents/ace-technical-application-architect.md +315 -315
- package/bin/install.js +587 -173
- package/hooks/ace-check-update.js +15 -14
- package/hooks/ace-statusline.js +30 -12
- package/hooks/hooks.json +14 -0
- package/package.json +3 -2
- package/shared/lib/ace-core.js +53 -0
- package/shared/lib/ace-core.test.js +308 -308
- package/shared/lib/ace-story.test.js +250 -250
- package/skills/execute-story/SKILL.md +116 -110
- package/skills/execute-story/script.js +13 -27
- package/skills/execute-story/script.test.js +261 -261
- package/skills/execute-story/story-template.xml +451 -451
- package/skills/execute-story/workflow.xml +3 -1
- package/skills/help/SKILL.md +71 -69
- package/skills/help/script.js +32 -35
- package/skills/help/script.test.js +183 -183
- package/skills/help/workflow.xml +14 -3
- package/skills/init-coding-standards/SKILL.md +91 -72
- package/skills/init-coding-standards/coding-standards-template.xml +531 -531
- package/skills/init-coding-standards/script.js +50 -59
- package/skills/init-coding-standards/script.test.js +70 -70
- package/skills/init-coding-standards/workflow.xml +1 -1
- package/skills/map-cross-cutting/SKILL.md +126 -89
- package/skills/map-cross-cutting/workflow.xml +1 -1
- package/skills/map-guide/SKILL.md +126 -89
- package/skills/map-guide/workflow.xml +1 -1
- package/skills/map-pattern/SKILL.md +125 -89
- package/skills/map-pattern/workflow.xml +1 -1
- package/skills/map-story/SKILL.md +180 -127
- package/skills/map-story/templates/tech-debt-index.xml +125 -125
- package/skills/map-story/workflow.xml +2 -2
- package/skills/map-subsystem/SKILL.md +155 -111
- package/skills/map-subsystem/script.js +51 -60
- package/skills/map-subsystem/script.test.js +68 -68
- package/skills/map-subsystem/templates/subsystem-architecture.xml +343 -343
- package/skills/map-subsystem/templates/subsystem-structure.xml +234 -234
- package/skills/map-subsystem/workflow.xml +1173 -1173
- package/skills/map-sys-doc/SKILL.md +125 -90
- package/skills/map-sys-doc/workflow.xml +1 -1
- package/skills/map-system/SKILL.md +103 -85
- package/skills/map-system/script.js +75 -84
- package/skills/map-system/script.test.js +73 -73
- package/skills/map-system/templates/system-structure.xml +177 -177
- package/skills/map-system/templates/testing-framework.xml +283 -283
- package/skills/map-system/workflow.xml +667 -667
- package/skills/map-walkthrough/SKILL.md +140 -92
- package/skills/map-walkthrough/workflow.xml +457 -457
- package/skills/plan-backlog/SKILL.md +93 -75
- package/skills/plan-backlog/script.js +121 -136
- package/skills/plan-backlog/script.test.js +83 -83
- package/skills/plan-backlog/workflow.xml +1348 -1348
- package/skills/plan-feature/SKILL.md +99 -76
- package/skills/plan-feature/feature-template.xml +361 -361
- package/skills/plan-feature/script.js +131 -148
- package/skills/plan-feature/script.test.js +80 -80
- package/skills/plan-feature/workflow.xml +1 -1
- package/skills/plan-product-vision/SKILL.md +91 -75
- package/skills/plan-product-vision/product-vision-template.xml +227 -227
- package/skills/plan-product-vision/script.js +51 -60
- package/skills/plan-product-vision/script.test.js +69 -69
- package/skills/plan-product-vision/workflow.xml +337 -337
- package/skills/plan-story/SKILL.md +125 -102
- package/skills/plan-story/script.js +18 -49
- package/skills/plan-story/story-template.xml +8 -1
- package/skills/plan-story/workflow.xml +17 -1
- package/skills/research-external-solution/SKILL.md +120 -107
- package/skills/research-external-solution/external-solution-template.xml +832 -832
- package/skills/research-external-solution/script.js +229 -238
- package/skills/research-external-solution/script.test.js +134 -134
- package/skills/research-external-solution/workflow.xml +657 -657
- package/skills/research-integration-solution/SKILL.md +121 -98
- package/skills/research-integration-solution/integration-solution-template.xml +1015 -1015
- package/skills/research-integration-solution/script.js +223 -231
- package/skills/research-integration-solution/script.test.js +134 -134
- package/skills/research-integration-solution/workflow.xml +711 -711
- package/skills/research-story-wiki/SKILL.md +101 -92
- package/skills/research-story-wiki/script.js +223 -231
- package/skills/research-story-wiki/script.test.js +138 -138
- package/skills/research-story-wiki/story-wiki-template.xml +194 -194
- package/skills/research-story-wiki/workflow.xml +473 -473
- package/skills/research-technical-solution/SKILL.md +131 -103
- package/skills/research-technical-solution/script.js +223 -231
- package/skills/research-technical-solution/script.test.js +134 -134
- package/skills/research-technical-solution/technical-solution-template.xml +1025 -1025
- package/skills/research-technical-solution/workflow.xml +761 -761
- package/skills/review-story/SKILL.md +99 -100
- package/skills/review-story/script.js +8 -16
- package/skills/review-story/script.test.js +169 -169
- package/skills/review-story/story-template.xml +451 -451
- package/skills/review-story/workflow.xml +1 -1
- package/skills/update/SKILL.md +65 -53
- package/skills/update/workflow.xml +21 -5
|
@@ -7,17 +7,24 @@ const path = require('path');
|
|
|
7
7
|
const os = require('os');
|
|
8
8
|
const { spawn } = require('child_process');
|
|
9
9
|
|
|
10
|
+
// Use CLAUDE_PLUGIN_DATA for persistent cache (survives plugin updates)
|
|
11
|
+
// Use CLAUDE_PLUGIN_ROOT to find the bundled VERSION file
|
|
12
|
+
const pluginData = process.env.CLAUDE_PLUGIN_DATA;
|
|
13
|
+
const pluginRoot = process.env.CLAUDE_PLUGIN_ROOT;
|
|
14
|
+
|
|
15
|
+
// Fallback for legacy standalone installs
|
|
10
16
|
const homeDir = os.homedir();
|
|
11
17
|
const cwd = process.cwd();
|
|
12
|
-
|
|
18
|
+
|
|
19
|
+
const cacheDir = pluginData || path.join(homeDir, '.claude', 'cache');
|
|
13
20
|
const cacheFile = path.join(cacheDir, 'ace-update-check.json');
|
|
14
21
|
|
|
15
|
-
// VERSION file
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
22
|
+
// VERSION file: prefer plugin root, then legacy locations
|
|
23
|
+
const versionFiles = [
|
|
24
|
+
pluginRoot ? path.join(pluginRoot, 'shared', 'VERSION') : null,
|
|
25
|
+
path.join(cwd, '.claude', 'shared', 'VERSION'),
|
|
26
|
+
path.join(homeDir, '.claude', 'shared', 'VERSION'),
|
|
27
|
+
].filter(Boolean);
|
|
21
28
|
|
|
22
29
|
// Ensure cache directory exists
|
|
23
30
|
if (!fs.existsSync(cacheDir)) {
|
|
@@ -30,14 +37,8 @@ const child = spawn(process.execPath, ['-e', `
|
|
|
30
37
|
const { execSync } = require('child_process');
|
|
31
38
|
|
|
32
39
|
const cacheFile = ${JSON.stringify(cacheFile)};
|
|
33
|
-
const versionFiles =
|
|
34
|
-
${JSON.stringify(projectVersionFile)},
|
|
35
|
-
${JSON.stringify(globalVersionFile)},
|
|
36
|
-
${JSON.stringify(legacyProjectVersionFile)},
|
|
37
|
-
${JSON.stringify(legacyGlobalVersionFile)},
|
|
38
|
-
];
|
|
40
|
+
const versionFiles = ${JSON.stringify(versionFiles)};
|
|
39
41
|
|
|
40
|
-
// Check new paths first, then legacy
|
|
41
42
|
let installed = '0.0.0';
|
|
42
43
|
try {
|
|
43
44
|
for (const vf of versionFiles) {
|
package/hooks/ace-statusline.js
CHANGED
|
@@ -5,6 +5,7 @@
|
|
|
5
5
|
const fs = require('fs');
|
|
6
6
|
const path = require('path');
|
|
7
7
|
const os = require('os');
|
|
8
|
+
const { execSync } = require('child_process');
|
|
8
9
|
|
|
9
10
|
// Read JSON from stdin
|
|
10
11
|
let input = '';
|
|
@@ -43,7 +44,7 @@ process.stdin.on('end', () => {
|
|
|
43
44
|
}
|
|
44
45
|
}
|
|
45
46
|
|
|
46
|
-
// Current task from todos
|
|
47
|
+
// Current task from todos (Claude Code internal directory — always ~/.claude/)
|
|
47
48
|
let task = '';
|
|
48
49
|
const homeDir = os.homedir();
|
|
49
50
|
const todosDir = path.join(homeDir, '.claude', 'todos');
|
|
@@ -64,24 +65,41 @@ process.stdin.on('end', () => {
|
|
|
64
65
|
} catch (e) {}
|
|
65
66
|
}
|
|
66
67
|
|
|
67
|
-
// ACE update available?
|
|
68
|
+
// ACE update available? Check plugin data dir first, then legacy location
|
|
68
69
|
let aceUpdate = '';
|
|
69
|
-
const
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
70
|
+
const pluginData = process.env.CLAUDE_PLUGIN_DATA;
|
|
71
|
+
const cacheLocations = [
|
|
72
|
+
pluginData ? path.join(pluginData, 'ace-update-check.json') : null,
|
|
73
|
+
path.join(homeDir, '.claude', 'cache', 'ace-update-check.json'),
|
|
74
|
+
].filter(Boolean);
|
|
75
|
+
|
|
76
|
+
for (const cacheFile of cacheLocations) {
|
|
77
|
+
if (fs.existsSync(cacheFile)) {
|
|
78
|
+
try {
|
|
79
|
+
const cache = JSON.parse(fs.readFileSync(cacheFile, 'utf8'));
|
|
80
|
+
if (cache.update_available) {
|
|
81
|
+
aceUpdate = '\x1b[33m\u2B06 /ace:update\x1b[0m \u2502 ';
|
|
82
|
+
}
|
|
83
|
+
break;
|
|
84
|
+
} catch (e) {}
|
|
85
|
+
}
|
|
77
86
|
}
|
|
78
87
|
|
|
88
|
+
// Git branch
|
|
89
|
+
let branch = '';
|
|
90
|
+
try {
|
|
91
|
+
const raw = execSync('git rev-parse --abbrev-ref HEAD', { cwd: dir, encoding: 'utf8', timeout: 2000, stdio: ['pipe', 'pipe', 'pipe'], windowsHide: true }).trim();
|
|
92
|
+
if (raw && raw !== 'HEAD') {
|
|
93
|
+
branch = ` \x1b[36m\u2387 ${raw}\x1b[0m`;
|
|
94
|
+
}
|
|
95
|
+
} catch {}
|
|
96
|
+
|
|
79
97
|
// Output
|
|
80
98
|
const dirname = path.basename(dir);
|
|
81
99
|
if (task) {
|
|
82
|
-
process.stdout.write(`${aceUpdate}\x1b[2m${model}\x1b[0m \u2502 \x1b[1m${task}\x1b[0m \u2502 \x1b[2m${dirname}\x1b[0m${ctx}`);
|
|
100
|
+
process.stdout.write(`${aceUpdate}\x1b[2m${model}\x1b[0m \u2502 \x1b[1m${task}\x1b[0m \u2502 \x1b[2m${dirname}\x1b[0m${branch}${ctx}`);
|
|
83
101
|
} else {
|
|
84
|
-
process.stdout.write(`${aceUpdate}\x1b[2m${model}\x1b[0m \u2502 \x1b[2m${dirname}\x1b[0m${ctx}`);
|
|
102
|
+
process.stdout.write(`${aceUpdate}\x1b[2m${model}\x1b[0m \u2502 \x1b[2m${dirname}\x1b[0m${branch}${ctx}`);
|
|
85
103
|
}
|
|
86
104
|
} catch (e) {
|
|
87
105
|
// Silent fail - don't break statusline on parse errors
|
package/hooks/hooks.json
ADDED
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "agile-context-engineering",
|
|
3
|
-
"version": "0.5.
|
|
4
|
-
"description": "ACE - Agile Context Engineering:
|
|
3
|
+
"version": "0.5.1",
|
|
4
|
+
"description": "ACE - Agile Context Engineering: a spec-driven development system for Claude Code, Codex, and Crush with Agile workflows",
|
|
5
5
|
"main": "index.js",
|
|
6
6
|
"bin": {
|
|
7
7
|
"agile-context-engineering": "bin/install.js",
|
|
@@ -21,6 +21,7 @@
|
|
|
21
21
|
},
|
|
22
22
|
"keywords": [
|
|
23
23
|
"claude-code",
|
|
24
|
+
"codex",
|
|
24
25
|
"crush",
|
|
25
26
|
"opencode",
|
|
26
27
|
"anthropic",
|
package/shared/lib/ace-core.js
CHANGED
|
@@ -270,6 +270,57 @@ function parseKeyValueArgs(args) {
|
|
|
270
270
|
return result;
|
|
271
271
|
}
|
|
272
272
|
|
|
273
|
+
/**
|
|
274
|
+
* Parse raw skill init args into a structured object.
|
|
275
|
+
* Handles key=value params, flags (--name), and positional args.
|
|
276
|
+
* ALL skill script.js files MUST use this for argument parsing.
|
|
277
|
+
*
|
|
278
|
+
* Returns: { story: '...', text: '...', _flags: ['--agent-teams-off'], _positional: '...' }
|
|
279
|
+
*/
|
|
280
|
+
function parseSkillArgs(rawArgs) {
|
|
281
|
+
const args = rawArgs.filter(a => a !== '--raw');
|
|
282
|
+
const flags = args.filter(a => a.startsWith('--'));
|
|
283
|
+
const params = args.filter(a => !a.startsWith('--'));
|
|
284
|
+
const hasKeyValue = params.some(a => a.includes('='));
|
|
285
|
+
|
|
286
|
+
const result = { _flags: flags };
|
|
287
|
+
|
|
288
|
+
if (hasKeyValue) {
|
|
289
|
+
Object.assign(result, parseKeyValueArgs(params));
|
|
290
|
+
} else if (params.length > 0) {
|
|
291
|
+
result._positional = params.join(' ');
|
|
292
|
+
}
|
|
293
|
+
|
|
294
|
+
return result;
|
|
295
|
+
}
|
|
296
|
+
|
|
297
|
+
/**
|
|
298
|
+
* Shared CLI dispatch for all skill scripts.
|
|
299
|
+
* Parses process.argv, extracts --raw, parses key=value args, and routes to handlers.
|
|
300
|
+
* ALL skill script.js files MUST use this — no manual arg parsing.
|
|
301
|
+
*
|
|
302
|
+
* Handlers receive (cwd, raw, args, parsed):
|
|
303
|
+
* cwd — process.cwd()
|
|
304
|
+
* raw — boolean, --raw flag present
|
|
305
|
+
* args — raw arg array (after command name, --raw stripped)
|
|
306
|
+
* parsed — parseSkillArgs result: { story: '...', _flags: [...], _positional: '...' }
|
|
307
|
+
*/
|
|
308
|
+
function runSkillScript(handlers) {
|
|
309
|
+
const cwd = process.cwd();
|
|
310
|
+
const allArgs = process.argv.slice(2);
|
|
311
|
+
const raw = allArgs.includes('--raw');
|
|
312
|
+
const cmd = allArgs[0];
|
|
313
|
+
const restArgs = allArgs.slice(1).filter(a => a !== '--raw');
|
|
314
|
+
const parsed = parseSkillArgs(allArgs.slice(1));
|
|
315
|
+
|
|
316
|
+
const handler = handlers[cmd];
|
|
317
|
+
if (!handler) {
|
|
318
|
+
error(`Unknown command: ${cmd}\nAvailable: ${Object.keys(handlers).join(', ')}`);
|
|
319
|
+
return;
|
|
320
|
+
}
|
|
321
|
+
handler(cwd, raw, restArgs, parsed);
|
|
322
|
+
}
|
|
323
|
+
|
|
273
324
|
/**
|
|
274
325
|
* Run a shell command and return trimmed stdout. Returns null on failure.
|
|
275
326
|
*/
|
|
@@ -304,5 +355,7 @@ module.exports = {
|
|
|
304
355
|
loadSettings,
|
|
305
356
|
writeSettings,
|
|
306
357
|
parseKeyValueArgs,
|
|
358
|
+
parseSkillArgs,
|
|
359
|
+
runSkillScript,
|
|
307
360
|
execCommand,
|
|
308
361
|
};
|