@boyingliu01/xp-gate 0.34.0 → 0.34.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 (33) hide show
  1. package/gate-13-compiler-strictness.sh +129 -4
  2. package/gate-4.sh +8 -1
  3. package/hooks/gate-13-compiler-strictness.sh +129 -4
  4. package/hooks/gate-4.sh +8 -1
  5. package/lib/__tests__/foreign-hooks-global.test.js +125 -0
  6. package/lib/__tests__/uninstall-global-residue.test.js +160 -0
  7. package/lib/doctor.js +70 -0
  8. package/lib/mattpocock-license-verdict.json +1 -1
  9. package/lib/uninstall.js +225 -1
  10. package/mock-policy/AGENTS.md +2 -2
  11. package/mutation/AGENTS.md +2 -2
  12. package/package.json +1 -1
  13. package/plugins/claude-code/.claude-plugin/plugin.json +1 -1
  14. package/plugins/claude-code/skills/delphi-review/AGENTS.md +2 -2
  15. package/plugins/claude-code/skills/sprint-flow/AGENTS.md +2 -2
  16. package/plugins/claude-code/skills/test-specification-alignment/AGENTS.md +2 -2
  17. package/plugins/dsh/package.json +1 -1
  18. package/plugins/dsh/skills/delphi-review/AGENTS.md +2 -2
  19. package/plugins/dsh/skills/sprint-flow/AGENTS.md +2 -2
  20. package/plugins/dsh/skills/test-specification-alignment/AGENTS.md +2 -2
  21. package/plugins/opencode/package.json +1 -1
  22. package/plugins/opencode/skills/delphi-review/AGENTS.md +2 -2
  23. package/plugins/opencode/skills/sprint-flow/AGENTS.md +2 -2
  24. package/plugins/opencode/skills/test-specification-alignment/AGENTS.md +2 -2
  25. package/plugins/qoder/plugin.json +1 -1
  26. package/plugins/qoder/skills/delphi-review/AGENTS.md +2 -2
  27. package/plugins/qoder/skills/sprint-flow/AGENTS.md +2 -2
  28. package/plugins/qoder/skills/test-specification-alignment/AGENTS.md +2 -2
  29. package/principles/AGENTS.md +2 -2
  30. package/principles/rules/solid/dip.ts +94 -14
  31. package/skills/delphi-review/AGENTS.md +2 -2
  32. package/skills/sprint-flow/AGENTS.md +2 -2
  33. package/skills/test-specification-alignment/AGENTS.md +2 -2
package/lib/doctor.js CHANGED
@@ -416,6 +416,75 @@ function pathsEquivalent(a, b) {
416
416
  */
417
417
  const DRIFT_COMPARED_HOOKS = ['pre-commit', 'pre-push', 'post-merge'];
418
418
 
419
+ /**
420
+ * Classify the contents of an installed hooks directory (#664).
421
+ *
422
+ * `setup-global` sets `core.hooksPath` GLOBALLY, so this directory governs every
423
+ * repository on the machine — and any tool that installs hooks by asking git where
424
+ * hooks live writes into it. `git lfs install` is the one that actually does this;
425
+ * the measured result was four entries xp-gate never installs appearing beside its
426
+ * own hooks. Nothing reported them, so the user had no way to learn their global
427
+ * install had acquired foreign hooks.
428
+ *
429
+ * Returns:
430
+ * owned — hook names xp-gate installs (the drift-compared set)
431
+ * support — xp-gate's own non-hook support entries (lib/, generated scripts)
432
+ * foreign — [{ name, source }] for everything else; `source` is 'git-lfs' when
433
+ * the file's content proves it, otherwise null. Guessing a source we
434
+ * cannot prove would send the user to the wrong tool.
435
+ */
436
+ function classifyHooksDir(hooksDir) {
437
+ const result = { owned: [], support: [], foreign: [] };
438
+ let entries;
439
+ try {
440
+ entries = fs.readdirSync(hooksDir, { withFileTypes: true });
441
+ } catch {
442
+ return result;
443
+ }
444
+
445
+ for (const entry of entries) {
446
+ const name = entry.name;
447
+ if (entry.isDirectory()) {
448
+ // lib/ is xp-gate's shared-library directory; any other subdirectory belongs
449
+ // to somebody else and is reported as foreign for the same reason a file is.
450
+ if (name === 'lib') {
451
+ result.support.push(name);
452
+ } else {
453
+ result.foreign.push({ name, source: null });
454
+ }
455
+ continue;
456
+ }
457
+ if (DRIFT_COMPARED_HOOKS.includes(name)) {
458
+ result.owned.push(name);
459
+ continue;
460
+ }
461
+ if (name.endsWith('.sh')) {
462
+ // Generated support scripts shipped beside the hooks (#505).
463
+ result.support.push(name);
464
+ continue;
465
+ }
466
+ result.foreign.push({ name, source: gitLfsHookSource(path.join(hooksDir, name)) });
467
+ }
468
+ return result;
469
+ }
470
+
471
+ /**
472
+ * 'git-lfs' when the file is a git-lfs hook, else null.
473
+ *
474
+ * Detected from content rather than filename: git-lfs installs several hook names
475
+ * and which ones depends on its version, so a name list would silently miss newer
476
+ * ones. The `git lfs <hook>` invocation is the signature.
477
+ */
478
+ function gitLfsHookSource(filePath) {
479
+ let body;
480
+ try {
481
+ body = fs.readFileSync(filePath, 'utf8');
482
+ } catch {
483
+ return null;
484
+ }
485
+ return /\bgit\s+lfs\b/.test(body) ? 'git-lfs' : null;
486
+ }
487
+
419
488
  /**
420
489
  * Non-hook files that must sit beside the installed hooks.
421
490
  *
@@ -3280,6 +3349,7 @@ module.exports = {
3280
3349
  readTuiJson,
3281
3350
  formatDoctorJson,
3282
3351
  diagnoseHookDrift,
3352
+ classifyHooksDir,
3283
3353
  syncGlobalHooksFromRepo,
3284
3354
  diagnoseModuleDrift,
3285
3355
  diagnoseAuditLedger,
@@ -2,6 +2,6 @@
2
2
  "verdict": "PASS",
3
3
  "license_type": "MIT",
4
4
  "sha256": "0e7ac423bf2c6e223b7c5b156f8cf72da49d748e56a1641402c31f22ad07dbb5",
5
- "checked_at": "2026-10-30T14:08:10.171Z",
5
+ "checked_at": "2026-10-30T14:53:53.917Z",
6
6
  "source": "network"
7
7
  }
package/lib/uninstall.js CHANGED
@@ -8,10 +8,41 @@ const {
8
8
  TEMPLATE_DIR,
9
9
  GLOBAL_HOOKS_DIR,
10
10
  GLOBAL_ADAPTERS_DIR,
11
+ GLOBAL_MODULES_DIR,
11
12
  } = require('./shared-paths.js');
12
13
 
13
14
  const BACKUP_DIR = path.join(CONFIG_DIR, '.uninstall-backup');
14
15
 
16
+ /**
17
+ * Skill directory roots the CLI installs into, per platform (mirror of the
18
+ * installers in install-skill.js). Read at call time so a test can point HOME at a
19
+ * throwaway tree.
20
+ */
21
+ function globalSkillRoots() {
22
+ return [
23
+ path.join(HOME_DIR(), '.qoder', 'skills'),
24
+ path.join(HOME_DIR(), '.config', 'opencode', 'skills'),
25
+ path.join(HOME_DIR(), '.claude', 'skills'),
26
+ ];
27
+ }
28
+
29
+ /**
30
+ * Directories inside ~/.config/xp-gate/ that `setup-global` creates and that
31
+ * `uninstall` used to leave behind (#663).
32
+ */
33
+ const GLOBAL_INSTALL_RESIDUE = [
34
+ { key: 'modules', label: 'modules/' },
35
+ { key: 'node_modules', label: 'node_modules/' },
36
+ { key: 'package.json', label: 'package.json' },
37
+ { key: 'package-lock.json', label: 'package-lock.json' },
38
+ { key: 'xp-gate.json', label: 'xp-gate.json' },
39
+ ];
40
+
41
+ /** User DATA that must survive an uninstall, and must be reported as retained. */
42
+ const GLOBAL_USER_DATA = [
43
+ { key: '.delphi-config.json', label: '.delphi-config.json (your Delphi expert config)' },
44
+ ];
45
+
15
46
  /**
16
47
  * Signature strings used to verify file ownership.
17
48
  * Each hook/adapter file contains a unique marker string.
@@ -276,6 +307,44 @@ function buildPlan(mode) {
276
307
  critical: true
277
308
  });
278
309
  }
310
+
311
+ // #663: `setup-global` also writes modules/, a node_modules/ tree, a
312
+ // package.json + package-lock.json and the xp-gate.json manifest. None of them
313
+ // were in the plan, so uninstall printed "Uninstall complete" over an
314
+ // installation that was still ~1000 files on disk. The residue is not
315
+ // cosmetic: a leftover node_modules/ makes the NEXT setup-global skip its own
316
+ // install and reuse a stale dependency tree, and a leftover xp-gate.json
317
+ // carries the previous version's manifest/lastInit into `doctor`, which then
318
+ // reports it as the current installation.
319
+ const configDir = CONFIG_DIR;
320
+ for (const item of GLOBAL_INSTALL_RESIDUE) {
321
+ const target = path.join(configDir, item.key);
322
+ if (fs.existsSync(target)) {
323
+ const isDir = fs.statSync(target).isDirectory();
324
+ plan.push({
325
+ type: isDir ? 'dir' : 'file',
326
+ path: target,
327
+ label: `~/.config/xp-gate/${item.label}`,
328
+ critical: false
329
+ });
330
+ }
331
+ }
332
+
333
+ // User data is deliberately NOT deleted. Reporting it is the second half of
334
+ // the fix: leaving it behind silently is how a user ends up with a stray
335
+ // config they cannot attribute.
336
+ for (const item of GLOBAL_USER_DATA) {
337
+ const target = path.join(configDir, item.key);
338
+ if (fs.existsSync(target)) {
339
+ plan.push({
340
+ type: 'retain',
341
+ retain: true,
342
+ path: target,
343
+ label: item.label,
344
+ critical: false
345
+ });
346
+ }
347
+ }
279
348
  }
280
349
 
281
350
  // Template dir is common to both modes
@@ -318,6 +387,30 @@ function removeFile(item, config) {
318
387
  */
319
388
  function removeDir(item) {
320
389
  if (!fs.existsSync(item.path)) return false;
390
+
391
+ // #664: the global `core.hooksPath` is a SHARED directory -- `git lfs install`
392
+ // writes its own hooks into it -- so a blind recursive delete of a hooks dir
393
+ // removes another tool's working files. Classify first; when foreign content is
394
+ // present, delete only xp-gate's own entries and say what was kept.
395
+ //
396
+ // Restricted to directories that ARE a hooks dir. The template dir and the
397
+ // adapters dir are wholly xp-gate-owned (the template legitimately contains an
398
+ // `adapters/` subdir, which would otherwise be read as foreign), so only a path
399
+ // that looks like a hooks root gets the conservative treatment.
400
+ const isHooksDir = /(^|[\/])hooks$/.test(item.path) || item.label.includes('hooks/');
401
+ const removal = isHooksDir ? planHooksDirRemoval(item.path) : { action: 'remove-all' };
402
+ if (removal.action === 'remove-owned-only') {
403
+ for (const name of removal.owned) {
404
+ fs.rmSync(path.join(item.path, name), { recursive: true, force: true });
405
+ }
406
+ try { fs.rmdirSync(item.path); } catch { /* non-empty: foreign files remain */ }
407
+ const sources = removal.foreign.map((f) => (f.source ? `${f.name} (${f.source})` : f.name));
408
+ console.log(` Removed xp-gate hooks from ${item.label}`);
409
+ console.log(` ⚠️ Kept ${removal.foreign.length} file(s) that are not xp-gate's: ${sources.join(', ')}`);
410
+ console.log(' The global core.hooksPath is a shared directory; other tools (e.g. git lfs) install here.');
411
+ return true;
412
+ }
413
+
321
414
  fs.rmSync(item.path, { recursive: true, force: true });
322
415
  console.log(` Removed ${item.label}`);
323
416
  return true;
@@ -528,4 +621,135 @@ async function uninstall(args) {
528
621
  return 0;
529
622
  }
530
623
 
531
- module.exports = { uninstall, isXpGateFile, SIGNATURES };
624
+ /**
625
+ * Decide which installed skill directories an uninstall may remove (#663).
626
+ *
627
+ * `uninstall` never touched skills at all, so 12 of them stayed in
628
+ * ~/.qoder/skills/ and ~/.config/opencode/skills/ after `uninstall --global`, and
629
+ * the next `init` treated them as already installed.
630
+ *
631
+ * Safety rule from the issue: only remove a directory whose content still matches
632
+ * the bundled copy. A user's edits are not residue, and deleting them is a far
633
+ * worse outcome than leaving a stale skill behind -- the user can always delete a
634
+ * leftover, but cannot recover an edit we removed.
635
+ *
636
+ * Returns [{ path, label }] for the directories that are safe to delete.
637
+ */
638
+ function planSkillRemovals(skillNames, installedRoot, bundledRoot) {
639
+ const removals = [];
640
+ if (!Array.isArray(skillNames)) return removals;
641
+
642
+ for (const name of skillNames) {
643
+ if (typeof name !== 'string' || !name) continue;
644
+ const installedDir = path.join(installedRoot, name);
645
+ const bundledDir = path.join(bundledRoot, name);
646
+ if (!fs.existsSync(installedDir)) continue;
647
+ // No bundled copy to compare against -> cannot prove it is untouched, so keep it.
648
+ if (!fs.existsSync(bundledDir)) continue;
649
+ if (directoryContentMatches(installedDir, bundledDir)) {
650
+ removals.push({ path: installedDir, label: `${installedRoot}/${name}/` });
651
+ }
652
+ }
653
+ return removals;
654
+ }
655
+
656
+ /**
657
+ * True when two directory trees hold the same files with the same bytes.
658
+ * Skips `.git` and node_modules, which are never part of a skill bundle.
659
+ */
660
+ function directoryContentMatches(a, b) {
661
+ const filesA = listFilesRelative(a);
662
+ const filesB = listFilesRelative(b);
663
+ if (filesA.length !== filesB.length) return false;
664
+ for (let i = 0; i < filesA.length; i++) {
665
+ if (filesA[i] !== filesB[i]) return false;
666
+ try {
667
+ if (!fs.readFileSync(path.join(a, filesA[i])).equals(fs.readFileSync(path.join(b, filesB[i])))) {
668
+ return false;
669
+ }
670
+ } catch {
671
+ return false;
672
+ }
673
+ }
674
+ return true;
675
+ }
676
+
677
+ /** Sorted relative file paths under a directory. */
678
+ function listFilesRelative(root) {
679
+ const out = [];
680
+ const walk = (dir, prefix) => {
681
+ let entries;
682
+ try {
683
+ entries = fs.readdirSync(dir, { withFileTypes: true });
684
+ } catch {
685
+ return;
686
+ }
687
+ for (const entry of entries) {
688
+ if (entry.name === '.git' || entry.name === 'node_modules') continue;
689
+ const rel = prefix ? `${prefix}/${entry.name}` : entry.name;
690
+ if (entry.isDirectory()) {
691
+ walk(path.join(dir, entry.name), rel);
692
+ } else {
693
+ out.push(rel);
694
+ }
695
+ }
696
+ };
697
+ walk(root, '');
698
+ return out.sort();
699
+ }
700
+
701
+ /**
702
+ * Decide how a hooks directory may be removed (#664).
703
+ *
704
+ * `uninstall` did `rmSync(GLOBAL_HOOKS_DIR, {recursive: true})`. The global
705
+ * `core.hooksPath` is a SHARED directory: `git lfs install` writes its own hooks
706
+ * there, and a recursive delete took them with it. The user then had a broken
707
+ * git-lfs setup and no idea which command caused it — deleting another tool's
708
+ * working files is a worse outcome than leaving residue the user can see.
709
+ *
710
+ * Returns:
711
+ * { action: 'remove-all', foreign: [] } — only xp-gate content, safe
712
+ * { action: 'remove-owned-only', foreign } — foreign files present, keep them
713
+ * { action: 'absent', foreign: [] } — nothing to do
714
+ */
715
+ function planHooksDirRemoval(hooksDir) {
716
+ if (!fs.existsSync(hooksDir)) return { action: 'absent', foreign: [] };
717
+
718
+ const foreign = [];
719
+ const owned = [];
720
+ let entries;
721
+ try {
722
+ entries = fs.readdirSync(hooksDir, { withFileTypes: true });
723
+ } catch {
724
+ // Unreadable is not "empty": report it as foreign so nothing is deleted blind.
725
+ return { action: 'remove-owned-only', foreign: [{ name: hooksDir, source: null }] };
726
+ }
727
+
728
+ for (const entry of entries) {
729
+ const name = entry.name;
730
+ // xp-gate's own hook entry points and support files.
731
+ if (OWNED_HOOK_NAMES.includes(name) || name.endsWith('.sh') || name === 'lib') {
732
+ owned.push(name);
733
+ } else {
734
+ foreign.push({ name, source: foreignHookSource(path.join(hooksDir, name)) });
735
+ }
736
+ }
737
+
738
+ return foreign.length > 0
739
+ ? { action: 'remove-owned-only', foreign, owned }
740
+ : { action: 'remove-all', foreign: [], owned };
741
+ }
742
+
743
+ /** Hook entry points xp-gate installs. */
744
+ const OWNED_HOOK_NAMES = ['pre-commit', 'pre-push', 'post-merge'];
745
+
746
+ /** 'git-lfs' when the file proves it, else null. Content-based: see doctor.js. */
747
+ function foreignHookSource(filePath) {
748
+ try {
749
+ return /\bgit\s+lfs\b/.test(fs.readFileSync(filePath, 'utf8')) ? 'git-lfs' : null;
750
+ } catch {
751
+ return null;
752
+ }
753
+ }
754
+
755
+ module.exports = { uninstall, isXpGateFile, SIGNATURES, buildPlan, planSkillRemovals, planHooksDirRemoval };
@@ -1,9 +1,9 @@
1
1
  # SRC/MOCK-POLICY KNOWLEDGE BASE
2
2
 
3
3
  **Generated:** 2026-10-30
4
- **Commit:** 6ac15e8c
4
+ **Commit:** e583bcfb
5
5
  **Branch:** main
6
- **Version:** 0.34.0.0
6
+ **Version:** 0.34.1.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
3
  **Generated:** 2026-10-30
4
- **Commit:** 6ac15e8c
4
+ **Commit:** e583bcfb
5
5
  **Branch:** main
6
- **Version:** 0.34.0.0
6
+ **Version:** 0.34.1.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.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@boyingliu01/xp-gate",
3
- "version": "0.34.0",
3
+ "version": "0.34.1",
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"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "xp-gate",
3
- "version": "0.34.0",
3
+ "version": "0.34.1",
4
4
  "displayName": "XP-Gate",
5
5
  "description": "Extreme Programming quality gates + AI workflow skills for Claude Code. Includes 12 pre-commit gates (Gate 0-11), 8 pre-push gates, Sprint Flow (6 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
3
  **Generated:** 2026-10-30
4
- **Commit:** 6ac15e8c
4
+ **Commit:** e583bcfb
5
5
  **Branch:** main
6
- **Version:** 0.34.0.0
6
+ **Version:** 0.34.1.0
7
7
 
8
8
  ## OVERVIEW
9
9
  Delphi Consensus Review — multi-round anonymous expert review (≥90% threshold, exactly 3 experts with distinct executable model IDs). Supports design, requirements, and code-walkthrough modes.
@@ -1,9 +1,9 @@
1
1
  # SKILLS/SPRINT-FLOW KNOWLEDGE BASE
2
2
 
3
3
  **Generated:** 2026-10-30
4
- **Commit:** 6ac15e8c
4
+ **Commit:** e583bcfb
5
5
  **Branch:** main
6
- **Version:** 0.34.0.0
6
+ **Version:** 0.34.1.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
3
  **Generated:** 2026-10-30
4
- **Commit:** 6ac15e8c
4
+ **Commit:** e583bcfb
5
5
  **Branch:** main
6
- **Version:** 0.34.0.0
6
+ **Version:** 0.34.1.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/dsh-plugin-xp-gate",
3
- "version": "0.34.0",
3
+ "version": "0.34.1",
4
4
  "description": "XP-Gate deterministic quality gates + AI workflow skills as a DeepSeek Harness (DSH) native plugin: gate-check / gate-principles / gate-arch tools + 12 SKILL.md skills",
5
5
  "type": "module",
6
6
  "main": "./lib/index.js",
@@ -1,9 +1,9 @@
1
1
  # SKILLS/DELPHI-REVIEW KNOWLEDGE BASE
2
2
 
3
3
  **Generated:** 2026-10-30
4
- **Commit:** 6ac15e8c
4
+ **Commit:** e583bcfb
5
5
  **Branch:** main
6
- **Version:** 0.34.0.0
6
+ **Version:** 0.34.1.0
7
7
 
8
8
  ## OVERVIEW
9
9
  Delphi Consensus Review — multi-round anonymous expert review (≥90% threshold, exactly 3 experts with distinct executable model IDs). Supports design, requirements, and code-walkthrough modes.
@@ -1,9 +1,9 @@
1
1
  # SKILLS/SPRINT-FLOW KNOWLEDGE BASE
2
2
 
3
3
  **Generated:** 2026-10-30
4
- **Commit:** 6ac15e8c
4
+ **Commit:** e583bcfb
5
5
  **Branch:** main
6
- **Version:** 0.34.0.0
6
+ **Version:** 0.34.1.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
3
  **Generated:** 2026-10-30
4
- **Commit:** 6ac15e8c
4
+ **Commit:** e583bcfb
5
5
  **Branch:** main
6
- **Version:** 0.34.0.0
6
+ **Version:** 0.34.1.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.34.0",
3
+ "version": "0.34.1",
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
3
  **Generated:** 2026-10-30
4
- **Commit:** 6ac15e8c
4
+ **Commit:** e583bcfb
5
5
  **Branch:** main
6
- **Version:** 0.34.0.0
6
+ **Version:** 0.34.1.0
7
7
 
8
8
  ## OVERVIEW
9
9
  Delphi Consensus Review — multi-round anonymous expert review (≥90% threshold, exactly 3 experts with distinct executable model IDs). Supports design, requirements, and code-walkthrough modes.
@@ -1,9 +1,9 @@
1
1
  # SKILLS/SPRINT-FLOW KNOWLEDGE BASE
2
2
 
3
3
  **Generated:** 2026-10-30
4
- **Commit:** 6ac15e8c
4
+ **Commit:** e583bcfb
5
5
  **Branch:** main
6
- **Version:** 0.34.0.0
6
+ **Version:** 0.34.1.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
3
  **Generated:** 2026-10-30
4
- **Commit:** 6ac15e8c
4
+ **Commit:** e583bcfb
5
5
  **Branch:** main
6
- **Version:** 0.34.0.0
6
+ **Version:** 0.34.1.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.34.0",
3
+ "version": "0.34.1",
4
4
  "displayName": "XP-Gate",
5
5
  "description": "Extreme Programming quality gates + AI workflow skills for Qoder. Includes 12 pre-commit gates (Gate 0-11), 8 pre-push gates, Sprint Flow (6 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
3
  **Generated:** 2026-10-30
4
- **Commit:** 6ac15e8c
4
+ **Commit:** e583bcfb
5
5
  **Branch:** main
6
- **Version:** 0.34.0.0
6
+ **Version:** 0.34.1.0
7
7
 
8
8
  ## OVERVIEW
9
9
  Delphi Consensus Review — multi-round anonymous expert review (≥90% threshold, exactly 3 experts with distinct executable model IDs). Supports design, requirements, and code-walkthrough modes.
@@ -1,9 +1,9 @@
1
1
  # SKILLS/SPRINT-FLOW KNOWLEDGE BASE
2
2
 
3
3
  **Generated:** 2026-10-30
4
- **Commit:** 6ac15e8c
4
+ **Commit:** e583bcfb
5
5
  **Branch:** main
6
- **Version:** 0.34.0.0
6
+ **Version:** 0.34.1.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
3
  **Generated:** 2026-10-30
4
- **Commit:** 6ac15e8c
4
+ **Commit:** e583bcfb
5
5
  **Branch:** main
6
- **Version:** 0.34.0.0
6
+ **Version:** 0.34.1.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
3
  **Generated:** 2026-10-30
4
- **Commit:** 6ac15e8c
4
+ **Commit:** e583bcfb
5
5
  **Branch:** main
6
- **Version:** 0.34.0.0
6
+ **Version:** 0.34.1.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.