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,238 +1,229 @@
|
|
|
1
|
-
#!/usr/bin/env node
|
|
2
|
-
|
|
3
|
-
/**
|
|
4
|
-
* research-external-solution skill script — Entry point for ace-tools operations
|
|
5
|
-
* needed by the research-external-solution skill.
|
|
6
|
-
*
|
|
7
|
-
* Subcommands:
|
|
8
|
-
* init [story-param] Environment detection for research-external-solution workflow
|
|
9
|
-
*
|
|
10
|
-
* Usage: node script.js <subcommand> [args] [--raw]
|
|
11
|
-
*/
|
|
12
|
-
|
|
13
|
-
const path = require('path');
|
|
14
|
-
|
|
15
|
-
const {
|
|
16
|
-
loadConfig, pathExists, safeReadFile, loadSettings, resolveModel,
|
|
17
|
-
execCommand, output, error,
|
|
18
|
-
} = require('../../shared/lib/ace-core');
|
|
19
|
-
|
|
20
|
-
const {
|
|
21
|
-
classifyStoryParam, extractStoryMetadata, extractStoryRequirements,
|
|
22
|
-
extractWikiReferences,
|
|
23
|
-
computeStoryPaths,
|
|
24
|
-
} = require('../../shared/lib/ace-story');
|
|
25
|
-
|
|
26
|
-
// ─── CLI Dispatch ────────────────────────────────────────────────────────────
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
const
|
|
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
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
if (!
|
|
116
|
-
storyError =
|
|
117
|
-
} else {
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
:
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
wiki_references: wikiRefs,
|
|
231
|
-
wiki_docs_exist: {
|
|
232
|
-
existing: wikiExisting,
|
|
233
|
-
missing: wikiMissing,
|
|
234
|
-
},
|
|
235
|
-
};
|
|
236
|
-
|
|
237
|
-
output(result, raw);
|
|
238
|
-
}
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* research-external-solution skill script — Entry point for ace-tools operations
|
|
5
|
+
* needed by the research-external-solution skill.
|
|
6
|
+
*
|
|
7
|
+
* Subcommands:
|
|
8
|
+
* init [story-param] Environment detection for research-external-solution workflow
|
|
9
|
+
*
|
|
10
|
+
* Usage: node script.js <subcommand> [args] [--raw]
|
|
11
|
+
*/
|
|
12
|
+
|
|
13
|
+
const path = require('path');
|
|
14
|
+
|
|
15
|
+
const {
|
|
16
|
+
loadConfig, pathExists, safeReadFile, loadSettings, resolveModel,
|
|
17
|
+
execCommand, output, error, runSkillScript,
|
|
18
|
+
} = require('../../shared/lib/ace-core');
|
|
19
|
+
|
|
20
|
+
const {
|
|
21
|
+
classifyStoryParam, extractStoryMetadata, extractStoryRequirements,
|
|
22
|
+
extractWikiReferences,
|
|
23
|
+
computeStoryPaths,
|
|
24
|
+
} = require('../../shared/lib/ace-story');
|
|
25
|
+
|
|
26
|
+
// ─── CLI Dispatch ────────────────────────────────────────────────────────────
|
|
27
|
+
|
|
28
|
+
runSkillScript({
|
|
29
|
+
init: cmdInit,
|
|
30
|
+
'verify-path-exists': (cwd, raw, args, parsed) => {
|
|
31
|
+
const targetPath = parsed._positional || args.join(' ');
|
|
32
|
+
if (!targetPath) error('verify-path-exists requires path argument');
|
|
33
|
+
const exists = pathExists(cwd, targetPath);
|
|
34
|
+
output({ exists, path: targetPath }, raw, String(exists));
|
|
35
|
+
},
|
|
36
|
+
});
|
|
37
|
+
|
|
38
|
+
// ─── Init: Research Story ───────────────────────────────────────────────────
|
|
39
|
+
|
|
40
|
+
/**
|
|
41
|
+
* Environment detection for the research-external-solution workflow.
|
|
42
|
+
*
|
|
43
|
+
* Replicates cmdInitResearchStory from ace-tools.js:
|
|
44
|
+
* 1. loadConfig, detect git/gh CLI/github_project
|
|
45
|
+
* 2. classifyStoryParam — validate story source
|
|
46
|
+
* 3. Load story content (from file or GitHub)
|
|
47
|
+
* 4. extractStoryMetadata, extractStoryRequirements, extractWikiReferences
|
|
48
|
+
* 5. computeStoryPaths or derive from file location
|
|
49
|
+
* 6. Check artifact existence (external/integration analysis, feature file)
|
|
50
|
+
* 7. Verify wiki doc existence
|
|
51
|
+
* 8. Output JSON with all data
|
|
52
|
+
*/
|
|
53
|
+
function cmdInit(cwd, raw, args, parsed) {
|
|
54
|
+
const storyParam = parsed.story || parsed._positional || null;
|
|
55
|
+
const config = loadConfig(cwd);
|
|
56
|
+
|
|
57
|
+
// ── Environment detection ──
|
|
58
|
+
const has_git = pathExists(cwd, '.git');
|
|
59
|
+
const has_gh_cli = (() => {
|
|
60
|
+
try {
|
|
61
|
+
const { execSync } = require('child_process');
|
|
62
|
+
execSync('gh --version', { stdio: 'pipe' });
|
|
63
|
+
return true;
|
|
64
|
+
} catch { return false; }
|
|
65
|
+
})();
|
|
66
|
+
const github_project = (() => {
|
|
67
|
+
const settings = loadSettings(cwd);
|
|
68
|
+
return settings.github_project;
|
|
69
|
+
})();
|
|
70
|
+
|
|
71
|
+
// ── Classify the story parameter ──
|
|
72
|
+
const classified = classifyStoryParam(storyParam);
|
|
73
|
+
|
|
74
|
+
// Early exit if invalid
|
|
75
|
+
if (classified.type === null || classified.type === 'invalid') {
|
|
76
|
+
output({
|
|
77
|
+
analyst_model: resolveModel(cwd, 'ace-code-integration-analyst'),
|
|
78
|
+
mapper_model: resolveModel(cwd, 'ace-wiki-mapper'),
|
|
79
|
+
commit_docs: config.commit_docs,
|
|
80
|
+
has_git, has_gh_cli, github_project,
|
|
81
|
+
story_source: null,
|
|
82
|
+
story_valid: false,
|
|
83
|
+
story_error: classified.reason || 'No story parameter provided',
|
|
84
|
+
story: { id: null, title: null, status: null, size: null },
|
|
85
|
+
feature: { id: null, title: null },
|
|
86
|
+
epic: { id: null, title: null },
|
|
87
|
+
user_story: null, description: null, acceptance_criteria_count: 0,
|
|
88
|
+
paths: null,
|
|
89
|
+
has_external_analysis: false, has_integration_analysis: false, has_feature_file: false,
|
|
90
|
+
wiki_references: { system_wide: [], subsystem_docs: [], total_count: 0 },
|
|
91
|
+
wiki_docs_exist: { existing: [], missing: [] },
|
|
92
|
+
}, raw);
|
|
93
|
+
return;
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
// ── Load story content ──
|
|
97
|
+
let storyContent = null;
|
|
98
|
+
let storySource = classified.type === 'file' ? 'file' : 'github';
|
|
99
|
+
let storyError = null;
|
|
100
|
+
let storyFilePath = null;
|
|
101
|
+
|
|
102
|
+
if (classified.type === 'file') {
|
|
103
|
+
const resolvedPath = path.isAbsolute(classified.filePath)
|
|
104
|
+
? classified.filePath
|
|
105
|
+
: path.join(cwd, classified.filePath);
|
|
106
|
+
if (!pathExists(cwd, classified.filePath)) {
|
|
107
|
+
storyError = `Story file not found: ${classified.filePath}`;
|
|
108
|
+
} else {
|
|
109
|
+
storyContent = safeReadFile(resolvedPath);
|
|
110
|
+
storyFilePath = classified.filePath;
|
|
111
|
+
if (!storyContent) storyError = `Could not read story file: ${classified.filePath}`;
|
|
112
|
+
}
|
|
113
|
+
} else {
|
|
114
|
+
// github-url or issue-number
|
|
115
|
+
if (!has_gh_cli) {
|
|
116
|
+
storyError = 'GitHub CLI (gh) not installed. Cannot fetch GitHub issues.';
|
|
117
|
+
} else {
|
|
118
|
+
const repo = classified.repo || (github_project.repo || null);
|
|
119
|
+
if (!repo) {
|
|
120
|
+
storyError = 'No repository configured. Provide a full GitHub URL or configure github_project.repo in settings.';
|
|
121
|
+
} else {
|
|
122
|
+
const ghResult = execCommand(
|
|
123
|
+
`gh issue view ${classified.issueNumber} --repo ${repo} --json title,body,labels,state`,
|
|
124
|
+
cwd
|
|
125
|
+
);
|
|
126
|
+
if (!ghResult) {
|
|
127
|
+
storyError = `Could not fetch GitHub issue #${classified.issueNumber} from ${repo}.`;
|
|
128
|
+
} else {
|
|
129
|
+
try {
|
|
130
|
+
const issue = JSON.parse(ghResult);
|
|
131
|
+
storyContent = issue.body || '';
|
|
132
|
+
if (storyContent && !storyContent.match(/^#\s+/m)) {
|
|
133
|
+
storyContent = `# ${issue.title}\n\n${storyContent}`;
|
|
134
|
+
}
|
|
135
|
+
} catch {
|
|
136
|
+
storyError = `Failed to parse GitHub issue response for #${classified.issueNumber}.`;
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
|
|
143
|
+
// ── Extract metadata & requirements ──
|
|
144
|
+
const metadata = extractStoryMetadata(storyContent);
|
|
145
|
+
const requirements = extractStoryRequirements(storyContent);
|
|
146
|
+
const wikiRefs = extractWikiReferences(storyContent);
|
|
147
|
+
|
|
148
|
+
// ── Compute paths ──
|
|
149
|
+
let paths = null;
|
|
150
|
+
if (storyFilePath) {
|
|
151
|
+
const resolvedPath = path.isAbsolute(storyFilePath)
|
|
152
|
+
? storyFilePath
|
|
153
|
+
: path.join(cwd, storyFilePath);
|
|
154
|
+
const storyDir = path.dirname(resolvedPath);
|
|
155
|
+
const relStoryDir = path.relative(cwd, storyDir).replace(/\\/g, '/');
|
|
156
|
+
const storySlug = path.basename(storyDir);
|
|
157
|
+
const featureDir = path.dirname(storyDir);
|
|
158
|
+
const relFeatureDir = path.relative(cwd, featureDir).replace(/\\/g, '/');
|
|
159
|
+
const featureSlug = path.basename(featureDir);
|
|
160
|
+
|
|
161
|
+
paths = {
|
|
162
|
+
epic_slug: null,
|
|
163
|
+
feature_slug: featureSlug,
|
|
164
|
+
story_slug: storySlug,
|
|
165
|
+
story_dir: relStoryDir,
|
|
166
|
+
story_file: storyFilePath.replace(/\\/g, '/'),
|
|
167
|
+
external_analysis_file: `${relStoryDir}/external-analysis.md`,
|
|
168
|
+
integration_analysis_file: `${relStoryDir}/integration-analysis.md`,
|
|
169
|
+
feature_dir: relFeatureDir,
|
|
170
|
+
feature_file: `${relFeatureDir}/${featureSlug}.md`,
|
|
171
|
+
};
|
|
172
|
+
} else if (metadata.epic.id && metadata.feature.id && metadata.id) {
|
|
173
|
+
paths = computeStoryPaths(
|
|
174
|
+
metadata.epic.id, metadata.epic.title || '',
|
|
175
|
+
metadata.feature.id, metadata.feature.title || '',
|
|
176
|
+
metadata.id, metadata.title || ''
|
|
177
|
+
);
|
|
178
|
+
}
|
|
179
|
+
|
|
180
|
+
// ── Check artifact existence ──
|
|
181
|
+
const has_external_analysis = paths ? pathExists(cwd, paths.external_analysis_file) : false;
|
|
182
|
+
const has_integration_analysis = paths ? pathExists(cwd, paths.integration_analysis_file) : false;
|
|
183
|
+
const has_feature_file = paths ? pathExists(cwd, paths.feature_file) : false;
|
|
184
|
+
|
|
185
|
+
// ── Verify wiki doc existence ──
|
|
186
|
+
const allWikiPaths = [...wikiRefs.system_wide, ...wikiRefs.subsystem_docs.map(d => d.path)];
|
|
187
|
+
const wikiExisting = [];
|
|
188
|
+
const wikiMissing = [];
|
|
189
|
+
for (const wikiPath of allWikiPaths) {
|
|
190
|
+
if (pathExists(cwd, wikiPath)) {
|
|
191
|
+
wikiExisting.push(wikiPath);
|
|
192
|
+
} else {
|
|
193
|
+
wikiMissing.push(wikiPath);
|
|
194
|
+
}
|
|
195
|
+
}
|
|
196
|
+
|
|
197
|
+
// ── Build result ──
|
|
198
|
+
const result = {
|
|
199
|
+
analyst_model: resolveModel(cwd, 'ace-code-integration-analyst'),
|
|
200
|
+
mapper_model: resolveModel(cwd, 'ace-wiki-mapper'),
|
|
201
|
+
commit_docs: config.commit_docs,
|
|
202
|
+
has_git, has_gh_cli, github_project,
|
|
203
|
+
story_source: storySource,
|
|
204
|
+
story_valid: storyContent !== null && storyError === null,
|
|
205
|
+
story_error: storyError,
|
|
206
|
+
story: {
|
|
207
|
+
id: metadata.id,
|
|
208
|
+
title: metadata.title,
|
|
209
|
+
status: metadata.status,
|
|
210
|
+
size: metadata.size,
|
|
211
|
+
},
|
|
212
|
+
feature: metadata.feature,
|
|
213
|
+
epic: metadata.epic,
|
|
214
|
+
user_story: requirements.user_story,
|
|
215
|
+
description: requirements.description,
|
|
216
|
+
acceptance_criteria_count: requirements.acceptance_criteria_count,
|
|
217
|
+
paths,
|
|
218
|
+
has_external_analysis,
|
|
219
|
+
has_integration_analysis,
|
|
220
|
+
has_feature_file,
|
|
221
|
+
wiki_references: wikiRefs,
|
|
222
|
+
wiki_docs_exist: {
|
|
223
|
+
existing: wikiExisting,
|
|
224
|
+
missing: wikiMissing,
|
|
225
|
+
},
|
|
226
|
+
};
|
|
227
|
+
|
|
228
|
+
output(result, raw);
|
|
229
|
+
}
|