@rigour-labs/mcp 6.6.6 → 6.7.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.
- package/README.md +27 -132
- package/dist/advertised-tools.d.ts +1 -1
- package/dist/advertised-tools.js +1 -0
- package/dist/index.js +4 -0
- package/dist/tools/definitions.js +17 -1
- package/dist/tools/reviewer-verdict-handler.d.ts +2 -0
- package/dist/tools/reviewer-verdict-handler.js +46 -0
- package/dist/utils/config.d.ts +10 -51
- package/dist/utils/config.js +1 -1
- package/package.json +3 -3
package/README.md
CHANGED
|
@@ -1,147 +1,42 @@
|
|
|
1
|
-
#
|
|
1
|
+
# @rigour-labs/mcp
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
[](https://www.npmjs.com/package/@rigour-labs/mcp)
|
|
4
4
|
|
|
5
|
-
Rigour
|
|
5
|
+
Rigour's MCP server. It gives a coding agent tools to review its own change before it says it is done, to
|
|
6
|
+
check for an existing helper before writing a new one, and to recall what the repository and the team have
|
|
7
|
+
learned. It runs on your machine over stdio and works with Claude Code, Cursor and other MCP clients.
|
|
6
8
|
|
|
7
|
-
|
|
8
|
-
[](https://www.npmjs.com/package/@rigour-labs/mcp)
|
|
9
|
+
## Set it up
|
|
9
10
|
|
|
10
|
-
|
|
11
|
+
`rigour setup` (from [@rigour-labs/cli](https://www.npmjs.com/package/@rigour-labs/cli)) registers it for
|
|
12
|
+
Claude Code and Cursor, together with the hooks that run Rigour's checks whether or not the agent asks. To
|
|
13
|
+
register it by hand:
|
|
11
14
|
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
### Key Features:
|
|
17
|
-
|
|
18
|
-
- **27+ Quality Gates**: Deterministic checks for file size, complexity, hygiene, security, and AI-native drift detection.
|
|
19
|
-
- **8-Language Hallucination Detection**: JS/TS, Python, Go, Ruby, C#/.NET, Rust, Java, and Kotlin — with stdlib whitelists, dependency manifest parsing, and project-relative import resolution.
|
|
20
|
-
- **AI Agent DLP**: 29 credential patterns intercepted before agents see them (<50ms). Anti-evasion: unicode normalization, entropy detection, bidi stripping.
|
|
21
|
-
- **Memory & Skills Governance**: Blocks agent writes to native memory files (CLAUDE.md, .clinerules, .windsurf/memories/); forces DLP-scanned `rigour_remember` instead.
|
|
22
|
-
- **Real-Time Hooks**: Sub-200ms file-write hooks for Claude Code, Cursor, Cline, and Windsurf — catches issues as the AI writes, not after CI.
|
|
23
|
-
- **Two-Score System**: Separate AI Health Score and Structural Score with provenance tracking (`ai-drift`, `traditional`, `security`, `governance`).
|
|
24
|
-
- **Deep Analysis**: Five-signal LLM pipeline (AST facts, embeddings, style fingerprints, logic baselines, dependency graphs) with deterministic verification.
|
|
25
|
-
- **Multi-Agent Governance**: Agent registration, scope isolation, checkpoint supervision, and verified handoffs.
|
|
26
|
-
- **Industry Presets**: SOC2, HIPAA, FedRAMP-ready gate configurations.
|
|
27
|
-
- **Local-First**: Deterministic gates run locally. Cloud deep analysis is opt-in BYOK.
|
|
28
|
-
|
|
29
|
-
---
|
|
30
|
-
|
|
31
|
-
## 🛠️ Available Tools (25)
|
|
32
|
-
|
|
33
|
-
### Core Quality Tools
|
|
34
|
-
|
|
35
|
-
| Tool | Description |
|
|
36
|
-
|:---|:---|
|
|
37
|
-
| `rigour_check` | Runs all configured quality gates on the current workspace. |
|
|
38
|
-
| `rigour_explain` | Explains why a specific gate failed with actionable fix instructions. |
|
|
39
|
-
| `rigour_status` | Quick PASS/FAIL check with JSON-friendly output for polling. |
|
|
40
|
-
| `rigour_get_fix_packet` | Retrieves prioritized Fix Packet (v2) with severity and provenance. |
|
|
41
|
-
| `rigour_list_gates` | Lists all configured quality gates and their thresholds. |
|
|
42
|
-
| `rigour_get_config` | Returns the current rigour.yml configuration. |
|
|
43
|
-
| `rigour_check_pattern` | Checks if a proposed code pattern already exists in the codebase. |
|
|
44
|
-
| `rigour_security_audit` | Runs a live CVE check on project dependencies. |
|
|
45
|
-
| `rigour_review` | High-fidelity code review on a PR diff against all quality gates. |
|
|
46
|
-
|
|
47
|
-
### Memory & Context Tools
|
|
48
|
-
|
|
49
|
-
| Tool | Description |
|
|
50
|
-
|:---|:---|
|
|
51
|
-
| `rigour_remember` | Memory for this repository, all your repositories (`scope: "user"`), or your team (`scope: "team"`, served once promoted). Refuses values containing credentials. |
|
|
52
|
-
| `rigour_recall` | `query`: the memories that match by meaning, plus promoted team knowledge; `key`: one memory. Withholds any memory containing a credential. |
|
|
53
|
-
| `rigour_forget` | Removes a stored memory by key. |
|
|
54
|
-
|
|
55
|
-
### Real-Time Hooks & DLP
|
|
56
|
-
|
|
57
|
-
| Tool | Description |
|
|
58
|
-
|:---|:---|
|
|
59
|
-
| `rigour_hooks_check` | Fast hook checker on specific files (<200ms). Also accepts `text` param for DLP mode — scans user input for credentials (AWS keys, API tokens, database URLs, private keys, JWTs) before agent processing. |
|
|
60
|
-
| `rigour_hooks_init` | Generate hook configs for Claude, Cursor, Cline, or Windsurf. Installs quality hooks + DLP pre-input hooks by default. Pass `dlp: false` to skip DLP. |
|
|
61
|
-
|
|
62
|
-
### Deep Analysis
|
|
63
|
-
|
|
64
|
-
| Tool | Description |
|
|
65
|
-
|:---|:---|
|
|
66
|
-
| `rigour_check_deep` | LLM-powered code review with five-signal extraction → verification pipeline. Local-first or cloud BYOK. |
|
|
67
|
-
| `rigour_deep_stats` | Score history, trend analysis, and top issues from SQLite storage. |
|
|
68
|
-
|
|
69
|
-
### Supervisor & Execution
|
|
70
|
-
|
|
71
|
-
| Tool | Description |
|
|
72
|
-
|:---|:---|
|
|
73
|
-
| `rigour_run` | Executes a command under Rigour supervision with human arbitration. |
|
|
74
|
-
| `rigour_run_supervised` | Full supervisor mode — iterative command + gate check loop. |
|
|
75
|
-
|
|
76
|
-
### Settings
|
|
77
|
-
|
|
78
|
-
| Tool | Description |
|
|
79
|
-
|:---|:---|
|
|
80
|
-
| `rigour_mcp_get_settings` | Get MCP runtime settings (.rigour/mcp-settings.json). |
|
|
81
|
-
| `rigour_mcp_set_settings` | Set MCP runtime settings (e.g., deep_default_mode). |
|
|
82
|
-
|
|
83
|
-
### Multi-Agent Governance
|
|
84
|
-
|
|
85
|
-
| Tool | Description |
|
|
86
|
-
|:---|:---|
|
|
87
|
-
| `rigour_agent_register` | Register agent in session with scope conflict detection. |
|
|
88
|
-
| `rigour_agent_deregister` | Remove agent from session when work is complete. |
|
|
89
|
-
| `rigour_checkpoint` | Record quality checkpoint with drift detection. |
|
|
90
|
-
| `rigour_handoff` | Initiate task handoff to another agent. |
|
|
91
|
-
| `rigour_handoff_accept` | Accept a pending handoff from another agent. |
|
|
92
|
-
|
|
93
|
-
---
|
|
94
|
-
|
|
95
|
-
## 🌐 Language Support
|
|
96
|
-
|
|
97
|
-
Hallucinated import detection with full stdlib whitelists and dependency manifest parsing:
|
|
98
|
-
|
|
99
|
-
| Language | Stdlib | Dependency Manifest | Import Patterns |
|
|
100
|
-
|:---|:---|:---|:---|
|
|
101
|
-
| **JavaScript/TypeScript** | Node.js 22.x builtins | `package.json` | `import`, `require()`, `export from` |
|
|
102
|
-
| **Python** | 160+ stdlib modules (3.12+) | Local module resolution | `import`, `from ... import` |
|
|
103
|
-
| **Go** | 150+ stdlib packages (1.22+) | `go.mod` module path | `import "..."`, aliased imports |
|
|
104
|
-
| **Ruby** | 80+ stdlib gems (3.3+ MRI) | `Gemfile`, `.gemspec` | `require`, `require_relative` |
|
|
105
|
-
| **C# / .NET** | .NET 8 framework namespaces | `.csproj` (NuGet PackageReference) | `using`, `using static` |
|
|
106
|
-
| **Rust** | `std`/`core`/`alloc`/`proc_macro` | `Cargo.toml` (with `-` → `_`) | `use`, `extern crate`, `pub use` |
|
|
107
|
-
| **Java** | `java.*`/`javax.*`/`jakarta.*` | `build.gradle`, `pom.xml` | `import`, `import static` |
|
|
108
|
-
| **Kotlin** | `kotlin.*`/`kotlinx.*` + Java interop | `build.gradle.kts` | `import` |
|
|
109
|
-
|
|
110
|
-
---
|
|
111
|
-
|
|
112
|
-
## 📦 Installation
|
|
113
|
-
|
|
114
|
-
No global install: npx fetches the server when your agent starts it. Keep a version in the package name (`@latest`, or a major such as `@6`); with a bare `@rigour-labs/mcp`, npx runs any older copy installed globally instead. If you once ran `npm install -g @rigour-labs/mcp`, remove it with `npm rm -g @rigour-labs/mcp`.
|
|
15
|
+
```bash
|
|
16
|
+
claude mcp add --scope user rigour -- npx -y @rigour-labs/mcp@6
|
|
17
|
+
```
|
|
115
18
|
|
|
116
|
-
|
|
19
|
+
Or, in any client's MCP configuration:
|
|
117
20
|
|
|
118
|
-
**Cursor, Claude Desktop and other MCP clients:**
|
|
119
21
|
```json
|
|
120
|
-
{
|
|
121
|
-
"mcpServers": {
|
|
122
|
-
"rigour": {
|
|
123
|
-
"command": "npx",
|
|
124
|
-
"args": ["-y", "@rigour-labs/mcp@latest"],
|
|
125
|
-
"env": {
|
|
126
|
-
"RIGOUR_CWD": "/path/to/your/project"
|
|
127
|
-
}
|
|
128
|
-
}
|
|
129
|
-
}
|
|
130
|
-
}
|
|
22
|
+
{ "mcpServers": { "rigour": { "command": "npx", "args": ["-y", "@rigour-labs/mcp@6"] } } }
|
|
131
23
|
```
|
|
132
24
|
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
To keep a server apart from your other work (one per employer or client), add `"RIGOUR_USER_MEMORY": "off"`: it then never reads or writes the memories you keep for all your repositories.
|
|
136
|
-
|
|
137
|
-
---
|
|
138
|
-
|
|
139
|
-
## 📖 Documentation
|
|
25
|
+
Node 22 or later. Each call works in the repository given by its `cwd` argument, else `RIGOUR_CWD`, else
|
|
26
|
+
the directory the server started in.
|
|
140
27
|
|
|
141
|
-
|
|
28
|
+
## The tools
|
|
142
29
|
|
|
143
|
-
|
|
30
|
+
| Tool | What it is for |
|
|
31
|
+
| --- | --- |
|
|
32
|
+
| `rigour_review` | Review the change before calling it done: only findings on changed lines, each with a fix |
|
|
33
|
+
| `rigour_review_ack` | Record the agent's verdict on a risky changed function |
|
|
34
|
+
| `rigour_reviewer_verdict` | What the reviewer last decided for the branch (read-only) |
|
|
35
|
+
| `rigour_check`, `rigour_get_fix_packet` | Run the checks, and get the violations a page at a time |
|
|
36
|
+
| `rigour_index`, `rigour_context_scope`, `rigour_check_pattern` | Find the few files a task needs, and whether a helper already exists |
|
|
37
|
+
| `rigour_recall`, `rigour_remember` | Recall and store conventions and lessons |
|
|
144
38
|
|
|
145
|
-
|
|
39
|
+
More groups (agent teams, context, telemetry) are listed with `RIGOUR_MCP_TOOLS`. Every tool:
|
|
40
|
+
[Coding agents and MCP](https://github.com/rigour-labs/rigour/blob/main/docs/AGENTS.md).
|
|
146
41
|
|
|
147
42
|
MIT © [Rigour Labs](https://github.com/rigour-labs)
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
export declare const TOOL_GROUPS: {
|
|
2
2
|
/** Load memory, scope context, avoid reinvention, gate and review the change, learn. */
|
|
3
|
-
readonly core: readonly ["rigour_recall", "rigour_index", "rigour_context_scope", "rigour_check_pattern", "rigour_check", "rigour_review", "rigour_review_ack", "rigour_get_fix_packet", "rigour_remember"];
|
|
3
|
+
readonly core: readonly ["rigour_recall", "rigour_index", "rigour_context_scope", "rigour_check_pattern", "rigour_check", "rigour_review", "rigour_review_ack", "rigour_reviewer_verdict", "rigour_get_fix_packet", "rigour_remember"];
|
|
4
4
|
/** Multi-agent registration, checkpoints, handoffs, hooks and supervised runs. */
|
|
5
5
|
readonly governance: readonly ["rigour_agent_register", "rigour_agent_deregister", "rigour_checkpoint", "rigour_handoff", "rigour_handoff_accept", "rigour_hooks_check", "rigour_hooks_init", "rigour_run", "rigour_run_supervised"];
|
|
6
6
|
/** Occasional context and security tools. */
|
package/dist/advertised-tools.js
CHANGED
package/dist/index.js
CHANGED
|
@@ -32,6 +32,7 @@ import { handleCheckPattern, handleSecurityAudit } from './tools/pattern-handler
|
|
|
32
32
|
import { handleRun, handleRunSupervised } from './tools/execution-handlers.js';
|
|
33
33
|
import { handleAgentRegister, handleCheckpoint, handleHandoff, handleAgentDeregister, handleHandoffAccept } from './tools/agent-handlers.js';
|
|
34
34
|
import { handleReview, handleReviewAck } from './tools/review-handler.js';
|
|
35
|
+
import { handleReviewerVerdict } from './tools/reviewer-verdict-handler.js';
|
|
35
36
|
import { handleHooksCheck, handleHooksInit } from './tools/hooks-handler.js';
|
|
36
37
|
import { handleCheckDeep, handleDeepStats } from './tools/deep-handlers.js';
|
|
37
38
|
import { handleMcpGetSettings, handleMcpSetSettings } from './tools/mcp-settings-handler.js';
|
|
@@ -226,6 +227,9 @@ server.setRequestHandler(CallToolRequestSchema, async (request) => {
|
|
|
226
227
|
case "rigour_review_ack":
|
|
227
228
|
result = handleReviewAck(cwd, args);
|
|
228
229
|
break;
|
|
230
|
+
case "rigour_reviewer_verdict":
|
|
231
|
+
result = await handleReviewerVerdict(cwd);
|
|
232
|
+
break;
|
|
229
233
|
// Context Telemetry & Cost Tools
|
|
230
234
|
case "rigour_context_stats":
|
|
231
235
|
result = await handleContextStats(cwd, args.taskId);
|
|
@@ -536,6 +536,22 @@ export const TOOL_DEFINITIONS = [
|
|
|
536
536
|
openWorldHint: false,
|
|
537
537
|
},
|
|
538
538
|
},
|
|
539
|
+
{
|
|
540
|
+
name: "rigour_reviewer_verdict",
|
|
541
|
+
description: "What the model reviewer last decided for this branch: the confirmed items to fix (with id, file:line, consequence and evidence), the disputed ones that are not work, which mode ran, and whether the verdict is for the current commit. Read-only: never runs a model, never dismisses.",
|
|
542
|
+
inputSchema: {
|
|
543
|
+
type: "object",
|
|
544
|
+
properties: { ...cwdParam() },
|
|
545
|
+
required: ["cwd"],
|
|
546
|
+
},
|
|
547
|
+
annotations: {
|
|
548
|
+
title: "Reviewer Verdict",
|
|
549
|
+
readOnlyHint: true,
|
|
550
|
+
destructiveHint: false,
|
|
551
|
+
idempotentHint: true,
|
|
552
|
+
openWorldHint: false,
|
|
553
|
+
},
|
|
554
|
+
},
|
|
539
555
|
{
|
|
540
556
|
name: "rigour_review_ack",
|
|
541
557
|
description: "Record that you reviewed a function from rigour_review's review_task: verdict \"fixed\" (you fixed a defect) or \"no_issue\", with a note saying what you checked. Covers the function's current code only; editing it later puts it back in the task.",
|
|
@@ -580,7 +596,7 @@ export const TOOL_DEFINITIONS = [
|
|
|
580
596
|
},
|
|
581
597
|
{
|
|
582
598
|
name: "rigour_task_cost",
|
|
583
|
-
description: "
|
|
599
|
+
description: "Rigour's estimate of the context and cost its scoped reads avoided for a task, beside any model usage recorded for it.",
|
|
584
600
|
inputSchema: {
|
|
585
601
|
type: "object",
|
|
586
602
|
properties: {
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* rigour_reviewer_verdict: what the model reviewer last decided for this branch, for the agent
|
|
3
|
+
* that does the fixing. Confirmed items are the work, each with the id a person can dismiss it by;
|
|
4
|
+
* disputed items have no majority and are not work. Read only: it never runs a model (that spends
|
|
5
|
+
* the person's money) and never dismisses (a person decides what is not a bug).
|
|
6
|
+
*/
|
|
7
|
+
import { execFileSync } from 'child_process';
|
|
8
|
+
import { reviewStatus } from '@rigour-labs/core';
|
|
9
|
+
const git = (cwd, args) => {
|
|
10
|
+
try {
|
|
11
|
+
return execFileSync('git', args, { cwd, encoding: 'utf8', stdio: ['ignore', 'pipe', 'ignore'] }).trim();
|
|
12
|
+
}
|
|
13
|
+
catch {
|
|
14
|
+
return '';
|
|
15
|
+
}
|
|
16
|
+
};
|
|
17
|
+
const brief = (item) => ({ id: item.id, class: item.class, file: item.file ?? null, line: item.line ?? null, issue: item.issue, consequence: item.consequence ?? null, evidence: item.evidence ?? null, judges: item.reviewer ?? null });
|
|
18
|
+
export async function handleReviewerVerdict(cwd) {
|
|
19
|
+
const branch = git(cwd, ['rev-parse', '--abbrev-ref', 'HEAD']);
|
|
20
|
+
const head = git(cwd, ['rev-parse', 'HEAD']);
|
|
21
|
+
const status = branch ? await reviewStatus(cwd, branch) : undefined;
|
|
22
|
+
if (!status)
|
|
23
|
+
return { content: [{ type: 'text', text: JSON.stringify({ error: 'not a git repository' }) }], isError: true };
|
|
24
|
+
const last = status.last;
|
|
25
|
+
const answer = {
|
|
26
|
+
branch,
|
|
27
|
+
running: status.running ? { head: status.running.head } : null,
|
|
28
|
+
last_attempt: status.attempt ? { head: status.attempt.head, outcome: status.attempt.outcome, reason: status.attempt.reason } : null,
|
|
29
|
+
verdict: last ? {
|
|
30
|
+
head: last.head,
|
|
31
|
+
current: last.head === head,
|
|
32
|
+
scope: last.mode,
|
|
33
|
+
ran: last.ran ?? null,
|
|
34
|
+
fix: last.open.map(brief),
|
|
35
|
+
disputed_not_work: last.disputed.map(brief),
|
|
36
|
+
} : null,
|
|
37
|
+
next: !last && status.attempt
|
|
38
|
+
? `The last review ${status.attempt.outcome === 'skipped' ? 'was skipped' : 'could not run'}: ${status.attempt.reason}. Tell the person; there is nothing from the reviewer to fix yet.`
|
|
39
|
+
: !last
|
|
40
|
+
? 'No reviewer verdict on this branch yet. A person runs `rigour review --reviewer`, or pushes with the reviewer on.'
|
|
41
|
+
: last.open.length
|
|
42
|
+
? `Fix each item in "fix", then push; the next review checks each by id.${last.head === head ? '' : ' This verdict is for an earlier commit: some items may already be fixed.'} If one is not a bug, say why to the person: only they can dismiss it.`
|
|
43
|
+
: 'Nothing to fix from the reviewer.',
|
|
44
|
+
};
|
|
45
|
+
return { content: [{ type: 'text', text: JSON.stringify(answer, null, 2) }] };
|
|
46
|
+
}
|
package/dist/utils/config.d.ts
CHANGED
|
@@ -5,7 +5,6 @@
|
|
|
5
5
|
*/
|
|
6
6
|
export declare function loadConfig(cwd: string): Promise<{
|
|
7
7
|
ignore: string[];
|
|
8
|
-
version: number;
|
|
9
8
|
commands: {
|
|
10
9
|
format?: string | undefined;
|
|
11
10
|
lint?: string | undefined;
|
|
@@ -14,11 +13,6 @@ export declare function loadConfig(cwd: string): Promise<{
|
|
|
14
13
|
};
|
|
15
14
|
gates: {
|
|
16
15
|
deep: {
|
|
17
|
-
enabled: boolean;
|
|
18
|
-
pro: boolean;
|
|
19
|
-
max: boolean;
|
|
20
|
-
provider: string;
|
|
21
|
-
threads: number;
|
|
22
16
|
temperature: number;
|
|
23
17
|
intent_checks: boolean;
|
|
24
18
|
checks: {
|
|
@@ -31,10 +25,6 @@ export declare function loadConfig(cwd: string): Promise<{
|
|
|
31
25
|
error_handling: boolean;
|
|
32
26
|
code_smells: boolean;
|
|
33
27
|
};
|
|
34
|
-
api_key?: string | undefined;
|
|
35
|
-
api_base_url?: string | undefined;
|
|
36
|
-
model_name?: string | undefined;
|
|
37
|
-
model_path?: string | undefined;
|
|
38
28
|
max_tokens?: number | undefined;
|
|
39
29
|
timeout_ms?: number | undefined;
|
|
40
30
|
budget_ms?: number | undefined;
|
|
@@ -50,16 +40,11 @@ export declare function loadConfig(cwd: string): Promise<{
|
|
|
50
40
|
max_file_lines: number;
|
|
51
41
|
forbid_todos: boolean;
|
|
52
42
|
forbid_fixme: boolean;
|
|
53
|
-
forbid_paths: string[];
|
|
54
43
|
required_files: string[];
|
|
55
44
|
ast: {
|
|
56
45
|
complexity: number;
|
|
57
46
|
max_methods: number;
|
|
58
47
|
max_params: number;
|
|
59
|
-
max_nesting: number;
|
|
60
|
-
max_inheritance_depth: number;
|
|
61
|
-
max_class_dependencies: number;
|
|
62
|
-
max_function_lines: number;
|
|
63
48
|
};
|
|
64
49
|
staleness: {
|
|
65
50
|
enabled: boolean;
|
|
@@ -71,7 +56,6 @@ export declare function loadConfig(cwd: string): Promise<{
|
|
|
71
56
|
detect_heavy_alternatives: boolean;
|
|
72
57
|
detect_duplicate_purpose: boolean;
|
|
73
58
|
unused_allowlist: string[];
|
|
74
|
-
trusted_registry?: string | undefined;
|
|
75
59
|
};
|
|
76
60
|
architecture: {
|
|
77
61
|
boundaries: {
|
|
@@ -88,11 +72,6 @@ export declare function loadConfig(cwd: string): Promise<{
|
|
|
88
72
|
enabled: boolean;
|
|
89
73
|
sensitivity: number;
|
|
90
74
|
mining_depth: number;
|
|
91
|
-
ignored_patterns: string[];
|
|
92
|
-
cross_file_patterns: boolean;
|
|
93
|
-
naming_consistency: boolean;
|
|
94
|
-
import_relationships: boolean;
|
|
95
|
-
max_cross_file_depth: number;
|
|
96
75
|
};
|
|
97
76
|
environment: {
|
|
98
77
|
enabled: boolean;
|
|
@@ -103,14 +82,11 @@ export declare function loadConfig(cwd: string): Promise<{
|
|
|
103
82
|
retry_loop_breaker: {
|
|
104
83
|
enabled: boolean;
|
|
105
84
|
max_retries: number;
|
|
106
|
-
auto_classify: boolean;
|
|
107
85
|
doc_sources: Record<string, string>;
|
|
108
86
|
};
|
|
109
87
|
agent_team: {
|
|
110
88
|
enabled: boolean;
|
|
111
89
|
max_concurrent_agents: number;
|
|
112
|
-
cross_agent_pattern_check: boolean;
|
|
113
|
-
handoff_verification: boolean;
|
|
114
90
|
task_ownership: "strict" | "collaborative";
|
|
115
91
|
};
|
|
116
92
|
checkpoint: {
|
|
@@ -118,7 +94,6 @@ export declare function loadConfig(cwd: string): Promise<{
|
|
|
118
94
|
interval_minutes: number;
|
|
119
95
|
quality_threshold: number;
|
|
120
96
|
drift_detection: boolean;
|
|
121
|
-
auto_save_on_failure: boolean;
|
|
122
97
|
};
|
|
123
98
|
security: {
|
|
124
99
|
enabled: boolean;
|
|
@@ -141,13 +116,6 @@ export declare function loadConfig(cwd: string): Promise<{
|
|
|
141
116
|
server_path_patterns: string[];
|
|
142
117
|
allowlist_env_names: string[];
|
|
143
118
|
};
|
|
144
|
-
adaptive: {
|
|
145
|
-
enabled: boolean;
|
|
146
|
-
base_coverage_threshold: number;
|
|
147
|
-
base_quality_threshold: number;
|
|
148
|
-
auto_detect_tier: boolean;
|
|
149
|
-
forced_tier?: "hobby" | "startup" | "enterprise" | undefined;
|
|
150
|
-
};
|
|
151
119
|
duplication_drift: {
|
|
152
120
|
enabled: boolean;
|
|
153
121
|
similarity_threshold: number;
|
|
@@ -155,8 +123,6 @@ export declare function loadConfig(cwd: string): Promise<{
|
|
|
155
123
|
};
|
|
156
124
|
hallucinated_imports: {
|
|
157
125
|
enabled: boolean;
|
|
158
|
-
check_relative: boolean;
|
|
159
|
-
check_packages: boolean;
|
|
160
126
|
ignore_patterns: string[];
|
|
161
127
|
};
|
|
162
128
|
inconsistent_error_handling: {
|
|
@@ -201,11 +167,9 @@ export declare function loadConfig(cwd: string): Promise<{
|
|
|
201
167
|
};
|
|
202
168
|
test_quality: {
|
|
203
169
|
enabled: boolean;
|
|
204
|
-
ignore_patterns: string[];
|
|
205
170
|
check_empty_tests: boolean;
|
|
206
171
|
check_tautological: boolean;
|
|
207
172
|
check_mock_heavy: boolean;
|
|
208
|
-
check_snapshot_abuse: boolean;
|
|
209
173
|
check_assertion_free_async: boolean;
|
|
210
174
|
max_mocks_per_test: number;
|
|
211
175
|
};
|
|
@@ -218,14 +182,6 @@ export declare function loadConfig(cwd: string): Promise<{
|
|
|
218
182
|
protected_skills_paths: string[];
|
|
219
183
|
exempt_paths: string[];
|
|
220
184
|
};
|
|
221
|
-
input_validation: {
|
|
222
|
-
enabled: boolean;
|
|
223
|
-
ignore_patterns: string[];
|
|
224
|
-
block_on_detection: boolean;
|
|
225
|
-
min_secret_length: number;
|
|
226
|
-
custom_patterns: string[];
|
|
227
|
-
audit_log: boolean;
|
|
228
|
-
};
|
|
229
185
|
unindexed_reads: {
|
|
230
186
|
enabled: boolean;
|
|
231
187
|
migrations: string[];
|
|
@@ -247,6 +203,7 @@ export declare function loadConfig(cwd: string): Promise<{
|
|
|
247
203
|
redundancy: {
|
|
248
204
|
enabled: boolean;
|
|
249
205
|
wire_contracts: string[];
|
|
206
|
+
schema_migrations: string[];
|
|
250
207
|
};
|
|
251
208
|
optional_params: {
|
|
252
209
|
enabled: boolean;
|
|
@@ -293,13 +250,7 @@ export declare function loadConfig(cwd: string): Promise<{
|
|
|
293
250
|
};
|
|
294
251
|
};
|
|
295
252
|
hooks: {
|
|
296
|
-
enabled: boolean;
|
|
297
|
-
tools: ("claude" | "cursor" | "cline" | "windsurf")[];
|
|
298
|
-
timeout_ms: number;
|
|
299
|
-
fast_gates: string[];
|
|
300
|
-
block_on_failure: boolean;
|
|
301
253
|
require_review_ack: boolean;
|
|
302
|
-
dlp: boolean;
|
|
303
254
|
};
|
|
304
255
|
output: {
|
|
305
256
|
report_path: string;
|
|
@@ -314,11 +265,19 @@ export declare function loadConfig(cwd: string): Promise<{
|
|
|
314
265
|
on_push: "off" | "background" | "wait";
|
|
315
266
|
reviewers: string[];
|
|
316
267
|
models: Record<string, string>;
|
|
268
|
+
panel: "off" | "on" | "required";
|
|
269
|
+
mode_required: boolean;
|
|
270
|
+
dismissals: boolean;
|
|
271
|
+
panel_max_items: number;
|
|
272
|
+
judges: 2 | 3;
|
|
273
|
+
escalate: "always" | "risk";
|
|
274
|
+
cross_models: Record<string, string>;
|
|
317
275
|
model?: string | undefined;
|
|
276
|
+
max_runs_per_day?: number | undefined;
|
|
277
|
+
max_usd_per_day?: number | undefined;
|
|
318
278
|
};
|
|
319
279
|
github_account?: string | undefined;
|
|
320
280
|
};
|
|
321
|
-
planned: string[];
|
|
322
281
|
preset?: string | undefined;
|
|
323
282
|
paradigm?: string | undefined;
|
|
324
283
|
}>;
|
package/dist/utils/config.js
CHANGED
|
@@ -22,7 +22,7 @@ export async function loadConfig(cwd) {
|
|
|
22
22
|
const configPath = path.join(cwd, "rigour.yml");
|
|
23
23
|
if (!(await fs.pathExists(configPath))) {
|
|
24
24
|
noteMissingConfig(cwd);
|
|
25
|
-
return ConfigSchema.parse({
|
|
25
|
+
return ConfigSchema.parse({});
|
|
26
26
|
}
|
|
27
27
|
const configContent = await fs.readFile(configPath, "utf-8");
|
|
28
28
|
return ConfigSchema.parse(yaml.parse(configContent));
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@rigour-labs/mcp",
|
|
3
|
-
"version": "6.
|
|
4
|
-
"description": "MCP server
|
|
3
|
+
"version": "6.7.1",
|
|
4
|
+
"description": "Rigour's MCP server: lets coding agents review their change, check for an existing helper before writing a new one, and recall the team's lessons. Works with Claude Code, Cursor and other MCP clients.",
|
|
5
5
|
"engines": {
|
|
6
6
|
"node": ">=22"
|
|
7
7
|
},
|
|
@@ -65,7 +65,7 @@
|
|
|
65
65
|
"execa": "^8.0.1",
|
|
66
66
|
"fs-extra": "^11.4.0",
|
|
67
67
|
"yaml": "^2.8.2",
|
|
68
|
-
"@rigour-labs/core": "6.
|
|
68
|
+
"@rigour-labs/core": "6.7.1"
|
|
69
69
|
},
|
|
70
70
|
"devDependencies": {
|
|
71
71
|
"@types/node": "^25.0.3",
|