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.
Files changed (72) hide show
  1. package/CLAUDE.md +100 -13
  2. package/README.md +97 -207
  3. package/bin/install-agents.sh +1 -1
  4. package/bin/install-commands.sh +1 -1
  5. package/bin/install-hooks.sh +1 -1
  6. package/bin/install-skills.sh +1 -1
  7. package/bin/specweave.js +32 -0
  8. package/dist/cli/commands/validate-jira.d.ts +35 -0
  9. package/dist/cli/commands/validate-jira.d.ts.map +1 -0
  10. package/dist/cli/commands/validate-jira.js +112 -0
  11. package/dist/cli/commands/validate-jira.js.map +1 -0
  12. package/dist/cli/commands/validate-plugins.d.ts +41 -0
  13. package/dist/cli/commands/validate-plugins.d.ts.map +1 -0
  14. package/dist/cli/commands/validate-plugins.js +171 -0
  15. package/dist/cli/commands/validate-plugins.js.map +1 -0
  16. package/dist/core/types/sync-profile.d.ts +177 -29
  17. package/dist/core/types/sync-profile.d.ts.map +1 -1
  18. package/dist/core/types/sync-profile.js +48 -1
  19. package/dist/core/types/sync-profile.js.map +1 -1
  20. package/dist/hooks/lib/translate-living-docs.d.ts.map +1 -1
  21. package/dist/hooks/lib/translate-living-docs.js +16 -7
  22. package/dist/hooks/lib/translate-living-docs.js.map +1 -1
  23. package/dist/metrics/dora-calculator.d.ts +7 -3
  24. package/dist/metrics/dora-calculator.d.ts.map +1 -1
  25. package/dist/metrics/dora-calculator.js +19 -6
  26. package/dist/metrics/dora-calculator.js.map +1 -1
  27. package/dist/metrics/report-generator.d.ts +17 -0
  28. package/dist/metrics/report-generator.d.ts.map +1 -0
  29. package/dist/metrics/report-generator.js +403 -0
  30. package/dist/metrics/report-generator.js.map +1 -0
  31. package/dist/utils/external-resource-validator.d.ts +102 -0
  32. package/dist/utils/external-resource-validator.d.ts.map +1 -0
  33. package/dist/utils/external-resource-validator.js +381 -0
  34. package/dist/utils/external-resource-validator.js.map +1 -0
  35. package/dist/utils/plugin-validator.d.ts +161 -0
  36. package/dist/utils/plugin-validator.d.ts.map +1 -0
  37. package/dist/utils/plugin-validator.js +565 -0
  38. package/dist/utils/plugin-validator.js.map +1 -0
  39. package/package.json +2 -1
  40. package/plugins/specweave/commands/specweave-do.md +47 -0
  41. package/plugins/specweave/commands/specweave-increment.md +82 -0
  42. package/plugins/specweave/commands/specweave-next.md +47 -0
  43. package/plugins/specweave/hooks/post-increment-planning.sh +117 -38
  44. package/plugins/specweave/hooks/pre-tool-use.sh +133 -0
  45. package/plugins/specweave/plugin.json +22 -0
  46. package/plugins/specweave/skills/SKILLS-INDEX.md +3 -1
  47. package/plugins/specweave/skills/plugin-validator/SKILL.md +427 -0
  48. package/plugins/specweave-ado/.claude-plugin/plugin.json +2 -4
  49. package/plugins/specweave-ado/lib/ado-board-resolver.ts +328 -0
  50. package/plugins/specweave-ado/lib/ado-hierarchical-sync.ts +484 -0
  51. package/plugins/specweave-ado/plugin.json +20 -0
  52. package/plugins/specweave-alternatives/.claude-plugin/plugin.json +15 -2
  53. package/plugins/specweave-backend/.claude-plugin/plugin.json +15 -2
  54. package/plugins/specweave-cost-optimizer/.claude-plugin/plugin.json +14 -2
  55. package/plugins/specweave-diagrams/.claude-plugin/plugin.json +14 -2
  56. package/plugins/specweave-docs/.claude-plugin/plugin.json +13 -2
  57. package/plugins/specweave-figma/.claude-plugin/plugin.json +14 -2
  58. package/plugins/specweave-frontend/.claude-plugin/plugin.json +15 -2
  59. package/plugins/specweave-github/lib/github-board-resolver.ts +164 -0
  60. package/plugins/specweave-github/lib/github-hierarchical-sync.ts +344 -0
  61. package/plugins/specweave-github/plugin.json +19 -0
  62. package/plugins/specweave-infrastructure/.claude-plugin/plugin.json +15 -2
  63. package/plugins/specweave-jira/.claude-plugin/plugin.json +14 -2
  64. package/plugins/specweave-jira/lib/jira-board-resolver.ts +127 -0
  65. package/plugins/specweave-jira/lib/jira-hierarchical-sync.ts +283 -0
  66. package/plugins/specweave-jira/plugin.json +20 -0
  67. package/plugins/specweave-jira/skills/jira-resource-validator/SKILL.md +584 -0
  68. package/plugins/specweave-kubernetes/.claude-plugin/plugin.json +14 -2
  69. package/plugins/specweave-payments/.claude-plugin/plugin.json +14 -2
  70. package/plugins/specweave-testing/.claude-plugin/plugin.json +14 -2
  71. package/plugins/specweave-tooling/.claude-plugin/plugin.json +13 -2
  72. 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":"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"}
@@ -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: string;
11
- repo: string;
82
+ owner?: string;
83
+ repo?: string;
84
+ containers?: SyncContainer[];
85
+ customQuery?: string;
12
86
  }
13
87
  /**
14
- * Jira Configuration (Multi-Team Support)
88
+ * Jira Configuration (Extended for Hierarchical Sync)
15
89
  *
16
- * Jira has NO explicit "Team" concept like ADO.
17
- * Instead, teams are simulated using either:
18
- * 1. Multiple Projects (one per team) - simpler, more projects
19
- * 2. One Project with Components (team labels) - fewer projects, shared backlog
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 } - single project mode
23
- * - New config: { domain, strategy, projects/components } - multi-team mode
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
- * How teams are organized in Jira (optional for backward compatibility)
30
- * - 'project-per-team': Each team has separate project (FRONTEND, BACKEND, QA)
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
- * Strategy 2: Shared project with components
43
- * OR Legacy: Single project key
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 (Multi-Team Support)
138
+ * Azure DevOps Configuration (Extended for Hierarchical Sync)
52
139
  *
53
- * ADO has REAL Teams as explicit entities within a project.
54
- * Multiple teams can exist in ONE project, each with own Area Path.
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
- * Explicit Area Paths per team (optional, auto-generated if not provided)
68
- * Format: { "team-folder-name": "Project\\Team Name" }
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