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
@@ -1,75 +1,93 @@
1
- ---
2
- name: plan-backlog
3
- description: Create or refine the product backlog through vision-aware questioning, wiki analysis, and guided epic/feature planning
4
- argument-hint: "[optional: context='text, file, or URL with product description and suggested epics/features']"
5
- disable-model-invocation: true
6
- allowed-tools: Read, Bash, Write, Task, AskUserQuestion
7
- model: opus
8
- effort: high
9
- ---
10
-
11
- # Plan Backlog
12
-
13
- Create or refine the product backlog through vision-aware questioning, wiki analysis, and guided epic/feature planning.
14
-
15
- ## When to Use
16
-
17
- - After `/ace:plan-product-vision` — once the vision exists, plan what to build
18
- - After `/ace:map-system` — once architecture is mapped, leverage wiki context for richer backlog
19
- - Anytime — to create or refresh the product backlog
20
- - Product vision exists and you want to break it into epics and features
21
- - Starting implementation planning and need a structured backlog
22
- - Brownfield project where features need to be inventoried from existing code
23
- - Updating the backlog after scope changes or new discoveries
24
-
25
- ## Input
26
-
27
- ### Optional
28
-
29
- - **`context`** — Product description, suggested epics/features, PRD excerpts, or any context to seed the backlog planning process. Will be absorbed and refined through questioning, not used as-is.
30
-
31
- ## Environment Context (preprocessed)
32
-
33
- !`node "${CLAUDE_SKILL_DIR}/script.js" init "$ARGUMENTS" 2>/dev/null`
34
-
35
- ## Supporting Resources
36
-
37
- Read ALL of these before starting the workflow:
38
-
39
- - **Workflow**: Read [workflow.xml](workflow.xml) — complete orchestration process with all steps
40
- - **Product backlog template**: Read [product-backlog-template.xml](product-backlog-template.xml) — output format for the product backlog
41
- - **Questioning guide**: Read `${CLAUDE_SKILL_DIR}/../../shared/utils/questioning.xml` — deep questioning techniques
42
- - **UI formatting**: Read `${CLAUDE_SKILL_DIR}/../../shared/utils/ui-formatting.md` — ACE output formatting rules
43
-
44
- ## Process
45
-
46
- Use the `ace-product-owner` agent for requirements gathering, deep questioning, and backlog specification.
47
-
48
- The Environment Context above contains the preprocessed INIT JSON — use it directly instead of running the init script manually. The workflow's step 1 setup can skip the init bash call since that data is already available.
49
-
50
- Read all supporting resources listed above, then execute the workflow defined in [workflow.xml](workflow.xml) end-to-end. Preserve all workflow gates (validation, approvals, commits).
51
-
52
- ## Artifacts
53
-
54
- ```
55
- .ace/artifacts/product/product-backlog.md
56
- ```
57
-
58
- ## Example Usage
59
-
60
- ```
61
- # Create a new product backlog
62
- /ace:plan-backlog
63
-
64
- # Create backlog with seed context
65
- /ace:plan-backlog context="E-commerce platform with user accounts, product catalog, and checkout"
66
-
67
- # Refine existing backlog after scope changes
68
- /ace:plan-backlog
69
- ```
70
-
71
- ## Next Steps
72
-
73
- - `/ace:plan-feature E1` — Break a feature into detailed stories
74
- - `/ace:help` — Check project initialization status
75
- - `/ace:plan-product-vision` — Update the product vision if priorities shifted
1
+ ---
2
+ name: plan-backlog
3
+ description: Create or refine the product backlog through vision-aware questioning, wiki analysis, and guided epic/feature planning
4
+ argument-hint: "[optional: context='text, file, or URL with product description and suggested epics/features']"
5
+ disable-model-invocation: true
6
+ allowed-tools: Read, Bash, Write, Task, AskUserQuestion
7
+ model: opus
8
+ effort: high
9
+ ---
10
+
11
+ ## Environment Context (preprocessed)
12
+
13
+ !`node "${CLAUDE_SKILL_DIR}/script.js" init 2>/dev/null`
14
+
15
+ ## Supporting Resources (auto-loaded)
16
+
17
+ !`cat "${CLAUDE_SKILL_DIR}/workflow.xml"`
18
+
19
+ !`cat "${CLAUDE_SKILL_DIR}/product-backlog-template.xml"`
20
+
21
+ !`cat "${CLAUDE_SKILL_DIR}/../../shared/utils/questioning.xml"`
22
+
23
+ !`cat "${CLAUDE_SKILL_DIR}/../../shared/utils/ui-formatting.md"`
24
+
25
+ ```xml
26
+ <command>
27
+
28
+ <execution-time>
29
+ <runs-after>
30
+ <trigger>After /ace:plan-product-vision — once the vision exists, plan what to build</trigger>
31
+ <trigger>After /ace:map-system once architecture is mapped, leverage wiki context for richer backlog</trigger>
32
+ <trigger>Anytime — to create or refresh the product backlog</trigger>
33
+ </runs-after>
34
+ <use-when>
35
+ <condition>Product vision exists and you want to break it into epics and features</condition>
36
+ <condition>Starting implementation planning and need a structured backlog</condition>
37
+ <condition>Brownfield project where features need to be inventoried from existing code</condition>
38
+ <condition>Updating the backlog after scope changes or new discoveries</condition>
39
+ </use-when>
40
+ </execution-time>
41
+
42
+ <input>
43
+ <flags>
44
+ </flags>
45
+
46
+ <parameters>
47
+ <required>
48
+ </required>
49
+
50
+ <optional>
51
+ <param name="context" type="file | text">
52
+ Product description, suggested epics/features, PRD excerpts, or any
53
+ context to seed the backlog planning process. Will be absorbed and
54
+ refined through questioning, not used as-is.
55
+ </param>
56
+ </optional>
57
+ </parameters>
58
+ </input>
59
+
60
+ <execution-context>
61
+ <!-- All supporting files are auto-loaded in the Supporting Resources section above.
62
+ The model does NOT need to Read these files — they are already in context. -->
63
+ </execution-context>
64
+
65
+ <output>
66
+ <objective>
67
+ Detect the project environment, load the product vision as the north-star input,
68
+ optionally analyze the wiki for existing capabilities and feature status,
69
+ optionally research the domain ecosystem for standard features,
70
+ absorb any user-provided context, conduct deep questioning to discover all
71
+ epics and features, and generate a comprehensive product-backlog.md.
72
+ </objective>
73
+
74
+ <artifacts>
75
+ .ace/artifacts/product/product-backlog.md
76
+ </artifacts>
77
+ </output>
78
+
79
+ <process>
80
+ Execute the plan-backlog workflow from
81
+ `workflow.xml` end-to-end.
82
+ Preserve all workflow gates (validation, approvals, commits).
83
+ </process>
84
+
85
+ <next-steps>
86
+ **After this command:**
87
+ - `/ace:plan-feature E1` — Break an feature into detailed stories
88
+ - `/ace:help` — Check project initialization status
89
+ - `/ace:plan-product-vision` — Update the product vision if priorities shifted
90
+ </next-steps>
91
+
92
+ </command>
93
+ ```
@@ -1,136 +1,121 @@
1
- #!/usr/bin/env node
2
-
3
- /**
4
- * plan-backlog skill script — Entry point for ace-tools operations
5
- * needed by the plan-backlog skill.
6
- *
7
- * Subcommands:
8
- * init [args] Environment detection for plan-backlog workflow
9
- * resolve-fields [args] Resolve GitHub Project field IDs
10
- * create-issue [args] Create a GitHub issue in a project
11
- * fetch-issues [args] Fetch all epics/features from a GitHub project
12
- *
13
- * Usage: node script.js <subcommand> [args] [--raw]
14
- */
15
-
16
- const fs = require('fs');
17
- const path = require('path');
18
-
19
- const {
20
- loadConfig, pathExists, resolveModel,
21
- detectBrownfieldStatus, loadSettings, output, error,
22
- } = require('../../shared/lib/ace-core');
23
-
24
- const {
25
- resolveFields, createIssue, fetchIssues,
26
- } = require('../../shared/lib/ace-github');
27
-
28
- // ─── CLI Dispatch ────────────────────────────────────────────────────────────
29
-
30
- const cwd = process.cwd();
31
- const args = process.argv.slice(2);
32
- const raw = args.includes('--raw');
33
- const cmd = args[0];
34
-
35
- switch (cmd) {
36
- case 'init':
37
- cmdInit(cwd, raw, args.slice(1).filter(a => a !== '--raw'));
38
- break;
39
- case 'resolve-fields':
40
- resolveFields(cwd, raw, args.slice(1).filter(a => a !== '--raw'));
41
- break;
42
- case 'create-issue':
43
- createIssue(cwd, raw, args.slice(1).filter(a => a !== '--raw'));
44
- break;
45
- case 'fetch-issues':
46
- fetchIssues(cwd, raw, args.slice(1).filter(a => a !== '--raw'));
47
- break;
48
- default:
49
- error(`Unknown command: ${cmd}\nAvailable: init, resolve-fields, create-issue, fetch-issues`);
50
- }
51
-
52
- // ─── Init: Plan Backlog ─────────────────────────────────────────────────────
53
-
54
- function cmdInit(cwd, raw) {
55
- const config = loadConfig(cwd);
56
- const brownfield = detectBrownfieldStatus(cwd);
57
-
58
- // Wiki detection — system-wide
59
- const wikiSystemDir = '.docs/wiki/system-wide';
60
- const has_wiki_system_wide = pathExists(cwd, wikiSystemDir);
61
- const has_system_architecture = pathExists(cwd, path.join(wikiSystemDir, 'system-architecture.md'));
62
- const has_system_structure = pathExists(cwd, path.join(wikiSystemDir, 'system-structure.md'));
63
- const has_testing_framework = pathExists(cwd, path.join(wikiSystemDir, 'testing-framework.md'));
64
-
65
- // Wiki detection — subsystems
66
- const wikiSubsystemsDir = '.docs/wiki/subsystems';
67
- const has_wiki_subsystems = pathExists(cwd, wikiSubsystemsDir);
68
-
69
- let wiki_subsystem_names = [];
70
- if (has_wiki_subsystems) {
71
- try {
72
- const entries = fs.readdirSync(path.join(cwd, wikiSubsystemsDir), { withFileTypes: true });
73
- wiki_subsystem_names = entries
74
- .filter(e => e.isDirectory())
75
- .map(e => e.name);
76
- } catch {}
77
- }
78
-
79
- const has_wiki = has_wiki_system_wide || has_wiki_subsystems;
80
-
81
- const result = {
82
- // Models
83
- product_owner_model: resolveModel(cwd, 'ace-product-owner'),
84
- researcher_model: resolveModel(cwd, 'ace-project-researcher'),
85
-
86
- // Config
87
- commit_docs: config.commit_docs,
88
-
89
- // Product artifacts
90
- has_product_vision: pathExists(cwd, '.docs/product/product-vision.md'),
91
- has_product_backlog: pathExists(cwd, '.ace/artifacts/product/product-backlog.md'),
92
-
93
- // Research artifacts (from previous runs)
94
- has_features_research: pathExists(cwd, '.ace/research/FEATURES.md'),
95
- has_architecture_research: pathExists(cwd, '.ace/research/ARCHITECTURE.md'),
96
-
97
- // Wiki analysis cache (from previous runs)
98
- has_wiki_analysis: pathExists(cwd, '.ace/artifacts/wiki/wiki-analysis.md'),
99
-
100
- // Brownfield detection
101
- ...brownfield,
102
-
103
- // Wiki state — system-wide
104
- has_wiki,
105
- has_wiki_system_wide,
106
- has_system_architecture,
107
- has_system_structure,
108
- has_testing_framework,
109
-
110
- // Wiki state — subsystems
111
- has_wiki_subsystems,
112
- wiki_subsystem_names,
113
-
114
- // Git state
115
- has_git: pathExists(cwd, '.git'),
116
-
117
- // GitHub CLI
118
- has_gh_cli: (() => {
119
- try {
120
- const { execSync } = require('child_process');
121
- execSync('gh --version', { stdio: 'pipe' });
122
- return true;
123
- } catch {
124
- return false;
125
- }
126
- })(),
127
-
128
- // GitHub Project settings (from settings.json)
129
- github_project: (() => {
130
- const settings = loadSettings(cwd);
131
- return settings.github_project;
132
- })(),
133
- };
134
-
135
- output(result, raw);
136
- }
1
+ #!/usr/bin/env node
2
+
3
+ /**
4
+ * plan-backlog skill script — Entry point for ace-tools operations
5
+ * needed by the plan-backlog skill.
6
+ *
7
+ * Subcommands:
8
+ * init [args] Environment detection for plan-backlog workflow
9
+ * resolve-fields [args] Resolve GitHub Project field IDs
10
+ * create-issue [args] Create a GitHub issue in a project
11
+ * fetch-issues [args] Fetch all epics/features from a GitHub project
12
+ *
13
+ * Usage: node script.js <subcommand> [args] [--raw]
14
+ */
15
+
16
+ const fs = require('fs');
17
+ const path = require('path');
18
+
19
+ const {
20
+ loadConfig, pathExists, resolveModel,
21
+ detectBrownfieldStatus, loadSettings, output, error, runSkillScript,
22
+ } = require('../../shared/lib/ace-core');
23
+
24
+ const {
25
+ resolveFields, createIssue, fetchIssues,
26
+ } = require('../../shared/lib/ace-github');
27
+
28
+ // ─── CLI Dispatch ────────────────────────────────────────────────────────────
29
+
30
+ runSkillScript({
31
+ init: cmdInit,
32
+ 'resolve-fields': (cwd, raw, args) => resolveFields(cwd, raw, args),
33
+ 'create-issue': (cwd, raw, args) => createIssue(cwd, raw, args),
34
+ 'fetch-issues': (cwd, raw, args) => fetchIssues(cwd, raw, args),
35
+ });
36
+
37
+ // ─── Init: Plan Backlog ─────────────────────────────────────────────────────
38
+
39
+ function cmdInit(cwd, raw, args, parsed) {
40
+ const config = loadConfig(cwd);
41
+ const brownfield = detectBrownfieldStatus(cwd);
42
+
43
+ // Wiki detection system-wide
44
+ const wikiSystemDir = '.docs/wiki/system-wide';
45
+ const has_wiki_system_wide = pathExists(cwd, wikiSystemDir);
46
+ const has_system_architecture = pathExists(cwd, path.join(wikiSystemDir, 'system-architecture.md'));
47
+ const has_system_structure = pathExists(cwd, path.join(wikiSystemDir, 'system-structure.md'));
48
+ const has_testing_framework = pathExists(cwd, path.join(wikiSystemDir, 'testing-framework.md'));
49
+
50
+ // Wiki detection — subsystems
51
+ const wikiSubsystemsDir = '.docs/wiki/subsystems';
52
+ const has_wiki_subsystems = pathExists(cwd, wikiSubsystemsDir);
53
+
54
+ let wiki_subsystem_names = [];
55
+ if (has_wiki_subsystems) {
56
+ try {
57
+ const entries = fs.readdirSync(path.join(cwd, wikiSubsystemsDir), { withFileTypes: true });
58
+ wiki_subsystem_names = entries
59
+ .filter(e => e.isDirectory())
60
+ .map(e => e.name);
61
+ } catch {}
62
+ }
63
+
64
+ const has_wiki = has_wiki_system_wide || has_wiki_subsystems;
65
+
66
+ const result = {
67
+ // Models
68
+ product_owner_model: resolveModel(cwd, 'ace-product-owner'),
69
+ researcher_model: resolveModel(cwd, 'ace-project-researcher'),
70
+
71
+ // Config
72
+ commit_docs: config.commit_docs,
73
+
74
+ // Product artifacts
75
+ has_product_vision: pathExists(cwd, '.docs/product/product-vision.md'),
76
+ has_product_backlog: pathExists(cwd, '.ace/artifacts/product/product-backlog.md'),
77
+
78
+ // Research artifacts (from previous runs)
79
+ has_features_research: pathExists(cwd, '.ace/research/FEATURES.md'),
80
+ has_architecture_research: pathExists(cwd, '.ace/research/ARCHITECTURE.md'),
81
+
82
+ // Wiki analysis cache (from previous runs)
83
+ has_wiki_analysis: pathExists(cwd, '.ace/artifacts/wiki/wiki-analysis.md'),
84
+
85
+ // Brownfield detection
86
+ ...brownfield,
87
+
88
+ // Wiki state — system-wide
89
+ has_wiki,
90
+ has_wiki_system_wide,
91
+ has_system_architecture,
92
+ has_system_structure,
93
+ has_testing_framework,
94
+
95
+ // Wiki state — subsystems
96
+ has_wiki_subsystems,
97
+ wiki_subsystem_names,
98
+
99
+ // Git state
100
+ has_git: pathExists(cwd, '.git'),
101
+
102
+ // GitHub CLI
103
+ has_gh_cli: (() => {
104
+ try {
105
+ const { execSync } = require('child_process');
106
+ execSync('gh --version', { stdio: 'pipe' });
107
+ return true;
108
+ } catch {
109
+ return false;
110
+ }
111
+ })(),
112
+
113
+ // GitHub Project settings (from settings.json)
114
+ github_project: (() => {
115
+ const settings = loadSettings(cwd);
116
+ return settings.github_project;
117
+ })(),
118
+ };
119
+
120
+ output(result, raw);
121
+ }
@@ -1,83 +1,83 @@
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-backlog 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_features_research, 'boolean');
69
- assert.strictEqual(typeof result.has_architecture_research, 'boolean');
70
- assert.strictEqual(typeof result.has_wiki_analysis, 'boolean');
71
- assert.strictEqual(typeof result.has_wiki, 'boolean');
72
- assert.strictEqual(typeof result.has_gh_cli, 'boolean');
73
- assert.ok(result.github_project !== undefined, 'should have github_project');
74
- });
75
-
76
- it('returns brownfield detection fields', () => {
77
- const result = JSON.parse(runScript('init', '', tmpDir));
78
- assert.strictEqual(typeof result.is_brownfield, 'boolean');
79
- assert.strictEqual(typeof result.is_greenfield, 'boolean');
80
- assert.strictEqual(result.is_brownfield, !result.is_greenfield);
81
- });
82
- });
83
- });
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-backlog 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_features_research, 'boolean');
69
+ assert.strictEqual(typeof result.has_architecture_research, 'boolean');
70
+ assert.strictEqual(typeof result.has_wiki_analysis, 'boolean');
71
+ assert.strictEqual(typeof result.has_wiki, 'boolean');
72
+ assert.strictEqual(typeof result.has_gh_cli, 'boolean');
73
+ assert.ok(result.github_project !== undefined, 'should have github_project');
74
+ });
75
+
76
+ it('returns brownfield detection fields', () => {
77
+ const result = JSON.parse(runScript('init', '', tmpDir));
78
+ assert.strictEqual(typeof result.is_brownfield, 'boolean');
79
+ assert.strictEqual(typeof result.is_greenfield, 'boolean');
80
+ assert.strictEqual(result.is_brownfield, !result.is_greenfield);
81
+ });
82
+ });
83
+ });