specweave 0.9.1 → 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 -251
- 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/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
|
@@ -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
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sync-profile.d.ts","sourceRoot":"","sources":["../../../src/core/types/sync-profile.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAMH,MAAM,MAAM,YAAY,GAAG,QAAQ,GAAG,MAAM,GAAG,KAAK,CAAC;
|
|
1
|
+
{"version":3,"file":"sync-profile.d.ts","sourceRoot":"","sources":["../../../src/core/types/sync-profile.ts"],"names":[],"mappings":"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"}
|
|
@@ -4,5 +4,52 @@
|
|
|
4
4
|
* Supports multiple projects per provider (GitHub, JIRA, ADO, etc.)
|
|
5
5
|
* with time range filtering and rate limiting protection.
|
|
6
6
|
*/
|
|
7
|
-
|
|
7
|
+
// ============================================================================
|
|
8
|
+
// Type Guard Functions (v0.10.0+)
|
|
9
|
+
// ============================================================================
|
|
10
|
+
/**
|
|
11
|
+
* Check if profile uses simple strategy (one container, backward compatible)
|
|
12
|
+
*/
|
|
13
|
+
export function isSimpleStrategy(profile) {
|
|
14
|
+
// If strategy not specified, default to simple (backward compatibility)
|
|
15
|
+
if (!profile.strategy)
|
|
16
|
+
return true;
|
|
17
|
+
return profile.strategy === 'simple';
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* Check if profile uses filtered strategy (multiple containers + boards)
|
|
21
|
+
*/
|
|
22
|
+
export function isFilteredStrategy(profile) {
|
|
23
|
+
return profile.strategy === 'filtered';
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* Check if profile uses custom strategy (raw query)
|
|
27
|
+
*/
|
|
28
|
+
export function isCustomStrategy(profile) {
|
|
29
|
+
return profile.strategy === 'custom';
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* Check if config has hierarchical containers (Jira)
|
|
33
|
+
*/
|
|
34
|
+
export function hasJiraContainers(config) {
|
|
35
|
+
return !!(config.containers && config.containers.length > 0);
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* Check if config has hierarchical containers (GitHub)
|
|
39
|
+
*/
|
|
40
|
+
export function hasGitHubContainers(config) {
|
|
41
|
+
return !!(config.containers && config.containers.length > 0);
|
|
42
|
+
}
|
|
43
|
+
/**
|
|
44
|
+
* Check if config has hierarchical containers (ADO)
|
|
45
|
+
*/
|
|
46
|
+
export function hasAdoContainers(config) {
|
|
47
|
+
return !!(config.containers && config.containers.length > 0);
|
|
48
|
+
}
|
|
49
|
+
/**
|
|
50
|
+
* Get effective strategy (defaults to 'simple' if not specified)
|
|
51
|
+
*/
|
|
52
|
+
export function getEffectiveStrategy(profile) {
|
|
53
|
+
return profile.strategy || 'simple';
|
|
54
|
+
}
|
|
8
55
|
//# sourceMappingURL=sync-profile.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sync-profile.js","sourceRoot":"","sources":["../../../src/core/types/sync-profile.ts"],"names":[],"mappings":"AAAA;;;;;GAKG"}
|
|
1
|
+
{"version":3,"file":"sync-profile.js","sourceRoot":"","sources":["../../../src/core/types/sync-profile.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAwgBH,+EAA+E;AAC/E,kCAAkC;AAClC,+EAA+E;AAE/E;;GAEG;AACH,MAAM,UAAU,gBAAgB,CAAC,OAAoB;IACnD,wEAAwE;IACxE,IAAI,CAAC,OAAO,CAAC,QAAQ;QAAE,OAAO,IAAI,CAAC;IACnC,OAAO,OAAO,CAAC,QAAQ,KAAK,QAAQ,CAAC;AACvC,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,kBAAkB,CAAC,OAAoB;IACrD,OAAO,OAAO,CAAC,QAAQ,KAAK,UAAU,CAAC;AACzC,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,gBAAgB,CAAC,OAAoB;IACnD,OAAO,OAAO,CAAC,QAAQ,KAAK,QAAQ,CAAC;AACvC,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,iBAAiB,CAAC,MAAkB;IAClD,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,UAAU,IAAI,MAAM,CAAC,UAAU,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;AAC/D,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,mBAAmB,CAAC,MAAoB;IACtD,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,UAAU,IAAI,MAAM,CAAC,UAAU,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;AAC/D,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,gBAAgB,CAAC,MAAiB;IAChD,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,UAAU,IAAI,MAAM,CAAC,UAAU,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;AAC/D,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,oBAAoB,CAAC,OAAoB;IACvD,OAAO,OAAO,CAAC,QAAQ,IAAI,QAAQ,CAAC;AACtC,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"translate-living-docs.d.ts","sourceRoot":"","sources":["../../../src/hooks/lib/translate-living-docs.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAeH;;GAEG;AACH,wBAAsB,mBAAmB,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,
|
|
1
|
+
{"version":3,"file":"translate-living-docs.d.ts","sourceRoot":"","sources":["../../../src/hooks/lib/translate-living-docs.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAeH;;GAEG;AACH,wBAAsB,mBAAmB,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAsD5E"}
|
|
@@ -22,14 +22,17 @@ export async function translateLivingDocs(incrementId) {
|
|
|
22
22
|
const config = await fs.readJson(configPath);
|
|
23
23
|
// 2. Check if translation is enabled
|
|
24
24
|
if (!config.language || config.language === 'en') {
|
|
25
|
-
// English or no language set - skip translation
|
|
25
|
+
// Already English or no language set - skip translation
|
|
26
|
+
console.log('[translate-living-docs] Project language is English, skipping translation');
|
|
26
27
|
return;
|
|
27
28
|
}
|
|
28
29
|
if (!config.translation?.autoTranslateLivingDocs) {
|
|
29
30
|
// Auto-translation disabled
|
|
31
|
+
console.log('[translate-living-docs] Auto-translation disabled in config');
|
|
30
32
|
return;
|
|
31
33
|
}
|
|
32
|
-
|
|
34
|
+
// Always translate TO English for maintainability (not to user's language!)
|
|
35
|
+
console.log(`[translate-living-docs] Auto-translating docs from ${config.language} to English...`);
|
|
33
36
|
// 3. Detect changed documentation files
|
|
34
37
|
const changedFiles = await detectChangedDocs();
|
|
35
38
|
if (changedFiles.length === 0) {
|
|
@@ -37,11 +40,12 @@ export async function translateLivingDocs(incrementId) {
|
|
|
37
40
|
return;
|
|
38
41
|
}
|
|
39
42
|
console.log(`[translate-living-docs] Found ${changedFiles.length} changed file(s)`);
|
|
40
|
-
// 4. Translate each file
|
|
43
|
+
// 4. Translate each file TO English (always 'en', not config.language!)
|
|
41
44
|
for (const file of changedFiles) {
|
|
42
45
|
try {
|
|
43
|
-
|
|
44
|
-
|
|
46
|
+
// Always translate TO English for maintainability
|
|
47
|
+
await translateFile(file, 'en', config.translation);
|
|
48
|
+
console.log(`[translate-living-docs] ✓ Translated: ${file} (${config.language} → en)`);
|
|
45
49
|
}
|
|
46
50
|
catch (error) {
|
|
47
51
|
console.warn(`[translate-living-docs] ⚠️ Failed to translate ${file}: ${error.message}`);
|
|
@@ -75,14 +79,19 @@ async function detectChangedDocs() {
|
|
|
75
79
|
}
|
|
76
80
|
}
|
|
77
81
|
/**
|
|
78
|
-
* Translate a single file
|
|
82
|
+
* Translate a single file FROM user's language TO English
|
|
79
83
|
*
|
|
80
84
|
* NOTE: This is a simplified implementation that creates a translation prompt.
|
|
81
85
|
* In a real implementation with Claude Code, the translator skill would auto-activate
|
|
82
86
|
* and handle the translation. For now, we'll add a marker comment to indicate
|
|
83
87
|
* the file needs translation.
|
|
88
|
+
*
|
|
89
|
+
* @param filePath - File to translate
|
|
90
|
+
* @param targetLanguage - Target language (should always be 'en' for living docs)
|
|
91
|
+
* @param translationConfig - Translation settings
|
|
84
92
|
*/
|
|
85
|
-
async function translateFile(filePath, targetLanguage,
|
|
93
|
+
async function translateFile(filePath, targetLanguage, // Should always be 'en' for living docs
|
|
94
|
+
translationConfig) {
|
|
86
95
|
// Read original content
|
|
87
96
|
const originalContent = await fs.readFile(filePath, 'utf-8');
|
|
88
97
|
// Check if file already has translation marker (avoid re-translating)
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"translate-living-docs.js","sourceRoot":"","sources":["../../../src/hooks/lib/translate-living-docs.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AACzC,OAAO,EAAE,MAAM,UAAU,CAAC;AAY1B;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,mBAAmB,CAAC,WAAmB;IAC3D,IAAI,CAAC;QACH,iBAAiB;QACjB,MAAM,UAAU,GAAG,wBAAwB,CAAC;QAC5C,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;YAC/B,OAAO,CAAC,GAAG,CAAC,+DAA+D,CAAC,CAAC;YAC7E,OAAO;QACT,CAAC;QAED,MAAM,MAAM,GAAW,MAAM,EAAE,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC;QAErD,qCAAqC;QACrC,IAAI,CAAC,MAAM,CAAC,QAAQ,IAAI,MAAM,CAAC,QAAQ,KAAK,IAAI,EAAE,CAAC;YACjD,
|
|
1
|
+
{"version":3,"file":"translate-living-docs.js","sourceRoot":"","sources":["../../../src/hooks/lib/translate-living-docs.ts"],"names":[],"mappings":"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"}
|
|
@@ -6,14 +6,18 @@
|
|
|
6
6
|
* Entry point for CLI and GitHub Actions workflow
|
|
7
7
|
*/
|
|
8
8
|
import { GitHubClient } from './github-client.js';
|
|
9
|
-
import { DORAMetrics } from './types.js';
|
|
9
|
+
import { DORAMetrics, Release, Issue } from './types.js';
|
|
10
10
|
/**
|
|
11
11
|
* Calculate all DORA metrics
|
|
12
12
|
*
|
|
13
13
|
* @param client - GitHub API client
|
|
14
|
-
* @returns Complete DORA metrics
|
|
14
|
+
* @returns Complete DORA metrics with raw data
|
|
15
15
|
*/
|
|
16
|
-
export declare function calculateDORAMetrics(client: GitHubClient): Promise<
|
|
16
|
+
export declare function calculateDORAMetrics(client: GitHubClient): Promise<{
|
|
17
|
+
metrics: DORAMetrics;
|
|
18
|
+
releases: Release[];
|
|
19
|
+
issues: Issue[];
|
|
20
|
+
}>;
|
|
17
21
|
/**
|
|
18
22
|
* Write metrics to JSON file
|
|
19
23
|
*
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"dora-calculator.d.ts","sourceRoot":"","sources":["../../src/metrics/dora-calculator.ts"],"names":[],"mappings":";AACA;;;;;GAKG;AAIH,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;
|
|
1
|
+
{"version":3,"file":"dora-calculator.d.ts","sourceRoot":"","sources":["../../src/metrics/dora-calculator.ts"],"names":[],"mappings":";AACA;;;;;GAKG;AAIH,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAMlD,OAAO,EAAE,WAAW,EAAgB,OAAO,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AAEvE;;;;;GAKG;AACH,wBAAsB,oBAAoB,CAAC,MAAM,EAAE,YAAY,GAAG,OAAO,CAAC;IACxE,OAAO,EAAE,WAAW,CAAC;IACrB,QAAQ,EAAE,OAAO,EAAE,CAAC;IACpB,MAAM,EAAE,KAAK,EAAE,CAAC;CACjB,CAAC,CA+CD;AAED;;;;;GAKG;AACH,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM,GAAG,IAAI,CAY7E"}
|
|
@@ -12,11 +12,12 @@ import { calculateDeploymentFrequency } from './calculators/deployment-frequency
|
|
|
12
12
|
import { calculateLeadTime } from './calculators/lead-time.js';
|
|
13
13
|
import { calculateChangeFailureRate } from './calculators/change-failure-rate.js';
|
|
14
14
|
import { calculateMTTR } from './calculators/mttr.js';
|
|
15
|
+
import { generateMarkdownReport, writeReport } from './report-generator.js';
|
|
15
16
|
/**
|
|
16
17
|
* Calculate all DORA metrics
|
|
17
18
|
*
|
|
18
19
|
* @param client - GitHub API client
|
|
19
|
-
* @returns Complete DORA metrics
|
|
20
|
+
* @returns Complete DORA metrics with raw data
|
|
20
21
|
*/
|
|
21
22
|
export async function calculateDORAMetrics(client) {
|
|
22
23
|
// Query data from GitHub (last 30 days)
|
|
@@ -41,7 +42,7 @@ export async function calculateDORAMetrics(client) {
|
|
|
41
42
|
console.log(` ✓ Change Failure Rate: ${changeFailureRate.value}% (${changeFailureRate.tier})`);
|
|
42
43
|
const mttr = calculateMTTR(issues);
|
|
43
44
|
console.log(` ✓ MTTR: ${mttr.value} ${mttr.unit} (${mttr.tier})`);
|
|
44
|
-
|
|
45
|
+
const metricsResult = {
|
|
45
46
|
timestamp: new Date().toISOString(),
|
|
46
47
|
metrics: {
|
|
47
48
|
deploymentFrequency,
|
|
@@ -50,6 +51,11 @@ export async function calculateDORAMetrics(client) {
|
|
|
50
51
|
mttr,
|
|
51
52
|
},
|
|
52
53
|
};
|
|
54
|
+
return {
|
|
55
|
+
metrics: metricsResult,
|
|
56
|
+
releases,
|
|
57
|
+
issues,
|
|
58
|
+
};
|
|
53
59
|
}
|
|
54
60
|
/**
|
|
55
61
|
* Write metrics to JSON file
|
|
@@ -86,11 +92,18 @@ async function main() {
|
|
|
86
92
|
const config = { token, owner, repo };
|
|
87
93
|
// Calculate metrics
|
|
88
94
|
const client = new GitHubClient(config);
|
|
89
|
-
const
|
|
90
|
-
// Write
|
|
91
|
-
const
|
|
92
|
-
writeMetricsJSON(metrics,
|
|
95
|
+
const result = await calculateDORAMetrics(client);
|
|
96
|
+
// Write JSON file
|
|
97
|
+
const jsonOutputPath = path.join(process.cwd(), 'metrics', 'dora-latest.json');
|
|
98
|
+
writeMetricsJSON(result.metrics, jsonOutputPath);
|
|
99
|
+
// Generate and write markdown report
|
|
100
|
+
console.log('\n📝 Generating detailed report...');
|
|
101
|
+
const report = generateMarkdownReport(result.metrics, result.releases, result.issues);
|
|
102
|
+
const reportOutputPath = path.join(process.cwd(), 'metrics', 'dora-report.md');
|
|
103
|
+
writeReport(report, reportOutputPath);
|
|
93
104
|
console.log('\n🎉 DORA metrics calculation complete!');
|
|
105
|
+
console.log(` 📊 JSON: ${jsonOutputPath}`);
|
|
106
|
+
console.log(` 📝 Report: ${reportOutputPath}`);
|
|
94
107
|
process.exit(0);
|
|
95
108
|
}
|
|
96
109
|
catch (error) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"dora-calculator.js","sourceRoot":"","sources":["../../src/metrics/dora-calculator.ts"],"names":[],"mappings":";AACA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,MAAM,IAAI,CAAC;AACzB,OAAO,KAAK,IAAI,MAAM,MAAM,CAAC;AAC7B,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EAAE,4BAA4B,EAAE,MAAM,uCAAuC,CAAC;AACrF,OAAO,EAAE,iBAAiB,EAAE,MAAM,4BAA4B,CAAC;AAC/D,OAAO,EAAE,0BAA0B,EAAE,MAAM,sCAAsC,CAAC;AAClF,OAAO,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;
|
|
1
|
+
{"version":3,"file":"dora-calculator.js","sourceRoot":"","sources":["../../src/metrics/dora-calculator.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
/**
|
|
3
|
+
* DORA Metrics Report Generator
|
|
4
|
+
*
|
|
5
|
+
* Generates detailed markdown reports from DORA metrics
|
|
6
|
+
* Provides insights, trends, and actionable recommendations
|
|
7
|
+
*/
|
|
8
|
+
import { DORAMetrics, Release, Issue } from './types.js';
|
|
9
|
+
/**
|
|
10
|
+
* Generate markdown report
|
|
11
|
+
*/
|
|
12
|
+
export declare function generateMarkdownReport(metrics: DORAMetrics, releases?: Release[], issues?: Issue[]): string;
|
|
13
|
+
/**
|
|
14
|
+
* Write report to markdown file
|
|
15
|
+
*/
|
|
16
|
+
export declare function writeReport(report: string, filePath: string): void;
|
|
17
|
+
//# sourceMappingURL=report-generator.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"report-generator.d.ts","sourceRoot":"","sources":["../../src/metrics/report-generator.ts"],"names":[],"mappings":";AACA;;;;;GAKG;AAIH,OAAO,EAAE,WAAW,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AAsKzD;;GAEG;AACH,wBAAgB,sBAAsB,CACpC,OAAO,EAAE,WAAW,EACpB,QAAQ,CAAC,EAAE,OAAO,EAAE,EACpB,MAAM,CAAC,EAAE,KAAK,EAAE,GACf,MAAM,CAyOR;AAED;;GAEG;AACH,wBAAgB,WAAW,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,IAAI,CAQlE"}
|