specweave 0.9.1 → 0.10.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (75) hide show
  1. package/CLAUDE.md +153 -13
  2. package/README.md +97 -251
  3. package/bin/install-agents.sh +1 -1
  4. package/bin/install-commands.sh +1 -1
  5. package/bin/install-hooks.sh +1 -1
  6. package/bin/install-skills.sh +1 -1
  7. package/bin/specweave.js +32 -0
  8. package/dist/cli/commands/init.d.ts.map +1 -1
  9. package/dist/cli/commands/init.js +29 -1
  10. package/dist/cli/commands/init.js.map +1 -1
  11. package/dist/cli/commands/validate-jira.d.ts +35 -0
  12. package/dist/cli/commands/validate-jira.d.ts.map +1 -0
  13. package/dist/cli/commands/validate-jira.js +112 -0
  14. package/dist/cli/commands/validate-jira.js.map +1 -0
  15. package/dist/cli/commands/validate-plugins.d.ts +41 -0
  16. package/dist/cli/commands/validate-plugins.d.ts.map +1 -0
  17. package/dist/cli/commands/validate-plugins.js +171 -0
  18. package/dist/cli/commands/validate-plugins.js.map +1 -0
  19. package/dist/core/types/sync-profile.d.ts +177 -29
  20. package/dist/core/types/sync-profile.d.ts.map +1 -1
  21. package/dist/core/types/sync-profile.js +48 -1
  22. package/dist/core/types/sync-profile.js.map +1 -1
  23. package/dist/hooks/lib/translate-living-docs.d.ts.map +1 -1
  24. package/dist/hooks/lib/translate-living-docs.js +16 -7
  25. package/dist/hooks/lib/translate-living-docs.js.map +1 -1
  26. package/dist/metrics/dora-calculator.d.ts +7 -3
  27. package/dist/metrics/dora-calculator.d.ts.map +1 -1
  28. package/dist/metrics/dora-calculator.js +19 -6
  29. package/dist/metrics/dora-calculator.js.map +1 -1
  30. package/dist/metrics/report-generator.d.ts +17 -0
  31. package/dist/metrics/report-generator.d.ts.map +1 -0
  32. package/dist/metrics/report-generator.js +403 -0
  33. package/dist/metrics/report-generator.js.map +1 -0
  34. package/dist/utils/external-resource-validator.d.ts +102 -0
  35. package/dist/utils/external-resource-validator.d.ts.map +1 -0
  36. package/dist/utils/external-resource-validator.js +400 -0
  37. package/dist/utils/external-resource-validator.js.map +1 -0
  38. package/dist/utils/plugin-validator.d.ts +161 -0
  39. package/dist/utils/plugin-validator.d.ts.map +1 -0
  40. package/dist/utils/plugin-validator.js +565 -0
  41. package/dist/utils/plugin-validator.js.map +1 -0
  42. package/package.json +2 -1
  43. package/plugins/specweave/commands/specweave-do.md +47 -0
  44. package/plugins/specweave/commands/specweave-increment.md +82 -0
  45. package/plugins/specweave/commands/specweave-next.md +47 -0
  46. package/plugins/specweave/hooks/post-increment-planning.sh +117 -38
  47. package/plugins/specweave/hooks/pre-tool-use.sh +133 -0
  48. package/plugins/specweave/plugin.json +22 -0
  49. package/plugins/specweave/skills/SKILLS-INDEX.md +23 -2
  50. package/plugins/specweave/skills/plugin-installer/SKILL.md +340 -0
  51. package/plugins/specweave/skills/plugin-validator/SKILL.md +427 -0
  52. package/plugins/specweave-ado/.claude-plugin/plugin.json +2 -4
  53. package/plugins/specweave-ado/lib/ado-board-resolver.ts +328 -0
  54. package/plugins/specweave-ado/lib/ado-hierarchical-sync.ts +484 -0
  55. package/plugins/specweave-ado/plugin.json +20 -0
  56. package/plugins/specweave-alternatives/.claude-plugin/plugin.json +15 -2
  57. package/plugins/specweave-backend/.claude-plugin/plugin.json +15 -2
  58. package/plugins/specweave-cost-optimizer/.claude-plugin/plugin.json +14 -2
  59. package/plugins/specweave-diagrams/.claude-plugin/plugin.json +14 -2
  60. package/plugins/specweave-docs/.claude-plugin/plugin.json +13 -2
  61. package/plugins/specweave-figma/.claude-plugin/plugin.json +14 -2
  62. package/plugins/specweave-frontend/.claude-plugin/plugin.json +15 -2
  63. package/plugins/specweave-github/lib/github-board-resolver.ts +164 -0
  64. package/plugins/specweave-github/lib/github-hierarchical-sync.ts +344 -0
  65. package/plugins/specweave-github/plugin.json +19 -0
  66. package/plugins/specweave-infrastructure/.claude-plugin/plugin.json +15 -2
  67. package/plugins/specweave-jira/.claude-plugin/plugin.json +14 -2
  68. package/plugins/specweave-jira/lib/jira-board-resolver.ts +127 -0
  69. package/plugins/specweave-jira/lib/jira-hierarchical-sync.ts +283 -0
  70. package/plugins/specweave-jira/plugin.json +20 -0
  71. package/plugins/specweave-jira/skills/jira-resource-validator/SKILL.md +647 -0
  72. package/plugins/specweave-kubernetes/.claude-plugin/plugin.json +14 -2
  73. package/plugins/specweave-payments/.claude-plugin/plugin.json +14 -2
  74. package/plugins/specweave-testing/.claude-plugin/plugin.json +14 -2
  75. package/plugins/specweave-tooling/.claude-plugin/plugin.json +13 -2
@@ -0,0 +1,400 @@
1
+ /**
2
+ * External Resource Validator
3
+ *
4
+ * Validates and creates external resources (Jira projects, boards, etc.)
5
+ * Smart enough to:
6
+ * - Check if resources exist
7
+ * - Prompt user to select existing or create new
8
+ * - Create missing resources automatically
9
+ * - Update .env with actual IDs after creation
10
+ *
11
+ * @module utils/external-resource-validator
12
+ * @since 0.9.5
13
+ */
14
+ import fs from 'fs-extra';
15
+ import inquirer from 'inquirer';
16
+ import chalk from 'chalk';
17
+ import { exec } from 'child_process';
18
+ import { promisify } from 'util';
19
+ const execAsync = promisify(exec);
20
+ // ============================================================================
21
+ // Jira Resource Validator
22
+ // ============================================================================
23
+ export class JiraResourceValidator {
24
+ constructor(envPath = '.env') {
25
+ this.envPath = envPath;
26
+ // Load from .env
27
+ const env = this.loadEnv();
28
+ this.apiToken = env.JIRA_API_TOKEN || '';
29
+ this.email = env.JIRA_EMAIL || '';
30
+ this.domain = env.JIRA_DOMAIN || '';
31
+ }
32
+ /**
33
+ * Load .env file
34
+ */
35
+ loadEnv() {
36
+ try {
37
+ if (!fs.existsSync(this.envPath)) {
38
+ return {};
39
+ }
40
+ const content = fs.readFileSync(this.envPath, 'utf-8');
41
+ const env = {};
42
+ content.split('\n').forEach((line) => {
43
+ const match = line.match(/^([^=:#]+)=(.*)$/);
44
+ if (match) {
45
+ const key = match[1].trim();
46
+ const value = match[2].trim();
47
+ env[key] = value;
48
+ }
49
+ });
50
+ return env;
51
+ }
52
+ catch (error) {
53
+ return {};
54
+ }
55
+ }
56
+ /**
57
+ * Update .env file with new values
58
+ */
59
+ async updateEnv(updates) {
60
+ try {
61
+ let content = '';
62
+ if (fs.existsSync(this.envPath)) {
63
+ content = fs.readFileSync(this.envPath, 'utf-8');
64
+ }
65
+ // Update existing or append new
66
+ Object.entries(updates).forEach(([key, value]) => {
67
+ const regex = new RegExp(`^${key}=.*$`, 'm');
68
+ if (regex.test(content)) {
69
+ content = content.replace(regex, `${key}=${value}`);
70
+ }
71
+ else {
72
+ content += `\n${key}=${value}`;
73
+ }
74
+ });
75
+ fs.writeFileSync(this.envPath, content.trim() + '\n');
76
+ console.log(chalk.green(`✅ Updated ${this.envPath}`));
77
+ }
78
+ catch (error) {
79
+ console.error(chalk.red(`❌ Failed to update ${this.envPath}: ${error.message}`));
80
+ throw error;
81
+ }
82
+ }
83
+ /**
84
+ * Call Jira API
85
+ */
86
+ async callJiraApi(endpoint, method = 'GET', body) {
87
+ const url = `https://${this.domain}/rest/api/3/${endpoint}`;
88
+ const auth = Buffer.from(`${this.email}:${this.apiToken}`).toString('base64');
89
+ const curlCommand = `curl -s -X ${method} \
90
+ -H "Authorization: Basic ${auth}" \
91
+ -H "Content-Type: application/json" \
92
+ ${body ? `-d '${JSON.stringify(body)}'` : ''} \
93
+ "${url}"`;
94
+ try {
95
+ const { stdout } = await execAsync(curlCommand);
96
+ return JSON.parse(stdout);
97
+ }
98
+ catch (error) {
99
+ console.error(chalk.red(`Jira API error: ${error.message}`));
100
+ throw error;
101
+ }
102
+ }
103
+ /**
104
+ * Fetch all Jira projects
105
+ */
106
+ async fetchProjects() {
107
+ try {
108
+ const response = await this.callJiraApi('project');
109
+ return response.map((p) => ({
110
+ id: p.id,
111
+ key: p.key,
112
+ name: p.name,
113
+ }));
114
+ }
115
+ catch (error) {
116
+ return [];
117
+ }
118
+ }
119
+ /**
120
+ * Check if project exists
121
+ */
122
+ async checkProject(projectKey) {
123
+ try {
124
+ const project = await this.callJiraApi(`project/${projectKey}`);
125
+ return {
126
+ id: project.id,
127
+ key: project.key,
128
+ name: project.name,
129
+ };
130
+ }
131
+ catch (error) {
132
+ return null;
133
+ }
134
+ }
135
+ /**
136
+ * Create new Jira project
137
+ */
138
+ async createProject(projectKey, projectName) {
139
+ console.log(chalk.blue(`📦 Creating Jira project: ${projectKey} (${projectName})...`));
140
+ const body = {
141
+ key: projectKey,
142
+ name: projectName,
143
+ projectTypeKey: 'software',
144
+ leadAccountId: await this.getCurrentUserId(),
145
+ };
146
+ try {
147
+ const project = await this.callJiraApi('project', 'POST', body);
148
+ console.log(chalk.green(`✅ Project created: ${projectKey}`));
149
+ return {
150
+ id: project.id,
151
+ key: project.key,
152
+ name: project.name,
153
+ };
154
+ }
155
+ catch (error) {
156
+ console.error(chalk.red(`❌ Failed to create project: ${error.message}`));
157
+ throw error;
158
+ }
159
+ }
160
+ /**
161
+ * Get current user ID (for project lead)
162
+ */
163
+ async getCurrentUserId() {
164
+ try {
165
+ const user = await this.callJiraApi('myself');
166
+ return user.accountId;
167
+ }
168
+ catch (error) {
169
+ throw new Error('Failed to get current user ID');
170
+ }
171
+ }
172
+ /**
173
+ * Fetch all boards for a project
174
+ */
175
+ async fetchBoards(projectKey) {
176
+ try {
177
+ const response = await this.callJiraApi(`board?projectKeyOrId=${projectKey}`);
178
+ return response.values.map((b) => ({
179
+ id: b.id,
180
+ name: b.name,
181
+ type: b.type,
182
+ }));
183
+ }
184
+ catch (error) {
185
+ return [];
186
+ }
187
+ }
188
+ /**
189
+ * Check if board exists by ID
190
+ */
191
+ async checkBoard(boardId) {
192
+ try {
193
+ const board = await this.callJiraApi(`board/${boardId}`);
194
+ return {
195
+ id: board.id,
196
+ name: board.name,
197
+ type: board.type,
198
+ };
199
+ }
200
+ catch (error) {
201
+ return null;
202
+ }
203
+ }
204
+ /**
205
+ * Create new Jira board
206
+ */
207
+ async createBoard(boardName, projectKey) {
208
+ console.log(chalk.blue(`📦 Creating Jira board: ${boardName} in project ${projectKey}...`));
209
+ const body = {
210
+ name: boardName,
211
+ type: 'scrum',
212
+ filterId: await this.getOrCreateFilter(projectKey),
213
+ location: {
214
+ type: 'project',
215
+ projectKeyOrId: projectKey,
216
+ },
217
+ };
218
+ try {
219
+ const board = await this.callJiraApi('board', 'POST', body);
220
+ console.log(chalk.green(`✅ Board created: ${boardName} (ID: ${board.id})`));
221
+ return {
222
+ id: board.id,
223
+ name: board.name,
224
+ type: board.type,
225
+ };
226
+ }
227
+ catch (error) {
228
+ console.error(chalk.red(`❌ Failed to create board: ${error.message}`));
229
+ throw error;
230
+ }
231
+ }
232
+ /**
233
+ * Get or create filter for board
234
+ */
235
+ async getOrCreateFilter(projectKey) {
236
+ // For simplicity, create a basic filter
237
+ // In production, you might want to check for existing filters first
238
+ const body = {
239
+ name: `${projectKey} Issues`,
240
+ jql: `project = ${projectKey}`,
241
+ };
242
+ try {
243
+ const filter = await this.callJiraApi('filter', 'POST', body);
244
+ return filter.id;
245
+ }
246
+ catch (error) {
247
+ throw new Error(`Failed to create filter: ${error.message}`);
248
+ }
249
+ }
250
+ /**
251
+ * Validate and fix Jira configuration
252
+ */
253
+ async validate() {
254
+ console.log(chalk.blue('\n🔍 Validating Jira configuration...\n'));
255
+ const result = {
256
+ valid: true,
257
+ project: { exists: false },
258
+ boards: { valid: true, existing: [], missing: [], created: [] },
259
+ envUpdated: false,
260
+ };
261
+ const env = this.loadEnv();
262
+ const projectKey = env.JIRA_PROJECT;
263
+ const boardsConfig = env.JIRA_BOARDS || '';
264
+ // 1. Validate project
265
+ console.log(chalk.gray(`Checking project: ${projectKey}...`));
266
+ const project = await this.checkProject(projectKey);
267
+ if (!project) {
268
+ console.log(chalk.yellow(`⚠️ Project "${projectKey}" not found\n`));
269
+ // Fetch existing projects
270
+ const existingProjects = await this.fetchProjects();
271
+ // Prompt user
272
+ const { action } = await inquirer.prompt([
273
+ {
274
+ type: 'list',
275
+ name: 'action',
276
+ message: 'What would you like to do?',
277
+ choices: [
278
+ { name: 'Select an existing project', value: 'select' },
279
+ { name: 'Create a new project', value: 'create' },
280
+ { name: 'Cancel', value: 'cancel' },
281
+ ],
282
+ },
283
+ ]);
284
+ if (action === 'cancel') {
285
+ result.valid = false;
286
+ return result;
287
+ }
288
+ if (action === 'select') {
289
+ const { selectedProject } = await inquirer.prompt([
290
+ {
291
+ type: 'list',
292
+ name: 'selectedProject',
293
+ message: 'Select a project:',
294
+ choices: existingProjects.map((p) => ({
295
+ name: `${p.key} - ${p.name}`,
296
+ value: p.key,
297
+ })),
298
+ },
299
+ ]);
300
+ // Update .env
301
+ await this.updateEnv({ JIRA_PROJECT: selectedProject });
302
+ result.project = { exists: true, key: selectedProject };
303
+ result.envUpdated = true;
304
+ }
305
+ else if (action === 'create') {
306
+ const { projectName } = await inquirer.prompt([
307
+ {
308
+ type: 'input',
309
+ name: 'projectName',
310
+ message: 'Enter project name:',
311
+ default: projectKey,
312
+ },
313
+ ]);
314
+ const newProject = await this.createProject(projectKey, projectName);
315
+ result.project = {
316
+ exists: true,
317
+ key: newProject.key,
318
+ id: newProject.id,
319
+ name: newProject.name,
320
+ };
321
+ }
322
+ }
323
+ else {
324
+ console.log(chalk.green(`✅ Project "${projectKey}" exists\n`));
325
+ result.project = {
326
+ exists: true,
327
+ key: project.key,
328
+ id: project.id,
329
+ name: project.name,
330
+ };
331
+ }
332
+ // 2. Validate boards (smart per-board detection)
333
+ if (boardsConfig) {
334
+ console.log(chalk.gray(`Checking boards: ${boardsConfig}...`));
335
+ const boardEntries = boardsConfig.split(',').map((b) => b.trim());
336
+ const finalBoardIds = [];
337
+ for (const entry of boardEntries) {
338
+ const isNumeric = /^\d+$/.test(entry);
339
+ if (isNumeric) {
340
+ // Entry is a board ID - validate it exists
341
+ const boardId = parseInt(entry, 10);
342
+ const board = await this.checkBoard(boardId);
343
+ if (board) {
344
+ console.log(chalk.green(` ✅ Board ${boardId}: ${board.name} (exists)`));
345
+ result.boards.existing.push(board.id);
346
+ finalBoardIds.push(board.id);
347
+ }
348
+ else {
349
+ console.log(chalk.yellow(` ⚠️ Board ${boardId}: Not found`));
350
+ result.boards.missing.push(entry);
351
+ result.boards.valid = false;
352
+ }
353
+ }
354
+ else {
355
+ // Entry is a board name - create it
356
+ console.log(chalk.blue(` 📦 Creating board: ${entry}...`));
357
+ try {
358
+ const board = await this.createBoard(entry, projectKey);
359
+ console.log(chalk.green(` ✅ Created: ${entry} (ID: ${board.id})`));
360
+ result.boards.created.push({ name: entry, id: board.id });
361
+ finalBoardIds.push(board.id);
362
+ }
363
+ catch (error) {
364
+ console.log(chalk.red(` ❌ Failed to create ${entry}: ${error.message}`));
365
+ result.boards.missing.push(entry);
366
+ result.boards.valid = false;
367
+ }
368
+ }
369
+ }
370
+ // Update .env if any boards were created
371
+ if (result.boards.created.length > 0) {
372
+ console.log(chalk.blue('\n📝 Updating .env with board IDs...'));
373
+ await this.updateEnv({ JIRA_BOARDS: finalBoardIds.join(',') });
374
+ result.boards.existing = finalBoardIds;
375
+ result.envUpdated = true;
376
+ console.log(chalk.green(`✅ Updated JIRA_BOARDS: ${finalBoardIds.join(',')}`));
377
+ }
378
+ // Summary
379
+ console.log();
380
+ if (result.boards.missing.length > 0) {
381
+ console.log(chalk.yellow(`⚠️ Issues found: ${result.boards.missing.length} board(s)\n`));
382
+ }
383
+ else {
384
+ console.log(chalk.green(`✅ All boards validated/created successfully\n`));
385
+ }
386
+ }
387
+ return result;
388
+ }
389
+ }
390
+ // ============================================================================
391
+ // Utility Functions
392
+ // ============================================================================
393
+ /**
394
+ * Validate Jira resources
395
+ */
396
+ export async function validateJiraResources(envPath = '.env') {
397
+ const validator = new JiraResourceValidator(envPath);
398
+ return validator.validate();
399
+ }
400
+ //# sourceMappingURL=external-resource-validator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"external-resource-validator.js","sourceRoot":"","sources":["../../src/utils/external-resource-validator.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,161 @@
1
+ /**
2
+ * Plugin Validation System
3
+ *
4
+ * Proactively validates SpecWeave plugin installation before workflow commands.
5
+ * Ensures marketplace is registered, core plugin is installed, and context-specific
6
+ * plugins are available.
7
+ *
8
+ * @module plugin-validator
9
+ * @since 0.9.4
10
+ */
11
+ /**
12
+ * Result of plugin installation attempt
13
+ */
14
+ export interface InstallResult {
15
+ success: boolean;
16
+ component: string;
17
+ error?: string;
18
+ details?: string;
19
+ }
20
+ /**
21
+ * Options for plugin validation
22
+ */
23
+ export interface ValidationOptions {
24
+ /** Auto-install missing components (default: false) */
25
+ autoInstall?: boolean;
26
+ /** Increment description for context-aware plugin detection */
27
+ context?: string;
28
+ /** Show what would be installed without installing (default: false) */
29
+ dryRun?: boolean;
30
+ /** Show detailed validation steps (default: false) */
31
+ verbose?: boolean;
32
+ }
33
+ /**
34
+ * Result of plugin validation
35
+ */
36
+ export interface ValidationResult {
37
+ /** True if all required components are installed */
38
+ valid: boolean;
39
+ /** Timestamp of validation */
40
+ timestamp: number;
41
+ /** Missing components */
42
+ missing: {
43
+ marketplace: boolean;
44
+ corePlugin: boolean;
45
+ contextPlugins: string[];
46
+ };
47
+ /** Installed components */
48
+ installed: {
49
+ corePlugin: boolean;
50
+ corePluginVersion?: string;
51
+ contextPlugins: string[];
52
+ };
53
+ /** Recommendations for user */
54
+ recommendations: string[];
55
+ /** Errors encountered during validation */
56
+ errors: string[];
57
+ /** Cache information */
58
+ cache?: {
59
+ hit: boolean;
60
+ age: number;
61
+ };
62
+ }
63
+ /**
64
+ * Plugin keyword mappings
65
+ * Maps plugin names to keywords that should trigger their suggestion
66
+ * Scoring: 2+ keyword matches = high confidence (plugin suggested)
67
+ */
68
+ export declare const PLUGIN_KEYWORDS: Record<string, string[]>;
69
+ /**
70
+ * Plugin Validator
71
+ *
72
+ * Validates SpecWeave plugin installation and provides auto-installation
73
+ * capabilities. Uses caching to minimize validation overhead.
74
+ */
75
+ export declare class PluginValidator {
76
+ private cacheFile;
77
+ private verbose;
78
+ constructor();
79
+ /**
80
+ * Main validation entry point
81
+ *
82
+ * @param options - Validation options
83
+ * @returns Validation result with missing/installed components
84
+ */
85
+ validate(options?: ValidationOptions): Promise<ValidationResult>;
86
+ /**
87
+ * Check if SpecWeave marketplace is registered
88
+ *
89
+ * @returns True if marketplace is registered correctly
90
+ */
91
+ checkMarketplace(): Promise<boolean>;
92
+ /**
93
+ * Check if core plugin (specweave) is installed
94
+ *
95
+ * @returns Plugin installation info
96
+ */
97
+ checkCorePlugin(): Promise<{
98
+ installed: boolean;
99
+ version?: string;
100
+ }>;
101
+ /**
102
+ * Check if a specific plugin is installed
103
+ *
104
+ * @param pluginName - Name of plugin to check
105
+ * @returns Plugin installation info
106
+ */
107
+ checkPlugin(pluginName: string): Promise<{
108
+ installed: boolean;
109
+ version?: string;
110
+ }>;
111
+ /**
112
+ * Detect required plugins based on keywords in description
113
+ *
114
+ * @param description - Increment description or context
115
+ * @returns List of required plugin names
116
+ */
117
+ detectRequiredPlugins(description: string): string[];
118
+ /**
119
+ * Install SpecWeave marketplace
120
+ *
121
+ * @returns Installation result
122
+ */
123
+ installMarketplace(): Promise<InstallResult>;
124
+ /**
125
+ * Install a plugin
126
+ *
127
+ * @param pluginName - Name of plugin to install
128
+ * @returns Installation result
129
+ */
130
+ installPlugin(pluginName: string): Promise<InstallResult>;
131
+ /**
132
+ * Get cached validation result
133
+ *
134
+ * @returns Cached result if valid, null otherwise
135
+ */
136
+ private getCachedValidation;
137
+ /**
138
+ * Set cached validation result
139
+ *
140
+ * @param result - Validation result to cache
141
+ */
142
+ private setCachedValidation;
143
+ /**
144
+ * Log message if verbose mode enabled
145
+ */
146
+ private log;
147
+ }
148
+ /**
149
+ * Validate plugins (convenience function)
150
+ *
151
+ * @param options - Validation options
152
+ * @returns Validation result
153
+ */
154
+ export declare function validatePlugins(options?: ValidationOptions): Promise<ValidationResult>;
155
+ /**
156
+ * Check if SpecWeave is properly installed
157
+ *
158
+ * @returns True if marketplace and core plugin are installed
159
+ */
160
+ export declare function isSpecWeaveInstalled(): Promise<boolean>;
161
+ //# sourceMappingURL=plugin-validator.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"plugin-validator.d.ts","sourceRoot":"","sources":["../../src/utils/plugin-validator.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAcH;;GAEG;AACH,MAAM,WAAW,aAAa;IAC5B,OAAO,EAAE,OAAO,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED;;GAEG;AACH,MAAM,WAAW,iBAAiB;IAChC,uDAAuD;IACvD,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,+DAA+D;IAC/D,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,uEAAuE;IACvE,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,sDAAsD;IACtD,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAED;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC/B,oDAAoD;IACpD,KAAK,EAAE,OAAO,CAAC;IACf,8BAA8B;IAC9B,SAAS,EAAE,MAAM,CAAC;IAClB,yBAAyB;IACzB,OAAO,EAAE;QACP,WAAW,EAAE,OAAO,CAAC;QACrB,UAAU,EAAE,OAAO,CAAC;QACpB,cAAc,EAAE,MAAM,EAAE,CAAC;KAC1B,CAAC;IACF,2BAA2B;IAC3B,SAAS,EAAE;QACT,UAAU,EAAE,OAAO,CAAC;QACpB,iBAAiB,CAAC,EAAE,MAAM,CAAC;QAC3B,cAAc,EAAE,MAAM,EAAE,CAAC;KAC1B,CAAC;IACF,+BAA+B;IAC/B,eAAe,EAAE,MAAM,EAAE,CAAC;IAC1B,2CAA2C;IAC3C,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,wBAAwB;IACxB,KAAK,CAAC,EAAE;QACN,GAAG,EAAE,OAAO,CAAC;QACb,GAAG,EAAE,MAAM,CAAC;KACb,CAAC;CACH;AAgCD;;;;GAIG;AACH,eAAO,MAAM,eAAe,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,CA6HpD,CAAC;AAqBF;;;;;GAKG;AACH,qBAAa,eAAe;IAC1B,OAAO,CAAC,SAAS,CAAS;IAC1B,OAAO,CAAC,OAAO,CAAkB;;IAUjC;;;;;OAKG;IACG,QAAQ,CAAC,OAAO,GAAE,iBAAsB,GAAG,OAAO,CAAC,gBAAgB,CAAC;IA0I1E;;;;OAIG;IACG,gBAAgB,IAAI,OAAO,CAAC,OAAO,CAAC;IA4C1C;;;;OAIG;IACG,eAAe,IAAI,OAAO,CAAC;QAC/B,SAAS,EAAE,OAAO,CAAC;QACnB,OAAO,CAAC,EAAE,MAAM,CAAC;KAClB,CAAC;IAIF;;;;;OAKG;IACG,WAAW,CACf,UAAU,EAAE,MAAM,GACjB,OAAO,CAAC;QAAE,SAAS,EAAE,OAAO,CAAC;QAAC,OAAO,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IAsCpD;;;;;OAKG;IACH,qBAAqB,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM,EAAE;IAoBpD;;;;OAIG;IACG,kBAAkB,IAAI,OAAO,CAAC,aAAa,CAAC;IAqClD;;;;;OAKG;IACG,aAAa,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,CAAC;IA6C/D;;;;OAIG;YACW,mBAAmB;IAsBjC;;;;OAIG;YACW,mBAAmB;IAmBjC;;OAEG;IACH,OAAO,CAAC,GAAG;CAKZ;AAMD;;;;;GAKG;AACH,wBAAsB,eAAe,CACnC,OAAO,GAAE,iBAAsB,GAC9B,OAAO,CAAC,gBAAgB,CAAC,CAG3B;AAED;;;;GAIG;AACH,wBAAsB,oBAAoB,IAAI,OAAO,CAAC,OAAO,CAAC,CAI7D"}