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,111 +1,155 @@
|
|
|
1
|
-
---
|
|
2
|
-
name: map-subsystem
|
|
3
|
-
description: Map a subsystem's structure, architecture, and knowledge docs into .docs/wiki/subsystems/[name]/
|
|
4
|
-
argument-hint: "subsystem='src/api' (or subsystem name) existing-docs=comma separated paths | directory"
|
|
5
|
-
disable-model-invocation: true
|
|
6
|
-
allowed-tools: Read, Bash, Glob, Grep, Write, Task, AskUserQuestion
|
|
7
|
-
model: opus
|
|
8
|
-
effort: max
|
|
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
|
-
|
|
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
|
-
-
|
|
1
|
+
---
|
|
2
|
+
name: map-subsystem
|
|
3
|
+
description: Map a subsystem's structure, architecture, and knowledge docs into .docs/wiki/subsystems/[name]/
|
|
4
|
+
argument-hint: "subsystem='src/api' (or subsystem name) existing-docs=comma separated paths | directory"
|
|
5
|
+
disable-model-invocation: true
|
|
6
|
+
allowed-tools: Read, Bash, Glob, Grep, Write, Task, AskUserQuestion
|
|
7
|
+
model: opus
|
|
8
|
+
effort: max
|
|
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}/templates/subsystem-structure.xml"`
|
|
20
|
+
|
|
21
|
+
!`cat "${CLAUDE_SKILL_DIR}/templates/subsystem-architecture.xml"`
|
|
22
|
+
|
|
23
|
+
!`cat "${CLAUDE_SKILL_DIR}/templates/module-discovery.xml"`
|
|
24
|
+
|
|
25
|
+
!`cat "${CLAUDE_SKILL_DIR}/templates/system.xml"`
|
|
26
|
+
|
|
27
|
+
!`cat "${CLAUDE_SKILL_DIR}/templates/system-cross-cutting.xml"`
|
|
28
|
+
|
|
29
|
+
!`cat "${CLAUDE_SKILL_DIR}/templates/pattern.xml"`
|
|
30
|
+
|
|
31
|
+
!`cat "${CLAUDE_SKILL_DIR}/templates/guide.xml"`
|
|
32
|
+
|
|
33
|
+
!`cat "${CLAUDE_SKILL_DIR}/templates/walkthrough.xml"`
|
|
34
|
+
|
|
35
|
+
!`cat "${CLAUDE_SKILL_DIR}/templates/decizions.xml"`
|
|
36
|
+
|
|
37
|
+
!`cat "${CLAUDE_SKILL_DIR}/../../shared/utils/questioning.xml"`
|
|
38
|
+
|
|
39
|
+
!`cat "${CLAUDE_SKILL_DIR}/../../shared/utils/ui-formatting.md"`
|
|
40
|
+
|
|
41
|
+
```xml
|
|
42
|
+
<command>
|
|
43
|
+
|
|
44
|
+
<execution-time>
|
|
45
|
+
<runs-after>
|
|
46
|
+
<trigger>After /ace:map-system — drill into individual subsystems</trigger>
|
|
47
|
+
<trigger>Anytime to refresh an existing subsystem's wiki documents</trigger>
|
|
48
|
+
<trigger>When a new subsystem is added and needs to be documented</trigger>
|
|
49
|
+
</runs-after>
|
|
50
|
+
<use-when>
|
|
51
|
+
<condition>A subsystem has not yet been documented in `.docs/wiki/subsystems/`</condition>
|
|
52
|
+
<condition>An existing subsystem's docs are stale after a significant refactor</condition>
|
|
53
|
+
<condition>You want a deep-dive view of a specific subsystem's internals (components, flows, data)</condition>
|
|
54
|
+
</use-when>
|
|
55
|
+
</execution-time>
|
|
56
|
+
|
|
57
|
+
<input>
|
|
58
|
+
<flags>
|
|
59
|
+
</flags>
|
|
60
|
+
|
|
61
|
+
<parameters>
|
|
62
|
+
<required>
|
|
63
|
+
<param name="subsystem" type="path | text">
|
|
64
|
+
Path to the subsystem (e.g., `src/api`) or its name.
|
|
65
|
+
If not provided, pause execution and ask the user for it.
|
|
66
|
+
If provided but ambiguous, or not found in the codebase, ask clarifying questions.
|
|
67
|
+
</param>
|
|
68
|
+
</required>
|
|
69
|
+
|
|
70
|
+
<optional>
|
|
71
|
+
<param name="existing-docs" type="comma-separated paths or directories">
|
|
72
|
+
Pre-existing documentation relevant to this subsystem. Accepts file paths,
|
|
73
|
+
directory paths, or a mix of both. When a directory is provided, recursively
|
|
74
|
+
discover all files within it (including nested subdirectories).
|
|
75
|
+
All resolved file paths are passed through to every map-story invocation
|
|
76
|
+
(file mode) alongside any per-module docs discovered during module-discovery.
|
|
77
|
+
Use this when the caller already knows about documentation that should
|
|
78
|
+
inform knowledge-doc generation.
|
|
79
|
+
</param>
|
|
80
|
+
</optional>
|
|
81
|
+
</parameters>
|
|
82
|
+
</input>
|
|
83
|
+
|
|
84
|
+
<execution-context>
|
|
85
|
+
<!-- All supporting files are auto-loaded in the Supporting Resources section above.
|
|
86
|
+
The model does NOT need to Read these files — they are already in context. -->
|
|
87
|
+
</execution-context>
|
|
88
|
+
|
|
89
|
+
<output>
|
|
90
|
+
<objective>
|
|
91
|
+
Resolve the target subsystem, load system-wide wiki context, and determine whether
|
|
92
|
+
to create, update, or recreate per-subsystem wiki documents. Then:
|
|
93
|
+
|
|
94
|
+
1. Spawn ace-wiki-mapper agents to produce structure and architecture documents.
|
|
95
|
+
2. Update system-structure.md if this subsystem was not previously listed there.
|
|
96
|
+
3. Update the subsystem responsibility matrix in system-architecture.md if missing.
|
|
97
|
+
4. Run module discovery — trace E2E flows, identify patterns, find cross-cutting
|
|
98
|
+
concerns by reading actual source code. Produce module-discovery.md artifact.
|
|
99
|
+
5. For EACH discovered module, run map-story in file mode to create or update
|
|
100
|
+
knowledge documentation (systems/, patterns/, cross-cutting/, guides/, walkthroughs/, decisions/).
|
|
101
|
+
</objective>
|
|
102
|
+
|
|
103
|
+
<artifacts>
|
|
104
|
+
- .docs/wiki/subsystems/[subsystem-name]/structure.md
|
|
105
|
+
- .docs/wiki/subsystems/[subsystem-name]/architecture.md
|
|
106
|
+
- .docs/wiki/subsystems/[subsystem-name]/systems/*.md (created/updated by map-story)
|
|
107
|
+
- .docs/wiki/subsystems/[subsystem-name]/patterns/*.md (created/updated by map-story)
|
|
108
|
+
- .docs/wiki/subsystems/[subsystem-name]/cross-cutting/*.md (created/updated by map-story)
|
|
109
|
+
- .docs/wiki/subsystems/[subsystem-name]/guides/*.md (created/updated by map-story)
|
|
110
|
+
- .docs/wiki/subsystems/[subsystem-name]/walkthroughs/*.md (created/updated by map-story)
|
|
111
|
+
- .docs/wiki/subsystems/[subsystem-name]/decisions/*.md (created/updated by map-story)
|
|
112
|
+
- .ace/artifacts/subsystems/[subsystem-name]/module-discovery/module-discovery.md
|
|
113
|
+
- .ace/artifacts/subsystems/[subsystem-name]/module-discovery/existing-docs-inventory.md (if existing-docs directory provided)
|
|
114
|
+
- .docs/wiki/system-wide/system-structure.md (subsystem entry added if new)
|
|
115
|
+
- .docs/wiki/system-wide/system-architecture.md (subsystem responsibility matrix updated if missing)
|
|
116
|
+
</artifacts>
|
|
117
|
+
</output>
|
|
118
|
+
|
|
119
|
+
<process>
|
|
120
|
+
Execute the map-subsystem workflow from
|
|
121
|
+
`workflow.xml` end-to-end.
|
|
122
|
+
Preserve all workflow gates (validation, user questions, commits).
|
|
123
|
+
|
|
124
|
+
The workflow has 13 steps:
|
|
125
|
+
1-5: Setup, context loading, subsystem resolution, document triage, directory creation
|
|
126
|
+
6-8: Structure + architecture agents (parallel) + collect results
|
|
127
|
+
9: Update system-wide docs (system-structure.md, system-architecture.md)
|
|
128
|
+
10: Module discovery (3 parallel discovery agents + 1 synthesis agent)
|
|
129
|
+
11: Knowledge documentation — run map-story for EACH discovered module (sequential)
|
|
130
|
+
12: Verify and commit all documents
|
|
131
|
+
13: Completion report
|
|
132
|
+
|
|
133
|
+
Steps 10-11 are CRITICAL — they produce the knowledge docs (systems/, patterns/,
|
|
134
|
+
cross-cutting/, guides/, walkthroughs/, decisions/) that AI agents need for future implementations.
|
|
135
|
+
Do NOT skip them.
|
|
136
|
+
</process>
|
|
137
|
+
|
|
138
|
+
<next-steps>
|
|
139
|
+
**After this command, `/clear` first for a fresh context window, then:**
|
|
140
|
+
|
|
141
|
+
For each subsystem found and defined in the Subsystem Responsibility Matrix,
|
|
142
|
+
suggest a `/ace:map-subsystem` command. Example:
|
|
143
|
+
- `/ace:map-subsystem subsystem="src/api"` — Map the API subsystem
|
|
144
|
+
- `/ace:map-subsystem subsystem="src/auth"` — Map the Auth subsystem
|
|
145
|
+
- `/ace:map-subsystem subsystem="src/db"` — Map the DB subsystem
|
|
146
|
+
(list one per subsystem discovered during this command's execution)
|
|
147
|
+
|
|
148
|
+
Also suggest:
|
|
149
|
+
- `/ace:init-coding-standards` — Define prescriptive coding standards
|
|
150
|
+
- `/ace:help` — Check project initialization status and next steps
|
|
151
|
+
- Review and edit files in `.docs/wiki/system-wide/` anytime
|
|
152
|
+
</next-steps>
|
|
153
|
+
|
|
154
|
+
</command>
|
|
155
|
+
```
|
|
@@ -1,60 +1,51 @@
|
|
|
1
|
-
#!/usr/bin/env node
|
|
2
|
-
|
|
3
|
-
/**
|
|
4
|
-
* map-subsystem skill script — Entry point for ace-tools operations
|
|
5
|
-
* needed by the map-subsystem skill.
|
|
6
|
-
*
|
|
7
|
-
* Subcommands:
|
|
8
|
-
* init [args] Environment detection for map-subsystem workflow
|
|
9
|
-
*
|
|
10
|
-
* Usage: node script.js <subcommand> [args] [--raw]
|
|
11
|
-
*/
|
|
12
|
-
|
|
13
|
-
const {
|
|
14
|
-
loadConfig, pathExists, resolveModel,
|
|
15
|
-
detectBrownfieldStatus, output, error,
|
|
16
|
-
} = require('../../shared/lib/ace-core');
|
|
17
|
-
|
|
18
|
-
// ─── CLI Dispatch ────────────────────────────────────────────────────────────
|
|
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
|
-
// Wiki directory state
|
|
53
|
-
wiki_dir_exists: wikiDirExists,
|
|
54
|
-
|
|
55
|
-
// Git state
|
|
56
|
-
has_git: pathExists(cwd, '.git'),
|
|
57
|
-
};
|
|
58
|
-
|
|
59
|
-
output(result, raw);
|
|
60
|
-
}
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* map-subsystem skill script — Entry point for ace-tools operations
|
|
5
|
+
* needed by the map-subsystem skill.
|
|
6
|
+
*
|
|
7
|
+
* Subcommands:
|
|
8
|
+
* init [args] Environment detection for map-subsystem workflow
|
|
9
|
+
*
|
|
10
|
+
* Usage: node script.js <subcommand> [args] [--raw]
|
|
11
|
+
*/
|
|
12
|
+
|
|
13
|
+
const {
|
|
14
|
+
loadConfig, pathExists, resolveModel,
|
|
15
|
+
detectBrownfieldStatus, output, error, runSkillScript,
|
|
16
|
+
} = require('../../shared/lib/ace-core');
|
|
17
|
+
|
|
18
|
+
// ─── CLI Dispatch ────────────────────────────────────────────────────────────
|
|
19
|
+
|
|
20
|
+
runSkillScript({
|
|
21
|
+
init: cmdInit,
|
|
22
|
+
});
|
|
23
|
+
|
|
24
|
+
// ─── Init: Map Subsystem ────────────────────────────────────────────────────
|
|
25
|
+
|
|
26
|
+
function cmdInit(cwd, raw, args, parsed) {
|
|
27
|
+
const config = loadConfig(cwd);
|
|
28
|
+
const brownfield = detectBrownfieldStatus(cwd);
|
|
29
|
+
|
|
30
|
+
const wikiDir = '.docs/wiki/subsystems';
|
|
31
|
+
const wikiDirExists = pathExists(cwd, wikiDir);
|
|
32
|
+
|
|
33
|
+
const result = {
|
|
34
|
+
// Models
|
|
35
|
+
mapper_model: resolveModel(cwd, 'ace-wiki-mapper'),
|
|
36
|
+
|
|
37
|
+
// Config
|
|
38
|
+
commit_docs: config.commit_docs,
|
|
39
|
+
|
|
40
|
+
// Brownfield detection
|
|
41
|
+
...brownfield,
|
|
42
|
+
|
|
43
|
+
// Wiki directory state
|
|
44
|
+
wiki_dir_exists: wikiDirExists,
|
|
45
|
+
|
|
46
|
+
// Git state
|
|
47
|
+
has_git: pathExists(cwd, '.git'),
|
|
48
|
+
};
|
|
49
|
+
|
|
50
|
+
output(result, raw);
|
|
51
|
+
}
|
|
@@ -1,68 +1,68 @@
|
|
|
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
|
-
return tmpDir;
|
|
24
|
-
}
|
|
25
|
-
|
|
26
|
-
function runScript(subcommand, args, cwd) {
|
|
27
|
-
return execSync(`node "${SCRIPT}" ${subcommand} ${args}`, {
|
|
28
|
-
cwd,
|
|
29
|
-
encoding: 'utf-8',
|
|
30
|
-
timeout: 10000,
|
|
31
|
-
});
|
|
32
|
-
}
|
|
33
|
-
|
|
34
|
-
function cleanup(tmpDir) {
|
|
35
|
-
fs.rmSync(tmpDir, { recursive: true, force: true });
|
|
36
|
-
}
|
|
37
|
-
|
|
38
|
-
describe('map-subsystem script', () => {
|
|
39
|
-
it('errors on unknown command', () => {
|
|
40
|
-
assert.throws(() => {
|
|
41
|
-
execSync(`node "${SCRIPT}" bogus`, { encoding: 'utf-8', stdio: 'pipe' });
|
|
42
|
-
});
|
|
43
|
-
});
|
|
44
|
-
|
|
45
|
-
describe('init', () => {
|
|
46
|
-
let tmpDir;
|
|
47
|
-
|
|
48
|
-
before(() => { tmpDir = createTestProject(); });
|
|
49
|
-
after(() => { cleanup(tmpDir); });
|
|
50
|
-
|
|
51
|
-
it('init returns valid JSON', () => {
|
|
52
|
-
const result = JSON.parse(runScript('init', '', tmpDir));
|
|
53
|
-
assert.ok(typeof result === 'object');
|
|
54
|
-
assert.ok(result.mapper_model, 'should have mapper_model');
|
|
55
|
-
assert.strictEqual(typeof result.commit_docs, 'boolean');
|
|
56
|
-
assert.strictEqual(typeof result.has_git, 'boolean');
|
|
57
|
-
assert.strictEqual(typeof result.is_brownfield, 'boolean');
|
|
58
|
-
assert.strictEqual(typeof result.wiki_dir_exists, 'boolean');
|
|
59
|
-
});
|
|
60
|
-
|
|
61
|
-
it('returns brownfield detection fields', () => {
|
|
62
|
-
const result = JSON.parse(runScript('init', '', tmpDir));
|
|
63
|
-
assert.strictEqual(typeof result.is_brownfield, 'boolean');
|
|
64
|
-
assert.strictEqual(typeof result.is_greenfield, 'boolean');
|
|
65
|
-
assert.strictEqual(result.is_brownfield, !result.is_greenfield);
|
|
66
|
-
});
|
|
67
|
-
});
|
|
68
|
-
});
|
|
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
|
+
return tmpDir;
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
function runScript(subcommand, args, cwd) {
|
|
27
|
+
return execSync(`node "${SCRIPT}" ${subcommand} ${args}`, {
|
|
28
|
+
cwd,
|
|
29
|
+
encoding: 'utf-8',
|
|
30
|
+
timeout: 10000,
|
|
31
|
+
});
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
function cleanup(tmpDir) {
|
|
35
|
+
fs.rmSync(tmpDir, { recursive: true, force: true });
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
describe('map-subsystem script', () => {
|
|
39
|
+
it('errors on unknown command', () => {
|
|
40
|
+
assert.throws(() => {
|
|
41
|
+
execSync(`node "${SCRIPT}" bogus`, { encoding: 'utf-8', stdio: 'pipe' });
|
|
42
|
+
});
|
|
43
|
+
});
|
|
44
|
+
|
|
45
|
+
describe('init', () => {
|
|
46
|
+
let tmpDir;
|
|
47
|
+
|
|
48
|
+
before(() => { tmpDir = createTestProject(); });
|
|
49
|
+
after(() => { cleanup(tmpDir); });
|
|
50
|
+
|
|
51
|
+
it('init returns valid JSON', () => {
|
|
52
|
+
const result = JSON.parse(runScript('init', '', tmpDir));
|
|
53
|
+
assert.ok(typeof result === 'object');
|
|
54
|
+
assert.ok(result.mapper_model, 'should have mapper_model');
|
|
55
|
+
assert.strictEqual(typeof result.commit_docs, 'boolean');
|
|
56
|
+
assert.strictEqual(typeof result.has_git, 'boolean');
|
|
57
|
+
assert.strictEqual(typeof result.is_brownfield, 'boolean');
|
|
58
|
+
assert.strictEqual(typeof result.wiki_dir_exists, 'boolean');
|
|
59
|
+
});
|
|
60
|
+
|
|
61
|
+
it('returns brownfield detection fields', () => {
|
|
62
|
+
const result = JSON.parse(runScript('init', '', tmpDir));
|
|
63
|
+
assert.strictEqual(typeof result.is_brownfield, 'boolean');
|
|
64
|
+
assert.strictEqual(typeof result.is_greenfield, 'boolean');
|
|
65
|
+
assert.strictEqual(result.is_brownfield, !result.is_greenfield);
|
|
66
|
+
});
|
|
67
|
+
});
|
|
68
|
+
});
|