surrogate-protocol-mcp 2.0.0
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/LICENSE.md +30 -0
- package/README.md +198 -0
- package/dist/__tests__/gates.test.d.ts +2 -0
- package/dist/__tests__/gates.test.d.ts.map +1 -0
- package/dist/__tests__/gates.test.js +342 -0
- package/dist/__tests__/gates.test.js.map +1 -0
- package/dist/__tests__/observability.test.d.ts +2 -0
- package/dist/__tests__/observability.test.d.ts.map +1 -0
- package/dist/__tests__/observability.test.js +382 -0
- package/dist/__tests__/observability.test.js.map +1 -0
- package/dist/__tests__/state.test.d.ts +2 -0
- package/dist/__tests__/state.test.d.ts.map +1 -0
- package/dist/__tests__/state.test.js +415 -0
- package/dist/__tests__/state.test.js.map +1 -0
- package/dist/agent-runner.d.ts +3 -0
- package/dist/agent-runner.d.ts.map +1 -0
- package/dist/agent-runner.js +419 -0
- package/dist/agent-runner.js.map +1 -0
- package/dist/cli.d.ts +3 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +763 -0
- package/dist/cli.js.map +1 -0
- package/dist/mcp-server.d.ts +3 -0
- package/dist/mcp-server.d.ts.map +1 -0
- package/dist/mcp-server.js +1382 -0
- package/dist/mcp-server.js.map +1 -0
- package/dist/utils/agent.d.ts +42 -0
- package/dist/utils/agent.d.ts.map +1 -0
- package/dist/utils/agent.js +231 -0
- package/dist/utils/agent.js.map +1 -0
- package/dist/utils/artifacts.d.ts +92 -0
- package/dist/utils/artifacts.d.ts.map +1 -0
- package/dist/utils/artifacts.js +338 -0
- package/dist/utils/artifacts.js.map +1 -0
- package/dist/utils/capsule.d.ts +28 -0
- package/dist/utils/capsule.d.ts.map +1 -0
- package/dist/utils/capsule.js +462 -0
- package/dist/utils/capsule.js.map +1 -0
- package/dist/utils/diagnostics.d.ts +62 -0
- package/dist/utils/diagnostics.d.ts.map +1 -0
- package/dist/utils/diagnostics.js +404 -0
- package/dist/utils/diagnostics.js.map +1 -0
- package/dist/utils/gates.d.ts +78 -0
- package/dist/utils/gates.d.ts.map +1 -0
- package/dist/utils/gates.js +661 -0
- package/dist/utils/gates.js.map +1 -0
- package/dist/utils/logging.d.ts +53 -0
- package/dist/utils/logging.d.ts.map +1 -0
- package/dist/utils/logging.js +187 -0
- package/dist/utils/logging.js.map +1 -0
- package/dist/utils/project-gates.d.ts +73 -0
- package/dist/utils/project-gates.d.ts.map +1 -0
- package/dist/utils/project-gates.js +520 -0
- package/dist/utils/project-gates.js.map +1 -0
- package/dist/utils/reconcile.d.ts +50 -0
- package/dist/utils/reconcile.d.ts.map +1 -0
- package/dist/utils/reconcile.js +262 -0
- package/dist/utils/reconcile.js.map +1 -0
- package/dist/utils/state.d.ts +241 -0
- package/dist/utils/state.d.ts.map +1 -0
- package/dist/utils/state.js +865 -0
- package/dist/utils/state.js.map +1 -0
- package/dist/utils/worktree.d.ts +27 -0
- package/dist/utils/worktree.d.ts.map +1 -0
- package/dist/utils/worktree.js +275 -0
- package/dist/utils/worktree.js.map +1 -0
- package/package.json +65 -0
package/LICENSE.md
ADDED
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
# Surrogate Protocol MCP License
|
|
2
|
+
|
|
3
|
+
© 2025 DETA Entertainment Studios. All rights reserved.
|
|
4
|
+
|
|
5
|
+
## Terms of Use
|
|
6
|
+
|
|
7
|
+
This software is proprietary and confidential.
|
|
8
|
+
|
|
9
|
+
### Permitted Use
|
|
10
|
+
- Personal and educational use
|
|
11
|
+
- Internal development and testing
|
|
12
|
+
- Non-commercial projects
|
|
13
|
+
|
|
14
|
+
### Prohibited Without Written Permission
|
|
15
|
+
- Commercial use or deployment
|
|
16
|
+
- Redistribution or sublicensing
|
|
17
|
+
- Publishing to package registries (NPM, etc.)
|
|
18
|
+
- Modification and redistribution of derivative works
|
|
19
|
+
|
|
20
|
+
### Disclaimer
|
|
21
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
22
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
23
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
24
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
25
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
26
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
27
|
+
SOFTWARE.
|
|
28
|
+
|
|
29
|
+
### Contact
|
|
30
|
+
For commercial licensing inquiries, please contact DETA Entertainment Studios.
|
package/README.md
ADDED
|
@@ -0,0 +1,198 @@
|
|
|
1
|
+
# Surrogate Protocol MCP Server
|
|
2
|
+
|
|
3
|
+
A Model Context Protocol (MCP) server for multi-agent coding orchestration. Enables Claude Code to spawn autonomous coding agents with isolated worktrees, file locks, and validation gates.
|
|
4
|
+
|
|
5
|
+
## Features
|
|
6
|
+
|
|
7
|
+
- **Isolated Worktrees**: Each agent gets its own git worktree for parallel work
|
|
8
|
+
- **File Locking**: Prevents conflicts when multiple agents work simultaneously
|
|
9
|
+
- **Validation Gates**: Automatic testing, type-checking, linting, and building
|
|
10
|
+
- **Session Recovery**: Reconcile and recover from crashes
|
|
11
|
+
- **Observability**: Detailed logs and reports for debugging
|
|
12
|
+
|
|
13
|
+
## Installation
|
|
14
|
+
|
|
15
|
+
### From GitHub (Recommended)
|
|
16
|
+
|
|
17
|
+
Add to your Claude Code `.mcp.json`:
|
|
18
|
+
|
|
19
|
+
```json
|
|
20
|
+
{
|
|
21
|
+
"mcpServers": {
|
|
22
|
+
"surrogate-protocol": {
|
|
23
|
+
"command": "npx",
|
|
24
|
+
"args": [
|
|
25
|
+
"-y",
|
|
26
|
+
"github.com/NeMeJP/surrogate-protocol-mcp"
|
|
27
|
+
]
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
```
|
|
32
|
+
|
|
33
|
+
Replace `YOUR_USERNAME` with your GitHub username.
|
|
34
|
+
|
|
35
|
+
### Local Development
|
|
36
|
+
|
|
37
|
+
```bash
|
|
38
|
+
git clone https://github.com/NeMeJP/surrogate-protocol-mcp.git
|
|
39
|
+
cd surrogate-protocol-mcp
|
|
40
|
+
npm install
|
|
41
|
+
npm run build
|
|
42
|
+
npm link
|
|
43
|
+
```
|
|
44
|
+
|
|
45
|
+
Then in `.mcp.json`:
|
|
46
|
+
|
|
47
|
+
```json
|
|
48
|
+
{
|
|
49
|
+
"mcpServers": {
|
|
50
|
+
"surrogate-protocol": {
|
|
51
|
+
"command": "node",
|
|
52
|
+
"args": ["/path/to/surrogate-protocol-mcp/dist/mcp-server.js"]
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
```
|
|
57
|
+
|
|
58
|
+
## Usage
|
|
59
|
+
|
|
60
|
+
### Basic Workflow
|
|
61
|
+
|
|
62
|
+
1. **Check Status**: `get_status()` - Always call first
|
|
63
|
+
2. **Spawn Agent**: `spawn_surrogate(id, role, task, files_to_lock)`
|
|
64
|
+
3. **Monitor**: `get_status()` to check progress
|
|
65
|
+
4. **Complete**: Agent auto-submits when done (runs validation gates)
|
|
66
|
+
|
|
67
|
+
### Available Tools
|
|
68
|
+
|
|
69
|
+
| Tool | Purpose |
|
|
70
|
+
|------|---------|
|
|
71
|
+
| `get_status()` | Get current state, active surrogates, locked files |
|
|
72
|
+
| `spawn_surrogate()` | Create and start a new agent |
|
|
73
|
+
| `update_surrogate_status()` | Update agent progress status |
|
|
74
|
+
| `submit_work()` | Complete task (runs validation gates) |
|
|
75
|
+
| `fail_surrogate()` | Mark agent as failed and release locks |
|
|
76
|
+
| `check_file_locks()` | Check if files are locked before spawning |
|
|
77
|
+
| `reconcile_surrogates()` | Recover from crashes and sync state |
|
|
78
|
+
| `get_surrogate_logs()` | Get detailed logs for debugging |
|
|
79
|
+
| `get_surrogate_report()` | Get completion report with git stats |
|
|
80
|
+
| `clean_zombies()` | Clean up orphaned worktrees |
|
|
81
|
+
|
|
82
|
+
### Example: Multi-Agent Task
|
|
83
|
+
|
|
84
|
+
```javascript
|
|
85
|
+
// 1. Check current state
|
|
86
|
+
get_status()
|
|
87
|
+
|
|
88
|
+
// 2. Check file availability
|
|
89
|
+
check_file_locks(['src/auth.ts', 'src/api/login.ts'])
|
|
90
|
+
|
|
91
|
+
// 3. Spawn first agent
|
|
92
|
+
spawn_surrogate({
|
|
93
|
+
id: 'auth-01',
|
|
94
|
+
role: 'security-engineer',
|
|
95
|
+
task: 'Implement JWT authentication',
|
|
96
|
+
files_to_lock: ['src/auth.ts', 'src/middleware/verify.ts']
|
|
97
|
+
})
|
|
98
|
+
|
|
99
|
+
// 4. Spawn second agent (different files)
|
|
100
|
+
spawn_surrogate({
|
|
101
|
+
id: 'api-01',
|
|
102
|
+
role: 'backend-dev',
|
|
103
|
+
task: 'Add API rate limiting',
|
|
104
|
+
files_to_lock: ['src/api/middleware.ts']
|
|
105
|
+
})
|
|
106
|
+
|
|
107
|
+
// 5. Monitor progress
|
|
108
|
+
get_status()
|
|
109
|
+
|
|
110
|
+
// Agents work autonomously and submit when complete!
|
|
111
|
+
```
|
|
112
|
+
|
|
113
|
+
## Validation Gates
|
|
114
|
+
|
|
115
|
+
When an agent calls `submit_work()`, these gates run automatically:
|
|
116
|
+
|
|
117
|
+
1. **Rebase** - Sync with main branch
|
|
118
|
+
2. **Tests** - Run test suite (project-aware: npm test, pytest, etc.)
|
|
119
|
+
3. **Type Check** - TypeScript or mypy validation
|
|
120
|
+
4. **Lint** - Code style checks (warnings only)
|
|
121
|
+
5. **Build** - Compilation check
|
|
122
|
+
6. **Security** - Dependency audit (warnings only)
|
|
123
|
+
|
|
124
|
+
If any critical gate fails, the submission is rejected and the agent must fix issues.
|
|
125
|
+
|
|
126
|
+
## Requirements
|
|
127
|
+
|
|
128
|
+
- Node.js 18+
|
|
129
|
+
- Git
|
|
130
|
+
- Claude CLI (`claude` command) for autonomous agents
|
|
131
|
+
|
|
132
|
+
## Configuration
|
|
133
|
+
|
|
134
|
+
Optional environment variables:
|
|
135
|
+
|
|
136
|
+
```bash
|
|
137
|
+
# Claude CLI binary path (if not in PATH)
|
|
138
|
+
export CLAUDE_BINARY_PATH=/path/to/claude
|
|
139
|
+
|
|
140
|
+
# Auto-cleanup worktrees on completion
|
|
141
|
+
export SURROGATE_CLEANUP_ON_COMPLETE=true
|
|
142
|
+
```
|
|
143
|
+
|
|
144
|
+
## Project Structure
|
|
145
|
+
|
|
146
|
+
```
|
|
147
|
+
surrogate-protocol-mcp/
|
|
148
|
+
├── src/
|
|
149
|
+
│ ├── mcp-server.ts # Main MCP server
|
|
150
|
+
│ ├── utils/
|
|
151
|
+
│ │ ├── state.ts # State management
|
|
152
|
+
│ │ ├── worktree.ts # Git worktree operations
|
|
153
|
+
│ │ ├── gates.ts # Validation gates
|
|
154
|
+
│ │ ├── agent.ts # Agent spawning
|
|
155
|
+
│ │ ├── logging.ts # Structured logging
|
|
156
|
+
│ │ └── artifacts.ts # Reports and markers
|
|
157
|
+
├── dist/ # Compiled JavaScript
|
|
158
|
+
├── package.json
|
|
159
|
+
└── tsconfig.json
|
|
160
|
+
```
|
|
161
|
+
|
|
162
|
+
## Troubleshooting
|
|
163
|
+
|
|
164
|
+
### "Surrogate not found"
|
|
165
|
+
Run `reconcile_surrogates()` to sync state after crashes.
|
|
166
|
+
|
|
167
|
+
### "File lock conflict"
|
|
168
|
+
Another agent owns those files. Wait for completion or choose different files.
|
|
169
|
+
|
|
170
|
+
### "GATE_FAILED"
|
|
171
|
+
Fix the issues reported in the error message and call `submit_work()` again.
|
|
172
|
+
|
|
173
|
+
### Zombie worktrees
|
|
174
|
+
Run `clean_zombies()` to remove orphaned worktrees.
|
|
175
|
+
|
|
176
|
+
## Development
|
|
177
|
+
|
|
178
|
+
```bash
|
|
179
|
+
# Build
|
|
180
|
+
npm run build
|
|
181
|
+
|
|
182
|
+
# Watch mode
|
|
183
|
+
npm run dev
|
|
184
|
+
|
|
185
|
+
# Run tests
|
|
186
|
+
npm test
|
|
187
|
+
|
|
188
|
+
# Lint
|
|
189
|
+
npm run lint
|
|
190
|
+
```
|
|
191
|
+
|
|
192
|
+
## License
|
|
193
|
+
|
|
194
|
+
MIT
|
|
195
|
+
|
|
196
|
+
## Author
|
|
197
|
+
|
|
198
|
+
DETA Entertainment Studios
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"gates.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/gates.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,342 @@
|
|
|
1
|
+
// Tests for utils/gates.ts - Validation gates
|
|
2
|
+
import * as fs from 'fs';
|
|
3
|
+
import * as path from 'path';
|
|
4
|
+
import { execSync } from 'child_process';
|
|
5
|
+
import { runRebaseGate, runTestGate, runTypeCheckGate, runLintGate, runBuildGate, runSecurityGate, runAllGates, commitChanges, } from '../utils/gates.js';
|
|
6
|
+
// Test fixtures directory
|
|
7
|
+
const TEST_DIR = path.join(process.cwd(), '.gates-test');
|
|
8
|
+
describe('Validation Gates', () => {
|
|
9
|
+
// Helper to create a minimal test project
|
|
10
|
+
function createTestProject(options = {}) {
|
|
11
|
+
const { withTsConfig = false, withPackageJson = true, withTestScript = false, withBuildScript = false, withLintConfig = false, } = options;
|
|
12
|
+
if (withPackageJson) {
|
|
13
|
+
const scripts = {};
|
|
14
|
+
if (withTestScript) {
|
|
15
|
+
scripts.test = 'echo "Tests passed"';
|
|
16
|
+
}
|
|
17
|
+
if (withBuildScript) {
|
|
18
|
+
scripts.build = 'echo "Build complete"';
|
|
19
|
+
}
|
|
20
|
+
if (withLintConfig) {
|
|
21
|
+
scripts.lint = 'echo "Lint passed"';
|
|
22
|
+
}
|
|
23
|
+
fs.writeFileSync(path.join(TEST_DIR, 'package.json'), JSON.stringify({
|
|
24
|
+
name: 'test-project',
|
|
25
|
+
version: '1.0.0',
|
|
26
|
+
scripts,
|
|
27
|
+
}, null, 2));
|
|
28
|
+
}
|
|
29
|
+
if (withTsConfig) {
|
|
30
|
+
fs.writeFileSync(path.join(TEST_DIR, 'tsconfig.json'), JSON.stringify({
|
|
31
|
+
compilerOptions: {
|
|
32
|
+
target: 'ES2022',
|
|
33
|
+
module: 'NodeNext',
|
|
34
|
+
strict: true,
|
|
35
|
+
noEmit: true,
|
|
36
|
+
},
|
|
37
|
+
include: ['src/**/*'],
|
|
38
|
+
}, null, 2));
|
|
39
|
+
fs.mkdirSync(path.join(TEST_DIR, 'src'), { recursive: true });
|
|
40
|
+
fs.writeFileSync(path.join(TEST_DIR, 'src', 'index.ts'), 'export const hello = "world";\n');
|
|
41
|
+
}
|
|
42
|
+
if (withLintConfig) {
|
|
43
|
+
fs.writeFileSync(path.join(TEST_DIR, '.eslintrc.js'), 'module.exports = { rules: {} };');
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
// Helper to init git repo
|
|
47
|
+
function initGitRepo() {
|
|
48
|
+
execSync('git init', { cwd: TEST_DIR, stdio: 'pipe' });
|
|
49
|
+
execSync('git config user.email "test@test.com"', { cwd: TEST_DIR, stdio: 'pipe' });
|
|
50
|
+
execSync('git config user.name "Test"', { cwd: TEST_DIR, stdio: 'pipe' });
|
|
51
|
+
// Create initial commit
|
|
52
|
+
fs.writeFileSync(path.join(TEST_DIR, 'README.md'), '# Test');
|
|
53
|
+
execSync('git add .', { cwd: TEST_DIR, stdio: 'pipe' });
|
|
54
|
+
execSync('git commit -m "Initial commit"', { cwd: TEST_DIR, stdio: 'pipe' });
|
|
55
|
+
}
|
|
56
|
+
beforeEach(() => {
|
|
57
|
+
// Clean test directory before each test
|
|
58
|
+
if (fs.existsSync(TEST_DIR)) {
|
|
59
|
+
fs.rmSync(TEST_DIR, { recursive: true, force: true });
|
|
60
|
+
}
|
|
61
|
+
fs.mkdirSync(TEST_DIR, { recursive: true });
|
|
62
|
+
});
|
|
63
|
+
afterEach(() => {
|
|
64
|
+
if (fs.existsSync(TEST_DIR)) {
|
|
65
|
+
fs.rmSync(TEST_DIR, { recursive: true, force: true });
|
|
66
|
+
}
|
|
67
|
+
});
|
|
68
|
+
describe('GateResult interface', () => {
|
|
69
|
+
it('should have required fields', () => {
|
|
70
|
+
const result = {
|
|
71
|
+
gate: 'TEST',
|
|
72
|
+
passed: true,
|
|
73
|
+
duration_ms: 100,
|
|
74
|
+
};
|
|
75
|
+
expect(result.gate).toBe('TEST');
|
|
76
|
+
expect(result.passed).toBe(true);
|
|
77
|
+
expect(result.duration_ms).toBe(100);
|
|
78
|
+
});
|
|
79
|
+
it('should allow optional fields', () => {
|
|
80
|
+
const result = {
|
|
81
|
+
gate: 'BUILD',
|
|
82
|
+
passed: false,
|
|
83
|
+
error: 'Build failed',
|
|
84
|
+
output: 'Some output',
|
|
85
|
+
duration_ms: 200,
|
|
86
|
+
};
|
|
87
|
+
expect(result.error).toBe('Build failed');
|
|
88
|
+
expect(result.output).toBe('Some output');
|
|
89
|
+
});
|
|
90
|
+
});
|
|
91
|
+
describe('runTestGate', () => {
|
|
92
|
+
it('should pass when test script succeeds', () => {
|
|
93
|
+
createTestProject({ withTestScript: true });
|
|
94
|
+
const result = runTestGate(TEST_DIR);
|
|
95
|
+
expect(result.gate).toBe('TEST');
|
|
96
|
+
expect(result.passed).toBe(true);
|
|
97
|
+
expect(result.duration_ms).toBeGreaterThanOrEqual(0);
|
|
98
|
+
});
|
|
99
|
+
it('should fail when no test script exists', () => {
|
|
100
|
+
createTestProject({ withTestScript: false });
|
|
101
|
+
const result = runTestGate(TEST_DIR);
|
|
102
|
+
expect(result.gate).toBe('TEST');
|
|
103
|
+
expect(result.passed).toBe(false);
|
|
104
|
+
expect(result.error).toBeDefined();
|
|
105
|
+
});
|
|
106
|
+
});
|
|
107
|
+
describe('runTypeCheckGate', () => {
|
|
108
|
+
it('should skip when no tsconfig.json exists', () => {
|
|
109
|
+
createTestProject({ withTsConfig: false });
|
|
110
|
+
const result = runTypeCheckGate(TEST_DIR);
|
|
111
|
+
expect(result.gate).toBe('TYPECHECK');
|
|
112
|
+
expect(result.passed).toBe(true);
|
|
113
|
+
expect(result.output).toContain('Skipped');
|
|
114
|
+
});
|
|
115
|
+
it('should pass for valid TypeScript', () => {
|
|
116
|
+
createTestProject({ withTsConfig: true });
|
|
117
|
+
const result = runTypeCheckGate(TEST_DIR);
|
|
118
|
+
expect(result.gate).toBe('TYPECHECK');
|
|
119
|
+
expect(result.passed).toBe(true);
|
|
120
|
+
});
|
|
121
|
+
it('should fail for invalid TypeScript', () => {
|
|
122
|
+
createTestProject({ withTsConfig: true });
|
|
123
|
+
// Write invalid TypeScript
|
|
124
|
+
fs.writeFileSync(path.join(TEST_DIR, 'src', 'bad.ts'), 'const x: number = "not a number";\n');
|
|
125
|
+
const result = runTypeCheckGate(TEST_DIR);
|
|
126
|
+
expect(result.gate).toBe('TYPECHECK');
|
|
127
|
+
expect(result.passed).toBe(false);
|
|
128
|
+
expect(result.error).toBeDefined();
|
|
129
|
+
});
|
|
130
|
+
});
|
|
131
|
+
describe('runLintGate', () => {
|
|
132
|
+
it('should be non-blocking by default', () => {
|
|
133
|
+
createTestProject({ withLintConfig: false });
|
|
134
|
+
const result = runLintGate(TEST_DIR, false);
|
|
135
|
+
// Even if lint fails, non-blocking should "pass"
|
|
136
|
+
expect(result.gate).toBe('LINT');
|
|
137
|
+
// With no lint script, it will fail but be non-blocking
|
|
138
|
+
});
|
|
139
|
+
it('should fail when blocking and lint fails', () => {
|
|
140
|
+
createTestProject({ withPackageJson: true });
|
|
141
|
+
// No lint script, so it will fail
|
|
142
|
+
fs.writeFileSync(path.join(TEST_DIR, 'package.json'), JSON.stringify({
|
|
143
|
+
name: 'test',
|
|
144
|
+
scripts: {
|
|
145
|
+
lint: 'exit 1', // Force failure
|
|
146
|
+
},
|
|
147
|
+
}));
|
|
148
|
+
const result = runLintGate(TEST_DIR, true);
|
|
149
|
+
expect(result.gate).toBe('LINT');
|
|
150
|
+
expect(result.passed).toBe(false);
|
|
151
|
+
});
|
|
152
|
+
});
|
|
153
|
+
describe('runBuildGate', () => {
|
|
154
|
+
it('should skip when no package.json exists', () => {
|
|
155
|
+
createTestProject({ withPackageJson: false });
|
|
156
|
+
const result = runBuildGate(TEST_DIR);
|
|
157
|
+
expect(result.gate).toBe('BUILD');
|
|
158
|
+
expect(result.passed).toBe(true);
|
|
159
|
+
expect(result.output).toContain('Skipped');
|
|
160
|
+
});
|
|
161
|
+
it('should skip when no build script exists', () => {
|
|
162
|
+
createTestProject({ withBuildScript: false });
|
|
163
|
+
const result = runBuildGate(TEST_DIR);
|
|
164
|
+
expect(result.gate).toBe('BUILD');
|
|
165
|
+
expect(result.passed).toBe(true);
|
|
166
|
+
expect(result.output).toContain('Skipped');
|
|
167
|
+
});
|
|
168
|
+
it('should pass when build script succeeds', () => {
|
|
169
|
+
createTestProject({ withBuildScript: true });
|
|
170
|
+
const result = runBuildGate(TEST_DIR);
|
|
171
|
+
expect(result.gate).toBe('BUILD');
|
|
172
|
+
expect(result.passed).toBe(true);
|
|
173
|
+
});
|
|
174
|
+
it('should fail when build script fails', () => {
|
|
175
|
+
fs.writeFileSync(path.join(TEST_DIR, 'package.json'), JSON.stringify({
|
|
176
|
+
name: 'test',
|
|
177
|
+
scripts: {
|
|
178
|
+
build: 'exit 1',
|
|
179
|
+
},
|
|
180
|
+
}));
|
|
181
|
+
const result = runBuildGate(TEST_DIR);
|
|
182
|
+
expect(result.gate).toBe('BUILD');
|
|
183
|
+
expect(result.passed).toBe(false);
|
|
184
|
+
});
|
|
185
|
+
});
|
|
186
|
+
describe('runSecurityGate', () => {
|
|
187
|
+
it('should be non-blocking', () => {
|
|
188
|
+
createTestProject({ withPackageJson: true });
|
|
189
|
+
const result = runSecurityGate(TEST_DIR);
|
|
190
|
+
expect(result.gate).toBe('SECURITY');
|
|
191
|
+
// Security gate is always non-blocking, so passed should be true
|
|
192
|
+
// even if audit finds issues (or fails to run)
|
|
193
|
+
expect(typeof result.passed).toBe('boolean');
|
|
194
|
+
});
|
|
195
|
+
});
|
|
196
|
+
describe('commitChanges', () => {
|
|
197
|
+
it('should stage and commit changes', () => {
|
|
198
|
+
createTestProject({});
|
|
199
|
+
initGitRepo();
|
|
200
|
+
// Create a new file
|
|
201
|
+
fs.writeFileSync(path.join(TEST_DIR, 'new-file.txt'), 'content');
|
|
202
|
+
const result = commitChanges(TEST_DIR, 'Add new file');
|
|
203
|
+
expect(result.success).toBe(true);
|
|
204
|
+
// Verify commit exists
|
|
205
|
+
const log = execSync('git log --oneline -1', {
|
|
206
|
+
cwd: TEST_DIR,
|
|
207
|
+
encoding: 'utf8',
|
|
208
|
+
});
|
|
209
|
+
expect(log).toContain('Add new file');
|
|
210
|
+
});
|
|
211
|
+
it('should succeed with no changes to commit', () => {
|
|
212
|
+
createTestProject({});
|
|
213
|
+
initGitRepo();
|
|
214
|
+
const result = commitChanges(TEST_DIR, 'Empty commit');
|
|
215
|
+
expect(result.success).toBe(true);
|
|
216
|
+
});
|
|
217
|
+
});
|
|
218
|
+
describe('runAllGates', () => {
|
|
219
|
+
it('should run all gates in order', async () => {
|
|
220
|
+
createTestProject({
|
|
221
|
+
withTestScript: true,
|
|
222
|
+
withBuildScript: true,
|
|
223
|
+
});
|
|
224
|
+
initGitRepo();
|
|
225
|
+
const result = await runAllGates(TEST_DIR, {
|
|
226
|
+
skipRebase: true, // Skip rebase since we don't have remote
|
|
227
|
+
});
|
|
228
|
+
expect(result.gates.length).toBeGreaterThan(0);
|
|
229
|
+
// Check gates are present
|
|
230
|
+
const gateNames = result.gates.map((g) => g.gate);
|
|
231
|
+
expect(gateNames).toContain('TEST');
|
|
232
|
+
expect(gateNames).toContain('BUILD');
|
|
233
|
+
});
|
|
234
|
+
it('should stop on first critical failure', async () => {
|
|
235
|
+
createTestProject({
|
|
236
|
+
withTestScript: false, // Will cause TEST to fail
|
|
237
|
+
withBuildScript: true,
|
|
238
|
+
});
|
|
239
|
+
initGitRepo();
|
|
240
|
+
const result = await runAllGates(TEST_DIR, {
|
|
241
|
+
skipRebase: true,
|
|
242
|
+
});
|
|
243
|
+
expect(result.all_passed).toBe(false);
|
|
244
|
+
expect(result.summary).toContain('TEST');
|
|
245
|
+
// Should not have run BUILD after TEST failed
|
|
246
|
+
const buildGate = result.gates.find((g) => g.gate === 'BUILD');
|
|
247
|
+
expect(buildGate).toBeUndefined();
|
|
248
|
+
});
|
|
249
|
+
it('should respect skip options', async () => {
|
|
250
|
+
createTestProject({});
|
|
251
|
+
initGitRepo();
|
|
252
|
+
const result = await runAllGates(TEST_DIR, {
|
|
253
|
+
skipRebase: true,
|
|
254
|
+
skipTests: true,
|
|
255
|
+
skipTypecheck: true,
|
|
256
|
+
skipLint: true,
|
|
257
|
+
skipBuild: true,
|
|
258
|
+
skipSecurity: true,
|
|
259
|
+
});
|
|
260
|
+
expect(result.all_passed).toBe(true);
|
|
261
|
+
// Policy gates (CLEAN_TREE, HAS_CHANGES) always run - only validation gates can be skipped
|
|
262
|
+
expect(result.gates).toHaveLength(2);
|
|
263
|
+
expect(result.gates.map(g => g.gate)).toEqual(['CLEAN_TREE', 'HAS_CHANGES']);
|
|
264
|
+
});
|
|
265
|
+
it('should include duration in summary', async () => {
|
|
266
|
+
createTestProject({ withTestScript: true, withBuildScript: true });
|
|
267
|
+
initGitRepo();
|
|
268
|
+
const result = await runAllGates(TEST_DIR, {
|
|
269
|
+
skipRebase: true,
|
|
270
|
+
skipTypecheck: true,
|
|
271
|
+
skipLint: true,
|
|
272
|
+
skipSecurity: true,
|
|
273
|
+
});
|
|
274
|
+
expect(result.summary).toMatch(/\d+ms/);
|
|
275
|
+
});
|
|
276
|
+
});
|
|
277
|
+
describe('Gate ordering', () => {
|
|
278
|
+
it('should run gates in correct order', async () => {
|
|
279
|
+
createTestProject({
|
|
280
|
+
withTestScript: true,
|
|
281
|
+
withTsConfig: true,
|
|
282
|
+
withBuildScript: true,
|
|
283
|
+
withLintConfig: true,
|
|
284
|
+
});
|
|
285
|
+
initGitRepo();
|
|
286
|
+
const result = await runAllGates(TEST_DIR, {
|
|
287
|
+
skipRebase: true,
|
|
288
|
+
skipSecurity: true,
|
|
289
|
+
});
|
|
290
|
+
// Verify order: TEST -> TYPECHECK -> LINT -> BUILD
|
|
291
|
+
const gateOrder = result.gates.map((g) => g.gate);
|
|
292
|
+
const testIndex = gateOrder.indexOf('TEST');
|
|
293
|
+
const typeIndex = gateOrder.indexOf('TYPECHECK');
|
|
294
|
+
const lintIndex = gateOrder.indexOf('LINT');
|
|
295
|
+
const buildIndex = gateOrder.indexOf('BUILD');
|
|
296
|
+
expect(testIndex).toBeLessThan(typeIndex);
|
|
297
|
+
expect(typeIndex).toBeLessThan(lintIndex);
|
|
298
|
+
expect(lintIndex).toBeLessThan(buildIndex);
|
|
299
|
+
});
|
|
300
|
+
});
|
|
301
|
+
});
|
|
302
|
+
describe('RebaseGate', () => {
|
|
303
|
+
const TEST_DIR = path.join(process.cwd(), '.rebase-test');
|
|
304
|
+
beforeEach(() => {
|
|
305
|
+
if (fs.existsSync(TEST_DIR)) {
|
|
306
|
+
fs.rmSync(TEST_DIR, { recursive: true, force: true });
|
|
307
|
+
}
|
|
308
|
+
fs.mkdirSync(TEST_DIR, { recursive: true });
|
|
309
|
+
});
|
|
310
|
+
afterEach(() => {
|
|
311
|
+
if (fs.existsSync(TEST_DIR)) {
|
|
312
|
+
fs.rmSync(TEST_DIR, { recursive: true, force: true });
|
|
313
|
+
}
|
|
314
|
+
});
|
|
315
|
+
it('should have RebaseResult type with conflict info', () => {
|
|
316
|
+
const result = {
|
|
317
|
+
gate: 'REBASE',
|
|
318
|
+
passed: false,
|
|
319
|
+
has_conflict: true,
|
|
320
|
+
conflicting_files: ['file1.ts', 'file2.ts'],
|
|
321
|
+
error: 'Merge conflict',
|
|
322
|
+
duration_ms: 100,
|
|
323
|
+
};
|
|
324
|
+
expect(result.has_conflict).toBe(true);
|
|
325
|
+
expect(result.conflicting_files).toContain('file1.ts');
|
|
326
|
+
});
|
|
327
|
+
it('should handle missing remote gracefully', () => {
|
|
328
|
+
fs.mkdirSync(TEST_DIR, { recursive: true });
|
|
329
|
+
execSync('git init', { cwd: TEST_DIR, stdio: 'pipe' });
|
|
330
|
+
execSync('git config user.email "test@test.com"', { cwd: TEST_DIR, stdio: 'pipe' });
|
|
331
|
+
execSync('git config user.name "Test"', { cwd: TEST_DIR, stdio: 'pipe' });
|
|
332
|
+
fs.writeFileSync(path.join(TEST_DIR, 'README.md'), '# Test');
|
|
333
|
+
execSync('git add .', { cwd: TEST_DIR, stdio: 'pipe' });
|
|
334
|
+
execSync('git commit -m "Initial"', { cwd: TEST_DIR, stdio: 'pipe' });
|
|
335
|
+
// This should fail gracefully (no remote configured)
|
|
336
|
+
const result = runRebaseGate(TEST_DIR, 'main');
|
|
337
|
+
expect(result.gate).toBe('REBASE');
|
|
338
|
+
expect(result.passed).toBe(false);
|
|
339
|
+
// Should have error about missing remote
|
|
340
|
+
});
|
|
341
|
+
});
|
|
342
|
+
//# sourceMappingURL=gates.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"gates.test.js","sourceRoot":"","sources":["../../src/__tests__/gates.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"observability.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/observability.test.ts"],"names":[],"mappings":""}
|