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.
Files changed (102) hide show
  1. package/.claude-plugin/marketplace.json +18 -0
  2. package/.claude-plugin/plugin.json +1 -1
  3. package/CHANGELOG.md +7 -1
  4. package/README.md +16 -12
  5. package/agents/ace-code-discovery-analyst.md +245 -245
  6. package/agents/ace-code-integration-analyst.md +248 -248
  7. package/agents/ace-code-reviewer.md +375 -375
  8. package/agents/ace-product-owner.md +365 -361
  9. package/agents/ace-project-researcher.md +606 -606
  10. package/agents/ace-technical-application-architect.md +315 -315
  11. package/bin/install.js +587 -173
  12. package/hooks/ace-check-update.js +15 -14
  13. package/hooks/ace-statusline.js +30 -12
  14. package/hooks/hooks.json +14 -0
  15. package/package.json +3 -2
  16. package/shared/lib/ace-core.js +53 -0
  17. package/shared/lib/ace-core.test.js +308 -308
  18. package/shared/lib/ace-story.test.js +250 -250
  19. package/skills/execute-story/SKILL.md +116 -110
  20. package/skills/execute-story/script.js +13 -27
  21. package/skills/execute-story/script.test.js +261 -261
  22. package/skills/execute-story/story-template.xml +451 -451
  23. package/skills/execute-story/workflow.xml +3 -1
  24. package/skills/help/SKILL.md +71 -69
  25. package/skills/help/script.js +32 -35
  26. package/skills/help/script.test.js +183 -183
  27. package/skills/help/workflow.xml +14 -3
  28. package/skills/init-coding-standards/SKILL.md +91 -72
  29. package/skills/init-coding-standards/coding-standards-template.xml +531 -531
  30. package/skills/init-coding-standards/script.js +50 -59
  31. package/skills/init-coding-standards/script.test.js +70 -70
  32. package/skills/init-coding-standards/workflow.xml +1 -1
  33. package/skills/map-cross-cutting/SKILL.md +126 -89
  34. package/skills/map-cross-cutting/workflow.xml +1 -1
  35. package/skills/map-guide/SKILL.md +126 -89
  36. package/skills/map-guide/workflow.xml +1 -1
  37. package/skills/map-pattern/SKILL.md +125 -89
  38. package/skills/map-pattern/workflow.xml +1 -1
  39. package/skills/map-story/SKILL.md +180 -127
  40. package/skills/map-story/templates/tech-debt-index.xml +125 -125
  41. package/skills/map-story/workflow.xml +2 -2
  42. package/skills/map-subsystem/SKILL.md +155 -111
  43. package/skills/map-subsystem/script.js +51 -60
  44. package/skills/map-subsystem/script.test.js +68 -68
  45. package/skills/map-subsystem/templates/subsystem-architecture.xml +343 -343
  46. package/skills/map-subsystem/templates/subsystem-structure.xml +234 -234
  47. package/skills/map-subsystem/workflow.xml +1173 -1173
  48. package/skills/map-sys-doc/SKILL.md +125 -90
  49. package/skills/map-sys-doc/workflow.xml +1 -1
  50. package/skills/map-system/SKILL.md +103 -85
  51. package/skills/map-system/script.js +75 -84
  52. package/skills/map-system/script.test.js +73 -73
  53. package/skills/map-system/templates/system-structure.xml +177 -177
  54. package/skills/map-system/templates/testing-framework.xml +283 -283
  55. package/skills/map-system/workflow.xml +667 -667
  56. package/skills/map-walkthrough/SKILL.md +140 -92
  57. package/skills/map-walkthrough/workflow.xml +457 -457
  58. package/skills/plan-backlog/SKILL.md +93 -75
  59. package/skills/plan-backlog/script.js +121 -136
  60. package/skills/plan-backlog/script.test.js +83 -83
  61. package/skills/plan-backlog/workflow.xml +1348 -1348
  62. package/skills/plan-feature/SKILL.md +99 -76
  63. package/skills/plan-feature/feature-template.xml +361 -361
  64. package/skills/plan-feature/script.js +131 -148
  65. package/skills/plan-feature/script.test.js +80 -80
  66. package/skills/plan-feature/workflow.xml +1 -1
  67. package/skills/plan-product-vision/SKILL.md +91 -75
  68. package/skills/plan-product-vision/product-vision-template.xml +227 -227
  69. package/skills/plan-product-vision/script.js +51 -60
  70. package/skills/plan-product-vision/script.test.js +69 -69
  71. package/skills/plan-product-vision/workflow.xml +337 -337
  72. package/skills/plan-story/SKILL.md +125 -102
  73. package/skills/plan-story/script.js +18 -49
  74. package/skills/plan-story/story-template.xml +8 -1
  75. package/skills/plan-story/workflow.xml +17 -1
  76. package/skills/research-external-solution/SKILL.md +120 -107
  77. package/skills/research-external-solution/external-solution-template.xml +832 -832
  78. package/skills/research-external-solution/script.js +229 -238
  79. package/skills/research-external-solution/script.test.js +134 -134
  80. package/skills/research-external-solution/workflow.xml +657 -657
  81. package/skills/research-integration-solution/SKILL.md +121 -98
  82. package/skills/research-integration-solution/integration-solution-template.xml +1015 -1015
  83. package/skills/research-integration-solution/script.js +223 -231
  84. package/skills/research-integration-solution/script.test.js +134 -134
  85. package/skills/research-integration-solution/workflow.xml +711 -711
  86. package/skills/research-story-wiki/SKILL.md +101 -92
  87. package/skills/research-story-wiki/script.js +223 -231
  88. package/skills/research-story-wiki/script.test.js +138 -138
  89. package/skills/research-story-wiki/story-wiki-template.xml +194 -194
  90. package/skills/research-story-wiki/workflow.xml +473 -473
  91. package/skills/research-technical-solution/SKILL.md +131 -103
  92. package/skills/research-technical-solution/script.js +223 -231
  93. package/skills/research-technical-solution/script.test.js +134 -134
  94. package/skills/research-technical-solution/technical-solution-template.xml +1025 -1025
  95. package/skills/research-technical-solution/workflow.xml +761 -761
  96. package/skills/review-story/SKILL.md +99 -100
  97. package/skills/review-story/script.js +8 -16
  98. package/skills/review-story/script.test.js +169 -169
  99. package/skills/review-story/story-template.xml +451 -451
  100. package/skills/review-story/workflow.xml +1 -1
  101. package/skills/update/SKILL.md +65 -53
  102. 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
- const cacheDir = path.join(homeDir, '.claude', 'cache');
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 locations (check project first, then global)
16
- // New plugin structure: shared/VERSION; legacy: agile-context-engineering/VERSION
17
- const projectVersionFile = path.join(cwd, '.claude', 'shared', 'VERSION');
18
- const globalVersionFile = path.join(homeDir, '.claude', 'shared', 'VERSION');
19
- const legacyProjectVersionFile = path.join(cwd, '.claude', 'agile-context-engineering', 'VERSION');
20
- const legacyGlobalVersionFile = path.join(homeDir, '.claude', 'agile-context-engineering', 'VERSION');
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) {
@@ -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 cacheFile = path.join(homeDir, '.claude', 'cache', 'ace-update-check.json');
70
- if (fs.existsSync(cacheFile)) {
71
- try {
72
- const cache = JSON.parse(fs.readFileSync(cacheFile, 'utf8'));
73
- if (cache.update_available) {
74
- aceUpdate = '\x1b[33m\u2B06 /ace:update\x1b[0m \u2502 ';
75
- }
76
- } catch (e) {}
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
@@ -0,0 +1,14 @@
1
+ {
2
+ "hooks": {
3
+ "SessionStart": [
4
+ {
5
+ "hooks": [
6
+ {
7
+ "type": "command",
8
+ "command": "node \"${CLAUDE_PLUGIN_ROOT}/hooks/ace-check-update.js\""
9
+ }
10
+ ]
11
+ }
12
+ ]
13
+ }
14
+ }
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "agile-context-engineering",
3
- "version": "0.5.0",
4
- "description": "ACE - Agile Context Engineering: A spec-driven development system for Claude Code and Crush (formerly OpenCode) with Agile workflows",
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",
@@ -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
  };