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,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
- # Map Subsystem
12
-
13
- Map a subsystem's structure, architecture, and knowledge docs into .docs/wiki/subsystems/[name]/.
14
-
15
- ## When to Use
16
-
17
- - After `/ace:map-system` — drill into individual subsystems
18
- - Anytime to refresh an existing subsystem's wiki documents
19
- - When a new subsystem is added and needs to be documented
20
- - A subsystem has not yet been documented in `.docs/wiki/subsystems/`
21
- - An existing subsystem's docs are stale after a significant refactor
22
- - You want a deep-dive view of a specific subsystem's internals (components, flows, data)
23
-
24
- ## Input
25
-
26
- ### Required
27
-
28
- - **`subsystem`** — Path to the subsystem (e.g., `src/api`) or its name. If not provided, pause execution and ask the user for it. If provided but ambiguous, or not found in the codebase, ask clarifying questions.
29
-
30
- ### Optional
31
-
32
- - **`existing-docs`** — Pre-existing documentation relevant to this subsystem. Accepts file paths, directory paths, or a mix of both. When a directory is provided, recursively discover all files within it (including nested subdirectories). All resolved file paths are passed through to every map-story invocation (file mode) alongside any per-module docs discovered during module-discovery. Use this when the caller already knows about documentation that should inform knowledge-doc generation.
33
-
34
- ## Environment Context (preprocessed)
35
-
36
- !`node "${CLAUDE_SKILL_DIR}/script.js" init "$ARGUMENTS" 2>/dev/null`
37
-
38
- ## Supporting Resources
39
-
40
- Read ALL of these before starting the workflow:
41
-
42
- - **Workflow**: Read [workflow.xml](workflow.xml) — complete orchestration process with all steps
43
- - **Subsystem structure template**: Read [templates/subsystem-structure.xml](templates/subsystem-structure.xml) — output format for subsystem structure
44
- - **Subsystem architecture template**: Read [templates/subsystem-architecture.xml](templates/subsystem-architecture.xml) — output format for subsystem architecture
45
- - **Module discovery template**: Read [templates/module-discovery.xml](templates/module-discovery.xml) — format for module discovery artifact
46
- - **System template**: Read [templates/system.xml](templates/system.xml)format for system documents
47
- - **Pattern template**: Read [templates/pattern.xml](templates/pattern.xml) format for pattern documents
48
- - **Cross-cutting template**: Read [templates/system-cross-cutting.xml](templates/system-cross-cutting.xml) format for cross-cutting concern documents
49
- - **Guide template**: Read [templates/guide.xml](templates/guide.xml) — format for guide documents
50
- - **Walkthrough template**: Read [templates/walkthrough.xml](templates/walkthrough.xml) — format for walkthrough documents
51
- - **Decisions template**: Read [templates/decizions.xml](templates/decizions.xml) format for decision documents
52
- - **Questioning guide**: Read `${CLAUDE_SKILL_DIR}/../../shared/utils/questioning.xml` deep questioning techniques
53
- - **UI formatting**: Read `${CLAUDE_SKILL_DIR}/../../shared/utils/ui-formatting.md` ACE output formatting rules
54
-
55
- ## Process
56
-
57
- Use the `ace-wiki-mapper` agent for codebase analysis and document generation.
58
-
59
- 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.
60
-
61
- Read all supporting resources listed above, then execute the workflow defined in [workflow.xml](workflow.xml) end-to-end. Preserve all workflow gates (validation, user questions, commits).
62
-
63
- The workflow has 13 steps:
64
- 1-5: Setup, context loading, subsystem resolution, document triage, directory creation
65
- 6-8: Structure + architecture agents (parallel) + collect results
66
- 9: Update system-wide docs (system-structure.md, system-architecture.md)
67
- 10: Module discovery (3 parallel discovery agents + 1 synthesis agent)
68
- 11: Knowledge documentation — run map-story for EACH discovered module (sequential)
69
- 12: Verify and commit all documents
70
- 13: Completion report
71
-
72
- Steps 10-11 are CRITICAL they produce the knowledge docs (systems/, patterns/, cross-cutting/, guides/, walkthroughs/, decisions/) that AI agents need for future implementations. Do NOT skip them.
73
-
74
- ## Artifacts
75
-
76
- ```
77
- .docs/wiki/subsystems/[subsystem-name]/structure.md
78
- .docs/wiki/subsystems/[subsystem-name]/architecture.md
79
- .docs/wiki/subsystems/[subsystem-name]/systems/*.md
80
- .docs/wiki/subsystems/[subsystem-name]/patterns/*.md
81
- .docs/wiki/subsystems/[subsystem-name]/cross-cutting/*.md
82
- .docs/wiki/subsystems/[subsystem-name]/guides/*.md
83
- .docs/wiki/subsystems/[subsystem-name]/walkthroughs/*.md
84
- .docs/wiki/subsystems/[subsystem-name]/decisions/*.md
85
- .ace/artifacts/subsystems/[subsystem-name]/module-discovery/module-discovery.md
86
- .ace/artifacts/subsystems/[subsystem-name]/module-discovery/existing-docs-inventory.md
87
- .docs/wiki/system-wide/system-structure.md (subsystem entry added if new)
88
- .docs/wiki/system-wide/system-architecture.md (subsystem responsibility matrix updated)
89
- ```
90
-
91
- ## Example Usage
92
-
93
- ```
94
- # Map a subsystem by path
95
- /ace:map-subsystem subsystem="src/api"
96
-
97
- # Map a subsystem with existing docs
98
- /ace:map-subsystem subsystem="src/auth" existing-docs="docs/auth-design.md,docs/auth/"
99
-
100
- # Map a subsystem by name
101
- /ace:map-subsystem subsystem="authentication"
102
- ```
103
-
104
- ## Next Steps
105
-
106
- After this command, `/clear` first for a fresh context window, then:
107
-
108
- - `/ace:map-subsystem subsystem="src/other"` Map another subsystem
109
- - `/ace:init-coding-standards` Define prescriptive coding standards
110
- - `/ace:help` Check project initialization status and next steps
111
- - Review and edit files in `.docs/wiki/subsystems/` anytime
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
- const cwd = process.cwd();
21
- const args = process.argv.slice(2);
22
- const raw = args.includes('--raw');
23
- const cmd = args[0];
24
-
25
- switch (cmd) {
26
- case 'init':
27
- cmdInit(cwd, raw, args.slice(1).filter(a => a !== '--raw'));
28
- break;
29
- default:
30
- error(`Unknown command: ${cmd}\nAvailable: init`);
31
- }
32
-
33
- // ─── Init: Map Subsystem ────────────────────────────────────────────────────
34
-
35
- function cmdInit(cwd, raw) {
36
- const config = loadConfig(cwd);
37
- const brownfield = detectBrownfieldStatus(cwd);
38
-
39
- const wikiDir = '.docs/wiki/subsystems';
40
- const wikiDirExists = pathExists(cwd, wikiDir);
41
-
42
- const result = {
43
- // Models
44
- mapper_model: resolveModel(cwd, 'ace-wiki-mapper'),
45
-
46
- // Config
47
- commit_docs: config.commit_docs,
48
-
49
- // Brownfield detection
50
- ...brownfield,
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
+ });