specweave 0.23.8 → 0.23.12
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-plugin/marketplace.json +7 -7
- package/CLAUDE.md +391 -1338
- package/dist/src/cli/commands/cleanup-cache.d.ts +14 -0
- package/dist/src/cli/commands/cleanup-cache.d.ts.map +1 -0
- package/dist/src/cli/commands/cleanup-cache.js +63 -0
- package/dist/src/cli/commands/cleanup-cache.js.map +1 -0
- package/dist/src/cli/commands/init.js +40 -0
- package/dist/src/cli/commands/init.js.map +1 -1
- package/dist/src/cli/commands/migrate-config.d.ts +22 -0
- package/dist/src/cli/commands/migrate-config.d.ts.map +1 -0
- package/dist/src/cli/commands/migrate-config.js +149 -0
- package/dist/src/cli/commands/migrate-config.js.map +1 -0
- package/dist/src/cli/helpers/async-project-loader.d.ts +148 -0
- package/dist/src/cli/helpers/async-project-loader.d.ts.map +1 -0
- package/dist/src/cli/helpers/async-project-loader.js +351 -0
- package/dist/src/cli/helpers/async-project-loader.js.map +1 -0
- package/dist/src/cli/helpers/cancelation-handler.d.ts +123 -0
- package/dist/src/cli/helpers/cancelation-handler.d.ts.map +1 -0
- package/dist/src/cli/helpers/cancelation-handler.js +187 -0
- package/dist/src/cli/helpers/cancelation-handler.js.map +1 -0
- package/dist/src/cli/helpers/import-strategy-prompter.d.ts +43 -0
- package/dist/src/cli/helpers/import-strategy-prompter.d.ts.map +1 -0
- package/dist/src/cli/helpers/import-strategy-prompter.js +136 -0
- package/dist/src/cli/helpers/import-strategy-prompter.js.map +1 -0
- package/dist/src/cli/helpers/issue-tracker/ado.d.ts +5 -2
- package/dist/src/cli/helpers/issue-tracker/ado.d.ts.map +1 -1
- package/dist/src/cli/helpers/issue-tracker/ado.js +90 -40
- package/dist/src/cli/helpers/issue-tracker/ado.js.map +1 -1
- package/dist/src/cli/helpers/issue-tracker/index.d.ts.map +1 -1
- package/dist/src/cli/helpers/issue-tracker/index.js +112 -60
- package/dist/src/cli/helpers/issue-tracker/index.js.map +1 -1
- package/dist/src/cli/helpers/issue-tracker/jira.d.ts +26 -2
- package/dist/src/cli/helpers/issue-tracker/jira.d.ts.map +1 -1
- package/dist/src/cli/helpers/issue-tracker/jira.js +197 -132
- package/dist/src/cli/helpers/issue-tracker/jira.js.map +1 -1
- package/dist/src/cli/helpers/progress-tracker.d.ts +121 -0
- package/dist/src/cli/helpers/progress-tracker.d.ts.map +1 -0
- package/dist/src/cli/helpers/progress-tracker.js +202 -0
- package/dist/src/cli/helpers/progress-tracker.js.map +1 -0
- package/dist/src/cli/helpers/project-count-fetcher.d.ts +69 -0
- package/dist/src/cli/helpers/project-count-fetcher.d.ts.map +1 -0
- package/dist/src/cli/helpers/project-count-fetcher.js +173 -0
- package/dist/src/cli/helpers/project-count-fetcher.js.map +1 -0
- package/dist/src/config/types.d.ts +14 -14
- package/dist/src/core/cache/cache-manager.d.ts +119 -0
- package/dist/src/core/cache/cache-manager.d.ts.map +1 -0
- package/dist/src/core/cache/cache-manager.js +304 -0
- package/dist/src/core/cache/cache-manager.js.map +1 -0
- package/dist/src/core/cache/rate-limit-checker.d.ts +92 -0
- package/dist/src/core/cache/rate-limit-checker.d.ts.map +1 -0
- package/dist/src/core/cache/rate-limit-checker.js +160 -0
- package/dist/src/core/cache/rate-limit-checker.js.map +1 -0
- package/dist/src/core/config/config-manager.d.ts +135 -0
- package/dist/src/core/config/config-manager.d.ts.map +1 -0
- package/dist/src/core/config/config-manager.js +341 -0
- package/dist/src/core/config/config-manager.js.map +1 -0
- package/dist/src/core/config/config-migrator.d.ts +102 -0
- package/dist/src/core/config/config-migrator.d.ts.map +1 -0
- package/dist/src/core/config/config-migrator.js +367 -0
- package/dist/src/core/config/config-migrator.js.map +1 -0
- package/dist/src/core/config/index.d.ts +10 -0
- package/dist/src/core/config/index.d.ts.map +1 -0
- package/dist/src/core/config/index.js +10 -0
- package/dist/src/core/config/index.js.map +1 -0
- package/dist/src/core/config/types.d.ts +216 -0
- package/dist/src/core/config/types.d.ts.map +1 -0
- package/dist/src/core/config/types.js +32 -0
- package/dist/src/core/config/types.js.map +1 -0
- package/dist/src/core/progress/cancelation-handler.d.ts +79 -0
- package/dist/src/core/progress/cancelation-handler.d.ts.map +1 -0
- package/dist/src/core/progress/cancelation-handler.js +111 -0
- package/dist/src/core/progress/cancelation-handler.js.map +1 -0
- package/dist/src/core/progress/import-state.d.ts +71 -0
- package/dist/src/core/progress/import-state.d.ts.map +1 -0
- package/dist/src/core/progress/import-state.js +96 -0
- package/dist/src/core/progress/import-state.js.map +1 -0
- package/dist/src/core/progress/progress-tracker.d.ts +139 -0
- package/dist/src/core/progress/progress-tracker.d.ts.map +1 -0
- package/dist/src/core/progress/progress-tracker.js +223 -0
- package/dist/src/core/progress/progress-tracker.js.map +1 -0
- package/dist/src/init/architecture/types.d.ts +6 -6
- package/dist/src/integrations/ado/ado-client.d.ts +25 -0
- package/dist/src/integrations/ado/ado-client.d.ts.map +1 -1
- package/dist/src/integrations/ado/ado-client.js +67 -0
- package/dist/src/integrations/ado/ado-client.js.map +1 -1
- package/dist/src/integrations/ado/ado-dependency-loader.d.ts +99 -0
- package/dist/src/integrations/ado/ado-dependency-loader.d.ts.map +1 -0
- package/dist/src/integrations/ado/ado-dependency-loader.js +207 -0
- package/dist/src/integrations/ado/ado-dependency-loader.js.map +1 -0
- package/dist/src/integrations/jira/jira-client.d.ts +32 -0
- package/dist/src/integrations/jira/jira-client.d.ts.map +1 -1
- package/dist/src/integrations/jira/jira-client.js +81 -0
- package/dist/src/integrations/jira/jira-client.js.map +1 -1
- package/dist/src/integrations/jira/jira-dependency-loader.d.ts +101 -0
- package/dist/src/integrations/jira/jira-dependency-loader.d.ts.map +1 -0
- package/dist/src/integrations/jira/jira-dependency-loader.js +200 -0
- package/dist/src/integrations/jira/jira-dependency-loader.js.map +1 -0
- package/dist/src/integrations/jira/jira-hierarchy-mapper.d.ts +104 -0
- package/dist/src/integrations/jira/jira-hierarchy-mapper.d.ts.map +1 -0
- package/dist/src/integrations/jira/jira-hierarchy-mapper.js +178 -0
- package/dist/src/integrations/jira/jira-hierarchy-mapper.js.map +1 -0
- package/package.json +1 -1
- package/plugins/specweave/.claude-plugin/plugin.json +20 -0
- package/plugins/specweave/agents/architect/AGENT.md +100 -602
- package/plugins/specweave/agents/pm/AGENT.md +96 -597
- package/plugins/specweave/agents/pm/AGENT.md.bak +1893 -0
- package/plugins/specweave/agents/pm/AGENT.md.bak2 +1754 -0
- package/plugins/specweave/commands/check-hooks.md +257 -0
- package/plugins/specweave/commands/migrate-config.md +104 -0
- package/plugins/specweave/hooks/post-edit-spec.sh +202 -31
- package/plugins/specweave/hooks/post-task-completion.sh +225 -228
- package/plugins/specweave/hooks/post-write-spec.sh +207 -31
- package/plugins/specweave/hooks/pre-edit-spec.sh +151 -0
- package/plugins/specweave/hooks/pre-task-completion.sh +5 -7
- package/plugins/specweave/hooks/pre-write-spec.sh +151 -0
- package/plugins/specweave/hooks/test-pretooluse-env.sh +72 -0
- package/plugins/specweave/skills/compliance-architecture/SKILL.md +374 -0
- package/plugins/specweave/skills/external-sync-wizard/SKILL.md +610 -0
- package/plugins/specweave/skills/pm-closure-validation/SKILL.md +541 -0
- package/plugins/specweave/skills/roadmap-planner/SKILL.md +473 -0
- package/plugins/specweave-ado/commands/refresh-cache.js +25 -0
- package/plugins/specweave-ado/commands/refresh-cache.ts +40 -0
- package/plugins/specweave-ado/hooks/post-task-completion.sh +1 -1
- package/plugins/specweave-github/hooks/post-task-completion.sh +1 -1
- package/plugins/specweave-jira/commands/refresh-cache.js +25 -0
- package/plugins/specweave-jira/commands/refresh-cache.ts +40 -0
- package/plugins/specweave-jira/hooks/post-task-completion.sh +1 -1
- package/plugins/specweave-kafka-streams/commands/topology.md +437 -0
- package/plugins/specweave-n8n/commands/workflow-template.md +262 -0
- package/plugins/specweave-release/hooks/.specweave/logs/dora-tracking.log +228 -6333
|
@@ -0,0 +1,216 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* SpecWeave Configuration Types
|
|
3
|
+
*
|
|
4
|
+
* Defines the structure for .specweave/config.json
|
|
5
|
+
*
|
|
6
|
+
* @module core/config/types
|
|
7
|
+
*/
|
|
8
|
+
/**
|
|
9
|
+
* Repository provider types
|
|
10
|
+
*/
|
|
11
|
+
export type RepositoryProvider = 'local' | 'github' | 'bitbucket' | 'ado' | 'gitlab' | 'generic';
|
|
12
|
+
/**
|
|
13
|
+
* Issue tracker provider types
|
|
14
|
+
*/
|
|
15
|
+
export type IssueTrackerProvider = 'none' | 'jira' | 'github' | 'ado';
|
|
16
|
+
/**
|
|
17
|
+
* Jira instance types
|
|
18
|
+
*/
|
|
19
|
+
export type JiraInstanceType = 'cloud' | 'server';
|
|
20
|
+
/**
|
|
21
|
+
* Jira organization strategies
|
|
22
|
+
*/
|
|
23
|
+
export type JiraStrategy = 'single-project' | 'project-per-team' | 'component-based' | 'board-based';
|
|
24
|
+
/**
|
|
25
|
+
* Sync direction types
|
|
26
|
+
*/
|
|
27
|
+
export type SyncDirection = 'import' | 'export' | 'bidirectional';
|
|
28
|
+
/**
|
|
29
|
+
* Repository configuration
|
|
30
|
+
*/
|
|
31
|
+
export interface RepoConfig {
|
|
32
|
+
name: string;
|
|
33
|
+
url: string;
|
|
34
|
+
path?: string;
|
|
35
|
+
branch?: string;
|
|
36
|
+
specweaveProject?: string;
|
|
37
|
+
}
|
|
38
|
+
/**
|
|
39
|
+
* Jira project configuration
|
|
40
|
+
*/
|
|
41
|
+
export interface JiraProjectConfig {
|
|
42
|
+
key: string;
|
|
43
|
+
id?: string;
|
|
44
|
+
name?: string;
|
|
45
|
+
specweaveProject?: string;
|
|
46
|
+
}
|
|
47
|
+
/**
|
|
48
|
+
* Jira board configuration
|
|
49
|
+
*/
|
|
50
|
+
export interface JiraBoardConfig {
|
|
51
|
+
id: string;
|
|
52
|
+
name?: string;
|
|
53
|
+
}
|
|
54
|
+
/**
|
|
55
|
+
* Repository configuration section
|
|
56
|
+
*/
|
|
57
|
+
export interface RepositoryConfiguration {
|
|
58
|
+
provider: RepositoryProvider;
|
|
59
|
+
organization?: string;
|
|
60
|
+
repos?: RepoConfig[];
|
|
61
|
+
}
|
|
62
|
+
/**
|
|
63
|
+
* Issue tracker configuration section
|
|
64
|
+
*/
|
|
65
|
+
export interface IssueTrackerConfiguration {
|
|
66
|
+
provider: IssueTrackerProvider;
|
|
67
|
+
domain?: string;
|
|
68
|
+
instanceType?: JiraInstanceType;
|
|
69
|
+
strategy?: JiraStrategy;
|
|
70
|
+
projects?: JiraProjectConfig[];
|
|
71
|
+
components?: string[];
|
|
72
|
+
boards?: JiraBoardConfig[];
|
|
73
|
+
owner?: string;
|
|
74
|
+
repo?: string;
|
|
75
|
+
repos?: string[];
|
|
76
|
+
organization_ado?: string;
|
|
77
|
+
project?: string;
|
|
78
|
+
}
|
|
79
|
+
/**
|
|
80
|
+
* Sync profile configuration
|
|
81
|
+
*/
|
|
82
|
+
export interface SyncProfile {
|
|
83
|
+
provider: string;
|
|
84
|
+
displayName: string;
|
|
85
|
+
config: {
|
|
86
|
+
owner?: string;
|
|
87
|
+
repo?: string;
|
|
88
|
+
domain?: string;
|
|
89
|
+
projectKey?: string;
|
|
90
|
+
projects?: string[];
|
|
91
|
+
organization?: string;
|
|
92
|
+
project?: string;
|
|
93
|
+
monorepoProjects?: string[];
|
|
94
|
+
};
|
|
95
|
+
timeRange: {
|
|
96
|
+
default: string;
|
|
97
|
+
max: string;
|
|
98
|
+
};
|
|
99
|
+
rateLimits?: {
|
|
100
|
+
maxItemsPerSync: number;
|
|
101
|
+
warnThreshold: number;
|
|
102
|
+
};
|
|
103
|
+
}
|
|
104
|
+
/**
|
|
105
|
+
* Sync settings
|
|
106
|
+
*/
|
|
107
|
+
export interface SyncSettings {
|
|
108
|
+
canUpsertInternalItems: boolean;
|
|
109
|
+
canUpdateExternalItems: boolean;
|
|
110
|
+
canUpdateStatus: boolean;
|
|
111
|
+
}
|
|
112
|
+
/**
|
|
113
|
+
* Sync configuration section
|
|
114
|
+
*/
|
|
115
|
+
export interface SyncConfiguration {
|
|
116
|
+
enabled: boolean;
|
|
117
|
+
direction: SyncDirection;
|
|
118
|
+
autoSync: boolean;
|
|
119
|
+
includeStatus: boolean;
|
|
120
|
+
autoApplyLabels: boolean;
|
|
121
|
+
provider?: string;
|
|
122
|
+
activeProfile?: string;
|
|
123
|
+
settings?: SyncSettings;
|
|
124
|
+
profiles?: Record<string, SyncProfile>;
|
|
125
|
+
}
|
|
126
|
+
/**
|
|
127
|
+
* Permission configuration section
|
|
128
|
+
*/
|
|
129
|
+
export interface PermissionsConfiguration {
|
|
130
|
+
canCreate: boolean;
|
|
131
|
+
canUpdate: boolean;
|
|
132
|
+
canUpdateStatus: boolean;
|
|
133
|
+
}
|
|
134
|
+
/**
|
|
135
|
+
* Hook configuration
|
|
136
|
+
*/
|
|
137
|
+
export interface HookConfiguration {
|
|
138
|
+
post_task_completion?: {
|
|
139
|
+
sync_living_docs?: boolean;
|
|
140
|
+
sync_tasks_md?: boolean;
|
|
141
|
+
external_tracker_sync?: boolean;
|
|
142
|
+
};
|
|
143
|
+
post_increment_planning?: {
|
|
144
|
+
auto_create_github_issue?: boolean;
|
|
145
|
+
};
|
|
146
|
+
}
|
|
147
|
+
/**
|
|
148
|
+
* Project metadata
|
|
149
|
+
*/
|
|
150
|
+
export interface ProjectMetadata {
|
|
151
|
+
name: string;
|
|
152
|
+
version: string;
|
|
153
|
+
}
|
|
154
|
+
/**
|
|
155
|
+
* Adapter configuration
|
|
156
|
+
*/
|
|
157
|
+
export interface AdapterConfiguration {
|
|
158
|
+
default: string;
|
|
159
|
+
}
|
|
160
|
+
/**
|
|
161
|
+
* Main SpecWeave configuration
|
|
162
|
+
*/
|
|
163
|
+
export interface SpecWeaveConfig {
|
|
164
|
+
/**
|
|
165
|
+
* Config version for migration support
|
|
166
|
+
*/
|
|
167
|
+
version: string;
|
|
168
|
+
/**
|
|
169
|
+
* Project metadata (optional, for backward compatibility)
|
|
170
|
+
*/
|
|
171
|
+
project?: ProjectMetadata;
|
|
172
|
+
/**
|
|
173
|
+
* Adapter configuration (optional, for backward compatibility)
|
|
174
|
+
*/
|
|
175
|
+
adapters?: AdapterConfiguration;
|
|
176
|
+
/**
|
|
177
|
+
* Hook configuration (optional)
|
|
178
|
+
*/
|
|
179
|
+
hooks?: HookConfiguration;
|
|
180
|
+
/**
|
|
181
|
+
* Repository provider configuration
|
|
182
|
+
*/
|
|
183
|
+
repository?: RepositoryConfiguration;
|
|
184
|
+
/**
|
|
185
|
+
* Issue tracker configuration
|
|
186
|
+
*/
|
|
187
|
+
issueTracker?: IssueTrackerConfiguration;
|
|
188
|
+
/**
|
|
189
|
+
* Sync configuration
|
|
190
|
+
*/
|
|
191
|
+
sync?: SyncConfiguration;
|
|
192
|
+
/**
|
|
193
|
+
* Permissions configuration
|
|
194
|
+
*/
|
|
195
|
+
permissions?: PermissionsConfiguration;
|
|
196
|
+
}
|
|
197
|
+
/**
|
|
198
|
+
* Default configuration values
|
|
199
|
+
*/
|
|
200
|
+
export declare const DEFAULT_CONFIG: SpecWeaveConfig;
|
|
201
|
+
/**
|
|
202
|
+
* Validation error
|
|
203
|
+
*/
|
|
204
|
+
export interface ValidationError {
|
|
205
|
+
path: string;
|
|
206
|
+
message: string;
|
|
207
|
+
value?: any;
|
|
208
|
+
}
|
|
209
|
+
/**
|
|
210
|
+
* Validation result
|
|
211
|
+
*/
|
|
212
|
+
export interface ValidationResult {
|
|
213
|
+
valid: boolean;
|
|
214
|
+
errors: ValidationError[];
|
|
215
|
+
}
|
|
216
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../../src/core/config/types.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* SpecWeave Configuration Types
|
|
3
|
+
*
|
|
4
|
+
* Defines the structure for .specweave/config.json
|
|
5
|
+
*
|
|
6
|
+
* @module core/config/types
|
|
7
|
+
*/
|
|
8
|
+
/**
|
|
9
|
+
* Default configuration values
|
|
10
|
+
*/
|
|
11
|
+
export const DEFAULT_CONFIG = {
|
|
12
|
+
version: '2.0',
|
|
13
|
+
repository: {
|
|
14
|
+
provider: 'local'
|
|
15
|
+
},
|
|
16
|
+
issueTracker: {
|
|
17
|
+
provider: 'none'
|
|
18
|
+
},
|
|
19
|
+
sync: {
|
|
20
|
+
enabled: false,
|
|
21
|
+
direction: 'bidirectional',
|
|
22
|
+
autoSync: false,
|
|
23
|
+
includeStatus: true,
|
|
24
|
+
autoApplyLabels: true
|
|
25
|
+
},
|
|
26
|
+
permissions: {
|
|
27
|
+
canCreate: true,
|
|
28
|
+
canUpdate: true,
|
|
29
|
+
canUpdateStatus: true
|
|
30
|
+
}
|
|
31
|
+
};
|
|
32
|
+
//# sourceMappingURL=types.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../../../src/core/config/types.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AA8NH;;GAEG;AACH,MAAM,CAAC,MAAM,cAAc,GAAoB;IAC7C,OAAO,EAAE,KAAK;IACd,UAAU,EAAE;QACV,QAAQ,EAAE,OAAO;KAClB;IACD,YAAY,EAAE;QACZ,QAAQ,EAAE,MAAM;KACjB;IACD,IAAI,EAAE;QACJ,OAAO,EAAE,KAAK;QACd,SAAS,EAAE,eAAe;QAC1B,QAAQ,EAAE,KAAK;QACf,aAAa,EAAE,IAAI;QACnB,eAAe,EAAE,IAAI;KACtB;IACD,WAAW,EAAE;QACX,SAAS,EAAE,IAAI;QACf,SAAS,EAAE,IAAI;QACf,eAAe,EAAE,IAAI;KACtB;CACF,CAAC"}
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* CancelationHandler - Graceful Ctrl+C (SIGINT) handling with state persistence
|
|
3
|
+
*
|
|
4
|
+
* Features:
|
|
5
|
+
* - Single Ctrl+C: Save state and exit gracefully
|
|
6
|
+
* - Double Ctrl+C (within 2s): Force exit immediately
|
|
7
|
+
* - Polling mechanism for cooperative cancelation
|
|
8
|
+
* - State persistence to resume later
|
|
9
|
+
*
|
|
10
|
+
* @module core/progress/cancelation-handler
|
|
11
|
+
*/
|
|
12
|
+
import type { Logger } from '../../utils/logger.js';
|
|
13
|
+
/**
|
|
14
|
+
* Cancelation handler options
|
|
15
|
+
*/
|
|
16
|
+
export interface CancelationOptions {
|
|
17
|
+
/** State save callback - called when Ctrl+C is pressed */
|
|
18
|
+
onSaveState?: () => Promise<void>;
|
|
19
|
+
/** Logger instance */
|
|
20
|
+
logger?: Logger;
|
|
21
|
+
/** Force exit timeout in milliseconds (default: 2000ms) */
|
|
22
|
+
forceExitTimeout?: number;
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* CancelationHandler - Handles SIGINT gracefully with double Ctrl+C force exit
|
|
26
|
+
*
|
|
27
|
+
* @example
|
|
28
|
+
* ```typescript
|
|
29
|
+
* const handler = new CancelationHandler({
|
|
30
|
+
* onSaveState: async () => {
|
|
31
|
+
* await saveImportState();
|
|
32
|
+
* }
|
|
33
|
+
* });
|
|
34
|
+
*
|
|
35
|
+
* handler.register();
|
|
36
|
+
*
|
|
37
|
+
* // In import loop
|
|
38
|
+
* for (const project of projects) {
|
|
39
|
+
* if (handler.shouldCancel()) {
|
|
40
|
+
* break;
|
|
41
|
+
* }
|
|
42
|
+
* await importProject(project);
|
|
43
|
+
* }
|
|
44
|
+
*
|
|
45
|
+
* handler.unregister();
|
|
46
|
+
* ```
|
|
47
|
+
*/
|
|
48
|
+
export declare class CancelationHandler {
|
|
49
|
+
private logger;
|
|
50
|
+
private onSaveState?;
|
|
51
|
+
private forceExitTimeout;
|
|
52
|
+
private cancelRequested;
|
|
53
|
+
private firstCtrlCTime;
|
|
54
|
+
private sigintHandler;
|
|
55
|
+
constructor(options?: CancelationOptions);
|
|
56
|
+
/**
|
|
57
|
+
* Register SIGINT listener
|
|
58
|
+
*/
|
|
59
|
+
register(): void;
|
|
60
|
+
/**
|
|
61
|
+
* Unregister SIGINT listener
|
|
62
|
+
*/
|
|
63
|
+
unregister(): void;
|
|
64
|
+
/**
|
|
65
|
+
* Check if cancelation was requested (polling mechanism)
|
|
66
|
+
*
|
|
67
|
+
* @returns true if Ctrl+C was pressed
|
|
68
|
+
*/
|
|
69
|
+
shouldCancel(): boolean;
|
|
70
|
+
/**
|
|
71
|
+
* Handle SIGINT signal (Ctrl+C)
|
|
72
|
+
*/
|
|
73
|
+
private handleSigint;
|
|
74
|
+
/**
|
|
75
|
+
* Reset cancelation state (useful for testing)
|
|
76
|
+
*/
|
|
77
|
+
reset(): void;
|
|
78
|
+
}
|
|
79
|
+
//# sourceMappingURL=cancelation-handler.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cancelation-handler.d.ts","sourceRoot":"","sources":["../../../../src/core/progress/cancelation-handler.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,uBAAuB,CAAC;AAGpD;;GAEG;AACH,MAAM,WAAW,kBAAkB;IACjC,0DAA0D;IAC1D,WAAW,CAAC,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IAClC,sBAAsB;IACtB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,2DAA2D;IAC3D,gBAAgB,CAAC,EAAE,MAAM,CAAC;CAC3B;AAED;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AACH,qBAAa,kBAAkB;IAC7B,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,WAAW,CAAC,CAAsB;IAC1C,OAAO,CAAC,gBAAgB,CAAS;IAEjC,OAAO,CAAC,eAAe,CAAkB;IACzC,OAAO,CAAC,cAAc,CAAuB;IAC7C,OAAO,CAAC,aAAa,CAA6B;gBAEtC,OAAO,GAAE,kBAAuB;IAM5C;;OAEG;IACH,QAAQ,IAAI,IAAI;IAQhB;;OAEG;IACH,UAAU,IAAI,IAAI;IAOlB;;;;OAIG;IACH,YAAY,IAAI,OAAO;IAIvB;;OAEG;YACW,YAAY;IAiC1B;;OAEG;IACH,KAAK,IAAI,IAAI;CAId"}
|
|
@@ -0,0 +1,111 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* CancelationHandler - Graceful Ctrl+C (SIGINT) handling with state persistence
|
|
3
|
+
*
|
|
4
|
+
* Features:
|
|
5
|
+
* - Single Ctrl+C: Save state and exit gracefully
|
|
6
|
+
* - Double Ctrl+C (within 2s): Force exit immediately
|
|
7
|
+
* - Polling mechanism for cooperative cancelation
|
|
8
|
+
* - State persistence to resume later
|
|
9
|
+
*
|
|
10
|
+
* @module core/progress/cancelation-handler
|
|
11
|
+
*/
|
|
12
|
+
import { consoleLogger } from '../../utils/logger.js';
|
|
13
|
+
/**
|
|
14
|
+
* CancelationHandler - Handles SIGINT gracefully with double Ctrl+C force exit
|
|
15
|
+
*
|
|
16
|
+
* @example
|
|
17
|
+
* ```typescript
|
|
18
|
+
* const handler = new CancelationHandler({
|
|
19
|
+
* onSaveState: async () => {
|
|
20
|
+
* await saveImportState();
|
|
21
|
+
* }
|
|
22
|
+
* });
|
|
23
|
+
*
|
|
24
|
+
* handler.register();
|
|
25
|
+
*
|
|
26
|
+
* // In import loop
|
|
27
|
+
* for (const project of projects) {
|
|
28
|
+
* if (handler.shouldCancel()) {
|
|
29
|
+
* break;
|
|
30
|
+
* }
|
|
31
|
+
* await importProject(project);
|
|
32
|
+
* }
|
|
33
|
+
*
|
|
34
|
+
* handler.unregister();
|
|
35
|
+
* ```
|
|
36
|
+
*/
|
|
37
|
+
export class CancelationHandler {
|
|
38
|
+
constructor(options = {}) {
|
|
39
|
+
this.cancelRequested = false;
|
|
40
|
+
this.firstCtrlCTime = null;
|
|
41
|
+
this.sigintHandler = null;
|
|
42
|
+
this.logger = options.logger ?? consoleLogger;
|
|
43
|
+
this.onSaveState = options.onSaveState;
|
|
44
|
+
this.forceExitTimeout = options.forceExitTimeout ?? 2000;
|
|
45
|
+
}
|
|
46
|
+
/**
|
|
47
|
+
* Register SIGINT listener
|
|
48
|
+
*/
|
|
49
|
+
register() {
|
|
50
|
+
this.sigintHandler = () => {
|
|
51
|
+
void this.handleSigint();
|
|
52
|
+
};
|
|
53
|
+
process.on('SIGINT', this.sigintHandler);
|
|
54
|
+
}
|
|
55
|
+
/**
|
|
56
|
+
* Unregister SIGINT listener
|
|
57
|
+
*/
|
|
58
|
+
unregister() {
|
|
59
|
+
if (this.sigintHandler) {
|
|
60
|
+
process.off('SIGINT', this.sigintHandler);
|
|
61
|
+
this.sigintHandler = null;
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
/**
|
|
65
|
+
* Check if cancelation was requested (polling mechanism)
|
|
66
|
+
*
|
|
67
|
+
* @returns true if Ctrl+C was pressed
|
|
68
|
+
*/
|
|
69
|
+
shouldCancel() {
|
|
70
|
+
return this.cancelRequested;
|
|
71
|
+
}
|
|
72
|
+
/**
|
|
73
|
+
* Handle SIGINT signal (Ctrl+C)
|
|
74
|
+
*/
|
|
75
|
+
async handleSigint() {
|
|
76
|
+
const now = Date.now();
|
|
77
|
+
// Double Ctrl+C detection
|
|
78
|
+
if (this.firstCtrlCTime !== null) {
|
|
79
|
+
const elapsed = now - this.firstCtrlCTime;
|
|
80
|
+
if (elapsed < this.forceExitTimeout) {
|
|
81
|
+
// Force exit on double Ctrl+C
|
|
82
|
+
this.logger.warn('\n⚠️ Forced exit (progress may be lost)');
|
|
83
|
+
process.exit(1);
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
// First Ctrl+C
|
|
87
|
+
this.firstCtrlCTime = now;
|
|
88
|
+
this.cancelRequested = true;
|
|
89
|
+
this.logger.log('\n⏸️ Cancelation requested. Saving progress...');
|
|
90
|
+
try {
|
|
91
|
+
// Save state if callback provided
|
|
92
|
+
if (this.onSaveState) {
|
|
93
|
+
await this.onSaveState();
|
|
94
|
+
}
|
|
95
|
+
this.logger.log('✅ Progress saved. Run with --resume to continue.');
|
|
96
|
+
process.exit(0);
|
|
97
|
+
}
|
|
98
|
+
catch (error) {
|
|
99
|
+
this.logger.error('❌ Failed to save progress:', error);
|
|
100
|
+
process.exit(1);
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
/**
|
|
104
|
+
* Reset cancelation state (useful for testing)
|
|
105
|
+
*/
|
|
106
|
+
reset() {
|
|
107
|
+
this.cancelRequested = false;
|
|
108
|
+
this.firstCtrlCTime = null;
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
//# sourceMappingURL=cancelation-handler.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cancelation-handler.js","sourceRoot":"","sources":["../../../../src/core/progress/cancelation-handler.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAGH,OAAO,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AActD;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AACH,MAAM,OAAO,kBAAkB;IAS7B,YAAY,UAA8B,EAAE;QAJpC,oBAAe,GAAY,KAAK,CAAC;QACjC,mBAAc,GAAkB,IAAI,CAAC;QACrC,kBAAa,GAAwB,IAAI,CAAC;QAGhD,IAAI,CAAC,MAAM,GAAG,OAAO,CAAC,MAAM,IAAI,aAAa,CAAC;QAC9C,IAAI,CAAC,WAAW,GAAG,OAAO,CAAC,WAAW,CAAC;QACvC,IAAI,CAAC,gBAAgB,GAAG,OAAO,CAAC,gBAAgB,IAAI,IAAI,CAAC;IAC3D,CAAC;IAED;;OAEG;IACH,QAAQ;QACN,IAAI,CAAC,aAAa,GAAG,GAAG,EAAE;YACxB,KAAK,IAAI,CAAC,YAAY,EAAE,CAAC;QAC3B,CAAC,CAAC;QAEF,OAAO,CAAC,EAAE,CAAC,QAAQ,EAAE,IAAI,CAAC,aAAa,CAAC,CAAC;IAC3C,CAAC;IAED;;OAEG;IACH,UAAU;QACR,IAAI,IAAI,CAAC,aAAa,EAAE,CAAC;YACvB,OAAO,CAAC,GAAG,CAAC,QAAQ,EAAE,IAAI,CAAC,aAAa,CAAC,CAAC;YAC1C,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC;QAC5B,CAAC;IACH,CAAC;IAED;;;;OAIG;IACH,YAAY;QACV,OAAO,IAAI,CAAC,eAAe,CAAC;IAC9B,CAAC;IAED;;OAEG;IACK,KAAK,CAAC,YAAY;QACxB,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QAEvB,0BAA0B;QAC1B,IAAI,IAAI,CAAC,cAAc,KAAK,IAAI,EAAE,CAAC;YACjC,MAAM,OAAO,GAAG,GAAG,GAAG,IAAI,CAAC,cAAc,CAAC;YAC1C,IAAI,OAAO,GAAG,IAAI,CAAC,gBAAgB,EAAE,CAAC;gBACpC,8BAA8B;gBAC9B,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,0CAA0C,CAAC,CAAC;gBAC7D,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YAClB,CAAC;QACH,CAAC;QAED,eAAe;QACf,IAAI,CAAC,cAAc,GAAG,GAAG,CAAC;QAC1B,IAAI,CAAC,eAAe,GAAG,IAAI,CAAC;QAE5B,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,iDAAiD,CAAC,CAAC;QAEnE,IAAI,CAAC;YACH,kCAAkC;YAClC,IAAI,IAAI,CAAC,WAAW,EAAE,CAAC;gBACrB,MAAM,IAAI,CAAC,WAAW,EAAE,CAAC;YAC3B,CAAC;YAED,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,kDAAkD,CAAC,CAAC;YACpE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,4BAA4B,EAAE,KAAK,CAAC,CAAC;YACvD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;IACH,CAAC;IAED;;OAEG;IACH,KAAK;QACH,IAAI,CAAC,eAAe,GAAG,KAAK,CAAC;QAC7B,IAAI,CAAC,cAAc,GAAG,IAAI,CAAC;IAC7B,CAAC;CACF"}
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ImportState - State persistence for resumable imports
|
|
3
|
+
*
|
|
4
|
+
* Features:
|
|
5
|
+
* - Save/load import progress
|
|
6
|
+
* - 24-hour TTL for stale state cleanup
|
|
7
|
+
* - Error tracking for retry logic
|
|
8
|
+
*
|
|
9
|
+
* @module core/progress/import-state
|
|
10
|
+
*/
|
|
11
|
+
/**
|
|
12
|
+
* Import error record
|
|
13
|
+
*/
|
|
14
|
+
export interface ImportError {
|
|
15
|
+
/** Item identifier (e.g., project key) */
|
|
16
|
+
id: string;
|
|
17
|
+
/** Error message */
|
|
18
|
+
error: string;
|
|
19
|
+
/** Timestamp when error occurred */
|
|
20
|
+
timestamp: number;
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* Import state structure
|
|
24
|
+
*/
|
|
25
|
+
export interface ImportState {
|
|
26
|
+
/** Total number of items to import */
|
|
27
|
+
total: number;
|
|
28
|
+
/** Number of items completed (success + failed) */
|
|
29
|
+
completed: number;
|
|
30
|
+
/** Number of successful imports */
|
|
31
|
+
succeeded: number;
|
|
32
|
+
/** Number of failed imports */
|
|
33
|
+
failed: number;
|
|
34
|
+
/** Array of import errors */
|
|
35
|
+
errors: ImportError[];
|
|
36
|
+
/** Timestamp when state was saved */
|
|
37
|
+
timestamp: number;
|
|
38
|
+
/** Whether import was canceled by user */
|
|
39
|
+
canceled: boolean;
|
|
40
|
+
/** Optional: Last successfully processed item ID */
|
|
41
|
+
lastProcessedId?: string;
|
|
42
|
+
}
|
|
43
|
+
/**
|
|
44
|
+
* Save import state to disk
|
|
45
|
+
*
|
|
46
|
+
* @param state Import state to save
|
|
47
|
+
* @param projectRoot Project root directory
|
|
48
|
+
*/
|
|
49
|
+
export declare function saveImportState(state: ImportState, projectRoot?: string): Promise<void>;
|
|
50
|
+
/**
|
|
51
|
+
* Load import state from disk with TTL validation
|
|
52
|
+
*
|
|
53
|
+
* @param projectRoot Project root directory
|
|
54
|
+
* @param ttlMs Time-to-live in milliseconds (default: 24 hours)
|
|
55
|
+
* @returns Import state if valid, null if expired or missing
|
|
56
|
+
*/
|
|
57
|
+
export declare function loadImportState(projectRoot?: string, ttlMs?: number): Promise<ImportState | null>;
|
|
58
|
+
/**
|
|
59
|
+
* Delete import state file
|
|
60
|
+
*
|
|
61
|
+
* @param projectRoot Project root directory
|
|
62
|
+
*/
|
|
63
|
+
export declare function deleteImportState(projectRoot?: string): Promise<void>;
|
|
64
|
+
/**
|
|
65
|
+
* Check if import state exists (without loading)
|
|
66
|
+
*
|
|
67
|
+
* @param projectRoot Project root directory
|
|
68
|
+
* @returns true if state file exists
|
|
69
|
+
*/
|
|
70
|
+
export declare function hasImportState(projectRoot?: string): boolean;
|
|
71
|
+
//# sourceMappingURL=import-state.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"import-state.d.ts","sourceRoot":"","sources":["../../../../src/core/progress/import-state.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAOH;;GAEG;AACH,MAAM,WAAW,WAAW;IAC1B,0CAA0C;IAC1C,EAAE,EAAE,MAAM,CAAC;IACX,oBAAoB;IACpB,KAAK,EAAE,MAAM,CAAC;IACd,oCAAoC;IACpC,SAAS,EAAE,MAAM,CAAC;CACnB;AAED;;GAEG;AACH,MAAM,WAAW,WAAW;IAC1B,sCAAsC;IACtC,KAAK,EAAE,MAAM,CAAC;IACd,mDAAmD;IACnD,SAAS,EAAE,MAAM,CAAC;IAClB,mCAAmC;IACnC,SAAS,EAAE,MAAM,CAAC;IAClB,+BAA+B;IAC/B,MAAM,EAAE,MAAM,CAAC;IACf,6BAA6B;IAC7B,MAAM,EAAE,WAAW,EAAE,CAAC;IACtB,qCAAqC;IACrC,SAAS,EAAE,MAAM,CAAC;IAClB,0CAA0C;IAC1C,QAAQ,EAAE,OAAO,CAAC;IAClB,oDAAoD;IACpD,eAAe,CAAC,EAAE,MAAM,CAAC;CAC1B;AAYD;;;;;GAKG;AACH,wBAAsB,eAAe,CACnC,KAAK,EAAE,WAAW,EAClB,WAAW,GAAE,MAAsB,GAClC,OAAO,CAAC,IAAI,CAAC,CAef;AAED;;;;;;GAMG;AACH,wBAAsB,eAAe,CACnC,WAAW,GAAE,MAAsB,EACnC,KAAK,GAAE,MAA4B,GAClC,OAAO,CAAC,WAAW,GAAG,IAAI,CAAC,CA0B7B;AAED;;;;GAIG;AACH,wBAAsB,iBAAiB,CAAC,WAAW,GAAE,MAAsB,GAAG,OAAO,CAAC,IAAI,CAAC,CAM1F;AAED;;;;;GAKG;AACH,wBAAgB,cAAc,CAAC,WAAW,GAAE,MAAsB,GAAG,OAAO,CAG3E"}
|
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ImportState - State persistence for resumable imports
|
|
3
|
+
*
|
|
4
|
+
* Features:
|
|
5
|
+
* - Save/load import progress
|
|
6
|
+
* - 24-hour TTL for stale state cleanup
|
|
7
|
+
* - Error tracking for retry logic
|
|
8
|
+
*
|
|
9
|
+
* @module core/progress/import-state
|
|
10
|
+
*/
|
|
11
|
+
import { promises as fs } from 'fs';
|
|
12
|
+
import { join } from 'path';
|
|
13
|
+
import { existsSync } from 'fs';
|
|
14
|
+
import { mkdirpSync } from '../../utils/fs-native.js';
|
|
15
|
+
/**
|
|
16
|
+
* Get import state file path
|
|
17
|
+
*
|
|
18
|
+
* @param projectRoot Project root directory
|
|
19
|
+
* @returns Path to import-state.json
|
|
20
|
+
*/
|
|
21
|
+
function getStateFilePath(projectRoot = process.cwd()) {
|
|
22
|
+
return join(projectRoot, '.specweave', 'cache', 'import-state.json');
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* Save import state to disk
|
|
26
|
+
*
|
|
27
|
+
* @param state Import state to save
|
|
28
|
+
* @param projectRoot Project root directory
|
|
29
|
+
*/
|
|
30
|
+
export async function saveImportState(state, projectRoot = process.cwd()) {
|
|
31
|
+
const stateFilePath = getStateFilePath(projectRoot);
|
|
32
|
+
const cacheDir = join(projectRoot, '.specweave', 'cache');
|
|
33
|
+
// Ensure cache directory exists
|
|
34
|
+
mkdirpSync(cacheDir);
|
|
35
|
+
// Add timestamp
|
|
36
|
+
const stateWithTimestamp = {
|
|
37
|
+
...state,
|
|
38
|
+
timestamp: Date.now(),
|
|
39
|
+
};
|
|
40
|
+
// Write to file
|
|
41
|
+
await fs.writeFile(stateFilePath, JSON.stringify(stateWithTimestamp, null, 2), 'utf-8');
|
|
42
|
+
}
|
|
43
|
+
/**
|
|
44
|
+
* Load import state from disk with TTL validation
|
|
45
|
+
*
|
|
46
|
+
* @param projectRoot Project root directory
|
|
47
|
+
* @param ttlMs Time-to-live in milliseconds (default: 24 hours)
|
|
48
|
+
* @returns Import state if valid, null if expired or missing
|
|
49
|
+
*/
|
|
50
|
+
export async function loadImportState(projectRoot = process.cwd(), ttlMs = 24 * 60 * 60 * 1000 // 24 hours
|
|
51
|
+
) {
|
|
52
|
+
const stateFilePath = getStateFilePath(projectRoot);
|
|
53
|
+
// Check if file exists
|
|
54
|
+
if (!existsSync(stateFilePath)) {
|
|
55
|
+
return null;
|
|
56
|
+
}
|
|
57
|
+
try {
|
|
58
|
+
// Read and parse file
|
|
59
|
+
const content = await fs.readFile(stateFilePath, 'utf-8');
|
|
60
|
+
const state = JSON.parse(content);
|
|
61
|
+
// Validate TTL
|
|
62
|
+
const age = Date.now() - state.timestamp;
|
|
63
|
+
if (age > ttlMs) {
|
|
64
|
+
// State is expired, delete it
|
|
65
|
+
await deleteImportState(projectRoot);
|
|
66
|
+
return null;
|
|
67
|
+
}
|
|
68
|
+
return state;
|
|
69
|
+
}
|
|
70
|
+
catch (error) {
|
|
71
|
+
// Invalid JSON or read error
|
|
72
|
+
return null;
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
/**
|
|
76
|
+
* Delete import state file
|
|
77
|
+
*
|
|
78
|
+
* @param projectRoot Project root directory
|
|
79
|
+
*/
|
|
80
|
+
export async function deleteImportState(projectRoot = process.cwd()) {
|
|
81
|
+
const stateFilePath = getStateFilePath(projectRoot);
|
|
82
|
+
if (existsSync(stateFilePath)) {
|
|
83
|
+
await fs.unlink(stateFilePath);
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
/**
|
|
87
|
+
* Check if import state exists (without loading)
|
|
88
|
+
*
|
|
89
|
+
* @param projectRoot Project root directory
|
|
90
|
+
* @returns true if state file exists
|
|
91
|
+
*/
|
|
92
|
+
export function hasImportState(projectRoot = process.cwd()) {
|
|
93
|
+
const stateFilePath = getStateFilePath(projectRoot);
|
|
94
|
+
return existsSync(stateFilePath);
|
|
95
|
+
}
|
|
96
|
+
//# sourceMappingURL=import-state.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"import-state.js","sourceRoot":"","sources":["../../../../src/core/progress/import-state.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,EAAE,QAAQ,IAAI,EAAE,EAAE,MAAM,IAAI,CAAC;AACpC,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAC5B,OAAO,EAAE,UAAU,EAAE,MAAM,IAAI,CAAC;AAChC,OAAO,EAAE,UAAU,EAAE,MAAM,0BAA0B,CAAC;AAoCtD;;;;;GAKG;AACH,SAAS,gBAAgB,CAAC,cAAsB,OAAO,CAAC,GAAG,EAAE;IAC3D,OAAO,IAAI,CAAC,WAAW,EAAE,YAAY,EAAE,OAAO,EAAE,mBAAmB,CAAC,CAAC;AACvE,CAAC;AAED;;;;;GAKG;AACH,MAAM,CAAC,KAAK,UAAU,eAAe,CACnC,KAAkB,EAClB,cAAsB,OAAO,CAAC,GAAG,EAAE;IAEnC,MAAM,aAAa,GAAG,gBAAgB,CAAC,WAAW,CAAC,CAAC;IACpD,MAAM,QAAQ,GAAG,IAAI,CAAC,WAAW,EAAE,YAAY,EAAE,OAAO,CAAC,CAAC;IAE1D,gCAAgC;IAChC,UAAU,CAAC,QAAQ,CAAC,CAAC;IAErB,gBAAgB;IAChB,MAAM,kBAAkB,GAAgB;QACtC,GAAG,KAAK;QACR,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE;KACtB,CAAC;IAEF,gBAAgB;IAChB,MAAM,EAAE,CAAC,SAAS,CAAC,aAAa,EAAE,IAAI,CAAC,SAAS,CAAC,kBAAkB,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC;AAC1F,CAAC;AAED;;;;;;GAMG;AACH,MAAM,CAAC,KAAK,UAAU,eAAe,CACnC,cAAsB,OAAO,CAAC,GAAG,EAAE,EACnC,QAAgB,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC,WAAW;;IAE/C,MAAM,aAAa,GAAG,gBAAgB,CAAC,WAAW,CAAC,CAAC;IAEpD,uBAAuB;IACvB,IAAI,CAAC,UAAU,CAAC,aAAa,CAAC,EAAE,CAAC;QAC/B,OAAO,IAAI,CAAC;IACd,CAAC;IAED,IAAI,CAAC;QACH,sBAAsB;QACtB,MAAM,OAAO,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,aAAa,EAAE,OAAO,CAAC,CAAC;QAC1D,MAAM,KAAK,GAAgB,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;QAE/C,eAAe;QACf,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,KAAK,CAAC,SAAS,CAAC;QACzC,IAAI,GAAG,GAAG,KAAK,EAAE,CAAC;YAChB,8BAA8B;YAC9B,MAAM,iBAAiB,CAAC,WAAW,CAAC,CAAC;YACrC,OAAO,IAAI,CAAC;QACd,CAAC;QAED,OAAO,KAAK,CAAC;IACf,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,6BAA6B;QAC7B,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,iBAAiB,CAAC,cAAsB,OAAO,CAAC,GAAG,EAAE;IACzE,MAAM,aAAa,GAAG,gBAAgB,CAAC,WAAW,CAAC,CAAC;IAEpD,IAAI,UAAU,CAAC,aAAa,CAAC,EAAE,CAAC;QAC9B,MAAM,EAAE,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC;IACjC,CAAC;AACH,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,cAAc,CAAC,cAAsB,OAAO,CAAC,GAAG,EAAE;IAChE,MAAM,aAAa,GAAG,gBAAgB,CAAC,WAAW,CAAC,CAAC;IACpD,OAAO,UAAU,CAAC,aAAa,CAAC,CAAC;AACnC,CAAC"}
|