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
package/bin/specweave.js
CHANGED
|
@@ -131,6 +131,33 @@ program
|
|
|
131
131
|
await qaCommand(incrementId, options);
|
|
132
132
|
});
|
|
133
133
|
|
|
134
|
+
// Validate plugins command - Plugin validation
|
|
135
|
+
program
|
|
136
|
+
.command('validate-plugins')
|
|
137
|
+
.description('Validate SpecWeave plugin installation')
|
|
138
|
+
.option('--auto-install', 'Auto-install missing components', false)
|
|
139
|
+
.option('--context <description>', 'Increment description for context detection')
|
|
140
|
+
.option('--dry-run', 'Show what would be installed without installing', false)
|
|
141
|
+
.option('-v, --verbose', 'Show detailed validation steps', false)
|
|
142
|
+
.action(async (options) => {
|
|
143
|
+
const { setupValidatePluginsCommand } = await import('../dist/cli/commands/validate-plugins.js');
|
|
144
|
+
// Create a temporary program for this command
|
|
145
|
+
const tempProgram = new Command();
|
|
146
|
+
setupValidatePluginsCommand(tempProgram);
|
|
147
|
+
// Execute the action directly
|
|
148
|
+
await import('../dist/cli/commands/validate-plugins.js').then(m => m.runValidation(options));
|
|
149
|
+
});
|
|
150
|
+
|
|
151
|
+
// Validate Jira command - Jira resource validation
|
|
152
|
+
program
|
|
153
|
+
.command('validate-jira')
|
|
154
|
+
.description('Validate Jira configuration and create missing resources')
|
|
155
|
+
.option('--env <path>', 'Path to .env file', '.env')
|
|
156
|
+
.action(async (options) => {
|
|
157
|
+
const { runJiraValidation } = await import('../dist/cli/commands/validate-jira.js');
|
|
158
|
+
await runJiraValidation(options);
|
|
159
|
+
});
|
|
160
|
+
|
|
134
161
|
// Help text
|
|
135
162
|
program.on('--help', () => {
|
|
136
163
|
console.log('');
|
|
@@ -150,6 +177,11 @@ program.on('--help', () => {
|
|
|
150
177
|
console.log(' $ specweave qa 0008 # Quick quality check');
|
|
151
178
|
console.log(' $ specweave qa 0008 --pre # Pre-implementation check');
|
|
152
179
|
console.log(' $ specweave qa 0008 --gate --export # Quality gate + export to tasks');
|
|
180
|
+
console.log(' $ specweave validate-plugins # Validate plugin installation');
|
|
181
|
+
console.log(' $ specweave validate-plugins --auto-install # Auto-install missing plugins');
|
|
182
|
+
console.log(' $ specweave validate-plugins --dry-run # Preview what would be installed');
|
|
183
|
+
console.log(' $ specweave validate-jira # Validate Jira configuration');
|
|
184
|
+
console.log(' $ specweave validate-jira --env .env.prod # Validate with custom .env file');
|
|
153
185
|
console.log('');
|
|
154
186
|
console.log('Supported AI Tools:');
|
|
155
187
|
console.log(' - Claude Code (full automation) - Native skills, agents, hooks');
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* CLI Command: validate-jira
|
|
3
|
+
*
|
|
4
|
+
* Validates Jira configuration and creates missing resources
|
|
5
|
+
*
|
|
6
|
+
* Usage:
|
|
7
|
+
* specweave validate-jira [options]
|
|
8
|
+
*
|
|
9
|
+
* Options:
|
|
10
|
+
* --env <path> Path to .env file (default: .env)
|
|
11
|
+
* -h, --help Display help for command
|
|
12
|
+
*
|
|
13
|
+
* @module cli/commands/validate-jira
|
|
14
|
+
* @since 0.9.5
|
|
15
|
+
*/
|
|
16
|
+
import { Command } from 'commander';
|
|
17
|
+
/**
|
|
18
|
+
* Setup validate-jira command
|
|
19
|
+
*
|
|
20
|
+
* @param program - Commander program instance
|
|
21
|
+
*/
|
|
22
|
+
export declare function setupValidateJiraCommand(program: Command): void;
|
|
23
|
+
/**
|
|
24
|
+
* Run Jira validation
|
|
25
|
+
*
|
|
26
|
+
* @param options - Command options
|
|
27
|
+
*/
|
|
28
|
+
declare function runJiraValidation(options: {
|
|
29
|
+
env: string;
|
|
30
|
+
}): Promise<void>;
|
|
31
|
+
/**
|
|
32
|
+
* Export for programmatic use
|
|
33
|
+
*/
|
|
34
|
+
export { runJiraValidation };
|
|
35
|
+
//# sourceMappingURL=validate-jira.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validate-jira.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/validate-jira.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAKpC;;;;GAIG;AACH,wBAAgB,wBAAwB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAQ/D;AAED;;;;GAIG;AACH,iBAAe,iBAAiB,CAAC,OAAO,EAAE;IAAE,GAAG,EAAE,MAAM,CAAA;CAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAqBxE;AAgED;;GAEG;AACH,OAAO,EAAE,iBAAiB,EAAE,CAAC"}
|
|
@@ -0,0 +1,112 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* CLI Command: validate-jira
|
|
3
|
+
*
|
|
4
|
+
* Validates Jira configuration and creates missing resources
|
|
5
|
+
*
|
|
6
|
+
* Usage:
|
|
7
|
+
* specweave validate-jira [options]
|
|
8
|
+
*
|
|
9
|
+
* Options:
|
|
10
|
+
* --env <path> Path to .env file (default: .env)
|
|
11
|
+
* -h, --help Display help for command
|
|
12
|
+
*
|
|
13
|
+
* @module cli/commands/validate-jira
|
|
14
|
+
* @since 0.9.5
|
|
15
|
+
*/
|
|
16
|
+
import chalk from 'chalk';
|
|
17
|
+
import ora from 'ora';
|
|
18
|
+
import { validateJiraResources } from '../../utils/external-resource-validator.js';
|
|
19
|
+
/**
|
|
20
|
+
* Setup validate-jira command
|
|
21
|
+
*
|
|
22
|
+
* @param program - Commander program instance
|
|
23
|
+
*/
|
|
24
|
+
export function setupValidateJiraCommand(program) {
|
|
25
|
+
program
|
|
26
|
+
.command('validate-jira')
|
|
27
|
+
.description('Validate Jira configuration and create missing resources')
|
|
28
|
+
.option('--env <path>', 'Path to .env file', '.env')
|
|
29
|
+
.action(async (options) => {
|
|
30
|
+
await runJiraValidation(options);
|
|
31
|
+
});
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* Run Jira validation
|
|
35
|
+
*
|
|
36
|
+
* @param options - Command options
|
|
37
|
+
*/
|
|
38
|
+
async function runJiraValidation(options) {
|
|
39
|
+
const spinner = ora('Validating Jira configuration...').start();
|
|
40
|
+
try {
|
|
41
|
+
spinner.stop();
|
|
42
|
+
const result = await validateJiraResources(options.env);
|
|
43
|
+
// Display results
|
|
44
|
+
if (result.valid) {
|
|
45
|
+
displaySuccess(result);
|
|
46
|
+
process.exit(0);
|
|
47
|
+
}
|
|
48
|
+
else {
|
|
49
|
+
displayFailure(result);
|
|
50
|
+
process.exit(1);
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
catch (error) {
|
|
54
|
+
spinner.stop();
|
|
55
|
+
console.error(chalk.red(`\n❌ Validation error: ${error.message}`));
|
|
56
|
+
process.exit(1);
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
/**
|
|
60
|
+
* Display success message
|
|
61
|
+
*/
|
|
62
|
+
function displaySuccess(result) {
|
|
63
|
+
console.log(chalk.green('\n✅ Jira configuration validated!\n'));
|
|
64
|
+
// Show project info
|
|
65
|
+
if (result.project.exists) {
|
|
66
|
+
console.log(chalk.gray('Project:'));
|
|
67
|
+
console.log(chalk.white(` • ${result.project.key} - ${result.project.name}`));
|
|
68
|
+
console.log(chalk.dim(` ID: ${result.project.id}\n`));
|
|
69
|
+
}
|
|
70
|
+
// Show boards info
|
|
71
|
+
if (result.boards.existing.length > 0) {
|
|
72
|
+
console.log(chalk.gray('Boards:'));
|
|
73
|
+
result.boards.existing.forEach((id) => {
|
|
74
|
+
console.log(chalk.white(` • Board ID: ${id}`));
|
|
75
|
+
});
|
|
76
|
+
console.log();
|
|
77
|
+
}
|
|
78
|
+
// Show created boards
|
|
79
|
+
if (result.boards.created.length > 0) {
|
|
80
|
+
console.log(chalk.green('Created boards:'));
|
|
81
|
+
result.boards.created.forEach((board) => {
|
|
82
|
+
console.log(chalk.green(` ✅ ${board.name} (ID: ${board.id})`));
|
|
83
|
+
});
|
|
84
|
+
console.log();
|
|
85
|
+
}
|
|
86
|
+
// Show env update
|
|
87
|
+
if (result.envUpdated) {
|
|
88
|
+
console.log(chalk.cyan('📝 .env file updated with actual IDs\n'));
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
/**
|
|
92
|
+
* Display failure message
|
|
93
|
+
*/
|
|
94
|
+
function displayFailure(result) {
|
|
95
|
+
console.log(chalk.red('\n❌ Jira validation failed\n'));
|
|
96
|
+
// Show project issues
|
|
97
|
+
if (!result.project.exists) {
|
|
98
|
+
console.log(chalk.yellow('Project:'));
|
|
99
|
+
console.log(chalk.yellow(' • Project not found or not created\n'));
|
|
100
|
+
}
|
|
101
|
+
// Show board issues
|
|
102
|
+
if (!result.boards.valid && result.boards.missing.length > 0) {
|
|
103
|
+
console.log(chalk.yellow('Boards:'));
|
|
104
|
+
console.log(chalk.yellow(` • Missing boards: ${result.boards.missing.join(', ')}\n`));
|
|
105
|
+
}
|
|
106
|
+
console.log(chalk.cyan('💡 Run again to retry validation and fix configuration\n'));
|
|
107
|
+
}
|
|
108
|
+
/**
|
|
109
|
+
* Export for programmatic use
|
|
110
|
+
*/
|
|
111
|
+
export { runJiraValidation };
|
|
112
|
+
//# sourceMappingURL=validate-jira.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validate-jira.js","sourceRoot":"","sources":["../../../src/cli/commands/validate-jira.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* CLI Command: validate-plugins
|
|
3
|
+
*
|
|
4
|
+
* Validates SpecWeave plugin installation and optionally installs missing components.
|
|
5
|
+
*
|
|
6
|
+
* Usage:
|
|
7
|
+
* specweave validate-plugins [options]
|
|
8
|
+
*
|
|
9
|
+
* Options:
|
|
10
|
+
* --auto-install Auto-install missing components
|
|
11
|
+
* --context <description> Increment description for context detection
|
|
12
|
+
* --dry-run Show what would be installed without installing
|
|
13
|
+
* --verbose Show detailed validation steps
|
|
14
|
+
* -h, --help Display help for command
|
|
15
|
+
*
|
|
16
|
+
* @module cli/commands/validate-plugins
|
|
17
|
+
* @since 0.9.4
|
|
18
|
+
*/
|
|
19
|
+
import { Command } from 'commander';
|
|
20
|
+
/**
|
|
21
|
+
* Setup validate-plugins command
|
|
22
|
+
*
|
|
23
|
+
* @param program - Commander program instance
|
|
24
|
+
*/
|
|
25
|
+
export declare function setupValidatePluginsCommand(program: Command): void;
|
|
26
|
+
/**
|
|
27
|
+
* Run validation
|
|
28
|
+
*
|
|
29
|
+
* @param options - Command options
|
|
30
|
+
*/
|
|
31
|
+
declare function runValidation(options: {
|
|
32
|
+
autoInstall: boolean;
|
|
33
|
+
context?: string;
|
|
34
|
+
dryRun: boolean;
|
|
35
|
+
verbose: boolean;
|
|
36
|
+
}): Promise<void>;
|
|
37
|
+
/**
|
|
38
|
+
* Export for programmatic use
|
|
39
|
+
*/
|
|
40
|
+
export { runValidation };
|
|
41
|
+
//# sourceMappingURL=validate-plugins.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validate-plugins.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/validate-plugins.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AASpC;;;;GAIG;AACH,wBAAgB,2BAA2B,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAkBlE;AAED;;;;GAIG;AACH,iBAAe,aAAa,CAAC,OAAO,EAAE;IACpC,WAAW,EAAE,OAAO,CAAC;IACrB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,OAAO,CAAC;IAChB,OAAO,EAAE,OAAO,CAAC;CAClB,GAAG,OAAO,CAAC,IAAI,CAAC,CAkChB;AAiJD;;GAEG;AACH,OAAO,EAAE,aAAa,EAAE,CAAC"}
|
|
@@ -0,0 +1,171 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* CLI Command: validate-plugins
|
|
3
|
+
*
|
|
4
|
+
* Validates SpecWeave plugin installation and optionally installs missing components.
|
|
5
|
+
*
|
|
6
|
+
* Usage:
|
|
7
|
+
* specweave validate-plugins [options]
|
|
8
|
+
*
|
|
9
|
+
* Options:
|
|
10
|
+
* --auto-install Auto-install missing components
|
|
11
|
+
* --context <description> Increment description for context detection
|
|
12
|
+
* --dry-run Show what would be installed without installing
|
|
13
|
+
* --verbose Show detailed validation steps
|
|
14
|
+
* -h, --help Display help for command
|
|
15
|
+
*
|
|
16
|
+
* @module cli/commands/validate-plugins
|
|
17
|
+
* @since 0.9.4
|
|
18
|
+
*/
|
|
19
|
+
import chalk from 'chalk';
|
|
20
|
+
import ora from 'ora';
|
|
21
|
+
import { PluginValidator, } from '../../utils/plugin-validator.js';
|
|
22
|
+
/**
|
|
23
|
+
* Setup validate-plugins command
|
|
24
|
+
*
|
|
25
|
+
* @param program - Commander program instance
|
|
26
|
+
*/
|
|
27
|
+
export function setupValidatePluginsCommand(program) {
|
|
28
|
+
program
|
|
29
|
+
.command('validate-plugins')
|
|
30
|
+
.description('Validate SpecWeave plugin installation')
|
|
31
|
+
.option('--auto-install', 'Auto-install missing components', false)
|
|
32
|
+
.option('--context <description>', 'Increment description for context detection')
|
|
33
|
+
.option('--dry-run', 'Show what would be installed without installing', false)
|
|
34
|
+
.option('--verbose', 'Show detailed validation steps', false)
|
|
35
|
+
.action(async (options) => {
|
|
36
|
+
await runValidation(options);
|
|
37
|
+
});
|
|
38
|
+
}
|
|
39
|
+
/**
|
|
40
|
+
* Run validation
|
|
41
|
+
*
|
|
42
|
+
* @param options - Command options
|
|
43
|
+
*/
|
|
44
|
+
async function runValidation(options) {
|
|
45
|
+
const spinner = ora('Validating SpecWeave environment...').start();
|
|
46
|
+
try {
|
|
47
|
+
const validator = new PluginValidator();
|
|
48
|
+
const validationOptions = {
|
|
49
|
+
autoInstall: options.autoInstall,
|
|
50
|
+
context: options.context,
|
|
51
|
+
dryRun: options.dryRun,
|
|
52
|
+
verbose: options.verbose,
|
|
53
|
+
};
|
|
54
|
+
const result = await validator.validate(validationOptions);
|
|
55
|
+
spinner.stop();
|
|
56
|
+
// Display results
|
|
57
|
+
if (result.valid) {
|
|
58
|
+
displaySuccess(result);
|
|
59
|
+
process.exit(0);
|
|
60
|
+
}
|
|
61
|
+
else {
|
|
62
|
+
displayFailure(result, options);
|
|
63
|
+
process.exit(1);
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
catch (error) {
|
|
67
|
+
spinner.stop();
|
|
68
|
+
console.error(chalk.red(`\n❌ Validation error: ${error.message}`));
|
|
69
|
+
// Show manual instructions
|
|
70
|
+
showManualInstructions();
|
|
71
|
+
process.exit(1);
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
/**
|
|
75
|
+
* Display success message
|
|
76
|
+
*
|
|
77
|
+
* @param result - Validation result
|
|
78
|
+
*/
|
|
79
|
+
function displaySuccess(result) {
|
|
80
|
+
console.log(chalk.green('\n✅ All plugins validated!'));
|
|
81
|
+
// Show installed components
|
|
82
|
+
if (result.installed.corePlugin) {
|
|
83
|
+
const version = result.installed.corePluginVersion
|
|
84
|
+
? ` (v${result.installed.corePluginVersion})`
|
|
85
|
+
: '';
|
|
86
|
+
console.log(chalk.gray(` • Core plugin: installed${version}`));
|
|
87
|
+
}
|
|
88
|
+
if (result.installed.contextPlugins.length > 0) {
|
|
89
|
+
console.log(chalk.gray(` • Context plugins: ${result.installed.contextPlugins.join(', ')}`));
|
|
90
|
+
}
|
|
91
|
+
// Show cache info
|
|
92
|
+
if (result.cache?.hit) {
|
|
93
|
+
console.log(chalk.gray(` • Cache: hit (age: ${Math.round(result.cache.age)}s)`));
|
|
94
|
+
}
|
|
95
|
+
console.log(); // Empty line
|
|
96
|
+
}
|
|
97
|
+
/**
|
|
98
|
+
* Display failure message
|
|
99
|
+
*
|
|
100
|
+
* @param result - Validation result
|
|
101
|
+
* @param options - Command options
|
|
102
|
+
*/
|
|
103
|
+
function displayFailure(result, options) {
|
|
104
|
+
console.log(chalk.red('\n❌ Missing components detected:'));
|
|
105
|
+
// Show missing components
|
|
106
|
+
if (result.missing.marketplace) {
|
|
107
|
+
console.log(chalk.yellow(' • SpecWeave marketplace not registered'));
|
|
108
|
+
}
|
|
109
|
+
if (result.missing.corePlugin) {
|
|
110
|
+
console.log(chalk.yellow(' • Core plugin (specweave) not installed'));
|
|
111
|
+
}
|
|
112
|
+
if (result.missing.contextPlugins.length > 0) {
|
|
113
|
+
console.log(chalk.yellow(` • Context plugins: ${result.missing.contextPlugins.join(', ')}`));
|
|
114
|
+
}
|
|
115
|
+
// Show errors if any
|
|
116
|
+
if (result.errors.length > 0) {
|
|
117
|
+
console.log(chalk.red('\n🚨 Errors encountered:'));
|
|
118
|
+
result.errors.forEach((error) => {
|
|
119
|
+
console.log(chalk.red(` • ${error}`));
|
|
120
|
+
});
|
|
121
|
+
}
|
|
122
|
+
// Show recommendations
|
|
123
|
+
if (result.recommendations.length > 0) {
|
|
124
|
+
console.log(chalk.cyan('\n📦 Recommendations:'));
|
|
125
|
+
result.recommendations.forEach((rec) => {
|
|
126
|
+
console.log(chalk.gray(` ${rec}`));
|
|
127
|
+
});
|
|
128
|
+
}
|
|
129
|
+
// Show dry-run note
|
|
130
|
+
if (options.dryRun) {
|
|
131
|
+
console.log(chalk.cyan('\n💡 Dry-run mode: No changes made. Remove --dry-run to install.'));
|
|
132
|
+
}
|
|
133
|
+
// Show auto-install suggestion
|
|
134
|
+
if (!options.autoInstall && !options.dryRun) {
|
|
135
|
+
console.log(chalk.cyan('\n💡 Tip: Use --auto-install flag to automatically install missing components'));
|
|
136
|
+
}
|
|
137
|
+
console.log(); // Empty line
|
|
138
|
+
}
|
|
139
|
+
/**
|
|
140
|
+
* Show manual installation instructions
|
|
141
|
+
*/
|
|
142
|
+
function showManualInstructions() {
|
|
143
|
+
console.log(chalk.cyan('\n📖 Manual Installation Instructions:'));
|
|
144
|
+
console.log();
|
|
145
|
+
console.log(chalk.gray('1. Register SpecWeave marketplace:'));
|
|
146
|
+
console.log(chalk.gray(' Edit ~/.claude/settings.json and add:'));
|
|
147
|
+
console.log(chalk.gray(` {
|
|
148
|
+
"extraKnownMarketplaces": {
|
|
149
|
+
"specweave": {
|
|
150
|
+
"source": {
|
|
151
|
+
"source": "github",
|
|
152
|
+
"repo": "anton-abyzov/specweave",
|
|
153
|
+
"path": ".claude-plugin"
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
}`));
|
|
158
|
+
console.log();
|
|
159
|
+
console.log(chalk.gray('2. Install core plugin:'));
|
|
160
|
+
console.log(chalk.gray(' Run: /plugin install specweave'));
|
|
161
|
+
console.log();
|
|
162
|
+
console.log(chalk.gray('3. Restart Claude Code'));
|
|
163
|
+
console.log();
|
|
164
|
+
console.log(chalk.gray('4. Re-run: specweave validate-plugins'));
|
|
165
|
+
console.log();
|
|
166
|
+
}
|
|
167
|
+
/**
|
|
168
|
+
* Export for programmatic use
|
|
169
|
+
*/
|
|
170
|
+
export { runValidation };
|
|
171
|
+
//# sourceMappingURL=validate-plugins.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validate-plugins.js","sourceRoot":"","sources":["../../../src/cli/commands/validate-plugins.ts"],"names":[],"mappings":"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"}
|