agile-context-engineering 0.3.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 (139) hide show
  1. package/.claude-plugin/marketplace.json +18 -0
  2. package/.claude-plugin/plugin.json +10 -0
  3. package/CHANGELOG.md +7 -1
  4. package/LICENSE +51 -51
  5. package/README.md +330 -318
  6. package/agents/ace-code-discovery-analyst.md +245 -245
  7. package/agents/ace-code-integration-analyst.md +248 -248
  8. package/agents/ace-code-reviewer.md +375 -375
  9. package/agents/ace-product-owner.md +365 -361
  10. package/agents/ace-project-researcher.md +606 -606
  11. package/agents/ace-research-synthesizer.md +228 -228
  12. package/agents/ace-technical-application-architect.md +315 -315
  13. package/agents/ace-wiki-mapper.md +449 -445
  14. package/bin/install.js +605 -195
  15. package/hooks/ace-check-update.js +71 -62
  16. package/hooks/ace-statusline.js +107 -89
  17. package/hooks/hooks.json +14 -0
  18. package/package.json +7 -5
  19. package/shared/lib/ace-core.js +361 -0
  20. package/shared/lib/ace-core.test.js +308 -0
  21. package/shared/lib/ace-github.js +753 -0
  22. package/shared/lib/ace-story.js +400 -0
  23. package/shared/lib/ace-story.test.js +250 -0
  24. package/{agile-context-engineering → shared}/utils/questioning.xml +110 -110
  25. package/{agile-context-engineering → shared}/utils/ui-formatting.md +299 -299
  26. package/{commands/ace/execute-story.md → skills/execute-story/SKILL.md} +116 -138
  27. package/skills/execute-story/script.js +291 -0
  28. package/skills/execute-story/script.test.js +261 -0
  29. package/{agile-context-engineering/templates/product/story.xml → skills/execute-story/story-template.xml} +451 -451
  30. package/skills/execute-story/walkthrough-template.xml +255 -0
  31. package/{agile-context-engineering/workflows/execute-story.xml → skills/execute-story/workflow.xml} +1221 -1219
  32. package/skills/help/SKILL.md +71 -0
  33. package/skills/help/script.js +315 -0
  34. package/skills/help/script.test.js +183 -0
  35. package/{agile-context-engineering/workflows/help.xml → skills/help/workflow.xml} +544 -533
  36. package/{commands/ace/init-coding-standards.md → skills/init-coding-standards/SKILL.md} +91 -83
  37. package/{agile-context-engineering/templates/wiki/coding-standards.xml → skills/init-coding-standards/coding-standards-template.xml} +531 -531
  38. package/skills/init-coding-standards/script.js +50 -0
  39. package/skills/init-coding-standards/script.test.js +70 -0
  40. package/{agile-context-engineering/workflows/init-coding-standards.xml → skills/init-coding-standards/workflow.xml} +381 -386
  41. package/skills/map-cross-cutting/SKILL.md +126 -0
  42. package/{agile-context-engineering/templates/wiki → skills/map-cross-cutting}/system-cross-cutting.xml +197 -197
  43. package/skills/map-cross-cutting/workflow.xml +330 -0
  44. package/skills/map-guide/SKILL.md +126 -0
  45. package/{agile-context-engineering/templates/wiki → skills/map-guide}/guide.xml +137 -137
  46. package/skills/map-guide/workflow.xml +320 -0
  47. package/skills/map-pattern/SKILL.md +125 -0
  48. package/{agile-context-engineering/templates/wiki → skills/map-pattern}/pattern.xml +159 -159
  49. package/skills/map-pattern/workflow.xml +331 -0
  50. package/{commands/ace/map-story.md → skills/map-story/SKILL.md} +180 -165
  51. package/{agile-context-engineering/templates/wiki → skills/map-story/templates}/decizions.xml +115 -115
  52. package/skills/map-story/templates/guide.xml +137 -0
  53. package/skills/map-story/templates/pattern.xml +159 -0
  54. package/skills/map-story/templates/system-cross-cutting.xml +197 -0
  55. package/{agile-context-engineering/templates/wiki → skills/map-story/templates}/system.xml +381 -381
  56. package/{agile-context-engineering/templates/wiki → skills/map-story/templates}/tech-debt-index.xml +125 -125
  57. package/{agile-context-engineering/templates/wiki → skills/map-story/templates}/walkthrough.xml +255 -255
  58. package/{agile-context-engineering/workflows/map-story.xml → skills/map-story/workflow.xml} +1046 -1046
  59. package/{commands/ace/map-subsystem.md → skills/map-subsystem/SKILL.md} +155 -140
  60. package/skills/map-subsystem/script.js +51 -0
  61. package/skills/map-subsystem/script.test.js +68 -0
  62. package/skills/map-subsystem/templates/decizions.xml +115 -0
  63. package/skills/map-subsystem/templates/guide.xml +137 -0
  64. package/{agile-context-engineering/templates/wiki → skills/map-subsystem/templates}/module-discovery.xml +174 -174
  65. package/skills/map-subsystem/templates/pattern.xml +159 -0
  66. package/{agile-context-engineering/templates/wiki → skills/map-subsystem/templates}/subsystem-architecture.xml +343 -343
  67. package/{agile-context-engineering/templates/wiki → skills/map-subsystem/templates}/subsystem-structure.xml +234 -234
  68. package/skills/map-subsystem/templates/system-cross-cutting.xml +197 -0
  69. package/skills/map-subsystem/templates/system.xml +381 -0
  70. package/skills/map-subsystem/templates/walkthrough.xml +255 -0
  71. package/{agile-context-engineering/workflows/map-subsystem.xml → skills/map-subsystem/workflow.xml} +1173 -1178
  72. package/skills/map-sys-doc/SKILL.md +125 -0
  73. package/skills/map-sys-doc/system.xml +381 -0
  74. package/skills/map-sys-doc/workflow.xml +336 -0
  75. package/{commands/ace/map-system.md → skills/map-system/SKILL.md} +103 -92
  76. package/skills/map-system/script.js +75 -0
  77. package/skills/map-system/script.test.js +73 -0
  78. package/{agile-context-engineering/templates/wiki → skills/map-system/templates}/system-architecture.xml +254 -254
  79. package/{agile-context-engineering/templates/wiki → skills/map-system/templates}/system-structure.xml +177 -177
  80. package/{agile-context-engineering/templates/wiki → skills/map-system/templates}/testing-framework.xml +283 -283
  81. package/{agile-context-engineering/templates/wiki → skills/map-system/templates}/wiki-readme.xml +296 -296
  82. package/{agile-context-engineering/workflows/map-system.xml → skills/map-system/workflow.xml} +667 -672
  83. package/{commands/ace/map-walkthrough.md → skills/map-walkthrough/SKILL.md} +140 -127
  84. package/skills/map-walkthrough/walkthrough.xml +255 -0
  85. package/{agile-context-engineering/workflows/map-walkthrough.xml → skills/map-walkthrough/workflow.xml} +457 -457
  86. package/{commands/ace/plan-backlog.md → skills/plan-backlog/SKILL.md} +93 -83
  87. package/{agile-context-engineering/templates/product/product-backlog.xml → skills/plan-backlog/product-backlog-template.xml} +231 -231
  88. package/skills/plan-backlog/script.js +121 -0
  89. package/skills/plan-backlog/script.test.js +83 -0
  90. package/{agile-context-engineering/workflows/plan-backlog.xml → skills/plan-backlog/workflow.xml} +1348 -1356
  91. package/{commands/ace/plan-feature.md → skills/plan-feature/SKILL.md} +99 -89
  92. package/{agile-context-engineering/templates/product/feature.xml → skills/plan-feature/feature-template.xml} +361 -361
  93. package/skills/plan-feature/script.js +131 -0
  94. package/skills/plan-feature/script.test.js +80 -0
  95. package/{agile-context-engineering/workflows/plan-feature.xml → skills/plan-feature/workflow.xml} +1487 -1495
  96. package/{commands/ace/plan-product-vision.md → skills/plan-product-vision/SKILL.md} +91 -81
  97. package/{agile-context-engineering/templates/product/product-vision.xml → skills/plan-product-vision/product-vision-template.xml} +227 -227
  98. package/skills/plan-product-vision/script.js +51 -0
  99. package/skills/plan-product-vision/script.test.js +69 -0
  100. package/{agile-context-engineering/workflows/plan-product-vision.xml → skills/plan-product-vision/workflow.xml} +337 -342
  101. package/{commands/ace/plan-story.md → skills/plan-story/SKILL.md} +139 -159
  102. package/skills/plan-story/script.js +295 -0
  103. package/skills/plan-story/script.test.js +240 -0
  104. package/skills/plan-story/story-template.xml +458 -0
  105. package/{agile-context-engineering/workflows/plan-story.xml → skills/plan-story/workflow.xml} +1301 -944
  106. package/{commands/ace/research-external-solution.md → skills/research-external-solution/SKILL.md} +120 -138
  107. package/{agile-context-engineering/templates/product/external-solution.xml → skills/research-external-solution/external-solution-template.xml} +832 -832
  108. package/skills/research-external-solution/script.js +229 -0
  109. package/skills/research-external-solution/script.test.js +134 -0
  110. package/{agile-context-engineering/workflows/research-external-solution.xml → skills/research-external-solution/workflow.xml} +657 -659
  111. package/{commands/ace/research-integration-solution.md → skills/research-integration-solution/SKILL.md} +121 -135
  112. package/{agile-context-engineering/templates/product/story-integration-solution.xml → skills/research-integration-solution/integration-solution-template.xml} +1015 -1015
  113. package/skills/research-integration-solution/script.js +223 -0
  114. package/skills/research-integration-solution/script.test.js +134 -0
  115. package/{agile-context-engineering/workflows/research-integration-solution.xml → skills/research-integration-solution/workflow.xml} +711 -713
  116. package/{commands/ace/research-story-wiki.md → skills/research-story-wiki/SKILL.md} +101 -116
  117. package/skills/research-story-wiki/script.js +223 -0
  118. package/skills/research-story-wiki/script.test.js +138 -0
  119. package/{agile-context-engineering/templates/product/story-wiki.xml → skills/research-story-wiki/story-wiki-template.xml} +194 -194
  120. package/{agile-context-engineering/workflows/research-story-wiki.xml → skills/research-story-wiki/workflow.xml} +473 -475
  121. package/{commands/ace/research-technical-solution.md → skills/research-technical-solution/SKILL.md} +131 -147
  122. package/skills/research-technical-solution/script.js +223 -0
  123. package/skills/research-technical-solution/script.test.js +134 -0
  124. package/{agile-context-engineering/templates/product/story-technical-solution.xml → skills/research-technical-solution/technical-solution-template.xml} +1025 -1025
  125. package/{agile-context-engineering/workflows/research-technical-solution.xml → skills/research-technical-solution/workflow.xml} +761 -763
  126. package/{commands/ace/review-story.md → skills/review-story/SKILL.md} +99 -109
  127. package/skills/review-story/script.js +249 -0
  128. package/skills/review-story/script.test.js +169 -0
  129. package/skills/review-story/story-template.xml +451 -0
  130. package/{agile-context-engineering/workflows/review-story.xml → skills/review-story/workflow.xml} +279 -281
  131. package/{commands/ace/update.md → skills/update/SKILL.md} +65 -56
  132. package/{agile-context-engineering/workflows/update.xml → skills/update/workflow.xml} +33 -18
  133. package/agile-context-engineering/src/ace-tools.js +0 -2881
  134. package/agile-context-engineering/src/ace-tools.test.js +0 -1089
  135. package/agile-context-engineering/templates/_command.md +0 -54
  136. package/agile-context-engineering/templates/_workflow.xml +0 -17
  137. package/agile-context-engineering/templates/config.json +0 -0
  138. package/agile-context-engineering/templates/product/integration-solution.xml +0 -0
  139. package/commands/ace/help.md +0 -93
@@ -1,62 +1,71 @@
1
- #!/usr/bin/env node
2
- // Check for ACE updates in background, write result to cache
3
- // Called by SessionStart hook - runs once per session
4
-
5
- const fs = require('fs');
6
- const path = require('path');
7
- const os = require('os');
8
- const { spawn } = require('child_process');
9
-
10
- const homeDir = os.homedir();
11
- const cwd = process.cwd();
12
- const cacheDir = path.join(homeDir, '.claude', 'cache');
13
- const cacheFile = path.join(cacheDir, 'ace-update-check.json');
14
-
15
- // VERSION file locations (check project first, then global)
16
- const projectVersionFile = path.join(cwd, '.claude', 'agile-context-engineering', 'VERSION');
17
- const globalVersionFile = path.join(homeDir, '.claude', 'agile-context-engineering', 'VERSION');
18
-
19
- // Ensure cache directory exists
20
- if (!fs.existsSync(cacheDir)) {
21
- fs.mkdirSync(cacheDir, { recursive: true });
22
- }
23
-
24
- // Run check in background (spawn detached process, windowsHide prevents console flash)
25
- const child = spawn(process.execPath, ['-e', `
26
- const fs = require('fs');
27
- const { execSync } = require('child_process');
28
-
29
- const cacheFile = ${JSON.stringify(cacheFile)};
30
- const projectVersionFile = ${JSON.stringify(projectVersionFile)};
31
- const globalVersionFile = ${JSON.stringify(globalVersionFile)};
32
-
33
- // Check project directory first (local install), then global
34
- let installed = '0.0.0';
35
- try {
36
- if (fs.existsSync(projectVersionFile)) {
37
- installed = fs.readFileSync(projectVersionFile, 'utf8').trim();
38
- } else if (fs.existsSync(globalVersionFile)) {
39
- installed = fs.readFileSync(globalVersionFile, 'utf8').trim();
40
- }
41
- } catch (e) {}
42
-
43
- let latest = null;
44
- try {
45
- latest = execSync('npm view agile-context-engineering version', { encoding: 'utf8', timeout: 10000, windowsHide: true }).trim();
46
- } catch (e) {}
47
-
48
- const result = {
49
- update_available: latest && installed !== latest,
50
- installed,
51
- latest: latest || 'unknown',
52
- checked: Math.floor(Date.now() / 1000)
53
- };
54
-
55
- fs.writeFileSync(cacheFile, JSON.stringify(result));
56
- `], {
57
- stdio: 'ignore',
58
- windowsHide: true,
59
- detached: true
60
- });
61
-
62
- child.unref();
1
+ #!/usr/bin/env node
2
+ // Check for ACE updates in background, write result to cache
3
+ // Called by SessionStart hook - runs once per session
4
+
5
+ const fs = require('fs');
6
+ const path = require('path');
7
+ const os = require('os');
8
+ const { spawn } = require('child_process');
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
16
+ const homeDir = os.homedir();
17
+ const cwd = process.cwd();
18
+
19
+ const cacheDir = pluginData || path.join(homeDir, '.claude', 'cache');
20
+ const cacheFile = path.join(cacheDir, 'ace-update-check.json');
21
+
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);
28
+
29
+ // Ensure cache directory exists
30
+ if (!fs.existsSync(cacheDir)) {
31
+ fs.mkdirSync(cacheDir, { recursive: true });
32
+ }
33
+
34
+ // Run check in background (spawn detached process, windowsHide prevents console flash)
35
+ const child = spawn(process.execPath, ['-e', `
36
+ const fs = require('fs');
37
+ const { execSync } = require('child_process');
38
+
39
+ const cacheFile = ${JSON.stringify(cacheFile)};
40
+ const versionFiles = ${JSON.stringify(versionFiles)};
41
+
42
+ let installed = '0.0.0';
43
+ try {
44
+ for (const vf of versionFiles) {
45
+ if (fs.existsSync(vf)) {
46
+ installed = fs.readFileSync(vf, 'utf8').trim();
47
+ break;
48
+ }
49
+ }
50
+ } catch (e) {}
51
+
52
+ let latest = null;
53
+ try {
54
+ latest = execSync('npm view agile-context-engineering version', { encoding: 'utf8', timeout: 10000, windowsHide: true }).trim();
55
+ } catch (e) {}
56
+
57
+ const result = {
58
+ update_available: latest && installed !== latest,
59
+ installed,
60
+ latest: latest || 'unknown',
61
+ checked: Math.floor(Date.now() / 1000)
62
+ };
63
+
64
+ fs.writeFileSync(cacheFile, JSON.stringify(result));
65
+ `], {
66
+ stdio: 'ignore',
67
+ windowsHide: true,
68
+ detached: true
69
+ });
70
+
71
+ child.unref();
@@ -1,89 +1,107 @@
1
- #!/usr/bin/env node
2
- // Claude Code Statusline - ACE Edition
3
- // Shows: update indicator | model | current task | directory | context usage
4
-
5
- const fs = require('fs');
6
- const path = require('path');
7
- const os = require('os');
8
-
9
- // Read JSON from stdin
10
- let input = '';
11
- process.stdin.setEncoding('utf8');
12
- process.stdin.on('data', chunk => input += chunk);
13
- process.stdin.on('end', () => {
14
- try {
15
- const data = JSON.parse(input);
16
- const model = data.model?.display_name || 'Claude';
17
- const dir = data.workspace?.current_dir || process.cwd();
18
- const session = data.session_id || '';
19
- const remaining = data.context_window?.remaining_percentage;
20
-
21
- // Context window display (shows USED percentage scaled to 80% limit)
22
- // Claude Code enforces an 80% context limit, so we scale to show 100% at that point
23
- let ctx = '';
24
- if (remaining != null) {
25
- const rem = Math.round(remaining);
26
- const rawUsed = Math.max(0, Math.min(100, 100 - rem));
27
- // Scale: 80% real usage = 100% displayed
28
- const used = Math.min(100, Math.round((rawUsed / 80) * 100));
29
-
30
- // Build progress bar (10 segments)
31
- const filled = Math.floor(used / 10);
32
- const bar = '\u2588'.repeat(filled) + '\u2591'.repeat(10 - filled);
33
-
34
- // Color based on scaled usage
35
- if (used < 63) {
36
- ctx = ` \x1b[32m${bar} ${used}%\x1b[0m`;
37
- } else if (used < 81) {
38
- ctx = ` \x1b[33m${bar} ${used}%\x1b[0m`;
39
- } else if (used < 95) {
40
- ctx = ` \x1b[38;5;208m${bar} ${used}%\x1b[0m`;
41
- } else {
42
- ctx = ` \x1b[5;31m\u{1F480} ${bar} ${used}%\x1b[0m`;
43
- }
44
- }
45
-
46
- // Current task from todos
47
- let task = '';
48
- const homeDir = os.homedir();
49
- const todosDir = path.join(homeDir, '.claude', 'todos');
50
- if (session && fs.existsSync(todosDir)) {
51
- try {
52
- const files = fs.readdirSync(todosDir)
53
- .filter(f => f.startsWith(session) && f.includes('-agent-') && f.endsWith('.json'))
54
- .map(f => ({ name: f, mtime: fs.statSync(path.join(todosDir, f)).mtime }))
55
- .sort((a, b) => b.mtime - a.mtime);
56
-
57
- if (files.length > 0) {
58
- try {
59
- const todos = JSON.parse(fs.readFileSync(path.join(todosDir, files[0].name), 'utf8'));
60
- const inProgress = todos.find(t => t.status === 'in_progress');
61
- if (inProgress) task = inProgress.activeForm || '';
62
- } catch (e) {}
63
- }
64
- } catch (e) {}
65
- }
66
-
67
- // ACE update available?
68
- 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) {}
77
- }
78
-
79
- // Output
80
- const dirname = path.basename(dir);
81
- 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}`);
83
- } else {
84
- process.stdout.write(`${aceUpdate}\x1b[2m${model}\x1b[0m \u2502 \x1b[2m${dirname}\x1b[0m${ctx}`);
85
- }
86
- } catch (e) {
87
- // Silent fail - don't break statusline on parse errors
88
- }
89
- });
1
+ #!/usr/bin/env node
2
+ // Claude Code Statusline - ACE Edition
3
+ // Shows: update indicator | model | current task | directory | context usage
4
+
5
+ const fs = require('fs');
6
+ const path = require('path');
7
+ const os = require('os');
8
+ const { execSync } = require('child_process');
9
+
10
+ // Read JSON from stdin
11
+ let input = '';
12
+ process.stdin.setEncoding('utf8');
13
+ process.stdin.on('data', chunk => input += chunk);
14
+ process.stdin.on('end', () => {
15
+ try {
16
+ const data = JSON.parse(input);
17
+ const model = data.model?.display_name || 'Claude';
18
+ const dir = data.workspace?.current_dir || process.cwd();
19
+ const session = data.session_id || '';
20
+ const remaining = data.context_window?.remaining_percentage;
21
+
22
+ // Context window display (shows USED percentage scaled to 80% limit)
23
+ // Claude Code enforces an 80% context limit, so we scale to show 100% at that point
24
+ let ctx = '';
25
+ if (remaining != null) {
26
+ const rem = Math.round(remaining);
27
+ const rawUsed = Math.max(0, Math.min(100, 100 - rem));
28
+ // Scale: 80% real usage = 100% displayed
29
+ const used = Math.min(100, Math.round((rawUsed / 80) * 100));
30
+
31
+ // Build progress bar (10 segments)
32
+ const filled = Math.floor(used / 10);
33
+ const bar = '\u2588'.repeat(filled) + '\u2591'.repeat(10 - filled);
34
+
35
+ // Color based on scaled usage
36
+ if (used < 63) {
37
+ ctx = ` \x1b[32m${bar} ${used}%\x1b[0m`;
38
+ } else if (used < 81) {
39
+ ctx = ` \x1b[33m${bar} ${used}%\x1b[0m`;
40
+ } else if (used < 95) {
41
+ ctx = ` \x1b[38;5;208m${bar} ${used}%\x1b[0m`;
42
+ } else {
43
+ ctx = ` \x1b[5;31m\u{1F480} ${bar} ${used}%\x1b[0m`;
44
+ }
45
+ }
46
+
47
+ // Current task from todos (Claude Code internal directory — always ~/.claude/)
48
+ let task = '';
49
+ const homeDir = os.homedir();
50
+ const todosDir = path.join(homeDir, '.claude', 'todos');
51
+ if (session && fs.existsSync(todosDir)) {
52
+ try {
53
+ const files = fs.readdirSync(todosDir)
54
+ .filter(f => f.startsWith(session) && f.includes('-agent-') && f.endsWith('.json'))
55
+ .map(f => ({ name: f, mtime: fs.statSync(path.join(todosDir, f)).mtime }))
56
+ .sort((a, b) => b.mtime - a.mtime);
57
+
58
+ if (files.length > 0) {
59
+ try {
60
+ const todos = JSON.parse(fs.readFileSync(path.join(todosDir, files[0].name), 'utf8'));
61
+ const inProgress = todos.find(t => t.status === 'in_progress');
62
+ if (inProgress) task = inProgress.activeForm || '';
63
+ } catch (e) {}
64
+ }
65
+ } catch (e) {}
66
+ }
67
+
68
+ // ACE update available? Check plugin data dir first, then legacy location
69
+ let aceUpdate = '';
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
+ }
86
+ }
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
+
97
+ // Output
98
+ const dirname = path.basename(dir);
99
+ if (task) {
100
+ process.stdout.write(`${aceUpdate}\x1b[2m${model}\x1b[0m \u2502 \x1b[1m${task}\x1b[0m \u2502 \x1b[2m${dirname}\x1b[0m${branch}${ctx}`);
101
+ } else {
102
+ process.stdout.write(`${aceUpdate}\x1b[2m${model}\x1b[0m \u2502 \x1b[2m${dirname}\x1b[0m${branch}${ctx}`);
103
+ }
104
+ } catch (e) {
105
+ // Silent fail - don't break statusline on parse errors
106
+ }
107
+ });
@@ -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.3.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",
@@ -9,17 +9,19 @@
9
9
  },
10
10
  "files": [
11
11
  "bin",
12
- "commands",
12
+ "skills",
13
+ "shared",
13
14
  "agents",
14
15
  "hooks",
15
- "agile-context-engineering",
16
+ ".claude-plugin",
16
17
  "CHANGELOG.md"
17
18
  ],
18
19
  "scripts": {
19
- "test": "node --test agile-context-engineering/src/ace-tools.test.js"
20
+ "test": "node --test shared/lib/*.test.js skills/*/script.test.js"
20
21
  },
21
22
  "keywords": [
22
23
  "claude-code",
24
+ "codex",
23
25
  "crush",
24
26
  "opencode",
25
27
  "anthropic",