@boyingliu01/xp-gate 0.14.27 → 0.14.29

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 (63) hide show
  1. package/adapter-common.sh +0 -0
  2. package/adapters/cpp.sh +0 -0
  3. package/adapters/dart.sh +0 -0
  4. package/adapters/flutter.sh +0 -0
  5. package/adapters/go.sh +0 -0
  6. package/adapters/iac.sh +0 -0
  7. package/adapters/java.sh +0 -0
  8. package/adapters/kotlin.sh +0 -0
  9. package/adapters/objectivec.sh +0 -0
  10. package/adapters/plugins/book299-20132-python/scripts/install-gradle.sh +0 -0
  11. package/adapters/plugins/book299-20132-python/scripts/install-maven.sh +0 -0
  12. package/adapters/plugins/book299-4081-c/scripts/install-gradle.sh +0 -0
  13. package/adapters/plugins/book299-4081-c/scripts/install-maven.sh +0 -0
  14. package/adapters/plugins/book299-4083-javascriptes5/scripts/install-gradle.sh +0 -0
  15. package/adapters/plugins/book299-4083-javascriptes5/scripts/install-maven.sh +0 -0
  16. package/adapters/powershell.sh +0 -0
  17. package/adapters/python.sh +0 -0
  18. package/adapters/shell.sh +0 -0
  19. package/adapters/swift.sh +0 -0
  20. package/adapters/typescript.sh +0 -0
  21. package/bin/xp-gate.js +0 -0
  22. package/gate-3.sh +0 -0
  23. package/gate-4.sh +0 -0
  24. package/gate-7.sh +0 -0
  25. package/gate-8.sh +0 -0
  26. package/gate-9.sh +0 -0
  27. package/hooks/adapter-common.sh +0 -0
  28. package/hooks/gate-3.sh +0 -0
  29. package/hooks/gate-4.sh +0 -0
  30. package/hooks/gate-7.sh +0 -0
  31. package/hooks/gate-8.sh +0 -0
  32. package/hooks/gate-9.sh +0 -0
  33. package/hooks/pre-commit +0 -0
  34. package/hooks/pre-push +0 -0
  35. package/lib/__tests__/phase-transition.test.js +174 -174
  36. package/lib/phase-transition.js +211 -211
  37. package/mock-policy/AGENTS.md +2 -2
  38. package/mutation/AGENTS.md +2 -2
  39. package/package.json +2 -2
  40. package/plugins/claude-code/.claude-plugin/plugin.json +1 -1
  41. package/plugins/claude-code/bin/delphi-review-guard.sh +0 -0
  42. package/plugins/claude-code/bin/xp-gate-check +0 -0
  43. package/plugins/claude-code/skills/delphi-review/AGENTS.md +2 -2
  44. package/plugins/claude-code/skills/sprint-flow/AGENTS.md +2 -2
  45. package/plugins/claude-code/skills/test-specification-alignment/AGENTS.md +2 -2
  46. package/plugins/opencode/package.json +1 -1
  47. package/plugins/opencode/skills/delphi-review/AGENTS.md +2 -2
  48. package/plugins/opencode/skills/sprint-flow/AGENTS.md +2 -2
  49. package/plugins/opencode/skills/test-specification-alignment/AGENTS.md +2 -2
  50. package/plugins/qoder/agents/delphi-architecture.md +48 -48
  51. package/plugins/qoder/agents/delphi-feasibility.md +48 -48
  52. package/plugins/qoder/agents/delphi-technical.md +48 -48
  53. package/plugins/qoder/bin/sprint-flow-guard.sh +0 -0
  54. package/plugins/qoder/bin/xp-gate-check +0 -0
  55. package/plugins/qoder/plugin.json +1 -1
  56. package/plugins/qoder/skills/delphi-review/AGENTS.md +2 -2
  57. package/plugins/qoder/skills/sprint-flow/AGENTS.md +2 -2
  58. package/plugins/qoder/skills/test-specification-alignment/AGENTS.md +2 -2
  59. package/principles/AGENTS.md +2 -2
  60. package/scripts/delphi-external-review.cjs +432 -432
  61. package/skills/delphi-review/AGENTS.md +2 -2
  62. package/skills/sprint-flow/AGENTS.md +2 -2
  63. package/skills/test-specification-alignment/AGENTS.md +2 -2
@@ -1,211 +1,211 @@
1
- /**
2
- * xp-gate phase-transition — Programmatic sprint phase transition
3
- *
4
- * Resolves #338 (dashboard never auto-renders) and #146 (sprint-state enforcement).
5
- *
6
- * This CLI command is the programmatic entry point for sprint phase transitions.
7
- * The sprint-flow SKILL.md MUST instruct the orchestrator to call this command
8
- * after each phase completion, replacing text-level MUST instructions with
9
- * a concrete CLI invocation.
10
- *
11
- * Usage:
12
- * xp-gate phase-transition <phase> <status> [--outputs <json>] [--render]
13
- *
14
- * Examples:
15
- * xp-gate phase-transition 1 completed
16
- * xp-gate phase-transition 2 in_progress
17
- * xp-gate phase-transition 3 completed --outputs '{"spec":"path/to/spec.yaml"}'
18
- * xp-gate phase-transition 3 completed --render (auto-render dashboard)
19
- *
20
- * @module phase-transition
21
- */
22
-
23
- 'use strict';
24
-
25
- const path = require('path');
26
- const { SprintStateManager } = require('./sprint-state-manager');
27
-
28
- /**
29
- * Render ASCII dashboard from sprint state.
30
- * Reuses the formatSprintTable logic from sprint-status.
31
- * @param {object} state - Sprint state object
32
- * @returns {string} Rendered dashboard
33
- */
34
- function renderDashboard(state) {
35
- if (!state) return 'No sprint state found';
36
-
37
- const PHASE_NAMES = {
38
- '1': 'PREP', '2': 'DESIGN', '3': 'BUILD',
39
- '4': 'VERIFY', '5': 'SHIP', '6': 'CLOSE',
40
- };
41
-
42
- function statusIcon(status) {
43
- switch (status) {
44
- case 'completed': return '✅';
45
- case 'in_progress': return '🔄';
46
- case 'skipped': return '⏭️';
47
- case 'failed': return '❌';
48
- case 'paused': return '⏸️';
49
- default: return '⏳';
50
- }
51
- }
52
-
53
- function formatDuration(seconds) {
54
- if (seconds == null || seconds === 0) return '-';
55
- if (seconds < 60) return `${seconds}s`;
56
- const mins = Math.floor(seconds / 60);
57
- if (mins < 60) return `${mins}m`;
58
- const hrs = Math.floor(mins / 60);
59
- if (hrs < 24) return `${hrs}h ${mins % 60}m`;
60
- return `${Math.floor(hrs / 24)}d ${hrs % 24}h`;
61
- }
62
-
63
- const branch = state.isolation?.branch || 'unknown';
64
- const sprintId = state.id || 'unknown';
65
- const taskDesc = state.task_description || state.issue_title || '-';
66
- const overallStatus = state.status || 'running';
67
- const startedAt = state.started_at ? state.started_at.slice(0, 16).replace('T', ' ') : '-';
68
-
69
- // Build phase history lookup
70
- const historyLookup = {};
71
- if (Array.isArray(state.phase_history)) {
72
- for (const ph of state.phase_history) {
73
- historyLookup[String(ph.phase)] = ph;
74
- }
75
- }
76
-
77
- const currentPhase = state.phase || 1;
78
- const currentPhaseName = PHASE_NAMES[String(currentPhase)] || `Phase ${currentPhase}`;
79
-
80
- // Progress bar
81
- const completedCount = Object.values(historyLookup).filter(h => h.status === 'completed').length;
82
- const pct = Math.round((completedCount / 6) * 100);
83
- const filled = '█'.repeat(completedCount);
84
- const current = currentPhase <= 6 ? '▓' : '';
85
- const empty = '░'.repeat(Math.max(0, 6 - completedCount - (current ? 1 : 0)));
86
- const progressBar = `[${filled}${current}${empty}] ${pct}%`;
87
-
88
- // Build lines
89
- const lines = [];
90
- lines.push('+============================================================+');
91
- lines.push(`| SPRINT PROGRESS ${sprintId.padEnd(20)}|`);
92
- lines.push('+============================================================+');
93
- lines.push(`| 需求: ${(taskDesc).slice(0, 54).padEnd(54)}|`);
94
- lines.push(`| 分支: ${(branch).slice(0, 54).padEnd(54)}|`);
95
- lines.push(`| 状态: ${(overallStatus).slice(0, 15).padEnd(15)} 启动: ${startedAt.slice(0, 19).padEnd(19)}|`);
96
- lines.push('+============================================================+');
97
- lines.push('| |');
98
-
99
- for (let i = 1; i <= 6; i++) {
100
- const entry = historyLookup[String(i)];
101
- const icon = statusIcon(entry?.status || (i < currentPhase ? 'completed' : i === currentPhase ? 'in_progress' : 'pending'));
102
- const name = (PHASE_NAMES[String(i)] || `Phase ${i}`).padEnd(10);
103
- const dur = formatDuration(entry?.duration_seconds).padEnd(8);
104
- lines.push(`| ${icon} Phase ${i}/6 ${name} ${dur} |`);
105
- }
106
-
107
- lines.push('| |');
108
- lines.push(`| ${progressBar.padEnd(58)}|`);
109
- lines.push('+============================================================+');
110
- lines.push(`| > 当前: Phase ${currentPhase}/6 ${currentPhaseName}`.padEnd(59) + '|');
111
- lines.push(`| 状态: ${(entry_status(currentPhase, historyLookup)).padEnd(50)}|`);
112
- lines.push('+============================================================+');
113
-
114
- // Outputs section
115
- if (state.outputs && Object.keys(state.outputs).length > 0) {
116
- lines.push('| 输出物: |');
117
- for (const [key, val] of Object.entries(state.outputs)) {
118
- lines.push(`| ${(`${key}: ${val}`).slice(0, 55).padEnd(55)}|`);
119
- }
120
- lines.push('+============================================================+');
121
- }
122
-
123
- return lines.join('\n');
124
-
125
- function entry_status(phaseNum, lookup) {
126
- const e = lookup[String(phaseNum)];
127
- return e?.status || (phaseNum < currentPhase ? 'completed' : phaseNum === currentPhase ? 'in_progress' : 'pending');
128
- }
129
- }
130
-
131
- /**
132
- * CLI entry point for phase-transition command.
133
- * @param {string[]} args - CLI arguments
134
- * @returns {Promise<number>} Exit code
135
- */
136
- async function handlePhaseTransition(args = []) {
137
- if (args.includes('--help')) {
138
- console.log('Usage: xp-gate phase-transition <phase> <status> [options]');
139
- console.log('');
140
- console.log('Arguments:');
141
- console.log(' phase Phase number (1-6)');
142
- console.log(' status Status: in_progress | completed | skipped | failed | paused');
143
- console.log('');
144
- console.log('Options:');
145
- console.log(' --outputs <json> JSON object of outputs to record');
146
- console.log(' --render Render ASCII dashboard after transition');
147
- console.log(' --dir <path> Project directory (default: cwd)');
148
- console.log('');
149
- console.log('Examples:');
150
- console.log(' xp-gate phase-transition 1 completed');
151
- console.log(' xp-gate phase-transition 3 completed --render');
152
- console.log(' xp-gate phase-transition 2 in_progress --outputs \'{"spec":"path.yaml"}\'');
153
- return 0;
154
- }
155
-
156
- if (args.length < 2) {
157
- console.error('Error: Missing required arguments. Usage: xp-gate phase-transition <phase> <status>');
158
- return 1;
159
- }
160
-
161
- const phase = parseInt(args[0], 10);
162
- const status = args[1];
163
- const renderFlag = args.includes('--render');
164
- const dirIdx = args.indexOf('--dir');
165
- const projectDir = dirIdx >= 0 ? args[dirIdx + 1] : process.cwd();
166
-
167
- const outputsIdx = args.indexOf('--outputs');
168
- let outputs = {};
169
- if (outputsIdx >= 0 && args[outputsIdx + 1]) {
170
- try {
171
- outputs = JSON.parse(args[outputsIdx + 1]);
172
- } catch (err) {
173
- console.error(`Error: Invalid JSON for --outputs: ${err.message}`);
174
- return 1;
175
- }
176
- }
177
-
178
- // Validate inputs
179
- if (phase < 1 || phase > 6) {
180
- console.error(`Error: Phase must be 1-6, got ${phase}`);
181
- return 1;
182
- }
183
-
184
- const validStatuses = ['in_progress', 'completed', 'skipped', 'failed', 'paused'];
185
- if (!validStatuses.includes(status)) {
186
- console.error(`Error: Status must be one of: ${validStatuses.join(', ')}`);
187
- return 1;
188
- }
189
-
190
- // Execute transition
191
- try {
192
- const manager = new SprintStateManager(projectDir);
193
- const newState = manager.transitionPhase(phase, status, { outputs });
194
-
195
- console.log(`✅ Phase ${phase} transitioned to '${status}'`);
196
-
197
- // Auto-render dashboard if --render flag is set
198
- if (renderFlag) {
199
- console.log('');
200
- const dashboard = renderDashboard(newState);
201
- console.log(dashboard);
202
- }
203
-
204
- return 0;
205
- } catch (err) {
206
- console.error(`Error: Phase transition failed: ${err.message}`);
207
- return 1;
208
- }
209
- }
210
-
211
- module.exports = { handlePhaseTransition, renderDashboard };
1
+ /**
2
+ * xp-gate phase-transition — Programmatic sprint phase transition
3
+ *
4
+ * Resolves #338 (dashboard never auto-renders) and #146 (sprint-state enforcement).
5
+ *
6
+ * This CLI command is the programmatic entry point for sprint phase transitions.
7
+ * The sprint-flow SKILL.md MUST instruct the orchestrator to call this command
8
+ * after each phase completion, replacing text-level MUST instructions with
9
+ * a concrete CLI invocation.
10
+ *
11
+ * Usage:
12
+ * xp-gate phase-transition <phase> <status> [--outputs <json>] [--render]
13
+ *
14
+ * Examples:
15
+ * xp-gate phase-transition 1 completed
16
+ * xp-gate phase-transition 2 in_progress
17
+ * xp-gate phase-transition 3 completed --outputs '{"spec":"path/to/spec.yaml"}'
18
+ * xp-gate phase-transition 3 completed --render (auto-render dashboard)
19
+ *
20
+ * @module phase-transition
21
+ */
22
+
23
+ 'use strict';
24
+
25
+ const path = require('path');
26
+ const { SprintStateManager } = require('./sprint-state-manager');
27
+
28
+ /**
29
+ * Render ASCII dashboard from sprint state.
30
+ * Reuses the formatSprintTable logic from sprint-status.
31
+ * @param {object} state - Sprint state object
32
+ * @returns {string} Rendered dashboard
33
+ */
34
+ function renderDashboard(state) {
35
+ if (!state) return 'No sprint state found';
36
+
37
+ const PHASE_NAMES = {
38
+ '1': 'PREP', '2': 'DESIGN', '3': 'BUILD',
39
+ '4': 'VERIFY', '5': 'SHIP', '6': 'CLOSE',
40
+ };
41
+
42
+ function statusIcon(status) {
43
+ switch (status) {
44
+ case 'completed': return '✅';
45
+ case 'in_progress': return '🔄';
46
+ case 'skipped': return '⏭️';
47
+ case 'failed': return '❌';
48
+ case 'paused': return '⏸️';
49
+ default: return '⏳';
50
+ }
51
+ }
52
+
53
+ function formatDuration(seconds) {
54
+ if (seconds == null || seconds === 0) return '-';
55
+ if (seconds < 60) return `${seconds}s`;
56
+ const mins = Math.floor(seconds / 60);
57
+ if (mins < 60) return `${mins}m`;
58
+ const hrs = Math.floor(mins / 60);
59
+ if (hrs < 24) return `${hrs}h ${mins % 60}m`;
60
+ return `${Math.floor(hrs / 24)}d ${hrs % 24}h`;
61
+ }
62
+
63
+ const branch = state.isolation?.branch || 'unknown';
64
+ const sprintId = state.id || 'unknown';
65
+ const taskDesc = state.task_description || state.issue_title || '-';
66
+ const overallStatus = state.status || 'running';
67
+ const startedAt = state.started_at ? state.started_at.slice(0, 16).replace('T', ' ') : '-';
68
+
69
+ // Build phase history lookup
70
+ const historyLookup = {};
71
+ if (Array.isArray(state.phase_history)) {
72
+ for (const ph of state.phase_history) {
73
+ historyLookup[String(ph.phase)] = ph;
74
+ }
75
+ }
76
+
77
+ const currentPhase = state.phase || 1;
78
+ const currentPhaseName = PHASE_NAMES[String(currentPhase)] || `Phase ${currentPhase}`;
79
+
80
+ // Progress bar
81
+ const completedCount = Object.values(historyLookup).filter(h => h.status === 'completed').length;
82
+ const pct = Math.round((completedCount / 6) * 100);
83
+ const filled = '█'.repeat(completedCount);
84
+ const current = currentPhase <= 6 ? '▓' : '';
85
+ const empty = '░'.repeat(Math.max(0, 6 - completedCount - (current ? 1 : 0)));
86
+ const progressBar = `[${filled}${current}${empty}] ${pct}%`;
87
+
88
+ // Build lines
89
+ const lines = [];
90
+ lines.push('+============================================================+');
91
+ lines.push(`| SPRINT PROGRESS ${sprintId.padEnd(20)}|`);
92
+ lines.push('+============================================================+');
93
+ lines.push(`| 需求: ${(taskDesc).slice(0, 54).padEnd(54)}|`);
94
+ lines.push(`| 分支: ${(branch).slice(0, 54).padEnd(54)}|`);
95
+ lines.push(`| 状态: ${(overallStatus).slice(0, 15).padEnd(15)} 启动: ${startedAt.slice(0, 19).padEnd(19)}|`);
96
+ lines.push('+============================================================+');
97
+ lines.push('| |');
98
+
99
+ for (let i = 1; i <= 6; i++) {
100
+ const entry = historyLookup[String(i)];
101
+ const icon = statusIcon(entry?.status || (i < currentPhase ? 'completed' : i === currentPhase ? 'in_progress' : 'pending'));
102
+ const name = (PHASE_NAMES[String(i)] || `Phase ${i}`).padEnd(10);
103
+ const dur = formatDuration(entry?.duration_seconds).padEnd(8);
104
+ lines.push(`| ${icon} Phase ${i}/6 ${name} ${dur} |`);
105
+ }
106
+
107
+ lines.push('| |');
108
+ lines.push(`| ${progressBar.padEnd(58)}|`);
109
+ lines.push('+============================================================+');
110
+ lines.push(`| > 当前: Phase ${currentPhase}/6 ${currentPhaseName}`.padEnd(59) + '|');
111
+ lines.push(`| 状态: ${(entry_status(currentPhase, historyLookup)).padEnd(50)}|`);
112
+ lines.push('+============================================================+');
113
+
114
+ // Outputs section
115
+ if (state.outputs && Object.keys(state.outputs).length > 0) {
116
+ lines.push('| 输出物: |');
117
+ for (const [key, val] of Object.entries(state.outputs)) {
118
+ lines.push(`| ${(`${key}: ${val}`).slice(0, 55).padEnd(55)}|`);
119
+ }
120
+ lines.push('+============================================================+');
121
+ }
122
+
123
+ return lines.join('\n');
124
+
125
+ function entry_status(phaseNum, lookup) {
126
+ const e = lookup[String(phaseNum)];
127
+ return e?.status || (phaseNum < currentPhase ? 'completed' : phaseNum === currentPhase ? 'in_progress' : 'pending');
128
+ }
129
+ }
130
+
131
+ /**
132
+ * CLI entry point for phase-transition command.
133
+ * @param {string[]} args - CLI arguments
134
+ * @returns {Promise<number>} Exit code
135
+ */
136
+ async function handlePhaseTransition(args = []) {
137
+ if (args.includes('--help')) {
138
+ console.log('Usage: xp-gate phase-transition <phase> <status> [options]');
139
+ console.log('');
140
+ console.log('Arguments:');
141
+ console.log(' phase Phase number (1-6)');
142
+ console.log(' status Status: in_progress | completed | skipped | failed | paused');
143
+ console.log('');
144
+ console.log('Options:');
145
+ console.log(' --outputs <json> JSON object of outputs to record');
146
+ console.log(' --render Render ASCII dashboard after transition');
147
+ console.log(' --dir <path> Project directory (default: cwd)');
148
+ console.log('');
149
+ console.log('Examples:');
150
+ console.log(' xp-gate phase-transition 1 completed');
151
+ console.log(' xp-gate phase-transition 3 completed --render');
152
+ console.log(' xp-gate phase-transition 2 in_progress --outputs \'{"spec":"path.yaml"}\'');
153
+ return 0;
154
+ }
155
+
156
+ if (args.length < 2) {
157
+ console.error('Error: Missing required arguments. Usage: xp-gate phase-transition <phase> <status>');
158
+ return 1;
159
+ }
160
+
161
+ const phase = parseInt(args[0], 10);
162
+ const status = args[1];
163
+ const renderFlag = args.includes('--render');
164
+ const dirIdx = args.indexOf('--dir');
165
+ const projectDir = dirIdx >= 0 ? args[dirIdx + 1] : process.cwd();
166
+
167
+ const outputsIdx = args.indexOf('--outputs');
168
+ let outputs = {};
169
+ if (outputsIdx >= 0 && args[outputsIdx + 1]) {
170
+ try {
171
+ outputs = JSON.parse(args[outputsIdx + 1]);
172
+ } catch (err) {
173
+ console.error(`Error: Invalid JSON for --outputs: ${err.message}`);
174
+ return 1;
175
+ }
176
+ }
177
+
178
+ // Validate inputs
179
+ if (phase < 1 || phase > 6) {
180
+ console.error(`Error: Phase must be 1-6, got ${phase}`);
181
+ return 1;
182
+ }
183
+
184
+ const validStatuses = ['in_progress', 'completed', 'skipped', 'failed', 'paused'];
185
+ if (!validStatuses.includes(status)) {
186
+ console.error(`Error: Status must be one of: ${validStatuses.join(', ')}`);
187
+ return 1;
188
+ }
189
+
190
+ // Execute transition
191
+ try {
192
+ const manager = new SprintStateManager(projectDir);
193
+ const newState = manager.transitionPhase(phase, status, { outputs });
194
+
195
+ console.log(`✅ Phase ${phase} transitioned to '${status}'`);
196
+
197
+ // Auto-render dashboard if --render flag is set
198
+ if (renderFlag) {
199
+ console.log('');
200
+ const dashboard = renderDashboard(newState);
201
+ console.log(dashboard);
202
+ }
203
+
204
+ return 0;
205
+ } catch (err) {
206
+ console.error(`Error: Phase transition failed: ${err.message}`);
207
+ return 1;
208
+ }
209
+ }
210
+
211
+ module.exports = { handlePhaseTransition, renderDashboard };
@@ -1,9 +1,9 @@
1
1
  # SRC/MOCK-POLICY KNOWLEDGE BASE
2
2
 
3
3
  **Generated:** 2026-07-22
4
- **Commit:** f68e796
4
+ **Commit:** db2c068
5
5
  **Branch:** main
6
- **Version:** 0.14.27.0
6
+ **Version:** 0.14.29.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-07-22
4
- **Commit:** f68e796
4
+ **Commit:** db2c068
5
5
  **Branch:** main
6
- **Version:** 0.14.27.0
6
+ **Version:** 0.14.29.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.14.27",
3
+ "version": "0.14.29",
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"
@@ -39,7 +39,7 @@
39
39
  "node": ">=18.0.0"
40
40
  },
41
41
  "scripts": {
42
- "version": "0.14.27",
42
+ "version": "0.14.29",
43
43
  "prepack": "node scripts/sync-package-content.js",
44
44
  "test": "echo \"Run tests\" && exit 0"
45
45
  },
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "xp-gate",
3
- "version": "0.14.27",
3
+ "version": "0.14.29",
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": {
File without changes
File without changes
@@ -1,9 +1,9 @@
1
1
  # SKILLS/DELPHI-REVIEW KNOWLEDGE BASE
2
2
 
3
3
  **Generated:** 2026-07-22
4
- **Commit:** f68e796
4
+ **Commit:** db2c068
5
5
  **Branch:** main
6
- **Version:** 0.14.27.0
6
+ **Version:** 0.14.29.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
3
  **Generated:** 2026-07-22
4
- **Commit:** f68e796
4
+ **Commit:** db2c068
5
5
  **Branch:** main
6
- **Version:** 0.14.27.0
6
+ **Version:** 0.14.29.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-07-22
4
- **Commit:** f68e796
4
+ **Commit:** db2c068
5
5
  **Branch:** main
6
- **Version:** 0.14.27.0
6
+ **Version:** 0.14.29.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.27",
3
+ "version": "0.14.29",
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-07-22
4
- **Commit:** f68e796
4
+ **Commit:** db2c068
5
5
  **Branch:** main
6
- **Version:** 0.14.27.0
6
+ **Version:** 0.14.29.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
3
  **Generated:** 2026-07-22
4
- **Commit:** f68e796
4
+ **Commit:** db2c068
5
5
  **Branch:** main
6
- **Version:** 0.14.27.0
6
+ **Version:** 0.14.29.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-07-22
4
- **Commit:** f68e796
4
+ **Commit:** db2c068
5
5
  **Branch:** main
6
- **Version:** 0.14.27.0
6
+ **Version:** 0.14.29.0
7
7
 
8
8
  ## OVERVIEW
9
9
  Test-Specification Alignment Engine — two-stage validation ensuring tests accurately reflect requirements and design specs.