specweave 0.23.18 → 0.24.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-plugin/marketplace.json +93 -49
- package/CLAUDE.md +137 -4
- package/dist/src/cli/helpers/ado-area-path-mapper.d.ts +89 -0
- package/dist/src/cli/helpers/ado-area-path-mapper.d.ts.map +1 -0
- package/dist/src/cli/helpers/ado-area-path-mapper.js +213 -0
- package/dist/src/cli/helpers/ado-area-path-mapper.js.map +1 -0
- package/dist/src/cli/helpers/issue-tracker/ado-auto-discover.d.ts +29 -0
- package/dist/src/cli/helpers/issue-tracker/ado-auto-discover.d.ts.map +1 -0
- package/dist/src/cli/helpers/issue-tracker/ado-auto-discover.js +109 -0
- package/dist/src/cli/helpers/issue-tracker/ado-auto-discover.js.map +1 -0
- package/dist/src/cli/helpers/issue-tracker/ado.d.ts +1 -0
- package/dist/src/cli/helpers/issue-tracker/ado.d.ts.map +1 -1
- package/dist/src/cli/helpers/issue-tracker/ado.js +2 -0
- package/dist/src/cli/helpers/issue-tracker/ado.js.map +1 -1
- package/dist/src/cli/helpers/smart-filter.d.ts +83 -0
- package/dist/src/cli/helpers/smart-filter.d.ts.map +1 -0
- package/dist/src/cli/helpers/smart-filter.js +265 -0
- package/dist/src/cli/helpers/smart-filter.js.map +1 -0
- package/dist/src/core/qa/quality-gate-decider.d.ts +1 -1
- package/dist/src/core/qa/quality-gate-decider.js +2 -2
- package/dist/src/core/qa/quality-gate-decider.js.map +1 -1
- package/dist/src/core/qa/risk-calculator.d.ts +2 -2
- package/dist/src/core/qa/risk-calculator.js +2 -2
- package/dist/src/core/validators/ac-presence-validator.d.ts +56 -0
- package/dist/src/core/validators/ac-presence-validator.d.ts.map +1 -0
- package/dist/src/core/validators/ac-presence-validator.js +149 -0
- package/dist/src/core/validators/ac-presence-validator.js.map +1 -0
- package/dist/src/integrations/ado/area-path-mapper.d.ts +137 -0
- package/dist/src/integrations/ado/area-path-mapper.d.ts.map +1 -0
- package/dist/src/integrations/ado/area-path-mapper.js +267 -0
- package/dist/src/integrations/ado/area-path-mapper.js.map +1 -0
- package/dist/src/integrations/jira/filter-processor.d.ts +126 -0
- package/dist/src/integrations/jira/filter-processor.d.ts.map +1 -0
- package/dist/src/integrations/jira/filter-processor.js +207 -0
- package/dist/src/integrations/jira/filter-processor.js.map +1 -0
- package/dist/src/integrations/jira/jira-client.d.ts +13 -0
- package/dist/src/integrations/jira/jira-client.d.ts.map +1 -1
- package/dist/src/integrations/jira/jira-client.js +33 -0
- package/dist/src/integrations/jira/jira-client.js.map +1 -1
- package/dist/src/utils/ac-embedder.d.ts +63 -0
- package/dist/src/utils/ac-embedder.d.ts.map +1 -0
- package/dist/src/utils/ac-embedder.js +217 -0
- package/dist/src/utils/ac-embedder.js.map +1 -0
- package/dist/src/utils/env-manager.d.ts +86 -0
- package/dist/src/utils/env-manager.d.ts.map +1 -0
- package/dist/src/utils/env-manager.js +188 -0
- package/dist/src/utils/env-manager.js.map +1 -0
- package/package.json +1 -1
- package/plugins/specweave/.claude-plugin/plugin.json +1 -1
- package/plugins/specweave/agents/AGENTS-INDEX.md +1 -1
- package/plugins/specweave/agents/increment-quality-judge-v2/AGENT.md +9 -9
- package/plugins/specweave/commands/specweave-do.md +37 -0
- package/plugins/specweave/commands/specweave-done.md +159 -0
- package/plugins/specweave/commands/specweave-embed-acs.md +446 -0
- package/plugins/specweave/commands/specweave-next.md +148 -3
- package/plugins/specweave/commands/specweave-qa.md +2 -2
- package/plugins/specweave/hooks/pre-increment-start.sh +168 -0
- package/plugins/specweave/skills/SKILLS-INDEX.md +1 -1
- package/plugins/specweave-ado/.claude-plugin/plugin.json +1 -1
- package/plugins/specweave-ado/commands/specweave-ado-import-projects.md +331 -0
- package/plugins/specweave-alternatives/.claude-plugin/plugin.json +10 -0
- package/plugins/specweave-alternatives/commands/alternatives-analyze.md +336 -0
- package/plugins/specweave-alternatives/skills/architecture-alternatives/SKILL.md +651 -0
- package/plugins/specweave-alternatives/skills/bmad-method/SKILL.md +420 -0
- package/plugins/specweave-alternatives/skills/spec-kit-expert/SKILL.md +487 -0
- package/plugins/specweave-backend/commands/api-scaffold.md +80 -0
- package/plugins/specweave-backend/commands/crud-generate.md +109 -0
- package/plugins/specweave-backend/commands/migration-generate.md +139 -0
- package/plugins/specweave-confluent/commands/connector-deploy.md +154 -0
- package/plugins/specweave-confluent/commands/ksqldb-query.md +179 -0
- package/plugins/specweave-confluent/commands/schema-register.md +123 -0
- package/plugins/specweave-core/.claude-plugin/plugin.json +21 -0
- package/plugins/specweave-core/commands/architecture-review.md +288 -0
- package/plugins/specweave-core/commands/code-review.md +213 -0
- package/plugins/specweave-core/commands/refactor-plan.md +249 -0
- package/plugins/specweave-core/skills/code-quality/SKILL.md +157 -0
- package/plugins/specweave-core/skills/design-patterns/SKILL.md +244 -0
- package/plugins/specweave-core/skills/software-architecture/SKILL.md +83 -0
- package/plugins/specweave-cost-optimizer/.claude-plugin/plugin.json +22 -0
- package/plugins/specweave-cost-optimizer/commands/cost-analyze.md +360 -0
- package/plugins/specweave-cost-optimizer/commands/cost-optimize.md +480 -0
- package/plugins/specweave-cost-optimizer/skills/aws-cost-expert/SKILL.md +416 -0
- package/plugins/specweave-cost-optimizer/skills/cloud-pricing/SKILL.md +325 -0
- package/plugins/specweave-cost-optimizer/skills/cost-optimization/SKILL.md +337 -0
- package/plugins/specweave-diagrams/.claude-plugin/plugin.json +1 -1
- package/plugins/specweave-diagrams/commands/diagrams-generate.md +168 -0
- package/plugins/specweave-docs/.claude-plugin/plugin.json +10 -0
- package/plugins/specweave-docs/commands/docs-generate.md +441 -0
- package/plugins/specweave-docs/commands/docs-init.md +334 -0
- package/plugins/specweave-docs/skills/docusaurus/SKILL.md +581 -0
- package/plugins/specweave-docs/skills/spec-driven-brainstorming/SKILL.md +689 -0
- package/plugins/specweave-docs/skills/technical-writing/SKILL.md +1039 -0
- package/plugins/specweave-docs-preview/.claude-plugin/plugin.json +1 -1
- package/plugins/specweave-figma/.claude-plugin/plugin.json +23 -0
- package/plugins/specweave-figma/commands/figma-import.md +690 -0
- package/plugins/specweave-figma/commands/figma-to-react.md +834 -0
- package/plugins/specweave-figma/commands/figma-tokens.md +815 -0
- package/plugins/specweave-frontend/.claude-plugin/plugin.json +21 -0
- package/plugins/specweave-frontend/agents/frontend-architect/AGENT.md +387 -0
- package/plugins/specweave-frontend/agents/frontend-architect/README.md +385 -0
- package/plugins/specweave-frontend/agents/frontend-architect/examples.md +590 -0
- package/plugins/specweave-frontend/agents/frontend-architect/templates/component-template.tsx +152 -0
- package/plugins/specweave-frontend/agents/frontend-architect/templates/hook-template.ts +311 -0
- package/plugins/specweave-frontend/agents/frontend-architect/templates/page-template.tsx +228 -0
- package/plugins/specweave-frontend/commands/component-generate.md +510 -0
- package/plugins/specweave-frontend/commands/design-system-init.md +494 -0
- package/plugins/specweave-frontend/commands/frontend-scaffold.md +207 -0
- package/plugins/specweave-frontend/commands/nextjs-setup.md +396 -0
- package/plugins/specweave-frontend/skills/design-system-architect/SKILL.md +278 -0
- package/plugins/specweave-frontend/skills/frontend/SKILL.md +420 -0
- package/plugins/specweave-frontend/skills/nextjs/SKILL.md +546 -0
- package/plugins/specweave-github/.claude-plugin/plugin.json +1 -1
- package/plugins/specweave-github/hooks/.specweave/logs/hooks-debug.log +194 -0
- package/plugins/specweave-infrastructure/.claude-plugin/plugin.json +1 -1
- package/plugins/specweave-jira/.claude-plugin/plugin.json +1 -1
- package/plugins/specweave-jira/commands/import-projects.js +183 -0
- package/plugins/specweave-jira/commands/import-projects.md +97 -0
- package/plugins/specweave-jira/commands/import-projects.ts +288 -0
- package/plugins/specweave-jira/commands/specweave-jira-import-projects.md +298 -0
- package/plugins/specweave-kafka/.claude-plugin/plugin.json +1 -1
- package/plugins/specweave-kafka-streams/.claude-plugin/plugin.json +1 -1
- package/plugins/specweave-kubernetes/commands/cluster-setup.md +262 -0
- package/plugins/specweave-kubernetes/commands/deployment-generate.md +242 -0
- package/plugins/specweave-kubernetes/commands/helm-scaffold.md +333 -0
- package/plugins/specweave-ml/.claude-plugin/plugin.json +1 -1
- package/plugins/specweave-mobile/commands/app-scaffold.md +233 -0
- package/plugins/specweave-mobile/commands/build-config.md +256 -0
- package/plugins/specweave-mobile/commands/screen-generate.md +289 -0
- package/plugins/specweave-n8n/.claude-plugin/plugin.json +1 -1
- package/plugins/specweave-plugin-dev/.claude-plugin/plugin.json +13 -12
- package/plugins/specweave-plugin-dev/commands/plugin-create.md +333 -0
- package/plugins/specweave-plugin-dev/commands/plugin-publish.md +339 -0
- package/plugins/specweave-plugin-dev/commands/plugin-test.md +293 -0
- package/plugins/specweave-plugin-dev/skills/claude-sdk/SKILL.md +162 -0
- package/plugins/specweave-plugin-dev/skills/marketplace-publishing/SKILL.md +263 -0
- package/plugins/specweave-plugin-dev/skills/plugin-development/SKILL.md +316 -0
- package/plugins/specweave-release/.claude-plugin/plugin.json +1 -1
- package/plugins/specweave-release/commands/specweave-release-npm.md +110 -0
- package/plugins/specweave-release/hooks/.specweave/logs/dora-tracking.log +168 -0
- package/plugins/specweave-testing/.claude-plugin/plugin.json +21 -0
- package/plugins/specweave-testing/agents/qa-engineer/AGENT.md +797 -0
- package/plugins/specweave-testing/agents/qa-engineer/README.md +443 -0
- package/plugins/specweave-testing/agents/qa-engineer/templates/playwright-e2e-test.ts +470 -0
- package/plugins/specweave-testing/agents/qa-engineer/templates/test-data-factory.ts +507 -0
- package/plugins/specweave-testing/agents/qa-engineer/templates/vitest-unit-test.ts +400 -0
- package/plugins/specweave-testing/agents/qa-engineer/test-strategies.md +726 -0
- package/plugins/specweave-testing/commands/e2e-setup.md +1081 -0
- package/plugins/specweave-testing/commands/test-coverage.md +979 -0
- package/plugins/specweave-testing/commands/test-generate.md +1156 -0
- package/plugins/specweave-testing/commands/test-init.md +409 -0
- package/plugins/specweave-testing/skills/e2e-playwright/SKILL.md +769 -0
- package/plugins/specweave-testing/skills/tdd-expert/SKILL.md +934 -0
- package/plugins/specweave-testing/skills/unit-testing-expert/SKILL.md +1011 -0
- package/plugins/specweave-tooling/.claude-plugin/plugin.json +22 -0
- package/plugins/specweave-tooling/commands/specweave-tooling-skill-create.md +691 -0
- package/plugins/specweave-tooling/commands/specweave-tooling-skill-package.md +751 -0
- package/plugins/specweave-tooling/commands/specweave-tooling-skill-validate.md +858 -0
- package/plugins/specweave-ui/.claude-plugin/plugin.json +10 -0
- package/plugins/specweave-ui/commands/ui-automate.md +199 -0
- package/plugins/specweave-ui/commands/ui-inspect.md +70 -0
- package/plugins/specweave-ui/skills/browser-automation/SKILL.md +314 -0
- package/plugins/specweave-ui/skills/ui-testing/SKILL.md +716 -0
- package/plugins/specweave-ui/skills/visual-regression/SKILL.md +728 -0
- package/plugins/specweave/commands/check-hooks.md +0 -257
- package/plugins/specweave/commands/specweave-archive-increments.md +0 -82
- package/plugins/specweave-plugin-dev/skills/plugin-expert/SKILL.md +0 -1231
- /package/plugins/specweave/{agents/code-reviewer.md → skills/code-reviewer/SKILL.md} +0 -0
|
@@ -0,0 +1,265 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Smart Filter Module
|
|
3
|
+
*
|
|
4
|
+
* Provides intelligent filtering for project imports with JQL/WIQL support,
|
|
5
|
+
* preview mode, and dry-run capabilities.
|
|
6
|
+
*
|
|
7
|
+
* @module cli/helpers/smart-filter
|
|
8
|
+
*/
|
|
9
|
+
import chalk from 'chalk';
|
|
10
|
+
import inquirer from 'inquirer';
|
|
11
|
+
/**
|
|
12
|
+
* Validate JQL query syntax (JIRA)
|
|
13
|
+
*
|
|
14
|
+
* Basic validation:
|
|
15
|
+
* - Check for common JQL keywords (project, type, status, etc.)
|
|
16
|
+
* - Check for balanced parentheses
|
|
17
|
+
* - Check for valid operators (=, !=, IN, NOT IN, etc.)
|
|
18
|
+
*
|
|
19
|
+
* @param jql - JQL query string
|
|
20
|
+
* @returns Validation result with error message if invalid
|
|
21
|
+
*/
|
|
22
|
+
export function validateJQL(jql) {
|
|
23
|
+
if (!jql || jql.trim().length === 0) {
|
|
24
|
+
return { valid: false, error: 'JQL query cannot be empty' };
|
|
25
|
+
}
|
|
26
|
+
// Check balanced parentheses
|
|
27
|
+
const openCount = (jql.match(/\(/g) || []).length;
|
|
28
|
+
const closeCount = (jql.match(/\)/g) || []).length;
|
|
29
|
+
if (openCount !== closeCount) {
|
|
30
|
+
return { valid: false, error: 'Unbalanced parentheses in JQL query' };
|
|
31
|
+
}
|
|
32
|
+
// Check for valid JQL keywords
|
|
33
|
+
const validKeywords = [
|
|
34
|
+
'project', 'type', 'status', 'priority', 'assignee', 'reporter',
|
|
35
|
+
'created', 'updated', 'resolved', 'labels', 'component', 'fixVersion',
|
|
36
|
+
'affectsVersion', 'sprint', 'epic', 'parent', 'key'
|
|
37
|
+
];
|
|
38
|
+
const hasValidKeyword = validKeywords.some(keyword => jql.toLowerCase().includes(keyword.toLowerCase()));
|
|
39
|
+
if (!hasValidKeyword) {
|
|
40
|
+
return {
|
|
41
|
+
valid: false,
|
|
42
|
+
error: 'JQL query must include at least one valid field (project, type, status, etc.)'
|
|
43
|
+
};
|
|
44
|
+
}
|
|
45
|
+
// Check for valid operators
|
|
46
|
+
const validOperators = ['=', '!=', 'IN', 'NOT IN', '~', '!~', '>', '<', '>=', '<=', 'IS', 'IS NOT'];
|
|
47
|
+
const hasValidOperator = validOperators.some(op => jql.includes(op));
|
|
48
|
+
if (!hasValidOperator) {
|
|
49
|
+
return {
|
|
50
|
+
valid: false,
|
|
51
|
+
error: 'JQL query must include at least one valid operator (=, IN, etc.)'
|
|
52
|
+
};
|
|
53
|
+
}
|
|
54
|
+
return { valid: true };
|
|
55
|
+
}
|
|
56
|
+
/**
|
|
57
|
+
* Validate WIQL query syntax (Azure DevOps)
|
|
58
|
+
*
|
|
59
|
+
* Basic validation for WIQL (Work Item Query Language)
|
|
60
|
+
*
|
|
61
|
+
* @param wiql - WIQL query string
|
|
62
|
+
* @returns Validation result with error message if invalid
|
|
63
|
+
*/
|
|
64
|
+
export function validateWIQL(wiql) {
|
|
65
|
+
if (!wiql || wiql.trim().length === 0) {
|
|
66
|
+
return { valid: false, error: 'WIQL query cannot be empty' };
|
|
67
|
+
}
|
|
68
|
+
// WIQL must start with SELECT
|
|
69
|
+
if (!wiql.trim().toUpperCase().startsWith('SELECT')) {
|
|
70
|
+
return {
|
|
71
|
+
valid: false,
|
|
72
|
+
error: 'WIQL query must start with SELECT'
|
|
73
|
+
};
|
|
74
|
+
}
|
|
75
|
+
// WIQL must contain FROM
|
|
76
|
+
if (!wiql.toUpperCase().includes('FROM')) {
|
|
77
|
+
return {
|
|
78
|
+
valid: false,
|
|
79
|
+
error: 'WIQL query must include FROM clause'
|
|
80
|
+
};
|
|
81
|
+
}
|
|
82
|
+
return { valid: true };
|
|
83
|
+
}
|
|
84
|
+
/**
|
|
85
|
+
* Prompt user for filter criteria
|
|
86
|
+
*
|
|
87
|
+
* Interactive prompts for:
|
|
88
|
+
* - Filter type (JQL/WIQL, project keys, or none)
|
|
89
|
+
* - Exclude archived projects
|
|
90
|
+
* - Exclude deleted projects
|
|
91
|
+
* - Only active projects
|
|
92
|
+
*
|
|
93
|
+
* @param provider - Filter provider (jira or ado)
|
|
94
|
+
* @returns Filter criteria
|
|
95
|
+
*/
|
|
96
|
+
export async function promptFilterCriteria(provider) {
|
|
97
|
+
console.log(chalk.cyan(`\n🔍 ${provider.toUpperCase()} Filter Configuration\n`));
|
|
98
|
+
const criteria = { provider };
|
|
99
|
+
// Step 1: Filter type
|
|
100
|
+
const filterType = await inquirer.prompt([
|
|
101
|
+
{
|
|
102
|
+
type: 'list',
|
|
103
|
+
name: 'type',
|
|
104
|
+
message: 'How would you like to filter projects?',
|
|
105
|
+
default: 'none',
|
|
106
|
+
choices: [
|
|
107
|
+
{
|
|
108
|
+
name: chalk.green('No filter') + chalk.gray(' - Import all projects'),
|
|
109
|
+
value: 'none'
|
|
110
|
+
},
|
|
111
|
+
{
|
|
112
|
+
name: `Custom ${provider === 'jira' ? 'JQL' : 'WIQL'} query` + chalk.gray(' - Advanced filtering'),
|
|
113
|
+
value: 'query'
|
|
114
|
+
},
|
|
115
|
+
{
|
|
116
|
+
name: 'Specific project keys' + chalk.gray(' - Manual selection'),
|
|
117
|
+
value: 'keys'
|
|
118
|
+
}
|
|
119
|
+
]
|
|
120
|
+
}
|
|
121
|
+
]);
|
|
122
|
+
if (filterType.type === 'query') {
|
|
123
|
+
// Custom query
|
|
124
|
+
const queryAnswer = await inquirer.prompt([
|
|
125
|
+
{
|
|
126
|
+
type: 'input',
|
|
127
|
+
name: 'query',
|
|
128
|
+
message: `Enter ${provider === 'jira' ? 'JQL' : 'WIQL'} query:`,
|
|
129
|
+
validate: (input) => {
|
|
130
|
+
const validation = provider === 'jira'
|
|
131
|
+
? validateJQL(input)
|
|
132
|
+
: validateWIQL(input);
|
|
133
|
+
return validation.valid || chalk.red(validation.error || 'Invalid query');
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
]);
|
|
137
|
+
criteria.query = queryAnswer.query;
|
|
138
|
+
}
|
|
139
|
+
else if (filterType.type === 'keys') {
|
|
140
|
+
// Specific project keys
|
|
141
|
+
const keysAnswer = await inquirer.prompt([
|
|
142
|
+
{
|
|
143
|
+
type: 'input',
|
|
144
|
+
name: 'keys',
|
|
145
|
+
message: 'Enter project keys (comma-separated):',
|
|
146
|
+
validate: (input) => {
|
|
147
|
+
const trimmed = input.trim();
|
|
148
|
+
if (!trimmed) {
|
|
149
|
+
return chalk.red('Project keys cannot be empty');
|
|
150
|
+
}
|
|
151
|
+
const keys = trimmed.split(',').map(k => k.trim()).filter(k => k.length > 0);
|
|
152
|
+
if (keys.length === 0) {
|
|
153
|
+
return chalk.red('At least one project key required');
|
|
154
|
+
}
|
|
155
|
+
return true;
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
]);
|
|
159
|
+
criteria.projectKeys = keysAnswer.keys.split(',').map(k => k.trim()).filter(k => k.length > 0);
|
|
160
|
+
}
|
|
161
|
+
// Step 2: Additional filters
|
|
162
|
+
const additionalFilters = await inquirer.prompt([
|
|
163
|
+
{
|
|
164
|
+
type: 'confirm',
|
|
165
|
+
name: 'excludeArchived',
|
|
166
|
+
message: 'Exclude archived projects?',
|
|
167
|
+
default: true
|
|
168
|
+
},
|
|
169
|
+
{
|
|
170
|
+
type: 'confirm',
|
|
171
|
+
name: 'excludeDeleted',
|
|
172
|
+
message: 'Exclude deleted projects?',
|
|
173
|
+
default: true
|
|
174
|
+
},
|
|
175
|
+
{
|
|
176
|
+
type: 'confirm',
|
|
177
|
+
name: 'onlyActive',
|
|
178
|
+
message: 'Only import active projects?',
|
|
179
|
+
default: false
|
|
180
|
+
}
|
|
181
|
+
]);
|
|
182
|
+
criteria.excludeArchived = additionalFilters.excludeArchived;
|
|
183
|
+
criteria.excludeDeleted = additionalFilters.excludeDeleted;
|
|
184
|
+
criteria.onlyActive = additionalFilters.onlyActive;
|
|
185
|
+
return criteria;
|
|
186
|
+
}
|
|
187
|
+
/**
|
|
188
|
+
* Apply filters to project list
|
|
189
|
+
*
|
|
190
|
+
* @param projects - List of projects to filter
|
|
191
|
+
* @param criteria - Filter criteria
|
|
192
|
+
* @returns Filtered project list
|
|
193
|
+
*/
|
|
194
|
+
export function applyFilters(projects, criteria) {
|
|
195
|
+
const total = projects.length;
|
|
196
|
+
let filtered = projects;
|
|
197
|
+
// Filter by project keys
|
|
198
|
+
if (criteria.projectKeys && criteria.projectKeys.length > 0) {
|
|
199
|
+
filtered = filtered.filter(p => criteria.projectKeys.includes(p.key) || criteria.projectKeys.includes(p.name));
|
|
200
|
+
}
|
|
201
|
+
// Exclude archived
|
|
202
|
+
if (criteria.excludeArchived) {
|
|
203
|
+
filtered = filtered.filter(p => !p.archived && p.archived !== true);
|
|
204
|
+
}
|
|
205
|
+
// Exclude deleted
|
|
206
|
+
if (criteria.excludeDeleted) {
|
|
207
|
+
filtered = filtered.filter(p => !p.deleted && p.deleted !== true);
|
|
208
|
+
}
|
|
209
|
+
// Only active
|
|
210
|
+
if (criteria.onlyActive) {
|
|
211
|
+
filtered = filtered.filter(p => p.status === 'active' || p.state === 'active');
|
|
212
|
+
}
|
|
213
|
+
return {
|
|
214
|
+
total,
|
|
215
|
+
filtered: filtered.length,
|
|
216
|
+
excluded: total - filtered.length,
|
|
217
|
+
items: filtered,
|
|
218
|
+
criteria
|
|
219
|
+
};
|
|
220
|
+
}
|
|
221
|
+
/**
|
|
222
|
+
* Preview filter results
|
|
223
|
+
*
|
|
224
|
+
* Shows summary of what would be imported with current filter criteria.
|
|
225
|
+
*
|
|
226
|
+
* @param result - Filter result
|
|
227
|
+
* @returns User confirmation to proceed
|
|
228
|
+
*/
|
|
229
|
+
export async function previewFilterResults(result) {
|
|
230
|
+
console.log(chalk.cyan('\n📊 Filter Preview\n'));
|
|
231
|
+
console.log(chalk.white(`Total projects: ${result.total}`));
|
|
232
|
+
console.log(chalk.green(`Filtered (import): ${result.filtered}`));
|
|
233
|
+
console.log(chalk.gray(`Excluded: ${result.excluded}`));
|
|
234
|
+
if (result.criteria.query) {
|
|
235
|
+
console.log(chalk.gray(`\nQuery: ${result.criteria.query}`));
|
|
236
|
+
}
|
|
237
|
+
if (result.criteria.projectKeys && result.criteria.projectKeys.length > 0) {
|
|
238
|
+
console.log(chalk.gray(`\nProject keys: ${result.criteria.projectKeys.join(', ')}`));
|
|
239
|
+
}
|
|
240
|
+
console.log(chalk.gray(`\nFilters applied:`));
|
|
241
|
+
console.log(chalk.gray(` - Exclude archived: ${result.criteria.excludeArchived ? 'Yes' : 'No'}`));
|
|
242
|
+
console.log(chalk.gray(` - Exclude deleted: ${result.criteria.excludeDeleted ? 'Yes' : 'No'}`));
|
|
243
|
+
console.log(chalk.gray(` - Only active: ${result.criteria.onlyActive ? 'Yes' : 'No'}`));
|
|
244
|
+
// Show sample projects (first 5)
|
|
245
|
+
if (result.items.length > 0) {
|
|
246
|
+
console.log(chalk.cyan('\n📋 Sample projects to import (first 5):\n'));
|
|
247
|
+
result.items.slice(0, 5).forEach((p, i) => {
|
|
248
|
+
console.log(chalk.gray(` ${i + 1}. ${p.key || p.name} - ${p.name}`));
|
|
249
|
+
});
|
|
250
|
+
if (result.items.length > 5) {
|
|
251
|
+
console.log(chalk.gray(` ... and ${result.items.length - 5} more\n`));
|
|
252
|
+
}
|
|
253
|
+
}
|
|
254
|
+
// Confirmation
|
|
255
|
+
const answer = await inquirer.prompt([
|
|
256
|
+
{
|
|
257
|
+
type: 'confirm',
|
|
258
|
+
name: 'proceed',
|
|
259
|
+
message: 'Proceed with import?',
|
|
260
|
+
default: true
|
|
261
|
+
}
|
|
262
|
+
]);
|
|
263
|
+
return answer.proceed;
|
|
264
|
+
}
|
|
265
|
+
//# sourceMappingURL=smart-filter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"smart-filter.js","sourceRoot":"","sources":["../../../../src/cli/helpers/smart-filter.ts"],"names":[],"mappings":"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"}
|
|
@@ -6,7 +6,7 @@
|
|
|
6
6
|
*/
|
|
7
7
|
import { QualityAssessment, QualityGateResult, QualityGateDecision, QualityGateThresholds, TestCoverageResult, SecurityAuditResult } from './types.js';
|
|
8
8
|
/**
|
|
9
|
-
* Default quality gate thresholds (
|
|
9
|
+
* Default quality gate thresholds (Probability × Impact scoring)
|
|
10
10
|
*/
|
|
11
11
|
export declare const DEFAULT_THRESHOLDS: QualityGateThresholds;
|
|
12
12
|
export declare class QualityGateDecider {
|
|
@@ -5,7 +5,7 @@
|
|
|
5
5
|
* @since v0.8.0
|
|
6
6
|
*/
|
|
7
7
|
/**
|
|
8
|
-
* Default quality gate thresholds (
|
|
8
|
+
* Default quality gate thresholds (Probability × Impact scoring)
|
|
9
9
|
*/
|
|
10
10
|
export const DEFAULT_THRESHOLDS = {
|
|
11
11
|
fail: {
|
|
@@ -37,7 +37,7 @@ export class QualityGateDecider {
|
|
|
37
37
|
const blockers = [];
|
|
38
38
|
const concerns = [];
|
|
39
39
|
const recommendations = [];
|
|
40
|
-
// Check 1: Risk Assessment (
|
|
40
|
+
// Check 1: Risk Assessment (Probability × Impact)
|
|
41
41
|
if (assessment.risk_assessment) {
|
|
42
42
|
this.assessRisks(assessment.risk_assessment, blockers, concerns);
|
|
43
43
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"quality-gate-decider.js","sourceRoot":"","sources":["../../../../src/core/qa/quality-gate-decider.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAYH;;GAEG;AACH,MAAM,CAAC,MAAM,kBAAkB,GAA0B;IACvD,IAAI,EAAE;QACJ,SAAS,EAAE,GAAG,EAAgB,qBAAqB;QACnD,YAAY,EAAE,EAAE,EAAc,wBAAwB;QACtD,WAAW,EAAE,EAAE,EAAe,yBAAyB;QACvD,uBAAuB,EAAE,CAAC,EAAI,6BAA6B;KAC5D;IACD,QAAQ,EAAE;QACR,SAAS,EAAE,GAAG,EAAgB,yBAAyB;QACvD,YAAY,EAAE,EAAE,EAAc,4BAA4B;QAC1D,WAAW,EAAE,EAAE,EAAe,6BAA6B;QAC3D,mBAAmB,EAAE,CAAC,EAAQ,6BAA6B;KAC5D;CACF,CAAC;AAEF,MAAM,OAAO,kBAAkB;IAG7B,YAAY,aAAoC,kBAAkB;QAChE,IAAI,CAAC,UAAU,GAAG,UAAU,CAAC;IAC/B,CAAC;IAED;;;;;;;OAOG;IACH,MAAM,CACJ,UAA6B,EAC7B,YAAiC,EACjC,aAAmC;QAEnC,MAAM,QAAQ,GAAuB,EAAE,CAAC;QACxC,MAAM,QAAQ,GAAuB,EAAE,CAAC;QACxC,MAAM,eAAe,GAAuB,EAAE,CAAC;QAE/C,
|
|
1
|
+
{"version":3,"file":"quality-gate-decider.js","sourceRoot":"","sources":["../../../../src/core/qa/quality-gate-decider.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Risk Calculator using
|
|
2
|
+
* Risk Calculator using Probability × Impact scoring method
|
|
3
3
|
*
|
|
4
4
|
* @module qa/risk-calculator
|
|
5
5
|
* @since v0.8.0
|
|
@@ -7,7 +7,7 @@
|
|
|
7
7
|
import { Risk, RiskAssessmentResult, RiskCategory, RiskSeverity } from './types.js';
|
|
8
8
|
export declare class RiskCalculator {
|
|
9
9
|
/**
|
|
10
|
-
* Calculate risk score using
|
|
10
|
+
* Calculate risk score using quantitative formula: P × I
|
|
11
11
|
*
|
|
12
12
|
* @param probability - Probability of risk occurring (0.0-1.0)
|
|
13
13
|
* @param impact - Impact severity if risk occurs (1-10)
|
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Risk Calculator using
|
|
2
|
+
* Risk Calculator using Probability × Impact scoring method
|
|
3
3
|
*
|
|
4
4
|
* @module qa/risk-calculator
|
|
5
5
|
* @since v0.8.0
|
|
6
6
|
*/
|
|
7
7
|
export class RiskCalculator {
|
|
8
8
|
/**
|
|
9
|
-
* Calculate risk score using
|
|
9
|
+
* Calculate risk score using quantitative formula: P × I
|
|
10
10
|
*
|
|
11
11
|
* @param probability - Probability of risk occurring (0.0-1.0)
|
|
12
12
|
* @param impact - Impact severity if risk occurs (1-10)
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
import { Logger } from '../../utils/logger.js';
|
|
2
|
+
/**
|
|
3
|
+
* AC Presence Validator
|
|
4
|
+
*
|
|
5
|
+
* Validates that spec.md contains inline Acceptance Criteria.
|
|
6
|
+
*
|
|
7
|
+
* **Critical Rule**: spec.md MUST contain ACs even when using `structure: user-stories`
|
|
8
|
+
* with external living docs. This is required for AC sync hooks to function.
|
|
9
|
+
*
|
|
10
|
+
* **Validation Gates**:
|
|
11
|
+
* 1. `/specweave:increment` (after spec generation) - BLOCKS if ACs missing
|
|
12
|
+
* 2. `/specweave:do` (before starting work) - BLOCKS if ACs missing
|
|
13
|
+
* 3. `/specweave:validate` (rule-based validation) - WARNS if ACs missing
|
|
14
|
+
* 4. Pre-commit hook (git) - WARNS if ACs missing in new specs
|
|
15
|
+
*
|
|
16
|
+
* **See**: ADR-0062 (AC Embedding Architecture)
|
|
17
|
+
*/
|
|
18
|
+
export interface ACPresenceValidationResult {
|
|
19
|
+
valid: boolean;
|
|
20
|
+
acCount: number;
|
|
21
|
+
expectedCount: number;
|
|
22
|
+
errors: string[];
|
|
23
|
+
warnings: string[];
|
|
24
|
+
/**
|
|
25
|
+
* Suggested fix (e.g., "Run /specweave:embed-acs 0050")
|
|
26
|
+
*/
|
|
27
|
+
suggestedFix?: string;
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* Validate AC presence in increment spec.md
|
|
31
|
+
*
|
|
32
|
+
* **Checks**:
|
|
33
|
+
* 1. spec.md exists
|
|
34
|
+
* 2. spec.md contains "## Acceptance Criteria" section
|
|
35
|
+
* 3. AC count matches metadata.json (if metadata exists)
|
|
36
|
+
* 4. All ACs follow proper format: `- [ ] **AC-US1-01**: Title`
|
|
37
|
+
*
|
|
38
|
+
* @param incrementPath - Path to increment directory
|
|
39
|
+
* @param options - Validation options
|
|
40
|
+
* @returns Validation result
|
|
41
|
+
*/
|
|
42
|
+
export declare function validateACPresence(incrementPath: string, options?: {
|
|
43
|
+
logger?: Logger;
|
|
44
|
+
strict?: boolean;
|
|
45
|
+
}): ACPresenceValidationResult;
|
|
46
|
+
/**
|
|
47
|
+
* Format validation result as human-readable message
|
|
48
|
+
*/
|
|
49
|
+
export declare function formatValidationResult(result: ACPresenceValidationResult): string;
|
|
50
|
+
/**
|
|
51
|
+
* Validate AC presence and throw if validation fails
|
|
52
|
+
*
|
|
53
|
+
* Use this in critical paths (e.g., before starting increment)
|
|
54
|
+
*/
|
|
55
|
+
export declare function validateACPresenceStrict(incrementPath: string, logger?: Logger): void;
|
|
56
|
+
//# sourceMappingURL=ac-presence-validator.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ac-presence-validator.d.ts","sourceRoot":"","sources":["../../../../src/core/validators/ac-presence-validator.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,MAAM,EAAiB,MAAM,uBAAuB,CAAC;AAE9D;;;;;;;;;;;;;;;GAeG;AAEH,MAAM,WAAW,0BAA0B;IACzC,KAAK,EAAE,OAAO,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;IAChB,aAAa,EAAE,MAAM,CAAC;IACtB,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB;;OAEG;IACH,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED;;;;;;;;;;;;GAYG;AACH,wBAAgB,kBAAkB,CAChC,aAAa,EAAE,MAAM,EACrB,OAAO,GAAE;IAAE,MAAM,CAAC,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,OAAO,CAAA;CAAO,GAClD,0BAA0B,CAmG5B;AAED;;GAEG;AACH,wBAAgB,sBAAsB,CAAC,MAAM,EAAE,0BAA0B,GAAG,MAAM,CAkCjF;AAED;;;;GAIG;AACH,wBAAgB,wBAAwB,CACtC,aAAa,EAAE,MAAM,EACrB,MAAM,GAAE,MAAsB,GAC7B,IAAI,CAUN"}
|
|
@@ -0,0 +1,149 @@
|
|
|
1
|
+
import { readFileSync, existsSync } from 'fs';
|
|
2
|
+
import { join } from 'path';
|
|
3
|
+
import { consoleLogger } from '../../utils/logger.js';
|
|
4
|
+
/**
|
|
5
|
+
* Validate AC presence in increment spec.md
|
|
6
|
+
*
|
|
7
|
+
* **Checks**:
|
|
8
|
+
* 1. spec.md exists
|
|
9
|
+
* 2. spec.md contains "## Acceptance Criteria" section
|
|
10
|
+
* 3. AC count matches metadata.json (if metadata exists)
|
|
11
|
+
* 4. All ACs follow proper format: `- [ ] **AC-US1-01**: Title`
|
|
12
|
+
*
|
|
13
|
+
* @param incrementPath - Path to increment directory
|
|
14
|
+
* @param options - Validation options
|
|
15
|
+
* @returns Validation result
|
|
16
|
+
*/
|
|
17
|
+
export function validateACPresence(incrementPath, options = {}) {
|
|
18
|
+
const logger = options.logger ?? consoleLogger;
|
|
19
|
+
const strict = options.strict ?? true;
|
|
20
|
+
const result = {
|
|
21
|
+
valid: true,
|
|
22
|
+
acCount: 0,
|
|
23
|
+
expectedCount: 0,
|
|
24
|
+
errors: [],
|
|
25
|
+
warnings: [],
|
|
26
|
+
};
|
|
27
|
+
// 1. Check spec.md exists
|
|
28
|
+
const specPath = join(incrementPath, 'spec.md');
|
|
29
|
+
if (!existsSync(specPath)) {
|
|
30
|
+
result.valid = false;
|
|
31
|
+
result.errors.push(`spec.md not found: ${specPath}`);
|
|
32
|
+
return result;
|
|
33
|
+
}
|
|
34
|
+
const specContent = readFileSync(specPath, 'utf-8');
|
|
35
|
+
// 2. Check for "## Acceptance Criteria" section
|
|
36
|
+
if (!specContent.includes('## Acceptance Criteria')) {
|
|
37
|
+
result.valid = false;
|
|
38
|
+
result.errors.push('spec.md missing "## Acceptance Criteria" section');
|
|
39
|
+
result.suggestedFix = `Add ACs to spec.md or run: /specweave:embed-acs ${incrementPath.split('/').pop()}`;
|
|
40
|
+
}
|
|
41
|
+
// 3. Count ACs in spec.md
|
|
42
|
+
const acMatches = specContent.match(/^- \[[x ]\] \*\*AC-US\d+-\d+\*\*:/gm);
|
|
43
|
+
result.acCount = acMatches ? acMatches.length : 0;
|
|
44
|
+
if (result.acCount === 0) {
|
|
45
|
+
result.valid = false;
|
|
46
|
+
result.errors.push('spec.md contains 0 Acceptance Criteria');
|
|
47
|
+
result.suggestedFix = `Add ACs to spec.md or run: /specweave:embed-acs ${incrementPath.split('/').pop()}`;
|
|
48
|
+
}
|
|
49
|
+
// 4. Check metadata.json for expected AC count
|
|
50
|
+
const metadataPath = join(incrementPath, 'metadata.json');
|
|
51
|
+
if (existsSync(metadataPath)) {
|
|
52
|
+
try {
|
|
53
|
+
const metadata = JSON.parse(readFileSync(metadataPath, 'utf-8'));
|
|
54
|
+
result.expectedCount = metadata.total_acs ?? 0;
|
|
55
|
+
if (result.expectedCount > 0 && result.acCount !== result.expectedCount) {
|
|
56
|
+
const message = `AC count mismatch: spec.md has ${result.acCount} ACs, metadata.json expects ${result.expectedCount}`;
|
|
57
|
+
if (strict) {
|
|
58
|
+
result.valid = false;
|
|
59
|
+
result.errors.push(message);
|
|
60
|
+
}
|
|
61
|
+
else {
|
|
62
|
+
result.warnings.push(message);
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
if (result.expectedCount === 0 && result.acCount > 0) {
|
|
66
|
+
result.warnings.push(`metadata.json has total_acs=0 but spec.md contains ${result.acCount} ACs - metadata may need update`);
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
catch (err) {
|
|
70
|
+
result.warnings.push(`Could not parse metadata.json: ${err.message}`);
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
// 5. Validate AC format
|
|
74
|
+
const invalidACs = [];
|
|
75
|
+
const lines = specContent.split('\n');
|
|
76
|
+
for (let i = 0; i < lines.length; i++) {
|
|
77
|
+
const line = lines[i];
|
|
78
|
+
if (line.includes('**AC-US') && !line.match(/^- \[[x ]\] \*\*AC-US\d+-\d+\*\*:/)) {
|
|
79
|
+
invalidACs.push(`Line ${i + 1}: "${line.substring(0, 60)}..."`);
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
if (invalidACs.length > 0) {
|
|
83
|
+
result.warnings.push(`Found ${invalidACs.length} ACs with invalid format`);
|
|
84
|
+
if (invalidACs.length <= 3) {
|
|
85
|
+
result.warnings.push(...invalidACs);
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
// 6. Check for "structure: user-stories" pattern
|
|
89
|
+
const frontmatterMatch = specContent.match(/^---\n([\s\S]*?)\n---/);
|
|
90
|
+
if (frontmatterMatch) {
|
|
91
|
+
const frontmatter = frontmatterMatch[1];
|
|
92
|
+
if (frontmatter.includes('structure: user-stories') && result.acCount === 0) {
|
|
93
|
+
result.errors.push('⚠️ CRITICAL: spec.md uses `structure: user-stories` but contains NO inline ACs');
|
|
94
|
+
result.errors.push(' AC sync hooks require ACs in spec.md even when using external living docs');
|
|
95
|
+
result.suggestedFix = `Run: /specweave:embed-acs ${incrementPath.split('/').pop()} to auto-embed ACs from living docs`;
|
|
96
|
+
result.valid = false;
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
return result;
|
|
100
|
+
}
|
|
101
|
+
/**
|
|
102
|
+
* Format validation result as human-readable message
|
|
103
|
+
*/
|
|
104
|
+
export function formatValidationResult(result) {
|
|
105
|
+
let output = '';
|
|
106
|
+
if (result.valid) {
|
|
107
|
+
output += `✅ AC Presence Validation: PASSED\n`;
|
|
108
|
+
output += ` ✓ ${result.acCount} Acceptance Criteria found in spec.md\n`;
|
|
109
|
+
if (result.expectedCount > 0) {
|
|
110
|
+
output += ` ✓ Matches metadata.json (${result.expectedCount} expected)\n`;
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
else {
|
|
114
|
+
output += `❌ AC Presence Validation: FAILED\n\n`;
|
|
115
|
+
if (result.errors.length > 0) {
|
|
116
|
+
output += `ERRORS (${result.errors.length}):\n`;
|
|
117
|
+
for (const error of result.errors) {
|
|
118
|
+
output += ` 🔴 ${error}\n`;
|
|
119
|
+
}
|
|
120
|
+
output += '\n';
|
|
121
|
+
}
|
|
122
|
+
if (result.suggestedFix) {
|
|
123
|
+
output += `💡 SUGGESTED FIX:\n`;
|
|
124
|
+
output += ` ${result.suggestedFix}\n\n`;
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
if (result.warnings.length > 0) {
|
|
128
|
+
output += `WARNINGS (${result.warnings.length}):\n`;
|
|
129
|
+
for (const warning of result.warnings) {
|
|
130
|
+
output += ` 🟡 ${warning}\n`;
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
return output;
|
|
134
|
+
}
|
|
135
|
+
/**
|
|
136
|
+
* Validate AC presence and throw if validation fails
|
|
137
|
+
*
|
|
138
|
+
* Use this in critical paths (e.g., before starting increment)
|
|
139
|
+
*/
|
|
140
|
+
export function validateACPresenceStrict(incrementPath, logger = consoleLogger) {
|
|
141
|
+
const result = validateACPresence(incrementPath, { logger, strict: true });
|
|
142
|
+
if (!result.valid) {
|
|
143
|
+
const formattedResult = formatValidationResult(result);
|
|
144
|
+
logger.error(formattedResult);
|
|
145
|
+
throw new Error(`AC presence validation failed for ${incrementPath}`);
|
|
146
|
+
}
|
|
147
|
+
logger.log(formatValidationResult(result));
|
|
148
|
+
}
|
|
149
|
+
//# sourceMappingURL=ac-presence-validator.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ac-presence-validator.js","sourceRoot":"","sources":["../../../../src/core/validators/ac-presence-validator.ts"],"names":[],"mappings":"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"}
|