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.
- package/CLAUDE.md +153 -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/init.d.ts.map +1 -1
- package/dist/cli/commands/init.js +29 -1
- package/dist/cli/commands/init.js.map +1 -1
- 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 +400 -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/SKILLS-INDEX.md +23 -2
- package/plugins/specweave/skills/plugin-installer/SKILL.md +340 -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 +647 -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
|
@@ -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"}
|