@boyingliu01/xp-gate 0.14.11 → 0.14.13

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 (44) hide show
  1. package/bin/xp-gate.js +13 -2
  2. package/build-integrity/__tests__/gate-10.test.ts +41 -18
  3. package/build-integrity/__tests__/orchestrator.test.ts +16 -2
  4. package/build-integrity/gate-10.ts +46 -10
  5. package/gate-8.sh +1 -1
  6. package/hooks/pre-commit +56 -1
  7. package/lib/__tests__/doctor.test.js +99 -7
  8. package/lib/__tests__/install-skill.test.js +3 -2
  9. package/lib/__tests__/sprint-discovery.test.ts +1 -1
  10. package/lib/__tests__/ui-detector.test.ts +1 -0
  11. package/lib/__tests__/ui-review.test.ts +19 -6
  12. package/lib/__tests__/update-hooks.test.js +6 -1
  13. package/lib/check.js +59 -18
  14. package/lib/doctor.js +281 -54
  15. package/lib/gate-runner.js +73 -7
  16. package/lib/install-skill.js +2 -0
  17. package/lib/ui-review.ts +32 -8
  18. package/lib/upgrade.js +4 -1
  19. package/mock-policy/AGENTS.md +3 -3
  20. package/mutation/AGENTS.md +3 -3
  21. package/mutation/__tests__/pitest-runner.test.ts +1 -1
  22. package/mutation/__tests__/stryker-runner.test.ts +1 -1
  23. package/mutation/runners/go-mutant-runner.ts +1 -1
  24. package/mutation/runners/mutmut-runner.ts +1 -1
  25. package/mutation/runners/pitest-runner.ts +2 -2
  26. package/mutation/runners/stryker-runner.ts +2 -2
  27. package/package.json +2 -2
  28. package/plugins/claude-code/.claude-plugin/plugin.json +1 -1
  29. package/plugins/claude-code/skills/delphi-review/AGENTS.md +3 -3
  30. package/plugins/claude-code/skills/sprint-flow/AGENTS.md +3 -3
  31. package/plugins/claude-code/skills/test-specification-alignment/AGENTS.md +3 -3
  32. package/plugins/opencode/package.json +1 -1
  33. package/plugins/opencode/skills/delphi-review/AGENTS.md +3 -3
  34. package/plugins/opencode/skills/sprint-flow/AGENTS.md +3 -3
  35. package/plugins/opencode/skills/test-specification-alignment/AGENTS.md +3 -3
  36. package/plugins/qoder/plugin.json +1 -1
  37. package/plugins/qoder/skills/delphi-review/AGENTS.md +3 -3
  38. package/plugins/qoder/skills/sprint-flow/AGENTS.md +3 -3
  39. package/plugins/qoder/skills/test-specification-alignment/AGENTS.md +3 -3
  40. package/principles/AGENTS.md +3 -3
  41. package/principles/__tests__/boy-scout.test.ts +1 -0
  42. package/skills/delphi-review/AGENTS.md +3 -3
  43. package/skills/sprint-flow/AGENTS.md +3 -3
  44. package/skills/test-specification-alignment/AGENTS.md +3 -3
@@ -4,6 +4,27 @@ const { execSync, execFileSync } = require('child_process');
4
4
  const fs = require('fs');
5
5
  const path = require('path');
6
6
 
7
+ /**
8
+ * Run a bash shell script cross-platform.
9
+ * On Unix: uses bash directly.
10
+ * On Windows: tries bash from PATH (Git Bash / WSL), falls back to a clear message.
11
+ */
12
+ function runBashScript(scriptPath) {
13
+ if (process.platform === 'win32') {
14
+ // Check if bash is available on Windows (Git Bash, MSYS2, WSL)
15
+ try {
16
+ execSync('bash --version', { stdio: 'pipe', timeout: 5000 });
17
+ } catch {
18
+ console.log('⚠️ This gate requires bash to run shell scripts.');
19
+ console.log(' On Windows, install Git for Windows (includes Git Bash) or enable WSL.');
20
+ console.log(' Alternatively, install the required tool directly and run the gate again.');
21
+ return;
22
+ }
23
+ }
24
+ // bash is available — run the script (Unix always, or Windows after check above)
25
+ execSync(`bash "${scriptPath}"`, { stdio: 'inherit' });
26
+ }
27
+
7
28
  // Gate metadata registry — maps gate IDs to names, descriptions, and how to run them.
8
29
  // Standalone gates (<gate-id>: { run }) are invokable via xp-gate gate-<id>.
9
30
  // Pre-commit-only gates (<gate-id>: { preCommitOnly: true }) run only in git commit context.
@@ -11,42 +32,47 @@ const GATE_REGISTRY = {
11
32
  '0': {
12
33
  name: 'Version Consistency',
13
34
  description: 'Check VERSION file matches all package.json versions',
35
+ aliases: ['version', '0'],
14
36
  preCommitOnly: true,
15
37
  reason: 'Requires git-staged context to compare VERSION with package.json files',
16
38
  },
17
39
  '1': {
18
40
  name: 'Code Quality',
19
41
  description: 'Language-specific static analysis and linting (ESLint, Ruff, govet, etc.)',
42
+ aliases: ['lint', '1'],
20
43
  preCommitOnly: true,
21
44
  reason: 'Requires language detection from changed files and adapter routing',
22
45
  },
23
46
  '2': {
24
47
  name: 'Duplicate Code',
25
48
  description: 'jscpd duplicate code detection',
49
+ aliases: ['duplicates', 'dup', '2'],
26
50
  run: (targetPath) => {
27
51
  const jscpdConfig = findConfig(targetPath, 'jscpd.conf.json');
28
52
  const args = [targetPath || '.'];
29
53
  if (jscpdConfig) args.push('--config', jscpdConfig);
30
- execFileSync('npx', ['-y', 'jscpd', ...args], { stdio: 'inherit' });
54
+ execFileSync('npx', ['-y', 'jscpd', ...args], { stdio: 'inherit', shell: true });
31
55
  },
32
56
  },
33
57
  '3': {
34
58
  name: 'Cyclomatic Complexity',
35
59
  description: 'lizard cyclomatic complexity analysis',
60
+ aliases: ['complexity', 'ccn', '3'],
36
61
  run: (targetPath) => {
37
62
  const script = resolveGateScript('3');
38
63
  if (script) {
39
- execSync(`bash "${script}"`, { stdio: 'inherit' });
64
+ runBashScript(script);
40
65
  } else {
41
66
  const target = targetPath || '.';
42
67
  console.log(`Running lizard on ${target}...`);
43
- execFileSync('lizard', [target, '--CCN', '10', '--length', '50', '--arguments', '5', '--warnings_only'], { stdio: 'inherit' });
68
+ execFileSync('lizard', [target, '--CCN', '10', '--length', '50', '--arguments', '5', '--warnings_only'], { stdio: 'inherit', shell: true });
44
69
  }
45
70
  },
46
71
  },
47
72
  '4': {
48
73
  name: 'Clean Code + SOLID Principles',
49
74
  description: '14 Clean Code/SOLID rules across 9 languages',
75
+ aliases: ['principles', 'principle', '4'],
50
76
  run: (targetPath) => {
51
77
  const { principles } = require('./principles.js');
52
78
  return principles([targetPath || '.']);
@@ -55,12 +81,14 @@ const GATE_REGISTRY = {
55
81
  '5': {
56
82
  name: 'Tests + Coverage',
57
83
  description: 'Unit test execution and code coverage enforcement (≥80%)',
84
+ aliases: ['tests', 'test', '5'],
58
85
  preCommitOnly: true,
59
86
  reason: 'Requires language detection and adapter-sourced test execution with coverage reports',
60
87
  },
61
88
  '6': {
62
89
  name: 'Architecture + Boy Scout Rule',
63
90
  description: 'Architecture layer boundary validation and warning baseline enforcement',
91
+ aliases: ['architecture', 'arch', '6'],
64
92
  run: (targetPath) => {
65
93
  const { arch } = require('./arch.js');
66
94
  return arch([]);
@@ -69,10 +97,11 @@ const GATE_REGISTRY = {
69
97
  '7': {
70
98
  name: 'IaC Security',
71
99
  description: 'Infrastructure-as-Code security scanning (checkov, hadolint, kube-score, tflint)',
100
+ aliases: ['iac', 'infra', '7'],
72
101
  run: (targetPath) => {
73
102
  const script = resolveGateScript('7');
74
103
  if (script) {
75
- execSync(`bash "${script}"`, { stdio: 'inherit' });
104
+ runBashScript(script);
76
105
  } else {
77
106
  console.log('IaC security scan requires git-staged context for changed files detection.');
78
107
  console.log('Run: git commit to trigger Gate 7 automatically.');
@@ -82,10 +111,11 @@ const GATE_REGISTRY = {
82
111
  '8': {
83
112
  name: 'Secret Scanning',
84
113
  description: 'gitleaks secret and credential detection',
114
+ aliases: ['secrets', 'secret', '8'],
85
115
  run: (targetPath) => {
86
116
  const script = resolveGateScript('8');
87
117
  if (script) {
88
- execSync(`bash "${script}"`, { stdio: 'inherit' });
118
+ runBashScript(script);
89
119
  } else {
90
120
  console.log('Secret scanning requires git-staged context for changed files detection.');
91
121
  console.log('Run: git commit to trigger Gate 8 automatically.');
@@ -95,10 +125,11 @@ const GATE_REGISTRY = {
95
125
  '9': {
96
126
  name: 'SAST Security',
97
127
  description: 'semgrep static application security testing',
128
+ aliases: ['sast', 'semgrep', '9'],
98
129
  run: (targetPath) => {
99
130
  const script = resolveGateScript('9');
100
131
  if (script) {
101
- execSync(`bash "${script}"`, { stdio: 'inherit' });
132
+ runBashScript(script);
102
133
  } else {
103
134
  console.log('SAST scanning requires git-staged context for changed files detection.');
104
135
  console.log('Run: git commit to trigger Gate 9 automatically.');
@@ -108,17 +139,51 @@ const GATE_REGISTRY = {
108
139
  '10': {
109
140
  name: 'Build Integrity',
110
141
  description: 'TypeScript compilation, npm pack, and import validation',
142
+ aliases: ['build', '10'],
111
143
  preCommitOnly: true,
112
144
  reason: 'Build integrity checks require language detection and build tool context',
113
145
  },
114
146
  '11': {
115
147
  name: 'Sprint Flow Enforcement',
116
148
  description: 'Sprint state and delphi-review validation',
149
+ aliases: ['sprint', '11'],
117
150
  preCommitOnly: true,
118
151
  reason: 'Requires sprint state (.sprint-state/) and git branch context',
119
152
  },
120
153
  };
121
154
 
155
+ // Reverse-lookup: alias → gate ID (built once at module load)
156
+ const ALIAS_MAP = {};
157
+ (function buildAliasMap() {
158
+ for (const [id, info] of Object.entries(GATE_REGISTRY)) {
159
+ const aliases = Array.isArray(info.aliases) ? info.aliases : [];
160
+ for (const alias of aliases) {
161
+ ALIAS_MAP[String(alias).toLowerCase()] = id;
162
+ }
163
+ }
164
+ })();
165
+
166
+ /**
167
+ * Resolve a gate alias (name or number string) to its canonical gate ID.
168
+ * Returns null if no match.
169
+ */
170
+ function resolveAlias(maybeAlias) {
171
+ if (maybeAlias == null) return null;
172
+ const key = String(maybeAlias).toLowerCase();
173
+ // Direct numeric ID lookup
174
+ if (GATE_REGISTRY[key]) return key;
175
+ // Alias lookup
176
+ return ALIAS_MAP[key] || null;
177
+ }
178
+
179
+ /**
180
+ * Get all aliases for a given gate ID, or empty array.
181
+ */
182
+ function getAliases(gateId) {
183
+ const info = GATE_REGISTRY[String(gateId)];
184
+ return info && Array.isArray(info.aliases) ? info.aliases : [];
185
+ }
186
+
122
187
  function findConfig(basePath, fileName) {
123
188
  const candidates = [
124
189
  path.join(basePath || '.', fileName),
@@ -167,6 +232,7 @@ function getAllGates() {
167
232
  id,
168
233
  name: info.name,
169
234
  description: info.description,
235
+ aliases: Array.isArray(info.aliases) ? info.aliases : [],
170
236
  preCommitOnly: info.preCommitOnly || false,
171
237
  reason: info.reason || null,
172
238
  }));
@@ -206,4 +272,4 @@ async function runGate(gateId, targetPath) {
206
272
  return 1;
207
273
  }
208
274
 
209
- module.exports = { GATE_REGISTRY, getGateInfo, getAllGates, runGate };
275
+ module.exports = { GATE_REGISTRY, getGateInfo, getAllGates, runGate, resolveAlias, getAliases };
@@ -101,6 +101,8 @@ function backupExisting(targetDir, installId, backupDir) {
101
101
  if (fs.existsSync(targetDir)) {
102
102
  fs.mkdirSync(backupDir, { recursive: true });
103
103
  copyDirRecursive(targetDir, backupDir);
104
+ // CRITICAL: remove original BEFORE fresh install so old reference/ files don't leak through
105
+ fs.rmSync(targetDir, { recursive: true, force: true });
104
106
  }
105
107
  }
106
108
 
package/lib/ui-review.ts CHANGED
@@ -1,6 +1,6 @@
1
1
  import { execSync } from 'child_process';
2
- import { writeFileSync } from 'fs';
3
- import { join } from 'path';
2
+ import { writeFileSync, readdirSync, statSync } from 'fs';
3
+ import { join, relative, extname } from 'path';
4
4
  import { collectUiMatches, parseRenamedFile } from './ui-detector';
5
5
 
6
6
  const RESULT_FILE = '.ui-gate-result.json';
@@ -42,11 +42,31 @@ export function getFallbackFileList(): string[] {
42
42
  try {
43
43
  return parseFileList(execSync('git ls-files', { encoding: 'utf8' }).trim());
44
44
  } catch {
45
- const output = execSync(
46
- 'find . -maxdepth 3 -type f -name "*.ts" -o -name "*.html" -o -name "*.css" -o -name "*.scss" -o -name "*.tsx" -o -name "*.vue" -o -name "*.svelte" 2>/dev/null | grep -v node_modules | grep -v .git',
47
- { encoding: 'utf8' },
48
- ).trim();
49
- return parseFileList(output);
45
+ // Not a git repo — fall back to filesystem scan (cross-platform)
46
+ const UI_EXTENSIONS = new Set(['.ts', '.html', '.css', '.scss', '.tsx', '.vue', '.svelte']);
47
+ const results: string[] = [];
48
+
49
+ function walk(dir: string, depth: number) {
50
+ if (depth > 3) return;
51
+ try {
52
+ const entries = readdirSync(dir);
53
+ for (const entry of entries) {
54
+ if (entry === 'node_modules' || entry === '.git') continue;
55
+ const fullPath = join(dir, entry);
56
+ try {
57
+ const st = statSync(fullPath);
58
+ if (st.isDirectory()) {
59
+ walk(fullPath, depth + 1);
60
+ } else if (st.isFile() && UI_EXTENSIONS.has(extname(entry))) {
61
+ results.push(relative(process.cwd(), fullPath));
62
+ }
63
+ } catch { /* skip inaccessible entries */ }
64
+ }
65
+ } catch { /* skip inaccessible directories */ }
66
+ }
67
+
68
+ walk(process.cwd(), 0);
69
+ return results;
50
70
  }
51
71
  }
52
72
 
@@ -69,7 +89,11 @@ export function writeUiReviewResult(result: UiReviewResult, repoRoot: string = p
69
89
  }
70
90
 
71
91
  function getCurrentCommit(): string {
72
- return execSync('git rev-parse HEAD 2>/dev/null || echo "no-commit"', { encoding: 'utf8' }).trim();
92
+ try {
93
+ return execSync('git rev-parse HEAD', { encoding: 'utf8', stdio: ['pipe', 'pipe', 'pipe'] }).trim();
94
+ } catch {
95
+ return 'no-commit';
96
+ }
73
97
  }
74
98
 
75
99
  export function main(): void {
package/lib/upgrade.js CHANGED
@@ -80,6 +80,7 @@ async function handleApplyMode(result, pkgName) {
80
80
  try {
81
81
  const child = spawn('npm', ['install', '-g', `${pkgName}@${result.remote}`], {
82
82
  stdio: 'inherit',
83
+ shell: true,
83
84
  timeout: 120000,
84
85
  });
85
86
  await new Promise((resolve, reject) => {
@@ -125,7 +126,7 @@ async function upgradeOpenCodePlugin() {
125
126
  const hasPlugin = await hasOpenCodePlugin();
126
127
  if (!hasPlugin) return;
127
128
 
128
- const { stdout: versionOut } = await execAsync('npm list -g ' + OPENCODE_PLUGIN + ' --depth=0 --json 2>/dev/null');
129
+ const { stdout: versionOut } = await execAsync('npm list -g ' + OPENCODE_PLUGIN + ' --depth=0 --json');
129
130
  let currentVersion = '';
130
131
  try {
131
132
  const parsed = JSON.parse(versionOut);
@@ -138,6 +139,7 @@ async function upgradeOpenCodePlugin() {
138
139
 
139
140
  const child = spawn('npm', ['install', '-g', OPENCODE_PLUGIN + '@latest'], {
140
141
  stdio: 'pipe',
142
+ shell: true,
141
143
  timeout: 120000,
142
144
  });
143
145
  const exitCode = await new Promise((resolve) => {
@@ -156,6 +158,7 @@ function hasOpenCodePlugin() {
156
158
  return new Promise((resolve) => {
157
159
  const child = spawn('npm', ['list', '-g', OPENCODE_PLUGIN, '--depth=0'], {
158
160
  stdio: 'pipe',
161
+ shell: true,
159
162
  timeout: 10000,
160
163
  });
161
164
  child.on('close', (code) => resolve(code === 0));
@@ -1,9 +1,9 @@
1
1
  # SRC/MOCK-POLICY KNOWLEDGE BASE
2
2
 
3
- **Generated:** 2026-07-16
4
- **Commit:** 2f70dd5
3
+ **Generated:** 2026-07-18
4
+ **Commit:** 4724f8d
5
5
  **Branch:** main
6
- **Version:** 0.14.11.0
6
+ **Version:** 0.14.12.0
7
7
 
8
8
  ## OVERVIEW
9
9
  Mock layering policy enforcement — Gate M3 of pre-push hook. Ensures integration tests use real implementations for internal dependencies, mock external dependencies, and annotate pending mocks with removal plans. Combines project scope scanning, mock decision engine, and per-file validation into a single pipeline.
@@ -1,9 +1,9 @@
1
1
  # SRC/MUTATION KNOWLEDGE BASE
2
2
 
3
- **Generated:** 2026-07-16
4
- **Commit:** 2f70dd5
3
+ **Generated:** 2026-07-18
4
+ **Commit:** 4724f8d
5
5
  **Branch:** main
6
- **Version:** 0.14.11.0
6
+ **Version:** 0.14.12.0
7
7
 
8
8
  ## OVERVIEW
9
9
  **Gate M** (incremental mutation testing) + **Gate M2** helpers (test-layer detection used by `src/mock-policy/`). Pre-push quality gate. TypeScript-only; uses Stryker.
@@ -252,7 +252,7 @@ describe('PitestRunner', () => {
252
252
  expect(spawn).toHaveBeenCalledWith(join(tmpDir, 'gradlew'), ['pitest'], {
253
253
  cwd: tmpDir,
254
254
  stdio: 'pipe',
255
- shell: false,
255
+ shell: true,
256
256
  });
257
257
  expect(result.timedOut).toBe(false);
258
258
  expect(result.report).not.toBeNull();
@@ -140,7 +140,7 @@ describe('StrykerRunner', () => {
140
140
  '--mutate', 'src/a.ts',
141
141
  '--mutate', 'src/b.tsx',
142
142
  ],
143
- expect.objectContaining({ cwd: tmpDir, stdio: 'pipe', shell: false }),
143
+ expect.objectContaining({ cwd: tmpDir, stdio: 'pipe', shell: true }),
144
144
  );
145
145
 
146
146
  expect(result.timedOut).toBe(false);
@@ -47,7 +47,7 @@ export class GoMutantRunner implements MutationRunner {
47
47
 
48
48
  const child = spawn('gomutants', args, {
49
49
  stdio: 'pipe',
50
- shell: false,
50
+ shell: true,
51
51
  cwd: options.cwd,
52
52
  });
53
53
 
@@ -70,7 +70,7 @@ export class MutmutRunner implements MutationRunner {
70
70
  return new Promise((resolve) => {
71
71
  const child = spawn('mutmut', ['run'], {
72
72
  stdio: 'pipe',
73
- shell: false,
73
+ shell: true,
74
74
  cwd: options.cwd,
75
75
  });
76
76
 
@@ -137,7 +137,7 @@ export class PitestRunner implements MutationRunner {
137
137
  ],
138
138
  {
139
139
  stdio: 'pipe',
140
- shell: false,
140
+ shell: true,
141
141
  cwd: options.cwd,
142
142
  },
143
143
  );
@@ -190,7 +190,7 @@ export class PitestRunner implements MutationRunner {
190
190
 
191
191
  const child = spawn(gradleCmd, ['pitest'], {
192
192
  stdio: 'pipe',
193
- shell: false,
193
+ shell: true,
194
194
  cwd: options.cwd,
195
195
  });
196
196
 
@@ -25,7 +25,7 @@ export class StrykerRunner implements MutationRunner {
25
25
  const { spawnSync } = await import('child_process');
26
26
  const result = spawnSync('npx', ['stryker', '--version'], {
27
27
  stdio: 'pipe',
28
- shell: false,
28
+ shell: true,
29
29
  timeout: 5000,
30
30
  });
31
31
  return result.status !== null && result.status === 0;
@@ -46,7 +46,7 @@ export class StrykerRunner implements MutationRunner {
46
46
 
47
47
  const child = spawn('npx', args, {
48
48
  stdio: 'pipe',
49
- shell: false,
49
+ shell: true,
50
50
  cwd: options.cwd,
51
51
  });
52
52
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@boyingliu01/xp-gate",
3
- "version": "0.14.11",
3
+ "version": "0.14.13",
4
4
  "description": "AI-driven development workflow: 6 quality gates + Delphi review + Sprint Flow",
5
5
  "bin": {
6
6
  "xp-gate": "./bin/xp-gate.js"
@@ -38,7 +38,7 @@
38
38
  "node": ">=18.0.0"
39
39
  },
40
40
  "scripts": {
41
- "version": "node scripts/sync-package-content.js && git add -A skills/ plugins/ 2>/dev/null || true",
41
+ "version": "0.14.13",
42
42
  "prepack": "node scripts/sync-package-content.js",
43
43
  "test": "echo \"Run tests\" && exit 0"
44
44
  },
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "xp-gate",
3
- "version": "0.14.11",
3
+ "version": "0.14.12",
4
4
  "displayName": "XP-Gate",
5
5
  "description": "Extreme Programming quality gates + AI workflow skills for Claude Code. Includes 10 quality gates (Gate 0-9), Sprint Flow (11 phases), and Delphi multi-expert review (>=90% consensus).",
6
6
  "author": {
@@ -1,9 +1,9 @@
1
1
  # SKILLS/DELPHI-REVIEW KNOWLEDGE BASE
2
2
 
3
- **Generated:** 2026-07-16
4
- **Commit:** 2f70dd5
3
+ **Generated:** 2026-07-18
4
+ **Commit:** 4724f8d
5
5
  **Branch:** main
6
- **Version:** 0.14.11.0
6
+ **Version:** 0.14.12.0
7
7
 
8
8
  ## OVERVIEW
9
9
  Delphi Consensus Review — multi-round anonymous expert review (≥90% threshold, 3 experts from ≥2 providers, domestic models only). Supports design + code-walkthrough modes.
@@ -1,9 +1,9 @@
1
1
  # SKILLS/SPRINT-FLOW KNOWLEDGE BASE
2
2
 
3
- **Generated:** 2026-07-16
4
- **Commit:** 2f70dd5
3
+ **Generated:** 2026-07-18
4
+ **Commit:** 4724f8d
5
5
  **Branch:** main
6
- **Version:** 0.14.11.0
6
+ **Version:** 0.14.12.0
7
7
 
8
8
  ## OVERVIEW
9
9
  **6-phase** development pipeline (v2.0 compact redesign, Issue #290): PREP → DESIGN → BUILD → VERIFY → SHIP → CLOSE. Phase 3/6 BUILD default build mode is **ralph-loop** (REQ-level iteration, 40-67% token savings vs parallel). HARD-GATE between DESIGN (2/6) and BUILD (3/6): design must pass Delphi review (≥90% consensus) before any coding.
@@ -1,9 +1,9 @@
1
1
  # SKILLS/TEST-SPECIFICATION-ALIGNMENT KNOWLEDGE BASE
2
2
 
3
- **Generated:** 2026-07-16
4
- **Commit:** 2f70dd5
3
+ **Generated:** 2026-07-18
4
+ **Commit:** 4724f8d
5
5
  **Branch:** main
6
- **Version:** 0.14.11.0
6
+ **Version:** 0.14.12.0
7
7
 
8
8
  ## OVERVIEW
9
9
  Test-Specification Alignment Engine — two-stage validation ensuring tests accurately reflect requirements and design specs.
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@boyingliu01/opencode-plugin",
3
- "version": "0.14.11",
3
+ "version": "0.14.12",
4
4
  "type": "module",
5
5
  "main": "index.ts",
6
6
  "description": "XP-Gate quality gates + AI workflow skills + Sprint Flow TUI sidebar for OpenCode",
@@ -1,9 +1,9 @@
1
1
  # SKILLS/DELPHI-REVIEW KNOWLEDGE BASE
2
2
 
3
- **Generated:** 2026-07-16
4
- **Commit:** 2f70dd5
3
+ **Generated:** 2026-07-18
4
+ **Commit:** 4724f8d
5
5
  **Branch:** main
6
- **Version:** 0.14.11.0
6
+ **Version:** 0.14.12.0
7
7
 
8
8
  ## OVERVIEW
9
9
  Delphi Consensus Review — multi-round anonymous expert review (≥90% threshold, 3 experts from ≥2 providers, domestic models only). Supports design + code-walkthrough modes.
@@ -1,9 +1,9 @@
1
1
  # SKILLS/SPRINT-FLOW KNOWLEDGE BASE
2
2
 
3
- **Generated:** 2026-07-16
4
- **Commit:** 2f70dd5
3
+ **Generated:** 2026-07-18
4
+ **Commit:** 4724f8d
5
5
  **Branch:** main
6
- **Version:** 0.14.11.0
6
+ **Version:** 0.14.12.0
7
7
 
8
8
  ## OVERVIEW
9
9
  **6-phase** development pipeline (v2.0 compact redesign, Issue #290): PREP → DESIGN → BUILD → VERIFY → SHIP → CLOSE. Phase 3/6 BUILD default build mode is **ralph-loop** (REQ-level iteration, 40-67% token savings vs parallel). HARD-GATE between DESIGN (2/6) and BUILD (3/6): design must pass Delphi review (≥90% consensus) before any coding.
@@ -1,9 +1,9 @@
1
1
  # SKILLS/TEST-SPECIFICATION-ALIGNMENT KNOWLEDGE BASE
2
2
 
3
- **Generated:** 2026-07-16
4
- **Commit:** 2f70dd5
3
+ **Generated:** 2026-07-18
4
+ **Commit:** 4724f8d
5
5
  **Branch:** main
6
- **Version:** 0.14.11.0
6
+ **Version:** 0.14.12.0
7
7
 
8
8
  ## OVERVIEW
9
9
  Test-Specification Alignment Engine — two-stage validation ensuring tests accurately reflect requirements and design specs.
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "xp-gate",
3
- "version": "0.14.11",
3
+ "version": "0.14.12",
4
4
  "displayName": "XP-Gate",
5
5
  "description": "Extreme Programming quality gates + AI workflow skills for Qoder. Includes 10 quality gates (Gate 0-9), Sprint Flow (11 phases), and Delphi multi-expert review (>=90% consensus).",
6
6
  "author": {
@@ -1,9 +1,9 @@
1
1
  # SKILLS/DELPHI-REVIEW KNOWLEDGE BASE
2
2
 
3
- **Generated:** 2026-07-16
4
- **Commit:** 2f70dd5
3
+ **Generated:** 2026-07-18
4
+ **Commit:** 4724f8d
5
5
  **Branch:** main
6
- **Version:** 0.14.11.0
6
+ **Version:** 0.14.12.0
7
7
 
8
8
  ## OVERVIEW
9
9
  Delphi Consensus Review — multi-round anonymous expert review (≥90% threshold, 3 experts from ≥2 providers, domestic models only). Supports design + code-walkthrough modes.
@@ -1,9 +1,9 @@
1
1
  # SKILLS/SPRINT-FLOW KNOWLEDGE BASE
2
2
 
3
- **Generated:** 2026-07-16
4
- **Commit:** 2f70dd5
3
+ **Generated:** 2026-07-18
4
+ **Commit:** 4724f8d
5
5
  **Branch:** main
6
- **Version:** 0.14.11.0
6
+ **Version:** 0.14.12.0
7
7
 
8
8
  ## OVERVIEW
9
9
  **6-phase** development pipeline (v2.0 compact redesign, Issue #290): PREP → DESIGN → BUILD → VERIFY → SHIP → CLOSE. Phase 3/6 BUILD default build mode is **ralph-loop** (REQ-level iteration, 40-67% token savings vs parallel). HARD-GATE between DESIGN (2/6) and BUILD (3/6): design must pass Delphi review (≥90% consensus) before any coding.
@@ -1,9 +1,9 @@
1
1
  # SKILLS/TEST-SPECIFICATION-ALIGNMENT KNOWLEDGE BASE
2
2
 
3
- **Generated:** 2026-07-16
4
- **Commit:** 2f70dd5
3
+ **Generated:** 2026-07-18
4
+ **Commit:** 4724f8d
5
5
  **Branch:** main
6
- **Version:** 0.14.11.0
6
+ **Version:** 0.14.12.0
7
7
 
8
8
  ## OVERVIEW
9
9
  Test-Specification Alignment Engine — two-stage validation ensuring tests accurately reflect requirements and design specs.
@@ -1,9 +1,9 @@
1
1
  # PRINCIPLES CHECKER MODULE
2
2
 
3
- **Generated:** 2026-07-16
4
- **Commit:** 2f70dd5
3
+ **Generated:** 2026-07-18
4
+ **Commit:** 4724f8d
5
5
  **Branch:** main
6
- **Version:** 0.14.11.0
6
+ **Version:** 0.14.12.0
7
7
 
8
8
  ## OVERVIEW
9
9
  Clean Code & SOLID principles checker — **Gate 4** of pre-commit. 14 rules × 9 language adapters, SARIF 2.1.0 output. Houses the **Boy Scout Rule** enforcement engine (Gate 6) and warning-baseline storage.
@@ -569,6 +569,7 @@ describe('Boy Scout Rule Enforcement', () => {
569
569
  const result = spawnSync('npx', ['tsx', BOY_SCOUT_PATH, ...args], {
570
570
  cwd: cwd ?? process.cwd(),
571
571
  encoding: 'utf-8',
572
+ shell: true,
572
573
  env: { ...process.env, NODE_V8_COVERAGE: coverageDir },
573
574
  });
574
575
  return {
@@ -1,9 +1,9 @@
1
1
  # SKILLS/DELPHI-REVIEW KNOWLEDGE BASE
2
2
 
3
- **Generated:** 2026-07-16
4
- **Commit:** 2f70dd5
3
+ **Generated:** 2026-07-18
4
+ **Commit:** 4724f8d
5
5
  **Branch:** main
6
- **Version:** 0.14.11.0
6
+ **Version:** 0.14.12.0
7
7
 
8
8
  ## OVERVIEW
9
9
  Delphi Consensus Review — multi-round anonymous expert review (≥90% threshold, 3 experts from ≥2 providers, domestic models only). Supports design + code-walkthrough modes.
@@ -1,9 +1,9 @@
1
1
  # SKILLS/SPRINT-FLOW KNOWLEDGE BASE
2
2
 
3
- **Generated:** 2026-07-16
4
- **Commit:** 2f70dd5
3
+ **Generated:** 2026-07-18
4
+ **Commit:** 4724f8d
5
5
  **Branch:** main
6
- **Version:** 0.14.11.0
6
+ **Version:** 0.14.12.0
7
7
 
8
8
  ## OVERVIEW
9
9
  **6-phase** development pipeline (v2.0 compact redesign, Issue #290): PREP → DESIGN → BUILD → VERIFY → SHIP → CLOSE. Phase 3/6 BUILD default build mode is **ralph-loop** (REQ-level iteration, 40-67% token savings vs parallel). HARD-GATE between DESIGN (2/6) and BUILD (3/6): design must pass Delphi review (≥90% consensus) before any coding.
@@ -1,9 +1,9 @@
1
1
  # SKILLS/TEST-SPECIFICATION-ALIGNMENT KNOWLEDGE BASE
2
2
 
3
- **Generated:** 2026-07-16
4
- **Commit:** 2f70dd5
3
+ **Generated:** 2026-07-18
4
+ **Commit:** 4724f8d
5
5
  **Branch:** main
6
- **Version:** 0.14.11.0
6
+ **Version:** 0.14.12.0
7
7
 
8
8
  ## OVERVIEW
9
9
  Test-Specification Alignment Engine — two-stage validation ensuring tests accurately reflect requirements and design specs.