@rvry/mcp 0.7.2 → 0.8.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/README.md +29 -35
- package/dist/client.d.ts +3 -2
- package/dist/client.js +4 -1
- package/dist/index.js +60 -18
- package/dist/setup.js +10 -98
- package/package.json +1 -2
- package/commands/deepthink.md +0 -307
- package/commands/problem-solve.md +0 -334
package/README.md
CHANGED
|
@@ -19,50 +19,44 @@ Supported clients: **Claude Code**, **Claude Desktop**, **Cursor**, **Gemini CLI
|
|
|
19
19
|
|
|
20
20
|
Restart any running clients after setup, and RVRY is ready.
|
|
21
21
|
|
|
22
|
-
###
|
|
22
|
+
### Manual Configuration
|
|
23
23
|
|
|
24
|
-
|
|
25
|
-
npx @rvry/mcp setup --token rvry_abc123 # Skip browser auth, use token directly
|
|
26
|
-
npx @rvry/mcp setup --client code # Only configure Claude Code
|
|
27
|
-
npx @rvry/mcp setup --client desktop # Only configure Claude Desktop
|
|
28
|
-
npx @rvry/mcp setup --accept-terms # Accept ToS non-interactively
|
|
29
|
-
```
|
|
30
|
-
|
|
31
|
-
### Manual Installation
|
|
32
|
-
|
|
33
|
-
**Claude Code:**
|
|
34
|
-
```bash
|
|
35
|
-
claude mcp add -e RVRY_TOKEN=rvry_your_token -s user rvry -- npx @rvry/mcp
|
|
36
|
-
```
|
|
24
|
+
For any MCP client that supports **stdio transport** (runs a local process), add this to your MCP config:
|
|
37
25
|
|
|
38
|
-
**Claude Desktop** (`claude_desktop_config.json`):
|
|
39
26
|
```json
|
|
40
27
|
{
|
|
41
|
-
"
|
|
42
|
-
"
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
"
|
|
46
|
-
"RVRY_TOKEN": "rvry_your_token_here"
|
|
47
|
-
}
|
|
28
|
+
"rvry": {
|
|
29
|
+
"command": "npx",
|
|
30
|
+
"args": ["@rvry/mcp"],
|
|
31
|
+
"env": {
|
|
32
|
+
"RVRY_TOKEN": "your_rvry_token"
|
|
48
33
|
}
|
|
49
34
|
}
|
|
50
35
|
}
|
|
51
36
|
```
|
|
52
37
|
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
38
|
+
Get your token at [rvry.ai/dashboard](https://rvry.ai/dashboard) after signing up.
|
|
39
|
+
|
|
40
|
+
### Compatibility
|
|
41
|
+
|
|
42
|
+
RVRY uses **stdio transport** (a local process that communicates over stdin/stdout). This works with clients that run MCP servers locally:
|
|
57
43
|
|
|
58
|
-
|
|
44
|
+
| Works | Client |
|
|
45
|
+
|-------|--------|
|
|
46
|
+
| Yes | Claude Code, Claude Desktop, Cursor, Gemini CLI, Codex, Anti-Gravity |
|
|
47
|
+
| Yes | Any client that supports `command` + `args` MCP config |
|
|
48
|
+
| No | Web-based clients that require an HTTP/SSE MCP server URL (e.g. Perplexity) |
|
|
59
49
|
|
|
60
|
-
|
|
50
|
+
HTTP transport support is planned.
|
|
61
51
|
|
|
62
52
|
## Tools
|
|
63
53
|
|
|
64
|
-
|
|
65
|
-
|
|
54
|
+
| Tool | What it does | Tier |
|
|
55
|
+
|------|-------------|------|
|
|
56
|
+
| **`RVRY_deepthink`** | Extended multi-round analysis. Catches assumptions, tests them, and doesn't let your AI wrap up until it's dealt with what it found. | All |
|
|
57
|
+
| **`RVRY_problem_solve`** | Structured decision-making. Forces orientation, anticipation, and evaluation before committing to a recommendation. | Pro+ |
|
|
58
|
+
| **`RVRY_challenge`** | Adversarial stress-testing. Finds weaknesses, tests assumptions, and surfaces failure modes in a proposal before you commit. | Pro+ |
|
|
59
|
+
| **`RVRY_meta`** | Sustained metacognitive observation. Examines how your AI is thinking, not just what it's thinking. | Max |
|
|
66
60
|
|
|
67
61
|
## How it Works
|
|
68
62
|
|
|
@@ -76,10 +70,10 @@ On hard questions, a smaller model with RVRY outperforms a bigger model without
|
|
|
76
70
|
|
|
77
71
|
## Pricing
|
|
78
72
|
|
|
79
|
-
| Plan |
|
|
80
|
-
|
|
81
|
-
| Free | 5/month | $0 |
|
|
82
|
-
| Pro |
|
|
83
|
-
| Max | Unlimited | $
|
|
73
|
+
| Plan | Sessions | Tools | Price |
|
|
74
|
+
|------|----------|-------|-------|
|
|
75
|
+
| Free | 5/month | deepthink | $0 |
|
|
76
|
+
| Pro | 21/month | deepthink, problem_solve, challenge | $20/mo |
|
|
77
|
+
| Max | Unlimited | All tools including meta | $99/mo |
|
|
84
78
|
|
|
85
79
|
Sign up at [rvry.ai](https://rvry.ai).
|
package/dist/client.d.ts
CHANGED
|
@@ -13,7 +13,7 @@ export interface ScopingQuestion {
|
|
|
13
13
|
}
|
|
14
14
|
export interface ThinkResponse {
|
|
15
15
|
sessionId: string;
|
|
16
|
-
status: 'scoping' | 'active' | 'complete';
|
|
16
|
+
status: 'scoping' | 'orient' | 'active' | 'complete';
|
|
17
17
|
round: number;
|
|
18
18
|
prompt: string;
|
|
19
19
|
instruction: string;
|
|
@@ -32,10 +32,11 @@ export interface ThinkResponse {
|
|
|
32
32
|
question: string;
|
|
33
33
|
rationale: string;
|
|
34
34
|
}>;
|
|
35
|
+
constraintTrace?: unknown[];
|
|
35
36
|
};
|
|
36
37
|
}
|
|
37
38
|
/**
|
|
38
39
|
* Call the RVRY engine /api/v1/think endpoint with a specific tool.
|
|
39
40
|
* Start a new session by omitting sessionId, or continue by providing one.
|
|
40
41
|
*/
|
|
41
|
-
export declare function callTool(tool: RvryTool, input: string, token: string, sessionId?: string, skipScoping?: boolean): Promise<ThinkResponse>;
|
|
42
|
+
export declare function callTool(tool: RvryTool, input: string, token: string, sessionId?: string, skipScoping?: boolean, userConstraints?: string[]): Promise<ThinkResponse>;
|
package/dist/client.js
CHANGED
|
@@ -7,7 +7,7 @@ const DEFAULT_ENGINE_URL = 'https://engine.rvry.ai';
|
|
|
7
7
|
* Call the RVRY engine /api/v1/think endpoint with a specific tool.
|
|
8
8
|
* Start a new session by omitting sessionId, or continue by providing one.
|
|
9
9
|
*/
|
|
10
|
-
export async function callTool(tool, input, token, sessionId, skipScoping) {
|
|
10
|
+
export async function callTool(tool, input, token, sessionId, skipScoping, userConstraints) {
|
|
11
11
|
const baseUrl = process.env.RVRY_ENGINE_URL ?? DEFAULT_ENGINE_URL;
|
|
12
12
|
const body = { input, tool };
|
|
13
13
|
if (sessionId) {
|
|
@@ -16,6 +16,9 @@ export async function callTool(tool, input, token, sessionId, skipScoping) {
|
|
|
16
16
|
if (skipScoping) {
|
|
17
17
|
body.skipScoping = true;
|
|
18
18
|
}
|
|
19
|
+
if (userConstraints && userConstraints.length > 0) {
|
|
20
|
+
body.userConstraints = userConstraints;
|
|
21
|
+
}
|
|
19
22
|
const res = await fetch(`${baseUrl}/api/v1/think`, {
|
|
20
23
|
method: 'POST',
|
|
21
24
|
headers: {
|
package/dist/index.js
CHANGED
|
@@ -40,8 +40,12 @@ const TOOL_DEFS = [
|
|
|
40
40
|
{
|
|
41
41
|
name: 'RVRY_deepthink',
|
|
42
42
|
description: 'Deep, multi-round structured analysis for high-stakes or complex questions. ' +
|
|
43
|
-
'Runs 5-7 rounds
|
|
44
|
-
'
|
|
43
|
+
'Runs 5-7 rounds of rigorous analysis with self-checks and adversarial stress-testing. ' +
|
|
44
|
+
'The first response orients you on the question — follow the instruction field to orient, then call again. ' +
|
|
45
|
+
'Each subsequent round returns a prompt (work through it internally) and an instruction (follow it). ' +
|
|
46
|
+
'Show the user only a brief status line per round (e.g. \'Round 3 — stress-testing the position\'). ' +
|
|
47
|
+
'Do not display the prompt text, internal tracking data, or quality assessments to the user. ' +
|
|
48
|
+
'On completion, present key findings with bold headings. Lead with insights, not process. ' +
|
|
45
49
|
'Call with your question to start, then send your analysis with the returned sessionId to continue.',
|
|
46
50
|
inputSchema: {
|
|
47
51
|
type: 'object',
|
|
@@ -58,14 +62,24 @@ const TOOL_DEFS = [
|
|
|
58
62
|
type: 'boolean',
|
|
59
63
|
description: 'Skip the scoping questions phase and begin analysis immediately.',
|
|
60
64
|
},
|
|
65
|
+
userConstraints: {
|
|
66
|
+
type: 'array',
|
|
67
|
+
items: { type: 'string' },
|
|
68
|
+
description: 'User-stated directives or requirements to track throughout the session.',
|
|
69
|
+
},
|
|
61
70
|
},
|
|
62
71
|
required: ['input'],
|
|
63
72
|
},
|
|
64
73
|
},
|
|
65
74
|
{
|
|
66
75
|
name: 'RVRY_problem_solve',
|
|
67
|
-
description: 'Structured decision-making
|
|
68
|
-
'
|
|
76
|
+
description: 'Structured decision-making that forces thorough evaluation before commitment. ' +
|
|
77
|
+
'Runs 5-8 rounds through orient, anticipate, generate, evaluate, and commit phases. ' +
|
|
78
|
+
'The first response orients you — follow the instruction field, then call again. ' +
|
|
79
|
+
'Each round returns a prompt and instruction. Work through the prompt internally. ' +
|
|
80
|
+
'Show the user only a brief status line per round (e.g. \'Round 2 — mapping failure modes\'). ' +
|
|
81
|
+
'Do not display the prompt text, internal tracking data, or quality assessments to the user. ' +
|
|
82
|
+
'On completion, present the recommendation with confidence, stress test results, and safeguards. ' +
|
|
69
83
|
'Call with your problem to start, then send your analysis with the returned sessionId to continue.',
|
|
70
84
|
inputSchema: {
|
|
71
85
|
type: 'object',
|
|
@@ -82,15 +96,23 @@ const TOOL_DEFS = [
|
|
|
82
96
|
type: 'boolean',
|
|
83
97
|
description: 'Skip the scoping questions phase and begin analysis immediately.',
|
|
84
98
|
},
|
|
99
|
+
userConstraints: {
|
|
100
|
+
type: 'array',
|
|
101
|
+
items: { type: 'string' },
|
|
102
|
+
description: 'User-stated directives or requirements to track throughout the session.',
|
|
103
|
+
},
|
|
85
104
|
},
|
|
86
105
|
required: ['input'],
|
|
87
106
|
},
|
|
88
107
|
},
|
|
89
108
|
{
|
|
90
109
|
name: 'RVRY_think',
|
|
91
|
-
description: 'Structured analysis for questions
|
|
92
|
-
'Runs 2-4 rounds with
|
|
93
|
-
'
|
|
110
|
+
description: 'Structured analysis for questions needing more depth than a quick answer. ' +
|
|
111
|
+
'Runs 2-4 rounds with tracking to ensure assumptions are examined. ' +
|
|
112
|
+
'The first response orients you — follow the instruction field, then call again. ' +
|
|
113
|
+
'Each round returns a prompt and instruction. Work through the prompt internally. ' +
|
|
114
|
+
'Show the user only a brief status line per round. Do not display internal data. ' +
|
|
115
|
+
'On completion, present findings clearly with bold headings. ' +
|
|
94
116
|
'Call with your question to start, then send your analysis with the returned sessionId to continue.',
|
|
95
117
|
inputSchema: {
|
|
96
118
|
type: 'object',
|
|
@@ -107,16 +129,23 @@ const TOOL_DEFS = [
|
|
|
107
129
|
type: 'boolean',
|
|
108
130
|
description: 'Skip the scoping questions phase and begin analysis immediately.',
|
|
109
131
|
},
|
|
132
|
+
userConstraints: {
|
|
133
|
+
type: 'array',
|
|
134
|
+
items: { type: 'string' },
|
|
135
|
+
description: 'User-stated directives or requirements to track throughout the session.',
|
|
136
|
+
},
|
|
110
137
|
},
|
|
111
138
|
required: ['input'],
|
|
112
139
|
},
|
|
113
140
|
},
|
|
114
141
|
{
|
|
115
142
|
name: 'RVRY_challenge',
|
|
116
|
-
description: 'Adversarial analysis that stress-tests a proposal or idea. ' +
|
|
117
|
-
'
|
|
118
|
-
'
|
|
119
|
-
'
|
|
143
|
+
description: 'Adversarial analysis that stress-tests a proposal or idea before commitment. ' +
|
|
144
|
+
'Runs 4-6 rounds identifying weaknesses, testing assumptions, and surfacing failure modes. ' +
|
|
145
|
+
'The first response orients you — follow the instruction field, then call again. ' +
|
|
146
|
+
'Each round returns a prompt and instruction. Work through the prompt internally. ' +
|
|
147
|
+
'Show the user only a brief status line per round. Do not display internal data. ' +
|
|
148
|
+
'On completion, present a verdict (GO / CONDITIONAL GO / NO GO) with evidence. ' +
|
|
120
149
|
'Call with your proposal to start, then send your analysis with the returned sessionId to continue.',
|
|
121
150
|
inputSchema: {
|
|
122
151
|
type: 'object',
|
|
@@ -133,17 +162,23 @@ const TOOL_DEFS = [
|
|
|
133
162
|
type: 'boolean',
|
|
134
163
|
description: 'Skip the scoping questions phase and begin analysis immediately.',
|
|
135
164
|
},
|
|
165
|
+
userConstraints: {
|
|
166
|
+
type: 'array',
|
|
167
|
+
items: { type: 'string' },
|
|
168
|
+
description: 'User-stated directives or requirements to track throughout the session.',
|
|
169
|
+
},
|
|
136
170
|
},
|
|
137
171
|
required: ['input'],
|
|
138
172
|
},
|
|
139
173
|
},
|
|
140
174
|
{
|
|
141
175
|
name: 'RVRY_meta',
|
|
142
|
-
description: 'Sustained metacognitive observation. ' +
|
|
143
|
-
'
|
|
144
|
-
'
|
|
145
|
-
'
|
|
146
|
-
'
|
|
176
|
+
description: 'Sustained metacognitive observation of reasoning defaults and trained reflexes. ' +
|
|
177
|
+
'Runs 3 rounds: observe, deepen, synthesize. Max tier only. ' +
|
|
178
|
+
'The first response sets the observation frame — follow the instruction field, then call again. ' +
|
|
179
|
+
'Each round returns a prompt. Reflect honestly, then call again with your reflection. ' +
|
|
180
|
+
'Show the user only a brief status note per round. Do not display internal prompts. ' +
|
|
181
|
+
'On completion, present a cohesive narrative reflection — not a structured report. ' +
|
|
147
182
|
'Call with your topic to start, then send your reflection with the returned sessionId to continue.',
|
|
148
183
|
inputSchema: {
|
|
149
184
|
type: 'object',
|
|
@@ -176,8 +211,12 @@ function stripResponse(result, question) {
|
|
|
176
211
|
stripped.prompt = result.prompt;
|
|
177
212
|
stripped.instruction = result.instruction;
|
|
178
213
|
}
|
|
214
|
+
if (result.status === 'orient') {
|
|
215
|
+
stripped.instruction = result.instruction;
|
|
216
|
+
}
|
|
179
217
|
if (result.status === 'complete' && result.harvest) {
|
|
180
|
-
|
|
218
|
+
const { constraintTrace, ...harvestSafe } = result.harvest;
|
|
219
|
+
stripped.harvest = harvestSafe;
|
|
181
220
|
}
|
|
182
221
|
if (result.usage) {
|
|
183
222
|
const { used, limit } = result.usage;
|
|
@@ -223,6 +262,9 @@ async function main() {
|
|
|
223
262
|
}
|
|
224
263
|
const sessionId = typeof typedArgs?.sessionId === 'string' ? typedArgs.sessionId : undefined;
|
|
225
264
|
const skipScoping = typedArgs?.skipScoping === true;
|
|
265
|
+
const userConstraints = Array.isArray(typedArgs?.userConstraints)
|
|
266
|
+
? typedArgs.userConstraints.filter(s => typeof s === 'string')
|
|
267
|
+
: undefined;
|
|
226
268
|
// Cache question on first call (no sessionId = new session)
|
|
227
269
|
// On continuation calls, read from cache
|
|
228
270
|
let question = input;
|
|
@@ -233,7 +275,7 @@ async function main() {
|
|
|
233
275
|
question = questionCache.get(sessionId) ?? input;
|
|
234
276
|
}
|
|
235
277
|
try {
|
|
236
|
-
const result = await callTool(rvryTool, input, token, sessionId, skipScoping || undefined);
|
|
278
|
+
const result = await callTool(rvryTool, input, token, sessionId, skipScoping || undefined, userConstraints);
|
|
237
279
|
// Cache question on first call (now we have the sessionId)
|
|
238
280
|
if (!sessionId) {
|
|
239
281
|
questionCache.set(result.sessionId, input);
|
package/dist/setup.js
CHANGED
|
@@ -20,10 +20,6 @@ import { fetch } from './fetch.js';
|
|
|
20
20
|
const require = createRequire(import.meta.url);
|
|
21
21
|
const PKG_VERSION = require('../package.json').version;
|
|
22
22
|
const ENGINE_URL = 'https://engine.rvry.ai';
|
|
23
|
-
const COMMAND_FILES = [
|
|
24
|
-
'deepthink.md',
|
|
25
|
-
'problem-solve.md',
|
|
26
|
-
];
|
|
27
23
|
const TOKEN_REGEX = /^rvry_[0-9a-f]{32,}$/;
|
|
28
24
|
/** Polling interval for device auth: 3 seconds */
|
|
29
25
|
const POLL_INTERVAL_MS = 3000;
|
|
@@ -36,47 +32,6 @@ const RVRY_SERVER_ENTRY = (token) => ({
|
|
|
36
32
|
env: { RVRY_TOKEN: token },
|
|
37
33
|
});
|
|
38
34
|
// ── Utility functions ──────────────────────────────────────────────
|
|
39
|
-
/**
|
|
40
|
-
* Find the commands directory shipped with this package.
|
|
41
|
-
* Walks up from this file's directory to find the commands/ folder.
|
|
42
|
-
*/
|
|
43
|
-
function findCommandsDir() {
|
|
44
|
-
let dir = dirname(new URL(import.meta.url).pathname);
|
|
45
|
-
for (let i = 0; i < 5; i++) {
|
|
46
|
-
const candidate = join(dir, 'commands');
|
|
47
|
-
if (existsSync(candidate)) {
|
|
48
|
-
return candidate;
|
|
49
|
-
}
|
|
50
|
-
dir = dirname(dir);
|
|
51
|
-
}
|
|
52
|
-
throw new Error('Could not find commands/ directory in @rvry/mcp package.');
|
|
53
|
-
}
|
|
54
|
-
/**
|
|
55
|
-
* Find or create the .claude/commands/ directory.
|
|
56
|
-
* Walks up from cwd looking for an existing .claude/ directory.
|
|
57
|
-
* If not found, creates .claude/commands/ in cwd.
|
|
58
|
-
*/
|
|
59
|
-
function findOrCreateTargetDir() {
|
|
60
|
-
const cwd = process.cwd();
|
|
61
|
-
let dir = cwd;
|
|
62
|
-
for (let i = 0; i < 10; i++) {
|
|
63
|
-
const claudeDir = join(dir, '.claude');
|
|
64
|
-
if (existsSync(claudeDir)) {
|
|
65
|
-
const commandsDir = join(claudeDir, 'commands');
|
|
66
|
-
if (!existsSync(commandsDir)) {
|
|
67
|
-
mkdirSync(commandsDir, { recursive: true });
|
|
68
|
-
}
|
|
69
|
-
return commandsDir;
|
|
70
|
-
}
|
|
71
|
-
const parent = dirname(dir);
|
|
72
|
-
if (parent === dir)
|
|
73
|
-
break;
|
|
74
|
-
dir = parent;
|
|
75
|
-
}
|
|
76
|
-
const commandsDir = join(cwd, '.claude', 'commands');
|
|
77
|
-
mkdirSync(commandsDir, { recursive: true });
|
|
78
|
-
return commandsDir;
|
|
79
|
-
}
|
|
80
35
|
/**
|
|
81
36
|
* Create a readline interface for prompting.
|
|
82
37
|
*/
|
|
@@ -726,31 +681,6 @@ async function getToken() {
|
|
|
726
681
|
return token;
|
|
727
682
|
}
|
|
728
683
|
}
|
|
729
|
-
// ── Slash command installation ─────────────────────────────────────
|
|
730
|
-
async function installCommands() {
|
|
731
|
-
const sourceDir = findCommandsDir();
|
|
732
|
-
const targetDir = findOrCreateTargetDir();
|
|
733
|
-
let installed = 0;
|
|
734
|
-
for (const filename of COMMAND_FILES) {
|
|
735
|
-
const sourcePath = join(sourceDir, filename);
|
|
736
|
-
const targetPath = join(targetDir, filename);
|
|
737
|
-
if (!existsSync(sourcePath)) {
|
|
738
|
-
continue;
|
|
739
|
-
}
|
|
740
|
-
if (existsSync(targetPath)) {
|
|
741
|
-
const rl = createRL();
|
|
742
|
-
const answer = await ask(rl, ` ${filename} already exists. Overwrite? [y/N] `);
|
|
743
|
-
rl.close();
|
|
744
|
-
if (answer.toLowerCase() !== 'y') {
|
|
745
|
-
continue;
|
|
746
|
-
}
|
|
747
|
-
}
|
|
748
|
-
const content = readFileSync(sourcePath, 'utf-8');
|
|
749
|
-
writeFileSync(targetPath, content, 'utf-8');
|
|
750
|
-
installed++;
|
|
751
|
-
}
|
|
752
|
-
return installed;
|
|
753
|
-
}
|
|
754
684
|
// ── Gitignore protection ───────────────────────────────────────────
|
|
755
685
|
/**
|
|
756
686
|
* Ensure .rvry/ is in the project's .gitignore to prevent
|
|
@@ -798,7 +728,7 @@ export async function runSetup() {
|
|
|
798
728
|
const clientFilter = clientFlagIndex !== -1 ? process.argv[clientFlagIndex + 1] : null;
|
|
799
729
|
const acceptTerms = process.argv.includes('--accept-terms');
|
|
800
730
|
// ── Step 1: Terms of Service ────────────────────────────────────
|
|
801
|
-
console.log('[1/
|
|
731
|
+
console.log('[1/5] Terms of Service');
|
|
802
732
|
console.log('');
|
|
803
733
|
console.log(' By continuing, you agree to the RVRY Terms of Service');
|
|
804
734
|
console.log(' and Privacy Policy:');
|
|
@@ -831,11 +761,11 @@ export async function runSetup() {
|
|
|
831
761
|
process.exit(1);
|
|
832
762
|
}
|
|
833
763
|
token = flagValue;
|
|
834
|
-
console.log('[2/
|
|
764
|
+
console.log('[2/5] Authentication (from --token flag)');
|
|
835
765
|
console.log(` Token: ${maskToken(token)}`);
|
|
836
766
|
}
|
|
837
767
|
else {
|
|
838
|
-
console.log('[2/
|
|
768
|
+
console.log('[2/5] Authentication');
|
|
839
769
|
console.log(' Opening browser for sign-in...');
|
|
840
770
|
const result = await deviceAuthFlow();
|
|
841
771
|
if (result) {
|
|
@@ -869,7 +799,7 @@ export async function runSetup() {
|
|
|
869
799
|
}
|
|
870
800
|
console.log('');
|
|
871
801
|
// ── Step 2: Detect clients ──────────────────────────────────────
|
|
872
|
-
console.log('[3/
|
|
802
|
+
console.log('[3/5] Detecting clients');
|
|
873
803
|
// Filter registry if --client was passed
|
|
874
804
|
const clients = clientFilter
|
|
875
805
|
? CLIENT_REGISTRY.filter((c) => c.id === clientFilter)
|
|
@@ -889,7 +819,7 @@ export async function runSetup() {
|
|
|
889
819
|
}
|
|
890
820
|
console.log('');
|
|
891
821
|
// ── Step 3: Configure clients ───────────────────────────────────
|
|
892
|
-
console.log('[4/
|
|
822
|
+
console.log('[4/5] Select apps to add RVRY MCP configuration');
|
|
893
823
|
console.log(' Use \x1b[1m↑↓\x1b[0m to navigate, \x1b[1mspace\x1b[0m to toggle, \x1b[1ma\x1b[0m to toggle all, \x1b[1menter\x1b[0m to confirm');
|
|
894
824
|
console.log('');
|
|
895
825
|
const pickerItems = detected.map((d) => ({
|
|
@@ -946,18 +876,8 @@ export async function runSetup() {
|
|
|
946
876
|
console.log(` RVRY_TOKEN = "${token}"`);
|
|
947
877
|
}
|
|
948
878
|
console.log('');
|
|
949
|
-
// ── Step 4:
|
|
950
|
-
console.log('[5/
|
|
951
|
-
const commandCount = await installCommands();
|
|
952
|
-
if (commandCount > 0) {
|
|
953
|
-
console.log(` Installed ${commandCount} command${commandCount > 1 ? 's' : ''} to .claude/commands/`);
|
|
954
|
-
}
|
|
955
|
-
else {
|
|
956
|
-
console.log(' No new commands installed (already up to date).');
|
|
957
|
-
}
|
|
958
|
-
console.log('');
|
|
959
|
-
// ── Step 5: Gitignore protection ────────────────────────────────
|
|
960
|
-
console.log('[6/6] Gitignore');
|
|
879
|
+
// ── Step 4: Gitignore protection ────────────────────────────────
|
|
880
|
+
console.log('[5/5] Gitignore');
|
|
961
881
|
ensureGitignore();
|
|
962
882
|
console.log('');
|
|
963
883
|
// ── Summary ─────────────────────────────────────────────────────
|
|
@@ -970,7 +890,6 @@ export async function runSetup() {
|
|
|
970
890
|
const pad = ' '.repeat(Math.max(1, 16 - c.name.length));
|
|
971
891
|
console.log(` ${c.name}:${pad}${c.status}`);
|
|
972
892
|
}
|
|
973
|
-
console.log(` Commands: ${commandCount} installed`);
|
|
974
893
|
console.log('');
|
|
975
894
|
// Client-specific next steps
|
|
976
895
|
const configuredNames = new Set(configuredClients.map((c) => c.name));
|
|
@@ -995,19 +914,12 @@ export async function runSetup() {
|
|
|
995
914
|
}
|
|
996
915
|
console.log('');
|
|
997
916
|
step++;
|
|
998
|
-
if (hasCodeStyle) {
|
|
999
|
-
console.log(` ${step}.
|
|
1000
|
-
console.log(' /deepthink "your question"');
|
|
1001
|
-
console.log(' /problem-solve "your decision"');
|
|
1002
|
-
step++;
|
|
1003
|
-
}
|
|
1004
|
-
if (hasDesktopStyle) {
|
|
1005
|
-
console.log(` ${step}. In desktop clients, use natural language:`);
|
|
1006
|
-
console.log(' "Use deepthink to analyze..." or "Use problem-solve for..."');
|
|
917
|
+
if (hasCodeStyle || hasDesktopStyle) {
|
|
918
|
+
console.log(` ${step}. Try: "Use RVRY_deepthink to analyze..." or "Use RVRY_problem_solve for..."`);
|
|
1007
919
|
step++;
|
|
1008
920
|
}
|
|
1009
921
|
if (!anyConfigured) {
|
|
1010
922
|
console.log(' 1. Configure a client using the manual instructions above');
|
|
1011
|
-
console.log(' 2. Then try:
|
|
923
|
+
console.log(' 2. Then try: "Use RVRY_deepthink to analyze..."');
|
|
1012
924
|
}
|
|
1013
925
|
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@rvry/mcp",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.8.0",
|
|
4
4
|
"description": "RVRY reasoning depth enforcement (RDE) engine client.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"bin": {
|
|
@@ -9,7 +9,6 @@
|
|
|
9
9
|
"main": "./dist/index.js",
|
|
10
10
|
"files": [
|
|
11
11
|
"dist",
|
|
12
|
-
"commands",
|
|
13
12
|
"!dist/**/*.test.*"
|
|
14
13
|
],
|
|
15
14
|
"engines": {
|
package/commands/deepthink.md
DELETED
|
@@ -1,307 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
description: Deep structured analysis for high-stakes questions via RVRY
|
|
3
|
-
argument-hint: [--auto] <question>
|
|
4
|
-
allowed-tools:
|
|
5
|
-
- mcp__rvry-dev__deepthink
|
|
6
|
-
- AskUserQuestion
|
|
7
|
-
- Read
|
|
8
|
-
- Write
|
|
9
|
-
- Grep
|
|
10
|
-
- Glob
|
|
11
|
-
- Bash
|
|
12
|
-
---
|
|
13
|
-
|
|
14
|
-
# /deepthink - Deep Structured Analysis
|
|
15
|
-
|
|
16
|
-
**YOUR ROLE**: Execute depth-first exploration with adaptive pre-mortems after conclusion-producing rounds. DIVERGENT thinking -- exploring questions, generating hypotheses, stress-testing conclusions before they solidify. For CONVERGENT decision-making, use `/problem-solve`.
|
|
17
|
-
|
|
18
|
-
**Input**: $ARGUMENTS
|
|
19
|
-
|
|
20
|
-
---
|
|
21
|
-
|
|
22
|
-
## Phase 0: Parse Flags
|
|
23
|
-
|
|
24
|
-
- If `$ARGUMENTS` is empty or `--help`: display usage and stop:
|
|
25
|
-
```
|
|
26
|
-
/deepthink - Deep Structured Analysis via RVRY
|
|
27
|
-
|
|
28
|
-
USAGE:
|
|
29
|
-
/deepthink <question>
|
|
30
|
-
/deepthink --auto <question> (fully autonomous, no questions, states assumptions)
|
|
31
|
-
|
|
32
|
-
The engine runs multi-round analysis with constraint tracking, quality gates,
|
|
33
|
-
and reasoning checks. Local persistence survives context compression.
|
|
34
|
-
|
|
35
|
-
RELATED: /problem-solve (convergent decision-making)
|
|
36
|
-
```
|
|
37
|
-
- If `$ARGUMENTS` contains `--auto`: set AUTO_MODE, strip `--auto` from input
|
|
38
|
-
|
|
39
|
-
---
|
|
40
|
-
|
|
41
|
-
## Phase 1: Session Setup
|
|
42
|
-
|
|
43
|
-
Create a session folder for local artifacts that survive context compression:
|
|
44
|
-
|
|
45
|
-
1. Generate a timestamp: `YYYYMMDD-HHMM` (current date/time)
|
|
46
|
-
2. Generate a slug from the question summary (3-4 words, kebab-case)
|
|
47
|
-
3. Create `{$PWD}/.claude/cognition/YYYYMMDD-HHMM-deepthink-<slug>/`
|
|
48
|
-
IMPORTANT: This is the PROJECT's `.claude/`, NOT `~/.claude/`. Use the absolute project root path.
|
|
49
|
-
4. Write `00-enter.md`:
|
|
50
|
-
```markdown
|
|
51
|
-
# DeepThink Session
|
|
52
|
-
**Question**: <full question>
|
|
53
|
-
**Started**: <timestamp>
|
|
54
|
-
```
|
|
55
|
-
|
|
56
|
-
---
|
|
57
|
-
|
|
58
|
-
## Phase 2: ORIENT (before calling the engine)
|
|
59
|
-
|
|
60
|
-
Orient directly -- no engine calls yet. This forces commitment to disk before the analysis loop. Everything written here survives if context compresses mid-session.
|
|
61
|
-
|
|
62
|
-
### `01-orient.md`:
|
|
63
|
-
Write to the session folder:
|
|
64
|
-
- **What I know**: Key facts, evidence, and context apparent from the question
|
|
65
|
-
- **What I'm uncertain about**: Gaps, assumptions, unknowns (list each specifically)
|
|
66
|
-
- **What I'm avoiding**: Uncomfortable angles, taboo options, things that would be inconvenient if true
|
|
67
|
-
|
|
68
|
-
### `02-scope-questions.md`:
|
|
69
|
-
Translate each uncertainty into a binary question with a smart default. Generate up to 3 questions, each with exactly 2 options. The recommended option comes first.
|
|
70
|
-
|
|
71
|
-
Write the questions to the file BEFORE asking.
|
|
72
|
-
|
|
73
|
-
### If AUTO_MODE:
|
|
74
|
-
|
|
75
|
-
State your assumptions visibly (e.g., "Assuming focus on architectural trade-offs rather than implementation details."). Write assumptions to `03-scope-answers.md`. Proceed to Phase 3.
|
|
76
|
-
|
|
77
|
-
### If NOT AUTO_MODE:
|
|
78
|
-
|
|
79
|
-
Ask scope questions via `AskUserQuestion` (up to 3 questions, each with 2 options, smart default first marked "(Recommended)").
|
|
80
|
-
|
|
81
|
-
```
|
|
82
|
-
AskUserQuestion({
|
|
83
|
-
questions: [
|
|
84
|
-
{
|
|
85
|
-
question: "<derived from uncertainty>",
|
|
86
|
-
header: "<short label>",
|
|
87
|
-
options: [
|
|
88
|
-
{ label: "<recommended option> (Recommended)", description: "<why this is the smart default>" },
|
|
89
|
-
{ label: "<alternative option>", description: "<when this makes sense>" }
|
|
90
|
-
],
|
|
91
|
-
multiSelect: false
|
|
92
|
-
}
|
|
93
|
-
]
|
|
94
|
-
})
|
|
95
|
-
```
|
|
96
|
-
|
|
97
|
-
If AskUserQuestion returns blank or fails, state assumptions visibly and proceed.
|
|
98
|
-
|
|
99
|
-
Record the answers (or stated assumptions) in `03-scope-answers.md`.
|
|
100
|
-
|
|
101
|
-
---
|
|
102
|
-
|
|
103
|
-
## Phase 3: Start Engine Session
|
|
104
|
-
|
|
105
|
-
Format the user's original question enriched with scope context from `03-scope-answers.md`.
|
|
106
|
-
|
|
107
|
-
Call `mcp__rvry-dev__deepthink` with:
|
|
108
|
-
```
|
|
109
|
-
{
|
|
110
|
-
"input": "<original question>\n\nContext: <brief summary of scope answers>"
|
|
111
|
-
}
|
|
112
|
-
```
|
|
113
|
-
|
|
114
|
-
Proceed to Phase 4.
|
|
115
|
-
|
|
116
|
-
---
|
|
117
|
-
|
|
118
|
-
## Phase 4: Analysis Loop
|
|
119
|
-
|
|
120
|
-
Repeat until `status === "complete"`:
|
|
121
|
-
|
|
122
|
-
### Step 1: Read the engine response
|
|
123
|
-
|
|
124
|
-
Read the engine's `question` field -- this is the analytical direction for this round. Read `constraints`, `gate`, and `detection` to understand the engine's assessment. Read `constraintBlock` for constraint update instructions.
|
|
125
|
-
|
|
126
|
-
### Step 2: Show status
|
|
127
|
-
|
|
128
|
-
Show the user a brief status line:
|
|
129
|
-
- Format: `Round {round} -- {what you're doing this round}`
|
|
130
|
-
- Example: `Round 3 -- stress-testing the current position`
|
|
131
|
-
- Derive the description from the engine's question focus. One line only.
|
|
132
|
-
|
|
133
|
-
### Step 3: Perform analysis
|
|
134
|
-
|
|
135
|
-
Analyze according to the engine's question and constraint data. The engine's question and constraints guide your thinking -- work WITH them, not around them.
|
|
136
|
-
|
|
137
|
-
Use Read, Grep, Glob, and Bash as needed to ground your analysis in actual code, data, or project state. Do not analyze in the abstract when concrete evidence is available.
|
|
138
|
-
|
|
139
|
-
### Step 4: 7-Question Self-Check (mandatory, internal)
|
|
140
|
-
|
|
141
|
-
**Internal**:
|
|
142
|
-
1. Is this shallow or predictable?
|
|
143
|
-
2. What am I avoiding?
|
|
144
|
-
3. Why not the uncomfortable option?
|
|
145
|
-
|
|
146
|
-
**External**:
|
|
147
|
-
4. What would I critique if someone else wrote this?
|
|
148
|
-
5. What would a skeptical expert challenge?
|
|
149
|
-
6. Any verifiable claims that should be checked?
|
|
150
|
-
|
|
151
|
-
**Grounding**:
|
|
152
|
-
7. What factual premise in this analysis have I not verified?
|
|
153
|
-
|
|
154
|
-
### Step 5: Verify-or-Defer (mandatory after self-check)
|
|
155
|
-
|
|
156
|
-
For each concern raised in Q5, Q6, or Q7, you MUST either:
|
|
157
|
-
- **VERIFY**: Actually check the claim -- read a file, grep for a pattern, run a command. Record what was verified and the result.
|
|
158
|
-
- **DEFER**: Explicitly state the concern and why it cannot be verified now. Express as a DEFER in the constraint update block.
|
|
159
|
-
|
|
160
|
-
**No dismiss**: You CANNOT raise a concern and then argue it away in the same self-check. If you raise it, you must verify or defer it.
|
|
161
|
-
|
|
162
|
-
### Step 6: Weakness Probe (rotate by round number)
|
|
163
|
-
|
|
164
|
-
Ask yourself ONE of these:
|
|
165
|
-
1. Which part of your analysis would you spend more time on if you had another round?
|
|
166
|
-
2. If your recommendation fails in practice, what is the first concrete thing someone notices?
|
|
167
|
-
3. What surprised you during this analysis? If nothing, what does that tell you?
|
|
168
|
-
4. What is the thing you almost said but did not?
|
|
169
|
-
5. Which of your claims would you remove if you had to stake your credibility on the remaining ones?
|
|
170
|
-
6. Your strongest claim and your most significant caveat -- are they in tension? If so, which do you stand behind?
|
|
171
|
-
|
|
172
|
-
Include the probe answer in your analysis.
|
|
173
|
-
|
|
174
|
-
### Step 7: Write constraint updates and submit
|
|
175
|
-
|
|
176
|
-
End your analysis with the constraint update block:
|
|
177
|
-
```
|
|
178
|
-
Constraint Updates
|
|
179
|
-
RESOLVE: C1, C2
|
|
180
|
-
ACKNOWLEDGE: C3
|
|
181
|
-
DEFER: C4 | <reason>
|
|
182
|
-
MILESTONE: <milestone> | <evidence>
|
|
183
|
-
End Constraint Updates
|
|
184
|
-
```
|
|
185
|
-
|
|
186
|
-
Call the engine tool with your full analysis (including constraint updates, self-check findings, and verify-or-defer results) as the `input`.
|
|
187
|
-
|
|
188
|
-
### What the user sees per round:
|
|
189
|
-
- The one-line status (Step 2)
|
|
190
|
-
- Nothing else until harvest
|
|
191
|
-
|
|
192
|
-
### What NEVER appears in user-visible output:
|
|
193
|
-
- The engine's `question` field content
|
|
194
|
-
- Constraint views or constraint update blocks
|
|
195
|
-
- Self-check questions or responses
|
|
196
|
-
- Gate verdicts or detection results
|
|
197
|
-
- The `constraintBlock` content
|
|
198
|
-
|
|
199
|
-
---
|
|
200
|
-
|
|
201
|
-
## Phase 5: Harvest
|
|
202
|
-
|
|
203
|
-
When `status === "complete"`:
|
|
204
|
-
|
|
205
|
-
### Harvest Pre-Mortem (before synthesis)
|
|
206
|
-
|
|
207
|
-
Before writing the final output, stress-test the direction of your analysis:
|
|
208
|
-
|
|
209
|
-
1. What was the original question?
|
|
210
|
-
2. What is my emerging recommendation/position?
|
|
211
|
-
3. What is the gap between the two in complexity and scope?
|
|
212
|
-
4. If the recommendation is more complex than the original problem warranted, what is the simpler version?
|
|
213
|
-
|
|
214
|
-
**Check for COMPLEXITY-COLLAPSE**: Did the analysis elaborate a simple problem until the complexity justified a complex solution? If yes, name the simpler alternative and present it prominently in the output.
|
|
215
|
-
|
|
216
|
-
### Write `99-harvest.md`
|
|
217
|
-
|
|
218
|
-
Write to the session folder:
|
|
219
|
-
```markdown
|
|
220
|
-
# DeepThink Harvest: [Problem Summary]
|
|
221
|
-
|
|
222
|
-
## Summary
|
|
223
|
-
[2-3 sentence executive summary]
|
|
224
|
-
|
|
225
|
-
## Key Findings
|
|
226
|
-
- [finding 1]
|
|
227
|
-
- [finding 2]
|
|
228
|
-
- [finding 3]
|
|
229
|
-
|
|
230
|
-
## Open Questions
|
|
231
|
-
- [what remains uncertain]
|
|
232
|
-
|
|
233
|
-
## Follow-ups
|
|
234
|
-
- /deepthink "[specific follow-up]" -- [why]
|
|
235
|
-
- /problem-solve "[specific decision]" -- [why]
|
|
236
|
-
```
|
|
237
|
-
|
|
238
|
-
### Confirm persistence to user
|
|
239
|
-
|
|
240
|
-
After writing 99-harvest.md:
|
|
241
|
-
```
|
|
242
|
-
---
|
|
243
|
-
Session persisted: <absolute path to session folder>
|
|
244
|
-
---
|
|
245
|
-
```
|
|
246
|
-
|
|
247
|
-
### Synthesize for the user
|
|
248
|
-
|
|
249
|
-
Use the engine's `harvest.summary`, `harvest.keyFindings`, `harvest.openQuestions`, and `harvest.followUps` as source material, plus your accumulated reasoning across all rounds and the harvest pre-mortem results.
|
|
250
|
-
|
|
251
|
-
---
|
|
252
|
-
|
|
253
|
-
## Final Output Format
|
|
254
|
-
|
|
255
|
-
The sections above the break are the value-add -- what the process surfaced that a straight answer wouldn't have. The prose after the break is just the answer.
|
|
256
|
-
|
|
257
|
-
```
|
|
258
|
-
# DeepThink: [Problem Summary]
|
|
259
|
-
|
|
260
|
-
## Default Starting Point
|
|
261
|
-
[Where thinking began -- assumptions, knowns, open questions.]
|
|
262
|
-
|
|
263
|
-
## Insights from DeepThink
|
|
264
|
-
|
|
265
|
-
**[Finding as a clear statement.]**
|
|
266
|
-
[Expand if needed. Skip if the bold line is self-sufficient.] (#tag-if-relevant)
|
|
267
|
-
|
|
268
|
-
**[Another finding.]**
|
|
269
|
-
[Context if needed.]
|
|
270
|
-
|
|
271
|
-
**[Simple finding that needs no expansion.]** (#pre-mortem)
|
|
272
|
-
|
|
273
|
-
[Format for human readability in terminal:
|
|
274
|
-
- Each finding gets its own appropriate visual unit (bold heading,
|
|
275
|
-
bullet, or short paragraph)
|
|
276
|
-
- Bullets for simple/parallel items. Bold heading + paragraph for
|
|
277
|
-
complex ones. Mix freely.
|
|
278
|
-
- No walls of text. If a paragraph runs long, break it.
|
|
279
|
-
- Lead with the IDEA, never the mode name
|
|
280
|
-
- Never describe the protocol's mechanics or your analytical process
|
|
281
|
-
- (#tags) are optional breadcrumbs: (#pre-mortem), (#inversion),
|
|
282
|
-
(#edge), (#perspective), (#meta). Most findings need no tag.
|
|
283
|
-
- Curate your best 3-6 findings, not every observation from every round.]
|
|
284
|
-
|
|
285
|
-
---
|
|
286
|
-
|
|
287
|
-
[The answer. No heading. What you actually think now, informed by
|
|
288
|
-
everything above. No dense paragraphs. No prescribed length.
|
|
289
|
-
Never start with "The exploration..." or "After analyzing..."]
|
|
290
|
-
|
|
291
|
-
## Follow-ups
|
|
292
|
-
-> /problem-solve "[specific decision point]"
|
|
293
|
-
_[why this needs convergent decision-making]_
|
|
294
|
-
-> /deepthink "[specific follow-up]"
|
|
295
|
-
_[why this needs further exploration]_
|
|
296
|
-
```
|
|
297
|
-
|
|
298
|
-
---
|
|
299
|
-
|
|
300
|
-
## Key Differences from /problem-solve
|
|
301
|
-
|
|
302
|
-
| /deepthink | /problem-solve |
|
|
303
|
-
|------------|----------------|
|
|
304
|
-
| Divergent + pre-mortems | Convergent - decide, commit |
|
|
305
|
-
| 7-question self-check + probe + verify-or-defer | Phase gates + probe |
|
|
306
|
-
| Explores the question space | Narrows to a decision |
|
|
307
|
-
| Valid: "more confused in useful ways" | Valid: clear decision + safeguards |
|
|
@@ -1,334 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
description: Convergent decision-making pipeline via RVRY
|
|
3
|
-
argument-hint: [--auto] <problem or decision>
|
|
4
|
-
allowed-tools:
|
|
5
|
-
- mcp__rvry-dev__problem_solve
|
|
6
|
-
- AskUserQuestion
|
|
7
|
-
- Read
|
|
8
|
-
- Write
|
|
9
|
-
- Grep
|
|
10
|
-
- Glob
|
|
11
|
-
- Bash
|
|
12
|
-
---
|
|
13
|
-
|
|
14
|
-
# /problem-solve - Convergent Decision-Making
|
|
15
|
-
|
|
16
|
-
**YOUR ROLE**: Execute a convergent decision pipeline. The engine handles the structured analysis phases (orient, anticipate, generate, evaluate, commit). You handle local persistence, self-discipline, and grounding claims in evidence. For DIVERGENT exploration, use `/deepthink`.
|
|
17
|
-
|
|
18
|
-
**Input**: $ARGUMENTS
|
|
19
|
-
|
|
20
|
-
---
|
|
21
|
-
|
|
22
|
-
## Phase 0: Parse Flags
|
|
23
|
-
|
|
24
|
-
- If `$ARGUMENTS` is empty or `--help`: display usage and stop:
|
|
25
|
-
```
|
|
26
|
-
/problem-solve - Convergent Decision-Making via RVRY
|
|
27
|
-
|
|
28
|
-
USAGE:
|
|
29
|
-
/problem-solve <problem or decision>
|
|
30
|
-
/problem-solve --auto <problem> (fully autonomous, no questions, states assumptions)
|
|
31
|
-
|
|
32
|
-
The engine runs a multi-round decision pipeline with constraint tracking,
|
|
33
|
-
quality gates, and reasoning checks. Local persistence survives context compression.
|
|
34
|
-
|
|
35
|
-
RELATED: /deepthink (divergent exploration)
|
|
36
|
-
```
|
|
37
|
-
- If `$ARGUMENTS` contains `--auto`: set AUTO_MODE, strip `--auto` from input
|
|
38
|
-
|
|
39
|
-
---
|
|
40
|
-
|
|
41
|
-
## Phase 1: Session Setup
|
|
42
|
-
|
|
43
|
-
Create a session folder for local artifacts that survive context compression:
|
|
44
|
-
|
|
45
|
-
1. Generate a timestamp: `YYYYMMDD-HHMM` (current date/time)
|
|
46
|
-
2. Generate a slug from the problem summary (3-4 words, kebab-case)
|
|
47
|
-
3. Create `{$PWD}/.claude/cognition/YYYYMMDD-HHMM-problemsolve-<slug>/`
|
|
48
|
-
IMPORTANT: This is the PROJECT's `.claude/`, NOT `~/.claude/`. Use the absolute project root path.
|
|
49
|
-
4. Write `00-enter.md`:
|
|
50
|
-
```markdown
|
|
51
|
-
# ProblemSolve Session
|
|
52
|
-
**Problem**: <full problem statement>
|
|
53
|
-
**Started**: <timestamp>
|
|
54
|
-
```
|
|
55
|
-
|
|
56
|
-
---
|
|
57
|
-
|
|
58
|
-
## Phase 2: ORIENT (before calling the engine)
|
|
59
|
-
|
|
60
|
-
Orient directly -- no engine calls yet. This forces commitment to disk before the analysis loop. Everything written here survives if context compresses mid-session.
|
|
61
|
-
|
|
62
|
-
### `01-orient.md`:
|
|
63
|
-
Write to the session folder:
|
|
64
|
-
- **What is the problem?**: The decision or problem in concrete terms
|
|
65
|
-
- **What is uncertain?**: Gaps, assumptions, unknowns (list each specifically)
|
|
66
|
-
- **What am I avoiding?**: Uncomfortable options, risky paths, things that would be inconvenient if true
|
|
67
|
-
|
|
68
|
-
### `02-scope-questions.md`:
|
|
69
|
-
Translate each uncertainty into a binary question with a smart default. Generate up to 3 questions, each with exactly 2 options. The recommended option comes first.
|
|
70
|
-
|
|
71
|
-
Write the questions to the file BEFORE asking.
|
|
72
|
-
|
|
73
|
-
### If AUTO_MODE:
|
|
74
|
-
|
|
75
|
-
State your assumptions visibly (e.g., "Assuming risk minimization over speed. Assuming known options need evaluation rather than generating new alternatives."). Write assumptions to `03-scope-answers.md`. Proceed to Phase 3.
|
|
76
|
-
|
|
77
|
-
### If NOT AUTO_MODE:
|
|
78
|
-
|
|
79
|
-
Ask scope questions via `AskUserQuestion` (up to 3 questions, each with 2 options, smart default first marked "(Recommended)").
|
|
80
|
-
|
|
81
|
-
```
|
|
82
|
-
AskUserQuestion({
|
|
83
|
-
questions: [
|
|
84
|
-
{
|
|
85
|
-
question: "<derived from uncertainty>",
|
|
86
|
-
header: "<short label>",
|
|
87
|
-
options: [
|
|
88
|
-
{ label: "<recommended option> (Recommended)", description: "<why this is the smart default>" },
|
|
89
|
-
{ label: "<alternative option>", description: "<when this makes sense>" }
|
|
90
|
-
],
|
|
91
|
-
multiSelect: false
|
|
92
|
-
}
|
|
93
|
-
]
|
|
94
|
-
})
|
|
95
|
-
```
|
|
96
|
-
|
|
97
|
-
If AskUserQuestion returns blank or fails, state assumptions visibly and proceed.
|
|
98
|
-
|
|
99
|
-
Record the answers (or stated assumptions) in `03-scope-answers.md`.
|
|
100
|
-
|
|
101
|
-
---
|
|
102
|
-
|
|
103
|
-
## Phase 3: Start Engine Session
|
|
104
|
-
|
|
105
|
-
Format the user's original problem enriched with scope context from `03-scope-answers.md`.
|
|
106
|
-
|
|
107
|
-
Call `mcp__rvry-dev__problem_solve` with:
|
|
108
|
-
```
|
|
109
|
-
{
|
|
110
|
-
"input": "<original problem>\n\nContext: <brief summary of scope answers>"
|
|
111
|
-
}
|
|
112
|
-
```
|
|
113
|
-
|
|
114
|
-
Proceed to Phase 4.
|
|
115
|
-
|
|
116
|
-
---
|
|
117
|
-
|
|
118
|
-
## Phase 4: Analysis Loop
|
|
119
|
-
|
|
120
|
-
Repeat until `status === "complete"`:
|
|
121
|
-
|
|
122
|
-
### Step 1: Read the engine response
|
|
123
|
-
|
|
124
|
-
Read the engine's `question` field -- this is the analytical direction for this round. Read `constraints`, `gate`, and `detection` to understand the engine's assessment. Read `constraintBlock` for constraint update instructions.
|
|
125
|
-
|
|
126
|
-
### Step 2: Show status
|
|
127
|
-
|
|
128
|
-
Show the user a brief status line:
|
|
129
|
-
- Format: `Round {round} -- {what you're doing this round}`
|
|
130
|
-
- Example: `Round 2 -- mapping failure modes`
|
|
131
|
-
- Derive the description from the engine's question focus. One line only.
|
|
132
|
-
|
|
133
|
-
### Step 3: Perform analysis
|
|
134
|
-
|
|
135
|
-
Analyze according to the engine's question and constraint data. The engine's question and constraints guide your thinking -- work WITH them, not around them.
|
|
136
|
-
|
|
137
|
-
Use Read, Grep, Glob, and Bash as needed to ground your analysis in actual code, data, or project state. Do not analyze in the abstract when concrete evidence is available.
|
|
138
|
-
|
|
139
|
-
### Step 4: 7-Question Self-Check (mandatory, internal)
|
|
140
|
-
|
|
141
|
-
**Internal**:
|
|
142
|
-
1. Is this shallow or predictable?
|
|
143
|
-
2. What am I avoiding?
|
|
144
|
-
3. Why not the uncomfortable option?
|
|
145
|
-
|
|
146
|
-
**External**:
|
|
147
|
-
4. What would I critique if someone else wrote this?
|
|
148
|
-
5. What would a skeptical expert challenge?
|
|
149
|
-
6. Any verifiable claims that should be checked?
|
|
150
|
-
|
|
151
|
-
**Grounding**:
|
|
152
|
-
7. What factual premise in this analysis have I not verified?
|
|
153
|
-
|
|
154
|
-
### Step 5: Verify-or-Defer (mandatory after self-check)
|
|
155
|
-
|
|
156
|
-
For each concern raised in Q5, Q6, or Q7, you MUST either:
|
|
157
|
-
- **VERIFY**: Actually check the claim -- read a file, grep for a pattern, run a command. Record what was verified and the result.
|
|
158
|
-
- **DEFER**: Explicitly state the concern and why it cannot be verified now. Express as a DEFER in the constraint update block.
|
|
159
|
-
|
|
160
|
-
**No dismiss**: You CANNOT raise a concern and then argue it away in the same self-check. If you raise it, you must verify or defer it.
|
|
161
|
-
|
|
162
|
-
### Step 6: Weakness Probe (rotate by round number)
|
|
163
|
-
|
|
164
|
-
Ask yourself ONE of these:
|
|
165
|
-
1. Which part of your analysis would you spend more time on if you had another round?
|
|
166
|
-
2. If your recommendation fails in practice, what is the first concrete thing someone notices?
|
|
167
|
-
3. What surprised you during this analysis? If nothing, what does that tell you?
|
|
168
|
-
4. What is the thing you almost said but did not?
|
|
169
|
-
5. Which of your claims would you remove if you had to stake your credibility on the remaining ones?
|
|
170
|
-
6. Your strongest claim and your most significant caveat -- are they in tension? If so, which do you stand behind?
|
|
171
|
-
|
|
172
|
-
Include the probe answer in your analysis.
|
|
173
|
-
|
|
174
|
-
### Step 7: Write constraint updates and submit
|
|
175
|
-
|
|
176
|
-
End your analysis with the constraint update block:
|
|
177
|
-
```
|
|
178
|
-
Constraint Updates
|
|
179
|
-
RESOLVE: C1, C2
|
|
180
|
-
ACKNOWLEDGE: C3
|
|
181
|
-
DEFER: C4 | <reason>
|
|
182
|
-
MILESTONE: <milestone> | <evidence>
|
|
183
|
-
End Constraint Updates
|
|
184
|
-
```
|
|
185
|
-
|
|
186
|
-
Call the engine tool with your full analysis (including constraint updates, self-check findings, and verify-or-defer results) as the `input`.
|
|
187
|
-
|
|
188
|
-
### What the user sees per round:
|
|
189
|
-
- The one-line status (Step 2)
|
|
190
|
-
- Nothing else until harvest
|
|
191
|
-
|
|
192
|
-
### What NEVER appears in user-visible output:
|
|
193
|
-
- The engine's `question` field content
|
|
194
|
-
- Constraint views or constraint update blocks
|
|
195
|
-
- Self-check questions or responses
|
|
196
|
-
- Gate verdicts or detection results
|
|
197
|
-
- The `constraintBlock` content
|
|
198
|
-
|
|
199
|
-
---
|
|
200
|
-
|
|
201
|
-
## Phase 5: Harvest
|
|
202
|
-
|
|
203
|
-
When `status === "complete"`:
|
|
204
|
-
|
|
205
|
-
### Harvest Pre-Mortem (before synthesis)
|
|
206
|
-
|
|
207
|
-
Before writing the final output, stress-test the direction of your analysis:
|
|
208
|
-
|
|
209
|
-
1. What was the original problem?
|
|
210
|
-
2. What is my recommendation now?
|
|
211
|
-
3. What is the gap between the two in complexity and scope?
|
|
212
|
-
4. If the recommendation is more complex than the original problem warranted, what is the simpler version?
|
|
213
|
-
|
|
214
|
-
**Check for COMPLEXITY-COLLAPSE**: Did the analysis elaborate a simple problem until the complexity justified a complex solution? If yes, name the simpler alternative and present it prominently.
|
|
215
|
-
|
|
216
|
-
### Write `99-harvest.md`
|
|
217
|
-
|
|
218
|
-
Write to the session folder:
|
|
219
|
-
```markdown
|
|
220
|
-
# ProblemSolve Harvest: [Problem Summary]
|
|
221
|
-
|
|
222
|
-
## Summary
|
|
223
|
-
[2-3 sentence executive summary of decision + rationale]
|
|
224
|
-
|
|
225
|
-
## Decision
|
|
226
|
-
[The recommendation with confidence level]
|
|
227
|
-
|
|
228
|
-
## Key Risks
|
|
229
|
-
- [risk 1 and its safeguard]
|
|
230
|
-
- [risk 2 and its safeguard]
|
|
231
|
-
|
|
232
|
-
## Alternatives Considered
|
|
233
|
-
- [alternative 1] -- eliminated because [reason]
|
|
234
|
-
- [alternative 2] -- eliminated because [reason]
|
|
235
|
-
|
|
236
|
-
## Open Questions
|
|
237
|
-
- [what remains uncertain]
|
|
238
|
-
|
|
239
|
-
## Follow-ups
|
|
240
|
-
- /deepthink "[uncertainty]" -- [why this needs exploration]
|
|
241
|
-
- /problem-solve "[next decision]" -- [why this needs its own analysis]
|
|
242
|
-
```
|
|
243
|
-
|
|
244
|
-
### Confirm persistence to user
|
|
245
|
-
|
|
246
|
-
After writing 99-harvest.md:
|
|
247
|
-
```
|
|
248
|
-
---
|
|
249
|
-
Session persisted: <absolute path to session folder>
|
|
250
|
-
---
|
|
251
|
-
```
|
|
252
|
-
|
|
253
|
-
### Synthesize for the user
|
|
254
|
-
|
|
255
|
-
Use the engine's `harvest.summary`, `harvest.keyFindings`, `harvest.openQuestions`, and `harvest.followUps` as source material, plus your accumulated reasoning across all rounds and the harvest pre-mortem results.
|
|
256
|
-
|
|
257
|
-
---
|
|
258
|
-
|
|
259
|
-
## Final Output Format
|
|
260
|
-
|
|
261
|
-
The output is decision-first. The reader gets the answer immediately, then supporting evidence. This reflects convergent thinking: narrow toward commitment, not expand toward synthesis.
|
|
262
|
-
|
|
263
|
-
```
|
|
264
|
-
# ProblemSolve: [Problem Summary]
|
|
265
|
-
|
|
266
|
-
## Analysis
|
|
267
|
-
|
|
268
|
-
[Problem framing -- what the situation was and what triggered
|
|
269
|
-
this analysis. 1-2 sentences.]
|
|
270
|
-
|
|
271
|
-
[Reasoning arc -- what the analysis revealed that confirmed,
|
|
272
|
-
redirected, or complicated the initial instinct. Where the
|
|
273
|
-
reasoning turned. What would change the verdict.
|
|
274
|
-
|
|
275
|
-
State the chosen direction clearly at the end of this section.
|
|
276
|
-
The reader should know what you're recommending before they
|
|
277
|
-
read the stress test.]
|
|
278
|
-
|
|
279
|
-
[For simple decisions, these can collapse into a shorter
|
|
280
|
-
form. The point is readability, not rigid structure.]
|
|
281
|
-
|
|
282
|
-
## Stress Test
|
|
283
|
-
|
|
284
|
-
**"[Risk or adversarial challenge]"**
|
|
285
|
-
[How it was tested and what happened. Did the decision survive,
|
|
286
|
-
adapt, or need revision? Plain prose, no arrows.]
|
|
287
|
-
|
|
288
|
-
**"[Another risk]"**
|
|
289
|
-
[Response and outcome.]
|
|
290
|
-
|
|
291
|
-
## Alternative Options
|
|
292
|
-
- **[What the alternative was]**: Eliminated because [reason].
|
|
293
|
-
- **[What the alternative was]**: Eliminated because [reason].
|
|
294
|
-
|
|
295
|
-
[Do NOT reference "Option A/B/C" labels. The reader hasn't
|
|
296
|
-
seen an option tree. Name each alternative by what it actually
|
|
297
|
-
is, then explain why it was rejected.]
|
|
298
|
-
|
|
299
|
-
## Recommendation
|
|
300
|
-
**[Decision statement]** (confidence: X.X)
|
|
301
|
-
|
|
302
|
-
[Why this is the go-forward path -- the synthesis of the analysis
|
|
303
|
-
and stress test above. 1-3 sentences connecting the reasoning
|
|
304
|
-
to the commitment.]
|
|
305
|
-
|
|
306
|
-
**Safeguards:**
|
|
307
|
-
[Specific commitments to prevent the failures identified above.]
|
|
308
|
-
|
|
309
|
-
[Format for human readability in terminal:
|
|
310
|
-
- The Decision can be multi-part or compact -- match the complexity
|
|
311
|
-
of the actual decision
|
|
312
|
-
- Stress Test entries: bold risk, plain response. No arrows, no
|
|
313
|
-
mechanism names.
|
|
314
|
-
- Never reference the protocol's internal phases, gates, or
|
|
315
|
-
mechanism names in user-facing output
|
|
316
|
-
- No walls of text. Break long paragraphs.]
|
|
317
|
-
|
|
318
|
-
## Where to Go Next
|
|
319
|
-
-> /deepthink "[uncertainty needing exploration]"
|
|
320
|
-
_[why this needs adversarial testing]_
|
|
321
|
-
-> /problem-solve "[next decision point]"
|
|
322
|
-
_[if a follow-on decision is needed]_
|
|
323
|
-
```
|
|
324
|
-
|
|
325
|
-
---
|
|
326
|
-
|
|
327
|
-
## Key Differences from /deepthink
|
|
328
|
-
|
|
329
|
-
| /problem-solve | /deepthink |
|
|
330
|
-
|----------------|------------|
|
|
331
|
-
| Convergent - decide, commit | Divergent + pre-mortems |
|
|
332
|
-
| Phase gates + probe | 7-question self-check + probe + verify-or-defer |
|
|
333
|
-
| Narrows to a decision | Explores the question space |
|
|
334
|
-
| Valid: clear decision + safeguards | Valid: "more confused in useful ways" |
|