specweave 0.6.8 → 0.7.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 (255) hide show
  1. package/.claude-plugin/README.md +1 -1
  2. package/CLAUDE.md +903 -99
  3. package/README.md +143 -207
  4. package/bin/specweave.js +67 -0
  5. package/dist/cli/commands/abandon.d.ts +13 -0
  6. package/dist/cli/commands/abandon.d.ts.map +1 -0
  7. package/dist/cli/commands/abandon.js +15 -0
  8. package/dist/cli/commands/abandon.js.map +1 -0
  9. package/dist/cli/commands/init.d.ts.map +1 -1
  10. package/dist/cli/commands/init.js +94 -18
  11. package/dist/cli/commands/init.js.map +1 -1
  12. package/dist/cli/commands/pause.d.ts +13 -0
  13. package/dist/cli/commands/pause.d.ts.map +1 -0
  14. package/dist/cli/commands/pause.js +15 -0
  15. package/dist/cli/commands/pause.js.map +1 -0
  16. package/dist/cli/commands/qa.d.ts +54 -0
  17. package/dist/cli/commands/qa.d.ts.map +1 -0
  18. package/dist/cli/commands/qa.js +98 -0
  19. package/dist/cli/commands/qa.js.map +1 -0
  20. package/dist/cli/commands/resume.d.ts +12 -0
  21. package/dist/cli/commands/resume.d.ts.map +1 -0
  22. package/dist/cli/commands/resume.js +14 -0
  23. package/dist/cli/commands/resume.js.map +1 -0
  24. package/dist/cli/commands/status.d.ts +12 -0
  25. package/dist/cli/commands/status.d.ts.map +1 -0
  26. package/dist/cli/commands/status.js +23 -0
  27. package/dist/cli/commands/status.js.map +1 -0
  28. package/dist/cli/helpers/issue-tracker/ado.d.ts +57 -0
  29. package/dist/cli/helpers/issue-tracker/ado.d.ts.map +1 -0
  30. package/dist/cli/helpers/issue-tracker/ado.js +223 -0
  31. package/dist/cli/helpers/issue-tracker/ado.js.map +1 -0
  32. package/dist/cli/helpers/issue-tracker/github.d.ts +65 -0
  33. package/dist/cli/helpers/issue-tracker/github.d.ts.map +1 -0
  34. package/dist/cli/helpers/issue-tracker/github.js +284 -0
  35. package/dist/cli/helpers/issue-tracker/github.js.map +1 -0
  36. package/dist/cli/helpers/issue-tracker/index.d.ts +22 -0
  37. package/dist/cli/helpers/issue-tracker/index.d.ts.map +1 -0
  38. package/dist/cli/helpers/issue-tracker/index.js +270 -0
  39. package/dist/cli/helpers/issue-tracker/index.js.map +1 -0
  40. package/dist/cli/helpers/issue-tracker/jira.d.ts +61 -0
  41. package/dist/cli/helpers/issue-tracker/jira.d.ts.map +1 -0
  42. package/dist/cli/helpers/issue-tracker/jira.js +265 -0
  43. package/dist/cli/helpers/issue-tracker/jira.js.map +1 -0
  44. package/dist/cli/helpers/issue-tracker/types.d.ts +86 -0
  45. package/dist/cli/helpers/issue-tracker/types.d.ts.map +1 -0
  46. package/dist/cli/helpers/issue-tracker/types.js +16 -0
  47. package/dist/cli/helpers/issue-tracker/types.js.map +1 -0
  48. package/dist/cli/helpers/issue-tracker/utils.d.ts +103 -0
  49. package/dist/cli/helpers/issue-tracker/utils.d.ts.map +1 -0
  50. package/dist/cli/helpers/issue-tracker/utils.js +240 -0
  51. package/dist/cli/helpers/issue-tracker/utils.js.map +1 -0
  52. package/dist/core/increment/limits.d.ts +68 -0
  53. package/dist/core/increment/limits.d.ts.map +1 -0
  54. package/dist/core/increment/limits.js +224 -0
  55. package/dist/core/increment/limits.js.map +1 -0
  56. package/dist/core/increment/metadata-manager.d.ts +114 -0
  57. package/dist/core/increment/metadata-manager.d.ts.map +1 -0
  58. package/dist/core/increment/metadata-manager.js +320 -0
  59. package/dist/core/increment/metadata-manager.js.map +1 -0
  60. package/dist/core/increment/status-commands.d.ts +43 -0
  61. package/dist/core/increment/status-commands.d.ts.map +1 -0
  62. package/dist/core/increment/status-commands.js +277 -0
  63. package/dist/core/increment/status-commands.js.map +1 -0
  64. package/dist/core/plugin-detector.d.ts +1 -0
  65. package/dist/core/plugin-detector.d.ts.map +1 -1
  66. package/dist/core/plugin-detector.js +25 -0
  67. package/dist/core/plugin-detector.js.map +1 -1
  68. package/dist/core/qa/qa-runner.d.ts +16 -0
  69. package/dist/core/qa/qa-runner.d.ts.map +1 -0
  70. package/dist/core/qa/qa-runner.js +404 -0
  71. package/dist/core/qa/qa-runner.js.map +1 -0
  72. package/dist/core/qa/quality-gate-decider.d.ts +53 -0
  73. package/dist/core/qa/quality-gate-decider.d.ts.map +1 -0
  74. package/dist/core/qa/quality-gate-decider.js +268 -0
  75. package/dist/core/qa/quality-gate-decider.js.map +1 -0
  76. package/dist/core/qa/risk-calculator.d.ts +126 -0
  77. package/dist/core/qa/risk-calculator.d.ts.map +1 -0
  78. package/dist/core/qa/risk-calculator.js +247 -0
  79. package/dist/core/qa/risk-calculator.js.map +1 -0
  80. package/dist/core/qa/types.d.ts +315 -0
  81. package/dist/core/qa/types.d.ts.map +1 -0
  82. package/dist/core/qa/types.js +8 -0
  83. package/dist/core/qa/types.js.map +1 -0
  84. package/dist/core/types/config.d.ts +35 -0
  85. package/dist/core/types/config.d.ts.map +1 -1
  86. package/dist/core/types/config.js +16 -0
  87. package/dist/core/types/config.js.map +1 -1
  88. package/dist/core/types/increment-metadata.d.ts +120 -0
  89. package/dist/core/types/increment-metadata.d.ts.map +1 -0
  90. package/dist/core/types/increment-metadata.js +138 -0
  91. package/dist/core/types/increment-metadata.js.map +1 -0
  92. package/dist/hooks/lib/invoke-translator-skill.d.ts +60 -0
  93. package/dist/hooks/lib/invoke-translator-skill.d.ts.map +1 -0
  94. package/dist/hooks/lib/invoke-translator-skill.js +201 -0
  95. package/dist/hooks/lib/invoke-translator-skill.js.map +1 -0
  96. package/dist/hooks/lib/translate-file.d.ts +59 -0
  97. package/dist/hooks/lib/translate-file.d.ts.map +1 -0
  98. package/dist/hooks/lib/translate-file.js +350 -0
  99. package/dist/hooks/lib/translate-file.js.map +1 -0
  100. package/dist/locales/en/cli.json +3 -1
  101. package/dist/metrics/calculators/change-failure-rate.d.ts +22 -0
  102. package/dist/metrics/calculators/change-failure-rate.d.ts.map +1 -0
  103. package/dist/metrics/calculators/change-failure-rate.js +70 -0
  104. package/dist/metrics/calculators/change-failure-rate.js.map +1 -0
  105. package/dist/metrics/calculators/deployment-frequency.d.ts +20 -0
  106. package/dist/metrics/calculators/deployment-frequency.d.ts.map +1 -0
  107. package/dist/metrics/calculators/deployment-frequency.js +61 -0
  108. package/dist/metrics/calculators/deployment-frequency.js.map +1 -0
  109. package/dist/metrics/calculators/lead-time.d.ts +22 -0
  110. package/dist/metrics/calculators/lead-time.d.ts.map +1 -0
  111. package/dist/metrics/calculators/lead-time.js +82 -0
  112. package/dist/metrics/calculators/lead-time.js.map +1 -0
  113. package/dist/metrics/calculators/mttr.d.ts +21 -0
  114. package/dist/metrics/calculators/mttr.d.ts.map +1 -0
  115. package/dist/metrics/calculators/mttr.js +60 -0
  116. package/dist/metrics/calculators/mttr.js.map +1 -0
  117. package/dist/metrics/dora-calculator.d.ts +24 -0
  118. package/dist/metrics/dora-calculator.d.ts.map +1 -0
  119. package/dist/metrics/dora-calculator.js +104 -0
  120. package/dist/metrics/dora-calculator.js.map +1 -0
  121. package/dist/metrics/github-client.d.ts +51 -0
  122. package/dist/metrics/github-client.d.ts.map +1 -0
  123. package/dist/metrics/github-client.js +133 -0
  124. package/dist/metrics/github-client.js.map +1 -0
  125. package/dist/metrics/types.d.ts +112 -0
  126. package/dist/metrics/types.d.ts.map +1 -0
  127. package/dist/metrics/types.js +10 -0
  128. package/dist/metrics/types.js.map +1 -0
  129. package/dist/metrics/utils/percentile.d.ts +25 -0
  130. package/dist/metrics/utils/percentile.d.ts.map +1 -0
  131. package/dist/metrics/utils/percentile.js +46 -0
  132. package/dist/metrics/utils/percentile.js.map +1 -0
  133. package/dist/metrics/utils/tier-classifier.d.ts +61 -0
  134. package/dist/metrics/utils/tier-classifier.d.ts.map +1 -0
  135. package/dist/metrics/utils/tier-classifier.js +100 -0
  136. package/dist/metrics/utils/tier-classifier.js.map +1 -0
  137. package/dist/utils/auth-helpers.d.ts +58 -0
  138. package/dist/utils/auth-helpers.d.ts.map +1 -0
  139. package/dist/utils/auth-helpers.js +108 -0
  140. package/dist/utils/auth-helpers.js.map +1 -0
  141. package/dist/utils/env-file.d.ts +88 -0
  142. package/dist/utils/env-file.d.ts.map +1 -0
  143. package/dist/utils/env-file.js +180 -0
  144. package/dist/utils/env-file.js.map +1 -0
  145. package/dist/utils/plugin-detection.d.ts +50 -0
  146. package/dist/utils/plugin-detection.d.ts.map +1 -0
  147. package/dist/utils/plugin-detection.js +229 -0
  148. package/dist/utils/plugin-detection.js.map +1 -0
  149. package/dist/utils/secrets-loader.d.ts +88 -0
  150. package/dist/utils/secrets-loader.d.ts.map +1 -0
  151. package/dist/utils/secrets-loader.js +271 -0
  152. package/dist/utils/secrets-loader.js.map +1 -0
  153. package/dist/utils/translation.d.ts +187 -0
  154. package/dist/utils/translation.d.ts.map +1 -0
  155. package/dist/utils/translation.js +414 -0
  156. package/dist/utils/translation.js.map +1 -0
  157. package/package.json +28 -44
  158. package/plugins/specweave/.claude-plugin/plugin.json +3 -3
  159. package/plugins/specweave/agents/pm/AGENT.md +330 -54
  160. package/plugins/specweave/agents/test-aware-planner/AGENT.md +1035 -0
  161. package/plugins/specweave/agents/test-aware-planner/templates/README.md +118 -0
  162. package/plugins/specweave/agents/test-aware-planner/templates/task-non-testable.md.template +24 -0
  163. package/plugins/specweave/agents/test-aware-planner/templates/task-testable.md.template +53 -0
  164. package/plugins/specweave/agents/test-aware-planner/templates/tasks-frontmatter.md.template +11 -0
  165. package/plugins/specweave/commands/README.md +88 -163
  166. package/plugins/specweave/commands/specweave-abandon.md +314 -0
  167. package/plugins/specweave/commands/specweave-check-tests.md +546 -0
  168. package/plugins/specweave/commands/{do.md → specweave-do.md} +5 -7
  169. package/plugins/specweave/commands/{increment.md → specweave-increment.md} +231 -4
  170. package/plugins/specweave/commands/specweave-pause.md +189 -0
  171. package/plugins/specweave/commands/specweave-qa.md +245 -0
  172. package/plugins/specweave/commands/specweave-resume.md +216 -0
  173. package/plugins/specweave/commands/specweave-status.md +397 -0
  174. package/plugins/specweave/commands/specweave-sync-tasks.md +256 -0
  175. package/plugins/specweave/commands/{translate.md → specweave-translate.md} +3 -3
  176. package/plugins/specweave/commands/specweave-update-scope.md +351 -0
  177. package/plugins/specweave/commands/specweave.md +21 -21
  178. package/plugins/specweave/hooks/post-increment-planning.sh +335 -0
  179. package/plugins/specweave/hooks/post-task-completion.sh +141 -0
  180. package/plugins/specweave/skills/SKILLS-INDEX.md +1 -1
  181. package/plugins/specweave/skills/brownfield-analyzer/SKILL.md +9 -9
  182. package/plugins/specweave/skills/increment-planner/SKILL.md +400 -212
  183. package/plugins/specweave/skills/increment-quality-judge-v2/SKILL.md +499 -0
  184. package/plugins/specweave/skills/plugin-detector/SKILL.md +114 -1
  185. package/plugins/specweave/skills/project-kickstarter/SKILL.md +74 -1
  186. package/plugins/specweave/skills/{rfc-generator → spec-generator}/SKILL.md +22 -29
  187. package/plugins/specweave/skills/specweave-detector/SKILL.md +3 -3
  188. package/plugins/specweave/skills/specweave-framework/SKILL.md +2 -2
  189. package/plugins/specweave-ado/.claude-plugin/plugin.json +18 -4
  190. package/plugins/specweave-ado/agents/ado-manager/AGENT.md +426 -0
  191. package/plugins/specweave-ado/commands/close-workitem.md +52 -0
  192. package/plugins/specweave-ado/commands/create-workitem.md +53 -0
  193. package/plugins/specweave-ado/commands/status.md +53 -0
  194. package/plugins/specweave-ado/commands/sync.md +55 -0
  195. package/plugins/specweave-ado/lib/ado-client.ts +361 -0
  196. package/plugins/specweave-ado/reference/ado-specweave-mapping.md +552 -0
  197. package/plugins/specweave-ado/skills/ado-sync/SKILL.md +344 -193
  198. package/plugins/specweave-docs/skills/docusaurus/SKILL.md +73 -0
  199. package/plugins/specweave-github/agents/github-manager/AGENT.md +49 -0
  200. package/plugins/specweave-github/commands/{github-close-issue.md → close-issue.md} +1 -1
  201. package/plugins/specweave-github/commands/{github-create-issue.md → create-issue.md} +1 -1
  202. package/plugins/specweave-github/commands/{github-status.md → status.md} +1 -1
  203. package/plugins/specweave-github/commands/{github-sync-tasks.md → sync-tasks.md} +1 -1
  204. package/plugins/specweave-github/commands/{github-sync.md → sync.md} +1 -1
  205. package/plugins/specweave-github/reference/github-specweave-mapping.md +377 -0
  206. package/plugins/specweave-github/skills/github-sync/SKILL.md +11 -3
  207. package/plugins/specweave-infrastructure/commands/{specweave.monitor-setup.md → monitor-setup.md} +5 -0
  208. package/plugins/specweave-infrastructure/commands/{specweave.slo-implement.md → slo-implement.md} +5 -0
  209. package/plugins/specweave-jira/agents/jira-manager/AGENT.md +380 -0
  210. package/plugins/specweave-jira/commands/{specweave.sync-jira.md → sync.md} +1 -1
  211. package/plugins/specweave-jira/reference/jira-specweave-mapping.md +508 -0
  212. package/plugins/specweave-ml/commands/ml-deploy.md +1 -1
  213. package/plugins/specweave-ml/commands/ml-evaluate.md +1 -1
  214. package/plugins/specweave-ml/commands/ml-explain.md +1 -1
  215. package/plugins/specweave-ml/commands/{specweave.ml-pipeline.md → ml-pipeline.md} +5 -0
  216. package/src/templates/AGENTS.md.template +331 -31
  217. package/src/templates/CLAUDE.md.template +36 -21
  218. package/src/templates/COMPLETION-REPORT.template.md +128 -0
  219. package/src/templates/README.md.template +17 -16
  220. package/src/templates/docs/README.md +11 -9
  221. package/src/templates/docs/spec-template.md +229 -0
  222. package/plugins/specweave/commands/inc.md +0 -85
  223. package/plugins/specweave/commands/list-increments.md +0 -180
  224. package/src/adapters/README.md +0 -275
  225. package/src/adapters/adapter-base.ts +0 -182
  226. package/src/adapters/adapter-interface.ts +0 -166
  227. package/src/adapters/adapter-loader.ts +0 -256
  228. package/src/adapters/agents-md-generator.ts +0 -228
  229. package/src/adapters/claude/README.md +0 -233
  230. package/src/adapters/claude/adapter.ts +0 -468
  231. package/src/adapters/claude-md-generator.ts +0 -377
  232. package/src/adapters/codex/README.md +0 -105
  233. package/src/adapters/codex/adapter.ts +0 -333
  234. package/src/adapters/cursor/.cursor/context/docs-context.md +0 -62
  235. package/src/adapters/cursor/.cursor/context/increments-context.md +0 -71
  236. package/src/adapters/cursor/.cursor/context/strategy-context.md +0 -73
  237. package/src/adapters/cursor/.cursor/context/tests-context.md +0 -89
  238. package/src/adapters/cursor/README.md +0 -283
  239. package/src/adapters/cursor/adapter.ts +0 -451
  240. package/src/adapters/doc-generator.ts +0 -331
  241. package/src/adapters/gemini/README.md +0 -97
  242. package/src/adapters/gemini/adapter.ts +0 -298
  243. package/src/adapters/generic/README.md +0 -277
  244. package/src/adapters/generic/adapter.ts +0 -378
  245. package/src/adapters/registry.yaml +0 -187
  246. /package/plugins/specweave/commands/{costs.md → specweave-costs.md} +0 -0
  247. /package/plugins/specweave/commands/{done.md → specweave-done.md} +0 -0
  248. /package/plugins/specweave/commands/{next.md → specweave-next.md} +0 -0
  249. /package/plugins/specweave/commands/{progress.md → specweave-progress.md} +0 -0
  250. /package/plugins/specweave/commands/{sync-docs.md → specweave-sync-docs.md} +0 -0
  251. /package/plugins/specweave/commands/{tdd-cycle.md → specweave-tdd-cycle.md} +0 -0
  252. /package/plugins/specweave/commands/{tdd-green.md → specweave-tdd-green.md} +0 -0
  253. /package/plugins/specweave/commands/{tdd-red.md → specweave-tdd-red.md} +0 -0
  254. /package/plugins/specweave/commands/{tdd-refactor.md → specweave-tdd-refactor.md} +0 -0
  255. /package/plugins/specweave/commands/{validate.md → specweave-validate.md} +0 -0
@@ -0,0 +1,404 @@
1
+ /**
2
+ * QA Runner - Main orchestration logic for quality assessment
3
+ *
4
+ * @module qa/qa-runner
5
+ * @since v0.8.0
6
+ */
7
+ import chalk from 'chalk';
8
+ import ora from 'ora';
9
+ import fs from 'fs-extra';
10
+ import * as path from 'path';
11
+ import { QualityGateDecider, DEFAULT_THRESHOLDS } from './quality-gate-decider.js';
12
+ import { RiskCalculator } from './risk-calculator.js';
13
+ /**
14
+ * Run QA assessment on an increment
15
+ *
16
+ * @param incrementId - Increment ID to assess (e.g., "0008")
17
+ * @param options - QA options (mode, flags)
18
+ * @returns QA report with assessment results
19
+ */
20
+ export async function runQA(incrementId, options = {}) {
21
+ const startTime = Date.now();
22
+ // Determine mode
23
+ const mode = determineMode(options);
24
+ console.log(chalk.blue.bold(`\n━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━`));
25
+ console.log(chalk.blue.bold(`QA ASSESSMENT: Increment ${incrementId}`));
26
+ console.log(chalk.blue.bold(`━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n`));
27
+ console.log(chalk.gray(`Mode: ${mode.toUpperCase()}`));
28
+ console.log(chalk.gray(`Timestamp: ${new Date().toISOString()}\n`));
29
+ // Validate increment exists
30
+ const incrementPath = path.join(process.cwd(), '.specweave', 'increments', incrementId);
31
+ if (!fs.existsSync(incrementPath)) {
32
+ throw new Error(`Increment ${incrementId} not found at ${incrementPath}`);
33
+ }
34
+ // Step 1: Rule-based validation (always first, always free)
35
+ const spinner = ora('Running rule-based validation (120 checks)...').start();
36
+ const ruleBasedResult = await runRuleBasedValidation(incrementId, incrementPath);
37
+ if (ruleBasedResult.passed) {
38
+ spinner.succeed(chalk.green(`Rule-based validation passed (${ruleBasedResult.passedCount}/${ruleBasedResult.totalCount})`));
39
+ }
40
+ else {
41
+ spinner.fail(chalk.red(`Rule-based validation failed (${ruleBasedResult.passedCount}/${ruleBasedResult.totalCount})`));
42
+ // Show errors
43
+ console.log(chalk.red('\n❌ Validation Errors:\n'));
44
+ ruleBasedResult.errors.forEach((err, idx) => {
45
+ console.log(chalk.red(` ${idx + 1}. [${err.severity.toUpperCase()}] ${err.rule}`));
46
+ console.log(chalk.gray(` ${err.message}`));
47
+ if (err.file) {
48
+ console.log(chalk.gray(` File: ${err.file}${err.line ? `:${err.line}` : ''}\n`));
49
+ }
50
+ });
51
+ // If rule-based fails, stop here (don't waste AI tokens)
52
+ if (!options.force) {
53
+ console.log(chalk.yellow('\n💡 Fix validation errors before running AI assessment'));
54
+ console.log(chalk.gray(' Use --force to run AI assessment anyway\n'));
55
+ process.exit(1);
56
+ }
57
+ }
58
+ // Step 2: AI Quality Assessment (skip if --no-ai)
59
+ let specQuality;
60
+ let tokenUsage = 0;
61
+ let costUsd = 0;
62
+ if (!options.noAi) {
63
+ console.log(); // Blank line
64
+ const aiSpinner = ora('Running AI quality assessment...').start();
65
+ try {
66
+ specQuality = await runAIQualityAssessment(incrementId, incrementPath, mode);
67
+ tokenUsage = estimateTokenUsage(incrementPath);
68
+ costUsd = calculateCost(tokenUsage);
69
+ aiSpinner.succeed(chalk.green(`AI quality assessment complete (~${tokenUsage} tokens, ~$${costUsd.toFixed(3)})`));
70
+ }
71
+ catch (error) {
72
+ aiSpinner.fail(chalk.red('AI quality assessment failed'));
73
+ console.log(chalk.red(` Error: ${error instanceof Error ? error.message : String(error)}`));
74
+ // If AI fails, continue with rule-based only
75
+ console.log(chalk.yellow('\n⚠️ Continuing with rule-based validation only\n'));
76
+ }
77
+ }
78
+ else {
79
+ console.log(chalk.gray('\n⏭️ Skipping AI assessment (--no-ai flag)\n'));
80
+ }
81
+ // Step 3: Quality Gate Decision
82
+ const decider = new QualityGateDecider(DEFAULT_THRESHOLDS);
83
+ let qualityGate;
84
+ if (specQuality) {
85
+ qualityGate = decider.decide(specQuality);
86
+ }
87
+ else {
88
+ // No AI assessment, use rule-based only
89
+ qualityGate = {
90
+ decision: ruleBasedResult.passed ? 'PASS' : 'FAIL',
91
+ blockers: ruleBasedResult.passed ? [] : ruleBasedResult.errors.filter(e => e.severity === 'error').map(e => ({
92
+ type: 'rule_based',
93
+ severity: 'critical',
94
+ title: e.rule,
95
+ description: e.message,
96
+ location: e.file,
97
+ })),
98
+ concerns: ruleBasedResult.errors.filter(e => e.severity === 'warning').map(e => ({
99
+ type: 'rule_based',
100
+ severity: 'high',
101
+ title: e.rule,
102
+ description: e.message,
103
+ location: e.file,
104
+ })),
105
+ recommendations: [],
106
+ reasoning: ruleBasedResult.passed
107
+ ? 'Rule-based validation passed. AI assessment skipped.'
108
+ : 'Rule-based validation failed. Fix errors before proceeding.',
109
+ };
110
+ }
111
+ // Build final report
112
+ const report = {
113
+ increment_id: incrementId,
114
+ mode,
115
+ timestamp: new Date().toISOString(),
116
+ rule_based: ruleBasedResult,
117
+ spec_quality: specQuality,
118
+ quality_gate: qualityGate,
119
+ duration_ms: Date.now() - startTime,
120
+ token_usage: tokenUsage,
121
+ cost_usd: costUsd,
122
+ };
123
+ // Display results
124
+ if (!options.silent) {
125
+ displayReport(report, options);
126
+ }
127
+ // Handle export
128
+ if (options.export && specQuality) {
129
+ await exportToTasks(incrementId, qualityGate);
130
+ }
131
+ // Exit code for CI mode
132
+ if (options.ci) {
133
+ if (qualityGate.decision === 'FAIL') {
134
+ process.exit(1);
135
+ }
136
+ }
137
+ return report;
138
+ }
139
+ /**
140
+ * Determine QA mode from options
141
+ */
142
+ function determineMode(options) {
143
+ if (options.gate)
144
+ return 'gate';
145
+ if (options.pre)
146
+ return 'pre';
147
+ if (options.full)
148
+ return 'full';
149
+ return 'quick'; // Default
150
+ }
151
+ /**
152
+ * Run rule-based validation (Phase 1: Stub implementation)
153
+ *
154
+ * @param incrementId - Increment ID
155
+ * @param incrementPath - Path to increment folder
156
+ * @returns Rule-based validation result
157
+ */
158
+ async function runRuleBasedValidation(incrementId, incrementPath) {
159
+ // STUB: Phase 1 implementation returns passing result
160
+ // TODO (Phase 2): Implement 120 validation rules
161
+ // - spec.md structure validation
162
+ // - plan.md completeness checks
163
+ // - tasks.md format validation
164
+ // - AC-ID traceability checks
165
+ // - YAML frontmatter validation
166
+ // - Link integrity checks
167
+ const errors = [];
168
+ // Basic file existence checks
169
+ const requiredFiles = ['spec.md', 'plan.md', 'tasks.md'];
170
+ let totalChecks = requiredFiles.length;
171
+ let passedChecks = 0;
172
+ for (const file of requiredFiles) {
173
+ const filePath = path.join(incrementPath, file);
174
+ if (fs.existsSync(filePath)) {
175
+ passedChecks++;
176
+ }
177
+ else {
178
+ errors.push({
179
+ rule: `Required file: ${file}`,
180
+ severity: 'error',
181
+ message: `Missing required file: ${file}`,
182
+ file: file,
183
+ });
184
+ }
185
+ }
186
+ return {
187
+ passed: errors.length === 0,
188
+ totalCount: totalChecks,
189
+ passedCount: passedChecks,
190
+ failedCount: totalChecks - passedChecks,
191
+ errors,
192
+ breakdown: {
193
+ consistency: { passed: passedChecks, total: totalChecks },
194
+ completeness: { passed: passedChecks, total: totalChecks },
195
+ quality: { passed: passedChecks, total: totalChecks },
196
+ traceability: { passed: passedChecks, total: totalChecks },
197
+ },
198
+ };
199
+ }
200
+ /**
201
+ * Run AI quality assessment using increment-quality-judge-v2 skill
202
+ *
203
+ * @param incrementId - Increment ID
204
+ * @param incrementPath - Path to increment folder
205
+ * @param mode - QA mode
206
+ * @returns Quality assessment result
207
+ */
208
+ async function runAIQualityAssessment(incrementId, incrementPath, mode) {
209
+ // STUB: Phase 1 implementation returns mock assessment
210
+ // TODO (Phase 2): Invoke increment-quality-judge-v2 skill via Task tool
211
+ // - Use Task tool with subagent_type: "increment-quality-judge-v2"
212
+ // - Pass increment path and mode
213
+ // - Parse JSON response
214
+ // - Return structured QualityAssessment
215
+ // Read spec.md to get some context
216
+ const specPath = path.join(incrementPath, 'spec.md');
217
+ const specContent = fs.existsSync(specPath) ? await fs.readFile(specPath, 'utf-8') : '';
218
+ // Mock assessment for Phase 1
219
+ const mockRisks = RiskCalculator.calculateAssessment([
220
+ RiskCalculator.createRisk({
221
+ id: 'RISK-001',
222
+ category: 'security',
223
+ title: 'Example security risk',
224
+ description: 'This is a mock risk for Phase 1 testing',
225
+ probability: 0.3,
226
+ impact: 5,
227
+ mitigation: 'Implement proper validation',
228
+ location: 'spec.md',
229
+ }),
230
+ ]);
231
+ return {
232
+ overall_score: 75,
233
+ dimension_scores: {
234
+ clarity: 80,
235
+ testability: 75,
236
+ completeness: 70,
237
+ feasibility: 80,
238
+ maintainability: 75,
239
+ edge_cases: 70,
240
+ risk: 65,
241
+ },
242
+ issues: [],
243
+ suggestions: [],
244
+ confidence: 0.8,
245
+ risk_assessment: mockRisks,
246
+ };
247
+ }
248
+ /**
249
+ * Estimate token usage for AI assessment
250
+ */
251
+ function estimateTokenUsage(incrementPath) {
252
+ // Rough estimate: ~2500 tokens for small increments
253
+ // TODO: Implement actual token counting based on file sizes
254
+ return 2500;
255
+ }
256
+ /**
257
+ * Calculate cost based on token usage
258
+ * Assumes Haiku pricing: $0.25 per million input tokens, $1.25 per million output tokens
259
+ */
260
+ function calculateCost(tokens) {
261
+ const inputTokens = tokens * 0.8; // 80% input
262
+ const outputTokens = tokens * 0.2; // 20% output
263
+ const inputCost = (inputTokens / 1000000) * 0.25;
264
+ const outputCost = (outputTokens / 1000000) * 1.25;
265
+ return inputCost + outputCost;
266
+ }
267
+ /**
268
+ * Display QA report in terminal
269
+ */
270
+ function displayReport(report, options) {
271
+ console.log(chalk.blue.bold(`\n━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━`));
272
+ console.log(chalk.blue.bold(`QUALITY GATE DECISION`));
273
+ console.log(chalk.blue.bold(`━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n`));
274
+ const { decision } = report.quality_gate;
275
+ const icon = QualityGateDecider.getDecisionIcon(decision);
276
+ const color = QualityGateDecider.getDecisionColor(decision);
277
+ console.log(chalk[color](`${icon} ${decision}\n`));
278
+ console.log(chalk.gray(report.quality_gate.reasoning + '\n'));
279
+ // Show blockers
280
+ if (report.quality_gate.blockers.length > 0) {
281
+ console.log(chalk.red.bold('🔴 Blockers (MUST FIX):\n'));
282
+ report.quality_gate.blockers.forEach((blocker, idx) => {
283
+ console.log(chalk.red(` ${idx + 1}. ${blocker.title}`));
284
+ console.log(chalk.gray(` ${blocker.description}`));
285
+ if (blocker.mitigation) {
286
+ console.log(chalk.yellow(` → ${blocker.mitigation}`));
287
+ }
288
+ if (blocker.location) {
289
+ console.log(chalk.gray(` 📍 ${blocker.location}\n`));
290
+ }
291
+ });
292
+ }
293
+ // Show concerns
294
+ if (report.quality_gate.concerns.length > 0) {
295
+ console.log(chalk.yellow.bold('🟡 Concerns (SHOULD FIX):\n'));
296
+ report.quality_gate.concerns.forEach((concern, idx) => {
297
+ console.log(chalk.yellow(` ${idx + 1}. ${concern.title}`));
298
+ console.log(chalk.gray(` ${concern.description}`));
299
+ if (concern.mitigation) {
300
+ console.log(chalk.cyan(` → ${concern.mitigation}`));
301
+ }
302
+ if (concern.location) {
303
+ console.log(chalk.gray(` 📍 ${concern.location}\n`));
304
+ }
305
+ });
306
+ }
307
+ // Show recommendations
308
+ if (report.quality_gate.recommendations.length > 0 && options.verbose) {
309
+ console.log(chalk.cyan.bold('💡 Recommendations (NICE TO FIX):\n'));
310
+ report.quality_gate.recommendations.forEach((rec, idx) => {
311
+ console.log(chalk.cyan(` ${idx + 1}. ${rec.title}`));
312
+ console.log(chalk.gray(` ${rec.description}\n`));
313
+ });
314
+ }
315
+ // Show spec quality scores if available
316
+ if (report.spec_quality) {
317
+ console.log(chalk.blue.bold('\n━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━'));
318
+ console.log(chalk.blue.bold('SPECIFICATION QUALITY'));
319
+ console.log(chalk.blue.bold('━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n'));
320
+ console.log(chalk.bold(`Overall Score: ${report.spec_quality.overall_score}/100`));
321
+ console.log();
322
+ const { dimension_scores } = report.spec_quality;
323
+ console.log('Dimension Scores:');
324
+ Object.entries(dimension_scores).forEach(([dim, score]) => {
325
+ const percentage = Math.round(score * 100);
326
+ const indicator = percentage >= 80 ? '✓✓' : percentage >= 70 ? '✓' : '⚠️';
327
+ console.log(` ${dim.padEnd(20)}: ${percentage}/100 ${indicator}`);
328
+ });
329
+ }
330
+ // Show summary
331
+ console.log(chalk.blue.bold('\n━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━'));
332
+ console.log(chalk.blue.bold('SUMMARY'));
333
+ console.log(chalk.blue.bold('━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n'));
334
+ console.log(chalk.gray(`Duration: ${report.duration_ms}ms`));
335
+ if (report.token_usage) {
336
+ console.log(chalk.gray(`Tokens: ~${report.token_usage}`));
337
+ }
338
+ if (report.cost_usd) {
339
+ console.log(chalk.gray(`Cost: ~$${report.cost_usd.toFixed(3)}`));
340
+ }
341
+ console.log();
342
+ // Next steps
343
+ if (report.quality_gate.blockers.length > 0) {
344
+ console.log(chalk.yellow('Next Steps:'));
345
+ console.log(chalk.yellow(' • Fix blockers before proceeding'));
346
+ if (options.export) {
347
+ console.log(chalk.yellow(' • Blockers exported to tasks.md'));
348
+ }
349
+ else {
350
+ console.log(chalk.yellow(' • Run with --export to add blockers to tasks.md'));
351
+ }
352
+ }
353
+ else if (report.quality_gate.concerns.length > 0) {
354
+ console.log(chalk.cyan('Next Steps:'));
355
+ console.log(chalk.cyan(' • Address concerns before release'));
356
+ if (options.export) {
357
+ console.log(chalk.cyan(' • Concerns exported to tasks.md'));
358
+ }
359
+ }
360
+ else {
361
+ console.log(chalk.green('✅ Ready to proceed!'));
362
+ }
363
+ console.log();
364
+ }
365
+ /**
366
+ * Export blockers/concerns to tasks.md
367
+ */
368
+ async function exportToTasks(incrementId, qualityGate) {
369
+ const tasksPath = path.join(process.cwd(), '.specweave', 'increments', incrementId, 'tasks.md');
370
+ if (!fs.existsSync(tasksPath)) {
371
+ console.log(chalk.yellow('⚠️ tasks.md not found, skipping export'));
372
+ return;
373
+ }
374
+ let tasksContent = await fs.readFile(tasksPath, 'utf-8');
375
+ // Find next task number
376
+ const taskMatches = tasksContent.match(/## T-(\d+):/g);
377
+ const nextTaskNum = taskMatches
378
+ ? Math.max(...taskMatches.map((m) => parseInt(m.match(/\d+/)[0]))) + 1
379
+ : 1;
380
+ // Build new tasks
381
+ const newTasks = [];
382
+ [...qualityGate.blockers, ...qualityGate.concerns].forEach((issue, idx) => {
383
+ const taskNum = nextTaskNum + idx;
384
+ const priority = issue.severity === 'critical' ? 'P0 - BLOCKER' : 'P1 - HIGH';
385
+ newTasks.push(`
386
+ ## T-${String(taskNum).padStart(3, '0')}: ${issue.title}
387
+
388
+ **Priority**: ${priority}
389
+ **Type**: Quality Gate Fix
390
+ **Added**: ${new Date().toISOString().split('T')[0]}
391
+
392
+ **Description**: ${issue.description}
393
+
394
+ ${issue.mitigation ? `**Mitigation**: ${issue.mitigation}\n` : ''}
395
+ ${issue.location ? `**Location**: ${issue.location}\n` : ''}
396
+ **Status**: [ ] Pending
397
+ `);
398
+ });
399
+ // Append to tasks.md
400
+ tasksContent += '\n' + newTasks.join('\n');
401
+ await fs.writeFile(tasksPath, tasksContent);
402
+ console.log(chalk.green(`\n✅ Exported ${newTasks.length} items to tasks.md`));
403
+ }
404
+ //# sourceMappingURL=qa-runner.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"qa-runner.js","sourceRoot":"","sources":["../../../src/core/qa/qa-runner.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,53 @@
1
+ /**
2
+ * Quality Gate Decider - PASS/CONCERNS/FAIL decision logic
3
+ *
4
+ * @module qa/quality-gate-decider
5
+ * @since v0.8.0
6
+ */
7
+ import { QualityAssessment, QualityGateResult, QualityGateDecision, QualityGateThresholds, TestCoverageResult, SecurityAuditResult } from './types';
8
+ /**
9
+ * Default quality gate thresholds (BMAD pattern)
10
+ */
11
+ export declare const DEFAULT_THRESHOLDS: QualityGateThresholds;
12
+ export declare class QualityGateDecider {
13
+ private thresholds;
14
+ constructor(thresholds?: QualityGateThresholds);
15
+ /**
16
+ * Main decision logic - determine PASS/CONCERNS/FAIL
17
+ *
18
+ * @param assessment - Quality assessment result from AI judge
19
+ * @param testCoverage - Optional test coverage result
20
+ * @param securityAudit - Optional security audit result
21
+ * @returns Quality gate result with decision and issues
22
+ */
23
+ decide(assessment: QualityAssessment, testCoverage?: TestCoverageResult, securityAudit?: SecurityAuditResult): QualityGateResult;
24
+ /**
25
+ * Assess risks and categorize into blockers/concerns
26
+ */
27
+ private assessRisks;
28
+ /**
29
+ * Assess test coverage and identify gaps
30
+ */
31
+ private assessTestCoverage;
32
+ /**
33
+ * Assess specification quality
34
+ */
35
+ private assessSpecQuality;
36
+ /**
37
+ * Assess security vulnerabilities
38
+ */
39
+ private assessSecurity;
40
+ /**
41
+ * Make final decision based on blockers and concerns
42
+ */
43
+ private makeDecision;
44
+ /**
45
+ * Get decision icon/emoji
46
+ */
47
+ static getDecisionIcon(decision: QualityGateDecision): string;
48
+ /**
49
+ * Get decision color (for terminal output)
50
+ */
51
+ static getDecisionColor(decision: QualityGateDecision): 'green' | 'yellow' | 'red';
52
+ }
53
+ //# sourceMappingURL=quality-gate-decider.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"quality-gate-decider.d.ts","sourceRoot":"","sources":["../../../src/core/qa/quality-gate-decider.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EACL,iBAAiB,EACjB,iBAAiB,EACjB,mBAAmB,EAEnB,qBAAqB,EACrB,kBAAkB,EAClB,mBAAmB,EACpB,MAAM,SAAS,CAAC;AAEjB;;GAEG;AACH,eAAO,MAAM,kBAAkB,EAAE,qBAahC,CAAC;AAEF,qBAAa,kBAAkB;IAC7B,OAAO,CAAC,UAAU,CAAwB;gBAE9B,UAAU,GAAE,qBAA0C;IAIlE;;;;;;;OAOG;IACH,MAAM,CACJ,UAAU,EAAE,iBAAiB,EAC7B,YAAY,CAAC,EAAE,kBAAkB,EACjC,aAAa,CAAC,EAAE,mBAAmB,GAClC,iBAAiB;IAmCpB;;OAEG;IACH,OAAO,CAAC,WAAW;IA6CnB;;OAEG;IACH,OAAO,CAAC,kBAAkB;IAqC1B;;OAEG;IACH,OAAO,CAAC,iBAAiB;IA8CzB;;OAEG;IACH,OAAO,CAAC,cAAc;IAkDtB;;OAEG;IACH,OAAO,CAAC,YAAY;IAwBpB;;OAEG;IACH,MAAM,CAAC,eAAe,CAAC,QAAQ,EAAE,mBAAmB,GAAG,MAAM;IAW7D;;OAEG;IACH,MAAM,CAAC,gBAAgB,CAAC,QAAQ,EAAE,mBAAmB,GAAG,OAAO,GAAG,QAAQ,GAAG,KAAK;CAUnF"}