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
@@ -0,0 +1,131 @@
1
+ #!/usr/bin/env node
2
+
3
+ /**
4
+ * plan-feature skill script — Entry point for ace-tools operations
5
+ * needed by the plan-feature skill.
6
+ *
7
+ * Subcommands:
8
+ * init [args] Environment detection for plan-feature workflow
9
+ * resolve-fields [args] Resolve GitHub Project field IDs
10
+ * create-issue [args] Create a GitHub issue in a project
11
+ * update-issue [args] Update a GitHub issue
12
+ * generate-slug <text> Generate a URL-safe slug from text
13
+ * verify-path-exists <path> Check if a file/directory exists
14
+ *
15
+ * Usage: node script.js <subcommand> [args] [--raw]
16
+ */
17
+
18
+ const fs = require('fs');
19
+ const path = require('path');
20
+
21
+ const {
22
+ loadConfig, pathExists, generateSlug, resolveModel,
23
+ detectBrownfieldStatus, loadSettings, output, error, runSkillScript,
24
+ } = require('../../shared/lib/ace-core');
25
+
26
+ const {
27
+ resolveFields, createIssue, updateIssue,
28
+ } = require('../../shared/lib/ace-github');
29
+
30
+ // ─── CLI Dispatch ────────────────────────────────────────────────────────────
31
+
32
+ runSkillScript({
33
+ init: cmdInit,
34
+ 'resolve-fields': (cwd, raw, args) => resolveFields(cwd, raw, args),
35
+ 'create-issue': (cwd, raw, args) => createIssue(cwd, raw, args),
36
+ 'update-issue': (cwd, raw, args) => updateIssue(cwd, raw, args),
37
+ 'generate-slug': (cwd, raw, args, parsed) => {
38
+ const text = parsed._positional || args.join(' ');
39
+ if (!text) error('generate-slug requires text argument');
40
+ const slug = generateSlug(text);
41
+ output({ slug }, raw, slug);
42
+ },
43
+ 'verify-path-exists': (cwd, raw, args, parsed) => {
44
+ const targetPath = parsed._positional || args.join(' ');
45
+ if (!targetPath) error('verify-path-exists requires path argument');
46
+ const exists = pathExists(cwd, targetPath);
47
+ output({ exists, path: targetPath }, raw, String(exists));
48
+ },
49
+ });
50
+
51
+ // ─── Init: Plan Feature ─────────────────────────────────────────────────────
52
+
53
+ function cmdInit(cwd, raw, args, parsed) {
54
+ const config = loadConfig(cwd);
55
+ const brownfield = detectBrownfieldStatus(cwd);
56
+
57
+ // Wiki detection — system-wide
58
+ const wikiSystemDir = '.docs/wiki/system-wide';
59
+ const has_wiki_system_wide = pathExists(cwd, wikiSystemDir);
60
+ const has_system_architecture = pathExists(cwd, path.join(wikiSystemDir, 'system-architecture.md'));
61
+ const has_system_structure = pathExists(cwd, path.join(wikiSystemDir, 'system-structure.md'));
62
+ const has_testing_framework = pathExists(cwd, path.join(wikiSystemDir, 'testing-framework.md'));
63
+
64
+ // Wiki detection — subsystems
65
+ const wikiSubsystemsDir = '.docs/wiki/subsystems';
66
+ const has_wiki_subsystems = pathExists(cwd, wikiSubsystemsDir);
67
+
68
+ let wiki_subsystem_names = [];
69
+ if (has_wiki_subsystems) {
70
+ try {
71
+ const entries = fs.readdirSync(path.join(cwd, wikiSubsystemsDir), { withFileTypes: true });
72
+ wiki_subsystem_names = entries
73
+ .filter(e => e.isDirectory())
74
+ .map(e => e.name);
75
+ } catch {}
76
+ }
77
+
78
+ const has_wiki = has_wiki_system_wide || has_wiki_subsystems;
79
+
80
+ const result = {
81
+ // Models
82
+ product_owner_model: resolveModel(cwd, 'ace-product-owner'),
83
+ researcher_model: resolveModel(cwd, 'ace-project-researcher'),
84
+
85
+ // Config
86
+ commit_docs: config.commit_docs,
87
+
88
+ // Product artifacts
89
+ has_product_vision: pathExists(cwd, '.docs/product/product-vision.md'),
90
+ has_product_backlog: pathExists(cwd, '.ace/artifacts/product/product-backlog.md'),
91
+
92
+ // Wiki analysis cache (from previous runs)
93
+ has_wiki_analysis: pathExists(cwd, '.ace/artifacts/wiki/wiki-analysis.md'),
94
+
95
+ // Brownfield detection
96
+ ...brownfield,
97
+
98
+ // Wiki state — system-wide
99
+ has_wiki,
100
+ has_wiki_system_wide,
101
+ has_system_architecture,
102
+ has_system_structure,
103
+ has_testing_framework,
104
+
105
+ // Wiki state — subsystems
106
+ has_wiki_subsystems,
107
+ wiki_subsystem_names,
108
+
109
+ // Git state
110
+ has_git: pathExists(cwd, '.git'),
111
+
112
+ // GitHub CLI
113
+ has_gh_cli: (() => {
114
+ try {
115
+ const { execSync } = require('child_process');
116
+ execSync('gh --version', { stdio: 'pipe' });
117
+ return true;
118
+ } catch {
119
+ return false;
120
+ }
121
+ })(),
122
+
123
+ // GitHub Project settings (from settings.json)
124
+ github_project: (() => {
125
+ const settings = loadSettings(cwd);
126
+ return settings.github_project;
127
+ })(),
128
+ };
129
+
130
+ output(result, raw);
131
+ }
@@ -0,0 +1,80 @@
1
+ const { describe, it, before, after } = require('node:test');
2
+ const assert = require('node:assert');
3
+ const { execSync } = require('child_process');
4
+ const fs = require('fs');
5
+ const path = require('path');
6
+ const os = require('os');
7
+
8
+ const SCRIPT = path.join(__dirname, 'script.js');
9
+
10
+ function createTestProject() {
11
+ const tmpDir = fs.mkdtempSync(path.join(os.tmpdir(), 'ace-test-'));
12
+
13
+ const aceDir = path.join(tmpDir, '.ace');
14
+ fs.mkdirSync(aceDir, { recursive: true });
15
+ fs.writeFileSync(path.join(aceDir, 'config.json'), JSON.stringify({
16
+ version: '0.1.0',
17
+ projectName: 'test-project',
18
+ model_profile: 'quality',
19
+ commit_docs: true,
20
+ github: { enabled: false },
21
+ }, null, 2));
22
+
23
+ fs.writeFileSync(path.join(aceDir, 'settings.json'), JSON.stringify({
24
+ model_profile: 'quality',
25
+ commit_docs: true,
26
+ agent_teams: false,
27
+ github_project: { enabled: false, gh_installed: false, repo: '', project_number: null, owner: '' },
28
+ }, null, 2));
29
+
30
+ return tmpDir;
31
+ }
32
+
33
+ function runScript(subcommand, args, cwd) {
34
+ return execSync(`node "${SCRIPT}" ${subcommand} ${args}`, {
35
+ cwd,
36
+ encoding: 'utf-8',
37
+ timeout: 10000,
38
+ });
39
+ }
40
+
41
+ function cleanup(tmpDir) {
42
+ fs.rmSync(tmpDir, { recursive: true, force: true });
43
+ }
44
+
45
+ describe('plan-feature script', () => {
46
+ it('errors on unknown command', () => {
47
+ assert.throws(() => {
48
+ execSync(`node "${SCRIPT}" bogus`, { encoding: 'utf-8', stdio: 'pipe' });
49
+ });
50
+ });
51
+
52
+ describe('init', () => {
53
+ let tmpDir;
54
+
55
+ before(() => { tmpDir = createTestProject(); });
56
+ after(() => { cleanup(tmpDir); });
57
+
58
+ it('init returns valid JSON', () => {
59
+ const result = JSON.parse(runScript('init', '', tmpDir));
60
+ assert.ok(typeof result === 'object');
61
+ assert.ok(result.product_owner_model, 'should have product_owner_model');
62
+ assert.ok(result.researcher_model, 'should have researcher_model');
63
+ assert.strictEqual(typeof result.commit_docs, 'boolean');
64
+ assert.strictEqual(typeof result.has_git, 'boolean');
65
+ assert.strictEqual(typeof result.is_brownfield, 'boolean');
66
+ assert.strictEqual(typeof result.has_product_vision, 'boolean');
67
+ assert.strictEqual(typeof result.has_product_backlog, 'boolean');
68
+ assert.strictEqual(typeof result.has_wiki, 'boolean');
69
+ assert.strictEqual(typeof result.has_gh_cli, 'boolean');
70
+ assert.ok(result.github_project !== undefined, 'should have github_project');
71
+ });
72
+
73
+ it('returns brownfield detection fields', () => {
74
+ const result = JSON.parse(runScript('init', '', tmpDir));
75
+ assert.strictEqual(typeof result.is_brownfield, 'boolean');
76
+ assert.strictEqual(typeof result.is_greenfield, 'boolean');
77
+ assert.strictEqual(result.is_brownfield, !result.is_greenfield);
78
+ });
79
+ });
80
+ });