specweave 0.9.0 → 0.10.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/CLAUDE.md +100 -13
- package/README.md +97 -207
- package/bin/install-agents.sh +1 -1
- package/bin/install-commands.sh +1 -1
- package/bin/install-hooks.sh +1 -1
- package/bin/install-skills.sh +1 -1
- package/bin/specweave.js +32 -0
- package/dist/cli/commands/validate-jira.d.ts +35 -0
- package/dist/cli/commands/validate-jira.d.ts.map +1 -0
- package/dist/cli/commands/validate-jira.js +112 -0
- package/dist/cli/commands/validate-jira.js.map +1 -0
- package/dist/cli/commands/validate-plugins.d.ts +41 -0
- package/dist/cli/commands/validate-plugins.d.ts.map +1 -0
- package/dist/cli/commands/validate-plugins.js +171 -0
- package/dist/cli/commands/validate-plugins.js.map +1 -0
- package/dist/core/types/sync-profile.d.ts +177 -29
- package/dist/core/types/sync-profile.d.ts.map +1 -1
- package/dist/core/types/sync-profile.js +48 -1
- package/dist/core/types/sync-profile.js.map +1 -1
- package/dist/hooks/lib/translate-living-docs.d.ts.map +1 -1
- package/dist/hooks/lib/translate-living-docs.js +16 -7
- package/dist/hooks/lib/translate-living-docs.js.map +1 -1
- package/dist/metrics/dora-calculator.d.ts +7 -3
- package/dist/metrics/dora-calculator.d.ts.map +1 -1
- package/dist/metrics/dora-calculator.js +19 -6
- package/dist/metrics/dora-calculator.js.map +1 -1
- package/dist/metrics/report-generator.d.ts +17 -0
- package/dist/metrics/report-generator.d.ts.map +1 -0
- package/dist/metrics/report-generator.js +403 -0
- package/dist/metrics/report-generator.js.map +1 -0
- package/dist/utils/external-resource-validator.d.ts +102 -0
- package/dist/utils/external-resource-validator.d.ts.map +1 -0
- package/dist/utils/external-resource-validator.js +381 -0
- package/dist/utils/external-resource-validator.js.map +1 -0
- package/dist/utils/plugin-validator.d.ts +161 -0
- package/dist/utils/plugin-validator.d.ts.map +1 -0
- package/dist/utils/plugin-validator.js +565 -0
- package/dist/utils/plugin-validator.js.map +1 -0
- package/package.json +2 -1
- package/plugins/specweave/commands/specweave-do.md +47 -0
- package/plugins/specweave/commands/specweave-increment.md +82 -0
- package/plugins/specweave/commands/specweave-next.md +47 -0
- package/plugins/specweave/hooks/post-increment-planning.sh +117 -38
- package/plugins/specweave/hooks/pre-tool-use.sh +133 -0
- package/plugins/specweave/plugin.json +22 -0
- package/plugins/specweave/skills/SKILLS-INDEX.md +3 -1
- package/plugins/specweave/skills/plugin-validator/SKILL.md +427 -0
- package/plugins/specweave-ado/.claude-plugin/plugin.json +2 -4
- package/plugins/specweave-ado/lib/ado-board-resolver.ts +328 -0
- package/plugins/specweave-ado/lib/ado-hierarchical-sync.ts +484 -0
- package/plugins/specweave-ado/plugin.json +20 -0
- package/plugins/specweave-alternatives/.claude-plugin/plugin.json +15 -2
- package/plugins/specweave-backend/.claude-plugin/plugin.json +15 -2
- package/plugins/specweave-cost-optimizer/.claude-plugin/plugin.json +14 -2
- package/plugins/specweave-diagrams/.claude-plugin/plugin.json +14 -2
- package/plugins/specweave-docs/.claude-plugin/plugin.json +13 -2
- package/plugins/specweave-figma/.claude-plugin/plugin.json +14 -2
- package/plugins/specweave-frontend/.claude-plugin/plugin.json +15 -2
- package/plugins/specweave-github/lib/github-board-resolver.ts +164 -0
- package/plugins/specweave-github/lib/github-hierarchical-sync.ts +344 -0
- package/plugins/specweave-github/plugin.json +19 -0
- package/plugins/specweave-infrastructure/.claude-plugin/plugin.json +15 -2
- package/plugins/specweave-jira/.claude-plugin/plugin.json +14 -2
- package/plugins/specweave-jira/lib/jira-board-resolver.ts +127 -0
- package/plugins/specweave-jira/lib/jira-hierarchical-sync.ts +283 -0
- package/plugins/specweave-jira/plugin.json +20 -0
- package/plugins/specweave-jira/skills/jira-resource-validator/SKILL.md +584 -0
- package/plugins/specweave-kubernetes/.claude-plugin/plugin.json +14 -2
- package/plugins/specweave-payments/.claude-plugin/plugin.json +14 -2
- package/plugins/specweave-testing/.claude-plugin/plugin.json +14 -2
- package/plugins/specweave-tooling/.claude-plugin/plugin.json +13 -2
- package/src/templates/.env.example +71 -5
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* CLI Command: validate-jira
|
|
3
|
+
*
|
|
4
|
+
* Validates Jira configuration and creates missing resources
|
|
5
|
+
*
|
|
6
|
+
* Usage:
|
|
7
|
+
* specweave validate-jira [options]
|
|
8
|
+
*
|
|
9
|
+
* Options:
|
|
10
|
+
* --env <path> Path to .env file (default: .env)
|
|
11
|
+
* -h, --help Display help for command
|
|
12
|
+
*
|
|
13
|
+
* @module cli/commands/validate-jira
|
|
14
|
+
* @since 0.9.5
|
|
15
|
+
*/
|
|
16
|
+
import { Command } from 'commander';
|
|
17
|
+
/**
|
|
18
|
+
* Setup validate-jira command
|
|
19
|
+
*
|
|
20
|
+
* @param program - Commander program instance
|
|
21
|
+
*/
|
|
22
|
+
export declare function setupValidateJiraCommand(program: Command): void;
|
|
23
|
+
/**
|
|
24
|
+
* Run Jira validation
|
|
25
|
+
*
|
|
26
|
+
* @param options - Command options
|
|
27
|
+
*/
|
|
28
|
+
declare function runJiraValidation(options: {
|
|
29
|
+
env: string;
|
|
30
|
+
}): Promise<void>;
|
|
31
|
+
/**
|
|
32
|
+
* Export for programmatic use
|
|
33
|
+
*/
|
|
34
|
+
export { runJiraValidation };
|
|
35
|
+
//# sourceMappingURL=validate-jira.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validate-jira.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/validate-jira.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAKpC;;;;GAIG;AACH,wBAAgB,wBAAwB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAQ/D;AAED;;;;GAIG;AACH,iBAAe,iBAAiB,CAAC,OAAO,EAAE;IAAE,GAAG,EAAE,MAAM,CAAA;CAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAqBxE;AAgED;;GAEG;AACH,OAAO,EAAE,iBAAiB,EAAE,CAAC"}
|
|
@@ -0,0 +1,112 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* CLI Command: validate-jira
|
|
3
|
+
*
|
|
4
|
+
* Validates Jira configuration and creates missing resources
|
|
5
|
+
*
|
|
6
|
+
* Usage:
|
|
7
|
+
* specweave validate-jira [options]
|
|
8
|
+
*
|
|
9
|
+
* Options:
|
|
10
|
+
* --env <path> Path to .env file (default: .env)
|
|
11
|
+
* -h, --help Display help for command
|
|
12
|
+
*
|
|
13
|
+
* @module cli/commands/validate-jira
|
|
14
|
+
* @since 0.9.5
|
|
15
|
+
*/
|
|
16
|
+
import chalk from 'chalk';
|
|
17
|
+
import ora from 'ora';
|
|
18
|
+
import { validateJiraResources } from '../../utils/external-resource-validator.js';
|
|
19
|
+
/**
|
|
20
|
+
* Setup validate-jira command
|
|
21
|
+
*
|
|
22
|
+
* @param program - Commander program instance
|
|
23
|
+
*/
|
|
24
|
+
export function setupValidateJiraCommand(program) {
|
|
25
|
+
program
|
|
26
|
+
.command('validate-jira')
|
|
27
|
+
.description('Validate Jira configuration and create missing resources')
|
|
28
|
+
.option('--env <path>', 'Path to .env file', '.env')
|
|
29
|
+
.action(async (options) => {
|
|
30
|
+
await runJiraValidation(options);
|
|
31
|
+
});
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* Run Jira validation
|
|
35
|
+
*
|
|
36
|
+
* @param options - Command options
|
|
37
|
+
*/
|
|
38
|
+
async function runJiraValidation(options) {
|
|
39
|
+
const spinner = ora('Validating Jira configuration...').start();
|
|
40
|
+
try {
|
|
41
|
+
spinner.stop();
|
|
42
|
+
const result = await validateJiraResources(options.env);
|
|
43
|
+
// Display results
|
|
44
|
+
if (result.valid) {
|
|
45
|
+
displaySuccess(result);
|
|
46
|
+
process.exit(0);
|
|
47
|
+
}
|
|
48
|
+
else {
|
|
49
|
+
displayFailure(result);
|
|
50
|
+
process.exit(1);
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
catch (error) {
|
|
54
|
+
spinner.stop();
|
|
55
|
+
console.error(chalk.red(`\n❌ Validation error: ${error.message}`));
|
|
56
|
+
process.exit(1);
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
/**
|
|
60
|
+
* Display success message
|
|
61
|
+
*/
|
|
62
|
+
function displaySuccess(result) {
|
|
63
|
+
console.log(chalk.green('\n✅ Jira configuration validated!\n'));
|
|
64
|
+
// Show project info
|
|
65
|
+
if (result.project.exists) {
|
|
66
|
+
console.log(chalk.gray('Project:'));
|
|
67
|
+
console.log(chalk.white(` • ${result.project.key} - ${result.project.name}`));
|
|
68
|
+
console.log(chalk.dim(` ID: ${result.project.id}\n`));
|
|
69
|
+
}
|
|
70
|
+
// Show boards info
|
|
71
|
+
if (result.boards.existing.length > 0) {
|
|
72
|
+
console.log(chalk.gray('Boards:'));
|
|
73
|
+
result.boards.existing.forEach((id) => {
|
|
74
|
+
console.log(chalk.white(` • Board ID: ${id}`));
|
|
75
|
+
});
|
|
76
|
+
console.log();
|
|
77
|
+
}
|
|
78
|
+
// Show created boards
|
|
79
|
+
if (result.boards.created.length > 0) {
|
|
80
|
+
console.log(chalk.green('Created boards:'));
|
|
81
|
+
result.boards.created.forEach((board) => {
|
|
82
|
+
console.log(chalk.green(` ✅ ${board.name} (ID: ${board.id})`));
|
|
83
|
+
});
|
|
84
|
+
console.log();
|
|
85
|
+
}
|
|
86
|
+
// Show env update
|
|
87
|
+
if (result.envUpdated) {
|
|
88
|
+
console.log(chalk.cyan('📝 .env file updated with actual IDs\n'));
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
/**
|
|
92
|
+
* Display failure message
|
|
93
|
+
*/
|
|
94
|
+
function displayFailure(result) {
|
|
95
|
+
console.log(chalk.red('\n❌ Jira validation failed\n'));
|
|
96
|
+
// Show project issues
|
|
97
|
+
if (!result.project.exists) {
|
|
98
|
+
console.log(chalk.yellow('Project:'));
|
|
99
|
+
console.log(chalk.yellow(' • Project not found or not created\n'));
|
|
100
|
+
}
|
|
101
|
+
// Show board issues
|
|
102
|
+
if (!result.boards.valid && result.boards.missing.length > 0) {
|
|
103
|
+
console.log(chalk.yellow('Boards:'));
|
|
104
|
+
console.log(chalk.yellow(` • Missing boards: ${result.boards.missing.join(', ')}\n`));
|
|
105
|
+
}
|
|
106
|
+
console.log(chalk.cyan('💡 Run again to retry validation and fix configuration\n'));
|
|
107
|
+
}
|
|
108
|
+
/**
|
|
109
|
+
* Export for programmatic use
|
|
110
|
+
*/
|
|
111
|
+
export { runJiraValidation };
|
|
112
|
+
//# sourceMappingURL=validate-jira.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validate-jira.js","sourceRoot":"","sources":["../../../src/cli/commands/validate-jira.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* CLI Command: validate-plugins
|
|
3
|
+
*
|
|
4
|
+
* Validates SpecWeave plugin installation and optionally installs missing components.
|
|
5
|
+
*
|
|
6
|
+
* Usage:
|
|
7
|
+
* specweave validate-plugins [options]
|
|
8
|
+
*
|
|
9
|
+
* Options:
|
|
10
|
+
* --auto-install Auto-install missing components
|
|
11
|
+
* --context <description> Increment description for context detection
|
|
12
|
+
* --dry-run Show what would be installed without installing
|
|
13
|
+
* --verbose Show detailed validation steps
|
|
14
|
+
* -h, --help Display help for command
|
|
15
|
+
*
|
|
16
|
+
* @module cli/commands/validate-plugins
|
|
17
|
+
* @since 0.9.4
|
|
18
|
+
*/
|
|
19
|
+
import { Command } from 'commander';
|
|
20
|
+
/**
|
|
21
|
+
* Setup validate-plugins command
|
|
22
|
+
*
|
|
23
|
+
* @param program - Commander program instance
|
|
24
|
+
*/
|
|
25
|
+
export declare function setupValidatePluginsCommand(program: Command): void;
|
|
26
|
+
/**
|
|
27
|
+
* Run validation
|
|
28
|
+
*
|
|
29
|
+
* @param options - Command options
|
|
30
|
+
*/
|
|
31
|
+
declare function runValidation(options: {
|
|
32
|
+
autoInstall: boolean;
|
|
33
|
+
context?: string;
|
|
34
|
+
dryRun: boolean;
|
|
35
|
+
verbose: boolean;
|
|
36
|
+
}): Promise<void>;
|
|
37
|
+
/**
|
|
38
|
+
* Export for programmatic use
|
|
39
|
+
*/
|
|
40
|
+
export { runValidation };
|
|
41
|
+
//# sourceMappingURL=validate-plugins.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validate-plugins.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/validate-plugins.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AASpC;;;;GAIG;AACH,wBAAgB,2BAA2B,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAkBlE;AAED;;;;GAIG;AACH,iBAAe,aAAa,CAAC,OAAO,EAAE;IACpC,WAAW,EAAE,OAAO,CAAC;IACrB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,OAAO,CAAC;IAChB,OAAO,EAAE,OAAO,CAAC;CAClB,GAAG,OAAO,CAAC,IAAI,CAAC,CAkChB;AAiJD;;GAEG;AACH,OAAO,EAAE,aAAa,EAAE,CAAC"}
|
|
@@ -0,0 +1,171 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* CLI Command: validate-plugins
|
|
3
|
+
*
|
|
4
|
+
* Validates SpecWeave plugin installation and optionally installs missing components.
|
|
5
|
+
*
|
|
6
|
+
* Usage:
|
|
7
|
+
* specweave validate-plugins [options]
|
|
8
|
+
*
|
|
9
|
+
* Options:
|
|
10
|
+
* --auto-install Auto-install missing components
|
|
11
|
+
* --context <description> Increment description for context detection
|
|
12
|
+
* --dry-run Show what would be installed without installing
|
|
13
|
+
* --verbose Show detailed validation steps
|
|
14
|
+
* -h, --help Display help for command
|
|
15
|
+
*
|
|
16
|
+
* @module cli/commands/validate-plugins
|
|
17
|
+
* @since 0.9.4
|
|
18
|
+
*/
|
|
19
|
+
import chalk from 'chalk';
|
|
20
|
+
import ora from 'ora';
|
|
21
|
+
import { PluginValidator, } from '../../utils/plugin-validator.js';
|
|
22
|
+
/**
|
|
23
|
+
* Setup validate-plugins command
|
|
24
|
+
*
|
|
25
|
+
* @param program - Commander program instance
|
|
26
|
+
*/
|
|
27
|
+
export function setupValidatePluginsCommand(program) {
|
|
28
|
+
program
|
|
29
|
+
.command('validate-plugins')
|
|
30
|
+
.description('Validate SpecWeave plugin installation')
|
|
31
|
+
.option('--auto-install', 'Auto-install missing components', false)
|
|
32
|
+
.option('--context <description>', 'Increment description for context detection')
|
|
33
|
+
.option('--dry-run', 'Show what would be installed without installing', false)
|
|
34
|
+
.option('--verbose', 'Show detailed validation steps', false)
|
|
35
|
+
.action(async (options) => {
|
|
36
|
+
await runValidation(options);
|
|
37
|
+
});
|
|
38
|
+
}
|
|
39
|
+
/**
|
|
40
|
+
* Run validation
|
|
41
|
+
*
|
|
42
|
+
* @param options - Command options
|
|
43
|
+
*/
|
|
44
|
+
async function runValidation(options) {
|
|
45
|
+
const spinner = ora('Validating SpecWeave environment...').start();
|
|
46
|
+
try {
|
|
47
|
+
const validator = new PluginValidator();
|
|
48
|
+
const validationOptions = {
|
|
49
|
+
autoInstall: options.autoInstall,
|
|
50
|
+
context: options.context,
|
|
51
|
+
dryRun: options.dryRun,
|
|
52
|
+
verbose: options.verbose,
|
|
53
|
+
};
|
|
54
|
+
const result = await validator.validate(validationOptions);
|
|
55
|
+
spinner.stop();
|
|
56
|
+
// Display results
|
|
57
|
+
if (result.valid) {
|
|
58
|
+
displaySuccess(result);
|
|
59
|
+
process.exit(0);
|
|
60
|
+
}
|
|
61
|
+
else {
|
|
62
|
+
displayFailure(result, options);
|
|
63
|
+
process.exit(1);
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
catch (error) {
|
|
67
|
+
spinner.stop();
|
|
68
|
+
console.error(chalk.red(`\n❌ Validation error: ${error.message}`));
|
|
69
|
+
// Show manual instructions
|
|
70
|
+
showManualInstructions();
|
|
71
|
+
process.exit(1);
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
/**
|
|
75
|
+
* Display success message
|
|
76
|
+
*
|
|
77
|
+
* @param result - Validation result
|
|
78
|
+
*/
|
|
79
|
+
function displaySuccess(result) {
|
|
80
|
+
console.log(chalk.green('\n✅ All plugins validated!'));
|
|
81
|
+
// Show installed components
|
|
82
|
+
if (result.installed.corePlugin) {
|
|
83
|
+
const version = result.installed.corePluginVersion
|
|
84
|
+
? ` (v${result.installed.corePluginVersion})`
|
|
85
|
+
: '';
|
|
86
|
+
console.log(chalk.gray(` • Core plugin: installed${version}`));
|
|
87
|
+
}
|
|
88
|
+
if (result.installed.contextPlugins.length > 0) {
|
|
89
|
+
console.log(chalk.gray(` • Context plugins: ${result.installed.contextPlugins.join(', ')}`));
|
|
90
|
+
}
|
|
91
|
+
// Show cache info
|
|
92
|
+
if (result.cache?.hit) {
|
|
93
|
+
console.log(chalk.gray(` • Cache: hit (age: ${Math.round(result.cache.age)}s)`));
|
|
94
|
+
}
|
|
95
|
+
console.log(); // Empty line
|
|
96
|
+
}
|
|
97
|
+
/**
|
|
98
|
+
* Display failure message
|
|
99
|
+
*
|
|
100
|
+
* @param result - Validation result
|
|
101
|
+
* @param options - Command options
|
|
102
|
+
*/
|
|
103
|
+
function displayFailure(result, options) {
|
|
104
|
+
console.log(chalk.red('\n❌ Missing components detected:'));
|
|
105
|
+
// Show missing components
|
|
106
|
+
if (result.missing.marketplace) {
|
|
107
|
+
console.log(chalk.yellow(' • SpecWeave marketplace not registered'));
|
|
108
|
+
}
|
|
109
|
+
if (result.missing.corePlugin) {
|
|
110
|
+
console.log(chalk.yellow(' • Core plugin (specweave) not installed'));
|
|
111
|
+
}
|
|
112
|
+
if (result.missing.contextPlugins.length > 0) {
|
|
113
|
+
console.log(chalk.yellow(` • Context plugins: ${result.missing.contextPlugins.join(', ')}`));
|
|
114
|
+
}
|
|
115
|
+
// Show errors if any
|
|
116
|
+
if (result.errors.length > 0) {
|
|
117
|
+
console.log(chalk.red('\n🚨 Errors encountered:'));
|
|
118
|
+
result.errors.forEach((error) => {
|
|
119
|
+
console.log(chalk.red(` • ${error}`));
|
|
120
|
+
});
|
|
121
|
+
}
|
|
122
|
+
// Show recommendations
|
|
123
|
+
if (result.recommendations.length > 0) {
|
|
124
|
+
console.log(chalk.cyan('\n📦 Recommendations:'));
|
|
125
|
+
result.recommendations.forEach((rec) => {
|
|
126
|
+
console.log(chalk.gray(` ${rec}`));
|
|
127
|
+
});
|
|
128
|
+
}
|
|
129
|
+
// Show dry-run note
|
|
130
|
+
if (options.dryRun) {
|
|
131
|
+
console.log(chalk.cyan('\n💡 Dry-run mode: No changes made. Remove --dry-run to install.'));
|
|
132
|
+
}
|
|
133
|
+
// Show auto-install suggestion
|
|
134
|
+
if (!options.autoInstall && !options.dryRun) {
|
|
135
|
+
console.log(chalk.cyan('\n💡 Tip: Use --auto-install flag to automatically install missing components'));
|
|
136
|
+
}
|
|
137
|
+
console.log(); // Empty line
|
|
138
|
+
}
|
|
139
|
+
/**
|
|
140
|
+
* Show manual installation instructions
|
|
141
|
+
*/
|
|
142
|
+
function showManualInstructions() {
|
|
143
|
+
console.log(chalk.cyan('\n📖 Manual Installation Instructions:'));
|
|
144
|
+
console.log();
|
|
145
|
+
console.log(chalk.gray('1. Register SpecWeave marketplace:'));
|
|
146
|
+
console.log(chalk.gray(' Edit ~/.claude/settings.json and add:'));
|
|
147
|
+
console.log(chalk.gray(` {
|
|
148
|
+
"extraKnownMarketplaces": {
|
|
149
|
+
"specweave": {
|
|
150
|
+
"source": {
|
|
151
|
+
"source": "github",
|
|
152
|
+
"repo": "anton-abyzov/specweave",
|
|
153
|
+
"path": ".claude-plugin"
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
}`));
|
|
158
|
+
console.log();
|
|
159
|
+
console.log(chalk.gray('2. Install core plugin:'));
|
|
160
|
+
console.log(chalk.gray(' Run: /plugin install specweave'));
|
|
161
|
+
console.log();
|
|
162
|
+
console.log(chalk.gray('3. Restart Claude Code'));
|
|
163
|
+
console.log();
|
|
164
|
+
console.log(chalk.gray('4. Re-run: specweave validate-plugins'));
|
|
165
|
+
console.log();
|
|
166
|
+
}
|
|
167
|
+
/**
|
|
168
|
+
* Export for programmatic use
|
|
169
|
+
*/
|
|
170
|
+
export { runValidation };
|
|
171
|
+
//# sourceMappingURL=validate-plugins.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validate-plugins.js","sourceRoot":"","sources":["../../../src/cli/commands/validate-plugins.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAGH,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,GAAG,MAAM,KAAK,CAAC;AACtB,OAAO,EACL,eAAe,GAGhB,MAAM,iCAAiC,CAAC;AAEzC;;;;GAIG;AACH,MAAM,UAAU,2BAA2B,CAAC,OAAgB;IAC1D,OAAO;SACJ,OAAO,CAAC,kBAAkB,CAAC;SAC3B,WAAW,CAAC,wCAAwC,CAAC;SACrD,MAAM,CAAC,gBAAgB,EAAE,iCAAiC,EAAE,KAAK,CAAC;SAClE,MAAM,CACL,yBAAyB,EACzB,6CAA6C,CAC9C;SACA,MAAM,CACL,WAAW,EACX,iDAAiD,EACjD,KAAK,CACN;SACA,MAAM,CAAC,WAAW,EAAE,gCAAgC,EAAE,KAAK,CAAC;SAC5D,MAAM,CAAC,KAAK,EAAE,OAAO,EAAE,EAAE;QACxB,MAAM,aAAa,CAAC,OAAO,CAAC,CAAC;IAC/B,CAAC,CAAC,CAAC;AACP,CAAC;AAED;;;;GAIG;AACH,KAAK,UAAU,aAAa,CAAC,OAK5B;IACC,MAAM,OAAO,GAAG,GAAG,CAAC,qCAAqC,CAAC,CAAC,KAAK,EAAE,CAAC;IAEnE,IAAI,CAAC;QACH,MAAM,SAAS,GAAG,IAAI,eAAe,EAAE,CAAC;QACxC,MAAM,iBAAiB,GAAsB;YAC3C,WAAW,EAAE,OAAO,CAAC,WAAW;YAChC,OAAO,EAAE,OAAO,CAAC,OAAO;YACxB,MAAM,EAAE,OAAO,CAAC,MAAM;YACtB,OAAO,EAAE,OAAO,CAAC,OAAO;SACzB,CAAC;QAEF,MAAM,MAAM,GAAqB,MAAM,SAAS,CAAC,QAAQ,CACvD,iBAAiB,CAClB,CAAC;QAEF,OAAO,CAAC,IAAI,EAAE,CAAC;QAEf,kBAAkB;QAClB,IAAI,MAAM,CAAC,KAAK,EAAE,CAAC;YACjB,cAAc,CAAC,MAAM,CAAC,CAAC;YACvB,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;aAAM,CAAC;YACN,cAAc,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;YAChC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;IACH,CAAC;IAAC,OAAO,KAAU,EAAE,CAAC;QACpB,OAAO,CAAC,IAAI,EAAE,CAAC;QACf,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,yBAAyB,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;QAEnE,2BAA2B;QAC3B,sBAAsB,EAAE,CAAC;QACzB,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC;AAED;;;;GAIG;AACH,SAAS,cAAc,CAAC,MAAwB;IAC9C,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,4BAA4B,CAAC,CAAC,CAAC;IAEvD,4BAA4B;IAC5B,IAAI,MAAM,CAAC,SAAS,CAAC,UAAU,EAAE,CAAC;QAChC,MAAM,OAAO,GAAG,MAAM,CAAC,SAAS,CAAC,iBAAiB;YAChD,CAAC,CAAC,MAAM,MAAM,CAAC,SAAS,CAAC,iBAAiB,GAAG;YAC7C,CAAC,CAAC,EAAE,CAAC;QACP,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,8BAA8B,OAAO,EAAE,CAAC,CAAC,CAAC;IACnE,CAAC;IAED,IAAI,MAAM,CAAC,SAAS,CAAC,cAAc,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC/C,OAAO,CAAC,GAAG,CACT,KAAK,CAAC,IAAI,CACR,yBAAyB,MAAM,CAAC,SAAS,CAAC,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CACtE,CACF,CAAC;IACJ,CAAC;IAED,kBAAkB;IAClB,IAAI,MAAM,CAAC,KAAK,EAAE,GAAG,EAAE,CAAC;QACtB,OAAO,CAAC,GAAG,CACT,KAAK,CAAC,IAAI,CAAC,yBAAyB,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,CACtE,CAAC;IACJ,CAAC;IAED,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC,aAAa;AAC9B,CAAC;AAED;;;;;GAKG;AACH,SAAS,cAAc,CACrB,MAAwB,EACxB,OAAkD;IAElD,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,kCAAkC,CAAC,CAAC,CAAC;IAE3D,0BAA0B;IAC1B,IAAI,MAAM,CAAC,OAAO,CAAC,WAAW,EAAE,CAAC;QAC/B,OAAO,CAAC,GAAG,CACT,KAAK,CAAC,MAAM,CAAC,2CAA2C,CAAC,CAC1D,CAAC;IACJ,CAAC;IAED,IAAI,MAAM,CAAC,OAAO,CAAC,UAAU,EAAE,CAAC;QAC9B,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,4CAA4C,CAAC,CAAC,CAAC;IAC1E,CAAC;IAED,IAAI,MAAM,CAAC,OAAO,CAAC,cAAc,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC7C,OAAO,CAAC,GAAG,CACT,KAAK,CAAC,MAAM,CACV,yBAAyB,MAAM,CAAC,OAAO,CAAC,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CACpE,CACF,CAAC;IACJ,CAAC;IAED,qBAAqB;IACrB,IAAI,MAAM,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC7B,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,0BAA0B,CAAC,CAAC,CAAC;QACnD,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,KAAK,EAAE,EAAE;YAC9B,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,QAAQ,KAAK,EAAE,CAAC,CAAC,CAAC;QAC1C,CAAC,CAAC,CAAC;IACL,CAAC;IAED,uBAAuB;IACvB,IAAI,MAAM,CAAC,eAAe,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACtC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,uBAAuB,CAAC,CAAC,CAAC;QACjD,MAAM,CAAC,eAAe,CAAC,OAAO,CAAC,CAAC,GAAG,EAAE,EAAE;YACrC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,GAAG,EAAE,CAAC,CAAC,CAAC;QACvC,CAAC,CAAC,CAAC;IACL,CAAC;IAED,oBAAoB;IACpB,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;QACnB,OAAO,CAAC,GAAG,CACT,KAAK,CAAC,IAAI,CACR,kEAAkE,CACnE,CACF,CAAC;IACJ,CAAC;IAED,+BAA+B;IAC/B,IAAI,CAAC,OAAO,CAAC,WAAW,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC;QAC5C,OAAO,CAAC,GAAG,CACT,KAAK,CAAC,IAAI,CACR,+EAA+E,CAChF,CACF,CAAC;IACJ,CAAC;IAED,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC,aAAa;AAC9B,CAAC;AAED;;GAEG;AACH,SAAS,sBAAsB;IAC7B,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,wCAAwC,CAAC,CAAC,CAAC;IAClE,OAAO,CAAC,GAAG,EAAE,CAAC;IACd,OAAO,CAAC,GAAG,CACT,KAAK,CAAC,IAAI,CAAC,oCAAoC,CAAC,CACjD,CAAC;IACF,OAAO,CAAC,GAAG,CACT,KAAK,CAAC,IAAI,CACR,0CAA0C,CAC3C,CACF,CAAC;IACF,OAAO,CAAC,GAAG,CACT,KAAK,CAAC,IAAI,CAAC;;;;;;;;;;KAUV,CAAC,CACH,CAAC;IACF,OAAO,CAAC,GAAG,EAAE,CAAC;IACd,OAAO,CAAC,GAAG,CACT,KAAK,CAAC,IAAI,CAAC,yBAAyB,CAAC,CACtC,CAAC;IACF,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,mCAAmC,CAAC,CAAC,CAAC;IAC7D,OAAO,CAAC,GAAG,EAAE,CAAC;IACd,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,wBAAwB,CAAC,CAAC,CAAC;IAClD,OAAO,CAAC,GAAG,EAAE,CAAC;IACd,OAAO,CAAC,GAAG,CACT,KAAK,CAAC,IAAI,CAAC,uCAAuC,CAAC,CACpD,CAAC;IACF,OAAO,CAAC,GAAG,EAAE,CAAC;AAChB,CAAC;AAED;;GAEG;AACH,OAAO,EAAE,aAAa,EAAE,CAAC"}
|
|
@@ -5,71 +5,182 @@
|
|
|
5
5
|
* with time range filtering and rate limiting protection.
|
|
6
6
|
*/
|
|
7
7
|
export type SyncProvider = 'github' | 'jira' | 'ado';
|
|
8
|
+
/**
|
|
9
|
+
* Sync Strategy (v0.10.0+)
|
|
10
|
+
*
|
|
11
|
+
* Determines how work is organized and synced:
|
|
12
|
+
* - simple: One container (project/repo), no filtering (default, backward compatible)
|
|
13
|
+
* - filtered: Multiple containers + sub-organizations (boards/etc) + filters (NEW)
|
|
14
|
+
* - custom: Raw query (JQL/GraphQL/WIQL) for power users (NEW)
|
|
15
|
+
*/
|
|
16
|
+
export type SyncStrategy = 'simple' | 'filtered' | 'custom';
|
|
8
17
|
export type JiraStrategy = 'project-per-team' | 'shared-project-with-components';
|
|
18
|
+
/**
|
|
19
|
+
* Container filters (provider-specific)
|
|
20
|
+
*
|
|
21
|
+
* Filters applied to a specific container (project/repo) to narrow down synced items.
|
|
22
|
+
*/
|
|
23
|
+
export interface SyncContainerFilters {
|
|
24
|
+
/** Include items with these labels */
|
|
25
|
+
includeLabels?: string[];
|
|
26
|
+
/** Exclude items with these labels */
|
|
27
|
+
excludeLabels?: string[];
|
|
28
|
+
/** Filter by assignees (email or ID) */
|
|
29
|
+
assignees?: string[];
|
|
30
|
+
/** Filter by status categories */
|
|
31
|
+
statusCategories?: string[];
|
|
32
|
+
/** Filter by components */
|
|
33
|
+
components?: string[];
|
|
34
|
+
/** Filter by sprints */
|
|
35
|
+
sprints?: string[];
|
|
36
|
+
/** Filter by issue types (Epic, Story, Task, Bug) */
|
|
37
|
+
issueTypes?: string[];
|
|
38
|
+
/** Filter by milestones */
|
|
39
|
+
milestones?: string[];
|
|
40
|
+
/** Filter by states */
|
|
41
|
+
states?: ('open' | 'closed')[];
|
|
42
|
+
/** Filter by area paths */
|
|
43
|
+
areaPaths?: string[];
|
|
44
|
+
/** Filter by iteration paths */
|
|
45
|
+
iterationPaths?: string[];
|
|
46
|
+
/** Filter by work item types (Epic, Feature, User Story, Bug) */
|
|
47
|
+
workItemTypes?: string[];
|
|
48
|
+
}
|
|
49
|
+
/**
|
|
50
|
+
* Container definition (project, repo, etc.)
|
|
51
|
+
*
|
|
52
|
+
* Represents a single container (Jira project, GitHub repo, ADO project) with optional sub-organizations.
|
|
53
|
+
*/
|
|
54
|
+
export interface SyncContainer {
|
|
55
|
+
/**
|
|
56
|
+
* Container ID
|
|
57
|
+
* - Jira: Project key (e.g., "PROJECT-A")
|
|
58
|
+
* - GitHub: Repository (e.g., "owner/repo-name")
|
|
59
|
+
* - ADO: Project name (e.g., "Platform")
|
|
60
|
+
*/
|
|
61
|
+
id: string;
|
|
62
|
+
/**
|
|
63
|
+
* Sub-organizations within the container
|
|
64
|
+
* - Jira: Board names (e.g., ["Team Alpha Board", "Team Beta Board"])
|
|
65
|
+
* - GitHub: Project board titles (e.g., ["Frontend Board", "UI Components"])
|
|
66
|
+
* - ADO: Team board names (e.g., ["API Team Board"])
|
|
67
|
+
*/
|
|
68
|
+
subOrganizations?: string[];
|
|
69
|
+
/**
|
|
70
|
+
* Filters applied to this container
|
|
71
|
+
*/
|
|
72
|
+
filters?: SyncContainerFilters;
|
|
73
|
+
}
|
|
74
|
+
/**
|
|
75
|
+
* GitHub Configuration (Extended for Hierarchical Sync)
|
|
76
|
+
*
|
|
77
|
+
* - Simple strategy: owner + repo (backward compatible)
|
|
78
|
+
* - Filtered strategy: containers array with multiple repos
|
|
79
|
+
* - Custom strategy: customQuery (GitHub search syntax)
|
|
80
|
+
*/
|
|
9
81
|
export interface GitHubConfig {
|
|
10
|
-
owner
|
|
11
|
-
repo
|
|
82
|
+
owner?: string;
|
|
83
|
+
repo?: string;
|
|
84
|
+
containers?: SyncContainer[];
|
|
85
|
+
customQuery?: string;
|
|
12
86
|
}
|
|
13
87
|
/**
|
|
14
|
-
* Jira Configuration (
|
|
88
|
+
* Jira Configuration (Extended for Hierarchical Sync)
|
|
15
89
|
*
|
|
16
|
-
*
|
|
17
|
-
*
|
|
18
|
-
*
|
|
19
|
-
*
|
|
90
|
+
* Supports:
|
|
91
|
+
* - Simple strategy: Single project (projectKey) - backward compatible
|
|
92
|
+
* - Filtered strategy: Multiple projects + boards (containers) - NEW in v0.10.0
|
|
93
|
+
* - Custom strategy: Raw JQL query (customQuery) - NEW in v0.10.0
|
|
20
94
|
*
|
|
21
95
|
* Backward Compatibility:
|
|
22
|
-
* - Old config: { domain, projectKey } -
|
|
23
|
-
* -
|
|
96
|
+
* - Old config: { domain, projectKey } - still works (simple strategy)
|
|
97
|
+
* - Old config: { domain, strategy, projects/components } - still works (deprecated, use filtered)
|
|
98
|
+
* - New config: { domain, containers: [{id, subOrganizations, filters}] } - hierarchical
|
|
24
99
|
*/
|
|
25
100
|
export interface JiraConfig {
|
|
26
101
|
domain: string;
|
|
27
102
|
issueType?: 'Epic' | 'Story' | 'Task';
|
|
28
103
|
/**
|
|
29
|
-
*
|
|
30
|
-
*
|
|
31
|
-
* - 'shared-project-with-components': One project with components per team
|
|
32
|
-
* - undefined: Single project mode (backward compatible)
|
|
104
|
+
* @deprecated Use SyncStrategy instead (simple/filtered/custom)
|
|
105
|
+
* Old field: How teams are organized in Jira
|
|
33
106
|
*/
|
|
34
107
|
strategy?: JiraStrategy;
|
|
35
108
|
/**
|
|
109
|
+
* @deprecated Use containers array instead
|
|
36
110
|
* Strategy 1: Multiple projects (one per team)
|
|
37
|
-
* Example: ["FRONTEND", "BACKEND", "QA"]
|
|
38
|
-
* Creates folders: frontend/, backend/, qa/
|
|
39
111
|
*/
|
|
40
112
|
projects?: string[];
|
|
41
113
|
/**
|
|
42
|
-
*
|
|
43
|
-
*
|
|
44
|
-
* Example: projectKey="PRODUCT", components=["Frontend", "Backend", "QA"]
|
|
45
|
-
* Creates folders: frontend/, backend/, qa/
|
|
114
|
+
* @deprecated Use containers array instead
|
|
115
|
+
* Strategy 2: Single project key OR shared project
|
|
46
116
|
*/
|
|
47
117
|
projectKey?: string;
|
|
118
|
+
/**
|
|
119
|
+
* @deprecated Use filters in SyncContainer instead
|
|
120
|
+
* Components for filtering
|
|
121
|
+
*/
|
|
48
122
|
components?: string[];
|
|
123
|
+
/**
|
|
124
|
+
* Filtered strategy: Multiple projects + boards
|
|
125
|
+
* Example: [
|
|
126
|
+
* {id: "PROJECT-A", subOrganizations: ["Board 1", "Board 2"], filters: {...}},
|
|
127
|
+
* {id: "PROJECT-B", subOrganizations: ["Board 3"]}
|
|
128
|
+
* ]
|
|
129
|
+
*/
|
|
130
|
+
containers?: SyncContainer[];
|
|
131
|
+
/**
|
|
132
|
+
* Custom strategy: Raw JQL query
|
|
133
|
+
* Example: "project IN (PROJECT-A, PROJECT-B) AND labels IN (feature)"
|
|
134
|
+
*/
|
|
135
|
+
customQuery?: string;
|
|
49
136
|
}
|
|
50
137
|
/**
|
|
51
|
-
* Azure DevOps Configuration (
|
|
138
|
+
* Azure DevOps Configuration (Extended for Hierarchical Sync)
|
|
52
139
|
*
|
|
53
|
-
*
|
|
54
|
-
*
|
|
140
|
+
* Supports:
|
|
141
|
+
* - Simple strategy: Single project (project) - backward compatible
|
|
142
|
+
* - Filtered strategy: Multiple projects + area paths (containers) - NEW in v0.10.0
|
|
143
|
+
* - Custom strategy: Raw WIQL query (customQuery) - NEW in v0.10.0
|
|
144
|
+
*
|
|
145
|
+
* Backward Compatibility:
|
|
146
|
+
* - Old config: { organization, project, teams, areaPaths } - still works
|
|
147
|
+
* - New config: { organization, containers: [{id, filters: {areaPaths}}] } - hierarchical
|
|
55
148
|
*/
|
|
56
149
|
export interface AdoConfig {
|
|
57
150
|
organization: string;
|
|
58
|
-
project: string;
|
|
59
|
-
workItemType?: 'Epic' | 'Feature' | 'User Story';
|
|
60
151
|
/**
|
|
152
|
+
* @deprecated Use containers array instead
|
|
153
|
+
* Single project name
|
|
154
|
+
*/
|
|
155
|
+
project?: string;
|
|
156
|
+
/**
|
|
157
|
+
* @deprecated Use filters in SyncContainer instead
|
|
61
158
|
* Teams within the project
|
|
62
|
-
* Example: ["League Scheduler Team", "Platform Engineering Team", "QA Team"]
|
|
63
|
-
* Creates folders: league-scheduler-team/, platform-engineering-team/, qa-team/
|
|
64
159
|
*/
|
|
65
160
|
teams?: string[];
|
|
66
161
|
/**
|
|
67
|
-
*
|
|
68
|
-
*
|
|
69
|
-
* Example: { "platform-team": "League Scheduler\\Platform Engineering Team" }
|
|
162
|
+
* @deprecated Use filters in SyncContainer instead
|
|
163
|
+
* Area paths per team
|
|
70
164
|
*/
|
|
71
165
|
areaPaths?: Record<string, string>;
|
|
166
|
+
/**
|
|
167
|
+
* @deprecated Use filters in SyncContainer instead
|
|
168
|
+
*/
|
|
72
169
|
iterationPath?: string;
|
|
170
|
+
workItemType?: 'Epic' | 'Feature' | 'User Story';
|
|
171
|
+
/**
|
|
172
|
+
* Filtered strategy: Multiple projects + area paths
|
|
173
|
+
* Example: [
|
|
174
|
+
* {id: "Platform", filters: {areaPaths: ["Platform\\Core"], workItemTypes: ["User Story"]}},
|
|
175
|
+
* {id: "Services", filters: {areaPaths: ["Services\\API"]}}
|
|
176
|
+
* ]
|
|
177
|
+
*/
|
|
178
|
+
containers?: SyncContainer[];
|
|
179
|
+
/**
|
|
180
|
+
* Custom strategy: Raw WIQL query
|
|
181
|
+
* Example: "SELECT * FROM WorkItems WHERE [System.TeamProject] = 'Platform' AND [System.AreaPath] UNDER 'Platform\\Core'"
|
|
182
|
+
*/
|
|
183
|
+
customQuery?: string;
|
|
73
184
|
}
|
|
74
185
|
export type ProviderConfig = GitHubConfig | JiraConfig | AdoConfig;
|
|
75
186
|
export type TimeRangePreset = '1W' | '2W' | '1M' | '3M' | '6M' | '1Y' | 'ALL';
|
|
@@ -144,6 +255,15 @@ export interface SyncProfile {
|
|
|
144
255
|
displayName: string;
|
|
145
256
|
/** Optional description */
|
|
146
257
|
description?: string;
|
|
258
|
+
/**
|
|
259
|
+
* Sync strategy (v0.10.0+)
|
|
260
|
+
* - simple: One container (default, backward compatible)
|
|
261
|
+
* - filtered: Multiple containers + boards (NEW)
|
|
262
|
+
* - custom: Raw query (NEW)
|
|
263
|
+
*
|
|
264
|
+
* If not specified, defaults to 'simple' for backward compatibility
|
|
265
|
+
*/
|
|
266
|
+
strategy?: SyncStrategy;
|
|
147
267
|
/** Provider-specific configuration */
|
|
148
268
|
config: ProviderConfig;
|
|
149
269
|
/** Time range configuration */
|
|
@@ -252,4 +372,32 @@ export interface ProjectDetectionResult {
|
|
|
252
372
|
/** Suggested sync profile */
|
|
253
373
|
suggestedProfile?: string;
|
|
254
374
|
}
|
|
375
|
+
/**
|
|
376
|
+
* Check if profile uses simple strategy (one container, backward compatible)
|
|
377
|
+
*/
|
|
378
|
+
export declare function isSimpleStrategy(profile: SyncProfile): boolean;
|
|
379
|
+
/**
|
|
380
|
+
* Check if profile uses filtered strategy (multiple containers + boards)
|
|
381
|
+
*/
|
|
382
|
+
export declare function isFilteredStrategy(profile: SyncProfile): boolean;
|
|
383
|
+
/**
|
|
384
|
+
* Check if profile uses custom strategy (raw query)
|
|
385
|
+
*/
|
|
386
|
+
export declare function isCustomStrategy(profile: SyncProfile): boolean;
|
|
387
|
+
/**
|
|
388
|
+
* Check if config has hierarchical containers (Jira)
|
|
389
|
+
*/
|
|
390
|
+
export declare function hasJiraContainers(config: JiraConfig): boolean;
|
|
391
|
+
/**
|
|
392
|
+
* Check if config has hierarchical containers (GitHub)
|
|
393
|
+
*/
|
|
394
|
+
export declare function hasGitHubContainers(config: GitHubConfig): boolean;
|
|
395
|
+
/**
|
|
396
|
+
* Check if config has hierarchical containers (ADO)
|
|
397
|
+
*/
|
|
398
|
+
export declare function hasAdoContainers(config: AdoConfig): boolean;
|
|
399
|
+
/**
|
|
400
|
+
* Get effective strategy (defaults to 'simple' if not specified)
|
|
401
|
+
*/
|
|
402
|
+
export declare function getEffectiveStrategy(profile: SyncProfile): SyncStrategy;
|
|
255
403
|
//# sourceMappingURL=sync-profile.d.ts.map
|