ma-agents 3.8.0 → 3.9.0
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/README.md +4 -5
- package/bin/cli.js +104 -27
- package/lib/agents.js +12 -20
- package/lib/bmad-extension/skills/add-sprint/SKILL.md +39 -0
- package/lib/bmad-extension/skills/add-to-sprint/SKILL.md +39 -0
- package/lib/bmad-extension/skills/bmad-dev-story/workflow.md +39 -0
- package/lib/bmad-extension/skills/bmad-sprint-planning/workflow.md +41 -0
- package/lib/bmad-extension/skills/bmad-sprint-status/workflow.md +39 -0
- package/lib/bmad-extension/skills/cleanup-done/SKILL.md +39 -0
- package/lib/bmad-extension/skills/close-sprint/SKILL.md +39 -0
- package/lib/bmad-extension/skills/generate-backlog/SKILL.md +41 -0
- package/lib/bmad-extension/skills/modify-sprint/SKILL.md +39 -0
- package/lib/bmad-extension/skills/prioritize-backlog/SKILL.md +39 -0
- package/lib/bmad-extension/skills/remove-from-sprint/SKILL.md +39 -0
- package/lib/bmad-extension/skills/sprint-status-view/SKILL.md +39 -0
- package/lib/bmad-extension-plugin/.claude-plugin/marketplace.json +1 -1
- package/lib/bmad-extension-plugin/skills/add-sprint/SKILL.md +39 -0
- package/lib/bmad-extension-plugin/skills/add-to-sprint/SKILL.md +39 -0
- package/lib/bmad-extension-plugin/skills/bmad-dev-story/workflow.md +39 -0
- package/lib/bmad-extension-plugin/skills/bmad-sprint-planning/workflow.md +41 -0
- package/lib/bmad-extension-plugin/skills/bmad-sprint-status/workflow.md +39 -0
- package/lib/bmad-extension-plugin/skills/cleanup-done/SKILL.md +39 -0
- package/lib/bmad-extension-plugin/skills/close-sprint/SKILL.md +39 -0
- package/lib/bmad-extension-plugin/skills/generate-backlog/SKILL.md +41 -0
- package/lib/bmad-extension-plugin/skills/modify-sprint/SKILL.md +39 -0
- package/lib/bmad-extension-plugin/skills/prioritize-backlog/SKILL.md +39 -0
- package/lib/bmad-extension-plugin/skills/remove-from-sprint/SKILL.md +39 -0
- package/lib/bmad-extension-plugin/skills/sprint-status-view/SKILL.md +39 -0
- package/lib/bmad.js +3 -7
- package/lib/installer.js +6 -1
- package/package.json +1 -1
- package/skills/add-sprint/SKILL.md +39 -0
- package/skills/add-to-sprint/SKILL.md +39 -0
- package/skills/bmad-sprint-planning/SKILL.md +41 -0
- package/skills/bmad-sprint-status/SKILL.md +39 -0
- package/skills/cleanup-done/SKILL.md +39 -0
- package/skills/close-sprint/SKILL.md +39 -0
- package/skills/generate-backlog/SKILL.md +41 -0
- package/skills/modify-sprint/SKILL.md +39 -0
- package/skills/prioritize-backlog/SKILL.md +39 -0
- package/skills/remove-from-sprint/SKILL.md +39 -0
- package/skills/sprint-status-view/SKILL.md +39 -0
- package/skills/story-status-lookup/SKILL.md +38 -21
package/README.md
CHANGED
|
@@ -2,12 +2,11 @@
|
|
|
2
2
|
|
|
3
3
|
A universal NPX tool to install AI coding agent skills. Write skills once, install them across Claude Code, Gemini, Copilot, Cline, Cursor, Kilocode, and Roo Code.
|
|
4
4
|
|
|
5
|
-
## What's New in v3.
|
|
5
|
+
## What's New in v3.9.0
|
|
6
6
|
|
|
7
|
-
- **
|
|
8
|
-
-
|
|
9
|
-
- **
|
|
10
|
-
- **Plugin resolver verified** — bundle resolves via BMAD's Strategy 1 (module.yaml); no package.json needed; 134 skills install cleanly in all CI matrix configurations
|
|
7
|
+
- **Jira sprint backend** — the install wizard now offers Jira as a 4th sprint management option. Select Jira to provide your Jira URL and project key; credentials are stored in `_bmad/bmm/config.yaml`. All 13 sprint management skills automatically route operations to Jira or file-system based on `tracking_system` in `sprint-status.yaml`.
|
|
8
|
+
- **Skill-level Jira routing** — every sprint skill reads `tracking_system` and routes to the Jira backend via whatever Jira-capable tool is available in your agent context (MCP server, plugin, or native integration). Failure prompts offer retry or permanent switch to file management.
|
|
9
|
+
- **Routing alignment (3.8.1)** — copilot, roo-code, and kilocode persona skills now land in `.agents/skills/` to match `bmad-method 6.5.0`'s unified target directory.
|
|
11
10
|
|
|
12
11
|
See [CHANGELOG.md](CHANGELOG.md) for full release notes.
|
|
13
12
|
|
package/bin/cli.js
CHANGED
|
@@ -380,6 +380,46 @@ async function collectRemotePath(concern) {
|
|
|
380
380
|
}
|
|
381
381
|
}
|
|
382
382
|
|
|
383
|
+
async function collectJiraConfig() {
|
|
384
|
+
// Collect Jira server URL
|
|
385
|
+
let jiraUrl;
|
|
386
|
+
while (true) {
|
|
387
|
+
const { url } = await prompts({
|
|
388
|
+
type: 'text',
|
|
389
|
+
name: 'url',
|
|
390
|
+
message: 'Jira server URL (e.g. https://mycompany.atlassian.net):'
|
|
391
|
+
});
|
|
392
|
+
if (!url || !url.trim()) {
|
|
393
|
+
console.log(chalk.red(' Jira server URL cannot be empty. Please try again.'));
|
|
394
|
+
continue;
|
|
395
|
+
}
|
|
396
|
+
jiraUrl = url.trim();
|
|
397
|
+
break;
|
|
398
|
+
}
|
|
399
|
+
|
|
400
|
+
// Collect Jira project key
|
|
401
|
+
let jiraProjectKey;
|
|
402
|
+
while (true) {
|
|
403
|
+
const { key } = await prompts({
|
|
404
|
+
type: 'text',
|
|
405
|
+
name: 'key',
|
|
406
|
+
message: 'Jira project key (e.g. MYPROJ):'
|
|
407
|
+
});
|
|
408
|
+
if (!key || !key.trim()) {
|
|
409
|
+
console.log(chalk.red(' Jira project key cannot be empty. Please try again.'));
|
|
410
|
+
continue;
|
|
411
|
+
}
|
|
412
|
+
if (!/^[A-Z][A-Z0-9]+$/.test(key.trim())) {
|
|
413
|
+
console.log(chalk.red(' Jira project key must be uppercase alphanumeric (e.g. MYPROJ). Please try again.'));
|
|
414
|
+
continue;
|
|
415
|
+
}
|
|
416
|
+
jiraProjectKey = key.trim();
|
|
417
|
+
break;
|
|
418
|
+
}
|
|
419
|
+
|
|
420
|
+
return { mode: 'jira', jiraUrl, jiraProjectKey };
|
|
421
|
+
}
|
|
422
|
+
|
|
383
423
|
function normalizePath(p) {
|
|
384
424
|
return p.replace(/\\/g, '/');
|
|
385
425
|
}
|
|
@@ -428,24 +468,43 @@ function writeRepoLayoutConfig(layout) {
|
|
|
428
468
|
const configPath = path.join(process.cwd(), '_bmad', 'bmm', 'config.yaml');
|
|
429
469
|
try {
|
|
430
470
|
if (!fs.existsSync(configPath)) {
|
|
431
|
-
|
|
432
|
-
|
|
471
|
+
// Create an empty file so writeConfigField can append to it
|
|
472
|
+
fs.mkdirSync(path.join(process.cwd(), '_bmad', 'bmm'), { recursive: true });
|
|
473
|
+
fs.writeFileSync(configPath, '', 'utf-8');
|
|
433
474
|
}
|
|
434
475
|
let content = fs.readFileSync(configPath, 'utf-8');
|
|
435
476
|
const projectRoot = process.cwd();
|
|
436
477
|
const kbPortable = toPortablePath(layout.knowledgebase.path, projectRoot);
|
|
437
|
-
const spPortable = toPortablePath(layout.sprintManagement.path, projectRoot);
|
|
438
478
|
const kbPath = kbPortable.portable;
|
|
439
|
-
const spPath = spPortable.portable;
|
|
440
479
|
content = writeConfigField(content, 'knowledgebase_path', kbPath);
|
|
441
|
-
|
|
442
|
-
|
|
443
|
-
|
|
444
|
-
|
|
445
|
-
|
|
446
|
-
|
|
447
|
-
|
|
448
|
-
|
|
480
|
+
|
|
481
|
+
const spMode = layout.sprintManagement.mode;
|
|
482
|
+
if (spMode === 'jira') {
|
|
483
|
+
// Jira backend: write sprint_backend + Jira config; no sprint_management_path
|
|
484
|
+
content = writeConfigField(content, 'sprint_backend', 'jira');
|
|
485
|
+
content = writeConfigField(content, 'jira_url', layout.sprintManagement.jiraUrl);
|
|
486
|
+
content = writeConfigField(content, 'jira_project_key', layout.sprintManagement.jiraProjectKey);
|
|
487
|
+
// Derive artifact paths from kb only
|
|
488
|
+
const planningArtifacts = kbPath === '.' ? '_bmad-output/planning-artifacts' : `${kbPath}/_bmad-output/planning-artifacts`;
|
|
489
|
+
const implArtifacts = '_bmad-output/implementation-artifacts';
|
|
490
|
+
content = writeConfigField(content, 'planning_artifacts', planningArtifacts);
|
|
491
|
+
content = writeConfigField(content, 'implementation_artifacts', implArtifacts);
|
|
492
|
+
fs.writeFileSync(configPath, content, 'utf-8');
|
|
493
|
+
console.log(chalk.gray(` Config: knowledgebase_path="${kbPath}", sprint_backend=jira, jira_url="${layout.sprintManagement.jiraUrl}", jira_project_key="${layout.sprintManagement.jiraProjectKey}"`));
|
|
494
|
+
} else {
|
|
495
|
+
// File-system backend
|
|
496
|
+
const spPortable = toPortablePath(layout.sprintManagement.path, projectRoot);
|
|
497
|
+
const spPath = spPortable.portable;
|
|
498
|
+
content = writeConfigField(content, 'sprint_backend', 'file-system');
|
|
499
|
+
content = writeConfigField(content, 'sprint_management_path', spPath);
|
|
500
|
+
// Derive workflow-consumable artifact paths from layout paths (relative when base is relative)
|
|
501
|
+
const planningArtifacts = kbPath === '.' ? '_bmad-output/planning-artifacts' : `${kbPath}/_bmad-output/planning-artifacts`;
|
|
502
|
+
const implArtifacts = spPath === '.' ? '_bmad-output/implementation-artifacts' : `${spPath}/_bmad-output/implementation-artifacts`;
|
|
503
|
+
content = writeConfigField(content, 'planning_artifacts', planningArtifacts);
|
|
504
|
+
content = writeConfigField(content, 'implementation_artifacts', implArtifacts);
|
|
505
|
+
fs.writeFileSync(configPath, content, 'utf-8');
|
|
506
|
+
console.log(chalk.gray(` Config: knowledgebase_path="${kbPath}", sprint_backend=file-system, sprint_management_path="${spPath}"`));
|
|
507
|
+
}
|
|
449
508
|
} catch (e) {
|
|
450
509
|
console.log(chalk.red(` Cannot write config.yaml: ${e.message}`));
|
|
451
510
|
}
|
|
@@ -453,6 +512,7 @@ function writeRepoLayoutConfig(layout) {
|
|
|
453
512
|
|
|
454
513
|
function writeProjectLayoutYaml(layout) {
|
|
455
514
|
const layoutPath = path.join(process.cwd(), '_bmad-output', 'project-layout.yaml');
|
|
515
|
+
// Only skip writing when BOTH concerns are truly same-repo (jira requires config recording)
|
|
456
516
|
const bothSame = layout.knowledgebase.mode === 'same' && layout.sprintManagement.mode === 'same';
|
|
457
517
|
|
|
458
518
|
if (bothSame) {
|
|
@@ -464,7 +524,7 @@ function writeProjectLayoutYaml(layout) {
|
|
|
464
524
|
return;
|
|
465
525
|
}
|
|
466
526
|
|
|
467
|
-
// Multi-repo: generate project-layout.yaml
|
|
527
|
+
// Multi-repo or Jira mode: generate project-layout.yaml
|
|
468
528
|
fs.mkdirSync(path.join(process.cwd(), '_bmad-output'), { recursive: true });
|
|
469
529
|
|
|
470
530
|
const date = new Date().toISOString().slice(0, 10);
|
|
@@ -487,15 +547,20 @@ function writeProjectLayoutYaml(layout) {
|
|
|
487
547
|
}
|
|
488
548
|
|
|
489
549
|
// Sprint management section
|
|
490
|
-
const spPortable = toPortablePath(layout.sprintManagement.path, projectRoot);
|
|
491
550
|
content += `sprint_management:\n`;
|
|
492
551
|
content += ` mode: ${layout.sprintManagement.mode}\n`;
|
|
493
|
-
|
|
494
|
-
|
|
495
|
-
content += `
|
|
496
|
-
}
|
|
497
|
-
|
|
498
|
-
content += `
|
|
552
|
+
if (layout.sprintManagement.mode === 'jira') {
|
|
553
|
+
content += ` jira_url: ${yamlEscapeValue(layout.sprintManagement.jiraUrl)}\n`;
|
|
554
|
+
content += ` jira_project_key: ${yamlEscapeValue(layout.sprintManagement.jiraProjectKey)}\n`;
|
|
555
|
+
} else {
|
|
556
|
+
const spPortable = toPortablePath(layout.sprintManagement.path, projectRoot);
|
|
557
|
+
content += ` path: ${yamlEscapeValue(spPortable.portable)}\n`;
|
|
558
|
+
if (spPortable.isAbsolute) {
|
|
559
|
+
content += ` # PORTABILITY: absolute path — other developers may need to reconfigure\n`;
|
|
560
|
+
}
|
|
561
|
+
if (layout.sprintManagement.mode === 'remote' && layout.sprintManagement.gitUrl) {
|
|
562
|
+
content += ` gitUrl: ${yamlEscapeValue(layout.sprintManagement.gitUrl)}\n`;
|
|
563
|
+
}
|
|
499
564
|
}
|
|
500
565
|
|
|
501
566
|
fs.writeFileSync(layoutPath, content, 'utf-8');
|
|
@@ -529,14 +594,23 @@ function readExistingLayout() {
|
|
|
529
594
|
const modeMatch = afterSection.match(/^\s+mode:\s*(\S+)/m);
|
|
530
595
|
const pathMatch = afterSection.match(/^\s+path:\s*"?([^"\n]+)"?/m);
|
|
531
596
|
const gitUrlMatch = afterSection.match(/^\s+gitUrl:\s*"?([^"\n]+)"?/m);
|
|
532
|
-
|
|
533
|
-
|
|
534
|
-
|
|
535
|
-
|
|
536
|
-
|
|
537
|
-
|
|
597
|
+
const jiraUrlMatch = afterSection.match(/^\s+jira_url:\s*"?([^"\n]+)"?/m);
|
|
598
|
+
const jiraProjectKeyMatch = afterSection.match(/^\s+jira_project_key:\s*"?([^"\n]+)"?/m);
|
|
599
|
+
|
|
600
|
+
if (modeMatch) {
|
|
601
|
+
const mode = modeMatch[1];
|
|
602
|
+
if (mode === 'jira') {
|
|
603
|
+
const jiraUrl = jiraUrlMatch ? jiraUrlMatch[1].replace(/^"(.*)"$/, '$1') : '';
|
|
604
|
+
const jiraProjectKey = jiraProjectKeyMatch ? jiraProjectKeyMatch[1].replace(/^"(.*)"$/, '$1') : '';
|
|
605
|
+
layout[key] = { mode: 'jira', jiraUrl, jiraProjectKey };
|
|
606
|
+
} else if (pathMatch) {
|
|
607
|
+
const resolvedPath = resolveStoredPath(pathMatch[1], projectRoot);
|
|
608
|
+
const entry = { mode, path: resolvedPath };
|
|
609
|
+
if (mode === 'remote' && gitUrlMatch) {
|
|
610
|
+
entry.gitUrl = gitUrlMatch[1];
|
|
611
|
+
}
|
|
612
|
+
layout[key] = entry;
|
|
538
613
|
}
|
|
539
|
-
layout[key] = entry;
|
|
540
614
|
}
|
|
541
615
|
}
|
|
542
616
|
|
|
@@ -666,6 +740,7 @@ async function collectRepoLayout(flags, existingLayout = null) {
|
|
|
666
740
|
{ title: 'Current repository (default)', value: 'same' },
|
|
667
741
|
{ title: 'Local path', value: 'local' },
|
|
668
742
|
{ title: 'Remote git repository', value: 'remote' },
|
|
743
|
+
...(concern === 'sprintManagement' ? [{ title: 'Jira', value: 'jira' }] : []),
|
|
669
744
|
];
|
|
670
745
|
// Pre-select existing mode if available
|
|
671
746
|
const initialIndex = existingMode ? modeChoices.findIndex(c => c.value === existingMode) : 0;
|
|
@@ -686,6 +761,8 @@ async function collectRepoLayout(flags, existingLayout = null) {
|
|
|
686
761
|
layout[concern] = await collectLocalPath(labels[concern]);
|
|
687
762
|
} else if (mode === 'remote') {
|
|
688
763
|
layout[concern] = await collectRemotePath(labels[concern]);
|
|
764
|
+
} else if (mode === 'jira') {
|
|
765
|
+
layout[concern] = await collectJiraConfig();
|
|
689
766
|
}
|
|
690
767
|
}
|
|
691
768
|
|
package/lib/agents.js
CHANGED
|
@@ -74,22 +74,14 @@ const agents = [
|
|
|
74
74
|
version: '1.0.0',
|
|
75
75
|
category: 'ide',
|
|
76
76
|
description: 'GitHub Copilot Agent Mode',
|
|
77
|
-
//
|
|
78
|
-
//
|
|
79
|
-
//
|
|
80
|
-
//
|
|
81
|
-
//
|
|
82
|
-
//
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
// saw the latter, so personas appeared "missing" for copilot. Aligning
|
|
86
|
-
// the ma-agents target_dir with BMAD's puts both writers in the same
|
|
87
|
-
// tree, identical to the four working tools (Claude Code, Cline,
|
|
88
|
-
// Roo Code, Kilocode). The instruction file path is intentionally
|
|
89
|
-
// unchanged — `.github/copilot/copilot.md` is still where Copilot
|
|
90
|
-
// reads its custom-instructions; only the skills target is moving.
|
|
91
|
-
skillsDir: '.github/skills',
|
|
92
|
-
getProjectPath: () => path.join(process.cwd(), '.github', 'skills'),
|
|
77
|
+
// bmad-method 6.5.0 moved `github-copilot`, `roo`, and `kilo` platforms
|
|
78
|
+
// from their tool-specific directories to the shared `.agents/skills/`
|
|
79
|
+
// tree (see platform-codes.yaml). Aligning here keeps the smoke verifier
|
|
80
|
+
// and all downstream consumers in sync with BMAD's actual write target.
|
|
81
|
+
// The instruction file path is unchanged — `.github/copilot/copilot.md`
|
|
82
|
+
// is still where Copilot reads custom-instructions.
|
|
83
|
+
skillsDir: '.agents/skills',
|
|
84
|
+
getProjectPath: () => path.join(process.cwd(), '.agents', 'skills'),
|
|
93
85
|
getGlobalPath: () => {
|
|
94
86
|
const platform = os.platform();
|
|
95
87
|
if (platform === 'win32') {
|
|
@@ -112,8 +104,8 @@ const agents = [
|
|
|
112
104
|
version: '1.0.0',
|
|
113
105
|
category: 'ide',
|
|
114
106
|
description: 'Kilocode AI Assistant',
|
|
115
|
-
skillsDir: '.
|
|
116
|
-
getProjectPath: () => path.join(process.cwd(), '.
|
|
107
|
+
skillsDir: '.agents/skills',
|
|
108
|
+
getProjectPath: () => path.join(process.cwd(), '.agents', 'skills'),
|
|
117
109
|
getGlobalPath: () => {
|
|
118
110
|
const platform = os.platform();
|
|
119
111
|
if (platform === 'win32') {
|
|
@@ -164,8 +156,8 @@ const agents = [
|
|
|
164
156
|
version: '1.0.0',
|
|
165
157
|
category: 'ide',
|
|
166
158
|
description: 'Roo Code AI Assistant (Enhanced Cline fork)',
|
|
167
|
-
skillsDir: '.
|
|
168
|
-
getProjectPath: () => path.join(process.cwd(), '.
|
|
159
|
+
skillsDir: '.agents/skills',
|
|
160
|
+
getProjectPath: () => path.join(process.cwd(), '.agents', 'skills'),
|
|
169
161
|
getGlobalPath: () => {
|
|
170
162
|
const platform = os.platform();
|
|
171
163
|
if (platform === 'win32') {
|
|
@@ -11,6 +11,45 @@ triggers:
|
|
|
11
11
|
|
|
12
12
|
Guided workflow to create a new sprint entry in the `sprints` section of `sprint-status.yaml` with capacity limits, optional ISO dates, and auto-incremented sprint ID.
|
|
13
13
|
|
|
14
|
+
## Backend Routing
|
|
15
|
+
|
|
16
|
+
Before executing any file-system operations, determine and route to the correct backend:
|
|
17
|
+
|
|
18
|
+
1. Read `_bmad-output/implementation-artifacts/sprint-status.yaml` and extract the `tracking_system` field.
|
|
19
|
+
If the field is absent or the file does not exist, default to `file-system`.
|
|
20
|
+
|
|
21
|
+
2. If `tracking_system` is `file-system`:
|
|
22
|
+
Proceed with the **File-System Backend** instructions below.
|
|
23
|
+
|
|
24
|
+
3. If `tracking_system` is `jira`:
|
|
25
|
+
a. Perform the Jira operation: Create a new sprint in the board for project `{jira_project_key}` at `{jira_url}` using the sprint create API. Set the sprint name, goal (if provided), start date, and end date from the provided sprint data. The new sprint starts in "future/planning" state.
|
|
26
|
+
Use whatever Jira-capable tool is available in your current tool context.
|
|
27
|
+
Map Jira entities to the canonical schema (Sprint → sprints[], Backlog → backlog[],
|
|
28
|
+
Epic → epics[], Jira status → canonical vocabulary per Section 6.3 of the routing spec).
|
|
29
|
+
b. If the Jira operation SUCCEEDS: continue with the Jira data returned. Jira is the source of truth.
|
|
30
|
+
c. If the Jira operation FAILS for any reason:
|
|
31
|
+
- If no Jira-capable tool is available in your current context:
|
|
32
|
+
Pause and present the user with:
|
|
33
|
+
> "No Jira-capable tool is available. To use Jira tracking, configure a Jira integration
|
|
34
|
+
> in your agent (an MCP server, plugin, or native integration connected to the Jira
|
|
35
|
+
> instance at `{jira_url}`). How would you like to proceed?
|
|
36
|
+
> (a) Retry — attempt the Jira operation again once a Jira tool is configured
|
|
37
|
+
> (b) Switch to file management — update sprint-status.yaml and config to use
|
|
38
|
+
> file-system backend, then complete this operation locally. This change is permanent."
|
|
39
|
+
- If a Jira tool attempted the operation but returned an error:
|
|
40
|
+
Pause and present the user with:
|
|
41
|
+
> "The Jira operation failed: {actual Jira error details}. How would you like to proceed?
|
|
42
|
+
> (a) Retry — attempt the Jira operation again
|
|
43
|
+
> (b) Switch to file management — update sprint-status.yaml and config to use
|
|
44
|
+
> file-system backend, then complete this operation locally. This change is permanent."
|
|
45
|
+
If user chooses (b) in either case: write `tracking_system: file-system` to `sprint-status.yaml`,
|
|
46
|
+
update `sprint_backend: file-system` in `_bmad/bmm/config.yaml`,
|
|
47
|
+
then proceed with **File-System Backend** instructions below.
|
|
48
|
+
|
|
49
|
+
4. **File-System Backend** — execute the workflow steps below.
|
|
50
|
+
|
|
51
|
+
---
|
|
52
|
+
|
|
14
53
|
<workflow>
|
|
15
54
|
|
|
16
55
|
<step n="0" goal="Load configuration and validate file existence">
|
|
@@ -13,6 +13,45 @@ Guided workflow to move backlog items to a sprint in the unified `sprint-status.
|
|
|
13
13
|
|
|
14
14
|
**Movement semantics:** Each item exists in exactly one location — either the `backlog` array OR a sprint's `items` array, never both. This skill atomically removes items from `backlog` and appends them to the target sprint's `items` array in a single file write.
|
|
15
15
|
|
|
16
|
+
## Backend Routing
|
|
17
|
+
|
|
18
|
+
Before executing any file-system operations, determine and route to the correct backend:
|
|
19
|
+
|
|
20
|
+
1. Read `_bmad-output/implementation-artifacts/sprint-status.yaml` and extract the `tracking_system` field.
|
|
21
|
+
If the field is absent or the file does not exist, default to `file-system`.
|
|
22
|
+
|
|
23
|
+
2. If `tracking_system` is `file-system`:
|
|
24
|
+
Proceed with the **File-System Backend** instructions below.
|
|
25
|
+
|
|
26
|
+
3. If `tracking_system` is `jira`:
|
|
27
|
+
a. Perform the Jira operation: Find the Jira issue matching the item ID in project `{jira_project_key}` at `{jira_url}` (search by issue key or summary). Find the active sprint on the board for project `{jira_project_key}`. Move the issue to the active sprint using the "add issue to sprint" operation.
|
|
28
|
+
Use whatever Jira-capable tool is available in your current tool context.
|
|
29
|
+
Map Jira entities to the canonical schema (Sprint → sprints[], Backlog → backlog[],
|
|
30
|
+
Epic → epics[], Jira status → canonical vocabulary per Section 6.3 of the routing spec).
|
|
31
|
+
b. If the Jira operation SUCCEEDS: continue with the Jira data returned. Jira is the source of truth.
|
|
32
|
+
c. If the Jira operation FAILS for any reason:
|
|
33
|
+
- If no Jira-capable tool is available in your current context:
|
|
34
|
+
Pause and present the user with:
|
|
35
|
+
> "No Jira-capable tool is available. To use Jira tracking, configure a Jira integration
|
|
36
|
+
> in your agent (an MCP server, plugin, or native integration connected to the Jira
|
|
37
|
+
> instance at `{jira_url}`). How would you like to proceed?
|
|
38
|
+
> (a) Retry — attempt the Jira operation again once a Jira tool is configured
|
|
39
|
+
> (b) Switch to file management — update sprint-status.yaml and config to use
|
|
40
|
+
> file-system backend, then complete this operation locally. This change is permanent."
|
|
41
|
+
- If a Jira tool attempted the operation but returned an error:
|
|
42
|
+
Pause and present the user with:
|
|
43
|
+
> "The Jira operation failed: {actual Jira error details}. How would you like to proceed?
|
|
44
|
+
> (a) Retry — attempt the Jira operation again
|
|
45
|
+
> (b) Switch to file management — update sprint-status.yaml and config to use
|
|
46
|
+
> file-system backend, then complete this operation locally. This change is permanent."
|
|
47
|
+
If user chooses (b) in either case: write `tracking_system: file-system` to `sprint-status.yaml`,
|
|
48
|
+
update `sprint_backend: file-system` in `_bmad/bmm/config.yaml`,
|
|
49
|
+
then proceed with **File-System Backend** instructions below.
|
|
50
|
+
|
|
51
|
+
4. **File-System Backend** — execute the workflow steps below.
|
|
52
|
+
|
|
53
|
+
---
|
|
54
|
+
|
|
16
55
|
<workflow>
|
|
17
56
|
|
|
18
57
|
<step n="0" goal="Load configuration and validate file existence">
|
|
@@ -36,6 +36,45 @@ Load config from `{project-root}/_bmad/bmm/config.yaml` and resolve:
|
|
|
36
36
|
|
|
37
37
|
---
|
|
38
38
|
|
|
39
|
+
## Backend Routing
|
|
40
|
+
|
|
41
|
+
Before executing any status-update operations, determine and route to the correct backend:
|
|
42
|
+
|
|
43
|
+
1. Read `_bmad-output/implementation-artifacts/sprint-status.yaml` and extract the `tracking_system` field.
|
|
44
|
+
If the field is absent or the file does not exist, default to `file-system`.
|
|
45
|
+
|
|
46
|
+
2. If `tracking_system` is `file-system`:
|
|
47
|
+
Proceed with the **File-System Backend** instructions below.
|
|
48
|
+
|
|
49
|
+
3. If `tracking_system` is `jira`:
|
|
50
|
+
a. Perform the Jira operation: Find the Jira issue matching the item ID in project `{jira_project_key}` at `{jira_url}` (search by issue key or summary). Transition the issue to the new status using the Jira issue transition API. Map canonical status to Jira workflow status: backlog → Backlog/Open, ready-for-dev → To Do/Selected for Development, in-progress → In Progress, review → In Review/Code Review, done → Done/Resolved, on-hold → On Hold/Blocked, cancelled → Won't Do/Cancelled.
|
|
51
|
+
Use whatever Jira-capable tool is available in your current tool context.
|
|
52
|
+
Map Jira entities to the canonical schema (Sprint → sprints[], Backlog → backlog[],
|
|
53
|
+
Epic → epics[], Jira status → canonical vocabulary per Section 6.3 of the routing spec).
|
|
54
|
+
b. If the Jira operation SUCCEEDS: continue with the Jira data returned. Jira is the source of truth.
|
|
55
|
+
c. If the Jira operation FAILS for any reason:
|
|
56
|
+
- If no Jira-capable tool is available in your current context:
|
|
57
|
+
Pause and present the user with:
|
|
58
|
+
> "No Jira-capable tool is available. To use Jira tracking, configure a Jira integration
|
|
59
|
+
> in your agent (an MCP server, plugin, or native integration connected to the Jira
|
|
60
|
+
> instance at `{jira_url}`). How would you like to proceed?
|
|
61
|
+
> (a) Retry — attempt the Jira operation again once a Jira tool is configured
|
|
62
|
+
> (b) Switch to file management — update sprint-status.yaml and config to use
|
|
63
|
+
> file-system backend, then complete this operation locally. This change is permanent."
|
|
64
|
+
- If a Jira tool attempted the operation but returned an error:
|
|
65
|
+
Pause and present the user with:
|
|
66
|
+
> "The Jira operation failed: {actual Jira error details}. How would you like to proceed?
|
|
67
|
+
> (a) Retry — attempt the Jira operation again
|
|
68
|
+
> (b) Switch to file management — update sprint-status.yaml and config to use
|
|
69
|
+
> file-system backend, then complete this operation locally. This change is permanent."
|
|
70
|
+
If user chooses (b) in either case: write `tracking_system: file-system` to `sprint-status.yaml`,
|
|
71
|
+
update `sprint_backend: file-system` in `_bmad/bmm/config.yaml`,
|
|
72
|
+
then proceed with **File-System Backend** instructions below.
|
|
73
|
+
|
|
74
|
+
4. **File-System Backend** — execute the workflow steps below.
|
|
75
|
+
|
|
76
|
+
---
|
|
77
|
+
|
|
39
78
|
## EXECUTION
|
|
40
79
|
|
|
41
80
|
<workflow>
|
|
@@ -42,6 +42,47 @@ Load config from `{project-root}/_bmad/bmm/config.yaml` and resolve:
|
|
|
42
42
|
|
|
43
43
|
---
|
|
44
44
|
|
|
45
|
+
## Backend Routing
|
|
46
|
+
|
|
47
|
+
Before executing any file-system operations, determine and route to the correct backend:
|
|
48
|
+
|
|
49
|
+
1. Read `_bmad-output/implementation-artifacts/sprint-status.yaml` and extract the `tracking_system` field.
|
|
50
|
+
If the field is absent or the file does not exist, default to `file-system`.
|
|
51
|
+
|
|
52
|
+
2. If `tracking_system` is `file-system`:
|
|
53
|
+
Proceed with the **File-System Backend** instructions below.
|
|
54
|
+
|
|
55
|
+
3. If `tracking_system` is `jira`:
|
|
56
|
+
> "This operation will create/update Jira sprints and items in bulk. If it fails mid-way, Jira may be in partial state. The Jira server URL is `{jira_url}` and project key is `{jira_project_key}` (from `_bmad/bmm/config.yaml`). Proceed?"
|
|
57
|
+
|
|
58
|
+
a. Perform the Jira operation: Query all epics, backlog issues, sprint definitions, and sprint items for project `{jira_project_key}` at `{jira_url}` (multiple sequential read calls). For the write phase: create new Jira sprints for each sprint definition not already in Jira (one API call per sprint). Create or update Jira issues for each item in the plan (one API call per item). Map item fields as follows: title → issue summary, type → issue type (story → Story, bug → Bug), status → Jira workflow status (see status mapping below), priority → issue priority/rank. Map sprint fields: name → sprint name, start_date → sprint start date, end_date → sprint end date. Status mapping: backlog → Backlog/Open, ready-for-dev → To Do/Selected for Development, in-progress → In Progress, review → In Review/Code Review, done → Done/Resolved, on-hold → On Hold/Blocked, cancelled → Won't Do/Cancelled.
|
|
59
|
+
Use whatever Jira-capable tool is available in your current tool context.
|
|
60
|
+
Map Jira entities to the canonical schema (Sprint → sprints[], Backlog → backlog[],
|
|
61
|
+
Epic → epics[], Jira status → canonical vocabulary per Section 6.3 of the routing spec).
|
|
62
|
+
b. If the Jira operation SUCCEEDS: continue with the Jira data returned. Jira is the source of truth.
|
|
63
|
+
c. If the Jira operation FAILS for any reason:
|
|
64
|
+
- If no Jira-capable tool is available in your current context:
|
|
65
|
+
Pause and present the user with:
|
|
66
|
+
> "No Jira-capable tool is available. To use Jira tracking, configure a Jira integration
|
|
67
|
+
> in your agent (an MCP server, plugin, or native integration connected to the Jira
|
|
68
|
+
> instance at `{jira_url}`). How would you like to proceed?
|
|
69
|
+
> (a) Retry — attempt the Jira operation again once a Jira tool is configured
|
|
70
|
+
> (b) Switch to file management — update sprint-status.yaml and config to use
|
|
71
|
+
> file-system backend, then complete this operation locally. This change is permanent."
|
|
72
|
+
- If a Jira tool attempted the operation but returned an error:
|
|
73
|
+
Pause and present the user with:
|
|
74
|
+
> "The Jira operation failed: {actual Jira error details}. How would you like to proceed?
|
|
75
|
+
> (a) Retry — attempt the Jira operation again
|
|
76
|
+
> (b) Switch to file management — update sprint-status.yaml and config to use
|
|
77
|
+
> file-system backend, then complete this operation locally. This change is permanent."
|
|
78
|
+
If user chooses (b) in either case: write `tracking_system: file-system` to `sprint-status.yaml`,
|
|
79
|
+
update `sprint_backend: file-system` in `_bmad/bmm/config.yaml`,
|
|
80
|
+
then proceed with **File-System Backend** instructions below.
|
|
81
|
+
|
|
82
|
+
4. **File-System Backend** — execute the workflow steps below.
|
|
83
|
+
|
|
84
|
+
---
|
|
85
|
+
|
|
45
86
|
## EXECUTION
|
|
46
87
|
|
|
47
88
|
<workflow>
|
|
@@ -37,6 +37,45 @@ Load config from `{project-root}/_bmad/bmm/config.yaml` and resolve:
|
|
|
37
37
|
|
|
38
38
|
---
|
|
39
39
|
|
|
40
|
+
## Backend Routing
|
|
41
|
+
|
|
42
|
+
Before executing any file-system operations, determine and route to the correct backend:
|
|
43
|
+
|
|
44
|
+
1. Read `_bmad-output/implementation-artifacts/sprint-status.yaml` and extract the `tracking_system` field.
|
|
45
|
+
If the field is absent or the file does not exist, default to `file-system`.
|
|
46
|
+
|
|
47
|
+
2. If `tracking_system` is `file-system`:
|
|
48
|
+
Proceed with the **File-System Backend** instructions below.
|
|
49
|
+
|
|
50
|
+
3. If `tracking_system` is `jira`:
|
|
51
|
+
a. Perform the Jira operation: Query the active sprint for project `{jira_project_key}` at `{jira_url}` and retrieve all sprint issues with their statuses. Query backlog issue count. Query epic progress (completed stories per epic). Map Jira sprint states and issue statuses to canonical vocabulary per the status mapping below. Use this data for health analysis — no writes. Status mapping: Backlog/Open → backlog, To Do/Selected for Development → ready-for-dev, In Progress → in-progress, In Review/Code Review → review, Done/Resolved → done, On Hold/Blocked → on-hold, Won't Do/Cancelled → cancelled.
|
|
52
|
+
Use whatever Jira-capable tool is available in your current tool context.
|
|
53
|
+
Map Jira entities to the canonical schema (Sprint → sprints[], Backlog → backlog[],
|
|
54
|
+
Epic → epics[], Jira status → canonical vocabulary per Section 6.3 of the routing spec).
|
|
55
|
+
b. If the Jira operation SUCCEEDS: continue with the Jira data returned. Jira is the source of truth.
|
|
56
|
+
c. If the Jira operation FAILS for any reason:
|
|
57
|
+
- If no Jira-capable tool is available in your current context:
|
|
58
|
+
Pause and present the user with:
|
|
59
|
+
> "No Jira-capable tool is available. To use Jira tracking, configure a Jira integration
|
|
60
|
+
> in your agent (an MCP server, plugin, or native integration connected to the Jira
|
|
61
|
+
> instance at `{jira_url}`). How would you like to proceed?
|
|
62
|
+
> (a) Retry — attempt the Jira operation again once a Jira tool is configured
|
|
63
|
+
> (b) Switch to file management — update sprint-status.yaml and config to use
|
|
64
|
+
> file-system backend, then complete this operation locally. This change is permanent."
|
|
65
|
+
- If a Jira tool attempted the operation but returned an error:
|
|
66
|
+
Pause and present the user with:
|
|
67
|
+
> "The Jira operation failed: {actual Jira error details}. How would you like to proceed?
|
|
68
|
+
> (a) Retry — attempt the Jira operation again
|
|
69
|
+
> (b) Switch to file management — update sprint-status.yaml and config to use
|
|
70
|
+
> file-system backend, then complete this operation locally. This change is permanent."
|
|
71
|
+
If user chooses (b) in either case: write `tracking_system: file-system` to `sprint-status.yaml`,
|
|
72
|
+
update `sprint_backend: file-system` in `_bmad/bmm/config.yaml`,
|
|
73
|
+
then proceed with **File-System Backend** instructions below.
|
|
74
|
+
|
|
75
|
+
4. **File-System Backend** — execute the steps below.
|
|
76
|
+
|
|
77
|
+
---
|
|
78
|
+
|
|
40
79
|
## EXECUTION
|
|
41
80
|
|
|
42
81
|
<workflow>
|
|
@@ -20,6 +20,45 @@ Keeps the active sprint view lean by archiving completed and cancelled work. Pre
|
|
|
20
20
|
|
|
21
21
|
---
|
|
22
22
|
|
|
23
|
+
## Backend Routing
|
|
24
|
+
|
|
25
|
+
Before executing any file-system operations, determine and route to the correct backend:
|
|
26
|
+
|
|
27
|
+
1. Read `_bmad-output/implementation-artifacts/sprint-status.yaml` and extract the `tracking_system` field.
|
|
28
|
+
If the field is absent or the file does not exist, default to `file-system`.
|
|
29
|
+
|
|
30
|
+
2. If `tracking_system` is `file-system`:
|
|
31
|
+
Proceed with the **File-System Backend** instructions below.
|
|
32
|
+
|
|
33
|
+
3. If `tracking_system` is `jira`:
|
|
34
|
+
a. Perform the Jira operation: Query all issues in project `{jira_project_key}` at `{jira_url}` with status Done/Resolved/Closed. For each such issue that maps to a local story file at `{story_location}/{id}.md`: transition the issue to the resolved/done Jira workflow state if not already there (using the issue transition API). Then move the local story file to `{story_location}/done/{id}.md` — this local file operation always executes regardless of backend. Note: Jira issues are NOT deleted; they remain in Jira as resolved.
|
|
35
|
+
Use whatever Jira-capable tool is available in your current tool context.
|
|
36
|
+
Map Jira entities to the canonical schema (Sprint → sprints[], Backlog → backlog[],
|
|
37
|
+
Epic → epics[], Jira status → canonical vocabulary per Section 6.3 of the routing spec).
|
|
38
|
+
b. If the Jira operation SUCCEEDS: continue with the Jira data returned. Jira is the source of truth.
|
|
39
|
+
c. If the Jira operation FAILS for any reason:
|
|
40
|
+
- If no Jira-capable tool is available in your current context:
|
|
41
|
+
Pause and present the user with:
|
|
42
|
+
> "No Jira-capable tool is available. To use Jira tracking, configure a Jira integration
|
|
43
|
+
> in your agent (an MCP server, plugin, or native integration connected to the Jira
|
|
44
|
+
> instance at `{jira_url}`). How would you like to proceed?
|
|
45
|
+
> (a) Retry — attempt the Jira operation again once a Jira tool is configured
|
|
46
|
+
> (b) Switch to file management — update sprint-status.yaml and config to use
|
|
47
|
+
> file-system backend, then complete this operation locally. This change is permanent."
|
|
48
|
+
- If a Jira tool attempted the operation but returned an error:
|
|
49
|
+
Pause and present the user with:
|
|
50
|
+
> "The Jira operation failed: {actual Jira error details}. How would you like to proceed?
|
|
51
|
+
> (a) Retry — attempt the Jira operation again
|
|
52
|
+
> (b) Switch to file management — update sprint-status.yaml and config to use
|
|
53
|
+
> file-system backend, then complete this operation locally. This change is permanent."
|
|
54
|
+
If user chooses (b) in either case: write `tracking_system: file-system` to `sprint-status.yaml`,
|
|
55
|
+
update `sprint_backend: file-system` in `_bmad/bmm/config.yaml`,
|
|
56
|
+
then proceed with **File-System Backend** instructions below.
|
|
57
|
+
|
|
58
|
+
4. **File-System Backend** — execute the workflow steps below.
|
|
59
|
+
|
|
60
|
+
---
|
|
61
|
+
|
|
23
62
|
<workflow>
|
|
24
63
|
|
|
25
64
|
<step n="0" goal="Load configuration and validate file existence">
|
|
@@ -13,6 +13,45 @@ Close an active sprint — archive done/cancelled items, disposition incomplete
|
|
|
13
13
|
|
|
14
14
|
**Schema Reference:** `_bmad-output/planning-artifacts/sprint-status-schema.md` (Story 17.9)
|
|
15
15
|
|
|
16
|
+
## Backend Routing
|
|
17
|
+
|
|
18
|
+
Before executing any file-system operations, determine and route to the correct backend:
|
|
19
|
+
|
|
20
|
+
1. Read `_bmad-output/implementation-artifacts/sprint-status.yaml` and extract the `tracking_system` field.
|
|
21
|
+
If the field is absent or the file does not exist, default to `file-system`.
|
|
22
|
+
|
|
23
|
+
2. If `tracking_system` is `file-system`:
|
|
24
|
+
Proceed with the **File-System Backend** instructions below.
|
|
25
|
+
|
|
26
|
+
3. If `tracking_system` is `jira`:
|
|
27
|
+
a. Perform the Jira operation: Query all issues in the active sprint for project `{jira_project_key}` at `{jira_url}`. For done/cancelled items: transition each to resolved/done Jira state using the issue transition API; then move each corresponding local story file from `{story_location}/{id}.md` to `{story_location}/done/{id}.md` (local file operation — always executes). For incomplete items (not done/cancelled): remove each issue from the sprint using the "remove issue from sprint" operation (returns them to board backlog). Then close the sprint using the sprint close API.
|
|
28
|
+
Use whatever Jira-capable tool is available in your current tool context.
|
|
29
|
+
Map Jira entities to the canonical schema (Sprint → sprints[], Backlog → backlog[],
|
|
30
|
+
Epic → epics[], Jira status → canonical vocabulary per Section 6.3 of the routing spec).
|
|
31
|
+
b. If the Jira operation SUCCEEDS: continue with the Jira data returned. Jira is the source of truth.
|
|
32
|
+
c. If the Jira operation FAILS for any reason:
|
|
33
|
+
- If no Jira-capable tool is available in your current context:
|
|
34
|
+
Pause and present the user with:
|
|
35
|
+
> "No Jira-capable tool is available. To use Jira tracking, configure a Jira integration
|
|
36
|
+
> in your agent (an MCP server, plugin, or native integration connected to the Jira
|
|
37
|
+
> instance at `{jira_url}`). How would you like to proceed?
|
|
38
|
+
> (a) Retry — attempt the Jira operation again once a Jira tool is configured
|
|
39
|
+
> (b) Switch to file management — update sprint-status.yaml and config to use
|
|
40
|
+
> file-system backend, then complete this operation locally. This change is permanent."
|
|
41
|
+
- If a Jira tool attempted the operation but returned an error:
|
|
42
|
+
Pause and present the user with:
|
|
43
|
+
> "The Jira operation failed: {actual Jira error details}. How would you like to proceed?
|
|
44
|
+
> (a) Retry — attempt the Jira operation again
|
|
45
|
+
> (b) Switch to file management — update sprint-status.yaml and config to use
|
|
46
|
+
> file-system backend, then complete this operation locally. This change is permanent."
|
|
47
|
+
If user chooses (b) in either case: write `tracking_system: file-system` to `sprint-status.yaml`,
|
|
48
|
+
update `sprint_backend: file-system` in `_bmad/bmm/config.yaml`,
|
|
49
|
+
then proceed with **File-System Backend** instructions below.
|
|
50
|
+
|
|
51
|
+
4. **File-System Backend** — execute the workflow steps below.
|
|
52
|
+
|
|
53
|
+
---
|
|
54
|
+
|
|
16
55
|
<workflow>
|
|
17
56
|
|
|
18
57
|
<step n="0" goal="Load configuration and validate file existence">
|