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.
- package/dist/src/core/external-tools/external-items-counter.d.ts +62 -0
- package/dist/src/core/external-tools/external-items-counter.d.ts.map +1 -0
- package/dist/src/core/external-tools/external-items-counter.js +206 -0
- package/dist/src/core/external-tools/external-items-counter.js.map +1 -0
- package/dist/src/core/external-tools/external-items-display.d.ts +39 -0
- package/dist/src/core/external-tools/external-items-display.d.ts.map +1 -0
- package/dist/src/core/external-tools/external-items-display.js +185 -0
- package/dist/src/core/external-tools/external-items-display.js.map +1 -0
- package/dist/src/core/external-tools/index.d.ts +8 -0
- package/dist/src/core/external-tools/index.d.ts.map +1 -0
- package/dist/src/core/external-tools/index.js +8 -0
- package/dist/src/core/external-tools/index.js.map +1 -0
- package/dist/src/core/external-tools/providers/ado-items-adapter.d.ts +39 -0
- package/dist/src/core/external-tools/providers/ado-items-adapter.d.ts.map +1 -0
- package/dist/src/core/external-tools/providers/ado-items-adapter.js +188 -0
- package/dist/src/core/external-tools/providers/ado-items-adapter.js.map +1 -0
- package/dist/src/core/external-tools/providers/github-items-adapter.d.ts +38 -0
- package/dist/src/core/external-tools/providers/github-items-adapter.d.ts.map +1 -0
- package/dist/src/core/external-tools/providers/github-items-adapter.js +136 -0
- package/dist/src/core/external-tools/providers/github-items-adapter.js.map +1 -0
- package/dist/src/core/external-tools/providers/index.d.ts +7 -0
- package/dist/src/core/external-tools/providers/index.d.ts.map +1 -0
- package/dist/src/core/external-tools/providers/index.js +7 -0
- package/dist/src/core/external-tools/providers/index.js.map +1 -0
- package/dist/src/core/external-tools/providers/jira-items-adapter.d.ts +42 -0
- package/dist/src/core/external-tools/providers/jira-items-adapter.d.ts.map +1 -0
- package/dist/src/core/external-tools/providers/jira-items-adapter.js +153 -0
- package/dist/src/core/external-tools/providers/jira-items-adapter.js.map +1 -0
- package/dist/src/core/external-tools/types.d.ts +78 -0
- package/dist/src/core/external-tools/types.d.ts.map +1 -0
- package/dist/src/core/external-tools/types.js +19 -0
- package/dist/src/core/external-tools/types.js.map +1 -0
- package/dist/src/core/increment/increment-utils.d.ts +13 -37
- package/dist/src/core/increment/increment-utils.d.ts.map +1 -1
- package/dist/src/core/increment/increment-utils.js +17 -64
- package/dist/src/core/increment/increment-utils.js.map +1 -1
- package/dist/src/core/increment/status-change-sync-trigger.d.ts.map +1 -1
- package/dist/src/core/increment/status-change-sync-trigger.js +4 -0
- package/dist/src/core/increment/status-change-sync-trigger.js.map +1 -1
- package/dist/src/core/llm/providers/azure-openai-provider.d.ts.map +1 -1
- package/dist/src/core/llm/providers/azure-openai-provider.js +1 -0
- package/dist/src/core/llm/providers/azure-openai-provider.js.map +1 -1
- package/dist/src/core/llm/providers/bedrock-provider.d.ts.map +1 -1
- package/dist/src/core/llm/providers/bedrock-provider.js +2 -0
- package/dist/src/core/llm/providers/bedrock-provider.js.map +1 -1
- package/dist/src/core/llm/providers/openai-provider.d.ts.map +1 -1
- package/dist/src/core/llm/providers/openai-provider.js +1 -0
- package/dist/src/core/llm/providers/openai-provider.js.map +1 -1
- package/dist/src/core/llm/providers/vertex-ai-provider.d.ts.map +1 -1
- package/dist/src/core/llm/providers/vertex-ai-provider.js +1 -0
- package/dist/src/core/llm/providers/vertex-ai-provider.js.map +1 -1
- package/package.json +1 -5
- package/plugins/specweave/commands/specweave-external.md +150 -0
- package/plugins/specweave/hooks/universal/hook-wrapper.cmd +26 -26
- package/plugins/specweave/hooks/universal/session-start.cmd +16 -16
- package/plugins/specweave/hooks/universal/session-start.ps1 +16 -16
- package/plugins/specweave-github/hooks/.specweave/logs/hooks-debug.log +0 -626
- 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 @@
|
|
|
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 @@
|
|
|
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"}
|