specweave 0.30.19 → 0.32.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 (58) hide show
  1. package/dist/src/core/external-tools/external-items-counter.d.ts +62 -0
  2. package/dist/src/core/external-tools/external-items-counter.d.ts.map +1 -0
  3. package/dist/src/core/external-tools/external-items-counter.js +206 -0
  4. package/dist/src/core/external-tools/external-items-counter.js.map +1 -0
  5. package/dist/src/core/external-tools/external-items-display.d.ts +39 -0
  6. package/dist/src/core/external-tools/external-items-display.d.ts.map +1 -0
  7. package/dist/src/core/external-tools/external-items-display.js +185 -0
  8. package/dist/src/core/external-tools/external-items-display.js.map +1 -0
  9. package/dist/src/core/external-tools/index.d.ts +8 -0
  10. package/dist/src/core/external-tools/index.d.ts.map +1 -0
  11. package/dist/src/core/external-tools/index.js +8 -0
  12. package/dist/src/core/external-tools/index.js.map +1 -0
  13. package/dist/src/core/external-tools/providers/ado-items-adapter.d.ts +39 -0
  14. package/dist/src/core/external-tools/providers/ado-items-adapter.d.ts.map +1 -0
  15. package/dist/src/core/external-tools/providers/ado-items-adapter.js +188 -0
  16. package/dist/src/core/external-tools/providers/ado-items-adapter.js.map +1 -0
  17. package/dist/src/core/external-tools/providers/github-items-adapter.d.ts +38 -0
  18. package/dist/src/core/external-tools/providers/github-items-adapter.d.ts.map +1 -0
  19. package/dist/src/core/external-tools/providers/github-items-adapter.js +136 -0
  20. package/dist/src/core/external-tools/providers/github-items-adapter.js.map +1 -0
  21. package/dist/src/core/external-tools/providers/index.d.ts +7 -0
  22. package/dist/src/core/external-tools/providers/index.d.ts.map +1 -0
  23. package/dist/src/core/external-tools/providers/index.js +7 -0
  24. package/dist/src/core/external-tools/providers/index.js.map +1 -0
  25. package/dist/src/core/external-tools/providers/jira-items-adapter.d.ts +42 -0
  26. package/dist/src/core/external-tools/providers/jira-items-adapter.d.ts.map +1 -0
  27. package/dist/src/core/external-tools/providers/jira-items-adapter.js +153 -0
  28. package/dist/src/core/external-tools/providers/jira-items-adapter.js.map +1 -0
  29. package/dist/src/core/external-tools/types.d.ts +78 -0
  30. package/dist/src/core/external-tools/types.d.ts.map +1 -0
  31. package/dist/src/core/external-tools/types.js +19 -0
  32. package/dist/src/core/external-tools/types.js.map +1 -0
  33. package/dist/src/core/increment/increment-utils.d.ts +13 -37
  34. package/dist/src/core/increment/increment-utils.d.ts.map +1 -1
  35. package/dist/src/core/increment/increment-utils.js +17 -64
  36. package/dist/src/core/increment/increment-utils.js.map +1 -1
  37. package/dist/src/core/increment/status-change-sync-trigger.d.ts.map +1 -1
  38. package/dist/src/core/increment/status-change-sync-trigger.js +4 -0
  39. package/dist/src/core/increment/status-change-sync-trigger.js.map +1 -1
  40. package/dist/src/core/llm/providers/azure-openai-provider.d.ts.map +1 -1
  41. package/dist/src/core/llm/providers/azure-openai-provider.js +1 -0
  42. package/dist/src/core/llm/providers/azure-openai-provider.js.map +1 -1
  43. package/dist/src/core/llm/providers/bedrock-provider.d.ts.map +1 -1
  44. package/dist/src/core/llm/providers/bedrock-provider.js +2 -0
  45. package/dist/src/core/llm/providers/bedrock-provider.js.map +1 -1
  46. package/dist/src/core/llm/providers/openai-provider.d.ts.map +1 -1
  47. package/dist/src/core/llm/providers/openai-provider.js +1 -0
  48. package/dist/src/core/llm/providers/openai-provider.js.map +1 -1
  49. package/dist/src/core/llm/providers/vertex-ai-provider.d.ts.map +1 -1
  50. package/dist/src/core/llm/providers/vertex-ai-provider.js +1 -0
  51. package/dist/src/core/llm/providers/vertex-ai-provider.js.map +1 -1
  52. package/package.json +1 -5
  53. package/plugins/specweave/commands/specweave-external.md +150 -0
  54. package/plugins/specweave/hooks/universal/hook-wrapper.cmd +26 -26
  55. package/plugins/specweave/hooks/universal/session-start.cmd +16 -16
  56. package/plugins/specweave/hooks/universal/session-start.ps1 +16 -16
  57. package/plugins/specweave-github/hooks/.specweave/logs/hooks-debug.log +0 -626
  58. package/plugins/specweave-release/hooks/.specweave/logs/dora-tracking.log +0 -939
@@ -0,0 +1,62 @@
1
+ /**
2
+ * External Items Counter - OPTIMIZED FOR SCALE
3
+ *
4
+ * Three-tier architecture for 1000+ items:
5
+ *
6
+ * TIER 1: getCounts() - Super fast, counts only, 30min cache
7
+ * Used by: /specweave:status, progress footer
8
+ * API calls: 1 per provider (just count)
9
+ *
10
+ * TIER 2: getSummary() - Project breakdown, 15min cache
11
+ * Used by: /specweave:external overview
12
+ * API calls: 1 per provider (count + project grouping)
13
+ *
14
+ * TIER 3: getItems(filter) - Paginated details, on-demand
15
+ * Used by: /specweave:external --project X --limit 20
16
+ * API calls: 1 per request (paginated)
17
+ */
18
+ import { Logger } from '../../utils/logger.js';
19
+ import { ExternalItemsCounts, ExternalItemsSummary, ItemsFilter, PaginatedItemsResult } from './types.js';
20
+ export interface ExternalItemsCounterOptions {
21
+ projectRoot: string;
22
+ logger?: Logger;
23
+ forceRefresh?: boolean;
24
+ }
25
+ export declare class ExternalItemsCounter {
26
+ private projectRoot;
27
+ private cache;
28
+ private logger;
29
+ private forceRefresh;
30
+ constructor(options: ExternalItemsCounterOptions);
31
+ /**
32
+ * Get counts only - optimized for status display
33
+ * Single API call per provider, 30min cache
34
+ */
35
+ getCounts(): Promise<ExternalItemsCounts>;
36
+ /**
37
+ * Get summary with project breakdown - for dashboard overview
38
+ * Note: For simplicity, uses counts (no per-project breakdown without fetching items)
39
+ */
40
+ getSummary(): Promise<ExternalItemsSummary>;
41
+ /**
42
+ * Get paginated items - on-demand, no cache
43
+ * Used when user drills down: /specweave:external --limit 20
44
+ */
45
+ getItems(filter?: ItemsFilter): Promise<PaginatedItemsResult>;
46
+ /**
47
+ * Force refresh all caches
48
+ */
49
+ refresh(): Promise<ExternalItemsCounts>;
50
+ private getGitHubCount;
51
+ private getJiraCount;
52
+ private getAdoCount;
53
+ private getGitHubItems;
54
+ private getJiraItems;
55
+ private getAdoItems;
56
+ /**
57
+ * Build project breakdown from counts
58
+ * Note: Without fetching all items, we can only show totals per provider
59
+ */
60
+ private buildProjectBreakdown;
61
+ }
62
+ //# sourceMappingURL=external-items-counter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"external-items-counter.d.ts","sourceRoot":"","sources":["../../../../src/core/external-tools/external-items-counter.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAGH,OAAO,EAAE,MAAM,EAAiB,MAAM,uBAAuB,CAAC;AAC9D,OAAO,EACL,mBAAmB,EACnB,oBAAoB,EAGpB,WAAW,EACX,oBAAoB,EAGrB,MAAM,YAAY,CAAC;AAQpB,MAAM,WAAW,2BAA2B;IAC1C,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,YAAY,CAAC,EAAE,OAAO,CAAC;CACxB;AAED,qBAAa,oBAAoB;IAC/B,OAAO,CAAC,WAAW,CAAS;IAC5B,OAAO,CAAC,KAAK,CAAe;IAC5B,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,YAAY,CAAU;gBAElB,OAAO,EAAE,2BAA2B;IAWhD;;;OAGG;IACG,SAAS,IAAI,OAAO,CAAC,mBAAmB,CAAC;IA+B/C;;;OAGG;IACG,UAAU,IAAI,OAAO,CAAC,oBAAoB,CAAC;IA4BjD;;;OAGG;IACG,QAAQ,CAAC,MAAM,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,oBAAoB,CAAC;IAenE;;OAEG;IACG,OAAO,IAAI,OAAO,CAAC,mBAAmB,CAAC;YAW/B,cAAc;YAad,YAAY;YAaZ,WAAW;YAiBX,cAAc;YAQd,YAAY;YAQZ,WAAW;IAYzB;;;OAGG;IACH,OAAO,CAAC,qBAAqB;CAe9B"}
@@ -0,0 +1,206 @@
1
+ /**
2
+ * External Items Counter - OPTIMIZED FOR SCALE
3
+ *
4
+ * Three-tier architecture for 1000+ items:
5
+ *
6
+ * TIER 1: getCounts() - Super fast, counts only, 30min cache
7
+ * Used by: /specweave:status, progress footer
8
+ * API calls: 1 per provider (just count)
9
+ *
10
+ * TIER 2: getSummary() - Project breakdown, 15min cache
11
+ * Used by: /specweave:external overview
12
+ * API calls: 1 per provider (count + project grouping)
13
+ *
14
+ * TIER 3: getItems(filter) - Paginated details, on-demand
15
+ * Used by: /specweave:external --project X --limit 20
16
+ * API calls: 1 per request (paginated)
17
+ */
18
+ import { CacheManager } from '../cache/cache-manager.js';
19
+ import { consoleLogger } from '../../utils/logger.js';
20
+ import { COUNTS_CACHE_TTL_MS, SUMMARY_CACHE_TTL_MS, } from './types.js';
21
+ import { GitHubItemsAdapter } from './providers/github-items-adapter.js';
22
+ import { JiraItemsAdapter } from './providers/jira-items-adapter.js';
23
+ import { AdoItemsAdapter } from './providers/ado-items-adapter.js';
24
+ const COUNTS_CACHE_KEY = 'external-items-counts';
25
+ const SUMMARY_CACHE_KEY = 'external-items-summary';
26
+ export class ExternalItemsCounter {
27
+ constructor(options) {
28
+ this.projectRoot = options.projectRoot;
29
+ this.logger = options.logger ?? consoleLogger;
30
+ this.forceRefresh = options.forceRefresh ?? false;
31
+ this.cache = new CacheManager(this.projectRoot, { logger: this.logger });
32
+ }
33
+ // ==========================================================================
34
+ // TIER 1: COUNTS ONLY (for status/progress - super fast)
35
+ // ==========================================================================
36
+ /**
37
+ * Get counts only - optimized for status display
38
+ * Single API call per provider, 30min cache
39
+ */
40
+ async getCounts() {
41
+ if (!this.forceRefresh) {
42
+ const cached = await this.cache.get(COUNTS_CACHE_KEY);
43
+ if (cached) {
44
+ return cached;
45
+ }
46
+ }
47
+ // Fetch counts in parallel (1 API call each)
48
+ const [ghCount, jiraCount, adoCount] = await Promise.all([
49
+ this.getGitHubCount(),
50
+ this.getJiraCount(),
51
+ this.getAdoCount(),
52
+ ]);
53
+ const counts = {
54
+ github: ghCount,
55
+ jira: jiraCount,
56
+ ado: adoCount,
57
+ grandTotal: ghCount.total + jiraCount.total + adoCount.total,
58
+ lastUpdated: new Date().toISOString(),
59
+ };
60
+ await this.cache.set(COUNTS_CACHE_KEY, counts, COUNTS_CACHE_TTL_MS);
61
+ return counts;
62
+ }
63
+ // ==========================================================================
64
+ // TIER 2: SUMMARY BY PROJECT (for external command overview)
65
+ // ==========================================================================
66
+ /**
67
+ * Get summary with project breakdown - for dashboard overview
68
+ * Note: For simplicity, uses counts (no per-project breakdown without fetching items)
69
+ */
70
+ async getSummary() {
71
+ if (!this.forceRefresh) {
72
+ const cached = await this.cache.get(SUMMARY_CACHE_KEY);
73
+ if (cached) {
74
+ return cached;
75
+ }
76
+ }
77
+ const counts = await this.getCounts();
78
+ // For summary, we derive from counts (no items needed)
79
+ const summary = {
80
+ github: counts.github,
81
+ jira: counts.jira,
82
+ ado: counts.ado,
83
+ byProject: this.buildProjectBreakdown(counts),
84
+ grandTotal: counts.grandTotal,
85
+ lastUpdated: counts.lastUpdated,
86
+ };
87
+ await this.cache.set(SUMMARY_CACHE_KEY, summary, SUMMARY_CACHE_TTL_MS);
88
+ return summary;
89
+ }
90
+ // ==========================================================================
91
+ // TIER 3: PAGINATED ITEMS (on-demand, filtered)
92
+ // ==========================================================================
93
+ /**
94
+ * Get paginated items - on-demand, no cache
95
+ * Used when user drills down: /specweave:external --limit 20
96
+ */
97
+ async getItems(filter) {
98
+ const provider = filter?.provider || 'github';
99
+ switch (provider) {
100
+ case 'github':
101
+ return this.getGitHubItems(filter);
102
+ case 'jira':
103
+ return this.getJiraItems(filter);
104
+ case 'ado':
105
+ return this.getAdoItems(filter);
106
+ default:
107
+ return { items: [], total: 0, page: 1, pageSize: 20, totalPages: 0, hasMore: false };
108
+ }
109
+ }
110
+ /**
111
+ * Force refresh all caches
112
+ */
113
+ async refresh() {
114
+ this.forceRefresh = true;
115
+ await this.cache.delete(COUNTS_CACHE_KEY);
116
+ await this.cache.delete(SUMMARY_CACHE_KEY);
117
+ return this.getCounts();
118
+ }
119
+ // ==========================================================================
120
+ // PRIVATE: Provider-specific count fetchers
121
+ // ==========================================================================
122
+ async getGitHubCount() {
123
+ try {
124
+ const adapter = await GitHubItemsAdapter.fromGitRemote({ logger: this.logger });
125
+ if (!adapter || !await adapter.isConfigured()) {
126
+ return { configured: false, total: 0 };
127
+ }
128
+ const total = await adapter.getOpenCount();
129
+ return { configured: true, total };
130
+ }
131
+ catch (error) {
132
+ return { configured: false, total: 0, error: String(error) };
133
+ }
134
+ }
135
+ async getJiraCount() {
136
+ try {
137
+ const adapter = JiraItemsAdapter.fromEnv({ logger: this.logger });
138
+ if (!adapter) {
139
+ return { configured: false, total: 0 };
140
+ }
141
+ const total = await adapter.getOpenCount();
142
+ return { configured: true, total };
143
+ }
144
+ catch (error) {
145
+ return { configured: false, total: 0, error: String(error) };
146
+ }
147
+ }
148
+ async getAdoCount() {
149
+ try {
150
+ const adapter = AdoItemsAdapter.fromEnv({ logger: this.logger });
151
+ if (!adapter) {
152
+ return { configured: false, total: 0 };
153
+ }
154
+ const total = await adapter.getOpenCount();
155
+ return { configured: true, total };
156
+ }
157
+ catch (error) {
158
+ return { configured: false, total: 0, error: String(error) };
159
+ }
160
+ }
161
+ // ==========================================================================
162
+ // PRIVATE: Provider-specific item fetchers (paginated)
163
+ // ==========================================================================
164
+ async getGitHubItems(filter) {
165
+ const adapter = await GitHubItemsAdapter.fromGitRemote({ logger: this.logger });
166
+ if (!adapter || !await adapter.isConfigured()) {
167
+ return { items: [], total: 0, page: 1, pageSize: 20, totalPages: 0, hasMore: false };
168
+ }
169
+ return adapter.getOpenItems(filter);
170
+ }
171
+ async getJiraItems(filter) {
172
+ const adapter = JiraItemsAdapter.fromEnv({ logger: this.logger });
173
+ if (!adapter) {
174
+ return { items: [], total: 0, page: 1, pageSize: 20, totalPages: 0, hasMore: false };
175
+ }
176
+ return adapter.getOpenItems(filter);
177
+ }
178
+ async getAdoItems(filter) {
179
+ const adapter = AdoItemsAdapter.fromEnv({ logger: this.logger });
180
+ if (!adapter) {
181
+ return { items: [], total: 0, page: 1, pageSize: 20, totalPages: 0, hasMore: false };
182
+ }
183
+ return adapter.getOpenItems(filter);
184
+ }
185
+ // ==========================================================================
186
+ // PRIVATE: Helpers
187
+ // ==========================================================================
188
+ /**
189
+ * Build project breakdown from counts
190
+ * Note: Without fetching all items, we can only show totals per provider
191
+ */
192
+ buildProjectBreakdown(counts) {
193
+ const breakdown = {};
194
+ // Single project from current repo (GitHub)
195
+ if (counts.github.configured && counts.github.total > 0) {
196
+ breakdown['current'] = {
197
+ github: counts.github.total,
198
+ jira: counts.jira.configured ? counts.jira.total : 0,
199
+ ado: counts.ado.configured ? counts.ado.total : 0,
200
+ total: counts.grandTotal,
201
+ };
202
+ }
203
+ return breakdown;
204
+ }
205
+ }
206
+ //# sourceMappingURL=external-items-counter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"external-items-counter.js","sourceRoot":"","sources":["../../../../src/core/external-tools/external-items-counter.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,39 @@
1
+ /**
2
+ * External Items Display Utilities - OPTIMIZED FOR SCALE
3
+ *
4
+ * Compact formats for 1000+ items:
5
+ * - Status: "📋 EXT: 1.2k" (super compact)
6
+ * - Summary: "GH:450 JI:380 ADO:417"
7
+ * - Details: Paginated table
8
+ */
9
+ import { ExternalItemsCounts, ExternalItemsSummary, PaginatedItemsResult } from './types.js';
10
+ /**
11
+ * Format: "📋 1.2k" or "📋 4" - for status line
12
+ */
13
+ export declare function formatCompactCount(counts: ExternalItemsCounts): string;
14
+ /**
15
+ * Format: "GH:450 JI:380 ADO:417"
16
+ */
17
+ export declare function formatBriefSummary(counts: ExternalItemsCounts): string;
18
+ /**
19
+ * Display external items section for status command
20
+ * Shows: 📋 External: 1.2k open (GH:450 JI:380 ADO:417)
21
+ */
22
+ export declare function displayStatusSection(summary: ExternalItemsSummary): void;
23
+ /**
24
+ * Display paginated items result
25
+ */
26
+ export declare function displayPaginatedItems(result: PaginatedItemsResult, provider: string): void;
27
+ /**
28
+ * Display summary dashboard header
29
+ */
30
+ export declare function displayDashboardHeader(summary: ExternalItemsSummary): void;
31
+ /**
32
+ * Format notification for increment planning
33
+ */
34
+ export declare function formatPlanningNotification(counts: ExternalItemsCounts): string | null;
35
+ /**
36
+ * Format progress footer line
37
+ */
38
+ export declare function formatProgressFooter(counts: ExternalItemsCounts): string | null;
39
+ //# sourceMappingURL=external-items-display.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"external-items-display.d.ts","sourceRoot":"","sources":["../../../../src/core/external-tools/external-items-display.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAGH,OAAO,EACL,mBAAmB,EACnB,oBAAoB,EAEpB,oBAAoB,EAErB,MAAM,YAAY,CAAC;AA6BpB;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,mBAAmB,GAAG,MAAM,CAGtE;AAMD;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,mBAAmB,GAAG,MAAM,CActE;AAED;;;GAGG;AACH,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,oBAAoB,GAAG,IAAI,CAoBxE;AAMD;;GAEG;AACH,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,oBAAoB,EAAE,QAAQ,EAAE,MAAM,GAAG,IAAI,CA8B1F;AAED;;GAEG;AACH,wBAAgB,sBAAsB,CAAC,OAAO,EAAE,oBAAoB,GAAG,IAAI,CAkD1E;AAED;;GAEG;AACH,wBAAgB,0BAA0B,CAAC,MAAM,EAAE,mBAAmB,GAAG,MAAM,GAAG,IAAI,CAGrF;AAED;;GAEG;AACH,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,mBAAmB,GAAG,MAAM,GAAG,IAAI,CAG/E"}
@@ -0,0 +1,185 @@
1
+ /**
2
+ * External Items Display Utilities - OPTIMIZED FOR SCALE
3
+ *
4
+ * Compact formats for 1000+ items:
5
+ * - Status: "📋 EXT: 1.2k" (super compact)
6
+ * - Summary: "GH:450 JI:380 ADO:417"
7
+ * - Details: Paginated table
8
+ */
9
+ import chalk from 'chalk';
10
+ /**
11
+ * Format large numbers compactly (1234 -> "1.2k")
12
+ */
13
+ function formatCount(n) {
14
+ if (n >= 1000000) {
15
+ return `${(n / 1000000).toFixed(1)}M`;
16
+ }
17
+ else if (n >= 1000) {
18
+ return `${(n / 1000).toFixed(1)}k`;
19
+ }
20
+ return String(n);
21
+ }
22
+ /**
23
+ * Format relative time (e.g., "2h ago", "3d ago")
24
+ */
25
+ function formatAge(days) {
26
+ if (days === 0)
27
+ return 'today';
28
+ if (days === 1)
29
+ return '1d ago';
30
+ if (days < 7)
31
+ return `${days}d ago`;
32
+ if (days < 30)
33
+ return `${Math.floor(days / 7)}w ago`;
34
+ return `${Math.floor(days / 30)}mo ago`;
35
+ }
36
+ // ============================================================================
37
+ // TIER 1: Super compact for status line
38
+ // ============================================================================
39
+ /**
40
+ * Format: "📋 1.2k" or "📋 4" - for status line
41
+ */
42
+ export function formatCompactCount(counts) {
43
+ if (counts.grandTotal === 0)
44
+ return '';
45
+ return `📋 ${formatCount(counts.grandTotal)}`;
46
+ }
47
+ // ============================================================================
48
+ // TIER 2: Brief summary for status command section
49
+ // ============================================================================
50
+ /**
51
+ * Format: "GH:450 JI:380 ADO:417"
52
+ */
53
+ export function formatBriefSummary(counts) {
54
+ const parts = [];
55
+ if (counts.github.configured && counts.github.total > 0) {
56
+ parts.push(`GH:${formatCount(counts.github.total)}`);
57
+ }
58
+ if (counts.jira.configured && counts.jira.total > 0) {
59
+ parts.push(`JI:${formatCount(counts.jira.total)}`);
60
+ }
61
+ if (counts.ado.configured && counts.ado.total > 0) {
62
+ parts.push(`ADO:${formatCount(counts.ado.total)}`);
63
+ }
64
+ return parts.join(' ');
65
+ }
66
+ /**
67
+ * Display external items section for status command
68
+ * Shows: 📋 External: 1.2k open (GH:450 JI:380 ADO:417)
69
+ */
70
+ export function displayStatusSection(summary) {
71
+ const hasAny = summary.github.configured || summary.jira.configured || summary.ado.configured;
72
+ if (!hasAny)
73
+ return;
74
+ const total = summary.grandTotal;
75
+ if (total === 0) {
76
+ console.log(chalk.gray('📋 External: 0 open'));
77
+ return;
78
+ }
79
+ const breakdown = formatBriefSummary(summary);
80
+ const countText = formatCount(total);
81
+ console.log(chalk.cyan.bold(`📋 External: ${countText} open`) + chalk.gray(` (${breakdown})`));
82
+ // Show hint for large counts
83
+ if (total > 50) {
84
+ console.log(chalk.gray(` Run /specweave:external for details (paginated)`));
85
+ }
86
+ console.log('');
87
+ }
88
+ // ============================================================================
89
+ // TIER 3: Detailed dashboard (paginated)
90
+ // ============================================================================
91
+ /**
92
+ * Display paginated items result
93
+ */
94
+ export function displayPaginatedItems(result, provider) {
95
+ const divider = '─'.repeat(65);
96
+ console.log(chalk.cyan.bold(`\n${provider} Items (${result.total} total, page ${result.page}/${result.totalPages})`));
97
+ console.log(chalk.gray(divider));
98
+ if (result.items.length === 0) {
99
+ console.log(chalk.gray(' No items found'));
100
+ }
101
+ else {
102
+ for (const item of result.items) {
103
+ const staleMarker = item.isStale ? chalk.yellow(' ⚠️') : '';
104
+ const ageText = chalk.gray(formatAge(item.age));
105
+ // Truncate title if too long
106
+ const maxLen = 42;
107
+ const title = item.title.length > maxLen
108
+ ? item.title.slice(0, maxLen - 3) + '...'
109
+ : item.title;
110
+ console.log(` ${chalk.white(item.id.padEnd(8))} ${title.padEnd(maxLen)} ${ageText}${staleMarker}`);
111
+ }
112
+ }
113
+ console.log(chalk.gray(divider));
114
+ if (result.hasMore) {
115
+ const nextOffset = result.page * result.pageSize;
116
+ console.log(chalk.gray(`Page ${result.page}/${result.totalPages} | Next: --offset ${nextOffset}`));
117
+ }
118
+ console.log('');
119
+ }
120
+ /**
121
+ * Display summary dashboard header
122
+ */
123
+ export function displayDashboardHeader(summary) {
124
+ const divider = '═'.repeat(65);
125
+ console.log(chalk.cyan.bold(`\n${divider}`));
126
+ console.log(chalk.cyan.bold(' External Items Dashboard'));
127
+ console.log(chalk.cyan.bold(divider));
128
+ console.log('');
129
+ // Summary line
130
+ const total = summary.grandTotal;
131
+ console.log(chalk.white.bold(`Total: ${formatCount(total)} open items`));
132
+ console.log('');
133
+ // Provider breakdown
134
+ if (summary.github.configured) {
135
+ const count = formatCount(summary.github.total);
136
+ console.log(` GitHub: ${count} issues`);
137
+ }
138
+ else {
139
+ console.log(chalk.gray(' GitHub: not configured'));
140
+ }
141
+ if (summary.jira.configured) {
142
+ const count = formatCount(summary.jira.total);
143
+ console.log(` JIRA: ${count} issues`);
144
+ }
145
+ else {
146
+ console.log(chalk.gray(' JIRA: not configured'));
147
+ }
148
+ if (summary.ado.configured) {
149
+ const count = formatCount(summary.ado.total);
150
+ console.log(` ADO: ${count} work items`);
151
+ }
152
+ else {
153
+ console.log(chalk.gray(' ADO: not configured'));
154
+ }
155
+ console.log('');
156
+ // Usage hints
157
+ if (total > 0) {
158
+ console.log(chalk.gray('View items:'));
159
+ console.log(chalk.gray(' /specweave:external --provider github --limit 20'));
160
+ console.log(chalk.gray(' /specweave:external --provider jira --offset 20'));
161
+ }
162
+ // Last updated
163
+ const lastUpdated = new Date(summary.lastUpdated);
164
+ const minutesAgo = Math.floor((Date.now() - lastUpdated.getTime()) / 60000);
165
+ const timeAgo = minutesAgo < 1 ? 'just now' : `${minutesAgo}m ago`;
166
+ console.log(chalk.gray(`\nLast updated: ${timeAgo} (--refresh to update)`));
167
+ console.log('');
168
+ }
169
+ /**
170
+ * Format notification for increment planning
171
+ */
172
+ export function formatPlanningNotification(counts) {
173
+ if (counts.grandTotal === 0)
174
+ return null;
175
+ return `⚠️ ${formatCount(counts.grandTotal)} unaddressed external items. Run /specweave:external to view.`;
176
+ }
177
+ /**
178
+ * Format progress footer line
179
+ */
180
+ export function formatProgressFooter(counts) {
181
+ if (counts.grandTotal === 0)
182
+ return null;
183
+ return `📋 ${formatCount(counts.grandTotal)} external items open`;
184
+ }
185
+ //# sourceMappingURL=external-items-display.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"external-items-display.js","sourceRoot":"","sources":["../../../../src/core/external-tools/external-items-display.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ /**
2
+ * External Tools - Re-exports
3
+ */
4
+ export * from './types.js';
5
+ export { ExternalItemsCounter } from './external-items-counter.js';
6
+ export * from './external-items-display.js';
7
+ export * from './providers/index.js';
8
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/core/external-tools/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,cAAc,YAAY,CAAC;AAC3B,OAAO,EAAE,oBAAoB,EAAE,MAAM,6BAA6B,CAAC;AACnE,cAAc,6BAA6B,CAAC;AAC5C,cAAc,sBAAsB,CAAC"}
@@ -0,0 +1,8 @@
1
+ /**
2
+ * External Tools - Re-exports
3
+ */
4
+ export * from './types.js';
5
+ export { ExternalItemsCounter } from './external-items-counter.js';
6
+ export * from './external-items-display.js';
7
+ export * from './providers/index.js';
8
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/core/external-tools/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,cAAc,YAAY,CAAC;AAC3B,OAAO,EAAE,oBAAoB,EAAE,MAAM,6BAA6B,CAAC;AACnE,cAAc,6BAA6B,CAAC;AAC5C,cAAc,sBAAsB,CAAC"}
@@ -0,0 +1,39 @@
1
+ /**
2
+ * Azure DevOps Items Adapter - OPTIMIZED FOR SCALE
3
+ *
4
+ * Three-tier fetching:
5
+ * 1. getOpenCount() - Single WIQL query, returns count (for status)
6
+ * 2. getOpenItems(filter) - Paginated, filtered (for details)
7
+ *
8
+ * Requires ADO_ORG_URL, ADO_PROJECT, ADO_PAT in environment
9
+ */
10
+ import { ExternalItemsProvider, ExternalProvider, ItemsFilter, PaginatedItemsResult } from '../types.js';
11
+ import { Logger } from '../../../utils/logger.js';
12
+ export declare class AdoItemsAdapter implements ExternalItemsProvider {
13
+ private orgUrl;
14
+ private project;
15
+ private pat;
16
+ private logger;
17
+ constructor(options: {
18
+ orgUrl: string;
19
+ project: string;
20
+ pat: string;
21
+ logger?: Logger;
22
+ });
23
+ static fromEnv(options?: {
24
+ logger?: Logger;
25
+ }): AdoItemsAdapter | null;
26
+ getProviderName(): ExternalProvider;
27
+ isConfigured(): Promise<boolean>;
28
+ /**
29
+ * TIER 1: Fast count - single WIQL query, just count IDs
30
+ * WIQL returns workItem IDs, we just count them without fetching details
31
+ */
32
+ getOpenCount(): Promise<number>;
33
+ /**
34
+ * TIER 3: Paginated items - on-demand with filters
35
+ */
36
+ getOpenItems(filter?: ItemsFilter): Promise<PaginatedItemsResult>;
37
+ private emptyResult;
38
+ }
39
+ //# sourceMappingURL=ado-items-adapter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ado-items-adapter.d.ts","sourceRoot":"","sources":["../../../../../src/core/external-tools/providers/ado-items-adapter.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,EAEL,qBAAqB,EACrB,gBAAgB,EAChB,WAAW,EACX,oBAAoB,EAIrB,MAAM,aAAa,CAAC;AACrB,OAAO,EAAE,MAAM,EAAiB,MAAM,0BAA0B,CAAC;AAEjE,qBAAa,eAAgB,YAAW,qBAAqB;IAC3D,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,GAAG,CAAS;IACpB,OAAO,CAAC,MAAM,CAAS;gBAEX,OAAO,EAAE;QACnB,MAAM,EAAE,MAAM,CAAC;QACf,OAAO,EAAE,MAAM,CAAC;QAChB,GAAG,EAAE,MAAM,CAAC;QACZ,MAAM,CAAC,EAAE,MAAM,CAAC;KACjB;IAOD,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE;QAAE,MAAM,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,eAAe,GAAG,IAAI;IAiBrE,eAAe,IAAI,gBAAgB;IAI7B,YAAY,IAAI,OAAO,CAAC,OAAO,CAAC;IAItC;;;OAGG;IACG,YAAY,IAAI,OAAO,CAAC,MAAM,CAAC;IAyCrC;;OAEG;IACG,YAAY,CAAC,MAAM,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,oBAAoB,CAAC;IAmIvE,OAAO,CAAC,WAAW;CAUpB"}