@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.
- package/bin/xp-gate.js +13 -2
- package/build-integrity/__tests__/gate-10.test.ts +41 -18
- package/build-integrity/__tests__/orchestrator.test.ts +16 -2
- package/build-integrity/gate-10.ts +46 -10
- package/gate-8.sh +1 -1
- package/hooks/pre-commit +56 -1
- package/lib/__tests__/doctor.test.js +99 -7
- package/lib/__tests__/install-skill.test.js +3 -2
- package/lib/__tests__/sprint-discovery.test.ts +1 -1
- package/lib/__tests__/ui-detector.test.ts +1 -0
- package/lib/__tests__/ui-review.test.ts +19 -6
- package/lib/__tests__/update-hooks.test.js +6 -1
- package/lib/check.js +59 -18
- package/lib/doctor.js +281 -54
- package/lib/gate-runner.js +73 -7
- package/lib/install-skill.js +2 -0
- package/lib/ui-review.ts +32 -8
- package/lib/upgrade.js +4 -1
- package/mock-policy/AGENTS.md +3 -3
- package/mutation/AGENTS.md +3 -3
- package/mutation/__tests__/pitest-runner.test.ts +1 -1
- package/mutation/__tests__/stryker-runner.test.ts +1 -1
- package/mutation/runners/go-mutant-runner.ts +1 -1
- package/mutation/runners/mutmut-runner.ts +1 -1
- package/mutation/runners/pitest-runner.ts +2 -2
- package/mutation/runners/stryker-runner.ts +2 -2
- package/package.json +2 -2
- package/plugins/claude-code/.claude-plugin/plugin.json +1 -1
- package/plugins/claude-code/skills/delphi-review/AGENTS.md +3 -3
- package/plugins/claude-code/skills/sprint-flow/AGENTS.md +3 -3
- package/plugins/claude-code/skills/test-specification-alignment/AGENTS.md +3 -3
- package/plugins/opencode/package.json +1 -1
- package/plugins/opencode/skills/delphi-review/AGENTS.md +3 -3
- package/plugins/opencode/skills/sprint-flow/AGENTS.md +3 -3
- package/plugins/opencode/skills/test-specification-alignment/AGENTS.md +3 -3
- package/plugins/qoder/plugin.json +1 -1
- package/plugins/qoder/skills/delphi-review/AGENTS.md +3 -3
- package/plugins/qoder/skills/sprint-flow/AGENTS.md +3 -3
- package/plugins/qoder/skills/test-specification-alignment/AGENTS.md +3 -3
- package/principles/AGENTS.md +3 -3
- package/principles/__tests__/boy-scout.test.ts +1 -0
- package/skills/delphi-review/AGENTS.md +3 -3
- package/skills/sprint-flow/AGENTS.md +3 -3
- package/skills/test-specification-alignment/AGENTS.md +3 -3
package/lib/gate-runner.js
CHANGED
|
@@ -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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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 };
|
package/lib/install-skill.js
CHANGED
|
@@ -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
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
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
|
-
|
|
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
|
|
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));
|
package/mock-policy/AGENTS.md
CHANGED
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
# SRC/MOCK-POLICY KNOWLEDGE BASE
|
|
2
2
|
|
|
3
|
-
**Generated:** 2026-07-
|
|
4
|
-
**Commit:**
|
|
3
|
+
**Generated:** 2026-07-18
|
|
4
|
+
**Commit:** 4724f8d
|
|
5
5
|
**Branch:** main
|
|
6
|
-
**Version:** 0.14.
|
|
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.
|
package/mutation/AGENTS.md
CHANGED
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
# SRC/MUTATION KNOWLEDGE BASE
|
|
2
2
|
|
|
3
|
-
**Generated:** 2026-07-
|
|
4
|
-
**Commit:**
|
|
3
|
+
**Generated:** 2026-07-18
|
|
4
|
+
**Commit:** 4724f8d
|
|
5
5
|
**Branch:** main
|
|
6
|
-
**Version:** 0.14.
|
|
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:
|
|
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:
|
|
143
|
+
expect.objectContaining({ cwd: tmpDir, stdio: 'pipe', shell: true }),
|
|
144
144
|
);
|
|
145
145
|
|
|
146
146
|
expect(result.timedOut).toBe(false);
|
|
@@ -137,7 +137,7 @@ export class PitestRunner implements MutationRunner {
|
|
|
137
137
|
],
|
|
138
138
|
{
|
|
139
139
|
stdio: 'pipe',
|
|
140
|
-
shell:
|
|
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:
|
|
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:
|
|
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:
|
|
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.
|
|
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": "
|
|
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.
|
|
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-
|
|
4
|
-
**Commit:**
|
|
3
|
+
**Generated:** 2026-07-18
|
|
4
|
+
**Commit:** 4724f8d
|
|
5
5
|
**Branch:** main
|
|
6
|
-
**Version:** 0.14.
|
|
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-
|
|
4
|
-
**Commit:**
|
|
3
|
+
**Generated:** 2026-07-18
|
|
4
|
+
**Commit:** 4724f8d
|
|
5
5
|
**Branch:** main
|
|
6
|
-
**Version:** 0.14.
|
|
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-
|
|
4
|
-
**Commit:**
|
|
3
|
+
**Generated:** 2026-07-18
|
|
4
|
+
**Commit:** 4724f8d
|
|
5
5
|
**Branch:** main
|
|
6
|
-
**Version:** 0.14.
|
|
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
|
# SKILLS/DELPHI-REVIEW KNOWLEDGE BASE
|
|
2
2
|
|
|
3
|
-
**Generated:** 2026-07-
|
|
4
|
-
**Commit:**
|
|
3
|
+
**Generated:** 2026-07-18
|
|
4
|
+
**Commit:** 4724f8d
|
|
5
5
|
**Branch:** main
|
|
6
|
-
**Version:** 0.14.
|
|
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-
|
|
4
|
-
**Commit:**
|
|
3
|
+
**Generated:** 2026-07-18
|
|
4
|
+
**Commit:** 4724f8d
|
|
5
5
|
**Branch:** main
|
|
6
|
-
**Version:** 0.14.
|
|
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-
|
|
4
|
-
**Commit:**
|
|
3
|
+
**Generated:** 2026-07-18
|
|
4
|
+
**Commit:** 4724f8d
|
|
5
5
|
**Branch:** main
|
|
6
|
-
**Version:** 0.14.
|
|
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.
|
|
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-
|
|
4
|
-
**Commit:**
|
|
3
|
+
**Generated:** 2026-07-18
|
|
4
|
+
**Commit:** 4724f8d
|
|
5
5
|
**Branch:** main
|
|
6
|
-
**Version:** 0.14.
|
|
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-
|
|
4
|
-
**Commit:**
|
|
3
|
+
**Generated:** 2026-07-18
|
|
4
|
+
**Commit:** 4724f8d
|
|
5
5
|
**Branch:** main
|
|
6
|
-
**Version:** 0.14.
|
|
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-
|
|
4
|
-
**Commit:**
|
|
3
|
+
**Generated:** 2026-07-18
|
|
4
|
+
**Commit:** 4724f8d
|
|
5
5
|
**Branch:** main
|
|
6
|
-
**Version:** 0.14.
|
|
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.
|
package/principles/AGENTS.md
CHANGED
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
# PRINCIPLES CHECKER MODULE
|
|
2
2
|
|
|
3
|
-
**Generated:** 2026-07-
|
|
4
|
-
**Commit:**
|
|
3
|
+
**Generated:** 2026-07-18
|
|
4
|
+
**Commit:** 4724f8d
|
|
5
5
|
**Branch:** main
|
|
6
|
-
**Version:** 0.14.
|
|
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-
|
|
4
|
-
**Commit:**
|
|
3
|
+
**Generated:** 2026-07-18
|
|
4
|
+
**Commit:** 4724f8d
|
|
5
5
|
**Branch:** main
|
|
6
|
-
**Version:** 0.14.
|
|
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-
|
|
4
|
-
**Commit:**
|
|
3
|
+
**Generated:** 2026-07-18
|
|
4
|
+
**Commit:** 4724f8d
|
|
5
5
|
**Branch:** main
|
|
6
|
-
**Version:** 0.14.
|
|
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-
|
|
4
|
-
**Commit:**
|
|
3
|
+
**Generated:** 2026-07-18
|
|
4
|
+
**Commit:** 4724f8d
|
|
5
5
|
**Branch:** main
|
|
6
|
-
**Version:** 0.14.
|
|
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.
|