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
|
@@ -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
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
##
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
-
|
|
40
|
-
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
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
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
const
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
//
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
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
|
+
});
|